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

Artifact d41381d80a22d3a83352aeca274cccf264ac277a:


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 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 70 61 72 73 65 72 0a 2a 2a 20 74 6f  the parser.** to
01c0: 20 68 61 6e 64 6c 65 20 53 45 4c 45 43 54 20 73   handle SELECT s
01d0: 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 53 51 4c  tatements in SQL
01e0: 69 74 65 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65  ite..*/.#include
01f0: 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a   "sqliteInt.h"..
0200: 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6c  ./*.** Delete al
0210: 6c 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  l the content of
0220: 20 61 20 53 65 6c 65 63 74 20 73 74 72 75 63 74   a Select struct
0230: 75 72 65 20 62 75 74 20 64 6f 20 6e 6f 74 20 64  ure but do not d
0240: 65 61 6c 6c 6f 63 61 74 65 0a 2a 2a 20 74 68 65  eallocate.** the
0250: 20 73 65 6c 65 63 74 20 73 74 72 75 63 74 75 72   select structur
0260: 65 20 69 74 73 65 6c 66 2e 0a 2a 2f 0a 73 74 61  e itself..*/.sta
0270: 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72 53 65  tic void clearSe
0280: 6c 65 63 74 28 73 71 6c 69 74 65 33 20 2a 64 62  lect(sqlite3 *db
0290: 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  , Select *p){.  
02a0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
02b0: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 45 4c  elete(db, p->pEL
02c0: 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  ist);.  sqlite3S
02d0: 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  rcListDelete(db,
02e0: 20 70 2d 3e 70 53 72 63 29 3b 0a 20 20 73 71 6c   p->pSrc);.  sql
02f0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
0300: 62 2c 20 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20  b, p->pWhere);. 
0310: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
0320: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 47  Delete(db, p->pG
0330: 72 6f 75 70 42 79 29 3b 0a 20 20 73 71 6c 69 74  roupBy);.  sqlit
0340: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
0350: 20 70 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20   p->pHaving);.  
0360: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
0370: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 72  elete(db, p->pOr
0380: 64 65 72 42 79 29 3b 0a 20 20 73 71 6c 69 74 65  derBy);.  sqlite
0390: 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
03a0: 2c 20 70 2d 3e 70 50 72 69 6f 72 29 3b 0a 20 20  , p->pPrior);.  
03b0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
03c0: 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29  e(db, p->pLimit)
03d0: 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  ;.  sqlite3ExprD
03e0: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 66  elete(db, p->pOf
03f0: 66 73 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  fset);.}../*.** 
0400: 49 6e 69 74 69 61 6c 69 7a 65 20 61 20 53 65 6c  Initialize a Sel
0410: 65 63 74 44 65 73 74 20 73 74 72 75 63 74 75 72  ectDest structur
0420: 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
0430: 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74  e3SelectDestInit
0440: 28 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65  (SelectDest *pDe
0450: 73 74 2c 20 69 6e 74 20 65 44 65 73 74 2c 20 69  st, int eDest, i
0460: 6e 74 20 69 50 61 72 6d 29 7b 0a 20 20 70 44 65  nt iParm){.  pDe
0470: 73 74 2d 3e 65 44 65 73 74 20 3d 20 28 75 38 29  st->eDest = (u8)
0480: 65 44 65 73 74 3b 0a 20 20 70 44 65 73 74 2d 3e  eDest;.  pDest->
0490: 69 53 44 50 61 72 6d 20 3d 20 69 50 61 72 6d 3b  iSDParm = iParm;
04a0: 0a 20 20 70 44 65 73 74 2d 3e 61 66 66 53 64 73  .  pDest->affSds
04b0: 74 20 3d 20 30 3b 0a 20 20 70 44 65 73 74 2d 3e  t = 0;.  pDest->
04c0: 69 53 64 73 74 20 3d 20 30 3b 0a 20 20 70 44 65  iSdst = 0;.  pDe
04d0: 73 74 2d 3e 6e 53 64 73 74 20 3d 20 30 3b 0a 7d  st->nSdst = 0;.}
04e0: 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  .../*.** Allocat
04f0: 65 20 61 20 6e 65 77 20 53 65 6c 65 63 74 20 73  e a new Select s
0500: 74 72 75 63 74 75 72 65 20 61 6e 64 20 72 65 74  tructure and ret
0510: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
0520: 20 74 68 61 74 0a 2a 2a 20 73 74 72 75 63 74 75   that.** structu
0530: 72 65 2e 0a 2a 2f 0a 53 65 6c 65 63 74 20 2a 73  re..*/.Select *s
0540: 71 6c 69 74 65 33 53 65 6c 65 63 74 4e 65 77 28  qlite3SelectNew(
0550: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
0560: 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  ,        /* Pars
0570: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
0580: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
0590: 74 2c 20 20 20 20 20 2f 2a 20 77 68 69 63 68 20  t,     /* which 
05a0: 63 6f 6c 75 6d 6e 73 20 74 6f 20 69 6e 63 6c 75  columns to inclu
05b0: 64 65 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  de in the result
05c0: 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
05d0: 53 72 63 2c 20 20 20 20 20 20 20 20 2f 2a 20 74  Src,        /* t
05e0: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2d  he FROM clause -
05f0: 2d 20 77 68 69 63 68 20 74 61 62 6c 65 73 20 74  - which tables t
0600: 6f 20 73 63 61 6e 20 2a 2f 0a 20 20 45 78 70 72  o scan */.  Expr
0610: 20 2a 70 57 68 65 72 65 2c 20 20 20 20 20 20 20   *pWhere,       
0620: 20 20 2f 2a 20 74 68 65 20 57 48 45 52 45 20 63    /* the WHERE c
0630: 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c  lause */.  ExprL
0640: 69 73 74 20 2a 70 47 72 6f 75 70 42 79 2c 20 20  ist *pGroupBy,  
0650: 20 2f 2a 20 74 68 65 20 47 52 4f 55 50 20 42 59   /* the GROUP BY
0660: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70   clause */.  Exp
0670: 72 20 2a 70 48 61 76 69 6e 67 2c 20 20 20 20 20  r *pHaving,     
0680: 20 20 20 2f 2a 20 74 68 65 20 48 41 56 49 4e 47     /* the HAVING
0690: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70   clause */.  Exp
06a0: 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c  rList *pOrderBy,
06b0: 20 20 20 2f 2a 20 74 68 65 20 4f 52 44 45 52 20     /* the ORDER 
06c0: 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 75  BY clause */.  u
06d0: 31 36 20 73 65 6c 46 6c 61 67 73 2c 20 20 20 20  16 selFlags,    
06e0: 20 20 20 20 20 2f 2a 20 46 6c 61 67 20 70 61 72       /* Flag par
06f0: 61 6d 65 74 65 72 73 2c 20 73 75 63 68 20 61 73  ameters, such as
0700: 20 53 46 5f 44 69 73 74 69 6e 63 74 20 2a 2f 0a   SF_Distinct */.
0710: 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20    Expr *pLimit, 
0720: 20 20 20 20 20 20 20 20 2f 2a 20 4c 49 4d 49 54          /* LIMIT
0730: 20 76 61 6c 75 65 2e 20 20 4e 55 4c 4c 20 6d 65   value.  NULL me
0740: 61 6e 73 20 6e 6f 74 20 75 73 65 64 20 2a 2f 0a  ans not used */.
0750: 20 20 45 78 70 72 20 2a 70 4f 66 66 73 65 74 20    Expr *pOffset 
0760: 20 20 20 20 20 20 20 20 2f 2a 20 4f 46 46 53 45          /* OFFSE
0770: 54 20 76 61 6c 75 65 2e 20 20 4e 55 4c 4c 20 6d  T value.  NULL m
0780: 65 61 6e 73 20 6e 6f 20 6f 66 66 73 65 74 20 2a  eans no offset *
0790: 2f 0a 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70  /.){.  Select *p
07a0: 4e 65 77 3b 0a 20 20 53 65 6c 65 63 74 20 73 74  New;.  Select st
07b0: 61 6e 64 69 6e 3b 0a 20 20 73 71 6c 69 74 65 33  andin;.  sqlite3
07c0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
07d0: 62 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  b;.  pNew = sqli
07e0: 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
07f0: 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77  db, sizeof(*pNew
0800: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64  ) );.  assert( d
0810: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
0820: 7c 7c 20 21 70 4f 66 66 73 65 74 20 7c 7c 20 70  || !pOffset || p
0830: 4c 69 6d 69 74 20 29 3b 20 2f 2a 20 4f 46 46 53  Limit ); /* OFFS
0840: 45 54 20 69 6d 70 6c 69 65 73 20 4c 49 4d 49 54  ET implies LIMIT
0850: 20 2a 2f 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d   */.  if( pNew==
0860: 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
0870: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
0880: 64 20 29 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20  d );.    pNew = 
0890: 26 73 74 61 6e 64 69 6e 3b 0a 20 20 20 20 6d 65  &standin;.    me
08a0: 6d 73 65 74 28 70 4e 65 77 2c 20 30 2c 20 73 69  mset(pNew, 0, si
08b0: 7a 65 6f 66 28 2a 70 4e 65 77 29 29 3b 0a 20 20  zeof(*pNew));.  
08c0: 7d 0a 20 20 69 66 28 20 70 45 4c 69 73 74 3d 3d  }.  if( pEList==
08d0: 30 20 29 7b 0a 20 20 20 20 70 45 4c 69 73 74 20  0 ){.    pEList 
08e0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
08f0: 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20  tAppend(pParse, 
0900: 30 2c 20 73 71 6c 69 74 65 33 45 78 70 72 28 64  0, sqlite3Expr(d
0910: 62 2c 54 4b 5f 41 4c 4c 2c 30 29 29 3b 0a 20 20  b,TK_ALL,0));.  
0920: 7d 0a 20 20 70 4e 65 77 2d 3e 70 45 4c 69 73 74  }.  pNew->pEList
0930: 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20 69 66 28   = pEList;.  if(
0940: 20 70 53 72 63 3d 3d 30 20 29 20 70 53 72 63 20   pSrc==0 ) pSrc 
0950: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
0960: 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66  cZero(db, sizeof
0970: 28 2a 70 53 72 63 29 29 3b 0a 20 20 70 4e 65 77  (*pSrc));.  pNew
0980: 2d 3e 70 53 72 63 20 3d 20 70 53 72 63 3b 0a 20  ->pSrc = pSrc;. 
0990: 20 70 4e 65 77 2d 3e 70 57 68 65 72 65 20 3d 20   pNew->pWhere = 
09a0: 70 57 68 65 72 65 3b 0a 20 20 70 4e 65 77 2d 3e  pWhere;.  pNew->
09b0: 70 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f 75  pGroupBy = pGrou
09c0: 70 42 79 3b 0a 20 20 70 4e 65 77 2d 3e 70 48 61  pBy;.  pNew->pHa
09d0: 76 69 6e 67 20 3d 20 70 48 61 76 69 6e 67 3b 0a  ving = pHaving;.
09e0: 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79    pNew->pOrderBy
09f0: 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 70   = pOrderBy;.  p
0a00: 4e 65 77 2d 3e 73 65 6c 46 6c 61 67 73 20 3d 20  New->selFlags = 
0a10: 73 65 6c 46 6c 61 67 73 3b 0a 20 20 70 4e 65 77  selFlags;.  pNew
0a20: 2d 3e 6f 70 20 3d 20 54 4b 5f 53 45 4c 45 43 54  ->op = TK_SELECT
0a30: 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 6d 69 74  ;.  pNew->pLimit
0a40: 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 70 4e 65   = pLimit;.  pNe
0a50: 77 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f 66  w->pOffset = pOf
0a60: 66 73 65 74 3b 0a 20 20 61 73 73 65 72 74 28 20  fset;.  assert( 
0a70: 70 4f 66 66 73 65 74 3d 3d 30 20 7c 7c 20 70 4c  pOffset==0 || pL
0a80: 69 6d 69 74 21 3d 30 20 29 3b 0a 20 20 70 4e 65  imit!=0 );.  pNe
0a90: 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  w->addrOpenEphm[
0aa0: 30 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d  0] = -1;.  pNew-
0ab0: 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d  >addrOpenEphm[1]
0ac0: 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 61   = -1;.  pNew->a
0ad0: 64 64 72 4f 70 65 6e 45 70 68 6d 5b 32 5d 20 3d  ddrOpenEphm[2] =
0ae0: 20 2d 31 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d   -1;.  if( db->m
0af0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 7b 0a  allocFailed ) {.
0b00: 20 20 20 20 63 6c 65 61 72 53 65 6c 65 63 74 28      clearSelect(
0b10: 64 62 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 69  db, pNew);.    i
0b20: 66 28 20 70 4e 65 77 21 3d 26 73 74 61 6e 64 69  f( pNew!=&standi
0b30: 6e 20 29 20 73 71 6c 69 74 65 33 44 62 46 72 65  n ) sqlite3DbFre
0b40: 65 28 64 62 2c 20 70 4e 65 77 29 3b 0a 20 20 20  e(db, pNew);.   
0b50: 20 70 4e 65 77 20 3d 20 30 3b 0a 20 20 7d 65 6c   pNew = 0;.  }el
0b60: 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
0b70: 70 4e 65 77 2d 3e 70 53 72 63 21 3d 30 20 7c 7c  pNew->pSrc!=0 ||
0b80: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20   pParse->nErr>0 
0b90: 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
0ba0: 20 70 4e 65 77 21 3d 26 73 74 61 6e 64 69 6e 20   pNew!=&standin 
0bb0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77  );.  return pNew
0bc0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  ;.}../*.** Delet
0bd0: 65 20 74 68 65 20 67 69 76 65 6e 20 53 65 6c 65  e the given Sele
0be0: 63 74 20 73 74 72 75 63 74 75 72 65 20 61 6e 64  ct structure and
0bf0: 20 61 6c 6c 20 6f 66 20 69 74 73 20 73 75 62 73   all of its subs
0c00: 74 72 75 63 74 75 72 65 73 2e 0a 2a 2f 0a 76 6f  tructures..*/.vo
0c10: 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  id sqlite3Select
0c20: 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a  Delete(sqlite3 *
0c30: 64 62 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a  db, Select *p){.
0c40: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 63    if( p ){.    c
0c50: 6c 65 61 72 53 65 6c 65 63 74 28 64 62 2c 20 70  learSelect(db, p
0c60: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
0c70: 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 20 20 7d  Free(db, p);.  }
0c80: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  .}../*.** Given 
0c90: 31 20 74 6f 20 33 20 69 64 65 6e 74 69 66 69 65  1 to 3 identifie
0ca0: 72 73 20 70 72 65 63 65 64 69 6e 67 20 74 68 65  rs preceding the
0cb0: 20 4a 4f 49 4e 20 6b 65 79 77 6f 72 64 2c 20 64   JOIN keyword, d
0cc0: 65 74 65 72 6d 69 6e 65 20 74 68 65 0a 2a 2a 20  etermine the.** 
0cd0: 74 79 70 65 20 6f 66 20 6a 6f 69 6e 2e 20 20 52  type of join.  R
0ce0: 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72  eturn an integer
0cf0: 20 63 6f 6e 73 74 61 6e 74 20 74 68 61 74 20 65   constant that e
0d00: 78 70 72 65 73 73 65 73 20 74 68 61 74 20 74 79  xpresses that ty
0d10: 70 65 0a 2a 2a 20 69 6e 20 74 65 72 6d 73 20 6f  pe.** in terms o
0d20: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
0d30: 62 69 74 20 76 61 6c 75 65 73 3a 0a 2a 2a 0a 2a  bit values:.**.*
0d40: 2a 20 20 20 20 20 4a 54 5f 49 4e 4e 45 52 0a 2a  *     JT_INNER.*
0d50: 2a 20 20 20 20 20 4a 54 5f 43 52 4f 53 53 0a 2a  *     JT_CROSS.*
0d60: 2a 20 20 20 20 20 4a 54 5f 4f 55 54 45 52 0a 2a  *     JT_OUTER.*
0d70: 2a 20 20 20 20 20 4a 54 5f 4e 41 54 55 52 41 4c  *     JT_NATURAL
0d80: 0a 2a 2a 20 20 20 20 20 4a 54 5f 4c 45 46 54 0a  .**     JT_LEFT.
0d90: 2a 2a 20 20 20 20 20 4a 54 5f 52 49 47 48 54 0a  **     JT_RIGHT.
0da0: 2a 2a 0a 2a 2a 20 41 20 66 75 6c 6c 20 6f 75 74  **.** A full out
0db0: 65 72 20 6a 6f 69 6e 20 69 73 20 74 68 65 20 63  er join is the c
0dc0: 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20 4a 54  ombination of JT
0dd0: 5f 4c 45 46 54 20 61 6e 64 20 4a 54 5f 52 49 47  _LEFT and JT_RIG
0de0: 48 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  HT..**.** If an 
0df0: 69 6c 6c 65 67 61 6c 20 6f 72 20 75 6e 73 75 70  illegal or unsup
0e00: 70 6f 72 74 65 64 20 6a 6f 69 6e 20 74 79 70 65  ported join type
0e10: 20 69 73 20 73 65 65 6e 2c 20 74 68 65 6e 20 73   is seen, then s
0e20: 74 69 6c 6c 20 72 65 74 75 72 6e 0a 2a 2a 20 61  till return.** a
0e30: 20 6a 6f 69 6e 20 74 79 70 65 2c 20 62 75 74 20   join type, but 
0e40: 70 75 74 20 61 6e 20 65 72 72 6f 72 20 69 6e 20  put an error in 
0e50: 74 68 65 20 70 50 61 72 73 65 20 73 74 72 75 63  the pParse struc
0e60: 74 75 72 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ture..*/.int sql
0e70: 69 74 65 33 4a 6f 69 6e 54 79 70 65 28 50 61 72  ite3JoinType(Par
0e80: 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65  se *pParse, Toke
0e90: 6e 20 2a 70 41 2c 20 54 6f 6b 65 6e 20 2a 70 42  n *pA, Token *pB
0ea0: 2c 20 54 6f 6b 65 6e 20 2a 70 43 29 7b 0a 20 20  , Token *pC){.  
0eb0: 69 6e 74 20 6a 6f 69 6e 74 79 70 65 20 3d 20 30  int jointype = 0
0ec0: 3b 0a 20 20 54 6f 6b 65 6e 20 2a 61 70 41 6c 6c  ;.  Token *apAll
0ed0: 5b 33 5d 3b 0a 20 20 54 6f 6b 65 6e 20 2a 70 3b  [3];.  Token *p;
0ee0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
0ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
0f00: 20 20 20 30 31 32 33 34 35 36 37 38 39 20 31 32     0123456789 12
0f10: 33 34 35 36 37 38 39 20 31 32 33 34 35 36 37 38  3456789 12345678
0f20: 39 20 31 32 33 20 2a 2f 0a 20 20 73 74 61 74 69  9 123 */.  stati
0f30: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 4b 65  c const char zKe
0f40: 79 54 65 78 74 5b 5d 20 3d 20 22 6e 61 74 75 72  yText[] = "natur
0f50: 61 6c 65 66 74 6f 75 74 65 72 69 67 68 74 66 75  aleftouterightfu
0f60: 6c 6c 69 6e 6e 65 72 63 72 6f 73 73 22 3b 0a 20  llinnercross";. 
0f70: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74   static const st
0f80: 72 75 63 74 20 7b 0a 20 20 20 20 75 38 20 69 3b  ruct {.    u8 i;
0f90: 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e          /* Begin
0fa0: 6e 69 6e 67 20 6f 66 20 6b 65 79 77 6f 72 64 20  ning of keyword 
0fb0: 74 65 78 74 20 69 6e 20 7a 4b 65 79 54 65 78 74  text in zKeyText
0fc0: 5b 5d 20 2a 2f 0a 20 20 20 20 75 38 20 6e 43 68  [] */.    u8 nCh
0fd0: 61 72 3b 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68  ar;    /* Length
0fe0: 20 6f 66 20 74 68 65 20 6b 65 79 77 6f 72 64 20   of the keyword 
0ff0: 69 6e 20 63 68 61 72 61 63 74 65 72 73 20 2a 2f  in characters */
1000: 0a 20 20 20 20 75 38 20 63 6f 64 65 3b 20 20 20  .    u8 code;   
1010: 20 20 2f 2a 20 4a 6f 69 6e 20 74 79 70 65 20 6d    /* Join type m
1020: 61 73 6b 20 2a 2f 0a 20 20 7d 20 61 4b 65 79 77  ask */.  } aKeyw
1030: 6f 72 64 5b 5d 20 3d 20 7b 0a 20 20 20 20 2f 2a  ord[] = {.    /*
1040: 20 6e 61 74 75 72 61 6c 20 2a 2f 20 7b 20 30 2c   natural */ { 0,
1050: 20 20 37 2c 20 4a 54 5f 4e 41 54 55 52 41 4c 20    7, JT_NATURAL 
1060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
1070: 2c 0a 20 20 20 20 2f 2a 20 6c 65 66 74 20 20 20  ,.    /* left   
1080: 20 2a 2f 20 7b 20 36 2c 20 20 34 2c 20 4a 54 5f   */ { 6,  4, JT_
1090: 4c 45 46 54 7c 4a 54 5f 4f 55 54 45 52 20 20 20  LEFT|JT_OUTER   
10a0: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a         },.    /*
10b0: 20 6f 75 74 65 72 20 20 20 2a 2f 20 7b 20 31 30   outer   */ { 10
10c0: 2c 20 35 2c 20 4a 54 5f 4f 55 54 45 52 20 20 20  , 5, JT_OUTER   
10d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
10e0: 2c 0a 20 20 20 20 2f 2a 20 72 69 67 68 74 20 20  ,.    /* right  
10f0: 20 2a 2f 20 7b 20 31 34 2c 20 35 2c 20 4a 54 5f   */ { 14, 5, JT_
1100: 52 49 47 48 54 7c 4a 54 5f 4f 55 54 45 52 20 20  RIGHT|JT_OUTER  
1110: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a         },.    /*
1120: 20 66 75 6c 6c 20 20 20 20 2a 2f 20 7b 20 31 39   full    */ { 19
1130: 2c 20 34 2c 20 4a 54 5f 4c 45 46 54 7c 4a 54 5f  , 4, JT_LEFT|JT_
1140: 52 49 47 48 54 7c 4a 54 5f 4f 55 54 45 52 20 7d  RIGHT|JT_OUTER }
1150: 2c 0a 20 20 20 20 2f 2a 20 69 6e 6e 65 72 20 20  ,.    /* inner  
1160: 20 2a 2f 20 7b 20 32 33 2c 20 35 2c 20 4a 54 5f   */ { 23, 5, JT_
1170: 49 4e 4e 45 52 20 20 20 20 20 20 20 20 20 20 20  INNER           
1180: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a         },.    /*
1190: 20 63 72 6f 73 73 20 20 20 2a 2f 20 7b 20 32 38   cross   */ { 28
11a0: 2c 20 35 2c 20 4a 54 5f 49 4e 4e 45 52 7c 4a 54  , 5, JT_INNER|JT
11b0: 5f 43 52 4f 53 53 20 20 20 20 20 20 20 20 20 7d  _CROSS         }
11c0: 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 2c 20  ,.  };.  int i, 
11d0: 6a 3b 0a 20 20 61 70 41 6c 6c 5b 30 5d 20 3d 20  j;.  apAll[0] = 
11e0: 70 41 3b 0a 20 20 61 70 41 6c 6c 5b 31 5d 20 3d  pA;.  apAll[1] =
11f0: 20 70 42 3b 0a 20 20 61 70 41 6c 6c 5b 32 5d 20   pB;.  apAll[2] 
1200: 3d 20 70 43 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  = pC;.  for(i=0;
1210: 20 69 3c 33 20 26 26 20 61 70 41 6c 6c 5b 69 5d   i<3 && apAll[i]
1220: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20  ; i++){.    p = 
1230: 61 70 41 6c 6c 5b 69 5d 3b 0a 20 20 20 20 66 6f  apAll[i];.    fo
1240: 72 28 6a 3d 30 3b 20 6a 3c 41 72 72 61 79 53 69  r(j=0; j<ArraySi
1250: 7a 65 28 61 4b 65 79 77 6f 72 64 29 3b 20 6a 2b  ze(aKeyword); j+
1260: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  +){.      if( p-
1270: 3e 6e 3d 3d 61 4b 65 79 77 6f 72 64 5b 6a 5d 2e  >n==aKeyword[j].
1280: 6e 43 68 61 72 20 0a 20 20 20 20 20 20 20 20 20  nChar .         
1290: 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 4e 49   && sqlite3StrNI
12a0: 43 6d 70 28 28 63 68 61 72 2a 29 70 2d 3e 7a 2c  Cmp((char*)p->z,
12b0: 20 26 7a 4b 65 79 54 65 78 74 5b 61 4b 65 79 77   &zKeyText[aKeyw
12c0: 6f 72 64 5b 6a 5d 2e 69 5d 2c 20 70 2d 3e 6e 29  ord[j].i], p->n)
12d0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6a  ==0 ){.        j
12e0: 6f 69 6e 74 79 70 65 20 7c 3d 20 61 4b 65 79 77  ointype |= aKeyw
12f0: 6f 72 64 5b 6a 5d 2e 63 6f 64 65 3b 0a 20 20 20  ord[j].code;.   
1300: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1310: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 74 65    }.    }.    te
1320: 73 74 63 61 73 65 28 20 6a 3d 3d 30 20 7c 7c 20  stcase( j==0 || 
1330: 6a 3d 3d 31 20 7c 7c 20 6a 3d 3d 32 20 7c 7c 20  j==1 || j==2 || 
1340: 6a 3d 3d 33 20 7c 7c 20 6a 3d 3d 34 20 7c 7c 20  j==3 || j==4 || 
1350: 6a 3d 3d 35 20 7c 7c 20 6a 3d 3d 36 20 29 3b 0a  j==5 || j==6 );.
1360: 20 20 20 20 69 66 28 20 6a 3e 3d 41 72 72 61 79      if( j>=Array
1370: 53 69 7a 65 28 61 4b 65 79 77 6f 72 64 29 20 29  Size(aKeyword) )
1380: 7b 0a 20 20 20 20 20 20 6a 6f 69 6e 74 79 70 65  {.      jointype
1390: 20 7c 3d 20 4a 54 5f 45 52 52 4f 52 3b 0a 20 20   |= JT_ERROR;.  
13a0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
13b0: 0a 20 20 7d 0a 20 20 69 66 28 0a 20 20 20 20 20  .  }.  if(.     
13c0: 28 6a 6f 69 6e 74 79 70 65 20 26 20 28 4a 54 5f  (jointype & (JT_
13d0: 49 4e 4e 45 52 7c 4a 54 5f 4f 55 54 45 52 29 29  INNER|JT_OUTER))
13e0: 3d 3d 28 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f 4f  ==(JT_INNER|JT_O
13f0: 55 54 45 52 29 20 7c 7c 0a 20 20 20 20 20 28 6a  UTER) ||.     (j
1400: 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 45 52 52  ointype & JT_ERR
1410: 4f 52 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20  OR)!=0.  ){.    
1420: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 70 20  const char *zSp 
1430: 3d 20 22 20 22 3b 0a 20 20 20 20 61 73 73 65 72  = " ";.    asser
1440: 74 28 20 70 42 21 3d 30 20 29 3b 0a 20 20 20 20  t( pB!=0 );.    
1450: 69 66 28 20 70 43 3d 3d 30 20 29 7b 20 7a 53 70  if( pC==0 ){ zSp
1460: 2b 2b 3b 20 7d 0a 20 20 20 20 73 71 6c 69 74 65  ++; }.    sqlite
1470: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
1480: 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6f 72 20 75 6e  , "unknown or un
1490: 73 75 70 70 6f 72 74 65 64 20 6a 6f 69 6e 20 74  supported join t
14a0: 79 70 65 3a 20 22 0a 20 20 20 20 20 20 20 22 25  ype: ".       "%
14b0: 54 20 25 54 25 73 25 54 22 2c 20 70 41 2c 20 70  T %T%s%T", pA, p
14c0: 42 2c 20 7a 53 70 2c 20 70 43 29 3b 0a 20 20 20  B, zSp, pC);.   
14d0: 20 6a 6f 69 6e 74 79 70 65 20 3d 20 4a 54 5f 49   jointype = JT_I
14e0: 4e 4e 45 52 3b 0a 20 20 7d 65 6c 73 65 20 69 66  NNER;.  }else if
14f0: 28 20 28 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54  ( (jointype & JT
1500: 5f 4f 55 54 45 52 29 21 3d 30 20 0a 20 20 20 20  _OUTER)!=0 .    
1510: 20 20 20 20 20 26 26 20 28 6a 6f 69 6e 74 79 70       && (jointyp
1520: 65 20 26 20 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f  e & (JT_LEFT|JT_
1530: 52 49 47 48 54 29 29 21 3d 4a 54 5f 4c 45 46 54  RIGHT))!=JT_LEFT
1540: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
1550: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
1560: 0a 20 20 20 20 20 20 22 52 49 47 48 54 20 61 6e  .      "RIGHT an
1570: 64 20 46 55 4c 4c 20 4f 55 54 45 52 20 4a 4f 49  d FULL OUTER JOI
1580: 4e 73 20 61 72 65 20 6e 6f 74 20 63 75 72 72 65  Ns are not curre
1590: 6e 74 6c 79 20 73 75 70 70 6f 72 74 65 64 22 29  ntly supported")
15a0: 3b 0a 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d  ;.    jointype =
15b0: 20 4a 54 5f 49 4e 4e 45 52 3b 0a 20 20 7d 0a 20   JT_INNER;.  }. 
15c0: 20 72 65 74 75 72 6e 20 6a 6f 69 6e 74 79 70 65   return jointype
15d0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
15e0: 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61  n the index of a
15f0: 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 20 74 61 62   column in a tab
1600: 6c 65 2e 20 20 52 65 74 75 72 6e 20 2d 31 20 69  le.  Return -1 i
1610: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20  f the column.** 
1620: 69 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64  is not contained
1630: 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a   in the table..*
1640: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 6c  /.static int col
1650: 75 6d 6e 49 6e 64 65 78 28 54 61 62 6c 65 20 2a  umnIndex(Table *
1660: 70 54 61 62 2c 20 63 6f 6e 73 74 20 63 68 61 72  pTab, const char
1670: 20 2a 7a 43 6f 6c 29 7b 0a 20 20 69 6e 74 20 69   *zCol){.  int i
1680: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
1690: 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  Tab->nCol; i++){
16a0: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
16b0: 53 74 72 49 43 6d 70 28 70 54 61 62 2d 3e 61 43  StrICmp(pTab->aC
16c0: 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 43 6f  ol[i].zName, zCo
16d0: 6c 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 69  l)==0 ) return i
16e0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d  ;.  }.  return -
16f0: 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72  1;.}../*.** Sear
1700: 63 68 20 74 68 65 20 66 69 72 73 74 20 4e 20 74  ch the first N t
1710: 61 62 6c 65 73 20 69 6e 20 70 53 72 63 2c 20 66  ables in pSrc, f
1720: 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68  rom left to righ
1730: 74 2c 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61  t, looking for a
1740: 0a 2a 2a 20 74 61 62 6c 65 20 74 68 61 74 20 68  .** table that h
1750: 61 73 20 61 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  as a column name
1760: 64 20 7a 43 6f 6c 2e 20 20 0a 2a 2a 0a 2a 2a 20  d zCol.  .**.** 
1770: 57 68 65 6e 20 66 6f 75 6e 64 2c 20 73 65 74 20  When found, set 
1780: 2a 70 69 54 61 62 20 61 6e 64 20 2a 70 69 43 6f  *piTab and *piCo
1790: 6c 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 69  l to the table i
17a0: 6e 64 65 78 20 61 6e 64 20 63 6f 6c 75 6d 6e 20  ndex and column 
17b0: 69 6e 64 65 78 0a 2a 2a 20 6f 66 20 74 68 65 20  index.** of the 
17c0: 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20  matching column 
17d0: 61 6e 64 20 72 65 74 75 72 6e 20 54 52 55 45 2e  and return TRUE.
17e0: 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 74 20 66 6f  .**.** If not fo
17f0: 75 6e 64 2c 20 72 65 74 75 72 6e 20 46 41 4c 53  und, return FALS
1800: 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  E..*/.static int
1810: 20 74 61 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49   tableAndColumnI
1820: 6e 64 65 78 28 0a 20 20 53 72 63 4c 69 73 74 20  ndex(.  SrcList 
1830: 2a 70 53 72 63 2c 20 20 20 20 20 20 20 2f 2a 20  *pSrc,       /* 
1840: 41 72 72 61 79 20 6f 66 20 74 61 62 6c 65 73 20  Array of tables 
1850: 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 69  to search */.  i
1860: 6e 74 20 4e 2c 20 20 20 20 20 20 20 20 20 20 20  nt N,           
1870: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1880: 20 74 61 62 6c 65 73 20 69 6e 20 70 53 72 63 2d   tables in pSrc-
1890: 3e 61 5b 5d 20 74 6f 20 73 65 61 72 63 68 20 2a  >a[] to search *
18a0: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
18b0: 7a 43 6f 6c 2c 20 20 20 20 2f 2a 20 4e 61 6d 65  zCol,    /* Name
18c0: 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 77   of the column w
18d0: 65 20 61 72 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f  e are looking fo
18e0: 72 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 54 61  r */.  int *piTa
18f0: 62 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  b,          /* W
1900: 72 69 74 65 20 69 6e 64 65 78 20 6f 66 20 70 53  rite index of pS
1910: 72 63 2d 3e 61 5b 5d 20 68 65 72 65 20 2a 2f 0a  rc->a[] here */.
1920: 20 20 69 6e 74 20 2a 70 69 43 6f 6c 20 20 20 20    int *piCol    
1930: 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
1940: 69 6e 64 65 78 20 6f 66 20 70 53 72 63 2d 3e 61  index of pSrc->a
1950: 5b 2a 70 69 54 61 62 5d 2e 70 54 61 62 2d 3e 61  [*piTab].pTab->a
1960: 43 6f 6c 5b 5d 20 68 65 72 65 20 2a 2f 0a 29 7b  Col[] here */.){
1970: 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
1980: 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c          /* For l
1990: 6f 6f 70 69 6e 67 20 6f 76 65 72 20 74 61 62 6c  ooping over tabl
19a0: 65 73 20 69 6e 20 70 53 72 63 20 2a 2f 0a 20 20  es in pSrc */.  
19b0: 69 6e 74 20 69 43 6f 6c 3b 20 20 20 20 20 20 20  int iCol;       
19c0: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
19d0: 20 63 6f 6c 75 6d 6e 20 6d 61 74 63 68 69 6e 67   column matching
19e0: 20 7a 43 6f 6c 20 2a 2f 0a 0a 20 20 61 73 73 65   zCol */..  asse
19f0: 72 74 28 20 28 70 69 54 61 62 3d 3d 30 29 3d 3d  rt( (piTab==0)==
1a00: 28 70 69 43 6f 6c 3d 3d 30 29 20 29 3b 20 20 2f  (piCol==0) );  /
1a10: 2a 20 42 6f 74 68 20 6f 72 20 6e 65 69 74 68 65  * Both or neithe
1a20: 72 20 61 72 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  r are NULL */.  
1a30: 66 6f 72 28 69 3d 30 3b 20 69 3c 4e 3b 20 69 2b  for(i=0; i<N; i+
1a40: 2b 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20 63  +){.    iCol = c
1a50: 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 53 72 63 2d  olumnIndex(pSrc-
1a60: 3e 61 5b 69 5d 2e 70 54 61 62 2c 20 7a 43 6f 6c  >a[i].pTab, zCol
1a70: 29 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3e  );.    if( iCol>
1a80: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
1a90: 70 69 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20  piTab ){.       
1aa0: 20 2a 70 69 54 61 62 20 3d 20 69 3b 0a 20 20 20   *piTab = i;.   
1ab0: 20 20 20 20 20 2a 70 69 43 6f 6c 20 3d 20 69 43       *piCol = iC
1ac0: 6f 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ol;.      }.    
1ad0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
1ae0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
1af0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
1b00: 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
1b10: 20 74 6f 20 61 64 64 20 74 65 72 6d 73 20 69 6d   to add terms im
1b20: 70 6c 69 65 64 20 62 79 20 4a 4f 49 4e 20 73 79  plied by JOIN sy
1b30: 6e 74 61 78 20 74 6f 20 74 68 65 0a 2a 2a 20 57  ntax to the.** W
1b40: 48 45 52 45 20 63 6c 61 75 73 65 20 65 78 70 72  HERE clause expr
1b50: 65 73 73 69 6f 6e 20 6f 66 20 61 20 53 45 4c 45  ession of a SELE
1b60: 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 54 68  CT statement. Th
1b70: 65 20 6e 65 77 20 74 65 72 6d 2c 20 77 68 69 63  e new term, whic
1b80: 68 0a 2a 2a 20 69 73 20 41 4e 44 65 64 20 77 69  h.** is ANDed wi
1b90: 74 68 20 74 68 65 20 65 78 69 73 74 69 6e 67 20  th the existing 
1ba0: 57 48 45 52 45 20 63 6c 61 75 73 65 2c 20 69 73  WHERE clause, is
1bb0: 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a   of the form:.**
1bc0: 0a 2a 2a 20 20 20 20 28 74 61 62 31 2e 63 6f 6c  .**    (tab1.col
1bd0: 31 20 3d 20 74 61 62 32 2e 63 6f 6c 32 29 0a 2a  1 = tab2.col2).*
1be0: 2a 0a 2a 2a 20 77 68 65 72 65 20 74 61 62 31 20  *.** where tab1 
1bf0: 69 73 20 74 68 65 20 69 53 72 63 27 74 68 20 74  is the iSrc'th t
1c00: 61 62 6c 65 20 69 6e 20 53 72 63 4c 69 73 74 20  able in SrcList 
1c10: 70 53 72 63 20 61 6e 64 20 74 61 62 32 20 69 73  pSrc and tab2 is
1c20: 20 74 68 65 20 0a 2a 2a 20 28 69 53 72 63 2b 31   the .** (iSrc+1
1c30: 29 27 74 68 2e 20 43 6f 6c 75 6d 6e 20 63 6f 6c  )'th. Column col
1c40: 31 20 69 73 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c  1 is column iCol
1c50: 4c 65 66 74 20 6f 66 20 74 61 62 31 2c 20 61 6e  Left of tab1, an
1c60: 64 20 63 6f 6c 32 20 69 73 0a 2a 2a 20 63 6f 6c  d col2 is.** col
1c70: 75 6d 6e 20 69 43 6f 6c 52 69 67 68 74 20 6f 66  umn iColRight of
1c80: 20 74 61 62 32 2e 0a 2a 2f 0a 73 74 61 74 69 63   tab2..*/.static
1c90: 20 76 6f 69 64 20 61 64 64 57 68 65 72 65 54 65   void addWhereTe
1ca0: 72 6d 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  rm(.  Parse *pPa
1cb0: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  rse,            
1cc0: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
1cd0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72   context */.  Sr
1ce0: 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20  cList *pSrc,    
1cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d00: 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20   List of tables 
1d10: 69 6e 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a  in FROM clause *
1d20: 2f 0a 20 20 69 6e 74 20 69 4c 65 66 74 2c 20 20  /.  int iLeft,  
1d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d40: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
1d50: 66 69 72 73 74 20 74 61 62 6c 65 20 74 6f 20 6a  first table to j
1d60: 6f 69 6e 20 69 6e 20 70 53 72 63 20 2a 2f 0a 20  oin in pSrc */. 
1d70: 20 69 6e 74 20 69 43 6f 6c 4c 65 66 74 2c 20 20   int iColLeft,  
1d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d90: 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c   /* Index of col
1da0: 75 6d 6e 20 69 6e 20 66 69 72 73 74 20 74 61 62  umn in first tab
1db0: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 69 67  le */.  int iRig
1dc0: 68 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ht,             
1dd0: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
1de0: 20 6f 66 20 73 65 63 6f 6e 64 20 74 61 62 6c 65   of second table
1df0: 20 69 6e 20 70 53 72 63 20 2a 2f 0a 20 20 69 6e   in pSrc */.  in
1e00: 74 20 69 43 6f 6c 52 69 67 68 74 2c 20 20 20 20  t iColRight,    
1e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e20: 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e   Index of column
1e30: 20 69 6e 20 73 65 63 6f 6e 64 20 74 61 62 6c 65   in second table
1e40: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4f 75 74 65   */.  int isOute
1e50: 72 4a 6f 69 6e 2c 20 20 20 20 20 20 20 20 20 20  rJoin,          
1e60: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
1e70: 20 74 68 69 73 20 69 73 20 61 6e 20 4f 55 54 45   this is an OUTE
1e80: 52 20 6a 6f 69 6e 20 2a 2f 0a 20 20 45 78 70 72  R join */.  Expr
1e90: 20 2a 2a 70 70 57 68 65 72 65 20 20 20 20 20 20   **ppWhere      
1ea0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
1eb0: 4e 2f 4f 55 54 3a 20 54 68 65 20 57 48 45 52 45  N/OUT: The WHERE
1ec0: 20 63 6c 61 75 73 65 20 74 6f 20 61 64 64 20 74   clause to add t
1ed0: 6f 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  o */.){.  sqlite
1ee0: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
1ef0: 64 62 3b 0a 20 20 45 78 70 72 20 2a 70 45 31 3b  db;.  Expr *pE1;
1f00: 0a 20 20 45 78 70 72 20 2a 70 45 32 3b 0a 20 20  .  Expr *pE2;.  
1f10: 45 78 70 72 20 2a 70 45 71 3b 0a 0a 20 20 61 73  Expr *pEq;..  as
1f20: 73 65 72 74 28 20 69 4c 65 66 74 3c 69 52 69 67  sert( iLeft<iRig
1f30: 68 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ht );.  assert( 
1f40: 70 53 72 63 2d 3e 6e 53 72 63 3e 69 52 69 67 68  pSrc->nSrc>iRigh
1f50: 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  t );.  assert( p
1f60: 53 72 63 2d 3e 61 5b 69 4c 65 66 74 5d 2e 70 54  Src->a[iLeft].pT
1f70: 61 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ab );.  assert( 
1f80: 70 53 72 63 2d 3e 61 5b 69 52 69 67 68 74 5d 2e  pSrc->a[iRight].
1f90: 70 54 61 62 20 29 3b 0a 0a 20 20 70 45 31 20 3d  pTab );..  pE1 =
1fa0: 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 43 6f   sqlite3CreateCo
1fb0: 6c 75 6d 6e 45 78 70 72 28 64 62 2c 20 70 53 72  lumnExpr(db, pSr
1fc0: 63 2c 20 69 4c 65 66 74 2c 20 69 43 6f 6c 4c 65  c, iLeft, iColLe
1fd0: 66 74 29 3b 0a 20 20 70 45 32 20 3d 20 73 71 6c  ft);.  pE2 = sql
1fe0: 69 74 65 33 43 72 65 61 74 65 43 6f 6c 75 6d 6e  ite3CreateColumn
1ff0: 45 78 70 72 28 64 62 2c 20 70 53 72 63 2c 20 69  Expr(db, pSrc, i
2000: 52 69 67 68 74 2c 20 69 43 6f 6c 52 69 67 68 74  Right, iColRight
2010: 29 3b 0a 0a 20 20 70 45 71 20 3d 20 73 71 6c 69  );..  pEq = sqli
2020: 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
2030: 20 54 4b 5f 45 51 2c 20 70 45 31 2c 20 70 45 32   TK_EQ, pE1, pE2
2040: 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 45 71 20  , 0);.  if( pEq 
2050: 26 26 20 69 73 4f 75 74 65 72 4a 6f 69 6e 20 29  && isOuterJoin )
2060: 7b 0a 20 20 20 20 45 78 70 72 53 65 74 50 72 6f  {.    ExprSetPro
2070: 70 65 72 74 79 28 70 45 71 2c 20 45 50 5f 46 72  perty(pEq, EP_Fr
2080: 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20 61 73 73  omJoin);.    ass
2090: 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
20a0: 70 65 72 74 79 28 70 45 71 2c 20 45 50 5f 54 6f  perty(pEq, EP_To
20b0: 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63  kenOnly|EP_Reduc
20c0: 65 64 29 20 29 3b 0a 20 20 20 20 45 78 70 72 53  ed) );.    ExprS
20d0: 65 74 56 56 41 50 72 6f 70 65 72 74 79 28 70 45  etVVAProperty(pE
20e0: 71 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b  q, EP_NoReduce);
20f0: 0a 20 20 20 20 70 45 71 2d 3e 69 52 69 67 68 74  .    pEq->iRight
2100: 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 28 69 31 36  JoinTable = (i16
2110: 29 70 45 32 2d 3e 69 54 61 62 6c 65 3b 0a 20 20  )pE2->iTable;.  
2120: 7d 0a 20 20 2a 70 70 57 68 65 72 65 20 3d 20 73  }.  *ppWhere = s
2130: 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 64 62  qlite3ExprAnd(db
2140: 2c 20 2a 70 70 57 68 65 72 65 2c 20 70 45 71 29  , *ppWhere, pEq)
2150: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
2160: 68 65 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 70  he EP_FromJoin p
2170: 72 6f 70 65 72 74 79 20 6f 6e 20 61 6c 6c 20 74  roperty on all t
2180: 65 72 6d 73 20 6f 66 20 74 68 65 20 67 69 76 65  erms of the give
2190: 6e 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a  n expression..**
21a0: 20 41 6e 64 20 73 65 74 20 74 68 65 20 45 78 70   And set the Exp
21b0: 72 2e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c  r.iRightJoinTabl
21c0: 65 20 74 6f 20 69 54 61 62 6c 65 20 66 6f 72 20  e to iTable for 
21d0: 65 76 65 72 79 20 74 65 72 6d 20 69 6e 20 74 68  every term in th
21e0: 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 2e  e.** expression.
21f0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 50 5f 46 72  .**.** The EP_Fr
2200: 6f 6d 4a 6f 69 6e 20 70 72 6f 70 65 72 74 79 20  omJoin property 
2210: 69 73 20 75 73 65 64 20 6f 6e 20 74 65 72 6d 73  is used on terms
2220: 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f   of an expressio
2230: 6e 20 74 6f 20 74 65 6c 6c 0a 2a 2a 20 74 68 65  n to tell.** the
2240: 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e   LEFT OUTER JOIN
2250: 20 70 72 6f 63 65 73 73 69 6e 67 20 6c 6f 67 69   processing logi
2260: 63 20 74 68 61 74 20 74 68 69 73 20 74 65 72 6d  c that this term
2270: 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 0a   is part of the.
2280: 2a 2a 20 6a 6f 69 6e 20 72 65 73 74 72 69 63 74  ** join restrict
2290: 69 6f 6e 20 73 70 65 63 69 66 69 65 64 20 69 6e  ion specified in
22a0: 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47   the ON or USING
22b0: 20 63 6c 61 75 73 65 20 61 6e 64 20 6e 6f 74 20   clause and not 
22c0: 61 20 70 61 72 74 0a 2a 2a 20 6f 66 20 74 68 65  a part.** of the
22d0: 20 6d 6f 72 65 20 67 65 6e 65 72 61 6c 20 57 48   more general WH
22e0: 45 52 45 20 63 6c 61 75 73 65 2e 20 20 54 68 65  ERE clause.  The
22f0: 73 65 20 74 65 72 6d 73 20 61 72 65 20 6d 6f 76  se terms are mov
2300: 65 64 20 6f 76 65 72 20 74 6f 20 74 68 65 0a 2a  ed over to the.*
2310: 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 64  * WHERE clause d
2320: 75 72 69 6e 67 20 6a 6f 69 6e 20 70 72 6f 63 65  uring join proce
2330: 73 73 69 6e 67 20 62 75 74 20 77 65 20 6e 65 65  ssing but we nee
2340: 64 20 74 6f 20 72 65 6d 65 6d 62 65 72 20 74 68  d to remember th
2350: 61 74 20 74 68 65 79 0a 2a 2a 20 6f 72 69 67 69  at they.** origi
2360: 6e 61 74 65 64 20 69 6e 20 74 68 65 20 4f 4e 20  nated in the ON 
2370: 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2e  or USING clause.
2380: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 78 70 72 2e  .**.** The Expr.
2390: 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20  iRightJoinTable 
23a0: 74 65 6c 6c 73 20 74 68 65 20 57 48 45 52 45 20  tells the WHERE 
23b0: 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e  clause processin
23c0: 67 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 65 78  g that the.** ex
23d0: 70 72 65 73 73 69 6f 6e 20 64 65 70 65 6e 64 73  pression depends
23e0: 20 6f 6e 20 74 61 62 6c 65 20 69 52 69 67 68 74   on table iRight
23f0: 4a 6f 69 6e 54 61 62 6c 65 20 65 76 65 6e 20 69  JoinTable even i
2400: 66 20 74 68 61 74 20 74 61 62 6c 65 20 69 73 20  f that table is 
2410: 6e 6f 74 0a 2a 2a 20 65 78 70 6c 69 63 69 74 6c  not.** explicitl
2420: 79 20 6d 65 6e 74 69 6f 6e 65 64 20 69 6e 20 74  y mentioned in t
2430: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20  he expression.  
2440: 54 68 61 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  That information
2450: 20 69 73 20 6e 65 65 64 65 64 0a 2a 2a 20 66 6f   is needed.** fo
2460: 72 20 63 61 73 65 73 20 6c 69 6b 65 20 74 68 69  r cases like thi
2470: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45  s:.**.**    SELE
2480: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4c 45 46  CT * FROM t1 LEF
2490: 54 20 4a 4f 49 4e 20 74 32 20 4f 4e 20 74 31 2e  T JOIN t2 ON t1.
24a0: 61 3d 74 32 2e 62 20 41 4e 44 20 74 31 2e 78 3d  a=t2.b AND t1.x=
24b0: 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 77 68 65 72  5.**.** The wher
24c0: 65 20 63 6c 61 75 73 65 20 6e 65 65 64 73 20 74  e clause needs t
24d0: 6f 20 64 65 66 65 72 20 74 68 65 20 68 61 6e 64  o defer the hand
24e0: 6c 69 6e 67 20 6f 66 20 74 68 65 20 74 31 2e 78  ling of the t1.x
24f0: 3d 35 0a 2a 2a 20 74 65 72 6d 20 75 6e 74 69 6c  =5.** term until
2500: 20 61 66 74 65 72 20 74 68 65 20 74 32 20 6c 6f   after the t2 lo
2510: 6f 70 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20  op of the join. 
2520: 20 49 6e 20 74 68 61 74 20 77 61 79 2c 20 61 0a   In that way, a.
2530: 2a 2a 20 4e 55 4c 4c 20 74 32 20 72 6f 77 20 77  ** NULL t2 row w
2540: 69 6c 6c 20 62 65 20 69 6e 73 65 72 74 65 64 20  ill be inserted 
2550: 77 68 65 6e 65 76 65 72 20 74 31 2e 78 21 3d 35  whenever t1.x!=5
2560: 2e 20 20 49 66 20 77 65 20 64 6f 20 6e 6f 74 0a  .  If we do not.
2570: 2a 2a 20 64 65 66 65 72 20 74 68 65 20 68 61 6e  ** defer the han
2580: 64 6c 69 6e 67 20 6f 66 20 74 31 2e 78 3d 35 2c  dling of t1.x=5,
2590: 20 69 74 20 77 69 6c 6c 20 62 65 20 70 72 6f 63   it will be proc
25a0: 65 73 73 65 64 20 69 6d 6d 65 64 69 61 74 65 6c  essed immediatel
25b0: 79 0a 2a 2a 20 61 66 74 65 72 20 74 68 65 20 74  y.** after the t
25c0: 31 20 6c 6f 6f 70 20 61 6e 64 20 72 6f 77 73 20  1 loop and rows 
25d0: 77 69 74 68 20 74 31 2e 78 21 3d 35 20 77 69 6c  with t1.x!=5 wil
25e0: 6c 20 6e 65 76 65 72 20 61 70 70 65 61 72 20 69  l never appear i
25f0: 6e 0a 2a 2a 20 74 68 65 20 6f 75 74 70 75 74 2c  n.** the output,
2600: 20 77 68 69 63 68 20 69 73 20 69 6e 63 6f 72 72   which is incorr
2610: 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ect..*/.static v
2620: 6f 69 64 20 73 65 74 4a 6f 69 6e 45 78 70 72 28  oid setJoinExpr(
2630: 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 69 54 61  Expr *p, int iTa
2640: 62 6c 65 29 7b 0a 20 20 77 68 69 6c 65 28 20 70  ble){.  while( p
2650: 20 29 7b 0a 20 20 20 20 45 78 70 72 53 65 74 50   ){.    ExprSetP
2660: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 46 72  roperty(p, EP_Fr
2670: 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20 61 73 73  omJoin);.    ass
2680: 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
2690: 70 65 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65  perty(p, EP_Toke
26a0: 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64  nOnly|EP_Reduced
26b0: 29 20 29 3b 0a 20 20 20 20 45 78 70 72 53 65 74  ) );.    ExprSet
26c0: 56 56 41 50 72 6f 70 65 72 74 79 28 70 2c 20 45  VVAProperty(p, E
26d0: 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a 20 20 20  P_NoReduce);.   
26e0: 20 70 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61   p->iRightJoinTa
26f0: 62 6c 65 20 3d 20 28 69 31 36 29 69 54 61 62 6c  ble = (i16)iTabl
2700: 65 3b 0a 20 20 20 20 73 65 74 4a 6f 69 6e 45 78  e;.    setJoinEx
2710: 70 72 28 70 2d 3e 70 4c 65 66 74 2c 20 69 54 61  pr(p->pLeft, iTa
2720: 62 6c 65 29 3b 0a 20 20 20 20 70 20 3d 20 70 2d  ble);.    p = p-
2730: 3e 70 52 69 67 68 74 3b 0a 20 20 7d 20 0a 7d 0a  >pRight;.  } .}.
2740: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
2750: 69 6e 65 20 70 72 6f 63 65 73 73 65 73 20 74 68  ine processes th
2760: 65 20 6a 6f 69 6e 20 69 6e 66 6f 72 6d 61 74 69  e join informati
2770: 6f 6e 20 66 6f 72 20 61 20 53 45 4c 45 43 54 20  on for a SELECT 
2780: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4f 4e  statement..** ON
2790: 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73   and USING claus
27a0: 65 73 20 61 72 65 20 63 6f 6e 76 65 72 74 65 64  es are converted
27b0: 20 69 6e 74 6f 20 65 78 74 72 61 20 74 65 72 6d   into extra term
27c0: 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  s of the WHERE c
27d0: 6c 61 75 73 65 2e 0a 2a 2a 20 4e 41 54 55 52 41  lause..** NATURA
27e0: 4c 20 6a 6f 69 6e 73 20 61 6c 73 6f 20 63 72 65  L joins also cre
27f0: 61 74 65 20 65 78 74 72 61 20 57 48 45 52 45 20  ate extra WHERE 
2800: 63 6c 61 75 73 65 20 74 65 72 6d 73 2e 0a 2a 2a  clause terms..**
2810: 0a 2a 2a 20 54 68 65 20 74 65 72 6d 73 20 6f 66  .** The terms of
2820: 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 61   a FROM clause a
2830: 72 65 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20  re contained in 
2840: 74 68 65 20 53 65 6c 65 63 74 2e 70 53 72 63 20  the Select.pSrc 
2850: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 20 54 68  structure..** Th
2860: 65 20 6c 65 66 74 20 6d 6f 73 74 20 74 61 62 6c  e left most tabl
2870: 65 20 69 73 20 74 68 65 20 66 69 72 73 74 20 65  e is the first e
2880: 6e 74 72 79 20 69 6e 20 53 65 6c 65 63 74 2e 70  ntry in Select.p
2890: 53 72 63 2e 20 20 54 68 65 20 72 69 67 68 74 2d  Src.  The right-
28a0: 6d 6f 73 74 0a 2a 2a 20 74 61 62 6c 65 20 69 73  most.** table is
28b0: 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 2e   the last entry.
28c0: 20 20 54 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61    The join opera
28d0: 74 6f 72 20 69 73 20 68 65 6c 64 20 69 6e 20 74  tor is held in t
28e0: 68 65 20 65 6e 74 72 79 20 74 6f 0a 2a 2a 20 74  he entry to.** t
28f0: 68 65 20 6c 65 66 74 2e 20 20 54 68 75 73 20 65  he left.  Thus e
2900: 6e 74 72 79 20 30 20 63 6f 6e 74 61 69 6e 73 20  ntry 0 contains 
2910: 74 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f  the join operato
2920: 72 20 66 6f 72 20 74 68 65 20 6a 6f 69 6e 20 62  r for the join b
2930: 65 74 77 65 65 6e 0a 2a 2a 20 65 6e 74 72 69 65  etween.** entrie
2940: 73 20 30 20 61 6e 64 20 31 2e 20 20 41 6e 79 20  s 0 and 1.  Any 
2950: 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75  ON or USING clau
2960: 73 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ses associated w
2970: 69 74 68 20 74 68 65 20 6a 6f 69 6e 20 61 72 65  ith the join are
2980: 0a 2a 2a 20 61 6c 73 6f 20 61 74 74 61 63 68 65  .** also attache
2990: 64 20 74 6f 20 74 68 65 20 6c 65 66 74 20 65 6e  d to the left en
29a0: 74 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  try..**.** This 
29b0: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
29c0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72  the number of er
29d0: 72 6f 72 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  rors encountered
29e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
29f0: 73 71 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f 69  sqliteProcessJoi
2a00: 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  n(Parse *pParse,
2a10: 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 53   Select *p){.  S
2a20: 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 20 20 20  rcList *pSrc;   
2a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a40: 2a 20 41 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20  * All tables in 
2a50: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
2a60: 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20  */.  int i, j;  
2a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a80: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
2a90: 6e 74 65 72 73 20 2a 2f 0a 20 20 73 74 72 75 63  nters */.  struc
2aa0: 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
2ab0: 70 4c 65 66 74 3b 20 20 20 20 20 2f 2a 20 4c 65  pLeft;     /* Le
2ac0: 66 74 20 74 61 62 6c 65 20 62 65 69 6e 67 20 6a  ft table being j
2ad0: 6f 69 6e 65 64 20 2a 2f 0a 20 20 73 74 72 75 63  oined */.  struc
2ae0: 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
2af0: 70 52 69 67 68 74 3b 20 20 20 20 2f 2a 20 52 69  pRight;    /* Ri
2b00: 67 68 74 20 74 61 62 6c 65 20 62 65 69 6e 67 20  ght table being 
2b10: 6a 6f 69 6e 65 64 20 2a 2f 0a 0a 20 20 70 53 72  joined */..  pSr
2b20: 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70  c = p->pSrc;.  p
2b30: 4c 65 66 74 20 3d 20 26 70 53 72 63 2d 3e 61 5b  Left = &pSrc->a[
2b40: 30 5d 3b 0a 20 20 70 52 69 67 68 74 20 3d 20 26  0];.  pRight = &
2b50: 70 4c 65 66 74 5b 31 5d 3b 0a 20 20 66 6f 72 28  pLeft[1];.  for(
2b60: 69 3d 30 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72  i=0; i<pSrc->nSr
2b70: 63 2d 31 3b 20 69 2b 2b 2c 20 70 52 69 67 68 74  c-1; i++, pRight
2b80: 2b 2b 2c 20 70 4c 65 66 74 2b 2b 29 7b 0a 20 20  ++, pLeft++){.  
2b90: 20 20 54 61 62 6c 65 20 2a 70 4c 65 66 74 54 61    Table *pLeftTa
2ba0: 62 20 3d 20 70 4c 65 66 74 2d 3e 70 54 61 62 3b  b = pLeft->pTab;
2bb0: 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 52 69 67  .    Table *pRig
2bc0: 68 74 54 61 62 20 3d 20 70 52 69 67 68 74 2d 3e  htTab = pRight->
2bd0: 70 54 61 62 3b 0a 20 20 20 20 69 6e 74 20 69 73  pTab;.    int is
2be0: 4f 75 74 65 72 3b 0a 0a 20 20 20 20 69 66 28 20  Outer;..    if( 
2bf0: 4e 45 56 45 52 28 70 4c 65 66 74 54 61 62 3d 3d  NEVER(pLeftTab==
2c00: 30 20 7c 7c 20 70 52 69 67 68 74 54 61 62 3d 3d  0 || pRightTab==
2c10: 30 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  0) ) continue;. 
2c20: 20 20 20 69 73 4f 75 74 65 72 20 3d 20 28 70 52     isOuter = (pR
2c30: 69 67 68 74 2d 3e 6a 6f 69 6e 74 79 70 65 20 26  ight->jointype &
2c40: 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30 3b 0a 0a   JT_OUTER)!=0;..
2c50: 20 20 20 20 2f 2a 20 57 68 65 6e 20 74 68 65 20      /* When the 
2c60: 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 20  NATURAL keyword 
2c70: 69 73 20 70 72 65 73 65 6e 74 2c 20 61 64 64 20  is present, add 
2c80: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
2c90: 6d 73 20 66 6f 72 0a 20 20 20 20 2a 2a 20 65 76  ms for.    ** ev
2ca0: 65 72 79 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20  ery column that 
2cb0: 74 68 65 20 74 77 6f 20 74 61 62 6c 65 73 20 68  the two tables h
2cc0: 61 76 65 20 69 6e 20 63 6f 6d 6d 6f 6e 2e 0a 20  ave in common.. 
2cd0: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52     */.    if( pR
2ce0: 69 67 68 74 2d 3e 6a 6f 69 6e 74 79 70 65 20 26  ight->jointype &
2cf0: 20 4a 54 5f 4e 41 54 55 52 41 4c 20 29 7b 0a 20   JT_NATURAL ){. 
2d00: 20 20 20 20 20 69 66 28 20 70 52 69 67 68 74 2d       if( pRight-
2d10: 3e 70 4f 6e 20 7c 7c 20 70 52 69 67 68 74 2d 3e  >pOn || pRight->
2d20: 70 55 73 69 6e 67 20 29 7b 0a 20 20 20 20 20 20  pUsing ){.      
2d30: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
2d40: 67 28 70 50 61 72 73 65 2c 20 22 61 20 4e 41 54  g(pParse, "a NAT
2d50: 55 52 41 4c 20 6a 6f 69 6e 20 6d 61 79 20 6e 6f  URAL join may no
2d60: 74 20 68 61 76 65 20 22 0a 20 20 20 20 20 20 20  t have ".       
2d70: 20 20 20 20 22 61 6e 20 4f 4e 20 6f 72 20 55 53      "an ON or US
2d80: 49 4e 47 20 63 6c 61 75 73 65 22 2c 20 30 29 3b  ING clause", 0);
2d90: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2da0: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
2db0: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 52 69 67   for(j=0; j<pRig
2dc0: 68 74 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b  htTab->nCol; j++
2dd0: 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
2de0: 2a 7a 4e 61 6d 65 3b 20 20 20 2f 2a 20 4e 61 6d  *zName;   /* Nam
2df0: 65 20 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 74  e of column in t
2e00: 68 65 20 72 69 67 68 74 20 74 61 62 6c 65 20 2a  he right table *
2e10: 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4c  /.        int iL
2e20: 65 66 74 3b 20 20 20 20 20 2f 2a 20 4d 61 74 63  eft;     /* Matc
2e30: 68 69 6e 67 20 6c 65 66 74 20 74 61 62 6c 65 20  hing left table 
2e40: 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  */.        int i
2e50: 4c 65 66 74 43 6f 6c 3b 20 20 2f 2a 20 4d 61 74  LeftCol;  /* Mat
2e60: 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 69 6e 20  ching column in 
2e70: 74 68 65 20 6c 65 66 74 20 74 61 62 6c 65 20 2a  the left table *
2e80: 2f 0a 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65  /..        zName
2e90: 20 3d 20 70 52 69 67 68 74 54 61 62 2d 3e 61 43   = pRightTab->aC
2ea0: 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  ol[j].zName;.   
2eb0: 20 20 20 20 20 69 66 28 20 74 61 62 6c 65 41 6e       if( tableAn
2ec0: 64 43 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 53 72  dColumnIndex(pSr
2ed0: 63 2c 20 69 2b 31 2c 20 7a 4e 61 6d 65 2c 20 26  c, i+1, zName, &
2ee0: 69 4c 65 66 74 2c 20 26 69 4c 65 66 74 43 6f 6c  iLeft, &iLeftCol
2ef0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  ) ){.          a
2f00: 64 64 57 68 65 72 65 54 65 72 6d 28 70 50 61 72  ddWhereTerm(pPar
2f10: 73 65 2c 20 70 53 72 63 2c 20 69 4c 65 66 74 2c  se, pSrc, iLeft,
2f20: 20 69 4c 65 66 74 43 6f 6c 2c 20 69 2b 31 2c 20   iLeftCol, i+1, 
2f30: 6a 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  j,.             
2f40: 20 20 20 20 20 20 20 20 20 20 69 73 4f 75 74 65            isOute
2f50: 72 2c 20 26 70 2d 3e 70 57 68 65 72 65 29 3b 0a  r, &p->pWhere);.
2f60: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2f70: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
2f80: 44 69 73 61 6c 6c 6f 77 20 62 6f 74 68 20 4f 4e  Disallow both ON
2f90: 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73   and USING claus
2fa0: 65 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20 6a  es in the same j
2fb0: 6f 69 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  oin.    */.    i
2fc0: 66 28 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20 26  f( pRight->pOn &
2fd0: 26 20 70 52 69 67 68 74 2d 3e 70 55 73 69 6e 67  & pRight->pUsing
2fe0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2ff0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
3000: 2c 20 22 63 61 6e 6e 6f 74 20 68 61 76 65 20 62  , "cannot have b
3010: 6f 74 68 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47  oth ON and USING
3020: 20 22 0a 20 20 20 20 20 20 20 20 22 63 6c 61 75   ".        "clau
3030: 73 65 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20  ses in the same 
3040: 6a 6f 69 6e 22 29 3b 0a 20 20 20 20 20 20 72 65  join");.      re
3050: 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 0a 20  turn 1;.    }.. 
3060: 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 4f 4e     /* Add the ON
3070: 20 63 6c 61 75 73 65 20 74 6f 20 74 68 65 20 65   clause to the e
3080: 6e 64 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  nd of the WHERE 
3090: 63 6c 61 75 73 65 2c 20 63 6f 6e 6e 65 63 74 65  clause, connecte
30a0: 64 20 62 79 0a 20 20 20 20 2a 2a 20 61 6e 20 41  d by.    ** an A
30b0: 4e 44 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 20  ND operator..   
30c0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 69 67   */.    if( pRig
30d0: 68 74 2d 3e 70 4f 6e 20 29 7b 0a 20 20 20 20 20  ht->pOn ){.     
30e0: 20 69 66 28 20 69 73 4f 75 74 65 72 20 29 20 73   if( isOuter ) s
30f0: 65 74 4a 6f 69 6e 45 78 70 72 28 70 52 69 67 68  etJoinExpr(pRigh
3100: 74 2d 3e 70 4f 6e 2c 20 70 52 69 67 68 74 2d 3e  t->pOn, pRight->
3110: 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20  iCursor);.      
3120: 70 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69  p->pWhere = sqli
3130: 74 65 33 45 78 70 72 41 6e 64 28 70 50 61 72 73  te3ExprAnd(pPars
3140: 65 2d 3e 64 62 2c 20 70 2d 3e 70 57 68 65 72 65  e->db, p->pWhere
3150: 2c 20 70 52 69 67 68 74 2d 3e 70 4f 6e 29 3b 0a  , pRight->pOn);.
3160: 20 20 20 20 20 20 70 52 69 67 68 74 2d 3e 70 4f        pRight->pO
3170: 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20  n = 0;.    }..  
3180: 20 20 2f 2a 20 43 72 65 61 74 65 20 65 78 74 72    /* Create extr
3190: 61 20 74 65 72 6d 73 20 6f 6e 20 74 68 65 20 57  a terms on the W
31a0: 48 45 52 45 20 63 6c 61 75 73 65 20 66 6f 72 20  HERE clause for 
31b0: 65 61 63 68 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  each column name
31c0: 64 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20  d.    ** in the 
31d0: 55 53 49 4e 47 20 63 6c 61 75 73 65 2e 20 20 45  USING clause.  E
31e0: 78 61 6d 70 6c 65 3a 20 49 66 20 74 68 65 20 74  xample: If the t
31f0: 77 6f 20 74 61 62 6c 65 73 20 74 6f 20 62 65 20  wo tables to be 
3200: 6a 6f 69 6e 65 64 20 61 72 65 20 0a 20 20 20 20  joined are .    
3210: 2a 2a 20 41 20 61 6e 64 20 42 20 61 6e 64 20 74  ** A and B and t
3220: 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20  he USING clause 
3230: 6e 61 6d 65 73 20 58 2c 20 59 2c 20 61 6e 64 20  names X, Y, and 
3240: 5a 2c 20 74 68 65 6e 20 61 64 64 20 74 68 69 73  Z, then add this
3250: 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 57  .    ** to the W
3260: 48 45 52 45 20 63 6c 61 75 73 65 3a 20 20 20 20  HERE clause:    
3270: 41 2e 58 3d 42 2e 58 20 41 4e 44 20 41 2e 59 3d  A.X=B.X AND A.Y=
3280: 42 2e 59 20 41 4e 44 20 41 2e 5a 3d 42 2e 5a 0a  B.Y AND A.Z=B.Z.
3290: 20 20 20 20 2a 2a 20 52 65 70 6f 72 74 20 61 6e      ** Report an
32a0: 20 65 72 72 6f 72 20 69 66 20 61 6e 79 20 63 6f   error if any co
32b0: 6c 75 6d 6e 20 6d 65 6e 74 69 6f 6e 65 64 20 69  lumn mentioned i
32c0: 6e 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75  n the USING clau
32d0: 73 65 20 69 73 0a 20 20 20 20 2a 2a 20 6e 6f 74  se is.    ** not
32e0: 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 62 6f   contained in bo
32f0: 74 68 20 74 61 62 6c 65 73 20 74 6f 20 62 65 20  th tables to be 
3300: 6a 6f 69 6e 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  joined..    */. 
3310: 20 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 70     if( pRight->p
3320: 55 73 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 49  Using ){.      I
3330: 64 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70  dList *pList = p
3340: 52 69 67 68 74 2d 3e 70 55 73 69 6e 67 3b 0a 20  Right->pUsing;. 
3350: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
3360: 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 6a 2b 2b 29  pList->nId; j++)
3370: 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  {.        char *
3380: 7a 4e 61 6d 65 3b 20 20 20 20 20 2f 2a 20 4e 61  zName;     /* Na
3390: 6d 65 20 6f 66 20 74 68 65 20 74 65 72 6d 20 69  me of the term i
33a0: 6e 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75  n the USING clau
33b0: 73 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  se */.        in
33c0: 74 20 69 4c 65 66 74 3b 20 20 20 20 20 20 20 2f  t iLeft;       /
33d0: 2a 20 54 61 62 6c 65 20 6f 6e 20 74 68 65 20 6c  * Table on the l
33e0: 65 66 74 20 77 69 74 68 20 6d 61 74 63 68 69 6e  eft with matchin
33f0: 67 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f  g column name */
3400: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4c 65  .        int iLe
3410: 66 74 43 6f 6c 3b 20 20 20 20 2f 2a 20 43 6f 6c  ftCol;    /* Col
3420: 75 6d 6e 20 6e 75 6d 62 65 72 20 6f 66 20 6d 61  umn number of ma
3430: 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 6f 6e  tching column on
3440: 20 74 68 65 20 6c 65 66 74 20 2a 2f 0a 20 20 20   the left */.   
3450: 20 20 20 20 20 69 6e 74 20 69 52 69 67 68 74 43       int iRightC
3460: 6f 6c 3b 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20  ol;   /* Column 
3470: 6e 75 6d 62 65 72 20 6f 66 20 6d 61 74 63 68 69  number of matchi
3480: 6e 67 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74 68 65  ng column on the
3490: 20 72 69 67 68 74 20 2a 2f 0a 0a 20 20 20 20 20   right */..     
34a0: 20 20 20 7a 4e 61 6d 65 20 3d 20 70 4c 69 73 74     zName = pList
34b0: 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  ->a[j].zName;.  
34c0: 20 20 20 20 20 20 69 52 69 67 68 74 43 6f 6c 20        iRightCol 
34d0: 3d 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 52  = columnIndex(pR
34e0: 69 67 68 74 54 61 62 2c 20 7a 4e 61 6d 65 29 3b  ightTab, zName);
34f0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 52 69  .        if( iRi
3500: 67 68 74 43 6f 6c 3c 30 0a 20 20 20 20 20 20 20  ghtCol<0.       
3510: 20 20 7c 7c 20 21 74 61 62 6c 65 41 6e 64 43 6f    || !tableAndCo
3520: 6c 75 6d 6e 49 6e 64 65 78 28 70 53 72 63 2c 20  lumnIndex(pSrc, 
3530: 69 2b 31 2c 20 7a 4e 61 6d 65 2c 20 26 69 4c 65  i+1, zName, &iLe
3540: 66 74 2c 20 26 69 4c 65 66 74 43 6f 6c 29 0a 20  ft, &iLeftCol). 
3550: 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
3560: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
3570: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63 61 6e  Msg(pParse, "can
3580: 6e 6f 74 20 6a 6f 69 6e 20 75 73 69 6e 67 20 63  not join using c
3590: 6f 6c 75 6d 6e 20 25 73 20 2d 20 63 6f 6c 75 6d  olumn %s - colum
35a0: 6e 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  n ".            
35b0: 22 6e 6f 74 20 70 72 65 73 65 6e 74 20 69 6e 20  "not present in 
35c0: 62 6f 74 68 20 74 61 62 6c 65 73 22 2c 20 7a 4e  both tables", zN
35d0: 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
35e0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
35f0: 20 20 7d 0a 20 20 20 20 20 20 20 20 61 64 64 57    }.        addW
3600: 68 65 72 65 54 65 72 6d 28 70 50 61 72 73 65 2c  hereTerm(pParse,
3610: 20 70 53 72 63 2c 20 69 4c 65 66 74 2c 20 69 4c   pSrc, iLeft, iL
3620: 65 66 74 43 6f 6c 2c 20 69 2b 31 2c 20 69 52 69  eftCol, i+1, iRi
3630: 67 68 74 43 6f 6c 2c 0a 20 20 20 20 20 20 20 20  ghtCol,.        
3640: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f               isO
3650: 75 74 65 72 2c 20 26 70 2d 3e 70 57 68 65 72 65  uter, &p->pWhere
3660: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
3670: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
3680: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74  .}../*.** Insert
3690: 20 63 6f 64 65 20 69 6e 74 6f 20 22 76 22 20 74   code into "v" t
36a0: 68 61 74 20 77 69 6c 6c 20 70 75 73 68 20 74 68  hat will push th
36b0: 65 20 72 65 63 6f 72 64 20 6f 6e 20 74 68 65 20  e record on the 
36c0: 74 6f 70 20 6f 66 20 74 68 65 0a 2a 2a 20 73 74  top of the.** st
36d0: 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 73 6f 72  ack into the sor
36e0: 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ter..*/.static v
36f0: 6f 69 64 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74  oid pushOntoSort
3700: 65 72 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  er(.  Parse *pPa
3710: 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  rse,         /* 
3720: 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  Parser context *
3730: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  /.  ExprList *pO
3740: 72 64 65 72 42 79 2c 20 20 20 20 2f 2a 20 54 68  rderBy,    /* Th
3750: 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
3760: 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  e */.  Select *p
3770: 53 65 6c 65 63 74 2c 20 20 20 20 20 20 20 2f 2a  Select,       /*
3780: 20 54 68 65 20 77 68 6f 6c 65 20 53 45 4c 45 43   The whole SELEC
3790: 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  T statement */. 
37a0: 20 69 6e 74 20 72 65 67 44 61 74 61 20 20 20 20   int regData    
37b0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73          /* Regis
37c0: 74 65 72 20 68 6f 6c 64 69 6e 67 20 64 61 74 61  ter holding data
37d0: 20 74 6f 20 62 65 20 73 6f 72 74 65 64 20 2a 2f   to be sorted */
37e0: 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  .){.  Vdbe *v = 
37f0: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
3800: 20 69 6e 74 20 6e 45 78 70 72 20 3d 20 70 4f 72   int nExpr = pOr
3810: 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20  derBy->nExpr;.  
3820: 69 6e 74 20 72 65 67 42 61 73 65 20 3d 20 73 71  int regBase = sq
3830: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67  lite3GetTempRang
3840: 65 28 70 50 61 72 73 65 2c 20 6e 45 78 70 72 2b  e(pParse, nExpr+
3850: 32 29 3b 0a 20 20 69 6e 74 20 72 65 67 52 65 63  2);.  int regRec
3860: 6f 72 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74  ord = sqlite3Get
3870: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
3880: 0a 20 20 69 6e 74 20 6f 70 3b 0a 20 20 73 71 6c  .  int op;.  sql
3890: 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65  ite3ExprCacheCle
38a0: 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71  ar(pParse);.  sq
38b0: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70  lite3ExprCodeExp
38c0: 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 4f  rList(pParse, pO
38d0: 72 64 65 72 42 79 2c 20 72 65 67 42 61 73 65 2c  rderBy, regBase,
38e0: 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64   0);.  sqlite3Vd
38f0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
3900: 65 71 75 65 6e 63 65 2c 20 70 4f 72 64 65 72 42  equence, pOrderB
3910: 79 2d 3e 69 45 43 75 72 73 6f 72 2c 20 72 65 67  y->iECursor, reg
3920: 42 61 73 65 2b 6e 45 78 70 72 29 3b 0a 20 20 73  Base+nExpr);.  s
3930: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f  qlite3ExprCodeMo
3940: 76 65 28 70 50 61 72 73 65 2c 20 72 65 67 44 61  ve(pParse, regDa
3950: 74 61 2c 20 72 65 67 42 61 73 65 2b 6e 45 78 70  ta, regBase+nExp
3960: 72 2b 31 2c 20 31 29 3b 0a 20 20 73 71 6c 69 74  r+1, 1);.  sqlit
3970: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
3980: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72  OP_MakeRecord, r
3990: 65 67 42 61 73 65 2c 20 6e 45 78 70 72 20 2b 20  egBase, nExpr + 
39a0: 32 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20  2, regRecord);. 
39b0: 20 69 66 28 20 70 53 65 6c 65 63 74 2d 3e 73 65   if( pSelect->se
39c0: 6c 46 6c 61 67 73 20 26 20 53 46 5f 55 73 65 53  lFlags & SF_UseS
39d0: 6f 72 74 65 72 20 29 7b 0a 20 20 20 20 6f 70 20  orter ){.    op 
39e0: 3d 20 4f 50 5f 53 6f 72 74 65 72 49 6e 73 65 72  = OP_SorterInser
39f0: 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  t;.  }else{.    
3a00: 6f 70 20 3d 20 4f 50 5f 49 64 78 49 6e 73 65 72  op = OP_IdxInser
3a10: 74 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  t;.  }.  sqlite3
3a20: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 6f 70  VdbeAddOp2(v, op
3a30: 2c 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75  , pOrderBy->iECu
3a40: 72 73 6f 72 2c 20 72 65 67 52 65 63 6f 72 64 29  rsor, regRecord)
3a50: 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  ;.  sqlite3Relea
3a60: 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
3a70: 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20  , regRecord);.  
3a80: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
3a90: 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
3aa0: 72 65 67 42 61 73 65 2c 20 6e 45 78 70 72 2b 32  regBase, nExpr+2
3ab0: 29 3b 0a 20 20 69 66 28 20 70 53 65 6c 65 63 74  );.  if( pSelect
3ac0: 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20  ->iLimit ){.    
3ad0: 69 6e 74 20 61 64 64 72 31 2c 20 61 64 64 72 32  int addr1, addr2
3ae0: 3b 0a 20 20 20 20 69 6e 74 20 69 4c 69 6d 69 74  ;.    int iLimit
3af0: 3b 0a 20 20 20 20 69 66 28 20 70 53 65 6c 65 63  ;.    if( pSelec
3b00: 74 2d 3e 69 4f 66 66 73 65 74 20 29 7b 0a 20 20  t->iOffset ){.  
3b10: 20 20 20 20 69 4c 69 6d 69 74 20 3d 20 70 53 65      iLimit = pSe
3b20: 6c 65 63 74 2d 3e 69 4f 66 66 73 65 74 2b 31 3b  lect->iOffset+1;
3b30: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
3b40: 20 20 69 4c 69 6d 69 74 20 3d 20 70 53 65 6c 65    iLimit = pSele
3b50: 63 74 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 20 20  ct->iLimit;.    
3b60: 7d 0a 20 20 20 20 61 64 64 72 31 20 3d 20 73 71  }.    addr1 = sq
3b70: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
3b80: 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c 20 69 4c  v, OP_IfZero, iL
3b90: 69 6d 69 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  imit);.    sqlit
3ba0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
3bb0: 4f 50 5f 41 64 64 49 6d 6d 2c 20 69 4c 69 6d 69  OP_AddImm, iLimi
3bc0: 74 2c 20 2d 31 29 3b 0a 20 20 20 20 61 64 64 72  t, -1);.    addr
3bd0: 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  2 = sqlite3VdbeA
3be0: 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp0(v, OP_Goto
3bf0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
3c00: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
3c10: 64 72 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  dr1);.    sqlite
3c20: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
3c30: 50 5f 4c 61 73 74 2c 20 70 4f 72 64 65 72 42 79  P_Last, pOrderBy
3c40: 2d 3e 69 45 43 75 72 73 6f 72 29 3b 0a 20 20 20  ->iECursor);.   
3c50: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
3c60: 70 31 28 76 2c 20 4f 50 5f 44 65 6c 65 74 65 2c  p1(v, OP_Delete,
3c70: 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72   pOrderBy->iECur
3c80: 73 6f 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  sor);.    sqlite
3c90: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
3ca0: 20 61 64 64 72 32 29 3b 0a 20 20 7d 0a 7d 0a 0a   addr2);.  }.}..
3cb0: 2f 2a 0a 2a 2a 20 41 64 64 20 63 6f 64 65 20 74  /*.** Add code t
3cc0: 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  o implement the 
3cd0: 4f 46 46 53 45 54 0a 2a 2f 0a 73 74 61 74 69 63  OFFSET.*/.static
3ce0: 20 76 6f 69 64 20 63 6f 64 65 4f 66 66 73 65 74   void codeOffset
3cf0: 28 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20  (.  Vdbe *v,    
3d00: 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
3d10: 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 69 73  e code into this
3d20: 20 56 4d 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20   VM */.  Select 
3d30: 2a 70 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68  *p,        /* Th
3d40: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
3d50: 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a  nt being coded *
3d60: 2f 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75  /.  int iContinu
3d70: 65 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65  e     /* Jump he
3d80: 72 65 20 74 6f 20 73 6b 69 70 20 74 68 65 20 63  re to skip the c
3d90: 75 72 72 65 6e 74 20 72 65 63 6f 72 64 20 2a 2f  urrent record */
3da0: 0a 29 7b 0a 20 20 69 66 28 20 70 2d 3e 69 4f 66  .){.  if( p->iOf
3db0: 66 73 65 74 20 26 26 20 69 43 6f 6e 74 69 6e 75  fset && iContinu
3dc0: 65 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  e!=0 ){.    int 
3dd0: 61 64 64 72 3b 0a 20 20 20 20 73 71 6c 69 74 65  addr;.    sqlite
3de0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
3df0: 50 5f 41 64 64 49 6d 6d 2c 20 70 2d 3e 69 4f 66  P_AddImm, p->iOf
3e00: 66 73 65 74 2c 20 2d 31 29 3b 0a 20 20 20 20 61  fset, -1);.    a
3e10: 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
3e20: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66  eAddOp1(v, OP_If
3e30: 4e 65 67 2c 20 70 2d 3e 69 4f 66 66 73 65 74 29  Neg, p->iOffset)
3e40: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
3e50: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
3e60: 74 6f 2c 20 30 2c 20 69 43 6f 6e 74 69 6e 75 65  to, 0, iContinue
3e70: 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  );.    VdbeComme
3e80: 6e 74 28 28 76 2c 20 22 73 6b 69 70 20 4f 46 46  nt((v, "skip OFF
3e90: 53 45 54 20 72 65 63 6f 72 64 73 22 29 29 3b 0a  SET records"));.
3ea0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
3eb0: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 29  umpHere(v, addr)
3ec0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ;.  }.}../*.** A
3ed0: 64 64 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c  dd code that wil
3ee0: 6c 20 63 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20  l check to make 
3ef0: 73 75 72 65 20 74 68 65 20 4e 20 72 65 67 69 73  sure the N regis
3f00: 74 65 72 73 20 73 74 61 72 74 69 6e 67 20 61 74  ters starting at
3f10: 20 69 4d 65 6d 0a 2a 2a 20 66 6f 72 6d 20 61 20   iMem.** form a 
3f20: 64 69 73 74 69 6e 63 74 20 65 6e 74 72 79 2e 20  distinct entry. 
3f30: 20 69 54 61 62 20 69 73 20 61 20 73 6f 72 74 69   iTab is a sorti
3f40: 6e 67 20 69 6e 64 65 78 20 74 68 61 74 20 68 6f  ng index that ho
3f50: 6c 64 73 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a  lds previously.*
3f60: 2a 20 73 65 65 6e 20 63 6f 6d 62 69 6e 61 74 69  * seen combinati
3f70: 6f 6e 73 20 6f 66 20 74 68 65 20 4e 20 76 61 6c  ons of the N val
3f80: 75 65 73 2e 20 20 41 20 6e 65 77 20 65 6e 74 72  ues.  A new entr
3f90: 79 20 69 73 20 6d 61 64 65 20 69 6e 20 69 54 61  y is made in iTa
3fa0: 62 0a 2a 2a 20 69 66 20 74 68 65 20 63 75 72 72  b.** if the curr
3fb0: 65 6e 74 20 4e 20 76 61 6c 75 65 73 20 61 72 65  ent N values are
3fc0: 20 6e 65 77 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a 75   new..**.** A ju
3fd0: 6d 70 20 74 6f 20 61 64 64 72 52 65 70 65 61 74  mp to addrRepeat
3fe0: 20 69 73 20 6d 61 64 65 20 61 6e 64 20 74 68 65   is made and the
3ff0: 20 4e 2b 31 20 76 61 6c 75 65 73 20 61 72 65 20   N+1 values are 
4000: 70 6f 70 70 65 64 20 66 72 6f 6d 20 74 68 65 0a  popped from the.
4010: 2a 2a 20 73 74 61 63 6b 20 69 66 20 74 68 65 20  ** stack if the 
4020: 74 6f 70 20 4e 20 65 6c 65 6d 65 6e 74 73 20 61  top N elements a
4030: 72 65 20 6e 6f 74 20 64 69 73 74 69 6e 63 74 2e  re not distinct.
4040: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
4050: 63 6f 64 65 44 69 73 74 69 6e 63 74 28 0a 20 20  codeDistinct(.  
4060: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
4070: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e     /* Parsing an
4080: 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e  d code generatin
4090: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69  g context */.  i
40a0: 6e 74 20 69 54 61 62 2c 20 20 20 20 20 20 20 20  nt iTab,        
40b0: 20 20 2f 2a 20 41 20 73 6f 72 74 69 6e 67 20 69    /* A sorting i
40c0: 6e 64 65 78 20 75 73 65 64 20 74 6f 20 74 65 73  ndex used to tes
40d0: 74 20 66 6f 72 20 64 69 73 74 69 6e 63 74 6e 65  t for distinctne
40e0: 73 73 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ss */.  int addr
40f0: 52 65 70 65 61 74 2c 20 20 20 20 2f 2a 20 4a 75  Repeat,    /* Ju
4100: 6d 70 20 74 6f 20 68 65 72 65 20 69 66 20 6e 6f  mp to here if no
4110: 74 20 64 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20  t distinct */.  
4120: 69 6e 74 20 4e 2c 20 20 20 20 20 20 20 20 20 20  int N,          
4130: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
4140: 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 6e  elements */.  in
4150: 74 20 69 4d 65 6d 20 20 20 20 20 20 20 20 20 20  t iMem          
4160: 20 2f 2a 20 46 69 72 73 74 20 65 6c 65 6d 65 6e   /* First elemen
4170: 74 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a  t */.){.  Vdbe *
4180: 76 3b 0a 20 20 69 6e 74 20 72 31 3b 0a 0a 20 20  v;.  int r1;..  
4190: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
41a0: 65 3b 0a 20 20 72 31 20 3d 20 73 71 6c 69 74 65  e;.  r1 = sqlite
41b0: 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
41c0: 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  se);.  sqlite3Vd
41d0: 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f  beAddOp4Int(v, O
41e0: 50 5f 46 6f 75 6e 64 2c 20 69 54 61 62 2c 20 61  P_Found, iTab, a
41f0: 64 64 72 52 65 70 65 61 74 2c 20 69 4d 65 6d 2c  ddrRepeat, iMem,
4200: 20 4e 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64   N);.  sqlite3Vd
4210: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d  beAddOp3(v, OP_M
4220: 61 6b 65 52 65 63 6f 72 64 2c 20 69 4d 65 6d 2c  akeRecord, iMem,
4230: 20 4e 2c 20 72 31 29 3b 0a 20 20 73 71 6c 69 74   N, r1);.  sqlit
4240: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
4250: 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 54  OP_IdxInsert, iT
4260: 61 62 2c 20 72 31 29 3b 0a 20 20 73 71 6c 69 74  ab, r1);.  sqlit
4270: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
4280: 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 7d 0a  (pParse, r1);.}.
4290: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
42a0: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a  OMIT_SUBQUERY./*
42b0: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 6e 20  .** Generate an 
42c0: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 77 68  error message wh
42d0: 65 6e 20 61 20 53 45 4c 45 43 54 20 69 73 20 75  en a SELECT is u
42e0: 73 65 64 20 77 69 74 68 69 6e 20 61 20 73 75 62  sed within a sub
42f0: 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 28 65  expression.** (e
4300: 78 61 6d 70 6c 65 3a 20 20 22 61 20 49 4e 20 28  xample:  "a IN (
4310: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 61  SELECT * FROM ta
4320: 62 6c 65 29 22 29 20 62 75 74 20 69 74 20 68 61  ble)") but it ha
4330: 73 20 6d 6f 72 65 20 74 68 61 6e 20 31 20 72 65  s more than 1 re
4340: 73 75 6c 74 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e 20  sult.** column. 
4350: 20 57 65 20 64 6f 20 74 68 69 73 20 69 6e 20 61   We do this in a
4360: 20 73 75 62 72 6f 75 74 69 6e 65 20 62 65 63 61   subroutine beca
4370: 75 73 65 20 74 68 65 20 65 72 72 6f 72 20 75 73  use the error us
4380: 65 64 20 74 6f 20 6f 63 63 75 72 0a 2a 2a 20 69  ed to occur.** i
4390: 6e 20 6d 75 6c 74 69 70 6c 65 20 70 6c 61 63 65  n multiple place
43a0: 73 2e 20 20 28 54 68 65 20 65 72 72 6f 72 20 6f  s.  (The error o
43b0: 6e 6c 79 20 6f 63 63 75 72 73 20 69 6e 20 6f 6e  nly occurs in on
43c0: 65 20 70 6c 61 63 65 20 6e 6f 77 2c 20 62 75 74  e place now, but
43d0: 20 77 65 0a 2a 2a 20 72 65 74 61 69 6e 20 74 68   we.** retain th
43e0: 65 20 73 75 62 72 6f 75 74 69 6e 65 20 74 6f 20  e subroutine to 
43f0: 6d 69 6e 69 6d 69 7a 65 20 63 6f 64 65 20 64 69  minimize code di
4400: 73 72 75 70 74 69 6f 6e 2e 29 0a 2a 2f 0a 73 74  sruption.).*/.st
4410: 61 74 69 63 20 69 6e 74 20 63 68 65 63 6b 46 6f  atic int checkFo
4420: 72 4d 75 6c 74 69 43 6f 6c 75 6d 6e 53 65 6c 65  rMultiColumnSele
4430: 63 74 45 72 72 6f 72 28 0a 20 20 50 61 72 73 65  ctError(.  Parse
4440: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
4450: 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74  /* Parse context
4460: 2e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  . */.  SelectDes
4470: 74 20 2a 70 44 65 73 74 2c 20 20 20 2f 2a 20 44  t *pDest,   /* D
4480: 65 73 74 69 6e 61 74 69 6f 6e 20 6f 66 20 53 45  estination of SE
4490: 4c 45 43 54 20 72 65 73 75 6c 74 73 20 2a 2f 0a  LECT results */.
44a0: 20 20 69 6e 74 20 6e 45 78 70 72 20 20 20 20 20    int nExpr     
44b0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
44c0: 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d   of result colum
44d0: 6e 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 53  ns returned by S
44e0: 45 4c 45 43 54 20 2a 2f 0a 29 7b 0a 20 20 69 6e  ELECT */.){.  in
44f0: 74 20 65 44 65 73 74 20 3d 20 70 44 65 73 74 2d  t eDest = pDest-
4500: 3e 65 44 65 73 74 3b 0a 20 20 69 66 28 20 6e 45  >eDest;.  if( nE
4510: 78 70 72 3e 31 20 26 26 20 28 65 44 65 73 74 3d  xpr>1 && (eDest=
4520: 3d 53 52 54 5f 4d 65 6d 20 7c 7c 20 65 44 65 73  =SRT_Mem || eDes
4530: 74 3d 3d 53 52 54 5f 53 65 74 29 20 29 7b 0a 20  t==SRT_Set) ){. 
4540: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
4550: 73 67 28 70 50 61 72 73 65 2c 20 22 6f 6e 6c 79  sg(pParse, "only
4560: 20 61 20 73 69 6e 67 6c 65 20 72 65 73 75 6c 74   a single result
4570: 20 61 6c 6c 6f 77 65 64 20 66 6f 72 20 22 0a 20   allowed for ". 
4580: 20 20 20 20 20 20 22 61 20 53 45 4c 45 43 54 20        "a SELECT 
4590: 74 68 61 74 20 69 73 20 70 61 72 74 20 6f 66 20  that is part of 
45a0: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 22 29 3b  an expression");
45b0: 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
45c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
45d0: 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  rn 0;.  }.}.#end
45e0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73  if../*.** An ins
45f0: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
4600: 6c 6f 77 69 6e 67 20 6f 62 6a 65 63 74 20 69 73  lowing object is
4610: 20 75 73 65 64 20 74 6f 20 72 65 63 6f 72 64 20   used to record 
4620: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  information abou
4630: 74 0a 2a 2a 20 68 6f 77 20 74 6f 20 70 72 6f 63  t.** how to proc
4640: 65 73 73 20 74 68 65 20 44 49 53 54 49 4e 43 54  ess the DISTINCT
4650: 20 6b 65 79 77 6f 72 64 2c 20 74 6f 20 73 69 6d   keyword, to sim
4660: 70 6c 69 66 79 20 70 61 73 73 69 6e 67 20 74 68  plify passing th
4670: 61 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a  at information.*
4680: 2a 20 69 6e 74 6f 20 74 68 65 20 73 65 6c 65 63  * into the selec
4690: 74 49 6e 6e 65 72 4c 6f 6f 70 28 29 20 72 6f 75  tInnerLoop() rou
46a0: 74 69 6e 65 2e 0a 2a 2f 0a 74 79 70 65 64 65 66  tine..*/.typedef
46b0: 20 73 74 72 75 63 74 20 44 69 73 74 69 6e 63 74   struct Distinct
46c0: 43 74 78 20 44 69 73 74 69 6e 63 74 43 74 78 3b  Ctx DistinctCtx;
46d0: 0a 73 74 72 75 63 74 20 44 69 73 74 69 6e 63 74  .struct Distinct
46e0: 43 74 78 20 7b 0a 20 20 75 38 20 69 73 54 6e 63  Ctx {.  u8 isTnc
46f0: 74 3b 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20  t;      /* True 
4700: 69 66 20 74 68 65 20 44 49 53 54 49 4e 43 54 20  if the DISTINCT 
4710: 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65 73 65  keyword is prese
4720: 6e 74 20 2a 2f 0a 20 20 75 38 20 65 54 6e 63 74  nt */.  u8 eTnct
4730: 54 79 70 65 3b 20 20 20 2f 2a 20 4f 6e 65 20 6f  Type;   /* One o
4740: 66 20 74 68 65 20 57 48 45 52 45 5f 44 49 53 54  f the WHERE_DIST
4750: 49 4e 43 54 5f 2a 20 6f 70 65 72 61 74 6f 72 73  INCT_* operators
4760: 20 2a 2f 0a 20 20 69 6e 74 20 74 61 62 54 6e 63   */.  int tabTnc
4770: 74 3b 20 20 20 20 2f 2a 20 45 70 68 65 6d 65 72  t;    /* Ephemer
4780: 61 6c 20 74 61 62 6c 65 20 75 73 65 64 20 66 6f  al table used fo
4790: 72 20 44 49 53 54 49 4e 43 54 20 70 72 6f 63 65  r DISTINCT proce
47a0: 73 73 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 61  ssing */.  int a
47b0: 64 64 72 54 6e 63 74 3b 20 20 20 2f 2a 20 41 64  ddrTnct;   /* Ad
47c0: 64 72 65 73 73 20 6f 66 20 4f 50 5f 4f 70 65 6e  dress of OP_Open
47d0: 45 70 68 65 6d 65 72 61 6c 20 6f 70 63 6f 64 65  Ephemeral opcode
47e0: 20 66 6f 72 20 74 61 62 54 6e 63 74 20 2a 2f 0a   for tabTnct */.
47f0: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  };../*.** This r
4800: 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73  outine generates
4810: 20 74 68 65 20 63 6f 64 65 20 66 6f 72 20 74 68   the code for th
4820: 65 20 69 6e 73 69 64 65 20 6f 66 20 74 68 65 20  e inside of the 
4830: 69 6e 6e 65 72 20 6c 6f 6f 70 0a 2a 2a 20 6f 66  inner loop.** of
4840: 20 61 20 53 45 4c 45 43 54 2e 0a 2a 2a 0a 2a 2a   a SELECT..**.**
4850: 20 49 66 20 73 72 63 54 61 62 20 61 6e 64 20 6e   If srcTab and n
4860: 43 6f 6c 75 6d 6e 20 61 72 65 20 62 6f 74 68 20  Column are both 
4870: 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 70  zero, then the p
4880: 45 4c 69 73 74 20 65 78 70 72 65 73 73 69 6f 6e  EList expression
4890: 73 0a 2a 2a 20 61 72 65 20 65 76 61 6c 75 61 74  s.** are evaluat
48a0: 65 64 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67  ed in order to g
48b0: 65 74 20 74 68 65 20 64 61 74 61 20 66 6f 72 20  et the data for 
48c0: 74 68 69 73 20 72 6f 77 2e 20 20 49 66 20 6e 43  this row.  If nC
48d0: 6f 6c 75 6d 6e 3e 30 0a 2a 2a 20 74 68 65 6e 20  olumn>0.** then 
48e0: 64 61 74 61 20 69 73 20 70 75 6c 6c 65 64 20 66  data is pulled f
48f0: 72 6f 6d 20 73 72 63 54 61 62 20 61 6e 64 20 70  rom srcTab and p
4900: 45 4c 69 73 74 20 69 73 20 75 73 65 64 20 6f 6e  EList is used on
4910: 6c 79 20 74 6f 20 67 65 74 20 74 68 65 0a 2a 2a  ly to get the.**
4920: 20 64 61 74 61 74 79 70 65 73 20 66 6f 72 20 65   datatypes for e
4930: 61 63 68 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 73  ach column..*/.s
4940: 74 61 74 69 63 20 76 6f 69 64 20 73 65 6c 65 63  tatic void selec
4950: 74 49 6e 6e 65 72 4c 6f 6f 70 28 0a 20 20 50 61  tInnerLoop(.  Pa
4960: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
4970: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
4980: 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ser context */. 
4990: 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
49a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
49b0: 63 6f 6d 70 6c 65 74 65 20 73 65 6c 65 63 74 20  complete select 
49c0: 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20  statement being 
49d0: 63 6f 64 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c  coded */.  ExprL
49e0: 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20  ist *pEList,    
49f0: 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 76 61     /* List of va
4a00: 6c 75 65 73 20 62 65 69 6e 67 20 65 78 74 72 61  lues being extra
4a10: 63 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 73 72  cted */.  int sr
4a20: 63 54 61 62 2c 20 20 20 20 20 20 20 20 20 20 20  cTab,           
4a30: 20 20 2f 2a 20 50 75 6c 6c 20 64 61 74 61 20 66    /* Pull data f
4a40: 72 6f 6d 20 74 68 69 73 20 74 61 62 6c 65 20 2a  rom this table *
4a50: 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e 2c  /.  int nColumn,
4a60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
4a70: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
4a80: 20 69 6e 20 74 68 65 20 73 6f 75 72 63 65 20 74   in the source t
4a90: 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69  able */.  ExprLi
4aa0: 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20  st *pOrderBy,   
4ab0: 20 20 2f 2a 20 49 66 20 6e 6f 74 20 4e 55 4c 4c    /* If not NULL
4ac0: 2c 20 73 6f 72 74 20 72 65 73 75 6c 74 73 20 75  , sort results u
4ad0: 73 69 6e 67 20 74 68 69 73 20 6b 65 79 20 2a 2f  sing this key */
4ae0: 0a 20 20 44 69 73 74 69 6e 63 74 43 74 78 20 2a  .  DistinctCtx *
4af0: 70 44 69 73 74 69 6e 63 74 2c 20 2f 2a 20 49 66  pDistinct, /* If
4b00: 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 6e 66 6f 20   not NULL, info 
4b10: 6f 6e 20 68 6f 77 20 74 6f 20 70 72 6f 63 65 73  on how to proces
4b20: 73 20 44 49 53 54 49 4e 43 54 20 2a 2f 0a 20 20  s DISTINCT */.  
4b30: 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73  SelectDest *pDes
4b40: 74 2c 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 74  t,      /* How t
4b50: 6f 20 64 69 73 70 6f 73 65 20 6f 66 20 74 68 65  o dispose of the
4b60: 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e   results */.  in
4b70: 74 20 69 43 6f 6e 74 69 6e 75 65 2c 20 20 20 20  t iContinue,    
4b80: 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
4b90: 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77  re to continue w
4ba0: 69 74 68 20 6e 65 78 74 20 72 6f 77 20 2a 2f 0a  ith next row */.
4bb0: 20 20 69 6e 74 20 69 42 72 65 61 6b 20 20 20 20    int iBreak    
4bc0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d            /* Jum
4bd0: 70 20 68 65 72 65 20 74 6f 20 62 72 65 61 6b 20  p here to break 
4be0: 6f 75 74 20 6f 66 20 74 68 65 20 69 6e 6e 65 72  out of the inner
4bf0: 20 6c 6f 6f 70 20 2a 2f 0a 29 7b 0a 20 20 56 64   loop */.){.  Vd
4c00: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
4c10: 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a  pVdbe;.  int i;.
4c20: 20 20 69 6e 74 20 68 61 73 44 69 73 74 69 6e 63    int hasDistinc
4c30: 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75  t;        /* Tru
4c40: 65 20 69 66 20 74 68 65 20 44 49 53 54 49 4e 43  e if the DISTINC
4c50: 54 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65  T keyword is pre
4c60: 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 72 65  sent */.  int re
4c70: 67 52 65 73 75 6c 74 3b 20 20 20 20 20 20 20 20  gResult;        
4c80: 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f        /* Start o
4c90: 66 20 6d 65 6d 6f 72 79 20 68 6f 6c 64 69 6e 67  f memory holding
4ca0: 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20   result set */. 
4cb0: 20 69 6e 74 20 65 44 65 73 74 20 3d 20 70 44 65   int eDest = pDe
4cc0: 73 74 2d 3e 65 44 65 73 74 3b 20 20 20 2f 2a 20  st->eDest;   /* 
4cd0: 48 6f 77 20 74 6f 20 64 69 73 70 6f 73 65 20 6f  How to dispose o
4ce0: 66 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69  f results */.  i
4cf0: 6e 74 20 69 50 61 72 6d 20 3d 20 70 44 65 73 74  nt iParm = pDest
4d00: 2d 3e 69 53 44 50 61 72 6d 3b 20 2f 2a 20 46 69  ->iSDParm; /* Fi
4d10: 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  rst argument to 
4d20: 64 69 73 70 6f 73 61 6c 20 6d 65 74 68 6f 64 20  disposal method 
4d30: 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 73 75 6c 74  */.  int nResult
4d40: 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Col;            
4d50: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65   /* Number of re
4d60: 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a  sult columns */.
4d70: 0a 20 20 61 73 73 65 72 74 28 20 76 20 29 3b 0a  .  assert( v );.
4d80: 20 20 69 66 28 20 4e 45 56 45 52 28 76 3d 3d 30    if( NEVER(v==0
4d90: 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73  ) ) return;.  as
4da0: 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20  sert( pEList!=0 
4db0: 29 3b 0a 20 20 68 61 73 44 69 73 74 69 6e 63 74  );.  hasDistinct
4dc0: 20 3d 20 70 44 69 73 74 69 6e 63 74 20 3f 20 70   = pDistinct ? p
4dd0: 44 69 73 74 69 6e 63 74 2d 3e 65 54 6e 63 74 54  Distinct->eTnctT
4de0: 79 70 65 20 3a 20 57 48 45 52 45 5f 44 49 53 54  ype : WHERE_DIST
4df0: 49 4e 43 54 5f 4e 4f 4f 50 3b 0a 20 20 69 66 28  INCT_NOOP;.  if(
4e00: 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 26 26 20   pOrderBy==0 && 
4e10: 21 68 61 73 44 69 73 74 69 6e 63 74 20 29 7b 0a  !hasDistinct ){.
4e20: 20 20 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76      codeOffset(v
4e30: 2c 20 70 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b  , p, iContinue);
4e40: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 75 6c 6c 20  .  }..  /* Pull 
4e50: 74 68 65 20 72 65 71 75 65 73 74 65 64 20 63 6f  the requested co
4e60: 6c 75 6d 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  lumns..  */.  if
4e70: 28 20 6e 43 6f 6c 75 6d 6e 3e 30 20 29 7b 0a 20  ( nColumn>0 ){. 
4e80: 20 20 20 6e 52 65 73 75 6c 74 43 6f 6c 20 3d 20     nResultCol = 
4e90: 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 7d 65 6c 73 65  nColumn;.  }else
4ea0: 7b 0a 20 20 20 20 6e 52 65 73 75 6c 74 43 6f 6c  {.    nResultCol
4eb0: 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   = pEList->nExpr
4ec0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 65 73  ;.  }.  if( pDes
4ed0: 74 2d 3e 69 53 64 73 74 3d 3d 30 20 29 7b 0a 20  t->iSdst==0 ){. 
4ee0: 20 20 20 70 44 65 73 74 2d 3e 69 53 64 73 74 20     pDest->iSdst 
4ef0: 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31  = pParse->nMem+1
4f00: 3b 0a 20 20 20 20 70 44 65 73 74 2d 3e 6e 53 64  ;.    pDest->nSd
4f10: 73 74 20 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b  st = nResultCol;
4f20: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65  .    pParse->nMe
4f30: 6d 20 2b 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b  m += nResultCol;
4f40: 0a 20 20 7d 65 6c 73 65 7b 20 0a 20 20 20 20 61  .  }else{ .    a
4f50: 73 73 65 72 74 28 20 70 44 65 73 74 2d 3e 6e 53  ssert( pDest->nS
4f60: 64 73 74 3d 3d 6e 52 65 73 75 6c 74 43 6f 6c 20  dst==nResultCol 
4f70: 29 3b 0a 20 20 7d 0a 20 20 72 65 67 52 65 73 75  );.  }.  regResu
4f80: 6c 74 20 3d 20 70 44 65 73 74 2d 3e 69 53 64 73  lt = pDest->iSds
4f90: 74 3b 0a 20 20 69 66 28 20 6e 43 6f 6c 75 6d 6e  t;.  if( nColumn
4fa0: 3e 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  >0 ){.    for(i=
4fb0: 30 3b 20 69 3c 6e 43 6f 6c 75 6d 6e 3b 20 69 2b  0; i<nColumn; i+
4fc0: 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
4fd0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
4fe0: 50 5f 43 6f 6c 75 6d 6e 2c 20 73 72 63 54 61 62  P_Column, srcTab
4ff0: 2c 20 69 2c 20 72 65 67 52 65 73 75 6c 74 2b 69  , i, regResult+i
5000: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
5010: 20 69 66 28 20 65 44 65 73 74 21 3d 53 52 54 5f   if( eDest!=SRT_
5020: 45 78 69 73 74 73 20 29 7b 0a 20 20 20 20 2f 2a  Exists ){.    /*
5030: 20 49 66 20 74 68 65 20 64 65 73 74 69 6e 61 74   If the destinat
5040: 69 6f 6e 20 69 73 20 61 6e 20 45 58 49 53 54 53  ion is an EXISTS
5050: 28 2e 2e 2e 29 20 65 78 70 72 65 73 73 69 6f 6e  (...) expression
5060: 2c 20 74 68 65 20 61 63 74 75 61 6c 0a 20 20 20  , the actual.   
5070: 20 2a 2a 20 76 61 6c 75 65 73 20 72 65 74 75 72   ** values retur
5080: 6e 65 64 20 62 79 20 74 68 65 20 53 45 4c 45 43  ned by the SELEC
5090: 54 20 61 72 65 20 6e 6f 74 20 72 65 71 75 69 72  T are not requir
50a0: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  ed..    */.    s
50b0: 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43  qlite3ExprCacheC
50c0: 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20  lear(pParse);.  
50d0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
50e0: 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  eExprList(pParse
50f0: 2c 20 70 45 4c 69 73 74 2c 20 72 65 67 52 65 73  , pEList, regRes
5100: 75 6c 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ult,.           
5110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5120: 20 28 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74   (eDest==SRT_Out
5130: 70 75 74 29 3f 53 51 4c 49 54 45 5f 45 43 45 4c  put)?SQLITE_ECEL
5140: 5f 44 55 50 3a 30 29 3b 0a 20 20 7d 0a 20 20 6e  _DUP:0);.  }.  n
5150: 43 6f 6c 75 6d 6e 20 3d 20 6e 52 65 73 75 6c 74  Column = nResult
5160: 43 6f 6c 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  Col;..  /* If th
5170: 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f  e DISTINCT keywo
5180: 72 64 20 77 61 73 20 70 72 65 73 65 6e 74 20 6f  rd was present o
5190: 6e 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  n the SELECT sta
51a0: 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 61 6e 64 20  tement.  ** and 
51b0: 74 68 69 73 20 72 6f 77 20 68 61 73 20 62 65 65  this row has bee
51c0: 6e 20 73 65 65 6e 20 62 65 66 6f 72 65 2c 20 74  n seen before, t
51d0: 68 65 6e 20 64 6f 20 6e 6f 74 20 6d 61 6b 65 20  hen do not make 
51e0: 74 68 69 73 20 72 6f 77 0a 20 20 2a 2a 20 70 61  this row.  ** pa
51f0: 72 74 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74  rt of the result
5200: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 68 61 73  ..  */.  if( has
5210: 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20  Distinct ){.    
5220: 61 73 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d  assert( pEList!=
5230: 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
5240: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d   pEList->nExpr==
5250: 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 20 20 73  nColumn );.    s
5260: 77 69 74 63 68 28 20 70 44 69 73 74 69 6e 63 74  witch( pDistinct
5270: 2d 3e 65 54 6e 63 74 54 79 70 65 20 29 7b 0a 20  ->eTnctType ){. 
5280: 20 20 20 20 20 63 61 73 65 20 57 48 45 52 45 5f       case WHERE_
5290: 44 49 53 54 49 4e 43 54 5f 4f 52 44 45 52 45 44  DISTINCT_ORDERED
52a0: 3a 20 7b 0a 20 20 20 20 20 20 20 20 56 64 62 65  : {.        Vdbe
52b0: 4f 70 20 2a 70 4f 70 3b 20 20 20 20 20 20 20 20  Op *pOp;        
52c0: 20 20 20 20 2f 2a 20 4e 6f 20 6c 6f 6e 67 65 72      /* No longer
52d0: 20 72 65 71 75 69 72 65 64 20 4f 70 65 6e 45 70   required OpenEp
52e0: 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 2e 20 2a  hemeral instr. *
52f0: 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4a  /.        int iJ
5300: 75 6d 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  ump;            
5310: 20 20 2f 2a 20 4a 75 6d 70 20 64 65 73 74 69 6e    /* Jump destin
5320: 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20  ation */.       
5330: 20 69 6e 74 20 72 65 67 50 72 65 76 3b 20 20 20   int regPrev;   
5340: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 76           /* Prev
5350: 69 6f 75 73 20 72 6f 77 20 63 6f 6e 74 65 6e 74  ious row content
5360: 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20   */..        /* 
5370: 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  Allocate space f
5380: 6f 72 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  or the previous 
5390: 72 6f 77 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  row */.        r
53a0: 65 67 50 72 65 76 20 3d 20 70 50 61 72 73 65 2d  egPrev = pParse-
53b0: 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 20 20 20  >nMem+1;.       
53c0: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
53d0: 20 6e 43 6f 6c 75 6d 6e 3b 0a 0a 20 20 20 20 20   nColumn;..     
53e0: 20 20 20 2f 2a 20 43 68 61 6e 67 65 20 74 68 65     /* Change the
53f0: 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
5400: 6c 20 63 6f 64 65 64 20 65 61 72 6c 69 65 72 20  l coded earlier 
5410: 74 6f 20 61 6e 20 4f 50 5f 4e 75 6c 6c 0a 20 20  to an OP_Null.  
5420: 20 20 20 20 20 20 2a 2a 20 73 65 74 73 20 74 68        ** sets th
5430: 65 20 4d 45 4d 5f 43 6c 65 61 72 65 64 20 62 69  e MEM_Cleared bi
5440: 74 20 6f 6e 20 74 68 65 20 66 69 72 73 74 20 72  t on the first r
5450: 65 67 69 73 74 65 72 20 6f 66 20 74 68 65 0a 20  egister of the. 
5460: 20 20 20 20 20 20 20 2a 2a 20 70 72 65 76 69 6f         ** previo
5470: 75 73 20 76 61 6c 75 65 2e 20 20 54 68 69 73 20  us value.  This 
5480: 77 69 6c 6c 20 63 61 75 73 65 20 74 68 65 20 4f  will cause the O
5490: 50 5f 4e 65 20 62 65 6c 6f 77 20 74 6f 20 61 6c  P_Ne below to al
54a0: 77 61 79 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  ways.        ** 
54b0: 66 61 69 6c 20 6f 6e 20 74 68 65 20 66 69 72 73  fail on the firs
54c0: 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74  t iteration of t
54d0: 68 65 20 6c 6f 6f 70 20 65 76 65 6e 20 69 66 20  he loop even if 
54e0: 74 68 65 20 66 69 72 73 74 0a 20 20 20 20 20 20  the first.      
54f0: 20 20 2a 2a 20 72 6f 77 20 69 73 20 61 6c 6c 20    ** row is all 
5500: 4e 55 4c 4c 73 2e 0a 20 20 20 20 20 20 20 20 2a  NULLs..        *
5510: 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  /.        sqlite
5520: 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f  3VdbeChangeToNoo
5530: 70 28 76 2c 20 70 44 69 73 74 69 6e 63 74 2d 3e  p(v, pDistinct->
5540: 61 64 64 72 54 6e 63 74 29 3b 0a 20 20 20 20 20  addrTnct);.     
5550: 20 20 20 70 4f 70 20 3d 20 73 71 6c 69 74 65 33     pOp = sqlite3
5560: 56 64 62 65 47 65 74 4f 70 28 76 2c 20 70 44 69  VdbeGetOp(v, pDi
5570: 73 74 69 6e 63 74 2d 3e 61 64 64 72 54 6e 63 74  stinct->addrTnct
5580: 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e  );.        pOp->
5590: 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 4e 75 6c 6c  opcode = OP_Null
55a0: 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70  ;.        pOp->p
55b0: 31 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70  1 = 1;.        p
55c0: 4f 70 2d 3e 70 32 20 3d 20 72 65 67 50 72 65 76  Op->p2 = regPrev
55d0: 3b 0a 0a 20 20 20 20 20 20 20 20 69 4a 75 6d 70  ;..        iJump
55e0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
55f0: 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20 6e  rrentAddr(v) + n
5600: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20  Column;.        
5610: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 75  for(i=0; i<nColu
5620: 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  mn; i++){.      
5630: 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
5640: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
5650: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
5660: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  pEList->a[i].pEx
5670: 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  pr);.          i
5680: 66 28 20 69 3c 6e 43 6f 6c 75 6d 6e 2d 31 20 29  f( i<nColumn-1 )
5690: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
56a0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
56b0: 76 2c 20 4f 50 5f 4e 65 2c 20 72 65 67 52 65 73  v, OP_Ne, regRes
56c0: 75 6c 74 2b 69 2c 20 69 4a 75 6d 70 2c 20 72 65  ult+i, iJump, re
56d0: 67 50 72 65 76 2b 69 29 3b 0a 20 20 20 20 20 20  gPrev+i);.      
56e0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
56f0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
5700: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 45  beAddOp3(v, OP_E
5710: 71 2c 20 72 65 67 52 65 73 75 6c 74 2b 69 2c 20  q, regResult+i, 
5720: 69 43 6f 6e 74 69 6e 75 65 2c 20 72 65 67 50 72  iContinue, regPr
5730: 65 76 2b 69 29 3b 0a 20 20 20 20 20 20 20 20 20  ev+i);.         
5740: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c   }.          sql
5750: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
5760: 28 76 2c 20 2d 31 2c 20 28 63 6f 6e 73 74 20 63  (v, -1, (const c
5770: 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f  har *)pColl, P4_
5780: 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20 20  COLLSEQ);.      
5790: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
57a0: 68 61 6e 67 65 50 35 28 76 2c 20 53 51 4c 49 54  hangeP5(v, SQLIT
57b0: 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20  E_NULLEQ);.     
57c0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73     }.        ass
57d0: 65 72 74 28 20 73 71 6c 69 74 65 33 56 64 62 65  ert( sqlite3Vdbe
57e0: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3d 3d  CurrentAddr(v)==
57f0: 69 4a 75 6d 70 20 29 3b 0a 20 20 20 20 20 20 20  iJump );.       
5800: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5810: 70 33 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72  p3(v, OP_Copy, r
5820: 65 67 52 65 73 75 6c 74 2c 20 72 65 67 50 72 65  egResult, regPre
5830: 76 2c 20 6e 43 6f 6c 75 6d 6e 2d 31 29 3b 0a 20  v, nColumn-1);. 
5840: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
5850: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 63 61 73      }..      cas
5860: 65 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  e WHERE_DISTINCT
5870: 5f 55 4e 49 51 55 45 3a 20 7b 0a 20 20 20 20 20  _UNIQUE: {.     
5880: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
5890: 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 70 44  angeToNoop(v, pD
58a0: 69 73 74 69 6e 63 74 2d 3e 61 64 64 72 54 6e 63  istinct->addrTnc
58b0: 74 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  t);.        brea
58c0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  k;.      }..    
58d0: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
58e0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 44 69       assert( pDi
58f0: 73 74 69 6e 63 74 2d 3e 65 54 6e 63 74 54 79 70  stinct->eTnctTyp
5900: 65 3d 3d 57 48 45 52 45 5f 44 49 53 54 49 4e 43  e==WHERE_DISTINC
5910: 54 5f 55 4e 4f 52 44 45 52 45 44 20 29 3b 0a 20  T_UNORDERED );. 
5920: 20 20 20 20 20 20 20 63 6f 64 65 44 69 73 74 69         codeDisti
5930: 6e 63 74 28 70 50 61 72 73 65 2c 20 70 44 69 73  nct(pParse, pDis
5940: 74 69 6e 63 74 2d 3e 74 61 62 54 6e 63 74 2c 20  tinct->tabTnct, 
5950: 69 43 6f 6e 74 69 6e 75 65 2c 20 6e 43 6f 6c 75  iContinue, nColu
5960: 6d 6e 2c 20 72 65 67 52 65 73 75 6c 74 29 3b 0a  mn, regResult);.
5970: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
5980: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
5990: 20 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d 30   if( pOrderBy==0
59a0: 20 29 7b 0a 20 20 20 20 20 20 63 6f 64 65 4f 66   ){.      codeOf
59b0: 66 73 65 74 28 76 2c 20 70 2c 20 69 43 6f 6e 74  fset(v, p, iCont
59c0: 69 6e 75 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  inue);.    }.  }
59d0: 0a 0a 20 20 73 77 69 74 63 68 28 20 65 44 65 73  ..  switch( eDes
59e0: 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74  t ){.    /* In t
59f0: 68 69 73 20 6d 6f 64 65 2c 20 77 72 69 74 65 20  his mode, write 
5a00: 65 61 63 68 20 71 75 65 72 79 20 72 65 73 75 6c  each query resul
5a10: 74 20 74 6f 20 74 68 65 20 6b 65 79 20 6f 66 20  t to the key of 
5a20: 74 68 65 20 74 65 6d 70 6f 72 61 72 79 0a 20 20  the temporary.  
5a30: 20 20 2a 2a 20 74 61 62 6c 65 20 69 50 61 72 6d    ** table iParm
5a40: 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66  ..    */.#ifndef
5a50: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d   SQLITE_OMIT_COM
5a60: 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 20 20 20  POUND_SELECT.   
5a70: 20 63 61 73 65 20 53 52 54 5f 55 6e 69 6f 6e 3a   case SRT_Union:
5a80: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31 3b   {.      int r1;
5a90: 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
5aa0: 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
5ab0: 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  arse);.      sql
5ac0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
5ad0: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
5ae0: 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 43 6f 6c   regResult, nCol
5af0: 75 6d 6e 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  umn, r1);.      
5b00: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5b10: 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72  2(v, OP_IdxInser
5b20: 74 2c 20 69 50 61 72 6d 2c 20 72 31 29 3b 0a 20  t, iParm, r1);. 
5b30: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
5b40: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
5b50: 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72  e, r1);.      br
5b60: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
5b70: 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20 72  /* Construct a r
5b80: 65 63 6f 72 64 20 66 72 6f 6d 20 74 68 65 20 71  ecord from the q
5b90: 75 65 72 79 20 72 65 73 75 6c 74 2c 20 62 75 74  uery result, but
5ba0: 20 69 6e 73 74 65 61 64 20 6f 66 0a 20 20 20 20   instead of.    
5bb0: 2a 2a 20 73 61 76 69 6e 67 20 74 68 61 74 20 72  ** saving that r
5bc0: 65 63 6f 72 64 2c 20 75 73 65 20 69 74 20 61 73  ecord, use it as
5bd0: 20 61 20 6b 65 79 20 74 6f 20 64 65 6c 65 74 65   a key to delete
5be0: 20 65 6c 65 6d 65 6e 74 73 20 66 72 6f 6d 0a 20   elements from. 
5bf0: 20 20 20 2a 2a 20 74 68 65 20 74 65 6d 70 6f 72     ** the tempor
5c00: 61 72 79 20 74 61 62 6c 65 20 69 50 61 72 6d 2e  ary table iParm.
5c10: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
5c20: 20 53 52 54 5f 45 78 63 65 70 74 3a 20 7b 0a 20   SRT_Except: {. 
5c30: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
5c40: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 64 78  AddOp3(v, OP_Idx
5c50: 44 65 6c 65 74 65 2c 20 69 50 61 72 6d 2c 20 72  Delete, iParm, r
5c60: 65 67 52 65 73 75 6c 74 2c 20 6e 43 6f 6c 75 6d  egResult, nColum
5c70: 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  n);.      break;
5c80: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
5c90: 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20     /* Store the 
5ca0: 72 65 73 75 6c 74 20 61 73 20 64 61 74 61 20 75  result as data u
5cb0: 73 69 6e 67 20 61 20 75 6e 69 71 75 65 20 6b 65  sing a unique ke
5cc0: 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  y..    */.    ca
5cd0: 73 65 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20  se SRT_Table:.  
5ce0: 20 20 63 61 73 65 20 53 52 54 5f 45 70 68 65 6d    case SRT_Ephem
5cf0: 54 61 62 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  Tab: {.      int
5d00: 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
5d10: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
5d20: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
5d30: 20 65 44 65 73 74 3d 3d 53 52 54 5f 54 61 62 6c   eDest==SRT_Tabl
5d40: 65 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  e );.      testc
5d50: 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f  ase( eDest==SRT_
5d60: 45 70 68 65 6d 54 61 62 20 29 3b 0a 20 20 20 20  EphemTab );.    
5d70: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
5d80: 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op3(v, OP_MakeRe
5d90: 63 6f 72 64 2c 20 72 65 67 52 65 73 75 6c 74 2c  cord, regResult,
5da0: 20 6e 43 6f 6c 75 6d 6e 2c 20 72 31 29 3b 0a 20   nColumn, r1);. 
5db0: 20 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42       if( pOrderB
5dc0: 79 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75 73  y ){.        pus
5dd0: 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72  hOntoSorter(pPar
5de0: 73 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 2c  se, pOrderBy, p,
5df0: 20 72 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73   r1);.      }els
5e00: 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  e{.        int r
5e10: 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  2 = sqlite3GetTe
5e20: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
5e30: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
5e40: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
5e50: 65 77 52 6f 77 69 64 2c 20 69 50 61 72 6d 2c 20  ewRowid, iParm, 
5e60: 72 32 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  r2);.        sql
5e70: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
5e80: 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 69 50 61  , OP_Insert, iPa
5e90: 72 6d 2c 20 72 31 2c 20 72 32 29 3b 0a 20 20 20  rm, r1, r2);.   
5ea0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
5eb0: 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
5ec0: 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20  AG_APPEND);.    
5ed0: 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
5ee0: 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
5ef0: 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20  , r2);.      }. 
5f00: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
5f10: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
5f20: 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72  e, r1);.      br
5f30: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e  eak;.    }..#ifn
5f40: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
5f50: 53 55 42 51 55 45 52 59 0a 20 20 20 20 2f 2a 20  SUBQUERY.    /* 
5f60: 49 66 20 77 65 20 61 72 65 20 63 72 65 61 74 69  If we are creati
5f70: 6e 67 20 61 20 73 65 74 20 66 6f 72 20 61 6e 20  ng a set for an 
5f80: 22 65 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54  "expr IN (SELECT
5f90: 20 2e 2e 2e 29 22 20 63 6f 6e 73 74 72 75 63 74   ...)" construct
5fa0: 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68  ,.    ** then th
5fb0: 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20 61 20  ere should be a 
5fc0: 73 69 6e 67 6c 65 20 69 74 65 6d 20 6f 6e 20 74  single item on t
5fd0: 68 65 20 73 74 61 63 6b 2e 20 20 57 72 69 74 65  he stack.  Write
5fe0: 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 74 65   this.    ** ite
5ff0: 6d 20 69 6e 74 6f 20 74 68 65 20 73 65 74 20 74  m into the set t
6000: 61 62 6c 65 20 77 69 74 68 20 62 6f 67 75 73 20  able with bogus 
6010: 64 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  data..    */.   
6020: 20 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b   case SRT_Set: {
6030: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
6040: 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20  Column==1 );.   
6050: 20 20 20 70 44 65 73 74 2d 3e 61 66 66 53 64 73     pDest->affSds
6060: 74 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20  t =.            
6070: 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6d        sqlite3Com
6080: 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 45 4c  pareAffinity(pEL
6090: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c  ist->a[0].pExpr,
60a0: 20 70 44 65 73 74 2d 3e 61 66 66 53 64 73 74 29   pDest->affSdst)
60b0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 64  ;.      if( pOrd
60c0: 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20  erBy ){.        
60d0: 2f 2a 20 41 74 20 66 69 72 73 74 20 67 6c 61 6e  /* At first glan
60e0: 63 65 20 79 6f 75 20 77 6f 75 6c 64 20 74 68 69  ce you would thi
60f0: 6e 6b 20 77 65 20 63 6f 75 6c 64 20 6f 70 74 69  nk we could opti
6100: 6d 69 7a 65 20 6f 75 74 20 74 68 65 0a 20 20 20  mize out the.   
6110: 20 20 20 20 20 2a 2a 20 4f 52 44 45 52 20 42 59       ** ORDER BY
6120: 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 73 69   in this case si
6130: 6e 63 65 20 74 68 65 20 6f 72 64 65 72 20 6f 66  nce the order of
6140: 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
6150: 73 65 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 64  set.        ** d
6160: 6f 65 73 20 6e 6f 74 20 6d 61 74 74 65 72 2e 20  oes not matter. 
6170: 20 42 75 74 20 74 68 65 72 65 20 6d 69 67 68 74   But there might
6180: 20 62 65 20 61 20 4c 49 4d 49 54 20 63 6c 61 75   be a LIMIT clau
6190: 73 65 2c 20 69 6e 20 77 68 69 63 68 0a 20 20 20  se, in which.   
61a0: 20 20 20 20 20 2a 2a 20 63 61 73 65 20 74 68 65       ** case the
61b0: 20 6f 72 64 65 72 20 64 6f 65 73 20 6d 61 74 74   order does matt
61c0: 65 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 75  er */.        pu
61d0: 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61  shOntoSorter(pPa
61e0: 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 70  rse, pOrderBy, p
61f0: 2c 20 72 65 67 52 65 73 75 6c 74 29 3b 0a 20 20  , regResult);.  
6200: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
6210: 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69     int r1 = sqli
6220: 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
6230: 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73  arse);.        s
6240: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
6250: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
6260: 64 2c 20 72 65 67 52 65 73 75 6c 74 2c 31 2c 72  d, regResult,1,r
6270: 31 2c 20 26 70 44 65 73 74 2d 3e 61 66 66 53 64  1, &pDest->affSd
6280: 73 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  st, 1);.        
6290: 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
62a0: 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70  AffinityChange(p
62b0: 50 61 72 73 65 2c 20 72 65 67 52 65 73 75 6c 74  Parse, regResult
62c0: 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 1);.        sq
62d0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
62e0: 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c  v, OP_IdxInsert,
62f0: 20 69 50 61 72 6d 2c 20 72 31 29 3b 0a 20 20 20   iParm, r1);.   
6300: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
6310: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
6320: 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 7d 0a  e, r1);.      }.
6330: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
6340: 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 6e   }..    /* If an
6350: 79 20 72 6f 77 20 65 78 69 73 74 20 69 6e 20 74  y row exist in t
6360: 68 65 20 72 65 73 75 6c 74 20 73 65 74 2c 20 72  he result set, r
6370: 65 63 6f 72 64 20 74 68 61 74 20 66 61 63 74 20  ecord that fact 
6380: 61 6e 64 20 61 62 6f 72 74 2e 0a 20 20 20 20 2a  and abort..    *
6390: 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 45  /.    case SRT_E
63a0: 78 69 73 74 73 3a 20 7b 0a 20 20 20 20 20 20 73  xists: {.      s
63b0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
63c0: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
63d0: 31 2c 20 69 50 61 72 6d 29 3b 0a 20 20 20 20 20  1, iParm);.     
63e0: 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c   /* The LIMIT cl
63f0: 61 75 73 65 20 77 69 6c 6c 20 74 65 72 6d 69 6e  ause will termin
6400: 61 74 65 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72  ate the loop for
6410: 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 62 72 65   us */.      bre
6420: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
6430: 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20 73  * If this is a s
6440: 63 61 6c 61 72 20 73 65 6c 65 63 74 20 74 68 61  calar select tha
6450: 74 20 69 73 20 70 61 72 74 20 6f 66 20 61 6e 20  t is part of an 
6460: 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e  expression, then
6470: 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65 20 74 68  .    ** store th
6480: 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74 68 65  e results in the
6490: 20 61 70 70 72 6f 70 72 69 61 74 65 20 6d 65 6d   appropriate mem
64a0: 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20 62 72 65  ory cell and bre
64b0: 61 6b 20 6f 75 74 0a 20 20 20 20 2a 2a 20 6f 66  ak out.    ** of
64c0: 20 74 68 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a   the scan loop..
64d0: 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
64e0: 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20  SRT_Mem: {.     
64f0: 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e   assert( nColumn
6500: 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ==1 );.      if(
6510: 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20   pOrderBy ){.   
6520: 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72       pushOntoSor
6530: 74 65 72 28 70 50 61 72 73 65 2c 20 70 4f 72 64  ter(pParse, pOrd
6540: 65 72 42 79 2c 20 70 2c 20 72 65 67 52 65 73 75  erBy, p, regResu
6550: 6c 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  lt);.      }else
6560: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
6570: 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50  3ExprCodeMove(pP
6580: 61 72 73 65 2c 20 72 65 67 52 65 73 75 6c 74 2c  arse, regResult,
6590: 20 69 50 61 72 6d 2c 20 31 29 3b 0a 20 20 20 20   iParm, 1);.    
65a0: 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54      /* The LIMIT
65b0: 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 6a 75 6d   clause will jum
65c0: 70 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f  p out of the loo
65d0: 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20  p for us */.    
65e0: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
65f0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  .    }.#endif /*
6600: 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f   #ifndef SQLITE_
6610: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f  OMIT_SUBQUERY */
6620: 0a 0a 20 20 20 20 2f 2a 20 53 65 6e 64 20 74 68  ..    /* Send th
6630: 65 20 64 61 74 61 20 74 6f 20 74 68 65 20 63 61  e data to the ca
6640: 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20  llback function 
6650: 6f 72 20 74 6f 20 61 20 73 75 62 72 6f 75 74 69  or to a subrouti
6660: 6e 65 2e 20 20 49 6e 20 74 68 65 0a 20 20 20 20  ne.  In the.    
6670: 2a 2a 20 63 61 73 65 20 6f 66 20 61 20 73 75 62  ** case of a sub
6680: 72 6f 75 74 69 6e 65 2c 20 74 68 65 20 73 75 62  routine, the sub
6690: 72 6f 75 74 69 6e 65 20 69 74 73 65 6c 66 20 69  routine itself i
66a0: 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
66b0: 72 0a 20 20 20 20 2a 2a 20 70 6f 70 70 69 6e 67  r.    ** popping
66c0: 20 74 68 65 20 64 61 74 61 20 66 72 6f 6d 20 74   the data from t
66d0: 68 65 20 73 74 61 63 6b 2e 0a 20 20 20 20 2a 2f  he stack..    */
66e0: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 43 6f  .    case SRT_Co
66f0: 72 6f 75 74 69 6e 65 3a 0a 20 20 20 20 63 61 73  routine:.    cas
6700: 65 20 53 52 54 5f 4f 75 74 70 75 74 3a 20 7b 0a  e SRT_Output: {.
6710: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
6720: 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75  eDest==SRT_Corou
6730: 74 69 6e 65 20 29 3b 0a 20 20 20 20 20 20 74 65  tine );.      te
6740: 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53  stcase( eDest==S
6750: 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20 20 20  RT_Output );.   
6760: 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20     if( pOrderBy 
6770: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  ){.        int r
6780: 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
6790: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
67a0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
67b0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d  beAddOp3(v, OP_M
67c0: 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52 65  akeRecord, regRe
67d0: 73 75 6c 74 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 72  sult, nColumn, r
67e0: 31 29 3b 0a 20 20 20 20 20 20 20 20 70 75 73 68  1);.        push
67f0: 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73  OntoSorter(pPars
6800: 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 2c 20  e, pOrderBy, p, 
6810: 72 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  r1);.        sql
6820: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
6830: 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a  eg(pParse, r1);.
6840: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
6850: 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75  eDest==SRT_Corou
6860: 74 69 6e 65 20 29 7b 0a 20 20 20 20 20 20 20 20  tine ){.        
6870: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6880: 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 70  1(v, OP_Yield, p
6890: 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 29 3b 0a  Dest->iSDParm);.
68a0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
68b0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
68c0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73  AddOp2(v, OP_Res
68d0: 75 6c 74 52 6f 77 2c 20 72 65 67 52 65 73 75 6c  ultRow, regResul
68e0: 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20  t, nColumn);.   
68f0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
6900: 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61  CacheAffinityCha
6910: 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 52  nge(pParse, regR
6920: 65 73 75 6c 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b  esult, nColumn);
6930: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
6940: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66  reak;.    }..#if
6950: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
6960: 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 29 0a 20  _OMIT_TRIGGER). 
6970: 20 20 20 2f 2a 20 44 69 73 63 61 72 64 20 74 68     /* Discard th
6980: 65 20 72 65 73 75 6c 74 73 2e 20 20 54 68 69 73  e results.  This
6990: 20 69 73 20 75 73 65 64 20 66 6f 72 20 53 45 4c   is used for SEL
69a0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 69  ECT statements i
69b0: 6e 73 69 64 65 0a 20 20 20 20 2a 2a 20 74 68 65  nside.    ** the
69c0: 20 62 6f 64 79 20 6f 66 20 61 20 54 52 49 47 47   body of a TRIGG
69d0: 45 52 2e 20 20 54 68 65 20 70 75 72 70 6f 73 65  ER.  The purpose
69e0: 20 6f 66 20 73 75 63 68 20 73 65 6c 65 63 74 73   of such selects
69f0: 20 69 73 20 74 6f 20 63 61 6c 6c 0a 20 20 20 20   is to call.    
6a00: 2a 2a 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20  ** user-defined 
6a10: 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 68  functions that h
6a20: 61 76 65 20 73 69 64 65 20 65 66 66 65 63 74 73  ave side effects
6a30: 2e 20 20 57 65 20 64 6f 20 6e 6f 74 20 63 61 72  .  We do not car
6a40: 65 0a 20 20 20 20 2a 2a 20 61 62 6f 75 74 20 74  e.    ** about t
6a50: 68 65 20 61 63 74 75 61 6c 20 72 65 73 75 6c 74  he actual result
6a60: 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2e  s of the select.
6a70: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 65 66 61  .    */.    defa
6a80: 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  ult: {.      ass
6a90: 65 72 74 28 20 65 44 65 73 74 3d 3d 53 52 54 5f  ert( eDest==SRT_
6aa0: 44 69 73 63 61 72 64 20 29 3b 0a 20 20 20 20 20  Discard );.     
6ab0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
6ac0: 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a  ndif.  }..  /* J
6ad0: 75 6d 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  ump to the end o
6ae0: 66 20 74 68 65 20 6c 6f 6f 70 20 69 66 20 74 68  f the loop if th
6af0: 65 20 4c 49 4d 49 54 20 69 73 20 72 65 61 63 68  e LIMIT is reach
6b00: 65 64 2e 20 20 45 78 63 65 70 74 2c 20 69 66 0a  ed.  Except, if.
6b10: 20 20 2a 2a 20 74 68 65 72 65 20 69 73 20 61 20    ** there is a 
6b20: 73 6f 72 74 65 72 2c 20 69 6e 20 77 68 69 63 68  sorter, in which
6b30: 20 63 61 73 65 20 74 68 65 20 73 6f 72 74 65 72   case the sorter
6b40: 20 68 61 73 20 61 6c 72 65 61 64 79 20 6c 69 6d   has already lim
6b50: 69 74 65 64 0a 20 20 2a 2a 20 74 68 65 20 6f 75  ited.  ** the ou
6b60: 74 70 75 74 20 66 6f 72 20 75 73 2e 0a 20 20 2a  tput for us..  *
6b70: 2f 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79  /.  if( pOrderBy
6b80: 3d 3d 30 20 26 26 20 70 2d 3e 69 4c 69 6d 69 74  ==0 && p->iLimit
6b90: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
6ba0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
6bb0: 49 66 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69  IfZero, p->iLimi
6bc0: 74 2c 20 69 42 72 65 61 6b 2c 20 2d 31 29 3b 0a  t, iBreak, -1);.
6bd0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c    }.}../*.** All
6be0: 6f 63 61 74 65 20 61 20 4b 65 79 49 6e 66 6f 20  ocate a KeyInfo 
6bf0: 6f 62 6a 65 63 74 20 73 75 66 66 69 63 69 65 6e  object sufficien
6c00: 74 20 66 6f 72 20 61 6e 20 69 6e 64 65 78 20 6f  t for an index o
6c10: 66 20 4e 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 20  f N key columns 
6c20: 61 6e 64 0a 2a 2a 20 58 20 65 78 74 72 61 20 63  and.** X extra c
6c30: 6f 6c 75 6d 6e 73 2e 0a 2a 2f 0a 4b 65 79 49 6e  olumns..*/.KeyIn
6c40: 66 6f 20 2a 73 71 6c 69 74 65 33 4b 65 79 49 6e  fo *sqlite3KeyIn
6c50: 66 6f 41 6c 6c 6f 63 28 73 71 6c 69 74 65 33 20  foAlloc(sqlite3 
6c60: 2a 64 62 2c 20 69 6e 74 20 4e 2c 20 69 6e 74 20  *db, int N, int 
6c70: 58 29 7b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70  X){.  KeyInfo *p
6c80: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
6c90: 6f 63 5a 65 72 6f 28 30 2c 20 0a 20 20 20 20 20  ocZero(0, .     
6ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69                si
6cb0: 7a 65 6f 66 28 4b 65 79 49 6e 66 6f 29 20 2b 20  zeof(KeyInfo) + 
6cc0: 28 4e 2b 58 29 2a 28 73 69 7a 65 6f 66 28 43 6f  (N+X)*(sizeof(Co
6cd0: 6c 6c 53 65 71 2a 29 2b 31 29 29 3b 0a 20 20 69  llSeq*)+1));.  i
6ce0: 66 28 20 70 20 29 7b 0a 20 20 20 20 70 2d 3e 61  f( p ){.    p->a
6cf0: 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38 2a  SortOrder = (u8*
6d00: 29 26 70 2d 3e 61 43 6f 6c 6c 5b 4e 2b 58 5d 3b  )&p->aColl[N+X];
6d10: 0a 20 20 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d  .    p->nField =
6d20: 20 28 75 31 36 29 4e 3b 0a 20 20 20 20 70 2d 3e   (u16)N;.    p->
6d30: 6e 58 46 69 65 6c 64 20 3d 20 28 75 31 36 29 58  nXField = (u16)X
6d40: 3b 0a 20 20 20 20 70 2d 3e 65 6e 63 20 3d 20 45  ;.    p->enc = E
6d50: 4e 43 28 64 62 29 3b 0a 20 20 20 20 70 2d 3e 64  NC(db);.    p->d
6d60: 62 20 3d 20 64 62 3b 0a 20 20 20 20 70 2d 3e 6e  b = db;.    p->n
6d70: 52 65 66 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  Ref = 1;.  }else
6d80: 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63  {.    db->malloc
6d90: 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 7d 0a  Failed = 1;.  }.
6da0: 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
6db0: 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20  *.** Deallocate 
6dc0: 61 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74  a KeyInfo object
6dd0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
6de0: 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 4b 65 79  KeyInfoUnref(Key
6df0: 49 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 66 28 20  Info *p){.  if( 
6e00: 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  p ){.    assert(
6e10: 20 70 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20   p->nRef>0 );.  
6e20: 20 20 70 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20    p->nRef--;.   
6e30: 20 69 66 28 20 70 2d 3e 6e 52 65 66 3d 3d 30 20   if( p->nRef==0 
6e40: 29 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28  ) sqlite3DbFree(
6e50: 30 2c 20 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  0, p);.  }.}../*
6e60: 0a 2a 2a 20 4d 61 6b 65 20 61 20 6e 65 77 20 70  .** Make a new p
6e70: 6f 69 6e 74 65 72 20 74 6f 20 61 20 4b 65 79 49  ointer to a KeyI
6e80: 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a 2f 0a 4b 65  nfo object.*/.Ke
6e90: 79 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33 4b 65  yInfo *sqlite3Ke
6ea0: 79 49 6e 66 6f 52 65 66 28 4b 65 79 49 6e 66 6f  yInfoRef(KeyInfo
6eb0: 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 29 7b   *p){.  if( p ){
6ec0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
6ed0: 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20 20 70 2d  nRef>0 );.    p-
6ee0: 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 72  >nRef++;.  }.  r
6ef0: 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 23 69 66 64  eturn p;.}..#ifd
6f00: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
6f10: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
6f20: 45 20 69 66 20 61 20 4b 65 79 49 6e 66 6f 20 6f  E if a KeyInfo o
6f30: 62 6a 65 63 74 20 63 61 6e 20 62 65 20 63 68 61  bject can be cha
6f40: 6e 67 65 2e 20 20 54 68 65 20 4b 65 79 49 6e 66  nge.  The KeyInf
6f50: 6f 20 6f 62 6a 65 63 74 0a 2a 2a 20 63 61 6e 20  o object.** can 
6f60: 6f 6e 6c 79 20 62 65 20 63 68 61 6e 67 65 64 20  only be changed 
6f70: 69 66 20 74 68 69 73 20 69 73 20 6a 75 73 74 20  if this is just 
6f80: 61 20 73 69 6e 67 6c 65 20 72 65 66 65 72 65 6e  a single referen
6f90: 63 65 20 74 6f 20 74 68 65 20 6f 62 6a 65 63 74  ce to the object
6fa0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
6fb0: 74 69 6e 65 20 69 73 20 75 73 65 64 20 6f 6e 6c  tine is used onl
6fc0: 79 20 69 6e 73 69 64 65 20 6f 66 20 61 73 73 65  y inside of asse
6fd0: 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 2e  rt() statements.
6fe0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4b  .*/.int sqlite3K
6ff0: 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c  eyInfoIsWriteabl
7000: 65 28 4b 65 79 49 6e 66 6f 20 2a 70 29 7b 20 72  e(KeyInfo *p){ r
7010: 65 74 75 72 6e 20 70 2d 3e 6e 52 65 66 3d 3d 31  eturn p->nRef==1
7020: 3b 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ; }.#endif /* SQ
7030: 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 2f  LITE_DEBUG */../
7040: 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 6e 20 65 78  *.** Given an ex
7050: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2c 20 67  pression list, g
7060: 65 6e 65 72 61 74 65 20 61 20 4b 65 79 49 6e 66  enerate a KeyInf
7070: 6f 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  o structure that
7080: 20 72 65 63 6f 72 64 73 0a 2a 2a 20 74 68 65 20   records.** the 
7090: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
70a0: 63 65 20 66 6f 72 20 65 61 63 68 20 65 78 70 72  ce for each expr
70b0: 65 73 73 69 6f 6e 20 69 6e 20 74 68 61 74 20 65  ession in that e
70c0: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a  xpression list..
70d0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 45 78 70  **.** If the Exp
70e0: 72 4c 69 73 74 20 69 73 20 61 6e 20 4f 52 44 45  rList is an ORDE
70f0: 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20 42 59  R BY or GROUP BY
7100: 20 63 6c 61 75 73 65 20 74 68 65 6e 20 74 68 65   clause then the
7110: 20 72 65 73 75 6c 74 69 6e 67 0a 2a 2a 20 4b 65   resulting.** Ke
7120: 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  yInfo structure 
7130: 69 73 20 61 70 70 72 6f 70 72 69 61 74 65 20 66  is appropriate f
7140: 6f 72 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20  or initializing 
7150: 61 20 76 69 72 74 75 61 6c 20 69 6e 64 65 78 20  a virtual index 
7160: 74 6f 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20  to.** implement 
7170: 74 68 61 74 20 63 6c 61 75 73 65 2e 20 20 49 66  that clause.  If
7180: 20 74 68 65 20 45 78 70 72 4c 69 73 74 20 69 73   the ExprList is
7190: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
71a0: 6f 66 20 61 20 53 45 4c 45 43 54 0a 2a 2a 20 74  of a SELECT.** t
71b0: 68 65 6e 20 74 68 65 20 4b 65 79 49 6e 66 6f 20  hen the KeyInfo 
71c0: 73 74 72 75 63 74 75 72 65 20 69 73 20 61 70 70  structure is app
71d0: 72 6f 70 72 69 61 74 65 20 66 6f 72 20 69 6e 69  ropriate for ini
71e0: 74 69 61 6c 69 7a 69 6e 67 20 61 20 76 69 72 74  tializing a virt
71f0: 75 61 6c 0a 2a 2a 20 69 6e 64 65 78 20 74 6f 20  ual.** index to 
7200: 69 6d 70 6c 65 6d 65 6e 74 20 61 20 44 49 53 54  implement a DIST
7210: 49 4e 43 54 20 74 65 73 74 2e 0a 2a 2a 0a 2a 2a  INCT test..**.**
7220: 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74   Space to hold t
7230: 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63  he KeyInfo struc
7240: 74 75 72 65 20 69 73 20 6f 62 74 61 69 6e 20 66  ture is obtain f
7250: 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 20 20 54 68 65  rom malloc.  The
7260: 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63   calling.** func
7270: 74 69 6f 6e 20 69 73 20 72 65 73 70 6f 6e 73 69  tion is responsi
7280: 62 6c 65 20 66 6f 72 20 73 65 65 69 6e 67 20 74  ble for seeing t
7290: 68 61 74 20 74 68 69 73 20 73 74 72 75 63 74 75  hat this structu
72a0: 72 65 20 69 73 20 65 76 65 6e 74 75 61 6c 6c 79  re is eventually
72b0: 0a 2a 2a 20 66 72 65 65 64 2e 0a 2a 2f 0a 73 74  .** freed..*/.st
72c0: 61 74 69 63 20 4b 65 79 49 6e 66 6f 20 2a 6b 65  atic KeyInfo *ke
72d0: 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73  yInfoFromExprLis
72e0: 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  t(Parse *pParse,
72f0: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
7300: 29 7b 0a 20 20 69 6e 74 20 6e 45 78 70 72 3b 0a  ){.  int nExpr;.
7310: 20 20 4b 65 79 49 6e 66 6f 20 2a 70 49 6e 66 6f    KeyInfo *pInfo
7320: 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c  ;.  struct ExprL
7330: 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
7340: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
7350: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
7360: 6e 74 20 69 3b 0a 0a 20 20 6e 45 78 70 72 20 3d  nt i;..  nExpr =
7370: 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20   pList->nExpr;. 
7380: 20 70 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33   pInfo = sqlite3
7390: 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c  KeyInfoAlloc(db,
73a0: 20 6e 45 78 70 72 2c 20 31 29 3b 0a 20 20 69 66   nExpr, 1);.  if
73b0: 28 20 70 49 6e 66 6f 20 29 7b 0a 20 20 20 20 61  ( pInfo ){.    a
73c0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 4b 65  ssert( sqlite3Ke
73d0: 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65  yInfoIsWriteable
73e0: 28 70 49 6e 66 6f 29 20 29 3b 0a 20 20 20 20 66  (pInfo) );.    f
73f0: 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70 4c  or(i=0, pItem=pL
7400: 69 73 74 2d 3e 61 3b 20 69 3c 6e 45 78 70 72 3b  ist->a; i<nExpr;
7410: 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i++, pItem++){.
7420: 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
7430: 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 43 6f 6c  Coll;.      pCol
7440: 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
7450: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
7460: 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20  Item->pExpr);.  
7470: 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29      if( !pColl )
7480: 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66   pColl = db->pDf
7490: 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 49  ltColl;.      pI
74a0: 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20  nfo->aColl[i] = 
74b0: 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 49 6e  pColl;.      pIn
74c0: 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69  fo->aSortOrder[i
74d0: 5d 20 3d 20 70 49 74 65 6d 2d 3e 73 6f 72 74 4f  ] = pItem->sortO
74e0: 72 64 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rder;.    }.  }.
74f0: 20 20 72 65 74 75 72 6e 20 70 49 6e 66 6f 3b 0a    return pInfo;.
7500: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
7510: 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
7520: 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 4e 61 6d  SELECT./*.** Nam
7530: 65 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63 74  e of the connect
7540: 69 6f 6e 20 6f 70 65 72 61 74 6f 72 2c 20 75 73  ion operator, us
7550: 65 64 20 66 6f 72 20 65 72 72 6f 72 20 6d 65 73  ed for error mes
7560: 73 61 67 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  sages..*/.static
7570: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 65 6c   const char *sel
7580: 65 63 74 4f 70 4e 61 6d 65 28 69 6e 74 20 69 64  ectOpName(int id
7590: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20  ){.  char *z;.  
75a0: 73 77 69 74 63 68 28 20 69 64 20 29 7b 0a 20 20  switch( id ){.  
75b0: 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 20    case TK_ALL:  
75c0: 20 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 20       z = "UNION 
75d0: 41 4c 4c 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20  ALL";   break;. 
75e0: 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 52     case TK_INTER
75f0: 53 45 43 54 3a 20 7a 20 3d 20 22 49 4e 54 45 52  SECT: z = "INTER
7600: 53 45 43 54 22 3b 20 20 20 62 72 65 61 6b 3b 0a  SECT";   break;.
7610: 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43 45      case TK_EXCE
7620: 50 54 3a 20 20 20 20 7a 20 3d 20 22 45 58 43 45  PT:    z = "EXCE
7630: 50 54 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b  PT";      break;
7640: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 20 20  .    default:   
7650: 20 20 20 20 20 20 20 20 7a 20 3d 20 22 55 4e 49          z = "UNI
7660: 4f 4e 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b  ON";       break
7670: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a  ;.  }.  return z
7680: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
7690: 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
76a0: 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 23 69  ND_SELECT */..#i
76b0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
76c0: 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20  T_EXPLAIN./*.** 
76d0: 55 6e 6c 65 73 73 20 61 6e 20 22 45 58 50 4c 41  Unless an "EXPLA
76e0: 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 22 20 63  IN QUERY PLAN" c
76f0: 6f 6d 6d 61 6e 64 20 69 73 20 62 65 69 6e 67 20  ommand is being 
7700: 70 72 6f 63 65 73 73 65 64 2c 20 74 68 69 73 20  processed, this 
7710: 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 61  function.** is a
7720: 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73   no-op. Otherwis
7730: 65 2c 20 69 74 20 61 64 64 73 20 61 20 73 69 6e  e, it adds a sin
7740: 67 6c 65 20 72 6f 77 20 6f 66 20 6f 75 74 70 75  gle row of outpu
7750: 74 20 74 6f 20 74 68 65 20 45 51 50 20 72 65 73  t to the EQP res
7760: 75 6c 74 2c 0a 2a 2a 20 77 68 65 72 65 20 74 68  ult,.** where th
7770: 65 20 63 61 70 74 69 6f 6e 20 69 73 20 6f 66 20  e caption is of 
7780: 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20  the form:.**.** 
7790: 20 20 22 55 53 45 20 54 45 4d 50 20 42 2d 54 52    "USE TEMP B-TR
77a0: 45 45 20 46 4f 52 20 78 78 78 22 0a 2a 2a 0a 2a  EE FOR xxx".**.*
77b0: 2a 20 77 68 65 72 65 20 78 78 78 20 69 73 20 6f  * where xxx is o
77c0: 6e 65 20 6f 66 20 22 44 49 53 54 49 4e 43 54 22  ne of "DISTINCT"
77d0: 2c 20 22 4f 52 44 45 52 20 42 59 22 20 6f 72 20  , "ORDER BY" or 
77e0: 22 47 52 4f 55 50 20 42 59 22 2e 20 45 78 61 63  "GROUP BY". Exac
77f0: 74 6c 79 20 77 68 69 63 68 0a 2a 2a 20 69 73 20  tly which.** is 
7800: 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68  determined by th
7810: 65 20 7a 55 73 61 67 65 20 61 72 67 75 6d 65 6e  e zUsage argumen
7820: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
7830: 64 20 65 78 70 6c 61 69 6e 54 65 6d 70 54 61 62  d explainTempTab
7840: 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  le(Parse *pParse
7850: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55  , const char *zU
7860: 73 61 67 65 29 7b 0a 20 20 69 66 28 20 70 50 61  sage){.  if( pPa
7870: 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20  rse->explain==2 
7880: 29 7b 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d  ){.    Vdbe *v =
7890: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
78a0: 20 20 20 20 63 68 61 72 20 2a 7a 4d 73 67 20 3d      char *zMsg =
78b0: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
78c0: 70 50 61 72 73 65 2d 3e 64 62 2c 20 22 55 53 45  pParse->db, "USE
78d0: 20 54 45 4d 50 20 42 2d 54 52 45 45 20 46 4f 52   TEMP B-TREE FOR
78e0: 20 25 73 22 2c 20 7a 55 73 61 67 65 29 3b 0a 20   %s", zUsage);. 
78f0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
7900: 64 4f 70 34 28 76 2c 20 4f 50 5f 45 78 70 6c 61  dOp4(v, OP_Expla
7910: 69 6e 2c 20 70 50 61 72 73 65 2d 3e 69 53 65 6c  in, pParse->iSel
7920: 65 63 74 49 64 2c 20 30 2c 20 30 2c 20 7a 4d 73  ectId, 0, 0, zMs
7930: 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a  g, P4_DYNAMIC);.
7940: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73    }.}../*.** Ass
7950: 69 67 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 62  ign expression b
7960: 20 74 6f 20 6c 76 61 6c 75 65 20 61 2e 20 41 20   to lvalue a. A 
7970: 73 65 63 6f 6e 64 2c 20 6e 6f 2d 6f 70 2c 20 76  second, no-op, v
7980: 65 72 73 69 6f 6e 20 6f 66 20 74 68 69 73 20 6d  ersion of this m
7990: 61 63 72 6f 0a 2a 2a 20 69 73 20 70 72 6f 76 69  acro.** is provi
79a0: 64 65 64 20 77 68 65 6e 20 53 51 4c 49 54 45 5f  ded when SQLITE_
79b0: 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 69 73 20  OMIT_EXPLAIN is 
79c0: 64 65 66 69 6e 65 64 2e 20 54 68 69 73 20 61 6c  defined. This al
79d0: 6c 6f 77 73 20 74 68 65 20 63 6f 64 65 0a 2a 2a  lows the code.**
79e0: 20 69 6e 20 73 71 6c 69 74 65 33 53 65 6c 65 63   in sqlite3Selec
79f0: 74 28 29 20 74 6f 20 61 73 73 69 67 6e 20 76 61  t() to assign va
7a00: 6c 75 65 73 20 74 6f 20 73 74 72 75 63 74 75 72  lues to structur
7a10: 65 20 6d 65 6d 62 65 72 20 76 61 72 69 61 62 6c  e member variabl
7a20: 65 73 20 74 68 61 74 0a 2a 2a 20 6f 6e 6c 79 20  es that.** only 
7a30: 65 78 69 73 74 20 69 66 20 53 51 4c 49 54 45 5f  exist if SQLITE_
7a40: 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 69 73 20  OMIT_EXPLAIN is 
7a50: 6e 6f 74 20 64 65 66 69 6e 65 64 20 77 69 74 68  not defined with
7a60: 6f 75 74 20 70 6f 6c 6c 75 74 69 6e 67 20 74 68  out polluting th
7a70: 65 0a 2a 2a 20 63 6f 64 65 20 77 69 74 68 20 23  e.** code with #
7a80: 69 66 6e 64 65 66 20 64 69 72 65 63 74 69 76 65  ifndef directive
7a90: 73 2e 0a 2a 2f 0a 23 20 64 65 66 69 6e 65 20 65  s..*/.# define e
7aa0: 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72  xplainSetInteger
7ab0: 28 61 2c 20 62 29 20 61 20 3d 20 62 0a 0a 23 65  (a, b) a = b..#e
7ac0: 6c 73 65 0a 2f 2a 20 4e 6f 2d 6f 70 20 76 65 72  lse./* No-op ver
7ad0: 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 65 78 70  sions of the exp
7ae0: 6c 61 69 6e 58 58 58 28 29 20 66 75 6e 63 74 69  lainXXX() functi
7af0: 6f 6e 73 20 61 6e 64 20 6d 61 63 72 6f 73 2e 20  ons and macros. 
7b00: 2a 2f 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c  */.# define expl
7b10: 61 69 6e 54 65 6d 70 54 61 62 6c 65 28 79 2c 7a  ainTempTable(y,z
7b20: 29 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61  ).# define expla
7b30: 69 6e 53 65 74 49 6e 74 65 67 65 72 28 79 2c 7a  inSetInteger(y,z
7b40: 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64  ).#endif..#if !d
7b50: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
7b60: 49 54 5f 45 58 50 4c 41 49 4e 29 20 26 26 20 21  IT_EXPLAIN) && !
7b70: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
7b80: 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
7b90: 45 43 54 29 0a 2f 2a 0a 2a 2a 20 55 6e 6c 65 73  ECT)./*.** Unles
7ba0: 73 20 61 6e 20 22 45 58 50 4c 41 49 4e 20 51 55  s an "EXPLAIN QU
7bb0: 45 52 59 20 50 4c 41 4e 22 20 63 6f 6d 6d 61 6e  ERY PLAN" comman
7bc0: 64 20 69 73 20 62 65 69 6e 67 20 70 72 6f 63 65  d is being proce
7bd0: 73 73 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74  ssed, this funct
7be0: 69 6f 6e 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f  ion.** is a no-o
7bf0: 70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74  p. Otherwise, it
7c00: 20 61 64 64 73 20 61 20 73 69 6e 67 6c 65 20 72   adds a single r
7c10: 6f 77 20 6f 66 20 6f 75 74 70 75 74 20 74 6f 20  ow of output to 
7c20: 74 68 65 20 45 51 50 20 72 65 73 75 6c 74 2c 0a  the EQP result,.
7c30: 2a 2a 20 77 68 65 72 65 20 74 68 65 20 63 61 70  ** where the cap
7c40: 74 69 6f 6e 20 69 73 20 6f 66 20 6f 6e 65 20 6f  tion is of one o
7c50: 66 20 74 68 65 20 74 77 6f 20 66 6f 72 6d 73 3a  f the two forms:
7c60: 0a 2a 2a 0a 2a 2a 20 20 20 22 43 4f 4d 50 4f 53  .**.**   "COMPOS
7c70: 49 54 45 20 53 55 42 51 55 45 52 49 45 53 20 69  ITE SUBQUERIES i
7c80: 53 75 62 31 20 61 6e 64 20 69 53 75 62 32 20 28  Sub1 and iSub2 (
7c90: 6f 70 29 22 0a 2a 2a 20 20 20 22 43 4f 4d 50 4f  op)".**   "COMPO
7ca0: 53 49 54 45 20 53 55 42 51 55 45 52 49 45 53 20  SITE SUBQUERIES 
7cb0: 69 53 75 62 31 20 61 6e 64 20 69 53 75 62 32 20  iSub1 and iSub2 
7cc0: 55 53 49 4e 47 20 54 45 4d 50 20 42 2d 54 52 45  USING TEMP B-TRE
7cd0: 45 20 28 6f 70 29 22 0a 2a 2a 0a 2a 2a 20 77 68  E (op)".**.** wh
7ce0: 65 72 65 20 69 53 75 62 31 20 61 6e 64 20 69 53  ere iSub1 and iS
7cf0: 75 62 32 20 61 72 65 20 74 68 65 20 69 6e 74 65  ub2 are the inte
7d00: 67 65 72 73 20 70 61 73 73 65 64 20 61 73 20 74  gers passed as t
7d10: 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
7d20: 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 70 61 72  .** function par
7d30: 61 6d 65 74 65 72 73 2c 20 61 6e 64 20 6f 70 20  ameters, and op 
7d40: 69 73 20 74 68 65 20 74 65 78 74 20 72 65 70 72  is the text repr
7d50: 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  esentation of th
7d60: 65 20 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f  e parameter.** o
7d70: 66 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e  f the same name.
7d80: 20 54 68 65 20 70 61 72 61 6d 65 74 65 72 20 22   The parameter "
7d90: 6f 70 22 20 6d 75 73 74 20 62 65 20 6f 6e 65 20  op" must be one 
7da0: 6f 66 20 54 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f  of TK_UNION, TK_
7db0: 45 58 43 45 50 54 2c 0a 2a 2a 20 54 4b 5f 49 4e  EXCEPT,.** TK_IN
7dc0: 54 45 52 53 45 43 54 20 6f 72 20 54 4b 5f 41 4c  TERSECT or TK_AL
7dd0: 4c 2e 20 54 68 65 20 66 69 72 73 74 20 66 6f 72  L. The first for
7de0: 6d 20 69 73 20 75 73 65 64 20 69 66 20 61 72 67  m is used if arg
7df0: 75 6d 65 6e 74 20 62 55 73 65 54 6d 70 20 69 73  ument bUseTmp is
7e00: 20 0a 2a 2a 20 66 61 6c 73 65 2c 20 6f 72 20 74   .** false, or t
7e10: 68 65 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20 69  he second form i
7e20: 66 20 69 74 20 69 73 20 74 72 75 65 2e 0a 2a 2f  f it is true..*/
7e30: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
7e40: 6c 61 69 6e 43 6f 6d 70 6f 73 69 74 65 28 0a 20  lainComposite(. 
7e50: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
7e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7e70: 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78   /* Parse contex
7e80: 74 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20  t */.  int op,  
7e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ea0: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
7eb0: 20 54 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f 45 58   TK_UNION, TK_EX
7ec0: 43 45 50 54 20 65 74 63 2e 20 2a 2f 0a 20 20 69  CEPT etc. */.  i
7ed0: 6e 74 20 69 53 75 62 31 2c 20 20 20 20 20 20 20  nt iSub1,       
7ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7ef0: 2a 20 53 75 62 71 75 65 72 79 20 69 64 20 31 20  * Subquery id 1 
7f00: 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62 32 2c 20  */.  int iSub2, 
7f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f20: 20 20 20 20 20 2f 2a 20 53 75 62 71 75 65 72 79       /* Subquery
7f30: 20 69 64 20 32 20 2a 2f 0a 20 20 69 6e 74 20 62   id 2 */.  int b
7f40: 55 73 65 54 6d 70 20 20 20 20 20 20 20 20 20 20  UseTmp          
7f50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
7f60: 75 65 20 69 66 20 61 20 74 65 6d 70 20 74 61 62  ue if a temp tab
7f70: 6c 65 20 77 61 73 20 75 73 65 64 20 2a 2f 0a 29  le was used */.)
7f80: 7b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d  {.  assert( op==
7f90: 54 4b 5f 55 4e 49 4f 4e 20 7c 7c 20 6f 70 3d 3d  TK_UNION || op==
7fa0: 54 4b 5f 45 58 43 45 50 54 20 7c 7c 20 6f 70 3d  TK_EXCEPT || op=
7fb0: 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 7c 7c  =TK_INTERSECT ||
7fc0: 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 3b 0a 20   op==TK_ALL );. 
7fd0: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70   if( pParse->exp
7fe0: 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 56  lain==2 ){.    V
7ff0: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
8000: 3e 70 56 64 62 65 3b 0a 20 20 20 20 63 68 61 72  >pVdbe;.    char
8010: 20 2a 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33   *zMsg = sqlite3
8020: 4d 50 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20  MPrintf(.       
8030: 20 70 50 61 72 73 65 2d 3e 64 62 2c 20 22 43 4f   pParse->db, "CO
8040: 4d 50 4f 55 4e 44 20 53 55 42 51 55 45 52 49 45  MPOUND SUBQUERIE
8050: 53 20 25 64 20 41 4e 44 20 25 64 20 25 73 28 25  S %d AND %d %s(%
8060: 73 29 22 2c 20 69 53 75 62 31 2c 20 69 53 75 62  s)", iSub1, iSub
8070: 32 2c 0a 20 20 20 20 20 20 20 20 62 55 73 65 54  2,.        bUseT
8080: 6d 70 3f 22 55 53 49 4e 47 20 54 45 4d 50 20 42  mp?"USING TEMP B
8090: 2d 54 52 45 45 20 22 3a 22 22 2c 20 73 65 6c 65  -TREE ":"", sele
80a0: 63 74 4f 70 4e 61 6d 65 28 6f 70 29 0a 20 20 20  ctOpName(op).   
80b0: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   );.    sqlite3V
80c0: 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
80d0: 45 78 70 6c 61 69 6e 2c 20 70 50 61 72 73 65 2d  Explain, pParse-
80e0: 3e 69 53 65 6c 65 63 74 49 64 2c 20 30 2c 20 30  >iSelectId, 0, 0
80f0: 2c 20 7a 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d  , zMsg, P4_DYNAM
8100: 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65  IC);.  }.}.#else
8110: 0a 2f 2a 20 4e 6f 2d 6f 70 20 76 65 72 73 69 6f  ./* No-op versio
8120: 6e 73 20 6f 66 20 74 68 65 20 65 78 70 6c 61 69  ns of the explai
8130: 6e 58 58 58 28 29 20 66 75 6e 63 74 69 6f 6e 73  nXXX() functions
8140: 20 61 6e 64 20 6d 61 63 72 6f 73 2e 20 2a 2f 0a   and macros. */.
8150: 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69 6e  # define explain
8160: 43 6f 6d 70 6f 73 69 74 65 28 76 2c 77 2c 78 2c  Composite(v,w,x,
8170: 79 2c 7a 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  y,z).#endif../*.
8180: 2a 2a 20 49 66 20 74 68 65 20 69 6e 6e 65 72 20  ** If the inner 
8190: 6c 6f 6f 70 20 77 61 73 20 67 65 6e 65 72 61 74  loop was generat
81a0: 65 64 20 75 73 69 6e 67 20 61 20 6e 6f 6e 2d 6e  ed using a non-n
81b0: 75 6c 6c 20 70 4f 72 64 65 72 42 79 20 61 72 67  ull pOrderBy arg
81c0: 75 6d 65 6e 74 2c 0a 2a 2a 20 74 68 65 6e 20 74  ument,.** then t
81d0: 68 65 20 72 65 73 75 6c 74 73 20 77 65 72 65 20  he results were 
81e0: 70 6c 61 63 65 64 20 69 6e 20 61 20 73 6f 72 74  placed in a sort
81f0: 65 72 2e 20 20 41 66 74 65 72 20 74 68 65 20 6c  er.  After the l
8200: 6f 6f 70 20 69 73 20 74 65 72 6d 69 6e 61 74 65  oop is terminate
8210: 64 0a 2a 2a 20 77 65 20 6e 65 65 64 20 74 6f 20  d.** we need to 
8220: 72 75 6e 20 74 68 65 20 73 6f 72 74 65 72 20 61  run the sorter a
8230: 6e 64 20 6f 75 74 70 75 74 20 74 68 65 20 72 65  nd output the re
8240: 73 75 6c 74 73 2e 20 20 54 68 65 20 66 6f 6c 6c  sults.  The foll
8250: 6f 77 69 6e 67 0a 2a 2a 20 72 6f 75 74 69 6e 65  owing.** routine
8260: 20 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 63   generates the c
8270: 6f 64 65 20 6e 65 65 64 65 64 20 74 6f 20 64 6f  ode needed to do
8280: 20 74 68 61 74 2e 0a 2a 2f 0a 73 74 61 74 69 63   that..*/.static
8290: 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65 53 6f   void generateSo
82a0: 72 74 54 61 69 6c 28 0a 20 20 50 61 72 73 65 20  rtTail(.  Parse 
82b0: 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50  *pParse,    /* P
82c0: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
82d0: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
82e0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c        /* The SEL
82f0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  ECT statement */
8300: 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20  .  Vdbe *v,     
8310: 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
8320: 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 69 73 20   code into this 
8330: 56 44 42 45 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  VDBE */.  int nC
8340: 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 2f 2a 20 4e  olumn,      /* N
8350: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
8360: 20 6f 66 20 64 61 74 61 20 2a 2f 0a 20 20 53 65   of data */.  Se
8370: 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20  lectDest *pDest 
8380: 2f 2a 20 57 72 69 74 65 20 74 68 65 20 73 6f 72  /* Write the sor
8390: 74 65 64 20 72 65 73 75 6c 74 73 20 68 65 72 65  ted results here
83a0: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61 64 64   */.){.  int add
83b0: 72 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33  rBreak = sqlite3
83c0: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
83d0: 3b 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65  ;     /* Jump he
83e0: 72 65 20 74 6f 20 65 78 69 74 20 6c 6f 6f 70 20  re to exit loop 
83f0: 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 43 6f 6e  */.  int addrCon
8400: 74 69 6e 75 65 20 3d 20 73 71 6c 69 74 65 33 56  tinue = sqlite3V
8410: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
8420: 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 66    /* Jump here f
8430: 6f 72 20 6e 65 78 74 20 63 79 63 6c 65 20 2a 2f  or next cycle */
8440: 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 69  .  int addr;.  i
8450: 6e 74 20 69 54 61 62 3b 0a 20 20 69 6e 74 20 70  nt iTab;.  int p
8460: 73 65 75 64 6f 54 61 62 20 3d 20 30 3b 0a 20 20  seudoTab = 0;.  
8470: 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
8480: 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79  By = p->pOrderBy
8490: 3b 0a 0a 20 20 69 6e 74 20 65 44 65 73 74 20 3d  ;..  int eDest =
84a0: 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3b 0a 20   pDest->eDest;. 
84b0: 20 69 6e 74 20 69 50 61 72 6d 20 3d 20 70 44 65   int iParm = pDe
84c0: 73 74 2d 3e 69 53 44 50 61 72 6d 3b 0a 0a 20 20  st->iSDParm;..  
84d0: 69 6e 74 20 72 65 67 52 6f 77 3b 0a 20 20 69 6e  int regRow;.  in
84e0: 74 20 72 65 67 52 6f 77 69 64 3b 0a 0a 20 20 69  t regRowid;..  i
84f0: 54 61 62 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e  Tab = pOrderBy->
8500: 69 45 43 75 72 73 6f 72 3b 0a 20 20 72 65 67 52  iECursor;.  regR
8510: 6f 77 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  ow = sqlite3GetT
8520: 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
8530: 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54    if( eDest==SRT
8540: 5f 4f 75 74 70 75 74 20 7c 7c 20 65 44 65 73 74  _Output || eDest
8550: 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20  ==SRT_Coroutine 
8560: 29 7b 0a 20 20 20 20 70 73 65 75 64 6f 54 61 62  ){.    pseudoTab
8570: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
8580: 2b 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  +;.    sqlite3Vd
8590: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f  beAddOp3(v, OP_O
85a0: 70 65 6e 50 73 65 75 64 6f 2c 20 70 73 65 75 64  penPseudo, pseud
85b0: 6f 54 61 62 2c 20 72 65 67 52 6f 77 2c 20 6e 43  oTab, regRow, nC
85c0: 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 72 65 67 52  olumn);.    regR
85d0: 6f 77 69 64 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  owid = 0;.  }els
85e0: 65 7b 0a 20 20 20 20 72 65 67 52 6f 77 69 64 20  e{.    regRowid 
85f0: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
8600: 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 7d  Reg(pParse);.  }
8610: 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61  .  if( p->selFla
8620: 67 73 20 26 20 53 46 5f 55 73 65 53 6f 72 74 65  gs & SF_UseSorte
8630: 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 65 67  r ){.    int reg
8640: 53 6f 72 74 4f 75 74 20 3d 20 2b 2b 70 50 61 72  SortOut = ++pPar
8650: 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 69 6e  se->nMem;.    in
8660: 74 20 70 74 61 62 32 20 3d 20 70 50 61 72 73 65  t ptab2 = pParse
8670: 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 73 71  ->nTab++;.    sq
8680: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
8690: 76 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f  v, OP_OpenPseudo
86a0: 2c 20 70 74 61 62 32 2c 20 72 65 67 53 6f 72 74  , ptab2, regSort
86b0: 4f 75 74 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e  Out, pOrderBy->n
86c0: 45 78 70 72 2b 32 29 3b 0a 20 20 20 20 61 64 64  Expr+2);.    add
86d0: 72 20 3d 20 31 20 2b 20 73 71 6c 69 74 65 33 56  r = 1 + sqlite3V
86e0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
86f0: 53 6f 72 74 65 72 53 6f 72 74 2c 20 69 54 61 62  SorterSort, iTab
8700: 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20 20  , addrBreak);.  
8710: 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20    codeOffset(v, 
8720: 70 2c 20 61 64 64 72 43 6f 6e 74 69 6e 75 65 29  p, addrContinue)
8730: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
8740: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f  eAddOp2(v, OP_So
8750: 72 74 65 72 44 61 74 61 2c 20 69 54 61 62 2c 20  rterData, iTab, 
8760: 72 65 67 53 6f 72 74 4f 75 74 29 3b 0a 20 20 20  regSortOut);.   
8770: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
8780: 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  p3(v, OP_Column,
8790: 20 70 74 61 62 32 2c 20 70 4f 72 64 65 72 42 79   ptab2, pOrderBy
87a0: 2d 3e 6e 45 78 70 72 2b 31 2c 20 72 65 67 52 6f  ->nExpr+1, regRo
87b0: 77 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  w);.    sqlite3V
87c0: 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f  dbeChangeP5(v, O
87d0: 50 46 4c 41 47 5f 43 4c 45 41 52 43 41 43 48 45  PFLAG_CLEARCACHE
87e0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
87f0: 61 64 64 72 20 3d 20 31 20 2b 20 73 71 6c 69 74  addr = 1 + sqlit
8800: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
8810: 4f 50 5f 53 6f 72 74 2c 20 69 54 61 62 2c 20 61  OP_Sort, iTab, a
8820: 64 64 72 42 72 65 61 6b 29 3b 0a 20 20 20 20 63  ddrBreak);.    c
8830: 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2c 20  odeOffset(v, p, 
8840: 61 64 64 72 43 6f 6e 74 69 6e 75 65 29 3b 0a 20  addrContinue);. 
8850: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
8860: 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
8870: 6e 2c 20 69 54 61 62 2c 20 70 4f 72 64 65 72 42  n, iTab, pOrderB
8880: 79 2d 3e 6e 45 78 70 72 2b 31 2c 20 72 65 67 52  y->nExpr+1, regR
8890: 6f 77 29 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63  ow);.  }.  switc
88a0: 68 28 20 65 44 65 73 74 20 29 7b 0a 20 20 20 20  h( eDest ){.    
88b0: 63 61 73 65 20 53 52 54 5f 54 61 62 6c 65 3a 0a  case SRT_Table:.
88c0: 20 20 20 20 63 61 73 65 20 53 52 54 5f 45 70 68      case SRT_Eph
88d0: 65 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20 20 74  emTab: {.      t
88e0: 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d  estcase( eDest==
88f0: 53 52 54 5f 54 61 62 6c 65 20 29 3b 0a 20 20 20  SRT_Table );.   
8900: 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65     testcase( eDe
8910: 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61 62  st==SRT_EphemTab
8920: 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
8930: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
8940: 50 5f 4e 65 77 52 6f 77 69 64 2c 20 69 50 61 72  P_NewRowid, iPar
8950: 6d 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20  m, regRowid);.  
8960: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
8970: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65  ddOp3(v, OP_Inse
8980: 72 74 2c 20 69 50 61 72 6d 2c 20 72 65 67 52 6f  rt, iParm, regRo
8990: 77 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20  w, regRowid);.  
89a0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
89b0: 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41  hangeP5(v, OPFLA
89c0: 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 20  G_APPEND);.     
89d0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69   break;.    }.#i
89e0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
89f0: 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 63  T_SUBQUERY.    c
8a00: 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20  ase SRT_Set: {. 
8a10: 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f       assert( nCo
8a20: 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20  lumn==1 );.     
8a30: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
8a40: 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p4(v, OP_MakeRec
8a50: 6f 72 64 2c 20 72 65 67 52 6f 77 2c 20 31 2c 20  ord, regRow, 1, 
8a60: 72 65 67 52 6f 77 69 64 2c 0a 20 20 20 20 20 20  regRowid,.      
8a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8a80: 20 20 26 70 44 65 73 74 2d 3e 61 66 66 53 64 73    &pDest->affSds
8a90: 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  t, 1);.      sql
8aa0: 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66  ite3ExprCacheAff
8ab0: 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72  inityChange(pPar
8ac0: 73 65 2c 20 72 65 67 52 6f 77 2c 20 31 29 3b 0a  se, regRow, 1);.
8ad0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
8ae0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64  eAddOp2(v, OP_Id
8af0: 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20  xInsert, iParm, 
8b00: 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  regRowid);.     
8b10: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
8b20: 20 20 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20    case SRT_Mem: 
8b30: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
8b40: 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20  nColumn==1 );.  
8b50: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
8b60: 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20  odeMove(pParse, 
8b70: 72 65 67 52 6f 77 2c 20 69 50 61 72 6d 2c 20 31  regRow, iParm, 1
8b80: 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  );.      /* The 
8b90: 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69 6c  LIMIT clause wil
8ba0: 6c 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20  l terminate the 
8bb0: 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20  loop for us */. 
8bc0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
8bd0: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 65 66  }.#endif.    def
8be0: 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 69 6e  ault: {.      in
8bf0: 74 20 69 3b 0a 20 20 20 20 20 20 61 73 73 65 72  t i;.      asser
8c00: 74 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75  t( eDest==SRT_Ou
8c10: 74 70 75 74 20 7c 7c 20 65 44 65 73 74 3d 3d 53  tput || eDest==S
8c20: 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 3b 20  RT_Coroutine ); 
8c30: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
8c40: 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70   eDest==SRT_Outp
8c50: 75 74 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ut );.      test
8c60: 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54  case( eDest==SRT
8c70: 5f 43 6f 72 6f 75 74 69 6e 65 20 29 3b 0a 20 20  _Coroutine );.  
8c80: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
8c90: 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Column; i++){.  
8ca0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 65        assert( re
8cb0: 67 52 6f 77 21 3d 70 44 65 73 74 2d 3e 69 53 64  gRow!=pDest->iSd
8cc0: 73 74 2b 69 20 29 3b 0a 20 20 20 20 20 20 20 20  st+i );.        
8cd0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
8ce0: 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  3(v, OP_Column, 
8cf0: 70 73 65 75 64 6f 54 61 62 2c 20 69 2c 20 70 44  pseudoTab, i, pD
8d00: 65 73 74 2d 3e 69 53 64 73 74 2b 69 29 3b 0a 20  est->iSdst+i);. 
8d10: 20 20 20 20 20 20 20 69 66 28 20 69 3d 3d 30 20         if( i==0 
8d20: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
8d30: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
8d40: 28 76 2c 20 4f 50 46 4c 41 47 5f 43 4c 45 41 52  (v, OPFLAG_CLEAR
8d50: 43 41 43 48 45 29 3b 0a 20 20 20 20 20 20 20 20  CACHE);.        
8d60: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
8d70: 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f  if( eDest==SRT_O
8d80: 75 74 70 75 74 20 29 7b 0a 20 20 20 20 20 20 20  utput ){.       
8d90: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
8da0: 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52  p2(v, OP_ResultR
8db0: 6f 77 2c 20 70 44 65 73 74 2d 3e 69 53 64 73 74  ow, pDest->iSdst
8dc0: 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20  , nColumn);.    
8dd0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
8de0: 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e  acheAffinityChan
8df0: 67 65 28 70 50 61 72 73 65 2c 20 70 44 65 73 74  ge(pParse, pDest
8e00: 2d 3e 69 53 64 73 74 2c 20 6e 43 6f 6c 75 6d 6e  ->iSdst, nColumn
8e10: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
8e20: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
8e30: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
8e40: 59 69 65 6c 64 2c 20 70 44 65 73 74 2d 3e 69 53  Yield, pDest->iS
8e50: 44 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 7d 0a  DParm);.      }.
8e60: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
8e70: 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
8e80: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
8e90: 50 61 72 73 65 2c 20 72 65 67 52 6f 77 29 3b 0a  Parse, regRow);.
8ea0: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
8eb0: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
8ec0: 72 65 67 52 6f 77 69 64 29 3b 0a 0a 20 20 2f 2a  regRowid);..  /*
8ed0: 20 54 68 65 20 62 6f 74 74 6f 6d 20 6f 66 20 74   The bottom of t
8ee0: 68 65 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20 20 73  he loop.  */.  s
8ef0: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
8f00: 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 43 6f  eLabel(v, addrCo
8f10: 6e 74 69 6e 75 65 29 3b 0a 20 20 69 66 28 20 70  ntinue);.  if( p
8f20: 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
8f30: 55 73 65 53 6f 72 74 65 72 20 29 7b 0a 20 20 20  UseSorter ){.   
8f40: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
8f50: 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4e  p2(v, OP_SorterN
8f60: 65 78 74 2c 20 69 54 61 62 2c 20 61 64 64 72 29  ext, iTab, addr)
8f70: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
8f80: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
8f90: 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 69 54 61  (v, OP_Next, iTa
8fa0: 62 2c 20 61 64 64 72 29 3b 0a 20 20 7d 0a 20 20  b, addr);.  }.  
8fb0: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
8fc0: 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 42  veLabel(v, addrB
8fd0: 72 65 61 6b 29 3b 0a 20 20 69 66 28 20 65 44 65  reak);.  if( eDe
8fe0: 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 7c  st==SRT_Output |
8ff0: 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72  | eDest==SRT_Cor
9000: 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20 73 71  outine ){.    sq
9010: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
9020: 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 70 73 65  v, OP_Close, pse
9030: 75 64 6f 54 61 62 2c 20 30 29 3b 0a 20 20 7d 0a  udoTab, 0);.  }.
9040: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
9050: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73  a pointer to a s
9060: 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67  tring containing
9070: 20 74 68 65 20 27 64 65 63 6c 61 72 61 74 69 6f   the 'declaratio
9080: 6e 20 74 79 70 65 27 20 6f 66 20 74 68 65 0a 2a  n type' of the.*
9090: 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78  * expression pEx
90a0: 70 72 2e 20 54 68 65 20 73 74 72 69 6e 67 20 6d  pr. The string m
90b0: 61 79 20 62 65 20 74 72 65 61 74 65 64 20 61 73  ay be treated as
90c0: 20 73 74 61 74 69 63 20 62 79 20 74 68 65 20 63   static by the c
90d0: 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73  aller..**.** Als
90e0: 6f 20 74 72 79 20 74 6f 20 65 73 74 69 6d 61 74  o try to estimat
90f0: 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  e the size of th
9100: 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65  e returned value
9110: 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 61 74   and return that
9120: 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20 2a 70  .** result in *p
9130: 45 73 74 57 69 64 74 68 2e 0a 2a 2a 0a 2a 2a 20  EstWidth..**.** 
9140: 54 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  The declaration 
9150: 74 79 70 65 20 69 73 20 74 68 65 20 65 78 61 63  type is the exac
9160: 74 20 64 61 74 61 74 79 70 65 20 64 65 66 69 6e  t datatype defin
9170: 69 74 69 6f 6e 20 65 78 74 72 61 63 74 65 64 20  ition extracted 
9180: 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 6f 72 69 67  from the.** orig
9190: 69 6e 61 6c 20 43 52 45 41 54 45 20 54 41 42 4c  inal CREATE TABL
91a0: 45 20 73 74 61 74 65 6d 65 6e 74 20 69 66 20 74  E statement if t
91b0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
91c0: 20 61 20 63 6f 6c 75 6d 6e 2e 20 54 68 65 0a 2a   a column. The.*
91d0: 2a 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79  * declaration ty
91e0: 70 65 20 66 6f 72 20 61 20 52 4f 57 49 44 20 66  pe for a ROWID f
91f0: 69 65 6c 64 20 69 73 20 49 4e 54 45 47 45 52 2e  ield is INTEGER.
9200: 20 45 78 61 63 74 6c 79 20 77 68 65 6e 20 61 6e   Exactly when an
9210: 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69   expression.** i
9220: 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20 63  s considered a c
9230: 6f 6c 75 6d 6e 20 63 61 6e 20 62 65 20 63 6f 6d  olumn can be com
9240: 70 6c 65 78 20 69 6e 20 74 68 65 20 70 72 65 73  plex in the pres
9250: 65 6e 63 65 20 6f 66 20 73 75 62 71 75 65 72 69  ence of subqueri
9260: 65 73 2e 20 54 68 65 0a 2a 2a 20 72 65 73 75 6c  es. The.** resul
9270: 74 2d 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e  t-set expression
9280: 20 69 6e 20 61 6c 6c 20 6f 66 20 74 68 65 20 66   in all of the f
9290: 6f 6c 6c 6f 77 69 6e 67 20 53 45 4c 45 43 54 20  ollowing SELECT 
92a0: 73 74 61 74 65 6d 65 6e 74 73 20 69 73 20 0a 2a  statements is .*
92b0: 2a 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20 63  * considered a c
92c0: 6f 6c 75 6d 6e 20 62 79 20 74 68 69 73 20 66 75  olumn by this fu
92d0: 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20  nction..**.**   
92e0: 53 45 4c 45 43 54 20 63 6f 6c 20 46 52 4f 4d 20  SELECT col FROM 
92f0: 74 62 6c 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54  tbl;.**   SELECT
9300: 20 28 53 45 4c 45 43 54 20 63 6f 6c 20 46 52 4f   (SELECT col FRO
9310: 4d 20 74 62 6c 3b 0a 2a 2a 20 20 20 53 45 4c 45  M tbl;.**   SELE
9320: 43 54 20 28 53 45 4c 45 43 54 20 63 6f 6c 20 46  CT (SELECT col F
9330: 52 4f 4d 20 74 62 6c 29 3b 0a 2a 2a 20 20 20 53  ROM tbl);.**   S
9340: 45 4c 45 43 54 20 61 62 63 20 46 52 4f 4d 20 28  ELECT abc FROM (
9350: 53 45 4c 45 43 54 20 63 6f 6c 20 41 53 20 61 62  SELECT col AS ab
9360: 63 20 46 52 4f 4d 20 74 62 6c 29 3b 0a 2a 2a 20  c FROM tbl);.** 
9370: 0a 2a 2a 20 54 68 65 20 64 65 63 6c 61 72 61 74  .** The declarat
9380: 69 6f 6e 20 74 79 70 65 20 66 6f 72 20 61 6e 79  ion type for any
9390: 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 74 68 65   expression othe
93a0: 72 20 74 68 61 6e 20 61 20 63 6f 6c 75 6d 6e 20  r than a column 
93b0: 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54  is NULL..**.** T
93c0: 68 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20  his routine has 
93d0: 65 69 74 68 65 72 20 33 20 6f 72 20 36 20 70 61  either 3 or 6 pa
93e0: 72 61 6d 65 74 65 72 73 20 64 65 70 65 6e 64 69  rameters dependi
93f0: 6e 67 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72  ng on whether or
9400: 20 6e 6f 74 0a 2a 2a 20 74 68 65 20 53 51 4c 49   not.** the SQLI
9410: 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e  TE_ENABLE_COLUMN
9420: 5f 4d 45 54 41 44 41 54 41 20 63 6f 6d 70 69 6c  _METADATA compil
9430: 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73  e-time option is
9440: 20 75 73 65 64 2e 0a 2a 2f 0a 23 69 66 64 65 66   used..*/.#ifdef
9450: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
9460: 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 23  OLUMN_METADATA.#
9470: 20 64 65 66 69 6e 65 20 63 6f 6c 75 6d 6e 54 79   define columnTy
9480: 70 65 28 41 2c 42 2c 43 2c 44 2c 45 2c 46 29 20  pe(A,B,C,D,E,F) 
9490: 63 6f 6c 75 6d 6e 54 79 70 65 49 6d 70 6c 28 41  columnTypeImpl(A
94a0: 2c 42 2c 43 2c 44 2c 45 2c 46 29 0a 73 74 61 74  ,B,C,D,E,F).stat
94b0: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63  ic const char *c
94c0: 6f 6c 75 6d 6e 54 79 70 65 49 6d 70 6c 28 0a 20  olumnTypeImpl(. 
94d0: 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e   NameContext *pN
94e0: 43 2c 20 0a 20 20 45 78 70 72 20 2a 70 45 78 70  C, .  Expr *pExp
94f0: 72 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  r,.  const char 
9500: 2a 2a 70 7a 4f 72 69 67 44 62 2c 0a 20 20 63 6f  **pzOrigDb,.  co
9510: 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69  nst char **pzOri
9520: 67 54 61 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68  gTab,.  const ch
9530: 61 72 20 2a 2a 70 7a 4f 72 69 67 43 6f 6c 2c 0a  ar **pzOrigCol,.
9540: 20 20 75 38 20 2a 70 45 73 74 57 69 64 74 68 0a    u8 *pEstWidth.
9550: 29 7b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20  ){.  char const 
9560: 2a 7a 4f 72 69 67 44 62 20 3d 20 30 3b 0a 20 20  *zOrigDb = 0;.  
9570: 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69  char const *zOri
9580: 67 54 61 62 20 3d 20 30 3b 0a 20 20 63 68 61 72  gTab = 0;.  char
9590: 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67 43 6f 6c   const *zOrigCol
95a0: 20 3d 20 30 3b 0a 23 65 6c 73 65 20 2f 2a 20 69   = 0;.#else /* i
95b0: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
95c0: 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f  E_ENABLE_COLUMN_
95d0: 4d 45 54 41 44 41 54 41 29 20 2a 2f 0a 23 20 64  METADATA) */.# d
95e0: 65 66 69 6e 65 20 63 6f 6c 75 6d 6e 54 79 70 65  efine columnType
95f0: 28 41 2c 42 2c 43 2c 44 2c 45 2c 46 29 20 63 6f  (A,B,C,D,E,F) co
9600: 6c 75 6d 6e 54 79 70 65 49 6d 70 6c 28 41 2c 42  lumnTypeImpl(A,B
9610: 2c 46 29 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  ,F).static const
9620: 20 63 68 61 72 20 2a 63 6f 6c 75 6d 6e 54 79 70   char *columnTyp
9630: 65 49 6d 70 6c 28 0a 20 20 4e 61 6d 65 43 6f 6e  eImpl(.  NameCon
9640: 74 65 78 74 20 2a 70 4e 43 2c 20 0a 20 20 45 78  text *pNC, .  Ex
9650: 70 72 20 2a 70 45 78 70 72 2c 0a 20 20 75 38 20  pr *pExpr,.  u8 
9660: 2a 70 45 73 74 57 69 64 74 68 0a 29 7b 0a 23 65  *pEstWidth.){.#e
9670: 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
9680: 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43  (SQLITE_ENABLE_C
9690: 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 29 20  OLUMN_METADATA) 
96a0: 2a 2f 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20  */.  char const 
96b0: 2a 7a 54 79 70 65 20 3d 20 30 3b 0a 20 20 69 6e  *zType = 0;.  in
96c0: 74 20 6a 3b 0a 20 20 75 38 20 65 73 74 57 69 64  t j;.  u8 estWid
96d0: 74 68 20 3d 20 31 3b 0a 0a 20 20 69 66 28 20 4e  th = 1;..  if( N
96e0: 45 56 45 52 28 70 45 78 70 72 3d 3d 30 29 20 7c  EVER(pExpr==0) |
96f0: 7c 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3d  | pNC->pSrcList=
9700: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
9710: 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e   switch( pExpr->
9720: 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
9730: 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20  K_AGG_COLUMN:.  
9740: 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e    case TK_COLUMN
9750: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  : {.      /* The
9760: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61   expression is a
9770: 20 63 6f 6c 75 6d 6e 2e 20 4c 6f 63 61 74 65 20   column. Locate 
9780: 74 68 65 20 74 61 62 6c 65 20 74 68 65 20 63 6f  the table the co
9790: 6c 75 6d 6e 20 69 73 20 62 65 69 6e 67 0a 20 20  lumn is being.  
97a0: 20 20 20 20 2a 2a 20 65 78 74 72 61 63 74 65 64      ** extracted
97b0: 20 66 72 6f 6d 20 69 6e 20 4e 61 6d 65 43 6f 6e   from in NameCon
97c0: 74 65 78 74 2e 70 53 72 63 4c 69 73 74 2e 20 54  text.pSrcList. T
97d0: 68 69 73 20 74 61 62 6c 65 20 6d 61 79 20 62 65  his table may be
97e0: 20 72 65 61 6c 0a 20 20 20 20 20 20 2a 2a 20 64   real.      ** d
97f0: 61 74 61 62 61 73 65 20 74 61 62 6c 65 20 6f 72  atabase table or
9800: 20 61 20 73 75 62 71 75 65 72 79 2e 0a 20 20 20   a subquery..   
9810: 20 20 20 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c     */.      Tabl
9820: 65 20 2a 70 54 61 62 20 3d 20 30 3b 20 20 20 20  e *pTab = 0;    
9830: 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
9840: 20 73 74 72 75 63 74 75 72 65 20 63 6f 6c 75 6d   structure colum
9850: 6e 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66  n is extracted f
9860: 72 6f 6d 20 2a 2f 0a 20 20 20 20 20 20 53 65 6c  rom */.      Sel
9870: 65 63 74 20 2a 70 53 20 3d 20 30 3b 20 20 20 20  ect *pS = 0;    
9880: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 6c 65           /* Sele
9890: 63 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73  ct the column is
98a0: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
98b0: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f  */.      int iCo
98c0: 6c 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  l = pExpr->iColu
98d0: 6d 6e 3b 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66  mn;  /* Index of
98e0: 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 54 61 62 20   column in pTab 
98f0: 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  */.      testcas
9900: 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
9910: 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20  _AGG_COLUMN );. 
9920: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
9930: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  Expr->op==TK_COL
9940: 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 77 68 69  UMN );.      whi
9950: 6c 65 28 20 70 4e 43 20 26 26 20 21 70 54 61 62  le( pNC && !pTab
9960: 20 29 7b 0a 20 20 20 20 20 20 20 20 53 72 63 4c   ){.        SrcL
9970: 69 73 74 20 2a 70 54 61 62 4c 69 73 74 20 3d 20  ist *pTabList = 
9980: 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 20  pNC->pSrcList;. 
9990: 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 6a         for(j=0;j
99a0: 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20  <pTabList->nSrc 
99b0: 26 26 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a  && pTabList->a[j
99c0: 5d 2e 69 43 75 72 73 6f 72 21 3d 70 45 78 70 72  ].iCursor!=pExpr
99d0: 2d 3e 69 54 61 62 6c 65 3b 6a 2b 2b 29 3b 0a 20  ->iTable;j++);. 
99e0: 20 20 20 20 20 20 20 69 66 28 20 6a 3c 70 54 61         if( j<pTa
99f0: 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 7b 0a 20  bList->nSrc ){. 
9a00: 20 20 20 20 20 20 20 20 20 70 54 61 62 20 3d 20           pTab = 
9a10: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70  pTabList->a[j].p
9a20: 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70  Tab;.          p
9a30: 53 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  S = pTabList->a[
9a40: 6a 5d 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20  j].pSelect;.    
9a50: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
9a60: 20 20 20 20 20 70 4e 43 20 3d 20 70 4e 43 2d 3e       pNC = pNC->
9a70: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 7d  pNext;.        }
9a80: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
9a90: 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20  if( pTab==0 ){. 
9aa0: 20 20 20 20 20 20 20 2f 2a 20 41 74 20 6f 6e 65         /* At one
9ab0: 20 74 69 6d 65 2c 20 63 6f 64 65 20 73 75 63 68   time, code such
9ac0: 20 61 73 20 22 53 45 4c 45 43 54 20 6e 65 77 2e   as "SELECT new.
9ad0: 78 22 20 77 69 74 68 69 6e 20 61 20 74 72 69 67  x" within a trig
9ae0: 67 65 72 20 77 6f 75 6c 64 0a 20 20 20 20 20 20  ger would.      
9af0: 20 20 2a 2a 20 63 61 75 73 65 20 74 68 69 73 20    ** cause this 
9b00: 63 6f 6e 64 69 74 69 6f 6e 20 74 6f 20 72 75 6e  condition to run
9b10: 2e 20 20 53 69 6e 63 65 20 74 68 65 6e 2c 20 77  .  Since then, w
9b20: 65 20 68 61 76 65 20 72 65 73 74 72 75 63 74 75  e have restructu
9b30: 72 65 64 20 68 6f 77 0a 20 20 20 20 20 20 20 20  red how.        
9b40: 2a 2a 20 74 72 69 67 67 65 72 20 63 6f 64 65 20  ** trigger code 
9b50: 69 73 20 67 65 6e 65 72 61 74 65 64 20 61 6e 64  is generated and
9b60: 20 73 6f 20 74 68 69 73 20 63 6f 6e 64 69 74 69   so this conditi
9b70: 6f 6e 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20  on is no longer 
9b80: 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 73 73  .        ** poss
9b90: 69 62 6c 65 2e 20 48 6f 77 65 76 65 72 2c 20 69  ible. However, i
9ba0: 74 20 63 61 6e 20 73 74 69 6c 6c 20 62 65 20 74  t can still be t
9bb0: 72 75 65 20 66 6f 72 20 73 74 61 74 65 6d 65 6e  rue for statemen
9bc0: 74 73 20 6c 69 6b 65 0a 20 20 20 20 20 20 20 20  ts like.        
9bd0: 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** the following
9be0: 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  :.        **.   
9bf0: 20 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45       **   CREATE
9c00: 20 54 41 42 4c 45 20 74 31 28 63 6f 6c 20 49 4e   TABLE t1(col IN
9c10: 54 45 47 45 52 29 3b 0a 20 20 20 20 20 20 20 20  TEGER);.        
9c20: 2a 2a 20 20 20 53 45 4c 45 43 54 20 28 53 45 4c  **   SELECT (SEL
9c30: 45 43 54 20 74 31 2e 63 6f 6c 29 20 46 52 4f 4d  ECT t1.col) FROM
9c40: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 20 20   FROM t1;.      
9c50: 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
9c60: 77 68 65 6e 20 63 6f 6c 75 6d 6e 54 79 70 65 28  when columnType(
9c70: 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74  ) is called on t
9c80: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 22 74  he expression "t
9c90: 31 2e 63 6f 6c 22 20 69 6e 20 74 68 65 20 0a 20  1.col" in the . 
9ca0: 20 20 20 20 20 20 20 2a 2a 20 73 75 62 2d 73 65         ** sub-se
9cb0: 6c 65 63 74 2e 20 49 6e 20 74 68 69 73 20 63 61  lect. In this ca
9cc0: 73 65 2c 20 73 65 74 20 74 68 65 20 63 6f 6c 75  se, set the colu
9cd0: 6d 6e 20 74 79 70 65 20 74 6f 20 4e 55 4c 4c 2c  mn type to NULL,
9ce0: 20 65 76 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a   even.        **
9cf0: 20 74 68 6f 75 67 68 20 69 74 20 73 68 6f 75 6c   though it shoul
9d00: 64 20 72 65 61 6c 6c 79 20 62 65 20 22 49 4e 54  d really be "INT
9d10: 45 47 45 52 22 2e 0a 20 20 20 20 20 20 20 20 2a  EGER"..        *
9d20: 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69  *.        ** Thi
9d30: 73 20 69 73 20 6e 6f 74 20 61 20 70 72 6f 62 6c  s is not a probl
9d40: 65 6d 2c 20 61 73 20 74 68 65 20 63 6f 6c 75 6d  em, as the colum
9d50: 6e 20 74 79 70 65 20 6f 66 20 22 74 31 2e 63 6f  n type of "t1.co
9d60: 6c 22 20 69 73 20 6e 65 76 65 72 0a 20 20 20 20  l" is never.    
9d70: 20 20 20 20 2a 2a 20 75 73 65 64 2e 20 57 68 65      ** used. Whe
9d80: 6e 20 63 6f 6c 75 6d 6e 54 79 70 65 28 29 20 69  n columnType() i
9d90: 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20  s called on the 
9da0: 65 78 70 72 65 73 73 69 6f 6e 20 0a 20 20 20 20  expression .    
9db0: 20 20 20 20 2a 2a 20 22 28 53 45 4c 45 43 54 20      ** "(SELECT 
9dc0: 74 31 2e 63 6f 6c 29 22 2c 20 74 68 65 20 63 6f  t1.col)", the co
9dd0: 72 72 65 63 74 20 74 79 70 65 20 69 73 20 72 65  rrect type is re
9de0: 74 75 72 6e 65 64 20 28 73 65 65 20 74 68 65 20  turned (see the 
9df0: 54 4b 5f 53 45 4c 45 43 54 0a 20 20 20 20 20 20  TK_SELECT.      
9e00: 20 20 2a 2a 20 62 72 61 6e 63 68 20 62 65 6c 6f    ** branch belo
9e10: 77 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 62  w.  */.        b
9e20: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  reak;.      }.. 
9e30: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61       assert( pTa
9e40: 62 20 26 26 20 70 45 78 70 72 2d 3e 70 54 61 62  b && pExpr->pTab
9e50: 3d 3d 70 54 61 62 20 29 3b 0a 20 20 20 20 20 20  ==pTab );.      
9e60: 69 66 28 20 70 53 20 29 7b 0a 20 20 20 20 20 20  if( pS ){.      
9e70: 20 20 2f 2a 20 54 68 65 20 22 74 61 62 6c 65 22    /* The "table"
9e80: 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61 20 73   is actually a s
9e90: 75 62 2d 73 65 6c 65 63 74 20 6f 72 20 61 20 76  ub-select or a v
9ea0: 69 65 77 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  iew in the FROM 
9eb0: 63 6c 61 75 73 65 0a 20 20 20 20 20 20 20 20 2a  clause.        *
9ec0: 2a 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20  * of the SELECT 
9ed0: 73 74 61 74 65 6d 65 6e 74 2e 20 52 65 74 75 72  statement. Retur
9ee0: 6e 20 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f  n the declaratio
9ef0: 6e 20 74 79 70 65 20 61 6e 64 20 6f 72 69 67 69  n type and origi
9f00: 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 61 74  n.        ** dat
9f10: 61 20 66 6f 72 20 74 68 65 20 72 65 73 75 6c 74  a for the result
9f20: 2d 73 65 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  -set column of t
9f30: 68 65 20 73 75 62 2d 73 65 6c 65 63 74 2e 0a 20  he sub-select.. 
9f40: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
9f50: 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 26 26    if( iCol>=0 &&
9f60: 20 41 4c 57 41 59 53 28 69 43 6f 6c 3c 70 53 2d   ALWAYS(iCol<pS-
9f70: 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 20  >pEList->nExpr) 
9f80: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
9f90: 49 66 20 69 43 6f 6c 20 69 73 20 6c 65 73 73 20  If iCol is less 
9fa0: 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20  than zero, then 
9fb0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 72  the expression r
9fc0: 65 71 75 65 73 74 73 20 74 68 65 0a 20 20 20 20  equests the.    
9fd0: 20 20 20 20 20 20 2a 2a 20 72 6f 77 69 64 20 6f        ** rowid o
9fe0: 66 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74  f the sub-select
9ff0: 20 6f 72 20 76 69 65 77 2e 20 54 68 69 73 20 65   or view. This e
a000: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6c 65 67  xpression is leg
a010: 61 6c 20 28 73 65 65 20 0a 20 20 20 20 20 20 20  al (see .       
a020: 20 20 20 2a 2a 20 74 65 73 74 20 63 61 73 65 20     ** test case 
a030: 6d 69 73 63 32 2e 32 2e 32 29 20 2d 20 69 74 20  misc2.2.2) - it 
a040: 61 6c 77 61 79 73 20 65 76 61 6c 75 61 74 65 73  always evaluates
a050: 20 74 6f 20 4e 55 4c 4c 2e 0a 20 20 20 20 20 20   to NULL..      
a060: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
a070: 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43   NameContext sNC
a080: 3b 0a 20 20 20 20 20 20 20 20 20 20 45 78 70 72  ;.          Expr
a090: 20 2a 70 20 3d 20 70 53 2d 3e 70 45 4c 69 73 74   *p = pS->pEList
a0a0: 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78 70 72 3b  ->a[iCol].pExpr;
a0b0: 0a 20 20 20 20 20 20 20 20 20 20 73 4e 43 2e 70  .          sNC.p
a0c0: 53 72 63 4c 69 73 74 20 3d 20 70 53 2d 3e 70 53  SrcList = pS->pS
a0d0: 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73 4e  rc;.          sN
a0e0: 43 2e 70 4e 65 78 74 20 3d 20 70 4e 43 3b 0a 20  C.pNext = pNC;. 
a0f0: 20 20 20 20 20 20 20 20 20 73 4e 43 2e 70 50 61           sNC.pPa
a100: 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73  rse = pNC->pPars
a110: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79  e;.          zTy
a120: 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28  pe = columnType(
a130: 26 73 4e 43 2c 20 70 2c 26 7a 4f 72 69 67 44 62  &sNC, p,&zOrigDb
a140: 2c 26 7a 4f 72 69 67 54 61 62 2c 26 7a 4f 72 69  ,&zOrigTab,&zOri
a150: 67 43 6f 6c 2c 20 26 65 73 74 57 69 64 74 68 29  gCol, &estWidth)
a160: 3b 20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  ; .        }.   
a170: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 41 4c 57     }else if( ALW
a180: 41 59 53 28 70 54 61 62 2d 3e 70 53 63 68 65 6d  AYS(pTab->pSchem
a190: 61 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  a) ){.        /*
a1a0: 20 41 20 72 65 61 6c 20 74 61 62 6c 65 20 2a 2f   A real table */
a1b0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
a1c0: 20 21 70 53 20 29 3b 0a 20 20 20 20 20 20 20 20   !pS );.        
a1d0: 69 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f  if( iCol<0 ) iCo
a1e0: 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b  l = pTab->iPKey;
a1f0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
a200: 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43   iCol==-1 || (iC
a210: 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54  ol>=0 && iCol<pT
a220: 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 23 69 66  ab->nCol) );.#if
a230: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
a240: 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54  E_COLUMN_METADAT
a250: 41 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 43  A.        if( iC
a260: 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ol<0 ){.        
a270: 20 20 7a 54 79 70 65 20 3d 20 22 49 4e 54 45 47    zType = "INTEG
a280: 45 52 22 3b 0a 20 20 20 20 20 20 20 20 20 20 7a  ER";.          z
a290: 4f 72 69 67 43 6f 6c 20 3d 20 22 72 6f 77 69 64  OrigCol = "rowid
a2a0: 22 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  ";.        }else
a2b0: 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79 70  {.          zTyp
a2c0: 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  e = pTab->aCol[i
a2d0: 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a 20 20 20 20  Col].zType;.    
a2e0: 20 20 20 20 20 20 7a 4f 72 69 67 43 6f 6c 20 3d        zOrigCol =
a2f0: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
a300: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ].zName;.       
a310: 20 20 20 65 73 74 57 69 64 74 68 20 3d 20 70 54     estWidth = pT
a320: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 73  ab->aCol[iCol].s
a330: 7a 45 73 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  zEst;.        }.
a340: 20 20 20 20 20 20 20 20 7a 4f 72 69 67 54 61 62          zOrigTab
a350: 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a   = pTab->zName;.
a360: 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 43 2d          if( pNC-
a370: 3e 70 50 61 72 73 65 20 29 7b 0a 20 20 20 20 20  >pParse ){.     
a380: 20 20 20 20 20 69 6e 74 20 69 44 62 20 3d 20 73       int iDb = s
a390: 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e  qlite3SchemaToIn
a3a0: 64 65 78 28 70 4e 43 2d 3e 70 50 61 72 73 65 2d  dex(pNC->pParse-
a3b0: 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65  >db, pTab->pSche
a3c0: 6d 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7a  ma);.          z
a3d0: 4f 72 69 67 44 62 20 3d 20 70 4e 43 2d 3e 70 50  OrigDb = pNC->pP
a3e0: 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44  arse->db->aDb[iD
a3f0: 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  b].zName;.      
a400: 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 20 20    }.#else.      
a410: 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a    if( iCol<0 ){.
a420: 20 20 20 20 20 20 20 20 20 20 7a 54 79 70 65 20            zType 
a430: 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a 20 20 20  = "INTEGER";.   
a440: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
a450: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 70 54        zType = pT
a460: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a  ab->aCol[iCol].z
a470: 54 79 70 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Type;.          
a480: 65 73 74 57 69 64 74 68 20 3d 20 70 54 61 62 2d  estWidth = pTab-
a490: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 73 7a 45 73  >aCol[iCol].szEs
a4a0: 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e  t;.        }.#en
a4b0: 64 69 66 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  dif.      }.    
a4c0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
a4d0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
a4e0: 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20  IT_SUBQUERY.    
a4f0: 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20  case TK_SELECT: 
a500: 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65  {.      /* The e
a510: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 73  xpression is a s
a520: 75 62 2d 73 65 6c 65 63 74 2e 20 52 65 74 75 72  ub-select. Retur
a530: 6e 20 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f  n the declaratio
a540: 6e 20 74 79 70 65 20 61 6e 64 0a 20 20 20 20 20  n type and.     
a550: 20 2a 2a 20 6f 72 69 67 69 6e 20 69 6e 66 6f 20   ** origin info 
a560: 66 6f 72 20 74 68 65 20 73 69 6e 67 6c 65 20 63  for the single c
a570: 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 72 65 73  olumn in the res
a580: 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 53  ult set of the S
a590: 45 4c 45 43 54 0a 20 20 20 20 20 20 2a 2a 20 73  ELECT.      ** s
a5a0: 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20  tatement..      
a5b0: 2a 2f 0a 20 20 20 20 20 20 4e 61 6d 65 43 6f 6e  */.      NameCon
a5c0: 74 65 78 74 20 73 4e 43 3b 0a 20 20 20 20 20 20  text sNC;.      
a5d0: 53 65 6c 65 63 74 20 2a 70 53 20 3d 20 70 45 78  Select *pS = pEx
a5e0: 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 3b 0a 20  pr->x.pSelect;. 
a5f0: 20 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70       Expr *p = p
a600: 53 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e  S->pEList->a[0].
a610: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73  pExpr;.      ass
a620: 65 72 74 28 20 45 78 70 72 48 61 73 50 72 6f 70  ert( ExprHasProp
a630: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78  erty(pExpr, EP_x
a640: 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20  IsSelect) );.   
a650: 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20     sNC.pSrcList 
a660: 3d 20 70 53 2d 3e 70 53 72 63 3b 0a 20 20 20 20  = pS->pSrc;.    
a670: 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20 70 4e    sNC.pNext = pN
a680: 43 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70 50 61  C;.      sNC.pPa
a690: 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73  rse = pNC->pPars
a6a0: 65 3b 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d  e;.      zType =
a6b0: 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43   columnType(&sNC
a6c0: 2c 20 70 2c 20 26 7a 4f 72 69 67 44 62 2c 20 26  , p, &zOrigDb, &
a6d0: 7a 4f 72 69 67 54 61 62 2c 20 26 7a 4f 72 69 67  zOrigTab, &zOrig
a6e0: 43 6f 6c 2c 20 26 65 73 74 57 69 64 74 68 29 3b  Col, &estWidth);
a6f0: 20 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20   .      break;. 
a700: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
a710: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
a720: 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54  NABLE_COLUMN_MET
a730: 41 44 41 54 41 20 20 0a 20 20 69 66 28 20 70 7a  ADATA  .  if( pz
a740: 4f 72 69 67 44 62 20 29 7b 0a 20 20 20 20 61 73  OrigDb ){.    as
a750: 73 65 72 74 28 20 70 7a 4f 72 69 67 54 61 62 20  sert( pzOrigTab 
a760: 26 26 20 70 7a 4f 72 69 67 43 6f 6c 20 29 3b 0a  && pzOrigCol );.
a770: 20 20 20 20 2a 70 7a 4f 72 69 67 44 62 20 3d 20      *pzOrigDb = 
a780: 7a 4f 72 69 67 44 62 3b 0a 20 20 20 20 2a 70 7a  zOrigDb;.    *pz
a790: 4f 72 69 67 54 61 62 20 3d 20 7a 4f 72 69 67 54  OrigTab = zOrigT
a7a0: 61 62 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67 43  ab;.    *pzOrigC
a7b0: 6f 6c 20 3d 20 7a 4f 72 69 67 43 6f 6c 3b 0a 20  ol = zOrigCol;. 
a7c0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20   }.#endif.  if( 
a7d0: 70 45 73 74 57 69 64 74 68 20 29 20 2a 70 45 73  pEstWidth ) *pEs
a7e0: 74 57 69 64 74 68 20 3d 20 65 73 74 57 69 64 74  tWidth = estWidt
a7f0: 68 3b 0a 20 20 72 65 74 75 72 6e 20 7a 54 79 70  h;.  return zTyp
a800: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  e;.}../*.** Gene
a810: 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77  rate code that w
a820: 69 6c 6c 20 74 65 6c 6c 20 74 68 65 20 56 44 42  ill tell the VDB
a830: 45 20 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f  E the declaratio
a840: 6e 20 74 79 70 65 73 20 6f 66 20 63 6f 6c 75 6d  n types of colum
a850: 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 72 65 73  ns.** in the res
a860: 75 6c 74 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74  ult set..*/.stat
a870: 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65  ic void generate
a880: 43 6f 6c 75 6d 6e 54 79 70 65 73 28 0a 20 20 50  ColumnTypes(.  P
a890: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
a8a0: 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e     /* Parser con
a8b0: 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73  text */.  SrcLis
a8c0: 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 2f 2a  t *pTabList,  /*
a8d0: 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20   List of tables 
a8e0: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
a8f0: 45 4c 69 73 74 20 20 20 20 2f 2a 20 45 78 70 72  EList    /* Expr
a900: 65 73 73 69 6f 6e 73 20 64 65 66 69 6e 69 6e 67  essions defining
a910: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
a920: 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  */.){.#ifndef SQ
a930: 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 43 4c 54 59  LITE_OMIT_DECLTY
a940: 50 45 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  PE.  Vdbe *v = p
a950: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
a960: 69 6e 74 20 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e  int i;.  NameCon
a970: 74 65 78 74 20 73 4e 43 3b 0a 20 20 73 4e 43 2e  text sNC;.  sNC.
a980: 70 53 72 63 4c 69 73 74 20 3d 20 70 54 61 62 4c  pSrcList = pTabL
a990: 69 73 74 3b 0a 20 20 73 4e 43 2e 70 50 61 72 73  ist;.  sNC.pPars
a9a0: 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 66 6f  e = pParse;.  fo
a9b0: 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d  r(i=0; i<pEList-
a9c0: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
a9d0: 20 20 45 78 70 72 20 2a 70 20 3d 20 70 45 4c 69    Expr *p = pELi
a9e0: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  st->a[i].pExpr;.
a9f0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
aa00: 7a 54 79 70 65 3b 0a 23 69 66 64 65 66 20 53 51  zType;.#ifdef SQ
aa10: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55  LITE_ENABLE_COLU
aa20: 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20 20 20 20  MN_METADATA.    
aa30: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72 69  const char *zOri
aa40: 67 44 62 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e  gDb = 0;.    con
aa50: 73 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 54 61  st char *zOrigTa
aa60: 62 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74  b = 0;.    const
aa70: 20 63 68 61 72 20 2a 7a 4f 72 69 67 43 6f 6c 20   char *zOrigCol 
aa80: 3d 20 30 3b 0a 20 20 20 20 7a 54 79 70 65 20 3d  = 0;.    zType =
aa90: 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43   columnType(&sNC
aaa0: 2c 20 70 2c 20 26 7a 4f 72 69 67 44 62 2c 20 26  , p, &zOrigDb, &
aab0: 7a 4f 72 69 67 54 61 62 2c 20 26 7a 4f 72 69 67  zOrigTab, &zOrig
aac0: 43 6f 6c 2c 20 30 29 3b 0a 0a 20 20 20 20 2f 2a  Col, 0);..    /*
aad0: 20 54 68 65 20 76 64 62 65 20 6d 75 73 74 20 6d   The vdbe must m
aae0: 61 6b 65 20 69 74 73 20 6f 77 6e 20 63 6f 70 79  ake its own copy
aaf0: 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2d 74   of the column-t
ab00: 79 70 65 20 61 6e 64 20 6f 74 68 65 72 20 0a 20  ype and other . 
ab10: 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 73 70 65     ** column spe
ab20: 63 69 66 69 63 20 73 74 72 69 6e 67 73 2c 20 69  cific strings, i
ab30: 6e 20 63 61 73 65 20 74 68 65 20 73 63 68 65 6d  n case the schem
ab40: 61 20 69 73 20 72 65 73 65 74 20 62 65 66 6f 72  a is reset befor
ab50: 65 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 76 69  e this.    ** vi
ab60: 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 69 73  rtual machine is
ab70: 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f   deleted..    */
ab80: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
ab90: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c  SetColName(v, i,
aba0: 20 43 4f 4c 4e 41 4d 45 5f 44 41 54 41 42 41 53   COLNAME_DATABAS
abb0: 45 2c 20 7a 4f 72 69 67 44 62 2c 20 53 51 4c 49  E, zOrigDb, SQLI
abc0: 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
abd0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
abe0: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
abf0: 4f 4c 4e 41 4d 45 5f 54 41 42 4c 45 2c 20 7a 4f  OLNAME_TABLE, zO
ac00: 72 69 67 54 61 62 2c 20 53 51 4c 49 54 45 5f 54  rigTab, SQLITE_T
ac10: 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73  RANSIENT);.    s
ac20: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
ac30: 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41  Name(v, i, COLNA
ac40: 4d 45 5f 43 4f 4c 55 4d 4e 2c 20 7a 4f 72 69 67  ME_COLUMN, zOrig
ac50: 43 6f 6c 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  Col, SQLITE_TRAN
ac60: 53 49 45 4e 54 29 3b 0a 23 65 6c 73 65 0a 20 20  SIENT);.#else.  
ac70: 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e    zType = column
ac80: 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 30 2c  Type(&sNC, p, 0,
ac90: 20 30 2c 20 30 2c 20 30 29 3b 0a 23 65 6e 64 69   0, 0, 0);.#endi
aca0: 66 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  f.    sqlite3Vdb
acb0: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69  eSetColName(v, i
acc0: 2c 20 43 4f 4c 4e 41 4d 45 5f 44 45 43 4c 54 59  , COLNAME_DECLTY
acd0: 50 45 2c 20 7a 54 79 70 65 2c 20 53 51 4c 49 54  PE, zType, SQLIT
ace0: 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
acf0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  }.#endif /* !def
ad00: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
ad10: 5f 44 45 43 4c 54 59 50 45 29 20 2a 2f 0a 7d 0a  _DECLTYPE) */.}.
ad20: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
ad30: 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 74  code that will t
ad40: 65 6c 6c 20 74 68 65 20 56 44 42 45 20 74 68 65  ell the VDBE the
ad50: 20 6e 61 6d 65 73 20 6f 66 20 63 6f 6c 75 6d 6e   names of column
ad60: 73 0a 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75  s.** in the resu
ad70: 6c 74 20 73 65 74 2e 20 20 54 68 69 73 20 69 6e  lt set.  This in
ad80: 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65  formation is use
ad90: 64 20 74 6f 20 70 72 6f 76 69 64 65 20 74 68 65  d to provide the
ada0: 0a 2a 2a 20 61 7a 43 6f 6c 5b 5d 20 76 61 6c 75  .** azCol[] valu
adb0: 65 73 20 69 6e 20 74 68 65 20 63 61 6c 6c 62 61  es in the callba
adc0: 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ck..*/.static vo
add0: 69 64 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d  id generateColum
ade0: 6e 4e 61 6d 65 73 28 0a 20 20 50 61 72 73 65 20  nNames(.  Parse 
adf0: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a  *pParse,      /*
ae00: 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20   Parser context 
ae10: 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  */.  SrcList *pT
ae20: 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74  abList,  /* List
ae30: 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20   of tables */.  
ae40: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
ae50: 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
ae60: 6e 73 20 64 65 66 69 6e 69 6e 67 20 74 68 65 20  ns defining the 
ae70: 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 29 7b  result set */.){
ae80: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
ae90: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
aea0: 74 20 69 2c 20 6a 3b 0a 20 20 73 71 6c 69 74 65  t i, j;.  sqlite
aeb0: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
aec0: 64 62 3b 0a 20 20 69 6e 74 20 66 75 6c 6c 4e 61  db;.  int fullNa
aed0: 6d 65 73 2c 20 73 68 6f 72 74 4e 61 6d 65 73 3b  mes, shortNames;
aee0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
aef0: 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20  _OMIT_EXPLAIN.  
af00: 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e  /* If this is an
af10: 20 45 58 50 4c 41 49 4e 2c 20 73 6b 69 70 20 74   EXPLAIN, skip t
af20: 68 69 73 20 73 74 65 70 20 2a 2f 0a 20 20 69 66  his step */.  if
af30: 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69  ( pParse->explai
af40: 6e 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  n ){.    return;
af50: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69  .  }.#endif..  i
af60: 66 28 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61  f( pParse->colNa
af70: 6d 65 73 53 65 74 20 7c 7c 20 4e 45 56 45 52 28  mesSet || NEVER(
af80: 76 3d 3d 30 29 20 7c 7c 20 64 62 2d 3e 6d 61 6c  v==0) || db->mal
af90: 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75  locFailed ) retu
afa0: 72 6e 3b 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f  rn;.  pParse->co
afb0: 6c 4e 61 6d 65 73 53 65 74 20 3d 20 31 3b 0a 20  lNamesSet = 1;. 
afc0: 20 66 75 6c 6c 4e 61 6d 65 73 20 3d 20 28 64 62   fullNames = (db
afd0: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
afe0: 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d  _FullColNames)!=
aff0: 30 3b 0a 20 20 73 68 6f 72 74 4e 61 6d 65 73 20  0;.  shortNames 
b000: 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  = (db->flags & S
b010: 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61  QLITE_ShortColNa
b020: 6d 65 73 29 21 3d 30 3b 0a 20 20 73 71 6c 69 74  mes)!=0;.  sqlit
b030: 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73  e3VdbeSetNumCols
b040: 28 76 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  (v, pEList->nExp
b050: 72 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  r);.  for(i=0; i
b060: 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  <pEList->nExpr; 
b070: 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  i++){.    Expr *
b080: 70 3b 0a 20 20 20 20 70 20 3d 20 70 45 4c 69 73  p;.    p = pELis
b090: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  t->a[i].pExpr;. 
b0a0: 20 20 20 69 66 28 20 4e 45 56 45 52 28 70 3d 3d     if( NEVER(p==
b0b0: 30 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  0) ) continue;. 
b0c0: 20 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 61     if( pEList->a
b0d0: 5b 69 5d 2e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20  [i].zName ){.   
b0e0: 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d     char *zName =
b0f0: 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e   pEList->a[i].zN
b100: 61 6d 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ame;.      sqlit
b110: 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
b120: 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e  (v, i, COLNAME_N
b130: 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20 53 51 4c 49  AME, zName, SQLI
b140: 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
b150: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 2d     }else if( (p-
b160: 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c  >op==TK_COLUMN |
b170: 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f  | p->op==TK_AGG_
b180: 43 4f 4c 55 4d 4e 29 20 26 26 20 70 54 61 62 4c  COLUMN) && pTabL
b190: 69 73 74 20 29 7b 0a 20 20 20 20 20 20 54 61 62  ist ){.      Tab
b1a0: 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 20 20  le *pTab;.      
b1b0: 63 68 61 72 20 2a 7a 43 6f 6c 3b 0a 20 20 20 20  char *zCol;.    
b1c0: 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e    int iCol = p->
b1d0: 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 66  iColumn;.      f
b1e0: 6f 72 28 6a 3d 30 3b 20 41 4c 57 41 59 53 28 6a  or(j=0; ALWAYS(j
b1f0: 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 29  <pTabList->nSrc)
b200: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
b210: 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  if( pTabList->a[
b220: 6a 5d 2e 69 43 75 72 73 6f 72 3d 3d 70 2d 3e 69  j].iCursor==p->i
b230: 54 61 62 6c 65 20 29 20 62 72 65 61 6b 3b 0a 20  Table ) break;. 
b240: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
b250: 65 72 74 28 20 6a 3c 70 54 61 62 4c 69 73 74 2d  ert( j<pTabList-
b260: 3e 6e 53 72 63 20 29 3b 0a 20 20 20 20 20 20 70  >nSrc );.      p
b270: 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e  Tab = pTabList->
b280: 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20  a[j].pTab;.     
b290: 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43   if( iCol<0 ) iC
b2a0: 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79  ol = pTab->iPKey
b2b0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
b2c0: 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f  iCol==-1 || (iCo
b2d0: 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61  l>=0 && iCol<pTa
b2e0: 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20 20 20  b->nCol) );.    
b2f0: 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a    if( iCol<0 ){.
b300: 20 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 22          zCol = "
b310: 72 6f 77 69 64 22 3b 0a 20 20 20 20 20 20 7d 65  rowid";.      }e
b320: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f  lse{.        zCo
b330: 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  l = pTab->aCol[i
b340: 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  Col].zName;.    
b350: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 73    }.      if( !s
b360: 68 6f 72 74 4e 61 6d 65 73 20 26 26 20 21 66 75  hortNames && !fu
b370: 6c 6c 4e 61 6d 65 73 20 29 7b 0a 20 20 20 20 20  llNames ){.     
b380: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
b390: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
b3a0: 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 0a 20 20  OLNAME_NAME, .  
b3b0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
b3c0: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 45  3DbStrDup(db, pE
b3d0: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e  List->a[i].zSpan
b3e0: 29 2c 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49  ), SQLITE_DYNAMI
b3f0: 43 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  C);.      }else 
b400: 69 66 28 20 66 75 6c 6c 4e 61 6d 65 73 20 29 7b  if( fullNames ){
b410: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a  .        char *z
b420: 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Name = 0;.      
b430: 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
b440: 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73  3MPrintf(db, "%s
b450: 2e 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  .%s", pTab->zNam
b460: 65 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 20 20  e, zCol);.      
b470: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
b480: 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f  ColName(v, i, CO
b490: 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d  LNAME_NAME, zNam
b4a0: 65 2c 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49  e, SQLITE_DYNAMI
b4b0: 43 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  C);.      }else{
b4c0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
b4d0: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76  VdbeSetColName(v
b4e0: 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d  , i, COLNAME_NAM
b4f0: 45 2c 20 7a 43 6f 6c 2c 20 53 51 4c 49 54 45 5f  E, zCol, SQLITE_
b500: 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20  TRANSIENT);.    
b510: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
b520: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
b530: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c  SetColName(v, i,
b540: 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 0a   COLNAME_NAME, .
b550: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
b560: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 45  3DbStrDup(db, pE
b570: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e  List->a[i].zSpan
b580: 29 2c 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49  ), SQLITE_DYNAMI
b590: 43 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  C);.    }.  }.  
b5a0: 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 54 79  generateColumnTy
b5b0: 70 65 73 28 70 50 61 72 73 65 2c 20 70 54 61 62  pes(pParse, pTab
b5c0: 4c 69 73 74 2c 20 70 45 4c 69 73 74 29 3b 0a 7d  List, pEList);.}
b5d0: 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20  ../*.** Given a 
b5e0: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  an expression li
b5f0: 73 74 20 28 77 68 69 63 68 20 69 73 20 72 65 61  st (which is rea
b600: 6c 6c 79 20 74 68 65 20 6c 69 73 74 20 6f 66 20  lly the list of 
b610: 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 74  expressions.** t
b620: 68 61 74 20 66 6f 72 6d 20 74 68 65 20 72 65 73  hat form the res
b630: 75 6c 74 20 73 65 74 20 6f 66 20 61 20 53 45 4c  ult set of a SEL
b640: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 29 20 63  ECT statement) c
b650: 6f 6d 70 75 74 65 20 61 70 70 72 6f 70 72 69 61  ompute appropria
b660: 74 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6e 61 6d  te.** column nam
b670: 65 73 20 66 6f 72 20 61 20 74 61 62 6c 65 20 74  es for a table t
b680: 68 61 74 20 77 6f 75 6c 64 20 68 6f 6c 64 20 74  hat would hold t
b690: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  he expression li
b6a0: 73 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 63 6f  st..**.** All co
b6b0: 6c 75 6d 6e 20 6e 61 6d 65 73 20 77 69 6c 6c 20  lumn names will 
b6c0: 62 65 20 75 6e 69 71 75 65 2e 0a 2a 2a 0a 2a 2a  be unique..**.**
b6d0: 20 4f 6e 6c 79 20 74 68 65 20 63 6f 6c 75 6d 6e   Only the column
b6e0: 20 6e 61 6d 65 73 20 61 72 65 20 63 6f 6d 70 75   names are compu
b6f0: 74 65 64 2e 20 20 43 6f 6c 75 6d 6e 2e 7a 54 79  ted.  Column.zTy
b700: 70 65 2c 20 43 6f 6c 75 6d 6e 2e 7a 43 6f 6c 6c  pe, Column.zColl
b710: 2c 0a 2a 2a 20 61 6e 64 20 6f 74 68 65 72 20 66  ,.** and other f
b720: 69 65 6c 64 73 20 6f 66 20 43 6f 6c 75 6d 6e 20  ields of Column 
b730: 61 72 65 20 7a 65 72 6f 65 64 2e 0a 2a 2a 0a 2a  are zeroed..**.*
b740: 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
b750: 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20  OK on success.  
b760: 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  If a memory allo
b770: 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 6f 63 63  cation error occ
b780: 75 72 73 2c 0a 2a 2a 20 73 74 6f 72 65 20 4e 55  urs,.** store NU
b790: 4c 4c 20 69 6e 20 2a 70 61 43 6f 6c 20 61 6e 64  LL in *paCol and
b7a0: 20 30 20 69 6e 20 2a 70 6e 43 6f 6c 20 61 6e 64   0 in *pnCol and
b7b0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
b7c0: 4f 4d 45 4d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  OMEM..*/.static 
b7d0: 69 6e 74 20 73 65 6c 65 63 74 43 6f 6c 75 6d 6e  int selectColumn
b7e0: 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 0a 20  sFromExprList(. 
b7f0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
b800: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
b810: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
b820: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
b830: 74 2c 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72  t,       /* Expr
b840: 20 6c 69 73 74 20 66 72 6f 6d 20 77 68 69 63 68   list from which
b850: 20 74 6f 20 64 65 72 69 76 65 20 63 6f 6c 75 6d   to derive colum
b860: 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 69 31 36  n names */.  i16
b870: 20 2a 70 6e 43 6f 6c 2c 20 20 20 20 20 20 20 20   *pnCol,        
b880: 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
b890: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  e number of colu
b8a0: 6d 6e 73 20 68 65 72 65 20 2a 2f 0a 20 20 43 6f  mns here */.  Co
b8b0: 6c 75 6d 6e 20 2a 2a 70 61 43 6f 6c 20 20 20 20  lumn **paCol    
b8c0: 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
b8d0: 68 65 20 6e 65 77 20 63 6f 6c 75 6d 6e 20 6c 69  he new column li
b8e0: 73 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  st here */.){.  
b8f0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
b900: 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f 2a 20 44  arse->db;   /* D
b910: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
b920: 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a  on */.  int i, j
b930: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
b940: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
b950: 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 63 6e  ters */.  int cn
b960: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
b970: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 61        /* Index a
b980: 64 64 65 64 20 74 6f 20 6d 61 6b 65 20 74 68 65  dded to make the
b990: 20 6e 61 6d 65 20 75 6e 69 71 75 65 20 2a 2f 0a   name unique */.
b9a0: 20 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f 6c 2c 20    Column *aCol, 
b9b0: 2a 70 43 6f 6c 3b 20 20 20 20 20 20 20 20 2f 2a  *pCol;        /*
b9c0: 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65   For looping ove
b9d0: 72 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  r result columns
b9e0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 20   */.  int nCol; 
b9f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba00: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
ba10: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65  olumns in the re
ba20: 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 45 78  sult set */.  Ex
ba30: 70 72 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20  pr *p;          
ba40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70            /* Exp
ba50: 72 65 73 73 69 6f 6e 20 66 6f 72 20 61 20 73 69  ression for a si
ba60: 6e 67 6c 65 20 72 65 73 75 6c 74 20 63 6f 6c 75  ngle result colu
ba70: 6d 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e  mn */.  char *zN
ba80: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
ba90: 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 61      /* Column na
baa0: 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d  me */.  int nNam
bab0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
bac0: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6e      /* Size of n
bad0: 61 6d 65 20 69 6e 20 7a 4e 61 6d 65 5b 5d 20 2a  ame in zName[] *
bae0: 2f 0a 0a 20 20 69 66 28 20 70 45 4c 69 73 74 20  /..  if( pEList 
baf0: 29 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70 45  ){.    nCol = pE
bb00: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  List->nExpr;.   
bb10: 20 61 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 44   aCol = sqlite3D
bb20: 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
bb30: 73 69 7a 65 6f 66 28 61 43 6f 6c 5b 30 5d 29 2a  sizeof(aCol[0])*
bb40: 6e 43 6f 6c 29 3b 0a 20 20 20 20 74 65 73 74 63  nCol);.    testc
bb50: 61 73 65 28 20 61 43 6f 6c 3d 3d 30 20 29 3b 0a  ase( aCol==0 );.
bb60: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 43 6f    }else{.    nCo
bb70: 6c 20 3d 20 30 3b 0a 20 20 20 20 61 43 6f 6c 20  l = 0;.    aCol 
bb80: 3d 20 30 3b 0a 20 20 7d 0a 20 20 2a 70 6e 43 6f  = 0;.  }.  *pnCo
bb90: 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20 2a 70 61 43  l = nCol;.  *paC
bba0: 6f 6c 20 3d 20 61 43 6f 6c 3b 0a 0a 20 20 66 6f  ol = aCol;..  fo
bbb0: 72 28 69 3d 30 2c 20 70 43 6f 6c 3d 61 43 6f 6c  r(i=0, pCol=aCol
bbc0: 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70  ; i<nCol; i++, p
bbd0: 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20 47  Col++){.    /* G
bbe0: 65 74 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74  et an appropriat
bbf0: 65 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 63  e name for the c
bc00: 6f 6c 75 6d 6e 0a 20 20 20 20 2a 2f 0a 20 20 20  olumn.    */.   
bc10: 20 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72   p = sqlite3Expr
bc20: 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 45 4c 69  SkipCollate(pELi
bc30: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b  st->a[i].pExpr);
bc40: 0a 20 20 20 20 69 66 28 20 28 7a 4e 61 6d 65 20  .    if( (zName 
bc50: 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  = pEList->a[i].z
bc60: 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20  Name)!=0 ){.    
bc70: 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c 75    /* If the colu
bc80: 6d 6e 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 22  mn contains an "
bc90: 41 53 20 3c 6e 61 6d 65 3e 22 20 70 68 72 61 73  AS <name>" phras
bca0: 65 2c 20 75 73 65 20 3c 6e 61 6d 65 3e 20 61 73  e, use <name> as
bcb0: 20 74 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20   the name */.   
bcc0: 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74     zName = sqlit
bcd0: 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 7a  e3DbStrDup(db, z
bce0: 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Name);.    }else
bcf0: 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 43  {.      Expr *pC
bd00: 6f 6c 45 78 70 72 20 3d 20 70 3b 20 20 2f 2a 20  olExpr = p;  /* 
bd10: 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74  The expression t
bd20: 68 61 74 20 69 73 20 74 68 65 20 72 65 73 75 6c  hat is the resul
bd30: 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f  t column name */
bd40: 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54  .      Table *pT
bd50: 61 62 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ab;         /* T
bd60: 61 62 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20  able associated 
bd70: 77 69 74 68 20 74 68 69 73 20 65 78 70 72 65 73  with this expres
bd80: 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 77 68  sion */.      wh
bd90: 69 6c 65 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f  ile( pColExpr->o
bda0: 70 3d 3d 54 4b 5f 44 4f 54 20 29 7b 0a 20 20 20  p==TK_DOT ){.   
bdb0: 20 20 20 20 20 70 43 6f 6c 45 78 70 72 20 3d 20       pColExpr = 
bdc0: 70 43 6f 6c 45 78 70 72 2d 3e 70 52 69 67 68 74  pColExpr->pRight
bdd0: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
bde0: 28 20 70 43 6f 6c 45 78 70 72 21 3d 30 20 29 3b  ( pColExpr!=0 );
bdf0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
be00: 66 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f 70 3d  f( pColExpr->op=
be10: 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 41 4c  =TK_COLUMN && AL
be20: 57 41 59 53 28 70 43 6f 6c 45 78 70 72 2d 3e 70  WAYS(pColExpr->p
be30: 54 61 62 21 3d 30 29 20 29 7b 0a 20 20 20 20 20  Tab!=0) ){.     
be40: 20 20 20 2f 2a 20 46 6f 72 20 63 6f 6c 75 6d 6e     /* For column
be50: 73 20 75 73 65 20 74 68 65 20 63 6f 6c 75 6d 6e  s use the column
be60: 20 6e 61 6d 65 20 6e 61 6d 65 20 2a 2f 0a 20 20   name name */.  
be70: 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d        int iCol =
be80: 20 70 43 6f 6c 45 78 70 72 2d 3e 69 43 6f 6c 75   pColExpr->iColu
be90: 6d 6e 3b 0a 20 20 20 20 20 20 20 20 70 54 61 62  mn;.        pTab
bea0: 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 70 54 61   = pColExpr->pTa
beb0: 62 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  b;.        if( i
bec0: 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70  Col<0 ) iCol = p
bed0: 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20  Tab->iPKey;.    
bee0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69      zName = sqli
bef0: 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
bf00: 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %s",.           
bf10: 20 20 20 20 20 20 69 43 6f 6c 3e 3d 30 20 3f 20        iCol>=0 ? 
bf20: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
bf30: 2e 7a 4e 61 6d 65 20 3a 20 22 72 6f 77 69 64 22  .zName : "rowid"
bf40: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
bf50: 66 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f 70 3d  f( pColExpr->op=
bf60: 3d 54 4b 5f 49 44 20 29 7b 0a 20 20 20 20 20 20  =TK_ID ){.      
bf70: 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
bf80: 61 73 50 72 6f 70 65 72 74 79 28 70 43 6f 6c 45  asProperty(pColE
bf90: 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  xpr, EP_IntValue
bfa0: 29 20 29 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61  ) );.        zNa
bfb0: 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  me = sqlite3MPri
bfc0: 6e 74 66 28 64 62 2c 20 22 25 73 22 2c 20 70 43  ntf(db, "%s", pC
bfd0: 6f 6c 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e  olExpr->u.zToken
bfe0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
bff0: 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20 74          /* Use t
c000: 68 65 20 6f 72 69 67 69 6e 61 6c 20 74 65 78 74  he original text
c010: 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 65   of the column e
c020: 78 70 72 65 73 73 69 6f 6e 20 61 73 20 69 74 73  xpression as its
c030: 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20   name */.       
c040: 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
c050: 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 22  MPrintf(db, "%s"
c060: 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  , pEList->a[i].z
c070: 53 70 61 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Span);.      }. 
c080: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64 62 2d     }.    if( db-
c090: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
c0a0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
c0b0: 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b  Free(db, zName);
c0c0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
c0d0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65    }..    /* Make
c0e0: 20 73 75 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e   sure the column
c0f0: 20 6e 61 6d 65 20 69 73 20 75 6e 69 71 75 65 2e   name is unique.
c100: 20 20 49 66 20 74 68 65 20 6e 61 6d 65 20 69 73    If the name is
c110: 20 6e 6f 74 20 75 6e 69 71 75 65 2c 0a 20 20 20   not unique,.   
c120: 20 2a 2a 20 61 70 70 65 6e 64 20 61 20 69 6e 74   ** append a int
c130: 65 67 65 72 20 74 6f 20 74 68 65 20 6e 61 6d 65  eger to the name
c140: 20 73 6f 20 74 68 61 74 20 69 74 20 62 65 63 6f   so that it beco
c150: 6d 65 73 20 75 6e 69 71 75 65 2e 0a 20 20 20 20  mes unique..    
c160: 2a 2f 0a 20 20 20 20 6e 4e 61 6d 65 20 3d 20 73  */.    nName = s
c170: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
c180: 4e 61 6d 65 29 3b 0a 20 20 20 20 66 6f 72 28 6a  Name);.    for(j
c190: 3d 63 6e 74 3d 30 3b 20 6a 3c 69 3b 20 6a 2b 2b  =cnt=0; j<i; j++
c1a0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  ){.      if( sql
c1b0: 69 74 65 33 53 74 72 49 43 6d 70 28 61 43 6f 6c  ite3StrICmp(aCol
c1c0: 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65  [j].zName, zName
c1d0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
c1e0: 63 68 61 72 20 2a 7a 4e 65 77 4e 61 6d 65 3b 0a  char *zNewName;.
c1f0: 20 20 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20          int k;. 
c200: 20 20 20 20 20 20 20 66 6f 72 28 6b 3d 6e 4e 61         for(k=nNa
c210: 6d 65 2d 31 3b 20 6b 3e 31 20 26 26 20 73 71 6c  me-1; k>1 && sql
c220: 69 74 65 33 49 73 64 69 67 69 74 28 7a 4e 61 6d  ite3Isdigit(zNam
c230: 65 5b 6b 5d 29 3b 20 6b 2d 2d 29 7b 7d 0a 20 20  e[k]); k--){}.  
c240: 20 20 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 5b        if( zName[
c250: 6b 5d 3d 3d 27 3a 27 20 29 20 6e 4e 61 6d 65 20  k]==':' ) nName 
c260: 3d 20 6b 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61  = k;.        zNa
c270: 6d 65 5b 6e 4e 61 6d 65 5d 20 3d 20 30 3b 0a 20  me[nName] = 0;. 
c280: 20 20 20 20 20 20 20 7a 4e 65 77 4e 61 6d 65 20         zNewName 
c290: 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
c2a0: 28 64 62 2c 20 22 25 73 3a 25 64 22 2c 20 7a 4e  (db, "%s:%d", zN
c2b0: 61 6d 65 2c 20 2b 2b 63 6e 74 29 3b 0a 20 20 20  ame, ++cnt);.   
c2c0: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
c2d0: 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20  ee(db, zName);. 
c2e0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 7a         zName = z
c2f0: 4e 65 77 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  NewName;.       
c300: 20 6a 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20   j = -1;.       
c310: 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20   if( zName==0 ) 
c320: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
c330: 20 20 20 7d 0a 20 20 20 20 70 43 6f 6c 2d 3e 7a     }.    pCol->z
c340: 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20  Name = zName;.  
c350: 7d 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  }.  if( db->mall
c360: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
c370: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 69 3b 20 6a 2b  for(j=0; j<i; j+
c380: 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
c390: 33 44 62 46 72 65 65 28 64 62 2c 20 61 43 6f 6c  3DbFree(db, aCol
c3a0: 5b 6a 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  [j].zName);.    
c3b0: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  }.    sqlite3DbF
c3c0: 72 65 65 28 64 62 2c 20 61 43 6f 6c 29 3b 0a 20  ree(db, aCol);. 
c3d0: 20 20 20 2a 70 61 43 6f 6c 20 3d 20 30 3b 0a 20     *paCol = 0;. 
c3e0: 20 20 20 2a 70 6e 43 6f 6c 20 3d 20 30 3b 0a 20     *pnCol = 0;. 
c3f0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
c400: 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 72 65  _NOMEM;.  }.  re
c410: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
c420: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74 79 70  }../*.** Add typ
c430: 65 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 20  e and collation 
c440: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 61  information to a
c450: 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 62 61 73   column list bas
c460: 65 64 20 6f 6e 0a 2a 2a 20 61 20 53 45 4c 45 43  ed on.** a SELEC
c470: 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20  T statement..** 
c480: 0a 2a 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6c  .** The column l
c490: 69 73 74 20 70 72 65 73 75 6d 61 62 6c 79 20 63  ist presumably c
c4a0: 61 6d 65 20 66 72 6f 6d 20 73 65 6c 65 63 74 43  ame from selectC
c4b0: 6f 6c 75 6d 6e 4e 61 6d 65 73 46 72 6f 6d 45 78  olumnNamesFromEx
c4c0: 70 72 4c 69 73 74 28 29 2e 0a 2a 2a 20 54 68 65  prList()..** The
c4d0: 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 68 61 73   column list has
c4e0: 20 6f 6e 6c 79 20 6e 61 6d 65 73 2c 20 6e 6f 74   only names, not
c4f0: 20 74 79 70 65 73 20 6f 72 20 63 6f 6c 6c 61 74   types or collat
c500: 69 6f 6e 73 2e 20 20 54 68 69 73 0a 2a 2a 20 72  ions.  This.** r
c510: 6f 75 74 69 6e 65 20 67 6f 65 73 20 74 68 72 6f  outine goes thro
c520: 75 67 68 20 61 6e 64 20 61 64 64 73 20 74 68 65  ugh and adds the
c530: 20 74 79 70 65 73 20 61 6e 64 20 63 6f 6c 6c 61   types and colla
c540: 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  tions..**.** Thi
c550: 73 20 72 6f 75 74 69 6e 65 20 72 65 71 75 69 72  s routine requir
c560: 65 73 20 74 68 61 74 20 61 6c 6c 20 69 64 65 6e  es that all iden
c570: 74 69 66 69 65 72 73 20 69 6e 20 74 68 65 20 53  tifiers in the S
c580: 45 4c 45 43 54 0a 2a 2a 20 73 74 61 74 65 6d 65  ELECT.** stateme
c590: 6e 74 20 62 65 20 72 65 73 6f 6c 76 65 64 2e 0a  nt be resolved..
c5a0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
c5b0: 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79  electAddColumnTy
c5c0: 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 0a  peAndCollation(.
c5d0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
c5e0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
c5f0: 6e 67 20 63 6f 6e 74 65 78 74 73 20 2a 2f 0a 20  ng contexts */. 
c600: 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20   Table *pTab,   
c610: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 63 6f         /* Add co
c620: 6c 75 6d 6e 20 74 79 70 65 20 69 6e 66 6f 72 6d  lumn type inform
c630: 61 74 69 6f 6e 20 74 6f 20 74 68 69 73 20 74 61  ation to this ta
c640: 62 6c 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ble */.  Select 
c650: 2a 70 53 65 6c 65 63 74 20 20 20 20 20 20 20 2f  *pSelect       /
c660: 2a 20 53 45 4c 45 43 54 20 75 73 65 64 20 74 6f  * SELECT used to
c670: 20 64 65 74 65 72 6d 69 6e 65 20 74 79 70 65 73   determine types
c680: 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 73 20   and collations 
c690: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
c6a0: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
c6b0: 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20  ;.  NameContext 
c6c0: 73 4e 43 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70  sNC;.  Column *p
c6d0: 43 6f 6c 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a  Col;.  CollSeq *
c6e0: 70 43 6f 6c 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a  pColl;.  int i;.
c6f0: 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 73 74 72    Expr *p;.  str
c700: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
c710: 6d 20 2a 61 3b 0a 20 20 75 36 34 20 73 7a 41 6c  m *a;.  u64 szAl
c720: 6c 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74  l = 0;..  assert
c730: 28 20 70 53 65 6c 65 63 74 21 3d 30 20 29 3b 0a  ( pSelect!=0 );.
c740: 20 20 61 73 73 65 72 74 28 20 28 70 53 65 6c 65    assert( (pSele
c750: 63 74 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  ct->selFlags & S
c760: 46 5f 52 65 73 6f 6c 76 65 64 29 21 3d 30 20 29  F_Resolved)!=0 )
c770: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62  ;.  assert( pTab
c780: 2d 3e 6e 43 6f 6c 3d 3d 70 53 65 6c 65 63 74 2d  ->nCol==pSelect-
c790: 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 7c  >pEList->nExpr |
c7a0: 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
c7b0: 65 64 20 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  ed );.  if( db->
c7c0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72  mallocFailed ) r
c7d0: 65 74 75 72 6e 3b 0a 20 20 6d 65 6d 73 65 74 28  eturn;.  memset(
c7e0: 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28  &sNC, 0, sizeof(
c7f0: 73 4e 43 29 29 3b 0a 20 20 73 4e 43 2e 70 53 72  sNC));.  sNC.pSr
c800: 63 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d  cList = pSelect-
c810: 3e 70 53 72 63 3b 0a 20 20 61 20 3d 20 70 53 65  >pSrc;.  a = pSe
c820: 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b  lect->pEList->a;
c830: 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 43 6f 6c  .  for(i=0, pCol
c840: 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b 20 69 3c 70  =pTab->aCol; i<p
c850: 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20  Tab->nCol; i++, 
c860: 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 70 20 3d  pCol++){.    p =
c870: 20 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20   a[i].pExpr;.   
c880: 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 20 3d 20 73   pCol->zType = s
c890: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
c8a0: 62 2c 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73  b, columnType(&s
c8b0: 4e 43 2c 20 70 2c 30 2c 30 2c 30 2c 20 26 70 43  NC, p,0,0,0, &pC
c8c0: 6f 6c 2d 3e 73 7a 45 73 74 29 29 3b 0a 20 20 20  ol->szEst));.   
c8d0: 20 73 7a 41 6c 6c 20 2b 3d 20 70 43 6f 6c 2d 3e   szAll += pCol->
c8e0: 73 7a 45 73 74 3b 0a 20 20 20 20 70 43 6f 6c 2d  szEst;.    pCol-
c8f0: 3e 61 66 66 69 6e 69 74 79 20 3d 20 73 71 6c 69  >affinity = sqli
c900: 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28  te3ExprAffinity(
c910: 70 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c  p);.    if( pCol
c920: 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 30 20 29 20  ->affinity==0 ) 
c930: 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d  pCol->affinity =
c940: 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45   SQLITE_AFF_NONE
c950: 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71  ;.    pColl = sq
c960: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
c970: 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20  (pParse, p);.   
c980: 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20   if( pColl ){.  
c990: 20 20 20 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 20      pCol->zColl 
c9a0: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
c9b0: 70 28 64 62 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61  p(db, pColl->zNa
c9c0: 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  me);.    }.  }. 
c9d0: 20 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 20   pTab->szTabRow 
c9e0: 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  = sqlite3LogEst(
c9f0: 73 7a 41 6c 6c 2a 34 29 3b 0a 7d 0a 0a 2f 2a 0a  szAll*4);.}../*.
ca00: 2a 2a 20 47 69 76 65 6e 20 61 20 53 45 4c 45 43  ** Given a SELEC
ca10: 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 67 65 6e  T statement, gen
ca20: 65 72 61 74 65 20 61 20 54 61 62 6c 65 20 73 74  erate a Table st
ca30: 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65 73  ructure that des
ca40: 63 72 69 62 65 73 0a 2a 2a 20 74 68 65 20 72 65  cribes.** the re
ca50: 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 61 74  sult set of that
ca60: 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 54 61 62 6c   SELECT..*/.Tabl
ca70: 65 20 2a 73 71 6c 69 74 65 33 52 65 73 75 6c 74  e *sqlite3Result
ca80: 53 65 74 4f 66 53 65 6c 65 63 74 28 50 61 72 73  SetOfSelect(Pars
ca90: 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63  e *pParse, Selec
caa0: 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 54  t *pSelect){.  T
cab0: 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 73 71  able *pTab;.  sq
cac0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
cad0: 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 73 61  se->db;.  int sa
cae0: 76 65 64 46 6c 61 67 73 3b 0a 0a 20 20 73 61 76  vedFlags;..  sav
caf0: 65 64 46 6c 61 67 73 20 3d 20 64 62 2d 3e 66 6c  edFlags = db->fl
cb00: 61 67 73 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73  ags;.  db->flags
cb10: 20 26 3d 20 7e 53 51 4c 49 54 45 5f 46 75 6c 6c   &= ~SQLITE_Full
cb20: 43 6f 6c 4e 61 6d 65 73 3b 0a 20 20 64 62 2d 3e  ColNames;.  db->
cb30: 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
cb40: 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 3b 0a 20  ShortColNames;. 
cb50: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 50 72   sqlite3SelectPr
cb60: 65 70 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65  ep(pParse, pSele
cb70: 63 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 50  ct, 0);.  if( pP
cb80: 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 72 65 74  arse->nErr ) ret
cb90: 75 72 6e 20 30 3b 0a 20 20 77 68 69 6c 65 28 20  urn 0;.  while( 
cba0: 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 20  pSelect->pPrior 
cbb0: 29 20 70 53 65 6c 65 63 74 20 3d 20 70 53 65 6c  ) pSelect = pSel
cbc0: 65 63 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 64  ect->pPrior;.  d
cbd0: 62 2d 3e 66 6c 61 67 73 20 3d 20 73 61 76 65 64  b->flags = saved
cbe0: 46 6c 61 67 73 3b 0a 20 20 70 54 61 62 20 3d 20  Flags;.  pTab = 
cbf0: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
cc00: 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 54  ero(db, sizeof(T
cc10: 61 62 6c 65 29 20 29 3b 0a 20 20 69 66 28 20 70  able) );.  if( p
cc20: 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  Tab==0 ){.    re
cc30: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 2f 2a  turn 0;.  }.  /*
cc40: 20 54 68 65 20 73 71 6c 69 74 65 33 52 65 73 75   The sqlite3Resu
cc50: 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 29 20  ltSetOfSelect() 
cc60: 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 6e 20 63  is only used n c
cc70: 6f 6e 74 65 78 74 73 20 77 68 65 72 65 20 6c 6f  ontexts where lo
cc80: 6f 6b 61 73 69 64 65 0a 20 20 2a 2a 20 69 73 20  okaside.  ** is 
cc90: 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 61 73  disabled */.  as
cca0: 73 65 72 74 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73  sert( db->lookas
ccb0: 69 64 65 2e 62 45 6e 61 62 6c 65 64 3d 3d 30 20  ide.bEnabled==0 
ccc0: 29 3b 0a 20 20 70 54 61 62 2d 3e 6e 52 65 66 20  );.  pTab->nRef 
ccd0: 3d 20 31 3b 0a 20 20 70 54 61 62 2d 3e 7a 4e 61  = 1;.  pTab->zNa
cce0: 6d 65 20 3d 20 30 3b 0a 20 20 70 54 61 62 2d 3e  me = 0;.  pTab->
ccf0: 6e 52 6f 77 45 73 74 20 3d 20 31 30 34 38 35 37  nRowEst = 104857
cd00: 36 3b 0a 20 20 73 65 6c 65 63 74 43 6f 6c 75 6d  6;.  selectColum
cd10: 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70  nsFromExprList(p
cd20: 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2d 3e  Parse, pSelect->
cd30: 70 45 4c 69 73 74 2c 20 26 70 54 61 62 2d 3e 6e  pEList, &pTab->n
cd40: 43 6f 6c 2c 20 26 70 54 61 62 2d 3e 61 43 6f 6c  Col, &pTab->aCol
cd50: 29 3b 0a 20 20 73 65 6c 65 63 74 41 64 64 43 6f  );.  selectAddCo
cd60: 6c 75 6d 6e 54 79 70 65 41 6e 64 43 6f 6c 6c 61  lumnTypeAndColla
cd70: 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 70 54 61  tion(pParse, pTa
cd80: 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 70  b, pSelect);.  p
cd90: 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b  Tab->iPKey = -1;
cda0: 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
cdb0: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 73  cFailed ){.    s
cdc0: 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c  qlite3DeleteTabl
cdd0: 65 28 64 62 2c 20 70 54 61 62 29 3b 0a 20 20 20  e(db, pTab);.   
cde0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
cdf0: 20 72 65 74 75 72 6e 20 70 54 61 62 3b 0a 7d 0a   return pTab;.}.
ce00: 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 56 44 42  ./*.** Get a VDB
ce10: 45 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20  E for the given 
ce20: 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 2e 20  parser context. 
ce30: 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e   Create a new on
ce40: 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a  e if necessary..
ce50: 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
ce60: 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 4e 55  ccurs, return NU
ce70: 4c 4c 20 61 6e 64 20 6c 65 61 76 65 20 61 20 6d  LL and leave a m
ce80: 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65  essage in pParse
ce90: 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73 71 6c 69 74  ..*/.Vdbe *sqlit
cea0: 65 33 47 65 74 56 64 62 65 28 50 61 72 73 65 20  e3GetVdbe(Parse 
ceb0: 2a 70 50 61 72 73 65 29 7b 0a 20 20 56 64 62 65  *pParse){.  Vdbe
cec0: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
ced0: 64 62 65 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20  dbe;.  if( v==0 
cee0: 29 7b 0a 20 20 20 20 76 20 3d 20 70 50 61 72 73  ){.    v = pPars
cef0: 65 2d 3e 70 56 64 62 65 20 3d 20 73 71 6c 69 74  e->pVdbe = sqlit
cf00: 65 33 56 64 62 65 43 72 65 61 74 65 28 70 50 61  e3VdbeCreate(pPa
cf10: 72 73 65 2d 3e 64 62 29 3b 0a 23 69 66 6e 64 65  rse->db);.#ifnde
cf20: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  f SQLITE_OMIT_TR
cf30: 41 43 45 0a 20 20 20 20 69 66 28 20 76 20 29 7b  ACE.    if( v ){
cf40: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
cf50: 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 54  beAddOp0(v, OP_T
cf60: 72 61 63 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  race);.    }.#en
cf70: 64 69 66 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  dif.  }.  return
cf80: 20 76 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f   v;.}.../*.** Co
cf90: 6d 70 75 74 65 20 74 68 65 20 69 4c 69 6d 69 74  mpute the iLimit
cfa0: 20 61 6e 64 20 69 4f 66 66 73 65 74 20 66 69 65   and iOffset fie
cfb0: 6c 64 73 20 6f 66 20 74 68 65 20 53 45 4c 45 43  lds of the SELEC
cfc0: 54 20 62 61 73 65 64 20 6f 6e 20 74 68 65 0a 2a  T based on the.*
cfd0: 2a 20 70 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66  * pLimit and pOf
cfe0: 66 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e 73  fset expressions
cff0: 2e 20 20 70 4c 69 6d 69 74 20 61 6e 64 20 70 4f  .  pLimit and pO
d000: 66 66 73 65 74 20 68 6f 6c 64 20 74 68 65 20 65  ffset hold the e
d010: 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 74 68  xpressions.** th
d020: 61 74 20 61 70 70 65 61 72 20 69 6e 20 74 68 65  at appear in the
d030: 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20 73 74   original SQL st
d040: 61 74 65 6d 65 6e 74 20 61 66 74 65 72 20 74 68  atement after th
d050: 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53  e LIMIT and OFFS
d060: 45 54 0a 2a 2a 20 6b 65 79 77 6f 72 64 73 2e 20  ET.** keywords. 
d070: 20 4f 72 20 4e 55 4c 4c 20 69 66 20 74 68 6f 73   Or NULL if thos
d080: 65 20 6b 65 79 77 6f 72 64 73 20 61 72 65 20 6f  e keywords are o
d090: 6d 69 74 74 65 64 2e 20 69 4c 69 6d 69 74 20 61  mitted. iLimit a
d0a0: 6e 64 20 69 4f 66 66 73 65 74 20 0a 2a 2a 20 61  nd iOffset .** a
d0b0: 72 65 20 74 68 65 20 69 6e 74 65 67 65 72 20 6d  re the integer m
d0c0: 65 6d 6f 72 79 20 72 65 67 69 73 74 65 72 20 6e  emory register n
d0d0: 75 6d 62 65 72 73 20 66 6f 72 20 63 6f 75 6e 74  umbers for count
d0e0: 65 72 73 20 75 73 65 64 20 74 6f 20 63 6f 6d 70  ers used to comp
d0f0: 75 74 65 20 0a 2a 2a 20 74 68 65 20 6c 69 6d 69  ute .** the limi
d100: 74 20 61 6e 64 20 6f 66 66 73 65 74 2e 20 20 49  t and offset.  I
d110: 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6c 69  f there is no li
d120: 6d 69 74 20 61 6e 64 2f 6f 72 20 6f 66 66 73 65  mit and/or offse
d130: 74 2c 20 74 68 65 6e 20 0a 2a 2a 20 69 4c 69 6d  t, then .** iLim
d140: 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20 61  it and iOffset a
d150: 72 65 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 0a  re negative..**.
d160: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
d170: 63 68 61 6e 67 65 73 20 74 68 65 20 76 61 6c 75  changes the valu
d180: 65 73 20 6f 66 20 69 4c 69 6d 69 74 20 61 6e 64  es of iLimit and
d190: 20 69 4f 66 66 73 65 74 20 6f 6e 6c 79 20 69 66   iOffset only if
d1a0: 0a 2a 2a 20 61 20 6c 69 6d 69 74 20 6f 72 20 6f  .** a limit or o
d1b0: 66 66 73 65 74 20 69 73 20 64 65 66 69 6e 65 64  ffset is defined
d1c0: 20 62 79 20 70 4c 69 6d 69 74 20 61 6e 64 20 70   by pLimit and p
d1d0: 4f 66 66 73 65 74 2e 20 20 69 4c 69 6d 69 74 20  Offset.  iLimit 
d1e0: 61 6e 64 0a 2a 2a 20 69 4f 66 66 73 65 74 20 73  and.** iOffset s
d1f0: 68 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20  hould have been 
d200: 70 72 65 73 65 74 20 74 6f 20 61 70 70 72 6f 70  preset to approp
d210: 72 69 61 74 65 20 64 65 66 61 75 6c 74 20 76 61  riate default va
d220: 6c 75 65 73 0a 2a 2a 20 28 75 73 75 61 6c 6c 79  lues.** (usually
d230: 20 62 75 74 20 6e 6f 74 20 61 6c 77 61 79 73 20   but not always 
d240: 2d 31 29 20 70 72 69 6f 72 20 74 6f 20 63 61 6c  -1) prior to cal
d250: 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e  ling this routin
d260: 65 2e 0a 2a 2a 20 4f 6e 6c 79 20 69 66 20 70 4c  e..** Only if pL
d270: 69 6d 69 74 21 3d 30 20 6f 72 20 70 4f 66 66 73  imit!=0 or pOffs
d280: 65 74 21 3d 30 20 64 6f 20 74 68 65 20 6c 69 6d  et!=0 do the lim
d290: 69 74 20 72 65 67 69 73 74 65 72 73 20 67 65 74  it registers get
d2a0: 0a 2a 2a 20 72 65 64 65 66 69 6e 65 64 2e 20 20  .** redefined.  
d2b0: 54 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70  The UNION ALL op
d2c0: 65 72 61 74 6f 72 20 75 73 65 73 20 74 68 69 73  erator uses this
d2d0: 20 70 72 6f 70 65 72 74 79 20 74 6f 20 66 6f 72   property to for
d2e0: 63 65 0a 2a 2a 20 74 68 65 20 72 65 75 73 65 20  ce.** the reuse 
d2f0: 6f 66 20 74 68 65 20 73 61 6d 65 20 6c 69 6d 69  of the same limi
d300: 74 20 61 6e 64 20 6f 66 66 73 65 74 20 72 65 67  t and offset reg
d310: 69 73 74 65 72 73 20 61 63 72 6f 73 73 20 6d 75  isters across mu
d320: 6c 74 69 70 6c 65 0a 2a 2a 20 53 45 4c 45 43 54  ltiple.** SELECT
d330: 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a   statements..*/.
d340: 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 6d 70  static void comp
d350: 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72  uteLimitRegister
d360: 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  s(Parse *pParse,
d370: 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20   Select *p, int 
d380: 69 42 72 65 61 6b 29 7b 0a 20 20 56 64 62 65 20  iBreak){.  Vdbe 
d390: 2a 76 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4c  *v = 0;.  int iL
d3a0: 69 6d 69 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20  imit = 0;.  int 
d3b0: 69 4f 66 66 73 65 74 3b 0a 20 20 69 6e 74 20 61  iOffset;.  int a
d3c0: 64 64 72 31 2c 20 6e 3b 0a 20 20 69 66 28 20 70  ddr1, n;.  if( p
d3d0: 2d 3e 69 4c 69 6d 69 74 20 29 20 72 65 74 75 72  ->iLimit ) retur
d3e0: 6e 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 22  n;..  /* .  ** "
d3f0: 4c 49 4d 49 54 20 2d 31 22 20 61 6c 77 61 79 73  LIMIT -1" always
d400: 20 73 68 6f 77 73 20 61 6c 6c 20 72 6f 77 73 2e   shows all rows.
d410: 20 20 54 68 65 72 65 20 69 73 20 73 6f 6d 65 0a    There is some.
d420: 20 20 2a 2a 20 63 6f 6e 74 72 6f 76 65 72 73 79    ** controversy
d430: 20 61 62 6f 75 74 20 77 68 61 74 20 74 68 65 20   about what the 
d440: 63 6f 72 72 65 63 74 20 62 65 68 61 76 69 6f 72  correct behavior
d450: 20 73 68 6f 75 6c 64 20 62 65 2e 0a 20 20 2a 2a   should be..  **
d460: 20 54 68 65 20 63 75 72 72 65 6e 74 20 69 6d 70   The current imp
d470: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 6e 74 65  lementation inte
d480: 72 70 72 65 74 73 20 22 4c 49 4d 49 54 20 30 22  rprets "LIMIT 0"
d490: 20 74 6f 20 6d 65 61 6e 0a 20 20 2a 2a 20 6e 6f   to mean.  ** no
d4a0: 20 72 6f 77 73 2e 0a 20 20 2a 2f 0a 20 20 73 71   rows..  */.  sq
d4b0: 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c  lite3ExprCacheCl
d4c0: 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 61  ear(pParse);.  a
d4d0: 73 73 65 72 74 28 20 70 2d 3e 70 4f 66 66 73 65  ssert( p->pOffse
d4e0: 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70 4c 69 6d 69  t==0 || p->pLimi
d4f0: 74 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d  t!=0 );.  if( p-
d500: 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 70  >pLimit ){.    p
d510: 2d 3e 69 4c 69 6d 69 74 20 3d 20 69 4c 69 6d 69  ->iLimit = iLimi
d520: 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  t = ++pParse->nM
d530: 65 6d 3b 0a 20 20 20 20 76 20 3d 20 73 71 6c 69  em;.    v = sqli
d540: 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
d550: 65 29 3b 0a 20 20 20 20 69 66 28 20 4e 45 56 45  e);.    if( NEVE
d560: 52 28 76 3d 3d 30 29 20 29 20 72 65 74 75 72 6e  R(v==0) ) return
d570: 3b 20 20 2f 2a 20 56 44 42 45 20 73 68 6f 75 6c  ;  /* VDBE shoul
d580: 64 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  d have already b
d590: 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f  een allocated */
d5a0: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
d5b0: 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 2d  ExprIsInteger(p-
d5c0: 3e 70 4c 69 6d 69 74 2c 20 26 6e 29 20 29 7b 0a  >pLimit, &n) ){.
d5d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
d5e0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
d5f0: 74 65 67 65 72 2c 20 6e 2c 20 69 4c 69 6d 69 74  teger, n, iLimit
d600: 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
d610: 6d 65 6e 74 28 28 76 2c 20 22 4c 49 4d 49 54 20  ment((v, "LIMIT 
d620: 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20 20 20  counter"));.    
d630: 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20    if( n==0 ){.  
d640: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
d650: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
d660: 74 6f 2c 20 30 2c 20 69 42 72 65 61 6b 29 3b 0a  to, 0, iBreak);.
d670: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
d680: 6e 3e 3d 30 20 26 26 20 70 2d 3e 6e 53 65 6c 65  n>=0 && p->nSele
d690: 63 74 52 6f 77 3e 28 75 36 34 29 6e 20 29 7b 0a  ctRow>(u64)n ){.
d6a0: 20 20 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65          p->nSele
d6b0: 63 74 52 6f 77 20 3d 20 6e 3b 0a 20 20 20 20 20  ctRow = n;.     
d6c0: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
d6d0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
d6e0: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 2d 3e 70  ode(pParse, p->p
d6f0: 4c 69 6d 69 74 2c 20 69 4c 69 6d 69 74 29 3b 0a  Limit, iLimit);.
d700: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
d710: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4d 75  eAddOp1(v, OP_Mu
d720: 73 74 42 65 49 6e 74 2c 20 69 4c 69 6d 69 74 29  stBeInt, iLimit)
d730: 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
d740: 65 6e 74 28 28 76 2c 20 22 4c 49 4d 49 54 20 63  ent((v, "LIMIT c
d750: 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20 20 20 20  ounter"));.     
d760: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
d770: 70 32 28 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c  p2(v, OP_IfZero,
d780: 20 69 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b 29   iLimit, iBreak)
d790: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
d7a0: 70 2d 3e 70 4f 66 66 73 65 74 20 29 7b 0a 20 20  p->pOffset ){.  
d7b0: 20 20 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d      p->iOffset =
d7c0: 20 69 4f 66 66 73 65 74 20 3d 20 2b 2b 70 50 61   iOffset = ++pPa
d7d0: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
d7e0: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b   pParse->nMem++;
d7f0: 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61     /* Allocate a
d800: 6e 20 65 78 74 72 61 20 72 65 67 69 73 74 65 72  n extra register
d810: 20 66 6f 72 20 6c 69 6d 69 74 2b 6f 66 66 73 65   for limit+offse
d820: 74 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  t */.      sqlit
d830: 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
d840: 65 2c 20 70 2d 3e 70 4f 66 66 73 65 74 2c 20 69  e, p->pOffset, i
d850: 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 73  Offset);.      s
d860: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
d870: 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74  (v, OP_MustBeInt
d880: 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20  , iOffset);.    
d890: 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
d8a0: 2c 20 22 4f 46 46 53 45 54 20 63 6f 75 6e 74 65  , "OFFSET counte
d8b0: 72 22 29 29 3b 0a 20 20 20 20 20 20 61 64 64 72  r"));.      addr
d8c0: 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 = sqlite3VdbeA
d8d0: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 50 6f  ddOp1(v, OP_IfPo
d8e0: 73 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 20  s, iOffset);.   
d8f0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
d900: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
d910: 65 72 2c 20 30 2c 20 69 4f 66 66 73 65 74 29 3b  er, 0, iOffset);
d920: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
d930: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
d940: 64 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  dr1);.      sqli
d950: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
d960: 20 4f 50 5f 41 64 64 2c 20 69 4c 69 6d 69 74 2c   OP_Add, iLimit,
d970: 20 69 4f 66 66 73 65 74 2c 20 69 4f 66 66 73 65   iOffset, iOffse
d980: 74 2b 31 29 3b 0a 20 20 20 20 20 20 56 64 62 65  t+1);.      Vdbe
d990: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c 49 4d  Comment((v, "LIM
d9a0: 49 54 2b 4f 46 46 53 45 54 22 29 29 3b 0a 20 20  IT+OFFSET"));.  
d9b0: 20 20 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69      addr1 = sqli
d9c0: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
d9d0: 20 4f 50 5f 49 66 50 6f 73 2c 20 69 4c 69 6d 69   OP_IfPos, iLimi
d9e0: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
d9f0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
da00: 50 5f 49 6e 74 65 67 65 72 2c 20 2d 31 2c 20 69  P_Integer, -1, i
da10: 4f 66 66 73 65 74 2b 31 29 3b 0a 20 20 20 20 20  Offset+1);.     
da20: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
da30: 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a  Here(v, addr1);.
da40: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66      }.  }.}..#if
da50: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
da60: 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
da70: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
da80: 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 63 6f  e appropriate co
da90: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
daa0: 20 66 6f 72 20 74 68 65 20 69 43 6f 6c 2d 74 68   for the iCol-th
dab0: 20 63 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a 20 74 68   column of.** th
dac0: 65 20 72 65 73 75 6c 74 20 73 65 74 20 66 6f 72  e result set for
dad0: 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 2d 73 65   the compound-se
dae0: 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20 22  lect statement "
daf0: 70 22 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c  p".  Return NULL
db00: 20 69 66 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d   if.** the colum
db10: 6e 20 68 61 73 20 6e 6f 20 64 65 66 61 75 6c 74  n has no default
db20: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
db30: 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  nce..**.** The c
db40: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
db50: 65 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 6f 75  e for the compou
db60: 6e 64 20 73 65 6c 65 63 74 20 69 73 20 74 61 6b  nd select is tak
db70: 65 6e 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 6c  en from the.** l
db80: 65 66 74 2d 6d 6f 73 74 20 74 65 72 6d 20 6f 66  eft-most term of
db90: 20 74 68 65 20 73 65 6c 65 63 74 20 74 68 61 74   the select that
dba0: 20 68 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67   has a collating
dbb0: 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2f 0a 73 74   sequence..*/.st
dbc0: 61 74 69 63 20 43 6f 6c 6c 53 65 71 20 2a 6d 75  atic CollSeq *mu
dbd0: 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71  ltiSelectCollSeq
dbe0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
dbf0: 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 69  Select *p, int i
dc00: 43 6f 6c 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20  Col){.  CollSeq 
dc10: 2a 70 52 65 74 3b 0a 20 20 69 66 28 20 70 2d 3e  *pRet;.  if( p->
dc20: 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 70 52  pPrior ){.    pR
dc30: 65 74 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74  et = multiSelect
dc40: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
dc50: 70 2d 3e 70 50 72 69 6f 72 2c 20 69 43 6f 6c 29  p->pPrior, iCol)
dc60: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
dc70: 52 65 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61  Ret = 0;.  }.  a
dc80: 73 73 65 72 74 28 20 69 43 6f 6c 3e 3d 30 20 29  ssert( iCol>=0 )
dc90: 3b 0a 20 20 69 66 28 20 70 52 65 74 3d 3d 30 20  ;.  if( pRet==0 
dca0: 26 26 20 69 43 6f 6c 3c 70 2d 3e 70 45 4c 69 73  && iCol<p->pELis
dcb0: 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  t->nExpr ){.    
dcc0: 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33 45 78  pRet = sqlite3Ex
dcd0: 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
dce0: 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69  , p->pEList->a[i
dcf0: 43 6f 6c 5d 2e 70 45 78 70 72 29 3b 0a 20 20 7d  Col].pExpr);.  }
dd00: 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a  .  return pRet;.
dd10: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
dd20: 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  TE_OMIT_COMPOUND
dd30: 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 2f 2a 20 46  _SELECT */../* F
dd40: 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65  orward reference
dd50: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d   */.static int m
dd60: 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42  ultiSelectOrderB
dd70: 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  y(.  Parse *pPar
dd80: 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61  se,        /* Pa
dd90: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
dda0: 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
ddb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
ddc0: 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45  right-most of SE
ddd0: 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f 64 65  LECTs to be code
dde0: 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  d */.  SelectDes
ddf0: 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a 20  t *pDest     /* 
de00: 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20  What to do with 
de10: 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f  query results */
de20: 0a 29 3b 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51  .);...#ifndef SQ
de30: 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
de40: 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20  ND_SELECT./*.** 
de50: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
de60: 63 61 6c 6c 65 64 20 74 6f 20 70 72 6f 63 65 73  called to proces
de70: 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65  s a compound que
de80: 72 79 20 66 6f 72 6d 20 66 72 6f 6d 0a 2a 2a 20  ry form from.** 
de90: 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73 65 70 61  two or more sepa
dea0: 72 61 74 65 20 71 75 65 72 69 65 73 20 75 73 69  rate queries usi
deb0: 6e 67 20 55 4e 49 4f 4e 2c 20 55 4e 49 4f 4e 20  ng UNION, UNION 
dec0: 41 4c 4c 2c 20 45 58 43 45 50 54 2c 20 6f 72 0a  ALL, EXCEPT, or.
ded0: 2a 2a 20 49 4e 54 45 52 53 45 43 54 0a 2a 2a 0a  ** INTERSECT.**.
dee0: 2a 2a 20 22 70 22 20 70 6f 69 6e 74 73 20 74 6f  ** "p" points to
def0: 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
df00: 6f 66 20 74 68 65 20 74 77 6f 20 71 75 65 72 69  of the two queri
df10: 65 73 2e 20 20 74 68 65 20 71 75 65 72 79 20 6f  es.  the query o
df20: 6e 20 74 68 65 0a 2a 2a 20 6c 65 66 74 20 69 73  n the.** left is
df30: 20 70 2d 3e 70 50 72 69 6f 72 2e 20 20 54 68 65   p->pPrior.  The
df40: 20 6c 65 66 74 20 71 75 65 72 79 20 63 6f 75 6c   left query coul
df50: 64 20 61 6c 73 6f 20 62 65 20 61 20 63 6f 6d 70  d also be a comp
df60: 6f 75 6e 64 20 71 75 65 72 79 0a 2a 2a 20 69 6e  ound query.** in
df70: 20 77 68 69 63 68 20 63 61 73 65 20 74 68 69 73   which case this
df80: 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 62 65   routine will be
df90: 20 63 61 6c 6c 65 64 20 72 65 63 75 72 73 69 76   called recursiv
dfa0: 65 6c 79 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ely. .**.** The 
dfb0: 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 74  results of the t
dfc0: 6f 74 61 6c 20 71 75 65 72 79 20 61 72 65 20 74  otal query are t
dfd0: 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74  o be written int
dfe0: 6f 20 61 20 64 65 73 74 69 6e 61 74 69 6f 6e 0a  o a destination.
dff0: 2a 2a 20 6f 66 20 74 79 70 65 20 65 44 65 73 74  ** of type eDest
e000: 20 77 69 74 68 20 70 61 72 61 6d 65 74 65 72 20   with parameter 
e010: 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78 61  iParm..**.** Exa
e020: 6d 70 6c 65 20 31 3a 20 20 43 6f 6e 73 69 64 65  mple 1:  Conside
e030: 72 20 61 20 74 68 72 65 65 2d 77 61 79 20 63 6f  r a three-way co
e040: 6d 70 6f 75 6e 64 20 53 51 4c 20 73 74 61 74 65  mpound SQL state
e050: 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ment..**.**     
e060: 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31  SELECT a FROM t1
e070: 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 62 20   UNION SELECT b 
e080: 46 52 4f 4d 20 74 32 20 55 4e 49 4f 4e 20 53 45  FROM t2 UNION SE
e090: 4c 45 43 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a  LECT c FROM t3.*
e0a0: 2a 0a 2a 2a 20 54 68 69 73 20 73 74 61 74 65 6d  *.** This statem
e0b0: 65 6e 74 20 69 73 20 70 61 72 73 65 64 20 75 70  ent is parsed up
e0c0: 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
e0d0: 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 63 20  **     SELECT c 
e0e0: 46 52 4f 4d 20 74 33 0a 2a 2a 20 20 20 20 20 20  FROM t3.**      
e0f0: 7c 0a 2a 2a 20 20 20 20 20 20 60 2d 2d 2d 2d 2d  |.**      `-----
e100: 3e 20 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d  >  SELECT b FROM
e110: 20 74 32 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   t2.**          
e120: 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
e130: 20 20 20 20 20 20 20 20 20 20 60 2d 2d 2d 2d 2d            `-----
e140: 2d 3e 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f  ->  SELECT a FRO
e150: 4d 20 74 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61  M t1.**.** The a
e160: 72 72 6f 77 73 20 69 6e 20 74 68 65 20 64 69 61  rrows in the dia
e170: 67 72 61 6d 20 61 62 6f 76 65 20 72 65 70 72 65  gram above repre
e180: 73 65 6e 74 20 74 68 65 20 53 65 6c 65 63 74 2e  sent the Select.
e190: 70 50 72 69 6f 72 20 70 6f 69 6e 74 65 72 2e 0a  pPrior pointer..
e1a0: 2a 2a 20 53 6f 20 69 66 20 74 68 69 73 20 72 6f  ** So if this ro
e1b0: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
e1c0: 77 69 74 68 20 70 20 65 71 75 61 6c 20 74 6f 20  with p equal to 
e1d0: 74 68 65 20 74 33 20 71 75 65 72 79 2c 20 74 68  the t3 query, th
e1e0: 65 6e 0a 2a 2a 20 70 50 72 69 6f 72 20 77 69 6c  en.** pPrior wil
e1f0: 6c 20 62 65 20 74 68 65 20 74 32 20 71 75 65 72  l be the t2 quer
e200: 79 2e 20 20 70 2d 3e 6f 70 20 77 69 6c 6c 20 62  y.  p->op will b
e210: 65 20 54 4b 5f 55 4e 49 4f 4e 20 69 6e 20 74 68  e TK_UNION in th
e220: 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e  is case..**.** N
e230: 6f 74 69 63 65 20 74 68 61 74 20 62 65 63 61 75  otice that becau
e240: 73 65 20 6f 66 20 74 68 65 20 77 61 79 20 53 51  se of the way SQ
e250: 4c 69 74 65 20 70 61 72 73 65 73 20 63 6f 6d 70  Lite parses comp
e260: 6f 75 6e 64 20 53 45 4c 45 43 54 73 2c 20 74 68  ound SELECTs, th
e270: 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c 20  e.** individual 
e280: 73 65 6c 65 63 74 73 20 61 6c 77 61 79 73 20 67  selects always g
e290: 72 6f 75 70 20 66 72 6f 6d 20 6c 65 66 74 20 74  roup from left t
e2a0: 6f 20 72 69 67 68 74 2e 0a 2a 2f 0a 73 74 61 74  o right..*/.stat
e2b0: 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65  ic int multiSele
e2c0: 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ct(.  Parse *pPa
e2d0: 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  rse,        /* P
e2e0: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
e2f0: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
e300: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
e310: 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53   right-most of S
e320: 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f 64  ELECTs to be cod
e330: 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  ed */.  SelectDe
e340: 73 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a  st *pDest     /*
e350: 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68   What to do with
e360: 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a   query results *
e370: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
e380: 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 2f 2a 20  SQLITE_OK;   /* 
e390: 53 75 63 63 65 73 73 20 63 6f 64 65 20 66 72 6f  Success code fro
e3a0: 6d 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  m a subroutine *
e3b0: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69  /.  Select *pPri
e3c0: 6f 72 3b 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f  or;       /* Ano
e3d0: 74 68 65 72 20 53 45 4c 45 43 54 20 69 6d 6d 65  ther SELECT imme
e3e0: 64 69 61 74 65 6c 79 20 74 6f 20 6f 75 72 20 6c  diately to our l
e3f0: 65 66 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  eft */.  Vdbe *v
e400: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
e410: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
e420: 74 6f 20 74 68 69 73 20 56 44 42 45 20 2a 2f 0a  to this VDBE */.
e430: 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73    SelectDest des
e440: 74 3b 20 20 20 20 20 20 2f 2a 20 41 6c 74 65 72  t;      /* Alter
e450: 6e 61 74 69 76 65 20 64 61 74 61 20 64 65 73 74  native data dest
e460: 69 6e 61 74 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c  ination */.  Sel
e470: 65 63 74 20 2a 70 44 65 6c 65 74 65 20 3d 20 30  ect *pDelete = 0
e480: 3b 20 20 2f 2a 20 43 68 61 69 6e 20 6f 66 20 73  ;  /* Chain of s
e490: 69 6d 70 6c 65 20 73 65 6c 65 63 74 73 20 74 6f  imple selects to
e4a0: 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20 73 71 6c   delete */.  sql
e4b0: 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20  ite3 *db;       
e4c0: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
e4d0: 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 23 69 66  onnection */.#if
e4e0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
e4f0: 5f 45 58 50 4c 41 49 4e 0a 20 20 69 6e 74 20 69  _EXPLAIN.  int i
e500: 53 75 62 31 3b 20 20 20 20 20 20 20 20 20 20 20  Sub1;           
e510: 20 2f 2a 20 45 51 50 20 69 64 20 6f 66 20 6c 65   /* EQP id of le
e520: 66 74 2d 68 61 6e 64 20 71 75 65 72 79 20 2a 2f  ft-hand query */
e530: 0a 20 20 69 6e 74 20 69 53 75 62 32 3b 20 20 20  .  int iSub2;   
e540: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 51 50 20           /* EQP 
e550: 69 64 20 6f 66 20 72 69 67 68 74 2d 68 61 6e 64  id of right-hand
e560: 20 71 75 65 72 79 20 2a 2f 0a 23 65 6e 64 69 66   query */.#endif
e570: 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
e580: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 4f 52 44   there is no ORD
e590: 45 52 20 42 59 20 6f 72 20 4c 49 4d 49 54 20 63  ER BY or LIMIT c
e5a0: 6c 61 75 73 65 20 6f 6e 20 70 72 69 6f 72 20 53  lause on prior S
e5b0: 45 4c 45 43 54 73 2e 20 20 4f 6e 6c 79 0a 20 20  ELECTs.  Only.  
e5c0: 2a 2a 20 74 68 65 20 6c 61 73 74 20 28 72 69 67  ** the last (rig
e5d0: 68 74 2d 6d 6f 73 74 29 20 53 45 4c 45 43 54 20  ht-most) SELECT 
e5e0: 69 6e 20 74 68 65 20 73 65 72 69 65 73 20 6d 61  in the series ma
e5f0: 79 20 68 61 76 65 20 61 6e 20 4f 52 44 45 52 20  y have an ORDER 
e600: 42 59 20 6f 72 20 4c 49 4d 49 54 2e 0a 20 20 2a  BY or LIMIT..  *
e610: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 20 26 26  /.  assert( p &&
e620: 20 70 2d 3e 70 50 72 69 6f 72 20 29 3b 20 20 2f   p->pPrior );  /
e630: 2a 20 43 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  * Calling functi
e640: 6f 6e 20 67 75 61 72 61 6e 74 65 65 73 20 74 68  on guarantees th
e650: 69 73 20 6d 75 63 68 20 2a 2f 0a 20 20 64 62 20  is much */.  db 
e660: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
e670: 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69  pPrior = p->pPri
e680: 6f 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  or;.  assert( pP
e690: 72 69 6f 72 2d 3e 70 52 69 67 68 74 6d 6f 73 74  rior->pRightmost
e6a0: 21 3d 70 50 72 69 6f 72 20 29 3b 0a 20 20 61 73  !=pPrior );.  as
e6b0: 73 65 72 74 28 20 70 50 72 69 6f 72 2d 3e 70 52  sert( pPrior->pR
e6c0: 69 67 68 74 6d 6f 73 74 3d 3d 70 2d 3e 70 52 69  ightmost==p->pRi
e6d0: 67 68 74 6d 6f 73 74 20 29 3b 0a 20 20 64 65 73  ghtmost );.  des
e6e0: 74 20 3d 20 2a 70 44 65 73 74 3b 0a 20 20 69 66  t = *pDest;.  if
e6f0: 28 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72  ( pPrior->pOrder
e700: 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  By ){.    sqlite
e710: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
e720: 2c 22 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  ,"ORDER BY claus
e730: 65 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20 61 66  e should come af
e740: 74 65 72 20 25 73 20 6e 6f 74 20 62 65 66 6f 72  ter %s not befor
e750: 65 22 2c 0a 20 20 20 20 20 20 73 65 6c 65 63 74  e",.      select
e760: 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a  OpName(p->op));.
e770: 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
e780: 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
e790: 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 69 66 28  t_end;.  }.  if(
e7a0: 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20   pPrior->pLimit 
e7b0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
e7c0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22 4c  rorMsg(pParse,"L
e7d0: 49 4d 49 54 20 63 6c 61 75 73 65 20 73 68 6f 75  IMIT clause shou
e7e0: 6c 64 20 63 6f 6d 65 20 61 66 74 65 72 20 25 73  ld come after %s
e7f0: 20 6e 6f 74 20 62 65 66 6f 72 65 22 2c 0a 20 20   not before",.  
e800: 20 20 20 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65      selectOpName
e810: 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63  (p->op));.    rc
e820: 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d   = 1;.    goto m
e830: 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
e840: 0a 20 20 7d 0a 0a 20 20 76 20 3d 20 73 71 6c 69  .  }..  v = sqli
e850: 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
e860: 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21  e);.  assert( v!
e870: 3d 30 20 29 3b 20 20 2f 2a 20 54 68 65 20 56 44  =0 );  /* The VD
e880: 42 45 20 61 6c 72 65 61 64 79 20 63 72 65 61 74  BE already creat
e890: 65 64 20 62 79 20 63 61 6c 6c 69 6e 67 20 66 75  ed by calling fu
e8a0: 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20  nction */..  /* 
e8b0: 43 72 65 61 74 65 20 74 68 65 20 64 65 73 74 69  Create the desti
e8c0: 6e 61 74 69 6f 6e 20 74 65 6d 70 6f 72 61 72 79  nation temporary
e8d0: 20 74 61 62 6c 65 20 69 66 20 6e 65 63 65 73 73   table if necess
e8e0: 61 72 79 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64  ary.  */.  if( d
e8f0: 65 73 74 2e 65 44 65 73 74 3d 3d 53 52 54 5f 45  est.eDest==SRT_E
e900: 70 68 65 6d 54 61 62 20 29 7b 0a 20 20 20 20 61  phemTab ){.    a
e910: 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
e920: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   );.    sqlite3V
e930: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
e940: 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 64  OpenEphemeral, d
e950: 65 73 74 2e 69 53 44 50 61 72 6d 2c 20 70 2d 3e  est.iSDParm, p->
e960: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a  pEList->nExpr);.
e970: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
e980: 68 61 6e 67 65 50 35 28 76 2c 20 42 54 52 45 45  hangeP5(v, BTREE
e990: 5f 55 4e 4f 52 44 45 52 45 44 29 3b 0a 20 20 20  _UNORDERED);.   
e9a0: 20 64 65 73 74 2e 65 44 65 73 74 20 3d 20 53 52   dest.eDest = SR
e9b0: 54 5f 54 61 62 6c 65 3b 0a 20 20 7d 0a 0a 20 20  T_Table;.  }..  
e9c0: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c  /* Make sure all
e9d0: 20 53 45 4c 45 43 54 73 20 69 6e 20 74 68 65 20   SELECTs in the 
e9e0: 73 74 61 74 65 6d 65 6e 74 20 68 61 76 65 20 74  statement have t
e9f0: 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f  he same number o
ea00: 66 20 65 6c 65 6d 65 6e 74 73 0a 20 20 2a 2a 20  f elements.  ** 
ea10: 69 6e 20 74 68 65 69 72 20 72 65 73 75 6c 74 20  in their result 
ea20: 73 65 74 73 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  sets..  */.  ass
ea30: 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 26  ert( p->pEList &
ea40: 26 20 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74  & pPrior->pEList
ea50: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 45 4c   );.  if( p->pEL
ea60: 69 73 74 2d 3e 6e 45 78 70 72 21 3d 70 50 72 69  ist->nExpr!=pPri
ea70: 6f 72 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  or->pEList->nExp
ea80: 72 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  r ){.    if( p->
ea90: 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 56 61  selFlags & SF_Va
eaa0: 6c 75 65 73 20 29 7b 0a 20 20 20 20 20 20 73 71  lues ){.      sq
eab0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
eac0: 61 72 73 65 2c 20 22 61 6c 6c 20 56 41 4c 55 45  arse, "all VALUE
ead0: 53 20 6d 75 73 74 20 68 61 76 65 20 74 68 65 20  S must have the 
eae0: 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  same number of t
eaf0: 65 72 6d 73 22 29 3b 0a 20 20 20 20 7d 65 6c 73  erms");.    }els
eb00: 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
eb10: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
eb20: 20 22 53 45 4c 45 43 54 73 20 74 6f 20 74 68 65   "SELECTs to the
eb30: 20 6c 65 66 74 20 61 6e 64 20 72 69 67 68 74 20   left and right 
eb40: 6f 66 20 25 73 22 0a 20 20 20 20 20 20 20 20 22  of %s".        "
eb50: 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 68 65   do not have the
eb60: 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20   same number of 
eb70: 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 22 2c  result columns",
eb80: 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d   selectOpName(p-
eb90: 3e 6f 70 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  >op));.    }.   
eba0: 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74   rc = 1;.    got
ebb0: 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
ebc0: 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f  nd;.  }..  /* Co
ebd0: 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 73 20 74  mpound SELECTs t
ebe0: 68 61 74 20 68 61 76 65 20 61 6e 20 4f 52 44 45  hat have an ORDE
ebf0: 52 20 42 59 20 63 6c 61 75 73 65 20 61 72 65 20  R BY clause are 
ec00: 68 61 6e 64 6c 65 64 20 73 65 70 61 72 61 74 65  handled separate
ec10: 6c 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ly..  */.  if( p
ec20: 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ->pOrderBy ){.  
ec30: 20 20 72 65 74 75 72 6e 20 6d 75 6c 74 69 53 65    return multiSe
ec40: 6c 65 63 74 4f 72 64 65 72 42 79 28 70 50 61 72  lectOrderBy(pPar
ec50: 73 65 2c 20 70 2c 20 70 44 65 73 74 29 3b 0a 20  se, p, pDest);. 
ec60: 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74   }..  /* Generat
ec70: 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 6c  e code for the l
ec80: 65 66 74 20 61 6e 64 20 72 69 67 68 74 20 53 45  eft and right SE
ec90: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e  LECT statements.
eca0: 0a 20 20 2a 2f 0a 20 20 73 77 69 74 63 68 28 20  .  */.  switch( 
ecb0: 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  p->op ){.    cas
ecc0: 65 20 54 4b 5f 41 4c 4c 3a 20 7b 0a 20 20 20 20  e TK_ALL: {.    
ecd0: 20 20 69 6e 74 20 61 64 64 72 20 3d 20 30 3b 0a    int addr = 0;.
ece0: 20 20 20 20 20 20 69 6e 74 20 6e 4c 69 6d 69 74        int nLimit
ecf0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
ed00: 21 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20  !pPrior->pLimit 
ed10: 29 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72 2d  );.      pPrior-
ed20: 3e 69 4c 69 6d 69 74 20 3d 20 70 2d 3e 69 4c 69  >iLimit = p->iLi
ed30: 6d 69 74 3b 0a 20 20 20 20 20 20 70 50 72 69 6f  mit;.      pPrio
ed40: 72 2d 3e 69 4f 66 66 73 65 74 20 3d 20 70 2d 3e  r->iOffset = p->
ed50: 69 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70  iOffset;.      p
ed60: 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 3d 20  Prior->pLimit = 
ed70: 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20  p->pLimit;.     
ed80: 20 70 50 72 69 6f 72 2d 3e 70 4f 66 66 73 65 74   pPrior->pOffset
ed90: 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20   = p->pOffset;. 
eda0: 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49       explainSetI
edb0: 6e 74 65 67 65 72 28 69 53 75 62 31 2c 20 70 50  nteger(iSub1, pP
edc0: 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63  arse->iNextSelec
edd0: 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  tId);.      rc =
ede0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
edf0: 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26  Parse, pPrior, &
ee00: 64 65 73 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e  dest);.      p->
ee10: 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20  pLimit = 0;.    
ee20: 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30    p->pOffset = 0
ee30: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
ee40: 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d  {.        goto m
ee50: 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
ee60: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
ee70: 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20  ->pPrior = 0;.  
ee80: 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20      p->iLimit = 
ee90: 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 3b 0a  pPrior->iLimit;.
eea0: 20 20 20 20 20 20 70 2d 3e 69 4f 66 66 73 65 74        p->iOffset
eeb0: 20 3d 20 70 50 72 69 6f 72 2d 3e 69 4f 66 66 73   = pPrior->iOffs
eec0: 65 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  et;.      if( p-
eed0: 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20  >iLimit ){.     
eee0: 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
eef0: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
ef00: 50 5f 49 66 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69  P_IfZero, p->iLi
ef10: 6d 69 74 29 3b 0a 20 20 20 20 20 20 20 20 56 64  mit);.        Vd
ef20: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4a  beComment((v, "J
ef30: 75 6d 70 20 61 68 65 61 64 20 69 66 20 4c 49 4d  ump ahead if LIM
ef40: 49 54 20 72 65 61 63 68 65 64 22 29 29 3b 0a 20  IT reached"));. 
ef50: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 65 78 70       }.      exp
ef60: 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69  lainSetInteger(i
ef70: 53 75 62 32 2c 20 70 50 61 72 73 65 2d 3e 69 4e  Sub2, pParse->iN
ef80: 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20  extSelectId);.  
ef90: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
efa0: 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
efb0: 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20 20  , &dest);.      
efc0: 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51  testcase( rc!=SQ
efd0: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
efe0: 20 70 44 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50   pDelete = p->pP
eff0: 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70  rior;.      p->p
f000: 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a  Prior = pPrior;.
f010: 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74        p->nSelect
f020: 52 6f 77 20 2b 3d 20 70 50 72 69 6f 72 2d 3e 6e  Row += pPrior->n
f030: 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20 20  SelectRow;.     
f040: 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70 4c 69   if( pPrior->pLi
f050: 6d 69 74 0a 20 20 20 20 20 20 20 26 26 20 73 71  mit.       && sq
f060: 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67  lite3ExprIsInteg
f070: 65 72 28 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69  er(pPrior->pLimi
f080: 74 2c 20 26 6e 4c 69 6d 69 74 29 0a 20 20 20 20  t, &nLimit).    
f090: 20 20 20 26 26 20 6e 4c 69 6d 69 74 3e 30 20 26     && nLimit>0 &
f0a0: 26 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20  & p->nSelectRow 
f0b0: 3e 20 28 75 36 34 29 6e 4c 69 6d 69 74 20 0a 20  > (u64)nLimit . 
f0c0: 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
f0d0: 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20  p->nSelectRow = 
f0e0: 6e 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 7d 0a  nLimit;.      }.
f0f0: 20 20 20 20 20 20 69 66 28 20 61 64 64 72 20 29        if( addr )
f100: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
f110: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
f120: 20 61 64 64 72 29 3b 0a 20 20 20 20 20 20 7d 0a   addr);.      }.
f130: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
f140: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45   }.    case TK_E
f150: 58 43 45 50 54 3a 0a 20 20 20 20 63 61 73 65 20  XCEPT:.    case 
f160: 54 4b 5f 55 4e 49 4f 4e 3a 20 7b 0a 20 20 20 20  TK_UNION: {.    
f170: 20 20 69 6e 74 20 75 6e 69 6f 6e 54 61 62 3b 20    int unionTab; 
f180: 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d     /* Cursor num
f190: 62 65 72 20 6f 66 20 74 68 65 20 74 65 6d 70 6f  ber of the tempo
f1a0: 72 61 72 79 20 74 61 62 6c 65 20 68 6f 6c 64 69  rary table holdi
f1b0: 6e 67 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 20  ng result */.   
f1c0: 20 20 20 75 38 20 6f 70 20 3d 20 30 3b 20 20 20     u8 op = 0;   
f1d0: 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68      /* One of th
f1e0: 65 20 53 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e  e SRT_ operation
f1f0: 73 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 73 65  s to apply to se
f200: 6c 66 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  lf */.      int 
f210: 70 72 69 6f 72 4f 70 3b 20 20 20 20 20 2f 2a 20  priorOp;     /* 
f220: 54 68 65 20 53 52 54 5f 20 6f 70 65 72 61 74 69  The SRT_ operati
f230: 6f 6e 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 70  on to apply to p
f240: 72 69 6f 72 20 73 65 6c 65 63 74 73 20 2a 2f 0a  rior selects */.
f250: 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 69 6d        Expr *pLim
f260: 69 74 2c 20 2a 70 4f 66 66 73 65 74 3b 20 2f 2a  it, *pOffset; /*
f270: 20 53 61 76 65 64 20 76 61 6c 75 65 73 20 6f 66   Saved values of
f280: 20 70 2d 3e 6e 4c 69 6d 69 74 20 61 6e 64 20 70   p->nLimit and p
f290: 2d 3e 6e 4f 66 66 73 65 74 20 2a 2f 0a 20 20 20  ->nOffset */.   
f2a0: 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20     int addr;.   
f2b0: 20 20 20 53 65 6c 65 63 74 44 65 73 74 20 75 6e     SelectDest un
f2c0: 69 6f 6e 64 65 73 74 3b 0a 0a 20 20 20 20 20 20  iondest;..      
f2d0: 74 65 73 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d  testcase( p->op=
f2e0: 3d 54 4b 5f 45 58 43 45 50 54 20 29 3b 0a 20 20  =TK_EXCEPT );.  
f2f0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 2d      testcase( p-
f300: 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b  >op==TK_UNION );
f310: 0a 20 20 20 20 20 20 70 72 69 6f 72 4f 70 20 3d  .      priorOp =
f320: 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20   SRT_Union;.    
f330: 20 20 69 66 28 20 64 65 73 74 2e 65 44 65 73 74    if( dest.eDest
f340: 3d 3d 70 72 69 6f 72 4f 70 20 26 26 20 41 4c 57  ==priorOp && ALW
f350: 41 59 53 28 21 70 2d 3e 70 4c 69 6d 69 74 20 26  AYS(!p->pLimit &
f360: 26 21 70 2d 3e 70 4f 66 66 73 65 74 29 20 29 7b  &!p->pOffset) ){
f370: 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 63  .        /* We c
f380: 61 6e 20 72 65 75 73 65 20 61 20 74 65 6d 70 6f  an reuse a tempo
f390: 72 61 72 79 20 74 61 62 6c 65 20 67 65 6e 65 72  rary table gener
f3a0: 61 74 65 64 20 62 79 20 61 20 53 45 4c 45 43 54  ated by a SELECT
f3b0: 20 74 6f 20 6f 75 72 0a 20 20 20 20 20 20 20 20   to our.        
f3c0: 2a 2a 20 72 69 67 68 74 2e 0a 20 20 20 20 20 20  ** right..      
f3d0: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73    */.        ass
f3e0: 65 72 74 28 20 70 2d 3e 70 52 69 67 68 74 6d 6f  ert( p->pRightmo
f3f0: 73 74 21 3d 70 20 29 3b 20 20 2f 2a 20 43 61 6e  st!=p );  /* Can
f400: 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 66 6f 72   only happen for
f410: 20 6c 65 66 74 77 61 72 64 20 65 6c 65 6d 65 6e   leftward elemen
f420: 74 73 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ts.             
f430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f440: 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 61 20          ** of a 
f450: 33 2d 77 61 79 20 6f 72 20 6d 6f 72 65 20 63 6f  3-way or more co
f460: 6d 70 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20  mpound */.      
f470: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4c 69    assert( p->pLi
f480: 6d 69 74 3d 3d 30 20 29 3b 20 20 20 20 20 20 2f  mit==0 );      /
f490: 2a 20 4e 6f 74 20 61 6c 6c 6f 77 65 64 20 6f 6e  * Not allowed on
f4a0: 20 6c 65 66 74 77 61 72 64 20 65 6c 65 6d 65 6e   leftward elemen
f4b0: 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73  ts */.        as
f4c0: 73 65 72 74 28 20 70 2d 3e 70 4f 66 66 73 65 74  sert( p->pOffset
f4d0: 3d 3d 30 20 29 3b 20 20 20 20 20 2f 2a 20 4e 6f  ==0 );     /* No
f4e0: 74 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 6c 65 66  t allowed on lef
f4f0: 74 77 61 72 64 20 65 6c 65 6d 65 6e 74 73 20 2a  tward elements *
f500: 2f 0a 20 20 20 20 20 20 20 20 75 6e 69 6f 6e 54  /.        unionT
f510: 61 62 20 3d 20 64 65 73 74 2e 69 53 44 50 61 72  ab = dest.iSDPar
f520: 6d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  m;.      }else{.
f530: 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 77 69          /* We wi
f540: 6c 6c 20 6e 65 65 64 20 74 6f 20 63 72 65 61 74  ll need to creat
f550: 65 20 6f 75 72 20 6f 77 6e 20 74 65 6d 70 6f 72  e our own tempor
f560: 61 72 79 20 74 61 62 6c 65 20 74 6f 20 68 6f 6c  ary table to hol
f570: 64 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  d the.        **
f580: 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 72 65   intermediate re
f590: 73 75 6c 74 73 2e 0a 20 20 20 20 20 20 20 20 2a  sults..        *
f5a0: 2f 0a 20 20 20 20 20 20 20 20 75 6e 69 6f 6e 54  /.        unionT
f5b0: 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ab = pParse->nTa
f5c0: 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 61 73 73  b++;.        ass
f5d0: 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79  ert( p->pOrderBy
f5e0: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61  ==0 );.        a
f5f0: 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
f600: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70  eAddOp2(v, OP_Op
f610: 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 75 6e 69  enEphemeral, uni
f620: 6f 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20  onTab, 0);.     
f630: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64     assert( p->ad
f640: 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d  drOpenEphm[0] ==
f650: 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 70   -1 );.        p
f660: 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30  ->addrOpenEphm[0
f670: 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20  ] = addr;.      
f680: 20 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 2d    p->pRightmost-
f690: 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f  >selFlags |= SF_
f6a0: 55 73 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20  UsesEphemeral;. 
f6b0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
f6c0: 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20  ->pEList );.    
f6d0: 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f    }..      /* Co
f6e0: 64 65 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  de the SELECT st
f6f0: 61 74 65 6d 65 6e 74 73 20 74 6f 20 6f 75 72 20  atements to our 
f700: 6c 65 66 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20  left.      */.  
f710: 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50 72      assert( !pPr
f720: 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 29 3b  ior->pOrderBy );
f730: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65  .      sqlite3Se
f740: 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 75 6e  lectDestInit(&un
f750: 69 6f 6e 64 65 73 74 2c 20 70 72 69 6f 72 4f 70  iondest, priorOp
f760: 2c 20 75 6e 69 6f 6e 54 61 62 29 3b 0a 20 20 20  , unionTab);.   
f770: 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74     explainSetInt
f780: 65 67 65 72 28 69 53 75 62 31 2c 20 70 50 61 72  eger(iSub1, pPar
f790: 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49  se->iNextSelectI
f7a0: 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  d);.      rc = s
f7b0: 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
f7c0: 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 75 6e  rse, pPrior, &un
f7d0: 69 6f 6e 64 65 73 74 29 3b 0a 20 20 20 20 20 20  iondest);.      
f7e0: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
f7f0: 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
f800: 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d  ect_end;.      }
f810: 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20  ..      /* Code 
f820: 74 68 65 20 63 75 72 72 65 6e 74 20 53 45 4c 45  the current SELE
f830: 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 20  CT statement.   
f840: 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
f850: 70 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54  p->op==TK_EXCEPT
f860: 20 29 7b 0a 20 20 20 20 20 20 20 20 6f 70 20 3d   ){.        op =
f870: 20 53 52 54 5f 45 78 63 65 70 74 3b 0a 20 20 20   SRT_Except;.   
f880: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
f890: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 3d    assert( p->op=
f8a0: 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 20  =TK_UNION );.   
f8b0: 20 20 20 20 20 6f 70 20 3d 20 53 52 54 5f 55 6e       op = SRT_Un
f8c0: 69 6f 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ion;.      }.   
f8d0: 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30     p->pPrior = 0
f8e0: 3b 0a 20 20 20 20 20 20 70 4c 69 6d 69 74 20 3d  ;.      pLimit =
f8f0: 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20   p->pLimit;.    
f900: 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b    p->pLimit = 0;
f910: 0a 20 20 20 20 20 20 70 4f 66 66 73 65 74 20 3d  .      pOffset =
f920: 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20   p->pOffset;.   
f930: 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20     p->pOffset = 
f940: 30 3b 0a 20 20 20 20 20 20 75 6e 69 6f 6e 64 65  0;.      unionde
f950: 73 74 2e 65 44 65 73 74 20 3d 20 6f 70 3b 0a 20  st.eDest = op;. 
f960: 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49       explainSetI
f970: 6e 74 65 67 65 72 28 69 53 75 62 32 2c 20 70 50  nteger(iSub2, pP
f980: 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63  arse->iNextSelec
f990: 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  tId);.      rc =
f9a0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
f9b0: 50 61 72 73 65 2c 20 70 2c 20 26 75 6e 69 6f 6e  Parse, p, &union
f9c0: 64 65 73 74 29 3b 0a 20 20 20 20 20 20 74 65 73  dest);.      tes
f9d0: 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54  tcase( rc!=SQLIT
f9e0: 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 2f 2a  E_OK );.      /*
f9f0: 20 51 75 65 72 79 20 66 6c 61 74 74 65 6e 69 6e   Query flattenin
fa00: 67 20 69 6e 20 73 71 6c 69 74 65 33 53 65 6c 65  g in sqlite3Sele
fa10: 63 74 28 29 20 6d 69 67 68 74 20 72 65 66 69 6c  ct() might refil
fa20: 6c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2e 0a 20  l p->pOrderBy.. 
fa30: 20 20 20 20 20 2a 2a 20 42 65 20 73 75 72 65 20       ** Be sure 
fa40: 74 6f 20 64 65 6c 65 74 65 20 70 2d 3e 70 4f 72  to delete p->pOr
fa50: 64 65 72 42 79 2c 20 74 68 65 72 65 66 6f 72 65  derBy, therefore
fa60: 2c 20 74 6f 20 61 76 6f 69 64 20 61 20 6d 65 6d  , to avoid a mem
fa70: 6f 72 79 20 6c 65 61 6b 2e 20 2a 2f 0a 20 20 20  ory leak. */.   
fa80: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
fa90: 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  stDelete(db, p->
faa0: 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 20  pOrderBy);.     
fab0: 20 70 44 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50   pDelete = p->pP
fac0: 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70  rior;.      p->p
fad0: 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a  Prior = pPrior;.
fae0: 20 20 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42        p->pOrderB
faf0: 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28  y = 0;.      if(
fb00: 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e   p->op==TK_UNION
fb10: 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77   ) p->nSelectRow
fb20: 20 2b 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c   += pPrior->nSel
fb30: 65 63 74 52 6f 77 3b 0a 20 20 20 20 20 20 73 71  ectRow;.      sq
fb40: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
fb50: 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a  db, p->pLimit);.
fb60: 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20        p->pLimit 
fb70: 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  = pLimit;.      
fb80: 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f 66  p->pOffset = pOf
fb90: 66 73 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e 69  fset;.      p->i
fba0: 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20  Limit = 0;.     
fbb0: 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b   p->iOffset = 0;
fbc0: 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 6e 76 65  ..      /* Conve
fbd0: 72 74 20 74 68 65 20 64 61 74 61 20 69 6e 20 74  rt the data in t
fbe0: 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  he temporary tab
fbf0: 6c 65 20 69 6e 74 6f 20 77 68 61 74 65 76 65 72  le into whatever
fc00: 20 66 6f 72 6d 0a 20 20 20 20 20 20 2a 2a 20 69   form.      ** i
fc10: 74 20 69 73 20 74 68 61 74 20 77 65 20 63 75 72  t is that we cur
fc20: 72 65 6e 74 6c 79 20 6e 65 65 64 2e 0a 20 20 20  rently need..   
fc30: 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65     */.      asse
fc40: 72 74 28 20 75 6e 69 6f 6e 54 61 62 3d 3d 64 65  rt( unionTab==de
fc50: 73 74 2e 69 53 44 50 61 72 6d 20 7c 7c 20 64 65  st.iSDParm || de
fc60: 73 74 2e 65 44 65 73 74 21 3d 70 72 69 6f 72 4f  st.eDest!=priorO
fc70: 70 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64  p );.      if( d
fc80: 65 73 74 2e 65 44 65 73 74 21 3d 70 72 69 6f 72  est.eDest!=prior
fc90: 4f 70 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  Op ){.        in
fca0: 74 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c  t iCont, iBreak,
fcb0: 20 69 53 74 61 72 74 3b 0a 20 20 20 20 20 20 20   iStart;.       
fcc0: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69   assert( p->pELi
fcd0: 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  st );.        if
fce0: 28 20 64 65 73 74 2e 65 44 65 73 74 3d 3d 53 52  ( dest.eDest==SR
fcf0: 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20  T_Output ){.    
fd00: 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 46        Select *pF
fd10: 69 72 73 74 20 3d 20 70 3b 0a 20 20 20 20 20 20  irst = p;.      
fd20: 20 20 20 20 77 68 69 6c 65 28 20 70 46 69 72 73      while( pFirs
fd30: 74 2d 3e 70 50 72 69 6f 72 20 29 20 70 46 69 72  t->pPrior ) pFir
fd40: 73 74 20 3d 20 70 46 69 72 73 74 2d 3e 70 50 72  st = pFirst->pPr
fd50: 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 20 20 67  ior;.          g
fd60: 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d  enerateColumnNam
fd70: 65 73 28 70 50 61 72 73 65 2c 20 30 2c 20 70 46  es(pParse, 0, pF
fd80: 69 72 73 74 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  irst->pEList);. 
fd90: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
fda0: 20 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65   iBreak = sqlite
fdb0: 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
fdc0: 29 3b 0a 20 20 20 20 20 20 20 20 69 43 6f 6e 74  );.        iCont
fdd0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
fde0: 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
fdf0: 20 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74      computeLimit
fe00: 52 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65  Registers(pParse
fe10: 2c 20 70 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20  , p, iBreak);.  
fe20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
fe30: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65  eAddOp2(v, OP_Re
fe40: 77 69 6e 64 2c 20 75 6e 69 6f 6e 54 61 62 2c 20  wind, unionTab, 
fe50: 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20  iBreak);.       
fe60: 20 69 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65   iStart = sqlite
fe70: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
fe80: 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73 65 6c  (v);.        sel
fe90: 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61  ectInnerLoop(pPa
fea0: 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73  rse, p, p->pELis
feb0: 74 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 70 2d 3e  t, unionTab, p->
fec0: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 0a 20  pEList->nExpr,. 
fed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fee0: 20 20 20 20 20 20 20 30 2c 20 30 2c 20 26 64 65         0, 0, &de
fef0: 73 74 2c 20 69 43 6f 6e 74 2c 20 69 42 72 65 61  st, iCont, iBrea
ff00: 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  k);.        sqli
ff10: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
ff20: 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20  bel(v, iCont);. 
ff30: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
ff40: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
ff50: 65 78 74 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69  ext, unionTab, i
ff60: 53 74 61 72 74 29 3b 0a 20 20 20 20 20 20 20 20  Start);.        
ff70: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
ff80: 76 65 4c 61 62 65 6c 28 76 2c 20 69 42 72 65 61  veLabel(v, iBrea
ff90: 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  k);.        sqli
ffa0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
ffb0: 20 4f 50 5f 43 6c 6f 73 65 2c 20 75 6e 69 6f 6e   OP_Close, union
ffc0: 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  Tab, 0);.      }
ffd0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
ffe0: 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a    }.    default:
fff0: 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 3d 3d   assert( p->op==
10000 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 29 3b 20  TK_INTERSECT ); 
10010 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 61 62 31  {.      int tab1
10020 2c 20 74 61 62 32 3b 0a 20 20 20 20 20 20 69 6e  , tab2;.      in
10030 74 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c  t iCont, iBreak,
10040 20 69 53 74 61 72 74 3b 0a 20 20 20 20 20 20 45   iStart;.      E
10050 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f  xpr *pLimit, *pO
10060 66 66 73 65 74 3b 0a 20 20 20 20 20 20 69 6e 74  ffset;.      int
10070 20 61 64 64 72 3b 0a 20 20 20 20 20 20 53 65 6c   addr;.      Sel
10080 65 63 74 44 65 73 74 20 69 6e 74 65 72 73 65 63  ectDest intersec
10090 74 64 65 73 74 3b 0a 20 20 20 20 20 20 69 6e 74  tdest;.      int
100a0 20 72 31 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49   r1;..      /* I
100b0 4e 54 45 52 53 45 43 54 20 69 73 20 64 69 66 66  NTERSECT is diff
100c0 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 6f  erent from the o
100d0 74 68 65 72 73 20 73 69 6e 63 65 20 69 74 20 72  thers since it r
100e0 65 71 75 69 72 65 73 0a 20 20 20 20 20 20 2a 2a  equires.      **
100f0 20 74 77 6f 20 74 65 6d 70 6f 72 61 72 79 20 74   two temporary t
10100 61 62 6c 65 73 2e 20 20 48 65 6e 63 65 20 69 74  ables.  Hence it
10110 20 68 61 73 20 69 74 73 20 6f 77 6e 20 63 61 73   has its own cas
10120 65 2e 20 20 42 65 67 69 6e 0a 20 20 20 20 20 20  e.  Begin.      
10130 2a 2a 20 62 79 20 61 6c 6c 6f 63 61 74 69 6e 67  ** by allocating
10140 20 74 68 65 20 74 61 62 6c 65 73 20 77 65 20 77   the tables we w
10150 69 6c 6c 20 6e 65 65 64 2e 0a 20 20 20 20 20 20  ill need..      
10160 2a 2f 0a 20 20 20 20 20 20 74 61 62 31 20 3d 20  */.      tab1 = 
10170 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
10180 20 20 20 20 20 20 74 61 62 32 20 3d 20 70 50 61        tab2 = pPa
10190 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
101a0 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f     assert( p->pO
101b0 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 0a 20 20  rderBy==0 );..  
101c0 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
101d0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
101e0 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
101f0 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20 20 20 20  , tab1, 0);.    
10200 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64    assert( p->add
10210 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20  rOpenEphm[0] == 
10220 2d 31 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61  -1 );.      p->a
10230 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d  ddrOpenEphm[0] =
10240 20 61 64 64 72 3b 0a 20 20 20 20 20 20 70 2d 3e   addr;.      p->
10250 70 52 69 67 68 74 6d 6f 73 74 2d 3e 73 65 6c 46  pRightmost->selF
10260 6c 61 67 73 20 7c 3d 20 53 46 5f 55 73 65 73 45  lags |= SF_UsesE
10270 70 68 65 6d 65 72 61 6c 3b 0a 20 20 20 20 20 20  phemeral;.      
10280 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73  assert( p->pELis
10290 74 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43  t );..      /* C
102a0 6f 64 65 20 74 68 65 20 53 45 4c 45 43 54 73 20  ode the SELECTs 
102b0 74 6f 20 6f 75 72 20 6c 65 66 74 20 69 6e 74 6f  to our left into
102c0 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
102d0 20 22 74 61 62 31 22 2e 0a 20 20 20 20 20 20 2a   "tab1"..      *
102e0 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  /.      sqlite3S
102f0 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 69  electDestInit(&i
10300 6e 74 65 72 73 65 63 74 64 65 73 74 2c 20 53 52  ntersectdest, SR
10310 54 5f 55 6e 69 6f 6e 2c 20 74 61 62 31 29 3b 0a  T_Union, tab1);.
10320 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74        explainSet
10330 49 6e 74 65 67 65 72 28 69 53 75 62 31 2c 20 70  Integer(iSub1, p
10340 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65  Parse->iNextSele
10350 63 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20  ctId);.      rc 
10360 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  = sqlite3Select(
10370 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20  pParse, pPrior, 
10380 26 69 6e 74 65 72 73 65 63 74 64 65 73 74 29 3b  &intersectdest);
10390 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
103a0 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75  .        goto mu
103b0 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
103c0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
103d0 2a 20 43 6f 64 65 20 74 68 65 20 63 75 72 72 65  * Code the curre
103e0 6e 74 20 53 45 4c 45 43 54 20 69 6e 74 6f 20 74  nt SELECT into t
103f0 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 22  emporary table "
10400 74 61 62 32 22 0a 20 20 20 20 20 20 2a 2f 0a 20  tab2".      */. 
10410 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69       addr = sqli
10420 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
10430 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
10440 6c 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20 20 20  l, tab2, 0);.   
10450 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64     assert( p->ad
10460 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 3d  drOpenEphm[1] ==
10470 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e   -1 );.      p->
10480 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20  addrOpenEphm[1] 
10490 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20 70 2d  = addr;.      p-
104a0 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20  >pPrior = 0;.   
104b0 20 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70     pLimit = p->p
104c0 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e  Limit;.      p->
104d0 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20  pLimit = 0;.    
104e0 20 20 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70    pOffset = p->p
104f0 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70 2d  Offset;.      p-
10500 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20  >pOffset = 0;.  
10510 20 20 20 20 69 6e 74 65 72 73 65 63 74 64 65 73      intersectdes
10520 74 2e 69 53 44 50 61 72 6d 20 3d 20 74 61 62 32  t.iSDParm = tab2
10530 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53  ;.      explainS
10540 65 74 49 6e 74 65 67 65 72 28 69 53 75 62 32 2c  etInteger(iSub2,
10550 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65   pParse->iNextSe
10560 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 72  lectId);.      r
10570 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  c = sqlite3Selec
10580 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26 69 6e  t(pParse, p, &in
10590 74 65 72 73 65 63 74 64 65 73 74 29 3b 0a 20 20  tersectdest);.  
105a0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
105b0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
105c0 20 20 20 20 20 70 44 65 6c 65 74 65 20 3d 20 70       pDelete = p
105d0 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20  ->pPrior;.      
105e0 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69  p->pPrior = pPri
105f0 6f 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  or;.      if( p-
10600 3e 6e 53 65 6c 65 63 74 52 6f 77 3e 70 50 72 69  >nSelectRow>pPri
10610 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 29  or->nSelectRow )
10620 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d   p->nSelectRow =
10630 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74   pPrior->nSelect
10640 52 6f 77 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Row;.      sqlit
10650 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
10660 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20   p->pLimit);.   
10670 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70     p->pLimit = p
10680 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e  Limit;.      p->
10690 70 4f 66 66 73 65 74 20 3d 20 70 4f 66 66 73 65  pOffset = pOffse
106a0 74 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e  t;..      /* Gen
106b0 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 74 61  erate code to ta
106c0 6b 65 20 74 68 65 20 69 6e 74 65 72 73 65 63 74  ke the intersect
106d0 69 6f 6e 20 6f 66 20 74 68 65 20 74 77 6f 20 74  ion of the two t
106e0 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 20 20 2a  emporary.      *
106f0 2a 20 74 61 62 6c 65 73 2e 0a 20 20 20 20 20 20  * tables..      
10700 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
10710 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20   p->pEList );.  
10720 20 20 20 20 69 66 28 20 64 65 73 74 2e 65 44 65      if( dest.eDe
10730 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29  st==SRT_Output )
10740 7b 0a 20 20 20 20 20 20 20 20 53 65 6c 65 63 74  {.        Select
10750 20 2a 70 46 69 72 73 74 20 3d 20 70 3b 0a 20 20   *pFirst = p;.  
10760 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 46 69        while( pFi
10770 72 73 74 2d 3e 70 50 72 69 6f 72 20 29 20 70 46  rst->pPrior ) pF
10780 69 72 73 74 20 3d 20 70 46 69 72 73 74 2d 3e 70  irst = pFirst->p
10790 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 67  Prior;.        g
107a0 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d  enerateColumnNam
107b0 65 73 28 70 50 61 72 73 65 2c 20 30 2c 20 70 46  es(pParse, 0, pF
107c0 69 72 73 74 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  irst->pEList);. 
107d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 42 72       }.      iBr
107e0 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62  eak = sqlite3Vdb
107f0 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
10800 20 20 20 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c       iCont = sql
10810 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
10820 6c 28 76 29 3b 0a 20 20 20 20 20 20 63 6f 6d 70  l(v);.      comp
10830 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72  uteLimitRegister
10840 73 28 70 50 61 72 73 65 2c 20 70 2c 20 69 42 72  s(pParse, p, iBr
10850 65 61 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  eak);.      sqli
10860 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
10870 20 4f 50 5f 52 65 77 69 6e 64 2c 20 74 61 62 31   OP_Rewind, tab1
10880 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20  , iBreak);.     
10890 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
108a0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
108b0 0a 20 20 20 20 20 20 69 53 74 61 72 74 20 3d 20  .      iStart = 
108c0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
108d0 32 28 76 2c 20 4f 50 5f 52 6f 77 4b 65 79 2c 20  2(v, OP_RowKey, 
108e0 74 61 62 31 2c 20 72 31 29 3b 0a 20 20 20 20 20  tab1, r1);.     
108f0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10900 70 34 49 6e 74 28 76 2c 20 4f 50 5f 4e 6f 74 46  p4Int(v, OP_NotF
10910 6f 75 6e 64 2c 20 74 61 62 32 2c 20 69 43 6f 6e  ound, tab2, iCon
10920 74 2c 20 72 31 2c 20 30 29 3b 0a 20 20 20 20 20  t, r1, 0);.     
10930 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
10940 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
10950 31 29 3b 0a 20 20 20 20 20 20 73 65 6c 65 63 74  1);.      select
10960 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65  InnerLoop(pParse
10970 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20  , p, p->pEList, 
10980 74 61 62 31 2c 20 70 2d 3e 70 45 4c 69 73 74 2d  tab1, p->pEList-
10990 3e 6e 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20  >nExpr,.        
109a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c                0,
109b0 20 30 2c 20 26 64 65 73 74 2c 20 69 43 6f 6e 74   0, &dest, iCont
109c0 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20  , iBreak);.     
109d0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
109e0 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e  lveLabel(v, iCon
109f0 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
10a00 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
10a10 50 5f 4e 65 78 74 2c 20 74 61 62 31 2c 20 69 53  P_Next, tab1, iS
10a20 74 61 72 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  tart);.      sql
10a30 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
10a40 61 62 65 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b  abel(v, iBreak);
10a50 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
10a60 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43  beAddOp2(v, OP_C
10a70 6c 6f 73 65 2c 20 74 61 62 32 2c 20 30 29 3b 0a  lose, tab2, 0);.
10a80 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
10a90 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c  eAddOp2(v, OP_Cl
10aa0 6f 73 65 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20  ose, tab1, 0);. 
10ab0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
10ac0 7d 0a 20 20 7d 0a 0a 20 20 65 78 70 6c 61 69 6e  }.  }..  explain
10ad0 43 6f 6d 70 6f 73 69 74 65 28 70 50 61 72 73 65  Composite(pParse
10ae0 2c 20 70 2d 3e 6f 70 2c 20 69 53 75 62 31 2c 20  , p->op, iSub1, 
10af0 69 53 75 62 32 2c 20 70 2d 3e 6f 70 21 3d 54 4b  iSub2, p->op!=TK
10b00 5f 41 4c 4c 29 3b 0a 0a 20 20 2f 2a 20 43 6f 6d  _ALL);..  /* Com
10b10 70 75 74 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73  pute collating s
10b20 65 71 75 65 6e 63 65 73 20 75 73 65 64 20 62 79  equences used by
10b30 20 0a 20 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79   .  ** temporary
10b40 20 74 61 62 6c 65 73 20 6e 65 65 64 65 64 20 74   tables needed t
10b50 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  o implement the 
10b60 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e  compound select.
10b70 0a 20 20 2a 2a 20 41 74 74 61 63 68 20 74 68 65  .  ** Attach the
10b80 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75   KeyInfo structu
10b90 72 65 20 74 6f 20 61 6c 6c 20 74 65 6d 70 6f 72  re to all tempor
10ba0 61 72 79 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a  ary tables..  **
10bb0 0a 20 20 2a 2a 20 54 68 69 73 20 73 65 63 74 69  .  ** This secti
10bc0 6f 6e 20 69 73 20 72 75 6e 20 62 79 20 74 68 65  on is run by the
10bd0 20 72 69 67 68 74 2d 6d 6f 73 74 20 53 45 4c 45   right-most SELE
10be0 43 54 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 6c  CT statement onl
10bf0 79 2e 0a 20 20 2a 2a 20 53 45 4c 45 43 54 20 73  y..  ** SELECT s
10c00 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 74 68 65  tatements to the
10c10 20 6c 65 66 74 20 61 6c 77 61 79 73 20 73 6b 69   left always ski
10c20 70 20 74 68 69 73 20 70 61 72 74 2e 20 20 54 68  p this part.  Th
10c30 65 20 72 69 67 68 74 2d 6d 6f 73 74 0a 20 20 2a  e right-most.  *
10c40 2a 20 53 45 4c 45 43 54 20 6d 69 67 68 74 20 61  * SELECT might a
10c50 6c 73 6f 20 73 6b 69 70 20 74 68 69 73 20 70 61  lso skip this pa
10c60 72 74 20 69 66 20 69 74 20 68 61 73 20 6e 6f 20  rt if it has no 
10c70 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
10c80 61 6e 64 0a 20 20 2a 2a 20 6e 6f 20 74 65 6d 70  and.  ** no temp
10c90 20 74 61 62 6c 65 73 20 61 72 65 20 72 65 71 75   tables are requ
10ca0 69 72 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ired..  */.  if(
10cb0 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53   p->selFlags & S
10cc0 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c 20  F_UsesEphemeral 
10cd0 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 20 20 20  ){.    int i;   
10ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10cf0 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
10d00 6e 74 65 72 20 2a 2f 0a 20 20 20 20 4b 65 79 49  nter */.    KeyI
10d10 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 20 20  nfo *pKeyInfo;  
10d20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
10d30 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
10d40 66 6f 72 20 74 68 65 20 72 65 73 75 6c 74 20 73  for the result s
10d50 65 74 20 2a 2f 0a 20 20 20 20 53 65 6c 65 63 74  et */.    Select
10d60 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20   *pLoop;        
10d70 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c          /* For l
10d80 6f 6f 70 69 6e 67 20 74 68 72 6f 75 67 68 20 53  ooping through S
10d90 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73  ELECT statements
10da0 20 2a 2f 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20   */.    CollSeq 
10db0 2a 2a 61 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20  **apColl;       
10dc0 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f        /* For loo
10dd0 70 69 6e 67 20 74 68 72 6f 75 67 68 20 70 4b 65  ping through pKe
10de0 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 5d 20 2a  yInfo->aColl[] *
10df0 2f 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 20  /.    int nCol; 
10e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e10 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
10e20 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 72 65 73 75   columns in resu
10e30 6c 74 20 73 65 74 20 2a 2f 0a 0a 20 20 20 20 61  lt set */..    a
10e40 73 73 65 72 74 28 20 70 2d 3e 70 52 69 67 68 74  ssert( p->pRight
10e50 6d 6f 73 74 3d 3d 70 20 29 3b 0a 20 20 20 20 6e  most==p );.    n
10e60 43 6f 6c 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d  Col = p->pEList-
10e70 3e 6e 45 78 70 72 3b 0a 20 20 20 20 70 4b 65 79  >nExpr;.    pKey
10e80 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65  Info = sqlite3Ke
10e90 79 49 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e  yInfoAlloc(db, n
10ea0 43 6f 6c 2c 20 31 29 3b 0a 20 20 20 20 69 66 28  Col, 1);.    if(
10eb0 20 21 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20   !pKeyInfo ){.  
10ec0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
10ed0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74  NOMEM;.      got
10ee0 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
10ef0 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  nd;.    }.    fo
10f00 72 28 69 3d 30 2c 20 61 70 43 6f 6c 6c 3d 70 4b  r(i=0, apColl=pK
10f10 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 3b 20 69  eyInfo->aColl; i
10f20 3c 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 61 70 43 6f  <nCol; i++, apCo
10f30 6c 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 2a 61 70  ll++){.      *ap
10f40 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69 53 65 6c 65  Coll = multiSele
10f50 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  ctCollSeq(pParse
10f60 2c 20 70 2c 20 69 29 3b 0a 20 20 20 20 20 20 69  , p, i);.      i
10f70 66 28 20 30 3d 3d 2a 61 70 43 6f 6c 6c 20 29 7b  f( 0==*apColl ){
10f80 0a 20 20 20 20 20 20 20 20 2a 61 70 43 6f 6c 6c  .        *apColl
10f90 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c   = db->pDfltColl
10fa0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
10fb0 0a 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70  .    for(pLoop=p
10fc0 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70  ; pLoop; pLoop=p
10fd0 4c 6f 6f 70 2d 3e 70 50 72 69 6f 72 29 7b 0a 20  Loop->pPrior){. 
10fe0 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
10ff0 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  2; i++){.       
11000 20 69 6e 74 20 61 64 64 72 20 3d 20 70 4c 6f 6f   int addr = pLoo
11010 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
11020 69 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  i];.        if( 
11030 61 64 64 72 3c 30 20 29 7b 0a 20 20 20 20 20 20  addr<0 ){.      
11040 20 20 20 20 2f 2a 20 49 66 20 5b 30 5d 20 69 73      /* If [0] is
11050 20 75 6e 75 73 65 64 20 74 68 65 6e 20 5b 31 5d   unused then [1]
11060 20 69 73 20 61 6c 73 6f 20 75 6e 75 73 65 64 2e   is also unused.
11070 20 20 53 6f 20 77 65 20 63 61 6e 0a 20 20 20 20    So we can.    
11080 20 20 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20        ** always 
11090 73 61 66 65 6c 79 20 61 62 6f 72 74 20 61 73 20  safely abort as 
110a0 73 6f 6f 6e 20 61 73 20 74 68 65 20 66 69 72 73  soon as the firs
110b0 74 20 75 6e 75 73 65 64 20 73 6c 6f 74 20 69 73  t unused slot is
110c0 20 66 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20   found */.      
110d0 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 6f      assert( pLoo
110e0 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
110f0 31 5d 3c 30 20 29 3b 0a 20 20 20 20 20 20 20 20  1]<0 );.        
11100 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
11110 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
11120 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 76  e3VdbeChangeP2(v
11130 2c 20 61 64 64 72 2c 20 6e 43 6f 6c 29 3b 0a 20  , addr, nCol);. 
11140 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
11150 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 61 64  beChangeP4(v, ad
11160 64 72 2c 20 28 63 68 61 72 2a 29 73 71 6c 69 74  dr, (char*)sqlit
11170 65 33 4b 65 79 49 6e 66 6f 52 65 66 28 70 4b 65  e3KeyInfoRef(pKe
11180 79 49 6e 66 6f 29 2c 0a 20 20 20 20 20 20 20 20  yInfo),.        
11190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
111a0 20 20 20 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b      P4_KEYINFO);
111b0 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e  .        pLoop->
111c0 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 69 5d 20  addrOpenEphm[i] 
111d0 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  = -1;.      }.  
111e0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 4b    }.    sqlite3K
111f0 65 79 49 6e 66 6f 55 6e 72 65 66 28 70 4b 65 79  eyInfoUnref(pKey
11200 49 6e 66 6f 29 3b 0a 20 20 7d 0a 0a 6d 75 6c 74  Info);.  }..mult
11210 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 20 20  i_select_end:.  
11220 70 44 65 73 74 2d 3e 69 53 64 73 74 20 3d 20 64  pDest->iSdst = d
11230 65 73 74 2e 69 53 64 73 74 3b 0a 20 20 70 44 65  est.iSdst;.  pDe
11240 73 74 2d 3e 6e 53 64 73 74 20 3d 20 64 65 73 74  st->nSdst = dest
11250 2e 6e 53 64 73 74 3b 0a 20 20 73 71 6c 69 74 65  .nSdst;.  sqlite
11260 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
11270 2c 20 70 44 65 6c 65 74 65 29 3b 0a 20 20 72 65  , pDelete);.  re
11280 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  turn rc;.}.#endi
11290 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
112a0 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
112b0 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20   */../*.** Code 
112c0 61 6e 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75  an output subrou
112d0 74 69 6e 65 20 66 6f 72 20 61 20 63 6f 72 6f 75  tine for a corou
112e0 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  tine implementat
112f0 69 6f 6e 20 6f 66 20 61 0a 2a 2a 20 53 45 4c 45  ion of a.** SELE
11300 43 54 20 73 74 61 74 6d 65 6e 74 2e 0a 2a 2a 0a  CT statment..**.
11310 2a 2a 20 54 68 65 20 64 61 74 61 20 74 6f 20 62  ** The data to b
11320 65 20 6f 75 74 70 75 74 20 69 73 20 63 6f 6e 74  e output is cont
11330 61 69 6e 65 64 20 69 6e 20 70 49 6e 2d 3e 69 53  ained in pIn->iS
11340 64 73 74 2e 20 20 54 68 65 72 65 20 61 72 65 0a  dst.  There are.
11350 2a 2a 20 70 49 6e 2d 3e 6e 53 64 73 74 20 63 6f  ** pIn->nSdst co
11360 6c 75 6d 6e 73 20 74 6f 20 62 65 20 6f 75 74 70  lumns to be outp
11370 75 74 2e 20 20 70 44 65 73 74 20 69 73 20 77 68  ut.  pDest is wh
11380 65 72 65 20 74 68 65 20 6f 75 74 70 75 74 20 73  ere the output s
11390 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 73 65 6e 74  hould.** be sent
113a0 2e 0a 2a 2a 0a 2a 2a 20 72 65 67 52 65 74 75 72  ..**.** regRetur
113b0 6e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  n is the number 
113c0 6f 66 20 74 68 65 20 72 65 67 69 73 74 65 72 20  of the register 
113d0 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 75 62 72  holding the subr
113e0 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e  outine.** return
113f0 20 61 64 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20   address..**.** 
11400 49 66 20 72 65 67 50 72 65 76 3e 30 20 74 68 65  If regPrev>0 the
11410 6e 20 69 74 20 69 73 20 74 68 65 20 66 69 72 73  n it is the firs
11420 74 20 72 65 67 69 73 74 65 72 20 69 6e 20 61 20  t register in a 
11430 76 65 63 74 6f 72 20 74 68 61 74 0a 2a 2a 20 72  vector that.** r
11440 65 63 6f 72 64 73 20 74 68 65 20 70 72 65 76 69  ecords the previ
11450 6f 75 73 20 6f 75 74 70 75 74 2e 20 20 6d 65 6d  ous output.  mem
11460 5b 72 65 67 50 72 65 76 5d 20 69 73 20 61 20 66  [regPrev] is a f
11470 6c 61 67 20 74 68 61 74 20 69 73 20 66 61 6c 73  lag that is fals
11480 65 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 68 61  e.** if there ha
11490 73 20 62 65 65 6e 20 6e 6f 20 70 72 65 76 69 6f  s been no previo
114a0 75 73 20 6f 75 74 70 75 74 2e 20 20 49 66 20 72  us output.  If r
114b0 65 67 50 72 65 76 3e 30 20 74 68 65 6e 20 63 6f  egPrev>0 then co
114c0 64 65 20 69 73 0a 2a 2a 20 67 65 6e 65 72 61 74  de is.** generat
114d0 65 64 20 74 6f 20 73 75 70 70 72 65 73 73 20 64  ed to suppress d
114e0 75 70 6c 69 63 61 74 65 73 2e 20 20 70 4b 65 79  uplicates.  pKey
114f0 49 6e 66 6f 20 69 73 20 75 73 65 64 20 66 6f 72  Info is used for
11500 20 63 6f 6d 70 61 72 69 6e 67 0a 2a 2a 20 6b 65   comparing.** ke
11510 79 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ys..**.** If the
11520 20 4c 49 4d 49 54 20 66 6f 75 6e 64 20 69 6e 20   LIMIT found in 
11530 70 2d 3e 69 4c 69 6d 69 74 20 69 73 20 72 65 61  p->iLimit is rea
11540 63 68 65 64 2c 20 6a 75 6d 70 20 69 6d 6d 65 64  ched, jump immed
11550 69 61 74 65 6c 79 20 74 6f 0a 2a 2a 20 69 42 72  iately to.** iBr
11560 65 61 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  eak..*/.static i
11570 6e 74 20 67 65 6e 65 72 61 74 65 4f 75 74 70 75  nt generateOutpu
11580 74 53 75 62 72 6f 75 74 69 6e 65 28 0a 20 20 50  tSubroutine(.  P
11590 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
115a0 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
115b0 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  g context */.  S
115c0 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
115d0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45         /* The SE
115e0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a  LECT statement *
115f0 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a  /.  SelectDest *
11600 70 49 6e 2c 20 20 20 20 20 20 20 20 2f 2a 20 43  pIn,        /* C
11610 6f 72 6f 75 74 69 6e 65 20 73 75 70 70 6c 79 69  oroutine supplyi
11620 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20 53 65 6c  ng data */.  Sel
11630 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 2c 20  ectDest *pDest, 
11640 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f       /* Where to
11650 20 73 65 6e 64 20 74 68 65 20 64 61 74 61 20 2a   send the data *
11660 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 74 75 72  /.  int regRetur
11670 6e 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  n,          /* T
11680 68 65 20 72 65 74 75 72 6e 20 61 64 64 72 65 73  he return addres
11690 73 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20  s register */.  
116a0 69 6e 74 20 72 65 67 50 72 65 76 2c 20 20 20 20  int regPrev,    
116b0 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 76 69          /* Previ
116c0 6f 75 73 20 72 65 73 75 6c 74 20 72 65 67 69 73  ous result regis
116d0 74 65 72 2e 20 20 4e 6f 20 75 6e 69 71 75 65 6e  ter.  No uniquen
116e0 65 73 73 20 69 66 20 30 20 2a 2f 0a 20 20 4b 65  ess if 0 */.  Ke
116f0 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c  yInfo *pKeyInfo,
11700 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 63 6f 6d        /* For com
11710 70 61 72 69 6e 67 20 77 69 74 68 20 70 72 65 76  paring with prev
11720 69 6f 75 73 20 65 6e 74 72 79 20 2a 2f 0a 20 20  ious entry */.  
11730 69 6e 74 20 69 42 72 65 61 6b 20 20 20 20 20 20  int iBreak      
11740 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
11750 68 65 72 65 20 69 66 20 77 65 20 68 69 74 20 74  here if we hit t
11760 68 65 20 4c 49 4d 49 54 20 2a 2f 0a 29 7b 0a 20  he LIMIT */.){. 
11770 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
11780 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
11790 69 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 69 6e 74  iContinue;.  int
117a0 20 61 64 64 72 3b 0a 0a 20 20 61 64 64 72 20 3d   addr;..  addr =
117b0 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
117c0 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 69 43  entAddr(v);.  iC
117d0 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c 69 74 65  ontinue = sqlite
117e0 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
117f0 29 3b 0a 0a 20 20 2f 2a 20 53 75 70 70 72 65 73  );..  /* Suppres
11800 73 20 64 75 70 6c 69 63 61 74 65 73 20 66 6f 72  s duplicates for
11810 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20   UNION, EXCEPT, 
11820 61 6e 64 20 49 4e 54 45 52 53 45 43 54 20 0a 20  and INTERSECT . 
11830 20 2a 2f 0a 20 20 69 66 28 20 72 65 67 50 72 65   */.  if( regPre
11840 76 20 29 7b 0a 20 20 20 20 69 6e 74 20 6a 31 2c  v ){.    int j1,
11850 20 6a 32 3b 0a 20 20 20 20 6a 31 20 3d 20 73 71   j2;.    j1 = sq
11860 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
11870 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 72 65 67  v, OP_IfNot, reg
11880 50 72 65 76 29 3b 0a 20 20 20 20 6a 32 20 3d 20  Prev);.    j2 = 
11890 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
118a0 34 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c  4(v, OP_Compare,
118b0 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 72 65 67   pIn->iSdst, reg
118c0 50 72 65 76 2b 31 2c 20 70 49 6e 2d 3e 6e 53 64  Prev+1, pIn->nSd
118d0 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  st,.            
118e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
118f0 20 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33    (char*)sqlite3
11900 4b 65 79 49 6e 66 6f 52 65 66 28 70 4b 65 79 49  KeyInfoRef(pKeyI
11910 6e 66 6f 29 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  nfo), P4_KEYINFO
11920 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
11930 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a  beAddOp3(v, OP_J
11940 75 6d 70 2c 20 6a 32 2b 32 2c 20 69 43 6f 6e 74  ump, j2+2, iCont
11950 69 6e 75 65 2c 20 6a 32 2b 32 29 3b 0a 20 20 20  inue, j2+2);.   
11960 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
11970 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a 20 20 20  Here(v, j1);.   
11980 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11990 70 33 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 70  p3(v, OP_Copy, p
119a0 49 6e 2d 3e 69 53 64 73 74 2c 20 72 65 67 50 72  In->iSdst, regPr
119b0 65 76 2b 31 2c 20 70 49 6e 2d 3e 6e 53 64 73 74  ev+1, pIn->nSdst
119c0 2d 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  -1);.    sqlite3
119d0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
119e0 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 72 65 67  _Integer, 1, reg
119f0 50 72 65 76 29 3b 0a 20 20 7d 0a 20 20 69 66 28  Prev);.  }.  if(
11a00 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
11a10 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75  locFailed ) retu
11a20 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 53 75 70 70  rn 0;..  /* Supp
11a30 72 65 73 73 20 74 68 65 20 66 69 72 73 74 20 4f  ress the first O
11a40 46 46 53 45 54 20 65 6e 74 72 69 65 73 20 69 66  FFSET entries if
11a50 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 46 46   there is an OFF
11a60 53 45 54 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a  SET clause.  */.
11a70 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20    codeOffset(v, 
11a80 70 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 0a  p, iContinue);..
11a90 20 20 73 77 69 74 63 68 28 20 70 44 65 73 74 2d    switch( pDest-
11aa0 3e 65 44 65 73 74 20 29 7b 0a 20 20 20 20 2f 2a  >eDest ){.    /*
11ab0 20 53 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   Store the resul
11ac0 74 20 61 73 20 64 61 74 61 20 75 73 69 6e 67 20  t as data using 
11ad0 61 20 75 6e 69 71 75 65 20 6b 65 79 2e 0a 20 20  a unique key..  
11ae0 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52    */.    case SR
11af0 54 5f 54 61 62 6c 65 3a 0a 20 20 20 20 63 61 73  T_Table:.    cas
11b00 65 20 53 52 54 5f 45 70 68 65 6d 54 61 62 3a 20  e SRT_EphemTab: 
11b10 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d  {.      int r1 =
11b20 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
11b30 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
11b40 20 20 69 6e 74 20 72 32 20 3d 20 73 71 6c 69 74    int r2 = sqlit
11b50 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
11b60 72 73 65 29 3b 0a 20 20 20 20 20 20 74 65 73 74  rse);.      test
11b70 63 61 73 65 28 20 70 44 65 73 74 2d 3e 65 44 65  case( pDest->eDe
11b80 73 74 3d 3d 53 52 54 5f 54 61 62 6c 65 20 29 3b  st==SRT_Table );
11b90 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
11ba0 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53   pDest->eDest==S
11bb0 52 54 5f 45 70 68 65 6d 54 61 62 20 29 3b 0a 20  RT_EphemTab );. 
11bc0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
11bd0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b  AddOp3(v, OP_Mak
11be0 65 52 65 63 6f 72 64 2c 20 70 49 6e 2d 3e 69 53  eRecord, pIn->iS
11bf0 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 2c  dst, pIn->nSdst,
11c00 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   r1);.      sqli
11c10 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
11c20 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 70 44   OP_NewRowid, pD
11c30 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 72 32  est->iSDParm, r2
11c40 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
11c50 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
11c60 5f 49 6e 73 65 72 74 2c 20 70 44 65 73 74 2d 3e  _Insert, pDest->
11c70 69 53 44 50 61 72 6d 2c 20 72 31 2c 20 72 32 29  iSDParm, r1, r2)
11c80 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
11c90 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f  dbeChangeP5(v, O
11ca0 50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20  PFLAG_APPEND);. 
11cb0 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
11cc0 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
11cd0 65 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 73 71  e, r2);.      sq
11ce0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
11cf0 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
11d00 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
11d10 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c    }..#ifndef SQL
11d20 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
11d30 59 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61  Y.    /* If we a
11d40 72 65 20 63 72 65 61 74 69 6e 67 20 61 20 73 65  re creating a se
11d50 74 20 66 6f 72 20 61 6e 20 22 65 78 70 72 20 49  t for an "expr I
11d60 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20  N (SELECT ...)" 
11d70 63 6f 6e 73 74 72 75 63 74 2c 0a 20 20 20 20 2a  construct,.    *
11d80 2a 20 74 68 65 6e 20 74 68 65 72 65 20 73 68 6f  * then there sho
11d90 75 6c 64 20 62 65 20 61 20 73 69 6e 67 6c 65 20  uld be a single 
11da0 69 74 65 6d 20 6f 6e 20 74 68 65 20 73 74 61 63  item on the stac
11db0 6b 2e 20 20 57 72 69 74 65 20 74 68 69 73 0a 20  k.  Write this. 
11dc0 20 20 20 2a 2a 20 69 74 65 6d 20 69 6e 74 6f 20     ** item into 
11dd0 74 68 65 20 73 65 74 20 74 61 62 6c 65 20 77 69  the set table wi
11de0 74 68 20 62 6f 67 75 73 20 64 61 74 61 2e 0a 20  th bogus data.. 
11df0 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
11e00 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20 20  RT_Set: {.      
11e10 69 6e 74 20 72 31 3b 0a 20 20 20 20 20 20 61 73  int r1;.      as
11e20 73 65 72 74 28 20 70 49 6e 2d 3e 6e 53 64 73 74  sert( pIn->nSdst
11e30 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 70 44 65  ==1 );.      pDe
11e40 73 74 2d 3e 61 66 66 53 64 73 74 20 3d 20 0a 20  st->affSdst = . 
11e50 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43          sqlite3C
11e60 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 70  ompareAffinity(p
11e70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  ->pEList->a[0].p
11e80 45 78 70 72 2c 20 70 44 65 73 74 2d 3e 61 66 66  Expr, pDest->aff
11e90 53 64 73 74 29 3b 0a 20 20 20 20 20 20 72 31 20  Sdst);.      r1 
11ea0 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
11eb0 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
11ec0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
11ed0 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp4(v, OP_MakeR
11ee0 65 63 6f 72 64 2c 20 70 49 6e 2d 3e 69 53 64 73  ecord, pIn->iSds
11ef0 74 2c 20 31 2c 20 72 31 2c 20 26 70 44 65 73 74  t, 1, r1, &pDest
11f00 2d 3e 61 66 66 53 64 73 74 2c 31 29 3b 0a 20 20  ->affSdst,1);.  
11f10 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
11f20 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e  acheAffinityChan
11f30 67 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e  ge(pParse, pIn->
11f40 69 53 64 73 74 2c 20 31 29 3b 0a 20 20 20 20 20  iSdst, 1);.     
11f50 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11f60 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65  p2(v, OP_IdxInse
11f70 72 74 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61  rt, pDest->iSDPa
11f80 72 6d 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73  rm, r1);.      s
11f90 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
11fa0 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
11fb0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
11fc0 20 20 20 7d 0a 0a 23 69 66 20 30 20 20 2f 2a 20     }..#if 0  /* 
11fd0 4e 65 76 65 72 20 6f 63 63 75 72 73 20 6f 6e 20  Never occurs on 
11fe0 61 6e 20 4f 52 44 45 52 20 42 59 20 71 75 65 72  an ORDER BY quer
11ff0 79 20 2a 2f 0a 20 20 20 20 2f 2a 20 49 66 20 61  y */.    /* If a
12000 6e 79 20 72 6f 77 20 65 78 69 73 74 20 69 6e 20  ny row exist in 
12010 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2c 20  the result set, 
12020 72 65 63 6f 72 64 20 74 68 61 74 20 66 61 63 74  record that fact
12030 20 61 6e 64 20 61 62 6f 72 74 2e 0a 20 20 20 20   and abort..    
12040 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
12050 45 78 69 73 74 73 3a 20 7b 0a 20 20 20 20 20 20  Exists: {.      
12060 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
12070 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
12080 20 31 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61   1, pDest->iSDPa
12090 72 6d 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68  rm);.      /* Th
120a0 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77  e LIMIT clause w
120b0 69 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20 74 68  ill terminate th
120c0 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f  e loop for us */
120d0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
120e0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
120f0 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20  /* If this is a 
12100 73 63 61 6c 61 72 20 73 65 6c 65 63 74 20 74 68  scalar select th
12110 61 74 20 69 73 20 70 61 72 74 20 6f 66 20 61 6e  at is part of an
12120 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65   expression, the
12130 6e 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65 20 74  n.    ** store t
12140 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74 68  he results in th
12150 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 6d 65  e appropriate me
12160 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20 62 72  mory cell and br
12170 65 61 6b 20 6f 75 74 0a 20 20 20 20 2a 2a 20 6f  eak out.    ** o
12180 66 20 74 68 65 20 73 63 61 6e 20 6c 6f 6f 70 2e  f the scan loop.
12190 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
121a0 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20   SRT_Mem: {.    
121b0 20 20 61 73 73 65 72 74 28 20 70 49 6e 2d 3e 6e    assert( pIn->n
121c0 53 64 73 74 3d 3d 31 20 29 3b 0a 20 20 20 20 20  Sdst==1 );.     
121d0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
121e0 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 70 49 6e  Move(pParse, pIn
121f0 2d 3e 69 53 64 73 74 2c 20 70 44 65 73 74 2d 3e  ->iSdst, pDest->
12200 69 53 44 50 61 72 6d 2c 20 31 29 3b 0a 20 20 20  iSDParm, 1);.   
12210 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20     /* The LIMIT 
12220 63 6c 61 75 73 65 20 77 69 6c 6c 20 6a 75 6d 70  clause will jump
12230 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70   out of the loop
12240 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20   for us */.     
12250 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
12260 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64 65 66 20  ndif /* #ifndef 
12270 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
12280 55 45 52 59 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  UERY */..    /* 
12290 54 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20  The results are 
122a0 73 74 6f 72 65 64 20 69 6e 20 61 20 73 65 71 75  stored in a sequ
122b0 65 6e 63 65 20 6f 66 20 72 65 67 69 73 74 65 72  ence of register
122c0 73 0a 20 20 20 20 2a 2a 20 73 74 61 72 74 69 6e  s.    ** startin
122d0 67 20 61 74 20 70 44 65 73 74 2d 3e 69 53 64 73  g at pDest->iSds
122e0 74 2e 20 20 54 68 65 6e 20 74 68 65 20 63 6f 2d  t.  Then the co-
122f0 72 6f 75 74 69 6e 65 20 79 69 65 6c 64 73 2e 0a  routine yields..
12300 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
12310 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 3a 20 7b  SRT_Coroutine: {
12320 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 73 74  .      if( pDest
12330 2d 3e 69 53 64 73 74 3d 3d 30 20 29 7b 0a 20 20  ->iSdst==0 ){.  
12340 20 20 20 20 20 20 70 44 65 73 74 2d 3e 69 53 64        pDest->iSd
12350 73 74 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  st = sqlite3GetT
12360 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
12370 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20   pIn->nSdst);.  
12380 20 20 20 20 20 20 70 44 65 73 74 2d 3e 6e 53 64        pDest->nSd
12390 73 74 20 3d 20 70 49 6e 2d 3e 6e 53 64 73 74 3b  st = pIn->nSdst;
123a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
123b0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f  qlite3ExprCodeMo
123c0 76 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e  ve(pParse, pIn->
123d0 69 53 64 73 74 2c 20 70 44 65 73 74 2d 3e 69 53  iSdst, pDest->iS
123e0 64 73 74 2c 20 70 44 65 73 74 2d 3e 6e 53 64 73  dst, pDest->nSds
123f0 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
12400 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
12410 50 5f 59 69 65 6c 64 2c 20 70 44 65 73 74 2d 3e  P_Yield, pDest->
12420 69 53 44 50 61 72 6d 29 3b 0a 20 20 20 20 20 20  iSDParm);.      
12430 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
12440 20 20 2f 2a 20 49 66 20 6e 6f 6e 65 20 6f 66 20    /* If none of 
12450 74 68 65 20 61 62 6f 76 65 2c 20 74 68 65 6e 20  the above, then 
12460 74 68 65 20 72 65 73 75 6c 74 20 64 65 73 74 69  the result desti
12470 6e 61 74 69 6f 6e 20 6d 75 73 74 20 62 65 0a 20  nation must be. 
12480 20 20 20 2a 2a 20 53 52 54 5f 4f 75 74 70 75 74     ** SRT_Output
12490 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
124a0 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 20  is never called 
124b0 77 69 74 68 20 61 6e 79 20 6f 74 68 65 72 0a 20  with any other. 
124c0 20 20 20 2a 2a 20 64 65 73 74 69 6e 61 74 69 6f     ** destinatio
124d0 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68 65  n other than the
124e0 20 6f 6e 65 73 20 68 61 6e 64 6c 65 64 20 61 62   ones handled ab
124f0 6f 76 65 20 6f 72 20 53 52 54 5f 4f 75 74 70 75  ove or SRT_Outpu
12500 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  t..    **.    **
12510 20 46 6f 72 20 53 52 54 5f 4f 75 74 70 75 74 2c   For SRT_Output,
12520 20 72 65 73 75 6c 74 73 20 61 72 65 20 73 74 6f   results are sto
12530 72 65 64 20 69 6e 20 61 20 73 65 71 75 65 6e 63  red in a sequenc
12540 65 20 6f 66 20 72 65 67 69 73 74 65 72 73 2e 20  e of registers. 
12550 20 0a 20 20 20 20 2a 2a 20 54 68 65 6e 20 74 68   .    ** Then th
12560 65 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 20 6f  e OP_ResultRow o
12570 70 63 6f 64 65 20 69 73 20 75 73 65 64 20 74 6f  pcode is used to
12580 20 63 61 75 73 65 20 73 71 6c 69 74 65 33 5f 73   cause sqlite3_s
12590 74 65 70 28 29 20 74 6f 0a 20 20 20 20 2a 2a 20  tep() to.    ** 
125a0 72 65 74 75 72 6e 20 74 68 65 20 6e 65 78 74 20  return the next 
125b0 72 6f 77 20 6f 66 20 72 65 73 75 6c 74 2e 0a 20  row of result.. 
125c0 20 20 20 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c     */.    defaul
125d0 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  t: {.      asser
125e0 74 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d  t( pDest->eDest=
125f0 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20  =SRT_Output );. 
12600 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
12610 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73  AddOp2(v, OP_Res
12620 75 6c 74 52 6f 77 2c 20 70 49 6e 2d 3e 69 53 64  ultRow, pIn->iSd
12630 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b  st, pIn->nSdst);
12640 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
12650 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43  prCacheAffinityC
12660 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 70 49  hange(pParse, pI
12670 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e  n->iSdst, pIn->n
12680 53 64 73 74 29 3b 0a 20 20 20 20 20 20 62 72 65  Sdst);.      bre
12690 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ak;.    }.  }.. 
126a0 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20   /* Jump to the 
126b0 65 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  end of the loop 
126c0 69 66 20 74 68 65 20 4c 49 4d 49 54 20 69 73 20  if the LIMIT is 
126d0 72 65 61 63 68 65 64 2e 0a 20 20 2a 2f 0a 20 20  reached..  */.  
126e0 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29 7b  if( p->iLimit ){
126f0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
12700 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 5a  AddOp3(v, OP_IfZ
12710 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20  ero, p->iLimit, 
12720 69 42 72 65 61 6b 2c 20 2d 31 29 3b 0a 20 20 7d  iBreak, -1);.  }
12730 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
12740 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20 72  the subroutine r
12750 65 74 75 72 6e 0a 20 20 2a 2f 0a 20 20 73 71 6c  eturn.  */.  sql
12760 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
12770 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 69 6e 75  abel(v, iContinu
12780 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  e);.  sqlite3Vdb
12790 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65  eAddOp1(v, OP_Re
127a0 74 75 72 6e 2c 20 72 65 67 52 65 74 75 72 6e 29  turn, regReturn)
127b0 3b 0a 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72  ;..  return addr
127c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 74 65 72  ;.}../*.** Alter
127d0 6e 61 74 69 76 65 20 63 6f 6d 70 6f 75 6e 64 20  native compound 
127e0 73 65 6c 65 63 74 20 63 6f 64 65 20 67 65 6e 65  select code gene
127f0 72 61 74 6f 72 20 66 6f 72 20 63 61 73 65 73 20  rator for cases 
12800 77 68 65 6e 20 74 68 65 72 65 0a 2a 2a 20 69 73  when there.** is
12810 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
12820 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 61 73  use..**.** We as
12830 73 75 6d 65 20 61 20 71 75 65 72 79 20 6f 66 20  sume a query of 
12840 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f  the following fo
12850 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 3c  rm:.**.**      <
12860 73 65 6c 65 63 74 41 3e 20 20 3c 6f 70 65 72 61  selectA>  <opera
12870 74 6f 72 3e 20 20 3c 73 65 6c 65 63 74 42 3e 20  tor>  <selectB> 
12880 20 4f 52 44 45 52 20 42 59 20 3c 6f 72 64 65 72   ORDER BY <order
12890 62 79 6c 69 73 74 3e 0a 2a 2a 0a 2a 2a 20 3c 6f  bylist>.**.** <o
128a0 70 65 72 61 74 6f 72 3e 20 69 73 20 6f 6e 65 20  perator> is one 
128b0 6f 66 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20 55 4e  of UNION ALL, UN
128c0 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20 6f 72 20  ION, EXCEPT, or 
128d0 49 4e 54 45 52 53 45 43 54 2e 20 20 54 68 65 20  INTERSECT.  The 
128e0 69 64 65 61 0a 2a 2a 20 69 73 20 74 6f 20 63 6f  idea.** is to co
128f0 64 65 20 62 6f 74 68 20 3c 73 65 6c 65 63 74 41  de both <selectA
12900 3e 20 61 6e 64 20 3c 73 65 6c 65 63 74 42 3e 20  > and <selectB> 
12910 77 69 74 68 20 74 68 65 20 4f 52 44 45 52 20 42  with the ORDER B
12920 59 20 63 6c 61 75 73 65 20 61 73 0a 2a 2a 20 63  Y clause as.** c
12930 6f 2d 72 6f 75 74 69 6e 65 73 2e 20 20 54 68 65  o-routines.  The
12940 6e 20 72 75 6e 20 74 68 65 20 63 6f 2d 72 6f 75  n run the co-rou
12950 74 69 6e 65 73 20 69 6e 20 70 61 72 61 6c 6c 65  tines in paralle
12960 6c 20 61 6e 64 20 6d 65 72 67 65 20 74 68 65 20  l and merge the 
12970 72 65 73 75 6c 74 73 0a 2a 2a 20 69 6e 74 6f 20  results.** into 
12980 74 68 65 20 6f 75 74 70 75 74 2e 20 20 49 6e 20  the output.  In 
12990 61 64 64 69 74 69 6f 6e 20 74 6f 20 74 68 65 20  addition to the 
129a0 74 77 6f 20 63 6f 72 6f 75 74 69 6e 65 73 20 28  two coroutines (
129b0 63 61 6c 6c 65 64 20 73 65 6c 65 63 74 41 20 61  called selectA a
129c0 6e 64 0a 2a 2a 20 73 65 6c 65 63 74 42 29 20 74  nd.** selectB) t
129d0 68 65 72 65 20 61 72 65 20 37 20 73 75 62 72 6f  here are 7 subro
129e0 75 74 69 6e 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  utines:.**.**   
129f0 20 6f 75 74 41 3a 20 20 20 20 4d 6f 76 65 20 74   outA:    Move t
12a00 68 65 20 6f 75 74 70 75 74 20 6f 66 20 74 68 65  he output of the
12a10 20 73 65 6c 65 63 74 41 20 63 6f 72 6f 75 74 69   selectA corouti
12a20 6e 65 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70  ne into the outp
12a30 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ut.**           
12a40 20 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e    of the compoun
12a50 64 20 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 20  d query..**.**  
12a60 20 20 6f 75 74 42 3a 20 20 20 20 4d 6f 76 65 20    outB:    Move 
12a70 74 68 65 20 6f 75 74 70 75 74 20 6f 66 20 74 68  the output of th
12a80 65 20 73 65 6c 65 63 74 42 20 63 6f 72 6f 75 74  e selectB corout
12a90 69 6e 65 20 69 6e 74 6f 20 74 68 65 20 6f 75 74  ine into the out
12aa0 70 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  put.**          
12ab0 20 20 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75     of the compou
12ac0 6e 64 20 71 75 65 72 79 2e 20 20 28 4f 6e 6c 79  nd query.  (Only
12ad0 20 67 65 6e 65 72 61 74 65 64 20 66 6f 72 20 55   generated for U
12ae0 4e 49 4f 4e 20 61 6e 64 0a 2a 2a 20 20 20 20 20  NION and.**     
12af0 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c          UNION AL
12b00 4c 2e 20 20 45 58 43 45 50 54 20 61 6e 64 20 49  L.  EXCEPT and I
12b10 4e 53 45 52 54 53 45 43 54 20 6e 65 76 65 72 20  NSERTSECT never 
12b20 6f 75 74 70 75 74 20 61 20 72 6f 77 20 74 68 61  output a row tha
12b30 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
12b40 20 61 70 70 65 61 72 73 20 6f 6e 6c 79 20 69 6e   appears only in
12b50 20 42 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 20 41 6c   B.).**.**    Al
12b60 74 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68  tB:    Called wh
12b70 65 6e 20 74 68 65 72 65 20 69 73 20 64 61 74 61  en there is data
12b80 20 66 72 6f 6d 20 62 6f 74 68 20 63 6f 72 6f 75   from both corou
12b90 74 69 6e 65 73 20 61 6e 64 20 41 3c 42 2e 0a 2a  tines and A<B..*
12ba0 2a 0a 2a 2a 20 20 20 20 41 65 71 42 3a 20 20 20  *.**    AeqB:   
12bb0 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65   Called when the
12bc0 72 65 20 69 73 20 64 61 74 61 20 66 72 6f 6d 20  re is data from 
12bd0 62 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65 73 20  both coroutines 
12be0 61 6e 64 20 41 3d 3d 42 2e 0a 2a 2a 0a 2a 2a 20  and A==B..**.** 
12bf0 20 20 20 41 67 74 42 3a 20 20 20 20 43 61 6c 6c     AgtB:    Call
12c00 65 64 20 77 68 65 6e 20 74 68 65 72 65 20 69 73  ed when there is
12c10 20 64 61 74 61 20 66 72 6f 6d 20 62 6f 74 68 20   data from both 
12c20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 41  coroutines and A
12c30 3e 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 45 6f 66  >B..**.**    Eof
12c40 41 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65  A:    Called whe
12c50 6e 20 64 61 74 61 20 69 73 20 65 78 68 61 75 73  n data is exhaus
12c60 74 65 64 20 66 72 6f 6d 20 73 65 6c 65 63 74 41  ted from selectA
12c70 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 45 6f 66 42 3a  ..**.**    EofB:
12c80 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20      Called when 
12c90 64 61 74 61 20 69 73 20 65 78 68 61 75 73 74 65  data is exhauste
12ca0 64 20 66 72 6f 6d 20 73 65 6c 65 63 74 42 2e 0a  d from selectB..
12cb0 2a 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d  **.** The implem
12cc0 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
12cd0 6c 61 74 74 65 72 20 66 69 76 65 20 73 75 62 72  latter five subr
12ce0 6f 75 74 69 6e 65 73 20 64 65 70 65 6e 64 20 6f  outines depend o
12cf0 6e 20 77 68 69 63 68 20 0a 2a 2a 20 3c 6f 70 65  n which .** <ope
12d00 72 61 74 6f 72 3e 20 69 73 20 75 73 65 64 3a 0a  rator> is used:.
12d10 2a 2a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  **.**.**        
12d20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 20 20       UNION ALL  
12d30 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 20 20 20         UNION    
12d40 20 20 20 20 20 20 20 20 45 58 43 45 50 54 20 20          EXCEPT  
12d50 20 20 20 20 20 20 20 20 49 4e 54 45 52 53 45 43          INTERSEC
12d60 54 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2d 2d  T.**          --
12d70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d  -----------  ---
12d80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20  --------------  
12d90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20  --------------  
12da0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12db0 2d 0a 2a 2a 20 20 20 41 6c 74 42 3a 20 20 20 6f  -.**   AltB:   o
12dc0 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20  utA, nextA      
12dd0 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20  outA, nextA     
12de0 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20    outA, nextA   
12df0 20 20 20 20 20 20 6e 65 78 74 41 0a 2a 2a 0a 2a        nextA.**.*
12e00 2a 20 20 20 41 65 71 42 3a 20 20 20 6f 75 74 41  *   AeqB:   outA
12e10 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20 20 20  , nextA         
12e20 6e 65 78 74 41 20 20 20 20 20 20 20 20 20 20 20  nextA           
12e30 20 20 6e 65 78 74 41 20 20 20 20 20 20 20 20 20    nextA         
12e40 6f 75 74 41 2c 20 6e 65 78 74 41 0a 2a 2a 0a 2a  outA, nextA.**.*
12e50 2a 20 20 20 41 67 74 42 3a 20 20 20 6f 75 74 42  *   AgtB:   outB
12e60 2c 20 6e 65 78 74 42 20 20 20 20 20 20 6f 75 74  , nextB      out
12e70 42 2c 20 6e 65 78 74 42 20 20 20 20 20 20 20 20  B, nextB        
12e80 20 20 6e 65 78 74 42 20 20 20 20 20 20 20 20 20    nextB         
12e90 20 20 20 6e 65 78 74 42 0a 2a 2a 0a 2a 2a 20 20     nextB.**.**  
12ea0 20 45 6f 66 41 3a 20 20 20 6f 75 74 42 2c 20 6e   EofA:   outB, n
12eb0 65 78 74 42 20 20 20 20 20 20 6f 75 74 42 2c 20  extB      outB, 
12ec0 6e 65 78 74 42 20 20 20 20 20 20 20 20 20 20 68  nextB          h
12ed0 61 6c 74 20 20 20 20 20 20 20 20 20 20 20 20 20  alt             
12ee0 68 61 6c 74 0a 2a 2a 0a 2a 2a 20 20 20 45 6f 66  halt.**.**   Eof
12ef0 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41  B:   outA, nextA
12f00 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74        outA, next
12f10 41 20 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65  A       outA, ne
12f20 78 74 41 20 20 20 20 20 20 20 20 20 68 61 6c 74  xtA         halt
12f30 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 41 6c  .**.** In the Al
12f40 74 42 2c 20 41 65 71 42 2c 20 61 6e 64 20 41 67  tB, AeqB, and Ag
12f50 74 42 20 73 75 62 72 6f 75 74 69 6e 65 73 2c 20  tB subroutines, 
12f60 61 6e 20 45 4f 46 20 6f 6e 20 41 20 66 6f 6c 6c  an EOF on A foll
12f70 6f 77 69 6e 67 20 6e 65 78 74 41 0a 2a 2a 20 63  owing nextA.** c
12f80 61 75 73 65 73 20 61 6e 20 69 6d 6d 65 64 69 61  auses an immedia
12f90 74 65 20 6a 75 6d 70 20 74 6f 20 45 6f 66 41 20  te jump to EofA 
12fa0 61 6e 64 20 61 6e 20 45 4f 46 20 6f 6e 20 42 20  and an EOF on B 
12fb0 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78 74 42 20  following nextB 
12fc0 63 61 75 73 65 73 0a 2a 2a 20 61 6e 20 69 6d 6d  causes.** an imm
12fd0 65 64 69 61 74 65 20 6a 75 6d 70 20 74 6f 20 45  ediate jump to E
12fe0 6f 66 42 2e 20 20 57 69 74 68 69 6e 20 45 6f 66  ofB.  Within Eof
12ff0 41 20 61 6e 64 20 45 6f 66 42 2c 20 61 6e 64 20  A and EofB, and 
13000 45 4f 46 20 6f 6e 20 65 6e 74 72 79 20 6f 72 0a  EOF on entry or.
13010 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78  ** following nex
13020 74 58 20 63 61 75 73 65 73 20 61 20 6a 75 6d 70  tX causes a jump
13030 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74   to the end of t
13040 68 65 20 73 65 6c 65 63 74 20 70 72 6f 63 65 73  he select proces
13050 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 44 75 70 6c  sing..**.** Dupl
13060 69 63 61 74 65 20 72 65 6d 6f 76 61 6c 20 69 6e  icate removal in
13070 20 74 68 65 20 55 4e 49 4f 4e 2c 20 45 58 43 45   the UNION, EXCE
13080 50 54 2c 20 61 6e 64 20 49 4e 54 45 52 53 45 43  PT, and INTERSEC
13090 54 20 63 61 73 65 73 20 69 73 20 68 61 6e 64 6c  T cases is handl
130a0 65 64 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65  ed.** within the
130b0 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74 69   output subrouti
130c0 6e 65 2e 20 20 54 68 65 20 72 65 67 50 72 65 76  ne.  The regPrev
130d0 20 72 65 67 69 73 74 65 72 20 73 65 74 20 68 6f   register set ho
130e0 6c 64 73 20 74 68 65 20 70 72 65 76 69 6f 75 73  lds the previous
130f0 6c 79 0a 2a 2a 20 6f 75 74 70 75 74 20 76 61 6c  ly.** output val
13100 75 65 2e 20 20 41 20 63 6f 6d 70 61 72 69 73 6f  ue.  A compariso
13110 6e 20 69 73 20 6d 61 64 65 20 61 67 61 69 6e 73  n is made agains
13120 74 20 74 68 69 73 20 76 61 6c 75 65 20 61 6e 64  t this value and
13130 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 69   the output.** i
13140 73 20 73 6b 69 70 70 65 64 20 69 66 20 74 68 65  s skipped if the
13150 20 6e 65 78 74 20 72 65 73 75 6c 74 73 20 77 6f   next results wo
13160 75 6c 64 20 62 65 20 74 68 65 20 73 61 6d 65 20  uld be the same 
13170 61 73 20 74 68 65 20 70 72 65 76 69 6f 75 73 2e  as the previous.
13180 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65  .**.** The imple
13190 6d 65 6e 74 61 74 69 6f 6e 20 70 6c 61 6e 20 69  mentation plan i
131a0 73 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  s to implement t
131b0 68 65 20 74 77 6f 20 63 6f 72 6f 75 74 69 6e 65  he two coroutine
131c0 73 20 61 6e 64 20 73 65 76 65 6e 0a 2a 2a 20 73  s and seven.** s
131d0 75 62 72 6f 75 74 69 6e 65 73 20 66 69 72 73 74  ubroutines first
131e0 2c 20 74 68 65 6e 20 70 75 74 20 74 68 65 20 63  , then put the c
131f0 6f 6e 74 72 6f 6c 20 6c 6f 67 69 63 20 61 74 20  ontrol logic at 
13200 74 68 65 20 62 6f 74 74 6f 6d 2e 20 20 4c 69 6b  the bottom.  Lik
13210 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  e this:.**.**   
13220 20 20 20 20 20 20 20 67 6f 74 6f 20 49 6e 69 74         goto Init
13230 0a 2a 2a 20 20 20 20 20 63 6f 41 3a 20 63 6f 72  .**     coA: cor
13240 6f 75 74 69 6e 65 20 66 6f 72 20 6c 65 66 74 20  outine for left 
13250 71 75 65 72 79 20 28 41 29 0a 2a 2a 20 20 20 20  query (A).**    
13260 20 63 6f 42 3a 20 63 6f 72 6f 75 74 69 6e 65 20   coB: coroutine 
13270 66 6f 72 20 72 69 67 68 74 20 71 75 65 72 79 20  for right query 
13280 28 42 29 0a 2a 2a 20 20 20 20 6f 75 74 41 3a 20  (B).**    outA: 
13290 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f 77 20 6f  output one row o
132a0 66 20 41 0a 2a 2a 20 20 20 20 6f 75 74 42 3a 20  f A.**    outB: 
132b0 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f 77 20 6f  output one row o
132c0 66 20 42 20 28 55 4e 49 4f 4e 20 61 6e 64 20 55  f B (UNION and U
132d0 4e 49 4f 4e 20 41 4c 4c 20 6f 6e 6c 79 29 0a 2a  NION ALL only).*
132e0 2a 20 20 20 20 45 6f 66 41 3a 20 2e 2e 2e 0a 2a  *    EofA: ....*
132f0 2a 20 20 20 20 45 6f 66 42 3a 20 2e 2e 2e 0a 2a  *    EofB: ....*
13300 2a 20 20 20 20 41 6c 74 42 3a 20 2e 2e 2e 0a 2a  *    AltB: ....*
13310 2a 20 20 20 20 41 65 71 42 3a 20 2e 2e 2e 0a 2a  *    AeqB: ....*
13320 2a 20 20 20 20 41 67 74 42 3a 20 2e 2e 2e 0a 2a  *    AgtB: ....*
13330 2a 20 20 20 20 49 6e 69 74 3a 20 69 6e 69 74 69  *    Init: initi
13340 61 6c 69 7a 65 20 63 6f 72 6f 75 74 69 6e 65 20  alize coroutine 
13350 72 65 67 69 73 74 65 72 73 0a 2a 2a 20 20 20 20  registers.**    
13360 20 20 20 20 20 20 79 69 65 6c 64 20 63 6f 41 0a        yield coA.
13370 2a 2a 20 20 20 20 20 20 20 20 20 20 69 66 20 65  **          if e
13380 6f 66 28 41 29 20 67 6f 74 6f 20 45 6f 66 41 0a  of(A) goto EofA.
13390 2a 2a 20 20 20 20 20 20 20 20 20 20 79 69 65 6c  **          yiel
133a0 64 20 63 6f 42 0a 2a 2a 20 20 20 20 20 20 20 20  d coB.**        
133b0 20 20 69 66 20 65 6f 66 28 42 29 20 67 6f 74 6f    if eof(B) goto
133c0 20 45 6f 66 42 0a 2a 2a 20 20 20 20 43 6d 70 72   EofB.**    Cmpr
133d0 3a 20 43 6f 6d 70 61 72 65 20 41 2c 20 42 0a 2a  : Compare A, B.*
133e0 2a 20 20 20 20 20 20 20 20 20 20 4a 75 6d 70 20  *          Jump 
133f0 41 6c 74 42 2c 20 41 65 71 42 2c 20 41 67 74 42  AltB, AeqB, AgtB
13400 0a 2a 2a 20 20 20 20 20 45 6e 64 3a 20 2e 2e 2e  .**     End: ...
13410 0a 2a 2a 0a 2a 2a 20 57 65 20 63 61 6c 6c 20 41  .**.** We call A
13420 6c 74 42 2c 20 41 65 71 42 2c 20 41 67 74 42 2c  ltB, AeqB, AgtB,
13430 20 45 6f 66 41 2c 20 61 6e 64 20 45 6f 66 42 20   EofA, and EofB 
13440 22 73 75 62 72 6f 75 74 69 6e 65 73 22 20 62 75  "subroutines" bu
13450 74 20 74 68 65 79 20 61 72 65 20 6e 6f 74 0a 2a  t they are not.*
13460 2a 20 61 63 74 75 61 6c 6c 79 20 63 61 6c 6c 65  * actually calle
13470 64 20 75 73 69 6e 67 20 47 6f 73 75 62 20 61 6e  d using Gosub an
13480 64 20 74 68 65 79 20 64 6f 20 6e 6f 74 20 52 65  d they do not Re
13490 74 75 72 6e 2e 20 20 45 6f 66 41 20 61 6e 64 20  turn.  EofA and 
134a0 45 6f 66 42 20 6c 6f 6f 70 0a 2a 2a 20 75 6e 74  EofB loop.** unt
134b0 69 6c 20 61 6c 6c 20 64 61 74 61 20 69 73 20 65  il all data is e
134c0 78 68 61 75 73 74 65 64 20 74 68 65 6e 20 6a 75  xhausted then ju
134d0 6d 70 20 74 6f 20 74 68 65 20 22 65 6e 64 22 20  mp to the "end" 
134e0 6c 61 62 65 2e 20 20 41 6c 74 42 2c 20 41 65 71  labe.  AltB, Aeq
134f0 42 2c 0a 2a 2a 20 61 6e 64 20 41 67 74 42 20 6a  B,.** and AgtB j
13500 75 6d 70 20 74 6f 20 65 69 74 68 65 72 20 4c 32  ump to either L2
13510 20 6f 72 20 74 6f 20 6f 6e 65 20 6f 66 20 45 6f   or to one of Eo
13520 66 41 20 6f 72 20 45 6f 66 42 2e 0a 2a 2f 0a 23  fA or EofB..*/.#
13530 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
13540 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  IT_COMPOUND_SELE
13550 43 54 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 75  CT.static int mu
13560 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79  ltiSelectOrderBy
13570 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
13580 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72  e,        /* Par
13590 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
135a0 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
135b0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
135c0 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c  ight-most of SEL
135d0 45 43 54 73 20 74 6f 20 62 65 20 63 6f 64 65 64  ECTs to be coded
135e0 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74   */.  SelectDest
135f0 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a 20 57   *pDest     /* W
13600 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 71  hat to do with q
13610 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a  uery results */.
13620 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20  ){.  int i, j;  
13630 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
13640 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20  op counters */. 
13650 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72 3b   Select *pPrior;
13660 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65         /* Anothe
13670 72 20 53 45 4c 45 43 54 20 69 6d 6d 65 64 69 61  r SELECT immedia
13680 74 65 6c 79 20 74 6f 20 6f 75 72 20 6c 65 66 74  tely to our left
13690 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20   */.  Vdbe *v;  
136a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47              /* G
136b0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
136c0 74 68 69 73 20 56 44 42 45 20 2a 2f 0a 20 20 53  this VDBE */.  S
136d0 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 41 3b  electDest destA;
136e0 20 20 20 20 20 2f 2a 20 44 65 73 74 69 6e 61 74       /* Destinat
136f0 69 6f 6e 20 66 6f 72 20 63 6f 72 6f 75 74 69 6e  ion for coroutin
13700 65 20 41 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  e A */.  SelectD
13710 65 73 74 20 64 65 73 74 42 3b 20 20 20 20 20 2f  est destB;     /
13720 2a 20 44 65 73 74 69 6e 61 74 69 6f 6e 20 66 6f  * Destination fo
13730 72 20 63 6f 72 6f 75 74 69 6e 65 20 42 20 2a 2f  r coroutine B */
13740 0a 20 20 69 6e 74 20 72 65 67 41 64 64 72 41 3b  .  int regAddrA;
13750 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
13760 65 73 73 20 72 65 67 69 73 74 65 72 20 66 6f 72  ess register for
13770 20 73 65 6c 65 63 74 2d 41 20 63 6f 72 6f 75 74   select-A corout
13780 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ine */.  int reg
13790 45 6f 66 41 3b 20 20 20 20 20 20 20 20 20 20 2f  EofA;          /
137a0 2a 20 46 6c 61 67 20 74 6f 20 69 6e 64 69 63 61  * Flag to indica
137b0 74 65 20 77 68 65 6e 20 73 65 6c 65 63 74 2d 41  te when select-A
137c0 20 69 73 20 63 6f 6d 70 6c 65 74 65 20 2a 2f 0a   is complete */.
137d0 20 20 69 6e 74 20 72 65 67 41 64 64 72 42 3b 20    int regAddrB; 
137e0 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
137f0 73 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20  ss register for 
13800 73 65 6c 65 63 74 2d 42 20 63 6f 72 6f 75 74 69  select-B corouti
13810 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 45  ne */.  int regE
13820 6f 66 42 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ofB;          /*
13830 20 46 6c 61 67 20 74 6f 20 69 6e 64 69 63 61 74   Flag to indicat
13840 65 20 77 68 65 6e 20 73 65 6c 65 63 74 2d 42 20  e when select-B 
13850 69 73 20 63 6f 6d 70 6c 65 74 65 20 2a 2f 0a 20  is complete */. 
13860 20 69 6e 74 20 61 64 64 72 53 65 6c 65 63 74 41   int addrSelectA
13870 3b 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73  ;      /* Addres
13880 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d  s of the select-
13890 41 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20  A coroutine */. 
138a0 20 69 6e 74 20 61 64 64 72 53 65 6c 65 63 74 42   int addrSelectB
138b0 3b 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73  ;      /* Addres
138c0 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d  s of the select-
138d0 42 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20  B coroutine */. 
138e0 20 69 6e 74 20 72 65 67 4f 75 74 41 3b 20 20 20   int regOutA;   
138f0 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
13900 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 74  s register for t
13910 68 65 20 6f 75 74 70 75 74 2d 41 20 73 75 62 72  he output-A subr
13920 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
13930 72 65 67 4f 75 74 42 3b 20 20 20 20 20 20 20 20  regOutB;        
13940 20 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67    /* Address reg
13950 69 73 74 65 72 20 66 6f 72 20 74 68 65 20 6f 75  ister for the ou
13960 74 70 75 74 2d 42 20 73 75 62 72 6f 75 74 69 6e  tput-B subroutin
13970 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 4f  e */.  int addrO
13980 75 74 41 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  utA;         /* 
13990 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6f  Address of the o
139a0 75 74 70 75 74 2d 41 20 73 75 62 72 6f 75 74 69  utput-A subrouti
139b0 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ne */.  int addr
139c0 4f 75 74 42 20 3d 20 30 3b 20 20 20 20 20 2f 2a  OutB = 0;     /*
139d0 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
139e0 6f 75 74 70 75 74 2d 42 20 73 75 62 72 6f 75 74  output-B subrout
139f0 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ine */.  int add
13a00 72 45 6f 66 41 3b 20 20 20 20 20 20 20 20 20 2f  rEofA;         /
13a10 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
13a20 20 73 65 6c 65 63 74 2d 41 2d 65 78 68 61 75 73   select-A-exhaus
13a30 74 65 64 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  ted subroutine *
13a40 2f 0a 20 20 69 6e 74 20 61 64 64 72 45 6f 66 42  /.  int addrEofB
13a50 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64  ;         /* Add
13a60 72 65 73 73 20 6f 66 20 74 68 65 20 73 65 6c 65  ress of the sele
13a70 63 74 2d 42 2d 65 78 68 61 75 73 74 65 64 20 73  ct-B-exhausted s
13a80 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  ubroutine */.  i
13a90 6e 74 20 61 64 64 72 41 6c 74 42 3b 20 20 20 20  nt addrAltB;    
13aa0 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
13ab0 6f 66 20 74 68 65 20 41 3c 42 20 73 75 62 72 6f  of the A<B subro
13ac0 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61  utine */.  int a
13ad0 64 64 72 41 65 71 42 3b 20 20 20 20 20 20 20 20  ddrAeqB;        
13ae0 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
13af0 68 65 20 41 3d 3d 42 20 73 75 62 72 6f 75 74 69  he A==B subrouti
13b00 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ne */.  int addr
13b10 41 67 74 42 3b 20 20 20 20 20 20 20 20 20 2f 2a  AgtB;         /*
13b20 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
13b30 41 3e 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  A>B subroutine *
13b40 2f 0a 20 20 69 6e 74 20 72 65 67 4c 69 6d 69 74  /.  int regLimit
13b50 41 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6d  A;        /* Lim
13b60 69 74 20 72 65 67 69 73 74 65 72 20 66 6f 72 20  it register for 
13b70 73 65 6c 65 63 74 2d 41 20 2a 2f 0a 20 20 69 6e  select-A */.  in
13b80 74 20 72 65 67 4c 69 6d 69 74 42 3b 20 20 20 20  t regLimitB;    
13b90 20 20 20 20 2f 2a 20 4c 69 6d 69 74 20 72 65 67      /* Limit reg
13ba0 69 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74  ister for select
13bb0 2d 41 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 50  -A */.  int regP
13bc0 72 65 76 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  rev;          /*
13bd0 20 41 20 72 61 6e 67 65 20 6f 66 20 72 65 67 69   A range of regi
13be0 73 74 65 72 73 20 74 6f 20 68 6f 6c 64 20 70 72  sters to hold pr
13bf0 65 76 69 6f 75 73 20 6f 75 74 70 75 74 20 2a 2f  evious output */
13c00 0a 20 20 69 6e 74 20 73 61 76 65 64 4c 69 6d 69  .  int savedLimi
13c10 74 3b 20 20 20 20 20 20 20 2f 2a 20 53 61 76 65  t;       /* Save
13c20 64 20 76 61 6c 75 65 20 6f 66 20 70 2d 3e 69 4c  d value of p->iL
13c30 69 6d 69 74 20 2a 2f 0a 20 20 69 6e 74 20 73 61  imit */.  int sa
13c40 76 65 64 4f 66 66 73 65 74 3b 20 20 20 20 20 20  vedOffset;      
13c50 2f 2a 20 53 61 76 65 64 20 76 61 6c 75 65 20 6f  /* Saved value o
13c60 66 20 70 2d 3e 69 4f 66 66 73 65 74 20 2a 2f 0a  f p->iOffset */.
13c70 20 20 69 6e 74 20 6c 61 62 65 6c 43 6d 70 72 3b    int labelCmpr;
13c80 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 62 65 6c          /* Label
13c90 20 66 6f 72 20 74 68 65 20 73 74 61 72 74 20 6f   for the start o
13ca0 66 20 74 68 65 20 6d 65 72 67 65 20 61 6c 67 6f  f the merge algo
13cb0 72 69 74 68 6d 20 2a 2f 0a 20 20 69 6e 74 20 6c  rithm */.  int l
13cc0 61 62 65 6c 45 6e 64 3b 20 20 20 20 20 20 20 20  abelEnd;        
13cd0 20 2f 2a 20 4c 61 62 65 6c 20 66 6f 72 20 74 68   /* Label for th
13ce0 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 76 65  e end of the ove
13cf0 72 61 6c 6c 20 53 45 4c 45 43 54 20 73 74 6d 74  rall SELECT stmt
13d00 20 2a 2f 0a 20 20 69 6e 74 20 6a 31 3b 20 20 20   */.  int j1;   
13d10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a              /* J
13d20 75 6d 70 20 69 6e 73 74 72 75 63 74 69 6f 6e 73  ump instructions
13d30 20 74 68 61 74 20 67 65 74 20 72 65 74 61 72 67   that get retarg
13d40 65 74 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  etted */.  int o
13d50 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
13d60 20 2f 2a 20 4f 6e 65 20 6f 66 20 54 4b 5f 41 4c   /* One of TK_AL
13d70 4c 2c 20 54 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f  L, TK_UNION, TK_
13d80 45 58 43 45 50 54 2c 20 54 4b 5f 49 4e 54 45 52  EXCEPT, TK_INTER
13d90 53 45 43 54 20 2a 2f 0a 20 20 4b 65 79 49 6e 66  SECT */.  KeyInf
13da0 6f 20 2a 70 4b 65 79 44 75 70 20 3d 20 30 3b 20  o *pKeyDup = 0; 
13db0 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20 69 6e  /* Comparison in
13dc0 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 64 75  formation for du
13dd0 70 6c 69 63 61 74 65 20 72 65 6d 6f 76 61 6c 20  plicate removal 
13de0 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  */.  KeyInfo *pK
13df0 65 79 4d 65 72 67 65 3b 20 20 20 2f 2a 20 43 6f  eyMerge;   /* Co
13e00 6d 70 61 72 69 73 6f 6e 20 69 6e 66 6f 72 6d 61  mparison informa
13e10 74 69 6f 6e 20 66 6f 72 20 6d 65 72 67 69 6e 67  tion for merging
13e20 20 72 6f 77 73 20 2a 2f 0a 20 20 73 71 6c 69 74   rows */.  sqlit
13e30 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20  e3 *db;         
13e40 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
13e50 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70  nection */.  Exp
13e60 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 3b  rList *pOrderBy;
13e70 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20     /* The ORDER 
13e80 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69  BY clause */.  i
13e90 6e 74 20 6e 4f 72 64 65 72 42 79 3b 20 20 20 20  nt nOrderBy;    
13ea0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
13eb0 66 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 4f  f terms in the O
13ec0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a  RDER BY clause *
13ed0 2f 0a 20 20 69 6e 74 20 2a 61 50 65 72 6d 75 74  /.  int *aPermut
13ee0 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 70  e;        /* Map
13ef0 70 69 6e 67 20 66 72 6f 6d 20 4f 52 44 45 52 20  ping from ORDER 
13f00 42 59 20 74 65 72 6d 73 20 74 6f 20 72 65 73 75  BY terms to resu
13f10 6c 74 20 73 65 74 20 63 6f 6c 75 6d 6e 73 20 2a  lt set columns *
13f20 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
13f30 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20  _OMIT_EXPLAIN.  
13f40 69 6e 74 20 69 53 75 62 31 3b 20 20 20 20 20 20  int iSub1;      
13f50 20 20 20 20 20 20 2f 2a 20 45 51 50 20 69 64 20        /* EQP id 
13f60 6f 66 20 6c 65 66 74 2d 68 61 6e 64 20 71 75 65  of left-hand que
13f70 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62  ry */.  int iSub
13f80 32 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  2;            /*
13f90 20 45 51 50 20 69 64 20 6f 66 20 72 69 67 68 74   EQP id of right
13fa0 2d 68 61 6e 64 20 71 75 65 72 79 20 2a 2f 0a 23  -hand query */.#
13fb0 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
13fc0 20 70 2d 3e 70 4f 72 64 65 72 42 79 21 3d 30 20   p->pOrderBy!=0 
13fd0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65  );.  assert( pKe
13fe0 79 44 75 70 3d 3d 30 20 29 3b 20 2f 2a 20 22 4d  yDup==0 ); /* "M
13ff0 61 6e 61 67 65 64 22 20 63 6f 64 65 20 6e 65 65  anaged" code nee
14000 64 73 20 74 68 69 73 2e 20 20 54 69 63 6b 65 74  ds this.  Ticket
14010 20 23 33 33 38 32 2e 20 2a 2f 0a 20 20 64 62 20   #3382. */.  db 
14020 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
14030 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
14040 65 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d  e;.  assert( v!=
14050 30 20 29 3b 20 20 20 20 20 20 20 2f 2a 20 41 6c  0 );       /* Al
14060 72 65 61 64 79 20 74 68 72 6f 77 6e 20 74 68 65  ready thrown the
14070 20 65 72 72 6f 72 20 69 66 20 56 44 42 45 20 61   error if VDBE a
14080 6c 6c 6f 63 20 66 61 69 6c 65 64 20 2a 2f 0a 20  lloc failed */. 
14090 20 6c 61 62 65 6c 45 6e 64 20 3d 20 73 71 6c 69   labelEnd = sqli
140a0 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
140b0 28 76 29 3b 0a 20 20 6c 61 62 65 6c 43 6d 70 72  (v);.  labelCmpr
140c0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
140d0 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 0a 20 20  keLabel(v);...  
140e0 2f 2a 20 50 61 74 63 68 20 75 70 20 74 68 65 20  /* Patch up the 
140f0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 0a  ORDER BY clause.
14100 20 20 2a 2f 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f    */.  op = p->o
14110 70 3b 20 20 0a 20 20 70 50 72 69 6f 72 20 3d 20  p;  .  pPrior = 
14120 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 61 73 73  p->pPrior;.  ass
14130 65 72 74 28 20 70 50 72 69 6f 72 2d 3e 70 4f 72  ert( pPrior->pOr
14140 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20 70 4f  derBy==0 );.  pO
14150 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64  rderBy = p->pOrd
14160 65 72 42 79 3b 0a 20 20 61 73 73 65 72 74 28 20  erBy;.  assert( 
14170 70 4f 72 64 65 72 42 79 20 29 3b 0a 20 20 6e 4f  pOrderBy );.  nO
14180 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42  rderBy = pOrderB
14190 79 2d 3e 6e 45 78 70 72 3b 0a 0a 20 20 2f 2a 20  y->nExpr;..  /* 
141a0 46 6f 72 20 6f 70 65 72 61 74 6f 72 73 20 6f 74  For operators ot
141b0 68 65 72 20 74 68 61 6e 20 55 4e 49 4f 4e 20 41  her than UNION A
141c0 4c 4c 20 77 65 20 68 61 76 65 20 74 6f 20 6d 61  LL we have to ma
141d0 6b 65 20 73 75 72 65 20 74 68 61 74 0a 20 20 2a  ke sure that.  *
141e0 2a 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  * the ORDER BY c
141f0 6c 61 75 73 65 20 63 6f 76 65 72 73 20 65 76 65  lause covers eve
14200 72 79 20 74 65 72 6d 20 6f 66 20 74 68 65 20 72  ry term of the r
14210 65 73 75 6c 74 20 73 65 74 2e 20 20 41 64 64 0a  esult set.  Add.
14220 20 20 2a 2a 20 74 65 72 6d 73 20 74 6f 20 74 68    ** terms to th
14230 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
14240 65 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e 0a  e as necessary..
14250 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 21 3d 54    */.  if( op!=T
14260 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 66 6f 72  K_ALL ){.    for
14270 28 69 3d 31 3b 20 64 62 2d 3e 6d 61 6c 6c 6f 63  (i=1; db->malloc
14280 46 61 69 6c 65 64 3d 3d 30 20 26 26 20 69 3c 3d  Failed==0 && i<=
14290 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
142a0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74  ; i++){.      st
142b0 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
142c0 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20  em *pItem;.     
142d0 20 66 6f 72 28 6a 3d 30 2c 20 70 49 74 65 6d 3d   for(j=0, pItem=
142e0 70 4f 72 64 65 72 42 79 2d 3e 61 3b 20 6a 3c 6e  pOrderBy->a; j<n
142f0 4f 72 64 65 72 42 79 3b 20 6a 2b 2b 2c 20 70 49  OrderBy; j++, pI
14300 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  tem++){.        
14310 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 75  assert( pItem->u
14320 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3e 30  .x.iOrderByCol>0
14330 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
14340 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65  pItem->u.x.iOrde
14350 72 42 79 43 6f 6c 3d 3d 69 20 29 20 62 72 65 61  rByCol==i ) brea
14360 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
14370 20 69 66 28 20 6a 3d 3d 6e 4f 72 64 65 72 42 79   if( j==nOrderBy
14380 20 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72   ){.        Expr
14390 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33   *pNew = sqlite3
143a0 45 78 70 72 28 64 62 2c 20 54 4b 5f 49 4e 54 45  Expr(db, TK_INTE
143b0 47 45 52 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  GER, 0);.       
143c0 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72   if( pNew==0 ) r
143d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
143e0 45 4d 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  EM;.        pNew
143f0 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 49 6e  ->flags |= EP_In
14400 74 56 61 6c 75 65 3b 0a 20 20 20 20 20 20 20 20  tValue;.        
14410 70 4e 65 77 2d 3e 75 2e 69 56 61 6c 75 65 20 3d  pNew->u.iValue =
14420 20 69 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 64   i;.        pOrd
14430 65 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78  erBy = sqlite3Ex
14440 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61  prListAppend(pPa
14450 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 70  rse, pOrderBy, p
14460 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20 69 66  New);.        if
14470 28 20 70 4f 72 64 65 72 42 79 20 29 20 70 4f 72  ( pOrderBy ) pOr
14480 64 65 72 42 79 2d 3e 61 5b 6e 4f 72 64 65 72 42  derBy->a[nOrderB
14490 79 2b 2b 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42  y++].u.x.iOrderB
144a0 79 43 6f 6c 20 3d 20 28 75 31 36 29 69 3b 0a 20  yCol = (u16)i;. 
144b0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
144c0 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74  ..  /* Compute t
144d0 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 70 65  he comparison pe
144e0 72 6d 75 74 61 74 69 6f 6e 20 61 6e 64 20 6b 65  rmutation and ke
144f0 79 69 6e 66 6f 20 74 68 61 74 20 69 73 20 75 73  yinfo that is us
14500 65 64 20 77 69 74 68 0a 20 20 2a 2a 20 74 68 65  ed with.  ** the
14510 20 70 65 72 6d 75 74 61 74 69 6f 6e 20 75 73 65   permutation use
14520 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69  d to determine i
14530 66 20 74 68 65 20 6e 65 78 74 0a 20 20 2a 2a 20  f the next.  ** 
14540 72 6f 77 20 6f 66 20 72 65 73 75 6c 74 73 20 63  row of results c
14550 6f 6d 65 73 20 66 72 6f 6d 20 73 65 6c 65 63 74  omes from select
14560 41 20 6f 72 20 73 65 6c 65 63 74 42 2e 20 20 41  A or selectB.  A
14570 6c 73 6f 20 61 64 64 20 65 78 70 6c 69 63 69 74  lso add explicit
14580 0a 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 73  .  ** collations
14590 20 74 6f 20 74 68 65 20 4f 52 44 45 52 20 42 59   to the ORDER BY
145a0 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 73 6f   clause terms so
145b0 20 74 68 61 74 20 77 68 65 6e 20 74 68 65 20 73   that when the s
145c0 75 62 71 75 65 72 69 65 73 0a 20 20 2a 2a 20 74  ubqueries.  ** t
145d0 6f 20 74 68 65 20 72 69 67 68 74 20 61 6e 64 20  o the right and 
145e0 74 68 65 20 6c 65 66 74 20 61 72 65 20 65 76 61  the left are eva
145f0 6c 75 61 74 65 64 2c 20 74 68 65 79 20 75 73 65  luated, they use
14600 20 74 68 65 20 63 6f 72 72 65 63 74 0a 20 20 2a   the correct.  *
14610 2a 20 63 6f 6c 6c 61 74 69 6f 6e 2e 0a 20 20 2a  * collation..  *
14620 2f 0a 20 20 61 50 65 72 6d 75 74 65 20 3d 20 73  /.  aPermute = s
14630 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
14640 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 69 6e 74  w(db, sizeof(int
14650 29 2a 6e 4f 72 64 65 72 42 79 29 3b 0a 20 20 69  )*nOrderBy);.  i
14660 66 28 20 61 50 65 72 6d 75 74 65 20 29 7b 0a 20  f( aPermute ){. 
14670 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
14680 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
14690 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 49 74      for(i=0, pIt
146a0 65 6d 3d 70 4f 72 64 65 72 42 79 2d 3e 61 3b 20  em=pOrderBy->a; 
146b0 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 2c  i<nOrderBy; i++,
146c0 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
146d0 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e   assert( pItem->
146e0 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3e  u.x.iOrderByCol>
146f0 30 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 70  0.          && p
14700 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72  Item->u.x.iOrder
14710 42 79 43 6f 6c 3c 3d 70 2d 3e 70 45 4c 69 73 74  ByCol<=p->pEList
14720 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20 20 20  ->nExpr );.     
14730 20 61 50 65 72 6d 75 74 65 5b 69 5d 20 3d 20 70   aPermute[i] = p
14740 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72  Item->u.x.iOrder
14750 42 79 43 6f 6c 20 2d 20 31 3b 0a 20 20 20 20 7d  ByCol - 1;.    }
14760 0a 20 20 20 20 70 4b 65 79 4d 65 72 67 65 20 3d  .    pKeyMerge =
14770 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41   sqlite3KeyInfoA
14780 6c 6c 6f 63 28 64 62 2c 20 6e 4f 72 64 65 72 42  lloc(db, nOrderB
14790 79 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20 70  y, 1);.    if( p
147a0 4b 65 79 4d 65 72 67 65 20 29 7b 0a 20 20 20 20  KeyMerge ){.    
147b0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72    for(i=0; i<nOr
147c0 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20  derBy; i++){.   
147d0 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43       CollSeq *pC
147e0 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 45 78 70  oll;.        Exp
147f0 72 20 2a 70 54 65 72 6d 20 3d 20 70 4f 72 64 65  r *pTerm = pOrde
14800 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  rBy->a[i].pExpr;
14810 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54 65  .        if( pTe
14820 72 6d 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 43  rm->flags & EP_C
14830 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 20 20  ollate ){.      
14840 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
14850 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
14860 50 61 72 73 65 2c 20 70 54 65 72 6d 29 3b 0a 20  Parse, pTerm);. 
14870 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
14880 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20          pColl = 
14890 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53  multiSelectCollS
148a0 65 71 28 70 50 61 72 73 65 2c 20 70 2c 20 61 50  eq(pParse, p, aP
148b0 65 72 6d 75 74 65 5b 69 5d 29 3b 0a 20 20 20 20  ermute[i]);.    
148c0 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 3d        if( pColl=
148d0 3d 30 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d  =0 ) pColl = db-
148e0 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20  >pDfltColl;.    
148f0 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 2d 3e        pOrderBy->
14900 61 5b 69 5d 2e 70 45 78 70 72 20 3d 0a 20 20 20  a[i].pExpr =.   
14910 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
14920 33 45 78 70 72 41 64 64 43 6f 6c 6c 61 74 65 53  3ExprAddCollateS
14930 74 72 69 6e 67 28 70 50 61 72 73 65 2c 20 70 54  tring(pParse, pT
14940 65 72 6d 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  erm, pColl->zNam
14950 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e);.        }.  
14960 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
14970 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57 72  lite3KeyInfoIsWr
14980 69 74 65 61 62 6c 65 28 70 4b 65 79 4d 65 72 67  iteable(pKeyMerg
14990 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4b  e) );.        pK
149a0 65 79 4d 65 72 67 65 2d 3e 61 43 6f 6c 6c 5b 69  eyMerge->aColl[i
149b0 5d 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20 20 20  ] = pColl;.     
149c0 20 20 20 70 4b 65 79 4d 65 72 67 65 2d 3e 61 53     pKeyMerge->aS
149d0 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 70 4f  ortOrder[i] = pO
149e0 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72  rderBy->a[i].sor
149f0 74 4f 72 64 65 72 3b 0a 20 20 20 20 20 20 7d 0a  tOrder;.      }.
14a00 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
14a10 20 20 20 70 4b 65 79 4d 65 72 67 65 20 3d 20 30     pKeyMerge = 0
14a20 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 74  ;.  }..  /* Reat
14a30 74 61 63 68 20 74 68 65 20 4f 52 44 45 52 20 42  tach the ORDER B
14a40 59 20 63 6c 61 75 73 65 20 74 6f 20 74 68 65 20  Y clause to the 
14a50 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 70 2d  query..  */.  p-
14a60 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64  >pOrderBy = pOrd
14a70 65 72 42 79 3b 0a 20 20 70 50 72 69 6f 72 2d 3e  erBy;.  pPrior->
14a80 70 4f 72 64 65 72 42 79 20 3d 20 73 71 6c 69 74  pOrderBy = sqlit
14a90 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 70 50  e3ExprListDup(pP
14aa0 61 72 73 65 2d 3e 64 62 2c 20 70 4f 72 64 65 72  arse->db, pOrder
14ab0 42 79 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20 41 6c  By, 0);..  /* Al
14ac0 6c 6f 63 61 74 65 20 61 20 72 61 6e 67 65 20 6f  locate a range o
14ad0 66 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69  f temporary regi
14ae0 73 74 65 72 73 20 61 6e 64 20 74 68 65 20 4b 65  sters and the Ke
14af0 79 49 6e 66 6f 20 6e 65 65 64 65 64 0a 20 20 2a  yInfo needed.  *
14b00 2a 20 66 6f 72 20 74 68 65 20 6c 6f 67 69 63 20  * for the logic 
14b10 74 68 61 74 20 72 65 6d 6f 76 65 73 20 64 75 70  that removes dup
14b20 6c 69 63 61 74 65 20 72 65 73 75 6c 74 20 72 6f  licate result ro
14b30 77 73 20 77 68 65 6e 20 74 68 65 0a 20 20 2a 2a  ws when the.  **
14b40 20 6f 70 65 72 61 74 6f 72 20 69 73 20 55 4e 49   operator is UNI
14b50 4f 4e 2c 20 45 58 43 45 50 54 2c 20 6f 72 20 49  ON, EXCEPT, or I
14b60 4e 54 45 52 53 45 43 54 20 28 62 75 74 20 6e 6f  NTERSECT (but no
14b70 74 20 55 4e 49 4f 4e 20 41 4c 4c 29 2e 0a 20 20  t UNION ALL)..  
14b80 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  */.  if( op==TK_
14b90 41 4c 4c 20 29 7b 0a 20 20 20 20 72 65 67 50 72  ALL ){.    regPr
14ba0 65 76 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  ev = 0;.  }else{
14bb0 0a 20 20 20 20 69 6e 74 20 6e 45 78 70 72 20 3d  .    int nExpr =
14bc0 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
14bd0 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  r;.    assert( n
14be0 4f 72 64 65 72 42 79 3e 3d 6e 45 78 70 72 20 7c  OrderBy>=nExpr |
14bf0 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
14c00 65 64 20 29 3b 0a 20 20 20 20 72 65 67 50 72 65  ed );.    regPre
14c10 76 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  v = pParse->nMem
14c20 2b 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  +1;.    pParse->
14c30 6e 4d 65 6d 20 2b 3d 20 6e 45 78 70 72 2b 31 3b  nMem += nExpr+1;
14c40 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
14c50 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
14c60 65 67 65 72 2c 20 30 2c 20 72 65 67 50 72 65 76  eger, 0, regPrev
14c70 29 3b 0a 20 20 20 20 70 4b 65 79 44 75 70 20 3d  );.    pKeyDup =
14c80 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41   sqlite3KeyInfoA
14c90 6c 6c 6f 63 28 64 62 2c 20 6e 45 78 70 72 2c 20  lloc(db, nExpr, 
14ca0 31 29 3b 0a 20 20 20 20 69 66 28 20 70 4b 65 79  1);.    if( pKey
14cb0 44 75 70 20 29 7b 0a 20 20 20 20 20 20 61 73 73  Dup ){.      ass
14cc0 65 72 74 28 20 73 71 6c 69 74 65 33 4b 65 79 49  ert( sqlite3KeyI
14cd0 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28 70  nfoIsWriteable(p
14ce0 4b 65 79 44 75 70 29 20 29 3b 0a 20 20 20 20 20  KeyDup) );.     
14cf0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70   for(i=0; i<nExp
14d00 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  r; i++){.       
14d10 20 70 4b 65 79 44 75 70 2d 3e 61 43 6f 6c 6c 5b   pKeyDup->aColl[
14d20 69 5d 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74  i] = multiSelect
14d30 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
14d40 70 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 70  p, i);.        p
14d50 4b 65 79 44 75 70 2d 3e 61 53 6f 72 74 4f 72 64  KeyDup->aSortOrd
14d60 65 72 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20  er[i] = 0;.     
14d70 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 0a 20   }.    }.  }. . 
14d80 20 2f 2a 20 53 65 70 61 72 61 74 65 20 74 68 65   /* Separate the
14d90 20 6c 65 66 74 20 61 6e 64 20 74 68 65 20 72 69   left and the ri
14da0 67 68 74 20 71 75 65 72 79 20 66 72 6f 6d 20 6f  ght query from o
14db0 6e 65 20 61 6e 6f 74 68 65 72 0a 20 20 2a 2f 0a  ne another.  */.
14dc0 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b    p->pPrior = 0;
14dd0 0a 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76  .  sqlite3Resolv
14de0 65 4f 72 64 65 72 47 72 6f 75 70 42 79 28 70 50  eOrderGroupBy(pP
14df0 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 4f 72 64  arse, p, p->pOrd
14e00 65 72 42 79 2c 20 22 4f 52 44 45 52 22 29 3b 0a  erBy, "ORDER");.
14e10 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70 50    if( pPrior->pP
14e20 72 69 6f 72 3d 3d 30 20 29 7b 0a 20 20 20 20 73  rior==0 ){.    s
14e30 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 4f 72 64  qlite3ResolveOrd
14e40 65 72 47 72 6f 75 70 42 79 28 70 50 61 72 73 65  erGroupBy(pParse
14e50 2c 20 70 50 72 69 6f 72 2c 20 70 50 72 69 6f 72  , pPrior, pPrior
14e60 2d 3e 70 4f 72 64 65 72 42 79 2c 20 22 4f 52 44  ->pOrderBy, "ORD
14e70 45 52 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ER");.  }..  /* 
14e80 43 6f 6d 70 75 74 65 20 74 68 65 20 6c 69 6d 69  Compute the limi
14e90 74 20 72 65 67 69 73 74 65 72 73 20 2a 2f 0a 20  t registers */. 
14ea0 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67   computeLimitReg
14eb0 69 73 74 65 72 73 28 70 50 61 72 73 65 2c 20 70  isters(pParse, p
14ec0 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 69  , labelEnd);.  i
14ed0 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 26 26 20  f( p->iLimit && 
14ee0 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20  op==TK_ALL ){.  
14ef0 20 20 72 65 67 4c 69 6d 69 74 41 20 3d 20 2b 2b    regLimitA = ++
14f00 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
14f10 20 20 72 65 67 4c 69 6d 69 74 42 20 3d 20 2b 2b    regLimitB = ++
14f20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
14f30 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
14f40 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20  Op2(v, OP_Copy, 
14f50 70 2d 3e 69 4f 66 66 73 65 74 20 3f 20 70 2d 3e  p->iOffset ? p->
14f60 69 4f 66 66 73 65 74 2b 31 20 3a 20 70 2d 3e 69  iOffset+1 : p->i
14f70 4c 69 6d 69 74 2c 0a 20 20 20 20 20 20 20 20 20  Limit,.         
14f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14f90 20 20 20 20 20 20 20 20 20 72 65 67 4c 69 6d 69           regLimi
14fa0 74 41 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  tA);.    sqlite3
14fb0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
14fc0 5f 43 6f 70 79 2c 20 72 65 67 4c 69 6d 69 74 41  _Copy, regLimitA
14fd0 2c 20 72 65 67 4c 69 6d 69 74 42 29 3b 0a 20 20  , regLimitB);.  
14fe0 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 67 4c 69  }else{.    regLi
14ff0 6d 69 74 41 20 3d 20 72 65 67 4c 69 6d 69 74 42  mitA = regLimitB
15000 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69   = 0;.  }.  sqli
15010 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
15020 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20  , p->pLimit);.  
15030 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  p->pLimit = 0;. 
15040 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
15050 74 65 28 64 62 2c 20 70 2d 3e 70 4f 66 66 73 65  te(db, p->pOffse
15060 74 29 3b 0a 20 20 70 2d 3e 70 4f 66 66 73 65 74  t);.  p->pOffset
15070 20 3d 20 30 3b 0a 0a 20 20 72 65 67 41 64 64 72   = 0;..  regAddr
15080 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  A = ++pParse->nM
15090 65 6d 3b 0a 20 20 72 65 67 45 6f 66 41 20 3d 20  em;.  regEofA = 
150a0 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
150b0 20 20 72 65 67 41 64 64 72 42 20 3d 20 2b 2b 70    regAddrB = ++p
150c0 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72  Parse->nMem;.  r
150d0 65 67 45 6f 66 42 20 3d 20 2b 2b 70 50 61 72 73  egEofB = ++pPars
150e0 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 4f 75  e->nMem;.  regOu
150f0 74 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  tA = ++pParse->n
15100 4d 65 6d 3b 0a 20 20 72 65 67 4f 75 74 42 20 3d  Mem;.  regOutB =
15110 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
15120 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
15130 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 41 2c  DestInit(&destA,
15140 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20   SRT_Coroutine, 
15150 72 65 67 41 64 64 72 41 29 3b 0a 20 20 73 71 6c  regAddrA);.  sql
15160 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e  ite3SelectDestIn
15170 69 74 28 26 64 65 73 74 42 2c 20 53 52 54 5f 43  it(&destB, SRT_C
15180 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64  oroutine, regAdd
15190 72 42 29 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20  rB);..  /* Jump 
151a0 70 61 73 74 20 74 68 65 20 76 61 72 69 6f 75 73  past the various
151b0 20 73 75 62 72 6f 75 74 69 6e 65 73 20 61 6e 64   subroutines and
151c0 20 63 6f 72 6f 75 74 69 6e 65 73 20 74 6f 20 74   coroutines to t
151d0 68 65 20 6d 61 69 6e 0a 20 20 2a 2a 20 6d 65 72  he main.  ** mer
151e0 67 65 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20 20 6a  ge loop.  */.  j
151f0 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 = sqlite3VdbeA
15200 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp0(v, OP_Goto
15210 29 3b 0a 20 20 61 64 64 72 53 65 6c 65 63 74 41  );.  addrSelectA
15220 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
15230 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 0a 0a  rrentAddr(v);...
15240 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20    /* Generate a 
15250 63 6f 72 6f 75 74 69 6e 65 20 74 6f 20 65 76 61  coroutine to eva
15260 6c 75 61 74 65 20 74 68 65 20 53 45 4c 45 43 54  luate the SELECT
15270 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 74 68   statement to th
15280 65 0a 20 20 2a 2a 20 6c 65 66 74 20 6f 66 20 74  e.  ** left of t
15290 68 65 20 63 6f 6d 70 6f 75 6e 64 20 6f 70 65 72  he compound oper
152a0 61 74 6f 72 20 2d 20 74 68 65 20 22 41 22 20 73  ator - the "A" s
152b0 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 56 64  elect..  */.  Vd
152c0 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76  beNoopComment((v
152d0 2c 20 22 42 65 67 69 6e 20 63 6f 72 6f 75 74 69  , "Begin corouti
152e0 6e 65 20 66 6f 72 20 6c 65 66 74 20 53 45 4c 45  ne for left SELE
152f0 43 54 22 29 29 3b 0a 20 20 70 50 72 69 6f 72 2d  CT"));.  pPrior-
15300 3e 69 4c 69 6d 69 74 20 3d 20 72 65 67 4c 69 6d  >iLimit = regLim
15310 69 74 41 3b 0a 20 20 65 78 70 6c 61 69 6e 53 65  itA;.  explainSe
15320 74 49 6e 74 65 67 65 72 28 69 53 75 62 31 2c 20  tInteger(iSub1, 
15330 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c  pParse->iNextSel
15340 65 63 74 49 64 29 3b 0a 20 20 73 71 6c 69 74 65  ectId);.  sqlite
15350 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
15360 70 50 72 69 6f 72 2c 20 26 64 65 73 74 41 29 3b  pPrior, &destA);
15370 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
15380 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
15390 65 72 2c 20 31 2c 20 72 65 67 45 6f 66 41 29 3b  er, 1, regEofA);
153a0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
153b0 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64  dOp1(v, OP_Yield
153c0 2c 20 72 65 67 41 64 64 72 41 29 3b 0a 20 20 56  , regAddrA);.  V
153d0 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28  dbeNoopComment((
153e0 76 2c 20 22 45 6e 64 20 63 6f 72 6f 75 74 69 6e  v, "End coroutin
153f0 65 20 66 6f 72 20 6c 65 66 74 20 53 45 4c 45 43  e for left SELEC
15400 54 22 29 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65  T"));..  /* Gene
15410 72 61 74 65 20 61 20 63 6f 72 6f 75 74 69 6e 65  rate a coroutine
15420 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65   to evaluate the
15430 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
15440 74 20 6f 6e 20 0a 20 20 2a 2a 20 74 68 65 20 72  t on .  ** the r
15450 69 67 68 74 20 2d 20 74 68 65 20 22 42 22 20 73  ight - the "B" s
15460 65 6c 65 63 74 0a 20 20 2a 2f 0a 20 20 61 64 64  elect.  */.  add
15470 72 53 65 6c 65 63 74 42 20 3d 20 73 71 6c 69 74  rSelectB = sqlit
15480 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
15490 72 28 76 29 3b 0a 20 20 56 64 62 65 4e 6f 6f 70  r(v);.  VdbeNoop
154a0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 42 65 67  Comment((v, "Beg
154b0 69 6e 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72  in coroutine for
154c0 20 72 69 67 68 74 20 53 45 4c 45 43 54 22 29 29   right SELECT"))
154d0 3b 0a 20 20 73 61 76 65 64 4c 69 6d 69 74 20 3d  ;.  savedLimit =
154e0 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 73 61   p->iLimit;.  sa
154f0 76 65 64 4f 66 66 73 65 74 20 3d 20 70 2d 3e 69  vedOffset = p->i
15500 4f 66 66 73 65 74 3b 0a 20 20 70 2d 3e 69 4c 69  Offset;.  p->iLi
15510 6d 69 74 20 3d 20 72 65 67 4c 69 6d 69 74 42 3b  mit = regLimitB;
15520 0a 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20  .  p->iOffset = 
15530 30 3b 20 20 0a 20 20 65 78 70 6c 61 69 6e 53 65  0;  .  explainSe
15540 74 49 6e 74 65 67 65 72 28 69 53 75 62 32 2c 20  tInteger(iSub2, 
15550 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c  pParse->iNextSel
15560 65 63 74 49 64 29 3b 0a 20 20 73 71 6c 69 74 65  ectId);.  sqlite
15570 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
15580 70 2c 20 26 64 65 73 74 42 29 3b 0a 20 20 70 2d  p, &destB);.  p-
15590 3e 69 4c 69 6d 69 74 20 3d 20 73 61 76 65 64 4c  >iLimit = savedL
155a0 69 6d 69 74 3b 0a 20 20 70 2d 3e 69 4f 66 66 73  imit;.  p->iOffs
155b0 65 74 20 3d 20 73 61 76 65 64 4f 66 66 73 65 74  et = savedOffset
155c0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
155d0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
155e0 67 65 72 2c 20 31 2c 20 72 65 67 45 6f 66 42 29  ger, 1, regEofB)
155f0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
15600 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c  ddOp1(v, OP_Yiel
15610 64 2c 20 72 65 67 41 64 64 72 42 29 3b 0a 20 20  d, regAddrB);.  
15620 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28  VdbeNoopComment(
15630 28 76 2c 20 22 45 6e 64 20 63 6f 72 6f 75 74 69  (v, "End corouti
15640 6e 65 20 66 6f 72 20 72 69 67 68 74 20 53 45 4c  ne for right SEL
15650 45 43 54 22 29 29 3b 0a 0a 20 20 2f 2a 20 47 65  ECT"));..  /* Ge
15660 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74  nerate a subrout
15670 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74 73  ine that outputs
15680 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77   the current row
15690 20 6f 66 20 74 68 65 20 41 0a 20 20 2a 2a 20 73   of the A.  ** s
156a0 65 6c 65 63 74 20 61 73 20 74 68 65 20 6e 65 78  elect as the nex
156b0 74 20 6f 75 74 70 75 74 20 72 6f 77 20 6f 66 20  t output row of 
156c0 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c  the compound sel
156d0 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 56 64 62 65  ect..  */.  Vdbe
156e0 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  NoopComment((v, 
156f0 22 4f 75 74 70 75 74 20 72 6f 75 74 69 6e 65 20  "Output routine 
15700 66 6f 72 20 41 22 29 29 3b 0a 20 20 61 64 64 72  for A"));.  addr
15710 4f 75 74 41 20 3d 20 67 65 6e 65 72 61 74 65 4f  OutA = generateO
15720 75 74 70 75 74 53 75 62 72 6f 75 74 69 6e 65 28  utputSubroutine(
15730 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20  pParse,.        
15740 20 20 20 20 20 20 20 20 20 70 2c 20 26 64 65 73           p, &des
15750 74 41 2c 20 70 44 65 73 74 2c 20 72 65 67 4f 75  tA, pDest, regOu
15760 74 41 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  tA,.            
15770 20 20 20 20 20 72 65 67 50 72 65 76 2c 20 70 4b       regPrev, pK
15780 65 79 44 75 70 2c 20 6c 61 62 65 6c 45 6e 64 29  eyDup, labelEnd)
15790 3b 0a 20 20 0a 20 20 2f 2a 20 47 65 6e 65 72 61  ;.  .  /* Genera
157a0 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  te a subroutine 
157b0 74 68 61 74 20 6f 75 74 70 75 74 73 20 74 68 65  that outputs the
157c0 20 63 75 72 72 65 6e 74 20 72 6f 77 20 6f 66 20   current row of 
157d0 74 68 65 20 42 0a 20 20 2a 2a 20 73 65 6c 65 63  the B.  ** selec
157e0 74 20 61 73 20 74 68 65 20 6e 65 78 74 20 6f 75  t as the next ou
157f0 74 70 75 74 20 72 6f 77 20 6f 66 20 74 68 65 20  tput row of the 
15800 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e  compound select.
15810 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d  .  */.  if( op==
15820 54 4b 5f 41 4c 4c 20 7c 7c 20 6f 70 3d 3d 54 4b  TK_ALL || op==TK
15830 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20 20 20 56 64  _UNION ){.    Vd
15840 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76  beNoopComment((v
15850 2c 20 22 4f 75 74 70 75 74 20 72 6f 75 74 69 6e  , "Output routin
15860 65 20 66 6f 72 20 42 22 29 29 3b 0a 20 20 20 20  e for B"));.    
15870 61 64 64 72 4f 75 74 42 20 3d 20 67 65 6e 65 72  addrOutB = gener
15880 61 74 65 4f 75 74 70 75 74 53 75 62 72 6f 75 74  ateOutputSubrout
15890 69 6e 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20  ine(pParse,.    
158a0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2c 20               p, 
158b0 26 64 65 73 74 42 2c 20 70 44 65 73 74 2c 20 72  &destB, pDest, r
158c0 65 67 4f 75 74 42 2c 0a 20 20 20 20 20 20 20 20  egOutB,.        
158d0 20 20 20 20 20 20 20 20 20 72 65 67 50 72 65 76           regPrev
158e0 2c 20 70 4b 65 79 44 75 70 2c 20 6c 61 62 65 6c  , pKeyDup, label
158f0 45 6e 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  End);.  }.  sqli
15900 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28  te3KeyInfoUnref(
15910 70 4b 65 79 44 75 70 29 3b 0a 0a 20 20 2f 2a 20  pKeyDup);..  /* 
15920 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f  Generate a subro
15930 75 74 69 6e 65 20 74 6f 20 72 75 6e 20 77 68 65  utine to run whe
15940 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 66 72  n the results fr
15950 6f 6d 20 73 65 6c 65 63 74 20 41 0a 20 20 2a 2a  om select A.  **
15960 20 61 72 65 20 65 78 68 61 75 73 74 65 64 20 61   are exhausted a
15970 6e 64 20 6f 6e 6c 79 20 64 61 74 61 20 69 6e 20  nd only data in 
15980 73 65 6c 65 63 74 20 42 20 72 65 6d 61 69 6e 73  select B remains
15990 2e 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f  ..  */.  VdbeNoo
159a0 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6f  pComment((v, "eo
159b0 66 2d 41 20 73 75 62 72 6f 75 74 69 6e 65 22 29  f-A subroutine")
159c0 29 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  );.  if( op==TK_
159d0 45 58 43 45 50 54 20 7c 7c 20 6f 70 3d 3d 54 4b  EXCEPT || op==TK
159e0 5f 49 4e 54 45 52 53 45 43 54 20 29 7b 0a 20 20  _INTERSECT ){.  
159f0 20 20 61 64 64 72 45 6f 66 41 20 3d 20 73 71 6c    addrEofA = sql
15a00 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
15a10 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c 61  , OP_Goto, 0, la
15a20 62 65 6c 45 6e 64 29 3b 0a 20 20 7d 65 6c 73 65  belEnd);.  }else
15a30 7b 20 20 0a 20 20 20 20 61 64 64 72 45 6f 66 41  {  .    addrEofA
15a40 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
15a50 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20 72  dOp2(v, OP_If, r
15a60 65 67 45 6f 66 42 2c 20 6c 61 62 65 6c 45 6e 64  egEofB, labelEnd
15a70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
15a80 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
15a90 6f 73 75 62 2c 20 72 65 67 4f 75 74 42 2c 20 61  osub, regOutB, a
15aa0 64 64 72 4f 75 74 42 29 3b 0a 20 20 20 20 73 71  ddrOutB);.    sq
15ab0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
15ac0 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67  v, OP_Yield, reg
15ad0 41 64 64 72 42 29 3b 0a 20 20 20 20 73 71 6c 69  AddrB);.    sqli
15ae0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
15af0 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64   OP_Goto, 0, add
15b00 72 45 6f 66 41 29 3b 0a 20 20 20 20 70 2d 3e 6e  rEofA);.    p->n
15b10 53 65 6c 65 63 74 52 6f 77 20 2b 3d 20 70 50 72  SelectRow += pPr
15b20 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b  ior->nSelectRow;
15b30 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  .  }..  /* Gener
15b40 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65  ate a subroutine
15b50 20 74 6f 20 72 75 6e 20 77 68 65 6e 20 74 68 65   to run when the
15b60 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 73 65   results from se
15b70 6c 65 63 74 20 42 0a 20 20 2a 2a 20 61 72 65 20  lect B.  ** are 
15b80 65 78 68 61 75 73 74 65 64 20 61 6e 64 20 6f 6e  exhausted and on
15b90 6c 79 20 64 61 74 61 20 69 6e 20 73 65 6c 65 63  ly data in selec
15ba0 74 20 41 20 72 65 6d 61 69 6e 73 2e 0a 20 20 2a  t A remains..  *
15bb0 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49  /.  if( op==TK_I
15bc0 4e 54 45 52 53 45 43 54 20 29 7b 0a 20 20 20 20  NTERSECT ){.    
15bd0 61 64 64 72 45 6f 66 42 20 3d 20 61 64 64 72 45  addrEofB = addrE
15be0 6f 66 41 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  ofA;.    if( p->
15bf0 6e 53 65 6c 65 63 74 52 6f 77 20 3e 20 70 50 72  nSelectRow > pPr
15c00 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20  ior->nSelectRow 
15c10 29 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20  ) p->nSelectRow 
15c20 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63  = pPrior->nSelec
15c30 74 52 6f 77 3b 0a 20 20 7d 65 6c 73 65 7b 20 20  tRow;.  }else{  
15c40 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d  .    VdbeNoopCom
15c50 6d 65 6e 74 28 28 76 2c 20 22 65 6f 66 2d 42 20  ment((v, "eof-B 
15c60 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20  subroutine"));. 
15c70 20 20 20 61 64 64 72 45 6f 66 42 20 3d 20 73 71     addrEofB = sq
15c80 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
15c90 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 45 6f 66  v, OP_If, regEof
15ca0 41 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20  A, labelEnd);.  
15cb0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15cc0 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
15cd0 20 72 65 67 4f 75 74 41 2c 20 61 64 64 72 4f 75   regOutA, addrOu
15ce0 74 41 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  tA);.    sqlite3
15cf0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
15d00 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41  _Yield, regAddrA
15d10 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
15d20 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
15d30 6f 74 6f 2c 20 30 2c 20 61 64 64 72 45 6f 66 42  oto, 0, addrEofB
15d40 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e  );.  }..  /* Gen
15d50 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 68 61  erate code to ha
15d60 6e 64 6c 65 20 74 68 65 20 63 61 73 65 20 6f 66  ndle the case of
15d70 20 41 3c 42 0a 20 20 2a 2f 0a 20 20 56 64 62 65   A<B.  */.  Vdbe
15d80 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  NoopComment((v, 
15d90 22 41 2d 6c 74 2d 42 20 73 75 62 72 6f 75 74 69  "A-lt-B subrouti
15da0 6e 65 22 29 29 3b 0a 20 20 61 64 64 72 41 6c 74  ne"));.  addrAlt
15db0 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  B = sqlite3VdbeA
15dc0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75  ddOp2(v, OP_Gosu
15dd0 62 2c 20 72 65 67 4f 75 74 41 2c 20 61 64 64 72  b, regOutA, addr
15de0 4f 75 74 41 29 3b 0a 20 20 73 71 6c 69 74 65 33  OutA);.  sqlite3
15df0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
15e00 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41  _Yield, regAddrA
15e10 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
15e20 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c  AddOp2(v, OP_If,
15e30 20 72 65 67 45 6f 66 41 2c 20 61 64 64 72 45 6f   regEofA, addrEo
15e40 66 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  fA);.  sqlite3Vd
15e50 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
15e60 6f 74 6f 2c 20 30 2c 20 6c 61 62 65 6c 43 6d 70  oto, 0, labelCmp
15e70 72 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  r);..  /* Genera
15e80 74 65 20 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c  te code to handl
15e90 65 20 74 68 65 20 63 61 73 65 20 6f 66 20 41 3d  e the case of A=
15ea0 3d 42 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70  =B.  */.  if( op
15eb0 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20  ==TK_ALL ){.    
15ec0 61 64 64 72 41 65 71 42 20 3d 20 61 64 64 72 41  addrAeqB = addrA
15ed0 6c 74 42 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ltB;.  }else if(
15ee0 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43   op==TK_INTERSEC
15ef0 54 20 29 7b 0a 20 20 20 20 61 64 64 72 41 65 71  T ){.    addrAeq
15f00 42 20 3d 20 61 64 64 72 41 6c 74 42 3b 0a 20 20  B = addrAltB;.  
15f10 20 20 61 64 64 72 41 6c 74 42 2b 2b 3b 0a 20 20    addrAltB++;.  
15f20 7d 65 6c 73 65 7b 0a 20 20 20 20 56 64 62 65 4e  }else{.    VdbeN
15f30 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  oopComment((v, "
15f40 41 2d 65 71 2d 42 20 73 75 62 72 6f 75 74 69 6e  A-eq-B subroutin
15f50 65 22 29 29 3b 0a 20 20 20 20 61 64 64 72 41 65  e"));.    addrAe
15f60 71 42 20 3d 0a 20 20 20 20 73 71 6c 69 74 65 33  qB =.    sqlite3
15f70 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
15f80 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41  _Yield, regAddrA
15f90 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
15fa0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
15fb0 66 2c 20 72 65 67 45 6f 66 41 2c 20 61 64 64 72  f, regEofA, addr
15fc0 45 6f 66 41 29 3b 0a 20 20 20 20 73 71 6c 69 74  EofA);.    sqlit
15fd0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
15fe0 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c 61 62 65  OP_Goto, 0, labe
15ff0 6c 43 6d 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f  lCmpr);.  }..  /
16000 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
16010 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 63 61  to handle the ca
16020 73 65 20 6f 66 20 41 3e 42 0a 20 20 2a 2f 0a 20  se of A>B.  */. 
16030 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74   VdbeNoopComment
16040 28 28 76 2c 20 22 41 2d 67 74 2d 42 20 73 75 62  ((v, "A-gt-B sub
16050 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 61 64  routine"));.  ad
16060 64 72 41 67 74 42 20 3d 20 73 71 6c 69 74 65 33  drAgtB = sqlite3
16070 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
16080 76 29 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b  v);.  if( op==TK
16090 5f 41 4c 4c 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55  _ALL || op==TK_U
160a0 4e 49 4f 4e 20 29 7b 0a 20 20 20 20 73 71 6c 69  NION ){.    sqli
160b0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
160c0 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75   OP_Gosub, regOu
160d0 74 42 2c 20 61 64 64 72 4f 75 74 42 29 3b 0a 20  tB, addrOutB);. 
160e0 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
160f0 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65  AddOp1(v, OP_Yie
16100 6c 64 2c 20 72 65 67 41 64 64 72 42 29 3b 0a 20  ld, regAddrB);. 
16110 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
16120 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67  p2(v, OP_If, reg
16130 45 6f 66 42 2c 20 61 64 64 72 45 6f 66 42 29 3b  EofB, addrEofB);
16140 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
16150 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
16160 20 30 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a   0, labelCmpr);.
16170 0a 20 20 2f 2a 20 54 68 69 73 20 63 6f 64 65 20  .  /* This code 
16180 72 75 6e 73 20 6f 6e 63 65 20 74 6f 20 69 6e 69  runs once to ini
16190 74 69 61 6c 69 7a 65 20 65 76 65 72 79 74 68 69  tialize everythi
161a0 6e 67 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ng..  */.  sqlit
161b0 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
161c0 2c 20 6a 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  , j1);.  sqlite3
161d0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
161e0 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67  _Integer, 0, reg
161f0 45 6f 66 41 29 3b 0a 20 20 73 71 6c 69 74 65 33  EofA);.  sqlite3
16200 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
16210 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67  _Integer, 0, reg
16220 45 6f 66 42 29 3b 0a 20 20 73 71 6c 69 74 65 33  EofB);.  sqlite3
16230 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
16240 5f 47 6f 73 75 62 2c 20 72 65 67 41 64 64 72 41  _Gosub, regAddrA
16250 2c 20 61 64 64 72 53 65 6c 65 63 74 41 29 3b 0a  , addrSelectA);.
16260 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
16270 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
16280 20 72 65 67 41 64 64 72 42 2c 20 61 64 64 72 53   regAddrB, addrS
16290 65 6c 65 63 74 42 29 3b 0a 20 20 73 71 6c 69 74  electB);.  sqlit
162a0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
162b0 4f 50 5f 49 66 2c 20 72 65 67 45 6f 66 41 2c 20  OP_If, regEofA, 
162c0 61 64 64 72 45 6f 66 41 29 3b 0a 20 20 73 71 6c  addrEofA);.  sql
162d0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
162e0 2c 20 4f 50 5f 49 66 2c 20 72 65 67 45 6f 66 42  , OP_If, regEofB
162f0 2c 20 61 64 64 72 45 6f 66 42 29 3b 0a 0a 20 20  , addrEofB);..  
16300 2f 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 74 68 65  /* Implement the
16310 20 6d 61 69 6e 20 6d 65 72 67 65 20 6c 6f 6f 70   main merge loop
16320 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  .  */.  sqlite3V
16330 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
16340 76 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 20  v, labelCmpr);. 
16350 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
16360 70 34 28 76 2c 20 4f 50 5f 50 65 72 6d 75 74 61  p4(v, OP_Permuta
16370 74 69 6f 6e 2c 20 30 2c 20 30 2c 20 30 2c 20 28  tion, 0, 0, 0, (
16380 63 68 61 72 2a 29 61 50 65 72 6d 75 74 65 2c 20  char*)aPermute, 
16390 50 34 5f 49 4e 54 41 52 52 41 59 29 3b 0a 20 20  P4_INTARRAY);.  
163a0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
163b0 34 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c  4(v, OP_Compare,
163c0 20 64 65 73 74 41 2e 69 53 64 73 74 2c 20 64 65   destA.iSdst, de
163d0 73 74 42 2e 69 53 64 73 74 2c 20 6e 4f 72 64 65  stB.iSdst, nOrde
163e0 72 42 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rBy,.           
163f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
16400 68 61 72 2a 29 70 4b 65 79 4d 65 72 67 65 2c 20  har*)pKeyMerge, 
16410 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 73  P4_KEYINFO);.  s
16420 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
16430 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 50 45 52  P5(v, OPFLAG_PER
16440 4d 55 54 45 29 3b 0a 20 20 73 71 6c 69 74 65 33  MUTE);.  sqlite3
16450 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
16460 5f 4a 75 6d 70 2c 20 61 64 64 72 41 6c 74 42 2c  _Jump, addrAltB,
16470 20 61 64 64 72 41 65 71 42 2c 20 61 64 64 72 41   addrAeqB, addrA
16480 67 74 42 29 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70  gtB);..  /* Jump
16490 20 74 6f 20 74 68 65 20 74 68 69 73 20 70 6f 69   to the this poi
164a0 6e 74 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 74  nt in order to t
164b0 65 72 6d 69 6e 61 74 65 20 74 68 65 20 71 75 65  erminate the que
164c0 72 79 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ry..  */.  sqlit
164d0 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
164e0 65 6c 28 76 2c 20 6c 61 62 65 6c 45 6e 64 29 3b  el(v, labelEnd);
164f0 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6e  ..  /* Set the n
16500 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20  umber of output 
16510 63 6f 6c 75 6d 6e 73 0a 20 20 2a 2f 0a 20 20 69  columns.  */.  i
16520 66 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d  f( pDest->eDest=
16530 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20  =SRT_Output ){. 
16540 20 20 20 53 65 6c 65 63 74 20 2a 70 46 69 72 73     Select *pFirs
16550 74 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20  t = pPrior;.    
16560 77 68 69 6c 65 28 20 70 46 69 72 73 74 2d 3e 70  while( pFirst->p
16570 50 72 69 6f 72 20 29 20 70 46 69 72 73 74 20 3d  Prior ) pFirst =
16580 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 3b   pFirst->pPrior;
16590 0a 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c  .    generateCol
165a0 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c  umnNames(pParse,
165b0 20 30 2c 20 70 46 69 72 73 74 2d 3e 70 45 4c 69   0, pFirst->pELi
165c0 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52  st);.  }..  /* R
165d0 65 61 73 73 65 6d 62 6c 79 20 74 68 65 20 63 6f  eassembly the co
165e0 6d 70 6f 75 6e 64 20 71 75 65 72 79 20 73 6f 20  mpound query so 
165f0 74 68 61 74 20 69 74 20 77 69 6c 6c 20 62 65 20  that it will be 
16600 66 72 65 65 64 20 63 6f 72 72 65 63 74 6c 79 0a  freed correctly.
16610 20 20 2a 2a 20 62 79 20 74 68 65 20 63 61 6c 6c    ** by the call
16620 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  ing function */.
16630 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20    if( p->pPrior 
16640 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  ){.    sqlite3Se
16650 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70  lectDelete(db, p
16660 2d 3e 70 50 72 69 6f 72 29 3b 0a 20 20 7d 0a 20  ->pPrior);.  }. 
16670 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72   p->pPrior = pPr
16680 69 6f 72 3b 0a 0a 20 20 2f 2a 2a 2a 20 54 42 44  ior;..  /*** TBD
16690 3a 20 20 49 6e 73 65 72 74 20 73 75 62 72 6f 75  :  Insert subrou
166a0 74 69 6e 65 20 63 61 6c 6c 73 20 74 6f 20 63 6c  tine calls to cl
166b0 6f 73 65 20 63 75 72 73 6f 72 73 20 6f 6e 20 69  ose cursors on i
166c0 6e 63 6f 6d 70 6c 65 74 65 0a 20 20 2a 2a 2a 2a  ncomplete.  ****
166d0 20 73 75 62 71 75 65 72 69 65 73 20 2a 2a 2a 2a   subqueries ****
166e0 2f 0a 20 20 65 78 70 6c 61 69 6e 43 6f 6d 70 6f  /.  explainCompo
166f0 73 69 74 65 28 70 50 61 72 73 65 2c 20 70 2d 3e  site(pParse, p->
16700 6f 70 2c 20 69 53 75 62 31 2c 20 69 53 75 62 32  op, iSub1, iSub2
16710 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  , 0);.  return S
16720 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  QLITE_OK;.}.#end
16730 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  if..#if !defined
16740 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42  (SQLITE_OMIT_SUB
16750 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e  QUERY) || !defin
16760 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
16770 49 45 57 29 0a 2f 2a 20 46 6f 72 77 61 72 64 20  IEW)./* Forward 
16780 44 65 63 6c 61 72 61 74 69 6f 6e 73 20 2a 2f 0a  Declarations */.
16790 73 74 61 74 69 63 20 76 6f 69 64 20 73 75 62 73  static void subs
167a0 74 45 78 70 72 4c 69 73 74 28 73 71 6c 69 74 65  tExprList(sqlite
167b0 33 2a 2c 20 45 78 70 72 4c 69 73 74 2a 2c 20 69  3*, ExprList*, i
167c0 6e 74 2c 20 45 78 70 72 4c 69 73 74 2a 29 3b 0a  nt, ExprList*);.
167d0 73 74 61 74 69 63 20 76 6f 69 64 20 73 75 62 73  static void subs
167e0 74 53 65 6c 65 63 74 28 73 71 6c 69 74 65 33 2a  tSelect(sqlite3*
167f0 2c 20 53 65 6c 65 63 74 20 2a 2c 20 69 6e 74 2c  , Select *, int,
16800 20 45 78 70 72 4c 69 73 74 20 2a 29 3b 0a 0a 2f   ExprList *);../
16810 2a 0a 2a 2a 20 53 63 61 6e 20 74 68 72 6f 75 67  *.** Scan throug
16820 68 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  h the expression
16830 20 70 45 78 70 72 2e 20 20 52 65 70 6c 61 63 65   pExpr.  Replace
16840 20 65 76 65 72 79 20 72 65 66 65 72 65 6e 63 65   every reference
16850 20 74 6f 0a 2a 2a 20 61 20 63 6f 6c 75 6d 6e 20   to.** a column 
16860 69 6e 20 74 61 62 6c 65 20 6e 75 6d 62 65 72 20  in table number 
16870 69 54 61 62 6c 65 20 77 69 74 68 20 61 20 63 6f  iTable with a co
16880 70 79 20 6f 66 20 74 68 65 20 69 43 6f 6c 75 6d  py of the iColum
16890 6e 2d 74 68 0a 2a 2a 20 65 6e 74 72 79 20 69 6e  n-th.** entry in
168a0 20 70 45 4c 69 73 74 2e 20 20 28 42 75 74 20 6c   pEList.  (But l
168b0 65 61 76 65 20 72 65 66 65 72 65 6e 63 65 73 20  eave references 
168c0 74 6f 20 74 68 65 20 52 4f 57 49 44 20 63 6f 6c  to the ROWID col
168d0 75 6d 6e 20 0a 2a 2a 20 75 6e 63 68 61 6e 67 65  umn .** unchange
168e0 64 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  d.).**.** This r
168f0 6f 75 74 69 6e 65 20 69 73 20 70 61 72 74 20 6f  outine is part o
16900 66 20 74 68 65 20 66 6c 61 74 74 65 6e 69 6e 67  f the flattening
16910 20 70 72 6f 63 65 64 75 72 65 2e 20 20 41 20 73   procedure.  A s
16920 75 62 71 75 65 72 79 0a 2a 2a 20 77 68 6f 73 65  ubquery.** whose
16930 20 72 65 73 75 6c 74 20 73 65 74 20 69 73 20 64   result set is d
16940 65 66 69 6e 65 64 20 62 79 20 70 45 4c 69 73 74  efined by pEList
16950 20 61 70 70 65 61 72 73 20 61 73 20 65 6e 74 72   appears as entr
16960 79 20 69 6e 20 74 68 65 0a 2a 2a 20 46 52 4f 4d  y in the.** FROM
16970 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c   clause of a SEL
16980 45 43 54 20 73 75 63 68 20 74 68 61 74 20 74 68  ECT such that th
16990 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 61 73  e VDBE cursor as
169a0 73 69 67 6e 65 64 20 74 6f 20 74 68 61 74 0a 2a  signed to that.*
169b0 2a 20 46 4f 52 4d 20 63 6c 61 75 73 65 20 65 6e  * FORM clause en
169c0 74 72 79 20 69 73 20 69 54 61 62 6c 65 2e 20 20  try is iTable.  
169d0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 6b  This routine mak
169e0 65 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20  e the necessary 
169f0 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 70  .** changes to p
16a00 45 78 70 72 20 73 6f 20 74 68 61 74 20 69 74 20  Expr so that it 
16a10 72 65 66 65 72 73 20 64 69 72 65 63 74 6c 79 20  refers directly 
16a20 74 6f 20 74 68 65 20 73 6f 75 72 63 65 20 74 61  to the source ta
16a30 62 6c 65 0a 2a 2a 20 6f 66 20 74 68 65 20 73 75  ble.** of the su
16a40 62 71 75 65 72 79 20 72 61 74 68 65 72 20 74 68  bquery rather th
16a50 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20  e result set of 
16a60 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a 2a 2f  the subquery..*/
16a70 0a 73 74 61 74 69 63 20 45 78 70 72 20 2a 73 75  .static Expr *su
16a80 62 73 74 45 78 70 72 28 0a 20 20 73 71 6c 69 74  bstExpr(.  sqlit
16a90 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 2f  e3 *db,        /
16aa0 2a 20 52 65 70 6f 72 74 20 6d 61 6c 6c 6f 63 20  * Report malloc 
16ab0 65 72 72 6f 72 73 20 74 6f 20 74 68 69 73 20 63  errors to this c
16ac0 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 45  onnection */.  E
16ad0 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20  xpr *pExpr,     
16ae0 20 20 20 2f 2a 20 45 78 70 72 20 69 6e 20 77 68     /* Expr in wh
16af0 69 63 68 20 73 75 62 73 74 69 74 75 74 69 6f 6e  ich substitution
16b00 20 6f 63 63 75 72 73 20 2a 2f 0a 20 20 69 6e 74   occurs */.  int
16b10 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20   iTable,        
16b20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20   /* Table to be 
16b30 73 75 62 73 74 69 74 75 74 65 64 20 2a 2f 0a 20  substituted */. 
16b40 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
16b50 74 20 20 20 20 2f 2a 20 53 75 62 73 74 69 74 75  t    /* Substitu
16b60 74 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 2a  te expressions *
16b70 2f 0a 29 7b 0a 20 20 69 66 28 20 70 45 78 70 72  /.){.  if( pExpr
16b80 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
16b90 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d    if( pExpr->op=
16ba0 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 45  =TK_COLUMN && pE
16bb0 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61  xpr->iTable==iTa
16bc0 62 6c 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ble ){.    if( p
16bd0 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20  Expr->iColumn<0 
16be0 29 7b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  ){.      pExpr->
16bf0 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20  op = TK_NULL;.  
16c00 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 45    }else{.      E
16c10 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 20 20 20  xpr *pNew;.     
16c20 20 61 73 73 65 72 74 28 20 70 45 4c 69 73 74 21   assert( pEList!
16c30 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 69 43 6f  =0 && pExpr->iCo
16c40 6c 75 6d 6e 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  lumn<pEList->nEx
16c50 70 72 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  pr );.      asse
16c60 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  rt( pExpr->pLeft
16c70 3d 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 70 52  ==0 && pExpr->pR
16c80 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ight==0 );.     
16c90 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45   pNew = sqlite3E
16ca0 78 70 72 44 75 70 28 64 62 2c 20 70 45 4c 69 73  xprDup(db, pELis
16cb0 74 2d 3e 61 5b 70 45 78 70 72 2d 3e 69 43 6f 6c  t->a[pExpr->iCol
16cc0 75 6d 6e 5d 2e 70 45 78 70 72 2c 20 30 29 3b 0a  umn].pExpr, 0);.
16cd0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
16ce0 72 44 65 6c 65 74 65 28 64 62 2c 20 70 45 78 70  rDelete(db, pExp
16cf0 72 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72 20  r);.      pExpr 
16d00 3d 20 70 4e 65 77 3b 0a 20 20 20 20 7d 0a 20 20  = pNew;.    }.  
16d10 7d 65 6c 73 65 7b 0a 20 20 20 20 70 45 78 70 72  }else{.    pExpr
16d20 2d 3e 70 4c 65 66 74 20 3d 20 73 75 62 73 74 45  ->pLeft = substE
16d30 78 70 72 28 64 62 2c 20 70 45 78 70 72 2d 3e 70  xpr(db, pExpr->p
16d40 4c 65 66 74 2c 20 69 54 61 62 6c 65 2c 20 70 45  Left, iTable, pE
16d50 4c 69 73 74 29 3b 0a 20 20 20 20 70 45 78 70 72  List);.    pExpr
16d60 2d 3e 70 52 69 67 68 74 20 3d 20 73 75 62 73 74  ->pRight = subst
16d70 45 78 70 72 28 64 62 2c 20 70 45 78 70 72 2d 3e  Expr(db, pExpr->
16d80 70 52 69 67 68 74 2c 20 69 54 61 62 6c 65 2c 20  pRight, iTable, 
16d90 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 69 66 28  pEList);.    if(
16da0 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
16db0 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  (pExpr, EP_xIsSe
16dc0 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20 73  lect) ){.      s
16dd0 75 62 73 74 53 65 6c 65 63 74 28 64 62 2c 20 70  ubstSelect(db, p
16de0 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2c  Expr->x.pSelect,
16df0 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
16e00 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
16e10 20 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74     substExprList
16e20 28 64 62 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c  (db, pExpr->x.pL
16e30 69 73 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c  ist, iTable, pEL
16e40 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ist);.    }.  }.
16e50 20 20 72 65 74 75 72 6e 20 70 45 78 70 72 3b 0a    return pExpr;.
16e60 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75  }.static void su
16e70 62 73 74 45 78 70 72 4c 69 73 74 28 0a 20 20 73  bstExprList(.  s
16e80 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
16e90 20 20 20 20 2f 2a 20 52 65 70 6f 72 74 20 6d 61      /* Report ma
16ea0 6c 6c 6f 63 20 65 72 72 6f 72 73 20 68 65 72 65  lloc errors here
16eb0 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
16ec0 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 4c 69  pList,     /* Li
16ed0 73 74 20 74 6f 20 73 63 61 6e 20 61 6e 64 20 69  st to scan and i
16ee0 6e 20 77 68 69 63 68 20 74 6f 20 6d 61 6b 65 20  n which to make 
16ef0 73 75 62 73 74 69 74 75 74 65 73 20 2a 2f 0a 20  substitutes */. 
16f00 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20   int iTable,    
16f10 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74        /* Table t
16f20 6f 20 62 65 20 73 75 62 73 74 69 74 75 74 65 64  o be substituted
16f30 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
16f40 70 45 4c 69 73 74 20 20 20 20 20 2f 2a 20 53 75  pEList     /* Su
16f50 62 73 74 69 74 75 74 65 20 76 61 6c 75 65 73 20  bstitute values 
16f60 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  */.){.  int i;. 
16f70 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
16f80 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d  return;.  for(i=
16f90 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  0; i<pList->nExp
16fa0 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 4c 69  r; i++){.    pLi
16fb0 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 20 3d  st->a[i].pExpr =
16fc0 20 73 75 62 73 74 45 78 70 72 28 64 62 2c 20 70   substExpr(db, p
16fd0 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
16fe0 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
16ff0 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20  );.  }.}.static 
17000 76 6f 69 64 20 73 75 62 73 74 53 65 6c 65 63 74  void substSelect
17010 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
17020 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 70 6f           /* Repo
17030 72 74 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73  rt malloc errors
17040 20 68 65 72 65 20 2a 2f 0a 20 20 53 65 6c 65 63   here */.  Selec
17050 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
17060 2f 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  /* SELECT statem
17070 65 6e 74 20 69 6e 20 77 68 69 63 68 20 74 6f 20  ent in which to 
17080 6d 61 6b 65 20 73 75 62 73 74 69 74 75 74 69 6f  make substitutio
17090 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  ns */.  int iTab
170a0 6c 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  le,          /* 
170b0 54 61 62 6c 65 20 74 6f 20 62 65 20 72 65 70 6c  Table to be repl
170c0 61 63 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69  aced */.  ExprLi
170d0 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20 20 2f  st *pEList     /
170e0 2a 20 53 75 62 73 74 69 74 75 74 65 20 76 61 6c  * Substitute val
170f0 75 65 73 20 2a 2f 0a 29 7b 0a 20 20 53 72 63 4c  ues */.){.  SrcL
17100 69 73 74 20 2a 70 53 72 63 3b 0a 20 20 73 74 72  ist *pSrc;.  str
17110 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
17120 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69   *pItem;.  int i
17130 3b 0a 20 20 69 66 28 20 21 70 20 29 20 72 65 74  ;.  if( !p ) ret
17140 75 72 6e 3b 0a 20 20 73 75 62 73 74 45 78 70 72  urn;.  substExpr
17150 4c 69 73 74 28 64 62 2c 20 70 2d 3e 70 45 4c 69  List(db, p->pELi
17160 73 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69  st, iTable, pELi
17170 73 74 29 3b 0a 20 20 73 75 62 73 74 45 78 70 72  st);.  substExpr
17180 4c 69 73 74 28 64 62 2c 20 70 2d 3e 70 47 72 6f  List(db, p->pGro
17190 75 70 42 79 2c 20 69 54 61 62 6c 65 2c 20 70 45  upBy, iTable, pE
171a0 4c 69 73 74 29 3b 0a 20 20 73 75 62 73 74 45 78  List);.  substEx
171b0 70 72 4c 69 73 74 28 64 62 2c 20 70 2d 3e 70 4f  prList(db, p->pO
171c0 72 64 65 72 42 79 2c 20 69 54 61 62 6c 65 2c 20  rderBy, iTable, 
171d0 70 45 4c 69 73 74 29 3b 0a 20 20 70 2d 3e 70 48  pEList);.  p->pH
171e0 61 76 69 6e 67 20 3d 20 73 75 62 73 74 45 78 70  aving = substExp
171f0 72 28 64 62 2c 20 70 2d 3e 70 48 61 76 69 6e 67  r(db, p->pHaving
17200 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
17210 29 3b 0a 20 20 70 2d 3e 70 57 68 65 72 65 20 3d  );.  p->pWhere =
17220 20 73 75 62 73 74 45 78 70 72 28 64 62 2c 20 70   substExpr(db, p
17230 2d 3e 70 57 68 65 72 65 2c 20 69 54 61 62 6c 65  ->pWhere, iTable
17240 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 73 75 62  , pEList);.  sub
17250 73 74 53 65 6c 65 63 74 28 64 62 2c 20 70 2d 3e  stSelect(db, p->
17260 70 50 72 69 6f 72 2c 20 69 54 61 62 6c 65 2c 20  pPrior, iTable, 
17270 70 45 4c 69 73 74 29 3b 0a 20 20 70 53 72 63 20  pEList);.  pSrc 
17280 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73  = p->pSrc;.  ass
17290 65 72 74 28 20 70 53 72 63 20 29 3b 20 20 2f 2a  ert( pSrc );  /*
172a0 20 45 76 65 6e 20 66 6f 72 20 28 53 45 4c 45 43   Even for (SELEC
172b0 54 20 31 29 20 77 65 20 68 61 76 65 3a 20 70 53  T 1) we have: pS
172c0 72 63 21 3d 30 20 62 75 74 20 70 53 72 63 2d 3e  rc!=0 but pSrc->
172d0 6e 53 72 63 3d 3d 30 20 2a 2f 0a 20 20 69 66 28  nSrc==0 */.  if(
172e0 20 41 4c 57 41 59 53 28 70 53 72 63 29 20 29 7b   ALWAYS(pSrc) ){
172f0 0a 20 20 20 20 66 6f 72 28 69 3d 70 53 72 63 2d  .    for(i=pSrc-
17300 3e 6e 53 72 63 2c 20 70 49 74 65 6d 3d 70 53 72  >nSrc, pItem=pSr
17310 63 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20  c->a; i>0; i--, 
17320 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
17330 73 75 62 73 74 53 65 6c 65 63 74 28 64 62 2c 20  substSelect(db, 
17340 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2c 20  pItem->pSelect, 
17350 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
17360 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e  .    }.  }.}.#en
17370 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
17380 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
17390 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65  UERY) || !define
173a0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
173b0 45 57 29 20 2a 2f 0a 0a 23 69 66 20 21 64 65 66  EW) */..#if !def
173c0 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
173d0 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64  _SUBQUERY) || !d
173e0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
173f0 49 54 5f 56 49 45 57 29 0a 2f 2a 0a 2a 2a 20 54  IT_VIEW)./*.** T
17400 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65  his routine atte
17410 6d 70 74 73 20 74 6f 20 66 6c 61 74 74 65 6e 20  mpts to flatten 
17420 73 75 62 71 75 65 72 69 65 73 20 61 73 20 61 20  subqueries as a 
17430 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f 70 74 69  performance opti
17440 6d 69 7a 61 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69  mization..** Thi
17450 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
17460 73 20 31 20 69 66 20 69 74 20 6d 61 6b 65 73 20  s 1 if it makes 
17470 63 68 61 6e 67 65 73 20 61 6e 64 20 30 20 69 66  changes and 0 if
17480 20 6e 6f 20 66 6c 61 74 74 65 6e 69 6e 67 20 6f   no flattening o
17490 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20  ccurs..**.** To 
174a0 75 6e 64 65 72 73 74 61 6e 64 20 74 68 65 20 63  understand the c
174b0 6f 6e 63 65 70 74 20 6f 66 20 66 6c 61 74 74 65  oncept of flatte
174c0 6e 69 6e 67 2c 20 63 6f 6e 73 69 64 65 72 20 74  ning, consider t
174d0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20  he following.** 
174e0 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  query:.**.**    
174f0 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 28   SELECT a FROM (
17500 53 45 4c 45 43 54 20 78 2b 79 20 41 53 20 61 20  SELECT x+y AS a 
17510 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 7a 3c  FROM t1 WHERE z<
17520 31 30 30 29 20 57 48 45 52 45 20 61 3e 35 0a 2a  100) WHERE a>5.*
17530 2a 0a 2a 2a 20 54 68 65 20 64 65 66 61 75 6c 74  *.** The default
17540 20 77 61 79 20 6f 66 20 69 6d 70 6c 65 6d 65 6e   way of implemen
17550 74 69 6e 67 20 74 68 69 73 20 71 75 65 72 79 20  ting this query 
17560 69 73 20 74 6f 20 65 78 65 63 75 74 65 20 74 68  is to execute th
17570 65 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 66 69  e.** subquery fi
17580 72 73 74 20 61 6e 64 20 73 74 6f 72 65 20 74 68  rst and store th
17590 65 20 72 65 73 75 6c 74 73 20 69 6e 20 61 20 74  e results in a t
175a0 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20  emporary table, 
175b0 74 68 65 6e 0a 2a 2a 20 72 75 6e 20 74 68 65 20  then.** run the 
175c0 6f 75 74 65 72 20 71 75 65 72 79 20 6f 6e 20 74  outer query on t
175d0 68 61 74 20 74 65 6d 70 6f 72 61 72 79 20 74 61  hat temporary ta
175e0 62 6c 65 2e 20 20 54 68 69 73 20 72 65 71 75 69  ble.  This requi
175f0 72 65 73 20 74 77 6f 0a 2a 2a 20 70 61 73 73 65  res two.** passe
17600 73 20 6f 76 65 72 20 74 68 65 20 64 61 74 61 2e  s over the data.
17610 20 20 46 75 72 74 68 65 72 6d 6f 72 65 2c 20 62    Furthermore, b
17620 65 63 61 75 73 65 20 74 68 65 20 74 65 6d 70 6f  ecause the tempo
17630 72 61 72 79 20 74 61 62 6c 65 0a 2a 2a 20 68 61  rary table.** ha
17640 73 20 6e 6f 20 69 6e 64 69 63 65 73 2c 20 74 68  s no indices, th
17650 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f  e WHERE clause o
17660 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  n the outer quer
17670 79 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6f  y cannot be.** o
17680 70 74 69 6d 69 7a 65 64 2e 0a 2a 2a 0a 2a 2a 20  ptimized..**.** 
17690 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74  This routine att
176a0 65 6d 70 74 73 20 74 6f 20 72 65 77 72 69 74 65  empts to rewrite
176b0 20 71 75 65 72 69 65 73 20 73 75 63 68 20 61 73   queries such as
176c0 20 74 68 65 20 61 62 6f 76 65 20 69 6e 74 6f 0a   the above into.
176d0 2a 2a 20 61 20 73 69 6e 67 6c 65 20 66 6c 61 74  ** a single flat
176e0 20 73 65 6c 65 63 74 2c 20 6c 69 6b 65 20 74 68   select, like th
176f0 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45  is:.**.**     SE
17700 4c 45 43 54 20 78 2b 79 20 41 53 20 61 20 46 52  LECT x+y AS a FR
17710 4f 4d 20 74 31 20 57 48 45 52 45 20 7a 3c 31 30  OM t1 WHERE z<10
17720 30 20 41 4e 44 20 61 3e 35 0a 2a 2a 0a 2a 2a 20  0 AND a>5.**.** 
17730 54 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74  The code generat
17740 65 64 20 66 6f 72 20 74 68 69 73 20 73 69 6d 70  ed for this simp
17750 69 66 69 63 61 74 69 6f 6e 20 67 69 76 65 73 20  ification gives 
17760 74 68 65 20 73 61 6d 65 20 72 65 73 75 6c 74 0a  the same result.
17770 2a 2a 20 62 75 74 20 6f 6e 6c 79 20 68 61 73 20  ** but only has 
17780 74 6f 20 73 63 61 6e 20 74 68 65 20 64 61 74 61  to scan the data
17790 20 6f 6e 63 65 2e 20 20 41 6e 64 20 62 65 63 61   once.  And beca
177a0 75 73 65 20 69 6e 64 69 63 65 73 20 6d 69 67 68  use indices migh
177b0 74 20 0a 2a 2a 20 65 78 69 73 74 20 6f 6e 20 74  t .** exist on t
177c0 68 65 20 74 61 62 6c 65 20 74 31 2c 20 61 20 63  he table t1, a c
177d0 6f 6d 70 6c 65 74 65 20 73 63 61 6e 20 6f 66 20  omplete scan of 
177e0 74 68 65 20 64 61 74 61 20 6d 69 67 68 74 20 62  the data might b
177f0 65 0a 2a 2a 20 61 76 6f 69 64 65 64 2e 0a 2a 2a  e.** avoided..**
17800 0a 2a 2a 20 46 6c 61 74 74 65 6e 69 6e 67 20 69  .** Flattening i
17810 73 20 6f 6e 6c 79 20 61 74 74 65 6d 70 74 65 64  s only attempted
17820 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66   if all of the f
17830 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75  ollowing are tru
17840 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 20  e:.**.**   (1)  
17850 54 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64  The subquery and
17860 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
17870 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20 75 73 65   do not both use
17880 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a   aggregates..**.
17890 2a 2a 20 20 20 28 32 29 20 20 54 68 65 20 73 75  **   (2)  The su
178a0 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 6e  bquery is not an
178b0 20 61 67 67 72 65 67 61 74 65 20 6f 72 20 74 68   aggregate or th
178c0 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73  e outer query is
178d0 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a   not a join..**.
178e0 2a 2a 20 20 20 28 33 29 20 20 54 68 65 20 73 75  **   (3)  The su
178f0 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 74 68  bquery is not th
17900 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20  e right operand 
17910 6f 66 20 61 20 6c 65 66 74 20 6f 75 74 65 72 20  of a left outer 
17920 6a 6f 69 6e 0a 2a 2a 20 20 20 20 20 20 20 20 28  join.**        (
17930 4f 72 69 67 69 6e 61 6c 6c 79 20 74 69 63 6b 65  Originally ticke
17940 74 20 23 33 30 36 2e 20 20 53 74 72 65 6e 67 74  t #306.  Strengt
17950 68 65 6e 65 64 20 62 79 20 74 69 63 6b 65 74 20  hened by ticket 
17960 23 33 33 30 30 29 0a 2a 2a 0a 2a 2a 20 20 20 28  #3300).**.**   (
17970 34 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  4)  The subquery
17980 20 69 73 20 6e 6f 74 20 44 49 53 54 49 4e 43 54   is not DISTINCT
17990 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 41  ..**.**  (**)  A
179a0 74 20 6f 6e 65 20 70 6f 69 6e 74 20 72 65 73 74  t one point rest
179b0 72 69 63 74 69 6f 6e 73 20 28 34 29 20 61 6e 64  rictions (4) and
179c0 20 28 35 29 20 64 65 66 69 6e 65 64 20 61 20 73   (5) defined a s
179d0 75 62 73 65 74 20 6f 66 20 44 49 53 54 49 4e 43  ubset of DISTINC
179e0 54 0a 2a 2a 20 20 20 20 20 20 20 20 73 75 62 2d  T.**        sub-
179f0 71 75 65 72 69 65 73 20 74 68 61 74 20 77 65 72  queries that wer
17a00 65 20 65 78 63 6c 75 64 65 64 20 66 72 6f 6d 20  e excluded from 
17a10 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f  this optimizatio
17a20 6e 2e 20 52 65 73 74 72 69 63 74 69 6f 6e 20 0a  n. Restriction .
17a30 2a 2a 20 20 20 20 20 20 20 20 28 34 29 20 68 61  **        (4) ha
17a40 73 20 73 69 6e 63 65 20 62 65 65 6e 20 65 78 70  s since been exp
17a50 61 6e 64 65 64 20 74 6f 20 65 78 63 6c 75 64 65  anded to exclude
17a60 20 61 6c 6c 20 44 49 53 54 49 4e 43 54 20 73 75   all DISTINCT su
17a70 62 71 75 65 72 69 65 73 2e 0a 2a 2a 0a 2a 2a 20  bqueries..**.** 
17a80 20 20 28 36 29 20 20 54 68 65 20 73 75 62 71 75    (6)  The subqu
17a90 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  ery does not use
17aa0 20 61 67 67 72 65 67 61 74 65 73 20 6f 72 20 74   aggregates or t
17ab0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69  he outer query i
17ac0 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20  s not.**        
17ad0 44 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20  DISTINCT..**.** 
17ae0 20 20 28 37 29 20 20 54 68 65 20 73 75 62 71 75    (7)  The subqu
17af0 65 72 79 20 68 61 73 20 61 20 46 52 4f 4d 20 63  ery has a FROM c
17b00 6c 61 75 73 65 2e 20 20 54 4f 44 4f 3a 20 20 46  lause.  TODO:  F
17b10 6f 72 20 73 75 62 71 75 65 72 69 65 73 20 77 69  or subqueries wi
17b20 74 68 6f 75 74 0a 2a 2a 20 20 20 20 20 20 20 20  thout.**        
17b30 41 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c 20 63  A FROM clause, c
17b40 6f 6e 73 69 64 65 72 20 61 64 64 69 6e 67 20 61  onsider adding a
17b50 20 46 52 4f 4d 20 63 6c 6f 73 65 20 77 69 74 68   FROM close with
17b60 20 74 68 65 20 73 70 65 63 69 61 6c 0a 2a 2a 20   the special.** 
17b70 20 20 20 20 20 20 20 74 61 62 6c 65 20 73 71 6c         table sql
17b80 69 74 65 5f 6f 6e 63 65 20 74 68 61 74 20 63 6f  ite_once that co
17b90 6e 73 69 73 74 73 20 6f 66 20 61 20 73 69 6e 67  nsists of a sing
17ba0 6c 65 20 72 6f 77 20 63 6f 6e 74 61 69 6e 69 6e  le row containin
17bb0 67 20 61 0a 2a 2a 20 20 20 20 20 20 20 20 73 69  g a.**        si
17bc0 6e 67 6c 65 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  ngle NULL..**.**
17bd0 20 20 20 28 38 29 20 20 54 68 65 20 73 75 62 71     (8)  The subq
17be0 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73  uery does not us
17bf0 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65 20 6f  e LIMIT or the o
17c00 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f  uter query is no
17c10 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20  t a join..**.** 
17c20 20 20 28 39 29 20 20 54 68 65 20 73 75 62 71 75    (9)  The subqu
17c30 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  ery does not use
17c40 20 4c 49 4d 49 54 20 6f 72 20 74 68 65 20 6f 75   LIMIT or the ou
17c50 74 65 72 20 71 75 65 72 79 20 64 6f 65 73 20 6e  ter query does n
17c60 6f 74 20 75 73 65 0a 2a 2a 20 20 20 20 20 20 20  ot use.**       
17c70 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a   aggregates..**.
17c80 2a 2a 20 20 28 31 30 29 20 20 54 68 65 20 73 75  **  (10)  The su
17c90 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20  bquery does not 
17ca0 75 73 65 20 61 67 67 72 65 67 61 74 65 73 20 6f  use aggregates o
17cb0 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  r the outer quer
17cc0 79 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 20 20  y does not.**   
17cd0 20 20 20 20 20 75 73 65 20 4c 49 4d 49 54 2e 0a       use LIMIT..
17ce0 2a 2a 0a 2a 2a 20 20 28 31 31 29 20 20 54 68 65  **.**  (11)  The
17cf0 20 73 75 62 71 75 65 72 79 20 61 6e 64 20 74 68   subquery and th
17d00 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f  e outer query do
17d10 20 6e 6f 74 20 62 6f 74 68 20 68 61 76 65 20 4f   not both have O
17d20 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 73 2e  RDER BY clauses.
17d30 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 4e 6f  .**.**  (**)  No
17d40 74 20 69 6d 70 6c 65 6d 65 6e 74 65 64 2e 20 20  t implemented.  
17d50 53 75 62 73 75 6d 65 64 20 69 6e 74 6f 20 72 65  Subsumed into re
17d60 73 74 72 69 63 74 69 6f 6e 20 28 33 29 2e 20 20  striction (3).  
17d70 57 61 73 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a  Was previously.*
17d80 2a 20 20 20 20 20 20 20 20 61 20 73 65 70 61 72  *        a separ
17d90 61 74 65 20 72 65 73 74 72 69 63 74 69 6f 6e 20  ate restriction 
17da0 64 65 72 69 76 69 6e 67 20 66 72 6f 6d 20 74 69  deriving from ti
17db0 63 6b 65 74 20 23 33 35 30 2e 0a 2a 2a 0a 2a 2a  cket #350..**.**
17dc0 20 20 28 31 33 29 20 20 54 68 65 20 73 75 62 71    (13)  The subq
17dd0 75 65 72 79 20 61 6e 64 20 6f 75 74 65 72 20 71  uery and outer q
17de0 75 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68  uery do not both
17df0 20 75 73 65 20 4c 49 4d 49 54 2e 0a 2a 2a 0a 2a   use LIMIT..**.*
17e00 2a 20 20 28 31 34 29 20 20 54 68 65 20 73 75 62  *  (14)  The sub
17e10 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75  query does not u
17e20 73 65 20 4f 46 46 53 45 54 2e 0a 2a 2a 0a 2a 2a  se OFFSET..**.**
17e30 20 20 28 31 35 29 20 20 54 68 65 20 6f 75 74 65    (15)  The oute
17e40 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20 70  r query is not p
17e50 61 72 74 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e  art of a compoun
17e60 64 20 73 65 6c 65 63 74 20 6f 72 20 74 68 65 0a  d select or the.
17e70 2a 2a 20 20 20 20 20 20 20 20 73 75 62 71 75 65  **        subque
17e80 72 79 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65  ry does not have
17e90 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 2e   a LIMIT clause.
17ea0 0a 2a 2a 20 20 20 20 20 20 20 20 28 53 65 65 20  .**        (See 
17eb0 74 69 63 6b 65 74 20 23 32 33 33 39 20 61 6e 64  ticket #2339 and
17ec0 20 74 69 63 6b 65 74 20 5b 30 32 61 38 65 38 31   ticket [02a8e81
17ed0 64 34 34 5d 29 2e 0a 2a 2a 0a 2a 2a 20 20 28 31  d44])..**.**  (1
17ee0 36 29 20 20 54 68 65 20 6f 75 74 65 72 20 71 75  6)  The outer qu
17ef0 65 72 79 20 69 73 20 6e 6f 74 20 61 6e 20 61 67  ery is not an ag
17f00 67 72 65 67 61 74 65 20 6f 72 20 74 68 65 20 73  gregate or the s
17f10 75 62 71 75 65 72 79 20 64 6f 65 73 0a 2a 2a 20  ubquery does.** 
17f20 20 20 20 20 20 20 20 6e 6f 74 20 63 6f 6e 74 61         not conta
17f30 69 6e 20 4f 52 44 45 52 20 42 59 2e 20 20 28 54  in ORDER BY.  (T
17f40 69 63 6b 65 74 20 23 32 39 34 32 29 20 20 54 68  icket #2942)  Th
17f50 69 73 20 75 73 65 64 20 74 6f 20 6e 6f 74 20 6d  is used to not m
17f60 61 74 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 20  atter.**        
17f70 75 6e 74 69 6c 20 77 65 20 69 6e 74 72 6f 64 75  until we introdu
17f80 63 65 64 20 74 68 65 20 67 72 6f 75 70 5f 63 6f  ced the group_co
17f90 6e 63 61 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e  ncat() function.
17fa0 20 20 0a 2a 2a 0a 2a 2a 20 20 28 31 37 29 20 20    .**.**  (17)  
17fb0 54 68 65 20 73 75 62 2d 71 75 65 72 79 20 69 73  The sub-query is
17fc0 20 6e 6f 74 20 61 20 63 6f 6d 70 6f 75 6e 64 20   not a compound 
17fd0 73 65 6c 65 63 74 2c 20 6f 72 20 69 74 20 69 73  select, or it is
17fe0 20 61 20 55 4e 49 4f 4e 20 41 4c 4c 20 0a 2a 2a   a UNION ALL .**
17ff0 20 20 20 20 20 20 20 20 63 6f 6d 70 6f 75 6e 64          compound
18000 20 63 6c 61 75 73 65 20 6d 61 64 65 20 75 70 20   clause made up 
18010 65 6e 74 69 72 65 6c 79 20 6f 66 20 6e 6f 6e 2d  entirely of non-
18020 61 67 67 72 65 67 61 74 65 20 71 75 65 72 69 65  aggregate querie
18030 73 2c 20 61 6e 64 20 0a 2a 2a 20 20 20 20 20 20  s, and .**      
18040 20 20 74 68 65 20 70 61 72 65 6e 74 20 71 75 65    the parent que
18050 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  ry:.**.**       
18060 20 20 20 2a 20 69 73 20 6e 6f 74 20 69 74 73 65     * is not itse
18070 6c 66 20 70 61 72 74 20 6f 66 20 61 20 63 6f 6d  lf part of a com
18080 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c 0a 2a 2a  pound select,.**
18090 20 20 20 20 20 20 20 20 20 20 2a 20 69 73 20 6e            * is n
180a0 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74 65 20  ot an aggregate 
180b0 6f 72 20 44 49 53 54 49 4e 43 54 20 71 75 65 72  or DISTINCT quer
180c0 79 2c 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20  y, and.**       
180d0 20 20 20 2a 20 69 73 20 6e 6f 74 20 61 20 6a 6f     * is not a jo
180e0 69 6e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  in.**.**        
180f0 54 68 65 20 70 61 72 65 6e 74 20 61 6e 64 20 73  The parent and s
18100 75 62 2d 71 75 65 72 79 20 6d 61 79 20 63 6f 6e  ub-query may con
18110 74 61 69 6e 20 57 48 45 52 45 20 63 6c 61 75 73  tain WHERE claus
18120 65 73 2e 20 53 75 62 6a 65 63 74 20 74 6f 0a 2a  es. Subject to.*
18130 2a 20 20 20 20 20 20 20 20 72 75 6c 65 73 20 28  *        rules (
18140 31 31 29 2c 20 28 31 33 29 20 61 6e 64 20 28 31  11), (13) and (1
18150 34 29 2c 20 74 68 65 79 20 6d 61 79 20 61 6c 73  4), they may als
18160 6f 20 63 6f 6e 74 61 69 6e 20 4f 52 44 45 52 20  o contain ORDER 
18170 42 59 2c 0a 2a 2a 20 20 20 20 20 20 20 20 4c 49  BY,.**        LI
18180 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20 63  MIT and OFFSET c
18190 6c 61 75 73 65 73 2e 20 20 54 68 65 20 73 75 62  lauses.  The sub
181a0 71 75 65 72 79 20 63 61 6e 6e 6f 74 20 75 73 65  query cannot use
181b0 20 61 6e 79 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a   any compound.**
181c0 20 20 20 20 20 20 20 20 6f 70 65 72 61 74 6f 72          operator
181d0 20 6f 74 68 65 72 20 74 68 61 6e 20 55 4e 49 4f   other than UNIO
181e0 4e 20 41 4c 4c 20 62 65 63 61 75 73 65 20 61 6c  N ALL because al
181f0 6c 20 74 68 65 20 6f 74 68 65 72 20 63 6f 6d 70  l the other comp
18200 6f 75 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 6f  ound.**        o
18210 70 65 72 61 74 6f 72 73 20 68 61 76 65 20 61 6e  perators have an
18220 20 69 6d 70 6c 69 65 64 20 44 49 53 54 49 4e 43   implied DISTINC
18230 54 20 77 68 69 63 68 20 69 73 20 64 69 73 61 6c  T which is disal
18240 6c 6f 77 65 64 20 62 79 0a 2a 2a 20 20 20 20 20  lowed by.**     
18250 20 20 20 72 65 73 74 72 69 63 74 69 6f 6e 20 28     restriction (
18260 34 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  4)..**.**       
18270 20 41 6c 73 6f 2c 20 65 61 63 68 20 63 6f 6d 70   Also, each comp
18280 6f 6e 65 6e 74 20 6f 66 20 74 68 65 20 73 75 62  onent of the sub
18290 2d 71 75 65 72 79 20 6d 75 73 74 20 72 65 74 75  -query must retu
182a0 72 6e 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62  rn the same numb
182b0 65 72 0a 2a 2a 20 20 20 20 20 20 20 20 6f 66 20  er.**        of 
182c0 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 2e 20  result columns. 
182d0 54 68 69 73 20 69 73 20 61 63 74 75 61 6c 6c 79  This is actually
182e0 20 61 20 72 65 71 75 69 72 65 6d 65 6e 74 20 66   a requirement f
182f0 6f 72 20 61 6e 79 20 63 6f 6d 70 6f 75 6e 64 0a  or any compound.
18300 2a 2a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54  **        SELECT
18310 20 73 74 61 74 65 6d 65 6e 74 2c 20 62 75 74 20   statement, but 
18320 61 6c 6c 20 74 68 65 20 63 6f 64 65 20 68 65 72  all the code her
18330 65 20 64 6f 65 73 20 69 73 20 6d 61 6b 65 20 73  e does is make s
18340 75 72 65 20 74 68 61 74 20 6e 6f 0a 2a 2a 20 20  ure that no.**  
18350 20 20 20 20 20 20 73 75 63 68 20 28 69 6c 6c 65        such (ille
18360 67 61 6c 29 20 73 75 62 2d 71 75 65 72 79 20 69  gal) sub-query i
18370 73 20 66 6c 61 74 74 65 6e 65 64 2e 20 54 68 65  s flattened. The
18380 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 64 65 74   caller will det
18390 65 63 74 20 74 68 65 0a 2a 2a 20 20 20 20 20 20  ect the.**      
183a0 20 20 73 79 6e 74 61 78 20 65 72 72 6f 72 20 61    syntax error a
183b0 6e 64 20 72 65 74 75 72 6e 20 61 20 64 65 74 61  nd return a deta
183c0 69 6c 65 64 20 6d 65 73 73 61 67 65 2e 0a 2a 2a  iled message..**
183d0 0a 2a 2a 20 20 28 31 38 29 20 20 49 66 20 74 68  .**  (18)  If th
183e0 65 20 73 75 62 2d 71 75 65 72 79 20 69 73 20 61  e sub-query is a
183f0 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74   compound select
18400 2c 20 74 68 65 6e 20 61 6c 6c 20 74 65 72 6d 73  , then all terms
18410 20 6f 66 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   of the.**      
18420 20 20 4f 52 44 45 52 20 62 79 20 63 6c 61 75 73    ORDER by claus
18430 65 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20  e of the parent 
18440 6d 75 73 74 20 62 65 20 73 69 6d 70 6c 65 20 72  must be simple r
18450 65 66 65 72 65 6e 63 65 73 20 74 6f 20 0a 2a 2a  eferences to .**
18460 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 73 20          columns 
18470 6f 66 20 74 68 65 20 73 75 62 2d 71 75 65 72 79  of the sub-query
18480 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 39 29 20 20 54  ..**.**  (19)  T
18490 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73  he subquery does
184a0 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 20 6f   not use LIMIT o
184b0 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  r the outer quer
184c0 79 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 20 20  y does not.**   
184d0 20 20 20 20 20 68 61 76 65 20 61 20 57 48 45 52       have a WHER
184e0 45 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20  E clause..**.** 
184f0 20 28 32 30 29 20 20 49 66 20 74 68 65 20 73 75   (20)  If the su
18500 62 2d 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d  b-query is a com
18510 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20 74 68  pound select, th
18520 65 6e 20 69 74 20 6d 75 73 74 20 6e 6f 74 20 75  en it must not u
18530 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 61 6e 20  se.**        an 
18540 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e  ORDER BY clause.
18550 20 20 54 69 63 6b 65 74 20 23 33 37 37 33 2e 20    Ticket #3773. 
18560 20 57 65 20 63 6f 75 6c 64 20 72 65 6c 61 78 20   We could relax 
18570 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 0a  this constraint.
18580 2a 2a 20 20 20 20 20 20 20 20 73 6f 6d 65 77 68  **        somewh
18590 61 74 20 62 79 20 73 61 79 69 6e 67 20 74 68 61  at by saying tha
185a0 74 20 74 68 65 20 74 65 72 6d 73 20 6f 66 20 74  t the terms of t
185b0 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
185c0 73 65 20 6d 75 73 74 0a 2a 2a 20 20 20 20 20 20  se must.**      
185d0 20 20 61 70 70 65 61 72 20 61 73 20 75 6e 6d 6f    appear as unmo
185e0 64 69 66 69 65 64 20 72 65 73 75 6c 74 20 63 6f  dified result co
185f0 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 6f 75 74  lumns in the out
18600 65 72 20 71 75 65 72 79 2e 20 20 42 75 74 20 77  er query.  But w
18610 65 0a 2a 2a 20 20 20 20 20 20 20 20 68 61 76 65  e.**        have
18620 20 6f 74 68 65 72 20 6f 70 74 69 6d 69 7a 61 74   other optimizat
18630 69 6f 6e 73 20 69 6e 20 6d 69 6e 64 20 74 6f 20  ions in mind to 
18640 64 65 61 6c 20 77 69 74 68 20 74 68 61 74 20 63  deal with that c
18650 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 31 29  ase..**.**  (21)
18660 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64    The subquery d
18670 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49  oes not use LIMI
18680 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71  T or the outer q
18690 75 65 72 79 20 69 73 20 6e 6f 74 0a 2a 2a 20 20  uery is not.**  
186a0 20 20 20 20 20 20 44 49 53 54 49 4e 43 54 2e 20        DISTINCT. 
186b0 20 28 53 65 65 20 74 69 63 6b 65 74 20 5b 37 35   (See ticket [75
186c0 32 65 31 36 34 36 66 63 5d 29 2e 0a 2a 2a 0a 2a  2e1646fc])..**.*
186d0 2a 20 49 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  * In this routin
186e0 65 2c 20 74 68 65 20 22 70 22 20 70 61 72 61 6d  e, the "p" param
186f0 65 74 65 72 20 69 73 20 61 20 70 6f 69 6e 74 65  eter is a pointe
18700 72 20 74 6f 20 74 68 65 20 6f 75 74 65 72 20 71  r to the outer q
18710 75 65 72 79 2e 0a 2a 2a 20 54 68 65 20 73 75 62  uery..** The sub
18720 71 75 65 72 79 20 69 73 20 70 2d 3e 70 53 72 63  query is p->pSrc
18730 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 20 20 69 73 41  ->a[iFrom].  isA
18740 67 67 20 69 73 20 74 72 75 65 20 69 66 20 74 68  gg is true if th
18750 65 20 6f 75 74 65 72 20 71 75 65 72 79 0a 2a 2a  e outer query.**
18760 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65 73   uses aggregates
18770 20 61 6e 64 20 73 75 62 71 75 65 72 79 49 73 41   and subqueryIsA
18780 67 67 20 69 73 20 74 72 75 65 20 69 66 20 74 68  gg is true if th
18790 65 20 73 75 62 71 75 65 72 79 20 75 73 65 73 20  e subquery uses 
187a0 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a  aggregates..**.*
187b0 2a 20 49 66 20 66 6c 61 74 74 65 6e 69 6e 67 20  * If flattening 
187c0 69 73 20 6e 6f 74 20 61 74 74 65 6d 70 74 65 64  is not attempted
187d0 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
187e0 73 20 61 20 6e 6f 2d 6f 70 20 61 6e 64 20 72 65  s a no-op and re
187f0 74 75 72 6e 73 20 30 2e 0a 2a 2a 20 49 66 20 66  turns 0..** If f
18800 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 61 74 74  lattening is att
18810 65 6d 70 74 65 64 20 74 68 69 73 20 72 6f 75 74  empted this rout
18820 69 6e 65 20 72 65 74 75 72 6e 73 20 31 2e 0a 2a  ine returns 1..*
18830 2a 0a 2a 2a 20 41 6c 6c 20 6f 66 20 74 68 65 20  *.** All of the 
18840 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 61 6c 79  expression analy
18850 73 69 73 20 6d 75 73 74 20 6f 63 63 75 72 20 6f  sis must occur o
18860 6e 20 62 6f 74 68 20 74 68 65 20 6f 75 74 65 72  n both the outer
18870 20 71 75 65 72 79 20 61 6e 64 0a 2a 2a 20 74 68   query and.** th
18880 65 20 73 75 62 71 75 65 72 79 20 62 65 66 6f 72  e subquery befor
18890 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  e this routine r
188a0 75 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  uns..*/.static i
188b0 6e 74 20 66 6c 61 74 74 65 6e 53 75 62 71 75 65  nt flattenSubque
188c0 72 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ry(.  Parse *pPa
188d0 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61  rse,       /* Pa
188e0 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
188f0 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
18900 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
18910 61 72 65 6e 74 20 6f 72 20 6f 75 74 65 72 20 53  arent or outer S
18920 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
18930 2a 2f 0a 20 20 69 6e 74 20 69 46 72 6f 6d 2c 20  */.  int iFrom, 
18940 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
18950 65 78 20 69 6e 20 70 2d 3e 70 53 72 63 2d 3e 61  ex in p->pSrc->a
18960 5b 5d 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20  [] of the inner 
18970 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e  subquery */.  in
18980 74 20 69 73 41 67 67 2c 20 20 20 20 20 20 20 20  t isAgg,        
18990 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6f 75     /* True if ou
189a0 74 65 72 20 53 45 4c 45 43 54 20 75 73 65 73 20  ter SELECT uses 
189b0 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
189c0 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 73 75 62  ons */.  int sub
189d0 71 75 65 72 79 49 73 41 67 67 20 20 20 20 2f 2a  queryIsAgg    /*
189e0 20 54 72 75 65 20 69 66 20 74 68 65 20 73 75 62   True if the sub
189f0 71 75 65 72 79 20 75 73 65 73 20 61 67 67 72 65  query uses aggre
18a00 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a  gate functions *
18a10 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  /.){.  const cha
18a20 72 20 2a 7a 53 61 76 65 64 41 75 74 68 43 6f 6e  r *zSavedAuthCon
18a30 74 65 78 74 20 3d 20 70 50 61 72 73 65 2d 3e 7a  text = pParse->z
18a40 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a 20 20 53  AuthContext;.  S
18a50 65 6c 65 63 74 20 2a 70 50 61 72 65 6e 74 3b 0a  elect *pParent;.
18a60 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 3b 20    Select *pSub; 
18a70 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 6e        /* The inn
18a80 65 72 20 71 75 65 72 79 20 6f 72 20 22 73 75 62  er query or "sub
18a90 71 75 65 72 79 22 20 2a 2f 0a 20 20 53 65 6c 65  query" */.  Sele
18aa0 63 74 20 2a 70 53 75 62 31 3b 20 20 20 20 20 20  ct *pSub1;      
18ab0 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68  /* Pointer to th
18ac0 65 20 72 69 67 68 74 6d 6f 73 74 20 73 65 6c 65  e rightmost sele
18ad0 63 74 20 69 6e 20 73 75 62 2d 71 75 65 72 79 20  ct in sub-query 
18ae0 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  */.  SrcList *pS
18af0 72 63 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20  rc;      /* The 
18b00 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74  FROM clause of t
18b10 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a  he outer query *
18b20 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 75  /.  SrcList *pSu
18b30 62 53 72 63 3b 20 20 20 2f 2a 20 54 68 65 20 46  bSrc;   /* The F
18b40 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ROM clause of th
18b50 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20  e subquery */.  
18b60 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b  ExprList *pList;
18b70 20 20 20 20 2f 2a 20 54 68 65 20 72 65 73 75 6c      /* The resul
18b80 74 20 73 65 74 20 6f 66 20 74 68 65 20 6f 75 74  t set of the out
18b90 65 72 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e  er query */.  in
18ba0 74 20 69 50 61 72 65 6e 74 3b 20 20 20 20 20 20  t iParent;      
18bb0 20 20 2f 2a 20 56 44 42 45 20 63 75 72 73 6f 72    /* VDBE cursor
18bc0 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70   number of the p
18bd0 53 75 62 20 72 65 73 75 6c 74 20 73 65 74 20 74  Sub result set t
18be0 65 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  emp table */.  i
18bf0 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
18c00 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
18c10 65 72 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57  er */.  Expr *pW
18c20 68 65 72 65 3b 20 20 20 20 20 20 20 20 20 20 20  here;           
18c30 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
18c40 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
18c50 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
18c60 5f 69 74 65 6d 20 2a 70 53 75 62 69 74 65 6d 3b  _item *pSubitem;
18c70 20 20 20 2f 2a 20 54 68 65 20 73 75 62 71 75 65     /* The subque
18c80 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  ry */.  sqlite3 
18c90 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
18ca0 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f  ;..  /* Check to
18cb0 20 73 65 65 20 69 66 20 66 6c 61 74 74 65 6e 69   see if flatteni
18cc0 6e 67 20 69 73 20 70 65 72 6d 69 74 74 65 64 2e  ng is permitted.
18cd0 20 20 52 65 74 75 72 6e 20 30 20 69 66 20 6e 6f    Return 0 if no
18ce0 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  t..  */.  assert
18cf0 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ( p!=0 );.  asse
18d00 72 74 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30  rt( p->pPrior==0
18d10 20 29 3b 20 20 2f 2a 20 55 6e 61 62 6c 65 20 74   );  /* Unable t
18d20 6f 20 66 6c 61 74 74 65 6e 20 63 6f 6d 70 6f 75  o flatten compou
18d30 6e 64 20 71 75 65 72 69 65 73 20 2a 2f 0a 20 20  nd queries */.  
18d40 69 66 28 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e  if( Optimization
18d50 44 69 73 61 62 6c 65 64 28 64 62 2c 20 53 51 4c  Disabled(db, SQL
18d60 49 54 45 5f 51 75 65 72 79 46 6c 61 74 74 65 6e  ITE_QueryFlatten
18d70 65 72 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  er) ) return 0;.
18d80 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63    pSrc = p->pSrc
18d90 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72 63  ;.  assert( pSrc
18da0 20 26 26 20 69 46 72 6f 6d 3e 3d 30 20 26 26 20   && iFrom>=0 && 
18db0 69 46 72 6f 6d 3c 70 53 72 63 2d 3e 6e 53 72 63  iFrom<pSrc->nSrc
18dc0 20 29 3b 0a 20 20 70 53 75 62 69 74 65 6d 20 3d   );.  pSubitem =
18dd0 20 26 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d   &pSrc->a[iFrom]
18de0 3b 0a 20 20 69 50 61 72 65 6e 74 20 3d 20 70 53  ;.  iParent = pS
18df0 75 62 69 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b  ubitem->iCursor;
18e00 0a 20 20 70 53 75 62 20 3d 20 70 53 75 62 69 74  .  pSub = pSubit
18e10 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 61  em->pSelect;.  a
18e20 73 73 65 72 74 28 20 70 53 75 62 21 3d 30 20 29  ssert( pSub!=0 )
18e30 3b 0a 20 20 69 66 28 20 69 73 41 67 67 20 26 26  ;.  if( isAgg &&
18e40 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20 29   subqueryIsAgg )
18e50 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
18e60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
18e70 73 74 72 69 63 74 69 6f 6e 20 28 31 29 20 20 2a  striction (1)  *
18e80 2f 0a 20 20 69 66 28 20 73 75 62 71 75 65 72 79  /.  if( subquery
18e90 49 73 41 67 67 20 26 26 20 70 53 72 63 2d 3e 6e  IsAgg && pSrc->n
18ea0 53 72 63 3e 31 20 29 20 72 65 74 75 72 6e 20 30  Src>1 ) return 0
18eb0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  ;          /* Re
18ec0 73 74 72 69 63 74 69 6f 6e 20 28 32 29 20 20 2a  striction (2)  *
18ed0 2f 0a 20 20 70 53 75 62 53 72 63 20 3d 20 70 53  /.  pSubSrc = pS
18ee0 75 62 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65  ub->pSrc;.  asse
18ef0 72 74 28 20 70 53 75 62 53 72 63 20 29 3b 0a 20  rt( pSubSrc );. 
18f00 20 2f 2a 20 50 72 69 6f 72 20 74 6f 20 76 65 72   /* Prior to ver
18f10 73 69 6f 6e 20 33 2e 31 2e 32 2c 20 77 68 65 6e  sion 3.1.2, when
18f20 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45   LIMIT and OFFSE
18f30 54 20 68 61 64 20 74 6f 20 62 65 20 73 69 6d 70  T had to be simp
18f40 6c 65 20 63 6f 6e 73 74 61 6e 74 73 2c 0a 20 20  le constants,.  
18f50 2a 2a 20 6e 6f 74 20 61 72 62 69 74 72 61 72 79  ** not arbitrary
18f60 20 65 78 70 72 65 73 73 73 69 6f 6e 73 2c 20 77   expresssions, w
18f70 65 20 61 6c 6c 6f 77 65 64 20 73 6f 6d 65 20 63  e allowed some c
18f80 6f 6d 62 69 6e 69 6e 67 20 6f 66 20 4c 49 4d 49  ombining of LIMI
18f90 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 20 20 2a  T and OFFSET.  *
18fa0 2a 20 62 65 63 61 75 73 65 20 74 68 65 79 20 63  * because they c
18fb0 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64  ould be computed
18fc0 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65   at compile-time
18fd0 2e 20 20 42 75 74 20 77 68 65 6e 20 4c 49 4d 49  .  But when LIMI
18fe0 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 20 20 2a  T and OFFSET.  *
18ff0 2a 20 62 65 63 61 6d 65 20 61 72 62 69 74 72 61  * became arbitra
19000 72 79 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20  ry expressions, 
19010 77 65 20 77 65 72 65 20 66 6f 72 63 65 64 20 74  we were forced t
19020 6f 20 61 64 64 20 72 65 73 74 72 69 63 74 69 6f  o add restrictio
19030 6e 73 20 28 31 33 29 0a 20 20 2a 2a 20 61 6e 64  ns (13).  ** and
19040 20 28 31 34 29 2e 20 2a 2f 0a 20 20 69 66 28 20   (14). */.  if( 
19050 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20  pSub->pLimit && 
19060 70 2d 3e 70 4c 69 6d 69 74 20 29 20 72 65 74 75  p->pLimit ) retu
19070 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
19080 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
19090 6e 20 28 31 33 29 20 2a 2f 0a 20 20 69 66 28 20  n (13) */.  if( 
190a0 70 53 75 62 2d 3e 70 4f 66 66 73 65 74 20 29 20  pSub->pOffset ) 
190b0 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
190c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
190d0 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
190e0 6e 20 28 31 34 29 20 2a 2f 0a 20 20 69 66 28 20  n (14) */.  if( 
190f0 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 20 26 26  p->pRightmost &&
19100 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 29 7b   pSub->pLimit ){
19110 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20  .    return 0;  
19120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19140 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
19150 74 72 69 63 74 69 6f 6e 20 28 31 35 29 20 2a 2f  triction (15) */
19160 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 75 62 53  .  }.  if( pSubS
19170 72 63 2d 3e 6e 53 72 63 3d 3d 30 20 29 20 72 65  rc->nSrc==0 ) re
19180 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
19190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
191a0 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 37 29   Restriction (7)
191b0 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d    */.  if( pSub-
191c0 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44  >selFlags & SF_D
191d0 69 73 74 69 6e 63 74 20 29 20 72 65 74 75 72 6e  istinct ) return
191e0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
191f0 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 35 29   Restriction (5)
19200 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d    */.  if( pSub-
19210 3e 70 4c 69 6d 69 74 20 26 26 20 28 70 53 72 63  >pLimit && (pSrc
19220 2d 3e 6e 53 72 63 3e 31 20 7c 7c 20 69 73 41 67  ->nSrc>1 || isAg
19230 67 29 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72  g) ){.     retur
19240 6e 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  n 0;         /* 
19250 52 65 73 74 72 69 63 74 69 6f 6e 73 20 28 38 29  Restrictions (8)
19260 28 39 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28  (9) */.  }.  if(
19270 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
19280 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30 20  SF_Distinct)!=0 
19290 26 26 20 73 75 62 71 75 65 72 79 49 73 41 67 67  && subqueryIsAgg
192a0 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20   ){.     return 
192b0 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  0;         /* Re
192c0 73 74 72 69 63 74 69 6f 6e 20 28 36 29 20 20 2a  striction (6)  *
192d0 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70  /.  }.  if( p->p
192e0 4f 72 64 65 72 42 79 20 26 26 20 70 53 75 62 2d  OrderBy && pSub-
192f0 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  >pOrderBy ){.   
19300 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20    return 0;     
19310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19330 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
19340 74 69 6f 6e 20 28 31 31 29 20 2a 2f 0a 20 20 7d  tion (11) */.  }
19350 0a 20 20 69 66 28 20 69 73 41 67 67 20 26 26 20  .  if( isAgg && 
19360 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29  pSub->pOrderBy )
19370 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
19380 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
19390 74 72 69 63 74 69 6f 6e 20 28 31 36 29 20 2a 2f  triction (16) */
193a0 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69  .  if( pSub->pLi
193b0 6d 69 74 20 26 26 20 70 2d 3e 70 57 68 65 72 65  mit && p->pWhere
193c0 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
193d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
193e0 74 72 69 63 74 69 6f 6e 20 28 31 39 29 20 2a 2f  triction (19) */
193f0 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69  .  if( pSub->pLi
19400 6d 69 74 20 26 26 20 28 70 2d 3e 73 65 6c 46 6c  mit && (p->selFl
19410 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63  ags & SF_Distinc
19420 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 72 65  t)!=0 ){.     re
19430 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
19440 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
19450 32 31 29 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a  21) */.  }..  /*
19460 20 4f 42 53 4f 4c 45 54 45 20 43 4f 4d 4d 45 4e   OBSOLETE COMMEN
19470 54 20 31 3a 0a 20 20 2a 2a 20 52 65 73 74 72 69  T 1:.  ** Restri
19480 63 74 69 6f 6e 20 33 3a 20 20 49 66 20 74 68 65  ction 3:  If the
19490 20 73 75 62 71 75 65 72 79 20 69 73 20 61 20 6a   subquery is a j
194a0 6f 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74  oin, make sure t
194b0 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 0a  he subquery is .
194c0 20 20 2a 2a 20 6e 6f 74 20 75 73 65 64 20 61 73    ** not used as
194d0 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61   the right opera
194e0 6e 64 20 6f 66 20 61 6e 20 6f 75 74 65 72 20 6a  nd of an outer j
194f0 6f 69 6e 2e 20 20 45 78 61 6d 70 6c 65 73 20 6f  oin.  Examples o
19500 66 20 77 68 79 20 74 68 69 73 0a 20 20 2a 2a 20  f why this.  ** 
19510 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a  is not allowed:.
19520 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20    **.  **       
19530 20 20 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20    t1 LEFT OUTER 
19540 4a 4f 49 4e 20 28 74 32 20 4a 4f 49 4e 20 74 33  JOIN (t2 JOIN t3
19550 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 77  ).  **.  ** If w
19560 65 20 66 6c 61 74 74 65 6e 20 74 68 65 20 61 62  e flatten the ab
19570 6f 76 65 2c 20 77 65 20 77 6f 75 6c 64 20 67 65  ove, we would ge
19580 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  t.  **.  **     
19590 20 20 20 20 28 74 31 20 4c 45 46 54 20 4f 55 54      (t1 LEFT OUT
195a0 45 52 20 4a 4f 49 4e 20 74 32 29 20 4a 4f 49 4e  ER JOIN t2) JOIN
195b0 20 74 33 0a 20 20 2a 2a 0a 20 20 2a 2a 20 77 68   t3.  **.  ** wh
195c0 69 63 68 20 69 73 20 6e 6f 74 20 61 74 20 61 6c  ich is not at al
195d0 6c 20 74 68 65 20 73 61 6d 65 20 74 68 69 6e 67  l the same thing
195e0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 42 53 4f  ..  **.  ** OBSO
195f0 4c 45 54 45 20 43 4f 4d 4d 45 4e 54 20 32 3a 0a  LETE COMMENT 2:.
19600 20 20 2a 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    ** Restriction
19610 20 31 32 3a 20 20 49 66 20 74 68 65 20 73 75 62   12:  If the sub
19620 71 75 65 72 79 20 69 73 20 74 68 65 20 72 69 67  query is the rig
19630 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20  ht operand of a 
19640 6c 65 66 74 20 6f 75 74 65 72 0a 20 20 2a 2a 20  left outer.  ** 
19650 6a 6f 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20  join, make sure 
19660 74 68 65 20 73 75 62 71 75 65 72 79 20 68 61 73  the subquery has
19670 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65   no WHERE clause
19680 2e 0a 20 20 2a 2a 20 41 6e 20 65 78 61 6d 70 6c  ..  ** An exampl
19690 65 73 20 6f 66 20 77 68 79 20 74 68 69 73 20 69  es of why this i
196a0 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a 20  s not allowed:. 
196b0 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20   **.  **        
196c0 20 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a   t1 LEFT OUTER J
196d0 4f 49 4e 20 28 53 45 4c 45 43 54 20 2a 20 46 52  OIN (SELECT * FR
196e0 4f 4d 20 74 32 20 57 48 45 52 45 20 74 32 2e 78  OM t2 WHERE t2.x
196f0 3e 30 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  >0).  **.  ** If
19700 20 77 65 20 66 6c 61 74 74 65 6e 20 74 68 65 20   we flatten the 
19710 61 62 6f 76 65 2c 20 77 65 20 77 6f 75 6c 64 20  above, we would 
19720 67 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  get.  **.  **   
19730 20 20 20 20 20 20 28 74 31 20 4c 45 46 54 20 4f        (t1 LEFT O
19740 55 54 45 52 20 4a 4f 49 4e 20 74 32 29 20 57 48  UTER JOIN t2) WH
19750 45 52 45 20 74 32 2e 78 3e 30 0a 20 20 2a 2a 0a  ERE t2.x>0.  **.
19760 20 20 2a 2a 20 42 75 74 20 74 68 65 20 74 32 2e    ** But the t2.
19770 78 3e 30 20 74 65 73 74 20 77 69 6c 6c 20 61 6c  x>0 test will al
19780 77 61 79 73 20 66 61 69 6c 20 6f 6e 20 61 20 4e  ways fail on a N
19790 55 4c 4c 20 72 6f 77 20 6f 66 20 74 32 2c 20 77  ULL row of t2, w
197a0 68 69 63 68 0a 20 20 2a 2a 20 65 66 66 65 63 74  hich.  ** effect
197b0 69 76 65 6c 79 20 63 6f 6e 76 65 72 74 73 20 74  ively converts t
197c0 68 65 20 4f 55 54 45 52 20 4a 4f 49 4e 20 69 6e  he OUTER JOIN in
197d0 74 6f 20 61 6e 20 49 4e 4e 45 52 20 4a 4f 49 4e  to an INNER JOIN
197e0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 48 49 53  ..  **.  ** THIS
197f0 20 4f 56 45 52 52 49 44 45 53 20 4f 42 53 4f 4c   OVERRIDES OBSOL
19800 45 54 45 20 43 4f 4d 4d 45 4e 54 53 20 31 20 41  ETE COMMENTS 1 A
19810 4e 44 20 32 20 41 42 4f 56 45 3a 0a 20 20 2a 2a  ND 2 ABOVE:.  **
19820 20 54 69 63 6b 65 74 20 23 33 33 30 30 20 73 68   Ticket #3300 sh
19830 6f 77 73 20 74 68 61 74 20 66 6c 61 74 74 65 6e  ows that flatten
19840 69 6e 67 20 74 68 65 20 72 69 67 68 74 20 74 65  ing the right te
19850 72 6d 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49  rm of a LEFT JOI
19860 4e 0a 20 20 2a 2a 20 69 73 20 66 72 61 75 67 68  N.  ** is fraugh
19870 74 20 77 69 74 68 20 64 61 6e 67 65 72 2e 20 20  t with danger.  
19880 42 65 73 74 20 74 6f 20 61 76 6f 69 64 20 74 68  Best to avoid th
19890 65 20 77 68 6f 6c 65 20 74 68 69 6e 67 2e 20 20  e whole thing.  
198a0 49 66 20 74 68 65 0a 20 20 2a 2a 20 73 75 62 71  If the.  ** subq
198b0 75 65 72 79 20 69 73 20 74 68 65 20 72 69 67 68  uery is the righ
198c0 74 20 74 65 72 6d 20 6f 66 20 61 20 4c 45 46 54  t term of a LEFT
198d0 20 4a 4f 49 4e 2c 20 74 68 65 6e 20 64 6f 20 6e   JOIN, then do n
198e0 6f 74 20 66 6c 61 74 74 65 6e 2e 0a 20 20 2a 2f  ot flatten..  */
198f0 0a 20 20 69 66 28 20 28 70 53 75 62 69 74 65 6d  .  if( (pSubitem
19900 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f  ->jointype & JT_
19910 4f 55 54 45 52 29 21 3d 30 20 29 7b 0a 20 20 20  OUTER)!=0 ){.   
19920 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a   return 0;.  }..
19930 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
19940 20 31 37 3a 20 49 66 20 74 68 65 20 73 75 62 2d   17: If the sub-
19950 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f  query is a compo
19960 75 6e 64 20 53 45 4c 45 43 54 2c 20 74 68 65 6e  und SELECT, then
19970 20 69 74 20 6d 75 73 74 0a 20 20 2a 2a 20 75 73   it must.  ** us
19980 65 20 6f 6e 6c 79 20 74 68 65 20 55 4e 49 4f 4e  e only the UNION
19990 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72 2e 20 41   ALL operator. A
199a0 6e 64 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 73  nd none of the s
199b0 69 6d 70 6c 65 20 73 65 6c 65 63 74 20 71 75 65  imple select que
199c0 72 69 65 73 0a 20 20 2a 2a 20 74 68 61 74 20 6d  ries.  ** that m
199d0 61 6b 65 20 75 70 20 74 68 65 20 63 6f 6d 70 6f  ake up the compo
199e0 75 6e 64 20 53 45 4c 45 43 54 20 61 72 65 20 61  und SELECT are a
199f0 6c 6c 6f 77 65 64 20 74 6f 20 62 65 20 61 67 67  llowed to be agg
19a00 72 65 67 61 74 65 20 6f 72 20 64 69 73 74 69 6e  regate or distin
19a10 63 74 0a 20 20 2a 2a 20 71 75 65 72 69 65 73 2e  ct.  ** queries.
19a20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62  .  */.  if( pSub
19a30 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20  ->pPrior ){.    
19a40 69 66 28 20 70 53 75 62 2d 3e 70 4f 72 64 65 72  if( pSub->pOrder
19a50 42 79 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  By ){.      retu
19a60 72 6e 20 30 3b 20 20 2f 2a 20 52 65 73 74 72 69  rn 0;  /* Restri
19a70 63 74 69 6f 6e 20 32 30 20 2a 2f 0a 20 20 20 20  ction 20 */.    
19a80 7d 0a 20 20 20 20 69 66 28 20 69 73 41 67 67 20  }.    if( isAgg 
19a90 7c 7c 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20  || (p->selFlags 
19aa0 26 20 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d  & SF_Distinct)!=
19ab0 30 20 7c 7c 20 70 53 72 63 2d 3e 6e 53 72 63 21  0 || pSrc->nSrc!
19ac0 3d 31 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =1 ){.      retu
19ad0 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 0;.    }.    
19ae0 66 6f 72 28 70 53 75 62 31 3d 70 53 75 62 3b 20  for(pSub1=pSub; 
19af0 70 53 75 62 31 3b 20 70 53 75 62 31 3d 70 53 75  pSub1; pSub1=pSu
19b00 62 31 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20  b1->pPrior){.   
19b10 20 20 20 74 65 73 74 63 61 73 65 28 20 28 70 53     testcase( (pS
19b20 75 62 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ub1->selFlags & 
19b30 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f  (SF_Distinct|SF_
19b40 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f  Aggregate))==SF_
19b50 44 69 73 74 69 6e 63 74 20 29 3b 0a 20 20 20 20  Distinct );.    
19b60 20 20 74 65 73 74 63 61 73 65 28 20 28 70 53 75    testcase( (pSu
19b70 62 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28  b1->selFlags & (
19b80 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41  SF_Distinct|SF_A
19b90 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 41  ggregate))==SF_A
19ba0 67 67 72 65 67 61 74 65 20 29 3b 0a 20 20 20 20  ggregate );.    
19bb0 20 20 61 73 73 65 72 74 28 20 70 53 75 62 2d 3e    assert( pSub->
19bc0 70 53 72 63 21 3d 30 20 29 3b 0a 20 20 20 20 20  pSrc!=0 );.     
19bd0 20 69 66 28 20 28 70 53 75 62 31 2d 3e 73 65 6c   if( (pSub1->sel
19be0 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74  Flags & (SF_Dist
19bf0 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74  inct|SF_Aggregat
19c00 65 29 29 21 3d 30 0a 20 20 20 20 20 20 20 7c 7c  e))!=0.       ||
19c10 20 28 70 53 75 62 31 2d 3e 70 50 72 69 6f 72 20   (pSub1->pPrior 
19c20 26 26 20 70 53 75 62 31 2d 3e 6f 70 21 3d 54 4b  && pSub1->op!=TK
19c30 5f 41 4c 4c 29 20 0a 20 20 20 20 20 20 20 7c 7c  _ALL) .       ||
19c40 20 70 53 75 62 31 2d 3e 70 53 72 63 2d 3e 6e 53   pSub1->pSrc->nS
19c50 72 63 3c 31 0a 20 20 20 20 20 20 20 7c 7c 20 70  rc<1.       || p
19c60 53 75 62 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  Sub->pEList->nEx
19c70 70 72 21 3d 70 53 75 62 31 2d 3e 70 45 4c 69 73  pr!=pSub1->pELis
19c80 74 2d 3e 6e 45 78 70 72 0a 20 20 20 20 20 20 29  t->nExpr.      )
19c90 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
19ca0 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
19cb0 20 20 74 65 73 74 63 61 73 65 28 20 70 53 75 62    testcase( pSub
19cc0 31 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20  1->pSrc->nSrc>1 
19cd0 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
19ce0 20 52 65 73 74 72 69 63 74 69 6f 6e 20 31 38 2e   Restriction 18.
19cf0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 70   */.    if( p->p
19d00 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
19d10 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20 66   int ii;.      f
19d20 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 2d 3e 70  or(ii=0; ii<p->p
19d30 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20  OrderBy->nExpr; 
19d40 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69  ii++){.        i
19d50 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e  f( p->pOrderBy->
19d60 61 5b 69 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72  a[ii].u.x.iOrder
19d70 42 79 43 6f 6c 3d 3d 30 20 29 20 72 65 74 75 72  ByCol==0 ) retur
19d80 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 0;.      }.   
19d90 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 2a 2a 2a 2a   }.  }..  /*****
19da0 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69   If we reach thi
19db0 73 20 70 6f 69 6e 74 2c 20 66 6c 61 74 74 65 6e  s point, flatten
19dc0 69 6e 67 20 69 73 20 70 65 72 6d 69 74 74 65 64  ing is permitted
19dd0 2e 20 2a 2a 2a 2a 2a 2f 0a 0a 20 20 2f 2a 20 41  . *****/..  /* A
19de0 75 74 68 6f 72 69 7a 65 20 74 68 65 20 73 75 62  uthorize the sub
19df0 71 75 65 72 79 20 2a 2f 0a 20 20 70 50 61 72 73  query */.  pPars
19e00 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 20  e->zAuthContext 
19e10 3d 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d  = pSubitem->zNam
19e20 65 3b 0a 20 20 54 45 53 54 4f 4e 4c 59 28 69 20  e;.  TESTONLY(i 
19e30 3d 29 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  =) sqlite3AuthCh
19e40 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
19e50 54 45 5f 53 45 4c 45 43 54 2c 20 30 2c 20 30 2c  TE_SELECT, 0, 0,
19e60 20 30 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28   0);.  testcase(
19e70 20 69 3d 3d 53 51 4c 49 54 45 5f 44 45 4e 59 20   i==SQLITE_DENY 
19e80 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 7a 41 75  );.  pParse->zAu
19e90 74 68 43 6f 6e 74 65 78 74 20 3d 20 7a 53 61 76  thContext = zSav
19ea0 65 64 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a 0a  edAuthContext;..
19eb0 20 20 2f 2a 20 49 66 20 74 68 65 20 73 75 62 2d    /* If the sub-
19ec0 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f  query is a compo
19ed0 75 6e 64 20 53 45 4c 45 43 54 20 73 74 61 74 65  und SELECT state
19ee0 6d 65 6e 74 2c 20 74 68 65 6e 20 28 62 79 20 72  ment, then (by r
19ef0 65 73 74 72 69 63 74 69 6f 6e 73 0a 20 20 2a 2a  estrictions.  **
19f00 20 31 37 20 61 6e 64 20 31 38 20 61 62 6f 76 65   17 and 18 above
19f10 29 20 69 74 20 6d 75 73 74 20 62 65 20 61 20 55  ) it must be a U
19f20 4e 49 4f 4e 20 41 4c 4c 20 61 6e 64 20 74 68 65  NION ALL and the
19f30 20 70 61 72 65 6e 74 20 71 75 65 72 79 20 6d 75   parent query mu
19f40 73 74 20 0a 20 20 2a 2a 20 62 65 20 6f 66 20 74  st .  ** be of t
19f50 68 65 20 66 6f 72 6d 3a 0a 20 20 2a 2a 0a 20 20  he form:.  **.  
19f60 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 3c 65  **     SELECT <e
19f70 78 70 72 2d 6c 69 73 74 3e 20 46 52 4f 4d 20 28  xpr-list> FROM (
19f80 3c 73 75 62 2d 71 75 65 72 79 3e 29 20 3c 77 68  <sub-query>) <wh
19f90 65 72 65 2d 63 6c 61 75 73 65 3e 20 0a 20 20 2a  ere-clause> .  *
19fa0 2a 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 65 64 20  *.  ** followed 
19fb0 62 79 20 61 6e 79 20 4f 52 44 45 52 20 42 59 2c  by any ORDER BY,
19fc0 20 4c 49 4d 49 54 20 61 6e 64 2f 6f 72 20 4f 46   LIMIT and/or OF
19fd0 46 53 45 54 20 63 6c 61 75 73 65 73 2e 20 54 68  FSET clauses. Th
19fe0 69 73 20 62 6c 6f 63 6b 0a 20 20 2a 2a 20 63 72  is block.  ** cr
19ff0 65 61 74 65 73 20 4e 2d 31 20 63 6f 70 69 65 73  eates N-1 copies
1a000 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20 71   of the parent q
1a010 75 65 72 79 20 77 69 74 68 6f 75 74 20 61 6e 79  uery without any
1a020 20 4f 52 44 45 52 20 42 59 2c 20 4c 49 4d 49 54   ORDER BY, LIMIT
1a030 20 6f 72 20 0a 20 20 2a 2a 20 4f 46 46 53 45 54   or .  ** OFFSET
1a040 20 63 6c 61 75 73 65 73 20 61 6e 64 20 6a 6f 69   clauses and joi
1a050 6e 73 20 74 68 65 6d 20 74 6f 20 74 68 65 20 6c  ns them to the l
1a060 65 66 74 2d 68 61 6e 64 2d 73 69 64 65 20 6f 66  eft-hand-side of
1a070 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 20 20   the original.  
1a080 2a 2a 20 75 73 69 6e 67 20 55 4e 49 4f 4e 20 41  ** using UNION A
1a090 4c 4c 20 6f 70 65 72 61 74 6f 72 73 2e 20 49 6e  LL operators. In
1a0a0 20 74 68 69 73 20 63 61 73 65 20 4e 20 69 73 20   this case N is 
1a0b0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 69  the number of si
1a0c0 6d 70 6c 65 0a 20 20 2a 2a 20 73 65 6c 65 63 74  mple.  ** select
1a0d0 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 74   statements in t
1a0e0 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 75 62 2d  he compound sub-
1a0f0 71 75 65 72 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  query..  **.  **
1a100 20 45 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20   Example:.  **. 
1a110 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61   **     SELECT a
1a120 2b 31 20 46 52 4f 4d 20 28 0a 20 20 2a 2a 20 20  +1 FROM (.  **  
1a130 20 20 20 20 20 20 53 45 4c 45 43 54 20 78 20 46        SELECT x F
1a140 52 4f 4d 20 74 61 62 0a 20 20 2a 2a 20 20 20 20  ROM tab.  **    
1a150 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20      UNION ALL.  
1a160 2a 2a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54  **        SELECT
1a170 20 79 20 46 52 4f 4d 20 74 61 62 0a 20 20 2a 2a   y FROM tab.  **
1a180 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c          UNION AL
1a190 4c 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 53 45  L.  **        SE
1a1a0 4c 45 43 54 20 61 62 73 28 7a 2a 32 29 20 46 52  LECT abs(z*2) FR
1a1b0 4f 4d 20 74 61 62 32 0a 20 20 2a 2a 20 20 20 20  OM tab2.  **    
1a1c0 20 29 20 57 48 45 52 45 20 61 21 3d 35 20 4f 52   ) WHERE a!=5 OR
1a1d0 44 45 52 20 42 59 20 31 0a 20 20 2a 2a 0a 20 20  DER BY 1.  **.  
1a1e0 2a 2a 20 54 72 61 6e 73 66 6f 72 6d 65 64 20 69  ** Transformed i
1a1f0 6e 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  nto:.  **.  **  
1a200 20 20 20 53 45 4c 45 43 54 20 78 2b 31 20 46 52     SELECT x+1 FR
1a210 4f 4d 20 74 61 62 20 57 48 45 52 45 20 78 2b 31  OM tab WHERE x+1
1a220 21 3d 35 0a 20 20 2a 2a 20 20 20 20 20 55 4e 49  !=5.  **     UNI
1a230 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20  ON ALL.  **     
1a240 53 45 4c 45 43 54 20 79 2b 31 20 46 52 4f 4d 20  SELECT y+1 FROM 
1a250 74 61 62 20 57 48 45 52 45 20 79 2b 31 21 3d 35  tab WHERE y+1!=5
1a260 0a 20 20 2a 2a 20 20 20 20 20 55 4e 49 4f 4e 20  .  **     UNION 
1a270 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c  ALL.  **     SEL
1a280 45 43 54 20 61 62 73 28 7a 2a 32 29 2b 31 20 46  ECT abs(z*2)+1 F
1a290 52 4f 4d 20 74 61 62 32 20 57 48 45 52 45 20 61  ROM tab2 WHERE a
1a2a0 62 73 28 7a 2a 32 29 2b 31 21 3d 35 0a 20 20 2a  bs(z*2)+1!=5.  *
1a2b0 2a 20 20 20 20 20 4f 52 44 45 52 20 42 59 20 31  *     ORDER BY 1
1a2c0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 65 20 63 61  .  **.  ** We ca
1a2d0 6c 6c 20 74 68 69 73 20 74 68 65 20 22 63 6f 6d  ll this the "com
1a2e0 70 6f 75 6e 64 2d 73 75 62 71 75 65 72 79 20 66  pound-subquery f
1a2f0 6c 61 74 74 65 6e 69 6e 67 22 2e 0a 20 20 2a 2f  lattening"..  */
1a300 0a 20 20 66 6f 72 28 70 53 75 62 3d 70 53 75 62  .  for(pSub=pSub
1a310 2d 3e 70 50 72 69 6f 72 3b 20 70 53 75 62 3b 20  ->pPrior; pSub; 
1a320 70 53 75 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f  pSub=pSub->pPrio
1a330 72 29 7b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a  r){.    Select *
1a340 70 4e 65 77 3b 0a 20 20 20 20 45 78 70 72 4c 69  pNew;.    ExprLi
1a350 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70  st *pOrderBy = p
1a360 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20  ->pOrderBy;.    
1a370 45 78 70 72 20 2a 70 4c 69 6d 69 74 20 3d 20 70  Expr *pLimit = p
1a380 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 45 78  ->pLimit;.    Ex
1a390 70 72 20 2a 70 4f 66 66 73 65 74 20 3d 20 70 2d  pr *pOffset = p-
1a3a0 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 53 65  >pOffset;.    Se
1a3b0 6c 65 63 74 20 2a 70 50 72 69 6f 72 20 3d 20 70  lect *pPrior = p
1a3c0 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 70 2d  ->pPrior;.    p-
1a3d0 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20  >pOrderBy = 0;. 
1a3e0 20 20 20 70 2d 3e 70 53 72 63 20 3d 20 30 3b 0a     p->pSrc = 0;.
1a3f0 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
1a400 30 3b 0a 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74  0;.    p->pLimit
1a410 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 4f 66   = 0;.    p->pOf
1a420 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 70 4e  fset = 0;.    pN
1a430 65 77 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  ew = sqlite3Sele
1a440 63 74 44 75 70 28 64 62 2c 20 70 2c 20 30 29 3b  ctDup(db, p, 0);
1a450 0a 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20  .    p->pOffset 
1a460 3d 20 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 70  = pOffset;.    p
1a470 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69  ->pLimit = pLimi
1a480 74 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65 72  t;.    p->pOrder
1a490 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20  By = pOrderBy;. 
1a4a0 20 20 20 70 2d 3e 70 53 72 63 20 3d 20 70 53 72     p->pSrc = pSr
1a4b0 63 3b 0a 20 20 20 20 70 2d 3e 6f 70 20 3d 20 54  c;.    p->op = T
1a4c0 4b 5f 41 4c 4c 3b 0a 20 20 20 20 70 2d 3e 70 52  K_ALL;.    p->pR
1a4d0 69 67 68 74 6d 6f 73 74 20 3d 20 30 3b 0a 20 20  ightmost = 0;.  
1a4e0 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b    if( pNew==0 ){
1a4f0 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 70 50  .      pNew = pP
1a500 72 69 6f 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  rior;.    }else{
1a510 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 50 72  .      pNew->pPr
1a520 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20  ior = pPrior;.  
1a530 20 20 20 20 70 4e 65 77 2d 3e 70 52 69 67 68 74      pNew->pRight
1a540 6d 6f 73 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  most = 0;.    }.
1a550 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
1a560 70 4e 65 77 3b 0a 20 20 20 20 69 66 28 20 64 62  pNew;.    if( db
1a570 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
1a580 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a   return 1;.  }..
1a590 20 20 2f 2a 20 42 65 67 69 6e 20 66 6c 61 74 74    /* Begin flatt
1a5a0 65 6e 69 6e 67 20 74 68 65 20 69 46 72 6f 6d 2d  ening the iFrom-
1a5b0 74 68 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20  th entry of the 
1a5c0 46 52 4f 4d 20 63 6c 61 75 73 65 20 0a 20 20 2a  FROM clause .  *
1a5d0 2a 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71  * in the outer q
1a5e0 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 70 53 75  uery..  */.  pSu
1a5f0 62 20 3d 20 70 53 75 62 31 20 3d 20 70 53 75 62  b = pSub1 = pSub
1a600 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 0a  item->pSelect;..
1a610 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20    /* Delete the 
1a620 74 72 61 6e 73 69 65 6e 74 20 74 61 62 6c 65 20  transient table 
1a630 73 74 72 75 63 74 75 72 65 20 61 73 73 6f 63 69  structure associ
1a640 61 74 65 64 20 77 69 74 68 20 74 68 65 0a 20 20  ated with the.  
1a650 2a 2a 20 73 75 62 71 75 65 72 79 0a 20 20 2a 2f  ** subquery.  */
1a660 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
1a670 28 64 62 2c 20 70 53 75 62 69 74 65 6d 2d 3e 7a  (db, pSubitem->z
1a680 44 61 74 61 62 61 73 65 29 3b 0a 20 20 73 71 6c  Database);.  sql
1a690 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
1a6a0 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b  Subitem->zName);
1a6b0 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
1a6c0 28 64 62 2c 20 70 53 75 62 69 74 65 6d 2d 3e 7a  (db, pSubitem->z
1a6d0 41 6c 69 61 73 29 3b 0a 20 20 70 53 75 62 69 74  Alias);.  pSubit
1a6e0 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d 20  em->zDatabase = 
1a6f0 30 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a  0;.  pSubitem->z
1a700 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 70 53 75 62  Name = 0;.  pSub
1a710 69 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 30  item->zAlias = 0
1a720 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e 70 53  ;.  pSubitem->pS
1a730 65 6c 65 63 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a  elect = 0;..  /*
1a740 20 44 65 66 65 72 20 64 65 6c 65 74 69 6e 67 20   Defer deleting 
1a750 74 68 65 20 54 61 62 6c 65 20 6f 62 6a 65 63 74  the Table object
1a760 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
1a770 20 74 68 65 0a 20 20 2a 2a 20 73 75 62 71 75 65   the.  ** subque
1a780 72 79 20 75 6e 74 69 6c 20 63 6f 64 65 20 67 65  ry until code ge
1a790 6e 65 72 61 74 69 6f 6e 20 69 73 0a 20 20 2a 2a  neration is.  **
1a7a0 20 63 6f 6d 70 6c 65 74 65 2c 20 73 69 6e 63 65   complete, since
1a7b0 20 74 68 65 72 65 20 6d 61 79 20 73 74 69 6c 6c   there may still
1a7c0 20 65 78 69 73 74 20 45 78 70 72 2e 70 54 61 62   exist Expr.pTab
1a7d0 20 65 6e 74 72 69 65 73 20 74 68 61 74 0a 20 20   entries that.  
1a7e0 2a 2a 20 72 65 66 65 72 20 74 6f 20 74 68 65 20  ** refer to the 
1a7f0 73 75 62 71 75 65 72 79 20 65 76 65 6e 20 61 66  subquery even af
1a800 74 65 72 20 66 6c 61 74 74 65 6e 69 6e 67 2e 20  ter flattening. 
1a810 20 54 69 63 6b 65 74 20 23 33 33 34 36 2e 0a 20   Ticket #3346.. 
1a820 20 2a 2a 0a 20 20 2a 2a 20 70 53 75 62 69 74 65   **.  ** pSubite
1a830 6d 2d 3e 70 54 61 62 20 69 73 20 61 6c 77 61 79  m->pTab is alway
1a840 73 20 6e 6f 6e 2d 4e 55 4c 4c 20 62 79 20 74 65  s non-NULL by te
1a850 73 74 20 72 65 73 74 72 69 63 74 69 6f 6e 73 20  st restrictions 
1a860 61 6e 64 20 74 65 73 74 73 20 61 62 6f 76 65 2e  and tests above.
1a870 0a 20 20 2a 2f 0a 20 20 69 66 28 20 41 4c 57 41  .  */.  if( ALWA
1a880 59 53 28 70 53 75 62 69 74 65 6d 2d 3e 70 54 61  YS(pSubitem->pTa
1a890 62 21 3d 30 29 20 29 7b 0a 20 20 20 20 54 61 62  b!=0) ){.    Tab
1a8a0 6c 65 20 2a 70 54 61 62 54 6f 44 65 6c 20 3d 20  le *pTabToDel = 
1a8b0 70 53 75 62 69 74 65 6d 2d 3e 70 54 61 62 3b 0a  pSubitem->pTab;.
1a8c0 20 20 20 20 69 66 28 20 70 54 61 62 54 6f 44 65      if( pTabToDe
1a8d0 6c 2d 3e 6e 52 65 66 3d 3d 31 20 29 7b 0a 20 20  l->nRef==1 ){.  
1a8e0 20 20 20 20 50 61 72 73 65 20 2a 70 54 6f 70 6c      Parse *pTopl
1a8f0 65 76 65 6c 20 3d 20 73 71 6c 69 74 65 33 50 61  evel = sqlite3Pa
1a900 72 73 65 54 6f 70 6c 65 76 65 6c 28 70 50 61 72  rseToplevel(pPar
1a910 73 65 29 3b 0a 20 20 20 20 20 20 70 54 61 62 54  se);.      pTabT
1a920 6f 44 65 6c 2d 3e 70 4e 65 78 74 5a 6f 6d 62 69  oDel->pNextZombi
1a930 65 20 3d 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 70  e = pToplevel->p
1a940 5a 6f 6d 62 69 65 54 61 62 3b 0a 20 20 20 20 20  ZombieTab;.     
1a950 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 70 5a 6f 6d   pToplevel->pZom
1a960 62 69 65 54 61 62 20 3d 20 70 54 61 62 54 6f 44  bieTab = pTabToD
1a970 65 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  el;.    }else{. 
1a980 20 20 20 20 20 70 54 61 62 54 6f 44 65 6c 2d 3e       pTabToDel->
1a990 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20  nRef--;.    }.  
1a9a0 20 20 70 53 75 62 69 74 65 6d 2d 3e 70 54 61 62    pSubitem->pTab
1a9b0 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 0;.  }..  /* 
1a9c0 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6c 6f  The following lo
1a9d0 6f 70 20 72 75 6e 73 20 6f 6e 63 65 20 66 6f 72  op runs once for
1a9e0 20 65 61 63 68 20 74 65 72 6d 20 69 6e 20 61 20   each term in a 
1a9f0 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65 72  compound-subquer
1aa00 79 0a 20 20 2a 2a 20 66 6c 61 74 74 65 6e 69 6e  y.  ** flattenin
1aa10 67 20 28 61 73 20 64 65 73 63 72 69 62 65 64 20  g (as described 
1aa20 61 62 6f 76 65 29 2e 20 20 49 66 20 77 65 20 61  above).  If we a
1aa30 72 65 20 64 6f 69 6e 67 20 61 20 64 69 66 66 65  re doing a diffe
1aa40 72 65 6e 74 20 6b 69 6e 64 0a 20 20 2a 2a 20 6f  rent kind.  ** o
1aa50 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 2d 20 61  f flattening - a
1aa60 20 66 6c 61 74 74 65 6e 69 6e 67 20 6f 74 68 65   flattening othe
1aa70 72 20 74 68 61 6e 20 61 20 63 6f 6d 70 6f 75 6e  r than a compoun
1aa80 64 2d 73 75 62 71 75 65 72 79 20 66 6c 61 74 74  d-subquery flatt
1aa90 65 6e 69 6e 67 20 2d 0a 20 20 2a 2a 20 74 68 65  ening -.  ** the
1aaa0 6e 20 74 68 69 73 20 6c 6f 6f 70 20 6f 6e 6c 79  n this loop only
1aab0 20 72 75 6e 73 20 6f 6e 63 65 2e 0a 20 20 2a 2a   runs once..  **
1aac0 0a 20 20 2a 2a 20 54 68 69 73 20 6c 6f 6f 70 20  .  ** This loop 
1aad0 6d 6f 76 65 73 20 61 6c 6c 20 6f 66 20 74 68 65  moves all of the
1aae0 20 46 52 4f 4d 20 65 6c 65 6d 65 6e 74 73 20 6f   FROM elements o
1aaf0 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69  f the subquery i
1ab00 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 74 68 65  nto the.  ** the
1ab10 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
1ab20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e  the outer query.
1ab30 20 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 20 74    Before doing t
1ab40 68 69 73 2c 20 72 65 6d 65 6d 62 65 72 0a 20 20  his, remember.  
1ab50 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75  ** the cursor nu
1ab60 6d 62 65 72 20 66 6f 72 20 74 68 65 20 6f 72 69  mber for the ori
1ab70 67 69 6e 61 6c 20 6f 75 74 65 72 20 71 75 65 72  ginal outer quer
1ab80 79 20 46 52 4f 4d 20 65 6c 65 6d 65 6e 74 20 69  y FROM element i
1ab90 6e 0a 20 20 2a 2a 20 69 50 61 72 65 6e 74 2e 20  n.  ** iParent. 
1aba0 20 54 68 65 20 69 50 61 72 65 6e 74 20 63 75 72   The iParent cur
1abb0 73 6f 72 20 77 69 6c 6c 20 6e 65 76 65 72 20 62  sor will never b
1abc0 65 20 75 73 65 64 2e 20 20 53 75 62 73 65 71 75  e used.  Subsequ
1abd0 65 6e 74 20 63 6f 64 65 0a 20 20 2a 2a 20 77 69  ent code.  ** wi
1abe0 6c 6c 20 73 63 61 6e 20 65 78 70 72 65 73 73 69  ll scan expressi
1abf0 6f 6e 73 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20  ons looking for 
1ac00 69 50 61 72 65 6e 74 20 72 65 66 65 72 65 6e 63  iParent referenc
1ac10 65 73 20 61 6e 64 20 72 65 70 6c 61 63 65 0a 20  es and replace. 
1ac20 20 2a 2a 20 74 68 6f 73 65 20 72 65 66 65 72 65   ** those refere
1ac30 6e 63 65 73 20 77 69 74 68 20 65 78 70 72 65 73  nces with expres
1ac40 73 69 6f 6e 73 20 74 68 61 74 20 72 65 73 6f 6c  sions that resol
1ac50 76 65 20 74 6f 20 74 68 65 20 73 75 62 71 75 65  ve to the subque
1ac60 72 79 20 46 52 4f 4d 0a 20 20 2a 2a 20 65 6c 65  ry FROM.  ** ele
1ac70 6d 65 6e 74 73 20 77 65 20 61 72 65 20 6e 6f 77  ments we are now
1ac80 20 63 6f 70 79 69 6e 67 20 69 6e 2e 0a 20 20 2a   copying in..  *
1ac90 2f 0a 20 20 66 6f 72 28 70 50 61 72 65 6e 74 3d  /.  for(pParent=
1aca0 70 3b 20 70 50 61 72 65 6e 74 3b 20 70 50 61 72  p; pParent; pPar
1acb0 65 6e 74 3d 70 50 61 72 65 6e 74 2d 3e 70 50 72  ent=pParent->pPr
1acc0 69 6f 72 2c 20 70 53 75 62 3d 70 53 75 62 2d 3e  ior, pSub=pSub->
1acd0 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 69 6e 74  pPrior){.    int
1ace0 20 6e 53 75 62 53 72 63 3b 0a 20 20 20 20 75 38   nSubSrc;.    u8
1acf0 20 6a 6f 69 6e 74 79 70 65 20 3d 20 30 3b 0a 20   jointype = 0;. 
1ad00 20 20 20 70 53 75 62 53 72 63 20 3d 20 70 53 75     pSubSrc = pSu
1ad10 62 2d 3e 70 53 72 63 3b 20 20 20 20 20 2f 2a 20  b->pSrc;     /* 
1ad20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 73  FROM clause of s
1ad30 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 6e  ubquery */.    n
1ad40 53 75 62 53 72 63 20 3d 20 70 53 75 62 53 72 63  SubSrc = pSubSrc
1ad50 2d 3e 6e 53 72 63 3b 20 20 2f 2a 20 4e 75 6d 62  ->nSrc;  /* Numb
1ad60 65 72 20 6f 66 20 74 65 72 6d 73 20 69 6e 20 73  er of terms in s
1ad70 75 62 71 75 65 72 79 20 46 52 4f 4d 20 63 6c 61  ubquery FROM cla
1ad80 75 73 65 20 2a 2f 0a 20 20 20 20 70 53 72 63 20  use */.    pSrc 
1ad90 3d 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 3b  = pParent->pSrc;
1ada0 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61       /* FROM cla
1adb0 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72  use of the outer
1adc0 20 71 75 65 72 79 20 2a 2f 0a 0a 20 20 20 20 69   query */..    i
1add0 66 28 20 70 53 72 63 20 29 7b 0a 20 20 20 20 20  f( pSrc ){.     
1ade0 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74   assert( pParent
1adf0 3d 3d 70 20 29 3b 20 20 2f 2a 20 46 69 72 73 74  ==p );  /* First
1ae00 20 74 69 6d 65 20 74 68 72 6f 75 67 68 20 74 68   time through th
1ae10 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20  e loop */.      
1ae20 6a 6f 69 6e 74 79 70 65 20 3d 20 70 53 75 62 69  jointype = pSubi
1ae30 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 3b 0a 20  tem->jointype;. 
1ae40 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1ae50 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 21  assert( pParent!
1ae60 3d 70 20 29 3b 20 20 2f 2a 20 32 6e 64 20 61 6e  =p );  /* 2nd an
1ae70 64 20 73 75 62 73 65 71 75 65 6e 74 20 74 69 6d  d subsequent tim
1ae80 65 73 20 74 68 72 6f 75 67 68 20 74 68 65 20 6c  es through the l
1ae90 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20 70 53 72  oop */.      pSr
1aea0 63 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70 53 72  c = pParent->pSr
1aeb0 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69  c = sqlite3SrcLi
1aec0 73 74 41 70 70 65 6e 64 28 64 62 2c 20 30 2c 20  stAppend(db, 0, 
1aed0 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  0, 0);.      if(
1aee0 20 70 53 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20   pSrc==0 ){.    
1aef0 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
1af00 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
1af10 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1af20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
1af30 20 20 2f 2a 20 54 68 65 20 73 75 62 71 75 65 72    /* The subquer
1af40 79 20 75 73 65 73 20 61 20 73 69 6e 67 6c 65 20  y uses a single 
1af50 73 6c 6f 74 20 6f 66 20 74 68 65 20 46 52 4f 4d  slot of the FROM
1af60 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f   clause of the o
1af70 75 74 65 72 0a 20 20 20 20 2a 2a 20 71 75 65 72  uter.    ** quer
1af80 79 2e 20 20 49 66 20 74 68 65 20 73 75 62 71 75  y.  If the subqu
1af90 65 72 79 20 68 61 73 20 6d 6f 72 65 20 74 68 61  ery has more tha
1afa0 6e 20 6f 6e 65 20 65 6c 65 6d 65 6e 74 20 69 6e  n one element in
1afb0 20 69 74 73 20 46 52 4f 4d 20 63 6c 61 75 73 65   its FROM clause
1afc0 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 65 78  ,.    ** then ex
1afd0 70 61 6e 64 20 74 68 65 20 6f 75 74 65 72 20 71  pand the outer q
1afe0 75 65 72 79 20 74 6f 20 6d 61 6b 65 20 73 70 61  uery to make spa
1aff0 63 65 20 66 6f 72 20 69 74 20 74 6f 20 68 6f 6c  ce for it to hol
1b000 64 20 61 6c 6c 20 65 6c 65 6d 65 6e 74 73 0a 20  d all elements. 
1b010 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 75 62     ** of the sub
1b020 71 75 65 72 79 2e 0a 20 20 20 20 2a 2a 0a 20 20  query..    **.  
1b030 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20    ** Example:.  
1b040 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 53    **.    **    S
1b050 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 61 62  ELECT * FROM tab
1b060 41 2c 20 28 53 45 4c 45 43 54 20 2a 20 46 52 4f  A, (SELECT * FRO
1b070 4d 20 73 75 62 31 2c 20 73 75 62 32 29 2c 20 74  M sub1, sub2), t
1b080 61 62 42 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20  abB;.    **.    
1b090 2a 2a 20 54 68 65 20 6f 75 74 65 72 20 71 75 65  ** The outer que
1b0a0 72 79 20 68 61 73 20 33 20 73 6c 6f 74 73 20 69  ry has 3 slots i
1b0b0 6e 20 69 74 73 20 46 52 4f 4d 20 63 6c 61 75 73  n its FROM claus
1b0c0 65 2e 20 20 4f 6e 65 20 73 6c 6f 74 20 6f 66 20  e.  One slot of 
1b0d0 74 68 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72  the.    ** outer
1b0e0 20 71 75 65 72 79 20 28 74 68 65 20 6d 69 64 64   query (the midd
1b0f0 6c 65 20 73 6c 6f 74 29 20 69 73 20 75 73 65 64  le slot) is used
1b100 20 62 79 20 74 68 65 20 73 75 62 71 75 65 72 79   by the subquery
1b110 2e 20 20 54 68 65 20 6e 65 78 74 0a 20 20 20 20  .  The next.    
1b120 2a 2a 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65  ** block of code
1b130 20 77 69 6c 6c 20 65 78 70 61 6e 64 20 74 68 65   will expand the
1b140 20 6f 75 74 20 71 75 65 72 79 20 74 6f 20 34 20   out query to 4 
1b150 73 6c 6f 74 73 2e 20 20 54 68 65 20 6d 69 64 64  slots.  The midd
1b160 6c 65 0a 20 20 20 20 2a 2a 20 73 6c 6f 74 20 69  le.    ** slot i
1b170 73 20 65 78 70 61 6e 64 65 64 20 74 6f 20 74 77  s expanded to tw
1b180 6f 20 73 6c 6f 74 73 20 69 6e 20 6f 72 64 65 72  o slots in order
1b190 20 74 6f 20 6d 61 6b 65 20 73 70 61 63 65 20 66   to make space f
1b1a0 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 77  or the.    ** tw
1b1b0 6f 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68  o elements in th
1b1c0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
1b1d0 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a 20   the subquery.. 
1b1e0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 53     */.    if( nS
1b1f0 75 62 53 72 63 3e 31 20 29 7b 0a 20 20 20 20 20  ubSrc>1 ){.     
1b200 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 20 3d   pParent->pSrc =
1b210 20 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53   pSrc = sqlite3S
1b220 72 63 4c 69 73 74 45 6e 6c 61 72 67 65 28 64 62  rcListEnlarge(db
1b230 2c 20 70 53 72 63 2c 20 6e 53 75 62 53 72 63 2d  , pSrc, nSubSrc-
1b240 31 2c 69 46 72 6f 6d 2b 31 29 3b 0a 20 20 20 20  1,iFrom+1);.    
1b250 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
1b260 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20  Failed ){.      
1b270 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
1b280 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54  .    }..    /* T
1b290 72 61 6e 73 66 65 72 20 74 68 65 20 46 52 4f 4d  ransfer the FROM
1b2a0 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 66 72   clause terms fr
1b2b0 6f 6d 20 74 68 65 20 73 75 62 71 75 65 72 79 20  om the subquery 
1b2c0 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20  into the.    ** 
1b2d0 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20 20  outer query..   
1b2e0 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   */.    for(i=0;
1b2f0 20 69 3c 6e 53 75 62 53 72 63 3b 20 69 2b 2b 29   i<nSubSrc; i++)
1b300 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 49  {.      sqlite3I
1b310 64 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  dListDelete(db, 
1b320 70 53 72 63 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d  pSrc->a[i+iFrom]
1b330 2e 70 55 73 69 6e 67 29 3b 0a 20 20 20 20 20 20  .pUsing);.      
1b340 70 53 72 63 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d  pSrc->a[i+iFrom]
1b350 20 3d 20 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d   = pSubSrc->a[i]
1b360 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26  ;.      memset(&
1b370 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 2c 20 30  pSubSrc->a[i], 0
1b380 2c 20 73 69 7a 65 6f 66 28 70 53 75 62 53 72 63  , sizeof(pSubSrc
1b390 2d 3e 61 5b 69 5d 29 29 3b 0a 20 20 20 20 7d 0a  ->a[i]));.    }.
1b3a0 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 46 72 6f      pSrc->a[iFro
1b3b0 6d 5d 2e 6a 6f 69 6e 74 79 70 65 20 3d 20 6a 6f  m].jointype = jo
1b3c0 69 6e 74 79 70 65 3b 0a 20 20 0a 20 20 20 20 2f  intype;.  .    /
1b3d0 2a 20 4e 6f 77 20 62 65 67 69 6e 20 73 75 62 73  * Now begin subs
1b3e0 74 69 74 75 74 69 6e 67 20 73 75 62 71 75 65 72  tituting subquer
1b3f0 79 20 72 65 73 75 6c 74 20 73 65 74 20 65 78 70  y result set exp
1b400 72 65 73 73 69 6f 6e 73 20 66 6f 72 20 0a 20 20  ressions for .  
1b410 20 20 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 20    ** references 
1b420 74 6f 20 74 68 65 20 69 50 61 72 65 6e 74 20 69  to the iParent i
1b430 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  n the outer quer
1b440 79 2e 0a 20 20 20 20 2a 2a 20 0a 20 20 20 20 2a  y..    ** .    *
1b450 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a  * Example:.    *
1b460 2a 0a 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43  *.    **   SELEC
1b470 54 20 61 2b 35 2c 20 62 2a 31 30 20 46 52 4f 4d  T a+5, b*10 FROM
1b480 20 28 53 45 4c 45 43 54 20 78 2a 33 20 41 53 20   (SELECT x*3 AS 
1b490 61 2c 20 79 2b 31 30 20 41 53 20 62 20 46 52 4f  a, y+10 AS b FRO
1b4a0 4d 20 74 31 29 20 57 48 45 52 45 20 61 3e 62 3b  M t1) WHERE a>b;
1b4b0 0a 20 20 20 20 2a 2a 20 20 20 5c 20 20 20 20 20  .    **   \     
1b4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b4d0 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 73  \_____________ s
1b4e0 75 62 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f  ubquery ________
1b4f0 5f 5f 2f 20 20 20 20 20 20 20 20 20 20 2f 0a 20  __/          /. 
1b500 20 20 20 2a 2a 20 20 20 20 5c 5f 5f 5f 5f 5f 5f     **    \______
1b510 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20  _______________ 
1b520 6f 75 74 65 72 20 71 75 65 72 79 20 5f 5f 5f 5f  outer query ____
1b530 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
1b540 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 20 20 20 20  __________/.    
1b550 2a 2a 0a 20 20 20 20 2a 2a 20 57 65 20 6c 6f 6f  **.    ** We loo
1b560 6b 20 61 74 20 65 76 65 72 79 20 65 78 70 72 65  k at every expre
1b570 73 73 69 6f 6e 20 69 6e 20 74 68 65 20 6f 75 74  ssion in the out
1b580 65 72 20 71 75 65 72 79 20 61 6e 64 20 65 76 65  er query and eve
1b590 72 79 20 70 6c 61 63 65 20 77 65 20 73 65 65 0a  ry place we see.
1b5a0 20 20 20 20 2a 2a 20 22 61 22 20 77 65 20 73 75      ** "a" we su
1b5b0 62 73 74 69 74 75 74 65 20 22 78 2a 33 22 20 61  bstitute "x*3" a
1b5c0 6e 64 20 65 76 65 72 79 20 70 6c 61 63 65 20 77  nd every place w
1b5d0 65 20 73 65 65 20 22 62 22 20 77 65 20 73 75 62  e see "b" we sub
1b5e0 73 74 69 74 75 74 65 20 22 79 2b 31 30 22 2e 0a  stitute "y+10"..
1b5f0 20 20 20 20 2a 2f 0a 20 20 20 20 70 4c 69 73 74      */.    pList
1b600 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70 45 4c 69   = pParent->pELi
1b610 73 74 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  st;.    for(i=0;
1b620 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   i<pList->nExpr;
1b630 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
1b640 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61   pList->a[i].zNa
1b650 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  me==0 ){.       
1b660 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 73   char *zName = s
1b670 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
1b680 62 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  b, pList->a[i].z
1b690 53 70 61 6e 29 3b 0a 20 20 20 20 20 20 20 20 73  Span);.        s
1b6a0 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28 7a 4e  qlite3Dequote(zN
1b6b0 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 70 4c  ame);.        pL
1b6c0 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20  ist->a[i].zName 
1b6d0 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 7d  = zName;.      }
1b6e0 0a 20 20 20 20 7d 0a 20 20 20 20 73 75 62 73 74  .    }.    subst
1b6f0 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70 50 61  ExprList(db, pPa
1b700 72 65 6e 74 2d 3e 70 45 4c 69 73 74 2c 20 69 50  rent->pEList, iP
1b710 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c  arent, pSub->pEL
1b720 69 73 74 29 3b 0a 20 20 20 20 69 66 28 20 69 73  ist);.    if( is
1b730 41 67 67 20 29 7b 0a 20 20 20 20 20 20 73 75 62  Agg ){.      sub
1b740 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70  stExprList(db, p
1b750 50 61 72 65 6e 74 2d 3e 70 47 72 6f 75 70 42 79  Parent->pGroupBy
1b760 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d  , iParent, pSub-
1b770 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  >pEList);.      
1b780 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67  pParent->pHaving
1b790 20 3d 20 73 75 62 73 74 45 78 70 72 28 64 62 2c   = substExpr(db,
1b7a0 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e   pParent->pHavin
1b7b0 67 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62  g, iParent, pSub
1b7c0 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 7d  ->pEList);.    }
1b7d0 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70  .    if( pSub->p
1b7e0 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
1b7f0 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74   assert( pParent
1b800 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b  ->pOrderBy==0 );
1b810 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e  .      pParent->
1b820 70 4f 72 64 65 72 42 79 20 3d 20 70 53 75 62 2d  pOrderBy = pSub-
1b830 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 20  >pOrderBy;.     
1b840 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20   pSub->pOrderBy 
1b850 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  = 0;.    }else i
1b860 66 28 20 70 50 61 72 65 6e 74 2d 3e 70 4f 72 64  f( pParent->pOrd
1b870 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 73 75  erBy ){.      su
1b880 62 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20  bstExprList(db, 
1b890 70 50 61 72 65 6e 74 2d 3e 70 4f 72 64 65 72 42  pParent->pOrderB
1b8a0 79 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62  y, iParent, pSub
1b8b0 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 7d  ->pEList);.    }
1b8c0 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70  .    if( pSub->p
1b8d0 57 68 65 72 65 20 29 7b 0a 20 20 20 20 20 20 70  Where ){.      p
1b8e0 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45  Where = sqlite3E
1b8f0 78 70 72 44 75 70 28 64 62 2c 20 70 53 75 62 2d  xprDup(db, pSub-
1b900 3e 70 57 68 65 72 65 2c 20 30 29 3b 0a 20 20 20  >pWhere, 0);.   
1b910 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 57   }else{.      pW
1b920 68 65 72 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  here = 0;.    }.
1b930 20 20 20 20 69 66 28 20 73 75 62 71 75 65 72 79      if( subquery
1b940 49 73 41 67 67 20 29 7b 0a 20 20 20 20 20 20 61  IsAgg ){.      a
1b950 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e  ssert( pParent->
1b960 70 48 61 76 69 6e 67 3d 3d 30 20 29 3b 0a 20 20  pHaving==0 );.  
1b970 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 48 61      pParent->pHa
1b980 76 69 6e 67 20 3d 20 70 50 61 72 65 6e 74 2d 3e  ving = pParent->
1b990 70 57 68 65 72 65 3b 0a 20 20 20 20 20 20 70 50  pWhere;.      pP
1b9a0 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 20 3d 20  arent->pWhere = 
1b9b0 70 57 68 65 72 65 3b 0a 20 20 20 20 20 20 70 50  pWhere;.      pP
1b9c0 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 20 3d  arent->pHaving =
1b9d0 20 73 75 62 73 74 45 78 70 72 28 64 62 2c 20 70   substExpr(db, p
1b9e0 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 2c  Parent->pHaving,
1b9f0 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e   iParent, pSub->
1ba00 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 70  pEList);.      p
1ba10 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 20  Parent->pHaving 
1ba20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64  = sqlite3ExprAnd
1ba30 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 48  (db, pParent->pH
1ba40 61 76 69 6e 67 2c 20 0a 20 20 20 20 20 20 20 20  aving, .        
1ba50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba60 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1ba70 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 53 75  3ExprDup(db, pSu
1ba80 62 2d 3e 70 48 61 76 69 6e 67 2c 20 30 29 29 3b  b->pHaving, 0));
1ba90 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1baa0 50 61 72 65 6e 74 2d 3e 70 47 72 6f 75 70 42 79  Parent->pGroupBy
1bab0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50 61  ==0 );.      pPa
1bac0 72 65 6e 74 2d 3e 70 47 72 6f 75 70 42 79 20 3d  rent->pGroupBy =
1bad0 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
1bae0 44 75 70 28 64 62 2c 20 70 53 75 62 2d 3e 70 47  Dup(db, pSub->pG
1baf0 72 6f 75 70 42 79 2c 20 30 29 3b 0a 20 20 20 20  roupBy, 0);.    
1bb00 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 61  }else{.      pPa
1bb10 72 65 6e 74 2d 3e 70 57 68 65 72 65 20 3d 20 73  rent->pWhere = s
1bb20 75 62 73 74 45 78 70 72 28 64 62 2c 20 70 50 61  ubstExpr(db, pPa
1bb30 72 65 6e 74 2d 3e 70 57 68 65 72 65 2c 20 69 50  rent->pWhere, iP
1bb40 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c  arent, pSub->pEL
1bb50 69 73 74 29 3b 0a 20 20 20 20 20 20 70 50 61 72  ist);.      pPar
1bb60 65 6e 74 2d 3e 70 57 68 65 72 65 20 3d 20 73 71  ent->pWhere = sq
1bb70 6c 69 74 65 33 45 78 70 72 41 6e 64 28 64 62 2c  lite3ExprAnd(db,
1bb80 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65   pParent->pWhere
1bb90 2c 20 70 57 68 65 72 65 29 3b 0a 20 20 20 20 7d  , pWhere);.    }
1bba0 0a 20 20 0a 20 20 20 20 2f 2a 20 54 68 65 20 66  .  .    /* The f
1bbb0 6c 61 74 74 65 6e 65 64 20 71 75 65 72 79 20 69  lattened query i
1bbc0 73 20 64 69 73 74 69 6e 63 74 20 69 66 20 65 69  s distinct if ei
1bbd0 74 68 65 72 20 74 68 65 20 69 6e 6e 65 72 20 6f  ther the inner o
1bbe0 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 75 74  r the.    ** out
1bbf0 65 72 20 71 75 65 72 79 20 69 73 20 64 69 73 74  er query is dist
1bc00 69 6e 63 74 2e 20 0a 20 20 20 20 2a 2f 0a 20 20  inct. .    */.  
1bc10 20 20 70 50 61 72 65 6e 74 2d 3e 73 65 6c 46 6c    pParent->selFl
1bc20 61 67 73 20 7c 3d 20 70 53 75 62 2d 3e 73 65 6c  ags |= pSub->sel
1bc30 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69  Flags & SF_Disti
1bc40 6e 63 74 3b 0a 20 20 0a 20 20 20 20 2f 2a 0a 20  nct;.  .    /*. 
1bc50 20 20 20 2a 2a 20 53 45 4c 45 43 54 20 2e 2e 2e     ** SELECT ...
1bc60 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 2e 2e   FROM (SELECT ..
1bc70 2e 20 4c 49 4d 49 54 20 61 20 4f 46 46 53 45 54  . LIMIT a OFFSET
1bc80 20 62 29 20 4c 49 4d 49 54 20 78 20 4f 46 46 53   b) LIMIT x OFFS
1bc90 45 54 20 79 3b 0a 20 20 20 20 2a 2a 0a 20 20 20  ET y;.    **.   
1bca0 20 2a 2a 20 4f 6e 65 20 69 73 20 74 65 6d 70 74   ** One is tempt
1bcb0 65 64 20 74 6f 20 74 72 79 20 74 6f 20 61 64 64  ed to try to add
1bcc0 20 61 20 61 6e 64 20 62 20 74 6f 20 63 6f 6d 62   a and b to comb
1bcd0 69 6e 65 20 74 68 65 20 6c 69 6d 69 74 73 2e 20  ine the limits. 
1bce0 20 42 75 74 20 74 68 69 73 0a 20 20 20 20 2a 2a   But this.    **
1bcf0 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 69   does not work i
1bd00 66 20 65 69 74 68 65 72 20 6c 69 6d 69 74 20 69  f either limit i
1bd10 73 20 6e 65 67 61 74 69 76 65 2e 0a 20 20 20 20  s negative..    
1bd20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d  */.    if( pSub-
1bd30 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20  >pLimit ){.     
1bd40 20 70 50 61 72 65 6e 74 2d 3e 70 4c 69 6d 69 74   pParent->pLimit
1bd50 20 3d 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 3b   = pSub->pLimit;
1bd60 0a 20 20 20 20 20 20 70 53 75 62 2d 3e 70 4c 69  .      pSub->pLi
1bd70 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  mit = 0;.    }. 
1bd80 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 69 61 6c 6c   }..  /* Finiall
1bd90 79 2c 20 64 65 6c 65 74 65 20 77 68 61 74 20 69  y, delete what i
1bda0 73 20 6c 65 66 74 20 6f 66 20 74 68 65 20 73 75  s left of the su
1bdb0 62 71 75 65 72 79 20 61 6e 64 20 72 65 74 75 72  bquery and retur
1bdc0 6e 0a 20 20 2a 2a 20 73 75 63 63 65 73 73 2e 0a  n.  ** success..
1bdd0 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 53 65    */.  sqlite3Se
1bde0 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70  lectDelete(db, p
1bdf0 53 75 62 31 29 3b 0a 0a 20 20 72 65 74 75 72 6e  Sub1);..  return
1be00 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20   1;.}.#endif /* 
1be10 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
1be20 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c  OMIT_SUBQUERY) |
1be30 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
1be40 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 2a 2f 0a  E_OMIT_VIEW) */.
1be50 0a 2f 2a 0a 2a 2a 20 42 61 73 65 64 20 6f 6e 20  ./*.** Based on 
1be60 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
1be70 74 68 65 20 41 67 67 49 6e 66 6f 20 73 74 72 75  the AggInfo stru
1be80 63 74 75 72 65 20 69 6e 64 69 63 61 74 65 64 20  cture indicated 
1be90 62 79 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20  by the first.** 
1bea0 61 72 67 75 6d 65 6e 74 2c 20 74 68 69 73 20 66  argument, this f
1beb0 75 6e 63 74 69 6f 6e 20 63 68 65 63 6b 73 20 69  unction checks i
1bec0 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
1bed0 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20  are true:.**.** 
1bee0 20 20 20 2a 20 74 68 65 20 71 75 65 72 79 20 63     * the query c
1bef0 6f 6e 74 61 69 6e 73 20 6a 75 73 74 20 61 20 73  ontains just a s
1bf00 69 6e 67 6c 65 20 61 67 67 72 65 67 61 74 65 20  ingle aggregate 
1bf10 66 75 6e 63 74 69 6f 6e 2c 0a 2a 2a 20 20 20 20  function,.**    
1bf20 2a 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20  * the aggregate 
1bf30 66 75 6e 63 74 69 6f 6e 20 69 73 20 65 69 74 68  function is eith
1bf40 65 72 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28  er min() or max(
1bf50 29 2c 20 61 6e 64 0a 2a 2a 20 20 20 20 2a 20 74  ), and.**    * t
1bf60 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  he argument to t
1bf70 68 65 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  he aggregate fun
1bf80 63 74 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d  ction is a colum
1bf90 6e 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 49  n value..**.** I
1bfa0 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 61 62 6f  f all of the abo
1bfb0 76 65 20 61 72 65 20 74 72 75 65 2c 20 74 68 65  ve are true, the
1bfc0 6e 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  n WHERE_ORDERBY_
1bfd0 4d 49 4e 20 6f 72 20 57 48 45 52 45 5f 4f 52 44  MIN or WHERE_ORD
1bfe0 45 52 42 59 5f 4d 41 58 0a 2a 2a 20 69 73 20 72  ERBY_MAX.** is r
1bff0 65 74 75 72 6e 65 64 20 61 73 20 61 70 70 72 6f  eturned as appro
1c000 70 72 69 61 74 65 2e 20 41 6c 73 6f 2c 20 2a 70  priate. Also, *p
1c010 70 4d 69 6e 4d 61 78 20 69 73 20 73 65 74 20 74  pMinMax is set t
1c020 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 0a  o point to the .
1c030 2a 2a 20 6c 69 73 74 20 6f 66 20 61 72 67 75 6d  ** list of argum
1c040 65 6e 74 73 20 70 61 73 73 65 64 20 74 6f 20 74  ents passed to t
1c050 68 65 20 61 67 67 72 65 67 61 74 65 20 62 65 66  he aggregate bef
1c060 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a  ore returning..*
1c070 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65 20  *.** Or, if the 
1c080 63 6f 6e 64 69 74 69 6f 6e 73 20 61 62 6f 76 65  conditions above
1c090 20 61 72 65 20 6e 6f 74 20 6d 65 74 2c 20 2a 70   are not met, *p
1c0a0 70 4d 69 6e 4d 61 78 20 69 73 20 73 65 74 20 74  pMinMax is set t
1c0b0 6f 20 30 20 61 6e 64 0a 2a 2a 20 57 48 45 52 45  o 0 and.** WHERE
1c0c0 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 20  _ORDERBY_NORMAL 
1c0d0 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
1c0e0 73 74 61 74 69 63 20 75 38 20 6d 69 6e 4d 61 78  static u8 minMax
1c0f0 51 75 65 72 79 28 41 67 67 49 6e 66 6f 20 2a 70  Query(AggInfo *p
1c100 41 67 67 49 6e 66 6f 2c 20 45 78 70 72 4c 69 73  AggInfo, ExprLis
1c110 74 20 2a 2a 70 70 4d 69 6e 4d 61 78 29 7b 0a 20  t **ppMinMax){. 
1c120 20 69 6e 74 20 65 52 65 74 20 3d 20 57 48 45 52   int eRet = WHER
1c130 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c  E_ORDERBY_NORMAL
1c140 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  ;          /* Re
1c150 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 0a 20  turn value */.. 
1c160 20 2a 70 70 4d 69 6e 4d 61 78 20 3d 20 30 3b 0a   *ppMinMax = 0;.
1c170 20 20 69 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e    if( pAggInfo->
1c180 6e 46 75 6e 63 3d 3d 31 20 29 7b 0a 20 20 20 20  nFunc==1 ){.    
1c190 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 41  Expr *pExpr = pA
1c1a0 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d  ggInfo->aFunc[0]
1c1b0 2e 70 45 78 70 72 3b 20 2f 2a 20 41 67 67 72 65  .pExpr; /* Aggre
1c1c0 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  gate function */
1c1d0 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70  .    ExprList *p
1c1e0 45 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78  EList = pExpr->x
1c1f0 2e 70 4c 69 73 74 3b 20 20 20 20 20 20 2f 2a 20  .pList;      /* 
1c200 41 72 67 75 6d 65 6e 74 73 20 74 6f 20 61 67 67  Arguments to agg
1c210 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20   function */..  
1c220 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
1c230 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43  >op==TK_AGG_FUNC
1c240 54 49 4f 4e 20 29 3b 0a 20 20 20 20 69 66 28 20  TION );.    if( 
1c250 70 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74  pEList && pEList
1c260 2d 3e 6e 45 78 70 72 3d 3d 31 20 26 26 20 70 45  ->nExpr==1 && pE
1c270 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
1c280 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c  ->op==TK_AGG_COL
1c290 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e  UMN ){.      con
1c2a0 73 74 20 63 68 61 72 20 2a 7a 46 75 6e 63 20 3d  st char *zFunc =
1c2b0 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
1c2c0 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ;.      if( sqli
1c2d0 74 65 33 53 74 72 49 43 6d 70 28 7a 46 75 6e 63  te3StrICmp(zFunc
1c2e0 2c 20 22 6d 69 6e 22 29 3d 3d 30 20 29 7b 0a 20  , "min")==0 ){. 
1c2f0 20 20 20 20 20 20 20 65 52 65 74 20 3d 20 57 48         eRet = WH
1c300 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 3b  ERE_ORDERBY_MIN;
1c310 0a 20 20 20 20 20 20 20 20 2a 70 70 4d 69 6e 4d  .        *ppMinM
1c320 61 78 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20 20  ax = pEList;.   
1c330 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c     }else if( sql
1c340 69 74 65 33 53 74 72 49 43 6d 70 28 7a 46 75 6e  ite3StrICmp(zFun
1c350 63 2c 20 22 6d 61 78 22 29 3d 3d 30 20 29 7b 0a  c, "max")==0 ){.
1c360 20 20 20 20 20 20 20 20 65 52 65 74 20 3d 20 57          eRet = W
1c370 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 41 58  HERE_ORDERBY_MAX
1c380 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 4d 69 6e  ;.        *ppMin
1c390 4d 61 78 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20  Max = pEList;.  
1c3a0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1c3b0 0a 20 20 61 73 73 65 72 74 28 20 2a 70 70 4d 69  .  assert( *ppMi
1c3c0 6e 4d 61 78 3d 3d 30 20 7c 7c 20 28 2a 70 70 4d  nMax==0 || (*ppM
1c3d0 69 6e 4d 61 78 29 2d 3e 6e 45 78 70 72 3d 3d 31  inMax)->nExpr==1
1c3e0 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 65 52 65   );.  return eRe
1c3f0 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  t;.}../*.** The 
1c400 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74  select statement
1c410 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66   passed as the f
1c420 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73  irst argument is
1c430 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 71 75   an aggregate qu
1c440 65 72 79 2e 0a 2a 2a 20 54 68 65 20 73 65 63 6f  ery..** The seco
1c450 6e 64 20 61 72 67 6d 65 6e 74 20 69 73 20 74 68  nd argment is th
1c460 65 20 61 73 73 6f 63 69 61 74 65 64 20 61 67 67  e associated agg
1c470 72 65 67 61 74 65 2d 69 6e 66 6f 20 6f 62 6a 65  regate-info obje
1c480 63 74 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e  ct. This .** fun
1c490 63 74 69 6f 6e 20 74 65 73 74 73 20 69 66 20 74  ction tests if t
1c4a0 68 65 20 53 45 4c 45 43 54 20 69 73 20 6f 66 20  he SELECT is of 
1c4b0 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20  the form:.**.** 
1c4c0 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a    SELECT count(*
1c4d0 29 20 46 52 4f 4d 20 3c 74 62 6c 3e 0a 2a 2a 0a  ) FROM <tbl>.**.
1c4e0 2a 2a 20 77 68 65 72 65 20 74 61 62 6c 65 20 69  ** where table i
1c4f0 73 20 61 20 64 61 74 61 62 61 73 65 20 74 61 62  s a database tab
1c500 6c 65 2c 20 6e 6f 74 20 61 20 73 75 62 2d 73 65  le, not a sub-se
1c510 6c 65 63 74 20 6f 72 20 76 69 65 77 2e 20 49 66  lect or view. If
1c520 20 74 68 65 20 71 75 65 72 79 0a 2a 2a 20 64 6f   the query.** do
1c530 65 73 20 6d 61 74 63 68 20 74 68 69 73 20 70 61  es match this pa
1c540 74 74 65 72 6e 2c 20 74 68 65 6e 20 61 20 70 6f  ttern, then a po
1c550 69 6e 74 65 72 20 74 6f 20 74 68 65 20 54 61 62  inter to the Tab
1c560 6c 65 20 6f 62 6a 65 63 74 20 72 65 70 72 65 73  le object repres
1c570 65 6e 74 69 6e 67 0a 2a 2a 20 3c 74 62 6c 3e 20  enting.** <tbl> 
1c580 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68  is returned. Oth
1c590 65 72 77 69 73 65 2c 20 30 20 69 73 20 72 65 74  erwise, 0 is ret
1c5a0 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
1c5b0 20 54 61 62 6c 65 20 2a 69 73 53 69 6d 70 6c 65   Table *isSimple
1c5c0 43 6f 75 6e 74 28 53 65 6c 65 63 74 20 2a 70 2c  Count(Select *p,
1c5d0 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e   AggInfo *pAggIn
1c5e0 66 6f 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54  fo){.  Table *pT
1c5f0 61 62 3b 0a 20 20 45 78 70 72 20 2a 70 45 78 70  ab;.  Expr *pExp
1c600 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70  r;..  assert( !p
1c610 2d 3e 70 47 72 6f 75 70 42 79 20 29 3b 0a 0a 20  ->pGroupBy );.. 
1c620 20 69 66 28 20 70 2d 3e 70 57 68 65 72 65 20 7c   if( p->pWhere |
1c630 7c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  | p->pEList->nEx
1c640 70 72 21 3d 31 20 0a 20 20 20 7c 7c 20 70 2d 3e  pr!=1 .   || p->
1c650 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20 7c 7c  pSrc->nSrc!=1 ||
1c660 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70   p->pSrc->a[0].p
1c670 53 65 6c 65 63 74 0a 20 20 29 7b 0a 20 20 20 20  Select.  ){.    
1c680 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
1c690 70 54 61 62 20 3d 20 70 2d 3e 70 53 72 63 2d 3e  pTab = p->pSrc->
1c6a0 61 5b 30 5d 2e 70 54 61 62 3b 0a 20 20 70 45 78  a[0].pTab;.  pEx
1c6b0 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  pr = p->pEList->
1c6c0 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 61 73  a[0].pExpr;.  as
1c6d0 73 65 72 74 28 20 70 54 61 62 20 26 26 20 21 70  sert( pTab && !p
1c6e0 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 26 26 20  Tab->pSelect && 
1c6f0 70 45 78 70 72 20 29 3b 0a 0a 20 20 69 66 28 20  pExpr );..  if( 
1c700 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
1c710 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
1c720 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
1c730 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 20 72  AGG_FUNCTION ) r
1c740 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 4e  eturn 0;.  if( N
1c750 45 56 45 52 28 70 41 67 67 49 6e 66 6f 2d 3e 6e  EVER(pAggInfo->n
1c760 46 75 6e 63 3d 3d 30 29 20 29 20 72 65 74 75 72  Func==0) ) retur
1c770 6e 20 30 3b 0a 20 20 69 66 28 20 28 70 41 67 67  n 0;.  if( (pAgg
1c780 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d 2e 70  Info->aFunc[0].p
1c790 46 75 6e 63 2d 3e 66 75 6e 63 46 6c 61 67 73 26  Func->funcFlags&
1c7a0 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 55 4e  SQLITE_FUNC_COUN
1c7b0 54 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  T)==0 ) return 0
1c7c0 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 66  ;.  if( pExpr->f
1c7d0 6c 61 67 73 26 45 50 5f 44 69 73 74 69 6e 63 74  lags&EP_Distinct
1c7e0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20   ) return 0;..  
1c7f0 72 65 74 75 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a  return pTab;.}..
1c800 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 6f 75  /*.** If the sou
1c810 72 63 65 2d 6c 69 73 74 20 69 74 65 6d 20 70 61  rce-list item pa
1c820 73 73 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d  ssed as an argum
1c830 65 6e 74 20 77 61 73 20 61 75 67 6d 65 6e 74 65  ent was augmente
1c840 64 20 77 69 74 68 20 61 6e 0a 2a 2a 20 49 4e 44  d with an.** IND
1c850 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 2c 20  EXED BY clause, 
1c860 74 68 65 6e 20 74 72 79 20 74 6f 20 6c 6f 63 61  then try to loca
1c870 74 65 20 74 68 65 20 73 70 65 63 69 66 69 65 64  te the specified
1c880 20 69 6e 64 65 78 2e 20 49 66 20 74 68 65 72 65   index. If there
1c890 0a 2a 2a 20 77 61 73 20 73 75 63 68 20 61 20 63  .** was such a c
1c8a0 6c 61 75 73 65 20 61 6e 64 20 74 68 65 20 6e 61  lause and the na
1c8b0 6d 65 64 20 69 6e 64 65 78 20 63 61 6e 6e 6f 74  med index cannot
1c8c0 20 62 65 20 66 6f 75 6e 64 2c 20 72 65 74 75 72   be found, retur
1c8d0 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 52 52  n .** SQLITE_ERR
1c8e0 4f 52 20 61 6e 64 20 6c 65 61 76 65 20 61 6e 20  OR and leave an 
1c8f0 65 72 72 6f 72 20 69 6e 20 70 50 61 72 73 65 2e  error in pParse.
1c900 20 4f 74 68 65 72 77 69 73 65 2c 20 70 6f 70 75   Otherwise, popu
1c910 6c 61 74 65 20 0a 2a 2a 20 70 46 72 6f 6d 2d 3e  late .** pFrom->
1c920 70 49 6e 64 65 78 20 61 6e 64 20 72 65 74 75 72  pIndex and retur
1c930 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a  n SQLITE_OK..*/.
1c940 69 6e 74 20 73 71 6c 69 74 65 33 49 6e 64 65 78  int sqlite3Index
1c950 65 64 42 79 4c 6f 6f 6b 75 70 28 50 61 72 73 65  edByLookup(Parse
1c960 20 2a 70 50 61 72 73 65 2c 20 73 74 72 75 63 74   *pParse, struct
1c970 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
1c980 46 72 6f 6d 29 7b 0a 20 20 69 66 28 20 70 46 72  From){.  if( pFr
1c990 6f 6d 2d 3e 70 54 61 62 20 26 26 20 70 46 72 6f  om->pTab && pFro
1c9a0 6d 2d 3e 7a 49 6e 64 65 78 20 29 7b 0a 20 20 20  m->zIndex ){.   
1c9b0 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
1c9c0 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20  From->pTab;.    
1c9d0 63 68 61 72 20 2a 7a 49 6e 64 65 78 20 3d 20 70  char *zIndex = p
1c9e0 46 72 6f 6d 2d 3e 7a 49 6e 64 65 78 3b 0a 20 20  From->zIndex;.  
1c9f0 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20    Index *pIdx;. 
1ca00 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62     for(pIdx=pTab
1ca10 2d 3e 70 49 6e 64 65 78 3b 20 0a 20 20 20 20 20  ->pIndex; .     
1ca20 20 20 20 70 49 64 78 20 26 26 20 73 71 6c 69 74     pIdx && sqlit
1ca30 65 33 53 74 72 49 43 6d 70 28 70 49 64 78 2d 3e  e3StrICmp(pIdx->
1ca40 7a 4e 61 6d 65 2c 20 7a 49 6e 64 65 78 29 3b 20  zName, zIndex); 
1ca50 0a 20 20 20 20 20 20 20 20 70 49 64 78 3d 70 49  .        pIdx=pI
1ca60 64 78 2d 3e 70 4e 65 78 74 0a 20 20 20 20 29 3b  dx->pNext.    );
1ca70 0a 20 20 20 20 69 66 28 20 21 70 49 64 78 20 29  .    if( !pIdx )
1ca80 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
1ca90 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
1caa0 22 6e 6f 20 73 75 63 68 20 69 6e 64 65 78 3a 20  "no such index: 
1cab0 25 73 22 2c 20 7a 49 6e 64 65 78 2c 20 30 29 3b  %s", zIndex, 0);
1cac0 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 63  .      pParse->c
1cad0 68 65 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a  heckSchema = 1;.
1cae0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1caf0 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  ITE_ERROR;.    }
1cb00 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 70 49 6e 64  .    pFrom->pInd
1cb10 65 78 20 3d 20 70 49 64 78 3b 0a 20 20 7d 0a 20  ex = pIdx;.  }. 
1cb20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1cb30 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 44 65 74 65 63  K;.}./*.** Detec
1cb40 74 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43  t compound SELEC
1cb50 54 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68 61  T statements tha
1cb60 74 20 75 73 65 20 61 6e 20 4f 52 44 45 52 20 42  t use an ORDER B
1cb70 59 20 63 6c 61 75 73 65 20 77 69 74 68 20 0a 2a  Y clause with .*
1cb80 2a 20 61 6e 20 61 6c 74 65 72 6e 61 74 69 76 65  * an alternative
1cb90 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
1cba0 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45  nce..**.**    SE
1cbb0 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 31  LECT ... FROM t1
1cbc0 20 45 58 43 45 50 54 20 53 45 4c 45 43 54 20 2e   EXCEPT SELECT .
1cbd0 2e 2e 20 46 52 4f 4d 20 74 32 20 4f 52 44 45 52  .. FROM t2 ORDER
1cbe0 20 42 59 20 2e 2e 20 43 4f 4c 4c 41 54 45 20 2e   BY .. COLLATE .
1cbf0 2e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 61  ...**.** These a
1cc00 72 65 20 72 65 77 72 69 74 74 65 6e 20 61 73 20  re rewritten as 
1cc10 61 20 73 75 62 71 75 65 72 79 3a 0a 2a 2a 0a 2a  a subquery:.**.*
1cc20 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  *    SELECT * FR
1cc30 4f 4d 20 28 53 45 4c 45 43 54 20 2e 2e 2e 20 46  OM (SELECT ... F
1cc40 52 4f 4d 20 74 31 20 45 58 43 45 50 54 20 53 45  ROM t1 EXCEPT SE
1cc50 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 32  LECT ... FROM t2
1cc60 29 0a 2a 2a 20 20 20 20 20 4f 52 44 45 52 20 42  ).**     ORDER B
1cc70 59 20 2e 2e 2e 20 43 4f 4c 4c 41 54 45 20 2e 2e  Y ... COLLATE ..
1cc80 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 74 72 61  ..**.** This tra
1cc90 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 6e  nsformation is n
1cca0 65 63 65 73 73 61 72 79 20 62 65 63 61 75 73 65  ecessary because
1ccb0 20 74 68 65 20 6d 75 6c 74 69 53 65 6c 65 63 74   the multiSelect
1ccc0 4f 72 64 65 72 42 79 28 29 20 72 6f 75 74 69 6e  OrderBy() routin
1ccd0 65 0a 2a 2a 20 61 62 6f 76 65 20 74 68 61 74 20  e.** above that 
1cce0 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f  generates the co
1ccf0 64 65 20 66 6f 72 20 61 20 63 6f 6d 70 6f 75 6e  de for a compoun
1cd00 64 20 53 45 4c 45 43 54 20 77 69 74 68 20 61 6e  d SELECT with an
1cd10 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
1cd20 0a 2a 2a 20 75 73 65 73 20 61 20 6d 65 72 67 65  .** uses a merge
1cd30 20 61 6c 67 6f 72 69 74 68 6d 20 74 68 61 74 20   algorithm that 
1cd40 72 65 71 75 69 72 65 73 20 74 68 65 20 73 61 6d  requires the sam
1cd50 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
1cd60 65 6e 63 65 20 6f 6e 20 74 68 65 0a 2a 2a 20 72  ence on the.** r
1cd70 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 61 73  esult columns as
1cd80 20 6f 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59   on the ORDER BY
1cd90 20 63 6c 61 75 73 65 2e 20 20 53 65 65 20 74 69   clause.  See ti
1cda0 63 6b 65 74 0a 2a 2a 20 68 74 74 70 3a 2f 2f 77  cket.** http://w
1cdb0 77 77 2e 73 71 6c 69 74 65 2e 6f 72 67 2f 73 72  ww.sqlite.org/sr
1cdc0 63 2f 69 6e 66 6f 2f 36 37 30 39 35 37 34 64 32  c/info/6709574d2
1cdd0 61 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 74 72 61  a.**.** This tra
1cde0 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 6f  nsformation is o
1cdf0 6e 6c 79 20 6e 65 65 64 65 64 20 66 6f 72 20 45  nly needed for E
1ce00 58 43 45 50 54 2c 20 49 4e 54 45 52 53 45 43 54  XCEPT, INTERSECT
1ce10 2c 20 61 6e 64 20 55 4e 49 4f 4e 2e 0a 2a 2a 20  , and UNION..** 
1ce20 54 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70  The UNION ALL op
1ce30 65 72 61 74 6f 72 20 77 6f 72 6b 73 20 66 69 6e  erator works fin
1ce40 65 20 77 69 74 68 20 6d 75 6c 74 69 53 65 6c 65  e with multiSele
1ce50 63 74 4f 72 64 65 72 42 79 28 29 20 65 76 65 6e  ctOrderBy() even
1ce60 20 77 68 65 6e 0a 2a 2a 20 74 68 65 72 65 20 61   when.** there a
1ce70 72 65 20 43 4f 4c 4c 41 54 45 20 74 65 72 6d 73  re COLLATE terms
1ce80 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59   in the ORDER BY
1ce90 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1cea0 63 6f 6e 76 65 72 74 43 6f 6d 70 6f 75 6e 64 53  convertCompoundS
1ceb0 65 6c 65 63 74 54 6f 53 75 62 71 75 65 72 79 28  electToSubquery(
1cec0 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c  Walker *pWalker,
1ced0 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69   Select *p){.  i
1cee0 6e 74 20 69 3b 0a 20 20 53 65 6c 65 63 74 20 2a  nt i;.  Select *
1cef0 70 4e 65 77 3b 0a 20 20 53 65 6c 65 63 74 20 2a  pNew;.  Select *
1cf00 70 58 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  pX;.  sqlite3 *d
1cf10 62 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72  b;.  struct Expr
1cf20 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b 0a 20 20  List_item *a;.  
1cf30 53 72 63 4c 69 73 74 20 2a 70 4e 65 77 53 72 63  SrcList *pNewSrc
1cf40 3b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  ;.  Parse *pPars
1cf50 65 3b 0a 20 20 54 6f 6b 65 6e 20 64 75 6d 6d 79  e;.  Token dummy
1cf60 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69  ;..  if( p->pPri
1cf70 6f 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57  or==0 ) return W
1cf80 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 69  RC_Continue;.  i
1cf90 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d  f( p->pOrderBy==
1cfa0 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 43  0 ) return WRC_C
1cfb0 6f 6e 74 69 6e 75 65 3b 0a 20 20 66 6f 72 28 70  ontinue;.  for(p
1cfc0 58 3d 70 3b 20 70 58 20 26 26 20 28 70 58 2d 3e  X=p; pX && (pX->
1cfd0 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 70 58  op==TK_ALL || pX
1cfe0 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 29  ->op==TK_SELECT)
1cff0 3b 20 70 58 3d 70 58 2d 3e 70 50 72 69 6f 72 29  ; pX=pX->pPrior)
1d000 7b 7d 0a 20 20 69 66 28 20 70 58 3d 3d 30 20 29  {}.  if( pX==0 )
1d010 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
1d020 69 6e 75 65 3b 0a 20 20 61 20 3d 20 70 2d 3e 70  inue;.  a = p->p
1d030 4f 72 64 65 72 42 79 2d 3e 61 3b 0a 20 20 66 6f  OrderBy->a;.  fo
1d040 72 28 69 3d 70 2d 3e 70 4f 72 64 65 72 42 79 2d  r(i=p->pOrderBy-
1d050 3e 6e 45 78 70 72 2d 31 3b 20 69 3e 3d 30 3b 20  >nExpr-1; i>=0; 
1d060 69 2d 2d 29 7b 0a 20 20 20 20 69 66 28 20 61 5b  i--){.    if( a[
1d070 69 5d 2e 70 45 78 70 72 2d 3e 66 6c 61 67 73 20  i].pExpr->flags 
1d080 26 20 45 50 5f 43 6f 6c 6c 61 74 65 20 29 20 62  & EP_Collate ) b
1d090 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  reak;.  }.  if( 
1d0a0 69 3c 30 20 29 20 72 65 74 75 72 6e 20 57 52 43  i<0 ) return WRC
1d0b0 5f 43 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 2f 2a  _Continue;..  /*
1d0c0 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69   If we reach thi
1d0d0 73 20 70 6f 69 6e 74 2c 20 74 68 61 74 20 6d 65  s point, that me
1d0e0 61 6e 73 20 74 68 65 20 74 72 61 6e 73 66 6f 72  ans the transfor
1d0f0 6d 61 74 69 6f 6e 20 69 73 20 72 65 71 75 69 72  mation is requir
1d100 65 64 2e 20 2a 2f 0a 0a 20 20 70 50 61 72 73 65  ed. */..  pParse
1d110 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72   = pWalker->pPar
1d120 73 65 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73  se;.  db = pPars
1d130 65 2d 3e 64 62 3b 0a 20 20 70 4e 65 77 20 3d 20  e->db;.  pNew = 
1d140 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
1d150 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a  ero(db, sizeof(*
1d160 70 4e 65 77 29 20 29 3b 0a 20 20 69 66 28 20 70  pNew) );.  if( p
1d170 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  New==0 ) return 
1d180 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 6d 65 6d  WRC_Abort;.  mem
1d190 73 65 74 28 26 64 75 6d 6d 79 2c 20 30 2c 20 73  set(&dummy, 0, s
1d1a0 69 7a 65 6f 66 28 64 75 6d 6d 79 29 29 3b 0a 20  izeof(dummy));. 
1d1b0 20 70 4e 65 77 53 72 63 20 3d 20 73 71 6c 69 74   pNewSrc = sqlit
1d1c0 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 46  e3SrcListAppendF
1d1d0 72 6f 6d 54 65 72 6d 28 70 50 61 72 73 65 2c 30  romTerm(pParse,0
1d1e0 2c 30 2c 30 2c 26 64 75 6d 6d 79 2c 70 4e 65 77  ,0,0,&dummy,pNew
1d1f0 2c 30 2c 30 29 3b 0a 20 20 69 66 28 20 70 4e 65  ,0,0);.  if( pNe
1d200 77 53 72 63 3d 3d 30 20 29 20 72 65 74 75 72 6e  wSrc==0 ) return
1d210 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 2a 70   WRC_Abort;.  *p
1d220 4e 65 77 20 3d 20 2a 70 3b 0a 20 20 70 2d 3e 70  New = *p;.  p->p
1d230 53 72 63 20 3d 20 70 4e 65 77 53 72 63 3b 0a 20  Src = pNewSrc;. 
1d240 20 70 2d 3e 70 45 4c 69 73 74 20 3d 20 73 71 6c   p->pEList = sql
1d250 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
1d260 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 20 73 71  nd(pParse, 0, sq
1d270 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b  lite3Expr(db, TK
1d280 5f 41 4c 4c 2c 20 30 29 29 3b 0a 20 20 70 2d 3e  _ALL, 0));.  p->
1d290 6f 70 20 3d 20 54 4b 5f 53 45 4c 45 43 54 3b 0a  op = TK_SELECT;.
1d2a0 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 30 3b    p->pWhere = 0;
1d2b0 0a 20 20 70 4e 65 77 2d 3e 70 47 72 6f 75 70 42  .  pNew->pGroupB
1d2c0 79 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70  y = 0;.  pNew->p
1d2d0 48 61 76 69 6e 67 20 3d 20 30 3b 0a 20 20 70 4e  Having = 0;.  pN
1d2e0 65 77 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30  ew->pOrderBy = 0
1d2f0 3b 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20  ;.  p->pPrior = 
1d300 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 6d 69  0;.  pNew->pLimi
1d310 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70  t = 0;.  pNew->p
1d320 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 72 65  Offset = 0;.  re
1d330 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75  turn WRC_Continu
1d340 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  e;.}../*.** This
1d350 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 57 61   routine is a Wa
1d360 6c 6b 65 72 20 63 61 6c 6c 62 61 63 6b 20 66 6f  lker callback fo
1d370 72 20 22 65 78 70 61 6e 64 69 6e 67 22 20 61 20  r "expanding" a 
1d380 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
1d390 2e 0a 2a 2a 20 22 45 78 70 61 6e 64 69 6e 67 22  ..** "Expanding"
1d3a0 20 6d 65 61 6e 73 20 74 6f 20 64 6f 20 74 68 65   means to do the
1d3b0 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
1d3c0 2a 20 20 20 20 28 31 29 20 20 4d 61 6b 65 20 73  *    (1)  Make s
1d3d0 75 72 65 20 56 44 42 45 20 63 75 72 73 6f 72 20  ure VDBE cursor 
1d3e0 6e 75 6d 62 65 72 73 20 68 61 76 65 20 62 65 65  numbers have bee
1d3f0 6e 20 61 73 73 69 67 6e 65 64 20 74 6f 20 65 76  n assigned to ev
1d400 65 72 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 65  ery.**         e
1d410 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 46 52  lement of the FR
1d420 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a  OM clause..**.**
1d430 20 20 20 20 28 32 29 20 20 46 69 6c 6c 20 69 6e      (2)  Fill in
1d440 20 74 68 65 20 70 54 61 62 4c 69 73 74 2d 3e 61   the pTabList->a
1d450 5b 5d 2e 70 54 61 62 20 66 69 65 6c 64 73 20 69  [].pTab fields i
1d460 6e 20 74 68 65 20 53 72 63 4c 69 73 74 20 74 68  n the SrcList th
1d470 61 74 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 64  at .**         d
1d480 65 66 69 6e 65 73 20 46 52 4f 4d 20 63 6c 61 75  efines FROM clau
1d490 73 65 2e 20 20 57 68 65 6e 20 76 69 65 77 73 20  se.  When views 
1d4a0 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 46 52  appear in the FR
1d4b0 4f 4d 20 63 6c 61 75 73 65 2c 0a 2a 2a 20 20 20  OM clause,.**   
1d4c0 20 20 20 20 20 20 66 69 6c 6c 20 70 54 61 62 4c        fill pTabL
1d4d0 69 73 74 2d 3e 61 5b 5d 2e 70 53 65 6c 65 63 74  ist->a[].pSelect
1d4e0 20 77 69 74 68 20 61 20 63 6f 70 79 20 6f 66 20   with a copy of 
1d4f0 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
1d500 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  ment.**         
1d510 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20  that implements 
1d520 74 68 65 20 76 69 65 77 2e 20 20 41 20 63 6f 70  the view.  A cop
1d530 79 20 69 73 20 6d 61 64 65 20 6f 66 20 74 68 65  y is made of the
1d540 20 76 69 65 77 27 73 20 53 45 4c 45 43 54 0a 2a   view's SELECT.*
1d550 2a 20 20 20 20 20 20 20 20 20 73 74 61 74 65 6d  *         statem
1d560 65 6e 74 20 73 6f 20 74 68 61 74 20 77 65 20 63  ent so that we c
1d570 61 6e 20 66 72 65 65 6c 79 20 6d 6f 64 69 66 79  an freely modify
1d580 20 6f 72 20 64 65 6c 65 74 65 20 74 68 61 74 20   or delete that 
1d590 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20  statement.**    
1d5a0 20 20 20 20 20 77 69 74 68 6f 75 74 20 77 6f 72       without wor
1d5b0 72 79 69 6e 67 20 61 62 6f 75 74 20 6d 65 73 73  rying about mess
1d5c0 69 6e 67 20 75 70 20 74 68 65 20 70 72 65 73 69  ing up the presi
1d5d0 73 74 65 6e 74 20 72 65 70 72 65 73 65 6e 74 61  stent representa
1d5e0 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20  tion.**         
1d5f0 6f 66 20 74 68 65 20 76 69 65 77 2e 0a 2a 2a 0a  of the view..**.
1d600 2a 2a 20 20 20 20 28 33 29 20 20 41 64 64 20 74  **    (3)  Add t
1d610 65 72 6d 73 20 74 6f 20 74 68 65 20 57 48 45 52  erms to the WHER
1d620 45 20 63 6c 61 75 73 65 20 74 6f 20 61 63 63 6f  E clause to acco
1d630 6d 6f 64 61 74 65 20 74 68 65 20 4e 41 54 55 52  modate the NATUR
1d640 41 4c 20 6b 65 79 77 6f 72 64 0a 2a 2a 20 20 20  AL keyword.**   
1d650 20 20 20 20 20 20 6f 6e 20 6a 6f 69 6e 73 20 61        on joins a
1d660 6e 64 20 74 68 65 20 4f 4e 20 61 6e 64 20 55 53  nd the ON and US
1d670 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 6a 6f  ING clause of jo
1d680 69 6e 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 34  ins..**.**    (4
1d690 29 20 20 53 63 61 6e 20 74 68 65 20 6c 69 73 74  )  Scan the list
1d6a0 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   of columns in t
1d6b0 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 28 70  he result set (p
1d6c0 45 4c 69 73 74 29 20 6c 6f 6f 6b 69 6e 67 0a 2a  EList) looking.*
1d6d0 2a 20 20 20 20 20 20 20 20 20 66 6f 72 20 69 6e  *         for in
1d6e0 73 74 61 6e 63 65 73 20 6f 66 20 74 68 65 20 22  stances of the "
1d6f0 2a 22 20 6f 70 65 72 61 74 6f 72 20 6f 72 20 74  *" operator or t
1d700 68 65 20 54 41 42 4c 45 2e 2a 20 6f 70 65 72 61  he TABLE.* opera
1d710 74 6f 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20  tor..**         
1d720 49 66 20 66 6f 75 6e 64 2c 20 65 78 70 61 6e 64  If found, expand
1d730 20 65 61 63 68 20 22 2a 22 20 74 6f 20 62 65 20   each "*" to be 
1d740 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20  every column in 
1d750 65 76 65 72 79 20 74 61 62 6c 65 0a 2a 2a 20 20  every table.**  
1d760 20 20 20 20 20 20 20 61 6e 64 20 54 41 42 4c 45         and TABLE
1d770 2e 2a 20 74 6f 20 62 65 20 65 76 65 72 79 20 63  .* to be every c
1d780 6f 6c 75 6d 6e 20 69 6e 20 54 41 42 4c 45 2e 0a  olumn in TABLE..
1d790 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  **.*/.static int
1d7a0 20 73 65 6c 65 63 74 45 78 70 61 6e 64 65 72 28   selectExpander(
1d7b0 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c  Walker *pWalker,
1d7c0 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 50   Select *p){.  P
1d7d0 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70  arse *pParse = p
1d7e0 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a  Walker->pParse;.
1d7f0 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 3b 0a 20    int i, j, k;. 
1d800 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
1d810 73 74 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  st;.  ExprList *
1d820 70 45 4c 69 73 74 3b 0a 20 20 73 74 72 75 63 74  pEList;.  struct
1d830 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
1d840 46 72 6f 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20  From;.  sqlite3 
1d850 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
1d860 3b 0a 20 20 45 78 70 72 20 2a 70 45 2c 20 2a 70  ;.  Expr *pE, *p
1d870 52 69 67 68 74 2c 20 2a 70 45 78 70 72 3b 0a 20  Right, *pExpr;. 
1d880 20 75 31 36 20 73 65 6c 46 6c 61 67 73 20 3d 20   u16 selFlags = 
1d890 70 2d 3e 73 65 6c 46 6c 61 67 73 3b 0a 0a 20 20  p->selFlags;..  
1d8a0 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53  p->selFlags |= S
1d8b0 46 5f 45 78 70 61 6e 64 65 64 3b 0a 20 20 69 66  F_Expanded;.  if
1d8c0 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
1d8d0 65 64 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ed  ){.    retur
1d8e0 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d  n WRC_Abort;.  }
1d8f0 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 2d 3e  .  if( NEVER(p->
1d900 70 53 72 63 3d 3d 30 29 20 7c 7c 20 28 73 65 6c  pSrc==0) || (sel
1d910 46 6c 61 67 73 20 26 20 53 46 5f 45 78 70 61 6e  Flags & SF_Expan
1d920 64 65 64 29 21 3d 30 20 29 7b 0a 20 20 20 20 72  ded)!=0 ){.    r
1d930 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b  eturn WRC_Prune;
1d940 0a 20 20 7d 0a 20 20 70 54 61 62 4c 69 73 74 20  .  }.  pTabList 
1d950 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 45 4c  = p->pSrc;.  pEL
1d960 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b  ist = p->pEList;
1d970 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
1d980 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20   cursor numbers 
1d990 68 61 76 65 20 62 65 65 6e 20 61 73 73 69 67 6e  have been assign
1d9a0 65 64 20 74 6f 20 61 6c 6c 20 65 6e 74 72 69 65  ed to all entrie
1d9b0 73 20 69 6e 0a 20 20 2a 2a 20 74 68 65 20 46 52  s in.  ** the FR
1d9c0 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
1d9d0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
1d9e0 74 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  t..  */.  sqlite
1d9f0 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75  3SrcListAssignCu
1da00 72 73 6f 72 73 28 70 50 61 72 73 65 2c 20 70 54  rsors(pParse, pT
1da10 61 62 4c 69 73 74 29 3b 0a 0a 20 20 2f 2a 20 4c  abList);..  /* L
1da20 6f 6f 6b 20 75 70 20 65 76 65 72 79 20 74 61 62  ook up every tab
1da30 6c 65 20 6e 61 6d 65 64 20 69 6e 20 74 68 65 20  le named in the 
1da40 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74  FROM clause of t
1da50 68 65 20 73 65 6c 65 63 74 2e 20 20 49 66 0a 20  he select.  If. 
1da60 20 2a 2a 20 61 6e 20 65 6e 74 72 79 20 6f 66 20   ** an entry of 
1da70 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
1da80 69 73 20 61 20 73 75 62 71 75 65 72 79 20 69 6e  is a subquery in
1da90 73 74 65 61 64 20 6f 66 20 61 20 74 61 62 6c 65  stead of a table
1daa0 20 6f 72 20 76 69 65 77 2c 0a 20 20 2a 2a 20 74   or view,.  ** t
1dab0 68 65 6e 20 63 72 65 61 74 65 20 61 20 74 72 61  hen create a tra
1dac0 6e 73 69 65 6e 74 20 74 61 62 6c 65 20 73 74 72  nsient table str
1dad0 75 63 74 75 72 65 20 74 6f 20 64 65 73 63 72 69  ucture to descri
1dae0 62 65 20 74 68 65 20 73 75 62 71 75 65 72 79 2e  be the subquery.
1daf0 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c  .  */.  for(i=0,
1db00 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d   pFrom=pTabList-
1db10 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e  >a; i<pTabList->
1db20 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d  nSrc; i++, pFrom
1db30 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  ++){.    Table *
1db40 70 54 61 62 3b 0a 20 20 20 20 69 66 28 20 70 46  pTab;.    if( pF
1db50 72 6f 6d 2d 3e 70 54 61 62 21 3d 30 20 29 7b 0a  rom->pTab!=0 ){.
1db60 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 73 74        /* This st
1db70 61 74 65 6d 65 6e 74 20 68 61 73 20 61 6c 72 65  atement has alre
1db80 61 64 79 20 62 65 65 6e 20 70 72 65 70 61 72 65  ady been prepare
1db90 64 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20  d.  There is no 
1dba0 6e 65 65 64 0a 20 20 20 20 20 20 2a 2a 20 74 6f  need.      ** to
1dbb0 20 67 6f 20 66 75 72 74 68 65 72 2e 20 2a 2f 0a   go further. */.
1dbc0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 3d        assert( i=
1dbd0 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75  =0 );.      retu
1dbe0 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20  rn WRC_Prune;.  
1dbf0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 46 72 6f    }.    if( pFro
1dc00 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 23  m->zName==0 ){.#
1dc10 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1dc20 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20  IT_SUBQUERY.    
1dc30 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 20 3d    Select *pSel =
1dc40 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b   pFrom->pSelect;
1dc50 0a 20 20 20 20 20 20 2f 2a 20 41 20 73 75 62 2d  .      /* A sub-
1dc60 71 75 65 72 79 20 69 6e 20 74 68 65 20 46 52 4f  query in the FRO
1dc70 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45  M clause of a SE
1dc80 4c 45 43 54 20 2a 2f 0a 20 20 20 20 20 20 61 73  LECT */.      as
1dc90 73 65 72 74 28 20 70 53 65 6c 21 3d 30 20 29 3b  sert( pSel!=0 );
1dca0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1dcb0 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b  From->pTab==0 );
1dcc0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 61  .      sqlite3Wa
1dcd0 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72  lkSelect(pWalker
1dce0 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20 20 20 70  , pSel);.      p
1dcf0 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61  From->pTab = pTa
1dd00 62 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  b = sqlite3DbMal
1dd10 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65  locZero(db, size
1dd20 6f 66 28 54 61 62 6c 65 29 29 3b 0a 20 20 20 20  of(Table));.    
1dd30 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20    if( pTab==0 ) 
1dd40 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
1dd50 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 52  ;.      pTab->nR
1dd60 65 66 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 54  ef = 1;.      pT
1dd70 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  ab->zName = sqli
1dd80 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
1dd90 73 71 6c 69 74 65 5f 73 71 5f 25 70 22 2c 20 28  sqlite_sq_%p", (
1dda0 76 6f 69 64 2a 29 70 54 61 62 29 3b 0a 20 20 20  void*)pTab);.   
1ddb0 20 20 20 77 68 69 6c 65 28 20 70 53 65 6c 2d 3e     while( pSel->
1ddc0 70 50 72 69 6f 72 20 29 7b 20 70 53 65 6c 20 3d  pPrior ){ pSel =
1ddd0 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 3b 20 7d   pSel->pPrior; }
1dde0 0a 20 20 20 20 20 20 73 65 6c 65 63 74 43 6f 6c  .      selectCol
1ddf0 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74  umnsFromExprList
1de00 28 70 50 61 72 73 65 2c 20 70 53 65 6c 2d 3e 70  (pParse, pSel->p
1de10 45 4c 69 73 74 2c 20 26 70 54 61 62 2d 3e 6e 43  EList, &pTab->nC
1de20 6f 6c 2c 20 26 70 54 61 62 2d 3e 61 43 6f 6c 29  ol, &pTab->aCol)
1de30 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 69 50  ;.      pTab->iP
1de40 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  Key = -1;.      
1de50 70 54 61 62 2d 3e 6e 52 6f 77 45 73 74 20 3d 20  pTab->nRowEst = 
1de60 31 30 34 38 35 37 36 3b 0a 20 20 20 20 20 20 70  1048576;.      p
1de70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d  Tab->tabFlags |=
1de80 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 3b 0a 23   TF_Ephemeral;.#
1de90 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b  endif.    }else{
1dea0 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 6f 72 64  .      /* An ord
1deb0 69 6e 61 72 79 20 74 61 62 6c 65 20 6f 72 20 76  inary table or v
1dec0 69 65 77 20 6e 61 6d 65 20 69 6e 20 74 68 65 20  iew name in the 
1ded0 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20  FROM clause */. 
1dee0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72       assert( pFr
1def0 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20  om->pTab==0 );. 
1df00 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62       pFrom->pTab
1df10 20 3d 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65   = pTab = sqlite
1df20 33 4c 6f 63 61 74 65 54 61 62 6c 65 49 74 65 6d  3LocateTableItem
1df30 28 70 50 61 72 73 65 2c 20 30 2c 20 70 46 72 6f  (pParse, 0, pFro
1df40 6d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54  m);.      if( pT
1df50 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57  ab==0 ) return W
1df60 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20  RC_Abort;.      
1df70 69 66 28 20 70 54 61 62 2d 3e 6e 52 65 66 3d 3d  if( pTab->nRef==
1df80 30 78 66 66 66 66 20 29 7b 0a 20 20 20 20 20 20  0xffff ){.      
1df90 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
1dfa0 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d  g(pParse, "too m
1dfb0 61 6e 79 20 72 65 66 65 72 65 6e 63 65 73 20 74  any references t
1dfc0 6f 20 5c 22 25 73 5c 22 3a 20 6d 61 78 20 36 35  o \"%s\": max 65
1dfd0 35 33 35 22 2c 0a 20 20 20 20 20 20 20 20 20 20  535",.          
1dfe0 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
1dff0 20 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54         pFrom->pT
1e000 61 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ab = 0;.        
1e010 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
1e020 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1e030 70 54 61 62 2d 3e 6e 52 65 66 2b 2b 3b 0a 23 69  pTab->nRef++;.#i
1e040 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
1e050 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20  E_OMIT_VIEW) || 
1e060 21 64 65 66 69 6e 65 64 20 28 53 51 4c 49 54 45  !defined (SQLITE
1e070 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
1e080 4c 45 29 0a 20 20 20 20 20 20 69 66 28 20 70 54  LE).      if( pT
1e090 61 62 2d 3e 70 53 65 6c 65 63 74 20 7c 7c 20 49  ab->pSelect || I
1e0a0 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29  sVirtual(pTab) )
1e0b0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20  {.        /* We 
1e0c0 72 65 61 63 68 20 68 65 72 65 20 69 66 20 74 68  reach here if th
1e0d0 65 20 6e 61 6d 65 64 20 74 61 62 6c 65 20 69 73  e named table is
1e0e0 20 61 20 72 65 61 6c 6c 79 20 61 20 76 69 65 77   a really a view
1e0f0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
1e100 73 71 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f  sqlite3ViewGetCo
1e110 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65  lumnNames(pParse
1e120 2c 20 70 54 61 62 29 20 29 20 72 65 74 75 72 6e  , pTab) ) return
1e130 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20   WRC_Abort;.    
1e140 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f      assert( pFro
1e150 6d 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 3b  m->pSelect==0 );
1e160 0a 20 20 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e  .        pFrom->
1e170 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65  pSelect = sqlite
1e180 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70  3SelectDup(db, p
1e190 54 61 62 2d 3e 70 53 65 6c 65 63 74 2c 20 30 29  Tab->pSelect, 0)
1e1a0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
1e1b0 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c  3WalkSelect(pWal
1e1c0 6b 65 72 2c 20 70 46 72 6f 6d 2d 3e 70 53 65 6c  ker, pFrom->pSel
1e1d0 65 63 74 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  ect);.      }.#e
1e1e0 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ndif.    }..    
1e1f0 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e  /* Locate the in
1e200 64 65 78 20 6e 61 6d 65 64 20 62 79 20 74 68 65  dex named by the
1e210 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75   INDEXED BY clau
1e220 73 65 2c 20 69 66 20 61 6e 79 2e 20 2a 2f 0a 20  se, if any. */. 
1e230 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 6e     if( sqlite3In
1e240 64 65 78 65 64 42 79 4c 6f 6f 6b 75 70 28 70 50  dexedByLookup(pP
1e250 61 72 73 65 2c 20 70 46 72 6f 6d 29 20 29 7b 0a  arse, pFrom) ){.
1e260 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
1e270 5f 41 62 6f 72 74 3b 0a 20 20 20 20 7d 0a 20 20  _Abort;.    }.  
1e280 7d 0a 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73 20  }..  /* Process 
1e290 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 73  NATURAL keywords
1e2a0 2c 20 61 6e 64 20 4f 4e 20 61 6e 64 20 55 53 49  , and ON and USI
1e2b0 4e 47 20 63 6c 61 75 73 65 73 20 6f 66 20 6a 6f  NG clauses of jo
1e2c0 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ins..  */.  if( 
1e2d0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1e2e0 20 7c 7c 20 73 71 6c 69 74 65 50 72 6f 63 65 73   || sqliteProces
1e2f0 73 4a 6f 69 6e 28 70 50 61 72 73 65 2c 20 70 29  sJoin(pParse, p)
1e300 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57   ){.    return W
1e310 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 0a 20  RC_Abort;.  }.. 
1e320 20 2f 2a 20 46 6f 72 20 65 76 65 72 79 20 22 2a   /* For every "*
1e330 22 20 74 68 61 74 20 6f 63 63 75 72 73 20 69 6e  " that occurs in
1e340 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74   the column list
1e350 2c 20 69 6e 73 65 72 74 20 74 68 65 20 6e 61 6d  , insert the nam
1e360 65 73 20 6f 66 0a 20 20 2a 2a 20 61 6c 6c 20 63  es of.  ** all c
1e370 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c 20 74 61  olumns in all ta
1e380 62 6c 65 73 2e 20 20 41 6e 64 20 66 6f 72 20 65  bles.  And for e
1e390 76 65 72 79 20 54 41 42 4c 45 2e 2a 20 69 6e 73  very TABLE.* ins
1e3a0 65 72 74 20 74 68 65 20 6e 61 6d 65 73 0a 20 20  ert the names.  
1e3b0 2a 2a 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e  ** of all column
1e3c0 73 20 69 6e 20 54 41 42 4c 45 2e 20 20 54 68 65  s in TABLE.  The
1e3d0 20 70 61 72 73 65 72 20 69 6e 73 65 72 74 65 64   parser inserted
1e3e0 20 61 20 73 70 65 63 69 61 6c 20 65 78 70 72 65   a special expre
1e3f0 73 73 69 6f 6e 0a 20 20 2a 2a 20 77 69 74 68 20  ssion.  ** with 
1e400 74 68 65 20 54 4b 5f 41 4c 4c 20 6f 70 65 72 61  the TK_ALL opera
1e410 74 6f 72 20 66 6f 72 20 65 61 63 68 20 22 2a 22  tor for each "*"
1e420 20 74 68 61 74 20 69 74 20 66 6f 75 6e 64 20 69   that it found i
1e430 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73  n the column lis
1e440 74 2e 0a 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c  t..  ** The foll
1e450 6f 77 69 6e 67 20 63 6f 64 65 20 6a 75 73 74 20  owing code just 
1e460 68 61 73 20 74 6f 20 6c 6f 63 61 74 65 20 74 68  has to locate th
1e470 65 20 54 4b 5f 41 4c 4c 20 65 78 70 72 65 73 73  e TK_ALL express
1e480 69 6f 6e 73 20 61 6e 64 20 65 78 70 61 6e 64 0a  ions and expand.
1e490 20 20 2a 2a 20 65 61 63 68 20 6f 6e 65 20 74 6f    ** each one to
1e4a0 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c   the list of all
1e4b0 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c 20   columns in all 
1e4c0 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a  tables..  **.  *
1e4d0 2a 20 54 68 65 20 66 69 72 73 74 20 6c 6f 6f 70  * The first loop
1e4e0 20 6a 75 73 74 20 63 68 65 63 6b 73 20 74 6f 20   just checks to 
1e4f0 73 65 65 20 69 66 20 74 68 65 72 65 20 61 72 65  see if there are
1e500 20 61 6e 79 20 22 2a 22 20 6f 70 65 72 61 74 6f   any "*" operato
1e510 72 73 0a 20 20 2a 2a 20 74 68 61 74 20 6e 65 65  rs.  ** that nee
1e520 64 20 65 78 70 61 6e 64 69 6e 67 2e 0a 20 20 2a  d expanding..  *
1e530 2f 0a 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70  /.  for(k=0; k<p
1e540 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b  EList->nExpr; k+
1e550 2b 29 7b 0a 20 20 20 20 70 45 20 3d 20 70 45 4c  +){.    pE = pEL
1e560 69 73 74 2d 3e 61 5b 6b 5d 2e 70 45 78 70 72 3b  ist->a[k].pExpr;
1e570 0a 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d  .    if( pE->op=
1e580 3d 54 4b 5f 41 4c 4c 20 29 20 62 72 65 61 6b 3b  =TK_ALL ) break;
1e590 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45 2d  .    assert( pE-
1e5a0 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70  >op!=TK_DOT || p
1e5b0 45 2d 3e 70 52 69 67 68 74 21 3d 30 20 29 3b 0a  E->pRight!=0 );.
1e5c0 20 20 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e      assert( pE->
1e5d0 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 28 70  op!=TK_DOT || (p
1e5e0 45 2d 3e 70 4c 65 66 74 21 3d 30 20 26 26 20 70  E->pLeft!=0 && p
1e5f0 45 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b  E->pLeft->op==TK
1e600 5f 49 44 29 20 29 3b 0a 20 20 20 20 69 66 28 20  _ID) );.    if( 
1e610 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 26  pE->op==TK_DOT &
1e620 26 20 70 45 2d 3e 70 52 69 67 68 74 2d 3e 6f 70  & pE->pRight->op
1e630 3d 3d 54 4b 5f 41 4c 4c 20 29 20 62 72 65 61 6b  ==TK_ALL ) break
1e640 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6b 3c 70 45  ;.  }.  if( k<pE
1e650 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  List->nExpr ){. 
1e660 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 49 66 20     /*.    ** If 
1e670 77 65 20 67 65 74 20 68 65 72 65 20 69 74 20 6d  we get here it m
1e680 65 61 6e 73 20 74 68 65 20 72 65 73 75 6c 74 20  eans the result 
1e690 73 65 74 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65  set contains one
1e6a0 20 6f 72 20 6d 6f 72 65 20 22 2a 22 0a 20 20 20   or more "*".   
1e6b0 20 2a 2a 20 6f 70 65 72 61 74 6f 72 73 20 74 68   ** operators th
1e6c0 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20 65 78  at need to be ex
1e6d0 70 61 6e 64 65 64 2e 20 20 4c 6f 6f 70 20 74 68  panded.  Loop th
1e6e0 72 6f 75 67 68 20 65 61 63 68 20 65 78 70 72 65  rough each expre
1e6f0 73 73 69 6f 6e 0a 20 20 20 20 2a 2a 20 69 6e 20  ssion.    ** in 
1e700 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 61  the result set a
1e710 6e 64 20 65 78 70 61 6e 64 20 74 68 65 6d 20 6f  nd expand them o
1e720 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20 20 20 2a  ne by one..    *
1e730 2f 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70  /.    struct Exp
1e740 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 20 3d 20  rList_item *a = 
1e750 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 45  pEList->a;.    E
1e760 78 70 72 4c 69 73 74 20 2a 70 4e 65 77 20 3d 20  xprList *pNew = 
1e770 30 3b 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73  0;.    int flags
1e780 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66   = pParse->db->f
1e790 6c 61 67 73 3b 0a 20 20 20 20 69 6e 74 20 6c 6f  lags;.    int lo
1e7a0 6e 67 4e 61 6d 65 73 20 3d 20 28 66 6c 61 67 73  ngNames = (flags
1e7b0 20 26 20 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f   & SQLITE_FullCo
1e7c0 6c 4e 61 6d 65 73 29 21 3d 30 0a 20 20 20 20 20  lNames)!=0.     
1e7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e7e0 20 26 26 20 28 66 6c 61 67 73 20 26 20 53 51 4c   && (flags & SQL
1e7f0 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65  ITE_ShortColName
1e800 73 29 3d 3d 30 3b 0a 0a 20 20 20 20 2f 2a 20 57  s)==0;..    /* W
1e810 68 65 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 46  hen processing F
1e820 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62 71 75  ROM-clause subqu
1e830 65 72 69 65 73 2c 20 69 74 20 69 73 20 61 6c 77  eries, it is alw
1e840 61 79 73 20 74 68 65 20 63 61 73 65 0a 20 20 20  ays the case.   
1e850 20 2a 2a 20 74 68 61 74 20 66 75 6c 6c 5f 63 6f   ** that full_co
1e860 6c 75 6d 6e 5f 6e 61 6d 65 73 3d 4f 46 46 20 61  lumn_names=OFF a
1e870 6e 64 20 73 68 6f 72 74 5f 63 6f 6c 75 6d 6e 5f  nd short_column_
1e880 6e 61 6d 65 73 3d 4f 4e 2e 20 20 54 68 65 0a 20  names=ON.  The. 
1e890 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 52 65 73     ** sqlite3Res
1e8a0 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 29  ultSetOfSelect()
1e8b0 20 72 6f 75 74 69 6e 65 20 6d 61 6b 65 73 20 69   routine makes i
1e8c0 74 20 73 6f 2e 20 2a 2f 0a 20 20 20 20 61 73 73  t so. */.    ass
1e8d0 65 72 74 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67  ert( (p->selFlag
1e8e0 73 20 26 20 53 46 5f 4e 65 73 74 65 64 46 72 6f  s & SF_NestedFro
1e8f0 6d 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20  m)==0.          
1e900 7c 7c 20 28 28 66 6c 61 67 73 20 26 20 53 51 4c  || ((flags & SQL
1e910 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73  ITE_FullColNames
1e920 29 3d 3d 30 20 26 26 0a 20 20 20 20 20 20 20 20  )==0 &&.        
1e930 20 20 20 20 20 20 28 66 6c 61 67 73 20 26 20 53        (flags & S
1e940 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61  QLITE_ShortColNa
1e950 6d 65 73 29 21 3d 30 29 20 29 3b 0a 0a 20 20 20  mes)!=0) );..   
1e960 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69   for(k=0; k<pELi
1e970 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b  st->nExpr; k++){
1e980 0a 20 20 20 20 20 20 70 45 20 3d 20 61 5b 6b 5d  .      pE = a[k]
1e990 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 70 52  .pExpr;.      pR
1e9a0 69 67 68 74 20 3d 20 70 45 2d 3e 70 52 69 67 68  ight = pE->pRigh
1e9b0 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  t;.      assert(
1e9c0 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20   pE->op!=TK_DOT 
1e9d0 7c 7c 20 70 52 69 67 68 74 21 3d 30 20 29 3b 0a  || pRight!=0 );.
1e9e0 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70        if( pE->op
1e9f0 21 3d 54 4b 5f 41 4c 4c 20 26 26 20 28 70 45 2d  !=TK_ALL && (pE-
1ea00 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70  >op!=TK_DOT || p
1ea10 52 69 67 68 74 2d 3e 6f 70 21 3d 54 4b 5f 41 4c  Right->op!=TK_AL
1ea20 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  L) ){.        /*
1ea30 20 54 68 69 73 20 70 61 72 74 69 63 75 6c 61 72   This particular
1ea40 20 65 78 70 72 65 73 73 69 6f 6e 20 64 6f 65 73   expression does
1ea50 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20   not need to be 
1ea60 65 78 70 61 6e 64 65 64 2e 0a 20 20 20 20 20 20  expanded..      
1ea70 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65    */.        pNe
1ea80 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  w = sqlite3ExprL
1ea90 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65  istAppend(pParse
1eaa0 2c 20 70 4e 65 77 2c 20 61 5b 6b 5d 2e 70 45 78  , pNew, a[k].pEx
1eab0 70 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  pr);.        if(
1eac0 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20   pNew ){.       
1ead0 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d     pNew->a[pNew-
1eae0 3e 6e 45 78 70 72 2d 31 5d 2e 7a 4e 61 6d 65 20  >nExpr-1].zName 
1eaf0 3d 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  = a[k].zName;.  
1eb00 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 5b          pNew->a[
1eb10 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a  pNew->nExpr-1].z
1eb20 53 70 61 6e 20 3d 20 61 5b 6b 5d 2e 7a 53 70 61  Span = a[k].zSpa
1eb30 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 61 5b 6b  n;.          a[k
1eb40 5d 2e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20  ].zName = 0;.   
1eb50 20 20 20 20 20 20 20 61 5b 6b 5d 2e 7a 53 70 61         a[k].zSpa
1eb60 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  n = 0;.        }
1eb70 0a 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 70 45  .        a[k].pE
1eb80 78 70 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  xpr = 0;.      }
1eb90 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
1eba0 20 54 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e   This expression
1ebb0 20 69 73 20 61 20 22 2a 22 20 6f 72 20 61 20 22   is a "*" or a "
1ebc0 54 41 42 4c 45 2e 2a 22 20 61 6e 64 20 6e 65 65  TABLE.*" and nee
1ebd0 64 73 20 74 6f 20 62 65 0a 20 20 20 20 20 20 20  ds to be.       
1ebe0 20 2a 2a 20 65 78 70 61 6e 64 65 64 2e 20 2a 2f   ** expanded. */
1ebf0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74 61 62  .        int tab
1ec00 6c 65 53 65 65 6e 20 3d 20 30 3b 20 20 20 20 20  leSeen = 0;     
1ec10 20 2f 2a 20 53 65 74 20 74 6f 20 31 20 77 68 65   /* Set to 1 whe
1ec20 6e 20 54 41 42 4c 45 20 6d 61 74 63 68 65 73 20  n TABLE matches 
1ec30 2a 2f 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  */.        char 
1ec40 2a 7a 54 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20  *zTName = 0;    
1ec50 20 20 20 2f 2a 20 74 65 78 74 20 6f 66 20 6e 61     /* text of na
1ec60 6d 65 20 6f 66 20 54 41 42 4c 45 20 2a 2f 0a 20  me of TABLE */. 
1ec70 20 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f         if( pE->o
1ec80 70 3d 3d 54 4b 5f 44 4f 54 20 29 7b 0a 20 20 20  p==TK_DOT ){.   
1ec90 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
1eca0 45 2d 3e 70 4c 65 66 74 21 3d 30 20 29 3b 0a 20  E->pLeft!=0 );. 
1ecb0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
1ecc0 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
1ecd0 79 28 70 45 2d 3e 70 4c 65 66 74 2c 20 45 50 5f  y(pE->pLeft, EP_
1ece0 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20  IntValue) );.   
1ecf0 20 20 20 20 20 20 20 7a 54 4e 61 6d 65 20 3d 20         zTName = 
1ed00 70 45 2d 3e 70 4c 65 66 74 2d 3e 75 2e 7a 54 6f  pE->pLeft->u.zTo
1ed10 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ken;.        }. 
1ed20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 2c 20         for(i=0, 
1ed30 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e  pFrom=pTabList->
1ed40 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  a; i<pTabList->n
1ed50 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b  Src; i++, pFrom+
1ed60 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54 61  +){.          Ta
1ed70 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 46 72 6f  ble *pTab = pFro
1ed80 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 20  m->pTab;.       
1ed90 20 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 20     Select *pSub 
1eda0 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74  = pFrom->pSelect
1edb0 3b 0a 20 20 20 20 20 20 20 20 20 20 63 68 61 72  ;.          char
1edc0 20 2a 7a 54 61 62 4e 61 6d 65 20 3d 20 70 46 72   *zTabName = pFr
1edd0 6f 6d 2d 3e 7a 41 6c 69 61 73 3b 0a 20 20 20 20  om->zAlias;.    
1ede0 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
1edf0 20 2a 7a 53 63 68 65 6d 61 4e 61 6d 65 20 3d 20   *zSchemaName = 
1ee00 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  0;.          int
1ee10 20 69 44 62 3b 0a 20 20 20 20 20 20 20 20 20 20   iDb;.          
1ee20 69 66 28 20 7a 54 61 62 4e 61 6d 65 3d 3d 30 20  if( zTabName==0 
1ee30 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a  ){.            z
1ee40 54 61 62 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e  TabName = pTab->
1ee50 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20  zName;.         
1ee60 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
1ee70 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
1ee80 64 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  d ) break;.     
1ee90 20 20 20 20 20 69 66 28 20 70 53 75 62 3d 3d 30       if( pSub==0
1eea0 20 7c 7c 20 28 70 53 75 62 2d 3e 73 65 6c 46 6c   || (pSub->selFl
1eeb0 61 67 73 20 26 20 53 46 5f 4e 65 73 74 65 64 46  ags & SF_NestedF
1eec0 72 6f 6d 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  rom)==0 ){.     
1eed0 20 20 20 20 20 20 20 70 53 75 62 20 3d 20 30 3b         pSub = 0;
1eee0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
1eef0 20 7a 54 4e 61 6d 65 20 26 26 20 73 71 6c 69 74   zTName && sqlit
1ef00 65 33 53 74 72 49 43 6d 70 28 7a 54 4e 61 6d 65  e3StrICmp(zTName
1ef10 2c 20 7a 54 61 62 4e 61 6d 65 29 21 3d 30 20 29  , zTabName)!=0 )
1ef20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1ef30 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
1ef40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1ef50 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65      iDb = sqlite
1ef60 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64  3SchemaToIndex(d
1ef70 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  b, pTab->pSchema
1ef80 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a  );.            z
1ef90 53 63 68 65 6d 61 4e 61 6d 65 20 3d 20 69 44 62  SchemaName = iDb
1efa0 3e 3d 30 20 3f 20 64 62 2d 3e 61 44 62 5b 69 44  >=0 ? db->aDb[iD
1efb0 62 5d 2e 7a 4e 61 6d 65 20 3a 20 22 2a 22 3b 0a  b].zName : "*";.
1efc0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1efd0 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
1efe0 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b  <pTab->nCol; j++
1eff0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  ){.            c
1f000 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 54 61  har *zName = pTa
1f010 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65  b->aCol[j].zName
1f020 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 68  ;.            ch
1f030 61 72 20 2a 7a 43 6f 6c 6e 61 6d 65 3b 20 20 2f  ar *zColname;  /
1f040 2a 20 54 68 65 20 63 6f 6d 70 75 74 65 64 20 63  * The computed c
1f050 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  olumn name */.  
1f060 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a            char *
1f070 7a 54 6f 46 72 65 65 3b 20 20 20 2f 2a 20 4d 61  zToFree;   /* Ma
1f080 6c 6c 6f 63 65 64 20 73 74 72 69 6e 67 20 74 68  lloced string th
1f090 61 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 66  at needs to be f
1f0a0 72 65 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20  reed */.        
1f0b0 20 20 20 20 54 6f 6b 65 6e 20 73 43 6f 6c 6e 61      Token sColna
1f0c0 6d 65 3b 20 20 2f 2a 20 43 6f 6d 70 75 74 65 64  me;  /* Computed
1f0d0 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 61 73 20   column name as 
1f0e0 61 20 74 6f 6b 65 6e 20 2a 2f 0a 0a 20 20 20 20  a token */..    
1f0f0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1f100 7a 4e 61 6d 65 20 29 3b 0a 20 20 20 20 20 20 20  zName );.       
1f110 20 20 20 20 20 69 66 28 20 7a 54 4e 61 6d 65 20       if( zTName 
1f120 26 26 20 70 53 75 62 0a 20 20 20 20 20 20 20 20  && pSub.        
1f130 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 4d       && sqlite3M
1f140 61 74 63 68 53 70 61 6e 4e 61 6d 65 28 70 53 75  atchSpanName(pSu
1f150 62 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e  b->pEList->a[j].
1f160 7a 53 70 61 6e 2c 20 30 2c 20 7a 54 4e 61 6d 65  zSpan, 0, zTName
1f170 2c 20 30 29 3d 3d 30 0a 20 20 20 20 20 20 20 20  , 0)==0.        
1f180 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
1f190 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
1f1a0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20             }..  
1f1b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
1f1c0 61 20 63 6f 6c 75 6d 6e 20 69 73 20 6d 61 72 6b  a column is mark
1f1d0 65 64 20 61 73 20 27 68 69 64 64 65 6e 27 20 28  ed as 'hidden' (
1f1e0 63 75 72 72 65 6e 74 6c 79 20 6f 6e 6c 79 20 70  currently only p
1f1f0 6f 73 73 69 62 6c 65 0a 20 20 20 20 20 20 20 20  ossible.        
1f200 20 20 20 20 2a 2a 20 66 6f 72 20 76 69 72 74 75      ** for virtu
1f210 61 6c 20 74 61 62 6c 65 73 29 2c 20 64 6f 20 6e  al tables), do n
1f220 6f 74 20 69 6e 63 6c 75 64 65 20 69 74 20 69 6e  ot include it in
1f230 20 74 68 65 20 65 78 70 61 6e 64 65 64 0a 20 20   the expanded.  
1f240 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72 65 73            ** res
1f250 75 6c 74 2d 73 65 74 20 6c 69 73 74 2e 0a 20 20  ult-set list..  
1f260 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
1f270 20 20 20 20 20 20 20 20 20 69 66 28 20 49 73 48           if( IsH
1f280 69 64 64 65 6e 43 6f 6c 75 6d 6e 28 26 70 54 61  iddenColumn(&pTa
1f290 62 2d 3e 61 43 6f 6c 5b 6a 5d 29 20 29 7b 0a 20  b->aCol[j]) ){. 
1f2a0 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73               ass
1f2b0 65 72 74 28 49 73 56 69 72 74 75 61 6c 28 70 54  ert(IsVirtual(pT
1f2c0 61 62 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ab));.          
1f2d0 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
1f2e0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1f2f0 20 20 20 20 20 20 20 20 74 61 62 6c 65 53 65 65          tableSee
1f300 6e 20 3d 20 31 3b 0a 0a 20 20 20 20 20 20 20 20  n = 1;..        
1f310 20 20 20 20 69 66 28 20 69 3e 30 20 26 26 20 7a      if( i>0 && z
1f320 54 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  TName==0 ){.    
1f330 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70            if( (p
1f340 46 72 6f 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 26  From->jointype &
1f350 20 4a 54 5f 4e 41 54 55 52 41 4c 29 21 3d 30 0a   JT_NATURAL)!=0.
1f360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f370 26 26 20 74 61 62 6c 65 41 6e 64 43 6f 6c 75 6d  && tableAndColum
1f380 6e 49 6e 64 65 78 28 70 54 61 62 4c 69 73 74 2c  nIndex(pTabList,
1f390 20 69 2c 20 7a 4e 61 6d 65 2c 20 30 2c 20 30 29   i, zName, 0, 0)
1f3a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 29  .              )
1f3b0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1f3c0 20 20 2f 2a 20 49 6e 20 61 20 4e 41 54 55 52 41    /* In a NATURA
1f3d0 4c 20 6a 6f 69 6e 2c 20 6f 6d 69 74 20 74 68 65  L join, omit the
1f3e0 20 6a 6f 69 6e 20 63 6f 6c 75 6d 6e 73 20 66 72   join columns fr
1f3f0 6f 6d 20 74 68 65 20 0a 20 20 20 20 20 20 20 20  om the .        
1f400 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65          ** table
1f410 20 74 6f 20 74 68 65 20 72 69 67 68 74 20 6f 66   to the right of
1f420 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20 20   the join */.   
1f430 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
1f440 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
1f450 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1f460 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
1f470 49 64 4c 69 73 74 49 6e 64 65 78 28 70 46 72 6f  IdListIndex(pFro
1f480 6d 2d 3e 70 55 73 69 6e 67 2c 20 7a 4e 61 6d 65  m->pUsing, zName
1f490 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )>=0 ){.        
1f4a0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 61 20          /* In a 
1f4b0 6a 6f 69 6e 20 77 69 74 68 20 61 20 55 53 49 4e  join with a USIN
1f4c0 47 20 63 6c 61 75 73 65 2c 20 6f 6d 69 74 20 63  G clause, omit c
1f4d0 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 0a 20 20  olumns in the.  
1f4e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
1f4f0 20 75 73 69 6e 67 20 63 6c 61 75 73 65 20 66 72   using clause fr
1f500 6f 6d 20 74 68 65 20 74 61 62 6c 65 20 6f 6e 20  om the table on 
1f510 74 68 65 20 72 69 67 68 74 2e 20 2a 2f 0a 20 20  the right. */.  
1f520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
1f530 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
1f540 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1f550 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1f560 20 20 70 52 69 67 68 74 20 3d 20 73 71 6c 69 74    pRight = sqlit
1f570 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 49 44  e3Expr(db, TK_ID
1f580 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
1f590 20 20 20 20 20 20 7a 43 6f 6c 6e 61 6d 65 20 3d        zColname =
1f5a0 20 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20   zName;.        
1f5b0 20 20 20 20 7a 54 6f 46 72 65 65 20 3d 20 30 3b      zToFree = 0;
1f5c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
1f5d0 20 6c 6f 6e 67 4e 61 6d 65 73 20 7c 7c 20 70 54   longNames || pT
1f5e0 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 31 20 29  abList->nSrc>1 )
1f5f0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1f600 45 78 70 72 20 2a 70 4c 65 66 74 3b 0a 20 20 20  Expr *pLeft;.   
1f610 20 20 20 20 20 20 20 20 20 20 20 70 4c 65 66 74             pLeft
1f620 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 64   = sqlite3Expr(d
1f630 62 2c 20 54 4b 5f 49 44 2c 20 7a 54 61 62 4e 61  b, TK_ID, zTabNa
1f640 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  me);.           
1f650 20 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74     pExpr = sqlit
1f660 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
1f670 54 4b 5f 44 4f 54 2c 20 70 4c 65 66 74 2c 20 70  TK_DOT, pLeft, p
1f680 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 20 20 20  Right, 0);.     
1f690 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 53 63           if( zSc
1f6a0 68 65 6d 61 4e 61 6d 65 20 29 7b 0a 20 20 20 20  hemaName ){.    
1f6b0 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 65 66              pLef
1f6c0 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28  t = sqlite3Expr(
1f6d0 64 62 2c 20 54 4b 5f 49 44 2c 20 7a 53 63 68 65  db, TK_ID, zSche
1f6e0 6d 61 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  maName);.       
1f6f0 20 20 20 20 20 20 20 20 20 70 45 78 70 72 20 3d           pExpr =
1f700 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
1f710 61 72 73 65 2c 20 54 4b 5f 44 4f 54 2c 20 70 4c  arse, TK_DOT, pL
1f720 65 66 74 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a  eft, pExpr, 0);.
1f730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
1f740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
1f750 28 20 6c 6f 6e 67 4e 61 6d 65 73 20 29 7b 0a 20  ( longNames ){. 
1f760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
1f770 43 6f 6c 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65  Colname = sqlite
1f780 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73  3MPrintf(db, "%s
1f790 2e 25 73 22 2c 20 7a 54 61 62 4e 61 6d 65 2c 20  .%s", zTabName, 
1f7a0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
1f7b0 20 20 20 20 20 20 20 20 7a 54 6f 46 72 65 65 20          zToFree 
1f7c0 3d 20 7a 43 6f 6c 6e 61 6d 65 3b 0a 20 20 20 20  = zColname;.    
1f7d0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1f7e0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1f7f0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
1f800 70 72 20 3d 20 70 52 69 67 68 74 3b 0a 20 20 20  pr = pRight;.   
1f810 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1f820 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71         pNew = sq
1f830 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
1f840 65 6e 64 28 70 50 61 72 73 65 2c 20 70 4e 65 77  end(pParse, pNew
1f850 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  , pExpr);.      
1f860 20 20 20 20 20 20 73 43 6f 6c 6e 61 6d 65 2e 7a        sColname.z
1f870 20 3d 20 7a 43 6f 6c 6e 61 6d 65 3b 0a 20 20 20   = zColname;.   
1f880 20 20 20 20 20 20 20 20 20 73 43 6f 6c 6e 61 6d           sColnam
1f890 65 2e 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72  e.n = sqlite3Str
1f8a0 6c 65 6e 33 30 28 7a 43 6f 6c 6e 61 6d 65 29 3b  len30(zColname);
1f8b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
1f8c0 69 74 65 33 45 78 70 72 4c 69 73 74 53 65 74 4e  ite3ExprListSetN
1f8d0 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 65 77  ame(pParse, pNew
1f8e0 2c 20 26 73 43 6f 6c 6e 61 6d 65 2c 20 30 29 3b  , &sColname, 0);
1f8f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
1f900 20 70 4e 65 77 20 26 26 20 28 70 2d 3e 73 65 6c   pNew && (p->sel
1f910 46 6c 61 67 73 20 26 20 53 46 5f 4e 65 73 74 65  Flags & SF_Neste
1f920 64 46 72 6f 6d 29 21 3d 30 20 29 7b 0a 20 20 20  dFrom)!=0 ){.   
1f930 20 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63             struc
1f940 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
1f950 2a 70 58 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 70  *pX = &pNew->a[p
1f960 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20  New->nExpr-1];. 
1f970 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
1f980 20 70 53 75 62 20 29 7b 0a 20 20 20 20 20 20 20   pSub ){.       
1f990 20 20 20 20 20 20 20 20 20 70 58 2d 3e 7a 53 70           pX->zSp
1f9a0 61 6e 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  an = sqlite3DbSt
1f9b0 72 44 75 70 28 64 62 2c 20 70 53 75 62 2d 3e 70  rDup(db, pSub->p
1f9c0 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 53 70 61  EList->a[j].zSpa
1f9d0 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  n);.            
1f9e0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 58      testcase( pX
1f9f0 2d 3e 7a 53 70 61 6e 3d 3d 30 20 29 3b 0a 20 20  ->zSpan==0 );.  
1fa00 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73              }els
1fa10 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e{.             
1fa20 20 20 20 70 58 2d 3e 7a 53 70 61 6e 20 3d 20 73     pX->zSpan = s
1fa30 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
1fa40 2c 20 22 25 73 2e 25 73 2e 25 73 22 2c 0a 20 20  , "%s.%s.%s",.  
1fa50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fa60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fa70 20 20 20 20 20 20 20 20 20 7a 53 63 68 65 6d 61           zSchema
1fa80 4e 61 6d 65 2c 20 7a 54 61 62 4e 61 6d 65 2c 20  Name, zTabName, 
1fa90 7a 43 6f 6c 6e 61 6d 65 29 3b 0a 20 20 20 20 20  zColname);.     
1faa0 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63             testc
1fab0 61 73 65 28 20 70 58 2d 3e 7a 53 70 61 6e 3d 3d  ase( pX->zSpan==
1fac0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  0 );.           
1fad0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
1fae0 20 20 20 70 58 2d 3e 62 53 70 61 6e 49 73 54 61     pX->bSpanIsTa
1faf0 62 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  b = 1;.         
1fb00 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
1fb10 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
1fb20 62 2c 20 7a 54 6f 46 72 65 65 29 3b 0a 20 20 20  b, zToFree);.   
1fb30 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1fb40 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 21   }.        if( !
1fb50 74 61 62 6c 65 53 65 65 6e 20 29 7b 0a 20 20 20  tableSeen ){.   
1fb60 20 20 20 20 20 20 20 69 66 28 20 7a 54 4e 61 6d         if( zTNam
1fb70 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  e ){.           
1fb80 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
1fb90 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63  (pParse, "no suc
1fba0 68 20 74 61 62 6c 65 3a 20 25 73 22 2c 20 7a 54  h table: %s", zT
1fbb0 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Name);.         
1fbc0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1fbd0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
1fbe0 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20  Msg(pParse, "no 
1fbf0 74 61 62 6c 65 73 20 73 70 65 63 69 66 69 65 64  tables specified
1fc00 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ");.          }.
1fc10 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1fc20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
1fc30 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
1fc40 65 28 64 62 2c 20 70 45 4c 69 73 74 29 3b 0a 20  e(db, pEList);. 
1fc50 20 20 20 70 2d 3e 70 45 4c 69 73 74 20 3d 20 70     p->pEList = p
1fc60 4e 65 77 3b 0a 20 20 7d 0a 23 69 66 20 53 51 4c  New;.  }.#if SQL
1fc70 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 0a 20  ITE_MAX_COLUMN. 
1fc80 20 69 66 28 20 70 2d 3e 70 45 4c 69 73 74 20 26   if( p->pEList &
1fc90 26 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  & p->pEList->nEx
1fca0 70 72 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51  pr>db->aLimit[SQ
1fcb0 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d  LITE_LIMIT_COLUM
1fcc0 4e 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  N] ){.    sqlite
1fcd0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
1fce0 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75  , "too many colu
1fcf0 6d 6e 73 20 69 6e 20 72 65 73 75 6c 74 20 73 65  mns in result se
1fd00 74 22 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  t");.  }.#endif.
1fd10 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e    return WRC_Con
1fd20 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  tinue;.}../*.** 
1fd30 4e 6f 2d 6f 70 20 72 6f 75 74 69 6e 65 20 66 6f  No-op routine fo
1fd40 72 20 74 68 65 20 70 61 72 73 65 2d 74 72 65 65  r the parse-tree
1fd50 20 77 61 6c 6b 65 72 2e 0a 2a 2a 0a 2a 2a 20 57   walker..**.** W
1fd60 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
1fd70 20 69 73 20 74 68 65 20 57 61 6c 6b 65 72 2e 78   is the Walker.x
1fd80 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 74 68 65  ExprCallback the
1fd90 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  n expression tre
1fda0 65 73 0a 2a 2a 20 61 72 65 20 77 61 6c 6b 65 64  es.** are walked
1fdb0 20 77 69 74 68 6f 75 74 20 61 6e 79 20 61 63 74   without any act
1fdc0 69 6f 6e 73 20 62 65 69 6e 67 20 74 61 6b 65 6e  ions being taken
1fdd0 20 61 74 20 65 61 63 68 20 6e 6f 64 65 2e 20 20   at each node.  
1fde0 50 72 65 73 75 6d 61 62 6c 79 2c 0a 2a 2a 20 77  Presumably,.** w
1fdf0 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
1fe00 20 69 73 20 75 73 65 64 20 66 6f 72 20 57 61 6c   is used for Wal
1fe10 6b 65 72 2e 78 45 78 70 72 43 61 6c 6c 62 61 63  ker.xExprCallbac
1fe20 6b 20 74 68 65 6e 20 0a 2a 2a 20 57 61 6c 6b 65  k then .** Walke
1fe30 72 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  r.xSelectCallbac
1fe40 6b 20 69 73 20 73 65 74 20 74 6f 20 64 6f 20 73  k is set to do s
1fe50 6f 6d 65 74 68 69 6e 67 20 75 73 65 66 75 6c 20  omething useful 
1fe60 66 6f 72 20 65 76 65 72 79 20 0a 2a 2a 20 73 75  for every .** su
1fe70 62 71 75 65 72 79 20 69 6e 20 74 68 65 20 70 61  bquery in the pa
1fe80 72 73 65 72 20 74 72 65 65 2e 0a 2a 2f 0a 73 74  rser tree..*/.st
1fe90 61 74 69 63 20 69 6e 74 20 65 78 70 72 57 61 6c  atic int exprWal
1fea0 6b 4e 6f 6f 70 28 57 61 6c 6b 65 72 20 2a 4e 6f  kNoop(Walker *No
1feb0 74 55 73 65 64 2c 20 45 78 70 72 20 2a 4e 6f 74  tUsed, Expr *Not
1fec0 55 73 65 64 32 29 7b 0a 20 20 55 4e 55 53 45 44  Used2){.  UNUSED
1fed0 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55  _PARAMETER2(NotU
1fee0 73 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a  sed, NotUsed2);.
1fef0 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e    return WRC_Con
1ff00 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  tinue;.}../*.** 
1ff10 54 68 69 73 20 72 6f 75 74 69 6e 65 20 22 65 78  This routine "ex
1ff20 70 61 6e 64 73 22 20 61 20 53 45 4c 45 43 54 20  pands" a SELECT 
1ff30 73 74 61 74 65 6d 65 6e 74 20 61 6e 64 20 61 6c  statement and al
1ff40 6c 20 6f 66 20 69 74 73 20 73 75 62 71 75 65 72  l of its subquer
1ff50 69 65 73 2e 0a 2a 2a 20 46 6f 72 20 61 64 64 69  ies..** For addi
1ff60 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
1ff70 6f 6e 20 6f 6e 20 77 68 61 74 20 69 74 20 6d 65  on on what it me
1ff80 61 6e 73 20 74 6f 20 22 65 78 70 61 6e 64 22 20  ans to "expand" 
1ff90 61 20 53 45 4c 45 43 54 0a 2a 2a 20 73 74 61 74  a SELECT.** stat
1ffa0 65 6d 65 6e 74 2c 20 73 65 65 20 74 68 65 20 63  ement, see the c
1ffb0 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 20 73 65  omment on the se
1ffc0 6c 65 63 74 45 78 70 61 6e 64 20 77 6f 72 6b 65  lectExpand worke
1ffd0 72 20 63 61 6c 6c 62 61 63 6b 20 61 62 6f 76 65  r callback above
1ffe0 2e 0a 2a 2a 0a 2a 2a 20 45 78 70 61 6e 64 69 6e  ..**.** Expandin
1fff0 67 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  g a SELECT state
20000 6d 65 6e 74 20 69 73 20 74 68 65 20 66 69 72 73  ment is the firs
20010 74 20 73 74 65 70 20 69 6e 20 70 72 6f 63 65 73  t step in proces
20020 73 69 6e 67 20 61 0a 2a 2a 20 53 45 4c 45 43 54  sing a.** SELECT
20030 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65   statement.  The
20040 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
20050 74 20 6d 75 73 74 20 62 65 20 65 78 70 61 6e 64  t must be expand
20060 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20 6e 61 6d  ed before.** nam
20070 65 20 72 65 73 6f 6c 75 74 69 6f 6e 20 69 73 20  e resolution is 
20080 70 65 72 66 6f 72 6d 65 64 2e 0a 2a 2a 0a 2a 2a  performed..**.**
20090 20 49 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65   If anything goe
200a0 73 20 77 72 6f 6e 67 2c 20 61 6e 20 65 72 72 6f  s wrong, an erro
200b0 72 20 6d 65 73 73 61 67 65 20 69 73 20 77 72 69  r message is wri
200c0 74 74 65 6e 20 69 6e 74 6f 20 70 50 61 72 73 65  tten into pParse
200d0 2e 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 69 6e 67  ..** The calling
200e0 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e 20 64 65   function can de
200f0 74 65 63 74 20 74 68 65 20 70 72 6f 62 6c 65 6d  tect the problem
20100 20 62 79 20 6c 6f 6f 6b 69 6e 67 20 61 74 20 70   by looking at p
20110 50 61 72 73 65 2d 3e 6e 45 72 72 0a 2a 2a 20 61  Parse->nErr.** a
20120 6e 64 2f 6f 72 20 70 50 61 72 73 65 2d 3e 64 62  nd/or pParse->db
20130 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 2e 0a  ->mallocFailed..
20140 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
20150 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 61  qlite3SelectExpa
20160 6e 64 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  nd(Parse *pParse
20170 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63  , Select *pSelec
20180 74 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a  t){.  Walker w;.
20190 20 20 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c 20    memset(&w, 0, 
201a0 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20 77 2e  sizeof(w));.  w.
201b0 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20  xExprCallback = 
201c0 65 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20  exprWalkNoop;.  
201d0 77 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73  w.pParse = pPars
201e0 65 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  e;.  if( pParse-
201f0 3e 68 61 73 43 6f 6d 70 6f 75 6e 64 20 29 7b 0a  >hasCompound ){.
20200 20 20 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c      w.xSelectCal
20210 6c 62 61 63 6b 20 3d 20 63 6f 6e 76 65 72 74 43  lback = convertC
20220 6f 6d 70 6f 75 6e 64 53 65 6c 65 63 74 54 6f 53  ompoundSelectToS
20230 75 62 71 75 65 72 79 3b 0a 20 20 20 20 73 71 6c  ubquery;.    sql
20240 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 26  ite3WalkSelect(&
20250 77 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 7d  w, pSelect);.  }
20260 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c  .  w.xSelectCall
20270 62 61 63 6b 20 3d 20 73 65 6c 65 63 74 45 78 70  back = selectExp
20280 61 6e 64 65 72 3b 0a 20 20 73 71 6c 69 74 65 33  ander;.  sqlite3
20290 57 61 6c 6b 53 65 6c 65 63 74 28 26 77 2c 20 70  WalkSelect(&w, p
202a0 53 65 6c 65 63 74 29 3b 0a 7d 0a 0a 0a 23 69 66  Select);.}...#if
202b0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
202c0 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20  _SUBQUERY./*.** 
202d0 54 68 69 73 20 69 73 20 61 20 57 61 6c 6b 65 72  This is a Walker
202e0 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
202f0 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 74 68   callback for th
20300 65 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54  e sqlite3SelectT
20310 79 70 65 49 6e 66 6f 28 29 0a 2a 2a 20 69 6e 74  ypeInfo().** int
20320 65 72 66 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f  erface..**.** Fo
20330 72 20 65 61 63 68 20 46 52 4f 4d 2d 63 6c 61 75  r each FROM-clau
20340 73 65 20 73 75 62 71 75 65 72 79 2c 20 61 64 64  se subquery, add
20350 20 43 6f 6c 75 6d 6e 2e 7a 54 79 70 65 20 61 6e   Column.zType an
20360 64 20 43 6f 6c 75 6d 6e 2e 7a 43 6f 6c 6c 0a 2a  d Column.zColl.*
20370 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f  * information to
20380 20 74 68 65 20 54 61 62 6c 65 20 73 74 72 75 63   the Table struc
20390 74 75 72 65 20 74 68 61 74 20 72 65 70 72 65 73  ture that repres
203a0 65 6e 74 73 20 74 68 65 20 72 65 73 75 6c 74 20  ents the result 
203b0 73 65 74 0a 2a 2a 20 6f 66 20 74 68 61 74 20 73  set.** of that s
203c0 75 62 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 54  ubquery..**.** T
203d0 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75  he Table structu
203e0 72 65 20 74 68 61 74 20 72 65 70 72 65 73 65 6e  re that represen
203f0 74 73 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  ts the result se
20400 74 20 77 61 73 20 63 6f 6e 73 74 72 75 63 74 65  t was constructe
20410 64 0a 2a 2a 20 62 79 20 73 65 6c 65 63 74 45 78  d.** by selectEx
20420 70 61 6e 64 65 72 28 29 20 62 75 74 20 74 68 65  pander() but the
20430 20 74 79 70 65 20 61 6e 64 20 63 6f 6c 6c 61 74   type and collat
20440 69 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ion information 
20450 77 61 73 20 6f 6d 69 74 74 65 64 0a 2a 2a 20 61  was omitted.** a
20460 74 20 74 68 61 74 20 70 6f 69 6e 74 20 62 65 63  t that point bec
20470 61 75 73 65 20 69 64 65 6e 74 69 66 69 65 72 73  ause identifiers
20480 20 68 61 64 20 6e 6f 74 20 79 65 74 20 62 65 65   had not yet bee
20490 6e 20 72 65 73 6f 6c 76 65 64 2e 20 20 54 68 69  n resolved.  Thi
204a0 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20  s.** routine is 
204b0 63 61 6c 6c 65 64 20 61 66 74 65 72 20 69 64 65  called after ide
204c0 6e 74 69 66 69 65 72 20 72 65 73 6f 6c 75 74 69  ntifier resoluti
204d0 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
204e0 74 20 73 65 6c 65 63 74 41 64 64 53 75 62 71 75  t selectAddSubqu
204f0 65 72 79 54 79 70 65 49 6e 66 6f 28 57 61 6c 6b  eryTypeInfo(Walk
20500 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c  er *pWalker, Sel
20510 65 63 74 20 2a 70 29 7b 0a 20 20 50 61 72 73 65  ect *p){.  Parse
20520 20 2a 70 50 61 72 73 65 3b 0a 20 20 69 6e 74 20   *pParse;.  int 
20530 69 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  i;.  SrcList *pT
20540 61 62 4c 69 73 74 3b 0a 20 20 73 74 72 75 63 74  abList;.  struct
20550 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
20560 46 72 6f 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28  From;..  assert(
20570 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53   p->selFlags & S
20580 46 5f 52 65 73 6f 6c 76 65 64 20 29 3b 0a 20 20  F_Resolved );.  
20590 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73  if( (p->selFlags
205a0 20 26 20 53 46 5f 48 61 73 54 79 70 65 49 6e 66   & SF_HasTypeInf
205b0 6f 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e  o)==0 ){.    p->
205c0 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 48  selFlags |= SF_H
205d0 61 73 54 79 70 65 49 6e 66 6f 3b 0a 20 20 20 20  asTypeInfo;.    
205e0 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72  pParse = pWalker
205f0 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20 20 70 54  ->pParse;.    pT
20600 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63  abList = p->pSrc
20610 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70  ;.    for(i=0, p
20620 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61  From=pTabList->a
20630 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  ; i<pTabList->nS
20640 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b  rc; i++, pFrom++
20650 29 7b 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a  ){.      Table *
20660 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54  pTab = pFrom->pT
20670 61 62 3b 0a 20 20 20 20 20 20 69 66 28 20 41 4c  ab;.      if( AL
20680 57 41 59 53 28 70 54 61 62 21 3d 30 29 20 26 26  WAYS(pTab!=0) &&
20690 20 28 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73   (pTab->tabFlags
206a0 20 26 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 29   & TF_Ephemeral)
206b0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  !=0 ){.        /
206c0 2a 20 41 20 73 75 62 2d 71 75 65 72 79 20 69 6e  * A sub-query in
206d0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
206e0 20 6f 66 20 61 20 53 45 4c 45 43 54 20 2a 2f 0a   of a SELECT */.
206f0 20 20 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a          Select *
20700 70 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53  pSel = pFrom->pS
20710 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 20 20 61  elect;.        a
20720 73 73 65 72 74 28 20 70 53 65 6c 20 29 3b 0a 20  ssert( pSel );. 
20730 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 53         while( pS
20740 65 6c 2d 3e 70 50 72 69 6f 72 20 29 20 70 53 65  el->pPrior ) pSe
20750 6c 20 3d 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72  l = pSel->pPrior
20760 3b 0a 20 20 20 20 20 20 20 20 73 65 6c 65 63 74  ;.        select
20770 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64  AddColumnTypeAnd
20780 43 6f 6c 6c 61 74 69 6f 6e 28 70 50 61 72 73 65  Collation(pParse
20790 2c 20 70 54 61 62 2c 20 70 53 65 6c 29 3b 0a 20  , pTab, pSel);. 
207a0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
207b0 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f  .  return WRC_Co
207c0 6e 74 69 6e 75 65 3b 0a 7d 0a 23 65 6e 64 69 66  ntinue;.}.#endif
207d0 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  .../*.** This ro
207e0 75 74 69 6e 65 20 61 64 64 73 20 64 61 74 61 74  utine adds datat
207f0 79 70 65 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6e  ype and collatin
20800 67 20 73 65 71 75 65 6e 63 65 20 69 6e 66 6f 72  g sequence infor
20810 6d 61 74 69 6f 6e 20 74 6f 0a 2a 2a 20 74 68 65  mation to.** the
20820 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   Table structure
20830 73 20 6f 66 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c  s of all FROM-cl
20840 61 75 73 65 20 73 75 62 71 75 65 72 69 65 73 20  ause subqueries 
20850 69 6e 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20 73  in a.** SELECT s
20860 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  tatement..**.** 
20870 55 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  Use this routine
20880 20 61 66 74 65 72 20 6e 61 6d 65 20 72 65 73 6f   after name reso
20890 6c 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  lution..*/.stati
208a0 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65  c void sqlite3Se
208b0 6c 65 63 74 41 64 64 54 79 70 65 49 6e 66 6f 28  lectAddTypeInfo(
208c0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
208d0 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b  elect *pSelect){
208e0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
208f0 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
20900 57 61 6c 6b 65 72 20 77 3b 0a 20 20 6d 65 6d 73  Walker w;.  mems
20910 65 74 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f 66  et(&w, 0, sizeof
20920 28 77 29 29 3b 0a 20 20 77 2e 78 53 65 6c 65 63  (w));.  w.xSelec
20930 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73 65 6c 65  tCallback = sele
20940 63 74 41 64 64 53 75 62 71 75 65 72 79 54 79 70  ctAddSubqueryTyp
20950 65 49 6e 66 6f 3b 0a 20 20 77 2e 78 45 78 70 72  eInfo;.  w.xExpr
20960 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72 57  Callback = exprW
20970 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 70 50 61  alkNoop;.  w.pPa
20980 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20  rse = pParse;.  
20990 77 2e 62 53 65 6c 65 63 74 44 65 70 74 68 46 69  w.bSelectDepthFi
209a0 72 73 74 20 3d 20 31 3b 0a 20 20 73 71 6c 69 74  rst = 1;.  sqlit
209b0 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 26 77 2c  e3WalkSelect(&w,
209c0 20 70 53 65 6c 65 63 74 29 3b 0a 23 65 6e 64 69   pSelect);.#endi
209d0 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  f.}.../*.** This
209e0 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 75 70   routine sets up
209f0 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
20a00 65 6e 74 20 66 6f 72 20 70 72 6f 63 65 73 73 69  ent for processi
20a10 6e 67 2e 20 20 54 68 65 0a 2a 2a 20 66 6f 6c 6c  ng.  The.** foll
20a20 6f 77 69 6e 67 20 69 73 20 61 63 63 6f 6d 70 6c  owing is accompl
20a30 69 73 68 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  ished:.**.**    
20a40 20 2a 20 20 56 44 42 45 20 43 75 72 73 6f 72 20   *  VDBE Cursor 
20a50 6e 75 6d 62 65 72 73 20 61 72 65 20 61 73 73 69  numbers are assi
20a60 67 6e 65 64 20 74 6f 20 61 6c 6c 20 46 52 4f 4d  gned to all FROM
20a70 2d 63 6c 61 75 73 65 20 74 65 72 6d 73 2e 0a 2a  -clause terms..*
20a80 2a 20 20 20 20 20 2a 20 20 45 70 68 65 6d 65 72  *     *  Ephemer
20a90 61 6c 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 73  al Table objects
20aa0 20 61 72 65 20 63 72 65 61 74 65 64 20 66 6f 72   are created for
20ab0 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65   all FROM-clause
20ac0 20 73 75 62 71 75 65 72 69 65 73 2e 0a 2a 2a 20   subqueries..** 
20ad0 20 20 20 20 2a 20 20 4f 4e 20 61 6e 64 20 55 53      *  ON and US
20ae0 49 4e 47 20 63 6c 61 75 73 65 73 20 61 72 65 20  ING clauses are 
20af0 73 68 69 66 74 65 64 20 69 6e 74 6f 20 57 48 45  shifted into WHE
20b00 52 45 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a  RE statements.**
20b10 20 20 20 20 20 2a 20 20 57 69 6c 64 63 61 72 64       *  Wildcard
20b20 73 20 22 2a 22 20 61 6e 64 20 22 54 41 42 4c 45  s "*" and "TABLE
20b30 2e 2a 22 20 69 6e 20 72 65 73 75 6c 74 20 73 65  .*" in result se
20b40 74 73 20 61 72 65 20 65 78 70 61 6e 64 65 64 2e  ts are expanded.
20b50 0a 2a 2a 20 20 20 20 20 2a 20 20 49 64 65 6e 74  .**     *  Ident
20b60 69 66 69 65 72 73 20 69 6e 20 65 78 70 72 65 73  ifiers in expres
20b70 73 69 6f 6e 20 61 72 65 20 6d 61 74 63 68 65 64  sion are matched
20b80 20 74 6f 20 74 61 62 6c 65 73 2e 0a 2a 2a 0a 2a   to tables..**.*
20b90 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61  * This routine a
20ba0 63 74 73 20 72 65 63 75 72 73 69 76 65 6c 79 20  cts recursively 
20bb0 6f 6e 20 61 6c 6c 20 73 75 62 71 75 65 72 69 65  on all subquerie
20bc0 73 20 77 69 74 68 69 6e 20 74 68 65 20 53 45 4c  s within the SEL
20bd0 45 43 54 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ECT..*/.void sql
20be0 69 74 65 33 53 65 6c 65 63 74 50 72 65 70 28 0a  ite3SelectPrep(.
20bf0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
20c00 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
20c10 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  parser context *
20c20 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
20c30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
20c40 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
20c50 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64 2e 20  nt being coded. 
20c60 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  */.  NameContext
20c70 20 2a 70 4f 75 74 65 72 4e 43 20 20 2f 2a 20 4e   *pOuterNC  /* N
20c80 61 6d 65 20 63 6f 6e 74 65 78 74 20 66 6f 72 20  ame context for 
20c90 63 6f 6e 74 61 69 6e 65 72 20 2a 2f 0a 29 7b 0a  container */.){.
20ca0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
20cb0 20 69 66 28 20 4e 45 56 45 52 28 70 3d 3d 30 29   if( NEVER(p==0)
20cc0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 64 62 20   ) return;.  db 
20cd0 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
20ce0 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
20cf0 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20  iled ) return;. 
20d00 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73   if( p->selFlags
20d10 20 26 20 53 46 5f 48 61 73 54 79 70 65 49 6e 66   & SF_HasTypeInf
20d20 6f 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71  o ) return;.  sq
20d30 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 61 6e  lite3SelectExpan
20d40 64 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20  d(pParse, p);.  
20d50 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
20d60 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
20d70 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20  iled ) return;. 
20d80 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 53   sqlite3ResolveS
20d90 65 6c 65 63 74 4e 61 6d 65 73 28 70 50 61 72 73  electNames(pPars
20da0 65 2c 20 70 2c 20 70 4f 75 74 65 72 4e 43 29 3b  e, p, pOuterNC);
20db0 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
20dc0 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  Err || db->mallo
20dd0 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
20de0 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ;.  sqlite3Selec
20df0 74 41 64 64 54 79 70 65 49 6e 66 6f 28 70 50 61  tAddTypeInfo(pPa
20e00 72 73 65 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  rse, p);.}../*.*
20e10 2a 20 52 65 73 65 74 20 74 68 65 20 61 67 67 72  * Reset the aggr
20e20 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f  egate accumulato
20e30 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 67 67  r..**.** The agg
20e40 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74  regate accumulat
20e50 6f 72 20 69 73 20 61 20 73 65 74 20 6f 66 20 6d  or is a set of m
20e60 65 6d 6f 72 79 20 63 65 6c 6c 73 20 74 68 61 74  emory cells that
20e70 20 68 6f 6c 64 0a 2a 2a 20 69 6e 74 65 72 6d 65   hold.** interme
20e80 64 69 61 74 65 20 72 65 73 75 6c 74 73 20 77 68  diate results wh
20e90 69 6c 65 20 63 61 6c 63 75 6c 61 74 69 6e 67 20  ile calculating 
20ea0 61 6e 20 61 67 67 72 65 67 61 74 65 2e 20 20 54  an aggregate.  T
20eb0 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67  his.** routine g
20ec0 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20 74 68  enerates code th
20ed0 61 74 20 73 74 6f 72 65 73 20 4e 55 4c 4c 73 20  at stores NULLs 
20ee0 69 6e 20 61 6c 6c 20 6f 66 20 74 68 6f 73 65 20  in all of those 
20ef0 6d 65 6d 6f 72 79 0a 2a 2a 20 63 65 6c 6c 73 2e  memory.** cells.
20f00 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
20f10 72 65 73 65 74 41 63 63 75 6d 75 6c 61 74 6f 72  resetAccumulator
20f20 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
20f30 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66  AggInfo *pAggInf
20f40 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  o){.  Vdbe *v = 
20f50 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
20f60 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74   int i;.  struct
20f70 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70   AggInfo_func *p
20f80 46 75 6e 63 3b 0a 20 20 69 66 28 20 70 41 67 67  Func;.  if( pAgg
20f90 49 6e 66 6f 2d 3e 6e 46 75 6e 63 2b 70 41 67 67  Info->nFunc+pAgg
20fa0 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 30  Info->nColumn==0
20fb0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
20fc0 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69    }.  for(i=0; i
20fd0 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75  <pAggInfo->nColu
20fe0 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71  mn; i++){.    sq
20ff0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
21000 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70  v, OP_Null, 0, p
21010 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 69 5d  AggInfo->aCol[i]
21020 2e 69 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20 66 6f  .iMem);.  }.  fo
21030 72 28 70 46 75 6e 63 3d 70 41 67 67 49 6e 66 6f  r(pFunc=pAggInfo
21040 2d 3e 61 46 75 6e 63 2c 20 69 3d 30 3b 20 69 3c  ->aFunc, i=0; i<
21050 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b  pAggInfo->nFunc;
21060 20 69 2b 2b 2c 20 70 46 75 6e 63 2b 2b 29 7b 0a   i++, pFunc++){.
21070 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
21080 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp2(v, OP_Null
21090 2c 20 30 2c 20 70 46 75 6e 63 2d 3e 69 4d 65 6d  , 0, pFunc->iMem
210a0 29 3b 0a 20 20 20 20 69 66 28 20 70 46 75 6e 63  );.    if( pFunc
210b0 2d 3e 69 44 69 73 74 69 6e 63 74 3e 3d 30 20 29  ->iDistinct>=0 )
210c0 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45  {.      Expr *pE
210d0 20 3d 20 70 46 75 6e 63 2d 3e 70 45 78 70 72 3b   = pFunc->pExpr;
210e0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
210f0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
21100 70 45 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pE, EP_xIsSelect
21110 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ) );.      if( p
21120 45 2d 3e 78 2e 70 4c 69 73 74 3d 3d 30 20 7c 7c  E->x.pList==0 ||
21130 20 70 45 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45   pE->x.pList->nE
21140 78 70 72 21 3d 31 20 29 7b 0a 20 20 20 20 20 20  xpr!=1 ){.      
21150 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
21160 67 28 70 50 61 72 73 65 2c 20 22 44 49 53 54 49  g(pParse, "DISTI
21170 4e 43 54 20 61 67 67 72 65 67 61 74 65 73 20 6d  NCT aggregates m
21180 75 73 74 20 68 61 76 65 20 65 78 61 63 74 6c 79  ust have exactly
21190 20 6f 6e 65 20 22 0a 20 20 20 20 20 20 20 20 20   one ".         
211a0 20 20 22 61 72 67 75 6d 65 6e 74 22 29 3b 0a 20    "argument");. 
211b0 20 20 20 20 20 20 20 70 46 75 6e 63 2d 3e 69 44         pFunc->iD
211c0 69 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20  istinct = -1;.  
211d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
211e0 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79     KeyInfo *pKey
211f0 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72  Info = keyInfoFr
21200 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  omExprList(pPars
21210 65 2c 20 70 45 2d 3e 78 2e 70 4c 69 73 74 29 3b  e, pE->x.pList);
21220 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
21230 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
21240 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20  _OpenEphemeral, 
21250 70 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74  pFunc->iDistinct
21260 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  , 0, 0,.        
21270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21280 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66    (char*)pKeyInf
21290 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a  o, P4_KEYINFO);.
212a0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
212b0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b  }.}../*.** Invok
212c0 65 20 74 68 65 20 4f 50 5f 41 67 67 46 69 6e 61  e the OP_AggFina
212d0 6c 69 7a 65 20 6f 70 63 6f 64 65 20 66 6f 72 20  lize opcode for 
212e0 65 76 65 72 79 20 61 67 67 72 65 67 61 74 65 20  every aggregate 
212f0 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74  function.** in t
21300 68 65 20 41 67 67 49 6e 66 6f 20 73 74 72 75 63  he AggInfo struc
21310 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ture..*/.static 
21320 76 6f 69 64 20 66 69 6e 61 6c 69 7a 65 41 67 67  void finalizeAgg
21330 46 75 6e 63 74 69 6f 6e 73 28 50 61 72 73 65 20  Functions(Parse 
21340 2a 70 50 61 72 73 65 2c 20 41 67 67 49 6e 66 6f  *pParse, AggInfo
21350 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56   *pAggInfo){.  V
21360 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
21370 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b  >pVdbe;.  int i;
21380 0a 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66  .  struct AggInf
21390 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a 20 20 66 6f  o_func *pF;.  fo
213a0 72 28 69 3d 30 2c 20 70 46 3d 70 41 67 67 49 6e  r(i=0, pF=pAggIn
213b0 66 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c 70 41 67  fo->aFunc; i<pAg
213c0 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b  gInfo->nFunc; i+
213d0 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20 20 20 45 78  +, pF++){.    Ex
213e0 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20  prList *pList = 
213f0 70 46 2d 3e 70 45 78 70 72 2d 3e 78 2e 70 4c 69  pF->pExpr->x.pLi
21400 73 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  st;.    assert( 
21410 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
21420 28 70 46 2d 3e 70 45 78 70 72 2c 20 45 50 5f 78  (pF->pExpr, EP_x
21430 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20  IsSelect) );.   
21440 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
21450 70 34 28 76 2c 20 4f 50 5f 41 67 67 46 69 6e 61  p4(v, OP_AggFina
21460 6c 2c 20 70 46 2d 3e 69 4d 65 6d 2c 20 70 4c 69  l, pF->iMem, pLi
21470 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45 78 70  st ? pList->nExp
21480 72 20 3a 20 30 2c 20 30 2c 0a 20 20 20 20 20 20  r : 0, 0,.      
21490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
214a0 28 76 6f 69 64 2a 29 70 46 2d 3e 70 46 75 6e 63  (void*)pF->pFunc
214b0 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20  , P4_FUNCDEF);. 
214c0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70 64 61   }.}../*.** Upda
214d0 74 65 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74  te the accumulat
214e0 6f 72 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20  or memory cells 
214f0 66 6f 72 20 61 6e 20 61 67 67 72 65 67 61 74 65  for an aggregate
21500 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 74 68 65   based on.** the
21510 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20   current cursor 
21520 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  position..*/.sta
21530 74 69 63 20 76 6f 69 64 20 75 70 64 61 74 65 41  tic void updateA
21540 63 63 75 6d 75 6c 61 74 6f 72 28 50 61 72 73 65  ccumulator(Parse
21550 20 2a 70 50 61 72 73 65 2c 20 41 67 67 49 6e 66   *pParse, AggInf
21560 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20  o *pAggInfo){.  
21570 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
21580 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
21590 3b 0a 20 20 69 6e 74 20 72 65 67 48 69 74 20 3d  ;.  int regHit =
215a0 20 30 3b 0a 20 20 69 6e 74 20 61 64 64 72 48 69   0;.  int addrHi
215b0 74 54 65 73 74 20 3d 20 30 3b 0a 20 20 73 74 72  tTest = 0;.  str
215c0 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63  uct AggInfo_func
215d0 20 2a 70 46 3b 0a 20 20 73 74 72 75 63 74 20 41   *pF;.  struct A
215e0 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 3b 0a  ggInfo_col *pC;.
215f0 0a 20 20 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72  .  pAggInfo->dir
21600 65 63 74 4d 6f 64 65 20 3d 20 31 3b 0a 20 20 73  ectMode = 1;.  s
21610 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43  qlite3ExprCacheC
21620 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20  lear(pParse);.  
21630 66 6f 72 28 69 3d 30 2c 20 70 46 3d 70 41 67 67  for(i=0, pF=pAgg
21640 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c 70  Info->aFunc; i<p
21650 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20  AggInfo->nFunc; 
21660 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20 20 20  i++, pF++){.    
21670 69 6e 74 20 6e 41 72 67 3b 0a 20 20 20 20 69 6e  int nArg;.    in
21680 74 20 61 64 64 72 4e 65 78 74 20 3d 20 30 3b 0a  t addrNext = 0;.
21690 20 20 20 20 69 6e 74 20 72 65 67 41 67 67 3b 0a      int regAgg;.
216a0 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c      ExprList *pL
216b0 69 73 74 20 3d 20 70 46 2d 3e 70 45 78 70 72 2d  ist = pF->pExpr-
216c0 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 61 73  >x.pList;.    as
216d0 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
216e0 6f 70 65 72 74 79 28 70 46 2d 3e 70 45 78 70 72  operty(pF->pExpr
216f0 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
21700 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  );.    if( pList
21710 20 29 7b 0a 20 20 20 20 20 20 6e 41 72 67 20 3d   ){.      nArg =
21720 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20   pList->nExpr;. 
21730 20 20 20 20 20 72 65 67 41 67 67 20 3d 20 73 71       regAgg = sq
21740 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67  lite3GetTempRang
21750 65 28 70 50 61 72 73 65 2c 20 6e 41 72 67 29 3b  e(pParse, nArg);
21760 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
21770 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70  prCodeExprList(p
21780 50 61 72 73 65 2c 20 70 4c 69 73 74 2c 20 72 65  Parse, pList, re
21790 67 41 67 67 2c 20 53 51 4c 49 54 45 5f 45 43 45  gAgg, SQLITE_ECE
217a0 4c 5f 44 55 50 29 3b 0a 20 20 20 20 7d 65 6c 73  L_DUP);.    }els
217b0 65 7b 0a 20 20 20 20 20 20 6e 41 72 67 20 3d 20  e{.      nArg = 
217c0 30 3b 0a 20 20 20 20 20 20 72 65 67 41 67 67 20  0;.      regAgg 
217d0 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  = 0;.    }.    i
217e0 66 28 20 70 46 2d 3e 69 44 69 73 74 69 6e 63 74  f( pF->iDistinct
217f0 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 64 64  >=0 ){.      add
21800 72 4e 65 78 74 20 3d 20 73 71 6c 69 74 65 33 56  rNext = sqlite3V
21810 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
21820 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
21830 41 72 67 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  Arg==1 );.      
21840 63 6f 64 65 44 69 73 74 69 6e 63 74 28 70 50 61  codeDistinct(pPa
21850 72 73 65 2c 20 70 46 2d 3e 69 44 69 73 74 69 6e  rse, pF->iDistin
21860 63 74 2c 20 61 64 64 72 4e 65 78 74 2c 20 31 2c  ct, addrNext, 1,
21870 20 72 65 67 41 67 67 29 3b 0a 20 20 20 20 7d 0a   regAgg);.    }.
21880 20 20 20 20 69 66 28 20 70 46 2d 3e 70 46 75 6e      if( pF->pFun
21890 63 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53  c->funcFlags & S
218a0 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43  QLITE_FUNC_NEEDC
218b0 4f 4c 4c 20 29 7b 0a 20 20 20 20 20 20 43 6f 6c  OLL ){.      Col
218c0 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b  lSeq *pColl = 0;
218d0 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78  .      struct Ex
218e0 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
218f0 65 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b  em;.      int j;
21900 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
21910 4c 69 73 74 21 3d 30 20 29 3b 20 20 2f 2a 20 70  List!=0 );  /* p
21920 4c 69 73 74 21 3d 30 20 69 66 20 70 46 2d 3e 70  List!=0 if pF->p
21930 46 75 6e 63 20 68 61 73 20 4e 45 45 44 43 4f 4c  Func has NEEDCOL
21940 4c 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 6a  L */.      for(j
21950 3d 30 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d  =0, pItem=pList-
21960 3e 61 3b 20 21 70 43 6f 6c 6c 20 26 26 20 6a 3c  >a; !pColl && j<
21970 6e 41 72 67 3b 20 6a 2b 2b 2c 20 70 49 74 65 6d  nArg; j++, pItem
21980 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f  ++){.        pCo
21990 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
219a0 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
219b0 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20  pItem->pExpr);. 
219c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
219d0 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20   !pColl ){.     
219e0 20 20 20 70 43 6f 6c 6c 20 3d 20 70 50 61 72 73     pColl = pPars
219f0 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c  e->db->pDfltColl
21a00 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
21a10 69 66 28 20 72 65 67 48 69 74 3d 3d 30 20 26 26  if( regHit==0 &&
21a20 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 41 63 63 75   pAggInfo->nAccu
21a30 6d 75 6c 61 74 6f 72 20 29 20 72 65 67 48 69 74  mulator ) regHit
21a40 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
21a50 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  m;.      sqlite3
21a60 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
21a70 5f 43 6f 6c 6c 53 65 71 2c 20 72 65 67 48 69 74  _CollSeq, regHit
21a80 2c 20 30 2c 20 30 2c 20 28 63 68 61 72 20 2a 29  , 0, 0, (char *)
21a90 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45  pColl, P4_COLLSE
21aa0 51 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  Q);.    }.    sq
21ab0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
21ac0 76 2c 20 4f 50 5f 41 67 67 53 74 65 70 2c 20 30  v, OP_AggStep, 0
21ad0 2c 20 72 65 67 41 67 67 2c 20 70 46 2d 3e 69 4d  , regAgg, pF->iM
21ae0 65 6d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  em,.            
21af0 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a            (void*
21b00 29 70 46 2d 3e 70 46 75 6e 63 2c 20 50 34 5f 46  )pF->pFunc, P4_F
21b10 55 4e 43 44 45 46 29 3b 0a 20 20 20 20 73 71 6c  UNCDEF);.    sql
21b20 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
21b30 28 76 2c 20 28 75 38 29 6e 41 72 67 29 3b 0a 20  (v, (u8)nArg);. 
21b40 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
21b50 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67  cheAffinityChang
21b60 65 28 70 50 61 72 73 65 2c 20 72 65 67 41 67 67  e(pParse, regAgg
21b70 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20 73 71 6c  , nArg);.    sql
21b80 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
21b90 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67  ange(pParse, reg
21ba0 41 67 67 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20  Agg, nArg);.    
21bb0 69 66 28 20 61 64 64 72 4e 65 78 74 20 29 7b 0a  if( addrNext ){.
21bc0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
21bd0 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
21be0 20 61 64 64 72 4e 65 78 74 29 3b 0a 20 20 20 20   addrNext);.    
21bf0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
21c00 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b  heClear(pParse);
21c10 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
21c20 20 42 65 66 6f 72 65 20 70 6f 70 75 6c 61 74 69   Before populati
21c30 6e 67 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74  ng the accumulat
21c40 6f 72 20 72 65 67 69 73 74 65 72 73 2c 20 63 6c  or registers, cl
21c50 65 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63  ear the column c
21c60 61 63 68 65 2e 0a 20 20 2a 2a 20 4f 74 68 65 72  ache..  ** Other
21c70 77 69 73 65 2c 20 69 66 20 61 6e 79 20 6f 66 20  wise, if any of 
21c80 74 68 65 20 72 65 71 75 69 72 65 64 20 63 6f 6c  the required col
21c90 75 6d 6e 20 76 61 6c 75 65 73 20 61 72 65 20 61  umn values are a
21ca0 6c 72 65 61 64 79 20 70 72 65 73 65 6e 74 20 0a  lready present .
21cb0 20 20 2a 2a 20 69 6e 20 72 65 67 69 73 74 65 72    ** in register
21cc0 73 2c 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  s, sqlite3ExprCo
21cd0 64 65 28 29 20 6d 61 79 20 75 73 65 20 4f 50 5f  de() may use OP_
21ce0 53 43 6f 70 79 20 74 6f 20 63 6f 70 79 20 74 68  SCopy to copy th
21cf0 65 20 76 61 6c 75 65 0a 20 20 2a 2a 20 74 6f 20  e value.  ** to 
21d00 70 43 2d 3e 69 4d 65 6d 2e 20 42 75 74 20 62 79  pC->iMem. But by
21d10 20 74 68 65 20 74 69 6d 65 20 74 68 65 20 76 61   the time the va
21d20 6c 75 65 20 69 73 20 75 73 65 64 2c 20 74 68 65  lue is used, the
21d30 20 6f 72 69 67 69 6e 61 6c 20 72 65 67 69 73 74   original regist
21d40 65 72 0a 20 20 2a 2a 20 6d 61 79 20 68 61 76 65  er.  ** may have
21d50 20 62 65 65 6e 20 75 73 65 64 2c 20 69 6e 76 61   been used, inva
21d60 6c 69 64 61 74 69 6e 67 20 74 68 65 20 75 6e 64  lidating the und
21d70 65 72 6c 79 69 6e 67 20 62 75 66 66 65 72 20 68  erlying buffer h
21d80 6f 6c 64 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20  olding the.  ** 
21d90 74 65 78 74 20 6f 72 20 62 6c 6f 62 20 76 61 6c  text or blob val
21da0 75 65 2e 20 53 65 65 20 74 69 63 6b 65 74 20 5b  ue. See ticket [
21db0 38 38 33 30 33 34 64 63 62 35 5d 2e 0a 20 20 2a  883034dcb5]..  *
21dc0 2a 0a 20 20 2a 2a 20 41 6e 6f 74 68 65 72 20 73  *.  ** Another s
21dd0 6f 6c 75 74 69 6f 6e 20 77 6f 75 6c 64 20 62 65  olution would be
21de0 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20 4f   to change the O
21df0 50 5f 53 43 6f 70 79 20 75 73 65 64 20 74 6f 20  P_SCopy used to 
21e00 63 6f 70 79 20 63 61 63 68 65 64 0a 20 20 2a 2a  copy cached.  **
21e10 20 76 61 6c 75 65 73 20 74 6f 20 61 6e 20 4f 50   values to an OP
21e20 5f 43 6f 70 79 2e 0a 20 20 2a 2f 0a 20 20 69 66  _Copy..  */.  if
21e30 28 20 72 65 67 48 69 74 20 29 7b 0a 20 20 20 20  ( regHit ){.    
21e40 61 64 64 72 48 69 74 54 65 73 74 20 3d 20 73 71  addrHitTest = sq
21e50 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
21e60 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 48 69 74  v, OP_If, regHit
21e70 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
21e80 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70  ExprCacheClear(p
21e90 50 61 72 73 65 29 3b 0a 20 20 66 6f 72 28 69 3d  Parse);.  for(i=
21ea0 30 2c 20 70 43 3d 70 41 67 67 49 6e 66 6f 2d 3e  0, pC=pAggInfo->
21eb0 61 43 6f 6c 3b 20 69 3c 70 41 67 67 49 6e 66 6f  aCol; i<pAggInfo
21ec0 2d 3e 6e 41 63 63 75 6d 75 6c 61 74 6f 72 3b 20  ->nAccumulator; 
21ed0 69 2b 2b 2c 20 70 43 2b 2b 29 7b 0a 20 20 20 20  i++, pC++){.    
21ee0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
21ef0 70 50 61 72 73 65 2c 20 70 43 2d 3e 70 45 78 70  pParse, pC->pExp
21f00 72 2c 20 70 43 2d 3e 69 4d 65 6d 29 3b 0a 20 20  r, pC->iMem);.  
21f10 7d 0a 20 20 70 41 67 67 49 6e 66 6f 2d 3e 64 69  }.  pAggInfo->di
21f20 72 65 63 74 4d 6f 64 65 20 3d 20 30 3b 0a 20 20  rectMode = 0;.  
21f30 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
21f40 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20  Clear(pParse);. 
21f50 20 69 66 28 20 61 64 64 72 48 69 74 54 65 73 74   if( addrHitTest
21f60 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
21f70 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
21f80 64 64 72 48 69 74 54 65 73 74 29 3b 0a 20 20 7d  ddrHitTest);.  }
21f90 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20  .}../*.** Add a 
21fa0 73 69 6e 67 6c 65 20 4f 50 5f 45 78 70 6c 61 69  single OP_Explai
21fb0 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f  n instruction to
21fc0 20 74 68 65 20 56 44 42 45 20 74 6f 20 65 78 70   the VDBE to exp
21fd0 6c 61 69 6e 20 61 20 73 69 6d 70 6c 65 0a 2a 2a  lain a simple.**
21fe0 20 63 6f 75 6e 74 28 2a 29 20 71 75 65 72 79 20   count(*) query 
21ff0 28 22 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a  ("SELECT count(*
22000 29 20 46 52 4f 4d 20 70 54 61 62 22 29 2e 0a 2a  ) FROM pTab")..*
22010 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
22020 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 73 74  _OMIT_EXPLAIN.st
22030 61 74 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69  atic void explai
22040 6e 53 69 6d 70 6c 65 43 6f 75 6e 74 28 0a 20 20  nSimpleCount(.  
22050 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
22060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22070 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74  /* Parse context
22080 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   */.  Table *pTa
22090 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
220a0 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 62        /* Table b
220b0 65 69 6e 67 20 71 75 65 72 69 65 64 20 2a 2f 0a  eing queried */.
220c0 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 20 20    Index *pIdx   
220d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
220e0 20 20 2f 2a 20 49 6e 64 65 78 20 75 73 65 64 20    /* Index used 
220f0 74 6f 20 6f 70 74 69 6d 69 7a 65 20 73 63 61 6e  to optimize scan
22100 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a  , or NULL */.){.
22110 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78    if( pParse->ex
22120 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20  plain==2 ){.    
22130 63 68 61 72 20 2a 7a 45 71 70 20 3d 20 73 71 6c  char *zEqp = sql
22140 69 74 65 33 4d 50 72 69 6e 74 66 28 70 50 61 72  ite3MPrintf(pPar
22150 73 65 2d 3e 64 62 2c 20 22 53 43 41 4e 20 54 41  se->db, "SCAN TA
22160 42 4c 45 20 25 73 25 73 25 73 22 2c 0a 20 20 20  BLE %s%s%s",.   
22170 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65       pTab->zName
22180 2c 20 0a 20 20 20 20 20 20 20 20 70 49 64 78 20  , .        pIdx 
22190 3f 20 22 20 55 53 49 4e 47 20 43 4f 56 45 52 49  ? " USING COVERI
221a0 4e 47 20 49 4e 44 45 58 20 22 20 3a 20 22 22 2c  NG INDEX " : "",
221b0 0a 20 20 20 20 20 20 20 20 70 49 64 78 20 3f 20  .        pIdx ? 
221c0 70 49 64 78 2d 3e 7a 4e 61 6d 65 20 3a 20 22 22  pIdx->zName : ""
221d0 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69  .    );.    sqli
221e0 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 0a 20  te3VdbeAddOp4(. 
221f0 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 70         pParse->p
22200 56 64 62 65 2c 20 4f 50 5f 45 78 70 6c 61 69 6e  Vdbe, OP_Explain
22210 2c 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63  , pParse->iSelec
22220 74 49 64 2c 20 30 2c 20 30 2c 20 7a 45 71 70 2c  tId, 0, 0, zEqp,
22230 20 50 34 5f 44 59 4e 41 4d 49 43 0a 20 20 20 20   P4_DYNAMIC.    
22240 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23  );.  }.}.#else.#
22250 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69 6e 53   define explainS
22260 69 6d 70 6c 65 43 6f 75 6e 74 28 61 2c 62 2c 63  impleCount(a,b,c
22270 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
22280 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
22290 72 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  r the SELECT sta
222a0 74 65 6d 65 6e 74 20 67 69 76 65 6e 20 69 6e 20  tement given in 
222b0 74 68 65 20 70 20 61 72 67 75 6d 65 6e 74 2e 20  the p argument. 
222c0 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75   .**.** The resu
222d0 6c 74 73 20 61 72 65 20 64 69 73 74 72 69 62 75  lts are distribu
222e0 74 65 64 20 69 6e 20 76 61 72 69 6f 75 73 20 77  ted in various w
222f0 61 79 73 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e  ays depending on
22300 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73   the.** contents
22310 20 6f 66 20 74 68 65 20 53 65 6c 65 63 74 44 65   of the SelectDe
22320 73 74 20 73 74 72 75 63 74 75 72 65 20 70 6f 69  st structure poi
22330 6e 74 65 64 20 74 6f 20 62 79 20 61 72 67 75 6d  nted to by argum
22340 65 6e 74 20 70 44 65 73 74 0a 2a 2a 20 61 73 20  ent pDest.** as 
22350 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
22360 20 20 20 70 44 65 73 74 2d 3e 65 44 65 73 74 20     pDest->eDest 
22370 20 20 20 52 65 73 75 6c 74 0a 2a 2a 20 20 20 20     Result.**    
22380 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20   ------------   
22390 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
223a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
223b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20  ------------.** 
223c0 20 20 20 20 53 52 54 5f 4f 75 74 70 75 74 20 20      SRT_Output  
223d0 20 20 20 20 47 65 6e 65 72 61 74 65 20 61 20 72      Generate a r
223e0 6f 77 20 6f 66 20 6f 75 74 70 75 74 20 28 75 73  ow of output (us
223f0 69 6e 67 20 74 68 65 20 4f 50 5f 52 65 73 75 6c  ing the OP_Resul
22400 74 52 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20 20  tRow.**         
22410 20 20 20 20 20 20 20 20 20 20 20 20 6f 70 63 6f              opco
22420 64 65 29 20 66 6f 72 20 65 61 63 68 20 72 6f 77  de) for each row
22430 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
22440 65 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52  et..**.**     SR
22450 54 5f 4d 65 6d 20 20 20 20 20 20 20 20 20 4f 6e  T_Mem         On
22460 6c 79 20 76 61 6c 69 64 20 69 66 20 74 68 65 20  ly valid if the 
22470 72 65 73 75 6c 74 20 69 73 20 61 20 73 69 6e 67  result is a sing
22480 6c 65 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 20 20 20  le column..**   
22490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
224a0 20 20 53 74 6f 72 65 20 74 68 65 20 66 69 72 73    Store the firs
224b0 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  t column of the 
224c0 66 69 72 73 74 20 72 65 73 75 6c 74 20 72 6f 77  first result row
224d0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
224e0 20 20 20 20 20 20 20 20 69 6e 20 72 65 67 69 73          in regis
224f0 74 65 72 20 70 44 65 73 74 2d 3e 69 53 44 50 61  ter pDest->iSDPa
22500 72 6d 20 74 68 65 6e 20 61 62 61 6e 64 6f 6e 20  rm then abandon 
22510 74 68 65 20 72 65 73 74 0a 2a 2a 20 20 20 20 20  the rest.**     
22520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22530 6f 66 20 74 68 65 20 71 75 65 72 79 2e 20 20 54  of the query.  T
22540 68 69 73 20 64 65 73 74 69 6e 61 74 69 6f 6e 20  his destination 
22550 69 6d 70 6c 69 65 73 20 22 4c 49 4d 49 54 20 31  implies "LIMIT 1
22560 22 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54  "..**.**     SRT
22570 5f 53 65 74 20 20 20 20 20 20 20 20 20 54 68 65  _Set         The
22580 20 72 65 73 75 6c 74 20 6d 75 73 74 20 62 65 20   result must be 
22590 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 2e  a single column.
225a0 20 20 53 74 6f 72 65 20 65 61 63 68 0a 2a 2a 20    Store each.** 
225b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
225c0 20 20 20 20 72 6f 77 20 6f 66 20 72 65 73 75 6c      row of resul
225d0 74 20 61 73 20 74 68 65 20 6b 65 79 20 69 6e 20  t as the key in 
225e0 74 61 62 6c 65 20 70 44 65 73 74 2d 3e 69 53 44  table pDest->iSD
225f0 50 61 72 6d 2e 20 0a 2a 2a 20 20 20 20 20 20 20  Parm. .**       
22600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 41 70                Ap
22610 70 6c 79 20 74 68 65 20 61 66 66 69 6e 69 74 79  ply the affinity
22620 20 70 44 65 73 74 2d 3e 61 66 66 53 64 73 74 20   pDest->affSdst 
22630 62 65 66 6f 72 65 20 73 74 6f 72 69 6e 67 0a 2a  before storing.*
22640 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
22650 20 20 20 20 20 20 72 65 73 75 6c 74 73 2e 20 20        results.  
22660 55 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  Used to implemen
22670 74 20 22 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e  t "IN (SELECT ..
22680 2e 29 22 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  .)"..**.**     S
22690 52 54 5f 55 6e 69 6f 6e 20 20 20 20 20 20 20 53  RT_Union       S
226a0 74 6f 72 65 20 72 65 73 75 6c 74 73 20 61 73 20  tore results as 
226b0 61 20 6b 65 79 20 69 6e 20 61 20 74 65 6d 70 6f  a key in a tempo
226c0 72 61 72 79 20 74 61 62 6c 65 20 0a 2a 2a 20 20  rary table .**  
226d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
226e0 20 20 20 69 64 65 6e 74 69 66 69 65 64 20 62 79     identified by
226f0 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 2e   pDest->iSDParm.
22700 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 45  .**.**     SRT_E
22710 78 63 65 70 74 20 20 20 20 20 20 52 65 6d 6f 76  xcept      Remov
22720 65 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 74  e results from t
22730 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  he temporary tab
22740 6c 65 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72  le pDest->iSDPar
22750 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54  m..**.**     SRT
22760 5f 54 61 62 6c 65 20 20 20 20 20 20 20 53 74 6f  _Table       Sto
22770 72 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74 65  re results in te
22780 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 70 44  mporary table pD
22790 65 73 74 2d 3e 69 53 44 50 61 72 6d 2e 0a 2a 2a  est->iSDParm..**
227a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
227b0 20 20 20 20 20 54 68 69 73 20 69 73 20 6c 69 6b       This is lik
227c0 65 20 53 52 54 5f 45 70 68 65 6d 54 61 62 20 65  e SRT_EphemTab e
227d0 78 63 65 70 74 20 74 68 61 74 20 74 68 65 20 74  xcept that the t
227e0 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  able.**         
227f0 20 20 20 20 20 20 20 20 20 20 20 20 69 73 20 61              is a
22800 73 73 75 6d 65 64 20 74 6f 20 61 6c 72 65 61 64  ssumed to alread
22810 79 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a 0a 2a 2a  y be open..**.**
22820 20 20 20 20 20 53 52 54 5f 45 70 68 65 6d 54 61       SRT_EphemTa
22830 62 20 20 20 20 43 72 65 61 74 65 20 61 6e 20 74  b    Create an t
22840 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 70  emporary table p
22850 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 20 61 6e  Dest->iSDParm an
22860 64 20 73 74 6f 72 65 0a 2a 2a 20 20 20 20 20 20  d store.**      
22870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
22880 68 65 20 72 65 73 75 6c 74 20 74 68 65 72 65 2e  he result there.
22890 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c   The cursor is l
228a0 65 66 74 20 6f 70 65 6e 20 61 66 74 65 72 0a 2a  eft open after.*
228b0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
228c0 20 20 20 20 20 20 72 65 74 75 72 6e 69 6e 67 2e        returning.
228d0 20 20 54 68 69 73 20 69 73 20 6c 69 6b 65 20 53    This is like S
228e0 52 54 5f 54 61 62 6c 65 20 65 78 63 65 70 74 20  RT_Table except 
228f0 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  that.**         
22900 20 20 20 20 20 20 20 20 20 20 20 20 74 68 69 73              this
22910 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 75 73 65   destination use
22920 73 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  s OP_OpenEphemer
22930 61 6c 20 74 6f 20 63 72 65 61 74 65 0a 2a 2a 20  al to create.** 
22940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22950 20 20 20 20 74 68 65 20 74 61 62 6c 65 20 66 69      the table fi
22960 72 73 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  rst..**.**     S
22970 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 20 20 47  RT_Coroutine   G
22980 65 6e 65 72 61 74 65 20 61 20 63 6f 2d 72 6f 75  enerate a co-rou
22990 74 69 6e 65 20 74 68 61 74 20 72 65 74 75 72 6e  tine that return
229a0 73 20 61 20 6e 65 77 20 72 6f 77 20 6f 66 0a 2a  s a new row of.*
229b0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
229c0 20 20 20 20 20 20 72 65 73 75 6c 74 73 20 65 61        results ea
229d0 63 68 20 74 69 6d 65 20 69 74 20 69 73 20 69 6e  ch time it is in
229e0 76 6f 6b 65 64 2e 20 20 54 68 65 20 65 6e 74 72  voked.  The entr
229f0 79 20 70 6f 69 6e 74 0a 2a 2a 20 20 20 20 20 20  y point.**      
22a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
22a10 66 20 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65  f the co-routine
22a20 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 72 65   is stored in re
22a30 67 69 73 74 65 72 20 70 44 65 73 74 2d 3e 69 53  gister pDest->iS
22a40 44 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  DParm..**.**    
22a50 20 53 52 54 5f 45 78 69 73 74 73 20 20 20 20 20   SRT_Exists     
22a60 20 53 74 6f 72 65 20 61 20 31 20 69 6e 20 6d 65   Store a 1 in me
22a70 6d 6f 72 79 20 63 65 6c 6c 20 70 44 65 73 74 2d  mory cell pDest-
22a80 3e 69 53 44 50 61 72 6d 20 69 66 20 74 68 65 20  >iSDParm if the 
22a90 72 65 73 75 6c 74 0a 2a 2a 20 20 20 20 20 20 20  result.**       
22aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65                se
22ab0 74 20 69 73 20 6e 6f 74 20 65 6d 70 74 79 2e 0a  t is not empty..
22ac0 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 44 69  **.**     SRT_Di
22ad0 73 63 61 72 64 20 20 20 20 20 54 68 72 6f 77 20  scard     Throw 
22ae0 74 68 65 20 72 65 73 75 6c 74 73 20 61 77 61 79  the results away
22af0 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20  .  This is used 
22b00 62 79 20 53 45 4c 45 43 54 0a 2a 2a 20 20 20 20  by SELECT.**    
22b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22b20 20 73 74 61 74 65 6d 65 6e 74 73 20 77 69 74 68   statements with
22b30 69 6e 20 74 72 69 67 67 65 72 73 20 77 68 6f 73  in triggers whos
22b40 65 20 6f 6e 6c 79 20 70 75 72 70 6f 73 65 20 69  e only purpose i
22b50 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  s.**            
22b60 20 20 20 20 20 20 20 20 20 74 68 65 20 73 69 64           the sid
22b70 65 2d 65 66 66 65 63 74 73 20 6f 66 20 66 75 6e  e-effects of fun
22b80 63 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  ctions..**.** Th
22b90 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
22ba0 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ns the number of
22bb0 20 65 72 72 6f 72 73 2e 20 20 49 66 20 61 6e 79   errors.  If any
22bc0 20 65 72 72 6f 72 73 20 61 72 65 0a 2a 2a 20 65   errors are.** e
22bd0 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 65 6e  ncountered, then
22be0 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20   an appropriate 
22bf0 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73  error message is
22c00 20 6c 65 66 74 20 69 6e 0a 2a 2a 20 70 50 61 72   left in.** pPar
22c10 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a  se->zErrMsg..**.
22c20 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
22c30 64 6f 65 73 20 4e 4f 54 20 66 72 65 65 20 74 68  does NOT free th
22c40 65 20 53 65 6c 65 63 74 20 73 74 72 75 63 74 75  e Select structu
22c50 72 65 20 70 61 73 73 65 64 20 69 6e 2e 20 20 54  re passed in.  T
22c60 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 66 75  he.** calling fu
22c70 6e 63 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f 20  nction needs to 
22c80 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a 69 6e 74 20  do that..*/.int 
22c90 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 0a 20  sqlite3Select(. 
22ca0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
22cb0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
22cc0 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
22cd0 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
22ce0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
22cf0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
22d00 74 20 62 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a  t being coded. *
22d10 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a  /.  SelectDest *
22d20 70 44 65 73 74 20 20 20 20 20 20 2f 2a 20 57 68  pDest      /* Wh
22d30 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 74 68  at to do with th
22d40 65 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20  e query results 
22d50 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a  */.){.  int i, j
22d60 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
22d70 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20  * Loop counters 
22d80 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  */.  WhereInfo *
22d90 70 57 49 6e 66 6f 3b 20 20 20 20 20 2f 2a 20 52  pWInfo;     /* R
22da0 65 74 75 72 6e 20 66 72 6f 6d 20 73 71 6c 69 74  eturn from sqlit
22db0 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 2a  e3WhereBegin() *
22dc0 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20  /.  Vdbe *v;    
22dd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
22de0 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  e virtual machin
22df0 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  e under construc
22e00 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 73  tion */.  int is
22e10 41 67 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  Agg;            
22e20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 73 65 6c   /* True for sel
22e30 65 63 74 20 6c 69 73 74 73 20 6c 69 6b 65 20 22  ect lists like "
22e40 63 6f 75 6e 74 28 2a 29 22 20 2a 2f 0a 20 20 45  count(*)" */.  E
22e50 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b  xprList *pEList;
22e60 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
22e70 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 65 78 74 72   columns to extr
22e80 61 63 74 2e 20 2a 2f 0a 20 20 53 72 63 4c 69 73  act. */.  SrcLis
22e90 74 20 2a 70 54 61 62 4c 69 73 74 3b 20 20 20 20  t *pTabList;    
22ea0 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c   /* List of tabl
22eb0 65 73 20 74 6f 20 73 65 6c 65 63 74 20 66 72 6f  es to select fro
22ec0 6d 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68  m */.  Expr *pWh
22ed0 65 72 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ere;          /*
22ee0 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
22ef0 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20  e.  May be NULL 
22f00 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
22f10 4f 72 64 65 72 42 79 3b 20 20 20 20 2f 2a 20 54  OrderBy;    /* T
22f20 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
22f30 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c  se.  May be NULL
22f40 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
22f50 70 47 72 6f 75 70 42 79 3b 20 20 20 20 2f 2a 20  pGroupBy;    /* 
22f60 54 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61  The GROUP BY cla
22f70 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c  use.  May be NUL
22f80 4c 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 48 61  L */.  Expr *pHa
22f90 76 69 6e 67 3b 20 20 20 20 20 20 20 20 20 2f 2a  ving;         /*
22fa0 20 54 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75   The HAVING clau
22fb0 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c  se.  May be NULL
22fc0 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 31   */.  int rc = 1
22fd0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
22fe0 56 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20  Value to return 
22ff0 66 72 6f 6d 20 74 68 69 73 20 66 75 6e 63 74 69  from this functi
23000 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  on */.  int addr
23010 53 6f 72 74 49 6e 64 65 78 3b 20 20 20 20 20 2f  SortIndex;     /
23020 2a 20 41 64 64 72 65 73 73 20 6f 66 20 61 6e 20  * Address of an 
23030 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
23040 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a   instruction */.
23050 20 20 44 69 73 74 69 6e 63 74 43 74 78 20 73 44    DistinctCtx sD
23060 69 73 74 69 6e 63 74 3b 20 2f 2a 20 49 6e 66 6f  istinct; /* Info
23070 20 6f 6e 20 68 6f 77 20 74 6f 20 63 6f 64 65 20   on how to code 
23080 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79  the DISTINCT key
23090 77 6f 72 64 20 2a 2f 0a 20 20 41 67 67 49 6e 66  word */.  AggInf
230a0 6f 20 73 41 67 67 49 6e 66 6f 3b 20 20 20 20 20  o sAggInfo;     
230b0 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20   /* Information 
230c0 75 73 65 64 20 62 79 20 61 67 67 72 65 67 61 74  used by aggregat
230d0 65 20 71 75 65 72 69 65 73 20 2a 2f 0a 20 20 69  e queries */.  i
230e0 6e 74 20 69 45 6e 64 3b 20 20 20 20 20 20 20 20  nt iEnd;        
230f0 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
23100 20 6f 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74   of the end of t
23110 68 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 73 71  he query */.  sq
23120 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20  lite3 *db;      
23130 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
23140 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
23150 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
23160 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a  TE_OMIT_EXPLAIN.
23170 20 20 69 6e 74 20 69 52 65 73 74 6f 72 65 53 65    int iRestoreSe
23180 6c 65 63 74 49 64 20 3d 20 70 50 61 72 73 65 2d  lectId = pParse-
23190 3e 69 53 65 6c 65 63 74 49 64 3b 0a 20 20 70 50  >iSelectId;.  pP
231a0 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 20  arse->iSelectId 
231b0 3d 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53  = pParse->iNextS
231c0 65 6c 65 63 74 49 64 2b 2b 3b 0a 23 65 6e 64 69  electId++;.#endi
231d0 66 0a 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65  f..  db = pParse
231e0 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 3d 3d 30  ->db;.  if( p==0
231f0 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
23200 69 6c 65 64 20 7c 7c 20 70 50 61 72 73 65 2d 3e  iled || pParse->
23210 6e 45 72 72 20 29 7b 0a 20 20 20 20 72 65 74 75  nErr ){.    retu
23220 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 1;.  }.  if( 
23230 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
23240 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
23250 53 45 4c 45 43 54 2c 20 30 2c 20 30 2c 20 30 29  SELECT, 0, 0, 0)
23260 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 6d   ) return 1;.  m
23270 65 6d 73 65 74 28 26 73 41 67 67 49 6e 66 6f 2c  emset(&sAggInfo,
23280 20 30 2c 20 73 69 7a 65 6f 66 28 73 41 67 67 49   0, sizeof(sAggI
23290 6e 66 6f 29 29 3b 0a 0a 20 20 69 66 28 20 49 67  nfo));..  if( Ig
232a0 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62 79 28 70  norableOrderby(p
232b0 44 65 73 74 29 20 29 7b 0a 20 20 20 20 61 73 73  Dest) ){.    ass
232c0 65 72 74 28 70 44 65 73 74 2d 3e 65 44 65 73 74  ert(pDest->eDest
232d0 3d 3d 53 52 54 5f 45 78 69 73 74 73 20 7c 7c 20  ==SRT_Exists || 
232e0 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52  pDest->eDest==SR
232f0 54 5f 55 6e 69 6f 6e 20 7c 7c 20 0a 20 20 20 20  T_Union || .    
23300 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e 65 44         pDest->eD
23310 65 73 74 3d 3d 53 52 54 5f 45 78 63 65 70 74 20  est==SRT_Except 
23320 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d  || pDest->eDest=
23330 3d 53 52 54 5f 44 69 73 63 61 72 64 29 3b 0a 20  =SRT_Discard);. 
23340 20 20 20 2f 2a 20 49 66 20 4f 52 44 45 52 20 42     /* If ORDER B
23350 59 20 6d 61 6b 65 73 20 6e 6f 20 64 69 66 66 65  Y makes no diffe
23360 72 65 6e 63 65 20 69 6e 20 74 68 65 20 6f 75 74  rence in the out
23370 70 75 74 20 74 68 65 6e 20 6e 65 69 74 68 65 72  put then neither
23380 20 64 6f 65 73 0a 20 20 20 20 2a 2a 20 44 49 53   does.    ** DIS
23390 54 49 4e 43 54 20 73 6f 20 69 74 20 63 61 6e 20  TINCT so it can 
233a0 62 65 20 72 65 6d 6f 76 65 64 20 74 6f 6f 2e 20  be removed too. 
233b0 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  */.    sqlite3Ex
233c0 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
233d0 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20   p->pOrderBy);. 
233e0 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d     p->pOrderBy =
233f0 20 30 3b 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c   0;.    p->selFl
23400 61 67 73 20 26 3d 20 7e 53 46 5f 44 69 73 74 69  ags &= ~SF_Disti
23410 6e 63 74 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  nct;.  }.  sqlit
23420 65 33 53 65 6c 65 63 74 50 72 65 70 28 70 50 61  e3SelectPrep(pPa
23430 72 73 65 2c 20 70 2c 20 30 29 3b 0a 20 20 70 4f  rse, p, 0);.  pO
23440 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64  rderBy = p->pOrd
23450 65 72 42 79 3b 0a 20 20 70 54 61 62 4c 69 73 74  erBy;.  pTabList
23460 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 45   = p->pSrc;.  pE
23470 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74  List = p->pEList
23480 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
23490 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  nErr || db->mall
234a0 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
234b0 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
234c0 0a 20 20 7d 0a 20 20 69 73 41 67 67 20 3d 20 28  .  }.  isAgg = (
234d0 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
234e0 5f 41 67 67 72 65 67 61 74 65 29 21 3d 30 3b 0a  _Aggregate)!=0;.
234f0 20 20 61 73 73 65 72 74 28 20 70 45 4c 69 73 74    assert( pEList
23500 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 42 65 67  !=0 );..  /* Beg
23510 69 6e 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f  in generating co
23520 64 65 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73  de..  */.  v = s
23530 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
23540 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d  arse);.  if( v==
23550 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f  0 ) goto select_
23560 65 6e 64 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 72  end;..  /* If wr
23570 69 74 69 6e 67 20 74 6f 20 6d 65 6d 6f 72 79 20  iting to memory 
23580 6f 72 20 67 65 6e 65 72 61 74 69 6e 67 20 61 20  or generating a 
23590 73 65 74 0a 20 20 2a 2a 20 6f 6e 6c 79 20 61 20  set.  ** only a 
235a0 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6d 61  single column ma
235b0 79 20 62 65 20 6f 75 74 70 75 74 2e 0a 20 20 2a  y be output..  *
235c0 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
235d0 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
235e0 20 69 66 28 20 63 68 65 63 6b 46 6f 72 4d 75 6c   if( checkForMul
235f0 74 69 43 6f 6c 75 6d 6e 53 65 6c 65 63 74 45 72  tiColumnSelectEr
23600 72 6f 72 28 70 50 61 72 73 65 2c 20 70 44 65 73  ror(pParse, pDes
23610 74 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  t, pEList->nExpr
23620 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65  ) ){.    goto se
23630 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 23 65  lect_end;.  }.#e
23640 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  ndif..  /* Gener
23650 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 6c 6c  ate code for all
23660 20 73 75 62 2d 71 75 65 72 69 65 73 20 69 6e 20   sub-queries in 
23670 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a  the FROM clause.
23680 20 20 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65    */.#if !define
23690 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  d(SQLITE_OMIT_SU
236a0 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69  BQUERY) || !defi
236b0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
236c0 56 49 45 57 29 0a 20 20 66 6f 72 28 69 3d 30 3b  VIEW).  for(i=0;
236d0 20 21 70 2d 3e 70 50 72 69 6f 72 20 26 26 20 69   !p->pPrior && i
236e0 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b  <pTabList->nSrc;
236f0 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63   i++){.    struc
23700 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
23710 70 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73  pItem = &pTabLis
23720 74 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 53 65 6c  t->a[i];.    Sel
23730 65 63 74 44 65 73 74 20 64 65 73 74 3b 0a 20 20  ectDest dest;.  
23740 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 20 3d    Select *pSub =
23750 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b   pItem->pSelect;
23760 0a 20 20 20 20 69 6e 74 20 69 73 41 67 67 53 75  .    int isAggSu
23770 62 3b 0a 0a 20 20 20 20 69 66 28 20 70 53 75 62  b;..    if( pSub
23780 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
23790 0a 20 20 20 20 2f 2a 20 53 6f 6d 65 74 69 6d 65  .    /* Sometime
237a0 73 20 74 68 65 20 63 6f 64 65 20 66 6f 72 20 61  s the code for a
237b0 20 73 75 62 71 75 65 72 79 20 77 69 6c 6c 20 62   subquery will b
237c0 65 20 67 65 6e 65 72 61 74 65 64 20 6d 6f 72 65  e generated more
237d0 20 74 68 61 6e 0a 20 20 20 20 2a 2a 20 6f 6e 63   than.    ** onc
237e0 65 2c 20 69 66 20 74 68 65 20 73 75 62 71 75 65  e, if the subque
237f0 72 79 20 69 73 20 70 61 72 74 20 6f 66 20 74 68  ry is part of th
23800 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69  e WHERE clause i
23810 6e 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2c 0a 20  n a LEFT JOIN,. 
23820 20 20 20 2a 2a 20 66 6f 72 20 65 78 61 6d 70 6c     ** for exampl
23830 65 2e 20 20 49 6e 20 74 68 61 74 20 63 61 73 65  e.  In that case
23840 2c 20 64 6f 20 6e 6f 74 20 72 65 67 65 6e 65 72  , do not regener
23850 61 74 65 20 74 68 65 20 63 6f 64 65 20 74 6f 20  ate the code to 
23860 6d 61 6e 69 66 65 73 74 0a 20 20 20 20 2a 2a 20  manifest.    ** 
23870 61 20 76 69 65 77 20 6f 72 20 74 68 65 20 63 6f  a view or the co
23880 2d 72 6f 75 74 69 6e 65 20 74 6f 20 69 6d 70 6c  -routine to impl
23890 65 6d 65 6e 74 20 61 20 76 69 65 77 2e 20 20 54  ement a view.  T
238a0 68 65 20 66 69 72 73 74 20 69 6e 73 74 61 6e 63  he first instanc
238b0 65 0a 20 20 20 20 2a 2a 20 69 73 20 73 75 66 66  e.    ** is suff
238c0 69 63 69 65 6e 74 2c 20 74 68 6f 75 67 68 20 74  icient, though t
238d0 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20 74 6f  he subroutine to
238e0 20 6d 61 6e 69 66 65 73 74 20 74 68 65 20 76 69   manifest the vi
238f0 65 77 20 64 6f 65 73 20 6e 65 65 64 0a 20 20 20  ew does need.   
23900 20 2a 2a 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65   ** to be invoke
23910 64 20 61 67 61 69 6e 2e 20 2a 2f 0a 20 20 20 20  d again. */.    
23920 69 66 28 20 70 49 74 65 6d 2d 3e 61 64 64 72 46  if( pItem->addrF
23930 69 6c 6c 53 75 62 20 29 7b 0a 20 20 20 20 20 20  illSub ){.      
23940 69 66 28 20 70 49 74 65 6d 2d 3e 76 69 61 43 6f  if( pItem->viaCo
23950 72 6f 75 74 69 6e 65 3d 3d 30 20 29 7b 0a 20 20  routine==0 ){.  
23960 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
23970 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
23980 73 75 62 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52  sub, pItem->regR
23990 65 74 75 72 6e 2c 20 70 49 74 65 6d 2d 3e 61 64  eturn, pItem->ad
239a0 64 72 46 69 6c 6c 53 75 62 29 3b 0a 20 20 20 20  drFillSub);.    
239b0 20 20 7d 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e    }.      contin
239c0 75 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ue;.    }..    /
239d0 2a 20 49 6e 63 72 65 6d 65 6e 74 20 50 61 72 73  * Increment Pars
239e0 65 2e 6e 48 65 69 67 68 74 20 62 79 20 74 68 65  e.nHeight by the
239f0 20 68 65 69 67 68 74 20 6f 66 20 74 68 65 20 6c   height of the l
23a00 61 72 67 65 73 74 20 65 78 70 72 65 73 73 69 6f  argest expressio
23a10 6e 0a 20 20 20 20 2a 2a 20 74 72 65 65 20 72 65  n.    ** tree re
23a20 66 65 72 72 65 64 20 74 6f 20 62 79 20 74 68 69  ferred to by thi
23a30 73 2c 20 74 68 65 20 70 61 72 65 6e 74 20 73 65  s, the parent se
23a40 6c 65 63 74 2e 20 54 68 65 20 63 68 69 6c 64 20  lect. The child 
23a50 73 65 6c 65 63 74 0a 20 20 20 20 2a 2a 20 6d 61  select.    ** ma
23a60 79 20 63 6f 6e 74 61 69 6e 20 65 78 70 72 65 73  y contain expres
23a70 73 69 6f 6e 20 74 72 65 65 73 20 6f 66 20 61 74  sion trees of at
23a80 20 6d 6f 73 74 0a 20 20 20 20 2a 2a 20 28 53 51   most.    ** (SQ
23a90 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45  LITE_MAX_EXPR_DE
23aa0 50 54 48 2d 50 61 72 73 65 2e 6e 48 65 69 67 68  PTH-Parse.nHeigh
23ab0 74 29 20 68 65 69 67 68 74 2e 20 54 68 69 73 20  t) height. This 
23ac0 69 73 20 61 20 62 69 74 0a 20 20 20 20 2a 2a 20  is a bit.    ** 
23ad0 6d 6f 72 65 20 63 6f 6e 73 65 72 76 61 74 69 76  more conservativ
23ae0 65 20 74 68 61 6e 20 6e 65 63 65 73 73 61 72 79  e than necessary
23af0 2c 20 62 75 74 20 6d 75 63 68 20 65 61 73 69 65  , but much easie
23b00 72 20 74 68 61 6e 20 65 6e 66 6f 72 63 69 6e 67  r than enforcing
23b10 0a 20 20 20 20 2a 2a 20 61 6e 20 65 78 61 63 74  .    ** an exact
23b20 20 6c 69 6d 69 74 2e 0a 20 20 20 20 2a 2f 0a 20   limit..    */. 
23b30 20 20 20 70 50 61 72 73 65 2d 3e 6e 48 65 69 67     pParse->nHeig
23b40 68 74 20 2b 3d 20 73 71 6c 69 74 65 33 53 65 6c  ht += sqlite3Sel
23b50 65 63 74 45 78 70 72 48 65 69 67 68 74 28 70 29  ectExprHeight(p)
23b60 3b 0a 0a 20 20 20 20 69 73 41 67 67 53 75 62 20  ;..    isAggSub 
23b70 3d 20 28 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67  = (pSub->selFlag
23b80 73 20 26 20 53 46 5f 41 67 67 72 65 67 61 74 65  s & SF_Aggregate
23b90 29 21 3d 30 3b 0a 20 20 20 20 69 66 28 20 66 6c  )!=0;.    if( fl
23ba0 61 74 74 65 6e 53 75 62 71 75 65 72 79 28 70 50  attenSubquery(pP
23bb0 61 72 73 65 2c 20 70 2c 20 69 2c 20 69 73 41 67  arse, p, i, isAg
23bc0 67 2c 20 69 73 41 67 67 53 75 62 29 20 29 7b 0a  g, isAggSub) ){.
23bd0 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 73 75        /* This su
23be0 62 71 75 65 72 79 20 63 61 6e 20 62 65 20 61 62  bquery can be ab
23bf0 73 6f 72 62 65 64 20 69 6e 74 6f 20 69 74 73 20  sorbed into its 
23c00 70 61 72 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 20  parent. */.     
23c10 20 69 66 28 20 69 73 41 67 67 53 75 62 20 29 7b   if( isAggSub ){
23c20 0a 20 20 20 20 20 20 20 20 69 73 41 67 67 20 3d  .        isAgg =
23c30 20 31 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 73   1;.        p->s
23c40 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 41 67  elFlags |= SF_Ag
23c50 67 72 65 67 61 74 65 3b 0a 20 20 20 20 20 20 7d  gregate;.      }
23c60 0a 20 20 20 20 20 20 69 20 3d 20 2d 31 3b 0a 20  .      i = -1;. 
23c70 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54 61     }else if( pTa
23c80 62 4c 69 73 74 2d 3e 6e 53 72 63 3d 3d 31 20 26  bList->nSrc==1 &
23c90 26 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  & (p->selFlags &
23ca0 20 53 46 5f 4d 61 74 65 72 69 61 6c 69 7a 65 29   SF_Materialize)
23cb0 3d 3d 30 0a 20 20 20 20 20 20 26 26 20 4f 70 74  ==0.      && Opt
23cc0 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64  imizationEnabled
23cd0 28 64 62 2c 20 53 51 4c 49 54 45 5f 53 75 62 71  (db, SQLITE_Subq
23ce0 43 6f 72 6f 75 74 69 6e 65 29 0a 20 20 20 20 29  Coroutine).    )
23cf0 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6d 70 6c 65  {.      /* Imple
23d00 6d 65 6e 74 20 61 20 63 6f 2d 72 6f 75 74 69 6e  ment a co-routin
23d10 65 20 74 68 61 74 20 77 69 6c 6c 20 72 65 74 75  e that will retu
23d20 72 6e 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20  rn a single row 
23d30 6f 66 20 74 68 65 20 72 65 73 75 6c 74 0a 20 20  of the result.  
23d40 20 20 20 20 2a 2a 20 73 65 74 20 6f 6e 20 65 61      ** set on ea
23d50 63 68 20 69 6e 76 6f 63 61 74 69 6f 6e 2e 0a 20  ch invocation.. 
23d60 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e       */.      in
23d70 74 20 61 64 64 72 54 6f 70 3b 0a 20 20 20 20 20  t addrTop;.     
23d80 20 69 6e 74 20 61 64 64 72 45 6f 66 3b 0a 20 20   int addrEof;.  
23d90 20 20 20 20 70 49 74 65 6d 2d 3e 72 65 67 52 65      pItem->regRe
23da0 74 75 72 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d  turn = ++pParse-
23db0 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 61 64 64  >nMem;.      add
23dc0 72 45 6f 66 20 3d 20 2b 2b 70 50 61 72 73 65 2d  rEof = ++pParse-
23dd0 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 2f 2a 20  >nMem;.      /* 
23de0 42 65 66 6f 72 65 20 63 6f 64 69 6e 67 20 74 68  Before coding th
23df0 65 20 4f 50 5f 47 6f 74 6f 20 74 6f 20 6a 75 6d  e OP_Goto to jum
23e00 70 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  p to the start o
23e10 66 20 74 68 65 20 6d 61 69 6e 20 72 6f 75 74 69  f the main routi
23e20 6e 65 2c 0a 20 20 20 20 20 20 2a 2a 20 65 6e 73  ne,.      ** ens
23e30 75 72 65 20 74 68 61 74 20 74 68 65 20 6a 75 6d  ure that the jum
23e40 70 20 74 6f 20 74 68 65 20 76 65 72 69 66 79 2d  p to the verify-
23e50 73 63 68 65 6d 61 20 72 6f 75 74 69 6e 65 20 68  schema routine h
23e60 61 73 20 61 6c 72 65 61 64 79 0a 20 20 20 20 20  as already.     
23e70 20 2a 2a 20 62 65 65 6e 20 63 6f 64 65 64 2e 20   ** been coded. 
23e80 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20 76  Otherwise, the v
23e90 65 72 69 66 79 2d 73 63 68 65 6d 61 20 77 6f 75  erify-schema wou
23ea0 6c 64 20 6c 69 6b 65 6c 79 20 62 65 20 63 6f 64  ld likely be cod
23eb0 65 64 20 61 73 20 0a 20 20 20 20 20 20 2a 2a 20  ed as .      ** 
23ec0 70 61 72 74 20 6f 66 20 74 68 65 20 63 6f 2d 72  part of the co-r
23ed0 6f 75 74 69 6e 65 2e 20 49 66 20 74 68 65 20 6d  outine. If the m
23ee0 61 69 6e 20 72 6f 75 74 69 6e 65 20 74 68 65 6e  ain routine then
23ef0 20 61 63 63 65 73 73 65 64 20 74 68 65 20 0a 20   accessed the . 
23f00 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65       ** database
23f10 20 62 65 66 6f 72 65 20 69 6e 76 6f 6b 69 6e 67   before invoking
23f20 20 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20   the co-routine 
23f30 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 74 69  for the first ti
23f40 6d 65 20 28 66 6f 72 20 0a 20 20 20 20 20 20 2a  me (for .      *
23f50 2a 20 65 78 61 6d 70 6c 65 20 74 6f 20 69 6e 69  * example to ini
23f60 74 69 61 6c 69 7a 65 20 61 20 4c 49 4d 49 54 20  tialize a LIMIT 
23f70 72 65 67 69 73 74 65 72 20 66 72 6f 6d 20 61 20  register from a 
23f80 73 75 62 2d 73 65 6c 65 63 74 29 2c 20 69 74 20  sub-select), it 
23f90 77 6f 75 6c 64 20 0a 20 20 20 20 20 20 2a 2a 20  would .      ** 
23fa0 62 65 20 64 6f 69 6e 67 20 73 6f 20 77 69 74 68  be doing so with
23fb0 6f 75 74 20 68 61 76 69 6e 67 20 76 65 72 69 66  out having verif
23fc0 69 65 64 20 74 68 65 20 73 63 68 65 6d 61 20 76  ied the schema v
23fd0 65 72 73 69 6f 6e 20 61 6e 64 20 6f 62 74 61 69  ersion and obtai
23fe0 6e 65 64 20 0a 20 20 20 20 20 20 2a 2a 20 74 68  ned .      ** th
23ff0 65 20 72 65 71 75 69 72 65 64 20 64 62 20 6c 6f  e required db lo
24000 63 6b 73 2e 20 53 65 65 20 74 69 63 6b 65 74 20  cks. See ticket 
24010 64 36 62 33 36 62 65 33 38 2e 20 20 2a 2f 0a 20  d6b36be38.  */. 
24020 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65       sqlite3Code
24030 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61  VerifySchema(pPa
24040 72 73 65 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20  rse, -1);.      
24050 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
24060 30 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20  0(v, OP_Goto);. 
24070 20 20 20 20 20 61 64 64 72 54 6f 70 20 3d 20 73       addrTop = s
24080 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
24090 28 76 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64  (v, OP_OpenPseud
240a0 6f 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f  o, pItem->iCurso
240b0 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  r);.      sqlite
240c0 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
240d0 20 31 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43   1);.      VdbeC
240e0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 63 6f 72 6f  omment((v, "coro
240f0 75 74 69 6e 65 20 66 6f 72 20 25 73 22 2c 20 70  utine for %s", p
24100 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d  Item->pTab->zNam
24110 65 29 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d  e));.      pItem
24120 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 3d 20  ->addrFillSub = 
24130 61 64 64 72 54 6f 70 3b 0a 20 20 20 20 20 20 73  addrTop;.      s
24140 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
24150 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
24160 30 2c 20 61 64 64 72 45 6f 66 29 3b 0a 20 20 20  0, addrEof);.   
24170 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
24180 61 6e 67 65 50 35 28 76 2c 20 31 29 3b 0a 20 20  angeP5(v, 1);.  
24190 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
241a0 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c  tDestInit(&dest,
241b0 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20   SRT_Coroutine, 
241c0 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e  pItem->regReturn
241d0 29 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e  );.      explain
241e0 53 65 74 49 6e 74 65 67 65 72 28 70 49 74 65 6d  SetInteger(pItem
241f0 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 28 75 38  ->iSelectId, (u8
24200 29 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65  )pParse->iNextSe
24210 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 73  lectId);.      s
24220 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
24230 72 73 65 2c 20 70 53 75 62 2c 20 26 64 65 73 74  rse, pSub, &dest
24240 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  );.      pItem->
24250 70 54 61 62 2d 3e 6e 52 6f 77 45 73 74 20 3d 20  pTab->nRowEst = 
24260 28 75 6e 73 69 67 6e 65 64 29 70 53 75 62 2d 3e  (unsigned)pSub->
24270 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20  nSelectRow;.    
24280 20 20 70 49 74 65 6d 2d 3e 76 69 61 43 6f 72 6f    pItem->viaCoro
24290 75 74 69 6e 65 20 3d 20 31 3b 0a 20 20 20 20 20  utine = 1;.     
242a0 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
242b0 67 65 50 32 28 76 2c 20 61 64 64 72 54 6f 70 2c  geP2(v, addrTop,
242c0 20 64 65 73 74 2e 69 53 64 73 74 29 3b 0a 20 20   dest.iSdst);.  
242d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
242e0 68 61 6e 67 65 50 33 28 76 2c 20 61 64 64 72 54  hangeP3(v, addrT
242f0 6f 70 2c 20 64 65 73 74 2e 6e 53 64 73 74 29 3b  op, dest.nSdst);
24300 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
24310 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
24320 6e 74 65 67 65 72 2c 20 31 2c 20 61 64 64 72 45  nteger, 1, addrE
24330 6f 66 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  of);.      sqlit
24340 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
24350 4f 50 5f 59 69 65 6c 64 2c 20 70 49 74 65 6d 2d  OP_Yield, pItem-
24360 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a 20 20 20  >regReturn);.   
24370 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
24380 76 2c 20 22 65 6e 64 20 25 73 22 2c 20 70 49 74  v, "end %s", pIt
24390 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  em->pTab->zName)
243a0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
243b0 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
243c0 61 64 64 72 54 6f 70 2d 31 29 3b 0a 20 20 20 20  addrTop-1);.    
243d0 20 20 73 71 6c 69 74 65 33 43 6c 65 61 72 54 65    sqlite3ClearTe
243e0 6d 70 52 65 67 43 61 63 68 65 28 70 50 61 72 73  mpRegCache(pPars
243f0 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  e);.    }else{. 
24400 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
24410 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68   a subroutine th
24420 61 74 20 77 69 6c 6c 20 66 69 6c 6c 20 61 6e 20  at will fill an 
24430 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20  ephemeral table 
24440 77 69 74 68 0a 20 20 20 20 20 20 2a 2a 20 74 68  with.      ** th
24450 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 69  e content of thi
24460 73 20 73 75 62 71 75 65 72 79 2e 20 20 70 49 74  s subquery.  pIt
24470 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20  em->addrFillSub 
24480 77 69 6c 6c 20 70 6f 69 6e 74 0a 20 20 20 20 20  will point.     
24490 20 2a 2a 20 74 6f 20 74 68 65 20 61 64 64 72 65   ** to the addre
244a0 73 73 20 6f 66 20 74 68 65 20 67 65 6e 65 72 61  ss of the genera
244b0 74 65 64 20 73 75 62 72 6f 75 74 69 6e 65 2e 20  ted subroutine. 
244c0 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72   pItem->regRetur
244d0 6e 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 61 20  n.      ** is a 
244e0 72 65 67 69 73 74 65 72 20 61 6c 6c 6f 63 61 74  register allocat
244f0 65 64 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 73  ed to hold the s
24500 75 62 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  ubroutine return
24510 20 61 64 64 72 65 73 73 0a 20 20 20 20 20 20 2a   address.      *
24520 2f 0a 20 20 20 20 20 20 69 6e 74 20 74 6f 70 41  /.      int topA
24530 64 64 72 3b 0a 20 20 20 20 20 20 69 6e 74 20 6f  ddr;.      int o
24540 6e 63 65 41 64 64 72 20 3d 20 30 3b 0a 20 20 20  nceAddr = 0;.   
24550 20 20 20 69 6e 74 20 72 65 74 41 64 64 72 3b 0a     int retAddr;.
24560 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
24570 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62  tem->addrFillSub
24580 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 49 74  ==0 );.      pIt
24590 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 20 3d 20  em->regReturn = 
245a0 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
245b0 20 20 20 20 20 20 74 6f 70 41 64 64 72 20 3d 20        topAddr = 
245c0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
245d0 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
245e0 20 30 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65   0, pItem->regRe
245f0 74 75 72 6e 29 3b 0a 20 20 20 20 20 20 70 49 74  turn);.      pIt
24600 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20  em->addrFillSub 
24610 3d 20 74 6f 70 41 64 64 72 2b 31 3b 0a 20 20 20  = topAddr+1;.   
24620 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65     VdbeNoopComme
24630 6e 74 28 28 76 2c 20 22 6d 61 74 65 72 69 61 6c  nt((v, "material
24640 69 7a 65 20 25 73 22 2c 20 70 49 74 65 6d 2d 3e  ize %s", pItem->
24650 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20  pTab->zName));. 
24660 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
24670 69 73 43 6f 72 72 65 6c 61 74 65 64 3d 3d 30 20  isCorrelated==0 
24680 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66  ){.        /* If
24690 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73   the subquery is
246a0 20 6e 6f 74 20 63 6f 72 72 65 6c 61 74 65 64 20   not correlated 
246b0 61 6e 64 20 69 66 20 77 65 20 61 72 65 20 6e 6f  and if we are no
246c0 74 20 69 6e 73 69 64 65 20 6f 66 0a 20 20 20 20  t inside of.    
246d0 20 20 20 20 2a 2a 20 61 20 74 72 69 67 67 65 72      ** a trigger
246e0 2c 20 74 68 65 6e 20 77 65 20 6f 6e 6c 79 20 6e  , then we only n
246f0 65 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74  eed to compute t
24700 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
24710 73 75 62 71 75 65 72 79 0a 20 20 20 20 20 20 20  subquery.       
24720 20 2a 2a 20 6f 6e 63 65 2e 20 2a 2f 0a 20 20 20   ** once. */.   
24730 20 20 20 20 20 6f 6e 63 65 41 64 64 72 20 3d 20       onceAddr = 
24740 73 71 6c 69 74 65 33 43 6f 64 65 4f 6e 63 65 28  sqlite3CodeOnce(
24750 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 7d  pParse);.      }
24760 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65  .      sqlite3Se
24770 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65  lectDestInit(&de
24780 73 74 2c 20 53 52 54 5f 45 70 68 65 6d 54 61 62  st, SRT_EphemTab
24790 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  , pItem->iCursor
247a0 29 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e  );.      explain
247b0 53 65 74 49 6e 74 65 67 65 72 28 70 49 74 65 6d  SetInteger(pItem
247c0 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 28 75 38  ->iSelectId, (u8
247d0 29 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65  )pParse->iNextSe
247e0 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 73  lectId);.      s
247f0 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
24800 72 73 65 2c 20 70 53 75 62 2c 20 26 64 65 73 74  rse, pSub, &dest
24810 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  );.      pItem->
24820 70 54 61 62 2d 3e 6e 52 6f 77 45 73 74 20 3d 20  pTab->nRowEst = 
24830 28 75 6e 73 69 67 6e 65 64 29 70 53 75 62 2d 3e  (unsigned)pSub->
24840 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20  nSelectRow;.    
24850 20 20 69 66 28 20 6f 6e 63 65 41 64 64 72 20 29    if( onceAddr )
24860 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
24870 48 65 72 65 28 76 2c 20 6f 6e 63 65 41 64 64 72  Here(v, onceAddr
24880 29 3b 0a 20 20 20 20 20 20 72 65 74 41 64 64 72  );.      retAddr
24890 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
248a0 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72  dOp1(v, OP_Retur
248b0 6e 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74  n, pItem->regRet
248c0 75 72 6e 29 3b 0a 20 20 20 20 20 20 56 64 62 65  urn);.      Vdbe
248d0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6e 64  Comment((v, "end
248e0 20 25 73 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61   %s", pItem->pTa
248f0 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20  b->zName));.    
24900 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
24910 6e 67 65 50 31 28 76 2c 20 74 6f 70 41 64 64 72  ngeP1(v, topAddr
24920 2c 20 72 65 74 41 64 64 72 29 3b 0a 20 20 20 20  , retAddr);.    
24930 20 20 73 71 6c 69 74 65 33 43 6c 65 61 72 54 65    sqlite3ClearTe
24940 6d 70 52 65 67 43 61 63 68 65 28 70 50 61 72 73  mpRegCache(pPars
24950 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  e);.    }.    if
24960 28 20 2f 2a 70 50 61 72 73 65 2d 3e 6e 45 72 72  ( /*pParse->nErr
24970 20 7c 7c 2a 2f 20 64 62 2d 3e 6d 61 6c 6c 6f 63   ||*/ db->malloc
24980 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20  Failed ){.      
24990 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
249a0 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73  .    }.    pPars
249b0 65 2d 3e 6e 48 65 69 67 68 74 20 2d 3d 20 73 71  e->nHeight -= sq
249c0 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 72 48  lite3SelectExprH
249d0 65 69 67 68 74 28 70 29 3b 0a 20 20 20 20 70 54  eight(p);.    pT
249e0 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63  abList = p->pSrc
249f0 3b 0a 20 20 20 20 69 66 28 20 21 49 67 6e 6f 72  ;.    if( !Ignor
24a00 61 62 6c 65 4f 72 64 65 72 62 79 28 70 44 65 73  ableOrderby(pDes
24a10 74 29 20 29 7b 0a 20 20 20 20 20 20 70 4f 72 64  t) ){.      pOrd
24a20 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72  erBy = p->pOrder
24a30 42 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  By;.    }.  }.  
24a40 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69  pEList = p->pELi
24a50 73 74 3b 0a 23 65 6e 64 69 66 0a 20 20 70 57 68  st;.#endif.  pWh
24a60 65 72 65 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b  ere = p->pWhere;
24a70 0a 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d  .  pGroupBy = p-
24a80 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 70 48 61  >pGroupBy;.  pHa
24a90 76 69 6e 67 20 3d 20 70 2d 3e 70 48 61 76 69 6e  ving = p->pHavin
24aa0 67 3b 0a 20 20 73 44 69 73 74 69 6e 63 74 2e 69  g;.  sDistinct.i
24ab0 73 54 6e 63 74 20 3d 20 28 70 2d 3e 73 65 6c 46  sTnct = (p->selF
24ac0 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e  lags & SF_Distin
24ad0 63 74 29 21 3d 30 3b 0a 0a 23 69 66 6e 64 65 66  ct)!=0;..#ifndef
24ae0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d   SQLITE_OMIT_COM
24af0 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 20 20 2f  POUND_SELECT.  /
24b00 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 72  * If there is ar
24b10 65 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20  e a sequence of 
24b20 71 75 65 72 69 65 73 2c 20 64 6f 20 74 68 65 20  queries, do the 
24b30 65 61 72 6c 69 65 72 20 6f 6e 65 73 20 66 69 72  earlier ones fir
24b40 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  st..  */.  if( p
24b50 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20  ->pPrior ){.    
24b60 69 66 28 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73  if( p->pRightmos
24b70 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 53 65  t==0 ){.      Se
24b80 6c 65 63 74 20 2a 70 4c 6f 6f 70 2c 20 2a 70 52  lect *pLoop, *pR
24b90 69 67 68 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  ight = 0;.      
24ba0 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20  int cnt = 0;.   
24bb0 20 20 20 69 6e 74 20 6d 78 53 65 6c 65 63 74 3b     int mxSelect;
24bc0 0a 20 20 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70  .      for(pLoop
24bd0 3d 70 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70  =p; pLoop; pLoop
24be0 3d 70 4c 6f 6f 70 2d 3e 70 50 72 69 6f 72 2c 20  =pLoop->pPrior, 
24bf0 63 6e 74 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  cnt++){.        
24c00 70 4c 6f 6f 70 2d 3e 70 52 69 67 68 74 6d 6f 73  pLoop->pRightmos
24c10 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 70  t = p;.        p
24c20 4c 6f 6f 70 2d 3e 70 4e 65 78 74 20 3d 20 70 52  Loop->pNext = pR
24c30 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 70 52  ight;.        pR
24c40 69 67 68 74 20 3d 20 70 4c 6f 6f 70 3b 0a 20 20  ight = pLoop;.  
24c50 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 78 53 65      }.      mxSe
24c60 6c 65 63 74 20 3d 20 64 62 2d 3e 61 4c 69 6d 69  lect = db->aLimi
24c70 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43  t[SQLITE_LIMIT_C
24c80 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 5d 3b  OMPOUND_SELECT];
24c90 0a 20 20 20 20 20 20 69 66 28 20 6d 78 53 65 6c  .      if( mxSel
24ca0 65 63 74 20 26 26 20 63 6e 74 3e 6d 78 53 65 6c  ect && cnt>mxSel
24cb0 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ect ){.        s
24cc0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
24cd0 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79  Parse, "too many
24ce0 20 74 65 72 6d 73 20 69 6e 20 63 6f 6d 70 6f 75   terms in compou
24cf0 6e 64 20 53 45 4c 45 43 54 22 29 3b 0a 20 20 20  nd SELECT");.   
24d00 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74       goto select
24d10 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _end;.      }.  
24d20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 6d 75 6c    }.    rc = mul
24d30 74 69 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  tiSelect(pParse,
24d40 20 70 2c 20 70 44 65 73 74 29 3b 0a 20 20 20 20   p, pDest);.    
24d50 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65  explainSetIntege
24d60 72 28 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63  r(pParse->iSelec
24d70 74 49 64 2c 20 69 52 65 73 74 6f 72 65 53 65 6c  tId, iRestoreSel
24d80 65 63 74 49 64 29 3b 0a 20 20 20 20 72 65 74 75  ectId);.    retu
24d90 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69  rn rc;.  }.#endi
24da0 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  f..  /* If there
24db0 20 69 73 20 62 6f 74 68 20 61 20 47 52 4f 55 50   is both a GROUP
24dc0 20 42 59 20 61 6e 64 20 61 6e 20 4f 52 44 45 52   BY and an ORDER
24dd0 20 42 59 20 63 6c 61 75 73 65 20 61 6e 64 20 74   BY clause and t
24de0 68 65 79 20 61 72 65 0a 20 20 2a 2a 20 69 64 65  hey are.  ** ide
24df0 6e 74 69 63 61 6c 2c 20 74 68 65 6e 20 64 69 73  ntical, then dis
24e00 61 62 6c 65 20 74 68 65 20 4f 52 44 45 52 20 42  able the ORDER B
24e10 59 20 63 6c 61 75 73 65 20 73 69 6e 63 65 20 74  Y clause since t
24e20 68 65 20 47 52 4f 55 50 20 42 59 0a 20 20 2a 2a  he GROUP BY.  **
24e30 20 77 69 6c 6c 20 63 61 75 73 65 20 65 6c 65 6d   will cause elem
24e40 65 6e 74 73 20 74 6f 20 63 6f 6d 65 20 6f 75 74  ents to come out
24e50 20 69 6e 20 74 68 65 20 63 6f 72 72 65 63 74 20   in the correct 
24e60 6f 72 64 65 72 2e 20 20 54 68 69 73 20 69 73 0a  order.  This is.
24e70 20 20 2a 2a 20 61 6e 20 6f 70 74 69 6d 69 7a 61    ** an optimiza
24e80 74 69 6f 6e 20 2d 20 74 68 65 20 63 6f 72 72 65  tion - the corre
24e90 63 74 20 61 6e 73 77 65 72 20 73 68 6f 75 6c 64  ct answer should
24ea0 20 72 65 73 75 6c 74 20 72 65 67 61 72 64 6c 65   result regardle
24eb0 73 73 2e 0a 20 20 2a 2a 20 55 73 65 20 74 68 65  ss..  ** Use the
24ec0 20 53 51 4c 49 54 45 5f 47 72 6f 75 70 42 79 4f   SQLITE_GroupByO
24ed0 72 64 65 72 20 66 6c 61 67 20 77 69 74 68 20 53  rder flag with S
24ee0 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f  QLITE_TESTCTRL_O
24ef0 50 54 49 4d 49 5a 45 52 0a 20 20 2a 2a 20 74 6f  PTIMIZER.  ** to
24f00 20 64 69 73 61 62 6c 65 20 74 68 69 73 20 6f 70   disable this op
24f10 74 69 6d 69 7a 61 74 69 6f 6e 20 66 6f 72 20 74  timization for t
24f20 65 73 74 69 6e 67 20 70 75 72 70 6f 73 65 73 2e  esting purposes.
24f30 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69  .  */.  if( sqli
24f40 74 65 33 45 78 70 72 4c 69 73 74 43 6f 6d 70 61  te3ExprListCompa
24f50 72 65 28 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20  re(p->pGroupBy, 
24f60 70 4f 72 64 65 72 42 79 2c 20 2d 31 29 3d 3d 30  pOrderBy, -1)==0
24f70 0a 20 20 20 20 20 20 20 20 20 26 26 20 4f 70 74  .         && Opt
24f80 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64  imizationEnabled
24f90 28 64 62 2c 20 53 51 4c 49 54 45 5f 47 72 6f 75  (db, SQLITE_Grou
24fa0 70 42 79 4f 72 64 65 72 29 20 29 7b 0a 20 20 20  pByOrder) ){.   
24fb0 20 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20   pOrderBy = 0;. 
24fc0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
24fd0 71 75 65 72 79 20 69 73 20 44 49 53 54 49 4e 43  query is DISTINC
24fe0 54 20 77 69 74 68 20 61 6e 20 4f 52 44 45 52 20  T with an ORDER 
24ff0 42 59 20 62 75 74 20 69 73 20 6e 6f 74 20 61 6e  BY but is not an
25000 20 61 67 67 72 65 67 61 74 65 2c 20 61 6e 64 20   aggregate, and 
25010 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 73 65 6c  .  ** if the sel
25020 65 63 74 2d 6c 69 73 74 20 69 73 20 74 68 65 20  ect-list is the 
25030 73 61 6d 65 20 61 73 20 74 68 65 20 4f 52 44 45  same as the ORDE
25040 52 20 42 59 20 6c 69 73 74 2c 20 74 68 65 6e 20  R BY list, then 
25050 74 68 69 73 20 71 75 65 72 79 0a 20 20 2a 2a 20  this query.  ** 
25060 63 61 6e 20 62 65 20 72 65 77 72 69 74 74 65 6e  can be rewritten
25070 20 61 73 20 61 20 47 52 4f 55 50 20 42 59 2e 20   as a GROUP BY. 
25080 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
25090 74 68 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  this:.  **.  ** 
250a0 20 20 20 20 53 45 4c 45 43 54 20 44 49 53 54 49      SELECT DISTI
250b0 4e 43 54 20 78 79 7a 20 46 52 4f 4d 20 2e 2e 2e  NCT xyz FROM ...
250c0 20 4f 52 44 45 52 20 42 59 20 78 79 7a 0a 20 20   ORDER BY xyz.  
250d0 2a 2a 0a 20 20 2a 2a 20 69 73 20 74 72 61 6e 73  **.  ** is trans
250e0 66 6f 72 6d 65 64 20 74 6f 3a 0a 20 20 2a 2a 0a  formed to:.  **.
250f0 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20    **     SELECT 
25100 78 79 7a 20 46 52 4f 4d 20 2e 2e 2e 20 47 52 4f  xyz FROM ... GRO
25110 55 50 20 42 59 20 78 79 7a 0a 20 20 2a 2a 0a 20  UP BY xyz.  **. 
25120 20 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 66   ** The second f
25130 6f 72 6d 20 69 73 20 70 72 65 66 65 72 72 65 64  orm is preferred
25140 20 61 73 20 61 20 73 69 6e 67 6c 65 20 69 6e 64   as a single ind
25150 65 78 20 28 6f 72 20 74 65 6d 70 2d 74 61 62 6c  ex (or temp-tabl
25160 65 29 20 6d 61 79 20 62 65 20 0a 20 20 2a 2a 20  e) may be .  ** 
25170 75 73 65 64 20 66 6f 72 20 62 6f 74 68 20 74 68  used for both th
25180 65 20 4f 52 44 45 52 20 42 59 20 61 6e 64 20 44  e ORDER BY and D
25190 49 53 54 49 4e 43 54 20 70 72 6f 63 65 73 73 69  ISTINCT processi
251a0 6e 67 2e 20 41 73 20 6f 72 69 67 69 6e 61 6c 6c  ng. As originall
251b0 79 20 0a 20 20 2a 2a 20 77 72 69 74 74 65 6e 20  y .  ** written 
251c0 74 68 65 20 71 75 65 72 79 20 6d 75 73 74 20 75  the query must u
251d0 73 65 20 61 20 74 65 6d 70 2d 74 61 62 6c 65 20  se a temp-table 
251e0 66 6f 72 20 61 74 20 6c 65 61 73 74 20 6f 6e 65  for at least one
251f0 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 0a 20   of the ORDER . 
25200 20 2a 2a 20 42 59 20 61 6e 64 20 44 49 53 54 49   ** BY and DISTI
25210 4e 43 54 2c 20 61 6e 64 20 61 6e 20 69 6e 64 65  NCT, and an inde
25220 78 20 6f 72 20 73 65 70 61 72 61 74 65 20 74 65  x or separate te
25230 6d 70 2d 74 61 62 6c 65 20 66 6f 72 20 74 68 65  mp-table for the
25240 20 6f 74 68 65 72 2e 0a 20 20 2a 2f 0a 20 20 69   other..  */.  i
25250 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20  f( (p->selFlags 
25260 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53  & (SF_Distinct|S
25270 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53  F_Aggregate))==S
25280 46 5f 44 69 73 74 69 6e 63 74 20 0a 20 20 20 26  F_Distinct .   &
25290 26 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  & sqlite3ExprLis
252a0 74 43 6f 6d 70 61 72 65 28 70 4f 72 64 65 72 42  tCompare(pOrderB
252b0 79 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 2d 31  y, p->pEList, -1
252c0 29 3d 3d 30 0a 20 20 29 7b 0a 20 20 20 20 70 2d  )==0.  ){.    p-
252d0 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46  >selFlags &= ~SF
252e0 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20 20 20 70  _Distinct;.    p
252f0 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71 6c  ->pGroupBy = sql
25300 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
25310 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 30  db, p->pEList, 0
25320 29 3b 0a 20 20 20 20 70 47 72 6f 75 70 42 79 20  );.    pGroupBy 
25330 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20  = p->pGroupBy;. 
25340 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20 30 3b     pOrderBy = 0;
25350 0a 20 20 20 20 2f 2a 20 4e 6f 74 69 63 65 20 74  .    /* Notice t
25360 68 61 74 20 65 76 65 6e 20 74 68 6f 75 67 68 74  hat even thought
25370 20 53 46 5f 44 69 73 74 69 6e 63 74 20 68 61 73   SF_Distinct has
25380 20 62 65 65 6e 20 63 6c 65 61 72 65 64 20 66 72   been cleared fr
25390 6f 6d 20 70 2d 3e 73 65 6c 46 6c 61 67 73 2c 0a  om p->selFlags,.
253a0 20 20 20 20 2a 2a 20 74 68 65 20 73 44 69 73 74      ** the sDist
253b0 69 6e 63 74 2e 69 73 54 6e 63 74 20 69 73 20 73  inct.isTnct is s
253c0 74 69 6c 6c 20 73 65 74 2e 20 20 48 65 6e 63 65  till set.  Hence
253d0 2c 20 69 73 54 6e 63 74 20 72 65 70 72 65 73 65  , isTnct represe
253e0 6e 74 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f  nts the.    ** o
253f0 72 69 67 69 6e 61 6c 20 73 65 74 74 69 6e 67 20  riginal setting 
25400 6f 66 20 74 68 65 20 53 46 5f 44 69 73 74 69 6e  of the SF_Distin
25410 63 74 20 66 6c 61 67 2c 20 6e 6f 74 20 74 68 65  ct flag, not the
25420 20 63 75 72 72 65 6e 74 20 73 65 74 74 69 6e 67   current setting
25430 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
25440 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74  sDistinct.isTnct
25450 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66   );.  }..  /* If
25460 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44   there is an ORD
25470 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68  ER BY clause, th
25480 65 6e 20 74 68 69 73 20 73 6f 72 74 69 6e 67 0a  en this sorting.
25490 20 20 2a 2a 20 69 6e 64 65 78 20 6d 69 67 68 74    ** index might
254a0 20 65 6e 64 20 75 70 20 62 65 69 6e 67 20 75 6e   end up being un
254b0 75 73 65 64 20 69 66 20 74 68 65 20 64 61 74 61  used if the data
254c0 20 63 61 6e 20 62 65 20 0a 20 20 2a 2a 20 65 78   can be .  ** ex
254d0 74 72 61 63 74 65 64 20 69 6e 20 70 72 65 2d 73  tracted in pre-s
254e0 6f 72 74 65 64 20 6f 72 64 65 72 2e 20 20 49 66  orted order.  If
254f0 20 74 68 61 74 20 69 73 20 74 68 65 20 63 61 73   that is the cas
25500 65 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 2a 2a  e, then the.  **
25510 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
25520 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 77 69  l instruction wi
25530 6c 6c 20 62 65 20 63 68 61 6e 67 65 64 20 74 6f  ll be changed to
25540 20 61 6e 20 4f 50 5f 4e 6f 6f 70 20 6f 6e 63 65   an OP_Noop once
25550 0a 20 20 2a 2a 20 77 65 20 66 69 67 75 72 65 20  .  ** we figure 
25560 6f 75 74 20 74 68 61 74 20 74 68 65 20 73 6f 72  out that the sor
25570 74 69 6e 67 20 69 6e 64 65 78 20 69 73 20 6e 6f  ting index is no
25580 74 20 6e 65 65 64 65 64 2e 20 20 54 68 65 20 61  t needed.  The a
25590 64 64 72 53 6f 72 74 49 6e 64 65 78 0a 20 20 2a  ddrSortIndex.  *
255a0 2a 20 76 61 72 69 61 62 6c 65 20 69 73 20 75 73  * variable is us
255b0 65 64 20 74 6f 20 66 61 63 69 6c 69 74 61 74 65  ed to facilitate
255c0 20 74 68 61 74 20 63 68 61 6e 67 65 2e 0a 20 20   that change..  
255d0 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42  */.  if( pOrderB
255e0 79 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66 6f  y ){.    KeyInfo
255f0 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20   *pKeyInfo;.    
25600 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e  pKeyInfo = keyIn
25610 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70  foFromExprList(p
25620 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 29  Parse, pOrderBy)
25630 3b 0a 20 20 20 20 70 4f 72 64 65 72 42 79 2d 3e  ;.    pOrderBy->
25640 69 45 43 75 72 73 6f 72 20 3d 20 70 50 61 72 73  iECursor = pPars
25650 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 70  e->nTab++;.    p
25660 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 32  ->addrOpenEphm[2
25670 5d 20 3d 20 61 64 64 72 53 6f 72 74 49 6e 64 65  ] = addrSortInde
25680 78 20 3d 0a 20 20 20 20 20 20 73 71 6c 69 74 65  x =.      sqlite
25690 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
256a0 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
256b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
256c0 20 20 20 20 20 20 20 20 20 20 20 20 70 4f 72 64              pOrd
256d0 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 2c 20  erBy->iECursor, 
256e0 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b  pOrderBy->nExpr+
256f0 32 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  2, 0,.          
25700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25710 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f   (char*)pKeyInfo
25720 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20  , P4_KEYINFO);. 
25730 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 64 64 72   }else{.    addr
25740 53 6f 72 74 49 6e 64 65 78 20 3d 20 2d 31 3b 0a  SortIndex = -1;.
25750 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
25760 20 6f 75 74 70 75 74 20 69 73 20 64 65 73 74 69   output is desti
25770 6e 65 64 20 66 6f 72 20 61 20 74 65 6d 70 6f 72  ned for a tempor
25780 61 72 79 20 74 61 62 6c 65 2c 20 6f 70 65 6e 20  ary table, open 
25790 74 68 61 74 20 74 61 62 6c 65 2e 0a 20 20 2a 2f  that table..  */
257a0 0a 20 20 69 66 28 20 70 44 65 73 74 2d 3e 65 44  .  if( pDest->eD
257b0 65 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61  est==SRT_EphemTa
257c0 62 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  b ){.    sqlite3
257d0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
257e0 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20  _OpenEphemeral, 
257f0 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20  pDest->iSDParm, 
25800 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a  pEList->nExpr);.
25810 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68    }..  /* Set th
25820 65 20 6c 69 6d 69 74 65 72 2e 0a 20 20 2a 2f 0a  e limiter..  */.
25830 20 20 69 45 6e 64 20 3d 20 73 71 6c 69 74 65 33    iEnd = sqlite3
25840 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
25850 3b 0a 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f  ;.  p->nSelectRo
25860 77 20 3d 20 4c 41 52 47 45 53 54 5f 49 4e 54 36  w = LARGEST_INT6
25870 34 3b 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69  4;.  computeLimi
25880 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72 73  tRegisters(pPars
25890 65 2c 20 70 2c 20 69 45 6e 64 29 3b 0a 20 20 69  e, p, iEnd);.  i
258a0 66 28 20 70 2d 3e 69 4c 69 6d 69 74 3d 3d 30 20  f( p->iLimit==0 
258b0 26 26 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78  && addrSortIndex
258c0 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  >=0 ){.    sqlit
258d0 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20 61  e3VdbeGetOp(v, a
258e0 64 64 72 53 6f 72 74 49 6e 64 65 78 29 2d 3e 6f  ddrSortIndex)->o
258f0 70 63 6f 64 65 20 3d 20 4f 50 5f 53 6f 72 74 65  pcode = OP_Sorte
25900 72 4f 70 65 6e 3b 0a 20 20 20 20 70 2d 3e 73 65  rOpen;.    p->se
25910 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 55 73 65  lFlags |= SF_Use
25920 53 6f 72 74 65 72 3b 0a 20 20 7d 0a 0a 20 20 2f  Sorter;.  }..  /
25930 2a 20 4f 70 65 6e 20 61 20 76 69 72 74 75 61 6c  * Open a virtual
25940 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20 66 6f   index to use fo
25950 72 20 74 68 65 20 64 69 73 74 69 6e 63 74 20 73  r the distinct s
25960 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  et..  */.  if( p
25970 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
25980 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20  Distinct ){.    
25990 73 44 69 73 74 69 6e 63 74 2e 74 61 62 54 6e 63  sDistinct.tabTnc
259a0 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  t = pParse->nTab
259b0 2b 2b 3b 0a 20 20 20 20 73 44 69 73 74 69 6e 63  ++;.    sDistinc
259c0 74 2e 61 64 64 72 54 6e 63 74 20 3d 20 73 71 6c  t.addrTnct = sql
259d0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
259e0 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
259f0 61 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  al,.            
25a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25a10 20 20 20 20 73 44 69 73 74 69 6e 63 74 2e 74 61      sDistinct.ta
25a20 62 54 6e 63 74 2c 20 30 2c 20 30 2c 0a 20 20 20  bTnct, 0, 0,.   
25a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25a40 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
25a50 61 72 2a 29 6b 65 79 49 6e 66 6f 46 72 6f 6d 45  ar*)keyInfoFromE
25a60 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
25a70 70 2d 3e 70 45 4c 69 73 74 29 2c 0a 20 20 20 20  p->pEList),.    
25a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25a90 20 20 20 20 20 20 20 20 20 20 20 20 50 34 5f 4b              P4_K
25aa0 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 73 71 6c  EYINFO);.    sql
25ab0 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
25ac0 28 76 2c 20 42 54 52 45 45 5f 55 4e 4f 52 44 45  (v, BTREE_UNORDE
25ad0 52 45 44 29 3b 0a 20 20 20 20 73 44 69 73 74 69  RED);.    sDisti
25ae0 6e 63 74 2e 65 54 6e 63 74 54 79 70 65 20 3d 20  nct.eTnctType = 
25af0 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55  WHERE_DISTINCT_U
25b00 4e 4f 52 44 45 52 45 44 3b 0a 20 20 7d 65 6c 73  NORDERED;.  }els
25b10 65 7b 0a 20 20 20 20 73 44 69 73 74 69 6e 63 74  e{.    sDistinct
25b20 2e 65 54 6e 63 74 54 79 70 65 20 3d 20 57 48 45  .eTnctType = WHE
25b30 52 45 5f 44 49 53 54 49 4e 43 54 5f 4e 4f 4f 50  RE_DISTINCT_NOOP
25b40 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 69 73  ;.  }..  if( !is
25b50 41 67 67 20 26 26 20 70 47 72 6f 75 70 42 79 3d  Agg && pGroupBy=
25b60 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20  =0 ){.    /* No 
25b70 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
25b80 6f 6e 73 20 61 6e 64 20 6e 6f 20 47 52 4f 55 50  ons and no GROUP
25b90 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
25ba0 20 20 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73    u16 wctrlFlags
25bb0 20 3d 20 28 73 44 69 73 74 69 6e 63 74 2e 69 73   = (sDistinct.is
25bc0 54 6e 63 74 20 3f 20 57 48 45 52 45 5f 57 41 4e  Tnct ? WHERE_WAN
25bd0 54 5f 44 49 53 54 49 4e 43 54 20 3a 20 30 29 3b  T_DISTINCT : 0);
25be0 0a 0a 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 74  ..    /* Begin t
25bf0 68 65 20 64 61 74 61 62 61 73 65 20 73 63 61 6e  he database scan
25c00 2e 20 2a 2f 0a 20 20 20 20 70 57 49 6e 66 6f 20  . */.    pWInfo 
25c10 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  = sqlite3WhereBe
25c20 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62  gin(pParse, pTab
25c30 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20 70 4f  List, pWhere, pO
25c40 72 64 65 72 42 79 2c 20 70 2d 3e 70 45 4c 69 73  rderBy, p->pELis
25c50 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
25c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25c70 20 20 77 63 74 72 6c 46 6c 61 67 73 2c 20 30 29    wctrlFlags, 0)
25c80 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f  ;.    if( pWInfo
25c90 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63  ==0 ) goto selec
25ca0 74 5f 65 6e 64 3b 0a 20 20 20 20 69 66 28 20 73  t_end;.    if( s
25cb0 71 6c 69 74 65 33 57 68 65 72 65 4f 75 74 70 75  qlite3WhereOutpu
25cc0 74 52 6f 77 43 6f 75 6e 74 28 70 57 49 6e 66 6f  tRowCount(pWInfo
25cd0 29 20 3c 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f  ) < p->nSelectRo
25ce0 77 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 53  w ){.      p->nS
25cf0 65 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c 69 74  electRow = sqlit
25d00 65 33 57 68 65 72 65 4f 75 74 70 75 74 52 6f 77  e3WhereOutputRow
25d10 43 6f 75 6e 74 28 70 57 49 6e 66 6f 29 3b 0a 20  Count(pWInfo);. 
25d20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 44 69     }.    if( sDi
25d30 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 26 26  stinct.isTnct &&
25d40 20 73 71 6c 69 74 65 33 57 68 65 72 65 49 73 44   sqlite3WhereIsD
25d50 69 73 74 69 6e 63 74 28 70 57 49 6e 66 6f 29 20  istinct(pWInfo) 
25d60 29 7b 0a 20 20 20 20 20 20 73 44 69 73 74 69 6e  ){.      sDistin
25d70 63 74 2e 65 54 6e 63 74 54 79 70 65 20 3d 20 73  ct.eTnctType = s
25d80 71 6c 69 74 65 33 57 68 65 72 65 49 73 44 69 73  qlite3WhereIsDis
25d90 74 69 6e 63 74 28 70 57 49 6e 66 6f 29 3b 0a 20  tinct(pWInfo);. 
25da0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4f 72     }.    if( pOr
25db0 64 65 72 42 79 20 26 26 20 73 71 6c 69 74 65 33  derBy && sqlite3
25dc0 57 68 65 72 65 49 73 4f 72 64 65 72 65 64 28 70  WhereIsOrdered(p
25dd0 57 49 6e 66 6f 29 20 29 20 70 4f 72 64 65 72 42  WInfo) ) pOrderB
25de0 79 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 49  y = 0;..    /* I
25df0 66 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20  f sorting index 
25e00 74 68 61 74 20 77 61 73 20 63 72 65 61 74 65 64  that was created
25e10 20 62 79 20 61 20 70 72 69 6f 72 20 4f 50 5f 4f   by a prior OP_O
25e20 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 0a 20 20  penEphemeral .  
25e30 20 20 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e    ** instruction
25e40 20 65 6e 64 65 64 20 75 70 20 6e 6f 74 20 62 65   ended up not be
25e50 69 6e 67 20 6e 65 65 64 65 64 2c 20 74 68 65 6e  ing needed, then
25e60 20 63 68 61 6e 67 65 20 74 68 65 20 4f 50 5f 4f   change the OP_O
25e70 70 65 6e 45 70 68 65 6d 65 72 61 6c 0a 20 20 20  penEphemeral.   
25e80 20 2a 2a 20 69 6e 74 6f 20 61 6e 20 4f 50 5f 4e   ** into an OP_N
25e90 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  oop..    */.    
25ea0 69 66 28 20 61 64 64 72 53 6f 72 74 49 6e 64 65  if( addrSortInde
25eb0 78 3e 3d 30 20 26 26 20 70 4f 72 64 65 72 42 79  x>=0 && pOrderBy
25ec0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
25ed0 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f  ite3VdbeChangeTo
25ee0 4e 6f 6f 70 28 76 2c 20 61 64 64 72 53 6f 72 74  Noop(v, addrSort
25ef0 49 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 70 2d  Index);.      p-
25f00 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 32 5d  >addrOpenEphm[2]
25f10 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 0a 20 20   = -1;.    }..  
25f20 20 20 2f 2a 20 55 73 65 20 74 68 65 20 73 74 61    /* Use the sta
25f30 6e 64 61 72 64 20 69 6e 6e 65 72 20 6c 6f 6f 70  ndard inner loop
25f40 2e 20 2a 2f 0a 20 20 20 20 73 65 6c 65 63 74 49  . */.    selectI
25f50 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c  nnerLoop(pParse,
25f60 20 70 2c 20 70 45 4c 69 73 74 2c 20 30 2c 20 30   p, pEList, 0, 0
25f70 2c 20 70 4f 72 64 65 72 42 79 2c 20 26 73 44 69  , pOrderBy, &sDi
25f80 73 74 69 6e 63 74 2c 20 70 44 65 73 74 2c 0a 20  stinct, pDest,. 
25f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25fa0 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 43     sqlite3WhereC
25fb0 6f 6e 74 69 6e 75 65 4c 61 62 65 6c 28 70 57 49  ontinueLabel(pWI
25fc0 6e 66 6f 29 2c 0a 20 20 20 20 20 20 20 20 20 20  nfo),.          
25fd0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
25fe0 33 57 68 65 72 65 42 72 65 61 6b 4c 61 62 65 6c  3WhereBreakLabel
25ff0 28 70 57 49 6e 66 6f 29 29 3b 0a 0a 20 20 20 20  (pWInfo));..    
26000 2f 2a 20 45 6e 64 20 74 68 65 20 64 61 74 61 62  /* End the datab
26010 61 73 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20  ase scan loop.. 
26020 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
26030 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f  3WhereEnd(pWInfo
26040 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
26050 2f 2a 20 54 68 69 73 20 63 61 73 65 20 77 68 65  /* This case whe
26060 6e 20 74 68 65 72 65 20 65 78 69 73 74 20 61 67  n there exist ag
26070 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
26080 73 20 6f 72 20 61 20 47 52 4f 55 50 20 42 59 20  s or a GROUP BY 
26090 63 6c 61 75 73 65 0a 20 20 20 20 2a 2a 20 6f 72  clause.    ** or
260a0 20 62 6f 74 68 20 2a 2f 0a 20 20 20 20 4e 61 6d   both */.    Nam
260b0 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 20 20 20  eContext sNC;   
260c0 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74   /* Name context
260d0 20 66 6f 72 20 70 72 6f 63 65 73 73 69 6e 67 20   for processing 
260e0 61 67 67 72 65 67 61 74 65 20 69 6e 66 6f 72 6d  aggregate inform
260f0 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 6e 74  ation */.    int
26100 20 69 41 4d 65 6d 3b 20 20 20 20 20 20 20 20 20   iAMem;         
26110 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d 20 61 64   /* First Mem ad
26120 64 72 65 73 73 20 66 6f 72 20 73 74 6f 72 69 6e  dress for storin
26130 67 20 63 75 72 72 65 6e 74 20 47 52 4f 55 50 20  g current GROUP 
26140 42 59 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 42  BY */.    int iB
26150 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  Mem;          /*
26160 20 46 69 72 73 74 20 4d 65 6d 20 61 64 64 72 65   First Mem addre
26170 73 73 20 66 6f 72 20 70 72 65 76 69 6f 75 73 20  ss for previous 
26180 47 52 4f 55 50 20 42 59 20 2a 2f 0a 20 20 20 20  GROUP BY */.    
26190 69 6e 74 20 69 55 73 65 46 6c 61 67 3b 20 20 20  int iUseFlag;   
261a0 20 20 20 20 2f 2a 20 4d 65 6d 20 61 64 64 72 65      /* Mem addre
261b0 73 73 20 68 6f 6c 64 69 6e 67 20 66 6c 61 67 20  ss holding flag 
261c0 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74 20  indicating that 
261d0 61 74 20 6c 65 61 73 74 0a 20 20 20 20 20 20 20  at least.       
261e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
261f0 20 2a 2a 20 6f 6e 65 20 72 6f 77 20 6f 66 20 74   ** one row of t
26200 68 65 20 69 6e 70 75 74 20 74 6f 20 74 68 65 20  he input to the 
26210 61 67 67 72 65 67 61 74 6f 72 20 68 61 73 20 62  aggregator has b
26220 65 65 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20  een.            
26230 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70              ** p
26240 72 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20 20 20  rocessed */.    
26250 69 6e 74 20 69 41 62 6f 72 74 46 6c 61 67 3b 20  int iAbortFlag; 
26260 20 20 20 20 2f 2a 20 4d 65 6d 20 61 64 64 72 65      /* Mem addre
26270 73 73 20 77 68 69 63 68 20 63 61 75 73 65 73 20  ss which causes 
26280 71 75 65 72 79 20 61 62 6f 72 74 20 69 66 20 70  query abort if p
26290 6f 73 69 74 69 76 65 20 2a 2f 0a 20 20 20 20 69  ositive */.    i
262a0 6e 74 20 67 72 6f 75 70 42 79 53 6f 72 74 3b 20  nt groupBySort; 
262b0 20 20 20 2f 2a 20 52 6f 77 73 20 63 6f 6d 65 20     /* Rows come 
262c0 66 72 6f 6d 20 73 6f 75 72 63 65 20 69 6e 20 47  from source in G
262d0 52 4f 55 50 20 42 59 20 6f 72 64 65 72 20 2a 2f  ROUP BY order */
262e0 0a 20 20 20 20 69 6e 74 20 61 64 64 72 45 6e 64  .    int addrEnd
262f0 3b 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20  ;        /* End 
26300 6f 66 20 70 72 6f 63 65 73 73 69 6e 67 20 66 6f  of processing fo
26310 72 20 74 68 69 73 20 53 45 4c 45 43 54 20 2a 2f  r this SELECT */
26320 0a 20 20 20 20 69 6e 74 20 73 6f 72 74 50 54 61  .    int sortPTa
26330 62 20 3d 20 30 3b 20 20 20 2f 2a 20 50 73 65 75  b = 0;   /* Pseu
26340 64 6f 74 61 62 6c 65 20 75 73 65 64 20 74 6f 20  dotable used to 
26350 64 65 63 6f 64 65 20 73 6f 72 74 69 6e 67 20 72  decode sorting r
26360 65 73 75 6c 74 73 20 2a 2f 0a 20 20 20 20 69 6e  esults */.    in
26370 74 20 73 6f 72 74 4f 75 74 20 3d 20 30 3b 20 20  t sortOut = 0;  
26380 20 20 2f 2a 20 4f 75 74 70 75 74 20 72 65 67 69    /* Output regi
26390 73 74 65 72 20 66 72 6f 6d 20 74 68 65 20 73 6f  ster from the so
263a0 72 74 65 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  rter */..    /* 
263b0 52 65 6d 6f 76 65 20 61 6e 79 20 61 6e 64 20 61  Remove any and a
263c0 6c 6c 20 61 6c 69 61 73 65 73 20 62 65 74 77 65  ll aliases betwe
263d0 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  en the result se
263e0 74 20 61 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a  t and the.    **
263f0 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
26400 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
26410 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20   pGroupBy ){.   
26420 20 20 20 69 6e 74 20 6b 3b 20 20 20 20 20 20 20     int k;       
26430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26440 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
26450 20 2a 2f 0a 20 20 20 20 20 20 73 74 72 75 63 74   */.      struct
26460 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
26470 70 49 74 65 6d 3b 20 20 2f 2a 20 46 6f 72 20 6c  pItem;  /* For l
26480 6f 6f 70 69 6e 67 20 6f 76 65 72 20 65 78 70 72  ooping over expr
26490 65 73 73 69 6f 6e 20 69 6e 20 61 20 6c 69 73 74  ession in a list
264a0 20 2a 2f 0a 0a 20 20 20 20 20 20 66 6f 72 28 6b   */..      for(k
264b0 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  =p->pEList->nExp
264c0 72 2c 20 70 49 74 65 6d 3d 70 2d 3e 70 45 4c 69  r, pItem=p->pELi
264d0 73 74 2d 3e 61 3b 20 6b 3e 30 3b 20 6b 2d 2d 2c  st->a; k>0; k--,
264e0 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
264f0 20 20 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 41     pItem->u.x.iA
26500 6c 69 61 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  lias = 0;.      
26510 7d 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 70 47  }.      for(k=pG
26520 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2c 20 70  roupBy->nExpr, p
26530 49 74 65 6d 3d 70 47 72 6f 75 70 42 79 2d 3e 61  Item=pGroupBy->a
26540 3b 20 6b 3e 30 3b 20 6b 2d 2d 2c 20 70 49 74 65  ; k>0; k--, pIte
26550 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 49  m++){.        pI
26560 74 65 6d 2d 3e 75 2e 78 2e 69 41 6c 69 61 73 20  tem->u.x.iAlias 
26570 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
26580 20 20 20 69 66 28 20 70 2d 3e 6e 53 65 6c 65 63     if( p->nSelec
26590 74 52 6f 77 3e 31 30 30 20 29 20 70 2d 3e 6e 53  tRow>100 ) p->nS
265a0 65 6c 65 63 74 52 6f 77 20 3d 20 31 30 30 3b 0a  electRow = 100;.
265b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
265c0 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d   p->nSelectRow =
265d0 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 0a 20 20 20   1;.    }.. .   
265e0 20 2f 2a 20 43 72 65 61 74 65 20 61 20 6c 61 62   /* Create a lab
265f0 65 6c 20 74 6f 20 6a 75 6d 70 20 74 6f 20 77 68  el to jump to wh
26600 65 6e 20 77 65 20 77 61 6e 74 20 74 6f 20 61 62  en we want to ab
26610 6f 72 74 20 74 68 65 20 71 75 65 72 79 20 2a 2f  ort the query */
26620 0a 20 20 20 20 61 64 64 72 45 6e 64 20 3d 20 73  .    addrEnd = s
26630 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
26640 62 65 6c 28 76 29 3b 0a 0a 20 20 20 20 2f 2a 20  bel(v);..    /* 
26650 43 6f 6e 76 65 72 74 20 54 4b 5f 43 4f 4c 55 4d  Convert TK_COLUM
26660 4e 20 6e 6f 64 65 73 20 69 6e 74 6f 20 54 4b 5f  N nodes into TK_
26670 41 47 47 5f 43 4f 4c 55 4d 4e 20 61 6e 64 20 6d  AGG_COLUMN and m
26680 61 6b 65 20 65 6e 74 72 69 65 73 20 69 6e 0a 20  ake entries in. 
26690 20 20 20 2a 2a 20 73 41 67 67 49 6e 66 6f 20 66     ** sAggInfo f
266a0 6f 72 20 61 6c 6c 20 54 4b 5f 41 47 47 5f 46 55  or all TK_AGG_FU
266b0 4e 43 54 49 4f 4e 20 6e 6f 64 65 73 20 69 6e 20  NCTION nodes in 
266c0 65 78 70 72 65 73 73 69 6f 6e 73 20 6f 66 20 74  expressions of t
266d0 68 65 0a 20 20 20 20 2a 2a 20 53 45 4c 45 43 54  he.    ** SELECT
266e0 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20   statement..    
266f0 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73  */.    memset(&s
26700 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e  NC, 0, sizeof(sN
26710 43 29 29 3b 0a 20 20 20 20 73 4e 43 2e 70 50 61  C));.    sNC.pPa
26720 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20  rse = pParse;.  
26730 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d    sNC.pSrcList =
26740 20 70 54 61 62 4c 69 73 74 3b 0a 20 20 20 20 73   pTabList;.    s
26750 4e 43 2e 70 41 67 67 49 6e 66 6f 20 3d 20 26 73  NC.pAggInfo = &s
26760 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 73 41 67  AggInfo;.    sAg
26770 67 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f  gInfo.nSortingCo
26780 6c 75 6d 6e 20 3d 20 70 47 72 6f 75 70 42 79 20  lumn = pGroupBy 
26790 3f 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  ? pGroupBy->nExp
267a0 72 2b 31 20 3a 20 30 3b 0a 20 20 20 20 73 41 67  r+1 : 0;.    sAg
267b0 67 49 6e 66 6f 2e 70 47 72 6f 75 70 42 79 20 3d  gInfo.pGroupBy =
267c0 20 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 73   pGroupBy;.    s
267d0 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
267e0 65 41 67 67 4c 69 73 74 28 26 73 4e 43 2c 20 70  eAggList(&sNC, p
267f0 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69  EList);.    sqli
26800 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
26810 67 4c 69 73 74 28 26 73 4e 43 2c 20 70 4f 72 64  gList(&sNC, pOrd
26820 65 72 42 79 29 3b 0a 20 20 20 20 69 66 28 20 70  erBy);.    if( p
26830 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20 20 20  Having ){.      
26840 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
26850 7a 65 41 67 67 72 65 67 61 74 65 73 28 26 73 4e  zeAggregates(&sN
26860 43 2c 20 70 48 61 76 69 6e 67 29 3b 0a 20 20 20  C, pHaving);.   
26870 20 7d 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e   }.    sAggInfo.
26880 6e 41 63 63 75 6d 75 6c 61 74 6f 72 20 3d 20 73  nAccumulator = s
26890 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b  AggInfo.nColumn;
268a0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
268b0 73 41 67 67 49 6e 66 6f 2e 6e 46 75 6e 63 3b 20  sAggInfo.nFunc; 
268c0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65  i++){.      asse
268d0 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
268e0 65 72 74 79 28 73 41 67 67 49 6e 66 6f 2e 61 46  erty(sAggInfo.aF
268f0 75 6e 63 5b 69 5d 2e 70 45 78 70 72 2c 20 45 50  unc[i].pExpr, EP
26900 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20  _xIsSelect) );. 
26910 20 20 20 20 20 73 4e 43 2e 6e 63 46 6c 61 67 73       sNC.ncFlags
26920 20 7c 3d 20 4e 43 5f 49 6e 41 67 67 46 75 6e 63   |= NC_InAggFunc
26930 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
26940 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73  xprAnalyzeAggLis
26950 74 28 26 73 4e 43 2c 20 73 41 67 67 49 6e 66 6f  t(&sNC, sAggInfo
26960 2e 61 46 75 6e 63 5b 69 5d 2e 70 45 78 70 72 2d  .aFunc[i].pExpr-
26970 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20 20  >x.pList);.     
26980 20 73 4e 43 2e 6e 63 46 6c 61 67 73 20 26 3d 20   sNC.ncFlags &= 
26990 7e 4e 43 5f 49 6e 41 67 67 46 75 6e 63 3b 0a 20  ~NC_InAggFunc;. 
269a0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64 62 2d     }.    if( db-
269b0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
269c0 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
269d0 0a 0a 20 20 20 20 2f 2a 20 50 72 6f 63 65 73 73  ..    /* Process
269e0 69 6e 67 20 66 6f 72 20 61 67 67 72 65 67 61 74  ing for aggregat
269f0 65 73 20 77 69 74 68 20 47 52 4f 55 50 20 42 59  es with GROUP BY
26a00 20 69 73 20 76 65 72 79 20 64 69 66 66 65 72 65   is very differe
26a10 6e 74 20 61 6e 64 0a 20 20 20 20 2a 2a 20 6d 75  nt and.    ** mu
26a20 63 68 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20  ch more complex 
26a30 74 68 61 6e 20 61 67 67 72 65 67 61 74 65 73 20  than aggregates 
26a40 77 69 74 68 6f 75 74 20 61 20 47 52 4f 55 50 20  without a GROUP 
26a50 42 59 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  BY..    */.    i
26a60 66 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20  f( pGroupBy ){. 
26a70 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b       KeyInfo *pK
26a80 65 79 49 6e 66 6f 3b 20 20 2f 2a 20 4b 65 79 69  eyInfo;  /* Keyi
26a90 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ng information f
26aa0 6f 72 20 74 68 65 20 67 72 6f 75 70 20 62 79 20  or the group by 
26ab0 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20  clause */.      
26ac0 69 6e 74 20 6a 31 3b 20 20 20 20 20 20 20 20 20  int j1;         
26ad0 20 20 20 20 2f 2a 20 41 2d 76 73 2d 42 20 63 6f      /* A-vs-B co
26ae0 6d 70 61 72 69 73 69 6f 6e 20 6a 75 6d 70 20 2a  mparision jump *
26af0 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  /.      int addr
26b00 4f 75 74 70 75 74 52 6f 77 3b 20 20 2f 2a 20 53  OutputRow;  /* S
26b10 74 61 72 74 20 6f 66 20 73 75 62 72 6f 75 74 69  tart of subrouti
26b20 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74 73 20  ne that outputs 
26b30 61 20 72 65 73 75 6c 74 20 72 6f 77 20 2a 2f 0a  a result row */.
26b40 20 20 20 20 20 20 69 6e 74 20 72 65 67 4f 75 74        int regOut
26b50 70 75 74 52 6f 77 3b 20 20 20 2f 2a 20 52 65 74  putRow;   /* Ret
26b60 75 72 6e 20 61 64 64 72 65 73 73 20 72 65 67 69  urn address regi
26b70 73 74 65 72 20 66 6f 72 20 6f 75 74 70 75 74 20  ster for output 
26b80 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
26b90 20 20 20 20 69 6e 74 20 61 64 64 72 53 65 74 41      int addrSetA
26ba0 62 6f 72 74 3b 20 20 20 2f 2a 20 53 65 74 20 74  bort;   /* Set t
26bb0 68 65 20 61 62 6f 72 74 20 66 6c 61 67 20 61 6e  he abort flag an
26bc0 64 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 20 20  d return */.    
26bd0 20 20 69 6e 74 20 61 64 64 72 54 6f 70 4f 66 4c    int addrTopOfL
26be0 6f 6f 70 3b 20 20 2f 2a 20 54 6f 70 20 6f 66 20  oop;  /* Top of 
26bf0 74 68 65 20 69 6e 70 75 74 20 6c 6f 6f 70 20 2a  the input loop *
26c00 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  /.      int addr
26c10 53 6f 72 74 69 6e 67 49 64 78 3b 20 2f 2a 20 54  SortingIdx; /* T
26c20 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  he OP_OpenEpheme
26c30 72 61 6c 20 66 6f 72 20 74 68 65 20 73 6f 72 74  ral for the sort
26c40 69 6e 67 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20  ing index */.   
26c50 20 20 20 69 6e 74 20 61 64 64 72 52 65 73 65 74     int addrReset
26c60 3b 20 20 20 20 20 20 2f 2a 20 53 75 62 72 6f 75  ;      /* Subrou
26c70 74 69 6e 65 20 66 6f 72 20 72 65 73 65 74 74 69  tine for resetti
26c80 6e 67 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74  ng the accumulat
26c90 6f 72 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  or */.      int 
26ca0 72 65 67 52 65 73 65 74 3b 20 20 20 20 20 20 20  regReset;       
26cb0 2f 2a 20 52 65 74 75 72 6e 20 61 64 64 72 65 73  /* Return addres
26cc0 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 72  s register for r
26cd0 65 73 65 74 20 73 75 62 72 6f 75 74 69 6e 65 20  eset subroutine 
26ce0 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  */..      /* If 
26cf0 74 68 65 72 65 20 69 73 20 61 20 47 52 4f 55 50  there is a GROUP
26d00 20 42 59 20 63 6c 61 75 73 65 20 77 65 20 6d 69   BY clause we mi
26d10 67 68 74 20 6e 65 65 64 20 61 20 73 6f 72 74 69  ght need a sorti
26d20 6e 67 20 69 6e 64 65 78 20 74 6f 0a 20 20 20 20  ng index to.    
26d30 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 69    ** implement i
26d40 74 2e 20 20 41 6c 6c 6f 63 61 74 65 20 74 68 61  t.  Allocate tha
26d50 74 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20  t sorting index 
26d60 6e 6f 77 2e 20 20 49 66 20 69 74 20 74 75 72 6e  now.  If it turn
26d70 73 20 6f 75 74 0a 20 20 20 20 20 20 2a 2a 20 74  s out.      ** t
26d80 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 6e 65  hat we do not ne
26d90 65 64 20 69 74 20 61 66 74 65 72 20 61 6c 6c 2c  ed it after all,
26da0 20 74 68 65 20 4f 50 5f 53 6f 72 74 65 72 4f 70   the OP_SorterOp
26db0 65 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a 20  en instruction. 
26dc0 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20       ** will be 
26dd0 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61  converted into a
26de0 20 4e 6f 6f 70 2e 20 20 0a 20 20 20 20 20 20 2a   Noop.  .      *
26df0 2f 0a 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f  /.      sAggInfo
26e00 2e 73 6f 72 74 69 6e 67 49 64 78 20 3d 20 70 50  .sortingIdx = pP
26e10 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
26e20 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 6b      pKeyInfo = k
26e30 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69  eyInfoFromExprLi
26e40 73 74 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75  st(pParse, pGrou
26e50 70 42 79 29 3b 0a 20 20 20 20 20 20 61 64 64 72  pBy);.      addr
26e60 53 6f 72 74 69 6e 67 49 64 78 20 3d 20 73 71 6c  SortingIdx = sql
26e70 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
26e80 2c 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e 2c  , OP_SorterOpen,
26e90 20 0a 20 20 20 20 20 20 20 20 20 20 73 41 67 67   .          sAgg
26ea0 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c  Info.sortingIdx,
26eb0 20 73 41 67 67 49 6e 66 6f 2e 6e 53 6f 72 74 69   sAggInfo.nSorti
26ec0 6e 67 43 6f 6c 75 6d 6e 2c 20 0a 20 20 20 20 20  ngColumn, .     
26ed0 20 20 20 20 20 30 2c 20 28 63 68 61 72 2a 29 70       0, (char*)p
26ee0 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49  KeyInfo, P4_KEYI
26ef0 4e 46 4f 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  NFO);..      /* 
26f00 49 6e 69 74 69 61 6c 69 7a 65 20 6d 65 6d 6f 72  Initialize memor
26f10 79 20 6c 6f 63 61 74 69 6f 6e 73 20 75 73 65 64  y locations used
26f20 20 62 79 20 47 52 4f 55 50 20 42 59 20 61 67 67   by GROUP BY agg
26f30 72 65 67 61 74 65 20 70 72 6f 63 65 73 73 69 6e  regate processin
26f40 67 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  g.      */.     
26f50 20 69 55 73 65 46 6c 61 67 20 3d 20 2b 2b 70 50   iUseFlag = ++pP
26f60 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
26f70 20 20 69 41 62 6f 72 74 46 6c 61 67 20 3d 20 2b    iAbortFlag = +
26f80 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
26f90 20 20 20 20 20 72 65 67 4f 75 74 70 75 74 52 6f       regOutputRo
26fa0 77 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  w = ++pParse->nM
26fb0 65 6d 3b 0a 20 20 20 20 20 20 61 64 64 72 4f 75  em;.      addrOu
26fc0 74 70 75 74 52 6f 77 20 3d 20 73 71 6c 69 74 65  tputRow = sqlite
26fd0 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
26fe0 29 3b 0a 20 20 20 20 20 20 72 65 67 52 65 73 65  );.      regRese
26ff0 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  t = ++pParse->nM
27000 65 6d 3b 0a 20 20 20 20 20 20 61 64 64 72 52 65  em;.      addrRe
27010 73 65 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  set = sqlite3Vdb
27020 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
27030 20 20 20 20 20 69 41 4d 65 6d 20 3d 20 70 50 61       iAMem = pPa
27040 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20  rse->nMem + 1;. 
27050 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65       pParse->nMe
27060 6d 20 2b 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e  m += pGroupBy->n
27070 45 78 70 72 3b 0a 20 20 20 20 20 20 69 42 4d 65  Expr;.      iBMe
27080 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  m = pParse->nMem
27090 20 2b 20 31 3b 0a 20 20 20 20 20 20 70 50 61 72   + 1;.      pPar
270a0 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f  se->nMem += pGro
270b0 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  upBy->nExpr;.   
270c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
270d0 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
270e0 65 72 2c 20 30 2c 20 69 41 62 6f 72 74 46 6c 61  er, 0, iAbortFla
270f0 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  g);.      VdbeCo
27100 6d 6d 65 6e 74 28 28 76 2c 20 22 63 6c 65 61 72  mment((v, "clear
27110 20 61 62 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a   abort flag"));.
27120 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
27130 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
27140 74 65 67 65 72 2c 20 30 2c 20 69 55 73 65 46 6c  teger, 0, iUseFl
27150 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  ag);.      VdbeC
27160 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 69 6e 64 69  omment((v, "indi
27170 63 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72  cate accumulator
27180 20 65 6d 70 74 79 22 29 29 3b 0a 20 20 20 20 20   empty"));.     
27190 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
271a0 70 33 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  p3(v, OP_Null, 0
271b0 2c 20 69 41 4d 65 6d 2c 20 69 41 4d 65 6d 2b 70  , iAMem, iAMem+p
271c0 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2d 31  GroupBy->nExpr-1
271d0 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 42 65 67  );..      /* Beg
271e0 69 6e 20 61 20 6c 6f 6f 70 20 74 68 61 74 20 77  in a loop that w
271f0 69 6c 6c 20 65 78 74 72 61 63 74 20 61 6c 6c 20  ill extract all 
27200 73 6f 75 72 63 65 20 72 6f 77 73 20 69 6e 20 47  source rows in G
27210 52 4f 55 50 20 42 59 20 6f 72 64 65 72 2e 0a 20  ROUP BY order.. 
27220 20 20 20 20 20 2a 2a 20 54 68 69 73 20 6d 69 67       ** This mig
27230 68 74 20 69 6e 76 6f 6c 76 65 20 74 77 6f 20 73  ht involve two s
27240 65 70 61 72 61 74 65 20 6c 6f 6f 70 73 20 77 69  eparate loops wi
27250 74 68 20 61 6e 20 4f 50 5f 53 6f 72 74 20 69 6e  th an OP_Sort in
27260 20 62 65 74 77 65 65 6e 2c 20 6f 72 0a 20 20 20   between, or.   
27270 20 20 20 2a 2a 20 69 74 20 6d 69 67 68 74 20 62     ** it might b
27280 65 20 61 20 73 69 6e 67 6c 65 20 6c 6f 6f 70 20  e a single loop 
27290 74 68 61 74 20 75 73 65 73 20 61 6e 20 69 6e 64  that uses an ind
272a0 65 78 20 74 6f 20 65 78 74 72 61 63 74 20 69 6e  ex to extract in
272b0 66 6f 72 6d 61 74 69 6f 6e 0a 20 20 20 20 20 20  formation.      
272c0 2a 2a 20 69 6e 20 74 68 65 20 72 69 67 68 74 20  ** in the right 
272d0 6f 72 64 65 72 20 74 6f 20 62 65 67 69 6e 20 77  order to begin w
272e0 69 74 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ith..      */.  
272f0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
27300 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75  ddOp2(v, OP_Gosu
27310 62 2c 20 72 65 67 52 65 73 65 74 2c 20 61 64 64  b, regReset, add
27320 72 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20 70  rReset);.      p
27330 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57  WInfo = sqlite3W
27340 68 65 72 65 42 65 67 69 6e 28 70 50 61 72 73 65  hereBegin(pParse
27350 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65  , pTabList, pWhe
27360 72 65 2c 20 70 47 72 6f 75 70 42 79 2c 20 30 2c  re, pGroupBy, 0,
27370 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
27380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27390 20 20 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59     WHERE_GROUPBY
273a0 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
273b0 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f  pWInfo==0 ) goto
273c0 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
273d0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68     if( sqlite3Wh
273e0 65 72 65 49 73 4f 72 64 65 72 65 64 28 70 57 49  ereIsOrdered(pWI
273f0 6e 66 6f 29 20 29 7b 0a 20 20 20 20 20 20 20 20  nfo) ){.        
27400 2f 2a 20 54 68 65 20 6f 70 74 69 6d 69 7a 65 72  /* The optimizer
27410 20 69 73 20 61 62 6c 65 20 74 6f 20 64 65 6c 69   is able to deli
27420 76 65 72 20 72 6f 77 73 20 69 6e 20 67 72 6f 75  ver rows in grou
27430 70 20 62 79 20 6f 72 64 65 72 20 73 6f 0a 20 20  p by order so.  
27440 20 20 20 20 20 20 2a 2a 20 77 65 20 64 6f 20 6e        ** we do n
27450 6f 74 20 68 61 76 65 20 74 6f 20 73 6f 72 74 2e  ot have to sort.
27460 20 20 54 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68    The OP_OpenEph
27470 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 77 69 6c  emeral table wil
27480 6c 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  l be.        ** 
27490 63 61 6e 63 65 6c 6c 65 64 20 6c 61 74 65 72 20  cancelled later 
274a0 62 65 63 61 75 73 65 20 77 65 20 73 74 69 6c 6c  because we still
274b0 20 6e 65 65 64 20 74 6f 20 75 73 65 20 74 68 65   need to use the
274c0 20 70 4b 65 79 49 6e 66 6f 0a 20 20 20 20 20 20   pKeyInfo.      
274d0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 67 72 6f    */.        gro
274e0 75 70 42 79 53 6f 72 74 20 3d 20 30 3b 0a 20 20  upBySort = 0;.  
274f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
27500 20 20 20 2f 2a 20 52 6f 77 73 20 61 72 65 20 63     /* Rows are c
27510 6f 6d 69 6e 67 20 6f 75 74 20 69 6e 20 75 6e 64  oming out in und
27520 65 74 65 72 6d 69 6e 65 64 20 6f 72 64 65 72 2e  etermined order.
27530 20 20 57 65 20 68 61 76 65 20 74 6f 20 70 75 73    We have to pus
27540 68 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 61 63  h.        ** eac
27550 68 20 72 6f 77 20 69 6e 74 6f 20 61 20 73 6f 72  h row into a sor
27560 74 69 6e 67 20 69 6e 64 65 78 2c 20 74 65 72 6d  ting index, term
27570 69 6e 61 74 65 20 74 68 65 20 66 69 72 73 74 20  inate the first 
27580 6c 6f 6f 70 2c 0a 20 20 20 20 20 20 20 20 2a 2a  loop,.        **
27590 20 74 68 65 6e 20 6c 6f 6f 70 20 6f 76 65 72 20   then loop over 
275a0 74 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65  the sorting inde
275b0 78 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67 65  x in order to ge
275c0 74 20 74 68 65 20 6f 75 74 70 75 74 0a 20 20 20  t the output.   
275d0 20 20 20 20 20 2a 2a 20 69 6e 20 73 6f 72 74 65       ** in sorte
275e0 64 20 6f 72 64 65 72 0a 20 20 20 20 20 20 20 20  d order.        
275f0 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  */.        int r
27600 65 67 42 61 73 65 3b 0a 20 20 20 20 20 20 20 20  egBase;.        
27610 69 6e 74 20 72 65 67 52 65 63 6f 72 64 3b 0a 20  int regRecord;. 
27620 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b         int nCol;
27630 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 47 72  .        int nGr
27640 6f 75 70 42 79 3b 0a 0a 20 20 20 20 20 20 20 20  oupBy;..        
27650 65 78 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65  explainTempTable
27660 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
27670 20 20 20 20 20 20 28 73 44 69 73 74 69 6e 63 74        (sDistinct
27680 2e 69 73 54 6e 63 74 20 26 26 20 28 70 2d 3e 73  .isTnct && (p->s
27690 65 6c 46 6c 61 67 73 26 53 46 5f 44 69 73 74 69  elFlags&SF_Disti
276a0 6e 63 74 29 3d 3d 30 29 20 3f 0a 20 20 20 20 20  nct)==0) ?.     
276b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
276c0 44 49 53 54 49 4e 43 54 22 20 3a 20 22 47 52 4f  DISTINCT" : "GRO
276d0 55 50 20 42 59 22 29 3b 0a 0a 20 20 20 20 20 20  UP BY");..      
276e0 20 20 67 72 6f 75 70 42 79 53 6f 72 74 20 3d 20    groupBySort = 
276f0 31 3b 0a 20 20 20 20 20 20 20 20 6e 47 72 6f 75  1;.        nGrou
27700 70 42 79 20 3d 20 70 47 72 6f 75 70 42 79 2d 3e  pBy = pGroupBy->
27710 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 6e  nExpr;.        n
27720 43 6f 6c 20 3d 20 6e 47 72 6f 75 70 42 79 20 2b  Col = nGroupBy +
27730 20 31 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20   1;.        j = 
27740 6e 47 72 6f 75 70 42 79 2b 31 3b 0a 20 20 20 20  nGroupBy+1;.    
27750 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73      for(i=0; i<s
27760 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b  AggInfo.nColumn;
27770 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
27780 20 69 66 28 20 73 41 67 67 49 6e 66 6f 2e 61 43   if( sAggInfo.aC
27790 6f 6c 5b 69 5d 2e 69 53 6f 72 74 65 72 43 6f 6c  ol[i].iSorterCol
277a0 75 6d 6e 3e 3d 6a 20 29 7b 0a 20 20 20 20 20 20  umn>=j ){.      
277b0 20 20 20 20 20 20 6e 43 6f 6c 2b 2b 3b 0a 20 20        nCol++;.  
277c0 20 20 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20            j++;. 
277d0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
277e0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 67     }.        reg
277f0 42 61 73 65 20 3d 20 73 71 6c 69 74 65 33 47 65  Base = sqlite3Ge
27800 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  tTempRange(pPars
27810 65 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20  e, nCol);.      
27820 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
27830 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b  heClear(pParse);
27840 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
27850 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74  ExprCodeExprList
27860 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42  (pParse, pGroupB
27870 79 2c 20 72 65 67 42 61 73 65 2c 20 30 29 3b 0a  y, regBase, 0);.
27880 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
27890 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
278a0 53 65 71 75 65 6e 63 65 2c 20 73 41 67 67 49 6e  Sequence, sAggIn
278b0 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 72 65  fo.sortingIdx,re
278c0 67 42 61 73 65 2b 6e 47 72 6f 75 70 42 79 29 3b  gBase+nGroupBy);
278d0 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 6e 47 72  .        j = nGr
278e0 6f 75 70 42 79 2b 31 3b 0a 20 20 20 20 20 20 20  oupBy+1;.       
278f0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67 67   for(i=0; i<sAgg
27900 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b  Info.nColumn; i+
27910 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74  +){.          st
27920 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c  ruct AggInfo_col
27930 20 2a 70 43 6f 6c 20 3d 20 26 73 41 67 67 49 6e   *pCol = &sAggIn
27940 66 6f 2e 61 43 6f 6c 5b 69 5d 3b 0a 20 20 20 20  fo.aCol[i];.    
27950 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e        if( pCol->
27960 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3e 3d 6a  iSorterColumn>=j
27970 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
27980 69 6e 74 20 72 31 20 3d 20 6a 20 2b 20 72 65 67  int r1 = j + reg
27990 42 61 73 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Base;.          
279a0 20 20 69 6e 74 20 72 32 3b 0a 0a 20 20 20 20 20    int r2;..     
279b0 20 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69         r2 = sqli
279c0 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f  te3ExprCodeGetCo
279d0 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20 0a 20 20  lumn(pParse, .  
279e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
279f0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
27a00 6c 2d 3e 70 54 61 62 2c 20 70 43 6f 6c 2d 3e 69  l->pTab, pCol->i
27a10 43 6f 6c 75 6d 6e 2c 20 70 43 6f 6c 2d 3e 69 54  Column, pCol->iT
27a20 61 62 6c 65 2c 20 72 31 2c 20 30 29 3b 0a 20 20  able, r1, 0);.  
27a30 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 31            if( r1
27a40 21 3d 72 32 20 29 7b 0a 20 20 20 20 20 20 20 20  !=r2 ){.        
27a50 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
27a60 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43  eAddOp2(v, OP_SC
27a70 6f 70 79 2c 20 72 32 2c 20 72 31 29 3b 0a 20 20  opy, r2, r1);.  
27a80 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
27a90 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20          j++;.   
27aa0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
27ab0 20 7d 0a 20 20 20 20 20 20 20 20 72 65 67 52 65   }.        regRe
27ac0 63 6f 72 64 20 3d 20 73 71 6c 69 74 65 33 47 65  cord = sqlite3Ge
27ad0 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
27ae0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
27af0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
27b00 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65  P_MakeRecord, re
27b10 67 42 61 73 65 2c 20 6e 43 6f 6c 2c 20 72 65 67  gBase, nCol, reg
27b20 52 65 63 6f 72 64 29 3b 0a 20 20 20 20 20 20 20  Record);.       
27b30 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
27b40 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 49  p2(v, OP_SorterI
27b50 6e 73 65 72 74 2c 20 73 41 67 67 49 6e 66 6f 2e  nsert, sAggInfo.
27b60 73 6f 72 74 69 6e 67 49 64 78 2c 20 72 65 67 52  sortingIdx, regR
27b70 65 63 6f 72 64 29 3b 0a 20 20 20 20 20 20 20 20  ecord);.        
27b80 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
27b90 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
27ba0 67 52 65 63 6f 72 64 29 3b 0a 20 20 20 20 20 20  gRecord);.      
27bb0 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
27bc0 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
27bd0 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f 6c 29  , regBase, nCol)
27be0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
27bf0 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f  3WhereEnd(pWInfo
27c00 29 3b 0a 20 20 20 20 20 20 20 20 73 41 67 67 49  );.        sAggI
27c10 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 50 54  nfo.sortingIdxPT
27c20 61 62 20 3d 20 73 6f 72 74 50 54 61 62 20 3d 20  ab = sortPTab = 
27c30 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
27c40 20 20 20 20 20 20 20 20 73 6f 72 74 4f 75 74 20          sortOut 
27c50 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
27c60 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
27c70 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
27c80 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65  AddOp3(v, OP_Ope
27c90 6e 50 73 65 75 64 6f 2c 20 73 6f 72 74 50 54 61  nPseudo, sortPTa
27ca0 62 2c 20 73 6f 72 74 4f 75 74 2c 20 6e 43 6f 6c  b, sortOut, nCol
27cb0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
27cc0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
27cd0 4f 50 5f 53 6f 72 74 65 72 53 6f 72 74 2c 20 73  OP_SorterSort, s
27ce0 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49  AggInfo.sortingI
27cf0 64 78 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20 20  dx, addrEnd);.  
27d00 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
27d10 74 28 28 76 2c 20 22 47 52 4f 55 50 20 42 59 20  t((v, "GROUP BY 
27d20 73 6f 72 74 22 29 29 3b 0a 20 20 20 20 20 20 20  sort"));.       
27d30 20 73 41 67 67 49 6e 66 6f 2e 75 73 65 53 6f 72   sAggInfo.useSor
27d40 74 69 6e 67 49 64 78 20 3d 20 31 3b 0a 20 20 20  tingIdx = 1;.   
27d50 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
27d60 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73  CacheClear(pPars
27d70 65 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  e);.      }..   
27d80 20 20 20 2f 2a 20 45 76 61 6c 75 61 74 65 20 74     /* Evaluate t
27d90 68 65 20 63 75 72 72 65 6e 74 20 47 52 4f 55 50  he current GROUP
27da0 20 42 59 20 74 65 72 6d 73 20 61 6e 64 20 73 74   BY terms and st
27db0 6f 72 65 20 69 6e 20 62 30 2c 20 62 31 2c 20 62  ore in b0, b1, b
27dc0 32 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 28 62  2....      ** (b
27dd0 30 20 69 73 20 6d 65 6d 6f 72 79 20 6c 6f 63 61  0 is memory loca
27de0 74 69 6f 6e 20 69 42 4d 65 6d 2b 30 2c 20 62 31  tion iBMem+0, b1
27df0 20 69 73 20 69 42 4d 65 6d 2b 31 2c 20 61 6e 64   is iBMem+1, and
27e00 20 73 6f 20 66 6f 72 74 68 29 0a 20 20 20 20 20   so forth).     
27e10 20 2a 2a 20 54 68 65 6e 20 63 6f 6d 70 61 72 65   ** Then compare
27e20 20 74 68 65 20 63 75 72 72 65 6e 74 20 47 52 4f   the current GRO
27e30 55 50 20 42 59 20 74 65 72 6d 73 20 61 67 61 69  UP BY terms agai
27e40 6e 73 74 20 74 68 65 20 47 52 4f 55 50 20 42 59  nst the GROUP BY
27e50 20 74 65 72 6d 73 0a 20 20 20 20 20 20 2a 2a 20   terms.      ** 
27e60 66 72 6f 6d 20 74 68 65 20 70 72 65 76 69 6f 75  from the previou
27e70 73 20 72 6f 77 20 63 75 72 72 65 6e 74 6c 79 20  s row currently 
27e80 73 74 6f 72 65 64 20 69 6e 20 61 30 2c 20 61 31  stored in a0, a1
27e90 2c 20 61 32 2e 2e 2e 0a 20 20 20 20 20 20 2a 2f  , a2....      */
27ea0 0a 20 20 20 20 20 20 61 64 64 72 54 6f 70 4f 66  .      addrTopOf
27eb0 4c 6f 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64  Loop = sqlite3Vd
27ec0 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
27ed0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
27ee0 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50  xprCacheClear(pP
27ef0 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69 66 28  arse);.      if(
27f00 20 67 72 6f 75 70 42 79 53 6f 72 74 20 29 7b 0a   groupBySort ){.
27f10 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
27f20 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
27f30 53 6f 72 74 65 72 44 61 74 61 2c 20 73 41 67 67  SorterData, sAgg
27f40 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c  Info.sortingIdx,
27f50 20 73 6f 72 74 4f 75 74 29 3b 0a 20 20 20 20 20   sortOut);.     
27f60 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30   }.      for(j=0
27f70 3b 20 6a 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45  ; j<pGroupBy->nE
27f80 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  xpr; j++){.     
27f90 20 20 20 69 66 28 20 67 72 6f 75 70 42 79 53 6f     if( groupBySo
27fa0 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rt ){.          
27fb0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
27fc0 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  3(v, OP_Column, 
27fd0 73 6f 72 74 50 54 61 62 2c 20 6a 2c 20 69 42 4d  sortPTab, j, iBM
27fe0 65 6d 2b 6a 29 3b 0a 20 20 20 20 20 20 20 20 20  em+j);.         
27ff0 20 69 66 28 20 6a 3d 3d 30 20 29 20 73 71 6c 69   if( j==0 ) sqli
28000 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
28010 76 2c 20 4f 50 46 4c 41 47 5f 43 4c 45 41 52 43  v, OPFLAG_CLEARC
28020 41 43 48 45 29 3b 0a 20 20 20 20 20 20 20 20 7d  ACHE);.        }
28030 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
28040 73 41 67 67 49 6e 66 6f 2e 64 69 72 65 63 74 4d  sAggInfo.directM
28050 6f 64 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ode = 1;.       
28060 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
28070 64 65 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75  de(pParse, pGrou
28080 70 42 79 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72 2c  pBy->a[j].pExpr,
28090 20 69 42 4d 65 6d 2b 6a 29 3b 0a 20 20 20 20 20   iBMem+j);.     
280a0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
280b0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
280c0 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6d 70 61  dOp4(v, OP_Compa
280d0 72 65 2c 20 69 41 4d 65 6d 2c 20 69 42 4d 65 6d  re, iAMem, iBMem
280e0 2c 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  , pGroupBy->nExp
280f0 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r,.             
28100 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
28110 61 72 2a 29 73 71 6c 69 74 65 33 4b 65 79 49 6e  ar*)sqlite3KeyIn
28120 66 6f 52 65 66 28 70 4b 65 79 49 6e 66 6f 29 2c  foRef(pKeyInfo),
28130 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20   P4_KEYINFO);.  
28140 20 20 20 20 6a 31 20 3d 20 73 71 6c 69 74 65 33      j1 = sqlite3
28150 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
28160 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
28170 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
28180 50 5f 4a 75 6d 70 2c 20 6a 31 2b 31 2c 20 30 2c  P_Jump, j1+1, 0,
28190 20 6a 31 2b 31 29 3b 0a 0a 20 20 20 20 20 20 2f   j1+1);..      /
281a0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
281b0 74 68 61 74 20 72 75 6e 73 20 77 68 65 6e 65 76  that runs whenev
281c0 65 72 20 74 68 65 20 47 52 4f 55 50 20 42 59 20  er the GROUP BY 
281d0 63 68 61 6e 67 65 73 2e 0a 20 20 20 20 20 20 2a  changes..      *
281e0 2a 20 43 68 61 6e 67 65 73 20 69 6e 20 74 68 65  * Changes in the
281f0 20 47 52 4f 55 50 20 42 59 20 61 72 65 20 64 65   GROUP BY are de
28200 74 65 63 74 65 64 20 62 79 20 74 68 65 20 70 72  tected by the pr
28210 65 76 69 6f 75 73 20 63 6f 64 65 0a 20 20 20 20  evious code.    
28220 20 20 2a 2a 20 62 6c 6f 63 6b 2e 20 20 49 66 20    ** block.  If 
28230 74 68 65 72 65 20 77 65 72 65 20 6e 6f 20 63 68  there were no ch
28240 61 6e 67 65 73 2c 20 74 68 69 73 20 62 6c 6f 63  anges, this bloc
28250 6b 20 69 73 20 73 6b 69 70 70 65 64 2e 0a 20 20  k is skipped..  
28260 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
28270 54 68 69 73 20 63 6f 64 65 20 63 6f 70 69 65 73  This code copies
28280 20 63 75 72 72 65 6e 74 20 67 72 6f 75 70 20 62   current group b
28290 79 20 74 65 72 6d 73 20 69 6e 20 62 30 2c 62 31  y terms in b0,b1
282a0 2c 62 32 2c 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a  ,b2,....      **
282b0 20 6f 76 65 72 20 74 6f 20 61 30 2c 61 31 2c 61   over to a0,a1,a
282c0 32 2e 20 20 49 74 20 74 68 65 6e 20 63 61 6c 6c  2.  It then call
282d0 73 20 74 68 65 20 6f 75 74 70 75 74 20 73 75 62  s the output sub
282e0 72 6f 75 74 69 6e 65 0a 20 20 20 20 20 20 2a 2a  routine.      **
282f0 20 61 6e 64 20 72 65 73 65 74 73 20 74 68 65 20   and resets the 
28300 61 67 67 72 65 67 61 74 65 20 61 63 63 75 6d 75  aggregate accumu
28310 6c 61 74 6f 72 20 72 65 67 69 73 74 65 72 73 20  lator registers 
28320 69 6e 20 70 72 65 70 61 72 61 74 69 6f 6e 0a 20  in preparation. 
28330 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20       ** for the 
28340 6e 65 78 74 20 47 52 4f 55 50 20 42 59 20 62 61  next GROUP BY ba
28350 74 63 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  tch..      */.  
28360 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
28370 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20  odeMove(pParse, 
28380 69 42 4d 65 6d 2c 20 69 41 4d 65 6d 2c 20 70 47  iBMem, iAMem, pG
28390 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 29 3b 0a  roupBy->nExpr);.
283a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
283b0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
283c0 73 75 62 2c 20 72 65 67 4f 75 74 70 75 74 52 6f  sub, regOutputRo
283d0 77 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77  w, addrOutputRow
283e0 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
283f0 6d 65 6e 74 28 28 76 2c 20 22 6f 75 74 70 75 74  ment((v, "output
28400 20 6f 6e 65 20 72 6f 77 22 29 29 3b 0a 20 20 20   one row"));.   
28410 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
28420 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 50 6f 73  dOp2(v, OP_IfPos
28430 2c 20 69 41 62 6f 72 74 46 6c 61 67 2c 20 61 64  , iAbortFlag, ad
28440 64 72 45 6e 64 29 3b 0a 20 20 20 20 20 20 56 64  drEnd);.      Vd
28450 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 63  beComment((v, "c
28460 68 65 63 6b 20 61 62 6f 72 74 20 66 6c 61 67 22  heck abort flag"
28470 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
28480 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
28490 50 5f 47 6f 73 75 62 2c 20 72 65 67 52 65 73 65  P_Gosub, regRese
284a0 74 2c 20 61 64 64 72 52 65 73 65 74 29 3b 0a 20  t, addrReset);. 
284b0 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
284c0 28 28 76 2c 20 22 72 65 73 65 74 20 61 63 63 75  ((v, "reset accu
284d0 6d 75 6c 61 74 6f 72 22 29 29 3b 0a 0a 20 20 20  mulator"));..   
284e0 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65     /* Update the
284f0 20 61 67 67 72 65 67 61 74 65 20 61 63 63 75 6d   aggregate accum
28500 75 6c 61 74 6f 72 73 20 62 61 73 65 64 20 6f 6e  ulators based on
28510 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 0a   the content of.
28520 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72        ** the cur
28530 72 65 6e 74 20 72 6f 77 0a 20 20 20 20 20 20 2a  rent row.      *
28540 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  /.      sqlite3V
28550 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a  dbeJumpHere(v, j
28560 31 29 3b 0a 20 20 20 20 20 20 75 70 64 61 74 65  1);.      update
28570 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72  Accumulator(pPar
28580 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a  se, &sAggInfo);.
28590 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
285a0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
285b0 74 65 67 65 72 2c 20 31 2c 20 69 55 73 65 46 6c  teger, 1, iUseFl
285c0 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  ag);.      VdbeC
285d0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 69 6e 64 69  omment((v, "indi
285e0 63 61 74 65 20 64 61 74 61 20 69 6e 20 61 63 63  cate data in acc
285f0 75 6d 75 6c 61 74 6f 72 22 29 29 3b 0a 0a 20 20  umulator"));..  
28600 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68      /* End of th
28610 65 20 6c 6f 6f 70 0a 20 20 20 20 20 20 2a 2f 0a  e loop.      */.
28620 20 20 20 20 20 20 69 66 28 20 67 72 6f 75 70 42        if( groupB
28630 79 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20  ySort ){.       
28640 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
28650 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4e  p2(v, OP_SorterN
28660 65 78 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f  ext, sAggInfo.so
28670 72 74 69 6e 67 49 64 78 2c 20 61 64 64 72 54 6f  rtingIdx, addrTo
28680 70 4f 66 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20  pOfLoop);.      
28690 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
286a0 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70  qlite3WhereEnd(p
286b0 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  WInfo);.        
286c0 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
286d0 65 54 6f 4e 6f 6f 70 28 76 2c 20 61 64 64 72 53  eToNoop(v, addrS
286e0 6f 72 74 69 6e 67 49 64 78 29 3b 0a 20 20 20 20  ortingIdx);.    
286f0 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 4f 75    }..      /* Ou
28700 74 70 75 74 20 74 68 65 20 66 69 6e 61 6c 20 72  tput the final r
28710 6f 77 20 6f 66 20 72 65 73 75 6c 74 0a 20 20 20  ow of result.   
28720 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69     */.      sqli
28730 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
28740 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75   OP_Gosub, regOu
28750 74 70 75 74 52 6f 77 2c 20 61 64 64 72 4f 75 74  tputRow, addrOut
28760 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 56  putRow);.      V
28770 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
28780 6f 75 74 70 75 74 20 66 69 6e 61 6c 20 72 6f 77  output final row
28790 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 4a  "));..      /* J
287a0 75 6d 70 20 6f 76 65 72 20 74 68 65 20 73 75 62  ump over the sub
287b0 72 6f 75 74 69 6e 65 73 0a 20 20 20 20 20 20 2a  routines.      *
287c0 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  /.      sqlite3V
287d0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
287e0 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 45 6e 64  Goto, 0, addrEnd
287f0 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e  );..      /* Gen
28800 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69  erate a subrouti
28810 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74 73 20  ne that outputs 
28820 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20  a single row of 
28830 74 68 65 20 72 65 73 75 6c 74 0a 20 20 20 20 20  the result.     
28840 20 2a 2a 20 73 65 74 2e 20 20 54 68 69 73 20 73   ** set.  This s
28850 75 62 72 6f 75 74 69 6e 65 20 66 69 72 73 74 20  ubroutine first 
28860 6c 6f 6f 6b 73 20 61 74 20 74 68 65 20 69 55 73  looks at the iUs
28870 65 46 6c 61 67 2e 20 20 49 66 20 69 55 73 65 46  eFlag.  If iUseF
28880 6c 61 67 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  lag.      ** is 
28890 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75  less than or equ
288a0 61 6c 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 20  al to zero, the 
288b0 73 75 62 72 6f 75 74 69 6e 65 20 69 73 20 61 20  subroutine is a 
288c0 6e 6f 2d 6f 70 2e 20 20 49 66 0a 20 20 20 20 20  no-op.  If.     
288d0 20 2a 2a 20 74 68 65 20 70 72 6f 63 65 73 73 69   ** the processi
288e0 6e 67 20 63 61 6c 6c 73 20 66 6f 72 20 74 68 65  ng calls for the
288f0 20 71 75 65 72 79 20 74 6f 20 61 62 6f 72 74 2c   query to abort,
28900 20 74 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65   this subroutine
28910 0a 20 20 20 20 20 20 2a 2a 20 69 6e 63 72 65 6d  .      ** increm
28920 65 6e 74 73 20 74 68 65 20 69 41 62 6f 72 74 46  ents the iAbortF
28930 6c 61 67 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74  lag memory locat
28940 69 6f 6e 20 62 65 66 6f 72 65 20 72 65 74 75 72  ion before retur
28950 6e 69 6e 67 20 69 6e 0a 20 20 20 20 20 20 2a 2a  ning in.      **
28960 20 6f 72 64 65 72 20 74 6f 20 73 69 67 6e 61 6c   order to signal
28970 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 61   the caller to a
28980 62 6f 72 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  bort..      */. 
28990 20 20 20 20 20 61 64 64 72 53 65 74 41 62 6f 72       addrSetAbor
289a0 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  t = sqlite3VdbeC
289b0 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
289c0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
289d0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
289e0 65 67 65 72 2c 20 31 2c 20 69 41 62 6f 72 74 46  eger, 1, iAbortF
289f0 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65  lag);.      Vdbe
28a00 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 73 65 74  Comment((v, "set
28a10 20 61 62 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a   abort flag"));.
28a20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
28a30 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65  eAddOp1(v, OP_Re
28a40 74 75 72 6e 2c 20 72 65 67 4f 75 74 70 75 74 52  turn, regOutputR
28a50 6f 77 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ow);.      sqlit
28a60 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
28a70 65 6c 28 76 2c 20 61 64 64 72 4f 75 74 70 75 74  el(v, addrOutput
28a80 52 6f 77 29 3b 0a 20 20 20 20 20 20 61 64 64 72  Row);.      addr
28a90 4f 75 74 70 75 74 52 6f 77 20 3d 20 73 71 6c 69  OutputRow = sqli
28aa0 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
28ab0 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c  dr(v);.      sql
28ac0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
28ad0 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69 55 73 65  , OP_IfPos, iUse
28ae0 46 6c 61 67 2c 20 61 64 64 72 4f 75 74 70 75 74  Flag, addrOutput
28af0 52 6f 77 2b 32 29 3b 0a 20 20 20 20 20 20 56 64  Row+2);.      Vd
28b00 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 47  beComment((v, "G
28b10 72 6f 75 70 62 79 20 72 65 73 75 6c 74 20 67 65  roupby result ge
28b20 6e 65 72 61 74 6f 72 20 65 6e 74 72 79 20 70 6f  nerator entry po
28b30 69 6e 74 22 29 29 3b 0a 20 20 20 20 20 20 73 71  int"));.      sq
28b40 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
28b50 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65  v, OP_Return, re
28b60 67 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20  gOutputRow);.   
28b70 20 20 20 66 69 6e 61 6c 69 7a 65 41 67 67 46 75     finalizeAggFu
28b80 6e 63 74 69 6f 6e 73 28 70 50 61 72 73 65 2c 20  nctions(pParse, 
28b90 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20  &sAggInfo);.    
28ba0 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
28bb0 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 48 61  alse(pParse, pHa
28bc0 76 69 6e 67 2c 20 61 64 64 72 4f 75 74 70 75 74  ving, addrOutput
28bd0 52 6f 77 2b 31 2c 20 53 51 4c 49 54 45 5f 4a 55  Row+1, SQLITE_JU
28be0 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  MPIFNULL);.     
28bf0 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70   selectInnerLoop
28c00 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70  (pParse, p, p->p
28c10 45 4c 69 73 74 2c 20 30 2c 20 30 2c 20 70 4f 72  EList, 0, 0, pOr
28c20 64 65 72 42 79 2c 0a 20 20 20 20 20 20 20 20 20  derBy,.         
28c30 20 20 20 20 20 20 20 20 20 20 20 20 20 26 73 44               &sD
28c40 69 73 74 69 6e 63 74 2c 20 70 44 65 73 74 2c 0a  istinct, pDest,.
28c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28c60 20 20 20 20 20 20 61 64 64 72 4f 75 74 70 75 74        addrOutput
28c70 52 6f 77 2b 31 2c 20 61 64 64 72 53 65 74 41 62  Row+1, addrSetAb
28c80 6f 72 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ort);.      sqli
28c90 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
28ca0 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 4f   OP_Return, regO
28cb0 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20  utputRow);.     
28cc0 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
28cd0 20 22 65 6e 64 20 67 72 6f 75 70 62 79 20 72 65   "end groupby re
28ce0 73 75 6c 74 20 67 65 6e 65 72 61 74 6f 72 22 29  sult generator")
28cf0 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e  );..      /* Gen
28d00 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69  erate a subrouti
28d10 6e 65 20 74 68 61 74 20 77 69 6c 6c 20 72 65 73  ne that will res
28d20 65 74 20 74 68 65 20 67 72 6f 75 70 2d 62 79 20  et the group-by 
28d30 61 63 63 75 6d 75 6c 61 74 6f 72 0a 20 20 20 20  accumulator.    
28d40 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74    */.      sqlit
28d50 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
28d60 65 6c 28 76 2c 20 61 64 64 72 52 65 73 65 74 29  el(v, addrReset)
28d70 3b 0a 20 20 20 20 20 20 72 65 73 65 74 41 63 63  ;.      resetAcc
28d80 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c  umulator(pParse,
28d90 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20   &sAggInfo);.   
28da0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
28db0 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72  dOp1(v, OP_Retur
28dc0 6e 2c 20 72 65 67 52 65 73 65 74 29 3b 0a 20 20  n, regReset);.  
28dd0 20 20 20 0a 20 20 20 20 7d 20 2f 2a 20 65 6e 64     .    } /* end
28de0 69 66 20 70 47 72 6f 75 70 42 79 2e 20 20 42 65  if pGroupBy.  Be
28df0 67 69 6e 20 61 67 67 72 65 67 61 74 65 20 71 75  gin aggregate qu
28e00 65 72 69 65 73 20 77 69 74 68 6f 75 74 20 47 52  eries without GR
28e10 4f 55 50 20 42 59 3a 20 2a 2f 0a 20 20 20 20 65  OUP BY: */.    e
28e20 6c 73 65 20 7b 0a 20 20 20 20 20 20 45 78 70 72  lse {.      Expr
28e30 4c 69 73 74 20 2a 70 44 65 6c 20 3d 20 30 3b 0a  List *pDel = 0;.
28e40 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
28e50 4d 49 54 5f 42 54 52 45 45 43 4f 55 4e 54 0a 20  MIT_BTREECOUNT. 
28e60 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62       Table *pTab
28e70 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 54 61  ;.      if( (pTa
28e80 62 20 3d 20 69 73 53 69 6d 70 6c 65 43 6f 75 6e  b = isSimpleCoun
28e90 74 28 70 2c 20 26 73 41 67 67 49 6e 66 6f 29 29  t(p, &sAggInfo))
28ea0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  !=0 ){.        /
28eb0 2a 20 49 66 20 69 73 53 69 6d 70 6c 65 43 6f 75  * If isSimpleCou
28ec0 6e 74 28 29 20 72 65 74 75 72 6e 73 20 61 20 70  nt() returns a p
28ed0 6f 69 6e 74 65 72 20 74 6f 20 61 20 54 61 62 6c  ointer to a Tabl
28ee0 65 20 73 74 72 75 63 74 75 72 65 2c 20 74 68 65  e structure, the
28ef0 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  n.        ** the
28f00 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 69   SQL statement i
28f10 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 20  s of the form:. 
28f20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
28f30 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 63 6f    **   SELECT co
28f40 75 6e 74 28 2a 29 20 46 52 4f 4d 20 3c 74 62 6c  unt(*) FROM <tbl
28f50 3e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  >.        **.   
28f60 20 20 20 20 20 2a 2a 20 77 68 65 72 65 20 74 68       ** where th
28f70 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72  e Table structur
28f80 65 20 72 65 74 75 72 6e 65 64 20 72 65 70 72 65  e returned repre
28f90 73 65 6e 74 73 20 74 61 62 6c 65 20 3c 74 62 6c  sents table <tbl
28fa0 3e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  >..        **.  
28fb0 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 73 74        ** This st
28fc0 61 74 65 6d 65 6e 74 20 69 73 20 73 6f 20 63 6f  atement is so co
28fd0 6d 6d 6f 6e 20 74 68 61 74 20 69 74 20 69 73 20  mmon that it is 
28fe0 6f 70 74 69 6d 69 7a 65 64 20 73 70 65 63 69 61  optimized specia
28ff0 6c 6c 79 2e 20 54 68 65 0a 20 20 20 20 20 20 20  lly. The.       
29000 20 2a 2a 20 4f 50 5f 43 6f 75 6e 74 20 69 6e 73   ** OP_Count ins
29010 74 72 75 63 74 69 6f 6e 20 69 73 20 65 78 65 63  truction is exec
29020 75 74 65 64 20 65 69 74 68 65 72 20 6f 6e 20 74  uted either on t
29030 68 65 20 69 6e 74 6b 65 79 20 74 61 62 6c 65 20  he intkey table 
29040 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  that.        ** 
29050 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 64 61 74  contains the dat
29060 61 20 66 6f 72 20 74 61 62 6c 65 20 3c 74 62 6c  a for table <tbl
29070 3e 20 6f 72 20 6f 6e 20 6f 6e 65 20 6f 66 20 69  > or on one of i
29080 74 73 20 69 6e 64 65 78 65 73 2e 20 49 74 0a 20  ts indexes. It. 
29090 20 20 20 20 20 20 20 2a 2a 20 69 73 20 62 65 74         ** is bet
290a0 74 65 72 20 74 6f 20 65 78 65 63 75 74 65 20 74  ter to execute t
290b0 68 65 20 6f 70 20 6f 6e 20 61 6e 20 69 6e 64 65  he op on an inde
290c0 78 2c 20 61 73 20 69 6e 64 65 78 65 73 20 61 72  x, as indexes ar
290d0 65 20 61 6c 6d 6f 73 74 0a 20 20 20 20 20 20 20  e almost.       
290e0 20 2a 2a 20 61 6c 77 61 79 73 20 73 70 72 65 61   ** always sprea
290f0 64 20 61 63 72 6f 73 73 20 6c 65 73 73 20 70 61  d across less pa
29100 67 65 73 20 74 68 61 6e 20 74 68 65 69 72 20 63  ges than their c
29110 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 61 62  orresponding tab
29120 6c 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  les..        */.
29130 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e          const in
29140 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53  t iDb = sqlite3S
29150 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61  chemaToIndex(pPa
29160 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70  rse->db, pTab->p
29170 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 20  Schema);.       
29180 20 63 6f 6e 73 74 20 69 6e 74 20 69 43 73 72 20   const int iCsr 
29190 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
291a0 3b 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20  ;     /* Cursor 
291b0 74 6f 20 73 63 61 6e 20 62 2d 74 72 65 65 20 2a  to scan b-tree *
291c0 2f 0a 20 20 20 20 20 20 20 20 49 6e 64 65 78 20  /.        Index 
291d0 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20 20 20  *pIdx;          
291e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
291f0 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72 69 61  * Iterator varia
29200 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 4b  ble */.        K
29210 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
29220 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
29230 20 20 20 20 2f 2a 20 4b 65 79 69 6e 66 6f 20 66      /* Keyinfo f
29240 6f 72 20 73 63 61 6e 6e 65 64 20 69 6e 64 65 78  or scanned index
29250 20 2a 2f 0a 20 20 20 20 20 20 20 20 49 6e 64 65   */.        Inde
29260 78 20 2a 70 42 65 73 74 20 3d 20 30 3b 20 20 20  x *pBest = 0;   
29270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29280 20 2f 2a 20 42 65 73 74 20 69 6e 64 65 78 20 66   /* Best index f
29290 6f 75 6e 64 20 73 6f 20 66 61 72 20 2a 2f 0a 20  ound so far */. 
292a0 20 20 20 20 20 20 20 69 6e 74 20 69 52 6f 6f 74         int iRoot
292b0 20 3d 20 70 54 61 62 2d 3e 74 6e 75 6d 3b 20 20   = pTab->tnum;  
292c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
292d0 6f 6f 74 20 70 61 67 65 20 6f 66 20 73 63 61 6e  oot page of scan
292e0 6e 65 64 20 62 2d 74 72 65 65 20 2a 2f 0a 0a 20  ned b-tree */.. 
292f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f         sqlite3Co
29300 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70  deVerifySchema(p
29310 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20  Parse, iDb);.   
29320 20 20 20 20 20 73 71 6c 69 74 65 33 54 61 62 6c       sqlite3Tabl
29330 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44  eLock(pParse, iD
29340 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 30  b, pTab->tnum, 0
29350 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
29360 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 65 61 72  .        /* Sear
29370 63 68 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78  ch for the index
29380 20 74 68 61 74 20 68 61 73 20 74 68 65 20 6c 6f   that has the lo
29390 77 65 73 74 20 73 63 61 6e 20 63 6f 73 74 2e 0a  west scan cost..
293a0 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
293b0 20 20 20 2a 2a 20 28 32 30 31 31 2d 30 34 2d 31     ** (2011-04-1
293c0 35 29 20 44 6f 20 6e 6f 74 20 64 6f 20 61 20 66  5) Do not do a f
293d0 75 6c 6c 20 73 63 61 6e 20 6f 66 20 61 6e 20 75  ull scan of an u
293e0 6e 6f 72 64 65 72 65 64 20 69 6e 64 65 78 2e 0a  nordered index..
293f0 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
29400 20 20 20 2a 2a 20 28 32 30 31 33 2d 31 30 2d 30     ** (2013-10-0
29410 33 29 20 44 6f 20 6e 6f 74 20 63 6f 75 6e 74 20  3) Do not count 
29420 74 68 65 20 65 6e 74 72 69 65 73 20 69 6e 20 61  the entries in a
29430 20 70 61 72 74 69 61 6c 20 69 6e 64 65 78 2e 0a   partial index..
29440 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
29450 20 20 20 2a 2a 20 49 6e 20 70 72 61 63 74 69 63     ** In practic
29460 65 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74  e the KeyInfo st
29470 72 75 63 74 75 72 65 20 77 69 6c 6c 20 6e 6f 74  ructure will not
29480 20 62 65 20 75 73 65 64 2e 20 49 74 20 69 73 20   be used. It is 
29490 6f 6e 6c 79 20 0a 20 20 20 20 20 20 20 20 2a 2a  only .        **
294a0 20 70 61 73 73 65 64 20 74 6f 20 6b 65 65 70 20   passed to keep 
294b0 4f 50 5f 4f 70 65 6e 52 65 61 64 20 68 61 70 70  OP_OpenRead happ
294c0 79 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  y..        */.  
294d0 20 20 20 20 20 20 69 66 28 20 21 48 61 73 52 6f        if( !HasRo
294e0 77 69 64 28 70 54 61 62 29 20 29 20 70 42 65 73  wid(pTab) ) pBes
294f0 74 20 3d 20 73 71 6c 69 74 65 33 50 72 69 6d 61  t = sqlite3Prima
29500 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29  ryKeyIndex(pTab)
29510 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 70 49  ;.        for(pI
29520 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  dx=pTab->pIndex;
29530 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78   pIdx; pIdx=pIdx
29540 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
29550 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 62 55      if( pIdx->bU
29560 6e 6f 72 64 65 72 65 64 3d 3d 30 0a 20 20 20 20  nordered==0.    
29570 20 20 20 20 20 20 20 26 26 20 70 49 64 78 2d 3e         && pIdx->
29580 73 7a 49 64 78 52 6f 77 3c 70 54 61 62 2d 3e 73  szIdxRow<pTab->s
29590 7a 54 61 62 52 6f 77 0a 20 20 20 20 20 20 20 20  zTabRow.        
295a0 20 20 20 26 26 20 70 49 64 78 2d 3e 70 50 61 72     && pIdx->pPar
295b0 74 49 64 78 57 68 65 72 65 3d 3d 30 0a 20 20 20  tIdxWhere==0.   
295c0 20 20 20 20 20 20 20 20 26 26 20 28 21 70 42 65          && (!pBe
295d0 73 74 20 7c 7c 20 70 49 64 78 2d 3e 73 7a 49 64  st || pIdx->szId
295e0 78 52 6f 77 3c 70 42 65 73 74 2d 3e 73 7a 49 64  xRow<pBest->szId
295f0 78 52 6f 77 29 0a 20 20 20 20 20 20 20 20 20 20  xRow).          
29600 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
29610 42 65 73 74 20 3d 20 70 49 64 78 3b 0a 20 20 20  Best = pIdx;.   
29620 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
29630 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70   }.        if( p
29640 42 65 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Best ){.        
29650 20 20 69 52 6f 6f 74 20 3d 20 70 42 65 73 74 2d    iRoot = pBest-
29660 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20 20 20 20  >tnum;.         
29670 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69   pKeyInfo = sqli
29680 74 65 33 4b 65 79 49 6e 66 6f 4f 66 49 6e 64 65  te3KeyInfoOfInde
29690 78 28 70 50 61 72 73 65 2c 20 70 42 65 73 74 29  x(pParse, pBest)
296a0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
296b0 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 61 20 72       /* Open a r
296c0 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 2c  ead-only cursor,
296d0 20 65 78 65 63 75 74 65 20 74 68 65 20 4f 50 5f   execute the OP_
296e0 43 6f 75 6e 74 2c 20 63 6c 6f 73 65 20 74 68 65  Count, close the
296f0 20 63 75 72 73 6f 72 2e 20 2a 2f 0a 20 20 20 20   cursor. */.    
29700 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
29710 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 4f  ddOp4Int(v, OP_O
29720 70 65 6e 52 65 61 64 2c 20 69 43 73 72 2c 20 69  penRead, iCsr, i
29730 52 6f 6f 74 2c 20 69 44 62 2c 20 31 29 3b 0a 20  Root, iDb, 1);. 
29740 20 20 20 20 20 20 20 69 66 28 20 70 4b 65 79 49         if( pKeyI
29750 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20  nfo ){.         
29760 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
29770 67 65 50 34 28 76 2c 20 2d 31 2c 20 28 63 68 61  geP4(v, -1, (cha
29780 72 20 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34  r *)pKeyInfo, P4
29790 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20  _KEYINFO);.     
297a0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
297b0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
297c0 2c 20 4f 50 5f 43 6f 75 6e 74 2c 20 69 43 73 72  , OP_Count, iCsr
297d0 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63  , sAggInfo.aFunc
297e0 5b 30 5d 2e 69 4d 65 6d 29 3b 0a 20 20 20 20 20  [0].iMem);.     
297f0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
29800 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  dOp1(v, OP_Close
29810 2c 20 69 43 73 72 29 3b 0a 20 20 20 20 20 20 20  , iCsr);.       
29820 20 65 78 70 6c 61 69 6e 53 69 6d 70 6c 65 43 6f   explainSimpleCo
29830 75 6e 74 28 70 50 61 72 73 65 2c 20 70 54 61 62  unt(pParse, pTab
29840 2c 20 70 42 65 73 74 29 3b 0a 20 20 20 20 20 20  , pBest);.      
29850 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20  }else.#endif /* 
29860 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 54 52 45  SQLITE_OMIT_BTRE
29870 45 43 4f 55 4e 54 20 2a 2f 0a 20 20 20 20 20 20  ECOUNT */.      
29880 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65  {.        /* Che
29890 63 6b 20 69 66 20 74 68 65 20 71 75 65 72 79 20  ck if the query 
298a0 69 73 20 6f 66 20 6f 6e 65 20 6f 66 20 74 68 65  is of one of the
298b0 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d 73   following forms
298c0 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  :.        **.   
298d0 20 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54       **   SELECT
298e0 20 6d 69 6e 28 78 29 20 46 52 4f 4d 20 2e 2e 2e   min(x) FROM ...
298f0 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 53 45  .        **   SE
29900 4c 45 43 54 20 6d 61 78 28 78 29 20 46 52 4f 4d  LECT max(x) FROM
29910 20 2e 2e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a   ....        **.
29920 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20 69 74          ** If it
29930 20 69 73 2c 20 74 68 65 6e 20 61 73 6b 20 74 68   is, then ask th
29940 65 20 63 6f 64 65 20 69 6e 20 77 68 65 72 65 2e  e code in where.
29950 63 20 74 6f 20 61 74 74 65 6d 70 74 20 74 6f 20  c to attempt to 
29960 73 6f 72 74 20 72 65 73 75 6c 74 73 0a 20 20 20  sort results.   
29970 20 20 20 20 20 2a 2a 20 61 73 20 69 66 20 74 68       ** as if th
29980 65 72 65 20 77 61 73 20 61 6e 20 22 4f 52 44 45  ere was an "ORDE
29990 52 20 4f 4e 20 78 22 20 6f 72 20 22 4f 52 44 45  R ON x" or "ORDE
299a0 52 20 4f 4e 20 78 20 44 45 53 43 22 20 63 6c 61  R ON x DESC" cla
299b0 75 73 65 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a  use. .        **
299c0 20 49 66 20 77 68 65 72 65 2e 63 20 69 73 20 61   If where.c is a
299d0 62 6c 65 20 74 6f 20 70 72 6f 64 75 63 65 20 72  ble to produce r
299e0 65 73 75 6c 74 73 20 73 6f 72 74 65 64 20 69 6e  esults sorted in
299f0 20 74 68 69 73 20 6f 72 64 65 72 2c 20 74 68 65   this order, the
29a00 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 64 64  n.        ** add
29a10 20 76 64 62 65 20 63 6f 64 65 20 74 6f 20 62 72   vdbe code to br
29a20 65 61 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 70  eak out of the p
29a30 72 6f 63 65 73 73 69 6e 67 20 6c 6f 6f 70 20 61  rocessing loop a
29a40 66 74 65 72 20 74 68 65 20 0a 20 20 20 20 20 20  fter the .      
29a50 20 20 2a 2a 20 66 69 72 73 74 20 69 74 65 72 61    ** first itera
29a60 74 69 6f 6e 20 28 73 69 6e 63 65 20 74 68 65 20  tion (since the 
29a70 66 69 72 73 74 20 69 74 65 72 61 74 69 6f 6e 20  first iteration 
29a80 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69 73 20 0a  of the loop is .
29a90 20 20 20 20 20 20 20 20 2a 2a 20 67 75 61 72 61          ** guara
29aa0 6e 74 65 65 64 20 74 6f 20 6f 70 65 72 61 74 65  nteed to operate
29ab0 20 6f 6e 20 74 68 65 20 72 6f 77 20 77 69 74 68   on the row with
29ac0 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 6f 72 20   the minimum or 
29ad0 6d 61 78 69 6d 75 6d 20 0a 20 20 20 20 20 20 20  maximum .       
29ae0 20 2a 2a 20 76 61 6c 75 65 20 6f 66 20 78 2c 20   ** value of x, 
29af0 74 68 65 20 6f 6e 6c 79 20 72 6f 77 20 72 65 71  the only row req
29b00 75 69 72 65 64 29 2e 0a 20 20 20 20 20 20 20 20  uired)..        
29b10 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 41 20  **.        ** A 
29b20 73 70 65 63 69 61 6c 20 66 6c 61 67 20 6d 75 73  special flag mus
29b30 74 20 62 65 20 70 61 73 73 65 64 20 74 6f 20 73  t be passed to s
29b40 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
29b50 28 29 20 74 6f 20 73 6c 69 67 68 74 6c 79 0a 20  () to slightly. 
29b60 20 20 20 20 20 20 20 2a 2a 20 6d 6f 64 69 66 79         ** modify
29b70 20 62 65 68 61 76 69 6f 72 20 61 73 20 66 6f 6c   behavior as fol
29b80 6c 6f 77 73 3a 0a 20 20 20 20 20 20 20 20 2a 2a  lows:.        **
29b90 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 2b 20  .        **   + 
29ba0 49 66 20 74 68 65 20 71 75 65 72 79 20 69 73 20  If the query is 
29bb0 61 20 22 53 45 4c 45 43 54 20 6d 69 6e 28 78 29  a "SELECT min(x)
29bc0 22 2c 20 74 68 65 6e 20 74 68 65 20 6c 6f 6f 70  ", then the loop
29bd0 20 63 6f 64 65 64 20 62 79 0a 20 20 20 20 20 20   coded by.      
29be0 20 20 2a 2a 20 20 20 20 20 77 68 65 72 65 2e 63    **     where.c
29bf0 20 73 68 6f 75 6c 64 20 6e 6f 74 20 69 74 65 72   should not iter
29c00 61 74 65 20 6f 76 65 72 20 61 6e 79 20 76 61 6c  ate over any val
29c10 75 65 73 20 77 69 74 68 20 61 20 4e 55 4c 4c 20  ues with a NULL 
29c20 76 61 6c 75 65 0a 20 20 20 20 20 20 20 20 2a 2a  value.        **
29c30 20 20 20 20 20 66 6f 72 20 78 2e 0a 20 20 20 20       for x..    
29c40 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
29c50 2a 20 20 20 2b 20 54 68 65 20 6f 70 74 69 6d 69  *   + The optimi
29c60 7a 65 72 20 63 6f 64 65 20 69 6e 20 77 68 65 72  zer code in wher
29c70 65 2e 63 20 28 74 68 65 20 74 68 69 6e 67 20 74  e.c (the thing t
29c80 68 61 74 20 64 65 63 69 64 65 73 20 77 68 69 63  hat decides whic
29c90 68 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20  h.        **    
29ca0 20 69 6e 64 65 78 20 6f 72 20 69 6e 64 69 63 65   index or indice
29cb0 73 20 74 6f 20 75 73 65 29 20 73 68 6f 75 6c 64  s to use) should
29cc0 20 70 6c 61 63 65 20 61 20 64 69 66 66 65 72 65   place a differe
29cd0 6e 74 20 70 72 69 6f 72 69 74 79 20 6f 6e 20 0a  nt priority on .
29ce0 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 73          **     s
29cf0 61 74 69 73 66 79 69 6e 67 20 74 68 65 20 27 4f  atisfying the 'O
29d00 52 44 45 52 20 42 59 27 20 63 6c 61 75 73 65 20  RDER BY' clause 
29d10 74 68 61 6e 20 69 74 20 64 6f 65 73 20 69 6e 20  than it does in 
29d20 6f 74 68 65 72 20 63 61 73 65 73 2e 0a 20 20 20  other cases..   
29d30 20 20 20 20 20 2a 2a 20 20 20 20 20 52 65 66 65       **     Refe
29d40 72 20 74 6f 20 63 6f 64 65 20 61 6e 64 20 63 6f  r to code and co
29d50 6d 6d 65 6e 74 73 20 69 6e 20 77 68 65 72 65 2e  mments in where.
29d60 63 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 20  c for details.. 
29d70 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
29d80 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4d 69 6e    ExprList *pMin
29d90 4d 61 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Max = 0;.       
29da0 20 75 38 20 66 6c 61 67 20 3d 20 57 48 45 52 45   u8 flag = WHERE
29db0 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b  _ORDERBY_NORMAL;
29dc0 0a 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20  .        .      
29dd0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 47 72    assert( p->pGr
29de0 6f 75 70 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20  oupBy==0 );.    
29df0 20 20 20 20 61 73 73 65 72 74 28 20 66 6c 61 67      assert( flag
29e00 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69  ==0 );.        i
29e10 66 28 20 70 2d 3e 70 48 61 76 69 6e 67 3d 3d 30  f( p->pHaving==0
29e20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6c   ){.          fl
29e30 61 67 20 3d 20 6d 69 6e 4d 61 78 51 75 65 72 79  ag = minMaxQuery
29e40 28 26 73 41 67 67 49 6e 66 6f 2c 20 26 70 4d 69  (&sAggInfo, &pMi
29e50 6e 4d 61 78 29 3b 0a 20 20 20 20 20 20 20 20 7d  nMax);.        }
29e60 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
29e70 20 66 6c 61 67 3d 3d 30 20 7c 7c 20 28 70 4d 69   flag==0 || (pMi
29e80 6e 4d 61 78 21 3d 30 20 26 26 20 70 4d 69 6e 4d  nMax!=0 && pMinM
29e90 61 78 2d 3e 6e 45 78 70 72 3d 3d 31 29 20 29 3b  ax->nExpr==1) );
29ea0 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 66 6c  ..        if( fl
29eb0 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ag ){.          
29ec0 70 4d 69 6e 4d 61 78 20 3d 20 73 71 6c 69 74 65  pMinMax = sqlite
29ed0 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c  3ExprListDup(db,
29ee0 20 70 4d 69 6e 4d 61 78 2c 20 30 29 3b 0a 20 20   pMinMax, 0);.  
29ef0 20 20 20 20 20 20 20 20 70 44 65 6c 20 3d 20 70          pDel = p
29f00 4d 69 6e 4d 61 78 3b 0a 20 20 20 20 20 20 20 20  MinMax;.        
29f10 20 20 69 66 28 20 70 4d 69 6e 4d 61 78 20 26 26    if( pMinMax &&
29f20 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
29f30 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ed ){.          
29f40 20 20 70 4d 69 6e 4d 61 78 2d 3e 61 5b 30 5d 2e    pMinMax->a[0].
29f50 73 6f 72 74 4f 72 64 65 72 20 3d 20 66 6c 61 67  sortOrder = flag
29f60 21 3d 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  !=WHERE_ORDERBY_
29f70 4d 49 4e 20 3f 31 3a 30 3b 0a 20 20 20 20 20 20  MIN ?1:0;.      
29f80 20 20 20 20 20 20 70 4d 69 6e 4d 61 78 2d 3e 61        pMinMax->a
29f90 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 20 3d 20  [0].pExpr->op = 
29fa0 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20  TK_COLUMN;.     
29fb0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
29fc0 0a 20 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 54  .  .        /* T
29fd0 68 69 73 20 63 61 73 65 20 72 75 6e 73 20 69 66  his case runs if
29fe0 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20 68   the aggregate h
29ff0 61 73 20 6e 6f 20 47 52 4f 55 50 20 42 59 20 63  as no GROUP BY c
2a000 6c 61 75 73 65 2e 20 20 54 68 65 0a 20 20 20 20  lause.  The.    
2a010 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e      ** processin
2a020 67 20 69 73 20 6d 75 63 68 20 73 69 6d 70 6c 65  g is much simple
2a030 72 20 73 69 6e 63 65 20 74 68 65 72 65 20 69 73  r since there is
2a040 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 72   only a single r
2a050 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66  ow.        ** of
2a060 20 6f 75 74 70 75 74 2e 0a 20 20 20 20 20 20 20   output..       
2a070 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 73 65   */.        rese
2a080 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61  tAccumulator(pPa
2a090 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b  rse, &sAggInfo);
2a0a0 0a 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f 20  .        pWInfo 
2a0b0 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  = sqlite3WhereBe
2a0c0 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62  gin(pParse, pTab
2a0d0 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20 70 4d  List, pWhere, pM
2a0e0 69 6e 4d 61 78 2c 30 2c 66 6c 61 67 2c 30 29 3b  inMax,0,flag,0);
2a0f0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 57 49  .        if( pWI
2a100 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  nfo==0 ){.      
2a110 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
2a120 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 44  istDelete(db, pD
2a130 65 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67  el);.          g
2a140 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
2a150 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2a160 20 20 75 70 64 61 74 65 41 63 63 75 6d 75 6c 61    updateAccumula
2a170 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41 67  tor(pParse, &sAg
2a180 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  gInfo);.        
2a190 61 73 73 65 72 74 28 20 70 4d 69 6e 4d 61 78 3d  assert( pMinMax=
2a1a0 3d 30 20 7c 7c 20 70 4d 69 6e 4d 61 78 2d 3e 6e  =0 || pMinMax->n
2a1b0 45 78 70 72 3d 3d 31 20 29 3b 0a 20 20 20 20 20  Expr==1 );.     
2a1c0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68     if( sqlite3Wh
2a1d0 65 72 65 49 73 4f 72 64 65 72 65 64 28 70 57 49  ereIsOrdered(pWI
2a1e0 6e 66 6f 29 20 29 7b 0a 20 20 20 20 20 20 20 20  nfo) ){.        
2a1f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2a200 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
2a210 30 2c 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  0, sqlite3WhereB
2a220 72 65 61 6b 4c 61 62 65 6c 28 70 57 49 6e 66 6f  reakLabel(pWInfo
2a230 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 56 64  ));.          Vd
2a240 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25  beComment((v, "%
2a250 73 28 29 20 62 79 20 69 6e 64 65 78 22 2c 0a 20  s() by index",. 
2a260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
2a270 66 6c 61 67 3d 3d 57 48 45 52 45 5f 4f 52 44 45  flag==WHERE_ORDE
2a280 52 42 59 5f 4d 49 4e 3f 22 6d 69 6e 22 3a 22 6d  RBY_MIN?"min":"m
2a290 61 78 22 29 29 29 3b 0a 20 20 20 20 20 20 20 20  ax")));.        
2a2a0 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
2a2b0 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f  3WhereEnd(pWInfo
2a2c0 29 3b 0a 20 20 20 20 20 20 20 20 66 69 6e 61 6c  );.        final
2a2d0 69 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e 73 28  izeAggFunctions(
2a2e0 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66  pParse, &sAggInf
2a2f0 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  o);.      }..   
2a300 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20 30 3b     pOrderBy = 0;
2a310 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
2a320 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
2a330 2c 20 70 48 61 76 69 6e 67 2c 20 61 64 64 72 45  , pHaving, addrE
2a340 6e 64 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49  nd, SQLITE_JUMPI
2a350 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 65  FNULL);.      se
2a360 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50  lectInnerLoop(pP
2a370 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69  arse, p, p->pELi
2a380 73 74 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20  st, 0, 0, 0, 0, 
2a390 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2a3a0 20 20 20 20 20 20 20 70 44 65 73 74 2c 20 61 64         pDest, ad
2a3b0 64 72 45 6e 64 2c 20 61 64 64 72 45 6e 64 29 3b  drEnd, addrEnd);
2a3c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
2a3d0 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
2a3e0 20 70 44 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20   pDel);.    }.  
2a3f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
2a400 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64  olveLabel(v, add
2a410 72 45 6e 64 29 3b 0a 20 20 20 20 0a 20 20 7d 20  rEnd);.    .  } 
2a420 2f 2a 20 65 6e 64 69 66 20 61 67 67 72 65 67 61  /* endif aggrega
2a430 74 65 20 71 75 65 72 79 20 2a 2f 0a 0a 20 20 69  te query */..  i
2a440 66 28 20 73 44 69 73 74 69 6e 63 74 2e 65 54 6e  f( sDistinct.eTn
2a450 63 74 54 79 70 65 3d 3d 57 48 45 52 45 5f 44 49  ctType==WHERE_DI
2a460 53 54 49 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44  STINCT_UNORDERED
2a470 20 29 7b 0a 20 20 20 20 65 78 70 6c 61 69 6e 54   ){.    explainT
2a480 65 6d 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c  empTable(pParse,
2a490 20 22 44 49 53 54 49 4e 43 54 22 29 3b 0a 20 20   "DISTINCT");.  
2a4a0 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  }..  /* If there
2a4b0 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20   is an ORDER BY 
2a4c0 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 77 65 20  clause, then we 
2a4d0 6e 65 65 64 20 74 6f 20 73 6f 72 74 20 74 68 65  need to sort the
2a4e0 20 72 65 73 75 6c 74 73 0a 20 20 2a 2a 20 61 6e   results.  ** an
2a4f0 64 20 73 65 6e 64 20 74 68 65 6d 20 74 6f 20 74  d send them to t
2a500 68 65 20 63 61 6c 6c 62 61 63 6b 20 6f 6e 65 20  he callback one 
2a510 62 79 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69  by one..  */.  i
2a520 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  f( pOrderBy ){. 
2a530 20 20 20 65 78 70 6c 61 69 6e 54 65 6d 70 54 61     explainTempTa
2a540 62 6c 65 28 70 50 61 72 73 65 2c 20 22 4f 52 44  ble(pParse, "ORD
2a550 45 52 20 42 59 22 29 3b 0a 20 20 20 20 67 65 6e  ER BY");.    gen
2a560 65 72 61 74 65 53 6f 72 74 54 61 69 6c 28 70 50  erateSortTail(pP
2a570 61 72 73 65 2c 20 70 2c 20 76 2c 20 70 45 4c 69  arse, p, v, pELi
2a580 73 74 2d 3e 6e 45 78 70 72 2c 20 70 44 65 73 74  st->nExpr, pDest
2a590 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d  );.  }..  /* Jum
2a5a0 70 20 68 65 72 65 20 74 6f 20 73 6b 69 70 20 74  p here to skip t
2a5b0 68 69 73 20 71 75 65 72 79 0a 20 20 2a 2f 0a 20  his query.  */. 
2a5c0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
2a5d0 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 45 6e 64  lveLabel(v, iEnd
2a5e0 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 53 45 4c  );..  /* The SEL
2a5f0 45 43 54 20 77 61 73 20 73 75 63 63 65 73 73 66  ECT was successf
2a600 75 6c 6c 79 20 63 6f 64 65 64 2e 20 20 20 53 65  ully coded.   Se
2a610 74 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64  t the return cod
2a620 65 20 74 6f 20 30 0a 20 20 2a 2a 20 74 6f 20 69  e to 0.  ** to i
2a630 6e 64 69 63 61 74 65 20 6e 6f 20 65 72 72 6f 72  ndicate no error
2a640 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 30  s..  */.  rc = 0
2a650 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20  ;..  /* Control 
2a660 6a 75 6d 70 73 20 74 6f 20 68 65 72 65 20 69 66  jumps to here if
2a670 20 61 6e 20 65 72 72 6f 72 20 69 73 20 65 6e 63   an error is enc
2a680 6f 75 6e 74 65 72 65 64 20 61 62 6f 76 65 2c 20  ountered above, 
2a690 6f 72 20 75 70 6f 6e 0a 20 20 2a 2a 20 73 75 63  or upon.  ** suc
2a6a0 63 65 73 73 66 75 6c 20 63 6f 64 69 6e 67 20 6f  cessful coding o
2a6b0 66 20 74 68 65 20 53 45 4c 45 43 54 2e 0a 20 20  f the SELECT..  
2a6c0 2a 2f 0a 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 20  */.select_end:. 
2a6d0 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67   explainSetInteg
2a6e0 65 72 28 70 50 61 72 73 65 2d 3e 69 53 65 6c 65  er(pParse->iSele
2a6f0 63 74 49 64 2c 20 69 52 65 73 74 6f 72 65 53 65  ctId, iRestoreSe
2a700 6c 65 63 74 49 64 29 3b 0a 0a 20 20 2f 2a 20 49  lectId);..  /* I
2a710 64 65 6e 74 69 66 79 20 63 6f 6c 75 6d 6e 20 6e  dentify column n
2a720 61 6d 65 73 20 69 66 20 72 65 73 75 6c 74 73 20  ames if results 
2a730 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 61 72  of the SELECT ar
2a740 65 20 74 6f 20 62 65 20 6f 75 74 70 75 74 2e 0a  e to be output..
2a750 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53    */.  if( rc==S
2a760 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 44 65 73  QLITE_OK && pDes
2a770 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75  t->eDest==SRT_Ou
2a780 74 70 75 74 20 29 7b 0a 20 20 20 20 67 65 6e 65  tput ){.    gene
2a790 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  rateColumnNames(
2a7a0 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74  pParse, pTabList
2a7b0 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a  , pEList);.  }..
2a7c0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
2a7d0 64 62 2c 20 73 41 67 67 49 6e 66 6f 2e 61 43 6f  db, sAggInfo.aCo
2a7e0 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  l);.  sqlite3DbF
2a7f0 72 65 65 28 64 62 2c 20 73 41 67 67 49 6e 66 6f  ree(db, sAggInfo
2a800 2e 61 46 75 6e 63 29 3b 0a 20 20 72 65 74 75 72  .aFunc);.  retur
2a810 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 20 64 65 66  n rc;.}..#if def
2a820 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
2a830 4c 45 5f 54 52 45 45 5f 45 58 50 4c 41 49 4e 29  LE_TREE_EXPLAIN)
2a840 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
2a850 61 20 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65  a human-readable
2a860 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20   description of 
2a870 61 20 74 68 65 20 53 65 6c 65 63 74 20 6f 62 6a  a the Select obj
2a880 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ect..*/.static v
2a890 6f 69 64 20 65 78 70 6c 61 69 6e 4f 6e 65 53 65  oid explainOneSe
2a8a0 6c 65 63 74 28 56 64 62 65 20 2a 70 56 64 62 65  lect(Vdbe *pVdbe
2a8b0 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  , Select *p){.  
2a8c0 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
2a8d0 69 6e 74 66 28 70 56 64 62 65 2c 20 22 53 45 4c  intf(pVdbe, "SEL
2a8e0 45 43 54 20 22 29 3b 0a 20 20 69 66 28 20 70 2d  ECT ");.  if( p-
2a8f0 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f  >selFlags & (SF_
2a900 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72  Distinct|SF_Aggr
2a910 65 67 61 74 65 29 20 29 7b 0a 20 20 20 20 69 66  egate) ){.    if
2a920 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ( p->selFlags & 
2a930 53 46 5f 44 69 73 74 69 6e 63 74 20 29 7b 0a 20  SF_Distinct ){. 
2a940 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
2a950 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c  ainPrintf(pVdbe,
2a960 20 22 44 49 53 54 49 4e 43 54 20 22 29 3b 0a 20   "DISTINCT ");. 
2a970 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e     }.    if( p->
2a980 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67  selFlags & SF_Ag
2a990 67 72 65 67 61 74 65 20 29 7b 0a 20 20 20 20 20  gregate ){.     
2a9a0 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
2a9b0 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22 61 67  rintf(pVdbe, "ag
2a9c0 67 5f 66 6c 61 67 20 22 29 3b 0a 20 20 20 20 7d  g_flag ");.    }
2a9d0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c  .    sqlite3Expl
2a9e0 61 69 6e 4e 4c 28 70 56 64 62 65 29 3b 0a 20 20  ainNL(pVdbe);.  
2a9f0 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
2aa00 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22 20  Printf(pVdbe, " 
2aa10 20 20 22 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69    ");.  }.  sqli
2aa20 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72 4c 69  te3ExplainExprLi
2aa30 73 74 28 70 56 64 62 65 2c 20 70 2d 3e 70 45 4c  st(pVdbe, p->pEL
2aa40 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  ist);.  sqlite3E
2aa50 78 70 6c 61 69 6e 4e 4c 28 70 56 64 62 65 29 3b  xplainNL(pVdbe);
2aa60 0a 20 20 69 66 28 20 70 2d 3e 70 53 72 63 20 26  .  if( p->pSrc &
2aa70 26 20 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 20  & p->pSrc->nSrc 
2aa80 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
2aa90 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
2aaa0 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22 46  Printf(pVdbe, "F
2aab0 52 4f 4d 20 22 29 3b 0a 20 20 20 20 73 71 6c 69  ROM ");.    sqli
2aac0 74 65 33 45 78 70 6c 61 69 6e 50 75 73 68 28 70  te3ExplainPush(p
2aad0 56 64 62 65 29 3b 0a 20 20 20 20 66 6f 72 28 69  Vdbe);.    for(i
2aae0 3d 30 3b 20 69 3c 70 2d 3e 70 53 72 63 2d 3e 6e  =0; i<p->pSrc->n
2aaf0 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Src; i++){.     
2ab00 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
2ab10 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70  item *pItem = &p
2ab20 2d 3e 70 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20  ->pSrc->a[i];.  
2ab30 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
2ab40 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20  inPrintf(pVdbe, 
2ab50 22 7b 25 64 2c 2a 7d 20 3d 20 22 2c 20 70 49 74  "{%d,*} = ", pIt
2ab60 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20  em->iCursor);.  
2ab70 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70      if( pItem->p
2ab80 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Select ){.      
2ab90 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
2aba0 53 65 6c 65 63 74 28 70 56 64 62 65 2c 20 70 49  Select(pVdbe, pI
2abb0 74 65 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20  tem->pSelect);. 
2abc0 20 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d         if( pItem
2abd0 2d 3e 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20  ->pTab ){.      
2abe0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
2abf0 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20  inPrintf(pVdbe, 
2ac00 22 20 28 74 61 62 6e 61 6d 65 3d 25 73 29 22 2c  " (tabname=%s)",
2ac10 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e   pItem->pTab->zN
2ac20 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ame);.        }.
2ac30 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
2ac40 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 29 7b 0a  pItem->zName ){.
2ac50 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
2ac60 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64  xplainPrintf(pVd
2ac70 62 65 2c 20 22 25 73 22 2c 20 70 49 74 65 6d 2d  be, "%s", pItem-
2ac80 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d  >zName);.      }
2ac90 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d  .      if( pItem
2aca0 2d 3e 7a 41 6c 69 61 73 20 29 7b 0a 20 20 20 20  ->zAlias ){.    
2acb0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
2acc0 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20  inPrintf(pVdbe, 
2acd0 22 20 28 41 53 20 25 73 29 22 2c 20 70 49 74 65  " (AS %s)", pIte
2ace0 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20  m->zAlias);.    
2acf0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 49    }.      if( pI
2ad00 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20  tem->jointype & 
2ad10 4a 54 5f 4c 45 46 54 20 29 7b 0a 20 20 20 20 20  JT_LEFT ){.     
2ad20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
2ad30 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22  nPrintf(pVdbe, "
2ad40 20 4c 45 46 54 2d 4a 4f 49 4e 22 29 3b 0a 20 20   LEFT-JOIN");.  
2ad50 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
2ad60 74 65 33 45 78 70 6c 61 69 6e 4e 4c 28 70 56 64  te3ExplainNL(pVd
2ad70 62 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  be);.    }.    s
2ad80 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 6f 70  qlite3ExplainPop
2ad90 28 70 56 64 62 65 29 3b 0a 20 20 7d 0a 20 20 69  (pVdbe);.  }.  i
2ada0 66 28 20 70 2d 3e 70 57 68 65 72 65 20 29 7b 0a  f( p->pWhere ){.
2adb0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
2adc0 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20  inPrintf(pVdbe, 
2add0 22 57 48 45 52 45 20 22 29 3b 0a 20 20 20 20 73  "WHERE ");.    s
2ade0 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70  qlite3ExplainExp
2adf0 72 28 70 56 64 62 65 2c 20 70 2d 3e 70 57 68 65  r(pVdbe, p->pWhe
2ae00 72 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  re);.    sqlite3
2ae10 45 78 70 6c 61 69 6e 4e 4c 28 70 56 64 62 65 29  ExplainNL(pVdbe)
2ae20 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70  ;.  }.  if( p->p
2ae30 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 73  GroupBy ){.    s
2ae40 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69  qlite3ExplainPri
2ae50 6e 74 66 28 70 56 64 62 65 2c 20 22 47 52 4f 55  ntf(pVdbe, "GROU
2ae60 50 42 59 20 22 29 3b 0a 20 20 20 20 73 71 6c 69  PBY ");.    sqli
2ae70 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72 4c 69  te3ExplainExprLi
2ae80 73 74 28 70 56 64 62 65 2c 20 70 2d 3e 70 47 72  st(pVdbe, p->pGr
2ae90 6f 75 70 42 79 29 3b 0a 20 20 20 20 73 71 6c 69  oupBy);.    sqli
2aea0 74 65 33 45 78 70 6c 61 69 6e 4e 4c 28 70 56 64  te3ExplainNL(pVd
2aeb0 62 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  be);.  }.  if( p
2aec0 2d 3e 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20  ->pHaving ){.   
2aed0 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
2aee0 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22 48 41  rintf(pVdbe, "HA
2aef0 56 49 4e 47 20 22 29 3b 0a 20 20 20 20 73 71 6c  VING ");.    sql
2af00 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72 28  ite3ExplainExpr(
2af10 70 56 64 62 65 2c 20 70 2d 3e 70 48 61 76 69 6e  pVdbe, p->pHavin
2af20 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  g);.    sqlite3E
2af30 78 70 6c 61 69 6e 4e 4c 28 70 56 64 62 65 29 3b  xplainNL(pVdbe);
2af40 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4f  .  }.  if( p->pO
2af50 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 73 71  rderBy ){.    sq
2af60 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e  lite3ExplainPrin
2af70 74 66 28 70 56 64 62 65 2c 20 22 4f 52 44 45 52  tf(pVdbe, "ORDER
2af80 42 59 20 22 29 3b 0a 20 20 20 20 73 71 6c 69 74  BY ");.    sqlit
2af90 65 33 45 78 70 6c 61 69 6e 45 78 70 72 4c 69 73  e3ExplainExprLis
2afa0 74 28 70 56 64 62 65 2c 20 70 2d 3e 70 4f 72 64  t(pVdbe, p->pOrd
2afb0 65 72 42 79 29 3b 0a 20 20 20 20 73 71 6c 69 74  erBy);.    sqlit
2afc0 65 33 45 78 70 6c 61 69 6e 4e 4c 28 70 56 64 62  e3ExplainNL(pVdb
2afd0 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d  e);.  }.  if( p-
2afe0 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73  >pLimit ){.    s
2aff0 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69  qlite3ExplainPri
2b000 6e 74 66 28 70 56 64 62 65 2c 20 22 4c 49 4d 49  ntf(pVdbe, "LIMI
2b010 54 20 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  T ");.    sqlite
2b020 33 45 78 70 6c 61 69 6e 45 78 70 72 28 70 56 64  3ExplainExpr(pVd
2b030 62 65 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a  be, p->pLimit);.
2b040 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
2b050 69 6e 4e 4c 28 70 56 64 62 65 29 3b 0a 20 20 7d  inNL(pVdbe);.  }
2b060 0a 20 20 69 66 28 20 70 2d 3e 70 4f 66 66 73 65  .  if( p->pOffse
2b070 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
2b080 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56  ExplainPrintf(pV
2b090 64 62 65 2c 20 22 4f 46 46 53 45 54 20 22 29 3b  dbe, "OFFSET ");
2b0a0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c  .    sqlite3Expl
2b0b0 61 69 6e 45 78 70 72 28 70 56 64 62 65 2c 20 70  ainExpr(pVdbe, p
2b0c0 2d 3e 70 4f 66 66 73 65 74 29 3b 0a 20 20 20 20  ->pOffset);.    
2b0d0 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 4e 4c  sqlite3ExplainNL
2b0e0 28 70 56 64 62 65 29 3b 0a 20 20 7d 0a 7d 0a 76  (pVdbe);.  }.}.v
2b0f0 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 6c 61  oid sqlite3Expla
2b100 69 6e 53 65 6c 65 63 74 28 56 64 62 65 20 2a 70  inSelect(Vdbe *p
2b110 56 64 62 65 2c 20 53 65 6c 65 63 74 20 2a 70 29  Vdbe, Select *p)
2b120 7b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a  {.  if( p==0 ){.
2b130 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
2b140 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20  inPrintf(pVdbe, 
2b150 22 28 6e 75 6c 6c 2d 73 65 6c 65 63 74 29 22 29  "(null-select)")
2b160 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
2b170 7d 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 70 50  }.  while( p->pP
2b180 72 69 6f 72 20 29 7b 0a 20 20 20 20 70 2d 3e 70  rior ){.    p->p
2b190 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 70  Prior->pNext = p
2b1a0 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 50 72  ;.    p = p->pPr
2b1b0 69 6f 72 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ior;.  }.  sqlit
2b1c0 65 33 45 78 70 6c 61 69 6e 50 75 73 68 28 70 56  e3ExplainPush(pV
2b1d0 64 62 65 29 3b 0a 20 20 77 68 69 6c 65 28 20 70  dbe);.  while( p
2b1e0 20 29 7b 0a 20 20 20 20 65 78 70 6c 61 69 6e 4f   ){.    explainO
2b1f0 6e 65 53 65 6c 65 63 74 28 70 56 64 62 65 2c 20  neSelect(pVdbe, 
2b200 70 29 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70  p);.    p = p->p
2b210 4e 65 78 74 3b 0a 20 20 20 20 69 66 28 20 70 3d  Next;.    if( p=
2b220 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
2b230 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 4e 4c  sqlite3ExplainNL
2b240 28 70 56 64 62 65 29 3b 0a 20 20 20 20 73 71 6c  (pVdbe);.    sql
2b250 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74  ite3ExplainPrint
2b260 66 28 70 56 64 62 65 2c 20 22 25 73 5c 6e 22 2c  f(pVdbe, "%s\n",
2b270 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d   selectOpName(p-
2b280 3e 6f 70 29 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  >op));.  }.  sql
2b290 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74  ite3ExplainPrint
2b2a0 66 28 70 56 64 62 65 2c 20 22 45 4e 44 22 29 3b  f(pVdbe, "END");
2b2b0 0a 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69  .  sqlite3Explai
2b2c0 6e 50 6f 70 28 70 56 64 62 65 29 3b 0a 7d 0a 0a  nPop(pVdbe);.}..
2b2d0 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 73 74  /* End of the st
2b2e0 72 75 63 74 75 72 65 20 64 65 62 75 67 20 70 72  ructure debug pr
2b2f0 69 6e 74 69 6e 67 20 63 6f 64 65 0a 2a 2a 2a 2a  inting code.****
2b300 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b310 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b320 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b330 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b340 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 23 65 6e 64 69  *********/.#endi
2b350 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 53 51 4c  f /* defined(SQL
2b360 49 54 45 5f 45 4e 41 42 4c 45 5f 54 52 45 45 5f  ITE_ENABLE_TREE_
2b370 45 58 50 4c 41 49 4e 29 20 2a 2f 0a              EXPLAIN) */.