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

Artifact 8d097454ff56bdda38c4d877757f592a3c823d15:


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 65 64 69 6e 67 20 74 68  rs preceeding th
0cb0: 65 20 4a 4f 49 4e 20 6b 65 79 77 6f 72 64 2c 20  e JOIN keyword, 
0cc0: 64 65 74 65 72 6d 69 6e 65 20 74 68 65 0a 2a 2a  determine the.**
0cd0: 20 74 79 70 65 20 6f 66 20 6a 6f 69 6e 2e 20 20   type of join.  
0ce0: 52 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65  Return an intege
0cf0: 72 20 63 6f 6e 73 74 61 6e 74 20 74 68 61 74 20  r constant that 
0d00: 65 78 70 72 65 73 73 65 73 20 74 68 61 74 20 74  expresses that t
0d10: 79 70 65 0a 2a 2a 20 69 6e 20 74 65 72 6d 73 20  ype.** in terms 
0d20: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
0d30: 20 62 69 74 20 76 61 6c 75 65 73 3a 0a 2a 2a 0a   bit values:.**.
0d40: 2a 2a 20 20 20 20 20 4a 54 5f 49 4e 4e 45 52 0a  **     JT_INNER.
0d50: 2a 2a 20 20 20 20 20 4a 54 5f 43 52 4f 53 53 0a  **     JT_CROSS.
0d60: 2a 2a 20 20 20 20 20 4a 54 5f 4f 55 54 45 52 0a  **     JT_OUTER.
0d70: 2a 2a 20 20 20 20 20 4a 54 5f 4e 41 54 55 52 41  **     JT_NATURA
0d80: 4c 0a 2a 2a 20 20 20 20 20 4a 54 5f 4c 45 46 54  L.**     JT_LEFT
0d90: 0a 2a 2a 20 20 20 20 20 4a 54 5f 52 49 47 48 54  .**     JT_RIGHT
0da0: 0a 2a 2a 0a 2a 2a 20 41 20 66 75 6c 6c 20 6f 75  .**.** A full ou
0db0: 74 65 72 20 6a 6f 69 6e 20 69 73 20 74 68 65 20  ter join is the 
0dc0: 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20 4a  combination of J
0dd0: 54 5f 4c 45 46 54 20 61 6e 64 20 4a 54 5f 52 49  T_LEFT and JT_RI
0de0: 47 48 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  GHT..**.** If an
0df0: 20 69 6c 6c 65 67 61 6c 20 6f 72 20 75 6e 73 75   illegal or unsu
0e00: 70 70 6f 72 74 65 64 20 6a 6f 69 6e 20 74 79 70  pported join typ
0e10: 65 20 69 73 20 73 65 65 6e 2c 20 74 68 65 6e 20  e is seen, then 
0e20: 73 74 69 6c 6c 20 72 65 74 75 72 6e 0a 2a 2a 20  still return.** 
0e30: 61 20 6a 6f 69 6e 20 74 79 70 65 2c 20 62 75 74  a join type, but
0e40: 20 70 75 74 20 61 6e 20 65 72 72 6f 72 20 69 6e   put an error in
0e50: 20 74 68 65 20 70 50 61 72 73 65 20 73 74 72 75   the pParse stru
0e60: 63 74 75 72 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  cture..*/.int sq
0e70: 6c 69 74 65 33 4a 6f 69 6e 54 79 70 65 28 50 61  lite3JoinType(Pa
0e80: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b  rse *pParse, Tok
0e90: 65 6e 20 2a 70 41 2c 20 54 6f 6b 65 6e 20 2a 70  en *pA, Token *p
0ea0: 42 2c 20 54 6f 6b 65 6e 20 2a 70 43 29 7b 0a 20  B, Token *pC){. 
0eb0: 20 69 6e 74 20 6a 6f 69 6e 74 79 70 65 20 3d 20   int jointype = 
0ec0: 30 3b 0a 20 20 54 6f 6b 65 6e 20 2a 61 70 41 6c  0;.  Token *apAl
0ed0: 6c 5b 33 5d 3b 0a 20 20 54 6f 6b 65 6e 20 2a 70  l[3];.  Token *p
0ee0: 3b 0a 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 20 2f                 /
0f00: 2a 20 20 20 30 31 32 33 34 35 36 37 38 39 20 31  *   0123456789 1
0f10: 32 33 34 35 36 37 38 39 20 31 32 33 34 35 36 37  23456789 1234567
0f20: 38 39 20 31 32 33 20 2a 2f 0a 20 20 73 74 61 74  89 123 */.  stat
0f30: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 4b  ic const char zK
0f40: 65 79 54 65 78 74 5b 5d 20 3d 20 22 6e 61 74 75  eyText[] = "natu
0f50: 72 61 6c 65 66 74 6f 75 74 65 72 69 67 68 74 66  raleftouterightf
0f60: 75 6c 6c 69 6e 6e 65 72 63 72 6f 73 73 22 3b 0a  ullinnercross";.
0f70: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73    static const s
0f80: 74 72 75 63 74 20 7b 0a 20 20 20 20 75 38 20 69  truct {.    u8 i
0f90: 3b 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69  ;        /* Begi
0fa0: 6e 6e 69 6e 67 20 6f 66 20 6b 65 79 77 6f 72 64  nning of keyword
0fb0: 20 74 65 78 74 20 69 6e 20 7a 4b 65 79 54 65 78   text in zKeyTex
0fc0: 74 5b 5d 20 2a 2f 0a 20 20 20 20 75 38 20 6e 43  t[] */.    u8 nC
0fd0: 68 61 72 3b 20 20 20 20 2f 2a 20 4c 65 6e 67 74  har;    /* Lengt
0fe0: 68 20 6f 66 20 74 68 65 20 6b 65 79 77 6f 72 64  h of the keyword
0ff0: 20 69 6e 20 63 68 61 72 61 63 74 65 72 73 20 2a   in characters *
1000: 2f 0a 20 20 20 20 75 38 20 63 6f 64 65 3b 20 20  /.    u8 code;  
1010: 20 20 20 2f 2a 20 4a 6f 69 6e 20 74 79 70 65 20     /* Join type 
1020: 6d 61 73 6b 20 2a 2f 0a 20 20 7d 20 61 4b 65 79  mask */.  } aKey
1030: 77 6f 72 64 5b 5d 20 3d 20 7b 0a 20 20 20 20 2f  word[] = {.    /
1040: 2a 20 6e 61 74 75 72 61 6c 20 2a 2f 20 7b 20 30  * natural */ { 0
1050: 2c 20 20 37 2c 20 4a 54 5f 4e 41 54 55 52 41 4c  ,  7, JT_NATURAL
1060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1070: 7d 2c 0a 20 20 20 20 2f 2a 20 6c 65 66 74 20 20  },.    /* left  
1080: 20 20 2a 2f 20 7b 20 36 2c 20 20 34 2c 20 4a 54    */ { 6,  4, JT
1090: 5f 4c 45 46 54 7c 4a 54 5f 4f 55 54 45 52 20 20  _LEFT|JT_OUTER  
10a0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f          },.    /
10b0: 2a 20 6f 75 74 65 72 20 20 20 2a 2f 20 7b 20 31  * outer   */ { 1
10c0: 30 2c 20 35 2c 20 4a 54 5f 4f 55 54 45 52 20 20  0, 5, JT_OUTER  
10d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e0: 7d 2c 0a 20 20 20 20 2f 2a 20 72 69 67 68 74 20  },.    /* right 
10f0: 20 20 2a 2f 20 7b 20 31 34 2c 20 35 2c 20 4a 54    */ { 14, 5, JT
1100: 5f 52 49 47 48 54 7c 4a 54 5f 4f 55 54 45 52 20  _RIGHT|JT_OUTER 
1110: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f          },.    /
1120: 2a 20 66 75 6c 6c 20 20 20 20 2a 2f 20 7b 20 31  * full    */ { 1
1130: 39 2c 20 34 2c 20 4a 54 5f 4c 45 46 54 7c 4a 54  9, 4, JT_LEFT|JT
1140: 5f 52 49 47 48 54 7c 4a 54 5f 4f 55 54 45 52 20  _RIGHT|JT_OUTER 
1150: 7d 2c 0a 20 20 20 20 2f 2a 20 69 6e 6e 65 72 20  },.    /* inner 
1160: 20 20 2a 2f 20 7b 20 32 33 2c 20 35 2c 20 4a 54    */ { 23, 5, JT
1170: 5f 49 4e 4e 45 52 20 20 20 20 20 20 20 20 20 20  _INNER          
1180: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f          },.    /
1190: 2a 20 63 72 6f 73 73 20 20 20 2a 2f 20 7b 20 32  * cross   */ { 2
11a0: 38 2c 20 35 2c 20 4a 54 5f 49 4e 4e 45 52 7c 4a  8, 5, JT_INNER|J
11b0: 54 5f 43 52 4f 53 53 20 20 20 20 20 20 20 20 20  T_CROSS         
11c0: 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 2c  },.  };.  int i,
11d0: 20 6a 3b 0a 20 20 61 70 41 6c 6c 5b 30 5d 20 3d   j;.  apAll[0] =
11e0: 20 70 41 3b 0a 20 20 61 70 41 6c 6c 5b 31 5d 20   pA;.  apAll[1] 
11f0: 3d 20 70 42 3b 0a 20 20 61 70 41 6c 6c 5b 32 5d  = pB;.  apAll[2]
1200: 20 3d 20 70 43 3b 0a 20 20 66 6f 72 28 69 3d 30   = pC;.  for(i=0
1210: 3b 20 69 3c 33 20 26 26 20 61 70 41 6c 6c 5b 69  ; i<3 && apAll[i
1220: 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d  ]; i++){.    p =
1230: 20 61 70 41 6c 6c 5b 69 5d 3b 0a 20 20 20 20 66   apAll[i];.    f
1240: 6f 72 28 6a 3d 30 3b 20 6a 3c 41 72 72 61 79 53  or(j=0; j<ArrayS
1250: 69 7a 65 28 61 4b 65 79 77 6f 72 64 29 3b 20 6a  ize(aKeyword); j
1260: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ++){.      if( p
1270: 2d 3e 6e 3d 3d 61 4b 65 79 77 6f 72 64 5b 6a 5d  ->n==aKeyword[j]
1280: 2e 6e 43 68 61 72 20 0a 20 20 20 20 20 20 20 20  .nChar .        
1290: 20 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 4e    && sqlite3StrN
12a0: 49 43 6d 70 28 28 63 68 61 72 2a 29 70 2d 3e 7a  ICmp((char*)p->z
12b0: 2c 20 26 7a 4b 65 79 54 65 78 74 5b 61 4b 65 79  , &zKeyText[aKey
12c0: 77 6f 72 64 5b 6a 5d 2e 69 5d 2c 20 70 2d 3e 6e  word[j].i], p->n
12d0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
12e0: 6a 6f 69 6e 74 79 70 65 20 7c 3d 20 61 4b 65 79  jointype |= aKey
12f0: 77 6f 72 64 5b 6a 5d 2e 63 6f 64 65 3b 0a 20 20  word[j].code;.  
1300: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1310: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 74     }.    }.    t
1320: 65 73 74 63 61 73 65 28 20 6a 3d 3d 30 20 7c 7c  estcase( j==0 ||
1330: 20 6a 3d 3d 31 20 7c 7c 20 6a 3d 3d 32 20 7c 7c   j==1 || j==2 ||
1340: 20 6a 3d 3d 33 20 7c 7c 20 6a 3d 3d 34 20 7c 7c   j==3 || j==4 ||
1350: 20 6a 3d 3d 35 20 7c 7c 20 6a 3d 3d 36 20 29 3b   j==5 || j==6 );
1360: 0a 20 20 20 20 69 66 28 20 6a 3e 3d 41 72 72 61  .    if( j>=Arra
1370: 79 53 69 7a 65 28 61 4b 65 79 77 6f 72 64 29 20  ySize(aKeyword) 
1380: 29 7b 0a 20 20 20 20 20 20 6a 6f 69 6e 74 79 70  ){.      jointyp
1390: 65 20 7c 3d 20 4a 54 5f 45 52 52 4f 52 3b 0a 20  e |= JT_ERROR;. 
13a0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
13b0: 7d 0a 20 20 7d 0a 20 20 69 66 28 0a 20 20 20 20  }.  }.  if(.    
13c0: 20 28 6a 6f 69 6e 74 79 70 65 20 26 20 28 4a 54   (jointype & (JT
13d0: 5f 49 4e 4e 45 52 7c 4a 54 5f 4f 55 54 45 52 29  _INNER|JT_OUTER)
13e0: 29 3d 3d 28 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f  )==(JT_INNER|JT_
13f0: 4f 55 54 45 52 29 20 7c 7c 0a 20 20 20 20 20 28  OUTER) ||.     (
1400: 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 45 52  jointype & JT_ER
1410: 52 4f 52 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20  ROR)!=0.  ){.   
1420: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 70   const char *zSp
1430: 20 3d 20 22 20 22 3b 0a 20 20 20 20 61 73 73 65   = " ";.    asse
1440: 72 74 28 20 70 42 21 3d 30 20 29 3b 0a 20 20 20  rt( pB!=0 );.   
1450: 20 69 66 28 20 70 43 3d 3d 30 20 29 7b 20 7a 53   if( pC==0 ){ zS
1460: 70 2b 2b 3b 20 7d 0a 20 20 20 20 73 71 6c 69 74  p++; }.    sqlit
1470: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
1480: 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6f 72 20 75  e, "unknown or u
1490: 6e 73 75 70 70 6f 72 74 65 64 20 6a 6f 69 6e 20  nsupported join 
14a0: 74 79 70 65 3a 20 22 0a 20 20 20 20 20 20 20 22  type: ".       "
14b0: 25 54 20 25 54 25 73 25 54 22 2c 20 70 41 2c 20  %T %T%s%T", pA, 
14c0: 70 42 2c 20 7a 53 70 2c 20 70 43 29 3b 0a 20 20  pB, zSp, pC);.  
14d0: 20 20 6a 6f 69 6e 74 79 70 65 20 3d 20 4a 54 5f    jointype = JT_
14e0: 49 4e 4e 45 52 3b 0a 20 20 7d 65 6c 73 65 20 69  INNER;.  }else i
14f0: 66 28 20 28 6a 6f 69 6e 74 79 70 65 20 26 20 4a  f( (jointype & J
1500: 54 5f 4f 55 54 45 52 29 21 3d 30 20 0a 20 20 20  T_OUTER)!=0 .   
1510: 20 20 20 20 20 20 26 26 20 28 6a 6f 69 6e 74 79        && (jointy
1520: 70 65 20 26 20 28 4a 54 5f 4c 45 46 54 7c 4a 54  pe & (JT_LEFT|JT
1530: 5f 52 49 47 48 54 29 29 21 3d 4a 54 5f 4c 45 46  _RIGHT))!=JT_LEF
1540: 54 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  T ){.    sqlite3
1550: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
1560: 20 0a 20 20 20 20 20 20 22 52 49 47 48 54 20 61   .      "RIGHT a
1570: 6e 64 20 46 55 4c 4c 20 4f 55 54 45 52 20 4a 4f  nd FULL OUTER JO
1580: 49 4e 73 20 61 72 65 20 6e 6f 74 20 63 75 72 72  INs are not curr
1590: 65 6e 74 6c 79 20 73 75 70 70 6f 72 74 65 64 22  ently supported"
15a0: 29 3b 0a 20 20 20 20 6a 6f 69 6e 74 79 70 65 20  );.    jointype 
15b0: 3d 20 4a 54 5f 49 4e 4e 45 52 3b 0a 20 20 7d 0a  = JT_INNER;.  }.
15c0: 20 20 72 65 74 75 72 6e 20 6a 6f 69 6e 74 79 70    return jointyp
15d0: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  e;.}../*.** Retu
15e0: 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  rn the index of 
15f0: 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 20 74 61  a column in a ta
1600: 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 2d 31 20  ble.  Return -1 
1610: 69 66 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 2a 2a  if the column.**
1620: 20 69 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65   is not containe
1630: 64 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a  d in the table..
1640: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f  */.static int co
1650: 6c 75 6d 6e 49 6e 64 65 78 28 54 61 62 6c 65 20  lumnIndex(Table 
1660: 2a 70 54 61 62 2c 20 63 6f 6e 73 74 20 63 68 61  *pTab, const cha
1670: 72 20 2a 7a 43 6f 6c 29 7b 0a 20 20 69 6e 74 20  r *zCol){.  int 
1680: 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
1690: 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29  pTab->nCol; i++)
16a0: 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
16b0: 33 53 74 72 49 43 6d 70 28 70 54 61 62 2d 3e 61  3StrICmp(pTab->a
16c0: 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 43  Col[i].zName, zC
16d0: 6f 6c 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ol)==0 ) return 
16e0: 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  i;.  }.  return 
16f0: 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61  -1;.}../*.** Sea
1700: 72 63 68 20 74 68 65 20 66 69 72 73 74 20 4e 20  rch the first N 
1710: 74 61 62 6c 65 73 20 69 6e 20 70 53 72 63 2c 20  tables in pSrc, 
1720: 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67  from left to rig
1730: 68 74 2c 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20  ht, looking for 
1740: 61 0a 2a 2a 20 74 61 62 6c 65 20 74 68 61 74 20  a.** table that 
1750: 68 61 73 20 61 20 63 6f 6c 75 6d 6e 20 6e 61 6d  has a column nam
1760: 65 64 20 7a 43 6f 6c 2e 20 20 0a 2a 2a 0a 2a 2a  ed zCol.  .**.**
1770: 20 57 68 65 6e 20 66 6f 75 6e 64 2c 20 73 65 74   When found, set
1780: 20 2a 70 69 54 61 62 20 61 6e 64 20 2a 70 69 43   *piTab and *piC
1790: 6f 6c 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  ol to the table 
17a0: 69 6e 64 65 78 20 61 6e 64 20 63 6f 6c 75 6d 6e  index and column
17b0: 20 69 6e 64 65 78 0a 2a 2a 20 6f 66 20 74 68 65   index.** of the
17c0: 20 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e   matching column
17d0: 20 61 6e 64 20 72 65 74 75 72 6e 20 54 52 55 45   and return TRUE
17e0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 74 20 66  ..**.** If not f
17f0: 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20 46 41 4c  ound, return FAL
1800: 53 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  SE..*/.static in
1810: 74 20 74 61 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e  t tableAndColumn
1820: 49 6e 64 65 78 28 0a 20 20 53 72 63 4c 69 73 74  Index(.  SrcList
1830: 20 2a 70 53 72 63 2c 20 20 20 20 20 20 20 2f 2a   *pSrc,       /*
1840: 20 41 72 72 61 79 20 6f 66 20 74 61 62 6c 65 73   Array of tables
1850: 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20   to search */.  
1860: 69 6e 74 20 4e 2c 20 20 20 20 20 20 20 20 20 20  int N,          
1870: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1880: 66 20 74 61 62 6c 65 73 20 69 6e 20 70 53 72 63  f tables in pSrc
1890: 2d 3e 61 5b 5d 20 74 6f 20 73 65 61 72 63 68 20  ->a[] to search 
18a0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
18b0: 2a 7a 43 6f 6c 2c 20 20 20 20 2f 2a 20 4e 61 6d  *zCol,    /* Nam
18c0: 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  e of the column 
18d0: 77 65 20 61 72 65 20 6c 6f 6f 6b 69 6e 67 20 66  we are looking f
18e0: 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 54  or */.  int *piT
18f0: 61 62 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ab,          /* 
1900: 57 72 69 74 65 20 69 6e 64 65 78 20 6f 66 20 70  Write index of p
1910: 53 72 63 2d 3e 61 5b 5d 20 68 65 72 65 20 2a 2f  Src->a[] here */
1920: 0a 20 20 69 6e 74 20 2a 70 69 43 6f 6c 20 20 20  .  int *piCol   
1930: 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
1940: 20 69 6e 64 65 78 20 6f 66 20 70 53 72 63 2d 3e   index of pSrc->
1950: 61 5b 2a 70 69 54 61 62 5d 2e 70 54 61 62 2d 3e  a[*piTab].pTab->
1960: 61 43 6f 6c 5b 5d 20 68 65 72 65 20 2a 2f 0a 29  aCol[] here */.)
1970: 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  {.  int i;      
1980: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20           /* For 
1990: 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 74 61 62  looping over tab
19a0: 6c 65 73 20 69 6e 20 70 53 72 63 20 2a 2f 0a 20  les in pSrc */. 
19b0: 20 69 6e 74 20 69 43 6f 6c 3b 20 20 20 20 20 20   int iCol;      
19c0: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
19d0: 66 20 63 6f 6c 75 6d 6e 20 6d 61 74 63 68 69 6e  f column matchin
19e0: 67 20 7a 43 6f 6c 20 2a 2f 0a 0a 20 20 61 73 73  g zCol */..  ass
19f0: 65 72 74 28 20 28 70 69 54 61 62 3d 3d 30 29 3d  ert( (piTab==0)=
1a00: 3d 28 70 69 43 6f 6c 3d 3d 30 29 20 29 3b 20 20  =(piCol==0) );  
1a10: 2f 2a 20 42 6f 74 68 20 6f 72 20 6e 65 69 74 68  /* Both or neith
1a20: 65 72 20 61 72 65 20 4e 55 4c 4c 20 2a 2f 0a 20  er are NULL */. 
1a30: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4e 3b 20 69   for(i=0; i<N; i
1a40: 2b 2b 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20  ++){.    iCol = 
1a50: 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 53 72 63  columnIndex(pSrc
1a60: 2d 3e 61 5b 69 5d 2e 70 54 61 62 2c 20 7a 43 6f  ->a[i].pTab, zCo
1a70: 6c 29 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6c  l);.    if( iCol
1a80: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  >=0 ){.      if(
1a90: 20 70 69 54 61 62 20 29 7b 0a 20 20 20 20 20 20   piTab ){.      
1aa0: 20 20 2a 70 69 54 61 62 20 3d 20 69 3b 0a 20 20    *piTab = i;.  
1ab0: 20 20 20 20 20 20 2a 70 69 43 6f 6c 20 3d 20 69        *piCol = i
1ac0: 43 6f 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Col;.      }.   
1ad0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
1ae0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1af0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  0;.}../*.** This
1b00: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
1b10: 64 20 74 6f 20 61 64 64 20 74 65 72 6d 73 20 69  d to add terms i
1b20: 6d 70 6c 69 65 64 20 62 79 20 4a 4f 49 4e 20 73  mplied by JOIN s
1b30: 79 6e 74 61 78 20 74 6f 20 74 68 65 0a 2a 2a 20  yntax to the.** 
1b40: 57 48 45 52 45 20 63 6c 61 75 73 65 20 65 78 70  WHERE clause exp
1b50: 72 65 73 73 69 6f 6e 20 6f 66 20 61 20 53 45 4c  ression of a SEL
1b60: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 54  ECT statement. T
1b70: 68 65 20 6e 65 77 20 74 65 72 6d 2c 20 77 68 69  he new term, whi
1b80: 63 68 0a 2a 2a 20 69 73 20 41 4e 44 65 64 20 77  ch.** is ANDed w
1b90: 69 74 68 20 74 68 65 20 65 78 69 73 74 69 6e 67  ith the existing
1ba0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 2c 20 69   WHERE clause, i
1bb0: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a  s of the form:.*
1bc0: 2a 0a 2a 2a 20 20 20 20 28 74 61 62 31 2e 63 6f  *.**    (tab1.co
1bd0: 6c 31 20 3d 20 74 61 62 32 2e 63 6f 6c 32 29 0a  l1 = tab2.col2).
1be0: 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 74 61 62 31  **.** where tab1
1bf0: 20 69 73 20 74 68 65 20 69 53 72 63 27 74 68 20   is the iSrc'th 
1c00: 74 61 62 6c 65 20 69 6e 20 53 72 63 4c 69 73 74  table in SrcList
1c10: 20 70 53 72 63 20 61 6e 64 20 74 61 62 32 20 69   pSrc and tab2 i
1c20: 73 20 74 68 65 20 0a 2a 2a 20 28 69 53 72 63 2b  s the .** (iSrc+
1c30: 31 29 27 74 68 2e 20 43 6f 6c 75 6d 6e 20 63 6f  1)'th. Column co
1c40: 6c 31 20 69 73 20 63 6f 6c 75 6d 6e 20 69 43 6f  l1 is column iCo
1c50: 6c 4c 65 66 74 20 6f 66 20 74 61 62 31 2c 20 61  lLeft of tab1, a
1c60: 6e 64 20 63 6f 6c 32 20 69 73 0a 2a 2a 20 63 6f  nd col2 is.** co
1c70: 6c 75 6d 6e 20 69 43 6f 6c 52 69 67 68 74 20 6f  lumn iColRight o
1c80: 66 20 74 61 62 32 2e 0a 2a 2f 0a 73 74 61 74 69  f tab2..*/.stati
1c90: 63 20 76 6f 69 64 20 61 64 64 57 68 65 72 65 54  c void addWhereT
1ca0: 65 72 6d 28 0a 20 20 50 61 72 73 65 20 2a 70 50  erm(.  Parse *pP
1cb0: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  arse,           
1cc0: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
1cd0: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  g context */.  S
1ce0: 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20  rcList *pSrc,   
1cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1d00: 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73  * List of tables
1d10: 20 69 6e 20 46 52 4f 4d 20 63 6c 61 75 73 65 20   in FROM clause 
1d20: 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 66 74 2c 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 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
1d50: 20 66 69 72 73 74 20 74 61 62 6c 65 20 74 6f 20   first table to 
1d60: 6a 6f 69 6e 20 69 6e 20 70 53 72 63 20 2a 2f 0a  join in pSrc */.
1d70: 20 20 69 6e 74 20 69 43 6f 6c 4c 65 66 74 2c 20    int iColLeft, 
1d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d90: 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f    /* Index of co
1da0: 6c 75 6d 6e 20 69 6e 20 66 69 72 73 74 20 74 61  lumn in first ta
1db0: 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 69  ble */.  int iRi
1dc0: 67 68 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  ght,            
1dd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
1de0: 78 20 6f 66 20 73 65 63 6f 6e 64 20 74 61 62 6c  x of second tabl
1df0: 65 20 69 6e 20 70 53 72 63 20 2a 2f 0a 20 20 69  e in pSrc */.  i
1e00: 6e 74 20 69 43 6f 6c 52 69 67 68 74 2c 20 20 20  nt iColRight,   
1e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1e20: 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d  * Index of colum
1e30: 6e 20 69 6e 20 73 65 63 6f 6e 64 20 74 61 62 6c  n in second tabl
1e40: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4f 75 74  e */.  int isOut
1e50: 65 72 4a 6f 69 6e 2c 20 20 20 20 20 20 20 20 20  erJoin,         
1e60: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
1e70: 66 20 74 68 69 73 20 69 73 20 61 6e 20 4f 55 54  f this is an OUT
1e80: 45 52 20 6a 6f 69 6e 20 2a 2f 0a 20 20 45 78 70  ER join */.  Exp
1e90: 72 20 2a 2a 70 70 57 68 65 72 65 20 20 20 20 20  r **ppWhere     
1ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1eb0: 49 4e 2f 4f 55 54 3a 20 54 68 65 20 57 48 45 52  IN/OUT: The WHER
1ec0: 45 20 63 6c 61 75 73 65 20 74 6f 20 61 64 64 20  E clause to add 
1ed0: 74 6f 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  to */.){.  sqlit
1ee0: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
1ef0: 3e 64 62 3b 0a 20 20 45 78 70 72 20 2a 70 45 31  >db;.  Expr *pE1
1f00: 3b 0a 20 20 45 78 70 72 20 2a 70 45 32 3b 0a 20  ;.  Expr *pE2;. 
1f10: 20 45 78 70 72 20 2a 70 45 71 3b 0a 0a 20 20 61   Expr *pEq;..  a
1f20: 73 73 65 72 74 28 20 69 4c 65 66 74 3c 69 52 69  ssert( iLeft<iRi
1f30: 67 68 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ght );.  assert(
1f40: 20 70 53 72 63 2d 3e 6e 53 72 63 3e 69 52 69 67   pSrc->nSrc>iRig
1f50: 68 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ht );.  assert( 
1f60: 70 53 72 63 2d 3e 61 5b 69 4c 65 66 74 5d 2e 70  pSrc->a[iLeft].p
1f70: 54 61 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28  Tab );.  assert(
1f80: 20 70 53 72 63 2d 3e 61 5b 69 52 69 67 68 74 5d   pSrc->a[iRight]
1f90: 2e 70 54 61 62 20 29 3b 0a 0a 20 20 70 45 31 20  .pTab );..  pE1 
1fa0: 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 43  = sqlite3CreateC
1fb0: 6f 6c 75 6d 6e 45 78 70 72 28 64 62 2c 20 70 53  olumnExpr(db, pS
1fc0: 72 63 2c 20 69 4c 65 66 74 2c 20 69 43 6f 6c 4c  rc, iLeft, iColL
1fd0: 65 66 74 29 3b 0a 20 20 70 45 32 20 3d 20 73 71  eft);.  pE2 = sq
1fe0: 6c 69 74 65 33 43 72 65 61 74 65 43 6f 6c 75 6d  lite3CreateColum
1ff0: 6e 45 78 70 72 28 64 62 2c 20 70 53 72 63 2c 20  nExpr(db, pSrc, 
2000: 69 52 69 67 68 74 2c 20 69 43 6f 6c 52 69 67 68  iRight, iColRigh
2010: 74 29 3b 0a 0a 20 20 70 45 71 20 3d 20 73 71 6c  t);..  pEq = sql
2020: 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
2030: 2c 20 54 4b 5f 45 51 2c 20 70 45 31 2c 20 70 45  , TK_EQ, pE1, pE
2040: 32 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 45 71  2, 0);.  if( pEq
2050: 20 26 26 20 69 73 4f 75 74 65 72 4a 6f 69 6e 20   && isOuterJoin 
2060: 29 7b 0a 20 20 20 20 45 78 70 72 53 65 74 50 72  ){.    ExprSetPr
2070: 6f 70 65 72 74 79 28 70 45 71 2c 20 45 50 5f 46  operty(pEq, EP_F
2080: 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20 61 73  romJoin);.    as
2090: 73 65 72 74 28 20 21 45 78 70 72 48 61 73 41 6e  sert( !ExprHasAn
20a0: 79 50 72 6f 70 65 72 74 79 28 70 45 71 2c 20 45  yProperty(pEq, E
20b0: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52  P_TokenOnly|EP_R
20c0: 65 64 75 63 65 64 29 20 29 3b 0a 20 20 20 20 45  educed) );.    E
20d0: 78 70 72 53 65 74 49 72 72 65 64 75 63 69 62 6c  xprSetIrreducibl
20e0: 65 28 70 45 71 29 3b 0a 20 20 20 20 70 45 71 2d  e(pEq);.    pEq-
20f0: 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65  >iRightJoinTable
2100: 20 3d 20 28 69 31 36 29 70 45 32 2d 3e 69 54 61   = (i16)pE2->iTa
2110: 62 6c 65 3b 0a 20 20 7d 0a 20 20 2a 70 70 57 68  ble;.  }.  *ppWh
2120: 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ere = sqlite3Exp
2130: 72 41 6e 64 28 64 62 2c 20 2a 70 70 57 68 65 72  rAnd(db, *ppWher
2140: 65 2c 20 70 45 71 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  e, pEq);.}../*.*
2150: 2a 20 53 65 74 20 74 68 65 20 45 50 5f 46 72 6f  * Set the EP_Fro
2160: 6d 4a 6f 69 6e 20 70 72 6f 70 65 72 74 79 20 6f  mJoin property o
2170: 6e 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74  n all terms of t
2180: 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73  he given express
2190: 69 6f 6e 2e 0a 2a 2a 20 41 6e 64 20 73 65 74 20  ion..** And set 
21a0: 74 68 65 20 45 78 70 72 2e 69 52 69 67 68 74 4a  the Expr.iRightJ
21b0: 6f 69 6e 54 61 62 6c 65 20 74 6f 20 69 54 61 62  oinTable to iTab
21c0: 6c 65 20 66 6f 72 20 65 76 65 72 79 20 74 65 72  le for every ter
21d0: 6d 20 69 6e 20 74 68 65 0a 2a 2a 20 65 78 70 72  m in the.** expr
21e0: 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  ession..**.** Th
21f0: 65 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 70 72  e EP_FromJoin pr
2200: 6f 70 65 72 74 79 20 69 73 20 75 73 65 64 20 6f  operty is used o
2210: 6e 20 74 65 72 6d 73 20 6f 66 20 61 6e 20 65 78  n terms of an ex
2220: 70 72 65 73 73 69 6f 6e 20 74 6f 20 74 65 6c 6c  pression to tell
2230: 0a 2a 2a 20 74 68 65 20 4c 45 46 54 20 4f 55 54  .** the LEFT OUT
2240: 45 52 20 4a 4f 49 4e 20 70 72 6f 63 65 73 73 69  ER JOIN processi
2250: 6e 67 20 6c 6f 67 69 63 20 74 68 61 74 20 74 68  ng logic that th
2260: 69 73 20 74 65 72 6d 20 69 73 20 70 61 72 74 20  is term is part 
2270: 6f 66 20 74 68 65 0a 2a 2a 20 6a 6f 69 6e 20 72  of the.** join r
2280: 65 73 74 72 69 63 74 69 6f 6e 20 73 70 65 63 69  estriction speci
2290: 66 69 65 64 20 69 6e 20 74 68 65 20 4f 4e 20 6f  fied in the ON o
22a0: 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 61  r USING clause a
22b0: 6e 64 20 6e 6f 74 20 61 20 70 61 72 74 0a 2a 2a  nd not a part.**
22c0: 20 6f 66 20 74 68 65 20 6d 6f 72 65 20 67 65 6e   of the more gen
22d0: 65 72 61 6c 20 57 48 45 52 45 20 63 6c 61 75 73  eral WHERE claus
22e0: 65 2e 20 20 54 68 65 73 65 20 74 65 72 6d 73 20  e.  These terms 
22f0: 61 72 65 20 6d 6f 76 65 64 20 6f 76 65 72 20 74  are moved over t
2300: 6f 20 74 68 65 0a 2a 2a 20 57 48 45 52 45 20 63  o the.** WHERE c
2310: 6c 61 75 73 65 20 64 75 72 69 6e 67 20 6a 6f 69  lause during joi
2320: 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 62 75 74  n processing but
2330: 20 77 65 20 6e 65 65 64 20 74 6f 20 72 65 6d 65   we need to reme
2340: 6d 62 65 72 20 74 68 61 74 20 74 68 65 79 0a 2a  mber that they.*
2350: 2a 20 6f 72 69 67 69 6e 61 74 65 64 20 69 6e 20  * originated in 
2360: 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20  the ON or USING 
2370: 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  clause..**.** Th
2380: 65 20 45 78 70 72 2e 69 52 69 67 68 74 4a 6f 69  e Expr.iRightJoi
2390: 6e 54 61 62 6c 65 20 74 65 6c 6c 73 20 74 68 65  nTable tells the
23a0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 70 72   WHERE clause pr
23b0: 6f 63 65 73 73 69 6e 67 20 74 68 61 74 20 74 68  ocessing that th
23c0: 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20  e.** expression 
23d0: 64 65 70 65 6e 64 73 20 6f 6e 20 74 61 62 6c 65  depends on table
23e0: 20 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65   iRightJoinTable
23f0: 20 65 76 65 6e 20 69 66 20 74 68 61 74 20 74 61   even if that ta
2400: 62 6c 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 65 78  ble is not.** ex
2410: 70 6c 69 63 69 74 6c 79 20 6d 65 6e 74 69 6f 6e  plicitly mention
2420: 65 64 20 69 6e 20 74 68 65 20 65 78 70 72 65 73  ed in the expres
2430: 73 69 6f 6e 2e 20 20 54 68 61 74 20 69 6e 66 6f  sion.  That info
2440: 72 6d 61 74 69 6f 6e 20 69 73 20 6e 65 65 64 65  rmation is neede
2450: 64 0a 2a 2a 20 66 6f 72 20 63 61 73 65 73 20 6c  d.** for cases l
2460: 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20  ike this:.**.** 
2470: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
2480: 20 74 31 20 4c 45 46 54 20 4a 4f 49 4e 20 74 32   t1 LEFT JOIN t2
2490: 20 4f 4e 20 74 31 2e 61 3d 74 32 2e 62 20 41 4e   ON t1.a=t2.b AN
24a0: 44 20 74 31 2e 78 3d 35 0a 2a 2a 0a 2a 2a 20 54  D t1.x=5.**.** T
24b0: 68 65 20 77 68 65 72 65 20 63 6c 61 75 73 65 20  he where clause 
24c0: 6e 65 65 64 73 20 74 6f 20 64 65 66 65 72 20 74  needs to defer t
24d0: 68 65 20 68 61 6e 64 6c 69 6e 67 20 6f 66 20 74  he handling of t
24e0: 68 65 20 74 31 2e 78 3d 35 0a 2a 2a 20 74 65 72  he t1.x=5.** ter
24f0: 6d 20 75 6e 74 69 6c 20 61 66 74 65 72 20 74 68  m until after th
2500: 65 20 74 32 20 6c 6f 6f 70 20 6f 66 20 74 68 65  e t2 loop of the
2510: 20 6a 6f 69 6e 2e 20 20 49 6e 20 74 68 61 74 20   join.  In that 
2520: 77 61 79 2c 20 61 0a 2a 2a 20 4e 55 4c 4c 20 74  way, a.** NULL t
2530: 32 20 72 6f 77 20 77 69 6c 6c 20 62 65 20 69 6e  2 row will be in
2540: 73 65 72 74 65 64 20 77 68 65 6e 65 76 65 72 20  serted whenever 
2550: 74 31 2e 78 21 3d 35 2e 20 20 49 66 20 77 65 20  t1.x!=5.  If we 
2560: 64 6f 20 6e 6f 74 0a 2a 2a 20 64 65 66 65 72 20  do not.** defer 
2570: 74 68 65 20 68 61 6e 64 6c 69 6e 67 20 6f 66 20  the handling of 
2580: 74 31 2e 78 3d 35 2c 20 69 74 20 77 69 6c 6c 20  t1.x=5, it will 
2590: 62 65 20 70 72 6f 63 65 73 73 65 64 20 69 6d 6d  be processed imm
25a0: 65 64 69 61 74 65 6c 79 0a 2a 2a 20 61 66 74 65  ediately.** afte
25b0: 72 20 74 68 65 20 74 31 20 6c 6f 6f 70 20 61 6e  r the t1 loop an
25c0: 64 20 72 6f 77 73 20 77 69 74 68 20 74 31 2e 78  d rows with t1.x
25d0: 21 3d 35 20 77 69 6c 6c 20 6e 65 76 65 72 20 61  !=5 will never a
25e0: 70 70 65 61 72 20 69 6e 0a 2a 2a 20 74 68 65 20  ppear in.** the 
25f0: 6f 75 74 70 75 74 2c 20 77 68 69 63 68 20 69 73  output, which is
2600: 20 69 6e 63 6f 72 72 65 63 74 2e 0a 2a 2f 0a 73   incorrect..*/.s
2610: 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 4a 6f  tatic void setJo
2620: 69 6e 45 78 70 72 28 45 78 70 72 20 2a 70 2c 20  inExpr(Expr *p, 
2630: 69 6e 74 20 69 54 61 62 6c 65 29 7b 0a 20 20 77  int iTable){.  w
2640: 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 45  hile( p ){.    E
2650: 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70  xprSetProperty(p
2660: 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a  , EP_FromJoin);.
2670: 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
2680: 72 48 61 73 41 6e 79 50 72 6f 70 65 72 74 79 28  rHasAnyProperty(
2690: 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c  p, EP_TokenOnly|
26a0: 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a 20  EP_Reduced) );. 
26b0: 20 20 20 45 78 70 72 53 65 74 49 72 72 65 64 75     ExprSetIrredu
26c0: 63 69 62 6c 65 28 70 29 3b 0a 20 20 20 20 70 2d  cible(p);.    p-
26d0: 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65  >iRightJoinTable
26e0: 20 3d 20 28 69 31 36 29 69 54 61 62 6c 65 3b 0a   = (i16)iTable;.
26f0: 20 20 20 20 73 65 74 4a 6f 69 6e 45 78 70 72 28      setJoinExpr(
2700: 70 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 6c 65  p->pLeft, iTable
2710: 29 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 52  );.    p = p->pR
2720: 69 67 68 74 3b 0a 20 20 7d 20 0a 7d 0a 0a 2f 2a  ight;.  } .}../*
2730: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
2740: 20 70 72 6f 63 65 73 73 65 73 20 74 68 65 20 6a   processes the j
2750: 6f 69 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  oin information 
2760: 66 6f 72 20 61 20 53 45 4c 45 43 54 20 73 74 61  for a SELECT sta
2770: 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4f 4e 20 61 6e  tement..** ON an
2780: 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20  d USING clauses 
2790: 61 72 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e  are converted in
27a0: 74 6f 20 65 78 74 72 61 20 74 65 72 6d 73 20 6f  to extra terms o
27b0: 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
27c0: 73 65 2e 0a 2a 2a 20 4e 41 54 55 52 41 4c 20 6a  se..** NATURAL j
27d0: 6f 69 6e 73 20 61 6c 73 6f 20 63 72 65 61 74 65  oins also create
27e0: 20 65 78 74 72 61 20 57 48 45 52 45 20 63 6c 61   extra WHERE cla
27f0: 75 73 65 20 74 65 72 6d 73 2e 0a 2a 2a 0a 2a 2a  use terms..**.**
2800: 20 54 68 65 20 74 65 72 6d 73 20 6f 66 20 61 20   The terms of a 
2810: 46 52 4f 4d 20 63 6c 61 75 73 65 20 61 72 65 20  FROM clause are 
2820: 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65  contained in the
2830: 20 53 65 6c 65 63 74 2e 70 53 72 63 20 73 74 72   Select.pSrc str
2840: 75 63 74 75 72 65 2e 0a 2a 2a 20 54 68 65 20 6c  ucture..** The l
2850: 65 66 74 20 6d 6f 73 74 20 74 61 62 6c 65 20 69  eft most table i
2860: 73 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72  s the first entr
2870: 79 20 69 6e 20 53 65 6c 65 63 74 2e 70 53 72 63  y in Select.pSrc
2880: 2e 20 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73  .  The right-mos
2890: 74 0a 2a 2a 20 74 61 62 6c 65 20 69 73 20 74 68  t.** table is th
28a0: 65 20 6c 61 73 74 20 65 6e 74 72 79 2e 20 20 54  e last entry.  T
28b0: 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72  he join operator
28c0: 20 69 73 20 68 65 6c 64 20 69 6e 20 74 68 65 20   is held in the 
28d0: 65 6e 74 72 79 20 74 6f 0a 2a 2a 20 74 68 65 20  entry to.** the 
28e0: 6c 65 66 74 2e 20 20 54 68 75 73 20 65 6e 74 72  left.  Thus entr
28f0: 79 20 30 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  y 0 contains the
2900: 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 20 66   join operator f
2910: 6f 72 20 74 68 65 20 6a 6f 69 6e 20 62 65 74 77  or the join betw
2920: 65 65 6e 0a 2a 2a 20 65 6e 74 72 69 65 73 20 30  een.** entries 0
2930: 20 61 6e 64 20 31 2e 20 20 41 6e 79 20 4f 4e 20   and 1.  Any ON 
2940: 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73  or USING clauses
2950: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
2960: 20 74 68 65 20 6a 6f 69 6e 20 61 72 65 0a 2a 2a   the join are.**
2970: 20 61 6c 73 6f 20 61 74 74 61 63 68 65 64 20 74   also attached t
2980: 6f 20 74 68 65 20 6c 65 66 74 20 65 6e 74 72 79  o the left entry
2990: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
29a0: 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65  tine returns the
29b0: 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72   number of error
29c0: 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a  s encountered..*
29d0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c  /.static int sql
29e0: 69 74 65 50 72 6f 63 65 73 73 4a 6f 69 6e 28 50  iteProcessJoin(P
29f0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65  arse *pParse, Se
2a00: 6c 65 63 74 20 2a 70 29 7b 0a 20 20 53 72 63 4c  lect *p){.  SrcL
2a10: 69 73 74 20 2a 70 53 72 63 3b 20 20 20 20 20 20  ist *pSrc;      
2a20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
2a30: 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65  ll tables in the
2a40: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a   FROM clause */.
2a50: 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20    int i, j;     
2a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a70: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
2a80: 72 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  rs */.  struct S
2a90: 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4c 65  rcList_item *pLe
2aa0: 66 74 3b 20 20 20 20 20 2f 2a 20 4c 65 66 74 20  ft;     /* Left 
2ab0: 74 61 62 6c 65 20 62 65 69 6e 67 20 6a 6f 69 6e  table being join
2ac0: 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  ed */.  struct S
2ad0: 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 52 69  rcList_item *pRi
2ae0: 67 68 74 3b 20 20 20 20 2f 2a 20 52 69 67 68 74  ght;    /* Right
2af0: 20 74 61 62 6c 65 20 62 65 69 6e 67 20 6a 6f 69   table being joi
2b00: 6e 65 64 20 2a 2f 0a 0a 20 20 70 53 72 63 20 3d  ned */..  pSrc =
2b10: 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 4c 65 66   p->pSrc;.  pLef
2b20: 74 20 3d 20 26 70 53 72 63 2d 3e 61 5b 30 5d 3b  t = &pSrc->a[0];
2b30: 0a 20 20 70 52 69 67 68 74 20 3d 20 26 70 4c 65  .  pRight = &pLe
2b40: 66 74 5b 31 5d 3b 0a 20 20 66 6f 72 28 69 3d 30  ft[1];.  for(i=0
2b50: 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63 2d 31  ; i<pSrc->nSrc-1
2b60: 3b 20 69 2b 2b 2c 20 70 52 69 67 68 74 2b 2b 2c  ; i++, pRight++,
2b70: 20 70 4c 65 66 74 2b 2b 29 7b 0a 20 20 20 20 54   pLeft++){.    T
2b80: 61 62 6c 65 20 2a 70 4c 65 66 74 54 61 62 20 3d  able *pLeftTab =
2b90: 20 70 4c 65 66 74 2d 3e 70 54 61 62 3b 0a 20 20   pLeft->pTab;.  
2ba0: 20 20 54 61 62 6c 65 20 2a 70 52 69 67 68 74 54    Table *pRightT
2bb0: 61 62 20 3d 20 70 52 69 67 68 74 2d 3e 70 54 61  ab = pRight->pTa
2bc0: 62 3b 0a 20 20 20 20 69 6e 74 20 69 73 4f 75 74  b;.    int isOut
2bd0: 65 72 3b 0a 0a 20 20 20 20 69 66 28 20 4e 45 56  er;..    if( NEV
2be0: 45 52 28 70 4c 65 66 74 54 61 62 3d 3d 30 20 7c  ER(pLeftTab==0 |
2bf0: 7c 20 70 52 69 67 68 74 54 61 62 3d 3d 30 29 20  | pRightTab==0) 
2c00: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
2c10: 69 73 4f 75 74 65 72 20 3d 20 28 70 52 69 67 68  isOuter = (pRigh
2c20: 74 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54  t->jointype & JT
2c30: 5f 4f 55 54 45 52 29 21 3d 30 3b 0a 0a 20 20 20  _OUTER)!=0;..   
2c40: 20 2f 2a 20 57 68 65 6e 20 74 68 65 20 4e 41 54   /* When the NAT
2c50: 55 52 41 4c 20 6b 65 79 77 6f 72 64 20 69 73 20  URAL keyword is 
2c60: 70 72 65 73 65 6e 74 2c 20 61 64 64 20 57 48 45  present, add WHE
2c70: 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20  RE clause terms 
2c80: 66 6f 72 0a 20 20 20 20 2a 2a 20 65 76 65 72 79  for.    ** every
2c90: 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 74 68 65   column that the
2ca0: 20 74 77 6f 20 74 61 62 6c 65 73 20 68 61 76 65   two tables have
2cb0: 20 69 6e 20 63 6f 6d 6d 6f 6e 2e 0a 20 20 20 20   in common..    
2cc0: 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 69 67 68  */.    if( pRigh
2cd0: 74 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54  t->jointype & JT
2ce0: 5f 4e 41 54 55 52 41 4c 20 29 7b 0a 20 20 20 20  _NATURAL ){.    
2cf0: 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 70 4f    if( pRight->pO
2d00: 6e 20 7c 7c 20 70 52 69 67 68 74 2d 3e 70 55 73  n || pRight->pUs
2d10: 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ing ){.        s
2d20: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
2d30: 50 61 72 73 65 2c 20 22 61 20 4e 41 54 55 52 41  Parse, "a NATURA
2d40: 4c 20 6a 6f 69 6e 20 6d 61 79 20 6e 6f 74 20 68  L join may not h
2d50: 61 76 65 20 22 0a 20 20 20 20 20 20 20 20 20 20  ave ".          
2d60: 20 22 61 6e 20 4f 4e 20 6f 72 20 55 53 49 4e 47   "an ON or USING
2d70: 20 63 6c 61 75 73 65 22 2c 20 30 29 3b 0a 20 20   clause", 0);.  
2d80: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
2d90: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f        }.      fo
2da0: 72 28 6a 3d 30 3b 20 6a 3c 70 52 69 67 68 74 54  r(j=0; j<pRightT
2db0: 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a  ab->nCol; j++){.
2dc0: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e          char *zN
2dd0: 61 6d 65 3b 20 20 20 2f 2a 20 4e 61 6d 65 20 6f  ame;   /* Name o
2de0: 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20  f column in the 
2df0: 72 69 67 68 74 20 74 61 62 6c 65 20 2a 2f 0a 20  right table */. 
2e00: 20 20 20 20 20 20 20 69 6e 74 20 69 4c 65 66 74         int iLeft
2e10: 3b 20 20 20 20 20 2f 2a 20 4d 61 74 63 68 69 6e  ;     /* Matchin
2e20: 67 20 6c 65 66 74 20 74 61 62 6c 65 20 2a 2f 0a  g left table */.
2e30: 20 20 20 20 20 20 20 20 69 6e 74 20 69 4c 65 66          int iLef
2e40: 74 43 6f 6c 3b 20 20 2f 2a 20 4d 61 74 63 68 69  tCol;  /* Matchi
2e50: 6e 67 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65  ng column in the
2e60: 20 6c 65 66 74 20 74 61 62 6c 65 20 2a 2f 0a 0a   left table */..
2e70: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
2e80: 70 52 69 67 68 74 54 61 62 2d 3e 61 43 6f 6c 5b  pRightTab->aCol[
2e90: 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  j].zName;.      
2ea0: 20 20 69 66 28 20 74 61 62 6c 65 41 6e 64 43 6f    if( tableAndCo
2eb0: 6c 75 6d 6e 49 6e 64 65 78 28 70 53 72 63 2c 20  lumnIndex(pSrc, 
2ec0: 69 2b 31 2c 20 7a 4e 61 6d 65 2c 20 26 69 4c 65  i+1, zName, &iLe
2ed0: 66 74 2c 20 26 69 4c 65 66 74 43 6f 6c 29 20 29  ft, &iLeftCol) )
2ee0: 7b 0a 20 20 20 20 20 20 20 20 20 20 61 64 64 57  {.          addW
2ef0: 68 65 72 65 54 65 72 6d 28 70 50 61 72 73 65 2c  hereTerm(pParse,
2f00: 20 70 53 72 63 2c 20 69 4c 65 66 74 2c 20 69 4c   pSrc, iLeft, iL
2f10: 65 66 74 43 6f 6c 2c 20 69 2b 31 2c 20 6a 2c 0a  eftCol, i+1, j,.
2f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f30: 20 20 20 20 20 20 20 69 73 4f 75 74 65 72 2c 20         isOuter, 
2f40: 26 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20  &p->pWhere);.   
2f50: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
2f60: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 69 73     }..    /* Dis
2f70: 61 6c 6c 6f 77 20 62 6f 74 68 20 4f 4e 20 61 6e  allow both ON an
2f80: 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20  d USING clauses 
2f90: 69 6e 20 74 68 65 20 73 61 6d 65 20 6a 6f 69 6e  in the same join
2fa0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
2fb0: 70 52 69 67 68 74 2d 3e 70 4f 6e 20 26 26 20 70  pRight->pOn && p
2fc0: 52 69 67 68 74 2d 3e 70 55 73 69 6e 67 20 29 7b  Right->pUsing ){
2fd0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
2fe0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
2ff0: 63 61 6e 6e 6f 74 20 68 61 76 65 20 62 6f 74 68  cannot have both
3000: 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 22 0a   ON and USING ".
3010: 20 20 20 20 20 20 20 20 22 63 6c 61 75 73 65 73          "clauses
3020: 20 69 6e 20 74 68 65 20 73 61 6d 65 20 6a 6f 69   in the same joi
3030: 6e 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  n");.      retur
3040: 6e 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  n 1;.    }..    
3050: 2f 2a 20 41 64 64 20 74 68 65 20 4f 4e 20 63 6c  /* Add the ON cl
3060: 61 75 73 65 20 74 6f 20 74 68 65 20 65 6e 64 20  ause to the end 
3070: 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
3080: 75 73 65 2c 20 63 6f 6e 6e 65 63 74 65 64 20 62  use, connected b
3090: 79 0a 20 20 20 20 2a 2a 20 61 6e 20 41 4e 44 20  y.    ** an AND 
30a0: 6f 70 65 72 61 74 6f 72 2e 0a 20 20 20 20 2a 2f  operator..    */
30b0: 0a 20 20 20 20 69 66 28 20 70 52 69 67 68 74 2d  .    if( pRight-
30c0: 3e 70 4f 6e 20 29 7b 0a 20 20 20 20 20 20 69 66  >pOn ){.      if
30d0: 28 20 69 73 4f 75 74 65 72 20 29 20 73 65 74 4a  ( isOuter ) setJ
30e0: 6f 69 6e 45 78 70 72 28 70 52 69 67 68 74 2d 3e  oinExpr(pRight->
30f0: 70 4f 6e 2c 20 70 52 69 67 68 74 2d 3e 69 43 75  pOn, pRight->iCu
3100: 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 70 2d 3e  rsor);.      p->
3110: 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33  pWhere = sqlite3
3120: 45 78 70 72 41 6e 64 28 70 50 61 72 73 65 2d 3e  ExprAnd(pParse->
3130: 64 62 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20 70  db, p->pWhere, p
3140: 52 69 67 68 74 2d 3e 70 4f 6e 29 3b 0a 20 20 20  Right->pOn);.   
3150: 20 20 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20 3d     pRight->pOn =
3160: 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f   0;.    }..    /
3170: 2a 20 43 72 65 61 74 65 20 65 78 74 72 61 20 74  * Create extra t
3180: 65 72 6d 73 20 6f 6e 20 74 68 65 20 57 48 45 52  erms on the WHER
3190: 45 20 63 6c 61 75 73 65 20 66 6f 72 20 65 61 63  E clause for eac
31a0: 68 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64 0a 20  h column named. 
31b0: 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 55 53 49     ** in the USI
31c0: 4e 47 20 63 6c 61 75 73 65 2e 20 20 45 78 61 6d  NG clause.  Exam
31d0: 70 6c 65 3a 20 49 66 20 74 68 65 20 74 77 6f 20  ple: If the two 
31e0: 74 61 62 6c 65 73 20 74 6f 20 62 65 20 6a 6f 69  tables to be joi
31f0: 6e 65 64 20 61 72 65 20 0a 20 20 20 20 2a 2a 20  ned are .    ** 
3200: 41 20 61 6e 64 20 42 20 61 6e 64 20 74 68 65 20  A and B and the 
3210: 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6e 61 6d  USING clause nam
3220: 65 73 20 58 2c 20 59 2c 20 61 6e 64 20 5a 2c 20  es X, Y, and Z, 
3230: 74 68 65 6e 20 61 64 64 20 74 68 69 73 0a 20 20  then add this.  
3240: 20 20 2a 2a 20 74 6f 20 74 68 65 20 57 48 45 52    ** to the WHER
3250: 45 20 63 6c 61 75 73 65 3a 20 20 20 20 41 2e 58  E clause:    A.X
3260: 3d 42 2e 58 20 41 4e 44 20 41 2e 59 3d 42 2e 59  =B.X AND A.Y=B.Y
3270: 20 41 4e 44 20 41 2e 5a 3d 42 2e 5a 0a 20 20 20   AND A.Z=B.Z.   
3280: 20 2a 2a 20 52 65 70 6f 72 74 20 61 6e 20 65 72   ** Report an er
3290: 72 6f 72 20 69 66 20 61 6e 79 20 63 6f 6c 75 6d  ror if any colum
32a0: 6e 20 6d 65 6e 74 69 6f 6e 65 64 20 69 6e 20 74  n mentioned in t
32b0: 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20  he USING clause 
32c0: 69 73 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 63 6f  is.    ** not co
32d0: 6e 74 61 69 6e 65 64 20 69 6e 20 62 6f 74 68 20  ntained in both 
32e0: 74 61 62 6c 65 73 20 74 6f 20 62 65 20 6a 6f 69  tables to be joi
32f0: 6e 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ned..    */.    
3300: 69 66 28 20 70 52 69 67 68 74 2d 3e 70 55 73 69  if( pRight->pUsi
3310: 6e 67 20 29 7b 0a 20 20 20 20 20 20 49 64 4c 69  ng ){.      IdLi
3320: 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 52 69 67  st *pList = pRig
3330: 68 74 2d 3e 70 55 73 69 6e 67 3b 0a 20 20 20 20  ht->pUsing;.    
3340: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4c 69    for(j=0; j<pLi
3350: 73 74 2d 3e 6e 49 64 3b 20 6a 2b 2b 29 7b 0a 20  st->nId; j++){. 
3360: 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61         char *zNa
3370: 6d 65 3b 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20  me;     /* Name 
3380: 6f 66 20 74 68 65 20 74 65 72 6d 20 69 6e 20 74  of the term in t
3390: 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20  he USING clause 
33a0: 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  */.        int i
33b0: 4c 65 66 74 3b 20 20 20 20 20 20 20 2f 2a 20 54  Left;       /* T
33c0: 61 62 6c 65 20 6f 6e 20 74 68 65 20 6c 65 66 74  able on the left
33d0: 20 77 69 74 68 20 6d 61 74 63 68 69 6e 67 20 63   with matching c
33e0: 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  olumn name */.  
33f0: 20 20 20 20 20 20 69 6e 74 20 69 4c 65 66 74 43        int iLeftC
3400: 6f 6c 3b 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e  ol;    /* Column
3410: 20 6e 75 6d 62 65 72 20 6f 66 20 6d 61 74 63 68   number of match
3420: 69 6e 67 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74 68  ing column on th
3430: 65 20 6c 65 66 74 20 2a 2f 0a 20 20 20 20 20 20  e left */.      
3440: 20 20 69 6e 74 20 69 52 69 67 68 74 43 6f 6c 3b    int iRightCol;
3450: 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d     /* Column num
3460: 62 65 72 20 6f 66 20 6d 61 74 63 68 69 6e 67 20  ber of matching 
3470: 63 6f 6c 75 6d 6e 20 6f 6e 20 74 68 65 20 72 69  column on the ri
3480: 67 68 74 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20  ght */..        
3490: 7a 4e 61 6d 65 20 3d 20 70 4c 69 73 74 2d 3e 61  zName = pList->a
34a0: 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  [j].zName;.     
34b0: 20 20 20 69 52 69 67 68 74 43 6f 6c 20 3d 20 63     iRightCol = c
34c0: 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 52 69 67 68  olumnIndex(pRigh
34d0: 74 54 61 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  tTab, zName);.  
34e0: 20 20 20 20 20 20 69 66 28 20 69 52 69 67 68 74        if( iRight
34f0: 43 6f 6c 3c 30 0a 20 20 20 20 20 20 20 20 20 7c  Col<0.         |
3500: 7c 20 21 74 61 62 6c 65 41 6e 64 43 6f 6c 75 6d  | !tableAndColum
3510: 6e 49 6e 64 65 78 28 70 53 72 63 2c 20 69 2b 31  nIndex(pSrc, i+1
3520: 2c 20 7a 4e 61 6d 65 2c 20 26 69 4c 65 66 74 2c  , zName, &iLeft,
3530: 20 26 69 4c 65 66 74 43 6f 6c 29 0a 20 20 20 20   &iLeftCol).    
3540: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
3550: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
3560: 28 70 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74  (pParse, "cannot
3570: 20 6a 6f 69 6e 20 75 73 69 6e 67 20 63 6f 6c 75   join using colu
3580: 6d 6e 20 25 73 20 2d 20 63 6f 6c 75 6d 6e 20 22  mn %s - column "
3590: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 6e 6f  .            "no
35a0: 74 20 70 72 65 73 65 6e 74 20 69 6e 20 62 6f 74  t present in bot
35b0: 68 20 74 61 62 6c 65 73 22 2c 20 7a 4e 61 6d 65  h tables", zName
35c0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
35d0: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  urn 1;.        }
35e0: 0a 20 20 20 20 20 20 20 20 61 64 64 57 68 65 72  .        addWher
35f0: 65 54 65 72 6d 28 70 50 61 72 73 65 2c 20 70 53  eTerm(pParse, pS
3600: 72 63 2c 20 69 4c 65 66 74 2c 20 69 4c 65 66 74  rc, iLeft, iLeft
3610: 43 6f 6c 2c 20 69 2b 31 2c 20 69 52 69 67 68 74  Col, i+1, iRight
3620: 43 6f 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Col,.           
3630: 20 20 20 20 20 20 20 20 20 20 69 73 4f 75 74 65            isOute
3640: 72 2c 20 26 70 2d 3e 70 57 68 65 72 65 29 3b 0a  r, &p->pWhere);.
3650: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
3660: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
3670: 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 63 6f  ./*.** Insert co
3680: 64 65 20 69 6e 74 6f 20 22 76 22 20 74 68 61 74  de into "v" that
3690: 20 77 69 6c 6c 20 70 75 73 68 20 74 68 65 20 72   will push the r
36a0: 65 63 6f 72 64 20 6f 6e 20 74 68 65 20 74 6f 70  ecord on the top
36b0: 20 6f 66 20 74 68 65 0a 2a 2a 20 73 74 61 63 6b   of the.** stack
36c0: 20 69 6e 74 6f 20 74 68 65 20 73 6f 72 74 65 72   into the sorter
36d0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
36e0: 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28   pushOntoSorter(
36f0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
3700: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72  ,         /* Par
3710: 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ser context */. 
3720: 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
3730: 72 42 79 2c 20 20 20 20 2f 2a 20 54 68 65 20 4f  rBy,    /* The O
3740: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a  RDER BY clause *
3750: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  /.  Select *pSel
3760: 65 63 74 2c 20 20 20 20 20 20 20 2f 2a 20 54 68  ect,       /* Th
3770: 65 20 77 68 6f 6c 65 20 53 45 4c 45 43 54 20 73  e whole SELECT s
3780: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e  tatement */.  in
3790: 74 20 72 65 67 44 61 74 61 20 20 20 20 20 20 20  t regData       
37a0: 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
37b0: 20 68 6f 6c 64 69 6e 67 20 64 61 74 61 20 74 6f   holding data to
37c0: 20 62 65 20 73 6f 72 74 65 64 20 2a 2f 0a 29 7b   be sorted */.){
37d0: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
37e0: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
37f0: 74 20 6e 45 78 70 72 20 3d 20 70 4f 72 64 65 72  t nExpr = pOrder
3800: 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 69 6e 74  By->nExpr;.  int
3810: 20 72 65 67 42 61 73 65 20 3d 20 73 71 6c 69 74   regBase = sqlit
3820: 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70  e3GetTempRange(p
3830: 50 61 72 73 65 2c 20 6e 45 78 70 72 2b 32 29 3b  Parse, nExpr+2);
3840: 0a 20 20 69 6e 74 20 72 65 67 52 65 63 6f 72 64  .  int regRecord
3850: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
3860: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
3870: 69 6e 74 20 6f 70 3b 0a 20 20 73 71 6c 69 74 65  int op;.  sqlite
3880: 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28  3ExprCacheClear(
3890: 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74  pParse);.  sqlit
38a0: 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69  e3ExprCodeExprLi
38b0: 73 74 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65  st(pParse, pOrde
38c0: 72 42 79 2c 20 72 65 67 42 61 73 65 2c 20 30 29  rBy, regBase, 0)
38d0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
38e0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65 71 75  ddOp2(v, OP_Sequ
38f0: 65 6e 63 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e  ence, pOrderBy->
3900: 69 45 43 75 72 73 6f 72 2c 20 72 65 67 42 61 73  iECursor, regBas
3910: 65 2b 6e 45 78 70 72 29 3b 0a 20 20 73 71 6c 69  e+nExpr);.  sqli
3920: 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28  te3ExprCodeMove(
3930: 70 50 61 72 73 65 2c 20 72 65 67 44 61 74 61 2c  pParse, regData,
3940: 20 72 65 67 42 61 73 65 2b 6e 45 78 70 72 2b 31   regBase+nExpr+1
3950: 2c 20 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  , 1);.  sqlite3V
3960: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
3970: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 42  MakeRecord, regB
3980: 61 73 65 2c 20 6e 45 78 70 72 20 2b 20 32 2c 20  ase, nExpr + 2, 
3990: 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 69 66  regRecord);.  if
39a0: 28 20 70 53 65 6c 65 63 74 2d 3e 73 65 6c 46 6c  ( pSelect->selFl
39b0: 61 67 73 20 26 20 53 46 5f 55 73 65 53 6f 72 74  ags & SF_UseSort
39c0: 65 72 20 29 7b 0a 20 20 20 20 6f 70 20 3d 20 4f  er ){.    op = O
39d0: 50 5f 53 6f 72 74 65 72 49 6e 73 65 72 74 3b 0a  P_SorterInsert;.
39e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 70 20    }else{.    op 
39f0: 3d 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 3b 0a  = OP_IdxInsert;.
3a00: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
3a10: 65 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20 70  eAddOp2(v, op, p
3a20: 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f  OrderBy->iECurso
3a30: 72 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20  r, regRecord);. 
3a40: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
3a50: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
3a60: 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c  egRecord);.  sql
3a70: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
3a80: 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67  ange(pParse, reg
3a90: 42 61 73 65 2c 20 6e 45 78 70 72 2b 32 29 3b 0a  Base, nExpr+2);.
3aa0: 20 20 69 66 28 20 70 53 65 6c 65 63 74 2d 3e 69    if( pSelect->i
3ab0: 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 69 6e 74  Limit ){.    int
3ac0: 20 61 64 64 72 31 2c 20 61 64 64 72 32 3b 0a 20   addr1, addr2;. 
3ad0: 20 20 20 69 6e 74 20 69 4c 69 6d 69 74 3b 0a 20     int iLimit;. 
3ae0: 20 20 20 69 66 28 20 70 53 65 6c 65 63 74 2d 3e     if( pSelect->
3af0: 69 4f 66 66 73 65 74 20 29 7b 0a 20 20 20 20 20  iOffset ){.     
3b00: 20 69 4c 69 6d 69 74 20 3d 20 70 53 65 6c 65 63   iLimit = pSelec
3b10: 74 2d 3e 69 4f 66 66 73 65 74 2b 31 3b 0a 20 20  t->iOffset+1;.  
3b20: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
3b30: 4c 69 6d 69 74 20 3d 20 70 53 65 6c 65 63 74 2d  Limit = pSelect-
3b40: 3e 69 4c 69 6d 69 74 3b 0a 20 20 20 20 7d 0a 20  >iLimit;.    }. 
3b50: 20 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74     addr1 = sqlit
3b60: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
3b70: 4f 50 5f 49 66 5a 65 72 6f 2c 20 69 4c 69 6d 69  OP_IfZero, iLimi
3b80: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  t);.    sqlite3V
3b90: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
3ba0: 41 64 64 49 6d 6d 2c 20 69 4c 69 6d 69 74 2c 20  AddImm, iLimit, 
3bb0: 2d 31 29 3b 0a 20 20 20 20 61 64 64 72 32 20 3d  -1);.    addr2 =
3bc0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
3bd0: 70 30 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a  p0(v, OP_Goto);.
3be0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
3bf0: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 31  umpHere(v, addr1
3c00: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
3c10: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4c  beAddOp1(v, OP_L
3c20: 61 73 74 2c 20 70 4f 72 64 65 72 42 79 2d 3e 69  ast, pOrderBy->i
3c30: 45 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 73 71  ECursor);.    sq
3c40: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
3c50: 76 2c 20 4f 50 5f 44 65 6c 65 74 65 2c 20 70 4f  v, OP_Delete, pO
3c60: 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72  rderBy->iECursor
3c70: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
3c80: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
3c90: 64 72 32 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  dr2);.  }.}../*.
3ca0: 2a 2a 20 41 64 64 20 63 6f 64 65 20 74 6f 20 69  ** Add code to i
3cb0: 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 4f 46 46  mplement the OFF
3cc0: 53 45 54 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  SET.*/.static vo
3cd0: 69 64 20 63 6f 64 65 4f 66 66 73 65 74 28 0a 20  id codeOffset(. 
3ce0: 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20 20 20   Vdbe *v,       
3cf0: 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63     /* Generate c
3d00: 6f 64 65 20 69 6e 74 6f 20 74 68 69 73 20 56 4d  ode into this VM
3d10: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
3d20: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53          /* The S
3d30: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
3d40: 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20  being coded */. 
3d50: 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 20 20   int iContinue  
3d60: 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
3d70: 74 6f 20 73 6b 69 70 20 74 68 65 20 63 75 72 72  to skip the curr
3d80: 65 6e 74 20 72 65 63 6f 72 64 20 2a 2f 0a 29 7b  ent record */.){
3d90: 0a 20 20 69 66 28 20 70 2d 3e 69 4f 66 66 73 65  .  if( p->iOffse
3da0: 74 20 26 26 20 69 43 6f 6e 74 69 6e 75 65 21 3d  t && iContinue!=
3db0: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 64 64  0 ){.    int add
3dc0: 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  r;.    sqlite3Vd
3dd0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41  beAddOp2(v, OP_A
3de0: 64 64 49 6d 6d 2c 20 70 2d 3e 69 4f 66 66 73 65  ddImm, p->iOffse
3df0: 74 2c 20 2d 31 29 3b 0a 20 20 20 20 61 64 64 72  t, -1);.    addr
3e00: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
3e10: 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e 65 67  dOp1(v, OP_IfNeg
3e20: 2c 20 70 2d 3e 69 4f 66 66 73 65 74 29 3b 0a 20  , p->iOffset);. 
3e30: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
3e40: 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
3e50: 20 30 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a   0, iContinue);.
3e60: 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
3e70: 28 76 2c 20 22 73 6b 69 70 20 4f 46 46 53 45 54  (v, "skip OFFSET
3e80: 20 72 65 63 6f 72 64 73 22 29 29 3b 0a 20 20 20   records"));.   
3e90: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
3ea0: 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20  Here(v, addr);. 
3eb0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20   }.}../*.** Add 
3ec0: 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 63  code that will c
3ed0: 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72  heck to make sur
3ee0: 65 20 74 68 65 20 4e 20 72 65 67 69 73 74 65 72  e the N register
3ef0: 73 20 73 74 61 72 74 69 6e 67 20 61 74 20 69 4d  s starting at iM
3f00: 65 6d 0a 2a 2a 20 66 6f 72 6d 20 61 20 64 69 73  em.** form a dis
3f10: 74 69 6e 63 74 20 65 6e 74 72 79 2e 20 20 69 54  tinct entry.  iT
3f20: 61 62 20 69 73 20 61 20 73 6f 72 74 69 6e 67 20  ab is a sorting 
3f30: 69 6e 64 65 78 20 74 68 61 74 20 68 6f 6c 64 73  index that holds
3f40: 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 73   previously.** s
3f50: 65 65 6e 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73  een combinations
3f60: 20 6f 66 20 74 68 65 20 4e 20 76 61 6c 75 65 73   of the N values
3f70: 2e 20 20 41 20 6e 65 77 20 65 6e 74 72 79 20 69  .  A new entry i
3f80: 73 20 6d 61 64 65 20 69 6e 20 69 54 61 62 0a 2a  s made in iTab.*
3f90: 2a 20 69 66 20 74 68 65 20 63 75 72 72 65 6e 74  * if the current
3fa0: 20 4e 20 76 61 6c 75 65 73 20 61 72 65 20 6e 65   N values are ne
3fb0: 77 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a 75 6d 70 20  w..**.** A jump 
3fc0: 74 6f 20 61 64 64 72 52 65 70 65 61 74 20 69 73  to addrRepeat is
3fd0: 20 6d 61 64 65 20 61 6e 64 20 74 68 65 20 4e 2b   made and the N+
3fe0: 31 20 76 61 6c 75 65 73 20 61 72 65 20 70 6f 70  1 values are pop
3ff0: 70 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20  ped from the.** 
4000: 73 74 61 63 6b 20 69 66 20 74 68 65 20 74 6f 70  stack if the top
4010: 20 4e 20 65 6c 65 6d 65 6e 74 73 20 61 72 65 20   N elements are 
4020: 6e 6f 74 20 64 69 73 74 69 6e 63 74 2e 0a 2a 2f  not distinct..*/
4030: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64  .static void cod
4040: 65 44 69 73 74 69 6e 63 74 28 0a 20 20 50 61 72  eDistinct(.  Par
4050: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
4060: 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63  /* Parsing and c
4070: 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63  ode generating c
4080: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20  ontext */.  int 
4090: 69 54 61 62 2c 20 20 20 20 20 20 20 20 20 20 2f  iTab,          /
40a0: 2a 20 41 20 73 6f 72 74 69 6e 67 20 69 6e 64 65  * A sorting inde
40b0: 78 20 75 73 65 64 20 74 6f 20 74 65 73 74 20 66  x used to test f
40c0: 6f 72 20 64 69 73 74 69 6e 63 74 6e 65 73 73 20  or distinctness 
40d0: 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 52 65 70  */.  int addrRep
40e0: 65 61 74 2c 20 20 20 20 2f 2a 20 4a 75 6d 70 20  eat,    /* Jump 
40f0: 74 6f 20 68 65 72 65 20 69 66 20 6e 6f 74 20 64  to here if not d
4100: 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20 69 6e 74  istinct */.  int
4110: 20 4e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   N,             
4120: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65  /* Number of ele
4130: 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69  ments */.  int i
4140: 4d 65 6d 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Mem           /*
4150: 20 46 69 72 73 74 20 65 6c 65 6d 65 6e 74 20 2a   First element *
4160: 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  /.){.  Vdbe *v;.
4170: 20 20 69 6e 74 20 72 31 3b 0a 0a 20 20 76 20 3d    int r1;..  v =
4180: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
4190: 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65    r1 = sqlite3Ge
41a0: 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
41b0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
41c0: 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46  ddOp4Int(v, OP_F
41d0: 6f 75 6e 64 2c 20 69 54 61 62 2c 20 61 64 64 72  ound, iTab, addr
41e0: 52 65 70 65 61 74 2c 20 69 4d 65 6d 2c 20 4e 29  Repeat, iMem, N)
41f0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
4200: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp3(v, OP_Make
4210: 52 65 63 6f 72 64 2c 20 69 4d 65 6d 2c 20 4e 2c  Record, iMem, N,
4220: 20 72 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56   r1);.  sqlite3V
4230: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
4240: 49 64 78 49 6e 73 65 72 74 2c 20 69 54 61 62 2c  IdxInsert, iTab,
4250: 20 72 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 52   r1);.  sqlite3R
4260: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
4270: 61 72 73 65 2c 20 72 31 29 3b 0a 7d 0a 0a 23 69  arse, r1);.}..#i
4280: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
4290: 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a  T_SUBQUERY./*.**
42a0: 20 47 65 6e 65 72 61 74 65 20 61 6e 20 65 72 72   Generate an err
42b0: 6f 72 20 6d 65 73 73 61 67 65 20 77 68 65 6e 20  or message when 
42c0: 61 20 53 45 4c 45 43 54 20 69 73 20 75 73 65 64  a SELECT is used
42d0: 20 77 69 74 68 69 6e 20 61 20 73 75 62 65 78 70   within a subexp
42e0: 72 65 73 73 69 6f 6e 0a 2a 2a 20 28 65 78 61 6d  ression.** (exam
42f0: 70 6c 65 3a 20 20 22 61 20 49 4e 20 28 53 45 4c  ple:  "a IN (SEL
4300: 45 43 54 20 2a 20 46 52 4f 4d 20 74 61 62 6c 65  ECT * FROM table
4310: 29 22 29 20 62 75 74 20 69 74 20 68 61 73 20 6d  )") but it has m
4320: 6f 72 65 20 74 68 61 6e 20 31 20 72 65 73 75 6c  ore than 1 resul
4330: 74 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e 20 20 57 65  t.** column.  We
4340: 20 64 6f 20 74 68 69 73 20 69 6e 20 61 20 73 75   do this in a su
4350: 62 72 6f 75 74 69 6e 65 20 62 65 63 61 75 73 65  broutine because
4360: 20 74 68 65 20 65 72 72 6f 72 20 75 73 65 64 20   the error used 
4370: 74 6f 20 6f 63 63 75 72 0a 2a 2a 20 69 6e 20 6d  to occur.** in m
4380: 75 6c 74 69 70 6c 65 20 70 6c 61 63 65 73 2e 20  ultiple places. 
4390: 20 28 54 68 65 20 65 72 72 6f 72 20 6f 6e 6c 79   (The error only
43a0: 20 6f 63 63 75 72 73 20 69 6e 20 6f 6e 65 20 70   occurs in one p
43b0: 6c 61 63 65 20 6e 6f 77 2c 20 62 75 74 20 77 65  lace now, but we
43c0: 0a 2a 2a 20 72 65 74 61 69 6e 20 74 68 65 20 73  .** retain the s
43d0: 75 62 72 6f 75 74 69 6e 65 20 74 6f 20 6d 69 6e  ubroutine to min
43e0: 69 6d 69 7a 65 20 63 6f 64 65 20 64 69 73 72 75  imize code disru
43f0: 70 74 69 6f 6e 2e 29 0a 2a 2f 0a 73 74 61 74 69  ption.).*/.stati
4400: 63 20 69 6e 74 20 63 68 65 63 6b 46 6f 72 4d 75  c int checkForMu
4410: 6c 74 69 43 6f 6c 75 6d 6e 53 65 6c 65 63 74 45  ltiColumnSelectE
4420: 72 72 6f 72 28 0a 20 20 50 61 72 73 65 20 2a 70  rror(.  Parse *p
4430: 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20  Parse,       /* 
4440: 50 61 72 73 65 20 63 6f 6e 74 65 78 74 2e 20 2a  Parse context. *
4450: 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a  /.  SelectDest *
4460: 70 44 65 73 74 2c 20 20 20 2f 2a 20 44 65 73 74  pDest,   /* Dest
4470: 69 6e 61 74 69 6f 6e 20 6f 66 20 53 45 4c 45 43  ination of SELEC
4480: 54 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69  T results */.  i
4490: 6e 74 20 6e 45 78 70 72 20 20 20 20 20 20 20 20  nt nExpr        
44a0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
44b0: 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20   result columns 
44c0: 72 65 74 75 72 6e 65 64 20 62 79 20 53 45 4c 45  returned by SELE
44d0: 43 54 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 65  CT */.){.  int e
44e0: 44 65 73 74 20 3d 20 70 44 65 73 74 2d 3e 65 44  Dest = pDest->eD
44f0: 65 73 74 3b 0a 20 20 69 66 28 20 6e 45 78 70 72  est;.  if( nExpr
4500: 3e 31 20 26 26 20 28 65 44 65 73 74 3d 3d 53 52  >1 && (eDest==SR
4510: 54 5f 4d 65 6d 20 7c 7c 20 65 44 65 73 74 3d 3d  T_Mem || eDest==
4520: 53 52 54 5f 53 65 74 29 20 29 7b 0a 20 20 20 20  SRT_Set) ){.    
4530: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
4540: 70 50 61 72 73 65 2c 20 22 6f 6e 6c 79 20 61 20  pParse, "only a 
4550: 73 69 6e 67 6c 65 20 72 65 73 75 6c 74 20 61 6c  single result al
4560: 6c 6f 77 65 64 20 66 6f 72 20 22 0a 20 20 20 20  lowed for ".    
4570: 20 20 20 22 61 20 53 45 4c 45 43 54 20 74 68 61     "a SELECT tha
4580: 74 20 69 73 20 70 61 72 74 20 6f 66 20 61 6e 20  t is part of an 
4590: 65 78 70 72 65 73 73 69 6f 6e 22 29 3b 0a 20 20  expression");.  
45a0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 65    return 1;.  }e
45b0: 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  lse{.    return 
45c0: 30 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a  0;.  }.}.#endif.
45d0: 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e  ./*.** An instan
45e0: 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ce of the follow
45f0: 69 6e 67 20 6f 62 6a 65 63 74 20 69 73 20 75 73  ing object is us
4600: 65 64 20 74 6f 20 72 65 63 6f 72 64 20 69 6e 66  ed to record inf
4610: 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 0a 2a  ormation about.*
4620: 2a 20 68 6f 77 20 74 6f 20 70 72 6f 63 65 73 73  * how to process
4630: 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65   the DISTINCT ke
4640: 79 77 6f 72 64 2c 20 74 6f 20 73 69 6d 70 6c 69  yword, to simpli
4650: 66 79 20 70 61 73 73 69 6e 67 20 74 68 61 74 20  fy passing that 
4660: 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 69  information.** i
4670: 6e 74 6f 20 74 68 65 20 73 65 6c 65 63 74 49 6e  nto the selectIn
4680: 6e 65 72 4c 6f 6f 70 28 29 20 72 6f 75 74 69 6e  nerLoop() routin
4690: 65 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  e..*/.typedef st
46a0: 72 75 63 74 20 44 69 73 74 69 6e 63 74 43 74 78  ruct DistinctCtx
46b0: 20 44 69 73 74 69 6e 63 74 43 74 78 3b 0a 73 74   DistinctCtx;.st
46c0: 72 75 63 74 20 44 69 73 74 69 6e 63 74 43 74 78  ruct DistinctCtx
46d0: 20 7b 0a 20 20 75 38 20 69 73 54 6e 63 74 3b 20   {.  u8 isTnct; 
46e0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
46f0: 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79  the DISTINCT key
4700: 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74 20  word is present 
4710: 2a 2f 0a 20 20 75 38 20 65 54 6e 63 74 54 79 70  */.  u8 eTnctTyp
4720: 65 3b 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74  e;   /* One of t
4730: 68 65 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43  he WHERE_DISTINC
4740: 54 5f 2a 20 6f 70 65 72 61 74 6f 72 73 20 2a 2f  T_* operators */
4750: 0a 20 20 69 6e 74 20 74 61 62 54 6e 63 74 3b 20  .  int tabTnct; 
4760: 20 20 20 2f 2a 20 45 70 68 65 6d 65 72 61 6c 20     /* Ephemeral 
4770: 74 61 62 6c 65 20 75 73 65 64 20 66 6f 72 20 44  table used for D
4780: 49 53 54 49 4e 43 54 20 70 72 6f 63 65 73 73 69  ISTINCT processi
4790: 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ng */.  int addr
47a0: 54 6e 63 74 3b 20 20 20 2f 2a 20 41 64 64 72 65  Tnct;   /* Addre
47b0: 73 73 20 6f 66 20 4f 50 5f 4f 70 65 6e 45 70 68  ss of OP_OpenEph
47c0: 65 6d 65 72 61 6c 20 6f 70 63 6f 64 65 20 66 6f  emeral opcode fo
47d0: 72 20 74 61 62 54 6e 63 74 20 2a 2f 0a 7d 3b 0a  r tabTnct */.};.
47e0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
47f0: 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 74 68  ine generates th
4800: 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 69  e code for the i
4810: 6e 73 69 64 65 20 6f 66 20 74 68 65 20 69 6e 6e  nside of the inn
4820: 65 72 20 6c 6f 6f 70 0a 2a 2a 20 6f 66 20 61 20  er loop.** of a 
4830: 53 45 4c 45 43 54 2e 0a 2a 2a 0a 2a 2a 20 49 66  SELECT..**.** If
4840: 20 73 72 63 54 61 62 20 61 6e 64 20 6e 43 6f 6c   srcTab and nCol
4850: 75 6d 6e 20 61 72 65 20 62 6f 74 68 20 7a 65 72  umn are both zer
4860: 6f 2c 20 74 68 65 6e 20 74 68 65 20 70 45 4c 69  o, then the pELi
4870: 73 74 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a  st expressions.*
4880: 2a 20 61 72 65 20 65 76 61 6c 75 61 74 65 64 20  * are evaluated 
4890: 69 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 74 20  in order to get 
48a0: 74 68 65 20 64 61 74 61 20 66 6f 72 20 74 68 69  the data for thi
48b0: 73 20 72 6f 77 2e 20 20 49 66 20 6e 43 6f 6c 75  s row.  If nColu
48c0: 6d 6e 3e 30 0a 2a 2a 20 74 68 65 6e 20 64 61 74  mn>0.** then dat
48d0: 61 20 69 73 20 70 75 6c 6c 65 64 20 66 72 6f 6d  a is pulled from
48e0: 20 73 72 63 54 61 62 20 61 6e 64 20 70 45 4c 69   srcTab and pELi
48f0: 73 74 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20  st is used only 
4900: 74 6f 20 67 65 74 20 74 68 65 0a 2a 2a 20 64 61  to get the.** da
4910: 74 61 74 79 70 65 73 20 66 6f 72 20 65 61 63 68  tatypes for each
4920: 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 73 74 61 74   column..*/.stat
4930: 69 63 20 76 6f 69 64 20 73 65 6c 65 63 74 49 6e  ic void selectIn
4940: 6e 65 72 4c 6f 6f 70 28 0a 20 20 50 61 72 73 65  nerLoop(.  Parse
4950: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
4960: 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72     /* The parser
4970: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
4980: 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
4990: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d        /* The com
49a0: 70 6c 65 74 65 20 73 65 6c 65 63 74 20 73 74 61  plete select sta
49b0: 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64  tement being cod
49c0: 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  ed */.  ExprList
49d0: 20 2a 70 45 4c 69 73 74 2c 20 20 20 20 20 20 20   *pEList,       
49e0: 2f 2a 20 4c 69 73 74 20 6f 66 20 76 61 6c 75 65  /* List of value
49f0: 73 20 62 65 69 6e 67 20 65 78 74 72 61 63 74 65  s being extracte
4a00: 64 20 2a 2f 0a 20 20 69 6e 74 20 73 72 63 54 61  d */.  int srcTa
4a10: 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  b,             /
4a20: 2a 20 50 75 6c 6c 20 64 61 74 61 20 66 72 6f 6d  * Pull data from
4a30: 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20   this table */. 
4a40: 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e 2c 20 20 20   int nColumn,   
4a50: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
4a60: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
4a70: 20 74 68 65 20 73 6f 75 72 63 65 20 74 61 62 6c   the source tabl
4a80: 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  e */.  ExprList 
4a90: 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20 20 2f  *pOrderBy,     /
4aa0: 2a 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 73  * If not NULL, s
4ab0: 6f 72 74 20 72 65 73 75 6c 74 73 20 75 73 69 6e  ort results usin
4ac0: 67 20 74 68 69 73 20 6b 65 79 20 2a 2f 0a 20 20  g this key */.  
4ad0: 44 69 73 74 69 6e 63 74 43 74 78 20 2a 70 44 69  DistinctCtx *pDi
4ae0: 73 74 69 6e 63 74 2c 20 2f 2a 20 49 66 20 6e 6f  stinct, /* If no
4af0: 74 20 4e 55 4c 4c 2c 20 69 6e 66 6f 20 6f 6e 20  t NULL, info on 
4b00: 68 6f 77 20 74 6f 20 70 72 6f 63 65 73 73 20 44  how to process D
4b10: 49 53 54 49 4e 43 54 20 2a 2f 0a 20 20 53 65 6c  ISTINCT */.  Sel
4b20: 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 2c 20  ectDest *pDest, 
4b30: 20 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20 64       /* How to d
4b40: 69 73 70 6f 73 65 20 6f 66 20 74 68 65 20 72 65  ispose of the re
4b50: 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69  sults */.  int i
4b60: 43 6f 6e 74 69 6e 75 65 2c 20 20 20 20 20 20 20  Continue,       
4b70: 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
4b80: 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68  to continue with
4b90: 20 6e 65 78 74 20 72 6f 77 20 2a 2f 0a 20 20 69   next row */.  i
4ba0: 6e 74 20 69 42 72 65 61 6b 20 20 20 20 20 20 20  nt iBreak       
4bb0: 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68         /* Jump h
4bc0: 65 72 65 20 74 6f 20 62 72 65 61 6b 20 6f 75 74  ere to break out
4bd0: 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f   of the inner lo
4be0: 6f 70 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20  op */.){.  Vdbe 
4bf0: 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
4c00: 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  be;.  int i;.  i
4c10: 6e 74 20 68 61 73 44 69 73 74 69 6e 63 74 3b 20  nt hasDistinct; 
4c20: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
4c30: 66 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b  f the DISTINCT k
4c40: 65 79 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e  eyword is presen
4c50: 74 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65  t */.  int regRe
4c60: 73 75 6c 74 3b 20 20 20 20 20 20 20 20 20 20 20  sult;           
4c70: 20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 6d     /* Start of m
4c80: 65 6d 6f 72 79 20 68 6f 6c 64 69 6e 67 20 72 65  emory holding re
4c90: 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 69 6e  sult set */.  in
4ca0: 74 20 65 44 65 73 74 20 3d 20 70 44 65 73 74 2d  t eDest = pDest-
4cb0: 3e 65 44 65 73 74 3b 20 20 20 2f 2a 20 48 6f 77  >eDest;   /* How
4cc0: 20 74 6f 20 64 69 73 70 6f 73 65 20 6f 66 20 72   to dispose of r
4cd0: 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20  esults */.  int 
4ce0: 69 50 61 72 6d 20 3d 20 70 44 65 73 74 2d 3e 69  iParm = pDest->i
4cf0: 53 44 50 61 72 6d 3b 20 2f 2a 20 46 69 72 73 74  SDParm; /* First
4d00: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 64 69 73   argument to dis
4d10: 70 6f 73 61 6c 20 6d 65 74 68 6f 64 20 2a 2f 0a  posal method */.
4d20: 20 20 69 6e 74 20 6e 52 65 73 75 6c 74 43 6f 6c    int nResultCol
4d30: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
4d40: 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c   Number of resul
4d50: 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 0a 20 20  t columns */..  
4d60: 61 73 73 65 72 74 28 20 76 20 29 3b 0a 20 20 69  assert( v );.  i
4d70: 66 28 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 29  f( NEVER(v==0) )
4d80: 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72   return;.  asser
4d90: 74 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a  t( pEList!=0 );.
4da0: 20 20 68 61 73 44 69 73 74 69 6e 63 74 20 3d 20    hasDistinct = 
4db0: 70 44 69 73 74 69 6e 63 74 20 3f 20 70 44 69 73  pDistinct ? pDis
4dc0: 74 69 6e 63 74 2d 3e 65 54 6e 63 74 54 79 70 65  tinct->eTnctType
4dd0: 20 3a 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43   : WHERE_DISTINC
4de0: 54 5f 4e 4f 4f 50 3b 0a 20 20 69 66 28 20 70 4f  T_NOOP;.  if( pO
4df0: 72 64 65 72 42 79 3d 3d 30 20 26 26 20 21 68 61  rderBy==0 && !ha
4e00: 73 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20  sDistinct ){.   
4e10: 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70   codeOffset(v, p
4e20: 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20  , iContinue);.  
4e30: 7d 0a 0a 20 20 2f 2a 20 50 75 6c 6c 20 74 68 65  }..  /* Pull the
4e40: 20 72 65 71 75 65 73 74 65 64 20 63 6f 6c 75 6d   requested colum
4e50: 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e  ns..  */.  if( n
4e60: 43 6f 6c 75 6d 6e 3e 30 20 29 7b 0a 20 20 20 20  Column>0 ){.    
4e70: 6e 52 65 73 75 6c 74 43 6f 6c 20 3d 20 6e 43 6f  nResultCol = nCo
4e80: 6c 75 6d 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  lumn;.  }else{. 
4e90: 20 20 20 6e 52 65 73 75 6c 74 43 6f 6c 20 3d 20     nResultCol = 
4ea0: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20  pEList->nExpr;. 
4eb0: 20 7d 0a 20 20 69 66 28 20 70 44 65 73 74 2d 3e   }.  if( pDest->
4ec0: 69 53 64 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  iSdst==0 ){.    
4ed0: 70 44 65 73 74 2d 3e 69 53 64 73 74 20 3d 20 70  pDest->iSdst = p
4ee0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20  Parse->nMem+1;. 
4ef0: 20 20 20 70 44 65 73 74 2d 3e 6e 53 64 73 74 20     pDest->nSdst 
4f00: 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20  = nResultCol;.  
4f10: 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
4f20: 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20  = nResultCol;.  
4f30: 7d 65 6c 73 65 7b 20 0a 20 20 20 20 61 73 73 65  }else{ .    asse
4f40: 72 74 28 20 70 44 65 73 74 2d 3e 6e 53 64 73 74  rt( pDest->nSdst
4f50: 3d 3d 6e 52 65 73 75 6c 74 43 6f 6c 20 29 3b 0a  ==nResultCol );.
4f60: 20 20 7d 0a 20 20 72 65 67 52 65 73 75 6c 74 20    }.  regResult 
4f70: 3d 20 70 44 65 73 74 2d 3e 69 53 64 73 74 3b 0a  = pDest->iSdst;.
4f80: 20 20 69 66 28 20 6e 43 6f 6c 75 6d 6e 3e 30 20    if( nColumn>0 
4f90: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
4fa0: 69 3c 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b  i<nColumn; i++){
4fb0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
4fc0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
4fd0: 6f 6c 75 6d 6e 2c 20 73 72 63 54 61 62 2c 20 69  olumn, srcTab, i
4fe0: 2c 20 72 65 67 52 65 73 75 6c 74 2b 69 29 3b 0a  , regResult+i);.
4ff0: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
5000: 28 20 65 44 65 73 74 21 3d 53 52 54 5f 45 78 69  ( eDest!=SRT_Exi
5010: 73 74 73 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  sts ){.    /* If
5020: 20 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e   the destination
5030: 20 69 73 20 61 6e 20 45 58 49 53 54 53 28 2e 2e   is an EXISTS(..
5040: 2e 29 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74  .) expression, t
5050: 68 65 20 61 63 74 75 61 6c 0a 20 20 20 20 2a 2a  he actual.    **
5060: 20 76 61 6c 75 65 73 20 72 65 74 75 72 6e 65 64   values returned
5070: 20 62 79 20 74 68 65 20 53 45 4c 45 43 54 20 61   by the SELECT a
5080: 72 65 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e  re not required.
5090: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
50a0: 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61  te3ExprCacheClea
50b0: 72 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 73  r(pParse);.    s
50c0: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78  qlite3ExprCodeEx
50d0: 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
50e0: 45 4c 69 73 74 2c 20 72 65 67 52 65 73 75 6c 74  EList, regResult
50f0: 2c 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74  , eDest==SRT_Out
5100: 70 75 74 29 3b 0a 20 20 7d 0a 20 20 6e 43 6f 6c  put);.  }.  nCol
5110: 75 6d 6e 20 3d 20 6e 52 65 73 75 6c 74 43 6f 6c  umn = nResultCol
5120: 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 44  ;..  /* If the D
5130: 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20  ISTINCT keyword 
5140: 77 61 73 20 70 72 65 73 65 6e 74 20 6f 6e 20 74  was present on t
5150: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
5160: 65 6e 74 0a 20 20 2a 2a 20 61 6e 64 20 74 68 69  ent.  ** and thi
5170: 73 20 72 6f 77 20 68 61 73 20 62 65 65 6e 20 73  s row has been s
5180: 65 65 6e 20 62 65 66 6f 72 65 2c 20 74 68 65 6e  een before, then
5190: 20 64 6f 20 6e 6f 74 20 6d 61 6b 65 20 74 68 69   do not make thi
51a0: 73 20 72 6f 77 0a 20 20 2a 2a 20 70 61 72 74 20  s row.  ** part 
51b0: 6f 66 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 20  of the result.. 
51c0: 20 2a 2f 0a 20 20 69 66 28 20 68 61 73 44 69 73   */.  if( hasDis
51d0: 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 61 73 73  tinct ){.    ass
51e0: 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20 29  ert( pEList!=0 )
51f0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45  ;.    assert( pE
5200: 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 6e 43 6f  List->nExpr==nCo
5210: 6c 75 6d 6e 20 29 3b 0a 20 20 20 20 73 77 69 74  lumn );.    swit
5220: 63 68 28 20 70 44 69 73 74 69 6e 63 74 2d 3e 65  ch( pDistinct->e
5230: 54 6e 63 74 54 79 70 65 20 29 7b 0a 20 20 20 20  TnctType ){.    
5240: 20 20 63 61 73 65 20 57 48 45 52 45 5f 44 49 53    case WHERE_DIS
5250: 54 49 4e 43 54 5f 4f 52 44 45 52 45 44 3a 20 7b  TINCT_ORDERED: {
5260: 0a 20 20 20 20 20 20 20 20 56 64 62 65 4f 70 20  .        VdbeOp 
5270: 2a 70 4f 70 3b 20 20 20 20 20 20 20 20 20 20 20  *pOp;           
5280: 20 2f 2a 20 4e 6f 20 6c 6f 6e 67 65 72 20 72 65   /* No longer re
5290: 71 75 69 72 65 64 20 4f 70 65 6e 45 70 68 65 6d  quired OpenEphem
52a0: 65 72 61 6c 20 69 6e 73 74 72 2e 20 2a 2f 0a 20  eral instr. */. 
52b0: 20 20 20 20 20 20 20 69 6e 74 20 69 4a 75 6d 70         int iJump
52c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
52d0: 2a 20 4a 75 6d 70 20 64 65 73 74 69 6e 61 74 69  * Jump destinati
52e0: 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  on */.        in
52f0: 74 20 72 65 67 50 72 65 76 3b 20 20 20 20 20 20  t regPrev;      
5300: 20 20 20 20 20 20 2f 2a 20 50 72 65 76 69 6f 75        /* Previou
5310: 73 20 72 6f 77 20 63 6f 6e 74 65 6e 74 20 2a 2f  s row content */
5320: 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c  ..        /* All
5330: 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20  ocate space for 
5340: 74 68 65 20 70 72 65 76 69 6f 75 73 20 72 6f 77  the previous row
5350: 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 67 50   */.        regP
5360: 72 65 76 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  rev = pParse->nM
5370: 65 6d 2b 31 3b 0a 20 20 20 20 20 20 20 20 70 50  em+1;.        pP
5380: 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 43  arse->nMem += nC
5390: 6f 6c 75 6d 6e 3b 0a 0a 20 20 20 20 20 20 20 20  olumn;..        
53a0: 2f 2a 20 43 68 61 6e 67 65 20 74 68 65 20 4f 50  /* Change the OP
53b0: 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 63  _OpenEphemeral c
53c0: 6f 64 65 64 20 65 61 72 6c 69 65 72 20 74 6f 20  oded earlier to 
53d0: 61 6e 20 4f 50 5f 4e 75 6c 6c 0a 20 20 20 20 20  an OP_Null.     
53e0: 20 20 20 2a 2a 20 73 65 74 73 20 74 68 65 20 4d     ** sets the M
53f0: 45 4d 5f 43 6c 65 61 72 65 64 20 62 69 74 20 6f  EM_Cleared bit o
5400: 6e 20 74 68 65 20 66 69 72 73 74 20 72 65 67 69  n the first regi
5410: 73 74 65 72 20 6f 66 20 74 68 65 0a 20 20 20 20  ster of the.    
5420: 20 20 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 20      ** previous 
5430: 76 61 6c 75 65 2e 20 20 54 68 69 73 20 77 69 6c  value.  This wil
5440: 6c 20 63 61 75 73 65 20 74 68 65 20 4f 50 5f 4e  l cause the OP_N
5450: 65 20 62 65 6c 6f 77 20 74 6f 20 61 6c 77 61 79  e below to alway
5460: 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 61 69  s.        ** fai
5470: 6c 20 6f 6e 20 74 68 65 20 66 69 72 73 74 20 69  l on the first i
5480: 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  teration of the 
5490: 6c 6f 6f 70 20 65 76 65 6e 20 69 66 20 74 68 65  loop even if the
54a0: 20 66 69 72 73 74 0a 20 20 20 20 20 20 20 20 2a   first.        *
54b0: 2a 20 72 6f 77 20 69 73 20 61 6c 6c 20 4e 55 4c  * row is all NUL
54c0: 4c 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  Ls..        */. 
54d0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
54e0: 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76  beChangeToNoop(v
54f0: 2c 20 70 44 69 73 74 69 6e 63 74 2d 3e 61 64 64  , pDistinct->add
5500: 72 54 6e 63 74 29 3b 0a 20 20 20 20 20 20 20 20  rTnct);.        
5510: 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  pOp = sqlite3Vdb
5520: 65 47 65 74 4f 70 28 76 2c 20 70 44 69 73 74 69  eGetOp(v, pDisti
5530: 6e 63 74 2d 3e 61 64 64 72 54 6e 63 74 29 3b 0a  nct->addrTnct);.
5540: 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63          pOp->opc
5550: 6f 64 65 20 3d 20 4f 50 5f 4e 75 6c 6c 3b 0a 20  ode = OP_Null;. 
5560: 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d         pOp->p1 =
5570: 20 31 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d   1;.        pOp-
5580: 3e 70 32 20 3d 20 72 65 67 50 72 65 76 3b 0a 0a  >p2 = regPrev;..
5590: 20 20 20 20 20 20 20 20 69 4a 75 6d 70 20 3d 20          iJump = 
55a0: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
55b0: 6e 74 41 64 64 72 28 76 29 20 2b 20 6e 43 6f 6c  ntAddr(v) + nCol
55c0: 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  umn;.        for
55d0: 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 75 6d 6e 3b  (i=0; i<nColumn;
55e0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
55f0: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20   CollSeq *pColl 
5600: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
5610: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 45 4c  lSeq(pParse, pEL
5620: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  ist->a[i].pExpr)
5630: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
5640: 69 3c 6e 43 6f 6c 75 6d 6e 2d 31 20 29 7b 0a 20  i<nColumn-1 ){. 
5650: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
5660: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
5670: 4f 50 5f 4e 65 2c 20 72 65 67 52 65 73 75 6c 74  OP_Ne, regResult
5680: 2b 69 2c 20 69 4a 75 6d 70 2c 20 72 65 67 50 72  +i, iJump, regPr
5690: 65 76 2b 69 29 3b 0a 20 20 20 20 20 20 20 20 20  ev+i);.         
56a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
56b0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
56c0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 45 71 2c 20  ddOp3(v, OP_Eq, 
56d0: 72 65 67 52 65 73 75 6c 74 2b 69 2c 20 69 43 6f  regResult+i, iCo
56e0: 6e 74 69 6e 75 65 2c 20 72 65 67 50 72 65 76 2b  ntinue, regPrev+
56f0: 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  i);.          }.
5700: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
5710: 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c  3VdbeChangeP4(v,
5720: 20 2d 31 2c 20 28 63 6f 6e 73 74 20 63 68 61 72   -1, (const char
5730: 20 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c   *)pColl, P4_COL
5740: 4c 53 45 51 29 3b 0a 20 20 20 20 20 20 20 20 20  LSEQ);.         
5750: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
5760: 67 65 50 35 28 76 2c 20 53 51 4c 49 54 45 5f 4e  geP5(v, SQLITE_N
5770: 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 20 20  ULLEQ);.        
5780: 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  }.        assert
5790: 28 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  ( sqlite3VdbeCur
57a0: 72 65 6e 74 41 64 64 72 28 76 29 3d 3d 69 4a 75  rentAddr(v)==iJu
57b0: 6d 70 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  mp );.        sq
57c0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
57d0: 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 65 67 52  v, OP_Copy, regR
57e0: 65 73 75 6c 74 2c 20 72 65 67 50 72 65 76 2c 20  esult, regPrev, 
57f0: 6e 43 6f 6c 75 6d 6e 2d 31 29 3b 0a 20 20 20 20  nColumn-1);.    
5800: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
5810: 20 7d 0a 0a 20 20 20 20 20 20 63 61 73 65 20 57   }..      case W
5820: 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e  HERE_DISTINCT_UN
5830: 49 51 55 45 3a 20 7b 0a 20 20 20 20 20 20 20 20  IQUE: {.        
5840: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
5850: 65 54 6f 4e 6f 6f 70 28 76 2c 20 70 44 69 73 74  eToNoop(v, pDist
5860: 69 6e 63 74 2d 3e 61 64 64 72 54 6e 63 74 29 3b  inct->addrTnct);
5870: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
5880: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 64        }..      d
5890: 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
58a0: 20 20 61 73 73 65 72 74 28 20 70 44 69 73 74 69    assert( pDisti
58b0: 6e 63 74 2d 3e 65 54 6e 63 74 54 79 70 65 3d 3d  nct->eTnctType==
58c0: 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55  WHERE_DISTINCT_U
58d0: 4e 4f 52 44 45 52 45 44 20 29 3b 0a 20 20 20 20  NORDERED );.    
58e0: 20 20 20 20 63 6f 64 65 44 69 73 74 69 6e 63 74      codeDistinct
58f0: 28 70 50 61 72 73 65 2c 20 70 44 69 73 74 69 6e  (pParse, pDistin
5900: 63 74 2d 3e 74 61 62 54 6e 63 74 2c 20 69 43 6f  ct->tabTnct, iCo
5910: 6e 74 69 6e 75 65 2c 20 6e 43 6f 6c 75 6d 6e 2c  ntinue, nColumn,
5920: 20 72 65 67 52 65 73 75 6c 74 29 3b 0a 20 20 20   regResult);.   
5930: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
5940: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
5950: 28 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b  ( pOrderBy==0 ){
5960: 0a 20 20 20 20 20 20 63 6f 64 65 4f 66 66 73 65  .      codeOffse
5970: 74 28 76 2c 20 70 2c 20 69 43 6f 6e 74 69 6e 75  t(v, p, iContinu
5980: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  e);.    }.  }.. 
5990: 20 73 77 69 74 63 68 28 20 65 44 65 73 74 20 29   switch( eDest )
59a0: 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73  {.    /* In this
59b0: 20 6d 6f 64 65 2c 20 77 72 69 74 65 20 65 61 63   mode, write eac
59c0: 68 20 71 75 65 72 79 20 72 65 73 75 6c 74 20 74  h query result t
59d0: 6f 20 74 68 65 20 6b 65 79 20 6f 66 20 74 68 65  o the key of the
59e0: 20 74 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 2a   temporary.    *
59f0: 2a 20 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a 20  * table iParm.. 
5a00: 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51     */.#ifndef SQ
5a10: 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
5a20: 4e 44 5f 53 45 4c 45 43 54 0a 20 20 20 20 63 61  ND_SELECT.    ca
5a30: 73 65 20 53 52 54 5f 55 6e 69 6f 6e 3a 20 7b 0a  se SRT_Union: {.
5a40: 20 20 20 20 20 20 69 6e 74 20 72 31 3b 0a 20 20        int r1;.  
5a50: 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
5a60: 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
5a70: 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
5a80: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
5a90: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65  P_MakeRecord, re
5aa0: 67 52 65 73 75 6c 74 2c 20 6e 43 6f 6c 75 6d 6e  gResult, nColumn
5ab0: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  , r1);.      sql
5ac0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
5ad0: 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20  , OP_IdxInsert, 
5ae0: 69 50 61 72 6d 2c 20 72 31 29 3b 0a 20 20 20 20  iParm, r1);.    
5af0: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
5b00: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
5b10: 72 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  r1);.      break
5b20: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
5b30: 43 6f 6e 73 74 72 75 63 74 20 61 20 72 65 63 6f  Construct a reco
5b40: 72 64 20 66 72 6f 6d 20 74 68 65 20 71 75 65 72  rd from the quer
5b50: 79 20 72 65 73 75 6c 74 2c 20 62 75 74 20 69 6e  y result, but in
5b60: 73 74 65 61 64 20 6f 66 0a 20 20 20 20 2a 2a 20  stead of.    ** 
5b70: 73 61 76 69 6e 67 20 74 68 61 74 20 72 65 63 6f  saving that reco
5b80: 72 64 2c 20 75 73 65 20 69 74 20 61 73 20 61 20  rd, use it as a 
5b90: 6b 65 79 20 74 6f 20 64 65 6c 65 74 65 20 65 6c  key to delete el
5ba0: 65 6d 65 6e 74 73 20 66 72 6f 6d 0a 20 20 20 20  ements from.    
5bb0: 2a 2a 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  ** the temporary
5bc0: 20 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a 20 20   table iParm..  
5bd0: 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52    */.    case SR
5be0: 54 5f 45 78 63 65 70 74 3a 20 7b 0a 20 20 20 20  T_Except: {.    
5bf0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
5c00: 4f 70 33 28 76 2c 20 4f 50 5f 49 64 78 44 65 6c  Op3(v, OP_IdxDel
5c10: 65 74 65 2c 20 69 50 61 72 6d 2c 20 72 65 67 52  ete, iParm, regR
5c20: 65 73 75 6c 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b  esult, nColumn);
5c30: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
5c40: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
5c50: 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 72 65 73  /* Store the res
5c60: 75 6c 74 20 61 73 20 64 61 74 61 20 75 73 69 6e  ult as data usin
5c70: 67 20 61 20 75 6e 69 71 75 65 20 6b 65 79 2e 0a  g a unique key..
5c80: 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
5c90: 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20 20 63  SRT_Table:.    c
5ca0: 61 73 65 20 53 52 54 5f 45 70 68 65 6d 54 61 62  ase SRT_EphemTab
5cb0: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31  : {.      int r1
5cc0: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
5cd0: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
5ce0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44      testcase( eD
5cf0: 65 73 74 3d 3d 53 52 54 5f 54 61 62 6c 65 20 29  est==SRT_Table )
5d00: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
5d10: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 45 70 68  ( eDest==SRT_Eph
5d20: 65 6d 54 61 62 20 29 3b 0a 20 20 20 20 20 20 73  emTab );.      s
5d30: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
5d40: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
5d50: 64 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 43  d, regResult, nC
5d60: 6f 6c 75 6d 6e 2c 20 72 31 29 3b 0a 20 20 20 20  olumn, r1);.    
5d70: 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29    if( pOrderBy )
5d80: 7b 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e  {.        pushOn
5d90: 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c  toSorter(pParse,
5da0: 20 70 4f 72 64 65 72 42 79 2c 20 70 2c 20 72 31   pOrderBy, p, r1
5db0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
5dc0: 20 20 20 20 20 20 20 20 69 6e 74 20 72 32 20 3d          int r2 =
5dd0: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
5de0: 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
5df0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
5e00: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52  ddOp2(v, OP_NewR
5e10: 6f 77 69 64 2c 20 69 50 61 72 6d 2c 20 72 32 29  owid, iParm, r2)
5e20: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
5e30: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
5e40: 50 5f 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c  P_Insert, iParm,
5e50: 20 72 31 2c 20 72 32 29 3b 0a 20 20 20 20 20 20   r1, r2);.      
5e60: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
5e70: 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f  ngeP5(v, OPFLAG_
5e80: 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 20 20 20  APPEND);.       
5e90: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
5ea0: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
5eb0: 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  2);.      }.    
5ec0: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
5ed0: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
5ee0: 72 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  r1);.      break
5ef0: 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66  ;.    }..#ifndef
5f00: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
5f10: 51 55 45 52 59 0a 20 20 20 20 2f 2a 20 49 66 20  QUERY.    /* If 
5f20: 77 65 20 61 72 65 20 63 72 65 61 74 69 6e 67 20  we are creating 
5f30: 61 20 73 65 74 20 66 6f 72 20 61 6e 20 22 65 78  a set for an "ex
5f40: 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e  pr IN (SELECT ..
5f50: 2e 29 22 20 63 6f 6e 73 74 72 75 63 74 2c 0a 20  .)" construct,. 
5f60: 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65     ** then there
5f70: 20 73 68 6f 75 6c 64 20 62 65 20 61 20 73 69 6e   should be a sin
5f80: 67 6c 65 20 69 74 65 6d 20 6f 6e 20 74 68 65 20  gle item on the 
5f90: 73 74 61 63 6b 2e 20 20 57 72 69 74 65 20 74 68  stack.  Write th
5fa0: 69 73 0a 20 20 20 20 2a 2a 20 69 74 65 6d 20 69  is.    ** item i
5fb0: 6e 74 6f 20 74 68 65 20 73 65 74 20 74 61 62 6c  nto the set tabl
5fc0: 65 20 77 69 74 68 20 62 6f 67 75 73 20 64 61 74  e with bogus dat
5fd0: 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  a..    */.    ca
5fe0: 73 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20  se SRT_Set: {.  
5ff0: 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c      assert( nCol
6000: 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  umn==1 );.      
6010: 70 44 65 73 74 2d 3e 61 66 66 53 64 73 74 20 3d  pDest->affSdst =
6020: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
6030: 20 20 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72     sqlite3Compar
6040: 65 41 66 66 69 6e 69 74 79 28 70 45 4c 69 73 74  eAffinity(pEList
6050: 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20 70 44  ->a[0].pExpr, pD
6060: 65 73 74 2d 3e 61 66 66 53 64 73 74 29 3b 0a 20  est->affSdst);. 
6070: 20 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42       if( pOrderB
6080: 79 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  y ){.        /* 
6090: 41 74 20 66 69 72 73 74 20 67 6c 61 6e 63 65 20  At first glance 
60a0: 79 6f 75 20 77 6f 75 6c 64 20 74 68 69 6e 6b 20  you would think 
60b0: 77 65 20 63 6f 75 6c 64 20 6f 70 74 69 6d 69 7a  we could optimiz
60c0: 65 20 6f 75 74 20 74 68 65 0a 20 20 20 20 20 20  e out the.      
60d0: 20 20 2a 2a 20 4f 52 44 45 52 20 42 59 20 69 6e    ** ORDER BY in
60e0: 20 74 68 69 73 20 63 61 73 65 20 73 69 6e 63 65   this case since
60f0: 20 74 68 65 20 6f 72 64 65 72 20 6f 66 20 65 6e   the order of en
6100: 74 72 69 65 73 20 69 6e 20 74 68 65 20 73 65 74  tries in the set
6110: 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 6f 65 73  .        ** does
6120: 20 6e 6f 74 20 6d 61 74 74 65 72 2e 20 20 42 75   not matter.  Bu
6130: 74 20 74 68 65 72 65 20 6d 69 67 68 74 20 62 65  t there might be
6140: 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 2c   a LIMIT clause,
6150: 20 69 6e 20 77 68 69 63 68 0a 20 20 20 20 20 20   in which.      
6160: 20 20 2a 2a 20 63 61 73 65 20 74 68 65 20 6f 72    ** case the or
6170: 64 65 72 20 64 6f 65 73 20 6d 61 74 74 65 72 20  der does matter 
6180: 2a 2f 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f  */.        pushO
6190: 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65  ntoSorter(pParse
61a0: 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 2c 20 72  , pOrderBy, p, r
61b0: 65 67 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 20  egResult);.     
61c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
61d0: 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33  int r1 = sqlite3
61e0: 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
61f0: 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  e);.        sqli
6200: 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
6210: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
6220: 72 65 67 52 65 73 75 6c 74 2c 31 2c 72 31 2c 20  regResult,1,r1, 
6230: 26 70 44 65 73 74 2d 3e 61 66 66 53 64 73 74 2c  &pDest->affSdst,
6240: 20 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   1);.        sql
6250: 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66  ite3ExprCacheAff
6260: 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72  inityChange(pPar
6270: 73 65 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 31  se, regResult, 1
6280: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
6290: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
62a0: 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50  OP_IdxInsert, iP
62b0: 61 72 6d 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  arm, r1);.      
62c0: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
62d0: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
62e0: 72 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  r1);.      }.   
62f0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
6300: 0a 20 20 20 20 2f 2a 20 49 66 20 61 6e 79 20 72  .    /* If any r
6310: 6f 77 20 65 78 69 73 74 20 69 6e 20 74 68 65 20  ow exist in the 
6320: 72 65 73 75 6c 74 20 73 65 74 2c 20 72 65 63 6f  result set, reco
6330: 72 64 20 74 68 61 74 20 66 61 63 74 20 61 6e 64  rd that fact and
6340: 20 61 62 6f 72 74 2e 0a 20 20 20 20 2a 2f 0a 20   abort..    */. 
6350: 20 20 20 63 61 73 65 20 53 52 54 5f 45 78 69 73     case SRT_Exis
6360: 74 73 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  ts: {.      sqli
6370: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
6380: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20   OP_Integer, 1, 
6390: 69 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 2f 2a  iParm);.      /*
63a0: 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73   The LIMIT claus
63b0: 65 20 77 69 6c 6c 20 74 65 72 6d 69 6e 61 74 65  e will terminate
63c0: 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73   the loop for us
63d0: 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   */.      break;
63e0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
63f0: 66 20 74 68 69 73 20 69 73 20 61 20 73 63 61 6c  f this is a scal
6400: 61 72 20 73 65 6c 65 63 74 20 74 68 61 74 20 69  ar select that i
6410: 73 20 70 61 72 74 20 6f 66 20 61 6e 20 65 78 70  s part of an exp
6420: 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e 0a 20 20  ression, then.  
6430: 20 20 2a 2a 20 73 74 6f 72 65 20 74 68 65 20 72    ** store the r
6440: 65 73 75 6c 74 73 20 69 6e 20 74 68 65 20 61 70  esults in the ap
6450: 70 72 6f 70 72 69 61 74 65 20 6d 65 6d 6f 72 79  propriate memory
6460: 20 63 65 6c 6c 20 61 6e 64 20 62 72 65 61 6b 20   cell and break 
6470: 6f 75 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68  out.    ** of th
6480: 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20  e scan loop..   
6490: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
64a0: 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73  _Mem: {.      as
64b0: 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31  sert( nColumn==1
64c0: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f   );.      if( pO
64d0: 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
64e0: 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72    pushOntoSorter
64f0: 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42  (pParse, pOrderB
6500: 79 2c 20 70 2c 20 72 65 67 52 65 73 75 6c 74 29  y, p, regResult)
6510: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
6520: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
6530: 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73  prCodeMove(pPars
6540: 65 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 69 50  e, regResult, iP
6550: 61 72 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  arm, 1);.       
6560: 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c   /* The LIMIT cl
6570: 61 75 73 65 20 77 69 6c 6c 20 6a 75 6d 70 20 6f  ause will jump o
6580: 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 66  ut of the loop f
6590: 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 7d  or us */.      }
65a0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
65b0: 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69    }.#endif /* #i
65c0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
65d0: 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 20  T_SUBQUERY */.. 
65e0: 20 20 20 2f 2a 20 53 65 6e 64 20 74 68 65 20 64     /* Send the d
65f0: 61 74 61 20 74 6f 20 74 68 65 20 63 61 6c 6c 62  ata to the callb
6600: 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 6f 72 20  ack function or 
6610: 74 6f 20 61 20 73 75 62 72 6f 75 74 69 6e 65 2e  to a subroutine.
6620: 20 20 49 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20    In the.    ** 
6630: 63 61 73 65 20 6f 66 20 61 20 73 75 62 72 6f 75  case of a subrou
6640: 74 69 6e 65 2c 20 74 68 65 20 73 75 62 72 6f 75  tine, the subrou
6650: 74 69 6e 65 20 69 74 73 65 6c 66 20 69 73 20 72  tine itself is r
6660: 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 0a 20  esponsible for. 
6670: 20 20 20 2a 2a 20 70 6f 70 70 69 6e 67 20 74 68     ** popping th
6680: 65 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20  e data from the 
6690: 73 74 61 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20  stack..    */.  
66a0: 20 20 63 61 73 65 20 53 52 54 5f 43 6f 72 6f 75    case SRT_Corou
66b0: 74 69 6e 65 3a 0a 20 20 20 20 63 61 73 65 20 53  tine:.    case S
66c0: 52 54 5f 4f 75 74 70 75 74 3a 20 7b 0a 20 20 20  RT_Output: {.   
66d0: 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65     testcase( eDe
66e0: 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e  st==SRT_Coroutin
66f0: 65 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  e );.      testc
6700: 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f  ase( eDest==SRT_
6710: 4f 75 74 70 75 74 20 29 3b 0a 20 20 20 20 20 20  Output );.      
6720: 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a  if( pOrderBy ){.
6730: 20 20 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d          int r1 =
6740: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
6750: 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
6760: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
6770: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp3(v, OP_Make
6780: 52 65 63 6f 72 64 2c 20 72 65 67 52 65 73 75 6c  Record, regResul
6790: 74 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 72 31 29 3b  t, nColumn, r1);
67a0: 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74  .        pushOnt
67b0: 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20  oSorter(pParse, 
67c0: 70 4f 72 64 65 72 42 79 2c 20 70 2c 20 72 31 29  pOrderBy, p, r1)
67d0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
67e0: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
67f0: 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20  pParse, r1);.   
6800: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 44 65     }else if( eDe
6810: 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e  st==SRT_Coroutin
6820: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  e ){.        sql
6830: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
6840: 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 70 44 65 73  , OP_Yield, pDes
6850: 74 2d 3e 69 53 44 50 61 72 6d 29 3b 0a 20 20 20  t->iSDParm);.   
6860: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
6870: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6880: 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74  Op2(v, OP_Result
6890: 52 6f 77 2c 20 72 65 67 52 65 73 75 6c 74 2c 20  Row, regResult, 
68a0: 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20  nColumn);.      
68b0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
68c0: 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  heAffinityChange
68d0: 28 70 50 61 72 73 65 2c 20 72 65 67 52 65 73 75  (pParse, regResu
68e0: 6c 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20  lt, nColumn);.  
68f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
6900: 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20 21 64  k;.    }..#if !d
6910: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
6920: 49 54 5f 54 52 49 47 47 45 52 29 0a 20 20 20 20  IT_TRIGGER).    
6930: 2f 2a 20 44 69 73 63 61 72 64 20 74 68 65 20 72  /* Discard the r
6940: 65 73 75 6c 74 73 2e 20 20 54 68 69 73 20 69 73  esults.  This is
6950: 20 75 73 65 64 20 66 6f 72 20 53 45 4c 45 43 54   used for SELECT
6960: 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 73 69   statements insi
6970: 64 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 62 6f  de.    ** the bo
6980: 64 79 20 6f 66 20 61 20 54 52 49 47 47 45 52 2e  dy of a TRIGGER.
6990: 20 20 54 68 65 20 70 75 72 70 6f 73 65 20 6f 66    The purpose of
69a0: 20 73 75 63 68 20 73 65 6c 65 63 74 73 20 69 73   such selects is
69b0: 20 74 6f 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20   to call.    ** 
69c0: 75 73 65 72 2d 64 65 66 69 6e 65 64 20 66 75 6e  user-defined fun
69d0: 63 74 69 6f 6e 73 20 74 68 61 74 20 68 61 76 65  ctions that have
69e0: 20 73 69 64 65 20 65 66 66 65 63 74 73 2e 20 20   side effects.  
69f0: 57 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 0a 20  We do not care. 
6a00: 20 20 20 2a 2a 20 61 62 6f 75 74 20 74 68 65 20     ** about the 
6a10: 61 63 74 75 61 6c 20 72 65 73 75 6c 74 73 20 6f  actual results o
6a20: 66 20 74 68 65 20 73 65 6c 65 63 74 2e 0a 20 20  f the select..  
6a30: 20 20 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c 74    */.    default
6a40: 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
6a50: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73  ( eDest==SRT_Dis
6a60: 63 61 72 64 20 29 3b 0a 20 20 20 20 20 20 62 72  card );.      br
6a70: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
6a80: 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70  f.  }..  /* Jump
6a90: 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74   to the end of t
6aa0: 68 65 20 6c 6f 6f 70 20 69 66 20 74 68 65 20 4c  he loop if the L
6ab0: 49 4d 49 54 20 69 73 20 72 65 61 63 68 65 64 2e  IMIT is reached.
6ac0: 20 20 45 78 63 65 70 74 2c 20 69 66 0a 20 20 2a    Except, if.  *
6ad0: 2a 20 74 68 65 72 65 20 69 73 20 61 20 73 6f 72  * there is a sor
6ae0: 74 65 72 2c 20 69 6e 20 77 68 69 63 68 20 63 61  ter, in which ca
6af0: 73 65 20 74 68 65 20 73 6f 72 74 65 72 20 68 61  se the sorter ha
6b00: 73 20 61 6c 72 65 61 64 79 20 6c 69 6d 69 74 65  s already limite
6b10: 64 0a 20 20 2a 2a 20 74 68 65 20 6f 75 74 70 75  d.  ** the outpu
6b20: 74 20 66 6f 72 20 75 73 2e 0a 20 20 2a 2f 0a 20  t for us..  */. 
6b30: 20 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d 30   if( pOrderBy==0
6b40: 20 26 26 20 70 2d 3e 69 4c 69 6d 69 74 20 29 7b   && p->iLimit ){
6b50: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
6b60: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 5a  AddOp3(v, OP_IfZ
6b70: 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20  ero, p->iLimit, 
6b80: 69 42 72 65 61 6b 2c 20 2d 31 29 3b 0a 20 20 7d  iBreak, -1);.  }
6b90: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  .}../*.** Given 
6ba0: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  an expression li
6bb0: 73 74 2c 20 67 65 6e 65 72 61 74 65 20 61 20 4b  st, generate a K
6bc0: 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
6bd0: 20 74 68 61 74 20 72 65 63 6f 72 64 73 0a 2a 2a   that records.**
6be0: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73   the collating s
6bf0: 65 71 75 65 6e 63 65 20 66 6f 72 20 65 61 63 68  equence for each
6c00: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 74   expression in t
6c10: 68 61 74 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  hat expression l
6c20: 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ist..**.** If th
6c30: 65 20 45 78 70 72 4c 69 73 74 20 69 73 20 61 6e  e ExprList is an
6c40: 20 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f   ORDER BY or GRO
6c50: 55 50 20 42 59 20 63 6c 61 75 73 65 20 74 68 65  UP BY clause the
6c60: 6e 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67 0a  n the resulting.
6c70: 2a 2a 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63  ** KeyInfo struc
6c80: 74 75 72 65 20 69 73 20 61 70 70 72 6f 70 72 69  ture is appropri
6c90: 61 74 65 20 66 6f 72 20 69 6e 69 74 69 61 6c 69  ate for initiali
6ca0: 7a 69 6e 67 20 61 20 76 69 72 74 75 61 6c 20 69  zing a virtual i
6cb0: 6e 64 65 78 20 74 6f 0a 2a 2a 20 69 6d 70 6c 65  ndex to.** imple
6cc0: 6d 65 6e 74 20 74 68 61 74 20 63 6c 61 75 73 65  ment that clause
6cd0: 2e 20 20 49 66 20 74 68 65 20 45 78 70 72 4c 69  .  If the ExprLi
6ce0: 73 74 20 69 73 20 74 68 65 20 72 65 73 75 6c 74  st is the result
6cf0: 20 73 65 74 20 6f 66 20 61 20 53 45 4c 45 43 54   set of a SELECT
6d00: 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 4b 65 79  .** then the Key
6d10: 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69  Info structure i
6d20: 73 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f  s appropriate fo
6d30: 72 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 61  r initializing a
6d40: 20 76 69 72 74 75 61 6c 0a 2a 2a 20 69 6e 64 65   virtual.** inde
6d50: 78 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61  x to implement a
6d60: 20 44 49 53 54 49 4e 43 54 20 74 65 73 74 2e 0a   DISTINCT test..
6d70: 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68  **.** Space to h
6d80: 6f 6c 64 20 74 68 65 20 4b 65 79 49 6e 66 6f 20  old the KeyInfo 
6d90: 73 74 72 75 63 74 75 72 65 20 69 73 20 6f 62 74  structure is obt
6da0: 61 69 6e 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e  ain from malloc.
6db0: 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a    The calling.**
6dc0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 73   function is res
6dd0: 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 73 65 65  ponsible for see
6de0: 69 6e 67 20 74 68 61 74 20 74 68 69 73 20 73 74  ing that this st
6df0: 72 75 63 74 75 72 65 20 69 73 20 65 76 65 6e 74  ructure is event
6e00: 75 61 6c 6c 79 0a 2a 2a 20 66 72 65 65 64 2e 20  ually.** freed. 
6e10: 20 41 64 64 20 74 68 65 20 4b 65 79 49 6e 66 6f   Add the KeyInfo
6e20: 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 74 68   structure to th
6e30: 65 20 50 34 20 66 69 65 6c 64 20 6f 66 20 61 6e  e P4 field of an
6e40: 20 6f 70 63 6f 64 65 20 75 73 69 6e 67 0a 2a 2a   opcode using.**
6e50: 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44   P4_KEYINFO_HAND
6e60: 4f 46 46 20 69 73 20 74 68 65 20 75 73 75 61 6c  OFF is the usual
6e70: 20 77 61 79 20 6f 66 20 64 65 61 6c 69 6e 67 20   way of dealing 
6e80: 77 69 74 68 20 74 68 69 73 2e 0a 2a 2f 0a 73 74  with this..*/.st
6e90: 61 74 69 63 20 4b 65 79 49 6e 66 6f 20 2a 6b 65  atic KeyInfo *ke
6ea0: 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73  yInfoFromExprLis
6eb0: 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  t(Parse *pParse,
6ec0: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
6ed0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
6ee0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
6ef0: 20 69 6e 74 20 6e 45 78 70 72 3b 0a 20 20 4b 65   int nExpr;.  Ke
6f00: 79 49 6e 66 6f 20 2a 70 49 6e 66 6f 3b 0a 20 20  yInfo *pInfo;.  
6f10: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
6f20: 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69  item *pItem;.  i
6f30: 6e 74 20 69 3b 0a 0a 20 20 6e 45 78 70 72 20 3d  nt i;..  nExpr =
6f40: 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20   pList->nExpr;. 
6f50: 20 70 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33   pInfo = sqlite3
6f60: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
6f70: 20 73 69 7a 65 6f 66 28 2a 70 49 6e 66 6f 29 20   sizeof(*pInfo) 
6f80: 2b 20 6e 45 78 70 72 2a 28 73 69 7a 65 6f 66 28  + nExpr*(sizeof(
6f90: 43 6f 6c 6c 53 65 71 2a 29 2b 31 29 20 29 3b 0a  CollSeq*)+1) );.
6fa0: 20 20 69 66 28 20 70 49 6e 66 6f 20 29 7b 0a 20    if( pInfo ){. 
6fb0: 20 20 20 70 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f     pInfo->aSortO
6fc0: 72 64 65 72 20 3d 20 28 75 38 2a 29 26 70 49 6e  rder = (u8*)&pIn
6fd0: 66 6f 2d 3e 61 43 6f 6c 6c 5b 6e 45 78 70 72 5d  fo->aColl[nExpr]
6fe0: 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 46 69  ;.    pInfo->nFi
6ff0: 65 6c 64 20 3d 20 28 75 31 36 29 6e 45 78 70 72  eld = (u16)nExpr
7000: 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 65 6e 63  ;.    pInfo->enc
7010: 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20 20 20   = ENC(db);.    
7020: 70 49 6e 66 6f 2d 3e 64 62 20 3d 20 64 62 3b 0a  pInfo->db = db;.
7030: 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 49 74      for(i=0, pIt
7040: 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3c 6e  em=pList->a; i<n
7050: 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d  Expr; i++, pItem
7060: 2b 2b 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53  ++){.      CollS
7070: 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 20  eq *pColl;.     
7080: 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
7090: 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
70a0: 73 65 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72  se, pItem->pExpr
70b0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 43  );.      if( !pC
70c0: 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70  oll ){.        p
70d0: 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74  Coll = db->pDflt
70e0: 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Coll;.      }.  
70f0: 20 20 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 6c      pInfo->aColl
7100: 5b 69 5d 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20  [i] = pColl;.   
7110: 20 20 20 70 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f     pInfo->aSortO
7120: 72 64 65 72 5b 69 5d 20 3d 20 70 49 74 65 6d 2d  rder[i] = pItem-
7130: 3e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20  >sortOrder;.    
7140: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  }.  }.  return p
7150: 49 6e 66 6f 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  Info;.}..#ifndef
7160: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d   SQLITE_OMIT_COM
7170: 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a  POUND_SELECT./*.
7180: 2a 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63  ** Name of the c
7190: 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70 65 72 61 74  onnection operat
71a0: 6f 72 2c 20 75 73 65 64 20 66 6f 72 20 65 72 72  or, used for err
71b0: 6f 72 20 6d 65 73 73 61 67 65 73 2e 0a 2a 2f 0a  or messages..*/.
71c0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
71d0: 72 20 2a 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28  r *selectOpName(
71e0: 69 6e 74 20 69 64 29 7b 0a 20 20 63 68 61 72 20  int id){.  char 
71f0: 2a 7a 3b 0a 20 20 73 77 69 74 63 68 28 20 69 64  *z;.  switch( id
7200: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
7210: 41 4c 4c 3a 20 20 20 20 20 20 20 7a 20 3d 20 22  ALL:       z = "
7220: 55 4e 49 4f 4e 20 41 4c 4c 22 3b 20 20 20 62 72  UNION ALL";   br
7230: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
7240: 5f 49 4e 54 45 52 53 45 43 54 3a 20 7a 20 3d 20  _INTERSECT: z = 
7250: 22 49 4e 54 45 52 53 45 43 54 22 3b 20 20 20 62  "INTERSECT";   b
7260: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
7270: 4b 5f 45 58 43 45 50 54 3a 20 20 20 20 7a 20 3d  K_EXCEPT:    z =
7280: 20 22 45 58 43 45 50 54 22 3b 20 20 20 20 20 20   "EXCEPT";      
7290: 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75  break;.    defau
72a0: 6c 74 3a 20 20 20 20 20 20 20 20 20 20 20 7a 20  lt:           z 
72b0: 3d 20 22 55 4e 49 4f 4e 22 3b 20 20 20 20 20 20  = "UNION";      
72c0: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65   break;.  }.  re
72d0: 74 75 72 6e 20 7a 3b 0a 7d 0a 23 65 6e 64 69 66  turn z;.}.#endif
72e0: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
72f0: 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20  COMPOUND_SELECT 
7300: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
7310: 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a  TE_OMIT_EXPLAIN.
7320: 2f 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 61 6e 20  /*.** Unless an 
7330: 22 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50  "EXPLAIN QUERY P
7340: 4c 41 4e 22 20 63 6f 6d 6d 61 6e 64 20 69 73 20  LAN" command is 
7350: 62 65 69 6e 67 20 70 72 6f 63 65 73 73 65 64 2c  being processed,
7360: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a   this function.*
7370: 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 4f 74  * is a no-op. Ot
7380: 68 65 72 77 69 73 65 2c 20 69 74 20 61 64 64 73  herwise, it adds
7390: 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66   a single row of
73a0: 20 6f 75 74 70 75 74 20 74 6f 20 74 68 65 20 45   output to the E
73b0: 51 50 20 72 65 73 75 6c 74 2c 0a 2a 2a 20 77 68  QP result,.** wh
73c0: 65 72 65 20 74 68 65 20 63 61 70 74 69 6f 6e 20  ere the caption 
73d0: 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a  is of the form:.
73e0: 2a 2a 0a 2a 2a 20 20 20 22 55 53 45 20 54 45 4d  **.**   "USE TEM
73f0: 50 20 42 2d 54 52 45 45 20 46 4f 52 20 78 78 78  P B-TREE FOR xxx
7400: 22 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 78 78  ".**.** where xx
7410: 78 20 69 73 20 6f 6e 65 20 6f 66 20 22 44 49 53  x is one of "DIS
7420: 54 49 4e 43 54 22 2c 20 22 4f 52 44 45 52 20 42  TINCT", "ORDER B
7430: 59 22 20 6f 72 20 22 47 52 4f 55 50 20 42 59 22  Y" or "GROUP BY"
7440: 2e 20 45 78 61 63 74 6c 79 20 77 68 69 63 68 0a  . Exactly which.
7450: 2a 2a 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64  ** is determined
7460: 20 62 79 20 74 68 65 20 7a 55 73 61 67 65 20 61   by the zUsage a
7470: 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  rgument..*/.stat
7480: 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69 6e 54  ic void explainT
7490: 65 6d 70 54 61 62 6c 65 28 50 61 72 73 65 20 2a  empTable(Parse *
74a0: 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68  pParse, const ch
74b0: 61 72 20 2a 7a 55 73 61 67 65 29 7b 0a 20 20 69  ar *zUsage){.  i
74c0: 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61  f( pParse->expla
74d0: 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 56 64 62  in==2 ){.    Vdb
74e0: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
74f0: 56 64 62 65 3b 0a 20 20 20 20 63 68 61 72 20 2a  Vdbe;.    char *
7500: 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50  zMsg = sqlite3MP
7510: 72 69 6e 74 66 28 70 50 61 72 73 65 2d 3e 64 62  rintf(pParse->db
7520: 2c 20 22 55 53 45 20 54 45 4d 50 20 42 2d 54 52  , "USE TEMP B-TR
7530: 45 45 20 46 4f 52 20 25 73 22 2c 20 7a 55 73 61  EE FOR %s", zUsa
7540: 67 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ge);.    sqlite3
7550: 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
7560: 5f 45 78 70 6c 61 69 6e 2c 20 70 50 61 72 73 65  _Explain, pParse
7570: 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 30 2c 20  ->iSelectId, 0, 
7580: 30 2c 20 7a 4d 73 67 2c 20 50 34 5f 44 59 4e 41  0, zMsg, P4_DYNA
7590: 4d 49 43 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  MIC);.  }.}../*.
75a0: 2a 2a 20 41 73 73 69 67 6e 20 65 78 70 72 65 73  ** Assign expres
75b0: 73 69 6f 6e 20 62 20 74 6f 20 6c 76 61 6c 75 65  sion b to lvalue
75c0: 20 61 2e 20 41 20 73 65 63 6f 6e 64 2c 20 6e 6f   a. A second, no
75d0: 2d 6f 70 2c 20 76 65 72 73 69 6f 6e 20 6f 66 20  -op, version of 
75e0: 74 68 69 73 20 6d 61 63 72 6f 0a 2a 2a 20 69 73  this macro.** is
75f0: 20 70 72 6f 76 69 64 65 64 20 77 68 65 6e 20 53   provided when S
7600: 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
7610: 49 4e 20 69 73 20 64 65 66 69 6e 65 64 2e 20 54  IN is defined. T
7620: 68 69 73 20 61 6c 6c 6f 77 73 20 74 68 65 20 63  his allows the c
7630: 6f 64 65 0a 2a 2a 20 69 6e 20 73 71 6c 69 74 65  ode.** in sqlite
7640: 33 53 65 6c 65 63 74 28 29 20 74 6f 20 61 73 73  3Select() to ass
7650: 69 67 6e 20 76 61 6c 75 65 73 20 74 6f 20 73 74  ign values to st
7660: 72 75 63 74 75 72 65 20 6d 65 6d 62 65 72 20 76  ructure member v
7670: 61 72 69 61 62 6c 65 73 20 74 68 61 74 0a 2a 2a  ariables that.**
7680: 20 6f 6e 6c 79 20 65 78 69 73 74 20 69 66 20 53   only exist if S
7690: 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
76a0: 49 4e 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65  IN is not define
76b0: 64 20 77 69 74 68 6f 75 74 20 70 6f 6c 6c 75 74  d without pollut
76c0: 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 64 65 20  ing the.** code 
76d0: 77 69 74 68 20 23 69 66 6e 64 65 66 20 64 69 72  with #ifndef dir
76e0: 65 63 74 69 76 65 73 2e 0a 2a 2f 0a 23 20 64 65  ectives..*/.# de
76f0: 66 69 6e 65 20 65 78 70 6c 61 69 6e 53 65 74 49  fine explainSetI
7700: 6e 74 65 67 65 72 28 61 2c 20 62 29 20 61 20 3d  nteger(a, b) a =
7710: 20 62 0a 0a 23 65 6c 73 65 0a 2f 2a 20 4e 6f 2d   b..#else./* No-
7720: 6f 70 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74  op versions of t
7730: 68 65 20 65 78 70 6c 61 69 6e 58 58 58 28 29 20  he explainXXX() 
7740: 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 20 6d 61  functions and ma
7750: 63 72 6f 73 2e 20 2a 2f 0a 23 20 64 65 66 69 6e  cros. */.# defin
7760: 65 20 65 78 70 6c 61 69 6e 54 65 6d 70 54 61 62  e explainTempTab
7770: 6c 65 28 79 2c 7a 29 0a 23 20 64 65 66 69 6e 65  le(y,z).# define
7780: 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67   explainSetInteg
7790: 65 72 28 79 2c 7a 29 0a 23 65 6e 64 69 66 0a 0a  er(y,z).#endif..
77a0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
77b0: 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e  ITE_OMIT_EXPLAIN
77c0: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  ) && !defined(SQ
77d0: 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
77e0: 4e 44 5f 53 45 4c 45 43 54 29 0a 2f 2a 0a 2a 2a  ND_SELECT)./*.**
77f0: 20 55 6e 6c 65 73 73 20 61 6e 20 22 45 58 50 4c   Unless an "EXPL
7800: 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 22 20  AIN QUERY PLAN" 
7810: 63 6f 6d 6d 61 6e 64 20 69 73 20 62 65 69 6e 67  command is being
7820: 20 70 72 6f 63 65 73 73 65 64 2c 20 74 68 69 73   processed, this
7830: 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20   function.** is 
7840: 61 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69  a no-op. Otherwi
7850: 73 65 2c 20 69 74 20 61 64 64 73 20 61 20 73 69  se, it adds a si
7860: 6e 67 6c 65 20 72 6f 77 20 6f 66 20 6f 75 74 70  ngle row of outp
7870: 75 74 20 74 6f 20 74 68 65 20 45 51 50 20 72 65  ut to the EQP re
7880: 73 75 6c 74 2c 0a 2a 2a 20 77 68 65 72 65 20 74  sult,.** where t
7890: 68 65 20 63 61 70 74 69 6f 6e 20 69 73 20 6f 66  he caption is of
78a0: 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 77 6f 20   one of the two 
78b0: 66 6f 72 6d 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 22  forms:.**.**   "
78c0: 43 4f 4d 50 4f 53 49 54 45 20 53 55 42 51 55 45  COMPOSITE SUBQUE
78d0: 52 49 45 53 20 69 53 75 62 31 20 61 6e 64 20 69  RIES iSub1 and i
78e0: 53 75 62 32 20 28 6f 70 29 22 0a 2a 2a 20 20 20  Sub2 (op)".**   
78f0: 22 43 4f 4d 50 4f 53 49 54 45 20 53 55 42 51 55  "COMPOSITE SUBQU
7900: 45 52 49 45 53 20 69 53 75 62 31 20 61 6e 64 20  ERIES iSub1 and 
7910: 69 53 75 62 32 20 55 53 49 4e 47 20 54 45 4d 50  iSub2 USING TEMP
7920: 20 42 2d 54 52 45 45 20 28 6f 70 29 22 0a 2a 2a   B-TREE (op)".**
7930: 0a 2a 2a 20 77 68 65 72 65 20 69 53 75 62 31 20  .** where iSub1 
7940: 61 6e 64 20 69 53 75 62 32 20 61 72 65 20 74 68  and iSub2 are th
7950: 65 20 69 6e 74 65 67 65 72 73 20 70 61 73 73 65  e integers passe
7960: 64 20 61 73 20 74 68 65 20 63 6f 72 72 65 73 70  d as the corresp
7970: 6f 6e 64 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69  onding.** functi
7980: 6f 6e 20 70 61 72 61 6d 65 74 65 72 73 2c 20 61  on parameters, a
7990: 6e 64 20 6f 70 20 69 73 20 74 68 65 20 74 65 78  nd op is the tex
79a0: 74 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  t representation
79b0: 20 6f 66 20 74 68 65 20 70 61 72 61 6d 65 74 65   of the paramete
79c0: 72 0a 2a 2a 20 6f 66 20 74 68 65 20 73 61 6d 65  r.** of the same
79d0: 20 6e 61 6d 65 2e 20 54 68 65 20 70 61 72 61 6d   name. The param
79e0: 65 74 65 72 20 22 6f 70 22 20 6d 75 73 74 20 62  eter "op" must b
79f0: 65 20 6f 6e 65 20 6f 66 20 54 4b 5f 55 4e 49 4f  e one of TK_UNIO
7a00: 4e 2c 20 54 4b 5f 45 58 43 45 50 54 2c 0a 2a 2a  N, TK_EXCEPT,.**
7a10: 20 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 6f 72   TK_INTERSECT or
7a20: 20 54 4b 5f 41 4c 4c 2e 20 54 68 65 20 66 69 72   TK_ALL. The fir
7a30: 73 74 20 66 6f 72 6d 20 69 73 20 75 73 65 64 20  st form is used 
7a40: 69 66 20 61 72 67 75 6d 65 6e 74 20 62 55 73 65  if argument bUse
7a50: 54 6d 70 20 69 73 20 0a 2a 2a 20 66 61 6c 73 65  Tmp is .** false
7a60: 2c 20 6f 72 20 74 68 65 20 73 65 63 6f 6e 64 20  , or the second 
7a70: 66 6f 72 6d 20 69 66 20 69 74 20 69 73 20 74 72  form if it is tr
7a80: 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ue..*/.static vo
7a90: 69 64 20 65 78 70 6c 61 69 6e 43 6f 6d 70 6f 73  id explainCompos
7aa0: 69 74 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ite(.  Parse *pP
7ab0: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  arse,           
7ac0: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20         /* Parse 
7ad0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74  context */.  int
7ae0: 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   op,            
7af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7b00: 4f 6e 65 20 6f 66 20 54 4b 5f 55 4e 49 4f 4e 2c  One of TK_UNION,
7b10: 20 54 4b 5f 45 58 43 45 50 54 20 65 74 63 2e 20   TK_EXCEPT etc. 
7b20: 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62 31 2c 20  */.  int iSub1, 
7b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7b40: 20 20 20 20 20 2f 2a 20 53 75 62 71 75 65 72 79       /* Subquery
7b50: 20 69 64 20 31 20 2a 2f 0a 20 20 69 6e 74 20 69   id 1 */.  int i
7b60: 53 75 62 32 2c 20 20 20 20 20 20 20 20 20 20 20  Sub2,           
7b70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75             /* Su
7b80: 62 71 75 65 72 79 20 69 64 20 32 20 2a 2f 0a 20  bquery id 2 */. 
7b90: 20 69 6e 74 20 62 55 73 65 54 6d 70 20 20 20 20   int bUseTmp    
7ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7bb0: 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 74 65   /* True if a te
7bc0: 6d 70 20 74 61 62 6c 65 20 77 61 73 20 75 73 65  mp table was use
7bd0: 64 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74  d */.){.  assert
7be0: 28 20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 7c  ( op==TK_UNION |
7bf0: 7c 20 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20  | op==TK_EXCEPT 
7c00: 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53  || op==TK_INTERS
7c10: 45 43 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 41 4c  ECT || op==TK_AL
7c20: 4c 20 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73  L );.  if( pPars
7c30: 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29 7b  e->explain==2 ){
7c40: 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20 70  .    Vdbe *v = p
7c50: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
7c60: 20 20 63 68 61 72 20 2a 7a 4d 73 67 20 3d 20 73    char *zMsg = s
7c70: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 0a 20  qlite3MPrintf(. 
7c80: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64         pParse->d
7c90: 62 2c 20 22 43 4f 4d 50 4f 55 4e 44 20 53 55 42  b, "COMPOUND SUB
7ca0: 51 55 45 52 49 45 53 20 25 64 20 41 4e 44 20 25  QUERIES %d AND %
7cb0: 64 20 25 73 28 25 73 29 22 2c 20 69 53 75 62 31  d %s(%s)", iSub1
7cc0: 2c 20 69 53 75 62 32 2c 0a 20 20 20 20 20 20 20  , iSub2,.       
7cd0: 20 62 55 73 65 54 6d 70 3f 22 55 53 49 4e 47 20   bUseTmp?"USING 
7ce0: 54 45 4d 50 20 42 2d 54 52 45 45 20 22 3a 22 22  TEMP B-TREE ":""
7cf0: 2c 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 6f  , selectOpName(o
7d00: 70 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71  p).    );.    sq
7d10: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
7d20: 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 70  v, OP_Explain, p
7d30: 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64  Parse->iSelectId
7d40: 2c 20 30 2c 20 30 2c 20 7a 4d 73 67 2c 20 50 34  , 0, 0, zMsg, P4
7d50: 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 7d  _DYNAMIC);.  }.}
7d60: 0a 23 65 6c 73 65 0a 2f 2a 20 4e 6f 2d 6f 70 20  .#else./* No-op 
7d70: 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20  versions of the 
7d80: 65 78 70 6c 61 69 6e 58 58 58 28 29 20 66 75 6e  explainXXX() fun
7d90: 63 74 69 6f 6e 73 20 61 6e 64 20 6d 61 63 72 6f  ctions and macro
7da0: 73 2e 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 65  s. */.# define e
7db0: 78 70 6c 61 69 6e 43 6f 6d 70 6f 73 69 74 65 28  xplainComposite(
7dc0: 76 2c 77 2c 78 2c 79 2c 7a 29 0a 23 65 6e 64 69  v,w,x,y,z).#endi
7dd0: 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  f../*.** If the 
7de0: 69 6e 6e 65 72 20 6c 6f 6f 70 20 77 61 73 20 67  inner loop was g
7df0: 65 6e 65 72 61 74 65 64 20 75 73 69 6e 67 20 61  enerated using a
7e00: 20 6e 6f 6e 2d 6e 75 6c 6c 20 70 4f 72 64 65 72   non-null pOrder
7e10: 42 79 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20  By argument,.** 
7e20: 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 73  then the results
7e30: 20 77 65 72 65 20 70 6c 61 63 65 64 20 69 6e 20   were placed in 
7e40: 61 20 73 6f 72 74 65 72 2e 20 20 41 66 74 65 72  a sorter.  After
7e50: 20 74 68 65 20 6c 6f 6f 70 20 69 73 20 74 65 72   the loop is ter
7e60: 6d 69 6e 61 74 65 64 0a 2a 2a 20 77 65 20 6e 65  minated.** we ne
7e70: 65 64 20 74 6f 20 72 75 6e 20 74 68 65 20 73 6f  ed to run the so
7e80: 72 74 65 72 20 61 6e 64 20 6f 75 74 70 75 74 20  rter and output 
7e90: 74 68 65 20 72 65 73 75 6c 74 73 2e 20 20 54 68  the results.  Th
7ea0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 72  e following.** r
7eb0: 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73  outine generates
7ec0: 20 74 68 65 20 63 6f 64 65 20 6e 65 65 64 65 64   the code needed
7ed0: 20 74 6f 20 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a   to do that..*/.
7ee0: 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65  static void gene
7ef0: 72 61 74 65 53 6f 72 74 54 61 69 6c 28 0a 20 20  rateSortTail(.  
7f00: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
7f10: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
7f20: 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
7f30: 20 2a 70 2c 20 20 20 20 20 20 20 20 2f 2a 20 54   *p,        /* T
7f40: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
7f50: 65 6e 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  ent */.  Vdbe *v
7f60: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65  ,          /* Ge
7f70: 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f  nerate code into
7f80: 20 74 68 69 73 20 56 44 42 45 20 2a 2f 0a 20 20   this VDBE */.  
7f90: 69 6e 74 20 6e 43 6f 6c 75 6d 6e 2c 20 20 20 20  int nColumn,    
7fa0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
7fb0: 6f 6c 75 6d 6e 73 20 6f 66 20 64 61 74 61 20 2a  olumns of data *
7fc0: 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a  /.  SelectDest *
7fd0: 70 44 65 73 74 20 2f 2a 20 57 72 69 74 65 20 74  pDest /* Write t
7fe0: 68 65 20 73 6f 72 74 65 64 20 72 65 73 75 6c 74  he sorted result
7ff0: 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  s here */.){.  i
8000: 6e 74 20 61 64 64 72 42 72 65 61 6b 20 3d 20 73  nt addrBreak = s
8010: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
8020: 62 65 6c 28 76 29 3b 20 20 20 20 20 2f 2a 20 4a  bel(v);     /* J
8030: 75 6d 70 20 68 65 72 65 20 74 6f 20 65 78 69 74  ump here to exit
8040: 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61   loop */.  int a
8050: 64 64 72 43 6f 6e 74 69 6e 75 65 20 3d 20 73 71  ddrContinue = sq
8060: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
8070: 65 6c 28 76 29 3b 20 20 2f 2a 20 4a 75 6d 70 20  el(v);  /* Jump 
8080: 68 65 72 65 20 66 6f 72 20 6e 65 78 74 20 63 79  here for next cy
8090: 63 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  cle */.  int add
80a0: 72 3b 0a 20 20 69 6e 74 20 69 54 61 62 3b 0a 20  r;.  int iTab;. 
80b0: 20 69 6e 74 20 70 73 65 75 64 6f 54 61 62 20 3d   int pseudoTab =
80c0: 20 30 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   0;.  ExprList *
80d0: 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f  pOrderBy = p->pO
80e0: 72 64 65 72 42 79 3b 0a 0a 20 20 69 6e 74 20 65  rderBy;..  int e
80f0: 44 65 73 74 20 3d 20 70 44 65 73 74 2d 3e 65 44  Dest = pDest->eD
8100: 65 73 74 3b 0a 20 20 69 6e 74 20 69 50 61 72 6d  est;.  int iParm
8110: 20 3d 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72   = pDest->iSDPar
8120: 6d 3b 0a 0a 20 20 69 6e 74 20 72 65 67 52 6f 77  m;..  int regRow
8130: 3b 0a 20 20 69 6e 74 20 72 65 67 52 6f 77 69 64  ;.  int regRowid
8140: 3b 0a 0a 20 20 69 54 61 62 20 3d 20 70 4f 72 64  ;..  iTab = pOrd
8150: 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 3b 0a  erBy->iECursor;.
8160: 20 20 72 65 67 52 6f 77 20 3d 20 73 71 6c 69 74    regRow = sqlit
8170: 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
8180: 72 73 65 29 3b 0a 20 20 69 66 28 20 65 44 65 73  rse);.  if( eDes
8190: 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 7c 7c  t==SRT_Output ||
81a0: 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f   eDest==SRT_Coro
81b0: 75 74 69 6e 65 20 29 7b 0a 20 20 20 20 70 73 65  utine ){.    pse
81c0: 75 64 6f 54 61 62 20 3d 20 70 50 61 72 73 65 2d  udoTab = pParse-
81d0: 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 73 71 6c  >nTab++;.    sql
81e0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
81f0: 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f 2c  , OP_OpenPseudo,
8200: 20 70 73 65 75 64 6f 54 61 62 2c 20 72 65 67 52   pseudoTab, regR
8210: 6f 77 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20  ow, nColumn);.  
8220: 20 20 72 65 67 52 6f 77 69 64 20 3d 20 30 3b 0a    regRowid = 0;.
8230: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 67    }else{.    reg
8240: 52 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33 47  Rowid = sqlite3G
8250: 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
8260: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  );.  }.  if( p->
8270: 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 55 73  selFlags & SF_Us
8280: 65 53 6f 72 74 65 72 20 29 7b 0a 20 20 20 20 69  eSorter ){.    i
8290: 6e 74 20 72 65 67 53 6f 72 74 4f 75 74 20 3d 20  nt regSortOut = 
82a0: 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
82b0: 20 20 20 20 69 6e 74 20 70 74 61 62 32 20 3d 20      int ptab2 = 
82c0: 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
82d0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
82e0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp3(v, OP_Open
82f0: 50 73 65 75 64 6f 2c 20 70 74 61 62 32 2c 20 72  Pseudo, ptab2, r
8300: 65 67 53 6f 72 74 4f 75 74 2c 20 70 4f 72 64 65  egSortOut, pOrde
8310: 72 42 79 2d 3e 6e 45 78 70 72 2b 32 29 3b 0a 20  rBy->nExpr+2);. 
8320: 20 20 20 61 64 64 72 20 3d 20 31 20 2b 20 73 71     addr = 1 + sq
8330: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
8340: 76 2c 20 4f 50 5f 53 6f 72 74 65 72 53 6f 72 74  v, OP_SorterSort
8350: 2c 20 69 54 61 62 2c 20 61 64 64 72 42 72 65 61  , iTab, addrBrea
8360: 6b 29 3b 0a 20 20 20 20 63 6f 64 65 4f 66 66 73  k);.    codeOffs
8370: 65 74 28 76 2c 20 70 2c 20 61 64 64 72 43 6f 6e  et(v, p, addrCon
8380: 74 69 6e 75 65 29 3b 0a 20 20 20 20 73 71 6c 69  tinue);.    sqli
8390: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
83a0: 20 4f 50 5f 53 6f 72 74 65 72 44 61 74 61 2c 20   OP_SorterData, 
83b0: 69 54 61 62 2c 20 72 65 67 53 6f 72 74 4f 75 74  iTab, regSortOut
83c0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
83d0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
83e0: 6f 6c 75 6d 6e 2c 20 70 74 61 62 32 2c 20 70 4f  olumn, ptab2, pO
83f0: 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b 31 2c  rderBy->nExpr+1,
8400: 20 72 65 67 52 6f 77 29 3b 0a 20 20 20 20 73 71   regRow);.    sq
8410: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
8420: 35 28 76 2c 20 4f 50 46 4c 41 47 5f 43 4c 45 41  5(v, OPFLAG_CLEA
8430: 52 43 41 43 48 45 29 3b 0a 20 20 7d 65 6c 73 65  RCACHE);.  }else
8440: 7b 0a 20 20 20 20 61 64 64 72 20 3d 20 31 20 2b  {.    addr = 1 +
8450: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
8460: 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 2c 20 69  p2(v, OP_Sort, i
8470: 54 61 62 2c 20 61 64 64 72 42 72 65 61 6b 29 3b  Tab, addrBreak);
8480: 0a 20 20 20 20 63 6f 64 65 4f 66 66 73 65 74 28  .    codeOffset(
8490: 76 2c 20 70 2c 20 61 64 64 72 43 6f 6e 74 69 6e  v, p, addrContin
84a0: 75 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ue);.    sqlite3
84b0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
84c0: 5f 43 6f 6c 75 6d 6e 2c 20 69 54 61 62 2c 20 70  _Column, iTab, p
84d0: 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b 31  OrderBy->nExpr+1
84e0: 2c 20 72 65 67 52 6f 77 29 3b 0a 20 20 7d 0a 20  , regRow);.  }. 
84f0: 20 73 77 69 74 63 68 28 20 65 44 65 73 74 20 29   switch( eDest )
8500: 7b 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 54  {.    case SRT_T
8510: 61 62 6c 65 3a 0a 20 20 20 20 63 61 73 65 20 53  able:.    case S
8520: 52 54 5f 45 70 68 65 6d 54 61 62 3a 20 7b 0a 20  RT_EphemTab: {. 
8530: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65       testcase( e
8540: 44 65 73 74 3d 3d 53 52 54 5f 54 61 62 6c 65 20  Dest==SRT_Table 
8550: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
8560: 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 45 70  e( eDest==SRT_Ep
8570: 68 65 6d 54 61 62 20 29 3b 0a 20 20 20 20 20 20  hemTab );.      
8580: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
8590: 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64  2(v, OP_NewRowid
85a0: 2c 20 69 50 61 72 6d 2c 20 72 65 67 52 6f 77 69  , iParm, regRowi
85b0: 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  d);.      sqlite
85c0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
85d0: 50 5f 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c  P_Insert, iParm,
85e0: 20 72 65 67 52 6f 77 2c 20 72 65 67 52 6f 77 69   regRow, regRowi
85f0: 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  d);.      sqlite
8600: 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
8610: 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b   OPFLAG_APPEND);
8620: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
8630: 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
8640: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
8650: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 53 65  .    case SRT_Se
8660: 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  t: {.      asser
8670: 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b  t( nColumn==1 );
8680: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
8690: 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d  beAddOp4(v, OP_M
86a0: 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52 6f  akeRecord, regRo
86b0: 77 2c 20 31 2c 20 72 65 67 52 6f 77 69 64 2c 0a  w, 1, regRowid,.
86c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
86d0: 20 20 20 20 20 20 20 20 26 70 44 65 73 74 2d 3e          &pDest->
86e0: 61 66 66 53 64 73 74 2c 20 31 29 3b 0a 20 20 20  affSdst, 1);.   
86f0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
8700: 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67  cheAffinityChang
8710: 65 28 70 50 61 72 73 65 2c 20 72 65 67 52 6f 77  e(pParse, regRow
8720: 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 1);.      sqli
8730: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
8740: 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69   OP_IdxInsert, i
8750: 50 61 72 6d 2c 20 72 65 67 52 6f 77 69 64 29 3b  Parm, regRowid);
8760: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
8770: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 52 54    }.    case SRT
8780: 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73  _Mem: {.      as
8790: 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31  sert( nColumn==1
87a0: 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
87b0: 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50  3ExprCodeMove(pP
87c0: 61 72 73 65 2c 20 72 65 67 52 6f 77 2c 20 69 50  arse, regRow, iP
87d0: 61 72 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20 2f  arm, 1);.      /
87e0: 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75  * The LIMIT clau
87f0: 73 65 20 77 69 6c 6c 20 74 65 72 6d 69 6e 61 74  se will terminat
8800: 65 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75  e the loop for u
8810: 73 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b  s */.      break
8820: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
8830: 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
8840: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
8850: 20 61 73 73 65 72 74 28 20 65 44 65 73 74 3d 3d   assert( eDest==
8860: 53 52 54 5f 4f 75 74 70 75 74 20 7c 7c 20 65 44  SRT_Output || eD
8870: 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69  est==SRT_Corouti
8880: 6e 65 20 29 3b 20 0a 20 20 20 20 20 20 74 65 73  ne ); .      tes
8890: 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52  tcase( eDest==SR
88a0: 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20 20 20 20  T_Output );.    
88b0: 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73    testcase( eDes
88c0: 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65  t==SRT_Coroutine
88d0: 20 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   );.      for(i=
88e0: 30 3b 20 69 3c 6e 43 6f 6c 75 6d 6e 3b 20 69 2b  0; i<nColumn; i+
88f0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  +){.        asse
8900: 72 74 28 20 72 65 67 52 6f 77 21 3d 70 44 65 73  rt( regRow!=pDes
8910: 74 2d 3e 69 53 64 73 74 2b 69 20 29 3b 0a 20 20  t->iSdst+i );.  
8920: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
8930: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
8940: 6c 75 6d 6e 2c 20 70 73 65 75 64 6f 54 61 62 2c  lumn, pseudoTab,
8950: 20 69 2c 20 70 44 65 73 74 2d 3e 69 53 64 73 74   i, pDest->iSdst
8960: 2b 69 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  +i);.        if(
8970: 20 69 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20   i==0 ){.       
8980: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
8990: 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47  angeP5(v, OPFLAG
89a0: 5f 43 4c 45 41 52 43 41 43 48 45 29 3b 0a 20 20  _CLEARCACHE);.  
89b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
89c0: 20 20 20 20 20 20 69 66 28 20 65 44 65 73 74 3d        if( eDest=
89d0: 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20  =SRT_Output ){. 
89e0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
89f0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
8a00: 65 73 75 6c 74 52 6f 77 2c 20 70 44 65 73 74 2d  esultRow, pDest-
8a10: 3e 69 53 64 73 74 2c 20 6e 43 6f 6c 75 6d 6e 29  >iSdst, nColumn)
8a20: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
8a30: 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69  3ExprCacheAffini
8a40: 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c  tyChange(pParse,
8a50: 20 70 44 65 73 74 2d 3e 69 53 64 73 74 2c 20 6e   pDest->iSdst, n
8a60: 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 7d  Column);.      }
8a70: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
8a80: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
8a90: 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 70 44 65  v, OP_Yield, pDe
8aa0: 73 74 2d 3e 69 53 44 50 61 72 6d 29 3b 0a 20 20  st->iSDParm);.  
8ab0: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
8ac0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  k;.    }.  }.  s
8ad0: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
8ae0: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
8af0: 52 6f 77 29 3b 0a 20 20 73 71 6c 69 74 65 33 52  Row);.  sqlite3R
8b00: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
8b10: 61 72 73 65 2c 20 72 65 67 52 6f 77 69 64 29 3b  arse, regRowid);
8b20: 0a 0a 20 20 2f 2a 20 54 68 65 20 62 6f 74 74 6f  ..  /* The botto
8b30: 6d 20 6f 66 20 74 68 65 20 6c 6f 6f 70 0a 20 20  m of the loop.  
8b40: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
8b50: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
8b60: 61 64 64 72 43 6f 6e 74 69 6e 75 65 29 3b 0a 20  addrContinue);. 
8b70: 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73   if( p->selFlags
8b80: 20 26 20 53 46 5f 55 73 65 53 6f 72 74 65 72 20   & SF_UseSorter 
8b90: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
8ba0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
8bb0: 6f 72 74 65 72 4e 65 78 74 2c 20 69 54 61 62 2c  orterNext, iTab,
8bc0: 20 61 64 64 72 29 3b 0a 20 20 7d 65 6c 73 65 7b   addr);.  }else{
8bd0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
8be0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78  AddOp2(v, OP_Nex
8bf0: 74 2c 20 69 54 61 62 2c 20 61 64 64 72 29 3b 0a  t, iTab, addr);.
8c00: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
8c10: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
8c20: 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20 20 69   addrBreak);.  i
8c30: 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75  f( eDest==SRT_Ou
8c40: 74 70 75 74 20 7c 7c 20 65 44 65 73 74 3d 3d 53  tput || eDest==S
8c50: 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a  RT_Coroutine ){.
8c60: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
8c70: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73  ddOp2(v, OP_Clos
8c80: 65 2c 20 70 73 65 75 64 6f 54 61 62 2c 20 30 29  e, pseudoTab, 0)
8c90: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
8ca0: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
8cb0: 74 6f 20 61 20 73 74 72 69 6e 67 20 63 6f 6e 74  to a string cont
8cc0: 61 69 6e 69 6e 67 20 74 68 65 20 27 64 65 63 6c  aining the 'decl
8cd0: 61 72 61 74 69 6f 6e 20 74 79 70 65 27 20 6f 66  aration type' of
8ce0: 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69   the.** expressi
8cf0: 6f 6e 20 70 45 78 70 72 2e 20 54 68 65 20 73 74  on pExpr. The st
8d00: 72 69 6e 67 20 6d 61 79 20 62 65 20 74 72 65 61  ring may be trea
8d10: 74 65 64 20 61 73 20 73 74 61 74 69 63 20 62 79  ted as static by
8d20: 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a   the caller..**.
8d30: 2a 2a 20 54 68 65 20 64 65 63 6c 61 72 61 74 69  ** The declarati
8d40: 6f 6e 20 74 79 70 65 20 69 73 20 74 68 65 20 65  on type is the e
8d50: 78 61 63 74 20 64 61 74 61 74 79 70 65 20 64 65  xact datatype de
8d60: 66 69 6e 69 74 69 6f 6e 20 65 78 74 72 61 63 74  finition extract
8d70: 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 6f  ed from the.** o
8d80: 72 69 67 69 6e 61 6c 20 43 52 45 41 54 45 20 54  riginal CREATE T
8d90: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 69  ABLE statement i
8da0: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
8db0: 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 54 68   is a column. Th
8dc0: 65 0a 2a 2a 20 64 65 63 6c 61 72 61 74 69 6f 6e  e.** declaration
8dd0: 20 74 79 70 65 20 66 6f 72 20 61 20 52 4f 57 49   type for a ROWI
8de0: 44 20 66 69 65 6c 64 20 69 73 20 49 4e 54 45 47  D field is INTEG
8df0: 45 52 2e 20 45 78 61 63 74 6c 79 20 77 68 65 6e  ER. Exactly when
8e00: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a   an expression.*
8e10: 2a 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20  * is considered 
8e20: 61 20 63 6f 6c 75 6d 6e 20 63 61 6e 20 62 65 20  a column can be 
8e30: 63 6f 6d 70 6c 65 78 20 69 6e 20 74 68 65 20 70  complex in the p
8e40: 72 65 73 65 6e 63 65 20 6f 66 20 73 75 62 71 75  resence of subqu
8e50: 65 72 69 65 73 2e 20 54 68 65 0a 2a 2a 20 72 65  eries. The.** re
8e60: 73 75 6c 74 2d 73 65 74 20 65 78 70 72 65 73 73  sult-set express
8e70: 69 6f 6e 20 69 6e 20 61 6c 6c 20 6f 66 20 74 68  ion in all of th
8e80: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 53 45 4c 45  e following SELE
8e90: 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 69 73  CT statements is
8ea0: 20 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 20   .** considered 
8eb0: 61 20 63 6f 6c 75 6d 6e 20 62 79 20 74 68 69 73  a column by this
8ec0: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   function..**.**
8ed0: 20 20 20 53 45 4c 45 43 54 20 63 6f 6c 20 46 52     SELECT col FR
8ee0: 4f 4d 20 74 62 6c 3b 0a 2a 2a 20 20 20 53 45 4c  OM tbl;.**   SEL
8ef0: 45 43 54 20 28 53 45 4c 45 43 54 20 63 6f 6c 20  ECT (SELECT col 
8f00: 46 52 4f 4d 20 74 62 6c 3b 0a 2a 2a 20 20 20 53  FROM tbl;.**   S
8f10: 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20 63 6f  ELECT (SELECT co
8f20: 6c 20 46 52 4f 4d 20 74 62 6c 29 3b 0a 2a 2a 20  l FROM tbl);.** 
8f30: 20 20 53 45 4c 45 43 54 20 61 62 63 20 46 52 4f    SELECT abc FRO
8f40: 4d 20 28 53 45 4c 45 43 54 20 63 6f 6c 20 41 53  M (SELECT col AS
8f50: 20 61 62 63 20 46 52 4f 4d 20 74 62 6c 29 3b 0a   abc FROM tbl);.
8f60: 2a 2a 20 0a 2a 2a 20 54 68 65 20 64 65 63 6c 61  ** .** The decla
8f70: 72 61 74 69 6f 6e 20 74 79 70 65 20 66 6f 72 20  ration type for 
8f80: 61 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20 6f  any expression o
8f90: 74 68 65 72 20 74 68 61 6e 20 61 20 63 6f 6c 75  ther than a colu
8fa0: 6d 6e 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73  mn is NULL..*/.s
8fb0: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
8fc0: 20 2a 63 6f 6c 75 6d 6e 54 79 70 65 28 0a 20 20   *columnType(.  
8fd0: 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43  NameContext *pNC
8fe0: 2c 20 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  , .  Expr *pExpr
8ff0: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
9000: 2a 70 7a 4f 72 69 67 69 6e 44 62 2c 0a 20 20 63  *pzOriginDb,.  c
9010: 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f 72  onst char **pzOr
9020: 69 67 69 6e 54 61 62 2c 0a 20 20 63 6f 6e 73 74  iginTab,.  const
9030: 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67 69 6e   char **pzOrigin
9040: 43 6f 6c 0a 29 7b 0a 20 20 63 68 61 72 20 63 6f  Col.){.  char co
9050: 6e 73 74 20 2a 7a 54 79 70 65 20 3d 20 30 3b 0a  nst *zType = 0;.
9060: 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f    char const *zO
9070: 72 69 67 69 6e 44 62 20 3d 20 30 3b 0a 20 20 63  riginDb = 0;.  c
9080: 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67  har const *zOrig
9090: 69 6e 54 61 62 20 3d 20 30 3b 0a 20 20 63 68 61  inTab = 0;.  cha
90a0: 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67 69 6e  r const *zOrigin
90b0: 43 6f 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6a  Col = 0;.  int j
90c0: 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 45  ;.  if( NEVER(pE
90d0: 78 70 72 3d 3d 30 29 20 7c 7c 20 70 4e 43 2d 3e  xpr==0) || pNC->
90e0: 70 53 72 63 4c 69 73 74 3d 3d 30 20 29 20 72 65  pSrcList==0 ) re
90f0: 74 75 72 6e 20 30 3b 0a 0a 20 20 73 77 69 74 63  turn 0;..  switc
9100: 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a  h( pExpr->op ){.
9110: 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f      case TK_AGG_
9120: 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65  COLUMN:.    case
9130: 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20   TK_COLUMN: {.  
9140: 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65      /* The expre
9150: 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d  ssion is a colum
9160: 6e 2e 20 4c 6f 63 61 74 65 20 74 68 65 20 74 61  n. Locate the ta
9170: 62 6c 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69  ble the column i
9180: 73 20 62 65 69 6e 67 0a 20 20 20 20 20 20 2a 2a  s being.      **
9190: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
91a0: 69 6e 20 4e 61 6d 65 43 6f 6e 74 65 78 74 2e 70  in NameContext.p
91b0: 53 72 63 4c 69 73 74 2e 20 54 68 69 73 20 74 61  SrcList. This ta
91c0: 62 6c 65 20 6d 61 79 20 62 65 20 72 65 61 6c 0a  ble may be real.
91d0: 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73        ** databas
91e0: 65 20 74 61 62 6c 65 20 6f 72 20 61 20 73 75 62  e table or a sub
91f0: 71 75 65 72 79 2e 0a 20 20 20 20 20 20 2a 2f 0a  query..      */.
9200: 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61        Table *pTa
9210: 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  b = 0;          
9220: 20 20 2f 2a 20 54 61 62 6c 65 20 73 74 72 75 63    /* Table struc
9230: 74 75 72 65 20 63 6f 6c 75 6d 6e 20 69 73 20 65  ture column is e
9240: 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 2a 2f  xtracted from */
9250: 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70  .      Select *p
9260: 53 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  S = 0;          
9270: 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 74 68 65     /* Select the
9280: 20 63 6f 6c 75 6d 6e 20 69 73 20 65 78 74 72 61   column is extra
9290: 63 74 65 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 20  cted from */.   
92a0: 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 45     int iCol = pE
92b0: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 20 20 2f  xpr->iColumn;  /
92c0: 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d  * Index of colum
92d0: 6e 20 69 6e 20 70 54 61 62 20 2a 2f 0a 20 20 20  n in pTab */.   
92e0: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
92f0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43  pr->op==TK_AGG_C
9300: 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 74  OLUMN );.      t
9310: 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
9320: 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b  op==TK_COLUMN );
9330: 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 4e  .      while( pN
9340: 43 20 26 26 20 21 70 54 61 62 20 29 7b 0a 20 20  C && !pTab ){.  
9350: 20 20 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70        SrcList *p
9360: 54 61 62 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70  TabList = pNC->p
9370: 53 72 63 4c 69 73 74 3b 0a 20 20 20 20 20 20 20  SrcList;.       
9380: 20 66 6f 72 28 6a 3d 30 3b 6a 3c 70 54 61 62 4c   for(j=0;j<pTabL
9390: 69 73 74 2d 3e 6e 53 72 63 20 26 26 20 70 54 61  ist->nSrc && pTa
93a0: 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72  bList->a[j].iCur
93b0: 73 6f 72 21 3d 70 45 78 70 72 2d 3e 69 54 61 62  sor!=pExpr->iTab
93c0: 6c 65 3b 6a 2b 2b 29 3b 0a 20 20 20 20 20 20 20  le;j++);.       
93d0: 20 69 66 28 20 6a 3c 70 54 61 62 4c 69 73 74 2d   if( j<pTabList-
93e0: 3e 6e 53 72 63 20 29 7b 0a 20 20 20 20 20 20 20  >nSrc ){.       
93f0: 20 20 20 70 54 61 62 20 3d 20 70 54 61 62 4c 69     pTab = pTabLi
9400: 73 74 2d 3e 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20  st->a[j].pTab;. 
9410: 20 20 20 20 20 20 20 20 20 70 53 20 3d 20 70 54           pS = pT
9420: 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 53 65  abList->a[j].pSe
9430: 6c 65 63 74 3b 0a 20 20 20 20 20 20 20 20 7d 65  lect;.        }e
9440: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70  lse{.          p
9450: 4e 43 20 3d 20 70 4e 43 2d 3e 70 4e 65 78 74 3b  NC = pNC->pNext;
9460: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
9470: 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 70 54   }..      if( pT
9480: 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ab==0 ){.       
9490: 20 2f 2a 20 41 74 20 6f 6e 65 20 74 69 6d 65 2c   /* At one time,
94a0: 20 63 6f 64 65 20 73 75 63 68 20 61 73 20 22 53   code such as "S
94b0: 45 4c 45 43 54 20 6e 65 77 2e 78 22 20 77 69 74  ELECT new.x" wit
94c0: 68 69 6e 20 61 20 74 72 69 67 67 65 72 20 77 6f  hin a trigger wo
94d0: 75 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 63  uld.        ** c
94e0: 61 75 73 65 20 74 68 69 73 20 63 6f 6e 64 69 74  ause this condit
94f0: 69 6f 6e 20 74 6f 20 72 75 6e 2e 20 20 53 69 6e  ion to run.  Sin
9500: 63 65 20 74 68 65 6e 2c 20 77 65 20 68 61 76 65  ce then, we have
9510: 20 72 65 73 74 72 75 63 74 75 72 65 64 20 68 6f   restructured ho
9520: 77 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72 69  w.        ** tri
9530: 67 67 65 72 20 63 6f 64 65 20 69 73 20 67 65 6e  gger code is gen
9540: 65 72 61 74 65 64 20 61 6e 64 20 73 6f 20 74 68  erated and so th
9550: 69 73 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20  is condition is 
9560: 6e 6f 20 6c 6f 6e 67 65 72 20 0a 20 20 20 20 20  no longer .     
9570: 20 20 20 2a 2a 20 70 6f 73 73 69 62 6c 65 2e 20     ** possible. 
9580: 48 6f 77 65 76 65 72 2c 20 69 74 20 63 61 6e 20  However, it can 
9590: 73 74 69 6c 6c 20 62 65 20 74 72 75 65 20 66 6f  still be true fo
95a0: 72 20 73 74 61 74 65 6d 65 6e 74 73 20 6c 69 6b  r statements lik
95b0: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  e.        ** the
95c0: 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20 20 20   following:.    
95d0: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
95e0: 2a 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45  *   CREATE TABLE
95f0: 20 74 31 28 63 6f 6c 20 49 4e 54 45 47 45 52 29   t1(col INTEGER)
9600: 3b 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 53  ;.        **   S
9610: 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20 74 31  ELECT (SELECT t1
9620: 2e 63 6f 6c 29 20 46 52 4f 4d 20 46 52 4f 4d 20  .col) FROM FROM 
9630: 74 31 3b 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  t1;.        **. 
9640: 20 20 20 20 20 20 20 2a 2a 20 77 68 65 6e 20 63         ** when c
9650: 6f 6c 75 6d 6e 54 79 70 65 28 29 20 69 73 20 63  olumnType() is c
9660: 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 65 78 70  alled on the exp
9670: 72 65 73 73 69 6f 6e 20 22 74 31 2e 63 6f 6c 22  ression "t1.col"
9680: 20 69 6e 20 74 68 65 20 0a 20 20 20 20 20 20 20   in the .       
9690: 20 2a 2a 20 73 75 62 2d 73 65 6c 65 63 74 2e 20   ** sub-select. 
96a0: 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 73 65  In this case, se
96b0: 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 79 70  t the column typ
96c0: 65 20 74 6f 20 4e 55 4c 4c 2c 20 65 76 65 6e 0a  e to NULL, even.
96d0: 20 20 20 20 20 20 20 20 2a 2a 20 74 68 6f 75 67          ** thoug
96e0: 68 20 69 74 20 73 68 6f 75 6c 64 20 72 65 61 6c  h it should real
96f0: 6c 79 20 62 65 20 22 49 4e 54 45 47 45 52 22 2e  ly be "INTEGER".
9700: 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
9710: 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 6e      ** This is n
9720: 6f 74 20 61 20 70 72 6f 62 6c 65 6d 2c 20 61 73  ot a problem, as
9730: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 79 70 65   the column type
9740: 20 6f 66 20 22 74 31 2e 63 6f 6c 22 20 69 73 20   of "t1.col" is 
9750: 6e 65 76 65 72 0a 20 20 20 20 20 20 20 20 2a 2a  never.        **
9760: 20 75 73 65 64 2e 20 57 68 65 6e 20 63 6f 6c 75   used. When colu
9770: 6d 6e 54 79 70 65 28 29 20 69 73 20 63 61 6c 6c  mnType() is call
9780: 65 64 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73  ed on the expres
9790: 73 69 6f 6e 20 0a 20 20 20 20 20 20 20 20 2a 2a  sion .        **
97a0: 20 22 28 53 45 4c 45 43 54 20 74 31 2e 63 6f 6c   "(SELECT t1.col
97b0: 29 22 2c 20 74 68 65 20 63 6f 72 72 65 63 74 20  )", the correct 
97c0: 74 79 70 65 20 69 73 20 72 65 74 75 72 6e 65 64  type is returned
97d0: 20 28 73 65 65 20 74 68 65 20 54 4b 5f 53 45 4c   (see the TK_SEL
97e0: 45 43 54 0a 20 20 20 20 20 20 20 20 2a 2a 20 62  ECT.        ** b
97f0: 72 61 6e 63 68 20 62 65 6c 6f 77 2e 20 20 2a 2f  ranch below.  */
9800: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
9810: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61        }..      a
9820: 73 73 65 72 74 28 20 70 54 61 62 20 26 26 20 70  ssert( pTab && p
9830: 45 78 70 72 2d 3e 70 54 61 62 3d 3d 70 54 61 62  Expr->pTab==pTab
9840: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53   );.      if( pS
9850: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
9860: 68 65 20 22 74 61 62 6c 65 22 20 69 73 20 61 63  he "table" is ac
9870: 74 75 61 6c 6c 79 20 61 20 73 75 62 2d 73 65 6c  tually a sub-sel
9880: 65 63 74 20 6f 72 20 61 20 76 69 65 77 20 69 6e  ect or a view in
9890: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
98a0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74  .        ** of t
98b0: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
98c0: 65 6e 74 2e 20 52 65 74 75 72 6e 20 74 68 65 20  ent. Return the 
98d0: 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65  declaration type
98e0: 20 61 6e 64 20 6f 72 69 67 69 6e 0a 20 20 20 20   and origin.    
98f0: 20 20 20 20 2a 2a 20 64 61 74 61 20 66 6f 72 20      ** data for 
9900: 74 68 65 20 72 65 73 75 6c 74 2d 73 65 74 20 63  the result-set c
9910: 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 73 75 62  olumn of the sub
9920: 2d 73 65 6c 65 63 74 2e 0a 20 20 20 20 20 20 20  -select..       
9930: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
9940: 69 43 6f 6c 3e 3d 30 20 26 26 20 41 4c 57 41 59  iCol>=0 && ALWAY
9950: 53 28 69 43 6f 6c 3c 70 53 2d 3e 70 45 4c 69 73  S(iCol<pS->pELis
9960: 74 2d 3e 6e 45 78 70 72 29 20 29 7b 0a 20 20 20  t->nExpr) ){.   
9970: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 69 43 6f         /* If iCo
9980: 6c 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a  l is less than z
9990: 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 65 78  ero, then the ex
99a0: 70 72 65 73 73 69 6f 6e 20 72 65 71 75 65 73 74  pression request
99b0: 73 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20  s the.          
99c0: 2a 2a 20 72 6f 77 69 64 20 6f 66 20 74 68 65 20  ** rowid of the 
99d0: 73 75 62 2d 73 65 6c 65 63 74 20 6f 72 20 76 69  sub-select or vi
99e0: 65 77 2e 20 54 68 69 73 20 65 78 70 72 65 73 73  ew. This express
99f0: 69 6f 6e 20 69 73 20 6c 65 67 61 6c 20 28 73 65  ion is legal (se
9a00: 65 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  e .          ** 
9a10: 74 65 73 74 20 63 61 73 65 20 6d 69 73 63 32 2e  test case misc2.
9a20: 32 2e 32 29 20 2d 20 69 74 20 61 6c 77 61 79 73  2.2) - it always
9a30: 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20 4e 55   evaluates to NU
9a40: 4c 4c 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  LL..          */
9a50: 0a 20 20 20 20 20 20 20 20 20 20 4e 61 6d 65 43  .          NameC
9a60: 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20 20 20  ontext sNC;.    
9a70: 20 20 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20        Expr *p = 
9a80: 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 43  pS->pEList->a[iC
9a90: 6f 6c 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  ol].pExpr;.     
9aa0: 20 20 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73       sNC.pSrcLis
9ab0: 74 20 3d 20 70 53 2d 3e 70 53 72 63 3b 0a 20 20  t = pS->pSrc;.  
9ac0: 20 20 20 20 20 20 20 20 73 4e 43 2e 70 4e 65 78          sNC.pNex
9ad0: 74 20 3d 20 70 4e 43 3b 0a 20 20 20 20 20 20 20  t = pNC;.       
9ae0: 20 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20     sNC.pParse = 
9af0: 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20  pNC->pParse;.   
9b00: 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 63         zType = c
9b10: 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20  olumnType(&sNC, 
9b20: 70 2c 20 26 7a 4f 72 69 67 69 6e 44 62 2c 20 26  p, &zOriginDb, &
9b30: 7a 4f 72 69 67 69 6e 54 61 62 2c 20 26 7a 4f 72  zOriginTab, &zOr
9b40: 69 67 69 6e 43 6f 6c 29 3b 20 0a 20 20 20 20 20  iginCol); .     
9b50: 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
9b60: 20 69 66 28 20 41 4c 57 41 59 53 28 70 54 61 62   if( ALWAYS(pTab
9b70: 2d 3e 70 53 63 68 65 6d 61 29 20 29 7b 0a 20 20  ->pSchema) ){.  
9b80: 20 20 20 20 20 20 2f 2a 20 41 20 72 65 61 6c 20        /* A real 
9b90: 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20  table */.       
9ba0: 20 61 73 73 65 72 74 28 20 21 70 53 20 29 3b 0a   assert( !pS );.
9bb0: 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c          if( iCol
9bc0: 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70 54 61 62  <0 ) iCol = pTab
9bd0: 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 20  ->iPKey;.       
9be0: 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d 2d   assert( iCol==-
9bf0: 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20 26 26  1 || (iCol>=0 &&
9c00: 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c   iCol<pTab->nCol
9c10: 29 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ) );.        if(
9c20: 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20   iCol<0 ){.     
9c30: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 49 4e       zType = "IN
9c40: 54 45 47 45 52 22 3b 0a 20 20 20 20 20 20 20 20  TEGER";.        
9c50: 20 20 7a 4f 72 69 67 69 6e 43 6f 6c 20 3d 20 22    zOriginCol = "
9c60: 72 6f 77 69 64 22 3b 0a 20 20 20 20 20 20 20 20  rowid";.        
9c70: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
9c80: 20 7a 54 79 70 65 20 3d 20 70 54 61 62 2d 3e 61   zType = pTab->a
9c90: 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b  Col[iCol].zType;
9ca0: 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 72 69 67  .          zOrig
9cb0: 69 6e 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43  inCol = pTab->aC
9cc0: 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a  ol[iCol].zName;.
9cd0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
9ce0: 20 20 7a 4f 72 69 67 69 6e 54 61 62 20 3d 20 70    zOriginTab = p
9cf0: 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20  Tab->zName;.    
9d00: 20 20 20 20 69 66 28 20 70 4e 43 2d 3e 70 50 61      if( pNC->pPa
9d10: 72 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  rse ){.         
9d20: 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74   int iDb = sqlit
9d30: 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
9d40: 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2c  pNC->pParse->db,
9d50: 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b   pTab->pSchema);
9d60: 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 72 69 67  .          zOrig
9d70: 69 6e 44 62 20 3d 20 70 4e 43 2d 3e 70 50 61 72  inDb = pNC->pPar
9d80: 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d  se->db->aDb[iDb]
9d90: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  .zName;.        
9da0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
9db0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66  break;.    }.#if
9dc0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
9dd0: 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 63 61  _SUBQUERY.    ca
9de0: 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a  se TK_SELECT: {.
9df0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70        /* The exp
9e00: 72 65 73 73 69 6f 6e 20 69 73 20 61 20 73 75 62  ression is a sub
9e10: 2d 73 65 6c 65 63 74 2e 20 52 65 74 75 72 6e 20  -select. Return 
9e20: 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  the declaration 
9e30: 74 79 70 65 20 61 6e 64 0a 20 20 20 20 20 20 2a  type and.      *
9e40: 2a 20 6f 72 69 67 69 6e 20 69 6e 66 6f 20 66 6f  * origin info fo
9e50: 72 20 74 68 65 20 73 69 6e 67 6c 65 20 63 6f 6c  r the single col
9e60: 75 6d 6e 20 69 6e 20 74 68 65 20 72 65 73 75 6c  umn in the resul
9e70: 74 20 73 65 74 20 6f 66 20 74 68 65 20 53 45 4c  t set of the SEL
9e80: 45 43 54 0a 20 20 20 20 20 20 2a 2a 20 73 74 61  ECT.      ** sta
9e90: 74 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f  tement..      */
9ea0: 0a 20 20 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65  .      NameConte
9eb0: 78 74 20 73 4e 43 3b 0a 20 20 20 20 20 20 53 65  xt sNC;.      Se
9ec0: 6c 65 63 74 20 2a 70 53 20 3d 20 70 45 78 70 72  lect *pS = pExpr
9ed0: 2d 3e 78 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20  ->x.pSelect;.   
9ee0: 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70 53 2d     Expr *p = pS-
9ef0: 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  >pEList->a[0].pE
9f00: 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72  xpr;.      asser
9f10: 74 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  t( ExprHasProper
9f20: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73  ty(pExpr, EP_xIs
9f30: 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20  Select) );.     
9f40: 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20   sNC.pSrcList = 
9f50: 70 53 2d 3e 70 53 72 63 3b 0a 20 20 20 20 20 20  pS->pSrc;.      
9f60: 73 4e 43 2e 70 4e 65 78 74 20 3d 20 70 4e 43 3b  sNC.pNext = pNC;
9f70: 0a 20 20 20 20 20 20 73 4e 43 2e 70 50 61 72 73  .      sNC.pPars
9f80: 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b  e = pNC->pParse;
9f90: 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 63  .      zType = c
9fa0: 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20  olumnType(&sNC, 
9fb0: 70 2c 20 26 7a 4f 72 69 67 69 6e 44 62 2c 20 26  p, &zOriginDb, &
9fc0: 7a 4f 72 69 67 69 6e 54 61 62 2c 20 26 7a 4f 72  zOriginTab, &zOr
9fd0: 69 67 69 6e 43 6f 6c 29 3b 20 0a 20 20 20 20 20  iginCol); .     
9fe0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
9ff0: 6e 64 69 66 0a 20 20 7d 0a 20 20 0a 20 20 69 66  ndif.  }.  .  if
a000: 28 20 70 7a 4f 72 69 67 69 6e 44 62 20 29 7b 0a  ( pzOriginDb ){.
a010: 20 20 20 20 61 73 73 65 72 74 28 20 70 7a 4f 72      assert( pzOr
a020: 69 67 69 6e 54 61 62 20 26 26 20 70 7a 4f 72 69  iginTab && pzOri
a030: 67 69 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 2a 70  ginCol );.    *p
a040: 7a 4f 72 69 67 69 6e 44 62 20 3d 20 7a 4f 72 69  zOriginDb = zOri
a050: 67 69 6e 44 62 3b 0a 20 20 20 20 2a 70 7a 4f 72  ginDb;.    *pzOr
a060: 69 67 69 6e 54 61 62 20 3d 20 7a 4f 72 69 67 69  iginTab = zOrigi
a070: 6e 54 61 62 3b 0a 20 20 20 20 2a 70 7a 4f 72 69  nTab;.    *pzOri
a080: 67 69 6e 43 6f 6c 20 3d 20 7a 4f 72 69 67 69 6e  ginCol = zOrigin
a090: 43 6f 6c 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  Col;.  }.  retur
a0a0: 6e 20 7a 54 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  n zType;.}../*.*
a0b0: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
a0c0: 74 68 61 74 20 77 69 6c 6c 20 74 65 6c 6c 20 74  that will tell t
a0d0: 68 65 20 56 44 42 45 20 74 68 65 20 64 65 63 6c  he VDBE the decl
a0e0: 61 72 61 74 69 6f 6e 20 74 79 70 65 73 20 6f 66  aration types of
a0f0: 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74   columns.** in t
a100: 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 0a 2a  he result set..*
a110: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 65  /.static void ge
a120: 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65  nerateColumnType
a130: 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  s(.  Parse *pPar
a140: 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73  se,      /* Pars
a150: 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
a160: 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
a170: 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74  t,  /* List of t
a180: 61 62 6c 65 73 20 2a 2f 0a 20 20 45 78 70 72 4c  ables */.  ExprL
a190: 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20 2f  ist *pEList    /
a1a0: 2a 20 45 78 70 72 65 73 73 69 6f 6e 73 20 64 65  * Expressions de
a1b0: 66 69 6e 69 6e 67 20 74 68 65 20 72 65 73 75 6c  fining the resul
a1c0: 74 20 73 65 74 20 2a 2f 0a 29 7b 0a 23 69 66 6e  t set */.){.#ifn
a1d0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
a1e0: 44 45 43 4c 54 59 50 45 0a 20 20 56 64 62 65 20  DECLTYPE.  Vdbe 
a1f0: 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
a200: 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4e  be;.  int i;.  N
a210: 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a  ameContext sNC;.
a220: 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d    sNC.pSrcList =
a230: 20 70 54 61 62 4c 69 73 74 3b 0a 20 20 73 4e 43   pTabList;.  sNC
a240: 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65  .pParse = pParse
a250: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
a260: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  EList->nExpr; i+
a270: 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 20  +){.    Expr *p 
a280: 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  = pEList->a[i].p
a290: 45 78 70 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20  Expr;.    const 
a2a0: 63 68 61 72 20 2a 7a 54 79 70 65 3b 0a 23 69 66  char *zType;.#if
a2b0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
a2c0: 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54  E_COLUMN_METADAT
a2d0: 41 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  A.    const char
a2e0: 20 2a 7a 4f 72 69 67 44 62 20 3d 20 30 3b 0a 20   *zOrigDb = 0;. 
a2f0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
a300: 4f 72 69 67 54 61 62 20 3d 20 30 3b 0a 20 20 20  OrigTab = 0;.   
a310: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72   const char *zOr
a320: 69 67 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 7a  igCol = 0;.    z
a330: 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70  Type = columnTyp
a340: 65 28 26 73 4e 43 2c 20 70 2c 20 26 7a 4f 72 69  e(&sNC, p, &zOri
a350: 67 44 62 2c 20 26 7a 4f 72 69 67 54 61 62 2c 20  gDb, &zOrigTab, 
a360: 26 7a 4f 72 69 67 43 6f 6c 29 3b 0a 0a 20 20 20  &zOrigCol);..   
a370: 20 2f 2a 20 54 68 65 20 76 64 62 65 20 6d 75 73   /* The vdbe mus
a380: 74 20 6d 61 6b 65 20 69 74 73 20 6f 77 6e 20 63  t make its own c
a390: 6f 70 79 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  opy of the colum
a3a0: 6e 2d 74 79 70 65 20 61 6e 64 20 6f 74 68 65 72  n-type and other
a3b0: 20 0a 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20   .    ** column 
a3c0: 73 70 65 63 69 66 69 63 20 73 74 72 69 6e 67 73  specific strings
a3d0: 2c 20 69 6e 20 63 61 73 65 20 74 68 65 20 73 63  , in case the sc
a3e0: 68 65 6d 61 20 69 73 20 72 65 73 65 74 20 62 65  hema is reset be
a3f0: 66 6f 72 65 20 74 68 69 73 0a 20 20 20 20 2a 2a  fore this.    **
a400: 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
a410: 20 69 73 20 64 65 6c 65 74 65 64 2e 0a 20 20 20   is deleted..   
a420: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56   */.    sqlite3V
a430: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
a440: 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 44 41 54 41   i, COLNAME_DATA
a450: 42 41 53 45 2c 20 7a 4f 72 69 67 44 62 2c 20 53  BASE, zOrigDb, S
a460: 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
a470: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
a480: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69  eSetColName(v, i
a490: 2c 20 43 4f 4c 4e 41 4d 45 5f 54 41 42 4c 45 2c  , COLNAME_TABLE,
a4a0: 20 7a 4f 72 69 67 54 61 62 2c 20 53 51 4c 49 54   zOrigTab, SQLIT
a4b0: 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
a4c0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
a4d0: 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f  ColName(v, i, CO
a4e0: 4c 4e 41 4d 45 5f 43 4f 4c 55 4d 4e 2c 20 7a 4f  LNAME_COLUMN, zO
a4f0: 72 69 67 43 6f 6c 2c 20 53 51 4c 49 54 45 5f 54  rigCol, SQLITE_T
a500: 52 41 4e 53 49 45 4e 54 29 3b 0a 23 65 6c 73 65  RANSIENT);.#else
a510: 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c  .    zType = col
a520: 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c  umnType(&sNC, p,
a530: 20 30 2c 20 30 2c 20 30 29 3b 0a 23 65 6e 64 69   0, 0, 0);.#endi
a540: 66 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  f.    sqlite3Vdb
a550: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69  eSetColName(v, i
a560: 2c 20 43 4f 4c 4e 41 4d 45 5f 44 45 43 4c 54 59  , COLNAME_DECLTY
a570: 50 45 2c 20 7a 54 79 70 65 2c 20 53 51 4c 49 54  PE, zType, SQLIT
a580: 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
a590: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
a5a0: 54 45 5f 4f 4d 49 54 5f 44 45 43 4c 54 59 50 45  TE_OMIT_DECLTYPE
a5b0: 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e   */.}../*.** Gen
a5c0: 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
a5d0: 77 69 6c 6c 20 74 65 6c 6c 20 74 68 65 20 56 44  will tell the VD
a5e0: 42 45 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20  BE the names of 
a5f0: 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68  columns.** in th
a600: 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20 20 54  e result set.  T
a610: 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  his information 
a620: 69 73 20 75 73 65 64 20 74 6f 20 70 72 6f 76 69  is used to provi
a630: 64 65 20 74 68 65 0a 2a 2a 20 61 7a 43 6f 6c 5b  de the.** azCol[
a640: 5d 20 76 61 6c 75 65 73 20 69 6e 20 74 68 65 20  ] values in the 
a650: 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61  callback..*/.sta
a660: 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74  tic void generat
a670: 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 0a 20 20  eColumnNames(.  
a680: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
a690: 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f      /* Parser co
a6a0: 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69  ntext */.  SrcLi
a6b0: 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 2f  st *pTabList,  /
a6c0: 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73  * List of tables
a6d0: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
a6e0: 70 45 4c 69 73 74 20 20 20 20 2f 2a 20 45 78 70  pEList    /* Exp
a6f0: 72 65 73 73 69 6f 6e 73 20 64 65 66 69 6e 69 6e  ressions definin
a700: 67 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  g the result set
a710: 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76   */.){.  Vdbe *v
a720: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
a730: 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  ;.  int i, j;.  
a740: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
a750: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20  arse->db;.  int 
a760: 66 75 6c 6c 4e 61 6d 65 73 2c 20 73 68 6f 72 74  fullNames, short
a770: 4e 61 6d 65 73 3b 0a 0a 23 69 66 6e 64 65 66 20  Names;..#ifndef 
a780: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
a790: 41 49 4e 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  AIN.  /* If this
a7a0: 20 69 73 20 61 6e 20 45 58 50 4c 41 49 4e 2c 20   is an EXPLAIN, 
a7b0: 73 6b 69 70 20 74 68 69 73 20 73 74 65 70 20 2a  skip this step *
a7c0: 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  /.  if( pParse->
a7d0: 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 72  explain ){.    r
a7e0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69  eturn;.  }.#endi
a7f0: 66 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  f..  if( pParse-
a800: 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 7c 7c 20  >colNamesSet || 
a810: 4e 45 56 45 52 28 76 3d 3d 30 29 20 7c 7c 20 64  NEVER(v==0) || d
a820: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
a830: 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 50 61 72  ) return;.  pPar
a840: 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20  se->colNamesSet 
a850: 3d 20 31 3b 0a 20 20 66 75 6c 6c 4e 61 6d 65 73  = 1;.  fullNames
a860: 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20   = (db->flags & 
a870: 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61  SQLITE_FullColNa
a880: 6d 65 73 29 21 3d 30 3b 0a 20 20 73 68 6f 72 74  mes)!=0;.  short
a890: 4e 61 6d 65 73 20 3d 20 28 64 62 2d 3e 66 6c 61  Names = (db->fla
a8a0: 67 73 20 26 20 53 51 4c 49 54 45 5f 53 68 6f 72  gs & SQLITE_Shor
a8b0: 74 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a 20  tColNames)!=0;. 
a8c0: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e   sqlite3VdbeSetN
a8d0: 75 6d 43 6f 6c 73 28 76 2c 20 70 45 4c 69 73 74  umCols(v, pEList
a8e0: 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 66 6f 72 28  ->nExpr);.  for(
a8f0: 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e  i=0; i<pEList->n
a900: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
a910: 45 78 70 72 20 2a 70 3b 0a 20 20 20 20 70 20 3d  Expr *p;.    p =
a920: 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45   pEList->a[i].pE
a930: 78 70 72 3b 0a 20 20 20 20 69 66 28 20 4e 45 56  xpr;.    if( NEV
a940: 45 52 28 70 3d 3d 30 29 20 29 20 63 6f 6e 74 69  ER(p==0) ) conti
a950: 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 45 4c  nue;.    if( pEL
a960: 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20  ist->a[i].zName 
a970: 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  ){.      char *z
a980: 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61  Name = pEList->a
a990: 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  [i].zName;.     
a9a0: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
a9b0: 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c  olName(v, i, COL
a9c0: 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65  NAME_NAME, zName
a9d0: 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
a9e0: 4e 54 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  NT);.    }else i
a9f0: 66 28 20 28 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  f( (p->op==TK_CO
aa00: 4c 55 4d 4e 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54  LUMN || p->op==T
aa10: 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 29 20 26 26  K_AGG_COLUMN) &&
aa20: 20 70 54 61 62 4c 69 73 74 20 29 7b 0a 20 20 20   pTabList ){.   
aa30: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a     Table *pTab;.
aa40: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c        char *zCol
aa50: 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c  ;.      int iCol
aa60: 20 3d 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20   = p->iColumn;. 
aa70: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 41 4c       for(j=0; AL
aa80: 57 41 59 53 28 6a 3c 70 54 61 62 4c 69 73 74 2d  WAYS(j<pTabList-
aa90: 3e 6e 53 72 63 29 3b 20 6a 2b 2b 29 7b 0a 20 20  >nSrc); j++){.  
aaa0: 20 20 20 20 20 20 69 66 28 20 70 54 61 62 4c 69        if( pTabLi
aab0: 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f 72  st->a[j].iCursor
aac0: 3d 3d 70 2d 3e 69 54 61 62 6c 65 20 29 20 62 72  ==p->iTable ) br
aad0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
aae0: 20 20 20 61 73 73 65 72 74 28 20 6a 3c 70 54 61     assert( j<pTa
aaf0: 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 3b 0a 20  bList->nSrc );. 
ab00: 20 20 20 20 20 70 54 61 62 20 3d 20 70 54 61 62       pTab = pTab
ab10: 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 54 61 62 3b  List->a[j].pTab;
ab20: 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c  .      if( iCol<
ab30: 30 20 29 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d  0 ) iCol = pTab-
ab40: 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 61 73  >iPKey;.      as
ab50: 73 65 72 74 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c  sert( iCol==-1 |
ab60: 7c 20 28 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43  | (iCol>=0 && iC
ab70: 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29  ol<pTab->nCol) )
ab80: 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c  ;.      if( iCol
ab90: 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 43  <0 ){.        zC
aba0: 6f 6c 20 3d 20 22 72 6f 77 69 64 22 3b 0a 20 20  ol = "rowid";.  
abb0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
abc0: 20 20 20 7a 43 6f 6c 20 3d 20 70 54 61 62 2d 3e     zCol = pTab->
abd0: 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65  aCol[iCol].zName
abe0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
abf0: 69 66 28 20 21 73 68 6f 72 74 4e 61 6d 65 73 20  if( !shortNames 
ac00: 26 26 20 21 66 75 6c 6c 4e 61 6d 65 73 20 29 7b  && !fullNames ){
ac10: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
ac20: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76  VdbeSetColName(v
ac30: 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d  , i, COLNAME_NAM
ac40: 45 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  E, .            
ac50: 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
ac60: 64 62 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  db, pEList->a[i]
ac70: 2e 7a 53 70 61 6e 29 2c 20 53 51 4c 49 54 45 5f  .zSpan), SQLITE_
ac80: 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20  DYNAMIC);.      
ac90: 7d 65 6c 73 65 20 69 66 28 20 66 75 6c 6c 4e 61  }else if( fullNa
aca0: 6d 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20 63  mes ){.        c
acb0: 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a  har *zName = 0;.
acc0: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
acd0: 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
ace0: 62 2c 20 22 25 73 2e 25 73 22 2c 20 70 54 61 62  b, "%s.%s", pTab
acf0: 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3b 0a  ->zName, zCol);.
ad00: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
ad10: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
ad20: 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45   i, COLNAME_NAME
ad30: 2c 20 7a 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f  , zName, SQLITE_
ad40: 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20  DYNAMIC);.      
ad50: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
ad60: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
ad70: 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41  Name(v, i, COLNA
ad80: 4d 45 5f 4e 41 4d 45 2c 20 7a 43 6f 6c 2c 20 53  ME_NAME, zCol, S
ad90: 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
ada0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
adb0: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
adc0: 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
add0: 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e  (v, i, COLNAME_N
ade0: 41 4d 45 2c 20 0a 20 20 20 20 20 20 20 20 20 20  AME, .          
adf0: 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
ae00: 64 62 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  db, pEList->a[i]
ae10: 2e 7a 53 70 61 6e 29 2c 20 53 51 4c 49 54 45 5f  .zSpan), SQLITE_
ae20: 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 7d 0a  DYNAMIC);.    }.
ae30: 20 20 7d 0a 20 20 67 65 6e 65 72 61 74 65 43 6f    }.  generateCo
ae40: 6c 75 6d 6e 54 79 70 65 73 28 70 50 61 72 73 65  lumnTypes(pParse
ae50: 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69  , pTabList, pELi
ae60: 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69  st);.}../*.** Gi
ae70: 76 65 6e 20 61 20 61 6e 20 65 78 70 72 65 73 73  ven a an express
ae80: 69 6f 6e 20 6c 69 73 74 20 28 77 68 69 63 68 20  ion list (which 
ae90: 69 73 20 72 65 61 6c 6c 79 20 74 68 65 20 6c 69  is really the li
aea0: 73 74 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e  st of expression
aeb0: 73 0a 2a 2a 20 74 68 61 74 20 66 6f 72 6d 20 74  s.** that form t
aec0: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66  he result set of
aed0: 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
aee0: 65 6e 74 29 20 63 6f 6d 70 75 74 65 20 61 70 70  ent) compute app
aef0: 72 6f 70 72 69 61 74 65 0a 2a 2a 20 63 6f 6c 75  ropriate.** colu
af00: 6d 6e 20 6e 61 6d 65 73 20 66 6f 72 20 61 20 74  mn names for a t
af10: 61 62 6c 65 20 74 68 61 74 20 77 6f 75 6c 64 20  able that would 
af20: 68 6f 6c 64 20 74 68 65 20 65 78 70 72 65 73 73  hold the express
af30: 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20  ion list..**.** 
af40: 41 6c 6c 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  All column names
af50: 20 77 69 6c 6c 20 62 65 20 75 6e 69 71 75 65 2e   will be unique.
af60: 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65 20  .**.** Only the 
af70: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61 72 65  column names are
af80: 20 63 6f 6d 70 75 74 65 64 2e 20 20 43 6f 6c 75   computed.  Colu
af90: 6d 6e 2e 7a 54 79 70 65 2c 20 43 6f 6c 75 6d 6e  mn.zType, Column
afa0: 2e 7a 43 6f 6c 6c 2c 0a 2a 2a 20 61 6e 64 20 6f  .zColl,.** and o
afb0: 74 68 65 72 20 66 69 65 6c 64 73 20 6f 66 20 43  ther fields of C
afc0: 6f 6c 75 6d 6e 20 61 72 65 20 7a 65 72 6f 65 64  olumn are zeroed
afd0: 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ..**.** Return S
afe0: 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
aff0: 65 73 73 2e 20 20 49 66 20 61 20 6d 65 6d 6f 72  ess.  If a memor
b000: 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72  y allocation err
b010: 6f 72 20 6f 63 63 75 72 73 2c 0a 2a 2a 20 73 74  or occurs,.** st
b020: 6f 72 65 20 4e 55 4c 4c 20 69 6e 20 2a 70 61 43  ore NULL in *paC
b030: 6f 6c 20 61 6e 64 20 30 20 69 6e 20 2a 70 6e 43  ol and 0 in *pnC
b040: 6f 6c 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51  ol and return SQ
b050: 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 0a 2a 2f 0a 73  LITE_NOMEM..*/.s
b060: 74 61 74 69 63 20 69 6e 74 20 73 65 6c 65 63 74  tatic int select
b070: 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c  ColumnsFromExprL
b080: 69 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ist(.  Parse *pP
b090: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f  arse,          /
b0a0: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
b0b0: 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
b0c0: 2a 70 45 4c 69 73 74 2c 20 20 20 20 20 20 20 2f  *pEList,       /
b0d0: 2a 20 45 78 70 72 20 6c 69 73 74 20 66 72 6f 6d  * Expr list from
b0e0: 20 77 68 69 63 68 20 74 6f 20 64 65 72 69 76 65   which to derive
b0f0: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f   column names */
b100: 0a 20 20 69 31 36 20 2a 70 6e 43 6f 6c 2c 20 20  .  i16 *pnCol,  
b110: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
b120: 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ite the number o
b130: 66 20 63 6f 6c 75 6d 6e 73 20 68 65 72 65 20 2a  f columns here *
b140: 2f 0a 20 20 43 6f 6c 75 6d 6e 20 2a 2a 70 61 43  /.  Column **paC
b150: 6f 6c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  ol          /* W
b160: 72 69 74 65 20 74 68 65 20 6e 65 77 20 63 6f 6c  rite the new col
b170: 75 6d 6e 20 6c 69 73 74 20 68 65 72 65 20 2a 2f  umn list here */
b180: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
b190: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20  b = pParse->db; 
b1a0: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f    /* Database co
b1b0: 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  nnection */.  in
b1c0: 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20  t i, j;         
b1d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
b1e0: 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20  p counters */.  
b1f0: 69 6e 74 20 63 6e 74 3b 20 20 20 20 20 20 20 20  int cnt;        
b200: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
b210: 6e 64 65 78 20 61 64 64 65 64 20 74 6f 20 6d 61  ndex added to ma
b220: 6b 65 20 74 68 65 20 6e 61 6d 65 20 75 6e 69 71  ke the name uniq
b230: 75 65 20 2a 2f 0a 20 20 43 6f 6c 75 6d 6e 20 2a  ue */.  Column *
b240: 61 43 6f 6c 2c 20 2a 70 43 6f 6c 3b 20 20 20 20  aCol, *pCol;    
b250: 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69      /* For loopi
b260: 6e 67 20 6f 76 65 72 20 72 65 73 75 6c 74 20 63  ng over result c
b270: 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  olumns */.  int 
b280: 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20  nCol;           
b290: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
b2a0: 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
b2b0: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a  the result set *
b2c0: 2f 0a 20 20 45 78 70 72 20 2a 70 3b 20 20 20 20  /.  Expr *p;    
b2d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b2e0: 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 66 6f  /* Expression fo
b2f0: 72 20 61 20 73 69 6e 67 6c 65 20 72 65 73 75 6c  r a single resul
b300: 74 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63 68  t column */.  ch
b310: 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 20  ar *zName;      
b320: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
b330: 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e  umn name */.  in
b340: 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20 20  t nName;        
b350: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
b360: 65 20 6f 66 20 6e 61 6d 65 20 69 6e 20 7a 4e 61  e of name in zNa
b370: 6d 65 5b 5d 20 2a 2f 0a 0a 20 20 69 66 28 20 70  me[] */..  if( p
b380: 45 4c 69 73 74 20 29 7b 0a 20 20 20 20 6e 43 6f  EList ){.    nCo
b390: 6c 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  l = pEList->nExp
b3a0: 72 3b 0a 20 20 20 20 61 43 6f 6c 20 3d 20 73 71  r;.    aCol = sq
b3b0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
b3c0: 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 61 43 6f  o(db, sizeof(aCo
b3d0: 6c 5b 30 5d 29 2a 6e 43 6f 6c 29 3b 0a 20 20 20  l[0])*nCol);.   
b3e0: 20 74 65 73 74 63 61 73 65 28 20 61 43 6f 6c 3d   testcase( aCol=
b3f0: 3d 30 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  =0 );.  }else{. 
b400: 20 20 20 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20     nCol = 0;.   
b410: 20 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20   aCol = 0;.  }. 
b420: 20 2a 70 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a   *pnCol = nCol;.
b430: 20 20 2a 70 61 43 6f 6c 20 3d 20 61 43 6f 6c 3b    *paCol = aCol;
b440: 0a 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 43 6f  ..  for(i=0, pCo
b450: 6c 3d 61 43 6f 6c 3b 20 69 3c 6e 43 6f 6c 3b 20  l=aCol; i<nCol; 
b460: 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20  i++, pCol++){.  
b470: 20 20 2f 2a 20 47 65 74 20 61 6e 20 61 70 70 72    /* Get an appr
b480: 6f 70 72 69 61 74 65 20 6e 61 6d 65 20 66 6f 72  opriate name for
b490: 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 20 20 20 20   the column.    
b4a0: 2a 2f 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74  */.    p = sqlit
b4b0: 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74  e3ExprSkipCollat
b4c0: 65 28 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  e(pEList->a[i].p
b4d0: 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20 28  Expr);.    if( (
b4e0: 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e  zName = pEList->
b4f0: 61 5b 69 5d 2e 7a 4e 61 6d 65 29 21 3d 30 20 29  a[i].zName)!=0 )
b500: 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
b510: 65 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e  e column contain
b520: 73 20 61 6e 20 22 41 53 20 3c 6e 61 6d 65 3e 22  s an "AS <name>"
b530: 20 70 68 72 61 73 65 2c 20 75 73 65 20 3c 6e 61   phrase, use <na
b540: 6d 65 3e 20 61 73 20 74 68 65 20 6e 61 6d 65 20  me> as the name 
b550: 2a 2f 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  */.      zName =
b560: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
b570: 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  (db, zName);.   
b580: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 45 78   }else{.      Ex
b590: 70 72 20 2a 70 43 6f 6c 45 78 70 72 20 3d 20 70  pr *pColExpr = p
b5a0: 3b 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73  ;  /* The expres
b5b0: 73 69 6f 6e 20 74 68 61 74 20 69 73 20 74 68 65  sion that is the
b5c0: 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 20 6e   result column n
b5d0: 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 54 61 62  ame */.      Tab
b5e0: 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20  le *pTab;       
b5f0: 20 20 2f 2a 20 54 61 62 6c 65 20 61 73 73 6f 63    /* Table assoc
b600: 69 61 74 65 64 20 77 69 74 68 20 74 68 69 73 20  iated with this 
b610: 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20  expression */.  
b620: 20 20 20 20 77 68 69 6c 65 28 20 70 43 6f 6c 45      while( pColE
b630: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20  xpr->op==TK_DOT 
b640: 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 45  ){.        pColE
b650: 78 70 72 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e  xpr = pColExpr->
b660: 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20  pRight;.        
b670: 61 73 73 65 72 74 28 20 70 43 6f 6c 45 78 70 72  assert( pColExpr
b680: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20  !=0 );.      }. 
b690: 20 20 20 20 20 69 66 28 20 70 43 6f 6c 45 78 70       if( pColExp
b6a0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op==TK_COLUMN
b6b0: 20 26 26 20 41 4c 57 41 59 53 28 70 43 6f 6c 45   && ALWAYS(pColE
b6c0: 78 70 72 2d 3e 70 54 61 62 21 3d 30 29 20 29 7b  xpr->pTab!=0) ){
b6d0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20  .        /* For 
b6e0: 63 6f 6c 75 6d 6e 73 20 75 73 65 20 74 68 65 20  columns use the 
b6f0: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 6e 61 6d 65  column name name
b700: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
b710: 69 43 6f 6c 20 3d 20 70 43 6f 6c 45 78 70 72 2d  iCol = pColExpr-
b720: 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  >iColumn;.      
b730: 20 20 70 54 61 62 20 3d 20 70 43 6f 6c 45 78 70    pTab = pColExp
b740: 72 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 20  r->pTab;.       
b750: 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43   if( iCol<0 ) iC
b760: 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79  ol = pTab->iPKey
b770: 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  ;.        zName 
b780: 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
b790: 28 64 62 2c 20 22 25 73 22 2c 0a 20 20 20 20 20  (db, "%s",.     
b7a0: 20 20 20 20 20 20 20 20 20 20 20 20 69 43 6f 6c              iCol
b7b0: 3e 3d 30 20 3f 20 70 54 61 62 2d 3e 61 43 6f 6c  >=0 ? pTab->aCol
b7c0: 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 20 3a 20 22  [iCol].zName : "
b7d0: 72 6f 77 69 64 22 29 3b 0a 20 20 20 20 20 20 7d  rowid");.      }
b7e0: 65 6c 73 65 20 69 66 28 20 70 43 6f 6c 45 78 70  else if( pColExp
b7f0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 7b 0a  r->op==TK_ID ){.
b800: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
b810: 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
b820: 28 70 43 6f 6c 45 78 70 72 2c 20 45 50 5f 49 6e  (pColExpr, EP_In
b830: 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20  tValue) );.     
b840: 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74     zName = sqlit
b850: 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25  e3MPrintf(db, "%
b860: 73 22 2c 20 70 43 6f 6c 45 78 70 72 2d 3e 75 2e  s", pColExpr->u.
b870: 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 7d  zToken);.      }
b880: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
b890: 20 55 73 65 20 74 68 65 20 6f 72 69 67 69 6e 61   Use the origina
b8a0: 6c 20 74 65 78 74 20 6f 66 20 74 68 65 20 63 6f  l text of the co
b8b0: 6c 75 6d 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  lumn expression 
b8c0: 61 73 20 69 74 73 20 6e 61 6d 65 20 2a 2f 0a 20  as its name */. 
b8d0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73         zName = s
b8e0: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
b8f0: 2c 20 22 25 73 22 2c 20 70 45 4c 69 73 74 2d 3e  , "%s", pEList->
b900: 61 5b 69 5d 2e 7a 53 70 61 6e 29 3b 0a 20 20 20  a[i].zSpan);.   
b910: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
b920: 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
b930: 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  led ){.      sql
b940: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
b950: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 62 72 65  Name);.      bre
b960: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
b970: 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
b980: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 73 20 75  column name is u
b990: 6e 69 71 75 65 2e 20 20 49 66 20 74 68 65 20 6e  nique.  If the n
b9a0: 61 6d 65 20 69 73 20 6e 6f 74 20 75 6e 69 71 75  ame is not uniqu
b9b0: 65 2c 0a 20 20 20 20 2a 2a 20 61 70 70 65 6e 64  e,.    ** append
b9c0: 20 61 20 69 6e 74 65 67 65 72 20 74 6f 20 74 68   a integer to th
b9d0: 65 20 6e 61 6d 65 20 73 6f 20 74 68 61 74 20 69  e name so that i
b9e0: 74 20 62 65 63 6f 6d 65 73 20 75 6e 69 71 75 65  t becomes unique
b9f0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e 4e 61  ..    */.    nNa
ba00: 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  me = sqlite3Strl
ba10: 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 20  en30(zName);.   
ba20: 20 66 6f 72 28 6a 3d 63 6e 74 3d 30 3b 20 6a 3c   for(j=cnt=0; j<
ba30: 69 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69  i; j++){.      i
ba40: 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
ba50: 70 28 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c  p(aCol[j].zName,
ba60: 20 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20   zName)==0 ){.  
ba70: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 65 77        char *zNew
ba80: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 6e  Name;.        in
ba90: 74 20 6b 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  t k;.        for
baa0: 28 6b 3d 6e 4e 61 6d 65 2d 31 3b 20 6b 3e 31 20  (k=nName-1; k>1 
bab0: 26 26 20 73 71 6c 69 74 65 33 49 73 64 69 67 69  && sqlite3Isdigi
bac0: 74 28 7a 4e 61 6d 65 5b 6b 5d 29 3b 20 6b 2d 2d  t(zName[k]); k--
bad0: 29 7b 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20  ){}.        if( 
bae0: 7a 4e 61 6d 65 5b 6b 5d 3d 3d 27 3a 27 20 29 20  zName[k]==':' ) 
baf0: 6e 4e 61 6d 65 20 3d 20 6b 3b 0a 20 20 20 20 20  nName = k;.     
bb00: 20 20 20 7a 4e 61 6d 65 5b 6e 4e 61 6d 65 5d 20     zName[nName] 
bb10: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7a 4e 65  = 0;.        zNe
bb20: 77 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d  wName = sqlite3M
bb30: 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 3a 25  Printf(db, "%s:%
bb40: 64 22 2c 20 7a 4e 61 6d 65 2c 20 2b 2b 63 6e 74  d", zName, ++cnt
bb50: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
bb60: 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e 61  e3DbFree(db, zNa
bb70: 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61  me);.        zNa
bb80: 6d 65 20 3d 20 7a 4e 65 77 4e 61 6d 65 3b 0a 20  me = zNewName;. 
bb90: 20 20 20 20 20 20 20 6a 20 3d 20 2d 31 3b 0a 20         j = -1;. 
bba0: 20 20 20 20 20 20 20 69 66 28 20 7a 4e 61 6d 65         if( zName
bbb0: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
bbc0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
bbd0: 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61  Col->zName = zNa
bbe0: 6d 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 64 62  me;.  }.  if( db
bbf0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
bc00: 7b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  {.    for(j=0; j
bc10: 3c 69 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  <i; j++){.      
bc20: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
bc30: 2c 20 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 29  , aCol[j].zName)
bc40: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
bc50: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 61 43  te3DbFree(db, aC
bc60: 6f 6c 29 3b 0a 20 20 20 20 2a 70 61 43 6f 6c 20  ol);.    *paCol 
bc70: 3d 20 30 3b 0a 20 20 20 20 2a 70 6e 43 6f 6c 20  = 0;.    *pnCol 
bc80: 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 0;.    return 
bc90: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
bca0: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
bcb0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  E_OK;.}../*.** A
bcc0: 64 64 20 74 79 70 65 20 61 6e 64 20 63 6f 6c 6c  dd type and coll
bcd0: 61 74 69 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f  ation informatio
bce0: 6e 20 74 6f 20 61 20 63 6f 6c 75 6d 6e 20 6c 69  n to a column li
bcf0: 73 74 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 61  st based on.** a
bd00: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
bd10: 74 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 65 20 63 6f  t..** .** The co
bd20: 6c 75 6d 6e 20 6c 69 73 74 20 70 72 65 73 75 6d  lumn list presum
bd30: 61 62 6c 79 20 63 61 6d 65 20 66 72 6f 6d 20 73  ably came from s
bd40: 65 6c 65 63 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73  electColumnNames
bd50: 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 29 2e 0a  FromExprList()..
bd60: 2a 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6c 69  ** The column li
bd70: 73 74 20 68 61 73 20 6f 6e 6c 79 20 6e 61 6d 65  st has only name
bd80: 73 2c 20 6e 6f 74 20 74 79 70 65 73 20 6f 72 20  s, not types or 
bd90: 63 6f 6c 6c 61 74 69 6f 6e 73 2e 20 20 54 68 69  collations.  Thi
bda0: 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67 6f 65  s.** routine goe
bdb0: 73 20 74 68 72 6f 75 67 68 20 61 6e 64 20 61 64  s through and ad
bdc0: 64 73 20 74 68 65 20 74 79 70 65 73 20 61 6e 64  ds the types and
bdd0: 20 63 6f 6c 6c 61 74 69 6f 6e 73 2e 0a 2a 2a 0a   collations..**.
bde0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
bdf0: 72 65 71 75 69 72 65 73 20 74 68 61 74 20 61 6c  requires that al
be00: 6c 20 69 64 65 6e 74 69 66 69 65 72 73 20 69 6e  l identifiers in
be10: 20 74 68 65 20 53 45 4c 45 43 54 0a 2a 2a 20 73   the SELECT.** s
be20: 74 61 74 65 6d 65 6e 74 20 62 65 20 72 65 73 6f  tatement be reso
be30: 6c 76 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lved..*/.static 
be40: 76 6f 69 64 20 73 65 6c 65 63 74 41 64 64 43 6f  void selectAddCo
be50: 6c 75 6d 6e 54 79 70 65 41 6e 64 43 6f 6c 6c 61  lumnTypeAndColla
be60: 74 69 6f 6e 28 0a 20 20 50 61 72 73 65 20 2a 70  tion(.  Parse *p
be70: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a  Parse,        /*
be80: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
be90: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 2c  s */.  int nCol,
bea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
beb0: 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  Number of column
bec0: 73 20 2a 2f 0a 20 20 43 6f 6c 75 6d 6e 20 2a 61  s */.  Column *a
bed0: 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  Col,         /* 
bee0: 4c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  List of columns 
bef0: 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65  */.  Select *pSe
bf00: 6c 65 63 74 20 20 20 20 20 20 20 2f 2a 20 53 45  lect       /* SE
bf10: 4c 45 43 54 20 75 73 65 64 20 74 6f 20 64 65 74  LECT used to det
bf20: 65 72 6d 69 6e 65 20 74 79 70 65 73 20 61 6e 64  ermine types and
bf30: 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 2a 2f 0a 29   collations */.)
bf40: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
bf50: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
bf60: 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b  NameContext sNC;
bf70: 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b  .  Column *pCol;
bf80: 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  .  CollSeq *pCol
bf90: 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 45 78  l;.  int i;.  Ex
bfa0: 70 72 20 2a 70 3b 0a 20 20 73 74 72 75 63 74 20  pr *p;.  struct 
bfb0: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61  ExprList_item *a
bfc0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 53 65  ;..  assert( pSe
bfd0: 6c 65 63 74 21 3d 30 20 29 3b 0a 20 20 61 73 73  lect!=0 );.  ass
bfe0: 65 72 74 28 20 28 70 53 65 6c 65 63 74 2d 3e 73  ert( (pSelect->s
bff0: 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65 73  elFlags & SF_Res
c000: 6f 6c 76 65 64 29 21 3d 30 20 29 3b 0a 20 20 61  olved)!=0 );.  a
c010: 73 73 65 72 74 28 20 6e 43 6f 6c 3d 3d 70 53 65  ssert( nCol==pSe
c020: 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  lect->pEList->nE
c030: 78 70 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  xpr || db->mallo
c040: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28  cFailed );.  if(
c050: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
c060: 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 6d 65  d ) return;.  me
c070: 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c 20 73 69  mset(&sNC, 0, si
c080: 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20 73 4e  zeof(sNC));.  sN
c090: 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 53 65  C.pSrcList = pSe
c0a0: 6c 65 63 74 2d 3e 70 53 72 63 3b 0a 20 20 61 20  lect->pSrc;.  a 
c0b0: 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  = pSelect->pELis
c0c0: 74 2d 3e 61 3b 0a 20 20 66 6f 72 28 69 3d 30 2c  t->a;.  for(i=0,
c0d0: 20 70 43 6f 6c 3d 61 43 6f 6c 3b 20 69 3c 6e 43   pCol=aCol; i<nC
c0e0: 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29  ol; i++, pCol++)
c0f0: 7b 0a 20 20 20 20 70 20 3d 20 61 5b 69 5d 2e 70  {.    p = a[i].p
c100: 45 78 70 72 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e  Expr;.    pCol->
c110: 7a 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33 44  zType = sqlite3D
c120: 62 53 74 72 44 75 70 28 64 62 2c 20 63 6f 6c 75  bStrDup(db, colu
c130: 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20  mnType(&sNC, p, 
c140: 30 2c 20 30 2c 20 30 29 29 3b 0a 20 20 20 20 70  0, 0, 0));.    p
c150: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20  Col->affinity = 
c160: 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e  sqlite3ExprAffin
c170: 69 74 79 28 70 29 3b 0a 20 20 20 20 69 66 28 20  ity(p);.    if( 
c180: 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d  pCol->affinity==
c190: 30 20 29 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69  0 ) pCol->affini
c1a0: 74 79 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ty = SQLITE_AFF_
c1b0: 4e 4f 4e 45 3b 0a 20 20 20 20 70 43 6f 6c 6c 20  NONE;.    pColl 
c1c0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
c1d0: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 29 3b  lSeq(pParse, p);
c1e0: 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 29  .    if( pColl )
c1f0: 7b 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 43  {.      pCol->zC
c200: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 44 62 53  oll = sqlite3DbS
c210: 74 72 44 75 70 28 64 62 2c 20 70 43 6f 6c 6c 2d  trDup(db, pColl-
c220: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20  >zName);.    }. 
c230: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65   }.}../*.** Give
c240: 6e 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  n a SELECT state
c250: 6d 65 6e 74 2c 20 67 65 6e 65 72 61 74 65 20 61  ment, generate a
c260: 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   Table structure
c270: 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73 0a   that describes.
c280: 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  ** the result se
c290: 74 20 6f 66 20 74 68 61 74 20 53 45 4c 45 43 54  t of that SELECT
c2a0: 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69  ..*/.Table *sqli
c2b0: 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65  te3ResultSetOfSe
c2c0: 6c 65 63 74 28 50 61 72 73 65 20 2a 70 50 61 72  lect(Parse *pPar
c2d0: 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  se, Select *pSel
c2e0: 65 63 74 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  ect){.  Table *p
c2f0: 54 61 62 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  Tab;.  sqlite3 *
c300: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
c310: 0a 20 20 69 6e 74 20 73 61 76 65 64 46 6c 61 67  .  int savedFlag
c320: 73 3b 0a 0a 20 20 73 61 76 65 64 46 6c 61 67 73  s;..  savedFlags
c330: 20 3d 20 64 62 2d 3e 66 6c 61 67 73 3b 0a 20 20   = db->flags;.  
c340: 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51  db->flags &= ~SQ
c350: 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65  LITE_FullColName
c360: 73 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c  s;.  db->flags |
c370: 3d 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f  = SQLITE_ShortCo
c380: 6c 4e 61 6d 65 73 3b 0a 20 20 73 71 6c 69 74 65  lNames;.  sqlite
c390: 33 53 65 6c 65 63 74 50 72 65 70 28 70 50 61 72  3SelectPrep(pPar
c3a0: 73 65 2c 20 70 53 65 6c 65 63 74 2c 20 30 29 3b  se, pSelect, 0);
c3b0: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
c3c0: 45 72 72 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  Err ) return 0;.
c3d0: 20 20 77 68 69 6c 65 28 20 70 53 65 6c 65 63 74    while( pSelect
c3e0: 2d 3e 70 50 72 69 6f 72 20 29 20 70 53 65 6c 65  ->pPrior ) pSele
c3f0: 63 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 50  ct = pSelect->pP
c400: 72 69 6f 72 3b 0a 20 20 64 62 2d 3e 66 6c 61 67  rior;.  db->flag
c410: 73 20 3d 20 73 61 76 65 64 46 6c 61 67 73 3b 0a  s = savedFlags;.
c420: 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33    pTab = sqlite3
c430: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
c440: 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 20 29   sizeof(Table) )
c450: 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20  ;.  if( pTab==0 
c460: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
c470: 0a 20 20 7d 0a 20 20 2f 2a 20 54 68 65 20 73 71  .  }.  /* The sq
c480: 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66  lite3ResultSetOf
c490: 53 65 6c 65 63 74 28 29 20 69 73 20 6f 6e 6c 79  Select() is only
c4a0: 20 75 73 65 64 20 6e 20 63 6f 6e 74 65 78 74 73   used n contexts
c4b0: 20 77 68 65 72 65 20 6c 6f 6f 6b 61 73 69 64 65   where lookaside
c4c0: 0a 20 20 2a 2a 20 69 73 20 64 69 73 61 62 6c 65  .  ** is disable
c4d0: 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 64  d */.  assert( d
c4e0: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e  b->lookaside.bEn
c4f0: 61 62 6c 65 64 3d 3d 30 20 29 3b 0a 20 20 70 54  abled==0 );.  pT
c500: 61 62 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20  ab->nRef = 1;.  
c510: 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b  pTab->zName = 0;
c520: 0a 20 20 70 54 61 62 2d 3e 6e 52 6f 77 45 73 74  .  pTab->nRowEst
c530: 20 3d 20 31 30 30 30 30 30 30 3b 0a 20 20 73 65   = 1000000;.  se
c540: 6c 65 63 74 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45  lectColumnsFromE
c550: 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
c560: 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2c  pSelect->pEList,
c570: 20 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 26 70   &pTab->nCol, &p
c580: 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20 20 73 65  Tab->aCol);.  se
c590: 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70  lectAddColumnTyp
c5a0: 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 70 50  eAndCollation(pP
c5b0: 61 72 73 65 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c  arse, pTab->nCol
c5c0: 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 2c 20 70 53  , pTab->aCol, pS
c5d0: 65 6c 65 63 74 29 3b 0a 20 20 70 54 61 62 2d 3e  elect);.  pTab->
c5e0: 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 69 66  iPKey = -1;.  if
c5f0: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
c600: 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ed ){.    sqlite
c610: 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c  3DeleteTable(db,
c620: 20 70 54 61 62 29 3b 0a 20 20 20 20 72 65 74 75   pTab);.    retu
c630: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 0;.  }.  retu
c640: 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pTab;.}../*.*
c650: 2a 20 47 65 74 20 61 20 56 44 42 45 20 66 6f 72  * Get a VDBE for
c660: 20 74 68 65 20 67 69 76 65 6e 20 70 61 72 73 65   the given parse
c670: 72 20 63 6f 6e 74 65 78 74 2e 20 20 43 72 65 61  r context.  Crea
c680: 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 69 66 20  te a new one if 
c690: 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20 49 66  necessary..** If
c6a0: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
c6b0: 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20 61 6e  , return NULL an
c6c0: 64 20 6c 65 61 76 65 20 61 20 6d 65 73 73 61 67  d leave a messag
c6d0: 65 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a  e in pParse..*/.
c6e0: 56 64 62 65 20 2a 73 71 6c 69 74 65 33 47 65 74  Vdbe *sqlite3Get
c6f0: 56 64 62 65 28 50 61 72 73 65 20 2a 70 50 61 72  Vdbe(Parse *pPar
c700: 73 65 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  se){.  Vdbe *v =
c710: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
c720: 20 20 69 66 28 20 76 3d 3d 30 20 29 7b 0a 20 20    if( v==0 ){.  
c730: 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56    v = pParse->pV
c740: 64 62 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62  dbe = sqlite3Vdb
c750: 65 43 72 65 61 74 65 28 70 50 61 72 73 65 2d 3e  eCreate(pParse->
c760: 64 62 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  db);.#ifndef SQL
c770: 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a 20  ITE_OMIT_TRACE. 
c780: 20 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20     if( v ){.    
c790: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
c7a0: 4f 70 30 28 76 2c 20 4f 50 5f 54 72 61 63 65 29  Op0(v, OP_Trace)
c7b0: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
c7c0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 76 3b 0a 7d   }.  return v;.}
c7d0: 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65  .../*.** Compute
c7e0: 20 74 68 65 20 69 4c 69 6d 69 74 20 61 6e 64 20   the iLimit and 
c7f0: 69 4f 66 66 73 65 74 20 66 69 65 6c 64 73 20 6f  iOffset fields o
c800: 66 20 74 68 65 20 53 45 4c 45 43 54 20 62 61 73  f the SELECT bas
c810: 65 64 20 6f 6e 20 74 68 65 0a 2a 2a 20 70 4c 69  ed on the.** pLi
c820: 6d 69 74 20 61 6e 64 20 70 4f 66 66 73 65 74 20  mit and pOffset 
c830: 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 20 70 4c  expressions.  pL
c840: 69 6d 69 74 20 61 6e 64 20 70 4f 66 66 73 65 74  imit and pOffset
c850: 20 68 6f 6c 64 20 74 68 65 20 65 78 70 72 65 73   hold the expres
c860: 73 69 6f 6e 73 0a 2a 2a 20 74 68 61 74 20 61 70  sions.** that ap
c870: 70 65 61 72 20 69 6e 20 74 68 65 20 6f 72 69 67  pear in the orig
c880: 69 6e 61 6c 20 53 51 4c 20 73 74 61 74 65 6d 65  inal SQL stateme
c890: 6e 74 20 61 66 74 65 72 20 74 68 65 20 4c 49 4d  nt after the LIM
c8a0: 49 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 2a 2a  IT and OFFSET.**
c8b0: 20 6b 65 79 77 6f 72 64 73 2e 20 20 4f 72 20 4e   keywords.  Or N
c8c0: 55 4c 4c 20 69 66 20 74 68 6f 73 65 20 6b 65 79  ULL if those key
c8d0: 77 6f 72 64 73 20 61 72 65 20 6f 6d 69 74 74 65  words are omitte
c8e0: 64 2e 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f  d. iLimit and iO
c8f0: 66 66 73 65 74 20 0a 2a 2a 20 61 72 65 20 74 68  ffset .** are th
c900: 65 20 69 6e 74 65 67 65 72 20 6d 65 6d 6f 72 79  e integer memory
c910: 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72   register number
c920: 73 20 66 6f 72 20 63 6f 75 6e 74 65 72 73 20 75  s for counters u
c930: 73 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 0a  sed to compute .
c940: 2a 2a 20 74 68 65 20 6c 69 6d 69 74 20 61 6e 64  ** the limit and
c950: 20 6f 66 66 73 65 74 2e 20 20 49 66 20 74 68 65   offset.  If the
c960: 72 65 20 69 73 20 6e 6f 20 6c 69 6d 69 74 20 61  re is no limit a
c970: 6e 64 2f 6f 72 20 6f 66 66 73 65 74 2c 20 74 68  nd/or offset, th
c980: 65 6e 20 0a 2a 2a 20 69 4c 69 6d 69 74 20 61 6e  en .** iLimit an
c990: 64 20 69 4f 66 66 73 65 74 20 61 72 65 20 6e 65  d iOffset are ne
c9a0: 67 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  gative..**.** Th
c9b0: 69 73 20 72 6f 75 74 69 6e 65 20 63 68 61 6e 67  is routine chang
c9c0: 65 73 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66  es the values of
c9d0: 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66   iLimit and iOff
c9e0: 73 65 74 20 6f 6e 6c 79 20 69 66 0a 2a 2a 20 61  set only if.** a
c9f0: 20 6c 69 6d 69 74 20 6f 72 20 6f 66 66 73 65 74   limit or offset
ca00: 20 69 73 20 64 65 66 69 6e 65 64 20 62 79 20 70   is defined by p
ca10: 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66 66 73 65  Limit and pOffse
ca20: 74 2e 20 20 69 4c 69 6d 69 74 20 61 6e 64 0a 2a  t.  iLimit and.*
ca30: 2a 20 69 4f 66 66 73 65 74 20 73 68 6f 75 6c 64  * iOffset should
ca40: 20 68 61 76 65 20 62 65 65 6e 20 70 72 65 73 65   have been prese
ca50: 74 20 74 6f 20 61 70 70 72 6f 70 72 69 61 74 65  t to appropriate
ca60: 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 73 0a   default values.
ca70: 2a 2a 20 28 75 73 75 61 6c 6c 79 20 62 75 74 20  ** (usually but 
ca80: 6e 6f 74 20 61 6c 77 61 79 73 20 2d 31 29 20 70  not always -1) p
ca90: 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20  rior to calling 
caa0: 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a  this routine..**
cab0: 20 4f 6e 6c 79 20 69 66 20 70 4c 69 6d 69 74 21   Only if pLimit!
cac0: 3d 30 20 6f 72 20 70 4f 66 66 73 65 74 21 3d 30  =0 or pOffset!=0
cad0: 20 64 6f 20 74 68 65 20 6c 69 6d 69 74 20 72 65   do the limit re
cae0: 67 69 73 74 65 72 73 20 67 65 74 0a 2a 2a 20 72  gisters get.** r
caf0: 65 64 65 66 69 6e 65 64 2e 20 20 54 68 65 20 55  edefined.  The U
cb00: 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f  NION ALL operato
cb10: 72 20 75 73 65 73 20 74 68 69 73 20 70 72 6f 70  r uses this prop
cb20: 65 72 74 79 20 74 6f 20 66 6f 72 63 65 0a 2a 2a  erty to force.**
cb30: 20 74 68 65 20 72 65 75 73 65 20 6f 66 20 74 68   the reuse of th
cb40: 65 20 73 61 6d 65 20 6c 69 6d 69 74 20 61 6e 64  e same limit and
cb50: 20 6f 66 66 73 65 74 20 72 65 67 69 73 74 65 72   offset register
cb60: 73 20 61 63 72 6f 73 73 20 6d 75 6c 74 69 70 6c  s across multipl
cb70: 65 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74  e.** SELECT stat
cb80: 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74 69  ements..*/.stati
cb90: 63 20 76 6f 69 64 20 63 6f 6d 70 75 74 65 4c 69  c void computeLi
cba0: 6d 69 74 52 65 67 69 73 74 65 72 73 28 50 61 72  mitRegisters(Par
cbb0: 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65  se *pParse, Sele
cbc0: 63 74 20 2a 70 2c 20 69 6e 74 20 69 42 72 65 61  ct *p, int iBrea
cbd0: 6b 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  k){.  Vdbe *v = 
cbe0: 30 3b 0a 20 20 69 6e 74 20 69 4c 69 6d 69 74 20  0;.  int iLimit 
cbf0: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4f 66 66 73  = 0;.  int iOffs
cc00: 65 74 3b 0a 20 20 69 6e 74 20 61 64 64 72 31 2c  et;.  int addr1,
cc10: 20 6e 3b 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69   n;.  if( p->iLi
cc20: 6d 69 74 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  mit ) return;.. 
cc30: 20 2f 2a 20 0a 20 20 2a 2a 20 22 4c 49 4d 49 54   /* .  ** "LIMIT
cc40: 20 2d 31 22 20 61 6c 77 61 79 73 20 73 68 6f 77   -1" always show
cc50: 73 20 61 6c 6c 20 72 6f 77 73 2e 20 20 54 68 65  s all rows.  The
cc60: 72 65 20 69 73 20 73 6f 6d 65 0a 20 20 2a 2a 20  re is some.  ** 
cc70: 63 6f 6e 74 72 61 76 65 72 73 79 20 61 62 6f 75  contraversy abou
cc80: 74 20 77 68 61 74 20 74 68 65 20 63 6f 72 72 65  t what the corre
cc90: 63 74 20 62 65 68 61 76 69 6f 72 20 73 68 6f 75  ct behavior shou
cca0: 6c 64 20 62 65 2e 0a 20 20 2a 2a 20 54 68 65 20  ld be..  ** The 
ccb0: 63 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e  current implemen
ccc0: 74 61 74 69 6f 6e 20 69 6e 74 65 72 70 72 65 74  tation interpret
ccd0: 73 20 22 4c 49 4d 49 54 20 30 22 20 74 6f 20 6d  s "LIMIT 0" to m
cce0: 65 61 6e 0a 20 20 2a 2a 20 6e 6f 20 72 6f 77 73  ean.  ** no rows
ccf0: 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
cd00: 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70  ExprCacheClear(p
cd10: 50 61 72 73 65 29 3b 0a 20 20 61 73 73 65 72 74  Parse);.  assert
cd20: 28 20 70 2d 3e 70 4f 66 66 73 65 74 3d 3d 30 20  ( p->pOffset==0 
cd30: 7c 7c 20 70 2d 3e 70 4c 69 6d 69 74 21 3d 30 20  || p->pLimit!=0 
cd40: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4c 69 6d  );.  if( p->pLim
cd50: 69 74 20 29 7b 0a 20 20 20 20 70 2d 3e 69 4c 69  it ){.    p->iLi
cd60: 6d 69 74 20 3d 20 69 4c 69 6d 69 74 20 3d 20 2b  mit = iLimit = +
cd70: 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
cd80: 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65     v = sqlite3Ge
cd90: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
cda0: 20 20 20 69 66 28 20 4e 45 56 45 52 28 76 3d 3d     if( NEVER(v==
cdb0: 30 29 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a  0) ) return;  /*
cdc0: 20 56 44 42 45 20 73 68 6f 75 6c 64 20 68 61 76   VDBE should hav
cdd0: 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61  e already been a
cde0: 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20 20 20  llocated */.    
cdf0: 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49  if( sqlite3ExprI
ce00: 73 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c 69 6d  sInteger(p->pLim
ce10: 69 74 2c 20 26 6e 29 20 29 7b 0a 20 20 20 20 20  it, &n) ){.     
ce20: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
ce30: 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
ce40: 2c 20 6e 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20  , n, iLimit);.  
ce50: 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
ce60: 28 76 2c 20 22 4c 49 4d 49 54 20 63 6f 75 6e 74  (v, "LIMIT count
ce70: 65 72 22 29 29 3b 0a 20 20 20 20 20 20 69 66 28  er"));.      if(
ce80: 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20   n==0 ){.       
ce90: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
cea0: 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
ceb0: 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20  , iBreak);.     
cec0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
ced0: 69 66 28 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f  if( p->nSelectRo
cee0: 77 20 3e 20 28 64 6f 75 62 6c 65 29 6e 20 29 20  w > (double)n ) 
cef0: 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20  p->nSelectRow = 
cf00: 28 64 6f 75 62 6c 65 29 6e 3b 0a 20 20 20 20 20  (double)n;.     
cf10: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
cf20: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
cf30: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 2d 3e 70  ode(pParse, p->p
cf40: 4c 69 6d 69 74 2c 20 69 4c 69 6d 69 74 29 3b 0a  Limit, iLimit);.
cf50: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
cf60: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4d 75  eAddOp1(v, OP_Mu
cf70: 73 74 42 65 49 6e 74 2c 20 69 4c 69 6d 69 74 29  stBeInt, iLimit)
cf80: 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
cf90: 65 6e 74 28 28 76 2c 20 22 4c 49 4d 49 54 20 63  ent((v, "LIMIT c
cfa0: 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20 20 20 20  ounter"));.     
cfb0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
cfc0: 70 32 28 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c  p2(v, OP_IfZero,
cfd0: 20 69 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b 29   iLimit, iBreak)
cfe0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
cff0: 70 2d 3e 70 4f 66 66 73 65 74 20 29 7b 0a 20 20  p->pOffset ){.  
d000: 20 20 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d      p->iOffset =
d010: 20 69 4f 66 66 73 65 74 20 3d 20 2b 2b 70 50 61   iOffset = ++pPa
d020: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
d030: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b   pParse->nMem++;
d040: 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61     /* Allocate a
d050: 6e 20 65 78 74 72 61 20 72 65 67 69 73 74 65 72  n extra register
d060: 20 66 6f 72 20 6c 69 6d 69 74 2b 6f 66 66 73 65   for limit+offse
d070: 74 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  t */.      sqlit
d080: 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
d090: 65 2c 20 70 2d 3e 70 4f 66 66 73 65 74 2c 20 69  e, p->pOffset, i
d0a0: 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 73  Offset);.      s
d0b0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
d0c0: 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74  (v, OP_MustBeInt
d0d0: 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20  , iOffset);.    
d0e0: 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
d0f0: 2c 20 22 4f 46 46 53 45 54 20 63 6f 75 6e 74 65  , "OFFSET counte
d100: 72 22 29 29 3b 0a 20 20 20 20 20 20 61 64 64 72  r"));.      addr
d110: 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 = sqlite3VdbeA
d120: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 50 6f  ddOp1(v, OP_IfPo
d130: 73 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 20  s, iOffset);.   
d140: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
d150: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
d160: 65 72 2c 20 30 2c 20 69 4f 66 66 73 65 74 29 3b  er, 0, iOffset);
d170: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
d180: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
d190: 64 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  dr1);.      sqli
d1a0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
d1b0: 20 4f 50 5f 41 64 64 2c 20 69 4c 69 6d 69 74 2c   OP_Add, iLimit,
d1c0: 20 69 4f 66 66 73 65 74 2c 20 69 4f 66 66 73 65   iOffset, iOffse
d1d0: 74 2b 31 29 3b 0a 20 20 20 20 20 20 56 64 62 65  t+1);.      Vdbe
d1e0: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c 49 4d  Comment((v, "LIM
d1f0: 49 54 2b 4f 46 46 53 45 54 22 29 29 3b 0a 20 20  IT+OFFSET"));.  
d200: 20 20 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69      addr1 = sqli
d210: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
d220: 20 4f 50 5f 49 66 50 6f 73 2c 20 69 4c 69 6d 69   OP_IfPos, iLimi
d230: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
d240: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
d250: 50 5f 49 6e 74 65 67 65 72 2c 20 2d 31 2c 20 69  P_Integer, -1, i
d260: 4f 66 66 73 65 74 2b 31 29 3b 0a 20 20 20 20 20  Offset+1);.     
d270: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
d280: 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a  Here(v, addr1);.
d290: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66      }.  }.}..#if
d2a0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
d2b0: 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
d2c0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
d2d0: 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 63 6f  e appropriate co
d2e0: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
d2f0: 20 66 6f 72 20 74 68 65 20 69 43 6f 6c 2d 74 68   for the iCol-th
d300: 20 63 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a 20 74 68   column of.** th
d310: 65 20 72 65 73 75 6c 74 20 73 65 74 20 66 6f 72  e result set for
d320: 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 2d 73 65   the compound-se
d330: 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20 22  lect statement "
d340: 70 22 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c  p".  Return NULL
d350: 20 69 66 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d   if.** the colum
d360: 6e 20 68 61 73 20 6e 6f 20 64 65 66 61 75 6c 74  n has no default
d370: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
d380: 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  nce..**.** The c
d390: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
d3a0: 65 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 6f 75  e for the compou
d3b0: 6e 64 20 73 65 6c 65 63 74 20 69 73 20 74 61 6b  nd select is tak
d3c0: 65 6e 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 6c  en from the.** l
d3d0: 65 66 74 2d 6d 6f 73 74 20 74 65 72 6d 20 6f 66  eft-most term of
d3e0: 20 74 68 65 20 73 65 6c 65 63 74 20 74 68 61 74   the select that
d3f0: 20 68 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67   has a collating
d400: 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2f 0a 73 74   sequence..*/.st
d410: 61 74 69 63 20 43 6f 6c 6c 53 65 71 20 2a 6d 75  atic CollSeq *mu
d420: 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71  ltiSelectCollSeq
d430: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
d440: 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 69  Select *p, int i
d450: 43 6f 6c 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20  Col){.  CollSeq 
d460: 2a 70 52 65 74 3b 0a 20 20 69 66 28 20 70 2d 3e  *pRet;.  if( p->
d470: 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 70 52  pPrior ){.    pR
d480: 65 74 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74  et = multiSelect
d490: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
d4a0: 70 2d 3e 70 50 72 69 6f 72 2c 20 69 43 6f 6c 29  p->pPrior, iCol)
d4b0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
d4c0: 52 65 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61  Ret = 0;.  }.  a
d4d0: 73 73 65 72 74 28 20 69 43 6f 6c 3e 3d 30 20 29  ssert( iCol>=0 )
d4e0: 3b 0a 20 20 69 66 28 20 70 52 65 74 3d 3d 30 20  ;.  if( pRet==0 
d4f0: 26 26 20 69 43 6f 6c 3c 70 2d 3e 70 45 4c 69 73  && iCol<p->pELis
d500: 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  t->nExpr ){.    
d510: 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33 45 78  pRet = sqlite3Ex
d520: 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
d530: 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69  , p->pEList->a[i
d540: 43 6f 6c 5d 2e 70 45 78 70 72 29 3b 0a 20 20 7d  Col].pExpr);.  }
d550: 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a  .  return pRet;.
d560: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
d570: 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  TE_OMIT_COMPOUND
d580: 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 2f 2a 20 46  _SELECT */../* F
d590: 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65  orward reference
d5a0: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d   */.static int m
d5b0: 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42  ultiSelectOrderB
d5c0: 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  y(.  Parse *pPar
d5d0: 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61  se,        /* Pa
d5e0: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
d5f0: 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
d600: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
d610: 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45  right-most of SE
d620: 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f 64 65  LECTs to be code
d630: 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  d */.  SelectDes
d640: 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a 20  t *pDest     /* 
d650: 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20  What to do with 
d660: 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f  query results */
d670: 0a 29 3b 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51  .);...#ifndef SQ
d680: 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
d690: 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20  ND_SELECT./*.** 
d6a0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
d6b0: 63 61 6c 6c 65 64 20 74 6f 20 70 72 6f 63 65 73  called to proces
d6c0: 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65  s a compound que
d6d0: 72 79 20 66 6f 72 6d 20 66 72 6f 6d 0a 2a 2a 20  ry form from.** 
d6e0: 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73 65 70 61  two or more sepa
d6f0: 72 61 74 65 20 71 75 65 72 69 65 73 20 75 73 69  rate queries usi
d700: 6e 67 20 55 4e 49 4f 4e 2c 20 55 4e 49 4f 4e 20  ng UNION, UNION 
d710: 41 4c 4c 2c 20 45 58 43 45 50 54 2c 20 6f 72 0a  ALL, EXCEPT, or.
d720: 2a 2a 20 49 4e 54 45 52 53 45 43 54 0a 2a 2a 0a  ** INTERSECT.**.
d730: 2a 2a 20 22 70 22 20 70 6f 69 6e 74 73 20 74 6f  ** "p" points to
d740: 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
d750: 6f 66 20 74 68 65 20 74 77 6f 20 71 75 65 72 69  of the two queri
d760: 65 73 2e 20 20 74 68 65 20 71 75 65 72 79 20 6f  es.  the query o
d770: 6e 20 74 68 65 0a 2a 2a 20 6c 65 66 74 20 69 73  n the.** left is
d780: 20 70 2d 3e 70 50 72 69 6f 72 2e 20 20 54 68 65   p->pPrior.  The
d790: 20 6c 65 66 74 20 71 75 65 72 79 20 63 6f 75 6c   left query coul
d7a0: 64 20 61 6c 73 6f 20 62 65 20 61 20 63 6f 6d 70  d also be a comp
d7b0: 6f 75 6e 64 20 71 75 65 72 79 0a 2a 2a 20 69 6e  ound query.** in
d7c0: 20 77 68 69 63 68 20 63 61 73 65 20 74 68 69 73   which case this
d7d0: 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 62 65   routine will be
d7e0: 20 63 61 6c 6c 65 64 20 72 65 63 75 72 73 69 76   called recursiv
d7f0: 65 6c 79 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ely. .**.** The 
d800: 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 74  results of the t
d810: 6f 74 61 6c 20 71 75 65 72 79 20 61 72 65 20 74  otal query are t
d820: 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74  o be written int
d830: 6f 20 61 20 64 65 73 74 69 6e 61 74 69 6f 6e 0a  o a destination.
d840: 2a 2a 20 6f 66 20 74 79 70 65 20 65 44 65 73 74  ** of type eDest
d850: 20 77 69 74 68 20 70 61 72 61 6d 65 74 65 72 20   with parameter 
d860: 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78 61  iParm..**.** Exa
d870: 6d 70 6c 65 20 31 3a 20 20 43 6f 6e 73 69 64 65  mple 1:  Conside
d880: 72 20 61 20 74 68 72 65 65 2d 77 61 79 20 63 6f  r a three-way co
d890: 6d 70 6f 75 6e 64 20 53 51 4c 20 73 74 61 74 65  mpound SQL state
d8a0: 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ment..**.**     
d8b0: 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31  SELECT a FROM t1
d8c0: 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 62 20   UNION SELECT b 
d8d0: 46 52 4f 4d 20 74 32 20 55 4e 49 4f 4e 20 53 45  FROM t2 UNION SE
d8e0: 4c 45 43 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a  LECT c FROM t3.*
d8f0: 2a 0a 2a 2a 20 54 68 69 73 20 73 74 61 74 65 6d  *.** This statem
d900: 65 6e 74 20 69 73 20 70 61 72 73 65 64 20 75 70  ent is parsed up
d910: 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
d920: 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 63 20  **     SELECT c 
d930: 46 52 4f 4d 20 74 33 0a 2a 2a 20 20 20 20 20 20  FROM t3.**      
d940: 7c 0a 2a 2a 20 20 20 20 20 20 60 2d 2d 2d 2d 2d  |.**      `-----
d950: 3e 20 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d  >  SELECT b FROM
d960: 20 74 32 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   t2.**          
d970: 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
d980: 20 20 20 20 20 20 20 20 20 20 60 2d 2d 2d 2d 2d            `-----
d990: 2d 3e 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f  ->  SELECT a FRO
d9a0: 4d 20 74 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61  M t1.**.** The a
d9b0: 72 72 6f 77 73 20 69 6e 20 74 68 65 20 64 69 61  rrows in the dia
d9c0: 67 72 61 6d 20 61 62 6f 76 65 20 72 65 70 72 65  gram above repre
d9d0: 73 65 6e 74 20 74 68 65 20 53 65 6c 65 63 74 2e  sent the Select.
d9e0: 70 50 72 69 6f 72 20 70 6f 69 6e 74 65 72 2e 0a  pPrior pointer..
d9f0: 2a 2a 20 53 6f 20 69 66 20 74 68 69 73 20 72 6f  ** So if this ro
da00: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
da10: 77 69 74 68 20 70 20 65 71 75 61 6c 20 74 6f 20  with p equal to 
da20: 74 68 65 20 74 33 20 71 75 65 72 79 2c 20 74 68  the t3 query, th
da30: 65 6e 0a 2a 2a 20 70 50 72 69 6f 72 20 77 69 6c  en.** pPrior wil
da40: 6c 20 62 65 20 74 68 65 20 74 32 20 71 75 65 72  l be the t2 quer
da50: 79 2e 20 20 70 2d 3e 6f 70 20 77 69 6c 6c 20 62  y.  p->op will b
da60: 65 20 54 4b 5f 55 4e 49 4f 4e 20 69 6e 20 74 68  e TK_UNION in th
da70: 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e  is case..**.** N
da80: 6f 74 69 63 65 20 74 68 61 74 20 62 65 63 61 75  otice that becau
da90: 73 65 20 6f 66 20 74 68 65 20 77 61 79 20 53 51  se of the way SQ
daa0: 4c 69 74 65 20 70 61 72 73 65 73 20 63 6f 6d 70  Lite parses comp
dab0: 6f 75 6e 64 20 53 45 4c 45 43 54 73 2c 20 74 68  ound SELECTs, th
dac0: 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c 20  e.** individual 
dad0: 73 65 6c 65 63 74 73 20 61 6c 77 61 79 73 20 67  selects always g
dae0: 72 6f 75 70 20 66 72 6f 6d 20 6c 65 66 74 20 74  roup from left t
daf0: 6f 20 72 69 67 68 74 2e 0a 2a 2f 0a 73 74 61 74  o right..*/.stat
db00: 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65  ic int multiSele
db10: 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ct(.  Parse *pPa
db20: 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  rse,        /* P
db30: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
db40: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
db50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
db60: 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53   right-most of S
db70: 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f 64  ELECTs to be cod
db80: 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  ed */.  SelectDe
db90: 73 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a  st *pDest     /*
dba0: 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68   What to do with
dbb0: 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a   query results *
dbc0: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
dbd0: 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 2f 2a 20  SQLITE_OK;   /* 
dbe0: 53 75 63 63 65 73 73 20 63 6f 64 65 20 66 72 6f  Success code fro
dbf0: 6d 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  m a subroutine *
dc00: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69  /.  Select *pPri
dc10: 6f 72 3b 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f  or;       /* Ano
dc20: 74 68 65 72 20 53 45 4c 45 43 54 20 69 6d 6d 65  ther SELECT imme
dc30: 64 69 61 74 65 6c 79 20 74 6f 20 6f 75 72 20 6c  diately to our l
dc40: 65 66 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  eft */.  Vdbe *v
dc50: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
dc60: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
dc70: 74 6f 20 74 68 69 73 20 56 44 42 45 20 2a 2f 0a  to this VDBE */.
dc80: 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73    SelectDest des
dc90: 74 3b 20 20 20 20 20 20 2f 2a 20 41 6c 74 65 72  t;      /* Alter
dca0: 6e 61 74 69 76 65 20 64 61 74 61 20 64 65 73 74  native data dest
dcb0: 69 6e 61 74 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c  ination */.  Sel
dcc0: 65 63 74 20 2a 70 44 65 6c 65 74 65 20 3d 20 30  ect *pDelete = 0
dcd0: 3b 20 20 2f 2a 20 43 68 61 69 6e 20 6f 66 20 73  ;  /* Chain of s
dce0: 69 6d 70 6c 65 20 73 65 6c 65 63 74 73 20 74 6f  imple selects to
dcf0: 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20 73 71 6c   delete */.  sql
dd00: 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20  ite3 *db;       
dd10: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
dd20: 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 23 69 66  onnection */.#if
dd30: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
dd40: 5f 45 58 50 4c 41 49 4e 0a 20 20 69 6e 74 20 69  _EXPLAIN.  int i
dd50: 53 75 62 31 3b 20 20 20 20 20 20 20 20 20 20 20  Sub1;           
dd60: 20 2f 2a 20 45 51 50 20 69 64 20 6f 66 20 6c 65   /* EQP id of le
dd70: 66 74 2d 68 61 6e 64 20 71 75 65 72 79 20 2a 2f  ft-hand query */
dd80: 0a 20 20 69 6e 74 20 69 53 75 62 32 3b 20 20 20  .  int iSub2;   
dd90: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 51 50 20           /* EQP 
dda0: 69 64 20 6f 66 20 72 69 67 68 74 2d 68 61 6e 64  id of right-hand
ddb0: 20 71 75 65 72 79 20 2a 2f 0a 23 65 6e 64 69 66   query */.#endif
ddc0: 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
ddd0: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 4f 52 44   there is no ORD
dde0: 45 52 20 42 59 20 6f 72 20 4c 49 4d 49 54 20 63  ER BY or LIMIT c
ddf0: 6c 61 75 73 65 20 6f 6e 20 70 72 69 6f 72 20 53  lause on prior S
de00: 45 4c 45 43 54 73 2e 20 20 4f 6e 6c 79 0a 20 20  ELECTs.  Only.  
de10: 2a 2a 20 74 68 65 20 6c 61 73 74 20 28 72 69 67  ** the last (rig
de20: 68 74 2d 6d 6f 73 74 29 20 53 45 4c 45 43 54 20  ht-most) SELECT 
de30: 69 6e 20 74 68 65 20 73 65 72 69 65 73 20 6d 61  in the series ma
de40: 79 20 68 61 76 65 20 61 6e 20 4f 52 44 45 52 20  y have an ORDER 
de50: 42 59 20 6f 72 20 4c 49 4d 49 54 2e 0a 20 20 2a  BY or LIMIT..  *
de60: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 20 26 26  /.  assert( p &&
de70: 20 70 2d 3e 70 50 72 69 6f 72 20 29 3b 20 20 2f   p->pPrior );  /
de80: 2a 20 43 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  * Calling functi
de90: 6f 6e 20 67 75 61 72 61 6e 74 65 65 73 20 74 68  on guarantees th
dea0: 69 73 20 6d 75 63 68 20 2a 2f 0a 20 20 64 62 20  is much */.  db 
deb0: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
dec0: 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69  pPrior = p->pPri
ded0: 6f 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  or;.  assert( pP
dee0: 72 69 6f 72 2d 3e 70 52 69 67 68 74 6d 6f 73 74  rior->pRightmost
def0: 21 3d 70 50 72 69 6f 72 20 29 3b 0a 20 20 61 73  !=pPrior );.  as
df00: 73 65 72 74 28 20 70 50 72 69 6f 72 2d 3e 70 52  sert( pPrior->pR
df10: 69 67 68 74 6d 6f 73 74 3d 3d 70 2d 3e 70 52 69  ightmost==p->pRi
df20: 67 68 74 6d 6f 73 74 20 29 3b 0a 20 20 64 65 73  ghtmost );.  des
df30: 74 20 3d 20 2a 70 44 65 73 74 3b 0a 20 20 69 66  t = *pDest;.  if
df40: 28 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72  ( pPrior->pOrder
df50: 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  By ){.    sqlite
df60: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
df70: 2c 22 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  ,"ORDER BY claus
df80: 65 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20 61 66  e should come af
df90: 74 65 72 20 25 73 20 6e 6f 74 20 62 65 66 6f 72  ter %s not befor
dfa0: 65 22 2c 0a 20 20 20 20 20 20 73 65 6c 65 63 74  e",.      select
dfb0: 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a  OpName(p->op));.
dfc0: 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
dfd0: 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
dfe0: 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 69 66 28  t_end;.  }.  if(
dff0: 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20   pPrior->pLimit 
e000: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
e010: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22 4c  rorMsg(pParse,"L
e020: 49 4d 49 54 20 63 6c 61 75 73 65 20 73 68 6f 75  IMIT clause shou
e030: 6c 64 20 63 6f 6d 65 20 61 66 74 65 72 20 25 73  ld come after %s
e040: 20 6e 6f 74 20 62 65 66 6f 72 65 22 2c 0a 20 20   not before",.  
e050: 20 20 20 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65      selectOpName
e060: 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63  (p->op));.    rc
e070: 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d   = 1;.    goto m
e080: 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
e090: 0a 20 20 7d 0a 0a 20 20 76 20 3d 20 73 71 6c 69  .  }..  v = sqli
e0a0: 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
e0b0: 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21  e);.  assert( v!
e0c0: 3d 30 20 29 3b 20 20 2f 2a 20 54 68 65 20 56 44  =0 );  /* The VD
e0d0: 42 45 20 61 6c 72 65 61 64 79 20 63 72 65 61 74  BE already creat
e0e0: 65 64 20 62 79 20 63 61 6c 6c 69 6e 67 20 66 75  ed by calling fu
e0f0: 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20  nction */..  /* 
e100: 43 72 65 61 74 65 20 74 68 65 20 64 65 73 74 69  Create the desti
e110: 6e 61 74 69 6f 6e 20 74 65 6d 70 6f 72 61 72 79  nation temporary
e120: 20 74 61 62 6c 65 20 69 66 20 6e 65 63 65 73 73   table if necess
e130: 61 72 79 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64  ary.  */.  if( d
e140: 65 73 74 2e 65 44 65 73 74 3d 3d 53 52 54 5f 45  est.eDest==SRT_E
e150: 70 68 65 6d 54 61 62 20 29 7b 0a 20 20 20 20 61  phemTab ){.    a
e160: 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
e170: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   );.    sqlite3V
e180: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
e190: 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 64  OpenEphemeral, d
e1a0: 65 73 74 2e 69 53 44 50 61 72 6d 2c 20 70 2d 3e  est.iSDParm, p->
e1b0: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a  pEList->nExpr);.
e1c0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
e1d0: 68 61 6e 67 65 50 35 28 76 2c 20 42 54 52 45 45  hangeP5(v, BTREE
e1e0: 5f 55 4e 4f 52 44 45 52 45 44 29 3b 0a 20 20 20  _UNORDERED);.   
e1f0: 20 64 65 73 74 2e 65 44 65 73 74 20 3d 20 53 52   dest.eDest = SR
e200: 54 5f 54 61 62 6c 65 3b 0a 20 20 7d 0a 0a 20 20  T_Table;.  }..  
e210: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c  /* Make sure all
e220: 20 53 45 4c 45 43 54 73 20 69 6e 20 74 68 65 20   SELECTs in the 
e230: 73 74 61 74 65 6d 65 6e 74 20 68 61 76 65 20 74  statement have t
e240: 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f  he same number o
e250: 66 20 65 6c 65 6d 65 6e 74 73 0a 20 20 2a 2a 20  f elements.  ** 
e260: 69 6e 20 74 68 65 69 72 20 72 65 73 75 6c 74 20  in their result 
e270: 73 65 74 73 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  sets..  */.  ass
e280: 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 26  ert( p->pEList &
e290: 26 20 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74  & pPrior->pEList
e2a0: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 45 4c   );.  if( p->pEL
e2b0: 69 73 74 2d 3e 6e 45 78 70 72 21 3d 70 50 72 69  ist->nExpr!=pPri
e2c0: 6f 72 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  or->pEList->nExp
e2d0: 72 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  r ){.    if( p->
e2e0: 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 56 61  selFlags & SF_Va
e2f0: 6c 75 65 73 20 29 7b 0a 20 20 20 20 20 20 73 71  lues ){.      sq
e300: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
e310: 61 72 73 65 2c 20 22 61 6c 6c 20 56 41 4c 55 45  arse, "all VALUE
e320: 53 20 6d 75 73 74 20 68 61 76 65 20 74 68 65 20  S must have the 
e330: 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  same number of t
e340: 65 72 6d 73 22 29 3b 0a 20 20 20 20 7d 65 6c 73  erms");.    }els
e350: 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
e360: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
e370: 20 22 53 45 4c 45 43 54 73 20 74 6f 20 74 68 65   "SELECTs to the
e380: 20 6c 65 66 74 20 61 6e 64 20 72 69 67 68 74 20   left and right 
e390: 6f 66 20 25 73 22 0a 20 20 20 20 20 20 20 20 22  of %s".        "
e3a0: 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 68 65   do not have the
e3b0: 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20   same number of 
e3c0: 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 22 2c  result columns",
e3d0: 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d   selectOpName(p-
e3e0: 3e 6f 70 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  >op));.    }.   
e3f0: 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74   rc = 1;.    got
e400: 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
e410: 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f  nd;.  }..  /* Co
e420: 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 73 20 74  mpound SELECTs t
e430: 68 61 74 20 68 61 76 65 20 61 6e 20 4f 52 44 45  hat have an ORDE
e440: 52 20 42 59 20 63 6c 61 75 73 65 20 61 72 65 20  R BY clause are 
e450: 68 61 6e 64 6c 65 64 20 73 65 70 61 72 61 74 65  handled separate
e460: 6c 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ly..  */.  if( p
e470: 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ->pOrderBy ){.  
e480: 20 20 72 65 74 75 72 6e 20 6d 75 6c 74 69 53 65    return multiSe
e490: 6c 65 63 74 4f 72 64 65 72 42 79 28 70 50 61 72  lectOrderBy(pPar
e4a0: 73 65 2c 20 70 2c 20 70 44 65 73 74 29 3b 0a 20  se, p, pDest);. 
e4b0: 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74   }..  /* Generat
e4c0: 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 6c  e code for the l
e4d0: 65 66 74 20 61 6e 64 20 72 69 67 68 74 20 53 45  eft and right SE
e4e0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e  LECT statements.
e4f0: 0a 20 20 2a 2f 0a 20 20 73 77 69 74 63 68 28 20  .  */.  switch( 
e500: 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  p->op ){.    cas
e510: 65 20 54 4b 5f 41 4c 4c 3a 20 7b 0a 20 20 20 20  e TK_ALL: {.    
e520: 20 20 69 6e 74 20 61 64 64 72 20 3d 20 30 3b 0a    int addr = 0;.
e530: 20 20 20 20 20 20 69 6e 74 20 6e 4c 69 6d 69 74        int nLimit
e540: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
e550: 21 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20  !pPrior->pLimit 
e560: 29 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72 2d  );.      pPrior-
e570: 3e 69 4c 69 6d 69 74 20 3d 20 70 2d 3e 69 4c 69  >iLimit = p->iLi
e580: 6d 69 74 3b 0a 20 20 20 20 20 20 70 50 72 69 6f  mit;.      pPrio
e590: 72 2d 3e 69 4f 66 66 73 65 74 20 3d 20 70 2d 3e  r->iOffset = p->
e5a0: 69 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70  iOffset;.      p
e5b0: 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 3d 20  Prior->pLimit = 
e5c0: 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20  p->pLimit;.     
e5d0: 20 70 50 72 69 6f 72 2d 3e 70 4f 66 66 73 65 74   pPrior->pOffset
e5e0: 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20   = p->pOffset;. 
e5f0: 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49       explainSetI
e600: 6e 74 65 67 65 72 28 69 53 75 62 31 2c 20 70 50  nteger(iSub1, pP
e610: 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63  arse->iNextSelec
e620: 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  tId);.      rc =
e630: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
e640: 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26  Parse, pPrior, &
e650: 64 65 73 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e  dest);.      p->
e660: 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20  pLimit = 0;.    
e670: 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30    p->pOffset = 0
e680: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
e690: 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d  {.        goto m
e6a0: 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
e6b0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
e6c0: 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20  ->pPrior = 0;.  
e6d0: 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20      p->iLimit = 
e6e0: 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 3b 0a  pPrior->iLimit;.
e6f0: 20 20 20 20 20 20 70 2d 3e 69 4f 66 66 73 65 74        p->iOffset
e700: 20 3d 20 70 50 72 69 6f 72 2d 3e 69 4f 66 66 73   = pPrior->iOffs
e710: 65 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  et;.      if( p-
e720: 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20  >iLimit ){.     
e730: 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
e740: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
e750: 50 5f 49 66 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69  P_IfZero, p->iLi
e760: 6d 69 74 29 3b 0a 20 20 20 20 20 20 20 20 56 64  mit);.        Vd
e770: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4a  beComment((v, "J
e780: 75 6d 70 20 61 68 65 61 64 20 69 66 20 4c 49 4d  ump ahead if LIM
e790: 49 54 20 72 65 61 63 68 65 64 22 29 29 3b 0a 20  IT reached"));. 
e7a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 65 78 70       }.      exp
e7b0: 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69  lainSetInteger(i
e7c0: 53 75 62 32 2c 20 70 50 61 72 73 65 2d 3e 69 4e  Sub2, pParse->iN
e7d0: 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20  extSelectId);.  
e7e0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
e7f0: 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
e800: 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20 20  , &dest);.      
e810: 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51  testcase( rc!=SQ
e820: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
e830: 20 70 44 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50   pDelete = p->pP
e840: 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70  rior;.      p->p
e850: 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a  Prior = pPrior;.
e860: 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74        p->nSelect
e870: 52 6f 77 20 2b 3d 20 70 50 72 69 6f 72 2d 3e 6e  Row += pPrior->n
e880: 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20 20  SelectRow;.     
e890: 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70 4c 69   if( pPrior->pLi
e8a0: 6d 69 74 0a 20 20 20 20 20 20 20 26 26 20 73 71  mit.       && sq
e8b0: 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67  lite3ExprIsInteg
e8c0: 65 72 28 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69  er(pPrior->pLimi
e8d0: 74 2c 20 26 6e 4c 69 6d 69 74 29 0a 20 20 20 20  t, &nLimit).    
e8e0: 20 20 20 26 26 20 70 2d 3e 6e 53 65 6c 65 63 74     && p->nSelect
e8f0: 52 6f 77 20 3e 20 28 64 6f 75 62 6c 65 29 6e 4c  Row > (double)nL
e900: 69 6d 69 74 20 0a 20 20 20 20 20 20 29 7b 0a 20  imit .      ){. 
e910: 20 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63         p->nSelec
e920: 74 52 6f 77 20 3d 20 28 64 6f 75 62 6c 65 29 6e  tRow = (double)n
e930: 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 7d 0a 20  Limit;.      }. 
e940: 20 20 20 20 20 69 66 28 20 61 64 64 72 20 29 7b       if( addr ){
e950: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
e960: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
e970: 61 64 64 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  addr);.      }. 
e980: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
e990: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58  }.    case TK_EX
e9a0: 43 45 50 54 3a 0a 20 20 20 20 63 61 73 65 20 54  CEPT:.    case T
e9b0: 4b 5f 55 4e 49 4f 4e 3a 20 7b 0a 20 20 20 20 20  K_UNION: {.     
e9c0: 20 69 6e 74 20 75 6e 69 6f 6e 54 61 62 3b 20 20   int unionTab;  
e9d0: 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62    /* Cursor numb
e9e0: 65 72 20 6f 66 20 74 68 65 20 74 65 6d 70 6f 72  er of the tempor
e9f0: 61 72 79 20 74 61 62 6c 65 20 68 6f 6c 64 69 6e  ary table holdin
ea00: 67 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 20 20  g result */.    
ea10: 20 20 75 38 20 6f 70 20 3d 20 30 3b 20 20 20 20    u8 op = 0;    
ea20: 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65     /* One of the
ea30: 20 53 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e 73   SRT_ operations
ea40: 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 73 65 6c   to apply to sel
ea50: 66 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 70  f */.      int p
ea60: 72 69 6f 72 4f 70 3b 20 20 20 20 20 2f 2a 20 54  riorOp;     /* T
ea70: 68 65 20 53 52 54 5f 20 6f 70 65 72 61 74 69 6f  he SRT_ operatio
ea80: 6e 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 70 72  n to apply to pr
ea90: 69 6f 72 20 73 65 6c 65 63 74 73 20 2a 2f 0a 20  ior selects */. 
eaa0: 20 20 20 20 20 45 78 70 72 20 2a 70 4c 69 6d 69       Expr *pLimi
eab0: 74 2c 20 2a 70 4f 66 66 73 65 74 3b 20 2f 2a 20  t, *pOffset; /* 
eac0: 53 61 76 65 64 20 76 61 6c 75 65 73 20 6f 66 20  Saved values of 
ead0: 70 2d 3e 6e 4c 69 6d 69 74 20 61 6e 64 20 70 2d  p->nLimit and p-
eae0: 3e 6e 4f 66 66 73 65 74 20 2a 2f 0a 20 20 20 20  >nOffset */.    
eaf0: 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20    int addr;.    
eb00: 20 20 53 65 6c 65 63 74 44 65 73 74 20 75 6e 69    SelectDest uni
eb10: 6f 6e 64 65 73 74 3b 0a 0a 20 20 20 20 20 20 74  ondest;..      t
eb20: 65 73 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d  estcase( p->op==
eb30: 54 4b 5f 45 58 43 45 50 54 20 29 3b 0a 20 20 20  TK_EXCEPT );.   
eb40: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e     testcase( p->
eb50: 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a  op==TK_UNION );.
eb60: 20 20 20 20 20 20 70 72 69 6f 72 4f 70 20 3d 20        priorOp = 
eb70: 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20 20  SRT_Union;.     
eb80: 20 69 66 28 20 64 65 73 74 2e 65 44 65 73 74 3d   if( dest.eDest=
eb90: 3d 70 72 69 6f 72 4f 70 20 26 26 20 41 4c 57 41  =priorOp && ALWA
eba0: 59 53 28 21 70 2d 3e 70 4c 69 6d 69 74 20 26 26  YS(!p->pLimit &&
ebb0: 21 70 2d 3e 70 4f 66 66 73 65 74 29 20 29 7b 0a  !p->pOffset) ){.
ebc0: 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 63 61          /* We ca
ebd0: 6e 20 72 65 75 73 65 20 61 20 74 65 6d 70 6f 72  n reuse a tempor
ebe0: 61 72 79 20 74 61 62 6c 65 20 67 65 6e 65 72 61  ary table genera
ebf0: 74 65 64 20 62 79 20 61 20 53 45 4c 45 43 54 20  ted by a SELECT 
ec00: 74 6f 20 6f 75 72 0a 20 20 20 20 20 20 20 20 2a  to our.        *
ec10: 2a 20 72 69 67 68 74 2e 0a 20 20 20 20 20 20 20  * right..       
ec20: 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
ec30: 72 74 28 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73  rt( p->pRightmos
ec40: 74 21 3d 70 20 29 3b 20 20 2f 2a 20 43 61 6e 20  t!=p );  /* Can 
ec50: 6f 6e 6c 79 20 68 61 70 70 65 6e 20 66 6f 72 20  only happen for 
ec60: 6c 65 66 74 77 61 72 64 20 65 6c 65 6d 65 6e 74  leftward element
ec70: 73 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s.              
ec80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ec90: 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 61 20 33         ** of a 3
eca0: 2d 77 61 79 20 6f 72 20 6d 6f 72 65 20 63 6f 6d  -way or more com
ecb0: 70 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 20  pound */.       
ecc0: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4c 69 6d   assert( p->pLim
ecd0: 69 74 3d 3d 30 20 29 3b 20 20 20 20 20 20 2f 2a  it==0 );      /*
ece0: 20 4e 6f 74 20 61 6c 6c 6f 77 65 64 20 6f 6e 20   Not allowed on 
ecf0: 6c 65 66 74 77 61 72 64 20 65 6c 65 6d 65 6e 74  leftward element
ed00: 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73  s */.        ass
ed10: 65 72 74 28 20 70 2d 3e 70 4f 66 66 73 65 74 3d  ert( p->pOffset=
ed20: 3d 30 20 29 3b 20 20 20 20 20 2f 2a 20 4e 6f 74  =0 );     /* Not
ed30: 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 6c 65 66 74   allowed on left
ed40: 77 61 72 64 20 65 6c 65 6d 65 6e 74 73 20 2a 2f  ward elements */
ed50: 0a 20 20 20 20 20 20 20 20 75 6e 69 6f 6e 54 61  .        unionTa
ed60: 62 20 3d 20 64 65 73 74 2e 69 53 44 50 61 72 6d  b = dest.iSDParm
ed70: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
ed80: 20 20 20 20 20 20 20 2f 2a 20 57 65 20 77 69 6c         /* We wil
ed90: 6c 20 6e 65 65 64 20 74 6f 20 63 72 65 61 74 65  l need to create
eda0: 20 6f 75 72 20 6f 77 6e 20 74 65 6d 70 6f 72 61   our own tempora
edb0: 72 79 20 74 61 62 6c 65 20 74 6f 20 68 6f 6c 64  ry table to hold
edc0: 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
edd0: 69 6e 74 65 72 6d 65 64 69 61 74 65 20 72 65 73  intermediate res
ede0: 75 6c 74 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ults..        */
edf0: 0a 20 20 20 20 20 20 20 20 75 6e 69 6f 6e 54 61  .        unionTa
ee00: 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  b = pParse->nTab
ee10: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ++;.        asse
ee20: 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d  rt( p->pOrderBy=
ee30: 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61 64  =0 );.        ad
ee40: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
ee50: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65  AddOp2(v, OP_Ope
ee60: 6e 45 70 68 65 6d 65 72 61 6c 2c 20 75 6e 69 6f  nEphemeral, unio
ee70: 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20  nTab, 0);.      
ee80: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64    assert( p->add
ee90: 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20  rOpenEphm[0] == 
eea0: 2d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d  -1 );.        p-
eeb0: 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d  >addrOpenEphm[0]
eec0: 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20 20   = addr;.       
eed0: 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 2d 3e   p->pRightmost->
eee0: 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 55  selFlags |= SF_U
eef0: 73 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20  sesEphemeral;.  
ef00: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
ef10: 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20  >pEList );.     
ef20: 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64   }..      /* Cod
ef30: 65 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  e the SELECT sta
ef40: 74 65 6d 65 6e 74 73 20 74 6f 20 6f 75 72 20 6c  tements to our l
ef50: 65 66 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  eft.      */.   
ef60: 20 20 20 61 73 73 65 72 74 28 20 21 70 50 72 69     assert( !pPri
ef70: 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 29 3b 0a  or->pOrderBy );.
ef80: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
ef90: 65 63 74 44 65 73 74 49 6e 69 74 28 26 75 6e 69  ectDestInit(&uni
efa0: 6f 6e 64 65 73 74 2c 20 70 72 69 6f 72 4f 70 2c  ondest, priorOp,
efb0: 20 75 6e 69 6f 6e 54 61 62 29 3b 0a 20 20 20 20   unionTab);.    
efc0: 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65    explainSetInte
efd0: 67 65 72 28 69 53 75 62 31 2c 20 70 50 61 72 73  ger(iSub1, pPars
efe0: 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64  e->iNextSelectId
eff0: 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
f000: 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
f010: 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 75 6e 69  se, pPrior, &uni
f020: 6f 6e 64 65 73 74 29 3b 0a 20 20 20 20 20 20 69  ondest);.      i
f030: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
f040: 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
f050: 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a  ct_end;.      }.
f060: 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74  .      /* Code t
f070: 68 65 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43  he current SELEC
f080: 54 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 20 20  T statement.    
f090: 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
f0a0: 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20  ->op==TK_EXCEPT 
f0b0: 29 7b 0a 20 20 20 20 20 20 20 20 6f 70 20 3d 20  ){.        op = 
f0c0: 53 52 54 5f 45 78 63 65 70 74 3b 0a 20 20 20 20  SRT_Except;.    
f0d0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
f0e0: 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 3d 3d   assert( p->op==
f0f0: 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 20 20  TK_UNION );.    
f100: 20 20 20 20 6f 70 20 3d 20 53 52 54 5f 55 6e 69      op = SRT_Uni
f110: 6f 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  on;.      }.    
f120: 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b    p->pPrior = 0;
f130: 0a 20 20 20 20 20 20 70 4c 69 6d 69 74 20 3d 20  .      pLimit = 
f140: 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20  p->pLimit;.     
f150: 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a   p->pLimit = 0;.
f160: 20 20 20 20 20 20 70 4f 66 66 73 65 74 20 3d 20        pOffset = 
f170: 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20 20  p->pOffset;.    
f180: 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30    p->pOffset = 0
f190: 3b 0a 20 20 20 20 20 20 75 6e 69 6f 6e 64 65 73  ;.      uniondes
f1a0: 74 2e 65 44 65 73 74 20 3d 20 6f 70 3b 0a 20 20  t.eDest = op;.  
f1b0: 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e      explainSetIn
f1c0: 74 65 67 65 72 28 69 53 75 62 32 2c 20 70 50 61  teger(iSub2, pPa
f1d0: 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74  rse->iNextSelect
f1e0: 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  Id);.      rc = 
f1f0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
f200: 61 72 73 65 2c 20 70 2c 20 26 75 6e 69 6f 6e 64  arse, p, &uniond
f210: 65 73 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74  est);.      test
f220: 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45  case( rc!=SQLITE
f230: 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20  _OK );.      /* 
f240: 51 75 65 72 79 20 66 6c 61 74 74 65 6e 69 6e 67  Query flattening
f250: 20 69 6e 20 73 71 6c 69 74 65 33 53 65 6c 65 63   in sqlite3Selec
f260: 74 28 29 20 6d 69 67 68 74 20 72 65 66 69 6c 6c  t() might refill
f270: 20 70 2d 3e 70 4f 72 64 65 72 42 79 2e 0a 20 20   p->pOrderBy..  
f280: 20 20 20 20 2a 2a 20 42 65 20 73 75 72 65 20 74      ** Be sure t
f290: 6f 20 64 65 6c 65 74 65 20 70 2d 3e 70 4f 72 64  o delete p->pOrd
f2a0: 65 72 42 79 2c 20 74 68 65 72 65 66 6f 72 65 2c  erBy, therefore,
f2b0: 20 74 6f 20 61 76 6f 69 64 20 61 20 6d 65 6d 6f   to avoid a memo
f2c0: 72 79 20 6c 65 61 6b 2e 20 2a 2f 0a 20 20 20 20  ry leak. */.    
f2d0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
f2e0: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  tDelete(db, p->p
f2f0: 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 20 20  OrderBy);.      
f300: 70 44 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50 72  pDelete = p->pPr
f310: 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50  ior;.      p->pP
f320: 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20  rior = pPrior;. 
f330: 20 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79       p->pOrderBy
f340: 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20   = 0;.      if( 
f350: 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20  p->op==TK_UNION 
f360: 29 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20  ) p->nSelectRow 
f370: 2b 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65  += pPrior->nSele
f380: 63 74 52 6f 77 3b 0a 20 20 20 20 20 20 73 71 6c  ctRow;.      sql
f390: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
f3a0: 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20  b, p->pLimit);. 
f3b0: 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d       p->pLimit =
f3c0: 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70   pLimit;.      p
f3d0: 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f 66 66  ->pOffset = pOff
f3e0: 73 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4c  set;.      p->iL
f3f0: 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  imit = 0;.      
f400: 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b 0a  p->iOffset = 0;.
f410: 0a 20 20 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72  .      /* Conver
f420: 74 20 74 68 65 20 64 61 74 61 20 69 6e 20 74 68  t the data in th
f430: 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  e temporary tabl
f440: 65 20 69 6e 74 6f 20 77 68 61 74 65 76 65 72 20  e into whatever 
f450: 66 6f 72 6d 0a 20 20 20 20 20 20 2a 2a 20 69 74  form.      ** it
f460: 20 69 73 20 74 68 61 74 20 77 65 20 63 75 72 72   is that we curr
f470: 65 6e 74 6c 79 20 6e 65 65 64 2e 0a 20 20 20 20  ently need..    
f480: 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72    */.      asser
f490: 74 28 20 75 6e 69 6f 6e 54 61 62 3d 3d 64 65 73  t( unionTab==des
f4a0: 74 2e 69 53 44 50 61 72 6d 20 7c 7c 20 64 65 73  t.iSDParm || des
f4b0: 74 2e 65 44 65 73 74 21 3d 70 72 69 6f 72 4f 70  t.eDest!=priorOp
f4c0: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64 65   );.      if( de
f4d0: 73 74 2e 65 44 65 73 74 21 3d 70 72 69 6f 72 4f  st.eDest!=priorO
f4e0: 70 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  p ){.        int
f4f0: 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20   iCont, iBreak, 
f500: 69 53 74 61 72 74 3b 0a 20 20 20 20 20 20 20 20  iStart;.        
f510: 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73  assert( p->pELis
f520: 74 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  t );.        if(
f530: 20 64 65 73 74 2e 65 44 65 73 74 3d 3d 53 52 54   dest.eDest==SRT
f540: 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20 20  _Output ){.     
f550: 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 46 69       Select *pFi
f560: 72 73 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20  rst = p;.       
f570: 20 20 20 77 68 69 6c 65 28 20 70 46 69 72 73 74     while( pFirst
f580: 2d 3e 70 50 72 69 6f 72 20 29 20 70 46 69 72 73  ->pPrior ) pFirs
f590: 74 20 3d 20 70 46 69 72 73 74 2d 3e 70 50 72 69  t = pFirst->pPri
f5a0: 6f 72 3b 0a 20 20 20 20 20 20 20 20 20 20 67 65  or;.          ge
f5b0: 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65  nerateColumnName
f5c0: 73 28 70 50 61 72 73 65 2c 20 30 2c 20 70 46 69  s(pParse, 0, pFi
f5d0: 72 73 74 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  rst->pEList);.  
f5e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
f5f0: 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33  iBreak = sqlite3
f600: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
f610: 3b 0a 20 20 20 20 20 20 20 20 69 43 6f 6e 74 20  ;.        iCont 
f620: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
f630: 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
f640: 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52     computeLimitR
f650: 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c  egisters(pParse,
f660: 20 70 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20   p, iBreak);.   
f670: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
f680: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77  AddOp2(v, OP_Rew
f690: 69 6e 64 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69  ind, unionTab, i
f6a0: 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20  Break);.        
f6b0: 69 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33  iStart = sqlite3
f6c0: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
f6d0: 76 29 3b 0a 20 20 20 20 20 20 20 20 73 65 6c 65  v);.        sele
f6e0: 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72  ctInnerLoop(pPar
f6f0: 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74  se, p, p->pEList
f700: 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 70 2d 3e 70  , unionTab, p->p
f710: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 0a 20 20  EList->nExpr,.  
f720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f730: 20 20 20 20 20 20 30 2c 20 30 2c 20 26 64 65 73        0, 0, &des
f740: 74 2c 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b  t, iCont, iBreak
f750: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
f760: 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
f770: 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20  el(v, iCont);.  
f780: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
f790: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
f7a0: 78 74 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69 53  xt, unionTab, iS
f7b0: 74 61 72 74 29 3b 0a 20 20 20 20 20 20 20 20 73  tart);.        s
f7c0: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
f7d0: 65 4c 61 62 65 6c 28 76 2c 20 69 42 72 65 61 6b  eLabel(v, iBreak
f7e0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
f7f0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
f800: 4f 50 5f 43 6c 6f 73 65 2c 20 75 6e 69 6f 6e 54  OP_Close, unionT
f810: 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  ab, 0);.      }.
f820: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
f830: 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20   }.    default: 
f840: 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 3d 3d 54  assert( p->op==T
f850: 4b 5f 49 4e 54 45 52 53 45 43 54 20 29 3b 20 7b  K_INTERSECT ); {
f860: 0a 20 20 20 20 20 20 69 6e 74 20 74 61 62 31 2c  .      int tab1,
f870: 20 74 61 62 32 3b 0a 20 20 20 20 20 20 69 6e 74   tab2;.      int
f880: 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20   iCont, iBreak, 
f890: 69 53 74 61 72 74 3b 0a 20 20 20 20 20 20 45 78  iStart;.      Ex
f8a0: 70 72 20 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f 66  pr *pLimit, *pOf
f8b0: 66 73 65 74 3b 0a 20 20 20 20 20 20 69 6e 74 20  fset;.      int 
f8c0: 61 64 64 72 3b 0a 20 20 20 20 20 20 53 65 6c 65  addr;.      Sele
f8d0: 63 74 44 65 73 74 20 69 6e 74 65 72 73 65 63 74  ctDest intersect
f8e0: 64 65 73 74 3b 0a 20 20 20 20 20 20 69 6e 74 20  dest;.      int 
f8f0: 72 31 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 4e  r1;..      /* IN
f900: 54 45 52 53 45 43 54 20 69 73 20 64 69 66 66 65  TERSECT is diffe
f910: 72 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 6f 74  rent from the ot
f920: 68 65 72 73 20 73 69 6e 63 65 20 69 74 20 72 65  hers since it re
f930: 71 75 69 72 65 73 0a 20 20 20 20 20 20 2a 2a 20  quires.      ** 
f940: 74 77 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61  two temporary ta
f950: 62 6c 65 73 2e 20 20 48 65 6e 63 65 20 69 74 20  bles.  Hence it 
f960: 68 61 73 20 69 74 73 20 6f 77 6e 20 63 61 73 65  has its own case
f970: 2e 20 20 42 65 67 69 6e 0a 20 20 20 20 20 20 2a  .  Begin.      *
f980: 2a 20 62 79 20 61 6c 6c 6f 63 61 74 69 6e 67 20  * by allocating 
f990: 74 68 65 20 74 61 62 6c 65 73 20 77 65 20 77 69  the tables we wi
f9a0: 6c 6c 20 6e 65 65 64 2e 0a 20 20 20 20 20 20 2a  ll need..      *
f9b0: 2f 0a 20 20 20 20 20 20 74 61 62 31 20 3d 20 70  /.      tab1 = p
f9c0: 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
f9d0: 20 20 20 20 20 74 61 62 32 20 3d 20 70 50 61 72       tab2 = pPar
f9e0: 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
f9f0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72    assert( p->pOr
fa00: 64 65 72 42 79 3d 3d 30 20 29 3b 0a 0a 20 20 20  derBy==0 );..   
fa10: 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
fa20: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
fa30: 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
fa40: 20 74 61 62 31 2c 20 30 29 3b 0a 20 20 20 20 20   tab1, 0);.     
fa50: 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72   assert( p->addr
fa60: 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20 2d  OpenEphm[0] == -
fa70: 31 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64  1 );.      p->ad
fa80: 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20  drOpenEphm[0] = 
fa90: 61 64 64 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70  addr;.      p->p
faa0: 52 69 67 68 74 6d 6f 73 74 2d 3e 73 65 6c 46 6c  Rightmost->selFl
fab0: 61 67 73 20 7c 3d 20 53 46 5f 55 73 65 73 45 70  ags |= SF_UsesEp
fac0: 68 65 6d 65 72 61 6c 3b 0a 20 20 20 20 20 20 61  hemeral;.      a
fad0: 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
fae0: 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f   );..      /* Co
faf0: 64 65 20 74 68 65 20 53 45 4c 45 43 54 73 20 74  de the SELECTs t
fb00: 6f 20 6f 75 72 20 6c 65 66 74 20 69 6e 74 6f 20  o our left into 
fb10: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
fb20: 22 74 61 62 31 22 2e 0a 20 20 20 20 20 20 2a 2f  "tab1"..      */
fb30: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65  .      sqlite3Se
fb40: 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 69 6e  lectDestInit(&in
fb50: 74 65 72 73 65 63 74 64 65 73 74 2c 20 53 52 54  tersectdest, SRT
fb60: 5f 55 6e 69 6f 6e 2c 20 74 61 62 31 29 3b 0a 20  _Union, tab1);. 
fb70: 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49       explainSetI
fb80: 6e 74 65 67 65 72 28 69 53 75 62 31 2c 20 70 50  nteger(iSub1, pP
fb90: 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63  arse->iNextSelec
fba0: 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  tId);.      rc =
fbb0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
fbc0: 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26  Parse, pPrior, &
fbd0: 69 6e 74 65 72 73 65 63 74 64 65 73 74 29 3b 0a  intersectdest);.
fbe0: 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
fbf0: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c          goto mul
fc00: 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
fc10: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
fc20: 20 43 6f 64 65 20 74 68 65 20 63 75 72 72 65 6e   Code the curren
fc30: 74 20 53 45 4c 45 43 54 20 69 6e 74 6f 20 74 65  t SELECT into te
fc40: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 22 74  mporary table "t
fc50: 61 62 32 22 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ab2".      */.  
fc60: 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
fc70: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
fc80: 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
fc90: 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20 20 20 20  , tab2, 0);.    
fca0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64    assert( p->add
fcb0: 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 3d 20  rOpenEphm[1] == 
fcc0: 2d 31 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61  -1 );.      p->a
fcd0: 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d  ddrOpenEphm[1] =
fce0: 20 61 64 64 72 3b 0a 20 20 20 20 20 20 70 2d 3e   addr;.      p->
fcf0: 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20  pPrior = 0;.    
fd00: 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c    pLimit = p->pL
fd10: 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70  imit;.      p->p
fd20: 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20  Limit = 0;.     
fd30: 20 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f   pOffset = p->pO
fd40: 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e  ffset;.      p->
fd50: 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20  pOffset = 0;.   
fd60: 20 20 20 69 6e 74 65 72 73 65 63 74 64 65 73 74     intersectdest
fd70: 2e 69 53 44 50 61 72 6d 20 3d 20 74 61 62 32 3b  .iSDParm = tab2;
fd80: 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65  .      explainSe
fd90: 74 49 6e 74 65 67 65 72 28 69 53 75 62 32 2c 20  tInteger(iSub2, 
fda0: 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c  pParse->iNextSel
fdb0: 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63  ectId);.      rc
fdc0: 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
fdd0: 28 70 50 61 72 73 65 2c 20 70 2c 20 26 69 6e 74  (pParse, p, &int
fde0: 65 72 73 65 63 74 64 65 73 74 29 3b 0a 20 20 20  ersectdest);.   
fdf0: 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21     testcase( rc!
fe00: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
fe10: 20 20 20 20 70 44 65 6c 65 74 65 20 3d 20 70 2d      pDelete = p-
fe20: 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70  >pPrior;.      p
fe30: 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f  ->pPrior = pPrio
fe40: 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  r;.      if( p->
fe50: 6e 53 65 6c 65 63 74 52 6f 77 3e 70 50 72 69 6f  nSelectRow>pPrio
fe60: 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 29 20  r->nSelectRow ) 
fe70: 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20  p->nSelectRow = 
fe80: 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52  pPrior->nSelectR
fe90: 6f 77 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ow;.      sqlite
fea0: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
feb0: 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20  p->pLimit);.    
fec0: 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c    p->pLimit = pL
fed0: 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70  imit;.      p->p
fee0: 4f 66 66 73 65 74 20 3d 20 70 4f 66 66 73 65 74  Offset = pOffset
fef0: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65  ;..      /* Gene
ff00: 72 61 74 65 20 63 6f 64 65 20 74 6f 20 74 61 6b  rate code to tak
ff10: 65 20 74 68 65 20 69 6e 74 65 72 73 65 63 74 69  e the intersecti
ff20: 6f 6e 20 6f 66 20 74 68 65 20 74 77 6f 20 74 65  on of the two te
ff30: 6d 70 6f 72 61 72 79 0a 20 20 20 20 20 20 2a 2a  mporary.      **
ff40: 20 74 61 62 6c 65 73 2e 0a 20 20 20 20 20 20 2a   tables..      *
ff50: 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
ff60: 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20  p->pEList );.   
ff70: 20 20 20 69 66 28 20 64 65 73 74 2e 65 44 65 73     if( dest.eDes
ff80: 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 7b  t==SRT_Output ){
ff90: 0a 20 20 20 20 20 20 20 20 53 65 6c 65 63 74 20  .        Select 
ffa0: 2a 70 46 69 72 73 74 20 3d 20 70 3b 0a 20 20 20  *pFirst = p;.   
ffb0: 20 20 20 20 20 77 68 69 6c 65 28 20 70 46 69 72       while( pFir
ffc0: 73 74 2d 3e 70 50 72 69 6f 72 20 29 20 70 46 69  st->pPrior ) pFi
ffd0: 72 73 74 20 3d 20 70 46 69 72 73 74 2d 3e 70 50  rst = pFirst->pP
ffe0: 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 67 65  rior;.        ge
fff0: 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65  nerateColumnName
10000 73 28 70 50 61 72 73 65 2c 20 30 2c 20 70 46 69  s(pParse, 0, pFi
10010 72 73 74 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  rst->pEList);.  
10020 20 20 20 20 7d 0a 20 20 20 20 20 20 69 42 72 65      }.      iBre
10030 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ak = sqlite3Vdbe
10040 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
10050 20 20 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69      iCont = sqli
10060 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
10070 28 76 29 3b 0a 20 20 20 20 20 20 63 6f 6d 70 75  (v);.      compu
10080 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73  teLimitRegisters
10090 28 70 50 61 72 73 65 2c 20 70 2c 20 69 42 72 65  (pParse, p, iBre
100a0 61 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ak);.      sqlit
100b0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
100c0 4f 50 5f 52 65 77 69 6e 64 2c 20 74 61 62 31 2c  OP_Rewind, tab1,
100d0 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
100e0 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
100f0 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
10100 20 20 20 20 20 20 69 53 74 61 72 74 20 3d 20 73        iStart = s
10110 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
10120 28 76 2c 20 4f 50 5f 52 6f 77 4b 65 79 2c 20 74  (v, OP_RowKey, t
10130 61 62 31 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  ab1, r1);.      
10140 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10150 34 49 6e 74 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f  4Int(v, OP_NotFo
10160 75 6e 64 2c 20 74 61 62 32 2c 20 69 43 6f 6e 74  und, tab2, iCont
10170 2c 20 72 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  , r1, 0);.      
10180 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
10190 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31  mpReg(pParse, r1
101a0 29 3b 0a 20 20 20 20 20 20 73 65 6c 65 63 74 49  );.      selectI
101b0 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c  nnerLoop(pParse,
101c0 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 74   p, p->pEList, t
101d0 61 62 31 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  ab1, p->pEList->
101e0 6e 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20  nExpr,.         
101f0 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20               0, 
10200 30 2c 20 26 64 65 73 74 2c 20 69 43 6f 6e 74 2c  0, &dest, iCont,
10210 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
10220 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
10230 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74  veLabel(v, iCont
10240 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
10250 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
10260 5f 4e 65 78 74 2c 20 74 61 62 31 2c 20 69 53 74  _Next, tab1, iSt
10270 61 72 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  art);.      sqli
10280 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
10290 62 65 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a  bel(v, iBreak);.
102a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
102b0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c  eAddOp2(v, OP_Cl
102c0 6f 73 65 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20  ose, tab2, 0);. 
102d0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
102e0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f  AddOp2(v, OP_Clo
102f0 73 65 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20 20  se, tab1, 0);.  
10300 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
10310 0a 20 20 7d 0a 0a 20 20 65 78 70 6c 61 69 6e 43  .  }..  explainC
10320 6f 6d 70 6f 73 69 74 65 28 70 50 61 72 73 65 2c  omposite(pParse,
10330 20 70 2d 3e 6f 70 2c 20 69 53 75 62 31 2c 20 69   p->op, iSub1, i
10340 53 75 62 32 2c 20 70 2d 3e 6f 70 21 3d 54 4b 5f  Sub2, p->op!=TK_
10350 41 4c 4c 29 3b 0a 0a 20 20 2f 2a 20 43 6f 6d 70  ALL);..  /* Comp
10360 75 74 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  ute collating se
10370 71 75 65 6e 63 65 73 20 75 73 65 64 20 62 79 20  quences used by 
10380 0a 20 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20  .  ** temporary 
10390 74 61 62 6c 65 73 20 6e 65 65 64 65 64 20 74 6f  tables needed to
103a0 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 63   implement the c
103b0 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a  ompound select..
103c0 20 20 2a 2a 20 41 74 74 61 63 68 20 74 68 65 20    ** Attach the 
103d0 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
103e0 65 20 74 6f 20 61 6c 6c 20 74 65 6d 70 6f 72 61  e to all tempora
103f0 72 79 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a  ry tables..  **.
10400 20 20 2a 2a 20 54 68 69 73 20 73 65 63 74 69 6f    ** This sectio
10410 6e 20 69 73 20 72 75 6e 20 62 79 20 74 68 65 20  n is run by the 
10420 72 69 67 68 74 2d 6d 6f 73 74 20 53 45 4c 45 43  right-most SELEC
10430 54 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 6c 79  T statement only
10440 2e 0a 20 20 2a 2a 20 53 45 4c 45 43 54 20 73 74  ..  ** SELECT st
10450 61 74 65 6d 65 6e 74 73 20 74 6f 20 74 68 65 20  atements to the 
10460 6c 65 66 74 20 61 6c 77 61 79 73 20 73 6b 69 70  left always skip
10470 20 74 68 69 73 20 70 61 72 74 2e 20 20 54 68 65   this part.  The
10480 20 72 69 67 68 74 2d 6d 6f 73 74 0a 20 20 2a 2a   right-most.  **
10490 20 53 45 4c 45 43 54 20 6d 69 67 68 74 20 61 6c   SELECT might al
104a0 73 6f 20 73 6b 69 70 20 74 68 69 73 20 70 61 72  so skip this par
104b0 74 20 69 66 20 69 74 20 68 61 73 20 6e 6f 20 4f  t if it has no O
104c0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61  RDER BY clause a
104d0 6e 64 0a 20 20 2a 2a 20 6e 6f 20 74 65 6d 70 20  nd.  ** no temp 
104e0 74 61 62 6c 65 73 20 61 72 65 20 72 65 71 75 69  tables are requi
104f0 72 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  red..  */.  if( 
10500 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
10510 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c 20 29  _UsesEphemeral )
10520 7b 0a 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20  {.    int i;    
10530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10540 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
10550 74 65 72 20 2a 2f 0a 20 20 20 20 4b 65 79 49 6e  ter */.    KeyIn
10560 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 20 20 20  fo *pKeyInfo;   
10570 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c           /* Coll
10580 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66  ating sequence f
10590 6f 72 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  or the result se
105a0 74 20 2a 2f 0a 20 20 20 20 53 65 6c 65 63 74 20  t */.    Select 
105b0 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20  *pLoop;         
105c0 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f         /* For lo
105d0 6f 70 69 6e 67 20 74 68 72 6f 75 67 68 20 53 45  oping through SE
105e0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20  LECT statements 
105f0 2a 2f 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  */.    CollSeq *
10600 2a 61 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20  *apColl;        
10610 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70       /* For loop
10620 69 6e 67 20 74 68 72 6f 75 67 68 20 70 4b 65 79  ing through pKey
10630 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 5d 20 2a 2f  Info->aColl[] */
10640 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20  .    int nCol;  
10650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10660 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
10670 63 6f 6c 75 6d 6e 73 20 69 6e 20 72 65 73 75 6c  columns in resul
10680 74 20 73 65 74 20 2a 2f 0a 0a 20 20 20 20 61 73  t set */..    as
10690 73 65 72 74 28 20 70 2d 3e 70 52 69 67 68 74 6d  sert( p->pRightm
106a0 6f 73 74 3d 3d 70 20 29 3b 0a 20 20 20 20 6e 43  ost==p );.    nC
106b0 6f 6c 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  ol = p->pEList->
106c0 6e 45 78 70 72 3b 0a 20 20 20 20 70 4b 65 79 49  nExpr;.    pKeyI
106d0 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  nfo = sqlite3DbM
106e0 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 0a 20 20  allocZero(db,.  
106f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10700 20 20 20 20 20 73 69 7a 65 6f 66 28 2a 70 4b 65       sizeof(*pKe
10710 79 49 6e 66 6f 29 2b 6e 43 6f 6c 2a 28 73 69 7a  yInfo)+nCol*(siz
10720 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 20 2b 20  eof(CollSeq*) + 
10730 31 29 29 3b 0a 20 20 20 20 69 66 28 20 21 70 4b  1));.    if( !pK
10740 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20  eyInfo ){.      
10750 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
10760 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 75  M;.      goto mu
10770 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
10780 20 20 20 20 7d 0a 0a 20 20 20 20 70 4b 65 79 49      }..    pKeyI
10790 6e 66 6f 2d 3e 65 6e 63 20 3d 20 45 4e 43 28 64  nfo->enc = ENC(d
107a0 62 29 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f  b);.    pKeyInfo
107b0 2d 3e 6e 46 69 65 6c 64 20 3d 20 28 75 31 36 29  ->nField = (u16)
107c0 6e 43 6f 6c 3b 0a 0a 20 20 20 20 66 6f 72 28 69  nCol;..    for(i
107d0 3d 30 2c 20 61 70 43 6f 6c 6c 3d 70 4b 65 79 49  =0, apColl=pKeyI
107e0 6e 66 6f 2d 3e 61 43 6f 6c 6c 3b 20 69 3c 6e 43  nfo->aColl; i<nC
107f0 6f 6c 3b 20 69 2b 2b 2c 20 61 70 43 6f 6c 6c 2b  ol; i++, apColl+
10800 2b 29 7b 0a 20 20 20 20 20 20 2a 61 70 43 6f 6c  +){.      *apCol
10810 6c 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43  l = multiSelectC
10820 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
10830 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , i);.      if( 
10840 30 3d 3d 2a 61 70 43 6f 6c 6c 20 29 7b 0a 20 20  0==*apColl ){.  
10850 20 20 20 20 20 20 2a 61 70 43 6f 6c 6c 20 3d 20        *apColl = 
10860 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20  db->pDfltColl;. 
10870 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
10880 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74   pKeyInfo->aSort
10890 4f 72 64 65 72 20 3d 20 28 75 38 2a 29 61 70 43  Order = (u8*)apC
108a0 6f 6c 6c 3b 0a 0a 20 20 20 20 66 6f 72 28 70 4c  oll;..    for(pL
108b0 6f 6f 70 3d 70 3b 20 70 4c 6f 6f 70 3b 20 70 4c  oop=p; pLoop; pL
108c0 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 50 72 69 6f  oop=pLoop->pPrio
108d0 72 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  r){.      for(i=
108e0 30 3b 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20 20  0; i<2; i++){.  
108f0 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 20 3d        int addr =
10900 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e   pLoop->addrOpen
10910 45 70 68 6d 5b 69 5d 3b 0a 20 20 20 20 20 20 20  Ephm[i];.       
10920 20 69 66 28 20 61 64 64 72 3c 30 20 29 7b 0a 20   if( addr<0 ){. 
10930 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 5b           /* If [
10940 30 5d 20 69 73 20 75 6e 75 73 65 64 20 74 68 65  0] is unused the
10950 6e 20 5b 31 5d 20 69 73 20 61 6c 73 6f 20 75 6e  n [1] is also un
10960 75 73 65 64 2e 20 20 53 6f 20 77 65 20 63 61 6e  used.  So we can
10970 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6c  .          ** al
10980 77 61 79 73 20 73 61 66 65 6c 79 20 61 62 6f 72  ways safely abor
10990 74 20 61 73 20 73 6f 6f 6e 20 61 73 20 74 68 65  t as soon as the
109a0 20 66 69 72 73 74 20 75 6e 75 73 65 64 20 73 6c   first unused sl
109b0 6f 74 20 69 73 20 66 6f 75 6e 64 20 2a 2f 0a 20  ot is found */. 
109c0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
109d0 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e   pLoop->addrOpen
109e0 45 70 68 6d 5b 31 5d 3c 30 20 29 3b 0a 20 20 20  Ephm[1]<0 );.   
109f0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
10a00 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
10a10 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
10a20 65 50 32 28 76 2c 20 61 64 64 72 2c 20 6e 43 6f  eP2(v, addr, nCo
10a30 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  l);.        sqli
10a40 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28  te3VdbeChangeP4(
10a50 76 2c 20 61 64 64 72 2c 20 28 63 68 61 72 2a 29  v, addr, (char*)
10a60 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59  pKeyInfo, P4_KEY
10a70 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 20 20 70  INFO);.        p
10a80 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70  Loop->addrOpenEp
10a90 68 6d 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20 20 20  hm[i] = -1;.    
10aa0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
10ab0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
10ac0 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 7d 0a 0a  pKeyInfo);.  }..
10ad0 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
10ae0 3a 0a 20 20 70 44 65 73 74 2d 3e 69 53 64 73 74  :.  pDest->iSdst
10af0 20 3d 20 64 65 73 74 2e 69 53 64 73 74 3b 0a 20   = dest.iSdst;. 
10b00 20 70 44 65 73 74 2d 3e 6e 53 64 73 74 20 3d 20   pDest->nSdst = 
10b10 64 65 73 74 2e 6e 53 64 73 74 3b 0a 20 20 73 71  dest.nSdst;.  sq
10b20 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
10b30 65 28 64 62 2c 20 70 44 65 6c 65 74 65 29 3b 0a  e(db, pDelete);.
10b40 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
10b50 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
10b60 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  OMIT_COMPOUND_SE
10b70 4c 45 43 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43  LECT */../*.** C
10b80 6f 64 65 20 61 6e 20 6f 75 74 70 75 74 20 73 75  ode an output su
10b90 62 72 6f 75 74 69 6e 65 20 66 6f 72 20 61 20 63  broutine for a c
10ba0 6f 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65  oroutine impleme
10bb0 6e 74 61 74 69 6f 6e 20 6f 66 20 61 0a 2a 2a 20  ntation of a.** 
10bc0 53 45 4c 45 43 54 20 73 74 61 74 6d 65 6e 74 2e  SELECT statment.
10bd0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 61 74 61 20  .**.** The data 
10be0 74 6f 20 62 65 20 6f 75 74 70 75 74 20 69 73 20  to be output is 
10bf0 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 70 49 6e  contained in pIn
10c00 2d 3e 69 53 64 73 74 2e 20 20 54 68 65 72 65 20  ->iSdst.  There 
10c10 61 72 65 0a 2a 2a 20 70 49 6e 2d 3e 6e 53 64 73  are.** pIn->nSds
10c20 74 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20  t columns to be 
10c30 6f 75 74 70 75 74 2e 20 20 70 44 65 73 74 20 69  output.  pDest i
10c40 73 20 77 68 65 72 65 20 74 68 65 20 6f 75 74 70  s where the outp
10c50 75 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20  ut should.** be 
10c60 73 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 72 65 67 52  sent..**.** regR
10c70 65 74 75 72 6e 20 69 73 20 74 68 65 20 6e 75 6d  eturn is the num
10c80 62 65 72 20 6f 66 20 74 68 65 20 72 65 67 69 73  ber of the regis
10c90 74 65 72 20 68 6f 6c 64 69 6e 67 20 74 68 65 20  ter holding the 
10ca0 73 75 62 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65  subroutine.** re
10cb0 74 75 72 6e 20 61 64 64 72 65 73 73 2e 0a 2a 2a  turn address..**
10cc0 0a 2a 2a 20 49 66 20 72 65 67 50 72 65 76 3e 30  .** If regPrev>0
10cd0 20 74 68 65 6e 20 69 74 20 69 73 20 74 68 65 20   then it is the 
10ce0 66 69 72 73 74 20 72 65 67 69 73 74 65 72 20 69  first register i
10cf0 6e 20 61 20 76 65 63 74 6f 72 20 74 68 61 74 0a  n a vector that.
10d00 2a 2a 20 72 65 63 6f 72 64 73 20 74 68 65 20 70  ** records the p
10d10 72 65 76 69 6f 75 73 20 6f 75 74 70 75 74 2e 20  revious output. 
10d20 20 6d 65 6d 5b 72 65 67 50 72 65 76 5d 20 69 73   mem[regPrev] is
10d30 20 61 20 66 6c 61 67 20 74 68 61 74 20 69 73 20   a flag that is 
10d40 66 61 6c 73 65 0a 2a 2a 20 69 66 20 74 68 65 72  false.** if ther
10d50 65 20 68 61 73 20 62 65 65 6e 20 6e 6f 20 70 72  e has been no pr
10d60 65 76 69 6f 75 73 20 6f 75 74 70 75 74 2e 20 20  evious output.  
10d70 49 66 20 72 65 67 50 72 65 76 3e 30 20 74 68 65  If regPrev>0 the
10d80 6e 20 63 6f 64 65 20 69 73 0a 2a 2a 20 67 65 6e  n code is.** gen
10d90 65 72 61 74 65 64 20 74 6f 20 73 75 70 70 72 65  erated to suppre
10da0 73 73 20 64 75 70 6c 69 63 61 74 65 73 2e 20 20  ss duplicates.  
10db0 70 4b 65 79 49 6e 66 6f 20 69 73 20 75 73 65 64  pKeyInfo is used
10dc0 20 66 6f 72 20 63 6f 6d 70 61 72 69 6e 67 0a 2a   for comparing.*
10dd0 2a 20 6b 65 79 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  * keys..**.** If
10de0 20 74 68 65 20 4c 49 4d 49 54 20 66 6f 75 6e 64   the LIMIT found
10df0 20 69 6e 20 70 2d 3e 69 4c 69 6d 69 74 20 69 73   in p->iLimit is
10e00 20 72 65 61 63 68 65 64 2c 20 6a 75 6d 70 20 69   reached, jump i
10e10 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 0a 2a 2a  mmediately to.**
10e20 20 69 42 72 65 61 6b 2e 0a 2a 2f 0a 73 74 61 74   iBreak..*/.stat
10e30 69 63 20 69 6e 74 20 67 65 6e 65 72 61 74 65 4f  ic int generateO
10e40 75 74 70 75 74 53 75 62 72 6f 75 74 69 6e 65 28  utputSubroutine(
10e50 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
10e60 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
10e70 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
10e80 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
10e90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
10ea0 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
10eb0 6e 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  nt */.  SelectDe
10ec0 73 74 20 2a 70 49 6e 2c 20 20 20 20 20 20 20 20  st *pIn,        
10ed0 2f 2a 20 43 6f 72 6f 75 74 69 6e 65 20 73 75 70  /* Coroutine sup
10ee0 70 6c 79 69 6e 67 20 64 61 74 61 20 2a 2f 0a 20  plying data */. 
10ef0 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65   SelectDest *pDe
10f00 73 74 2c 20 20 20 20 20 20 2f 2a 20 57 68 65 72  st,      /* Wher
10f10 65 20 74 6f 20 73 65 6e 64 20 74 68 65 20 64 61  e to send the da
10f20 74 61 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52  ta */.  int regR
10f30 65 74 75 72 6e 2c 20 20 20 20 20 20 20 20 20 20  eturn,          
10f40 2f 2a 20 54 68 65 20 72 65 74 75 72 6e 20 61 64  /* The return ad
10f50 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20 2a  dress register *
10f60 2f 0a 20 20 69 6e 74 20 72 65 67 50 72 65 76 2c  /.  int regPrev,
10f70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
10f80 72 65 76 69 6f 75 73 20 72 65 73 75 6c 74 20 72  revious result r
10f90 65 67 69 73 74 65 72 2e 20 20 4e 6f 20 75 6e 69  egister.  No uni
10fa0 71 75 65 6e 65 73 73 20 69 66 20 30 20 2a 2f 0a  queness if 0 */.
10fb0 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
10fc0 6e 66 6f 2c 20 20 20 20 20 20 2f 2a 20 46 6f 72  nfo,      /* For
10fd0 20 63 6f 6d 70 61 72 69 6e 67 20 77 69 74 68 20   comparing with 
10fe0 70 72 65 76 69 6f 75 73 20 65 6e 74 72 79 20 2a  previous entry *
10ff0 2f 0a 20 20 69 6e 74 20 70 34 74 79 70 65 2c 20  /.  int p4type, 
11000 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
11010 68 65 20 70 34 20 74 79 70 65 20 66 6f 72 20 70  he p4 type for p
11020 4b 65 79 49 6e 66 6f 20 2a 2f 0a 20 20 69 6e 74  KeyInfo */.  int
11030 20 69 42 72 65 61 6b 20 20 20 20 20 20 20 20 20   iBreak         
11040 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72       /* Jump her
11050 65 20 69 66 20 77 65 20 68 69 74 20 74 68 65 20  e if we hit the 
11060 4c 49 4d 49 54 20 2a 2f 0a 29 7b 0a 20 20 56 64  LIMIT */.){.  Vd
11070 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
11080 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 43 6f  pVdbe;.  int iCo
11090 6e 74 69 6e 75 65 3b 0a 20 20 69 6e 74 20 61 64  ntinue;.  int ad
110a0 64 72 3b 0a 0a 20 20 61 64 64 72 20 3d 20 73 71  dr;..  addr = sq
110b0 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
110c0 41 64 64 72 28 76 29 3b 0a 20 20 69 43 6f 6e 74  Addr(v);.  iCont
110d0 69 6e 75 65 20 3d 20 73 71 6c 69 74 65 33 56 64  inue = sqlite3Vd
110e0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
110f0 0a 20 20 2f 2a 20 53 75 70 70 72 65 73 73 20 64  .  /* Suppress d
11100 75 70 6c 69 63 61 74 65 73 20 66 6f 72 20 55 4e  uplicates for UN
11110 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20 61 6e 64  ION, EXCEPT, and
11120 20 49 4e 54 45 52 53 45 43 54 20 0a 20 20 2a 2f   INTERSECT .  */
11130 0a 20 20 69 66 28 20 72 65 67 50 72 65 76 20 29  .  if( regPrev )
11140 7b 0a 20 20 20 20 69 6e 74 20 6a 31 2c 20 6a 32  {.    int j1, j2
11150 3b 0a 20 20 20 20 6a 31 20 3d 20 73 71 6c 69 74  ;.    j1 = sqlit
11160 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
11170 4f 50 5f 49 66 4e 6f 74 2c 20 72 65 67 50 72 65  OP_IfNot, regPre
11180 76 29 3b 0a 20 20 20 20 6a 32 20 3d 20 73 71 6c  v);.    j2 = sql
11190 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
111a0 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 70 49  , OP_Compare, pI
111b0 6e 2d 3e 69 53 64 73 74 2c 20 72 65 67 50 72 65  n->iSdst, regPre
111c0 76 2b 31 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 2c  v+1, pIn->nSdst,
111d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
111e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
111f0 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20  char*)pKeyInfo, 
11200 70 34 74 79 70 65 29 3b 0a 20 20 20 20 73 71 6c  p4type);.    sql
11210 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
11220 2c 20 4f 50 5f 4a 75 6d 70 2c 20 6a 32 2b 32 2c  , OP_Jump, j2+2,
11230 20 69 43 6f 6e 74 69 6e 75 65 2c 20 6a 32 2b 32   iContinue, j2+2
11240 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
11250 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 31  beJumpHere(v, j1
11260 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
11270 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
11280 6f 70 79 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c  opy, pIn->iSdst,
11290 20 72 65 67 50 72 65 76 2b 31 2c 20 70 49 6e 2d   regPrev+1, pIn-
112a0 3e 6e 53 64 73 74 2d 31 29 3b 0a 20 20 20 20 73  >nSdst-1);.    s
112b0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
112c0 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
112d0 31 2c 20 72 65 67 50 72 65 76 29 3b 0a 20 20 7d  1, regPrev);.  }
112e0 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64  .  if( pParse->d
112f0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
11300 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f  ) return 0;..  /
11310 2a 20 53 75 70 70 72 65 73 73 20 74 68 65 20 66  * Suppress the f
11320 69 72 73 74 20 4f 46 46 53 45 54 20 65 6e 74 72  irst OFFSET entr
11330 69 65 73 20 69 66 20 74 68 65 72 65 20 69 73 20  ies if there is 
11340 61 6e 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65  an OFFSET clause
11350 0a 20 20 2a 2f 0a 20 20 63 6f 64 65 4f 66 66 73  .  */.  codeOffs
11360 65 74 28 76 2c 20 70 2c 20 69 43 6f 6e 74 69 6e  et(v, p, iContin
11370 75 65 29 3b 0a 0a 20 20 73 77 69 74 63 68 28 20  ue);..  switch( 
11380 70 44 65 73 74 2d 3e 65 44 65 73 74 20 29 7b 0a  pDest->eDest ){.
11390 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65      /* Store the
113a0 20 72 65 73 75 6c 74 20 61 73 20 64 61 74 61 20   result as data 
113b0 75 73 69 6e 67 20 61 20 75 6e 69 71 75 65 20 6b  using a unique k
113c0 65 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ey..    */.    c
113d0 61 73 65 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20  ase SRT_Table:. 
113e0 20 20 20 63 61 73 65 20 53 52 54 5f 45 70 68 65     case SRT_Ephe
113f0 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20 20 69 6e  mTab: {.      in
11400 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65  t r1 = sqlite3Ge
11410 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
11420 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 32 20 3d  ;.      int r2 =
11430 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
11440 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
11450 20 20 74 65 73 74 63 61 73 65 28 20 70 44 65 73    testcase( pDes
11460 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 54 61  t->eDest==SRT_Ta
11470 62 6c 65 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ble );.      tes
11480 74 63 61 73 65 28 20 70 44 65 73 74 2d 3e 65 44  tcase( pDest->eD
11490 65 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61  est==SRT_EphemTa
114a0 62 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  b );.      sqlit
114b0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
114c0 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 70  OP_MakeRecord, p
114d0 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e  In->iSdst, pIn->
114e0 6e 53 64 73 74 2c 20 72 31 29 3b 0a 20 20 20 20  nSdst, r1);.    
114f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
11500 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77  Op2(v, OP_NewRow
11510 69 64 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61  id, pDest->iSDPa
11520 72 6d 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 73  rm, r2);.      s
11530 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
11540 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 70  (v, OP_Insert, p
11550 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 72  Dest->iSDParm, r
11560 31 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 73 71  1, r2);.      sq
11570 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
11580 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45  5(v, OPFLAG_APPE
11590 4e 44 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ND);.      sqlit
115a0 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
115b0 28 70 50 61 72 73 65 2c 20 72 32 29 3b 0a 20 20  (pParse, r2);.  
115c0 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
115d0 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
115e0 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72 65  , r1);.      bre
115f0 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64  ak;.    }..#ifnd
11600 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
11610 55 42 51 55 45 52 59 0a 20 20 20 20 2f 2a 20 49  UBQUERY.    /* I
11620 66 20 77 65 20 61 72 65 20 63 72 65 61 74 69 6e  f we are creatin
11630 67 20 61 20 73 65 74 20 66 6f 72 20 61 6e 20 22  g a set for an "
11640 65 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20  expr IN (SELECT 
11650 2e 2e 2e 29 22 20 63 6f 6e 73 74 72 75 63 74 2c  ...)" construct,
11660 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65  .    ** then the
11670 72 65 20 73 68 6f 75 6c 64 20 62 65 20 61 20 73  re should be a s
11680 69 6e 67 6c 65 20 69 74 65 6d 20 6f 6e 20 74 68  ingle item on th
11690 65 20 73 74 61 63 6b 2e 20 20 57 72 69 74 65 20  e stack.  Write 
116a0 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 74 65 6d  this.    ** item
116b0 20 69 6e 74 6f 20 74 68 65 20 73 65 74 20 74 61   into the set ta
116c0 62 6c 65 20 77 69 74 68 20 62 6f 67 75 73 20 64  ble with bogus d
116d0 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ata..    */.    
116e0 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a  case SRT_Set: {.
116f0 20 20 20 20 20 20 69 6e 74 20 72 31 3b 0a 20 20        int r1;.  
11700 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 2d      assert( pIn-
11710 3e 6e 53 64 73 74 3d 3d 31 20 29 3b 0a 20 20 20  >nSdst==1 );.   
11720 20 20 20 70 44 65 73 74 2d 3e 61 66 66 53 64 73     pDest->affSds
11730 74 20 3d 20 0a 20 20 20 20 20 20 20 20 20 73 71  t = .         sq
11740 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69  lite3CompareAffi
11750 6e 69 74 79 28 70 2d 3e 70 45 4c 69 73 74 2d 3e  nity(p->pEList->
11760 61 5b 30 5d 2e 70 45 78 70 72 2c 20 70 44 65 73  a[0].pExpr, pDes
11770 74 2d 3e 61 66 66 53 64 73 74 29 3b 0a 20 20 20  t->affSdst);.   
11780 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47     r1 = sqlite3G
11790 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
117a0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
117b0 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
117c0 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 70 49 6e  _MakeRecord, pIn
117d0 2d 3e 69 53 64 73 74 2c 20 31 2c 20 72 31 2c 20  ->iSdst, 1, r1, 
117e0 26 70 44 65 73 74 2d 3e 61 66 66 53 64 73 74 2c  &pDest->affSdst,
117f0 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
11800 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69  3ExprCacheAffini
11810 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c  tyChange(pParse,
11820 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 31 29 3b   pIn->iSdst, 1);
11830 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
11840 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
11850 64 78 49 6e 73 65 72 74 2c 20 70 44 65 73 74 2d  dxInsert, pDest-
11860 3e 69 53 44 50 61 72 6d 2c 20 72 31 29 3b 0a 20  >iSDParm, r1);. 
11870 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
11880 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
11890 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72  e, r1);.      br
118a0 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20  eak;.    }..#if 
118b0 30 20 20 2f 2a 20 4e 65 76 65 72 20 6f 63 63 75  0  /* Never occu
118c0 72 73 20 6f 6e 20 61 6e 20 4f 52 44 45 52 20 42  rs on an ORDER B
118d0 59 20 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 2f  Y query */.    /
118e0 2a 20 49 66 20 61 6e 79 20 72 6f 77 20 65 78 69  * If any row exi
118f0 73 74 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  st in the result
11900 20 73 65 74 2c 20 72 65 63 6f 72 64 20 74 68 61   set, record tha
11910 74 20 66 61 63 74 20 61 6e 64 20 61 62 6f 72 74  t fact and abort
11920 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
11930 65 20 53 52 54 5f 45 78 69 73 74 73 3a 20 7b 0a  e SRT_Exists: {.
11940 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
11950 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
11960 74 65 67 65 72 2c 20 31 2c 20 70 44 65 73 74 2d  teger, 1, pDest-
11970 3e 69 53 44 50 61 72 6d 29 3b 0a 20 20 20 20 20  >iSDParm);.     
11980 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c   /* The LIMIT cl
11990 61 75 73 65 20 77 69 6c 6c 20 74 65 72 6d 69 6e  ause will termin
119a0 61 74 65 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72  ate the loop for
119b0 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 62 72 65   us */.      bre
119c0 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
119d0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
119e0 20 69 73 20 61 20 73 63 61 6c 61 72 20 73 65 6c   is a scalar sel
119f0 65 63 74 20 74 68 61 74 20 69 73 20 70 61 72 74  ect that is part
11a00 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f   of an expressio
11a10 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 73  n, then.    ** s
11a20 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73  tore the results
11a30 20 69 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69   in the appropri
11a40 61 74 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20  ate memory cell 
11a50 61 6e 64 20 62 72 65 61 6b 20 6f 75 74 0a 20 20  and break out.  
11a60 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 63 61 6e    ** of the scan
11a70 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20   loop..    */.  
11a80 20 20 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20    case SRT_Mem: 
11a90 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
11aa0 70 49 6e 2d 3e 6e 53 64 73 74 3d 3d 31 20 29 3b  pIn->nSdst==1 );
11ab0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
11ac0 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73  prCodeMove(pPars
11ad0 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70  e, pIn->iSdst, p
11ae0 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 31  Dest->iSDParm, 1
11af0 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  );.      /* The 
11b00 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69 6c  LIMIT clause wil
11b10 6c 20 6a 75 6d 70 20 6f 75 74 20 6f 66 20 74 68  l jump out of th
11b20 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f  e loop for us */
11b30 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
11b40 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69    }.#endif /* #i
11b50 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
11b60 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 20  T_SUBQUERY */.. 
11b70 20 20 20 2f 2a 20 54 68 65 20 72 65 73 75 6c 74     /* The result
11b80 73 20 61 72 65 20 73 74 6f 72 65 64 20 69 6e 20  s are stored in 
11b90 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20 72 65  a sequence of re
11ba0 67 69 73 74 65 72 73 0a 20 20 20 20 2a 2a 20 73  gisters.    ** s
11bb0 74 61 72 74 69 6e 67 20 61 74 20 70 44 65 73 74  tarting at pDest
11bc0 2d 3e 69 53 64 73 74 2e 20 20 54 68 65 6e 20 74  ->iSdst.  Then t
11bd0 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20 79 69  he co-routine yi
11be0 65 6c 64 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  elds..    */.   
11bf0 20 63 61 73 65 20 53 52 54 5f 43 6f 72 6f 75 74   case SRT_Corout
11c00 69 6e 65 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  ine: {.      if(
11c10 20 70 44 65 73 74 2d 3e 69 53 64 73 74 3d 3d 30   pDest->iSdst==0
11c20 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65 73   ){.        pDes
11c30 74 2d 3e 69 53 64 73 74 20 3d 20 73 71 6c 69 74  t->iSdst = sqlit
11c40 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70  e3GetTempRange(p
11c50 50 61 72 73 65 2c 20 70 49 6e 2d 3e 6e 53 64 73  Parse, pIn->nSds
11c60 74 29 3b 0a 20 20 20 20 20 20 20 20 70 44 65 73  t);.        pDes
11c70 74 2d 3e 6e 53 64 73 74 20 3d 20 70 49 6e 2d 3e  t->nSdst = pIn->
11c80 6e 53 64 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20  nSdst;.      }. 
11c90 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
11ca0 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c  CodeMove(pParse,
11cb0 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 44 65   pIn->iSdst, pDe
11cc0 73 74 2d 3e 69 53 64 73 74 2c 20 70 44 65 73 74  st->iSdst, pDest
11cd0 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20 20 20  ->nSdst);.      
11ce0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
11cf0 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 70  1(v, OP_Yield, p
11d00 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 29 3b 0a  Dest->iSDParm);.
11d10 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
11d20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f   }..    /* If no
11d30 6e 65 20 6f 66 20 74 68 65 20 61 62 6f 76 65 2c  ne of the above,
11d40 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74   then the result
11d50 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 6d 75 73   destination mus
11d60 74 20 62 65 0a 20 20 20 20 2a 2a 20 53 52 54 5f  t be.    ** SRT_
11d70 4f 75 74 70 75 74 2e 20 20 54 68 69 73 20 72 6f  Output.  This ro
11d80 75 74 69 6e 65 20 69 73 20 6e 65 76 65 72 20 63  utine is never c
11d90 61 6c 6c 65 64 20 77 69 74 68 20 61 6e 79 20 6f  alled with any o
11da0 74 68 65 72 0a 20 20 20 20 2a 2a 20 64 65 73 74  ther.    ** dest
11db0 69 6e 61 74 69 6f 6e 20 6f 74 68 65 72 20 74 68  ination other th
11dc0 61 6e 20 74 68 65 20 6f 6e 65 73 20 68 61 6e 64  an the ones hand
11dd0 6c 65 64 20 61 62 6f 76 65 20 6f 72 20 53 52 54  led above or SRT
11de0 5f 4f 75 74 70 75 74 2e 0a 20 20 20 20 2a 2a 0a  _Output..    **.
11df0 20 20 20 20 2a 2a 20 46 6f 72 20 53 52 54 5f 4f      ** For SRT_O
11e00 75 74 70 75 74 2c 20 72 65 73 75 6c 74 73 20 61  utput, results a
11e10 72 65 20 73 74 6f 72 65 64 20 69 6e 20 61 20 73  re stored in a s
11e20 65 71 75 65 6e 63 65 20 6f 66 20 72 65 67 69 73  equence of regis
11e30 74 65 72 73 2e 20 20 0a 20 20 20 20 2a 2a 20 54  ters.  .    ** T
11e40 68 65 6e 20 74 68 65 20 4f 50 5f 52 65 73 75 6c  hen the OP_Resul
11e50 74 52 6f 77 20 6f 70 63 6f 64 65 20 69 73 20 75  tRow opcode is u
11e60 73 65 64 20 74 6f 20 63 61 75 73 65 20 73 71 6c  sed to cause sql
11e70 69 74 65 33 5f 73 74 65 70 28 29 20 74 6f 0a 20  ite3_step() to. 
11e80 20 20 20 2a 2a 20 72 65 74 75 72 6e 20 74 68 65     ** return the
11e90 20 6e 65 78 74 20 72 6f 77 20 6f 66 20 72 65 73   next row of res
11ea0 75 6c 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ult..    */.    
11eb0 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
11ec0 20 61 73 73 65 72 74 28 20 70 44 65 73 74 2d 3e   assert( pDest->
11ed0 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75  eDest==SRT_Outpu
11ee0 74 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  t );.      sqlit
11ef0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
11f00 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 70 49  OP_ResultRow, pI
11f10 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e  n->iSdst, pIn->n
11f20 53 64 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  Sdst);.      sql
11f30 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66  ite3ExprCacheAff
11f40 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72  inityChange(pPar
11f50 73 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20  se, pIn->iSdst, 
11f60 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20  pIn->nSdst);.   
11f70 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
11f80 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74    }..  /* Jump t
11f90 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
11fa0 20 6c 6f 6f 70 20 69 66 20 74 68 65 20 4c 49 4d   loop if the LIM
11fb0 49 54 20 69 73 20 72 65 61 63 68 65 64 2e 0a 20  IT is reached.. 
11fc0 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69   */.  if( p->iLi
11fd0 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  mit ){.    sqlit
11fe0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
11ff0 4f 50 5f 49 66 5a 65 72 6f 2c 20 70 2d 3e 69 4c  OP_IfZero, p->iL
12000 69 6d 69 74 2c 20 69 42 72 65 61 6b 2c 20 2d 31  imit, iBreak, -1
12010 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e  );.  }..  /* Gen
12020 65 72 61 74 65 20 74 68 65 20 73 75 62 72 6f 75  erate the subrou
12030 74 69 6e 65 20 72 65 74 75 72 6e 0a 20 20 2a 2f  tine return.  */
12040 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  .  sqlite3VdbeRe
12050 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43  solveLabel(v, iC
12060 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 73 71 6c 69  ontinue);.  sqli
12070 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
12080 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 52   OP_Return, regR
12090 65 74 75 72 6e 29 3b 0a 0a 20 20 72 65 74 75 72  eturn);..  retur
120a0 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n addr;.}../*.**
120b0 20 41 6c 74 65 72 6e 61 74 69 76 65 20 63 6f 6d   Alternative com
120c0 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 63 6f 64  pound select cod
120d0 65 20 67 65 6e 65 72 61 74 6f 72 20 66 6f 72 20  e generator for 
120e0 63 61 73 65 73 20 77 68 65 6e 20 74 68 65 72 65  cases when there
120f0 0a 2a 2a 20 69 73 20 61 6e 20 4f 52 44 45 52 20  .** is an ORDER 
12100 42 59 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a  BY clause..**.**
12110 20 57 65 20 61 73 73 75 6d 65 20 61 20 71 75 65   We assume a que
12120 72 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ry of the follow
12130 69 6e 67 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20  ing form:.**.** 
12140 20 20 20 20 20 3c 73 65 6c 65 63 74 41 3e 20 20       <selectA>  
12150 3c 6f 70 65 72 61 74 6f 72 3e 20 20 3c 73 65 6c  <operator>  <sel
12160 65 63 74 42 3e 20 20 4f 52 44 45 52 20 42 59 20  ectB>  ORDER BY 
12170 3c 6f 72 64 65 72 62 79 6c 69 73 74 3e 0a 2a 2a  <orderbylist>.**
12180 0a 2a 2a 20 3c 6f 70 65 72 61 74 6f 72 3e 20 69  .** <operator> i
12190 73 20 6f 6e 65 20 6f 66 20 55 4e 49 4f 4e 20 41  s one of UNION A
121a0 4c 4c 2c 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50  LL, UNION, EXCEP
121b0 54 2c 20 6f 72 20 49 4e 54 45 52 53 45 43 54 2e  T, or INTERSECT.
121c0 20 20 54 68 65 20 69 64 65 61 0a 2a 2a 20 69 73    The idea.** is
121d0 20 74 6f 20 63 6f 64 65 20 62 6f 74 68 20 3c 73   to code both <s
121e0 65 6c 65 63 74 41 3e 20 61 6e 64 20 3c 73 65 6c  electA> and <sel
121f0 65 63 74 42 3e 20 77 69 74 68 20 74 68 65 20 4f  ectB> with the O
12200 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61  RDER BY clause a
12210 73 0a 2a 2a 20 63 6f 2d 72 6f 75 74 69 6e 65 73  s.** co-routines
12220 2e 20 20 54 68 65 6e 20 72 75 6e 20 74 68 65 20  .  Then run the 
12230 63 6f 2d 72 6f 75 74 69 6e 65 73 20 69 6e 20 70  co-routines in p
12240 61 72 61 6c 6c 65 6c 20 61 6e 64 20 6d 65 72 67  arallel and merg
12250 65 20 74 68 65 20 72 65 73 75 6c 74 73 0a 2a 2a  e the results.**
12260 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75 74   into the output
12270 2e 20 20 49 6e 20 61 64 64 69 74 69 6f 6e 20 74  .  In addition t
12280 6f 20 74 68 65 20 74 77 6f 20 63 6f 72 6f 75 74  o the two corout
12290 69 6e 65 73 20 28 63 61 6c 6c 65 64 20 73 65 6c  ines (called sel
122a0 65 63 74 41 20 61 6e 64 0a 2a 2a 20 73 65 6c 65  ectA and.** sele
122b0 63 74 42 29 20 74 68 65 72 65 20 61 72 65 20 37  ctB) there are 7
122c0 20 73 75 62 72 6f 75 74 69 6e 65 73 3a 0a 2a 2a   subroutines:.**
122d0 0a 2a 2a 20 20 20 20 6f 75 74 41 3a 20 20 20 20  .**    outA:    
122e0 4d 6f 76 65 20 74 68 65 20 6f 75 74 70 75 74 20  Move the output 
122f0 6f 66 20 74 68 65 20 73 65 6c 65 63 74 41 20 63  of the selectA c
12300 6f 72 6f 75 74 69 6e 65 20 69 6e 74 6f 20 74 68  oroutine into th
12310 65 20 6f 75 74 70 75 74 0a 2a 2a 20 20 20 20 20  e output.**     
12320 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 63          of the c
12330 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 2e 0a 2a  ompound query..*
12340 2a 0a 2a 2a 20 20 20 20 6f 75 74 42 3a 20 20 20  *.**    outB:   
12350 20 4d 6f 76 65 20 74 68 65 20 6f 75 74 70 75 74   Move the output
12360 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 42 20   of the selectB 
12370 63 6f 72 6f 75 74 69 6e 65 20 69 6e 74 6f 20 74  coroutine into t
12380 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 20 20 20  he output.**    
12390 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20           of the 
123a0 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 2e 20  compound query. 
123b0 20 28 4f 6e 6c 79 20 67 65 6e 65 72 61 74 65 64   (Only generated
123c0 20 66 6f 72 20 55 4e 49 4f 4e 20 61 6e 64 0a 2a   for UNION and.*
123d0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 55 4e  *             UN
123e0 49 4f 4e 20 41 4c 4c 2e 20 20 45 58 43 45 50 54  ION ALL.  EXCEPT
123f0 20 61 6e 64 20 49 4e 53 45 52 54 53 45 43 54 20   and INSERTSECT 
12400 6e 65 76 65 72 20 6f 75 74 70 75 74 20 61 20 72  never output a r
12410 6f 77 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20  ow that.**      
12420 20 20 20 20 20 20 20 61 70 70 65 61 72 73 20 6f         appears o
12430 6e 6c 79 20 69 6e 20 42 2e 29 0a 2a 2a 0a 2a 2a  nly in B.).**.**
12440 20 20 20 20 41 6c 74 42 3a 20 20 20 20 43 61 6c      AltB:    Cal
12450 6c 65 64 20 77 68 65 6e 20 74 68 65 72 65 20 69  led when there i
12460 73 20 64 61 74 61 20 66 72 6f 6d 20 62 6f 74 68  s data from both
12470 20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64 20   coroutines and 
12480 41 3c 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 65  A<B..**.**    Ae
12490 71 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68  qB:    Called wh
124a0 65 6e 20 74 68 65 72 65 20 69 73 20 64 61 74 61  en there is data
124b0 20 66 72 6f 6d 20 62 6f 74 68 20 63 6f 72 6f 75   from both corou
124c0 74 69 6e 65 73 20 61 6e 64 20 41 3d 3d 42 2e 0a  tines and A==B..
124d0 2a 2a 0a 2a 2a 20 20 20 20 41 67 74 42 3a 20 20  **.**    AgtB:  
124e0 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 74 68    Called when th
124f0 65 72 65 20 69 73 20 64 61 74 61 20 66 72 6f 6d  ere is data from
12500 20 62 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65 73   both coroutines
12510 20 61 6e 64 20 41 3e 42 2e 0a 2a 2a 0a 2a 2a 20   and A>B..**.** 
12520 20 20 20 45 6f 66 41 3a 20 20 20 20 43 61 6c 6c     EofA:    Call
12530 65 64 20 77 68 65 6e 20 64 61 74 61 20 69 73 20  ed when data is 
12540 65 78 68 61 75 73 74 65 64 20 66 72 6f 6d 20 73  exhausted from s
12550 65 6c 65 63 74 41 2e 0a 2a 2a 0a 2a 2a 20 20 20  electA..**.**   
12560 20 45 6f 66 42 3a 20 20 20 20 43 61 6c 6c 65 64   EofB:    Called
12570 20 77 68 65 6e 20 64 61 74 61 20 69 73 20 65 78   when data is ex
12580 68 61 75 73 74 65 64 20 66 72 6f 6d 20 73 65 6c  hausted from sel
12590 65 63 74 42 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ectB..**.** The 
125a0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
125b0 66 20 74 68 65 20 6c 61 74 74 65 72 20 66 69 76  f the latter fiv
125c0 65 20 73 75 62 72 6f 75 74 69 6e 65 73 20 64 65  e subroutines de
125d0 70 65 6e 64 20 6f 6e 20 77 68 69 63 68 20 0a 2a  pend on which .*
125e0 2a 20 3c 6f 70 65 72 61 74 6f 72 3e 20 69 73 20  * <operator> is 
125f0 75 73 65 64 3a 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 20  used:.**.**.**  
12600 20 20 20 20 20 20 20 20 20 20 20 55 4e 49 4f 4e             UNION
12610 20 41 4c 4c 20 20 20 20 20 20 20 20 20 55 4e 49   ALL         UNI
12620 4f 4e 20 20 20 20 20 20 20 20 20 20 20 20 45 58  ON            EX
12630 43 45 50 54 20 20 20 20 20 20 20 20 20 20 49 4e  CEPT          IN
12640 54 45 52 53 45 43 54 0a 2a 2a 20 20 20 20 20 20  TERSECT.**      
12650 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d      ------------
12660 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  -  -------------
12670 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----  ----------
12680 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----  ----------
12690 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 41 6c 74  -------.**   Alt
126a0 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41  B:   outA, nextA
126b0 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74        outA, next
126c0 41 20 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65  A       outA, ne
126d0 78 74 41 20 20 20 20 20 20 20 20 20 6e 65 78 74  xtA         next
126e0 41 0a 2a 2a 0a 2a 2a 20 20 20 41 65 71 42 3a 20  A.**.**   AeqB: 
126f0 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20    outA, nextA   
12700 20 20 20 20 20 20 6e 65 78 74 41 20 20 20 20 20        nextA     
12710 20 20 20 20 20 20 20 20 6e 65 78 74 41 20 20 20          nextA   
12720 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74        outA, next
12730 41 0a 2a 2a 0a 2a 2a 20 20 20 41 67 74 42 3a 20  A.**.**   AgtB: 
12740 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20 20    outB, nextB   
12750 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20     outB, nextB  
12760 20 20 20 20 20 20 20 20 6e 65 78 74 42 20 20 20          nextB   
12770 20 20 20 20 20 20 20 20 20 6e 65 78 74 42 0a 2a           nextB.*
12780 2a 0a 2a 2a 20 20 20 45 6f 66 41 3a 20 20 20 6f  *.**   EofA:   o
12790 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20 20  utB, nextB      
127a0 6f 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20  outB, nextB     
127b0 20 20 20 20 20 68 61 6c 74 20 20 20 20 20 20 20       halt       
127c0 20 20 20 20 20 20 68 61 6c 74 0a 2a 2a 0a 2a 2a        halt.**.**
127d0 20 20 20 45 6f 66 42 3a 20 20 20 6f 75 74 41 2c     EofB:   outA,
127e0 20 6e 65 78 74 41 20 20 20 20 20 20 6f 75 74 41   nextA      outA
127f0 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20 6f 75  , nextA       ou
12800 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20  tA, nextA       
12810 20 20 68 61 6c 74 0a 2a 2a 0a 2a 2a 20 49 6e 20    halt.**.** In 
12820 74 68 65 20 41 6c 74 42 2c 20 41 65 71 42 2c 20  the AltB, AeqB, 
12830 61 6e 64 20 41 67 74 42 20 73 75 62 72 6f 75 74  and AgtB subrout
12840 69 6e 65 73 2c 20 61 6e 20 45 4f 46 20 6f 6e 20  ines, an EOF on 
12850 41 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78 74  A following next
12860 41 0a 2a 2a 20 63 61 75 73 65 73 20 61 6e 20 69  A.** causes an i
12870 6d 6d 65 64 69 61 74 65 20 6a 75 6d 70 20 74 6f  mmediate jump to
12880 20 45 6f 66 41 20 61 6e 64 20 61 6e 20 45 4f 46   EofA and an EOF
12890 20 6f 6e 20 42 20 66 6f 6c 6c 6f 77 69 6e 67 20   on B following 
128a0 6e 65 78 74 42 20 63 61 75 73 65 73 0a 2a 2a 20  nextB causes.** 
128b0 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 6a 75 6d  an immediate jum
128c0 70 20 74 6f 20 45 6f 66 42 2e 20 20 57 69 74 68  p to EofB.  With
128d0 69 6e 20 45 6f 66 41 20 61 6e 64 20 45 6f 66 42  in EofA and EofB
128e0 2c 20 61 6e 64 20 45 4f 46 20 6f 6e 20 65 6e 74  , and EOF on ent
128f0 72 79 20 6f 72 0a 2a 2a 20 66 6f 6c 6c 6f 77 69  ry or.** followi
12900 6e 67 20 6e 65 78 74 58 20 63 61 75 73 65 73 20  ng nextX causes 
12910 61 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 65 6e  a jump to the en
12920 64 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 20  d of the select 
12930 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a  processing..**.*
12940 2a 20 44 75 70 6c 69 63 61 74 65 20 72 65 6d 6f  * Duplicate remo
12950 76 61 6c 20 69 6e 20 74 68 65 20 55 4e 49 4f 4e  val in the UNION
12960 2c 20 45 58 43 45 50 54 2c 20 61 6e 64 20 49 4e  , EXCEPT, and IN
12970 54 45 52 53 45 43 54 20 63 61 73 65 73 20 69 73  TERSECT cases is
12980 20 68 61 6e 64 6c 65 64 0a 2a 2a 20 77 69 74 68   handled.** with
12990 69 6e 20 74 68 65 20 6f 75 74 70 75 74 20 73 75  in the output su
129a0 62 72 6f 75 74 69 6e 65 2e 20 20 54 68 65 20 72  broutine.  The r
129b0 65 67 50 72 65 76 20 72 65 67 69 73 74 65 72 20  egPrev register 
129c0 73 65 74 20 68 6f 6c 64 73 20 74 68 65 20 70 72  set holds the pr
129d0 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 6f 75 74 70  eviously.** outp
129e0 75 74 20 76 61 6c 75 65 2e 20 20 41 20 63 6f 6d  ut value.  A com
129f0 70 61 72 69 73 6f 6e 20 69 73 20 6d 61 64 65 20  parison is made 
12a00 61 67 61 69 6e 73 74 20 74 68 69 73 20 76 61 6c  against this val
12a10 75 65 20 61 6e 64 20 74 68 65 20 6f 75 74 70 75  ue and the outpu
12a20 74 0a 2a 2a 20 69 73 20 73 6b 69 70 70 65 64 20  t.** is skipped 
12a30 69 66 20 74 68 65 20 6e 65 78 74 20 72 65 73 75  if the next resu
12a40 6c 74 73 20 77 6f 75 6c 64 20 62 65 20 74 68 65  lts would be the
12a50 20 73 61 6d 65 20 61 73 20 74 68 65 20 70 72 65   same as the pre
12a60 76 69 6f 75 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  vious..**.** The
12a70 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
12a80 70 6c 61 6e 20 69 73 20 74 6f 20 69 6d 70 6c 65  plan is to imple
12a90 6d 65 6e 74 20 74 68 65 20 74 77 6f 20 63 6f 72  ment the two cor
12aa0 6f 75 74 69 6e 65 73 20 61 6e 64 20 73 65 76 65  outines and seve
12ab0 6e 0a 2a 2a 20 73 75 62 72 6f 75 74 69 6e 65 73  n.** subroutines
12ac0 20 66 69 72 73 74 2c 20 74 68 65 6e 20 70 75 74   first, then put
12ad0 20 74 68 65 20 63 6f 6e 74 72 6f 6c 20 6c 6f 67   the control log
12ae0 69 63 20 61 74 20 74 68 65 20 62 6f 74 74 6f 6d  ic at the bottom
12af0 2e 20 20 4c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a  .  Like this:.**
12b00 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 67 6f 74  .**          got
12b10 6f 20 49 6e 69 74 0a 2a 2a 20 20 20 20 20 63 6f  o Init.**     co
12b20 41 3a 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72  A: coroutine for
12b30 20 6c 65 66 74 20 71 75 65 72 79 20 28 41 29 0a   left query (A).
12b40 2a 2a 20 20 20 20 20 63 6f 42 3a 20 63 6f 72 6f  **     coB: coro
12b50 75 74 69 6e 65 20 66 6f 72 20 72 69 67 68 74 20  utine for right 
12b60 71 75 65 72 79 20 28 42 29 0a 2a 2a 20 20 20 20  query (B).**    
12b70 6f 75 74 41 3a 20 6f 75 74 70 75 74 20 6f 6e 65  outA: output one
12b80 20 72 6f 77 20 6f 66 20 41 0a 2a 2a 20 20 20 20   row of A.**    
12b90 6f 75 74 42 3a 20 6f 75 74 70 75 74 20 6f 6e 65  outB: output one
12ba0 20 72 6f 77 20 6f 66 20 42 20 28 55 4e 49 4f 4e   row of B (UNION
12bb0 20 61 6e 64 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f   and UNION ALL o
12bc0 6e 6c 79 29 0a 2a 2a 20 20 20 20 45 6f 66 41 3a  nly).**    EofA:
12bd0 20 2e 2e 2e 0a 2a 2a 20 20 20 20 45 6f 66 42 3a   ....**    EofB:
12be0 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 6c 74 42 3a   ....**    AltB:
12bf0 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 65 71 42 3a   ....**    AeqB:
12c00 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 67 74 42 3a   ....**    AgtB:
12c10 20 2e 2e 2e 0a 2a 2a 20 20 20 20 49 6e 69 74 3a   ....**    Init:
12c20 20 69 6e 69 74 69 61 6c 69 7a 65 20 63 6f 72 6f   initialize coro
12c30 75 74 69 6e 65 20 72 65 67 69 73 74 65 72 73 0a  utine registers.
12c40 2a 2a 20 20 20 20 20 20 20 20 20 20 79 69 65 6c  **          yiel
12c50 64 20 63 6f 41 0a 2a 2a 20 20 20 20 20 20 20 20  d coA.**        
12c60 20 20 69 66 20 65 6f 66 28 41 29 20 67 6f 74 6f    if eof(A) goto
12c70 20 45 6f 66 41 0a 2a 2a 20 20 20 20 20 20 20 20   EofA.**        
12c80 20 20 79 69 65 6c 64 20 63 6f 42 0a 2a 2a 20 20    yield coB.**  
12c90 20 20 20 20 20 20 20 20 69 66 20 65 6f 66 28 42          if eof(B
12ca0 29 20 67 6f 74 6f 20 45 6f 66 42 0a 2a 2a 20 20  ) goto EofB.**  
12cb0 20 20 43 6d 70 72 3a 20 43 6f 6d 70 61 72 65 20    Cmpr: Compare 
12cc0 41 2c 20 42 0a 2a 2a 20 20 20 20 20 20 20 20 20  A, B.**         
12cd0 20 4a 75 6d 70 20 41 6c 74 42 2c 20 41 65 71 42   Jump AltB, AeqB
12ce0 2c 20 41 67 74 42 0a 2a 2a 20 20 20 20 20 45 6e  , AgtB.**     En
12cf0 64 3a 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 57 65 20  d: ....**.** We 
12d00 63 61 6c 6c 20 41 6c 74 42 2c 20 41 65 71 42 2c  call AltB, AeqB,
12d10 20 41 67 74 42 2c 20 45 6f 66 41 2c 20 61 6e 64   AgtB, EofA, and
12d20 20 45 6f 66 42 20 22 73 75 62 72 6f 75 74 69 6e   EofB "subroutin
12d30 65 73 22 20 62 75 74 20 74 68 65 79 20 61 72 65  es" but they are
12d40 20 6e 6f 74 0a 2a 2a 20 61 63 74 75 61 6c 6c 79   not.** actually
12d50 20 63 61 6c 6c 65 64 20 75 73 69 6e 67 20 47 6f   called using Go
12d60 73 75 62 20 61 6e 64 20 74 68 65 79 20 64 6f 20  sub and they do 
12d70 6e 6f 74 20 52 65 74 75 72 6e 2e 20 20 45 6f 66  not Return.  Eof
12d80 41 20 61 6e 64 20 45 6f 66 42 20 6c 6f 6f 70 0a  A and EofB loop.
12d90 2a 2a 20 75 6e 74 69 6c 20 61 6c 6c 20 64 61 74  ** until all dat
12da0 61 20 69 73 20 65 78 68 61 75 73 74 65 64 20 74  a is exhausted t
12db0 68 65 6e 20 6a 75 6d 70 20 74 6f 20 74 68 65 20  hen jump to the 
12dc0 22 65 6e 64 22 20 6c 61 62 65 2e 20 20 41 6c 74  "end" labe.  Alt
12dd0 42 2c 20 41 65 71 42 2c 0a 2a 2a 20 61 6e 64 20  B, AeqB,.** and 
12de0 41 67 74 42 20 6a 75 6d 70 20 74 6f 20 65 69 74  AgtB jump to eit
12df0 68 65 72 20 4c 32 20 6f 72 20 74 6f 20 6f 6e 65  her L2 or to one
12e00 20 6f 66 20 45 6f 66 41 20 6f 72 20 45 6f 66 42   of EofA or EofB
12e10 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
12e20 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e  ITE_OMIT_COMPOUN
12e30 44 5f 53 45 4c 45 43 54 0a 73 74 61 74 69 63 20  D_SELECT.static 
12e40 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f  int multiSelectO
12e50 72 64 65 72 42 79 28 0a 20 20 50 61 72 73 65 20  rderBy(.  Parse 
12e60 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
12e70 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
12e80 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  xt */.  Select *
12e90 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p,            /*
12ea0 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   The right-most 
12eb0 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65  of SELECTs to be
12ec0 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65   coded */.  Sele
12ed0 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 20 20  ctDest *pDest   
12ee0 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20    /* What to do 
12ef0 77 69 74 68 20 71 75 65 72 79 20 72 65 73 75 6c  with query resul
12f00 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  ts */.){.  int i
12f10 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20  , j;            
12f20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
12f30 73 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  s */.  Select *p
12f40 50 72 69 6f 72 3b 20 20 20 20 20 20 20 2f 2a 20  Prior;       /* 
12f50 41 6e 6f 74 68 65 72 20 53 45 4c 45 43 54 20 69  Another SELECT i
12f60 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 6f 75  mmediately to ou
12f70 72 20 6c 65 66 74 20 2a 2f 0a 20 20 56 64 62 65  r left */.  Vdbe
12f80 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20   *v;            
12f90 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
12fa0 64 65 20 74 6f 20 74 68 69 73 20 56 44 42 45 20  de to this VDBE 
12fb0 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  */.  SelectDest 
12fc0 64 65 73 74 41 3b 20 20 20 20 20 2f 2a 20 44 65  destA;     /* De
12fd0 73 74 69 6e 61 74 69 6f 6e 20 66 6f 72 20 63 6f  stination for co
12fe0 72 6f 75 74 69 6e 65 20 41 20 2a 2f 0a 20 20 53  routine A */.  S
12ff0 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 42 3b  electDest destB;
13000 20 20 20 20 20 2f 2a 20 44 65 73 74 69 6e 61 74       /* Destinat
13010 69 6f 6e 20 66 6f 72 20 63 6f 72 6f 75 74 69 6e  ion for coroutin
13020 65 20 42 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  e B */.  int reg
13030 41 64 64 72 41 3b 20 20 20 20 20 20 20 20 20 2f  AddrA;         /
13040 2a 20 41 64 64 72 65 73 73 20 72 65 67 69 73 74  * Address regist
13050 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 41 20  er for select-A 
13060 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  coroutine */.  i
13070 6e 74 20 72 65 67 45 6f 66 41 3b 20 20 20 20 20  nt regEofA;     
13080 20 20 20 20 20 2f 2a 20 46 6c 61 67 20 74 6f 20       /* Flag to 
13090 69 6e 64 69 63 61 74 65 20 77 68 65 6e 20 73 65  indicate when se
130a0 6c 65 63 74 2d 41 20 69 73 20 63 6f 6d 70 6c 65  lect-A is comple
130b0 74 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 41  te */.  int regA
130c0 64 64 72 42 3b 20 20 20 20 20 20 20 20 20 2f 2a  ddrB;         /*
130d0 20 41 64 64 72 65 73 73 20 72 65 67 69 73 74 65   Address registe
130e0 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 42 20 63  r for select-B c
130f0 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  oroutine */.  in
13100 74 20 72 65 67 45 6f 66 42 3b 20 20 20 20 20 20  t regEofB;      
13110 20 20 20 20 2f 2a 20 46 6c 61 67 20 74 6f 20 69      /* Flag to i
13120 6e 64 69 63 61 74 65 20 77 68 65 6e 20 73 65 6c  ndicate when sel
13130 65 63 74 2d 42 20 69 73 20 63 6f 6d 70 6c 65 74  ect-B is complet
13140 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 53  e */.  int addrS
13150 65 6c 65 63 74 41 3b 20 20 20 20 20 20 2f 2a 20  electA;      /* 
13160 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 73  Address of the s
13170 65 6c 65 63 74 2d 41 20 63 6f 72 6f 75 74 69 6e  elect-A coroutin
13180 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 53  e */.  int addrS
13190 65 6c 65 63 74 42 3b 20 20 20 20 20 20 2f 2a 20  electB;      /* 
131a0 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 73  Address of the s
131b0 65 6c 65 63 74 2d 42 20 63 6f 72 6f 75 74 69 6e  elect-B coroutin
131c0 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75  e */.  int regOu
131d0 74 41 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  tA;          /* 
131e0 41 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72  Address register
131f0 20 66 6f 72 20 74 68 65 20 6f 75 74 70 75 74 2d   for the output-
13200 41 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  A subroutine */.
13210 20 20 69 6e 74 20 72 65 67 4f 75 74 42 3b 20 20    int regOutB;  
13220 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
13230 73 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20  ss register for 
13240 74 68 65 20 6f 75 74 70 75 74 2d 42 20 73 75 62  the output-B sub
13250 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
13260 20 61 64 64 72 4f 75 74 41 3b 20 20 20 20 20 20   addrOutA;      
13270 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
13280 20 74 68 65 20 6f 75 74 70 75 74 2d 41 20 73 75   the output-A su
13290 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  broutine */.  in
132a0 74 20 61 64 64 72 4f 75 74 42 20 3d 20 30 3b 20  t addrOutB = 0; 
132b0 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
132c0 66 20 74 68 65 20 6f 75 74 70 75 74 2d 42 20 73  f the output-B s
132d0 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  ubroutine */.  i
132e0 6e 74 20 61 64 64 72 45 6f 66 41 3b 20 20 20 20  nt addrEofA;    
132f0 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
13300 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d 41 2d  of the select-A-
13310 65 78 68 61 75 73 74 65 64 20 73 75 62 72 6f 75  exhausted subrou
13320 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tine */.  int ad
13330 64 72 45 6f 66 42 3b 20 20 20 20 20 20 20 20 20  drEofB;         
13340 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
13350 65 20 73 65 6c 65 63 74 2d 42 2d 65 78 68 61 75  e select-B-exhau
13360 73 74 65 64 20 73 75 62 72 6f 75 74 69 6e 65 20  sted subroutine 
13370 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 41 6c 74  */.  int addrAlt
13380 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64  B;         /* Ad
13390 64 72 65 73 73 20 6f 66 20 74 68 65 20 41 3c 42  dress of the A<B
133a0 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
133b0 20 69 6e 74 20 61 64 64 72 41 65 71 42 3b 20 20   int addrAeqB;  
133c0 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
133d0 73 20 6f 66 20 74 68 65 20 41 3d 3d 42 20 73 75  s of the A==B su
133e0 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  broutine */.  in
133f0 74 20 61 64 64 72 41 67 74 42 3b 20 20 20 20 20  t addrAgtB;     
13400 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
13410 66 20 74 68 65 20 41 3e 42 20 73 75 62 72 6f 75  f the A>B subrou
13420 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65  tine */.  int re
13430 67 4c 69 6d 69 74 41 3b 20 20 20 20 20 20 20 20  gLimitA;        
13440 2f 2a 20 4c 69 6d 69 74 20 72 65 67 69 73 74 65  /* Limit registe
13450 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 41 20 2a  r for select-A *
13460 2f 0a 20 20 69 6e 74 20 72 65 67 4c 69 6d 69 74  /.  int regLimit
13470 42 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6d  B;        /* Lim
13480 69 74 20 72 65 67 69 73 74 65 72 20 66 6f 72 20  it register for 
13490 73 65 6c 65 63 74 2d 41 20 2a 2f 0a 20 20 69 6e  select-A */.  in
134a0 74 20 72 65 67 50 72 65 76 3b 20 20 20 20 20 20  t regPrev;      
134b0 20 20 20 20 2f 2a 20 41 20 72 61 6e 67 65 20 6f      /* A range o
134c0 66 20 72 65 67 69 73 74 65 72 73 20 74 6f 20 68  f registers to h
134d0 6f 6c 64 20 70 72 65 76 69 6f 75 73 20 6f 75 74  old previous out
134e0 70 75 74 20 2a 2f 0a 20 20 69 6e 74 20 73 61 76  put */.  int sav
134f0 65 64 4c 69 6d 69 74 3b 20 20 20 20 20 20 20 2f  edLimit;       /
13500 2a 20 53 61 76 65 64 20 76 61 6c 75 65 20 6f 66  * Saved value of
13510 20 70 2d 3e 69 4c 69 6d 69 74 20 2a 2f 0a 20 20   p->iLimit */.  
13520 69 6e 74 20 73 61 76 65 64 4f 66 66 73 65 74 3b  int savedOffset;
13530 20 20 20 20 20 20 2f 2a 20 53 61 76 65 64 20 76        /* Saved v
13540 61 6c 75 65 20 6f 66 20 70 2d 3e 69 4f 66 66 73  alue of p->iOffs
13550 65 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 61 62 65  et */.  int labe
13560 6c 43 6d 70 72 3b 20 20 20 20 20 20 20 20 2f 2a  lCmpr;        /*
13570 20 4c 61 62 65 6c 20 66 6f 72 20 74 68 65 20 73   Label for the s
13580 74 61 72 74 20 6f 66 20 74 68 65 20 6d 65 72 67  tart of the merg
13590 65 20 61 6c 67 6f 72 69 74 68 6d 20 2a 2f 0a 20  e algorithm */. 
135a0 20 69 6e 74 20 6c 61 62 65 6c 45 6e 64 3b 20 20   int labelEnd;  
135b0 20 20 20 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20         /* Label 
135c0 66 6f 72 20 74 68 65 20 65 6e 64 20 6f 66 20 74  for the end of t
135d0 68 65 20 6f 76 65 72 61 6c 6c 20 53 45 4c 45 43  he overall SELEC
135e0 54 20 73 74 6d 74 20 2a 2f 0a 20 20 69 6e 74 20  T stmt */.  int 
135f0 6a 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  j1;             
13600 20 20 2f 2a 20 4a 75 6d 70 20 69 6e 73 74 72 75    /* Jump instru
13610 63 74 69 6f 6e 73 20 74 68 61 74 20 67 65 74 20  ctions that get 
13620 72 65 74 61 72 67 65 74 74 65 64 20 2a 2f 0a 20  retargetted */. 
13630 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20   int op;        
13640 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
13650 20 54 4b 5f 41 4c 4c 2c 20 54 4b 5f 55 4e 49 4f   TK_ALL, TK_UNIO
13660 4e 2c 20 54 4b 5f 45 58 43 45 50 54 2c 20 54 4b  N, TK_EXCEPT, TK
13670 5f 49 4e 54 45 52 53 45 43 54 20 2a 2f 0a 20 20  _INTERSECT */.  
13680 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 44 75 70  KeyInfo *pKeyDup
13690 20 3d 20 30 3b 20 2f 2a 20 43 6f 6d 70 61 72 69   = 0; /* Compari
136a0 73 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  son information 
136b0 66 6f 72 20 64 75 70 6c 69 63 61 74 65 20 72 65  for duplicate re
136c0 6d 6f 76 61 6c 20 2a 2f 0a 20 20 4b 65 79 49 6e  moval */.  KeyIn
136d0 66 6f 20 2a 70 4b 65 79 4d 65 72 67 65 3b 20 20  fo *pKeyMerge;  
136e0 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20 69   /* Comparison i
136f0 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 6d  nformation for m
13700 65 72 67 69 6e 67 20 72 6f 77 73 20 2a 2f 0a 20  erging rows */. 
13710 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20   sqlite3 *db;   
13720 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
13730 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
13740 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  .  ExprList *pOr
13750 64 65 72 42 79 3b 20 20 20 2f 2a 20 54 68 65 20  derBy;   /* The 
13760 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
13770 2a 2f 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72 42  */.  int nOrderB
13780 79 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  y;         /* Nu
13790 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 20 69 6e  mber of terms in
137a0 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
137b0 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 61  ause */.  int *a
137c0 50 65 72 6d 75 74 65 3b 20 20 20 20 20 20 20 20  Permute;        
137d0 2f 2a 20 4d 61 70 70 69 6e 67 20 66 72 6f 6d 20  /* Mapping from 
137e0 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 74  ORDER BY terms t
137f0 6f 20 72 65 73 75 6c 74 20 73 65 74 20 63 6f 6c  o result set col
13800 75 6d 6e 73 20 2a 2f 0a 23 69 66 6e 64 65 66 20  umns */.#ifndef 
13810 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
13820 41 49 4e 0a 20 20 69 6e 74 20 69 53 75 62 31 3b  AIN.  int iSub1;
13830 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
13840 51 50 20 69 64 20 6f 66 20 6c 65 66 74 2d 68 61  QP id of left-ha
13850 6e 64 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e  nd query */.  in
13860 74 20 69 53 75 62 32 3b 20 20 20 20 20 20 20 20  t iSub2;        
13870 20 20 20 20 2f 2a 20 45 51 50 20 69 64 20 6f 66      /* EQP id of
13880 20 72 69 67 68 74 2d 68 61 6e 64 20 71 75 65 72   right-hand quer
13890 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 61  y */.#endif..  a
138a0 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72  ssert( p->pOrder
138b0 42 79 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  By!=0 );.  asser
138c0 74 28 20 70 4b 65 79 44 75 70 3d 3d 30 20 29 3b  t( pKeyDup==0 );
138d0 20 2f 2a 20 22 4d 61 6e 61 67 65 64 22 20 63 6f   /* "Managed" co
138e0 64 65 20 6e 65 65 64 73 20 74 68 69 73 2e 20 20  de needs this.  
138f0 54 69 63 6b 65 74 20 23 33 33 38 32 2e 20 2a 2f  Ticket #3382. */
13900 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  .  db = pParse->
13910 64 62 3b 0a 20 20 76 20 3d 20 70 50 61 72 73 65  db;.  v = pParse
13920 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72  ->pVdbe;.  asser
13930 74 28 20 76 21 3d 30 20 29 3b 20 20 20 20 20 20  t( v!=0 );      
13940 20 2f 2a 20 41 6c 72 65 61 64 79 20 74 68 72 6f   /* Already thro
13950 77 6e 20 74 68 65 20 65 72 72 6f 72 20 69 66 20  wn the error if 
13960 56 44 42 45 20 61 6c 6c 6f 63 20 66 61 69 6c 65  VDBE alloc faile
13970 64 20 2a 2f 0a 20 20 6c 61 62 65 6c 45 6e 64 20  d */.  labelEnd 
13980 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
13990 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 6c 61 62  eLabel(v);.  lab
139a0 65 6c 43 6d 70 72 20 3d 20 73 71 6c 69 74 65 33  elCmpr = sqlite3
139b0 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
139c0 3b 0a 0a 0a 20 20 2f 2a 20 50 61 74 63 68 20 75  ;...  /* Patch u
139d0 70 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  p the ORDER BY c
139e0 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20 6f 70 20  lause.  */.  op 
139f0 3d 20 70 2d 3e 6f 70 3b 20 20 0a 20 20 70 50 72  = p->op;  .  pPr
13a00 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b  ior = p->pPrior;
13a10 0a 20 20 61 73 73 65 72 74 28 20 70 50 72 69 6f  .  assert( pPrio
13a20 72 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29  r->pOrderBy==0 )
13a30 3b 0a 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70  ;.  pOrderBy = p
13a40 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 61 73  ->pOrderBy;.  as
13a50 73 65 72 74 28 20 70 4f 72 64 65 72 42 79 20 29  sert( pOrderBy )
13a60 3b 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 70  ;.  nOrderBy = p
13a70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a  OrderBy->nExpr;.
13a80 0a 20 20 2f 2a 20 46 6f 72 20 6f 70 65 72 61 74  .  /* For operat
13a90 6f 72 73 20 6f 74 68 65 72 20 74 68 61 6e 20 55  ors other than U
13aa0 4e 49 4f 4e 20 41 4c 4c 20 77 65 20 68 61 76 65  NION ALL we have
13ab0 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
13ac0 61 74 0a 20 20 2a 2a 20 74 68 65 20 4f 52 44 45  at.  ** the ORDE
13ad0 52 20 42 59 20 63 6c 61 75 73 65 20 63 6f 76 65  R BY clause cove
13ae0 72 73 20 65 76 65 72 79 20 74 65 72 6d 20 6f 66  rs every term of
13af0 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e   the result set.
13b00 20 20 41 64 64 0a 20 20 2a 2a 20 74 65 72 6d 73    Add.  ** terms
13b10 20 74 6f 20 74 68 65 20 4f 52 44 45 52 20 42 59   to the ORDER BY
13b20 20 63 6c 61 75 73 65 20 61 73 20 6e 65 63 65 73   clause as neces
13b30 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  sary..  */.  if(
13b40 20 6f 70 21 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20   op!=TK_ALL ){. 
13b50 20 20 20 66 6f 72 28 69 3d 31 3b 20 64 62 2d 3e     for(i=1; db->
13b60 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20  mallocFailed==0 
13b70 26 26 20 69 3c 3d 70 2d 3e 70 45 4c 69 73 74 2d  && i<=p->pEList-
13b80 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
13b90 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
13ba0 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
13bb0 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20  .      for(j=0, 
13bc0 70 49 74 65 6d 3d 70 4f 72 64 65 72 42 79 2d 3e  pItem=pOrderBy->
13bd0 61 3b 20 6a 3c 6e 4f 72 64 65 72 42 79 3b 20 6a  a; j<nOrderBy; j
13be0 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
13bf0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
13c00 74 65 6d 2d 3e 69 4f 72 64 65 72 42 79 43 6f 6c  tem->iOrderByCol
13c10 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  >0 );.        if
13c20 28 20 70 49 74 65 6d 2d 3e 69 4f 72 64 65 72 42  ( pItem->iOrderB
13c30 79 43 6f 6c 3d 3d 69 20 29 20 62 72 65 61 6b 3b  yCol==i ) break;
13c40 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
13c50 66 28 20 6a 3d 3d 6e 4f 72 64 65 72 42 79 20 29  f( j==nOrderBy )
13c60 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a  {.        Expr *
13c70 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78  pNew = sqlite3Ex
13c80 70 72 28 64 62 2c 20 54 4b 5f 49 4e 54 45 47 45  pr(db, TK_INTEGE
13c90 52 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  R, 0);.        i
13ca0 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74  f( pNew==0 ) ret
13cb0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
13cc0 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
13cd0 66 6c 61 67 73 20 7c 3d 20 45 50 5f 49 6e 74 56  flags |= EP_IntV
13ce0 61 6c 75 65 3b 0a 20 20 20 20 20 20 20 20 70 4e  alue;.        pN
13cf0 65 77 2d 3e 75 2e 69 56 61 6c 75 65 20 3d 20 69  ew->u.iValue = i
13d00 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 64 65 72  ;.        pOrder
13d10 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  By = sqlite3Expr
13d20 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73  ListAppend(pPars
13d30 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 4e 65  e, pOrderBy, pNe
13d40 77 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  w);.        if( 
13d50 70 4f 72 64 65 72 42 79 20 29 20 70 4f 72 64 65  pOrderBy ) pOrde
13d60 72 42 79 2d 3e 61 5b 6e 4f 72 64 65 72 42 79 2b  rBy->a[nOrderBy+
13d70 2b 5d 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20 3d  +].iOrderByCol =
13d80 20 28 75 31 36 29 69 3b 0a 20 20 20 20 20 20 7d   (u16)i;.      }
13d90 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
13da0 20 43 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6d   Compute the com
13db0 70 61 72 69 73 6f 6e 20 70 65 72 6d 75 74 61 74  parison permutat
13dc0 69 6f 6e 20 61 6e 64 20 6b 65 79 69 6e 66 6f 20  ion and keyinfo 
13dd0 74 68 61 74 20 69 73 20 75 73 65 64 20 77 69 74  that is used wit
13de0 68 0a 20 20 2a 2a 20 74 68 65 20 70 65 72 6d 75  h.  ** the permu
13df0 74 61 74 69 6f 6e 20 75 73 65 64 20 74 6f 20 64  tation used to d
13e00 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20  etermine if the 
13e10 6e 65 78 74 0a 20 20 2a 2a 20 72 6f 77 20 6f 66  next.  ** row of
13e20 20 72 65 73 75 6c 74 73 20 63 6f 6d 65 73 20 66   results comes f
13e30 72 6f 6d 20 73 65 6c 65 63 74 41 20 6f 72 20 73  rom selectA or s
13e40 65 6c 65 63 74 42 2e 20 20 41 6c 73 6f 20 61 64  electB.  Also ad
13e50 64 20 65 78 70 6c 69 63 69 74 0a 20 20 2a 2a 20  d explicit.  ** 
13e60 63 6f 6c 6c 61 74 69 6f 6e 73 20 74 6f 20 74 68  collations to th
13e70 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
13e80 65 20 74 65 72 6d 73 20 73 6f 20 74 68 61 74 20  e terms so that 
13e90 77 68 65 6e 20 74 68 65 20 73 75 62 71 75 65 72  when the subquer
13ea0 69 65 73 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20  ies.  ** to the 
13eb0 72 69 67 68 74 20 61 6e 64 20 74 68 65 20 6c 65  right and the le
13ec0 66 74 20 61 72 65 20 65 76 61 6c 75 61 74 65 64  ft are evaluated
13ed0 2c 20 74 68 65 79 20 75 73 65 20 74 68 65 20 63  , they use the c
13ee0 6f 72 72 65 63 74 0a 20 20 2a 2a 20 63 6f 6c 6c  orrect.  ** coll
13ef0 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 61 50  ation..  */.  aP
13f00 65 72 6d 75 74 65 20 3d 20 73 71 6c 69 74 65 33  ermute = sqlite3
13f10 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20  DbMallocRaw(db, 
13f20 73 69 7a 65 6f 66 28 69 6e 74 29 2a 6e 4f 72 64  sizeof(int)*nOrd
13f30 65 72 42 79 29 3b 0a 20 20 69 66 28 20 61 50 65  erBy);.  if( aPe
13f40 72 6d 75 74 65 20 29 7b 0a 20 20 20 20 73 74 72  rmute ){.    str
13f50 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
13f60 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 66 6f  m *pItem;.    fo
13f70 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70 4f 72  r(i=0, pItem=pOr
13f80 64 65 72 42 79 2d 3e 61 3b 20 69 3c 6e 4f 72 64  derBy->a; i<nOrd
13f90 65 72 42 79 3b 20 69 2b 2b 2c 20 70 49 74 65 6d  erBy; i++, pItem
13fa0 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  ++){.      asser
13fb0 74 28 20 70 49 74 65 6d 2d 3e 69 4f 72 64 65 72  t( pItem->iOrder
13fc0 42 79 43 6f 6c 3e 30 20 20 26 26 20 70 49 74 65  ByCol>0  && pIte
13fd0 6d 2d 3e 69 4f 72 64 65 72 42 79 43 6f 6c 3c 3d  m->iOrderByCol<=
13fe0 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
13ff0 20 29 3b 0a 20 20 20 20 20 20 61 50 65 72 6d 75   );.      aPermu
14000 74 65 5b 69 5d 20 3d 20 70 49 74 65 6d 2d 3e 69  te[i] = pItem->i
14010 4f 72 64 65 72 42 79 43 6f 6c 20 2d 20 31 3b 0a  OrderByCol - 1;.
14020 20 20 20 20 7d 0a 20 20 20 20 70 4b 65 79 4d 65      }.    pKeyMe
14030 72 67 65 20 3d 0a 20 20 20 20 20 20 73 71 6c 69  rge =.      sqli
14040 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64  te3DbMallocRaw(d
14050 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4b 65 79 4d  b, sizeof(*pKeyM
14060 65 72 67 65 29 2b 6e 4f 72 64 65 72 42 79 2a 28  erge)+nOrderBy*(
14070 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29  sizeof(CollSeq*)
14080 2b 31 29 29 3b 0a 20 20 20 20 69 66 28 20 70 4b  +1));.    if( pK
14090 65 79 4d 65 72 67 65 20 29 7b 0a 20 20 20 20 20  eyMerge ){.     
140a0 20 70 4b 65 79 4d 65 72 67 65 2d 3e 61 53 6f 72   pKeyMerge->aSor
140b0 74 4f 72 64 65 72 20 3d 20 28 75 38 2a 29 26 70  tOrder = (u8*)&p
140c0 4b 65 79 4d 65 72 67 65 2d 3e 61 43 6f 6c 6c 5b  KeyMerge->aColl[
140d0 6e 4f 72 64 65 72 42 79 5d 3b 0a 20 20 20 20 20  nOrderBy];.     
140e0 20 70 4b 65 79 4d 65 72 67 65 2d 3e 6e 46 69 65   pKeyMerge->nFie
140f0 6c 64 20 3d 20 28 75 31 36 29 6e 4f 72 64 65 72  ld = (u16)nOrder
14100 42 79 3b 0a 20 20 20 20 20 20 70 4b 65 79 4d 65  By;.      pKeyMe
14110 72 67 65 2d 3e 65 6e 63 20 3d 20 45 4e 43 28 64  rge->enc = ENC(d
14120 62 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  b);.      for(i=
14130 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69  0; i<nOrderBy; i
14140 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 43 6f 6c  ++){.        Col
14150 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20  lSeq *pColl;.   
14160 20 20 20 20 20 45 78 70 72 20 2a 70 54 65 72 6d       Expr *pTerm
14170 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69   = pOrderBy->a[i
14180 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ].pExpr;.       
14190 20 69 66 28 20 70 54 65 72 6d 2d 3e 66 6c 61 67   if( pTerm->flag
141a0 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 20 29  s & EP_Collate )
141b0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c  {.          pCol
141c0 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
141d0 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
141e0 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 20 20 7d  Term);.        }
141f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
14200 70 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69 53 65 6c  pColl = multiSel
14210 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  ectCollSeq(pPars
14220 65 2c 20 70 2c 20 61 50 65 72 6d 75 74 65 5b 69  e, p, aPermute[i
14230 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ]);.          if
14240 28 20 70 43 6f 6c 6c 3d 3d 30 20 29 20 70 43 6f  ( pColl==0 ) pCo
14250 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f  ll = db->pDfltCo
14260 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4f  ll;.          pO
14270 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78  rderBy->a[i].pEx
14280 70 72 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20  pr =.           
14290 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 64 64    sqlite3ExprAdd
142a0 43 6f 6c 6c 61 74 65 53 74 72 69 6e 67 28 70 50  CollateString(pP
142b0 61 72 73 65 2c 20 70 54 65 72 6d 2c 20 70 43 6f  arse, pTerm, pCo
142c0 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ll->zName);.    
142d0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 4b      }.        pK
142e0 65 79 4d 65 72 67 65 2d 3e 61 43 6f 6c 6c 5b 69  eyMerge->aColl[i
142f0 5d 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20 20 20  ] = pColl;.     
14300 20 20 20 70 4b 65 79 4d 65 72 67 65 2d 3e 61 53     pKeyMerge->aS
14310 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 70 4f  ortOrder[i] = pO
14320 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72  rderBy->a[i].sor
14330 74 4f 72 64 65 72 3b 0a 20 20 20 20 20 20 7d 0a  tOrder;.      }.
14340 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
14350 20 20 20 70 4b 65 79 4d 65 72 67 65 20 3d 20 30     pKeyMerge = 0
14360 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 74  ;.  }..  /* Reat
14370 74 61 63 68 20 74 68 65 20 4f 52 44 45 52 20 42  tach the ORDER B
14380 59 20 63 6c 61 75 73 65 20 74 6f 20 74 68 65 20  Y clause to the 
14390 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 70 2d  query..  */.  p-
143a0 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64  >pOrderBy = pOrd
143b0 65 72 42 79 3b 0a 20 20 70 50 72 69 6f 72 2d 3e  erBy;.  pPrior->
143c0 70 4f 72 64 65 72 42 79 20 3d 20 73 71 6c 69 74  pOrderBy = sqlit
143d0 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 70 50  e3ExprListDup(pP
143e0 61 72 73 65 2d 3e 64 62 2c 20 70 4f 72 64 65 72  arse->db, pOrder
143f0 42 79 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20 41 6c  By, 0);..  /* Al
14400 6c 6f 63 61 74 65 20 61 20 72 61 6e 67 65 20 6f  locate a range o
14410 66 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69  f temporary regi
14420 73 74 65 72 73 20 61 6e 64 20 74 68 65 20 4b 65  sters and the Ke
14430 79 49 6e 66 6f 20 6e 65 65 64 65 64 0a 20 20 2a  yInfo needed.  *
14440 2a 20 66 6f 72 20 74 68 65 20 6c 6f 67 69 63 20  * for the logic 
14450 74 68 61 74 20 72 65 6d 6f 76 65 73 20 64 75 70  that removes dup
14460 6c 69 63 61 74 65 20 72 65 73 75 6c 74 20 72 6f  licate result ro
14470 77 73 20 77 68 65 6e 20 74 68 65 0a 20 20 2a 2a  ws when the.  **
14480 20 6f 70 65 72 61 74 6f 72 20 69 73 20 55 4e 49   operator is UNI
14490 4f 4e 2c 20 45 58 43 45 50 54 2c 20 6f 72 20 49  ON, EXCEPT, or I
144a0 4e 54 45 52 53 45 43 54 20 28 62 75 74 20 6e 6f  NTERSECT (but no
144b0 74 20 55 4e 49 4f 4e 20 41 4c 4c 29 2e 0a 20 20  t UNION ALL)..  
144c0 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  */.  if( op==TK_
144d0 41 4c 4c 20 29 7b 0a 20 20 20 20 72 65 67 50 72  ALL ){.    regPr
144e0 65 76 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  ev = 0;.  }else{
144f0 0a 20 20 20 20 69 6e 74 20 6e 45 78 70 72 20 3d  .    int nExpr =
14500 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
14510 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  r;.    assert( n
14520 4f 72 64 65 72 42 79 3e 3d 6e 45 78 70 72 20 7c  OrderBy>=nExpr |
14530 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
14540 65 64 20 29 3b 0a 20 20 20 20 72 65 67 50 72 65  ed );.    regPre
14550 76 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  v = pParse->nMem
14560 2b 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  +1;.    pParse->
14570 6e 4d 65 6d 20 2b 3d 20 6e 45 78 70 72 2b 31 3b  nMem += nExpr+1;
14580 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
14590 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
145a0 65 67 65 72 2c 20 30 2c 20 72 65 67 50 72 65 76  eger, 0, regPrev
145b0 29 3b 0a 20 20 20 20 70 4b 65 79 44 75 70 20 3d  );.    pKeyDup =
145c0 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
145d0 5a 65 72 6f 28 64 62 2c 0a 20 20 20 20 20 20 20  Zero(db,.       
145e0 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f             sizeo
145f0 66 28 2a 70 4b 65 79 44 75 70 29 20 2b 20 6e 45  f(*pKeyDup) + nE
14600 78 70 72 2a 28 73 69 7a 65 6f 66 28 43 6f 6c 6c  xpr*(sizeof(Coll
14610 53 65 71 2a 29 2b 31 29 20 29 3b 0a 20 20 20 20  Seq*)+1) );.    
14620 69 66 28 20 70 4b 65 79 44 75 70 20 29 7b 0a 20  if( pKeyDup ){. 
14630 20 20 20 20 20 70 4b 65 79 44 75 70 2d 3e 61 53       pKeyDup->aS
14640 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38 2a 29  ortOrder = (u8*)
14650 26 70 4b 65 79 44 75 70 2d 3e 61 43 6f 6c 6c 5b  &pKeyDup->aColl[
14660 6e 45 78 70 72 5d 3b 0a 20 20 20 20 20 20 70 4b  nExpr];.      pK
14670 65 79 44 75 70 2d 3e 6e 46 69 65 6c 64 20 3d 20  eyDup->nField = 
14680 28 75 31 36 29 6e 45 78 70 72 3b 0a 20 20 20 20  (u16)nExpr;.    
14690 20 20 70 4b 65 79 44 75 70 2d 3e 65 6e 63 20 3d    pKeyDup->enc =
146a0 20 45 4e 43 28 64 62 29 3b 0a 20 20 20 20 20 20   ENC(db);.      
146b0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72  for(i=0; i<nExpr
146c0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
146d0 70 4b 65 79 44 75 70 2d 3e 61 43 6f 6c 6c 5b 69  pKeyDup->aColl[i
146e0 5d 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43  ] = multiSelectC
146f0 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
14700 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 70 4b  , i);.        pK
14710 65 79 44 75 70 2d 3e 61 53 6f 72 74 4f 72 64 65  eyDup->aSortOrde
14720 72 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  r[i] = 0;.      
14730 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 0a 20 20  }.    }.  }. .  
14740 2f 2a 20 53 65 70 61 72 61 74 65 20 74 68 65 20  /* Separate the 
14750 6c 65 66 74 20 61 6e 64 20 74 68 65 20 72 69 67  left and the rig
14760 68 74 20 71 75 65 72 79 20 66 72 6f 6d 20 6f 6e  ht query from on
14770 65 20 61 6e 6f 74 68 65 72 0a 20 20 2a 2f 0a 20  e another.  */. 
14780 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a   p->pPrior = 0;.
14790 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65    sqlite3Resolve
147a0 4f 72 64 65 72 47 72 6f 75 70 42 79 28 70 50 61  OrderGroupBy(pPa
147b0 72 73 65 2c 20 70 2c 20 70 2d 3e 70 4f 72 64 65  rse, p, p->pOrde
147c0 72 42 79 2c 20 22 4f 52 44 45 52 22 29 3b 0a 20  rBy, "ORDER");. 
147d0 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70 50 72   if( pPrior->pPr
147e0 69 6f 72 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  ior==0 ){.    sq
147f0 6c 69 74 65 33 52 65 73 6f 6c 76 65 4f 72 64 65  lite3ResolveOrde
14800 72 47 72 6f 75 70 42 79 28 70 50 61 72 73 65 2c  rGroupBy(pParse,
14810 20 70 50 72 69 6f 72 2c 20 70 50 72 69 6f 72 2d   pPrior, pPrior-
14820 3e 70 4f 72 64 65 72 42 79 2c 20 22 4f 52 44 45  >pOrderBy, "ORDE
14830 52 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  R");.  }..  /* C
14840 6f 6d 70 75 74 65 20 74 68 65 20 6c 69 6d 69 74  ompute the limit
14850 20 72 65 67 69 73 74 65 72 73 20 2a 2f 0a 20 20   registers */.  
14860 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69  computeLimitRegi
14870 73 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c  sters(pParse, p,
14880 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 69 66   labelEnd);.  if
14890 28 20 70 2d 3e 69 4c 69 6d 69 74 20 26 26 20 6f  ( p->iLimit && o
148a0 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20  p==TK_ALL ){.   
148b0 20 72 65 67 4c 69 6d 69 74 41 20 3d 20 2b 2b 70   regLimitA = ++p
148c0 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
148d0 20 72 65 67 4c 69 6d 69 74 42 20 3d 20 2b 2b 70   regLimitB = ++p
148e0 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
148f0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14900 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 70  p2(v, OP_Copy, p
14910 2d 3e 69 4f 66 66 73 65 74 20 3f 20 70 2d 3e 69  ->iOffset ? p->i
14920 4f 66 66 73 65 74 2b 31 20 3a 20 70 2d 3e 69 4c  Offset+1 : p->iL
14930 69 6d 69 74 2c 0a 20 20 20 20 20 20 20 20 20 20  imit,.          
14940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14950 20 20 20 20 20 20 20 20 72 65 67 4c 69 6d 69 74          regLimit
14960 41 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  A);.    sqlite3V
14970 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
14980 43 6f 70 79 2c 20 72 65 67 4c 69 6d 69 74 41 2c  Copy, regLimitA,
14990 20 72 65 67 4c 69 6d 69 74 42 29 3b 0a 20 20 7d   regLimitB);.  }
149a0 65 6c 73 65 7b 0a 20 20 20 20 72 65 67 4c 69 6d  else{.    regLim
149b0 69 74 41 20 3d 20 72 65 67 4c 69 6d 69 74 42 20  itA = regLimitB 
149c0 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  = 0;.  }.  sqlit
149d0 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
149e0 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 70   p->pLimit);.  p
149f0 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->pLimit = 0;.  
14a00 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
14a10 65 28 64 62 2c 20 70 2d 3e 70 4f 66 66 73 65 74  e(db, p->pOffset
14a20 29 3b 0a 20 20 70 2d 3e 70 4f 66 66 73 65 74 20  );.  p->pOffset 
14a30 3d 20 30 3b 0a 0a 20 20 72 65 67 41 64 64 72 41  = 0;..  regAddrA
14a40 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
14a50 6d 3b 0a 20 20 72 65 67 45 6f 66 41 20 3d 20 2b  m;.  regEofA = +
14a60 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
14a70 20 72 65 67 41 64 64 72 42 20 3d 20 2b 2b 70 50   regAddrB = ++pP
14a80 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65  arse->nMem;.  re
14a90 67 45 6f 66 42 20 3d 20 2b 2b 70 50 61 72 73 65  gEofB = ++pParse
14aa0 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 4f 75 74  ->nMem;.  regOut
14ab0 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  A = ++pParse->nM
14ac0 65 6d 3b 0a 20 20 72 65 67 4f 75 74 42 20 3d 20  em;.  regOutB = 
14ad0 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
14ae0 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
14af0 65 73 74 49 6e 69 74 28 26 64 65 73 74 41 2c 20  estInit(&destA, 
14b00 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 72  SRT_Coroutine, r
14b10 65 67 41 64 64 72 41 29 3b 0a 20 20 73 71 6c 69  egAddrA);.  sqli
14b20 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69  te3SelectDestIni
14b30 74 28 26 64 65 73 74 42 2c 20 53 52 54 5f 43 6f  t(&destB, SRT_Co
14b40 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72  routine, regAddr
14b50 42 29 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 70  B);..  /* Jump p
14b60 61 73 74 20 74 68 65 20 76 61 72 69 6f 75 73 20  ast the various 
14b70 73 75 62 72 6f 75 74 69 6e 65 73 20 61 6e 64 20  subroutines and 
14b80 63 6f 72 6f 75 74 69 6e 65 73 20 74 6f 20 74 68  coroutines to th
14b90 65 20 6d 61 69 6e 0a 20 20 2a 2a 20 6d 65 72 67  e main.  ** merg
14ba0 65 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20 20 6a 31  e loop.  */.  j1
14bb0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
14bc0 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74 6f 29  dOp0(v, OP_Goto)
14bd0 3b 0a 20 20 61 64 64 72 53 65 6c 65 63 74 41 20  ;.  addrSelectA 
14be0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
14bf0 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 0a 0a 20  rentAddr(v);... 
14c00 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 63   /* Generate a c
14c10 6f 72 6f 75 74 69 6e 65 20 74 6f 20 65 76 61 6c  oroutine to eval
14c20 75 61 74 65 20 74 68 65 20 53 45 4c 45 43 54 20  uate the SELECT 
14c30 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 74 68 65  statement to the
14c40 0a 20 20 2a 2a 20 6c 65 66 74 20 6f 66 20 74 68  .  ** left of th
14c50 65 20 63 6f 6d 70 6f 75 6e 64 20 6f 70 65 72 61  e compound opera
14c60 74 6f 72 20 2d 20 74 68 65 20 22 41 22 20 73 65  tor - the "A" se
14c70 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 56 64 62  lect..  */.  Vdb
14c80 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c  eNoopComment((v,
14c90 20 22 42 65 67 69 6e 20 63 6f 72 6f 75 74 69 6e   "Begin coroutin
14ca0 65 20 66 6f 72 20 6c 65 66 74 20 53 45 4c 45 43  e for left SELEC
14cb0 54 22 29 29 3b 0a 20 20 70 50 72 69 6f 72 2d 3e  T"));.  pPrior->
14cc0 69 4c 69 6d 69 74 20 3d 20 72 65 67 4c 69 6d 69  iLimit = regLimi
14cd0 74 41 3b 0a 20 20 65 78 70 6c 61 69 6e 53 65 74  tA;.  explainSet
14ce0 49 6e 74 65 67 65 72 28 69 53 75 62 31 2c 20 70  Integer(iSub1, p
14cf0 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65  Parse->iNextSele
14d00 63 74 49 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  ctId);.  sqlite3
14d10 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
14d20 50 72 69 6f 72 2c 20 26 64 65 73 74 41 29 3b 0a  Prior, &destA);.
14d30 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
14d40 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
14d50 72 2c 20 31 2c 20 72 65 67 45 6f 66 41 29 3b 0a  r, 1, regEofA);.
14d60 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
14d70 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c  Op1(v, OP_Yield,
14d80 20 72 65 67 41 64 64 72 41 29 3b 0a 20 20 56 64   regAddrA);.  Vd
14d90 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76  beNoopComment((v
14da0 2c 20 22 45 6e 64 20 63 6f 72 6f 75 74 69 6e 65  , "End coroutine
14db0 20 66 6f 72 20 6c 65 66 74 20 53 45 4c 45 43 54   for left SELECT
14dc0 22 29 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  "));..  /* Gener
14dd0 61 74 65 20 61 20 63 6f 72 6f 75 74 69 6e 65 20  ate a coroutine 
14de0 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65 20  to evaluate the 
14df0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
14e00 20 6f 6e 20 0a 20 20 2a 2a 20 74 68 65 20 72 69   on .  ** the ri
14e10 67 68 74 20 2d 20 74 68 65 20 22 42 22 20 73 65  ght - the "B" se
14e20 6c 65 63 74 0a 20 20 2a 2f 0a 20 20 61 64 64 72  lect.  */.  addr
14e30 53 65 6c 65 63 74 42 20 3d 20 73 71 6c 69 74 65  SelectB = sqlite
14e40 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
14e50 28 76 29 3b 0a 20 20 56 64 62 65 4e 6f 6f 70 43  (v);.  VdbeNoopC
14e60 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 42 65 67 69  omment((v, "Begi
14e70 6e 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20  n coroutine for 
14e80 72 69 67 68 74 20 53 45 4c 45 43 54 22 29 29 3b  right SELECT"));
14e90 0a 20 20 73 61 76 65 64 4c 69 6d 69 74 20 3d 20  .  savedLimit = 
14ea0 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 73 61 76  p->iLimit;.  sav
14eb0 65 64 4f 66 66 73 65 74 20 3d 20 70 2d 3e 69 4f  edOffset = p->iO
14ec0 66 66 73 65 74 3b 0a 20 20 70 2d 3e 69 4c 69 6d  ffset;.  p->iLim
14ed0 69 74 20 3d 20 72 65 67 4c 69 6d 69 74 42 3b 0a  it = regLimitB;.
14ee0 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30    p->iOffset = 0
14ef0 3b 20 20 0a 20 20 65 78 70 6c 61 69 6e 53 65 74  ;  .  explainSet
14f00 49 6e 74 65 67 65 72 28 69 53 75 62 32 2c 20 70  Integer(iSub2, p
14f10 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65  Parse->iNextSele
14f20 63 74 49 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  ctId);.  sqlite3
14f30 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
14f40 2c 20 26 64 65 73 74 42 29 3b 0a 20 20 70 2d 3e  , &destB);.  p->
14f50 69 4c 69 6d 69 74 20 3d 20 73 61 76 65 64 4c 69  iLimit = savedLi
14f60 6d 69 74 3b 0a 20 20 70 2d 3e 69 4f 66 66 73 65  mit;.  p->iOffse
14f70 74 20 3d 20 73 61 76 65 64 4f 66 66 73 65 74 3b  t = savedOffset;
14f80 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
14f90 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
14fa0 65 72 2c 20 31 2c 20 72 65 67 45 6f 66 42 29 3b  er, 1, regEofB);
14fb0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
14fc0 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64  dOp1(v, OP_Yield
14fd0 2c 20 72 65 67 41 64 64 72 42 29 3b 0a 20 20 56  , regAddrB);.  V
14fe0 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28  dbeNoopComment((
14ff0 76 2c 20 22 45 6e 64 20 63 6f 72 6f 75 74 69 6e  v, "End coroutin
15000 65 20 66 6f 72 20 72 69 67 68 74 20 53 45 4c 45  e for right SELE
15010 43 54 22 29 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e  CT"));..  /* Gen
15020 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69  erate a subrouti
15030 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74 73 20  ne that outputs 
15040 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20  the current row 
15050 6f 66 20 74 68 65 20 41 0a 20 20 2a 2a 20 73 65  of the A.  ** se
15060 6c 65 63 74 20 61 73 20 74 68 65 20 6e 65 78 74  lect as the next
15070 20 6f 75 74 70 75 74 20 72 6f 77 20 6f 66 20 74   output row of t
15080 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65  he compound sele
15090 63 74 2e 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e  ct..  */.  VdbeN
150a0 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  oopComment((v, "
150b0 4f 75 74 70 75 74 20 72 6f 75 74 69 6e 65 20 66  Output routine f
150c0 6f 72 20 41 22 29 29 3b 0a 20 20 61 64 64 72 4f  or A"));.  addrO
150d0 75 74 41 20 3d 20 67 65 6e 65 72 61 74 65 4f 75  utA = generateOu
150e0 74 70 75 74 53 75 62 72 6f 75 74 69 6e 65 28 70  tputSubroutine(p
150f0 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20  Parse,.         
15100 20 20 20 20 20 20 20 20 70 2c 20 26 64 65 73 74          p, &dest
15110 41 2c 20 70 44 65 73 74 2c 20 72 65 67 4f 75 74  A, pDest, regOut
15120 41 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  A,.             
15130 20 20 20 20 72 65 67 50 72 65 76 2c 20 70 4b 65      regPrev, pKe
15140 79 44 75 70 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  yDup, P4_KEYINFO
15150 5f 48 41 4e 44 4f 46 46 2c 20 6c 61 62 65 6c 45  _HANDOFF, labelE
15160 6e 64 29 3b 0a 20 20 0a 20 20 2f 2a 20 47 65 6e  nd);.  .  /* Gen
15170 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69  erate a subrouti
15180 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74 73 20  ne that outputs 
15190 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20  the current row 
151a0 6f 66 20 74 68 65 20 42 0a 20 20 2a 2a 20 73 65  of the B.  ** se
151b0 6c 65 63 74 20 61 73 20 74 68 65 20 6e 65 78 74  lect as the next
151c0 20 6f 75 74 70 75 74 20 72 6f 77 20 6f 66 20 74   output row of t
151d0 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65  he compound sele
151e0 63 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f  ct..  */.  if( o
151f0 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 6f 70 3d  p==TK_ALL || op=
15200 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20 20  =TK_UNION ){.   
15210 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74   VdbeNoopComment
15220 28 28 76 2c 20 22 4f 75 74 70 75 74 20 72 6f 75  ((v, "Output rou
15230 74 69 6e 65 20 66 6f 72 20 42 22 29 29 3b 0a 20  tine for B"));. 
15240 20 20 20 61 64 64 72 4f 75 74 42 20 3d 20 67 65     addrOutB = ge
15250 6e 65 72 61 74 65 4f 75 74 70 75 74 53 75 62 72  nerateOutputSubr
15260 6f 75 74 69 6e 65 28 70 50 61 72 73 65 2c 0a 20  outine(pParse,. 
15270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15280 70 2c 20 26 64 65 73 74 42 2c 20 70 44 65 73 74  p, &destB, pDest
15290 2c 20 72 65 67 4f 75 74 42 2c 0a 20 20 20 20 20  , regOutB,.     
152a0 20 20 20 20 20 20 20 20 20 20 20 20 72 65 67 50              regP
152b0 72 65 76 2c 20 70 4b 65 79 44 75 70 2c 20 50 34  rev, pKeyDup, P4
152c0 5f 4b 45 59 49 4e 46 4f 5f 53 54 41 54 49 43 2c  _KEYINFO_STATIC,
152d0 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 7d 0a   labelEnd);.  }.
152e0 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61  .  /* Generate a
152f0 20 73 75 62 72 6f 75 74 69 6e 65 20 74 6f 20 72   subroutine to r
15300 75 6e 20 77 68 65 6e 20 74 68 65 20 72 65 73 75  un when the resu
15310 6c 74 73 20 66 72 6f 6d 20 73 65 6c 65 63 74 20  lts from select 
15320 41 0a 20 20 2a 2a 20 61 72 65 20 65 78 68 61 75  A.  ** are exhau
15330 73 74 65 64 20 61 6e 64 20 6f 6e 6c 79 20 64 61  sted and only da
15340 74 61 20 69 6e 20 73 65 6c 65 63 74 20 42 20 72  ta in select B r
15350 65 6d 61 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 56  emains..  */.  V
15360 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28  dbeNoopComment((
15370 76 2c 20 22 65 6f 66 2d 41 20 73 75 62 72 6f 75  v, "eof-A subrou
15380 74 69 6e 65 22 29 29 3b 0a 20 20 69 66 28 20 6f  tine"));.  if( o
15390 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20 7c 7c 20  p==TK_EXCEPT || 
153a0 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54  op==TK_INTERSECT
153b0 20 29 7b 0a 20 20 20 20 61 64 64 72 45 6f 66 41   ){.    addrEofA
153c0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
153d0 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
153e0 20 30 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20   0, labelEnd);. 
153f0 20 7d 65 6c 73 65 7b 20 20 0a 20 20 20 20 61 64   }else{  .    ad
15400 64 72 45 6f 66 41 20 3d 20 73 71 6c 69 74 65 33  drEofA = sqlite3
15410 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
15420 5f 49 66 2c 20 72 65 67 45 6f 66 42 2c 20 6c 61  _If, regEofB, la
15430 62 65 6c 45 6e 64 29 3b 0a 20 20 20 20 73 71 6c  belEnd);.    sql
15440 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
15450 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f  , OP_Gosub, regO
15460 75 74 42 2c 20 61 64 64 72 4f 75 74 42 29 3b 0a  utB, addrOutB);.
15470 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
15480 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c  ddOp1(v, OP_Yiel
15490 64 2c 20 72 65 67 41 64 64 72 42 29 3b 0a 20 20  d, regAddrB);.  
154a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
154b0 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
154c0 30 2c 20 61 64 64 72 45 6f 66 41 29 3b 0a 20 20  0, addrEofA);.  
154d0 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20    p->nSelectRow 
154e0 2b 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65  += pPrior->nSele
154f0 63 74 52 6f 77 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ctRow;.  }..  /*
15500 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72   Generate a subr
15510 6f 75 74 69 6e 65 20 74 6f 20 72 75 6e 20 77 68  outine to run wh
15520 65 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 66  en the results f
15530 72 6f 6d 20 73 65 6c 65 63 74 20 42 0a 20 20 2a  rom select B.  *
15540 2a 20 61 72 65 20 65 78 68 61 75 73 74 65 64 20  * are exhausted 
15550 61 6e 64 20 6f 6e 6c 79 20 64 61 74 61 20 69 6e  and only data in
15560 20 73 65 6c 65 63 74 20 41 20 72 65 6d 61 69 6e   select A remain
15570 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70  s..  */.  if( op
15580 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 29  ==TK_INTERSECT )
15590 7b 0a 20 20 20 20 61 64 64 72 45 6f 66 42 20 3d  {.    addrEofB =
155a0 20 61 64 64 72 45 6f 66 41 3b 0a 20 20 20 20 69   addrEofA;.    i
155b0 66 28 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  f( p->nSelectRow
155c0 20 3e 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65   > pPrior->nSele
155d0 63 74 52 6f 77 20 29 20 70 2d 3e 6e 53 65 6c 65  ctRow ) p->nSele
155e0 63 74 52 6f 77 20 3d 20 70 50 72 69 6f 72 2d 3e  ctRow = pPrior->
155f0 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 7d 65  nSelectRow;.  }e
15600 6c 73 65 7b 20 20 0a 20 20 20 20 56 64 62 65 4e  lse{  .    VdbeN
15610 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  oopComment((v, "
15620 65 6f 66 2d 42 20 73 75 62 72 6f 75 74 69 6e 65  eof-B subroutine
15630 22 29 29 3b 0a 20 20 20 20 61 64 64 72 45 6f 66  "));.    addrEof
15640 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  B = sqlite3VdbeA
15650 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20  ddOp2(v, OP_If, 
15660 72 65 67 45 6f 66 41 2c 20 6c 61 62 65 6c 45 6e  regEofA, labelEn
15670 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  d);.    sqlite3V
15680 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
15690 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 41 2c 20  Gosub, regOutA, 
156a0 61 64 64 72 4f 75 74 41 29 3b 0a 20 20 20 20 73  addrOutA);.    s
156b0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
156c0 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65  (v, OP_Yield, re
156d0 67 41 64 64 72 41 29 3b 0a 20 20 20 20 73 71 6c  gAddrA);.    sql
156e0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
156f0 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64  , OP_Goto, 0, ad
15700 64 72 45 6f 66 42 29 3b 0a 20 20 7d 0a 0a 20 20  drEofB);.  }..  
15710 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
15720 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 63   to handle the c
15730 61 73 65 20 6f 66 20 41 3c 42 0a 20 20 2a 2f 0a  ase of A<B.  */.
15740 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e    VdbeNoopCommen
15750 74 28 28 76 2c 20 22 41 2d 6c 74 2d 42 20 73 75  t((v, "A-lt-B su
15760 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 61  broutine"));.  a
15770 64 64 72 41 6c 74 42 20 3d 20 73 71 6c 69 74 65  ddrAltB = sqlite
15780 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
15790 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 41  P_Gosub, regOutA
157a0 2c 20 61 64 64 72 4f 75 74 41 29 3b 0a 20 20 73  , addrOutA);.  s
157b0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
157c0 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65  (v, OP_Yield, re
157d0 67 41 64 64 72 41 29 3b 0a 20 20 73 71 6c 69 74  gAddrA);.  sqlit
157e0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
157f0 4f 50 5f 49 66 2c 20 72 65 67 45 6f 66 41 2c 20  OP_If, regEofA, 
15800 61 64 64 72 45 6f 66 41 29 3b 0a 20 20 73 71 6c  addrEofA);.  sql
15810 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
15820 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c 61  , OP_Goto, 0, la
15830 62 65 6c 43 6d 70 72 29 3b 0a 0a 20 20 2f 2a 20  belCmpr);..  /* 
15840 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
15850 20 68 61 6e 64 6c 65 20 74 68 65 20 63 61 73 65   handle the case
15860 20 6f 66 20 41 3d 3d 42 0a 20 20 2a 2f 0a 20 20   of A==B.  */.  
15870 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29  if( op==TK_ALL )
15880 7b 0a 20 20 20 20 61 64 64 72 41 65 71 42 20 3d  {.    addrAeqB =
15890 20 61 64 64 72 41 6c 74 42 3b 0a 20 20 7d 65 6c   addrAltB;.  }el
158a0 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e  se if( op==TK_IN
158b0 54 45 52 53 45 43 54 20 29 7b 0a 20 20 20 20 61  TERSECT ){.    a
158c0 64 64 72 41 65 71 42 20 3d 20 61 64 64 72 41 6c  ddrAeqB = addrAl
158d0 74 42 3b 0a 20 20 20 20 61 64 64 72 41 6c 74 42  tB;.    addrAltB
158e0 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ++;.  }else{.   
158f0 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74   VdbeNoopComment
15900 28 28 76 2c 20 22 41 2d 65 71 2d 42 20 73 75 62  ((v, "A-eq-B sub
15910 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 20 20  routine"));.    
15920 61 64 64 72 41 65 71 42 20 3d 0a 20 20 20 20 73  addrAeqB =.    s
15930 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
15940 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65  (v, OP_Yield, re
15950 67 41 64 64 72 41 29 3b 0a 20 20 20 20 73 71 6c  gAddrA);.    sql
15960 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
15970 2c 20 4f 50 5f 49 66 2c 20 72 65 67 45 6f 66 41  , OP_If, regEofA
15980 2c 20 61 64 64 72 45 6f 66 41 29 3b 0a 20 20 20  , addrEofA);.   
15990 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
159a0 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
159b0 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 20 20  , labelCmpr);.  
159c0 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  }..  /* Generate
159d0 20 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c 65 20   code to handle 
159e0 74 68 65 20 63 61 73 65 20 6f 66 20 41 3e 42 0a  the case of A>B.
159f0 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43    */.  VdbeNoopC
15a00 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 41 2d 67 74  omment((v, "A-gt
15a10 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29  -B subroutine"))
15a20 3b 0a 20 20 61 64 64 72 41 67 74 42 20 3d 20 73  ;.  addrAgtB = s
15a30 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
15a40 74 41 64 64 72 28 76 29 3b 0a 20 20 69 66 28 20  tAddr(v);.  if( 
15a50 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 6f 70  op==TK_ALL || op
15a60 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20  ==TK_UNION ){.  
15a70 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15a80 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
15a90 20 72 65 67 4f 75 74 42 2c 20 61 64 64 72 4f 75   regOutB, addrOu
15aa0 74 42 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  tB);.  }.  sqlit
15ab0 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
15ac0 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64  OP_Yield, regAdd
15ad0 72 42 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  rB);.  sqlite3Vd
15ae0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
15af0 66 2c 20 72 65 67 45 6f 66 42 2c 20 61 64 64 72  f, regEofB, addr
15b00 45 6f 66 42 29 3b 0a 20 20 73 71 6c 69 74 65 33  EofB);.  sqlite3
15b10 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
15b20 5f 47 6f 74 6f 2c 20 30 2c 20 6c 61 62 65 6c 43  _Goto, 0, labelC
15b30 6d 70 72 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73  mpr);..  /* This
15b40 20 63 6f 64 65 20 72 75 6e 73 20 6f 6e 63 65 20   code runs once 
15b50 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 65 76  to initialize ev
15b60 65 72 79 74 68 69 6e 67 2e 0a 20 20 2a 2f 0a 20  erything..  */. 
15b70 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
15b80 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a 20 20 73  Here(v, j1);.  s
15b90 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
15ba0 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
15bb0 30 2c 20 72 65 67 45 6f 66 41 29 3b 0a 20 20 73  0, regEofA);.  s
15bc0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
15bd0 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
15be0 30 2c 20 72 65 67 45 6f 66 42 29 3b 0a 20 20 73  0, regEofB);.  s
15bf0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
15c00 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65  (v, OP_Gosub, re
15c10 67 41 64 64 72 41 2c 20 61 64 64 72 53 65 6c 65  gAddrA, addrSele
15c20 63 74 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ctA);.  sqlite3V
15c30 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
15c40 47 6f 73 75 62 2c 20 72 65 67 41 64 64 72 42 2c  Gosub, regAddrB,
15c50 20 61 64 64 72 53 65 6c 65 63 74 42 29 3b 0a 20   addrSelectB);. 
15c60 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15c70 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67  p2(v, OP_If, reg
15c80 45 6f 66 41 2c 20 61 64 64 72 45 6f 66 41 29 3b  EofA, addrEofA);
15c90 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
15ca0 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20 72  dOp2(v, OP_If, r
15cb0 65 67 45 6f 66 42 2c 20 61 64 64 72 45 6f 66 42  egEofB, addrEofB
15cc0 29 3b 0a 0a 20 20 2f 2a 20 49 6d 70 6c 65 6d 65  );..  /* Impleme
15cd0 6e 74 20 74 68 65 20 6d 61 69 6e 20 6d 65 72 67  nt the main merg
15ce0 65 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20 20 73 71  e loop.  */.  sq
15cf0 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
15d00 4c 61 62 65 6c 28 76 2c 20 6c 61 62 65 6c 43 6d  Label(v, labelCm
15d10 70 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  pr);.  sqlite3Vd
15d20 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 50  beAddOp4(v, OP_P
15d30 65 72 6d 75 74 61 74 69 6f 6e 2c 20 30 2c 20 30  ermutation, 0, 0
15d40 2c 20 30 2c 20 28 63 68 61 72 2a 29 61 50 65 72  , 0, (char*)aPer
15d50 6d 75 74 65 2c 20 50 34 5f 49 4e 54 41 52 52 41  mute, P4_INTARRA
15d60 59 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  Y);.  sqlite3Vdb
15d70 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f  eAddOp4(v, OP_Co
15d80 6d 70 61 72 65 2c 20 64 65 73 74 41 2e 69 53 64  mpare, destA.iSd
15d90 73 74 2c 20 64 65 73 74 42 2e 69 53 64 73 74 2c  st, destB.iSdst,
15da0 20 6e 4f 72 64 65 72 42 79 2c 0a 20 20 20 20 20   nOrderBy,.     
15db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15dc0 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 4d      (char*)pKeyM
15dd0 65 72 67 65 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  erge, P4_KEYINFO
15de0 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 73 71 6c  _HANDOFF);.  sql
15df0 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
15e00 28 76 2c 20 4f 50 46 4c 41 47 5f 50 45 52 4d 55  (v, OPFLAG_PERMU
15e10 54 45 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  TE);.  sqlite3Vd
15e20 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a  beAddOp3(v, OP_J
15e30 75 6d 70 2c 20 61 64 64 72 41 6c 74 42 2c 20 61  ump, addrAltB, a
15e40 64 64 72 41 65 71 42 2c 20 61 64 64 72 41 67 74  ddrAeqB, addrAgt
15e50 42 29 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74  B);..  /* Jump t
15e60 6f 20 74 68 65 20 74 68 69 73 20 70 6f 69 6e 74  o the this point
15e70 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 74 65 72   in order to ter
15e80 6d 69 6e 61 74 65 20 74 68 65 20 71 75 65 72 79  minate the query
15e90 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
15ea0 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
15eb0 28 76 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 0a  (v, labelEnd);..
15ec0 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6e 75 6d    /* Set the num
15ed0 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20 63 6f  ber of output co
15ee0 6c 75 6d 6e 73 0a 20 20 2a 2f 0a 20 20 69 66 28  lumns.  */.  if(
15ef0 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53   pDest->eDest==S
15f00 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20  RT_Output ){.   
15f10 20 53 65 6c 65 63 74 20 2a 70 46 69 72 73 74 20   Select *pFirst 
15f20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 77 68  = pPrior;.    wh
15f30 69 6c 65 28 20 70 46 69 72 73 74 2d 3e 70 50 72  ile( pFirst->pPr
15f40 69 6f 72 20 29 20 70 46 69 72 73 74 20 3d 20 70  ior ) pFirst = p
15f50 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 3b 0a 20  First->pPrior;. 
15f60 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d     generateColum
15f70 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 30  nNames(pParse, 0
15f80 2c 20 70 46 69 72 73 74 2d 3e 70 45 4c 69 73 74  , pFirst->pEList
15f90 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61  );.  }..  /* Rea
15fa0 73 73 65 6d 62 6c 79 20 74 68 65 20 63 6f 6d 70  ssembly the comp
15fb0 6f 75 6e 64 20 71 75 65 72 79 20 73 6f 20 74 68  ound query so th
15fc0 61 74 20 69 74 20 77 69 6c 6c 20 62 65 20 66 72  at it will be fr
15fd0 65 65 64 20 63 6f 72 72 65 63 74 6c 79 0a 20 20  eed correctly.  
15fe0 2a 2a 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e  ** by the callin
15ff0 67 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  g function */.  
16000 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b  if( p->pPrior ){
16010 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65  .    sqlite3Sele
16020 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  ctDelete(db, p->
16030 70 50 72 69 6f 72 29 3b 0a 20 20 7d 0a 20 20 70  pPrior);.  }.  p
16040 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f  ->pPrior = pPrio
16050 72 3b 0a 0a 20 20 2f 2a 2a 2a 20 54 42 44 3a 20  r;..  /*** TBD: 
16060 20 49 6e 73 65 72 74 20 73 75 62 72 6f 75 74 69   Insert subrouti
16070 6e 65 20 63 61 6c 6c 73 20 74 6f 20 63 6c 6f 73  ne calls to clos
16080 65 20 63 75 72 73 6f 72 73 20 6f 6e 20 69 6e 63  e cursors on inc
16090 6f 6d 70 6c 65 74 65 0a 20 20 2a 2a 2a 2a 20 73  omplete.  **** s
160a0 75 62 71 75 65 72 69 65 73 20 2a 2a 2a 2a 2f 0a  ubqueries ****/.
160b0 20 20 65 78 70 6c 61 69 6e 43 6f 6d 70 6f 73 69    explainComposi
160c0 74 65 28 70 50 61 72 73 65 2c 20 70 2d 3e 6f 70  te(pParse, p->op
160d0 2c 20 69 53 75 62 31 2c 20 69 53 75 62 32 2c 20  , iSub1, iSub2, 
160e0 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  0);.  return SQL
160f0 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
16100 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
16110 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
16120 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  ERY) || !defined
16130 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
16140 57 29 0a 2f 2a 20 46 6f 72 77 61 72 64 20 44 65  W)./* Forward De
16150 63 6c 61 72 61 74 69 6f 6e 73 20 2a 2f 0a 73 74  clarations */.st
16160 61 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 45  atic void substE
16170 78 70 72 4c 69 73 74 28 73 71 6c 69 74 65 33 2a  xprList(sqlite3*
16180 2c 20 45 78 70 72 4c 69 73 74 2a 2c 20 69 6e 74  , ExprList*, int
16190 2c 20 45 78 70 72 4c 69 73 74 2a 29 3b 0a 73 74  , ExprList*);.st
161a0 61 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 53  atic void substS
161b0 65 6c 65 63 74 28 73 71 6c 69 74 65 33 2a 2c 20  elect(sqlite3*, 
161c0 53 65 6c 65 63 74 20 2a 2c 20 69 6e 74 2c 20 45  Select *, int, E
161d0 78 70 72 4c 69 73 74 20 2a 29 3b 0a 0a 2f 2a 0a  xprList *);../*.
161e0 2a 2a 20 53 63 61 6e 20 74 68 72 6f 75 67 68 20  ** Scan through 
161f0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70  the expression p
16200 45 78 70 72 2e 20 20 52 65 70 6c 61 63 65 20 65  Expr.  Replace e
16210 76 65 72 79 20 72 65 66 65 72 65 6e 63 65 20 74  very reference t
16220 6f 0a 2a 2a 20 61 20 63 6f 6c 75 6d 6e 20 69 6e  o.** a column in
16230 20 74 61 62 6c 65 20 6e 75 6d 62 65 72 20 69 54   table number iT
16240 61 62 6c 65 20 77 69 74 68 20 61 20 63 6f 70 79  able with a copy
16250 20 6f 66 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d   of the iColumn-
16260 74 68 0a 2a 2a 20 65 6e 74 72 79 20 69 6e 20 70  th.** entry in p
16270 45 4c 69 73 74 2e 20 20 28 42 75 74 20 6c 65 61  EList.  (But lea
16280 76 65 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  ve references to
16290 20 74 68 65 20 52 4f 57 49 44 20 63 6f 6c 75 6d   the ROWID colum
162a0 6e 20 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 2e  n .** unchanged.
162b0 29 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ).**.** This rou
162c0 74 69 6e 65 20 69 73 20 70 61 72 74 20 6f 66 20  tine is part of 
162d0 74 68 65 20 66 6c 61 74 74 65 6e 69 6e 67 20 70  the flattening p
162e0 72 6f 63 65 64 75 72 65 2e 20 20 41 20 73 75 62  rocedure.  A sub
162f0 71 75 65 72 79 0a 2a 2a 20 77 68 6f 73 65 20 72  query.** whose r
16300 65 73 75 6c 74 20 73 65 74 20 69 73 20 64 65 66  esult set is def
16310 69 6e 65 64 20 62 79 20 70 45 4c 69 73 74 20 61  ined by pEList a
16320 70 70 65 61 72 73 20 61 73 20 65 6e 74 72 79 20  ppears as entry 
16330 69 6e 20 74 68 65 0a 2a 2a 20 46 52 4f 4d 20 63  in the.** FROM c
16340 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43  lause of a SELEC
16350 54 20 73 75 63 68 20 74 68 61 74 20 74 68 65 20  T such that the 
16360 56 44 42 45 20 63 75 72 73 6f 72 20 61 73 73 69  VDBE cursor assi
16370 67 6e 65 64 20 74 6f 20 74 68 61 74 0a 2a 2a 20  gned to that.** 
16380 46 4f 52 4d 20 63 6c 61 75 73 65 20 65 6e 74 72  FORM clause entr
16390 79 20 69 73 20 69 54 61 62 6c 65 2e 20 20 54 68  y is iTable.  Th
163a0 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 6b 65 20  is routine make 
163b0 74 68 65 20 6e 65 63 65 73 73 61 72 79 20 0a 2a  the necessary .*
163c0 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 70 45 78  * changes to pEx
163d0 70 72 20 73 6f 20 74 68 61 74 20 69 74 20 72 65  pr so that it re
163e0 66 65 72 73 20 64 69 72 65 63 74 6c 79 20 74 6f  fers directly to
163f0 20 74 68 65 20 73 6f 75 72 63 65 20 74 61 62 6c   the source tabl
16400 65 0a 2a 2a 20 6f 66 20 74 68 65 20 73 75 62 71  e.** of the subq
16410 75 65 72 79 20 72 61 74 68 65 72 20 74 68 65 20  uery rather the 
16420 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68  result set of th
16430 65 20 73 75 62 71 75 65 72 79 2e 0a 2a 2f 0a 73  e subquery..*/.s
16440 74 61 74 69 63 20 45 78 70 72 20 2a 73 75 62 73  tatic Expr *subs
16450 74 45 78 70 72 28 0a 20 20 73 71 6c 69 74 65 33  tExpr(.  sqlite3
16460 20 2a 64 62 2c 20 20 20 20 20 20 20 20 2f 2a 20   *db,        /* 
16470 52 65 70 6f 72 74 20 6d 61 6c 6c 6f 63 20 65 72  Report malloc er
16480 72 6f 72 73 20 74 6f 20 74 68 69 73 20 63 6f 6e  rors to this con
16490 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70  nection */.  Exp
164a0 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20  r *pExpr,       
164b0 20 2f 2a 20 45 78 70 72 20 69 6e 20 77 68 69 63   /* Expr in whic
164c0 68 20 73 75 62 73 74 69 74 75 74 69 6f 6e 20 6f  h substitution o
164d0 63 63 75 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69  ccurs */.  int i
164e0 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 2f  Table,         /
164f0 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20 73 75  * Table to be su
16500 62 73 74 69 74 75 74 65 64 20 2a 2f 0a 20 20 45  bstituted */.  E
16510 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20  xprList *pEList 
16520 20 20 20 2f 2a 20 53 75 62 73 74 69 74 75 74 65     /* Substitute
16530 20 65 78 70 72 65 73 73 69 6f 6e 73 20 2a 2f 0a   expressions */.
16540 29 7b 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d  ){.  if( pExpr==
16550 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
16560 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  if( pExpr->op==T
16570 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 45 78 70  K_COLUMN && pExp
16580 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62 6c  r->iTable==iTabl
16590 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70 45 78  e ){.    if( pEx
165a0 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b  pr->iColumn<0 ){
165b0 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70  .      pExpr->op
165c0 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20   = TK_NULL;.    
165d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 45 78 70  }else{.      Exp
165e0 72 20 2a 70 4e 65 77 3b 0a 20 20 20 20 20 20 61  r *pNew;.      a
165f0 73 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30  ssert( pEList!=0
16600 20 26 26 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75   && pExpr->iColu
16610 6d 6e 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  mn<pEList->nExpr
16620 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
16630 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3d 3d  ( pExpr->pLeft==
16640 30 20 26 26 20 70 45 78 70 72 2d 3e 70 52 69 67  0 && pExpr->pRig
16650 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  ht==0 );.      p
16660 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70  New = sqlite3Exp
16670 72 44 75 70 28 64 62 2c 20 70 45 4c 69 73 74 2d  rDup(db, pEList-
16680 3e 61 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  >a[pExpr->iColum
16690 6e 5d 2e 70 45 78 70 72 2c 20 30 29 3b 0a 20 20  n].pExpr, 0);.  
166a0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
166b0 65 6c 65 74 65 28 64 62 2c 20 70 45 78 70 72 29  elete(db, pExpr)
166c0 3b 0a 20 20 20 20 20 20 70 45 78 70 72 20 3d 20  ;.      pExpr = 
166d0 70 4e 65 77 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  pNew;.    }.  }e
166e0 6c 73 65 7b 0a 20 20 20 20 70 45 78 70 72 2d 3e  lse{.    pExpr->
166f0 70 4c 65 66 74 20 3d 20 73 75 62 73 74 45 78 70  pLeft = substExp
16700 72 28 64 62 2c 20 70 45 78 70 72 2d 3e 70 4c 65  r(db, pExpr->pLe
16710 66 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69  ft, iTable, pELi
16720 73 74 29 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e  st);.    pExpr->
16730 70 52 69 67 68 74 20 3d 20 73 75 62 73 74 45 78  pRight = substEx
16740 70 72 28 64 62 2c 20 70 45 78 70 72 2d 3e 70 52  pr(db, pExpr->pR
16750 69 67 68 74 2c 20 69 54 61 62 6c 65 2c 20 70 45  ight, iTable, pE
16760 4c 69 73 74 29 3b 0a 20 20 20 20 69 66 28 20 45  List);.    if( E
16770 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
16780 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
16790 63 74 29 20 29 7b 0a 20 20 20 20 20 20 73 75 62  ct) ){.      sub
167a0 73 74 53 65 6c 65 63 74 28 64 62 2c 20 70 45 78  stSelect(db, pEx
167b0 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20 69  pr->x.pSelect, i
167c0 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a  Table, pEList);.
167d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
167e0 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 64   substExprList(d
167f0 62 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  b, pExpr->x.pLis
16800 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  t, iTable, pELis
16810 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  t);.    }.  }.  
16820 72 65 74 75 72 6e 20 70 45 78 70 72 3b 0a 7d 0a  return pExpr;.}.
16830 73 74 61 74 69 63 20 76 6f 69 64 20 73 75 62 73  static void subs
16840 74 45 78 70 72 4c 69 73 74 28 0a 20 20 73 71 6c  tExprList(.  sql
16850 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
16860 20 20 2f 2a 20 52 65 70 6f 72 74 20 6d 61 6c 6c    /* Report mall
16870 6f 63 20 65 72 72 6f 72 73 20 68 65 72 65 20 2a  oc errors here *
16880 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  /.  ExprList *pL
16890 69 73 74 2c 20 20 20 20 20 2f 2a 20 4c 69 73 74  ist,     /* List
168a0 20 74 6f 20 73 63 61 6e 20 61 6e 64 20 69 6e 20   to scan and in 
168b0 77 68 69 63 68 20 74 6f 20 6d 61 6b 65 20 73 75  which to make su
168c0 62 73 74 69 74 75 74 65 73 20 2a 2f 0a 20 20 69  bstitutes */.  i
168d0 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20  nt iTable,      
168e0 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20      /* Table to 
168f0 62 65 20 73 75 62 73 74 69 74 75 74 65 64 20 2a  be substituted *
16900 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  /.  ExprList *pE
16910 4c 69 73 74 20 20 20 20 20 2f 2a 20 53 75 62 73  List     /* Subs
16920 74 69 74 75 74 65 20 76 61 6c 75 65 73 20 2a 2f  titute values */
16930 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  .){.  int i;.  i
16940 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65  f( pList==0 ) re
16950 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  turn;.  for(i=0;
16960 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   i<pList->nExpr;
16970 20 69 2b 2b 29 7b 0a 20 20 20 20 70 4c 69 73 74   i++){.    pList
16980 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 20 3d 20 73  ->a[i].pExpr = s
16990 75 62 73 74 45 78 70 72 28 64 62 2c 20 70 4c 69  ubstExpr(db, pLi
169a0 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20  st->a[i].pExpr, 
169b0 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
169c0 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f  .  }.}.static vo
169d0 69 64 20 73 75 62 73 74 53 65 6c 65 63 74 28 0a  id substSelect(.
169e0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
169f0 20 20 20 20 20 20 20 2f 2a 20 52 65 70 6f 72 74         /* Report
16a00 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20 68   malloc errors h
16a10 65 72 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ere */.  Select 
16a20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  *p,           /*
16a30 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
16a40 74 20 69 6e 20 77 68 69 63 68 20 74 6f 20 6d 61  t in which to ma
16a50 6b 65 20 73 75 62 73 74 69 74 75 74 69 6f 6e 73  ke substitutions
16a60 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65   */.  int iTable
16a70 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61  ,          /* Ta
16a80 62 6c 65 20 74 6f 20 62 65 20 72 65 70 6c 61 63  ble to be replac
16a90 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  ed */.  ExprList
16aa0 20 2a 70 45 4c 69 73 74 20 20 20 20 20 2f 2a 20   *pEList     /* 
16ab0 53 75 62 73 74 69 74 75 74 65 20 76 61 6c 75 65  Substitute value
16ac0 73 20 2a 2f 0a 29 7b 0a 20 20 53 72 63 4c 69 73  s */.){.  SrcLis
16ad0 74 20 2a 70 53 72 63 3b 0a 20 20 73 74 72 75 63  t *pSrc;.  struc
16ae0 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
16af0 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a  pItem;.  int i;.
16b00 20 20 69 66 28 20 21 70 20 29 20 72 65 74 75 72    if( !p ) retur
16b10 6e 3b 0a 20 20 73 75 62 73 74 45 78 70 72 4c 69  n;.  substExprLi
16b20 73 74 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74  st(db, p->pEList
16b30 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
16b40 29 3b 0a 20 20 73 75 62 73 74 45 78 70 72 4c 69  );.  substExprLi
16b50 73 74 28 64 62 2c 20 70 2d 3e 70 47 72 6f 75 70  st(db, p->pGroup
16b60 42 79 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69  By, iTable, pELi
16b70 73 74 29 3b 0a 20 20 73 75 62 73 74 45 78 70 72  st);.  substExpr
16b80 4c 69 73 74 28 64 62 2c 20 70 2d 3e 70 4f 72 64  List(db, p->pOrd
16b90 65 72 42 79 2c 20 69 54 61 62 6c 65 2c 20 70 45  erBy, iTable, pE
16ba0 4c 69 73 74 29 3b 0a 20 20 70 2d 3e 70 48 61 76  List);.  p->pHav
16bb0 69 6e 67 20 3d 20 73 75 62 73 74 45 78 70 72 28  ing = substExpr(
16bc0 64 62 2c 20 70 2d 3e 70 48 61 76 69 6e 67 2c 20  db, p->pHaving, 
16bd0 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
16be0 0a 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 73  .  p->pWhere = s
16bf0 75 62 73 74 45 78 70 72 28 64 62 2c 20 70 2d 3e  ubstExpr(db, p->
16c00 70 57 68 65 72 65 2c 20 69 54 61 62 6c 65 2c 20  pWhere, iTable, 
16c10 70 45 4c 69 73 74 29 3b 0a 20 20 73 75 62 73 74  pEList);.  subst
16c20 53 65 6c 65 63 74 28 64 62 2c 20 70 2d 3e 70 50  Select(db, p->pP
16c30 72 69 6f 72 2c 20 69 54 61 62 6c 65 2c 20 70 45  rior, iTable, pE
16c40 4c 69 73 74 29 3b 0a 20 20 70 53 72 63 20 3d 20  List);.  pSrc = 
16c50 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72  p->pSrc;.  asser
16c60 74 28 20 70 53 72 63 20 29 3b 20 20 2f 2a 20 45  t( pSrc );  /* E
16c70 76 65 6e 20 66 6f 72 20 28 53 45 4c 45 43 54 20  ven for (SELECT 
16c80 31 29 20 77 65 20 68 61 76 65 3a 20 70 53 72 63  1) we have: pSrc
16c90 21 3d 30 20 62 75 74 20 70 53 72 63 2d 3e 6e 53  !=0 but pSrc->nS
16ca0 72 63 3d 3d 30 20 2a 2f 0a 20 20 69 66 28 20 41  rc==0 */.  if( A
16cb0 4c 57 41 59 53 28 70 53 72 63 29 20 29 7b 0a 20  LWAYS(pSrc) ){. 
16cc0 20 20 20 66 6f 72 28 69 3d 70 53 72 63 2d 3e 6e     for(i=pSrc->n
16cd0 53 72 63 2c 20 70 49 74 65 6d 3d 70 53 72 63 2d  Src, pItem=pSrc-
16ce0 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 49  >a; i>0; i--, pI
16cf0 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 73 75  tem++){.      su
16d00 62 73 74 53 65 6c 65 63 74 28 64 62 2c 20 70 49  bstSelect(db, pI
16d10 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2c 20 69 54  tem->pSelect, iT
16d20 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20  able, pEList);. 
16d30 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69     }.  }.}.#endi
16d40 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51  f /* !defined(SQ
16d50 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
16d60 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  RY) || !defined(
16d70 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
16d80 29 20 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e  ) */..#if !defin
16d90 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
16da0 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66  UBQUERY) || !def
16db0 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
16dc0 5f 56 49 45 57 29 0a 2f 2a 0a 2a 2a 20 54 68 69  _VIEW)./*.** Thi
16dd0 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65 6d 70  s routine attemp
16de0 74 73 20 74 6f 20 66 6c 61 74 74 65 6e 20 73 75  ts to flatten su
16df0 62 71 75 65 72 69 65 73 20 61 73 20 61 20 70 65  bqueries as a pe
16e00 72 66 6f 72 6d 61 6e 63 65 20 6f 70 74 69 6d 69  rformance optimi
16e10 7a 61 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20  zation..** This 
16e20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
16e30 31 20 69 66 20 69 74 20 6d 61 6b 65 73 20 63 68  1 if it makes ch
16e40 61 6e 67 65 73 20 61 6e 64 20 30 20 69 66 20 6e  anges and 0 if n
16e50 6f 20 66 6c 61 74 74 65 6e 69 6e 67 20 6f 63 63  o flattening occ
16e60 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 75 6e  urs..**.** To un
16e70 64 65 72 73 74 61 6e 64 20 74 68 65 20 63 6f 6e  derstand the con
16e80 63 65 70 74 20 6f 66 20 66 6c 61 74 74 65 6e 69  cept of flatteni
16e90 6e 67 2c 20 63 6f 6e 73 69 64 65 72 20 74 68 65  ng, consider the
16ea0 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 71 75   following.** qu
16eb0 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  ery:.**.**     S
16ec0 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 28 53 45  ELECT a FROM (SE
16ed0 4c 45 43 54 20 78 2b 79 20 41 53 20 61 20 46 52  LECT x+y AS a FR
16ee0 4f 4d 20 74 31 20 57 48 45 52 45 20 7a 3c 31 30  OM t1 WHERE z<10
16ef0 30 29 20 57 48 45 52 45 20 61 3e 35 0a 2a 2a 0a  0) WHERE a>5.**.
16f00 2a 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20 77  ** The default w
16f10 61 79 20 6f 66 20 69 6d 70 6c 65 6d 65 6e 74 69  ay of implementi
16f20 6e 67 20 74 68 69 73 20 71 75 65 72 79 20 69 73  ng this query is
16f30 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 65 0a   to execute the.
16f40 2a 2a 20 73 75 62 71 75 65 72 79 20 66 69 72 73  ** subquery firs
16f50 74 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20  t and store the 
16f60 72 65 73 75 6c 74 73 20 69 6e 20 61 20 74 65 6d  results in a tem
16f70 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 74 68  porary table, th
16f80 65 6e 0a 2a 2a 20 72 75 6e 20 74 68 65 20 6f 75  en.** run the ou
16f90 74 65 72 20 71 75 65 72 79 20 6f 6e 20 74 68 61  ter query on tha
16fa0 74 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  t temporary tabl
16fb0 65 2e 20 20 54 68 69 73 20 72 65 71 75 69 72 65  e.  This require
16fc0 73 20 74 77 6f 0a 2a 2a 20 70 61 73 73 65 73 20  s two.** passes 
16fd0 6f 76 65 72 20 74 68 65 20 64 61 74 61 2e 20 20  over the data.  
16fe0 46 75 72 74 68 65 72 6d 6f 72 65 2c 20 62 65 63  Furthermore, bec
16ff0 61 75 73 65 20 74 68 65 20 74 65 6d 70 6f 72 61  ause the tempora
17000 72 79 20 74 61 62 6c 65 0a 2a 2a 20 68 61 73 20  ry table.** has 
17010 6e 6f 20 69 6e 64 69 63 65 73 2c 20 74 68 65 20  no indices, the 
17020 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f 6e 20  WHERE clause on 
17030 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
17040 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6f 70 74  cannot be.** opt
17050 69 6d 69 7a 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  imized..**.** Th
17060 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65 6d  is routine attem
17070 70 74 73 20 74 6f 20 72 65 77 72 69 74 65 20 71  pts to rewrite q
17080 75 65 72 69 65 73 20 73 75 63 68 20 61 73 20 74  ueries such as t
17090 68 65 20 61 62 6f 76 65 20 69 6e 74 6f 0a 2a 2a  he above into.**
170a0 20 61 20 73 69 6e 67 6c 65 20 66 6c 61 74 20 73   a single flat s
170b0 65 6c 65 63 74 2c 20 6c 69 6b 65 20 74 68 69 73  elect, like this
170c0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45  :.**.**     SELE
170d0 43 54 20 78 2b 79 20 41 53 20 61 20 46 52 4f 4d  CT x+y AS a FROM
170e0 20 74 31 20 57 48 45 52 45 20 7a 3c 31 30 30 20   t1 WHERE z<100 
170f0 41 4e 44 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68  AND a>5.**.** Th
17100 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64  e code generated
17110 20 66 6f 72 20 74 68 69 73 20 73 69 6d 70 69 66   for this simpif
17120 69 63 61 74 69 6f 6e 20 67 69 76 65 73 20 74 68  ication gives th
17130 65 20 73 61 6d 65 20 72 65 73 75 6c 74 0a 2a 2a  e same result.**
17140 20 62 75 74 20 6f 6e 6c 79 20 68 61 73 20 74 6f   but only has to
17150 20 73 63 61 6e 20 74 68 65 20 64 61 74 61 20 6f   scan the data o
17160 6e 63 65 2e 20 20 41 6e 64 20 62 65 63 61 75 73  nce.  And becaus
17170 65 20 69 6e 64 69 63 65 73 20 6d 69 67 68 74 20  e indices might 
17180 0a 2a 2a 20 65 78 69 73 74 20 6f 6e 20 74 68 65  .** exist on the
17190 20 74 61 62 6c 65 20 74 31 2c 20 61 20 63 6f 6d   table t1, a com
171a0 70 6c 65 74 65 20 73 63 61 6e 20 6f 66 20 74 68  plete scan of th
171b0 65 20 64 61 74 61 20 6d 69 67 68 74 20 62 65 0a  e data might be.
171c0 2a 2a 20 61 76 6f 69 64 65 64 2e 0a 2a 2a 0a 2a  ** avoided..**.*
171d0 2a 20 46 6c 61 74 74 65 6e 69 6e 67 20 69 73 20  * Flattening is 
171e0 6f 6e 6c 79 20 61 74 74 65 6d 70 74 65 64 20 69  only attempted i
171f0 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c  f all of the fol
17200 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a  lowing are true:
17210 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 20 54 68  .**.**   (1)  Th
17220 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20 74  e subquery and t
17230 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64  he outer query d
17240 6f 20 6e 6f 74 20 62 6f 74 68 20 75 73 65 20 61  o not both use a
17250 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a  ggregates..**.**
17260 20 20 20 28 32 29 20 20 54 68 65 20 73 75 62 71     (2)  The subq
17270 75 65 72 79 20 69 73 20 6e 6f 74 20 61 6e 20 61  uery is not an a
17280 67 67 72 65 67 61 74 65 20 6f 72 20 74 68 65 20  ggregate or the 
17290 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e  outer query is n
172a0 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a  ot a join..**.**
172b0 20 20 20 28 33 29 20 20 54 68 65 20 73 75 62 71     (3)  The subq
172c0 75 65 72 79 20 69 73 20 6e 6f 74 20 74 68 65 20  uery is not the 
172d0 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66  right operand of
172e0 20 61 20 6c 65 66 74 20 6f 75 74 65 72 20 6a 6f   a left outer jo
172f0 69 6e 0a 2a 2a 20 20 20 20 20 20 20 20 28 4f 72  in.**        (Or
17300 69 67 69 6e 61 6c 6c 79 20 74 69 63 6b 65 74 20  iginally ticket 
17310 23 33 30 36 2e 20 20 53 74 72 65 6e 67 74 68 65  #306.  Strengthe
17320 6e 65 64 20 62 79 20 74 69 63 6b 65 74 20 23 33  ned by ticket #3
17330 33 30 30 29 0a 2a 2a 0a 2a 2a 20 20 20 28 34 29  300).**.**   (4)
17340 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69    The subquery i
17350 73 20 6e 6f 74 20 44 49 53 54 49 4e 43 54 2e 0a  s not DISTINCT..
17360 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 41 74 20  **.**  (**)  At 
17370 6f 6e 65 20 70 6f 69 6e 74 20 72 65 73 74 72 69  one point restri
17380 63 74 69 6f 6e 73 20 28 34 29 20 61 6e 64 20 28  ctions (4) and (
17390 35 29 20 64 65 66 69 6e 65 64 20 61 20 73 75 62  5) defined a sub
173a0 73 65 74 20 6f 66 20 44 49 53 54 49 4e 43 54 0a  set of DISTINCT.
173b0 2a 2a 20 20 20 20 20 20 20 20 73 75 62 2d 71 75  **        sub-qu
173c0 65 72 69 65 73 20 74 68 61 74 20 77 65 72 65 20  eries that were 
173d0 65 78 63 6c 75 64 65 64 20 66 72 6f 6d 20 74 68  excluded from th
173e0 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e  is optimization.
173f0 20 52 65 73 74 72 69 63 74 69 6f 6e 20 0a 2a 2a   Restriction .**
17400 20 20 20 20 20 20 20 20 28 34 29 20 68 61 73 20          (4) has 
17410 73 69 6e 63 65 20 62 65 65 6e 20 65 78 70 61 6e  since been expan
17420 64 65 64 20 74 6f 20 65 78 63 6c 75 64 65 20 61  ded to exclude a
17430 6c 6c 20 44 49 53 54 49 4e 43 54 20 73 75 62 71  ll DISTINCT subq
17440 75 65 72 69 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20  ueries..**.**   
17450 28 36 29 20 20 54 68 65 20 73 75 62 71 75 65 72  (6)  The subquer
17460 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 61  y does not use a
17470 67 67 72 65 67 61 74 65 73 20 6f 72 20 74 68 65  ggregates or the
17480 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20   outer query is 
17490 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 44 49  not.**        DI
174a0 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20 20 20  STINCT..**.**   
174b0 28 37 29 20 20 54 68 65 20 73 75 62 71 75 65 72  (7)  The subquer
174c0 79 20 68 61 73 20 61 20 46 52 4f 4d 20 63 6c 61  y has a FROM cla
174d0 75 73 65 2e 20 20 54 4f 44 4f 3a 20 20 46 6f 72  use.  TODO:  For
174e0 20 73 75 62 71 75 65 72 69 65 73 20 77 69 74 68   subqueries with
174f0 6f 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 41 20  out.**        A 
17500 46 52 4f 4d 20 63 6c 61 75 73 65 2c 20 63 6f 6e  FROM clause, con
17510 73 69 64 65 72 20 61 64 64 69 6e 67 20 61 20 46  sider adding a F
17520 52 4f 4d 20 63 6c 6f 73 65 20 77 69 74 68 20 74  ROM close with t
17530 68 65 20 73 70 65 63 69 61 6c 0a 2a 2a 20 20 20  he special.**   
17540 20 20 20 20 20 74 61 62 6c 65 20 73 71 6c 69 74       table sqlit
17550 65 5f 6f 6e 63 65 20 74 68 61 74 20 63 6f 6e 73  e_once that cons
17560 69 73 74 73 20 6f 66 20 61 20 73 69 6e 67 6c 65  ists of a single
17570 20 72 6f 77 20 63 6f 6e 74 61 69 6e 69 6e 67 20   row containing 
17580 61 0a 2a 2a 20 20 20 20 20 20 20 20 73 69 6e 67  a.**        sing
17590 6c 65 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 20  le NULL..**.**  
175a0 20 28 38 29 20 20 54 68 65 20 73 75 62 71 75 65   (8)  The subque
175b0 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  ry does not use 
175c0 4c 49 4d 49 54 20 6f 72 20 74 68 65 20 6f 75 74  LIMIT or the out
175d0 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20  er query is not 
175e0 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20  a join..**.**   
175f0 28 39 29 20 20 54 68 65 20 73 75 62 71 75 65 72  (9)  The subquer
17600 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c  y does not use L
17610 49 4d 49 54 20 6f 72 20 74 68 65 20 6f 75 74 65  IMIT or the oute
17620 72 20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  r query does not
17630 20 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 61   use.**        a
17640 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a  ggregates..**.**
17650 20 20 28 31 30 29 20 20 54 68 65 20 73 75 62 71    (10)  The subq
17660 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73  uery does not us
17670 65 20 61 67 67 72 65 67 61 74 65 73 20 6f 72 20  e aggregates or 
17680 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
17690 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20  does not.**     
176a0 20 20 20 75 73 65 20 4c 49 4d 49 54 2e 0a 2a 2a     use LIMIT..**
176b0 0a 2a 2a 20 20 28 31 31 29 20 20 54 68 65 20 73  .**  (11)  The s
176c0 75 62 71 75 65 72 79 20 61 6e 64 20 74 68 65 20  ubquery and the 
176d0 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 20 6e  outer query do n
176e0 6f 74 20 62 6f 74 68 20 68 61 76 65 20 4f 52 44  ot both have ORD
176f0 45 52 20 42 59 20 63 6c 61 75 73 65 73 2e 0a 2a  ER BY clauses..*
17700 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 4e 6f 74 20  *.**  (**)  Not 
17710 69 6d 70 6c 65 6d 65 6e 74 65 64 2e 20 20 53 75  implemented.  Su
17720 62 73 75 6d 65 64 20 69 6e 74 6f 20 72 65 73 74  bsumed into rest
17730 72 69 63 74 69 6f 6e 20 28 33 29 2e 20 20 57 61  riction (3).  Wa
17740 73 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20  s previously.** 
17750 20 20 20 20 20 20 20 61 20 73 65 70 61 72 61 74         a separat
17760 65 20 72 65 73 74 72 69 63 74 69 6f 6e 20 64 65  e restriction de
17770 72 69 76 69 6e 67 20 66 72 6f 6d 20 74 69 63 6b  riving from tick
17780 65 74 20 23 33 35 30 2e 0a 2a 2a 0a 2a 2a 20 20  et #350..**.**  
17790 28 31 33 29 20 20 54 68 65 20 73 75 62 71 75 65  (13)  The subque
177a0 72 79 20 61 6e 64 20 6f 75 74 65 72 20 71 75 65  ry and outer que
177b0 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20 75  ry do not both u
177c0 73 65 20 4c 49 4d 49 54 2e 0a 2a 2a 0a 2a 2a 20  se LIMIT..**.** 
177d0 20 28 31 34 29 20 20 54 68 65 20 73 75 62 71 75   (14)  The subqu
177e0 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  ery does not use
177f0 20 4f 46 46 53 45 54 2e 0a 2a 2a 0a 2a 2a 20 20   OFFSET..**.**  
17800 28 31 35 29 20 20 54 68 65 20 6f 75 74 65 72 20  (15)  The outer 
17810 71 75 65 72 79 20 69 73 20 6e 6f 74 20 70 61 72  query is not par
17820 74 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20  t of a compound 
17830 73 65 6c 65 63 74 20 6f 72 20 74 68 65 0a 2a 2a  select or the.**
17840 20 20 20 20 20 20 20 20 73 75 62 71 75 65 72 79          subquery
17850 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 61   does not have a
17860 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 2e 0a 2a   LIMIT clause..*
17870 2a 20 20 20 20 20 20 20 20 28 53 65 65 20 74 69  *        (See ti
17880 63 6b 65 74 20 23 32 33 33 39 20 61 6e 64 20 74  cket #2339 and t
17890 69 63 6b 65 74 20 5b 30 32 61 38 65 38 31 64 34  icket [02a8e81d4
178a0 34 5d 29 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 36 29  4])..**.**  (16)
178b0 20 20 54 68 65 20 6f 75 74 65 72 20 71 75 65 72    The outer quer
178c0 79 20 69 73 20 6e 6f 74 20 61 6e 20 61 67 67 72  y is not an aggr
178d0 65 67 61 74 65 20 6f 72 20 74 68 65 20 73 75 62  egate or the sub
178e0 71 75 65 72 79 20 64 6f 65 73 0a 2a 2a 20 20 20  query does.**   
178f0 20 20 20 20 20 6e 6f 74 20 63 6f 6e 74 61 69 6e       not contain
17900 20 4f 52 44 45 52 20 42 59 2e 20 20 28 54 69 63   ORDER BY.  (Tic
17910 6b 65 74 20 23 32 39 34 32 29 20 20 54 68 69 73  ket #2942)  This
17920 20 75 73 65 64 20 74 6f 20 6e 6f 74 20 6d 61 74   used to not mat
17930 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 20 75 6e  ter.**        un
17940 74 69 6c 20 77 65 20 69 6e 74 72 6f 64 75 63 65  til we introduce
17950 64 20 74 68 65 20 67 72 6f 75 70 5f 63 6f 6e 63  d the group_conc
17960 61 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20  at() function.  
17970 0a 2a 2a 0a 2a 2a 20 20 28 31 37 29 20 20 54 68  .**.**  (17)  Th
17980 65 20 73 75 62 2d 71 75 65 72 79 20 69 73 20 6e  e sub-query is n
17990 6f 74 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65  ot a compound se
179a0 6c 65 63 74 2c 20 6f 72 20 69 74 20 69 73 20 61  lect, or it is a
179b0 20 55 4e 49 4f 4e 20 41 4c 4c 20 0a 2a 2a 20 20   UNION ALL .**  
179c0 20 20 20 20 20 20 63 6f 6d 70 6f 75 6e 64 20 63        compound c
179d0 6c 61 75 73 65 20 6d 61 64 65 20 75 70 20 65 6e  lause made up en
179e0 74 69 72 65 6c 79 20 6f 66 20 6e 6f 6e 2d 61 67  tirely of non-ag
179f0 67 72 65 67 61 74 65 20 71 75 65 72 69 65 73 2c  gregate queries,
17a00 20 61 6e 64 20 0a 2a 2a 20 20 20 20 20 20 20 20   and .**        
17a10 74 68 65 20 70 61 72 65 6e 74 20 71 75 65 72 79  the parent query
17a20 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  :.**.**         
17a30 20 2a 20 69 73 20 6e 6f 74 20 69 74 73 65 6c 66   * is not itself
17a40 20 70 61 72 74 20 6f 66 20 61 20 63 6f 6d 70 6f   part of a compo
17a50 75 6e 64 20 73 65 6c 65 63 74 2c 0a 2a 2a 20 20  und select,.**  
17a60 20 20 20 20 20 20 20 20 2a 20 69 73 20 6e 6f 74          * is not
17a70 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 6f 72   an aggregate or
17a80 20 44 49 53 54 49 4e 43 54 20 71 75 65 72 79 2c   DISTINCT query,
17a90 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 20   and.**         
17aa0 20 2a 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e   * is not a join
17ab0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 54 68  .**.**        Th
17ac0 65 20 70 61 72 65 6e 74 20 61 6e 64 20 73 75 62  e parent and sub
17ad0 2d 71 75 65 72 79 20 6d 61 79 20 63 6f 6e 74 61  -query may conta
17ae0 69 6e 20 57 48 45 52 45 20 63 6c 61 75 73 65 73  in WHERE clauses
17af0 2e 20 53 75 62 6a 65 63 74 20 74 6f 0a 2a 2a 20  . Subject to.** 
17b00 20 20 20 20 20 20 20 72 75 6c 65 73 20 28 31 31         rules (11
17b10 29 2c 20 28 31 33 29 20 61 6e 64 20 28 31 34 29  ), (13) and (14)
17b20 2c 20 74 68 65 79 20 6d 61 79 20 61 6c 73 6f 20  , they may also 
17b30 63 6f 6e 74 61 69 6e 20 4f 52 44 45 52 20 42 59  contain ORDER BY
17b40 2c 0a 2a 2a 20 20 20 20 20 20 20 20 4c 49 4d 49  ,.**        LIMI
17b50 54 20 61 6e 64 20 4f 46 46 53 45 54 20 63 6c 61  T and OFFSET cla
17b60 75 73 65 73 2e 20 20 54 68 65 20 73 75 62 71 75  uses.  The subqu
17b70 65 72 79 20 63 61 6e 6e 6f 74 20 75 73 65 20 61  ery cannot use a
17b80 6e 79 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20  ny compound.**  
17b90 20 20 20 20 20 20 6f 70 65 72 61 74 6f 72 20 6f        operator o
17ba0 74 68 65 72 20 74 68 61 6e 20 55 4e 49 4f 4e 20  ther than UNION 
17bb0 41 4c 4c 20 62 65 63 61 75 73 65 20 61 6c 6c 20  ALL because all 
17bc0 74 68 65 20 6f 74 68 65 72 20 63 6f 6d 70 6f 75  the other compou
17bd0 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 6f 70 65  nd.**        ope
17be0 72 61 74 6f 72 73 20 68 61 76 65 20 61 6e 20 69  rators have an i
17bf0 6d 70 6c 69 65 64 20 44 49 53 54 49 4e 43 54 20  mplied DISTINCT 
17c00 77 68 69 63 68 20 69 73 20 64 69 73 61 6c 6c 6f  which is disallo
17c10 77 65 64 20 62 79 0a 2a 2a 20 20 20 20 20 20 20  wed by.**       
17c20 20 72 65 73 74 72 69 63 74 69 6f 6e 20 28 34 29   restriction (4)
17c30 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 41  ..**.**        A
17c40 6c 73 6f 2c 20 65 61 63 68 20 63 6f 6d 70 6f 6e  lso, each compon
17c50 65 6e 74 20 6f 66 20 74 68 65 20 73 75 62 2d 71  ent of the sub-q
17c60 75 65 72 79 20 6d 75 73 74 20 72 65 74 75 72 6e  uery must return
17c70 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72   the same number
17c80 0a 2a 2a 20 20 20 20 20 20 20 20 6f 66 20 72 65  .**        of re
17c90 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 2e 20 54 68  sult columns. Th
17ca0 69 73 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61  is is actually a
17cb0 20 72 65 71 75 69 72 65 6d 65 6e 74 20 66 6f 72   requirement for
17cc0 20 61 6e 79 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a   any compound.**
17cd0 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 73          SELECT s
17ce0 74 61 74 65 6d 65 6e 74 2c 20 62 75 74 20 61 6c  tatement, but al
17cf0 6c 20 74 68 65 20 63 6f 64 65 20 68 65 72 65 20  l the code here 
17d00 64 6f 65 73 20 69 73 20 6d 61 6b 65 20 73 75 72  does is make sur
17d10 65 20 74 68 61 74 20 6e 6f 0a 2a 2a 20 20 20 20  e that no.**    
17d20 20 20 20 20 73 75 63 68 20 28 69 6c 6c 65 67 61      such (illega
17d30 6c 29 20 73 75 62 2d 71 75 65 72 79 20 69 73 20  l) sub-query is 
17d40 66 6c 61 74 74 65 6e 65 64 2e 20 54 68 65 20 63  flattened. The c
17d50 61 6c 6c 65 72 20 77 69 6c 6c 20 64 65 74 65 63  aller will detec
17d60 74 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  t the.**        
17d70 73 79 6e 74 61 78 20 65 72 72 6f 72 20 61 6e 64  syntax error and
17d80 20 72 65 74 75 72 6e 20 61 20 64 65 74 61 69 6c   return a detail
17d90 65 64 20 6d 65 73 73 61 67 65 2e 0a 2a 2a 0a 2a  ed message..**.*
17da0 2a 20 20 28 31 38 29 20 20 49 66 20 74 68 65 20  *  (18)  If the 
17db0 73 75 62 2d 71 75 65 72 79 20 69 73 20 61 20 63  sub-query is a c
17dc0 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20  ompound select, 
17dd0 74 68 65 6e 20 61 6c 6c 20 74 65 72 6d 73 20 6f  then all terms o
17de0 66 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  f the.**        
17df0 4f 52 44 45 52 20 62 79 20 63 6c 61 75 73 65 20  ORDER by clause 
17e00 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20 6d 75  of the parent mu
17e10 73 74 20 62 65 20 73 69 6d 70 6c 65 20 72 65 66  st be simple ref
17e20 65 72 65 6e 63 65 73 20 74 6f 20 0a 2a 2a 20 20  erences to .**  
17e30 20 20 20 20 20 20 63 6f 6c 75 6d 6e 73 20 6f 66        columns of
17e40 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 2e 0a   the sub-query..
17e50 2a 2a 0a 2a 2a 20 20 28 31 39 29 20 20 54 68 65  **.**  (19)  The
17e60 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e   subquery does n
17e70 6f 74 20 75 73 65 20 4c 49 4d 49 54 20 6f 72 20  ot use LIMIT or 
17e80 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
17e90 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20  does not.**     
17ea0 20 20 20 68 61 76 65 20 61 20 57 48 45 52 45 20     have a WHERE 
17eb0 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 28  clause..**.**  (
17ec0 32 30 29 20 20 49 66 20 74 68 65 20 73 75 62 2d  20)  If the sub-
17ed0 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f  query is a compo
17ee0 75 6e 64 20 73 65 6c 65 63 74 2c 20 74 68 65 6e  und select, then
17ef0 20 69 74 20 6d 75 73 74 20 6e 6f 74 20 75 73 65   it must not use
17f00 0a 2a 2a 20 20 20 20 20 20 20 20 61 6e 20 4f 52  .**        an OR
17f10 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 20 20  DER BY clause.  
17f20 54 69 63 6b 65 74 20 23 33 37 37 33 2e 20 20 57  Ticket #3773.  W
17f30 65 20 63 6f 75 6c 64 20 72 65 6c 61 78 20 74 68  e could relax th
17f40 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a  is constraint.**
17f50 20 20 20 20 20 20 20 20 73 6f 6d 65 77 68 61 74          somewhat
17f60 20 62 79 20 73 61 79 69 6e 67 20 74 68 61 74 20   by saying that 
17f70 74 68 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65  the terms of the
17f80 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
17f90 20 6d 75 73 74 0a 2a 2a 20 20 20 20 20 20 20 20   must.**        
17fa0 61 70 70 65 61 72 20 61 73 20 75 6e 6d 6f 64 69  appear as unmodi
17fb0 66 69 65 64 20 72 65 73 75 6c 74 20 63 6f 6c 75  fied result colu
17fc0 6d 6e 73 20 69 6e 20 74 68 65 20 6f 75 74 65 72  mns in the outer
17fd0 20 71 75 65 72 79 2e 20 20 42 75 74 20 77 65 0a   query.  But we.
17fe0 2a 2a 20 20 20 20 20 20 20 20 68 61 76 65 20 6f  **        have o
17ff0 74 68 65 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f  ther optimizatio
18000 6e 73 20 69 6e 20 6d 69 6e 64 20 74 6f 20 64 65  ns in mind to de
18010 61 6c 20 77 69 74 68 20 74 68 61 74 20 63 61 73  al with that cas
18020 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 31 29 20 20  e..**.**  (21)  
18030 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65  The subquery doe
18040 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 20  s not use LIMIT 
18050 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  or the outer que
18060 72 79 20 69 73 20 6e 6f 74 0a 2a 2a 20 20 20 20  ry is not.**    
18070 20 20 20 20 44 49 53 54 49 4e 43 54 2e 20 20 28      DISTINCT.  (
18080 53 65 65 20 74 69 63 6b 65 74 20 5b 37 35 32 65  See ticket [752e
18090 31 36 34 36 66 63 5d 29 2e 0a 2a 2a 0a 2a 2a 20  1646fc])..**.** 
180a0 49 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c  In this routine,
180b0 20 74 68 65 20 22 70 22 20 70 61 72 61 6d 65 74   the "p" paramet
180c0 65 72 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  er is a pointer 
180d0 74 6f 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  to the outer que
180e0 72 79 2e 0a 2a 2a 20 54 68 65 20 73 75 62 71 75  ry..** The subqu
180f0 65 72 79 20 69 73 20 70 2d 3e 70 53 72 63 2d 3e  ery is p->pSrc->
18100 61 5b 69 46 72 6f 6d 5d 2e 20 20 69 73 41 67 67  a[iFrom].  isAgg
18110 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20   is true if the 
18120 6f 75 74 65 72 20 71 75 65 72 79 0a 2a 2a 20 75  outer query.** u
18130 73 65 73 20 61 67 67 72 65 67 61 74 65 73 20 61  ses aggregates a
18140 6e 64 20 73 75 62 71 75 65 72 79 49 73 41 67 67  nd subqueryIsAgg
18150 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20   is true if the 
18160 73 75 62 71 75 65 72 79 20 75 73 65 73 20 61 67  subquery uses ag
18170 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  gregates..**.** 
18180 49 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73  If flattening is
18190 20 6e 6f 74 20 61 74 74 65 6d 70 74 65 64 2c 20   not attempted, 
181a0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
181b0 61 20 6e 6f 2d 6f 70 20 61 6e 64 20 72 65 74 75  a no-op and retu
181c0 72 6e 73 20 30 2e 0a 2a 2a 20 49 66 20 66 6c 61  rns 0..** If fla
181d0 74 74 65 6e 69 6e 67 20 69 73 20 61 74 74 65 6d  ttening is attem
181e0 70 74 65 64 20 74 68 69 73 20 72 6f 75 74 69 6e  pted this routin
181f0 65 20 72 65 74 75 72 6e 73 20 31 2e 0a 2a 2a 0a  e returns 1..**.
18200 2a 2a 20 41 6c 6c 20 6f 66 20 74 68 65 20 65 78  ** All of the ex
18210 70 72 65 73 73 69 6f 6e 20 61 6e 61 6c 79 73 69  pression analysi
18220 73 20 6d 75 73 74 20 6f 63 63 75 72 20 6f 6e 20  s must occur on 
18230 62 6f 74 68 20 74 68 65 20 6f 75 74 65 72 20 71  both the outer q
18240 75 65 72 79 20 61 6e 64 0a 2a 2a 20 74 68 65 20  uery and.** the 
18250 73 75 62 71 75 65 72 79 20 62 65 66 6f 72 65 20  subquery before 
18260 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e  this routine run
18270 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
18280 20 66 6c 61 74 74 65 6e 53 75 62 71 75 65 72 79   flattenSubquery
18290 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
182a0 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  e,       /* Pars
182b0 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
182c0 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
182d0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
182e0 65 6e 74 20 6f 72 20 6f 75 74 65 72 20 53 45 4c  ent or outer SEL
182f0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  ECT statement */
18300 0a 20 20 69 6e 74 20 69 46 72 6f 6d 2c 20 20 20  .  int iFrom,   
18310 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
18320 20 69 6e 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 5d   in p->pSrc->a[]
18330 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 73 75   of the inner su
18340 62 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20  bquery */.  int 
18350 69 73 41 67 67 2c 20 20 20 20 20 20 20 20 20 20  isAgg,          
18360 20 2f 2a 20 54 72 75 65 20 69 66 20 6f 75 74 65   /* True if oute
18370 72 20 53 45 4c 45 43 54 20 75 73 65 73 20 61 67  r SELECT uses ag
18380 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
18390 73 20 2a 2f 0a 20 20 69 6e 74 20 73 75 62 71 75  s */.  int subqu
183a0 65 72 79 49 73 41 67 67 20 20 20 20 2f 2a 20 54  eryIsAgg    /* T
183b0 72 75 65 20 69 66 20 74 68 65 20 73 75 62 71 75  rue if the subqu
183c0 65 72 79 20 75 73 65 73 20 61 67 67 72 65 67 61  ery uses aggrega
183d0 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a  te functions */.
183e0 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
183f0 2a 7a 53 61 76 65 64 41 75 74 68 43 6f 6e 74 65  *zSavedAuthConte
18400 78 74 20 3d 20 70 50 61 72 73 65 2d 3e 7a 41 75  xt = pParse->zAu
18410 74 68 43 6f 6e 74 65 78 74 3b 0a 20 20 53 65 6c  thContext;.  Sel
18420 65 63 74 20 2a 70 50 61 72 65 6e 74 3b 0a 20 20  ect *pParent;.  
18430 53 65 6c 65 63 74 20 2a 70 53 75 62 3b 20 20 20  Select *pSub;   
18440 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 6e 65 72      /* The inner
18450 20 71 75 65 72 79 20 6f 72 20 22 73 75 62 71 75   query or "subqu
18460 65 72 79 22 20 2a 2f 0a 20 20 53 65 6c 65 63 74  ery" */.  Select
18470 20 2a 70 53 75 62 31 3b 20 20 20 20 20 20 2f 2a   *pSub1;      /*
18480 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   Pointer to the 
18490 72 69 67 68 74 6d 6f 73 74 20 73 65 6c 65 63 74  rightmost select
184a0 20 69 6e 20 73 75 62 2d 71 75 65 72 79 20 2a 2f   in sub-query */
184b0 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
184c0 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52  ;      /* The FR
184d0 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
184e0 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a   outer query */.
184f0 20 20 53 72 63 4c 69 73 74 20 2a 70 53 75 62 53    SrcList *pSubS
18500 72 63 3b 20 20 20 2f 2a 20 54 68 65 20 46 52 4f  rc;   /* The FRO
18510 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
18520 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 45 78  subquery */.  Ex
18530 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b 20 20  prList *pList;  
18540 20 20 2f 2a 20 54 68 65 20 72 65 73 75 6c 74 20    /* The result 
18550 73 65 74 20 6f 66 20 74 68 65 20 6f 75 74 65 72  set of the outer
18560 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20   query */.  int 
18570 69 50 61 72 65 6e 74 3b 20 20 20 20 20 20 20 20  iParent;        
18580 2f 2a 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e  /* VDBE cursor n
18590 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 53 75  umber of the pSu
185a0 62 20 72 65 73 75 6c 74 20 73 65 74 20 74 65 6d  b result set tem
185b0 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  p table */.  int
185c0 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
185d0 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
185e0 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65   */.  Expr *pWhe
185f0 72 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  re;             
18600 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48         /* The WH
18610 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
18620 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
18630 74 65 6d 20 2a 70 53 75 62 69 74 65 6d 3b 20 20  tem *pSubitem;  
18640 20 2f 2a 20 54 68 65 20 73 75 62 71 75 65 72 79   /* The subquery
18650 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
18660 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
18670 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73  .  /* Check to s
18680 65 65 20 69 66 20 66 6c 61 74 74 65 6e 69 6e 67  ee if flattening
18690 20 69 73 20 70 65 72 6d 69 74 74 65 64 2e 20 20   is permitted.  
186a0 52 65 74 75 72 6e 20 30 20 69 66 20 6e 6f 74 2e  Return 0 if not.
186b0 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
186c0 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  p!=0 );.  assert
186d0 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29  ( p->pPrior==0 )
186e0 3b 20 20 2f 2a 20 55 6e 61 62 6c 65 20 74 6f 20  ;  /* Unable to 
186f0 66 6c 61 74 74 65 6e 20 63 6f 6d 70 6f 75 6e 64  flatten compound
18700 20 71 75 65 72 69 65 73 20 2a 2f 0a 20 20 69 66   queries */.  if
18710 28 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 44 69  ( OptimizationDi
18720 73 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54  sabled(db, SQLIT
18730 45 5f 51 75 65 72 79 46 6c 61 74 74 65 6e 65 72  E_QueryFlattener
18740 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
18750 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  pSrc = p->pSrc;.
18760 20 20 61 73 73 65 72 74 28 20 70 53 72 63 20 26    assert( pSrc &
18770 26 20 69 46 72 6f 6d 3e 3d 30 20 26 26 20 69 46  & iFrom>=0 && iF
18780 72 6f 6d 3c 70 53 72 63 2d 3e 6e 53 72 63 20 29  rom<pSrc->nSrc )
18790 3b 0a 20 20 70 53 75 62 69 74 65 6d 20 3d 20 26  ;.  pSubitem = &
187a0 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 3b 0a  pSrc->a[iFrom];.
187b0 20 20 69 50 61 72 65 6e 74 20 3d 20 70 53 75 62    iParent = pSub
187c0 69 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20  item->iCursor;. 
187d0 20 70 53 75 62 20 3d 20 70 53 75 62 69 74 65 6d   pSub = pSubitem
187e0 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 61 73 73  ->pSelect;.  ass
187f0 65 72 74 28 20 70 53 75 62 21 3d 30 20 29 3b 0a  ert( pSub!=0 );.
18800 20 20 69 66 28 20 69 73 41 67 67 20 26 26 20 73    if( isAgg && s
18810 75 62 71 75 65 72 79 49 73 41 67 67 20 29 20 72  ubqueryIsAgg ) r
18820 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
18830 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
18840 72 69 63 74 69 6f 6e 20 28 31 29 20 20 2a 2f 0a  riction (1)  */.
18850 20 20 69 66 28 20 73 75 62 71 75 65 72 79 49 73    if( subqueryIs
18860 41 67 67 20 26 26 20 70 53 72 63 2d 3e 6e 53 72  Agg && pSrc->nSr
18870 63 3e 31 20 29 20 72 65 74 75 72 6e 20 30 3b 20  c>1 ) return 0; 
18880 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
18890 72 69 63 74 69 6f 6e 20 28 32 29 20 20 2a 2f 0a  riction (2)  */.
188a0 20 20 70 53 75 62 53 72 63 20 3d 20 70 53 75 62    pSubSrc = pSub
188b0 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74  ->pSrc;.  assert
188c0 28 20 70 53 75 62 53 72 63 20 29 3b 0a 20 20 2f  ( pSubSrc );.  /
188d0 2a 20 50 72 69 6f 72 20 74 6f 20 76 65 72 73 69  * Prior to versi
188e0 6f 6e 20 33 2e 31 2e 32 2c 20 77 68 65 6e 20 4c  on 3.1.2, when L
188f0 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20  IMIT and OFFSET 
18900 68 61 64 20 74 6f 20 62 65 20 73 69 6d 70 6c 65  had to be simple
18910 20 63 6f 6e 73 74 61 6e 74 73 2c 0a 20 20 2a 2a   constants,.  **
18920 20 6e 6f 74 20 61 72 62 69 74 72 61 72 79 20 65   not arbitrary e
18930 78 70 72 65 73 73 73 69 6f 6e 73 2c 20 77 65 20  xpresssions, we 
18940 61 6c 6c 6f 77 65 64 20 73 6f 6d 65 20 63 6f 6d  allowed some com
18950 62 69 6e 69 6e 67 20 6f 66 20 4c 49 4d 49 54 20  bining of LIMIT 
18960 61 6e 64 20 4f 46 46 53 45 54 0a 20 20 2a 2a 20  and OFFSET.  ** 
18970 62 65 63 61 75 73 65 20 74 68 65 79 20 63 6f 75  because they cou
18980 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64 20 61  ld be computed a
18990 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2e 20  t compile-time. 
189a0 20 42 75 74 20 77 68 65 6e 20 4c 49 4d 49 54 20   But when LIMIT 
189b0 61 6e 64 20 4f 46 46 53 45 54 0a 20 20 2a 2a 20  and OFFSET.  ** 
189c0 62 65 63 61 6d 65 20 61 72 62 69 74 72 61 72 79  became arbitrary
189d0 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 77 65   expressions, we
189e0 20 77 65 72 65 20 66 6f 72 63 65 64 20 74 6f 20   were forced to 
189f0 61 64 64 20 72 65 73 74 72 69 63 74 69 6f 6e 73  add restrictions
18a00 20 28 31 33 29 0a 20 20 2a 2a 20 61 6e 64 20 28   (13).  ** and (
18a10 31 34 29 2e 20 2a 2f 0a 20 20 69 66 28 20 70 53  14). */.  if( pS
18a20 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 70 2d  ub->pLimit && p-
18a30 3e 70 4c 69 6d 69 74 20 29 20 72 65 74 75 72 6e  >pLimit ) return
18a40 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
18a50 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
18a60 28 31 33 29 20 2a 2f 0a 20 20 69 66 28 20 70 53  (13) */.  if( pS
18a70 75 62 2d 3e 70 4f 66 66 73 65 74 20 29 20 72 65  ub->pOffset ) re
18a80 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
18a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18aa0 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
18ab0 28 31 34 29 20 2a 2f 0a 20 20 69 66 28 20 70 2d  (14) */.  if( p-
18ac0 3e 70 52 69 67 68 74 6d 6f 73 74 20 26 26 20 70  >pRightmost && p
18ad0 53 75 62 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20  Sub->pLimit ){. 
18ae0 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20     return 0;    
18af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18b10 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
18b20 69 63 74 69 6f 6e 20 28 31 35 29 20 2a 2f 0a 20  iction (15) */. 
18b30 20 7d 0a 20 20 69 66 28 20 70 53 75 62 53 72 63   }.  if( pSubSrc
18b40 2d 3e 6e 53 72 63 3d 3d 30 20 29 20 72 65 74 75  ->nSrc==0 ) retu
18b50 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
18b60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
18b70 65 73 74 72 69 63 74 69 6f 6e 20 28 37 29 20 20  estriction (7)  
18b80 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 73  */.  if( pSub->s
18b90 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73  elFlags & SF_Dis
18ba0 74 69 6e 63 74 20 29 20 72 65 74 75 72 6e 20 30  tinct ) return 0
18bb0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  ;           /* R
18bc0 65 73 74 72 69 63 74 69 6f 6e 20 28 35 29 20 20  estriction (5)  
18bd0 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70  */.  if( pSub->p
18be0 4c 69 6d 69 74 20 26 26 20 28 70 53 72 63 2d 3e  Limit && (pSrc->
18bf0 6e 53 72 63 3e 31 20 7c 7c 20 69 73 41 67 67 29  nSrc>1 || isAgg)
18c00 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20   ){.     return 
18c10 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  0;         /* Re
18c20 73 74 72 69 63 74 69 6f 6e 73 20 28 38 29 28 39  strictions (8)(9
18c30 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 28  ) */.  }.  if( (
18c40 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
18c50 5f 44 69 73 74 69 6e 63 74 29 21 3d 30 20 26 26  _Distinct)!=0 &&
18c60 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20 29   subqueryIsAgg )
18c70 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  {.     return 0;
18c80 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
18c90 72 69 63 74 69 6f 6e 20 28 36 29 20 20 2a 2f 0a  riction (6)  */.
18ca0 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72    }.  if( p->pOr
18cb0 64 65 72 42 79 20 26 26 20 70 53 75 62 2d 3e 70  derBy && pSub->p
18cc0 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
18cd0 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
18ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18d00 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
18d10 6f 6e 20 28 31 31 29 20 2a 2f 0a 20 20 7d 0a 20  on (11) */.  }. 
18d20 20 69 66 28 20 69 73 41 67 67 20 26 26 20 70 53   if( isAgg && pS
18d30 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 20 72  ub->pOrderBy ) r
18d40 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
18d50 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
18d60 69 63 74 69 6f 6e 20 28 31 36 29 20 2a 2f 0a 20  iction (16) */. 
18d70 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69   if( pSub->pLimi
18d80 74 20 26 26 20 70 2d 3e 70 57 68 65 72 65 20 29  t && p->pWhere )
18d90 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
18da0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
18db0 69 63 74 69 6f 6e 20 28 31 39 29 20 2a 2f 0a 20  iction (19) */. 
18dc0 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69   if( pSub->pLimi
18dd0 74 20 26 26 20 28 70 2d 3e 73 65 6c 46 6c 61 67  t && (p->selFlag
18de0 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 29  s & SF_Distinct)
18df0 21 3d 30 20 29 7b 0a 20 20 20 20 20 72 65 74 75  !=0 ){.     retu
18e00 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a  rn 0;         /*
18e10 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 32 31   Restriction (21
18e20 29 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f  ) */.  }..  /* O
18e30 42 53 4f 4c 45 54 45 20 43 4f 4d 4d 45 4e 54 20  BSOLETE COMMENT 
18e40 31 3a 0a 20 20 2a 2a 20 52 65 73 74 72 69 63 74  1:.  ** Restrict
18e50 69 6f 6e 20 33 3a 20 20 49 66 20 74 68 65 20 73  ion 3:  If the s
18e60 75 62 71 75 65 72 79 20 69 73 20 61 20 6a 6f 69  ubquery is a joi
18e70 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65  n, make sure the
18e80 20 73 75 62 71 75 65 72 79 20 69 73 20 0a 20 20   subquery is .  
18e90 2a 2a 20 6e 6f 74 20 75 73 65 64 20 61 73 20 74  ** not used as t
18ea0 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64  he right operand
18eb0 20 6f 66 20 61 6e 20 6f 75 74 65 72 20 6a 6f 69   of an outer joi
18ec0 6e 2e 20 20 45 78 61 6d 70 6c 65 73 20 6f 66 20  n.  Examples of 
18ed0 77 68 79 20 74 68 69 73 0a 20 20 2a 2a 20 69 73  why this.  ** is
18ee0 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a 20 20   not allowed:.  
18ef0 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20  **.  **         
18f00 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f  t1 LEFT OUTER JO
18f10 49 4e 20 28 74 32 20 4a 4f 49 4e 20 74 33 29 0a  IN (t2 JOIN t3).
18f20 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20    **.  ** If we 
18f30 66 6c 61 74 74 65 6e 20 74 68 65 20 61 62 6f 76  flatten the abov
18f40 65 2c 20 77 65 20 77 6f 75 6c 64 20 67 65 74 0a  e, we would get.
18f50 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20    **.  **       
18f60 20 20 28 74 31 20 4c 45 46 54 20 4f 55 54 45 52    (t1 LEFT OUTER
18f70 20 4a 4f 49 4e 20 74 32 29 20 4a 4f 49 4e 20 74   JOIN t2) JOIN t
18f80 33 0a 20 20 2a 2a 0a 20 20 2a 2a 20 77 68 69 63  3.  **.  ** whic
18f90 68 20 69 73 20 6e 6f 74 20 61 74 20 61 6c 6c 20  h is not at all 
18fa0 74 68 65 20 73 61 6d 65 20 74 68 69 6e 67 2e 0a  the same thing..
18fb0 20 20 2a 2a 0a 20 20 2a 2a 20 4f 42 53 4f 4c 45    **.  ** OBSOLE
18fc0 54 45 20 43 4f 4d 4d 45 4e 54 20 32 3a 0a 20 20  TE COMMENT 2:.  
18fd0 2a 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 31  ** Restriction 1
18fe0 32 3a 20 20 49 66 20 74 68 65 20 73 75 62 71 75  2:  If the subqu
18ff0 65 72 79 20 69 73 20 74 68 65 20 72 69 67 68 74  ery is the right
19000 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 6c 65   operand of a le
19010 66 74 20 6f 75 74 65 72 0a 20 20 2a 2a 20 6a 6f  ft outer.  ** jo
19020 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68  in, make sure th
19030 65 20 73 75 62 71 75 65 72 79 20 68 61 73 20 6e  e subquery has n
19040 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a  o WHERE clause..
19050 20 20 2a 2a 20 41 6e 20 65 78 61 6d 70 6c 65 73    ** An examples
19060 20 6f 66 20 77 68 79 20 74 68 69 73 20 69 73 20   of why this is 
19070 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a  not allowed:.  *
19080 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74  *.  **         t
19090 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  1 LEFT OUTER JOI
190a0 4e 20 28 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  N (SELECT * FROM
190b0 20 74 32 20 57 48 45 52 45 20 74 32 2e 78 3e 30   t2 WHERE t2.x>0
190c0 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 77  ).  **.  ** If w
190d0 65 20 66 6c 61 74 74 65 6e 20 74 68 65 20 61 62  e flatten the ab
190e0 6f 76 65 2c 20 77 65 20 77 6f 75 6c 64 20 67 65  ove, we would ge
190f0 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  t.  **.  **     
19100 20 20 20 20 28 74 31 20 4c 45 46 54 20 4f 55 54      (t1 LEFT OUT
19110 45 52 20 4a 4f 49 4e 20 74 32 29 20 57 48 45 52  ER JOIN t2) WHER
19120 45 20 74 32 2e 78 3e 30 0a 20 20 2a 2a 0a 20 20  E t2.x>0.  **.  
19130 2a 2a 20 42 75 74 20 74 68 65 20 74 32 2e 78 3e  ** But the t2.x>
19140 30 20 74 65 73 74 20 77 69 6c 6c 20 61 6c 77 61  0 test will alwa
19150 79 73 20 66 61 69 6c 20 6f 6e 20 61 20 4e 55 4c  ys fail on a NUL
19160 4c 20 72 6f 77 20 6f 66 20 74 32 2c 20 77 68 69  L row of t2, whi
19170 63 68 0a 20 20 2a 2a 20 65 66 66 65 63 74 69 76  ch.  ** effectiv
19180 65 6c 79 20 63 6f 6e 76 65 72 74 73 20 74 68 65  ely converts the
19190 20 4f 55 54 45 52 20 4a 4f 49 4e 20 69 6e 74 6f   OUTER JOIN into
191a0 20 61 6e 20 49 4e 4e 45 52 20 4a 4f 49 4e 2e 0a   an INNER JOIN..
191b0 20 20 2a 2a 0a 20 20 2a 2a 20 54 48 49 53 20 4f    **.  ** THIS O
191c0 56 45 52 52 49 44 45 53 20 4f 42 53 4f 4c 45 54  VERRIDES OBSOLET
191d0 45 20 43 4f 4d 4d 45 4e 54 53 20 31 20 41 4e 44  E COMMENTS 1 AND
191e0 20 32 20 41 42 4f 56 45 3a 0a 20 20 2a 2a 20 54   2 ABOVE:.  ** T
191f0 69 63 6b 65 74 20 23 33 33 30 30 20 73 68 6f 77  icket #3300 show
19200 73 20 74 68 61 74 20 66 6c 61 74 74 65 6e 69 6e  s that flattenin
19210 67 20 74 68 65 20 72 69 67 68 74 20 74 65 72 6d  g the right term
19220 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 0a   of a LEFT JOIN.
19230 20 20 2a 2a 20 69 73 20 66 72 61 75 67 68 74 20    ** is fraught 
19240 77 69 74 68 20 64 61 6e 67 65 72 2e 20 20 42 65  with danger.  Be
19250 73 74 20 74 6f 20 61 76 6f 69 64 20 74 68 65 20  st to avoid the 
19260 77 68 6f 6c 65 20 74 68 69 6e 67 2e 20 20 49 66  whole thing.  If
19270 20 74 68 65 0a 20 20 2a 2a 20 73 75 62 71 75 65   the.  ** subque
19280 72 79 20 69 73 20 74 68 65 20 72 69 67 68 74 20  ry is the right 
19290 74 65 72 6d 20 6f 66 20 61 20 4c 45 46 54 20 4a  term of a LEFT J
192a0 4f 49 4e 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74  OIN, then do not
192b0 20 66 6c 61 74 74 65 6e 2e 0a 20 20 2a 2f 0a 20   flatten..  */. 
192c0 20 69 66 28 20 28 70 53 75 62 69 74 65 6d 2d 3e   if( (pSubitem->
192d0 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55  jointype & JT_OU
192e0 54 45 52 29 21 3d 30 20 29 7b 0a 20 20 20 20 72  TER)!=0 ){.    r
192f0 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20  eturn 0;.  }..  
19300 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 31  /* Restriction 1
19310 37 3a 20 49 66 20 74 68 65 20 73 75 62 2d 71 75  7: If the sub-qu
19320 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e  ery is a compoun
19330 64 20 53 45 4c 45 43 54 2c 20 74 68 65 6e 20 69  d SELECT, then i
19340 74 20 6d 75 73 74 0a 20 20 2a 2a 20 75 73 65 20  t must.  ** use 
19350 6f 6e 6c 79 20 74 68 65 20 55 4e 49 4f 4e 20 41  only the UNION A
19360 4c 4c 20 6f 70 65 72 61 74 6f 72 2e 20 41 6e 64  LL operator. And
19370 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 73 69 6d   none of the sim
19380 70 6c 65 20 73 65 6c 65 63 74 20 71 75 65 72 69  ple select queri
19390 65 73 0a 20 20 2a 2a 20 74 68 61 74 20 6d 61 6b  es.  ** that mak
193a0 65 20 75 70 20 74 68 65 20 63 6f 6d 70 6f 75 6e  e up the compoun
193b0 64 20 53 45 4c 45 43 54 20 61 72 65 20 61 6c 6c  d SELECT are all
193c0 6f 77 65 64 20 74 6f 20 62 65 20 61 67 67 72 65  owed to be aggre
193d0 67 61 74 65 20 6f 72 20 64 69 73 74 69 6e 63 74  gate or distinct
193e0 0a 20 20 2a 2a 20 71 75 65 72 69 65 73 2e 0a 20  .  ** queries.. 
193f0 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e   */.  if( pSub->
19400 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 69 66  pPrior ){.    if
19410 28 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79  ( pSub->pOrderBy
19420 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
19430 20 30 3b 20 20 2f 2a 20 52 65 73 74 72 69 63 74   0;  /* Restrict
19440 69 6f 6e 20 32 30 20 2a 2f 0a 20 20 20 20 7d 0a  ion 20 */.    }.
19450 20 20 20 20 69 66 28 20 69 73 41 67 67 20 7c 7c      if( isAgg ||
19460 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
19470 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30 20  SF_Distinct)!=0 
19480 7c 7c 20 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31  || pSrc->nSrc!=1
19490 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
194a0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f   0;.    }.    fo
194b0 72 28 70 53 75 62 31 3d 70 53 75 62 3b 20 70 53  r(pSub1=pSub; pS
194c0 75 62 31 3b 20 70 53 75 62 31 3d 70 53 75 62 31  ub1; pSub1=pSub1
194d0 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 20  ->pPrior){.     
194e0 20 74 65 73 74 63 61 73 65 28 20 28 70 53 75 62   testcase( (pSub
194f0 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53  1->selFlags & (S
19500 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67  F_Distinct|SF_Ag
19510 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 44 69  gregate))==SF_Di
19520 73 74 69 6e 63 74 20 29 3b 0a 20 20 20 20 20 20  stinct );.      
19530 74 65 73 74 63 61 73 65 28 20 28 70 53 75 62 31  testcase( (pSub1
19540 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46  ->selFlags & (SF
19550 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67  _Distinct|SF_Agg
19560 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 41 67 67  regate))==SF_Agg
19570 72 65 67 61 74 65 20 29 3b 0a 20 20 20 20 20 20  regate );.      
19580 61 73 73 65 72 74 28 20 70 53 75 62 2d 3e 70 53  assert( pSub->pS
19590 72 63 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  rc!=0 );.      i
195a0 66 28 20 28 70 53 75 62 31 2d 3e 73 65 6c 46 6c  f( (pSub1->selFl
195b0 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e  ags & (SF_Distin
195c0 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29  ct|SF_Aggregate)
195d0 29 21 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 28  )!=0.       || (
195e0 70 53 75 62 31 2d 3e 70 50 72 69 6f 72 20 26 26  pSub1->pPrior &&
195f0 20 70 53 75 62 31 2d 3e 6f 70 21 3d 54 4b 5f 41   pSub1->op!=TK_A
19600 4c 4c 29 20 0a 20 20 20 20 20 20 20 7c 7c 20 70  LL) .       || p
19610 53 75 62 31 2d 3e 70 53 72 63 2d 3e 6e 53 72 63  Sub1->pSrc->nSrc
19620 3c 31 0a 20 20 20 20 20 20 20 7c 7c 20 70 53 75  <1.       || pSu
19630 62 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  b->pEList->nExpr
19640 21 3d 70 53 75 62 31 2d 3e 70 45 4c 69 73 74 2d  !=pSub1->pEList-
19650 3e 6e 45 78 70 72 0a 20 20 20 20 20 20 29 7b 0a  >nExpr.      ){.
19660 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30          return 0
19670 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
19680 74 65 73 74 63 61 73 65 28 20 70 53 75 62 31 2d  testcase( pSub1-
19690 3e 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20 29 3b  >pSrc->nSrc>1 );
196a0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52  .    }..    /* R
196b0 65 73 74 72 69 63 74 69 6f 6e 20 31 38 2e 20 2a  estriction 18. *
196c0 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 72  /.    if( p->pOr
196d0 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 69  derBy ){.      i
196e0 6e 74 20 69 69 3b 0a 20 20 20 20 20 20 66 6f 72  nt ii;.      for
196f0 28 69 69 3d 30 3b 20 69 69 3c 70 2d 3e 70 4f 72  (ii=0; ii<p->pOr
19700 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 69  derBy->nExpr; ii
19710 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
19720 20 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 61 5b   p->pOrderBy->a[
19730 69 69 5d 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3d  ii].iOrderByCol=
19740 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
19750 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
19760 0a 0a 20 20 2f 2a 2a 2a 2a 2a 20 49 66 20 77 65  ..  /***** If we
19770 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e   reach this poin
19780 74 2c 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73  t, flattening is
19790 20 70 65 72 6d 69 74 74 65 64 2e 20 2a 2a 2a 2a   permitted. ****
197a0 2a 2f 0a 0a 20 20 2f 2a 20 41 75 74 68 6f 72 69  */..  /* Authori
197b0 7a 65 20 74 68 65 20 73 75 62 71 75 65 72 79 20  ze the subquery 
197c0 2a 2f 0a 20 20 70 50 61 72 73 65 2d 3e 7a 41 75  */.  pParse->zAu
197d0 74 68 43 6f 6e 74 65 78 74 20 3d 20 70 53 75 62  thContext = pSub
197e0 69 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 54  item->zName;.  T
197f0 45 53 54 4f 4e 4c 59 28 69 20 3d 29 20 73 71 6c  ESTONLY(i =) sql
19800 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
19810 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 53 45 4c  arse, SQLITE_SEL
19820 45 43 54 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  ECT, 0, 0, 0);. 
19830 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d 53 51   testcase( i==SQ
19840 4c 49 54 45 5f 44 45 4e 59 20 29 3b 0a 20 20 70  LITE_DENY );.  p
19850 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74  Parse->zAuthCont
19860 65 78 74 20 3d 20 7a 53 61 76 65 64 41 75 74 68  ext = zSavedAuth
19870 43 6f 6e 74 65 78 74 3b 0a 0a 20 20 2f 2a 20 49  Context;..  /* I
19880 66 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20  f the sub-query 
19890 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45  is a compound SE
198a0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 20  LECT statement, 
198b0 74 68 65 6e 20 28 62 79 20 72 65 73 74 72 69 63  then (by restric
198c0 74 69 6f 6e 73 0a 20 20 2a 2a 20 31 37 20 61 6e  tions.  ** 17 an
198d0 64 20 31 38 20 61 62 6f 76 65 29 20 69 74 20 6d  d 18 above) it m
198e0 75 73 74 20 62 65 20 61 20 55 4e 49 4f 4e 20 41  ust be a UNION A
198f0 4c 4c 20 61 6e 64 20 74 68 65 20 70 61 72 65 6e  LL and the paren
19900 74 20 71 75 65 72 79 20 6d 75 73 74 20 0a 20 20  t query must .  
19910 2a 2a 20 62 65 20 6f 66 20 74 68 65 20 66 6f 72  ** be of the for
19920 6d 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  m:.  **.  **    
19930 20 53 45 4c 45 43 54 20 3c 65 78 70 72 2d 6c 69   SELECT <expr-li
19940 73 74 3e 20 46 52 4f 4d 20 28 3c 73 75 62 2d 71  st> FROM (<sub-q
19950 75 65 72 79 3e 29 20 3c 77 68 65 72 65 2d 63 6c  uery>) <where-cl
19960 61 75 73 65 3e 20 0a 20 20 2a 2a 0a 20 20 2a 2a  ause> .  **.  **
19970 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61 6e 79   followed by any
19980 20 4f 52 44 45 52 20 42 59 2c 20 4c 49 4d 49 54   ORDER BY, LIMIT
19990 20 61 6e 64 2f 6f 72 20 4f 46 46 53 45 54 20 63   and/or OFFSET c
199a0 6c 61 75 73 65 73 2e 20 54 68 69 73 20 62 6c 6f  lauses. This blo
199b0 63 6b 0a 20 20 2a 2a 20 63 72 65 61 74 65 73 20  ck.  ** creates 
199c0 4e 2d 31 20 63 6f 70 69 65 73 20 6f 66 20 74 68  N-1 copies of th
199d0 65 20 70 61 72 65 6e 74 20 71 75 65 72 79 20 77  e parent query w
199e0 69 74 68 6f 75 74 20 61 6e 79 20 4f 52 44 45 52  ithout any ORDER
199f0 20 42 59 2c 20 4c 49 4d 49 54 20 6f 72 20 0a 20   BY, LIMIT or . 
19a00 20 2a 2a 20 4f 46 46 53 45 54 20 63 6c 61 75 73   ** OFFSET claus
19a10 65 73 20 61 6e 64 20 6a 6f 69 6e 73 20 74 68 65  es and joins the
19a20 6d 20 74 6f 20 74 68 65 20 6c 65 66 74 2d 68 61  m to the left-ha
19a30 6e 64 2d 73 69 64 65 20 6f 66 20 74 68 65 20 6f  nd-side of the o
19a40 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 75 73 69  riginal.  ** usi
19a50 6e 67 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65  ng UNION ALL ope
19a60 72 61 74 6f 72 73 2e 20 49 6e 20 74 68 69 73 20  rators. In this 
19a70 63 61 73 65 20 4e 20 69 73 20 74 68 65 20 6e 75  case N is the nu
19a80 6d 62 65 72 20 6f 66 20 73 69 6d 70 6c 65 0a 20  mber of simple. 
19a90 20 2a 2a 20 73 65 6c 65 63 74 20 73 74 61 74 65   ** select state
19aa0 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 63 6f 6d  ments in the com
19ab0 70 6f 75 6e 64 20 73 75 62 2d 71 75 65 72 79 2e  pound sub-query.
19ac0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 61 6d 70  .  **.  ** Examp
19ad0 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  le:.  **.  **   
19ae0 20 20 53 45 4c 45 43 54 20 61 2b 31 20 46 52 4f    SELECT a+1 FRO
19af0 4d 20 28 0a 20 20 2a 2a 20 20 20 20 20 20 20 20  M (.  **        
19b00 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 61  SELECT x FROM ta
19b10 62 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 55 4e  b.  **        UN
19b20 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20  ION ALL.  **    
19b30 20 20 20 20 53 45 4c 45 43 54 20 79 20 46 52 4f      SELECT y FRO
19b40 4d 20 74 61 62 0a 20 20 2a 2a 20 20 20 20 20 20  M tab.  **      
19b50 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a    UNION ALL.  **
19b60 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 61          SELECT a
19b70 62 73 28 7a 2a 32 29 20 46 52 4f 4d 20 74 61 62  bs(z*2) FROM tab
19b80 32 0a 20 20 2a 2a 20 20 20 20 20 29 20 57 48 45  2.  **     ) WHE
19b90 52 45 20 61 21 3d 35 20 4f 52 44 45 52 20 42 59  RE a!=5 ORDER BY
19ba0 20 31 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 72 61   1.  **.  ** Tra
19bb0 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f 3a 0a 20  nsformed into:. 
19bc0 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c   **.  **     SEL
19bd0 45 43 54 20 78 2b 31 20 46 52 4f 4d 20 74 61 62  ECT x+1 FROM tab
19be0 20 57 48 45 52 45 20 78 2b 31 21 3d 35 0a 20 20   WHERE x+1!=5.  
19bf0 2a 2a 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c  **     UNION ALL
19c00 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  .  **     SELECT
19c10 20 79 2b 31 20 46 52 4f 4d 20 74 61 62 20 57 48   y+1 FROM tab WH
19c20 45 52 45 20 79 2b 31 21 3d 35 0a 20 20 2a 2a 20  ERE y+1!=5.  ** 
19c30 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20      UNION ALL.  
19c40 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61 62  **     SELECT ab
19c50 73 28 7a 2a 32 29 2b 31 20 46 52 4f 4d 20 74 61  s(z*2)+1 FROM ta
19c60 62 32 20 57 48 45 52 45 20 61 62 73 28 7a 2a 32  b2 WHERE abs(z*2
19c70 29 2b 31 21 3d 35 0a 20 20 2a 2a 20 20 20 20 20  )+1!=5.  **     
19c80 4f 52 44 45 52 20 42 59 20 31 0a 20 20 2a 2a 0a  ORDER BY 1.  **.
19c90 20 20 2a 2a 20 57 65 20 63 61 6c 6c 20 74 68 69    ** We call thi
19ca0 73 20 74 68 65 20 22 63 6f 6d 70 6f 75 6e 64 2d  s the "compound-
19cb0 73 75 62 71 75 65 72 79 20 66 6c 61 74 74 65 6e  subquery flatten
19cc0 69 6e 67 22 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  ing"..  */.  for
19cd0 28 70 53 75 62 3d 70 53 75 62 2d 3e 70 50 72 69  (pSub=pSub->pPri
19ce0 6f 72 3b 20 70 53 75 62 3b 20 70 53 75 62 3d 70  or; pSub; pSub=p
19cf0 53 75 62 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20  Sub->pPrior){.  
19d00 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a    Select *pNew;.
19d10 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f      ExprList *pO
19d20 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64  rderBy = p->pOrd
19d30 65 72 42 79 3b 0a 20 20 20 20 45 78 70 72 20 2a  erBy;.    Expr *
19d40 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d  pLimit = p->pLim
19d50 69 74 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 4f  it;.    Expr *pO
19d60 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73  ffset = p->pOffs
19d70 65 74 3b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a  et;.    Select *
19d80 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69  pPrior = p->pPri
19d90 6f 72 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65  or;.    p->pOrde
19da0 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e  rBy = 0;.    p->
19db0 70 53 72 63 20 3d 20 30 3b 0a 20 20 20 20 70 2d  pSrc = 0;.    p-
19dc0 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20  >pPrior = 0;.   
19dd0 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a   p->pLimit = 0;.
19de0 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d      p->pOffset =
19df0 20 30 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 73   0;.    pNew = s
19e00 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28  qlite3SelectDup(
19e10 64 62 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20 70  db, p, 0);.    p
19e20 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f 66 66  ->pOffset = pOff
19e30 73 65 74 3b 0a 20 20 20 20 70 2d 3e 70 4c 69 6d  set;.    p->pLim
19e40 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20  it = pLimit;.   
19e50 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70   p->pOrderBy = p
19e60 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 70 2d 3e  OrderBy;.    p->
19e70 70 53 72 63 20 3d 20 70 53 72 63 3b 0a 20 20 20  pSrc = pSrc;.   
19e80 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f 41 4c 4c 3b   p->op = TK_ALL;
19e90 0a 20 20 20 20 70 2d 3e 70 52 69 67 68 74 6d 6f  .    p->pRightmo
19ea0 73 74 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  st = 0;.    if( 
19eb0 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pNew==0 ){.     
19ec0 20 70 4e 65 77 20 3d 20 70 50 72 69 6f 72 3b 0a   pNew = pPrior;.
19ed0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
19ee0 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72 20 3d 20   pNew->pPrior = 
19ef0 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 4e  pPrior;.      pN
19f00 65 77 2d 3e 70 52 69 67 68 74 6d 6f 73 74 20 3d  ew->pRightmost =
19f10 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d   0;.    }.    p-
19f20 3e 70 50 72 69 6f 72 20 3d 20 70 4e 65 77 3b 0a  >pPrior = pNew;.
19f30 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c      if( db->mall
19f40 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72  ocFailed ) retur
19f50 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42  n 1;.  }..  /* B
19f60 65 67 69 6e 20 66 6c 61 74 74 65 6e 69 6e 67 20  egin flattening 
19f70 74 68 65 20 69 46 72 6f 6d 2d 74 68 20 65 6e 74  the iFrom-th ent
19f80 72 79 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63  ry of the FROM c
19f90 6c 61 75 73 65 20 0a 20 20 2a 2a 20 69 6e 20 74  lause .  ** in t
19fa0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a  he outer query..
19fb0 20 20 2a 2f 0a 20 20 70 53 75 62 20 3d 20 70 53    */.  pSub = pS
19fc0 75 62 31 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e  ub1 = pSubitem->
19fd0 70 53 65 6c 65 63 74 3b 0a 0a 20 20 2f 2a 20 44  pSelect;..  /* D
19fe0 65 6c 65 74 65 20 74 68 65 20 74 72 61 6e 73 69  elete the transi
19ff0 65 6e 74 20 74 61 62 6c 65 20 73 74 72 75 63 74  ent table struct
1a000 75 72 65 20 61 73 73 6f 63 69 61 74 65 64 20 77  ure associated w
1a010 69 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 75 62  ith the.  ** sub
1a020 71 75 65 72 79 0a 20 20 2a 2f 0a 20 20 73 71 6c  query.  */.  sql
1a030 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
1a040 53 75 62 69 74 65 6d 2d 3e 7a 44 61 74 61 62 61  Subitem->zDataba
1a050 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  se);.  sqlite3Db
1a060 46 72 65 65 28 64 62 2c 20 70 53 75 62 69 74 65  Free(db, pSubite
1a070 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c  m->zName);.  sql
1a080 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
1a090 53 75 62 69 74 65 6d 2d 3e 7a 41 6c 69 61 73 29  Subitem->zAlias)
1a0a0 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a 44  ;.  pSubitem->zD
1a0b0 61 74 61 62 61 73 65 20 3d 20 30 3b 0a 20 20 70  atabase = 0;.  p
1a0c0 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d  Subitem->zName =
1a0d0 20 30 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e   0;.  pSubitem->
1a0e0 7a 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20 70 53  zAlias = 0;.  pS
1a0f0 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20  ubitem->pSelect 
1a100 3d 20 30 3b 0a 0a 20 20 2f 2a 20 44 65 66 65 72  = 0;..  /* Defer
1a110 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20 54 61   deleting the Ta
1a120 62 6c 65 20 6f 62 6a 65 63 74 20 61 73 73 6f 63  ble object assoc
1a130 69 61 74 65 64 20 77 69 74 68 20 74 68 65 0a 20  iated with the. 
1a140 20 2a 2a 20 73 75 62 71 75 65 72 79 20 75 6e 74   ** subquery unt
1a150 69 6c 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  il code generati
1a160 6f 6e 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 70 6c  on is.  ** compl
1a170 65 74 65 2c 20 73 69 6e 63 65 20 74 68 65 72 65  ete, since there
1a180 20 6d 61 79 20 73 74 69 6c 6c 20 65 78 69 73 74   may still exist
1a190 20 45 78 70 72 2e 70 54 61 62 20 65 6e 74 72 69   Expr.pTab entri
1a1a0 65 73 20 74 68 61 74 0a 20 20 2a 2a 20 72 65 66  es that.  ** ref
1a1b0 65 72 20 74 6f 20 74 68 65 20 73 75 62 71 75 65  er to the subque
1a1c0 72 79 20 65 76 65 6e 20 61 66 74 65 72 20 66 6c  ry even after fl
1a1d0 61 74 74 65 6e 69 6e 67 2e 20 20 54 69 63 6b 65  attening.  Ticke
1a1e0 74 20 23 33 33 34 36 2e 0a 20 20 2a 2a 0a 20 20  t #3346..  **.  
1a1f0 2a 2a 20 70 53 75 62 69 74 65 6d 2d 3e 70 54 61  ** pSubitem->pTa
1a200 62 20 69 73 20 61 6c 77 61 79 73 20 6e 6f 6e 2d  b is always non-
1a210 4e 55 4c 4c 20 62 79 20 74 65 73 74 20 72 65 73  NULL by test res
1a220 74 72 69 63 74 69 6f 6e 73 20 61 6e 64 20 74 65  trictions and te
1a230 73 74 73 20 61 62 6f 76 65 2e 0a 20 20 2a 2f 0a  sts above..  */.
1a240 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 53 75    if( ALWAYS(pSu
1a250 62 69 74 65 6d 2d 3e 70 54 61 62 21 3d 30 29 20  bitem->pTab!=0) 
1a260 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  ){.    Table *pT
1a270 61 62 54 6f 44 65 6c 20 3d 20 70 53 75 62 69 74  abToDel = pSubit
1a280 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 66  em->pTab;.    if
1a290 28 20 70 54 61 62 54 6f 44 65 6c 2d 3e 6e 52 65  ( pTabToDel->nRe
1a2a0 66 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 50 61  f==1 ){.      Pa
1a2b0 72 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d  rse *pToplevel =
1a2c0 20 73 71 6c 69 74 65 33 50 61 72 73 65 54 6f 70   sqlite3ParseTop
1a2d0 6c 65 76 65 6c 28 70 50 61 72 73 65 29 3b 0a 20  level(pParse);. 
1a2e0 20 20 20 20 20 70 54 61 62 54 6f 44 65 6c 2d 3e       pTabToDel->
1a2f0 70 4e 65 78 74 5a 6f 6d 62 69 65 20 3d 20 70 54  pNextZombie = pT
1a300 6f 70 6c 65 76 65 6c 2d 3e 70 5a 6f 6d 62 69 65  oplevel->pZombie
1a310 54 61 62 3b 0a 20 20 20 20 20 20 70 54 6f 70 6c  Tab;.      pTopl
1a320 65 76 65 6c 2d 3e 70 5a 6f 6d 62 69 65 54 61 62  evel->pZombieTab
1a330 20 3d 20 70 54 61 62 54 6f 44 65 6c 3b 0a 20 20   = pTabToDel;.  
1a340 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
1a350 54 61 62 54 6f 44 65 6c 2d 3e 6e 52 65 66 2d 2d  TabToDel->nRef--
1a360 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 75 62  ;.    }.    pSub
1a370 69 74 65 6d 2d 3e 70 54 61 62 20 3d 20 30 3b 0a  item->pTab = 0;.
1a380 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f    }..  /* The fo
1a390 6c 6c 6f 77 69 6e 67 20 6c 6f 6f 70 20 72 75 6e  llowing loop run
1a3a0 73 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20  s once for each 
1a3b0 74 65 72 6d 20 69 6e 20 61 20 63 6f 6d 70 6f 75  term in a compou
1a3c0 6e 64 2d 73 75 62 71 75 65 72 79 0a 20 20 2a 2a  nd-subquery.  **
1a3d0 20 66 6c 61 74 74 65 6e 69 6e 67 20 28 61 73 20   flattening (as 
1a3e0 64 65 73 63 72 69 62 65 64 20 61 62 6f 76 65 29  described above)
1a3f0 2e 20 20 49 66 20 77 65 20 61 72 65 20 64 6f 69  .  If we are doi
1a400 6e 67 20 61 20 64 69 66 66 65 72 65 6e 74 20 6b  ng a different k
1a410 69 6e 64 0a 20 20 2a 2a 20 6f 66 20 66 6c 61 74  ind.  ** of flat
1a420 74 65 6e 69 6e 67 20 2d 20 61 20 66 6c 61 74 74  tening - a flatt
1a430 65 6e 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e  ening other than
1a440 20 61 20 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71   a compound-subq
1a450 75 65 72 79 20 66 6c 61 74 74 65 6e 69 6e 67 20  uery flattening 
1a460 2d 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68 69 73  -.  ** then this
1a470 20 6c 6f 6f 70 20 6f 6e 6c 79 20 72 75 6e 73 20   loop only runs 
1a480 6f 6e 63 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  once..  **.  ** 
1a490 54 68 69 73 20 6c 6f 6f 70 20 6d 6f 76 65 73 20  This loop moves 
1a4a0 61 6c 6c 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  all of the FROM 
1a4b0 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20  elements of the 
1a4c0 73 75 62 71 75 65 72 79 20 69 6e 74 6f 20 74 68  subquery into th
1a4d0 65 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20  e.  ** the FROM 
1a4e0 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75  clause of the ou
1a4f0 74 65 72 20 71 75 65 72 79 2e 20 20 42 65 66 6f  ter query.  Befo
1a500 72 65 20 64 6f 69 6e 67 20 74 68 69 73 2c 20 72  re doing this, r
1a510 65 6d 65 6d 62 65 72 0a 20 20 2a 2a 20 74 68 65  emember.  ** the
1a520 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66   cursor number f
1a530 6f 72 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  or the original 
1a540 6f 75 74 65 72 20 71 75 65 72 79 20 46 52 4f 4d  outer query FROM
1a550 20 65 6c 65 6d 65 6e 74 20 69 6e 0a 20 20 2a 2a   element in.  **
1a560 20 69 50 61 72 65 6e 74 2e 20 20 54 68 65 20 69   iParent.  The i
1a570 50 61 72 65 6e 74 20 63 75 72 73 6f 72 20 77 69  Parent cursor wi
1a580 6c 6c 20 6e 65 76 65 72 20 62 65 20 75 73 65 64  ll never be used
1a590 2e 20 20 53 75 62 73 65 71 75 65 6e 74 20 63 6f  .  Subsequent co
1a5a0 64 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 73 63 61  de.  ** will sca
1a5b0 6e 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6c 6f  n expressions lo
1a5c0 6f 6b 69 6e 67 20 66 6f 72 20 69 50 61 72 65 6e  oking for iParen
1a5d0 74 20 72 65 66 65 72 65 6e 63 65 73 20 61 6e 64  t references and
1a5e0 20 72 65 70 6c 61 63 65 0a 20 20 2a 2a 20 74 68   replace.  ** th
1a5f0 6f 73 65 20 72 65 66 65 72 65 6e 63 65 73 20 77  ose references w
1a600 69 74 68 20 65 78 70 72 65 73 73 69 6f 6e 73 20  ith expressions 
1a610 74 68 61 74 20 72 65 73 6f 6c 76 65 20 74 6f 20  that resolve to 
1a620 74 68 65 20 73 75 62 71 75 65 72 79 20 46 52 4f  the subquery FRO
1a630 4d 0a 20 20 2a 2a 20 65 6c 65 6d 65 6e 74 73 20  M.  ** elements 
1a640 77 65 20 61 72 65 20 6e 6f 77 20 63 6f 70 79 69  we are now copyi
1a650 6e 67 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 66 6f  ng in..  */.  fo
1a660 72 28 70 50 61 72 65 6e 74 3d 70 3b 20 70 50 61  r(pParent=p; pPa
1a670 72 65 6e 74 3b 20 70 50 61 72 65 6e 74 3d 70 50  rent; pParent=pP
1a680 61 72 65 6e 74 2d 3e 70 50 72 69 6f 72 2c 20 70  arent->pPrior, p
1a690 53 75 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72  Sub=pSub->pPrior
1a6a0 29 7b 0a 20 20 20 20 69 6e 74 20 6e 53 75 62 53  ){.    int nSubS
1a6b0 72 63 3b 0a 20 20 20 20 75 38 20 6a 6f 69 6e 74  rc;.    u8 joint
1a6c0 79 70 65 20 3d 20 30 3b 0a 20 20 20 20 70 53 75  ype = 0;.    pSu
1a6d0 62 53 72 63 20 3d 20 70 53 75 62 2d 3e 70 53 72  bSrc = pSub->pSr
1a6e0 63 3b 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63  c;     /* FROM c
1a6f0 6c 61 75 73 65 20 6f 66 20 73 75 62 71 75 65 72  lause of subquer
1a700 79 20 2a 2f 0a 20 20 20 20 6e 53 75 62 53 72 63  y */.    nSubSrc
1a710 20 3d 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63   = pSubSrc->nSrc
1a720 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20  ;  /* Number of 
1a730 74 65 72 6d 73 20 69 6e 20 73 75 62 71 75 65 72  terms in subquer
1a740 79 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  y FROM clause */
1a750 0a 20 20 20 20 70 53 72 63 20 3d 20 70 50 61 72  .    pSrc = pPar
1a760 65 6e 74 2d 3e 70 53 72 63 3b 20 20 20 20 20 2f  ent->pSrc;     /
1a770 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  * FROM clause of
1a780 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1a790 20 2a 2f 0a 0a 20 20 20 20 69 66 28 20 70 53 72   */..    if( pSr
1a7a0 63 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  c ){.      asser
1a7b0 74 28 20 70 50 61 72 65 6e 74 3d 3d 70 20 29 3b  t( pParent==p );
1a7c0 20 20 2f 2a 20 46 69 72 73 74 20 74 69 6d 65 20    /* First time 
1a7d0 74 68 72 6f 75 67 68 20 74 68 65 20 6c 6f 6f 70  through the loop
1a7e0 20 2a 2f 0a 20 20 20 20 20 20 6a 6f 69 6e 74 79   */.      jointy
1a7f0 70 65 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 6a  pe = pSubitem->j
1a800 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20 7d 65 6c  ointype;.    }el
1a810 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
1a820 28 20 70 50 61 72 65 6e 74 21 3d 70 20 29 3b 20  ( pParent!=p ); 
1a830 20 2f 2a 20 32 6e 64 20 61 6e 64 20 73 75 62 73   /* 2nd and subs
1a840 65 71 75 65 6e 74 20 74 69 6d 65 73 20 74 68 72  equent times thr
1a850 6f 75 67 68 20 74 68 65 20 6c 6f 6f 70 20 2a 2f  ough the loop */
1a860 0a 20 20 20 20 20 20 70 53 72 63 20 3d 20 70 50  .      pSrc = pP
1a870 61 72 65 6e 74 2d 3e 70 53 72 63 20 3d 20 73 71  arent->pSrc = sq
1a880 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65  lite3SrcListAppe
1a890 6e 64 28 64 62 2c 20 30 2c 20 30 2c 20 30 29 3b  nd(db, 0, 0, 0);
1a8a0 0a 20 20 20 20 20 20 69 66 28 20 70 53 72 63 3d  .      if( pSrc=
1a8b0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  =0 ){.        as
1a8c0 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63  sert( db->malloc
1a8d0 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20  Failed );.      
1a8e0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
1a8f0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54  .    }..    /* T
1a900 68 65 20 73 75 62 71 75 65 72 79 20 75 73 65 73  he subquery uses
1a910 20 61 20 73 69 6e 67 6c 65 20 73 6c 6f 74 20 6f   a single slot o
1a920 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  f the FROM claus
1a930 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72 0a 20  e of the outer. 
1a940 20 20 20 2a 2a 20 71 75 65 72 79 2e 20 20 49 66     ** query.  If
1a950 20 74 68 65 20 73 75 62 71 75 65 72 79 20 68 61   the subquery ha
1a960 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  s more than one 
1a970 65 6c 65 6d 65 6e 74 20 69 6e 20 69 74 73 20 46  element in its F
1a980 52 4f 4d 20 63 6c 61 75 73 65 2c 0a 20 20 20 20  ROM clause,.    
1a990 2a 2a 20 74 68 65 6e 20 65 78 70 61 6e 64 20 74  ** then expand t
1a9a0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 74  he outer query t
1a9b0 6f 20 6d 61 6b 65 20 73 70 61 63 65 20 66 6f 72  o make space for
1a9c0 20 69 74 20 74 6f 20 68 6f 6c 64 20 61 6c 6c 20   it to hold all 
1a9d0 65 6c 65 6d 65 6e 74 73 0a 20 20 20 20 2a 2a 20  elements.    ** 
1a9e0 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79 2e  of the subquery.
1a9f0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45  .    **.    ** E
1aa00 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20  xample:.    **. 
1aa10 20 20 20 2a 2a 20 20 20 20 53 45 4c 45 43 54 20     **    SELECT 
1aa20 2a 20 46 52 4f 4d 20 74 61 62 41 2c 20 28 53 45  * FROM tabA, (SE
1aa30 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73 75 62 31  LECT * FROM sub1
1aa40 2c 20 73 75 62 32 29 2c 20 74 61 62 42 3b 0a 20  , sub2), tabB;. 
1aa50 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
1aa60 20 6f 75 74 65 72 20 71 75 65 72 79 20 68 61 73   outer query has
1aa70 20 33 20 73 6c 6f 74 73 20 69 6e 20 69 74 73 20   3 slots in its 
1aa80 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 4f 6e  FROM clause.  On
1aa90 65 20 73 6c 6f 74 20 6f 66 20 74 68 65 0a 20 20  e slot of the.  
1aaa0 20 20 2a 2a 20 6f 75 74 65 72 20 71 75 65 72 79    ** outer query
1aab0 20 28 74 68 65 20 6d 69 64 64 6c 65 20 73 6c 6f   (the middle slo
1aac0 74 29 20 69 73 20 75 73 65 64 20 62 79 20 74 68  t) is used by th
1aad0 65 20 73 75 62 71 75 65 72 79 2e 20 20 54 68 65  e subquery.  The
1aae0 20 6e 65 78 74 0a 20 20 20 20 2a 2a 20 62 6c 6f   next.    ** blo
1aaf0 63 6b 20 6f 66 20 63 6f 64 65 20 77 69 6c 6c 20  ck of code will 
1ab00 65 78 70 61 6e 64 20 74 68 65 20 6f 75 74 20 71  expand the out q
1ab10 75 65 72 79 20 74 6f 20 34 20 73 6c 6f 74 73 2e  uery to 4 slots.
1ab20 20 20 54 68 65 20 6d 69 64 64 6c 65 0a 20 20 20    The middle.   
1ab30 20 2a 2a 20 73 6c 6f 74 20 69 73 20 65 78 70 61   ** slot is expa
1ab40 6e 64 65 64 20 74 6f 20 74 77 6f 20 73 6c 6f 74  nded to two slot
1ab50 73 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6d 61  s in order to ma
1ab60 6b 65 20 73 70 61 63 65 20 66 6f 72 20 74 68 65  ke space for the
1ab70 0a 20 20 20 20 2a 2a 20 74 77 6f 20 65 6c 65 6d  .    ** two elem
1ab80 65 6e 74 73 20 69 6e 20 74 68 65 20 46 52 4f 4d  ents in the FROM
1ab90 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 73   clause of the s
1aba0 75 62 71 75 65 72 79 2e 0a 20 20 20 20 2a 2f 0a  ubquery..    */.
1abb0 20 20 20 20 69 66 28 20 6e 53 75 62 53 72 63 3e      if( nSubSrc>
1abc0 31 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 65  1 ){.      pPare
1abd0 6e 74 2d 3e 70 53 72 63 20 3d 20 70 53 72 63 20  nt->pSrc = pSrc 
1abe0 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  = sqlite3SrcList
1abf0 45 6e 6c 61 72 67 65 28 64 62 2c 20 70 53 72 63  Enlarge(db, pSrc
1ac00 2c 20 6e 53 75 62 53 72 63 2d 31 2c 69 46 72 6f  , nSubSrc-1,iFro
1ac10 6d 2b 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20  m+1);.      if( 
1ac20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1ac30 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61   ){.        brea
1ac40 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
1ac50 0a 0a 20 20 20 20 2f 2a 20 54 72 61 6e 73 66 65  ..    /* Transfe
1ac60 72 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  r the FROM claus
1ac70 65 20 74 65 72 6d 73 20 66 72 6f 6d 20 74 68 65  e terms from the
1ac80 20 73 75 62 71 75 65 72 79 20 69 6e 74 6f 20 74   subquery into t
1ac90 68 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72 20  he.    ** outer 
1aca0 71 75 65 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  query..    */.  
1acb0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 75    for(i=0; i<nSu
1acc0 62 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  bSrc; i++){.    
1acd0 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44    sqlite3IdListD
1ace0 65 6c 65 74 65 28 64 62 2c 20 70 53 72 63 2d 3e  elete(db, pSrc->
1acf0 61 5b 69 2b 69 46 72 6f 6d 5d 2e 70 55 73 69 6e  a[i+iFrom].pUsin
1ad00 67 29 3b 0a 20 20 20 20 20 20 70 53 72 63 2d 3e  g);.      pSrc->
1ad10 61 5b 69 2b 69 46 72 6f 6d 5d 20 3d 20 70 53 75  a[i+iFrom] = pSu
1ad20 62 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  bSrc->a[i];.    
1ad30 20 20 6d 65 6d 73 65 74 28 26 70 53 75 62 53 72    memset(&pSubSr
1ad40 63 2d 3e 61 5b 69 5d 2c 20 30 2c 20 73 69 7a 65  c->a[i], 0, size
1ad50 6f 66 28 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d  of(pSubSrc->a[i]
1ad60 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53  ));.    }.    pS
1ad70 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 6a 6f 69  rc->a[iFrom].joi
1ad80 6e 74 79 70 65 20 3d 20 6a 6f 69 6e 74 79 70 65  ntype = jointype
1ad90 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 4e 6f 77 20  ;.  .    /* Now 
1ada0 62 65 67 69 6e 20 73 75 62 73 74 69 74 75 74 69  begin substituti
1adb0 6e 67 20 73 75 62 71 75 65 72 79 20 72 65 73 75  ng subquery resu
1adc0 6c 74 20 73 65 74 20 65 78 70 72 65 73 73 69 6f  lt set expressio
1add0 6e 73 20 66 6f 72 20 0a 20 20 20 20 2a 2a 20 72  ns for .    ** r
1ade0 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65  eferences to the
1adf0 20 69 50 61 72 65 6e 74 20 69 6e 20 74 68 65 20   iParent in the 
1ae00 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20 20  outer query..   
1ae10 20 2a 2a 20 0a 20 20 20 20 2a 2a 20 45 78 61 6d   ** .    ** Exam
1ae20 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ple:.    **.    
1ae30 2a 2a 20 20 20 53 45 4c 45 43 54 20 61 2b 35 2c  **   SELECT a+5,
1ae40 20 62 2a 31 30 20 46 52 4f 4d 20 28 53 45 4c 45   b*10 FROM (SELE
1ae50 43 54 20 78 2a 33 20 41 53 20 61 2c 20 79 2b 31  CT x*3 AS a, y+1
1ae60 30 20 41 53 20 62 20 46 52 4f 4d 20 74 31 29 20  0 AS b FROM t1) 
1ae70 57 48 45 52 45 20 61 3e 62 3b 0a 20 20 20 20 2a  WHERE a>b;.    *
1ae80 2a 20 20 20 5c 20 20 20 20 20 20 20 20 20 20 20  *   \           
1ae90 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f            \_____
1aea0 5f 5f 5f 5f 5f 5f 5f 5f 20 73 75 62 71 75 65 72  ________ subquer
1aeb0 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20  y __________/   
1aec0 20 20 20 20 20 20 20 2f 0a 20 20 20 20 2a 2a 20         /.    ** 
1aed0 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f     \____________
1aee0 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65 72 20  _________ outer 
1aef0 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  query __________
1af00 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
1af10 5f 5f 5f 5f 2f 0a 20 20 20 20 2a 2a 0a 20 20 20  ____/.    **.   
1af20 20 2a 2a 20 57 65 20 6c 6f 6f 6b 20 61 74 20 65   ** We look at e
1af30 76 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20  very expression 
1af40 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  in the outer que
1af50 72 79 20 61 6e 64 20 65 76 65 72 79 20 70 6c 61  ry and every pla
1af60 63 65 20 77 65 20 73 65 65 0a 20 20 20 20 2a 2a  ce we see.    **
1af70 20 22 61 22 20 77 65 20 73 75 62 73 74 69 74 75   "a" we substitu
1af80 74 65 20 22 78 2a 33 22 20 61 6e 64 20 65 76 65  te "x*3" and eve
1af90 72 79 20 70 6c 61 63 65 20 77 65 20 73 65 65 20  ry place we see 
1afa0 22 62 22 20 77 65 20 73 75 62 73 74 69 74 75 74  "b" we substitut
1afb0 65 20 22 79 2b 31 30 22 2e 0a 20 20 20 20 2a 2f  e "y+10"..    */
1afc0 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70 50 61  .    pList = pPa
1afd0 72 65 6e 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20  rent->pEList;.  
1afe0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69    for(i=0; i<pLi
1aff0 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
1b000 0a 20 20 20 20 20 20 69 66 28 20 70 4c 69 73 74  .      if( pList
1b010 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3d 3d 30 20  ->a[i].zName==0 
1b020 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
1b030 2a 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  *zName = sqlite3
1b040 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4c 69  DbStrDup(db, pLi
1b050 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 29 3b  st->a[i].zSpan);
1b060 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1b070 44 65 71 75 6f 74 65 28 7a 4e 61 6d 65 29 3b 0a  Dequote(zName);.
1b080 20 20 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 61          pList->a
1b090 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d  [i].zName = zNam
1b0a0 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  e;.      }.    }
1b0b0 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 4c 69  .    substExprLi
1b0c0 73 74 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e  st(db, pParent->
1b0d0 70 45 4c 69 73 74 2c 20 69 50 61 72 65 6e 74 2c  pEList, iParent,
1b0e0 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a   pSub->pEList);.
1b0f0 20 20 20 20 69 66 28 20 69 73 41 67 67 20 29 7b      if( isAgg ){
1b100 0a 20 20 20 20 20 20 73 75 62 73 74 45 78 70 72  .      substExpr
1b110 4c 69 73 74 28 64 62 2c 20 70 50 61 72 65 6e 74  List(db, pParent
1b120 2d 3e 70 47 72 6f 75 70 42 79 2c 20 69 50 61 72  ->pGroupBy, iPar
1b130 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73  ent, pSub->pELis
1b140 74 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e  t);.      pParen
1b150 74 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 75 62  t->pHaving = sub
1b160 73 74 45 78 70 72 28 64 62 2c 20 70 50 61 72 65  stExpr(db, pPare
1b170 6e 74 2d 3e 70 48 61 76 69 6e 67 2c 20 69 50 61  nt->pHaving, iPa
1b180 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69  rent, pSub->pELi
1b190 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  st);.    }.    i
1b1a0 66 28 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42  f( pSub->pOrderB
1b1b0 79 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  y ){.      asser
1b1c0 74 28 20 70 50 61 72 65 6e 74 2d 3e 70 4f 72 64  t( pParent->pOrd
1b1d0 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20  erBy==0 );.     
1b1e0 20 70 50 61 72 65 6e 74 2d 3e 70 4f 72 64 65 72   pParent->pOrder
1b1f0 42 79 20 3d 20 70 53 75 62 2d 3e 70 4f 72 64 65  By = pSub->pOrde
1b200 72 42 79 3b 0a 20 20 20 20 20 20 70 53 75 62 2d  rBy;.      pSub-
1b210 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20  >pOrderBy = 0;. 
1b220 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61     }else if( pPa
1b230 72 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79 20 29  rent->pOrderBy )
1b240 7b 0a 20 20 20 20 20 20 73 75 62 73 74 45 78 70  {.      substExp
1b250 72 4c 69 73 74 28 64 62 2c 20 70 50 61 72 65 6e  rList(db, pParen
1b260 74 2d 3e 70 4f 72 64 65 72 42 79 2c 20 69 50 61  t->pOrderBy, iPa
1b270 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69  rent, pSub->pELi
1b280 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  st);.    }.    i
1b290 66 28 20 70 53 75 62 2d 3e 70 57 68 65 72 65 20  f( pSub->pWhere 
1b2a0 29 7b 0a 20 20 20 20 20 20 70 57 68 65 72 65 20  ){.      pWhere 
1b2b0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
1b2c0 28 64 62 2c 20 70 53 75 62 2d 3e 70 57 68 65 72  (db, pSub->pWher
1b2d0 65 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65  e, 0);.    }else
1b2e0 7b 0a 20 20 20 20 20 20 70 57 68 65 72 65 20 3d  {.      pWhere =
1b2f0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   0;.    }.    if
1b300 28 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20  ( subqueryIsAgg 
1b310 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
1b320 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e   pParent->pHavin
1b330 67 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50  g==0 );.      pP
1b340 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 20 3d  arent->pHaving =
1b350 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65   pParent->pWhere
1b360 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d  ;.      pParent-
1b370 3e 70 57 68 65 72 65 20 3d 20 70 57 68 65 72 65  >pWhere = pWhere
1b380 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d  ;.      pParent-
1b390 3e 70 48 61 76 69 6e 67 20 3d 20 73 75 62 73 74  >pHaving = subst
1b3a0 45 78 70 72 28 64 62 2c 20 70 50 61 72 65 6e 74  Expr(db, pParent
1b3b0 2d 3e 70 48 61 76 69 6e 67 2c 20 69 50 61 72 65  ->pHaving, iPare
1b3c0 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74  nt, pSub->pEList
1b3d0 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74  );.      pParent
1b3e0 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 71 6c 69  ->pHaving = sqli
1b3f0 74 65 33 45 78 70 72 41 6e 64 28 64 62 2c 20 70  te3ExprAnd(db, p
1b400 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 2c  Parent->pHaving,
1b410 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
1b420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b430 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
1b440 75 70 28 64 62 2c 20 70 53 75 62 2d 3e 70 48 61  up(db, pSub->pHa
1b450 76 69 6e 67 2c 20 30 29 29 3b 0a 20 20 20 20 20  ving, 0));.     
1b460 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74   assert( pParent
1b470 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b  ->pGroupBy==0 );
1b480 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e  .      pParent->
1b490 70 47 72 6f 75 70 42 79 20 3d 20 73 71 6c 69 74  pGroupBy = sqlit
1b4a0 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62  e3ExprListDup(db
1b4b0 2c 20 70 53 75 62 2d 3e 70 47 72 6f 75 70 42 79  , pSub->pGroupBy
1b4c0 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , 0);.    }else{
1b4d0 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e  .      pParent->
1b4e0 70 57 68 65 72 65 20 3d 20 73 75 62 73 74 45 78  pWhere = substEx
1b4f0 70 72 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e  pr(db, pParent->
1b500 70 57 68 65 72 65 2c 20 69 50 61 72 65 6e 74 2c  pWhere, iParent,
1b510 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a   pSub->pEList);.
1b520 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70        pParent->p
1b530 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45  Where = sqlite3E
1b540 78 70 72 41 6e 64 28 64 62 2c 20 70 50 61 72 65  xprAnd(db, pPare
1b550 6e 74 2d 3e 70 57 68 65 72 65 2c 20 70 57 68 65  nt->pWhere, pWhe
1b560 72 65 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20  re);.    }.  .  
1b570 20 20 2f 2a 20 54 68 65 20 66 6c 61 74 74 65 6e    /* The flatten
1b580 65 64 20 71 75 65 72 79 20 69 73 20 64 69 73 74  ed query is dist
1b590 69 6e 63 74 20 69 66 20 65 69 74 68 65 72 20 74  inct if either t
1b5a0 68 65 20 69 6e 6e 65 72 20 6f 72 20 74 68 65 0a  he inner or the.
1b5b0 20 20 20 20 2a 2a 20 6f 75 74 65 72 20 71 75 65      ** outer que
1b5c0 72 79 20 69 73 20 64 69 73 74 69 6e 63 74 2e 20  ry is distinct. 
1b5d0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 72  .    */.    pPar
1b5e0 65 6e 74 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d  ent->selFlags |=
1b5f0 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20   pSub->selFlags 
1b600 26 20 53 46 5f 44 69 73 74 69 6e 63 74 3b 0a 20  & SF_Distinct;. 
1b610 20 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20   .    /*.    ** 
1b620 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20  SELECT ... FROM 
1b630 28 53 45 4c 45 43 54 20 2e 2e 2e 20 4c 49 4d 49  (SELECT ... LIMI
1b640 54 20 61 20 4f 46 46 53 45 54 20 62 29 20 4c 49  T a OFFSET b) LI
1b650 4d 49 54 20 78 20 4f 46 46 53 45 54 20 79 3b 0a  MIT x OFFSET y;.
1b660 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f 6e      **.    ** On
1b670 65 20 69 73 20 74 65 6d 70 74 65 64 20 74 6f 20  e is tempted to 
1b680 74 72 79 20 74 6f 20 61 64 64 20 61 20 61 6e 64  try to add a and
1b690 20 62 20 74 6f 20 63 6f 6d 62 69 6e 65 20 74 68   b to combine th
1b6a0 65 20 6c 69 6d 69 74 73 2e 20 20 42 75 74 20 74  e limits.  But t
1b6b0 68 69 73 0a 20 20 20 20 2a 2a 20 64 6f 65 73 20  his.    ** does 
1b6c0 6e 6f 74 20 77 6f 72 6b 20 69 66 20 65 69 74 68  not work if eith
1b6d0 65 72 20 6c 69 6d 69 74 20 69 73 20 6e 65 67 61  er limit is nega
1b6e0 74 69 76 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tive..    */.   
1b6f0 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69   if( pSub->pLimi
1b700 74 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 65  t ){.      pPare
1b710 6e 74 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 53 75  nt->pLimit = pSu
1b720 62 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20  b->pLimit;.     
1b730 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 3d 20   pSub->pLimit = 
1b740 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  0;.    }.  }..  
1b750 2f 2a 20 46 69 6e 69 61 6c 6c 79 2c 20 64 65 6c  /* Finially, del
1b760 65 74 65 20 77 68 61 74 20 69 73 20 6c 65 66 74  ete what is left
1b770 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79   of the subquery
1b780 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20 2a 2a   and return.  **
1b790 20 73 75 63 63 65 73 73 2e 0a 20 20 2a 2f 0a 20   success..  */. 
1b7a0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
1b7b0 6c 65 74 65 28 64 62 2c 20 70 53 75 62 31 29 3b  lete(db, pSub1);
1b7c0 0a 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  ..  return 1;.}.
1b7d0 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e  #endif /* !defin
1b7e0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
1b7f0 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66  UBQUERY) || !def
1b800 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
1b810 5f 56 49 45 57 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _VIEW) */../*.**
1b820 20 42 61 73 65 64 20 6f 6e 20 74 68 65 20 63 6f   Based on the co
1b830 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 41 67  ntents of the Ag
1b840 67 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  gInfo structure 
1b850 69 6e 64 69 63 61 74 65 64 20 62 79 20 74 68 65  indicated by the
1b860 20 66 69 72 73 74 0a 2a 2a 20 61 72 67 75 6d 65   first.** argume
1b870 6e 74 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  nt, this functio
1b880 6e 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 20  n checks if the 
1b890 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72  following are tr
1b8a0 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 74  ue:.**.**    * t
1b8b0 68 65 20 71 75 65 72 79 20 63 6f 6e 74 61 69 6e  he query contain
1b8c0 73 20 6a 75 73 74 20 61 20 73 69 6e 67 6c 65 20  s just a single 
1b8d0 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
1b8e0 6f 6e 2c 0a 2a 2a 20 20 20 20 2a 20 74 68 65 20  on,.**    * the 
1b8f0 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
1b900 6f 6e 20 69 73 20 65 69 74 68 65 72 20 6d 69 6e  on is either min
1b910 28 29 20 6f 72 20 6d 61 78 28 29 2c 20 61 6e 64  () or max(), and
1b920 0a 2a 2a 20 20 20 20 2a 20 74 68 65 20 61 72 67  .**    * the arg
1b930 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 61 67 67  ument to the agg
1b940 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20  regate function 
1b950 69 73 20 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75  is a column valu
1b960 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6c 6c 20  e..**.** If all 
1b970 6f 66 20 74 68 65 20 61 62 6f 76 65 20 61 72 65  of the above are
1b980 20 74 72 75 65 2c 20 74 68 65 6e 20 57 48 45 52   true, then WHER
1b990 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 20 6f 72  E_ORDERBY_MIN or
1b9a0 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d   WHERE_ORDERBY_M
1b9b0 41 58 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65  AX.** is returne
1b9c0 64 20 61 73 20 61 70 70 72 6f 70 72 69 61 74 65  d as appropriate
1b9d0 2e 20 41 6c 73 6f 2c 20 2a 70 70 4d 69 6e 4d 61  . Also, *ppMinMa
1b9e0 78 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e  x is set to poin
1b9f0 74 20 74 6f 20 74 68 65 20 0a 2a 2a 20 6c 69 73  t to the .** lis
1ba00 74 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 70  t of arguments p
1ba10 61 73 73 65 64 20 74 6f 20 74 68 65 20 61 67 67  assed to the agg
1ba20 72 65 67 61 74 65 20 62 65 66 6f 72 65 20 72 65  regate before re
1ba30 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 4f  turning..**.** O
1ba40 72 2c 20 69 66 20 74 68 65 20 63 6f 6e 64 69 74  r, if the condit
1ba50 69 6f 6e 73 20 61 62 6f 76 65 20 61 72 65 20 6e  ions above are n
1ba60 6f 74 20 6d 65 74 2c 20 2a 70 70 4d 69 6e 4d 61  ot met, *ppMinMa
1ba70 78 20 69 73 20 73 65 74 20 74 6f 20 30 20 61 6e  x is set to 0 an
1ba80 64 0a 2a 2a 20 57 48 45 52 45 5f 4f 52 44 45 52  d.** WHERE_ORDER
1ba90 42 59 5f 4e 4f 52 4d 41 4c 20 69 73 20 72 65 74  BY_NORMAL is ret
1baa0 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
1bab0 20 75 38 20 6d 69 6e 4d 61 78 51 75 65 72 79 28   u8 minMaxQuery(
1bac0 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66  AggInfo *pAggInf
1bad0 6f 2c 20 45 78 70 72 4c 69 73 74 20 2a 2a 70 70  o, ExprList **pp
1bae0 4d 69 6e 4d 61 78 29 7b 0a 20 20 69 6e 74 20 65  MinMax){.  int e
1baf0 52 65 74 20 3d 20 57 48 45 52 45 5f 4f 52 44 45  Ret = WHERE_ORDE
1bb00 52 42 59 5f 4e 4f 52 4d 41 4c 3b 20 20 20 20 20  RBY_NORMAL;     
1bb10 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 76       /* Return v
1bb20 61 6c 75 65 20 2a 2f 0a 0a 20 20 2a 70 70 4d 69  alue */..  *ppMi
1bb30 6e 4d 61 78 20 3d 20 30 3b 0a 20 20 69 66 28 20  nMax = 0;.  if( 
1bb40 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3d  pAggInfo->nFunc=
1bb50 3d 31 20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  =1 ){.    Expr *
1bb60 70 45 78 70 72 20 3d 20 70 41 67 67 49 6e 66 6f  pExpr = pAggInfo
1bb70 2d 3e 61 46 75 6e 63 5b 30 5d 2e 70 45 78 70 72  ->aFunc[0].pExpr
1bb80 3b 20 2f 2a 20 41 67 67 72 65 67 61 74 65 20 66  ; /* Aggregate f
1bb90 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 45  unction */.    E
1bba0 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20  xprList *pEList 
1bbb0 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  = pExpr->x.pList
1bbc0 3b 20 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65  ;      /* Argume
1bbd0 6e 74 73 20 74 6f 20 61 67 67 20 66 75 6e 63 74  nts to agg funct
1bbe0 69 6f 6e 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65  ion */..    asse
1bbf0 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  rt( pExpr->op==T
1bc00 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29  K_AGG_FUNCTION )
1bc10 3b 0a 20 20 20 20 69 66 28 20 70 45 4c 69 73 74  ;.    if( pEList
1bc20 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70   && pEList->nExp
1bc30 72 3d 3d 31 20 26 26 20 70 45 4c 69 73 74 2d 3e  r==1 && pEList->
1bc40 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 3d 3d  a[0].pExpr->op==
1bc50 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 7b  TK_AGG_COLUMN ){
1bc60 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
1bc70 72 20 2a 7a 46 75 6e 63 20 3d 20 70 45 78 70 72  r *zFunc = pExpr
1bc80 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20  ->u.zToken;.    
1bc90 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
1bca0 49 43 6d 70 28 7a 46 75 6e 63 2c 20 22 6d 69 6e  ICmp(zFunc, "min
1bcb0 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
1bcc0 20 65 52 65 74 20 3d 20 57 48 45 52 45 5f 4f 52   eRet = WHERE_OR
1bcd0 44 45 52 42 59 5f 4d 49 4e 3b 0a 20 20 20 20 20  DERBY_MIN;.     
1bce0 20 20 20 2a 70 70 4d 69 6e 4d 61 78 20 3d 20 70     *ppMinMax = p
1bcf0 45 4c 69 73 74 3b 0a 20 20 20 20 20 20 7d 65 6c  EList;.      }el
1bd00 73 65 20 69 66 28 20 73 71 6c 69 74 65 33 53 74  se if( sqlite3St
1bd10 72 49 43 6d 70 28 7a 46 75 6e 63 2c 20 22 6d 61  rICmp(zFunc, "ma
1bd20 78 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  x")==0 ){.      
1bd30 20 20 65 52 65 74 20 3d 20 57 48 45 52 45 5f 4f    eRet = WHERE_O
1bd40 52 44 45 52 42 59 5f 4d 41 58 3b 0a 20 20 20 20  RDERBY_MAX;.    
1bd50 20 20 20 20 2a 70 70 4d 69 6e 4d 61 78 20 3d 20      *ppMinMax = 
1bd60 70 45 4c 69 73 74 3b 0a 20 20 20 20 20 20 7d 0a  pEList;.      }.
1bd70 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73      }.  }..  ass
1bd80 65 72 74 28 20 2a 70 70 4d 69 6e 4d 61 78 3d 3d  ert( *ppMinMax==
1bd90 30 20 7c 7c 20 28 2a 70 70 4d 69 6e 4d 61 78 29  0 || (*ppMinMax)
1bda0 2d 3e 6e 45 78 70 72 3d 3d 31 20 29 3b 0a 20 20  ->nExpr==1 );.  
1bdb0 72 65 74 75 72 6e 20 65 52 65 74 3b 0a 7d 0a 0a  return eRet;.}..
1bdc0 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 6c 65 63 74  /*.** The select
1bdd0 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73 73 65   statement passe
1bde0 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61  d as the first a
1bdf0 72 67 75 6d 65 6e 74 20 69 73 20 61 6e 20 61 67  rgument is an ag
1be00 67 72 65 67 61 74 65 20 71 75 65 72 79 2e 0a 2a  gregate query..*
1be10 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67  * The second arg
1be20 6d 65 6e 74 20 69 73 20 74 68 65 20 61 73 73 6f  ment is the asso
1be30 63 69 61 74 65 64 20 61 67 67 72 65 67 61 74 65  ciated aggregate
1be40 2d 69 6e 66 6f 20 6f 62 6a 65 63 74 2e 20 54 68  -info object. Th
1be50 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  is .** function 
1be60 74 65 73 74 73 20 69 66 20 74 68 65 20 53 45 4c  tests if the SEL
1be70 45 43 54 20 69 73 20 6f 66 20 74 68 65 20 66 6f  ECT is of the fo
1be80 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45  rm:.**.**   SELE
1be90 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  CT count(*) FROM
1bea0 20 3c 74 62 6c 3e 0a 2a 2a 0a 2a 2a 20 77 68 65   <tbl>.**.** whe
1beb0 72 65 20 74 61 62 6c 65 20 69 73 20 61 20 64 61  re table is a da
1bec0 74 61 62 61 73 65 20 74 61 62 6c 65 2c 20 6e 6f  tabase table, no
1bed0 74 20 61 20 73 75 62 2d 73 65 6c 65 63 74 20 6f  t a sub-select o
1bee0 72 20 76 69 65 77 2e 20 49 66 20 74 68 65 20 71  r view. If the q
1bef0 75 65 72 79 0a 2a 2a 20 64 6f 65 73 20 6d 61 74  uery.** does mat
1bf00 63 68 20 74 68 69 73 20 70 61 74 74 65 72 6e 2c  ch this pattern,
1bf10 20 74 68 65 6e 20 61 20 70 6f 69 6e 74 65 72 20   then a pointer 
1bf20 74 6f 20 74 68 65 20 54 61 62 6c 65 20 6f 62 6a  to the Table obj
1bf30 65 63 74 20 72 65 70 72 65 73 65 6e 74 69 6e 67  ect representing
1bf40 0a 2a 2a 20 3c 74 62 6c 3e 20 69 73 20 72 65 74  .** <tbl> is ret
1bf50 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
1bf60 2c 20 30 20 69 73 20 72 65 74 75 72 6e 65 64 2e  , 0 is returned.
1bf70 0a 2a 2f 0a 73 74 61 74 69 63 20 54 61 62 6c 65  .*/.static Table
1bf80 20 2a 69 73 53 69 6d 70 6c 65 43 6f 75 6e 74 28   *isSimpleCount(
1bf90 53 65 6c 65 63 74 20 2a 70 2c 20 41 67 67 49 6e  Select *p, AggIn
1bfa0 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20  fo *pAggInfo){. 
1bfb0 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
1bfc0 45 78 70 72 20 2a 70 45 78 70 72 3b 0a 0a 20 20  Expr *pExpr;..  
1bfd0 61 73 73 65 72 74 28 20 21 70 2d 3e 70 47 72 6f  assert( !p->pGro
1bfe0 75 70 42 79 20 29 3b 0a 0a 20 20 69 66 28 20 70  upBy );..  if( p
1bff0 2d 3e 70 57 68 65 72 65 20 7c 7c 20 70 2d 3e 70  ->pWhere || p->p
1c000 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20  EList->nExpr!=1 
1c010 0a 20 20 20 7c 7c 20 70 2d 3e 70 53 72 63 2d 3e  .   || p->pSrc->
1c020 6e 53 72 63 21 3d 31 20 7c 7c 20 70 2d 3e 70 53  nSrc!=1 || p->pS
1c030 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74  rc->a[0].pSelect
1c040 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  .  ){.    return
1c050 20 30 3b 0a 20 20 7d 0a 20 20 70 54 61 62 20 3d   0;.  }.  pTab =
1c060 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70   p->pSrc->a[0].p
1c070 54 61 62 3b 0a 20 20 70 45 78 70 72 20 3d 20 70  Tab;.  pExpr = p
1c080 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  ->pEList->a[0].p
1c090 45 78 70 72 3b 0a 20 20 61 73 73 65 72 74 28 20  Expr;.  assert( 
1c0a0 70 54 61 62 20 26 26 20 21 70 54 61 62 2d 3e 70  pTab && !pTab->p
1c0b0 53 65 6c 65 63 74 20 26 26 20 70 45 78 70 72 20  Select && pExpr 
1c0c0 29 3b 0a 0a 20 20 69 66 28 20 49 73 56 69 72 74  );..  if( IsVirt
1c0d0 75 61 6c 28 70 54 61 62 29 20 29 20 72 65 74 75  ual(pTab) ) retu
1c0e0 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 45 78 70  rn 0;.  if( pExp
1c0f0 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 46 55  r->op!=TK_AGG_FU
1c100 4e 43 54 49 4f 4e 20 29 20 72 65 74 75 72 6e 20  NCTION ) return 
1c110 30 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70  0;.  if( NEVER(p
1c120 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3d 3d  AggInfo->nFunc==
1c130 30 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  0) ) return 0;. 
1c140 20 69 66 28 20 28 70 41 67 67 49 6e 66 6f 2d 3e   if( (pAggInfo->
1c150 61 46 75 6e 63 5b 30 5d 2e 70 46 75 6e 63 2d 3e  aFunc[0].pFunc->
1c160 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 46 55 4e  flags&SQLITE_FUN
1c170 43 5f 43 4f 55 4e 54 29 3d 3d 30 20 29 20 72 65  C_COUNT)==0 ) re
1c180 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 45  turn 0;.  if( pE
1c190 78 70 72 2d 3e 66 6c 61 67 73 26 45 50 5f 44 69  xpr->flags&EP_Di
1c1a0 73 74 69 6e 63 74 20 29 20 72 65 74 75 72 6e 20  stinct ) return 
1c1b0 30 3b 0a 0a 20 20 72 65 74 75 72 6e 20 70 54 61  0;..  return pTa
1c1c0 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  b;.}../*.** If t
1c1d0 68 65 20 73 6f 75 72 63 65 2d 6c 69 73 74 20 69  he source-list i
1c1e0 74 65 6d 20 70 61 73 73 65 64 20 61 73 20 61 6e  tem passed as an
1c1f0 20 61 72 67 75 6d 65 6e 74 20 77 61 73 20 61 75   argument was au
1c200 67 6d 65 6e 74 65 64 20 77 69 74 68 20 61 6e 0a  gmented with an.
1c210 2a 2a 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c  ** INDEXED BY cl
1c220 61 75 73 65 2c 20 74 68 65 6e 20 74 72 79 20 74  ause, then try t
1c230 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 73 70 65  o locate the spe
1c240 63 69 66 69 65 64 20 69 6e 64 65 78 2e 20 49 66  cified index. If
1c250 20 74 68 65 72 65 0a 2a 2a 20 77 61 73 20 73 75   there.** was su
1c260 63 68 20 61 20 63 6c 61 75 73 65 20 61 6e 64 20  ch a clause and 
1c270 74 68 65 20 6e 61 6d 65 64 20 69 6e 64 65 78 20  the named index 
1c280 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2c  cannot be found,
1c290 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49   return .** SQLI
1c2a0 54 45 5f 45 52 52 4f 52 20 61 6e 64 20 6c 65 61  TE_ERROR and lea
1c2b0 76 65 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 70  ve an error in p
1c2c0 50 61 72 73 65 2e 20 4f 74 68 65 72 77 69 73 65  Parse. Otherwise
1c2d0 2c 20 70 6f 70 75 6c 61 74 65 20 0a 2a 2a 20 70  , populate .** p
1c2e0 46 72 6f 6d 2d 3e 70 49 6e 64 65 78 20 61 6e 64  From->pIndex and
1c2f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1c300 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  K..*/.int sqlite
1c310 33 49 6e 64 65 78 65 64 42 79 4c 6f 6f 6b 75 70  3IndexedByLookup
1c320 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1c330 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
1c340 74 65 6d 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 69  tem *pFrom){.  i
1c350 66 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 26  f( pFrom->pTab &
1c360 26 20 70 46 72 6f 6d 2d 3e 7a 49 6e 64 65 78 20  & pFrom->zIndex 
1c370 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  ){.    Table *pT
1c380 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62  ab = pFrom->pTab
1c390 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 49 6e 64  ;.    char *zInd
1c3a0 65 78 20 3d 20 70 46 72 6f 6d 2d 3e 7a 49 6e 64  ex = pFrom->zInd
1c3b0 65 78 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70  ex;.    Index *p
1c3c0 49 64 78 3b 0a 20 20 20 20 66 6f 72 28 70 49 64  Idx;.    for(pId
1c3d0 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20  x=pTab->pIndex; 
1c3e0 0a 20 20 20 20 20 20 20 20 70 49 64 78 20 26 26  .        pIdx &&
1c3f0 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
1c400 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 49 6e  pIdx->zName, zIn
1c410 64 65 78 29 3b 20 0a 20 20 20 20 20 20 20 20 70  dex); .        p
1c420 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 0a  Idx=pIdx->pNext.
1c430 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 21      );.    if( !
1c440 70 49 64 78 20 29 7b 0a 20 20 20 20 20 20 73 71  pIdx ){.      sq
1c450 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
1c460 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 69  arse, "no such i
1c470 6e 64 65 78 3a 20 25 73 22 2c 20 7a 49 6e 64 65  ndex: %s", zInde
1c480 78 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61  x, 0);.      pPa
1c490 72 73 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61  rse->checkSchema
1c4a0 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 65 74 75   = 1;.      retu
1c4b0 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
1c4c0 0a 20 20 20 20 7d 0a 20 20 20 20 70 46 72 6f 6d  .    }.    pFrom
1c4d0 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49 64 78 3b  ->pIndex = pIdx;
1c4e0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
1c4f0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
1c500 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
1c510 73 20 61 20 57 61 6c 6b 65 72 20 63 61 6c 6c 62  s a Walker callb
1c520 61 63 6b 20 66 6f 72 20 22 65 78 70 61 6e 64 69  ack for "expandi
1c530 6e 67 22 20 61 20 53 45 4c 45 43 54 20 73 74 61  ng" a SELECT sta
1c540 74 65 6d 65 6e 74 2e 0a 2a 2a 20 22 45 78 70 61  tement..** "Expa
1c550 6e 64 69 6e 67 22 20 6d 65 61 6e 73 20 74 6f 20  nding" means to 
1c560 64 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  do the following
1c570 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20  :.**.**    (1)  
1c580 4d 61 6b 65 20 73 75 72 65 20 56 44 42 45 20 63  Make sure VDBE c
1c590 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 68 61  ursor numbers ha
1c5a0 76 65 20 62 65 65 6e 20 61 73 73 69 67 6e 65 64  ve been assigned
1c5b0 20 74 6f 20 65 76 65 72 79 0a 2a 2a 20 20 20 20   to every.**    
1c5c0 20 20 20 20 20 65 6c 65 6d 65 6e 74 20 6f 66 20       element of 
1c5d0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e  the FROM clause.
1c5e0 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20 46  .**.**    (2)  F
1c5f0 69 6c 6c 20 69 6e 20 74 68 65 20 70 54 61 62 4c  ill in the pTabL
1c600 69 73 74 2d 3e 61 5b 5d 2e 70 54 61 62 20 66 69  ist->a[].pTab fi
1c610 65 6c 64 73 20 69 6e 20 74 68 65 20 53 72 63 4c  elds in the SrcL
1c620 69 73 74 20 74 68 61 74 20 0a 2a 2a 20 20 20 20  ist that .**    
1c630 20 20 20 20 20 64 65 66 69 6e 65 73 20 46 52 4f       defines FRO
1c640 4d 20 63 6c 61 75 73 65 2e 20 20 57 68 65 6e 20  M clause.  When 
1c650 76 69 65 77 73 20 61 70 70 65 61 72 20 69 6e 20  views appear in 
1c660 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c  the FROM clause,
1c670 0a 2a 2a 20 20 20 20 20 20 20 20 20 66 69 6c 6c  .**         fill
1c680 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70   pTabList->a[].p
1c690 53 65 6c 65 63 74 20 77 69 74 68 20 61 20 63 6f  Select with a co
1c6a0 70 79 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  py of the SELECT
1c6b0 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20 20   statement.**   
1c6c0 20 20 20 20 20 20 74 68 61 74 20 69 6d 70 6c 65        that imple
1c6d0 6d 65 6e 74 73 20 74 68 65 20 76 69 65 77 2e 20  ments the view. 
1c6e0 20 41 20 63 6f 70 79 20 69 73 20 6d 61 64 65 20   A copy is made 
1c6f0 6f 66 20 74 68 65 20 76 69 65 77 27 73 20 53 45  of the view's SE
1c700 4c 45 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 20  LECT.**         
1c710 73 74 61 74 65 6d 65 6e 74 20 73 6f 20 74 68 61  statement so tha
1c720 74 20 77 65 20 63 61 6e 20 66 72 65 65 6c 79 20  t we can freely 
1c730 6d 6f 64 69 66 79 20 6f 72 20 64 65 6c 65 74 65  modify or delete
1c740 20 74 68 61 74 20 73 74 61 74 65 6d 65 6e 74 0a   that statement.
1c750 2a 2a 20 20 20 20 20 20 20 20 20 77 69 74 68 6f  **         witho
1c760 75 74 20 77 6f 72 72 79 69 6e 67 20 61 62 6f 75  ut worrying abou
1c770 74 20 6d 65 73 73 69 6e 67 20 75 70 20 74 68 65  t messing up the
1c780 20 70 72 65 73 69 73 74 65 6e 74 20 72 65 70 72   presistent repr
1c790 65 73 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 20 20  esentation.**   
1c7a0 20 20 20 20 20 20 6f 66 20 74 68 65 20 76 69 65        of the vie
1c7b0 77 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 33 29 20  w..**.**    (3) 
1c7c0 20 41 64 64 20 74 65 72 6d 73 20 74 6f 20 74 68   Add terms to th
1c7d0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
1c7e0 6f 20 61 63 63 6f 6d 6f 64 61 74 65 20 74 68 65  o accomodate the
1c7f0 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64   NATURAL keyword
1c800 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f 6e 20 6a  .**         on j
1c810 6f 69 6e 73 20 61 6e 64 20 74 68 65 20 4f 4e 20  oins and the ON 
1c820 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65  and USING clause
1c830 20 6f 66 20 6a 6f 69 6e 73 2e 0a 2a 2a 0a 2a 2a   of joins..**.**
1c840 20 20 20 20 28 34 29 20 20 53 63 61 6e 20 74 68      (4)  Scan th
1c850 65 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e  e list of column
1c860 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  s in the result 
1c870 73 65 74 20 28 70 45 4c 69 73 74 29 20 6c 6f 6f  set (pEList) loo
1c880 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20  king.**         
1c890 66 6f 72 20 69 6e 73 74 61 6e 63 65 73 20 6f 66  for instances of
1c8a0 20 74 68 65 20 22 2a 22 20 6f 70 65 72 61 74 6f   the "*" operato
1c8b0 72 20 6f 72 20 74 68 65 20 54 41 42 4c 45 2e 2a  r or the TABLE.*
1c8c0 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 20 20 20   operator..**   
1c8d0 20 20 20 20 20 20 49 66 20 66 6f 75 6e 64 2c 20        If found, 
1c8e0 65 78 70 61 6e 64 20 65 61 63 68 20 22 2a 22 20  expand each "*" 
1c8f0 74 6f 20 62 65 20 65 76 65 72 79 20 63 6f 6c 75  to be every colu
1c900 6d 6e 20 69 6e 20 65 76 65 72 79 20 74 61 62 6c  mn in every tabl
1c910 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 61 6e 64  e.**         and
1c920 20 54 41 42 4c 45 2e 2a 20 74 6f 20 62 65 20 65   TABLE.* to be e
1c930 76 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 54  very column in T
1c940 41 42 4c 45 2e 0a 2a 2a 0a 2a 2f 0a 73 74 61 74  ABLE..**.*/.stat
1c950 69 63 20 69 6e 74 20 73 65 6c 65 63 74 45 78 70  ic int selectExp
1c960 61 6e 64 65 72 28 57 61 6c 6b 65 72 20 2a 70 57  ander(Walker *pW
1c970 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70  alker, Select *p
1c980 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  ){.  Parse *pPar
1c990 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50  se = pWalker->pP
1c9a0 61 72 73 65 3b 0a 20 20 69 6e 74 20 69 2c 20 6a  arse;.  int i, j
1c9b0 2c 20 6b 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a  , k;.  SrcList *
1c9c0 70 54 61 62 4c 69 73 74 3b 0a 20 20 45 78 70 72  pTabList;.  Expr
1c9d0 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20  List *pEList;.  
1c9e0 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
1c9f0 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a 20 20 73 71  tem *pFrom;.  sq
1ca00 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
1ca10 73 65 2d 3e 64 62 3b 0a 20 20 45 78 70 72 20 2a  se->db;.  Expr *
1ca20 70 45 2c 20 2a 70 52 69 67 68 74 2c 20 2a 70 45  pE, *pRight, *pE
1ca30 78 70 72 3b 0a 20 20 75 31 36 20 73 65 6c 46 6c  xpr;.  u16 selFl
1ca40 61 67 73 20 3d 20 70 2d 3e 73 65 6c 46 6c 61 67  ags = p->selFlag
1ca50 73 3b 0a 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67  s;..  p->selFlag
1ca60 73 20 7c 3d 20 53 46 5f 45 78 70 61 6e 64 65 64  s |= SF_Expanded
1ca70 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
1ca80 6f 63 46 61 69 6c 65 64 20 20 29 7b 0a 20 20 20  ocFailed  ){.   
1ca90 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
1caa0 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 4e 45 56  t;.  }.  if( NEV
1cab0 45 52 28 70 2d 3e 70 53 72 63 3d 3d 30 29 20 7c  ER(p->pSrc==0) |
1cac0 7c 20 28 73 65 6c 46 6c 61 67 73 20 26 20 53 46  | (selFlags & SF
1cad0 5f 45 78 70 61 6e 64 65 64 29 21 3d 30 20 29 7b  _Expanded)!=0 ){
1cae0 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f  .    return WRC_
1caf0 50 72 75 6e 65 3b 0a 20 20 7d 0a 20 20 70 54 61  Prune;.  }.  pTa
1cb00 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b  bList = p->pSrc;
1cb10 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70  .  pEList = p->p
1cb20 45 4c 69 73 74 3b 0a 0a 20 20 2f 2a 20 4d 61 6b  EList;..  /* Mak
1cb30 65 20 73 75 72 65 20 63 75 72 73 6f 72 20 6e 75  e sure cursor nu
1cb40 6d 62 65 72 73 20 68 61 76 65 20 62 65 65 6e 20  mbers have been 
1cb50 61 73 73 69 67 6e 65 64 20 74 6f 20 61 6c 6c 20  assigned to all 
1cb60 65 6e 74 72 69 65 73 20 69 6e 0a 20 20 2a 2a 20  entries in.  ** 
1cb70 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
1cb80 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  of the SELECT st
1cb90 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20  atement..  */.  
1cba0 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73  sqlite3SrcListAs
1cbb0 73 69 67 6e 43 75 72 73 6f 72 73 28 70 50 61 72  signCursors(pPar
1cbc0 73 65 2c 20 70 54 61 62 4c 69 73 74 29 3b 0a 0a  se, pTabList);..
1cbd0 20 20 2f 2a 20 4c 6f 6f 6b 20 75 70 20 65 76 65    /* Look up eve
1cbe0 72 79 20 74 61 62 6c 65 20 6e 61 6d 65 64 20 69  ry table named i
1cbf0 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
1cc00 65 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2e  e of the select.
1cc10 20 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65 6e 74    If.  ** an ent
1cc20 72 79 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63  ry of the FROM c
1cc30 6c 61 75 73 65 20 69 73 20 61 20 73 75 62 71 75  lause is a subqu
1cc40 65 72 79 20 69 6e 73 74 65 61 64 20 6f 66 20 61  ery instead of a
1cc50 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 2c 0a   table or view,.
1cc60 20 20 2a 2a 20 74 68 65 6e 20 63 72 65 61 74 65    ** then create
1cc70 20 61 20 74 72 61 6e 73 69 65 6e 74 20 74 61 62   a transient tab
1cc80 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 6f 20  le structure to 
1cc90 64 65 73 63 72 69 62 65 20 74 68 65 20 73 75 62  describe the sub
1cca0 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f  query..  */.  fo
1ccb0 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61  r(i=0, pFrom=pTa
1ccc0 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62  bList->a; i<pTab
1ccd0 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c  List->nSrc; i++,
1cce0 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 54   pFrom++){.    T
1ccf0 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20  able *pTab;.    
1cd00 69 66 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 21  if( pFrom->pTab!
1cd10 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  =0 ){.      /* T
1cd20 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 68 61  his statement ha
1cd30 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 70  s already been p
1cd40 72 65 70 61 72 65 64 2e 20 20 54 68 65 72 65 20  repared.  There 
1cd50 69 73 20 6e 6f 20 6e 65 65 64 0a 20 20 20 20 20  is no need.     
1cd60 20 2a 2a 20 74 6f 20 67 6f 20 66 75 72 74 68 65   ** to go furthe
1cd70 72 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  r. */.      asse
1cd80 72 74 28 20 69 3d 3d 30 20 29 3b 0a 20 20 20 20  rt( i==0 );.    
1cd90 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75    return WRC_Pru
1cda0 6e 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ne;.    }.    if
1cdb0 28 20 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 3d 3d  ( pFrom->zName==
1cdc0 30 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  0 ){.#ifndef SQL
1cdd0 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
1cde0 59 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a  Y.      Select *
1cdf0 70 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53  pSel = pFrom->pS
1ce00 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 2f 2a 20  elect;.      /* 
1ce10 41 20 73 75 62 2d 71 75 65 72 79 20 69 6e 20 74  A sub-query in t
1ce20 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
1ce30 66 20 61 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20  f a SELECT */.  
1ce40 20 20 20 20 61 73 73 65 72 74 28 20 70 53 65 6c      assert( pSel
1ce50 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73  !=0 );.      ass
1ce60 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62  ert( pFrom->pTab
1ce70 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ==0 );.      sql
1ce80 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70  ite3WalkSelect(p
1ce90 57 61 6c 6b 65 72 2c 20 70 53 65 6c 29 3b 0a 20  Walker, pSel);. 
1cea0 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62       pFrom->pTab
1ceb0 20 3d 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65   = pTab = sqlite
1cec0 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
1ced0 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 29  , sizeof(Table))
1cee0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62  ;.      if( pTab
1cef0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43  ==0 ) return WRC
1cf00 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 70 54  _Abort;.      pT
1cf10 61 62 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20  ab->nRef = 1;.  
1cf20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20      pTab->zName 
1cf30 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
1cf40 28 64 62 2c 20 22 73 71 6c 69 74 65 5f 73 75 62  (db, "sqlite_sub
1cf50 71 75 65 72 79 5f 25 70 5f 22 2c 20 28 76 6f 69  query_%p_", (voi
1cf60 64 2a 29 70 54 61 62 29 3b 0a 20 20 20 20 20 20  d*)pTab);.      
1cf70 77 68 69 6c 65 28 20 70 53 65 6c 2d 3e 70 50 72  while( pSel->pPr
1cf80 69 6f 72 20 29 7b 20 70 53 65 6c 20 3d 20 70 53  ior ){ pSel = pS
1cf90 65 6c 2d 3e 70 50 72 69 6f 72 3b 20 7d 0a 20 20  el->pPrior; }.  
1cfa0 20 20 20 20 73 65 6c 65 63 74 43 6f 6c 75 6d 6e      selectColumn
1cfb0 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50  sFromExprList(pP
1cfc0 61 72 73 65 2c 20 70 53 65 6c 2d 3e 70 45 4c 69  arse, pSel->pELi
1cfd0 73 74 2c 20 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c  st, &pTab->nCol,
1cfe0 20 26 70 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20   &pTab->aCol);. 
1cff0 20 20 20 20 20 70 54 61 62 2d 3e 69 50 4b 65 79       pTab->iPKey
1d000 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 70 54 61   = -1;.      pTa
1d010 62 2d 3e 6e 52 6f 77 45 73 74 20 3d 20 31 30 30  b->nRowEst = 100
1d020 30 30 30 30 3b 0a 20 20 20 20 20 20 70 54 61 62  0000;.      pTab
1d030 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46  ->tabFlags |= TF
1d040 5f 45 70 68 65 6d 65 72 61 6c 3b 0a 23 65 6e 64  _Ephemeral;.#end
1d050 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  if.    }else{.  
1d060 20 20 20 20 2f 2a 20 41 6e 20 6f 72 64 69 6e 61      /* An ordina
1d070 72 79 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77  ry table or view
1d080 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 46 52 4f   name in the FRO
1d090 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20  M clause */.    
1d0a0 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d    assert( pFrom-
1d0b0 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20  >pTab==0 );.    
1d0c0 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20    pFrom->pTab = 
1d0d0 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f  pTab = sqlite3Lo
1d0e0 63 61 74 65 54 61 62 6c 65 49 74 65 6d 28 70 50  cateTableItem(pP
1d0f0 61 72 73 65 2c 20 30 2c 20 70 46 72 6f 6d 29 3b  arse, 0, pFrom);
1d100 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62 3d  .      if( pTab=
1d110 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f  =0 ) return WRC_
1d120 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 69 66 28  Abort;.      if(
1d130 20 70 54 61 62 2d 3e 6e 52 65 66 3d 3d 30 78 66   pTab->nRef==0xf
1d140 66 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20 73  fff ){.        s
1d150 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
1d160 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79  Parse, "too many
1d170 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 5c   references to \
1d180 22 25 73 5c 22 3a 20 6d 61 78 20 36 35 35 33 35  "%s\": max 65535
1d190 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 54  ",.           pT
1d1a0 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
1d1b0 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20      pFrom->pTab 
1d1c0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74  = 0;.        ret
1d1d0 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
1d1e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 54 61       }.      pTa
1d1f0 62 2d 3e 6e 52 65 66 2b 2b 3b 0a 23 69 66 20 21  b->nRef++;.#if !
1d200 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
1d210 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65  MIT_VIEW) || !de
1d220 66 69 6e 65 64 20 28 53 51 4c 49 54 45 5f 4f 4d  fined (SQLITE_OM
1d230 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  IT_VIRTUALTABLE)
1d240 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62 2d  .      if( pTab-
1d250 3e 70 53 65 6c 65 63 74 20 7c 7c 20 49 73 56 69  >pSelect || IsVi
1d260 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20  rtual(pTab) ){. 
1d270 20 20 20 20 20 20 20 2f 2a 20 57 65 20 72 65 61         /* We rea
1d280 63 68 20 68 65 72 65 20 69 66 20 74 68 65 20 6e  ch here if the n
1d290 61 6d 65 64 20 74 61 62 6c 65 20 69 73 20 61 20  amed table is a 
1d2a0 72 65 61 6c 6c 79 20 61 20 76 69 65 77 20 2a 2f  really a view */
1d2b0 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
1d2c0 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d  ite3ViewGetColum
1d2d0 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70  nNames(pParse, p
1d2e0 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 57 52  Tab) ) return WR
1d2f0 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 20  C_Abort;.       
1d300 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e   assert( pFrom->
1d310 70 53 65 6c 65 63 74 3d 3d 30 20 29 3b 0a 20 20  pSelect==0 );.  
1d320 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 53 65        pFrom->pSe
1d330 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65  lect = sqlite3Se
1d340 6c 65 63 74 44 75 70 28 64 62 2c 20 70 54 61 62  lectDup(db, pTab
1d350 2d 3e 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20  ->pSelect, 0);. 
1d360 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 61         sqlite3Wa
1d370 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72  lkSelect(pWalker
1d380 2c 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74  , pFrom->pSelect
1d390 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
1d3a0 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  f.    }..    /* 
1d3b0 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 64 65 78  Locate the index
1d3c0 20 6e 61 6d 65 64 20 62 79 20 74 68 65 20 49 4e   named by the IN
1d3d0 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 2c  DEXED BY clause,
1d3e0 20 69 66 20 61 6e 79 2e 20 2a 2f 0a 20 20 20 20   if any. */.    
1d3f0 69 66 28 20 73 71 6c 69 74 65 33 49 6e 64 65 78  if( sqlite3Index
1d400 65 64 42 79 4c 6f 6f 6b 75 70 28 70 50 61 72 73  edByLookup(pPars
1d410 65 2c 20 70 46 72 6f 6d 29 20 29 7b 0a 20 20 20  e, pFrom) ){.   
1d420 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62     return WRC_Ab
1d430 6f 72 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ort;.    }.  }..
1d440 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 4e 41 54    /* Process NAT
1d450 55 52 41 4c 20 6b 65 79 77 6f 72 64 73 2c 20 61  URAL keywords, a
1d460 6e 64 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20  nd ON and USING 
1d470 63 6c 61 75 73 65 73 20 6f 66 20 6a 6f 69 6e 73  clauses of joins
1d480 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d  ..  */.  if( db-
1d490 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c  >mallocFailed ||
1d4a0 20 73 71 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f   sqliteProcessJo
1d4b0 69 6e 28 70 50 61 72 73 65 2c 20 70 29 20 29 7b  in(pParse, p) ){
1d4c0 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f  .    return WRC_
1d4d0 41 62 6f 72 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Abort;.  }..  /*
1d4e0 20 46 6f 72 20 65 76 65 72 79 20 22 2a 22 20 74   For every "*" t
1d4f0 68 61 74 20 6f 63 63 75 72 73 20 69 6e 20 74 68  hat occurs in th
1d500 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2c 20 69  e column list, i
1d510 6e 73 65 72 74 20 74 68 65 20 6e 61 6d 65 73 20  nsert the names 
1d520 6f 66 0a 20 20 2a 2a 20 61 6c 6c 20 63 6f 6c 75  of.  ** all colu
1d530 6d 6e 73 20 69 6e 20 61 6c 6c 20 74 61 62 6c 65  mns in all table
1d540 73 2e 20 20 41 6e 64 20 66 6f 72 20 65 76 65 72  s.  And for ever
1d550 79 20 54 41 42 4c 45 2e 2a 20 69 6e 73 65 72 74  y TABLE.* insert
1d560 20 74 68 65 20 6e 61 6d 65 73 0a 20 20 2a 2a 20   the names.  ** 
1d570 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69  of all columns i
1d580 6e 20 54 41 42 4c 45 2e 20 20 54 68 65 20 70 61  n TABLE.  The pa
1d590 72 73 65 72 20 69 6e 73 65 72 74 65 64 20 61 20  rser inserted a 
1d5a0 73 70 65 63 69 61 6c 20 65 78 70 72 65 73 73 69  special expressi
1d5b0 6f 6e 0a 20 20 2a 2a 20 77 69 74 68 20 74 68 65  on.  ** with the
1d5c0 20 54 4b 5f 41 4c 4c 20 6f 70 65 72 61 74 6f 72   TK_ALL operator
1d5d0 20 66 6f 72 20 65 61 63 68 20 22 2a 22 20 74 68   for each "*" th
1d5e0 61 74 20 69 74 20 66 6f 75 6e 64 20 69 6e 20 74  at it found in t
1d5f0 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2e 0a  he column list..
1d600 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    ** The followi
1d610 6e 67 20 63 6f 64 65 20 6a 75 73 74 20 68 61 73  ng code just has
1d620 20 74 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 54   to locate the T
1d630 4b 5f 41 4c 4c 20 65 78 70 72 65 73 73 69 6f 6e  K_ALL expression
1d640 73 20 61 6e 64 20 65 78 70 61 6e 64 0a 20 20 2a  s and expand.  *
1d650 2a 20 65 61 63 68 20 6f 6e 65 20 74 6f 20 74 68  * each one to th
1d660 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 63 6f  e list of all co
1d670 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c 20 74 61 62  lumns in all tab
1d680 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  les..  **.  ** T
1d690 68 65 20 66 69 72 73 74 20 6c 6f 6f 70 20 6a 75  he first loop ju
1d6a0 73 74 20 63 68 65 63 6b 73 20 74 6f 20 73 65 65  st checks to see
1d6b0 20 69 66 20 74 68 65 72 65 20 61 72 65 20 61 6e   if there are an
1d6c0 79 20 22 2a 22 20 6f 70 65 72 61 74 6f 72 73 0a  y "*" operators.
1d6d0 20 20 2a 2a 20 74 68 61 74 20 6e 65 65 64 20 65    ** that need e
1d6e0 78 70 61 6e 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20  xpanding..  */. 
1d6f0 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69   for(k=0; k<pELi
1d700 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b  st->nExpr; k++){
1d710 0a 20 20 20 20 70 45 20 3d 20 70 45 4c 69 73 74  .    pE = pEList
1d720 2d 3e 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[k].pExpr;.  
1d730 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b    if( pE->op==TK
1d740 5f 41 4c 4c 20 29 20 62 72 65 61 6b 3b 0a 20 20  _ALL ) break;.  
1d750 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e 6f 70    assert( pE->op
1d760 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 45 2d 3e  !=TK_DOT || pE->
1d770 70 52 69 67 68 74 21 3d 30 20 29 3b 0a 20 20 20  pRight!=0 );.   
1d780 20 61 73 73 65 72 74 28 20 70 45 2d 3e 6f 70 21   assert( pE->op!
1d790 3d 54 4b 5f 44 4f 54 20 7c 7c 20 28 70 45 2d 3e  =TK_DOT || (pE->
1d7a0 70 4c 65 66 74 21 3d 30 20 26 26 20 70 45 2d 3e  pLeft!=0 && pE->
1d7b0 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 44  pLeft->op==TK_ID
1d7c0 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 45 2d  ) );.    if( pE-
1d7d0 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 26 26 20 70  >op==TK_DOT && p
1d7e0 45 2d 3e 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54  E->pRight->op==T
1d7f0 4b 5f 41 4c 4c 20 29 20 62 72 65 61 6b 3b 0a 20  K_ALL ) break;. 
1d800 20 7d 0a 20 20 69 66 28 20 6b 3c 70 45 4c 69 73   }.  if( k<pELis
1d810 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  t->nExpr ){.    
1d820 2f 2a 0a 20 20 20 20 2a 2a 20 49 66 20 77 65 20  /*.    ** If we 
1d830 67 65 74 20 68 65 72 65 20 69 74 20 6d 65 61 6e  get here it mean
1d840 73 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  s the result set
1d850 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72   contains one or
1d860 20 6d 6f 72 65 20 22 2a 22 0a 20 20 20 20 2a 2a   more "*".    **
1d870 20 6f 70 65 72 61 74 6f 72 73 20 74 68 61 74 20   operators that 
1d880 6e 65 65 64 20 74 6f 20 62 65 20 65 78 70 61 6e  need to be expan
1d890 64 65 64 2e 20 20 4c 6f 6f 70 20 74 68 72 6f 75  ded.  Loop throu
1d8a0 67 68 20 65 61 63 68 20 65 78 70 72 65 73 73 69  gh each expressi
1d8b0 6f 6e 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65  on.    ** in the
1d8c0 20 72 65 73 75 6c 74 20 73 65 74 20 61 6e 64 20   result set and 
1d8d0 65 78 70 61 6e 64 20 74 68 65 6d 20 6f 6e 65 20  expand them one 
1d8e0 62 79 20 6f 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20  by one..    */. 
1d8f0 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
1d900 73 74 5f 69 74 65 6d 20 2a 61 20 3d 20 70 45 4c  st_item *a = pEL
1d910 69 73 74 2d 3e 61 3b 0a 20 20 20 20 45 78 70 72  ist->a;.    Expr
1d920 4c 69 73 74 20 2a 70 4e 65 77 20 3d 20 30 3b 0a  List *pNew = 0;.
1d930 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20      int flags = 
1d940 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67  pParse->db->flag
1d950 73 3b 0a 20 20 20 20 69 6e 74 20 6c 6f 6e 67 4e  s;.    int longN
1d960 61 6d 65 73 20 3d 20 28 66 6c 61 67 73 20 26 20  ames = (flags & 
1d970 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61  SQLITE_FullColNa
1d980 6d 65 73 29 21 3d 30 0a 20 20 20 20 20 20 20 20  mes)!=0.        
1d990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26                &&
1d9a0 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
1d9b0 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 29 3d  _ShortColNames)=
1d9c0 3d 30 3b 0a 0a 20 20 20 20 2f 2a 20 57 68 65 6e  =0;..    /* When
1d9d0 20 70 72 6f 63 65 73 73 69 6e 67 20 46 52 4f 4d   processing FROM
1d9e0 2d 63 6c 61 75 73 65 20 73 75 62 71 75 65 72 69  -clause subqueri
1d9f0 65 73 2c 20 69 74 20 69 73 20 61 6c 77 61 79 73  es, it is always
1da00 20 74 68 65 20 63 61 73 65 0a 20 20 20 20 2a 2a   the case.    **
1da10 20 74 68 61 74 20 66 75 6c 6c 5f 63 6f 6c 75 6d   that full_colum
1da20 6e 5f 6e 61 6d 65 73 3d 4f 46 46 20 61 6e 64 20  n_names=OFF and 
1da30 73 68 6f 72 74 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d  short_column_nam
1da40 65 73 3d 4f 4e 2e 20 20 54 68 65 0a 20 20 20 20  es=ON.  The.    
1da50 2a 2a 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74  ** sqlite3Result
1da60 53 65 74 4f 66 53 65 6c 65 63 74 28 29 20 72 6f  SetOfSelect() ro
1da70 75 74 69 6e 65 20 6d 61 6b 65 73 20 69 74 20 73  utine makes it s
1da80 6f 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  o. */.    assert
1da90 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  ( (p->selFlags &
1daa0 20 53 46 5f 4e 65 73 74 65 64 46 72 6f 6d 29 3d   SF_NestedFrom)=
1dab0 3d 30 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20  =0.          || 
1dac0 28 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ((flags & SQLITE
1dad0 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 3d 3d  _FullColNames)==
1dae0 30 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20  0 &&.           
1daf0 20 20 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49     (flags & SQLI
1db00 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73  TE_ShortColNames
1db10 29 21 3d 30 29 20 29 3b 0a 0a 20 20 20 20 66 6f  )!=0) );..    fo
1db20 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d  r(k=0; k<pEList-
1db30 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20  >nExpr; k++){.  
1db40 20 20 20 20 70 45 20 3d 20 61 5b 6b 5d 2e 70 45      pE = a[k].pE
1db50 78 70 72 3b 0a 20 20 20 20 20 20 70 52 69 67 68  xpr;.      pRigh
1db60 74 20 3d 20 70 45 2d 3e 70 52 69 67 68 74 3b 0a  t = pE->pRight;.
1db70 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
1db80 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20  ->op!=TK_DOT || 
1db90 70 52 69 67 68 74 21 3d 30 20 29 3b 0a 20 20 20  pRight!=0 );.   
1dba0 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 21 3d 54     if( pE->op!=T
1dbb0 4b 5f 41 4c 4c 20 26 26 20 28 70 45 2d 3e 6f 70  K_ALL && (pE->op
1dbc0 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 52 69 67  !=TK_DOT || pRig
1dbd0 68 74 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29 20  ht->op!=TK_ALL) 
1dbe0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
1dbf0 69 73 20 70 61 72 74 69 63 75 6c 61 72 20 65 78  is particular ex
1dc00 70 72 65 73 73 69 6f 6e 20 64 6f 65 73 20 6e 6f  pression does no
1dc10 74 20 6e 65 65 64 20 74 6f 20 62 65 20 65 78 70  t need to be exp
1dc20 61 6e 64 65 64 2e 0a 20 20 20 20 20 20 20 20 2a  anded..        *
1dc30 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d  /.        pNew =
1dc40 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
1dc50 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70  Append(pParse, p
1dc60 4e 65 77 2c 20 61 5b 6b 5d 2e 70 45 78 70 72 29  New, a[k].pExpr)
1dc70 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e  ;.        if( pN
1dc80 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ew ){.          
1dc90 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45  pNew->a[pNew->nE
1dca0 78 70 72 2d 31 5d 2e 7a 4e 61 6d 65 20 3d 20 61  xpr-1].zName = a
1dcb0 5b 6b 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  [k].zName;.     
1dcc0 20 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65       pNew->a[pNe
1dcd0 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a 53 70 61  w->nExpr-1].zSpa
1dce0 6e 20 3d 20 61 5b 6b 5d 2e 7a 53 70 61 6e 3b 0a  n = a[k].zSpan;.
1dcf0 20 20 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 7a            a[k].z
1dd00 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Name = 0;.      
1dd10 20 20 20 20 61 5b 6b 5d 2e 7a 53 70 61 6e 20 3d      a[k].zSpan =
1dd20 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   0;.        }.  
1dd30 20 20 20 20 20 20 61 5b 6b 5d 2e 70 45 78 70 72        a[k].pExpr
1dd40 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 0;.      }els
1dd50 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  e{.        /* Th
1dd60 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  is expression is
1dd70 20 61 20 22 2a 22 20 6f 72 20 61 20 22 54 41 42   a "*" or a "TAB
1dd80 4c 45 2e 2a 22 20 61 6e 64 20 6e 65 65 64 73 20  LE.*" and needs 
1dd90 74 6f 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a  to be.        **
1dda0 20 65 78 70 61 6e 64 65 64 2e 20 2a 2f 0a 20 20   expanded. */.  
1ddb0 20 20 20 20 20 20 69 6e 74 20 74 61 62 6c 65 53        int tableS
1ddc0 65 65 6e 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a  een = 0;      /*
1ddd0 20 53 65 74 20 74 6f 20 31 20 77 68 65 6e 20 54   Set to 1 when T
1dde0 41 42 4c 45 20 6d 61 74 63 68 65 73 20 2a 2f 0a  ABLE matches */.
1ddf0 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54          char *zT
1de00 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 20 20  Name = 0;       
1de10 2f 2a 20 74 65 78 74 20 6f 66 20 6e 61 6d 65 20  /* text of name 
1de20 6f 66 20 54 41 42 4c 45 20 2a 2f 0a 20 20 20 20  of TABLE */.    
1de30 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d      if( pE->op==
1de40 54 4b 5f 44 4f 54 20 29 7b 0a 20 20 20 20 20 20  TK_DOT ){.      
1de50 20 20 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e      assert( pE->
1de60 70 4c 65 66 74 21 3d 30 20 29 3b 0a 20 20 20 20  pLeft!=0 );.    
1de70 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
1de80 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
1de90 45 2d 3e 70 4c 65 66 74 2c 20 45 50 5f 49 6e 74  E->pLeft, EP_Int
1dea0 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20  Value) );.      
1deb0 20 20 20 20 7a 54 4e 61 6d 65 20 3d 20 70 45 2d      zTName = pE-
1dec0 3e 70 4c 65 66 74 2d 3e 75 2e 7a 54 6f 6b 65 6e  >pLeft->u.zToken
1ded0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1dee0 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 72      for(i=0, pFr
1def0 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20  om=pTabList->a; 
1df00 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  i<pTabList->nSrc
1df10 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b  ; i++, pFrom++){
1df20 0a 20 20 20 20 20 20 20 20 20 20 54 61 62 6c 65  .          Table
1df30 20 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e   *pTab = pFrom->
1df40 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20  pTab;.          
1df50 53 65 6c 65 63 74 20 2a 70 53 75 62 20 3d 20 70  Select *pSub = p
1df60 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20  From->pSelect;. 
1df70 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a           char *z
1df80 54 61 62 4e 61 6d 65 20 3d 20 70 46 72 6f 6d 2d  TabName = pFrom-
1df90 3e 7a 41 6c 69 61 73 3b 0a 20 20 20 20 20 20 20  >zAlias;.       
1dfa0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
1dfb0 53 63 68 65 6d 61 4e 61 6d 65 20 3d 20 30 3b 0a  SchemaName = 0;.
1dfc0 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 44            int iD
1dfd0 62 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  b;.          if(
1dfe0 20 7a 54 61 62 4e 61 6d 65 3d 3d 30 20 29 7b 0a   zTabName==0 ){.
1dff0 20 20 20 20 20 20 20 20 20 20 20 20 7a 54 61 62              zTab
1e000 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 7a 4e 61  Name = pTab->zNa
1e010 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  me;.          }.
1e020 20 20 20 20 20 20 20 20 20 20 69 66 28 20 64 62            if( db
1e030 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
1e040 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
1e050 20 20 69 66 28 20 70 53 75 62 3d 3d 30 20 7c 7c    if( pSub==0 ||
1e060 20 28 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73   (pSub->selFlags
1e070 20 26 20 53 46 5f 4e 65 73 74 65 64 46 72 6f 6d   & SF_NestedFrom
1e080 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
1e090 20 20 20 20 70 53 75 62 20 3d 20 30 3b 0a 20 20      pSub = 0;.  
1e0a0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 54            if( zT
1e0b0 4e 61 6d 65 20 26 26 20 73 71 6c 69 74 65 33 53  Name && sqlite3S
1e0c0 74 72 49 43 6d 70 28 7a 54 4e 61 6d 65 2c 20 7a  trICmp(zTName, z
1e0d0 54 61 62 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20  TabName)!=0 ){. 
1e0e0 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
1e0f0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
1e100 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
1e110 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
1e120 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20  hemaToIndex(db, 
1e130 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  pTab->pSchema);.
1e140 20 20 20 20 20 20 20 20 20 20 20 20 7a 53 63 68              zSch
1e150 65 6d 61 4e 61 6d 65 20 3d 20 69 44 62 3e 3d 30  emaName = iDb>=0
1e160 20 3f 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   ? db->aDb[iDb].
1e170 7a 4e 61 6d 65 20 3a 20 22 2a 22 3b 0a 20 20 20  zName : "*";.   
1e180 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1e190 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54     for(j=0; j<pT
1e1a0 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a  ab->nCol; j++){.
1e1b0 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72              char
1e1c0 20 2a 7a 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e   *zName = pTab->
1e1d0 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20  aCol[j].zName;. 
1e1e0 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20             char 
1e1f0 2a 7a 43 6f 6c 6e 61 6d 65 3b 20 20 2f 2a 20 54  *zColname;  /* T
1e200 68 65 20 63 6f 6d 70 75 74 65 64 20 63 6f 6c 75  he computed colu
1e210 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20  mn name */.     
1e220 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 6f         char *zTo
1e230 46 72 65 65 3b 20 20 20 2f 2a 20 4d 61 6c 6c 6f  Free;   /* Mallo
1e240 63 65 64 20 73 74 72 69 6e 67 20 74 68 61 74 20  ced string that 
1e250 6e 65 65 64 73 20 74 6f 20 62 65 20 66 72 65 65  needs to be free
1e260 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  d */.           
1e270 20 54 6f 6b 65 6e 20 73 43 6f 6c 6e 61 6d 65 3b   Token sColname;
1e280 20 20 2f 2a 20 43 6f 6d 70 75 74 65 64 20 63 6f    /* Computed co
1e290 6c 75 6d 6e 20 6e 61 6d 65 20 61 73 20 61 20 74  lumn name as a t
1e2a0 6f 6b 65 6e 20 2a 2f 0a 0a 20 20 20 20 20 20 20  oken */..       
1e2b0 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 4e 61       assert( zNa
1e2c0 6d 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  me );.          
1e2d0 20 20 69 66 28 20 7a 54 4e 61 6d 65 20 26 26 20    if( zTName && 
1e2e0 70 53 75 62 0a 20 20 20 20 20 20 20 20 20 20 20  pSub.           
1e2f0 20 20 26 26 20 73 71 6c 69 74 65 33 4d 61 74 63    && sqlite3Matc
1e300 68 53 70 61 6e 4e 61 6d 65 28 70 53 75 62 2d 3e  hSpanName(pSub->
1e310 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 53 70  pEList->a[j].zSp
1e320 61 6e 2c 20 30 2c 20 7a 54 4e 61 6d 65 2c 20 30  an, 0, zTName, 0
1e330 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  )==0.           
1e340 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1e350 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
1e360 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
1e370 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 20 63         /* If a c
1e380 6f 6c 75 6d 6e 20 69 73 20 6d 61 72 6b 65 64 20  olumn is marked 
1e390 61 73 20 27 68 69 64 64 65 6e 27 20 28 63 75 72  as 'hidden' (cur
1e3a0 72 65 6e 74 6c 79 20 6f 6e 6c 79 20 70 6f 73 73  rently only poss
1e3b0 69 62 6c 65 0a 20 20 20 20 20 20 20 20 20 20 20  ible.           
1e3c0 20 2a 2a 20 66 6f 72 20 76 69 72 74 75 61 6c 20   ** for virtual 
1e3d0 74 61 62 6c 65 73 29 2c 20 64 6f 20 6e 6f 74 20  tables), do not 
1e3e0 69 6e 63 6c 75 64 65 20 69 74 20 69 6e 20 74 68  include it in th
1e3f0 65 20 65 78 70 61 6e 64 65 64 0a 20 20 20 20 20  e expanded.     
1e400 20 20 20 20 20 20 20 2a 2a 20 72 65 73 75 6c 74         ** result
1e410 2d 73 65 74 20 6c 69 73 74 2e 0a 20 20 20 20 20  -set list..     
1e420 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
1e430 20 20 20 20 20 20 69 66 28 20 49 73 48 69 64 64        if( IsHidd
1e440 65 6e 43 6f 6c 75 6d 6e 28 26 70 54 61 62 2d 3e  enColumn(&pTab->
1e450 61 43 6f 6c 5b 6a 5d 29 20 29 7b 0a 20 20 20 20  aCol[j]) ){.    
1e460 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
1e470 28 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29  (IsVirtual(pTab)
1e480 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
1e490 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
1e4a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1e4b0 20 20 20 20 20 74 61 62 6c 65 53 65 65 6e 20 3d       tableSeen =
1e4c0 20 31 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20   1;..           
1e4d0 20 69 66 28 20 69 3e 30 20 26 26 20 7a 54 4e 61   if( i>0 && zTNa
1e4e0 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  me==0 ){.       
1e4f0 20 20 20 20 20 20 20 69 66 28 20 28 70 46 72 6f         if( (pFro
1e500 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54  m->jointype & JT
1e510 5f 4e 41 54 55 52 41 4c 29 21 3d 30 0a 20 20 20  _NATURAL)!=0.   
1e520 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
1e530 74 61 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e  tableAndColumnIn
1e540 64 65 78 28 70 54 61 62 4c 69 73 74 2c 20 69 2c  dex(pTabList, i,
1e550 20 7a 4e 61 6d 65 2c 20 30 2c 20 30 29 0a 20 20   zName, 0, 0).  
1e560 20 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20              ){. 
1e570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1e580 2a 20 49 6e 20 61 20 4e 41 54 55 52 41 4c 20 6a  * In a NATURAL j
1e590 6f 69 6e 2c 20 6f 6d 69 74 20 74 68 65 20 6a 6f  oin, omit the jo
1e5a0 69 6e 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20  in columns from 
1e5b0 74 68 65 20 0a 20 20 20 20 20 20 20 20 20 20 20  the .           
1e5c0 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 74 6f       ** table to
1e5d0 20 74 68 65 20 72 69 67 68 74 20 6f 66 20 74 68   the right of th
1e5e0 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20 20 20 20 20  e join */.      
1e5f0 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
1e600 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
1e610 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
1e620 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 64 4c    if( sqlite3IdL
1e630 69 73 74 49 6e 64 65 78 28 70 46 72 6f 6d 2d 3e  istIndex(pFrom->
1e640 70 55 73 69 6e 67 2c 20 7a 4e 61 6d 65 29 3e 3d  pUsing, zName)>=
1e650 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
1e660 20 20 20 20 20 2f 2a 20 49 6e 20 61 20 6a 6f 69       /* In a joi
1e670 6e 20 77 69 74 68 20 61 20 55 53 49 4e 47 20 63  n with a USING c
1e680 6c 61 75 73 65 2c 20 6f 6d 69 74 20 63 6f 6c 75  lause, omit colu
1e690 6d 6e 73 20 69 6e 20 74 68 65 0a 20 20 20 20 20  mns in the.     
1e6a0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75 73             ** us
1e6b0 69 6e 67 20 63 6c 61 75 73 65 20 66 72 6f 6d 20  ing clause from 
1e6c0 74 68 65 20 74 61 62 6c 65 20 6f 6e 20 74 68 65  the table on the
1e6d0 20 72 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20 20   right. */.     
1e6e0 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
1e6f0 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nue;.           
1e700 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
1e710 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70   }.            p
1e720 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45  Right = sqlite3E
1e730 78 70 72 28 64 62 2c 20 54 4b 5f 49 44 2c 20 7a  xpr(db, TK_ID, z
1e740 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Name);.         
1e750 20 20 20 7a 43 6f 6c 6e 61 6d 65 20 3d 20 7a 4e     zColname = zN
1e760 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ame;.           
1e770 20 7a 54 6f 46 72 65 65 20 3d 20 30 3b 0a 20 20   zToFree = 0;.  
1e780 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6c 6f            if( lo
1e790 6e 67 4e 61 6d 65 73 20 7c 7c 20 70 54 61 62 4c  ngNames || pTabL
1e7a0 69 73 74 2d 3e 6e 53 72 63 3e 31 20 29 7b 0a 20  ist->nSrc>1 ){. 
1e7b0 20 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70               Exp
1e7c0 72 20 2a 70 4c 65 66 74 3b 0a 20 20 20 20 20 20  r *pLeft;.      
1e7d0 20 20 20 20 20 20 20 20 70 4c 65 66 74 20 3d 20          pLeft = 
1e7e0 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20  sqlite3Expr(db, 
1e7f0 54 4b 5f 49 44 2c 20 7a 54 61 62 4e 61 6d 65 29  TK_ID, zTabName)
1e800 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1e810 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50  pExpr = sqlite3P
1e820 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f  Expr(pParse, TK_
1e830 44 4f 54 2c 20 70 4c 65 66 74 2c 20 70 52 69 67  DOT, pLeft, pRig
1e840 68 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ht, 0);.        
1e850 20 20 20 20 20 20 69 66 28 20 7a 53 63 68 65 6d        if( zSchem
1e860 61 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20  aName ){.       
1e870 20 20 20 20 20 20 20 20 20 70 4c 65 66 74 20 3d           pLeft =
1e880 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c   sqlite3Expr(db,
1e890 20 54 4b 5f 49 44 2c 20 7a 53 63 68 65 6d 61 4e   TK_ID, zSchemaN
1e8a0 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
1e8b0 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 73 71        pExpr = sq
1e8c0 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
1e8d0 65 2c 20 54 4b 5f 44 4f 54 2c 20 70 4c 65 66 74  e, TK_DOT, pLeft
1e8e0 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20  , pExpr, 0);.   
1e8f0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
1e900 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6c             if( l
1e910 6f 6e 67 4e 61 6d 65 73 20 29 7b 0a 20 20 20 20  ongNames ){.    
1e920 20 20 20 20 20 20 20 20 20 20 20 20 7a 43 6f 6c              zCol
1e930 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50  name = sqlite3MP
1e940 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2e 25 73  rintf(db, "%s.%s
1e950 22 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 7a 4e 61  ", zTabName, zNa
1e960 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  me);.           
1e970 20 20 20 20 20 7a 54 6f 46 72 65 65 20 3d 20 7a       zToFree = z
1e980 43 6f 6c 6e 61 6d 65 3b 0a 20 20 20 20 20 20 20  Colname;.       
1e990 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1e9a0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1e9b0 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 20            pExpr 
1e9c0 3d 20 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  = pRight;.      
1e9d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1e9e0 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74      pNew = sqlit
1e9f0 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
1ea00 28 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 70  (pParse, pNew, p
1ea10 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20  Expr);.         
1ea20 20 20 20 73 43 6f 6c 6e 61 6d 65 2e 7a 20 3d 20     sColname.z = 
1ea30 7a 43 6f 6c 6e 61 6d 65 3b 0a 20 20 20 20 20 20  zColname;.      
1ea40 20 20 20 20 20 20 73 43 6f 6c 6e 61 6d 65 2e 6e        sColname.n
1ea50 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
1ea60 33 30 28 7a 43 6f 6c 6e 61 6d 65 29 3b 0a 20 20  30(zColname);.  
1ea70 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1ea80 33 45 78 70 72 4c 69 73 74 53 65 74 4e 61 6d 65  3ExprListSetName
1ea90 28 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 26  (pParse, pNew, &
1eaa0 73 43 6f 6c 6e 61 6d 65 2c 20 30 29 3b 0a 20 20  sColname, 0);.  
1eab0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4e            if( pN
1eac0 65 77 20 26 26 20 28 70 2d 3e 73 65 6c 46 6c 61  ew && (p->selFla
1ead0 67 73 20 26 20 53 46 5f 4e 65 73 74 65 64 46 72  gs & SF_NestedFr
1eae0 6f 6d 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  om)!=0 ){.      
1eaf0 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 45          struct E
1eb00 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 58  xprList_item *pX
1eb10 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 70 4e 65 77   = &pNew->a[pNew
1eb20 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20 20 20  ->nExpr-1];.    
1eb30 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 53            if( pS
1eb40 75 62 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ub ){.          
1eb50 20 20 20 20 20 20 70 58 2d 3e 7a 53 70 61 6e 20        pX->zSpan 
1eb60 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
1eb70 70 28 64 62 2c 20 70 53 75 62 2d 3e 70 45 4c 69  p(db, pSub->pELi
1eb80 73 74 2d 3e 61 5b 6a 5d 2e 7a 53 70 61 6e 29 3b  st->a[j].zSpan);
1eb90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1eba0 20 74 65 73 74 63 61 73 65 28 20 70 58 2d 3e 7a   testcase( pX->z
1ebb0 53 70 61 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Span==0 );.     
1ebc0 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
1ebd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ebe0 70 58 2d 3e 7a 53 70 61 6e 20 3d 20 73 71 6c 69  pX->zSpan = sqli
1ebf0 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
1ec00 25 73 2e 25 73 2e 25 73 22 2c 0a 20 20 20 20 20  %s.%s.%s",.     
1ec10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec30 20 20 20 20 20 20 7a 53 63 68 65 6d 61 4e 61 6d        zSchemaNam
1ec40 65 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 7a 43 6f  e, zTabName, zCo
1ec50 6c 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  lname);.        
1ec60 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
1ec70 28 20 70 58 2d 3e 7a 53 70 61 6e 3d 3d 30 20 29  ( pX->zSpan==0 )
1ec80 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1ec90 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
1eca0 70 58 2d 3e 62 53 70 61 6e 49 73 54 61 62 20 3d  pX->bSpanIsTab =
1ecb0 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   1;.            
1ecc0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  }.            sq
1ecd0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
1ece0 7a 54 6f 46 72 65 65 29 3b 0a 20 20 20 20 20 20  zToFree);.      
1ecf0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
1ed00 20 20 20 20 20 20 20 20 69 66 28 20 21 74 61 62          if( !tab
1ed10 6c 65 53 65 65 6e 20 29 7b 0a 20 20 20 20 20 20  leSeen ){.      
1ed20 20 20 20 20 69 66 28 20 7a 54 4e 61 6d 65 20 29      if( zTName )
1ed30 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
1ed40 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
1ed50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 74  arse, "no such t
1ed60 61 62 6c 65 3a 20 25 73 22 2c 20 7a 54 4e 61 6d  able: %s", zTNam
1ed70 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  e);.          }e
1ed80 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
1ed90 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
1eda0 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 74 61 62  (pParse, "no tab
1edb0 6c 65 73 20 73 70 65 63 69 66 69 65 64 22 29 3b  les specified");
1edc0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1edd0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1ede0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
1edf0 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
1ee00 62 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  b, pEList);.    
1ee10 70 2d 3e 70 45 4c 69 73 74 20 3d 20 70 4e 65 77  p->pEList = pNew
1ee20 3b 0a 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45  ;.  }.#if SQLITE
1ee30 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 0a 20 20 69 66  _MAX_COLUMN.  if
1ee40 28 20 70 2d 3e 70 45 4c 69 73 74 20 26 26 20 70  ( p->pEList && p
1ee50 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e  ->pEList->nExpr>
1ee60 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54  db->aLimit[SQLIT
1ee70 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20  E_LIMIT_COLUMN] 
1ee80 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
1ee90 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
1eea0 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73  too many columns
1eeb0 20 69 6e 20 72 65 73 75 6c 74 20 73 65 74 22 29   in result set")
1eec0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72  ;.  }.#endif.  r
1eed0 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
1eee0 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4e 6f 2d  ue;.}../*.** No-
1eef0 6f 70 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 74  op routine for t
1ef00 68 65 20 70 61 72 73 65 2d 74 72 65 65 20 77 61  he parse-tree wa
1ef10 6c 6b 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  lker..**.** When
1ef20 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
1ef30 20 74 68 65 20 57 61 6c 6b 65 72 2e 78 45 78 70   the Walker.xExp
1ef40 72 43 61 6c 6c 62 61 63 6b 20 74 68 65 6e 20 65  rCallback then e
1ef50 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 73 0a  xpression trees.
1ef60 2a 2a 20 61 72 65 20 77 61 6c 6b 65 64 20 77 69  ** are walked wi
1ef70 74 68 6f 75 74 20 61 6e 79 20 61 63 74 69 6f 6e  thout any action
1ef80 73 20 62 65 69 6e 67 20 74 61 6b 65 6e 20 61 74  s being taken at
1ef90 20 65 61 63 68 20 6e 6f 64 65 2e 20 20 50 72 65   each node.  Pre
1efa0 73 75 6d 61 62 6c 79 2c 0a 2a 2a 20 77 68 65 6e  sumably,.** when
1efb0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
1efc0 20 75 73 65 64 20 66 6f 72 20 57 61 6c 6b 65 72   used for Walker
1efd0 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 74  .xExprCallback t
1efe0 68 65 6e 20 0a 2a 2a 20 57 61 6c 6b 65 72 2e 78  hen .** Walker.x
1eff0 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 69  SelectCallback i
1f000 73 20 73 65 74 20 74 6f 20 64 6f 20 73 6f 6d 65  s set to do some
1f010 74 68 69 6e 67 20 75 73 65 66 75 6c 20 66 6f 72  thing useful for
1f020 20 65 76 65 72 79 20 0a 2a 2a 20 73 75 62 71 75   every .** subqu
1f030 65 72 79 20 69 6e 20 74 68 65 20 70 61 72 73 65  ery in the parse
1f040 72 20 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69  r tree..*/.stati
1f050 63 20 69 6e 74 20 65 78 70 72 57 61 6c 6b 4e 6f  c int exprWalkNo
1f060 6f 70 28 57 61 6c 6b 65 72 20 2a 4e 6f 74 55 73  op(Walker *NotUs
1f070 65 64 2c 20 45 78 70 72 20 2a 4e 6f 74 55 73 65  ed, Expr *NotUse
1f080 64 32 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  d2){.  UNUSED_PA
1f090 52 41 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64  RAMETER2(NotUsed
1f0a0 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 72  , NotUsed2);.  r
1f0b0 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
1f0c0 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ue;.}../*.** Thi
1f0d0 73 20 72 6f 75 74 69 6e 65 20 22 65 78 70 61 6e  s routine "expan
1f0e0 64 73 22 20 61 20 53 45 4c 45 43 54 20 73 74 61  ds" a SELECT sta
1f0f0 74 65 6d 65 6e 74 20 61 6e 64 20 61 6c 6c 20 6f  tement and all o
1f100 66 20 69 74 73 20 73 75 62 71 75 65 72 69 65 73  f its subqueries
1f110 2e 0a 2a 2a 20 46 6f 72 20 61 64 64 69 74 69 6f  ..** For additio
1f120 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  nal information 
1f130 6f 6e 20 77 68 61 74 20 69 74 20 6d 65 61 6e 73  on what it means
1f140 20 74 6f 20 22 65 78 70 61 6e 64 22 20 61 20 53   to "expand" a S
1f150 45 4c 45 43 54 0a 2a 2a 20 73 74 61 74 65 6d 65  ELECT.** stateme
1f160 6e 74 2c 20 73 65 65 20 74 68 65 20 63 6f 6d 6d  nt, see the comm
1f170 65 6e 74 20 6f 6e 20 74 68 65 20 73 65 6c 65 63  ent on the selec
1f180 74 45 78 70 61 6e 64 20 77 6f 72 6b 65 72 20 63  tExpand worker c
1f190 61 6c 6c 62 61 63 6b 20 61 62 6f 76 65 2e 0a 2a  allback above..*
1f1a0 2a 0a 2a 2a 20 45 78 70 61 6e 64 69 6e 67 20 61  *.** Expanding a
1f1b0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
1f1c0 74 20 69 73 20 74 68 65 20 66 69 72 73 74 20 73  t is the first s
1f1d0 74 65 70 20 69 6e 20 70 72 6f 63 65 73 73 69 6e  tep in processin
1f1e0 67 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74  g a.** SELECT st
1f1f0 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 53 45  atement.  The SE
1f200 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 6d  LECT statement m
1f210 75 73 74 20 62 65 20 65 78 70 61 6e 64 65 64 20  ust be expanded 
1f220 62 65 66 6f 72 65 0a 2a 2a 20 6e 61 6d 65 20 72  before.** name r
1f230 65 73 6f 6c 75 74 69 6f 6e 20 69 73 20 70 65 72  esolution is per
1f240 66 6f 72 6d 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  formed..**.** If
1f250 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20 77   anything goes w
1f260 72 6f 6e 67 2c 20 61 6e 20 65 72 72 6f 72 20 6d  rong, an error m
1f270 65 73 73 61 67 65 20 69 73 20 77 72 69 74 74 65  essage is writte
1f280 6e 20 69 6e 74 6f 20 70 50 61 72 73 65 2e 0a 2a  n into pParse..*
1f290 2a 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75  * The calling fu
1f2a0 6e 63 74 69 6f 6e 20 63 61 6e 20 64 65 74 65 63  nction can detec
1f2b0 74 20 74 68 65 20 70 72 6f 62 6c 65 6d 20 62 79  t the problem by
1f2c0 20 6c 6f 6f 6b 69 6e 67 20 61 74 20 70 50 61 72   looking at pPar
1f2d0 73 65 2d 3e 6e 45 72 72 0a 2a 2a 20 61 6e 64 2f  se->nErr.** and/
1f2e0 6f 72 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  or pParse->db->m
1f2f0 61 6c 6c 6f 63 46 61 69 6c 65 64 2e 0a 2a 2f 0a  allocFailed..*/.
1f300 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69  static void sqli
1f310 74 65 33 53 65 6c 65 63 74 45 78 70 61 6e 64 28  te3SelectExpand(
1f320 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
1f330 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b  elect *pSelect){
1f340 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 77  .  Walker w;.  w
1f350 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
1f360 20 3d 20 73 65 6c 65 63 74 45 78 70 61 6e 64 65   = selectExpande
1f370 72 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c  r;.  w.xExprCall
1f380 62 61 63 6b 20 3d 20 65 78 70 72 57 61 6c 6b 4e  back = exprWalkN
1f390 6f 6f 70 3b 0a 20 20 77 2e 70 50 61 72 73 65 20  oop;.  w.pParse 
1f3a0 3d 20 70 50 61 72 73 65 3b 0a 20 20 73 71 6c 69  = pParse;.  sqli
1f3b0 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 26 77  te3WalkSelect(&w
1f3c0 2c 20 70 53 65 6c 65 63 74 29 3b 0a 7d 0a 0a 0a  , pSelect);.}...
1f3d0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1f3e0 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a  MIT_SUBQUERY./*.
1f3f0 2a 2a 20 54 68 69 73 20 69 73 20 61 20 57 61 6c  ** This is a Wal
1f400 6b 65 72 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62  ker.xSelectCallb
1f410 61 63 6b 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72  ack callback for
1f420 20 74 68 65 20 73 71 6c 69 74 65 33 53 65 6c 65   the sqlite3Sele
1f430 63 74 54 79 70 65 49 6e 66 6f 28 29 0a 2a 2a 20  ctTypeInfo().** 
1f440 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2a 0a 2a 2a  interface..**.**
1f450 20 46 6f 72 20 65 61 63 68 20 46 52 4f 4d 2d 63   For each FROM-c
1f460 6c 61 75 73 65 20 73 75 62 71 75 65 72 79 2c 20  lause subquery, 
1f470 61 64 64 20 43 6f 6c 75 6d 6e 2e 7a 54 79 70 65  add Column.zType
1f480 20 61 6e 64 20 43 6f 6c 75 6d 6e 2e 7a 43 6f 6c   and Column.zCol
1f490 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  l.** information
1f4a0 20 74 6f 20 74 68 65 20 54 61 62 6c 65 20 73 74   to the Table st
1f4b0 72 75 63 74 75 72 65 20 74 68 61 74 20 72 65 70  ructure that rep
1f4c0 72 65 73 65 6e 74 73 20 74 68 65 20 72 65 73 75  resents the resu
1f4d0 6c 74 20 73 65 74 0a 2a 2a 20 6f 66 20 74 68 61  lt set.** of tha
1f4e0 74 20 73 75 62 71 75 65 72 79 2e 0a 2a 2a 0a 2a  t subquery..**.*
1f4f0 2a 20 54 68 65 20 54 61 62 6c 65 20 73 74 72 75  * The Table stru
1f500 63 74 75 72 65 20 74 68 61 74 20 72 65 70 72 65  cture that repre
1f510 73 65 6e 74 73 20 74 68 65 20 72 65 73 75 6c 74  sents the result
1f520 20 73 65 74 20 77 61 73 20 63 6f 6e 73 74 72 75   set was constru
1f530 63 74 65 64 0a 2a 2a 20 62 79 20 73 65 6c 65 63  cted.** by selec
1f540 74 45 78 70 61 6e 64 65 72 28 29 20 62 75 74 20  tExpander() but 
1f550 74 68 65 20 74 79 70 65 20 61 6e 64 20 63 6f 6c  the type and col
1f560 6c 61 74 69 6f 6e 20 69 6e 66 6f 72 6d 61 74 69  lation informati
1f570 6f 6e 20 77 61 73 20 6f 6d 69 74 74 65 64 0a 2a  on was omitted.*
1f580 2a 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74 20  * at that point 
1f590 62 65 63 61 75 73 65 20 69 64 65 6e 74 69 66 69  because identifi
1f5a0 65 72 73 20 68 61 64 20 6e 6f 74 20 79 65 74 20  ers had not yet 
1f5b0 62 65 65 6e 20 72 65 73 6f 6c 76 65 64 2e 20 20  been resolved.  
1f5c0 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  This.** routine 
1f5d0 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20  is called after 
1f5e0 69 64 65 6e 74 69 66 69 65 72 20 72 65 73 6f 6c  identifier resol
1f5f0 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ution..*/.static
1f600 20 69 6e 74 20 73 65 6c 65 63 74 41 64 64 53 75   int selectAddSu
1f610 62 71 75 65 72 79 54 79 70 65 49 6e 66 6f 28 57  bqueryTypeInfo(W
1f620 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
1f630 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 50 61  Select *p){.  Pa
1f640 72 73 65 20 2a 70 50 61 72 73 65 3b 0a 20 20 69  rse *pParse;.  i
1f650 6e 74 20 69 3b 0a 20 20 53 72 63 4c 69 73 74 20  nt i;.  SrcList 
1f660 2a 70 54 61 62 4c 69 73 74 3b 0a 20 20 73 74 72  *pTabList;.  str
1f670 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
1f680 20 2a 70 46 72 6f 6d 3b 0a 0a 20 20 61 73 73 65   *pFrom;..  asse
1f690 72 74 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  rt( p->selFlags 
1f6a0 26 20 53 46 5f 52 65 73 6f 6c 76 65 64 20 29 3b  & SF_Resolved );
1f6b0 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c  .  if( (p->selFl
1f6c0 61 67 73 20 26 20 53 46 5f 48 61 73 54 79 70 65  ags & SF_HasType
1f6d0 49 6e 66 6f 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Info)==0 ){.    
1f6e0 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53  p->selFlags |= S
1f6f0 46 5f 48 61 73 54 79 70 65 49 6e 66 6f 3b 0a 20  F_HasTypeInfo;. 
1f700 20 20 20 70 50 61 72 73 65 20 3d 20 70 57 61 6c     pParse = pWal
1f710 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20  ker->pParse;.   
1f720 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70   pTabList = p->p
1f730 53 72 63 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  Src;.    for(i=0
1f740 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74  , pFrom=pTabList
1f750 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d  ->a; i<pTabList-
1f760 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f  >nSrc; i++, pFro
1f770 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 54 61 62 6c  m++){.      Tabl
1f780 65 20 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d  e *pTab = pFrom-
1f790 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 69 66 28  >pTab;.      if(
1f7a0 20 41 4c 57 41 59 53 28 70 54 61 62 21 3d 30 29   ALWAYS(pTab!=0)
1f7b0 20 26 26 20 28 70 54 61 62 2d 3e 74 61 62 46 6c   && (pTab->tabFl
1f7c0 61 67 73 20 26 20 54 46 5f 45 70 68 65 6d 65 72  ags & TF_Ephemer
1f7d0 61 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  al)!=0 ){.      
1f7e0 20 20 2f 2a 20 41 20 73 75 62 2d 71 75 65 72 79    /* A sub-query
1f7f0 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
1f800 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20  use of a SELECT 
1f810 2a 2f 0a 20 20 20 20 20 20 20 20 53 65 6c 65 63  */.        Selec
1f820 74 20 2a 70 53 65 6c 20 3d 20 70 46 72 6f 6d 2d  t *pSel = pFrom-
1f830 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20  >pSelect;.      
1f840 20 20 61 73 73 65 72 74 28 20 70 53 65 6c 20 29    assert( pSel )
1f850 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  ;.        while(
1f860 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 20 29 20   pSel->pPrior ) 
1f870 70 53 65 6c 20 3d 20 70 53 65 6c 2d 3e 70 50 72  pSel = pSel->pPr
1f880 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 73 65 6c  ior;.        sel
1f890 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65  ectAddColumnType
1f8a0 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 70 50 61  AndCollation(pPa
1f8b0 72 73 65 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c 2c  rse, pTab->nCol,
1f8c0 20 70 54 61 62 2d 3e 61 43 6f 6c 2c 20 70 53 65   pTab->aCol, pSe
1f8d0 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  l);.      }.    
1f8e0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 57  }.  }.  return W
1f8f0 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 23  RC_Continue;.}.#
1f900 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  endif.../*.** Th
1f910 69 73 20 72 6f 75 74 69 6e 65 20 61 64 64 73 20  is routine adds 
1f920 64 61 74 61 74 79 70 65 20 61 6e 64 20 63 6f 6c  datatype and col
1f930 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
1f940 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 0a 2a  information to.*
1f950 2a 20 74 68 65 20 54 61 62 6c 65 20 73 74 72 75  * the Table stru
1f960 63 74 75 72 65 73 20 6f 66 20 61 6c 6c 20 46 52  ctures of all FR
1f970 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62 71 75 65  OM-clause subque
1f980 72 69 65 73 20 69 6e 20 61 0a 2a 2a 20 53 45 4c  ries in a.** SEL
1f990 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  ECT statement..*
1f9a0 2a 0a 2a 2a 20 55 73 65 20 74 68 69 73 20 72 6f  *.** Use this ro
1f9b0 75 74 69 6e 65 20 61 66 74 65 72 20 6e 61 6d 65  utine after name
1f9c0 20 72 65 73 6f 6c 75 74 69 6f 6e 2e 0a 2a 2f 0a   resolution..*/.
1f9d0 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69  static void sqli
1f9e0 74 65 33 53 65 6c 65 63 74 41 64 64 54 79 70 65  te3SelectAddType
1f9f0 49 6e 66 6f 28 50 61 72 73 65 20 2a 70 50 61 72  Info(Parse *pPar
1fa00 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  se, Select *pSel
1fa10 65 63 74 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  ect){.#ifndef SQ
1fa20 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
1fa30 52 59 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20  RY.  Walker w;. 
1fa40 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61   w.xSelectCallba
1fa50 63 6b 20 3d 20 73 65 6c 65 63 74 41 64 64 53 75  ck = selectAddSu
1fa60 62 71 75 65 72 79 54 79 70 65 49 6e 66 6f 3b 0a  bqueryTypeInfo;.
1fa70 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63    w.xExprCallbac
1fa80 6b 20 3d 20 65 78 70 72 57 61 6c 6b 4e 6f 6f 70  k = exprWalkNoop
1fa90 3b 0a 20 20 77 2e 70 50 61 72 73 65 20 3d 20 70  ;.  w.pParse = p
1faa0 50 61 72 73 65 3b 0a 20 20 73 71 6c 69 74 65 33  Parse;.  sqlite3
1fab0 57 61 6c 6b 53 65 6c 65 63 74 28 26 77 2c 20 70  WalkSelect(&w, p
1fac0 53 65 6c 65 63 74 29 3b 0a 23 65 6e 64 69 66 0a  Select);.#endif.
1fad0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  }.../*.** This r
1fae0 6f 75 74 69 6e 65 20 73 65 74 73 20 75 70 20 61  outine sets up a
1faf0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
1fb00 74 20 66 6f 72 20 70 72 6f 63 65 73 73 69 6e 67  t for processing
1fb10 2e 20 20 54 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77  .  The.** follow
1fb20 69 6e 67 20 69 73 20 61 63 63 6f 6d 70 6c 69 73  ing is accomplis
1fb30 68 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a  hed:.**.**     *
1fb40 20 20 56 44 42 45 20 43 75 72 73 6f 72 20 6e 75    VDBE Cursor nu
1fb50 6d 62 65 72 73 20 61 72 65 20 61 73 73 69 67 6e  mbers are assign
1fb60 65 64 20 74 6f 20 61 6c 6c 20 46 52 4f 4d 2d 63  ed to all FROM-c
1fb70 6c 61 75 73 65 20 74 65 72 6d 73 2e 0a 2a 2a 20  lause terms..** 
1fb80 20 20 20 20 2a 20 20 45 70 68 65 6d 65 72 61 6c      *  Ephemeral
1fb90 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 73 20 61   Table objects a
1fba0 72 65 20 63 72 65 61 74 65 64 20 66 6f 72 20 61  re created for a
1fbb0 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73  ll FROM-clause s
1fbc0 75 62 71 75 65 72 69 65 73 2e 0a 2a 2a 20 20 20  ubqueries..**   
1fbd0 20 20 2a 20 20 4f 4e 20 61 6e 64 20 55 53 49 4e    *  ON and USIN
1fbe0 47 20 63 6c 61 75 73 65 73 20 61 72 65 20 73 68  G clauses are sh
1fbf0 69 66 74 65 64 20 69 6e 74 6f 20 57 48 45 52 45  ifted into WHERE
1fc00 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 20   statements.**  
1fc10 20 20 20 2a 20 20 57 69 6c 64 63 61 72 64 73 20     *  Wildcards 
1fc20 22 2a 22 20 61 6e 64 20 22 54 41 42 4c 45 2e 2a  "*" and "TABLE.*
1fc30 22 20 69 6e 20 72 65 73 75 6c 74 20 73 65 74 73  " in result sets
1fc40 20 61 72 65 20 65 78 70 61 6e 64 65 64 2e 0a 2a   are expanded..*
1fc50 2a 20 20 20 20 20 2a 20 20 49 64 65 6e 74 69 66  *     *  Identif
1fc60 69 65 72 73 20 69 6e 20 65 78 70 72 65 73 73 69  iers in expressi
1fc70 6f 6e 20 61 72 65 20 6d 61 74 63 68 65 64 20 74  on are matched t
1fc80 6f 20 74 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  o tables..**.** 
1fc90 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 63 74  This routine act
1fca0 73 20 72 65 63 75 72 73 69 76 65 6c 79 20 6f 6e  s recursively on
1fcb0 20 61 6c 6c 20 73 75 62 71 75 65 72 69 65 73 20   all subqueries 
1fcc0 77 69 74 68 69 6e 20 74 68 65 20 53 45 4c 45 43  within the SELEC
1fcd0 54 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  T..*/.void sqlit
1fce0 65 33 53 65 6c 65 63 74 50 72 65 70 28 0a 20 20  e3SelectPrep(.  
1fcf0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
1fd00 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
1fd10 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
1fd20 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
1fd30 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1fd40 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
1fd50 20 62 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a 2f   being coded. */
1fd60 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a  .  NameContext *
1fd70 70 4f 75 74 65 72 4e 43 20 20 2f 2a 20 4e 61 6d  pOuterNC  /* Nam
1fd80 65 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 63 6f  e context for co
1fd90 6e 74 61 69 6e 65 72 20 2a 2f 0a 29 7b 0a 20 20  ntainer */.){.  
1fda0 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69  sqlite3 *db;.  i
1fdb0 66 28 20 4e 45 56 45 52 28 70 3d 3d 30 29 20 29  f( NEVER(p==0) )
1fdc0 20 72 65 74 75 72 6e 3b 0a 20 20 64 62 20 3d 20   return;.  db = 
1fdd0 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66  pParse->db;.  if
1fde0 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
1fdf0 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  ed ) return;.  i
1fe00 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  f( p->selFlags &
1fe10 20 53 46 5f 48 61 73 54 79 70 65 49 6e 66 6f 20   SF_HasTypeInfo 
1fe20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69  ) return;.  sqli
1fe30 74 65 33 53 65 6c 65 63 74 45 78 70 61 6e 64 28  te3SelectExpand(
1fe40 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 69 66  pParse, p);.  if
1fe50 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  ( pParse->nErr |
1fe60 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
1fe70 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73  ed ) return;.  s
1fe80 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 53 65 6c  qlite3ResolveSel
1fe90 65 63 74 4e 61 6d 65 73 28 70 50 61 72 73 65 2c  ectNames(pParse,
1fea0 20 70 2c 20 70 4f 75 74 65 72 4e 43 29 3b 0a 20   p, pOuterNC);. 
1feb0 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
1fec0 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  r || db->mallocF
1fed0 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a  ailed ) return;.
1fee0 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41    sqlite3SelectA
1fef0 64 64 54 79 70 65 49 6e 66 6f 28 70 50 61 72 73  ddTypeInfo(pPars
1ff00 65 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  e, p);.}../*.** 
1ff10 52 65 73 65 74 20 74 68 65 20 61 67 67 72 65 67  Reset the aggreg
1ff20 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 2e  ate accumulator.
1ff30 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 67 67 72 65  .**.** The aggre
1ff40 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72  gate accumulator
1ff50 20 69 73 20 61 20 73 65 74 20 6f 66 20 6d 65 6d   is a set of mem
1ff60 6f 72 79 20 63 65 6c 6c 73 20 74 68 61 74 20 68  ory cells that h
1ff70 6f 6c 64 0a 2a 2a 20 69 6e 74 65 72 6d 65 64 69  old.** intermedi
1ff80 61 74 65 20 72 65 73 75 6c 74 73 20 77 68 69 6c  ate results whil
1ff90 65 20 63 61 6c 63 75 6c 61 74 69 6e 67 20 61 6e  e calculating an
1ffa0 20 61 67 67 72 65 67 61 74 65 2e 20 20 54 68 69   aggregate.  Thi
1ffb0 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67 65 6e  s.** routine gen
1ffc0 65 72 61 74 65 73 20 63 6f 64 65 20 74 68 61 74  erates code that
1ffd0 20 73 74 6f 72 65 73 20 4e 55 4c 4c 73 20 69 6e   stores NULLs in
1ffe0 20 61 6c 6c 20 6f 66 20 74 68 6f 73 65 20 6d 65   all of those me
1fff0 6d 6f 72 79 0a 2a 2a 20 63 65 6c 6c 73 2e 0a 2a  mory.** cells..*
20000 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  /.static void re
20010 73 65 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 50  setAccumulator(P
20020 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67  arse *pParse, Ag
20030 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29  gInfo *pAggInfo)
20040 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
20050 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
20060 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 41  nt i;.  struct A
20070 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 75  ggInfo_func *pFu
20080 6e 63 3b 0a 20 20 69 66 28 20 70 41 67 67 49 6e  nc;.  if( pAggIn
20090 66 6f 2d 3e 6e 46 75 6e 63 2b 70 41 67 67 49 6e  fo->nFunc+pAggIn
200a0 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 30 20 29  fo->nColumn==0 )
200b0 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
200c0 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  }.  for(i=0; i<p
200d0 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e  AggInfo->nColumn
200e0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; i++){.    sqli
200f0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
20100 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 41 67   OP_Null, 0, pAg
20110 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e 69  gInfo->aCol[i].i
20120 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  Mem);.  }.  for(
20130 70 46 75 6e 63 3d 70 41 67 67 49 6e 66 6f 2d 3e  pFunc=pAggInfo->
20140 61 46 75 6e 63 2c 20 69 3d 30 3b 20 69 3c 70 41  aFunc, i=0; i<pA
20150 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69  ggInfo->nFunc; i
20160 2b 2b 2c 20 70 46 75 6e 63 2b 2b 29 7b 0a 20 20  ++, pFunc++){.  
20170 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
20180 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  Op2(v, OP_Null, 
20190 30 2c 20 70 46 75 6e 63 2d 3e 69 4d 65 6d 29 3b  0, pFunc->iMem);
201a0 0a 20 20 20 20 69 66 28 20 70 46 75 6e 63 2d 3e  .    if( pFunc->
201b0 69 44 69 73 74 69 6e 63 74 3e 3d 30 20 29 7b 0a  iDistinct>=0 ){.
201c0 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d        Expr *pE =
201d0 20 70 46 75 6e 63 2d 3e 70 45 78 70 72 3b 0a 20   pFunc->pExpr;. 
201e0 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
201f0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
20200 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
20210 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 2d  );.      if( pE-
20220 3e 78 2e 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70  >x.pList==0 || p
20230 45 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70  E->x.pList->nExp
20240 72 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  r!=1 ){.        
20250 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
20260 70 50 61 72 73 65 2c 20 22 44 49 53 54 49 4e 43  pParse, "DISTINC
20270 54 20 61 67 67 72 65 67 61 74 65 73 20 6d 75 73  T aggregates mus
20280 74 20 68 61 76 65 20 65 78 61 63 74 6c 79 20 6f  t have exactly o
20290 6e 65 20 22 0a 20 20 20 20 20 20 20 20 20 20 20  ne ".           
202a0 22 61 72 67 75 6d 65 6e 74 22 29 3b 0a 20 20 20  "argument");.   
202b0 20 20 20 20 20 70 46 75 6e 63 2d 3e 69 44 69 73       pFunc->iDis
202c0 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 20 20  tinct = -1;.    
202d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
202e0 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
202f0 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d  fo = keyInfoFrom
20300 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
20310 20 70 45 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20   pE->x.pList);. 
20320 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
20330 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f  beAddOp4(v, OP_O
20340 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70 46  penEphemeral, pF
20350 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74 2c 20  unc->iDistinct, 
20360 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  0, 0,.          
20370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20380 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c  (char*)pKeyInfo,
20390 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44   P4_KEYINFO_HAND
203a0 4f 46 46 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OFF);.      }.  
203b0 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
203c0 20 49 6e 76 6f 6b 65 20 74 68 65 20 4f 50 5f 41   Invoke the OP_A
203d0 67 67 46 69 6e 61 6c 69 7a 65 20 6f 70 63 6f 64  ggFinalize opcod
203e0 65 20 66 6f 72 20 65 76 65 72 79 20 61 67 67 72  e for every aggr
203f0 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 0a 2a  egate function.*
20400 2a 20 69 6e 20 74 68 65 20 41 67 67 49 6e 66 6f  * in the AggInfo
20410 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73   structure..*/.s
20420 74 61 74 69 63 20 76 6f 69 64 20 66 69 6e 61 6c  tatic void final
20430 69 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e 73 28  izeAggFunctions(
20440 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41  Parse *pParse, A
20450 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f  ggInfo *pAggInfo
20460 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
20470 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
20480 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
20490 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46  AggInfo_func *pF
204a0 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 3d  ;.  for(i=0, pF=
204b0 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b  pAggInfo->aFunc;
204c0 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75   i<pAggInfo->nFu
204d0 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a  nc; i++, pF++){.
204e0 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c      ExprList *pL
204f0 69 73 74 20 3d 20 70 46 2d 3e 70 45 78 70 72 2d  ist = pF->pExpr-
20500 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 61 73  >x.pList;.    as
20510 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
20520 6f 70 65 72 74 79 28 70 46 2d 3e 70 45 78 70 72  operty(pF->pExpr
20530 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
20540 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
20550 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 41  beAddOp4(v, OP_A
20560 67 67 46 69 6e 61 6c 2c 20 70 46 2d 3e 69 4d 65  ggFinal, pF->iMe
20570 6d 2c 20 70 4c 69 73 74 20 3f 20 70 4c 69 73 74  m, pList ? pList
20580 2d 3e 6e 45 78 70 72 20 3a 20 30 2c 20 30 2c 0a  ->nExpr : 0, 0,.
20590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
205a0 20 20 20 20 20 20 28 76 6f 69 64 2a 29 70 46 2d        (void*)pF-
205b0 3e 70 46 75 6e 63 2c 20 50 34 5f 46 55 4e 43 44  >pFunc, P4_FUNCD
205c0 45 46 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  EF);.  }.}../*.*
205d0 2a 20 55 70 64 61 74 65 20 74 68 65 20 61 63 63  * Update the acc
205e0 75 6d 75 6c 61 74 6f 72 20 6d 65 6d 6f 72 79 20  umulator memory 
205f0 63 65 6c 6c 73 20 66 6f 72 20 61 6e 20 61 67 67  cells for an agg
20600 72 65 67 61 74 65 20 62 61 73 65 64 20 6f 6e 0a  regate based on.
20610 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  ** the current c
20620 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2e 0a  ursor position..
20630 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75  */.static void u
20640 70 64 61 74 65 41 63 63 75 6d 75 6c 61 74 6f 72  pdateAccumulator
20650 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
20660 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66  AggInfo *pAggInf
20670 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  o){.  Vdbe *v = 
20680 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
20690 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 65   int i;.  int re
206a0 67 48 69 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20  gHit = 0;.  int 
206b0 61 64 64 72 48 69 74 54 65 73 74 20 3d 20 30 3b  addrHitTest = 0;
206c0 0a 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66  .  struct AggInf
206d0 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a 20 20 73 74  o_func *pF;.  st
206e0 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c  ruct AggInfo_col
206f0 20 2a 70 43 3b 0a 0a 20 20 70 41 67 67 49 6e 66   *pC;..  pAggInf
20700 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20 3d 20  o->directMode = 
20710 31 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  1;.  sqlite3Expr
20720 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73  CacheClear(pPars
20730 65 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70  e);.  for(i=0, p
20740 46 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e  F=pAggInfo->aFun
20750 63 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e  c; i<pAggInfo->n
20760 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29  Func; i++, pF++)
20770 7b 0a 20 20 20 20 69 6e 74 20 6e 41 72 67 3b 0a  {.    int nArg;.
20780 20 20 20 20 69 6e 74 20 61 64 64 72 4e 65 78 74      int addrNext
20790 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 72 65   = 0;.    int re
207a0 67 41 67 67 3b 0a 20 20 20 20 45 78 70 72 4c 69  gAgg;.    ExprLi
207b0 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 46 2d 3e  st *pList = pF->
207c0 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a  pExpr->x.pList;.
207d0 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
207e0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 46 2d  rHasProperty(pF-
207f0 3e 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  >pExpr, EP_xIsSe
20800 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 69 66 28  lect) );.    if(
20810 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20   pList ){.      
20820 6e 41 72 67 20 3d 20 70 4c 69 73 74 2d 3e 6e 45  nArg = pList->nE
20830 78 70 72 3b 0a 20 20 20 20 20 20 72 65 67 41 67  xpr;.      regAg
20840 67 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  g = sqlite3GetTe
20850 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
20860 6e 41 72 67 29 3b 0a 20 20 20 20 20 20 73 71 6c  nArg);.      sql
20870 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72  ite3ExprCodeExpr
20880 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 4c 69  List(pParse, pLi
20890 73 74 2c 20 72 65 67 41 67 67 2c 20 31 29 3b 0a  st, regAgg, 1);.
208a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
208b0 20 6e 41 72 67 20 3d 20 30 3b 0a 20 20 20 20 20   nArg = 0;.     
208c0 20 72 65 67 41 67 67 20 3d 20 30 3b 0a 20 20 20   regAgg = 0;.   
208d0 20 7d 0a 20 20 20 20 69 66 28 20 70 46 2d 3e 69   }.    if( pF->i
208e0 44 69 73 74 69 6e 63 74 3e 3d 30 20 29 7b 0a 20  Distinct>=0 ){. 
208f0 20 20 20 20 20 61 64 64 72 4e 65 78 74 20 3d 20       addrNext = 
20900 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
20910 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 61  abel(v);.      a
20920 73 73 65 72 74 28 20 6e 41 72 67 3d 3d 31 20 29  ssert( nArg==1 )
20930 3b 0a 20 20 20 20 20 20 63 6f 64 65 44 69 73 74  ;.      codeDist
20940 69 6e 63 74 28 70 50 61 72 73 65 2c 20 70 46 2d  inct(pParse, pF-
20950 3e 69 44 69 73 74 69 6e 63 74 2c 20 61 64 64 72  >iDistinct, addr
20960 4e 65 78 74 2c 20 31 2c 20 72 65 67 41 67 67 29  Next, 1, regAgg)
20970 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
20980 70 46 2d 3e 70 46 75 6e 63 2d 3e 66 6c 61 67 73  pF->pFunc->flags
20990 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e   & SQLITE_FUNC_N
209a0 45 45 44 43 4f 4c 4c 20 29 7b 0a 20 20 20 20 20  EEDCOLL ){.     
209b0 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20   CollSeq *pColl 
209c0 3d 20 30 3b 0a 20 20 20 20 20 20 73 74 72 75 63  = 0;.      struc
209d0 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
209e0 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 69 6e  *pItem;.      in
209f0 74 20 6a 3b 0a 20 20 20 20 20 20 61 73 73 65 72  t j;.      asser
20a00 74 28 20 70 4c 69 73 74 21 3d 30 20 29 3b 20 20  t( pList!=0 );  
20a10 2f 2a 20 70 4c 69 73 74 21 3d 30 20 69 66 20 70  /* pList!=0 if p
20a20 46 2d 3e 70 46 75 6e 63 20 68 61 73 20 4e 45 45  F->pFunc has NEE
20a30 44 43 4f 4c 4c 20 2a 2f 0a 20 20 20 20 20 20 66  DCOLL */.      f
20a40 6f 72 28 6a 3d 30 2c 20 70 49 74 65 6d 3d 70 4c  or(j=0, pItem=pL
20a50 69 73 74 2d 3e 61 3b 20 21 70 43 6f 6c 6c 20 26  ist->a; !pColl &
20a60 26 20 6a 3c 6e 41 72 67 3b 20 6a 2b 2b 2c 20 70  & j<nArg; j++, p
20a70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Item++){.       
20a80 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
20a90 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
20aa0 73 65 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72  se, pItem->pExpr
20ab0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
20ac0 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20   if( !pColl ){. 
20ad0 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 70         pColl = p
20ae0 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74  Parse->db->pDflt
20af0 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Coll;.      }.  
20b00 20 20 20 20 69 66 28 20 72 65 67 48 69 74 3d 3d      if( regHit==
20b10 30 20 26 26 20 70 41 67 67 49 6e 66 6f 2d 3e 6e  0 && pAggInfo->n
20b20 41 63 63 75 6d 75 6c 61 74 6f 72 20 29 20 72 65  Accumulator ) re
20b30 67 48 69 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d  gHit = ++pParse-
20b40 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c  >nMem;.      sql
20b50 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
20b60 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20 72 65  , OP_CollSeq, re
20b70 67 48 69 74 2c 20 30 2c 20 30 2c 20 28 63 68 61  gHit, 0, 0, (cha
20b80 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f  r *)pColl, P4_CO
20b90 4c 4c 53 45 51 29 3b 0a 20 20 20 20 7d 0a 20 20  LLSEQ);.    }.  
20ba0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
20bb0 4f 70 34 28 76 2c 20 4f 50 5f 41 67 67 53 74 65  Op4(v, OP_AggSte
20bc0 70 2c 20 30 2c 20 72 65 67 41 67 67 2c 20 70 46  p, 0, regAgg, pF
20bd0 2d 3e 69 4d 65 6d 2c 0a 20 20 20 20 20 20 20 20  ->iMem,.        
20be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 76                (v
20bf0 6f 69 64 2a 29 70 46 2d 3e 70 46 75 6e 63 2c 20  oid*)pF->pFunc, 
20c00 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 20  P4_FUNCDEF);.   
20c10 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
20c20 67 65 50 35 28 76 2c 20 28 75 38 29 6e 41 72 67  geP5(v, (u8)nArg
20c30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
20c40 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43  prCacheAffinityC
20c50 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65  hange(pParse, re
20c60 67 41 67 67 2c 20 6e 41 72 67 29 3b 0a 20 20 20  gAgg, nArg);.   
20c70 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
20c80 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
20c90 20 72 65 67 41 67 67 2c 20 6e 41 72 67 29 3b 0a   regAgg, nArg);.
20ca0 20 20 20 20 69 66 28 20 61 64 64 72 4e 65 78 74      if( addrNext
20cb0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
20cc0 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
20cd0 6c 28 76 2c 20 61 64 64 72 4e 65 78 74 29 3b 0a  l(v, addrNext);.
20ce0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
20cf0 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72  rCacheClear(pPar
20d00 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  se);.    }.  }..
20d10 20 20 2f 2a 20 42 65 66 6f 72 65 20 70 6f 70 75    /* Before popu
20d20 6c 61 74 69 6e 67 20 74 68 65 20 61 63 63 75 6d  lating the accum
20d30 75 6c 61 74 6f 72 20 72 65 67 69 73 74 65 72 73  ulator registers
20d40 2c 20 63 6c 65 61 72 20 74 68 65 20 63 6f 6c 75  , clear the colu
20d50 6d 6e 20 63 61 63 68 65 2e 0a 20 20 2a 2a 20 4f  mn cache..  ** O
20d60 74 68 65 72 77 69 73 65 2c 20 69 66 20 61 6e 79  therwise, if any
20d70 20 6f 66 20 74 68 65 20 72 65 71 75 69 72 65 64   of the required
20d80 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 73 20 61   column values a
20d90 72 65 20 61 6c 72 65 61 64 79 20 70 72 65 73 65  re already prese
20da0 6e 74 20 0a 20 20 2a 2a 20 69 6e 20 72 65 67 69  nt .  ** in regi
20db0 73 74 65 72 73 2c 20 73 71 6c 69 74 65 33 45 78  sters, sqlite3Ex
20dc0 70 72 43 6f 64 65 28 29 20 6d 61 79 20 75 73 65  prCode() may use
20dd0 20 4f 50 5f 53 43 6f 70 79 20 74 6f 20 63 6f 70   OP_SCopy to cop
20de0 79 20 74 68 65 20 76 61 6c 75 65 0a 20 20 2a 2a  y the value.  **
20df0 20 74 6f 20 70 43 2d 3e 69 4d 65 6d 2e 20 42 75   to pC->iMem. Bu
20e00 74 20 62 79 20 74 68 65 20 74 69 6d 65 20 74 68  t by the time th
20e10 65 20 76 61 6c 75 65 20 69 73 20 75 73 65 64 2c  e value is used,
20e20 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 72 65   the original re
20e30 67 69 73 74 65 72 0a 20 20 2a 2a 20 6d 61 79 20  gister.  ** may 
20e40 68 61 76 65 20 62 65 65 6e 20 75 73 65 64 2c 20  have been used, 
20e50 69 6e 76 61 6c 69 64 61 74 69 6e 67 20 74 68 65  invalidating the
20e60 20 75 6e 64 65 72 6c 79 69 6e 67 20 62 75 66 66   underlying buff
20e70 65 72 20 68 6f 6c 64 69 6e 67 20 74 68 65 0a 20  er holding the. 
20e80 20 2a 2a 20 74 65 78 74 20 6f 72 20 62 6c 6f 62   ** text or blob
20e90 20 76 61 6c 75 65 2e 20 53 65 65 20 74 69 63 6b   value. See tick
20ea0 65 74 20 5b 38 38 33 30 33 34 64 63 62 35 5d 2e  et [883034dcb5].
20eb0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 6f 74 68  .  **.  ** Anoth
20ec0 65 72 20 73 6f 6c 75 74 69 6f 6e 20 77 6f 75 6c  er solution woul
20ed0 64 20 62 65 20 74 6f 20 63 68 61 6e 67 65 20 74  d be to change t
20ee0 68 65 20 4f 50 5f 53 43 6f 70 79 20 75 73 65 64  he OP_SCopy used
20ef0 20 74 6f 20 63 6f 70 79 20 63 61 63 68 65 64 0a   to copy cached.
20f00 20 20 2a 2a 20 76 61 6c 75 65 73 20 74 6f 20 61    ** values to a
20f10 6e 20 4f 50 5f 43 6f 70 79 2e 0a 20 20 2a 2f 0a  n OP_Copy..  */.
20f20 20 20 69 66 28 20 72 65 67 48 69 74 20 29 7b 0a    if( regHit ){.
20f30 20 20 20 20 61 64 64 72 48 69 74 54 65 73 74 20      addrHitTest 
20f40 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
20f50 4f 70 31 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65  Op1(v, OP_If, re
20f60 67 48 69 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  gHit);.  }.  sql
20f70 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65  ite3ExprCacheCle
20f80 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 66 6f  ar(pParse);.  fo
20f90 72 28 69 3d 30 2c 20 70 43 3d 70 41 67 67 49 6e  r(i=0, pC=pAggIn
20fa0 66 6f 2d 3e 61 43 6f 6c 3b 20 69 3c 70 41 67 67  fo->aCol; i<pAgg
20fb0 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61 74  Info->nAccumulat
20fc0 6f 72 3b 20 69 2b 2b 2c 20 70 43 2b 2b 29 7b 0a  or; i++, pC++){.
20fd0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
20fe0 6f 64 65 28 70 50 61 72 73 65 2c 20 70 43 2d 3e  ode(pParse, pC->
20ff0 70 45 78 70 72 2c 20 70 43 2d 3e 69 4d 65 6d 29  pExpr, pC->iMem)
21000 3b 0a 20 20 7d 0a 20 20 70 41 67 67 49 6e 66 6f  ;.  }.  pAggInfo
21010 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20 3d 20 30  ->directMode = 0
21020 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43  ;.  sqlite3ExprC
21030 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65  acheClear(pParse
21040 29 3b 0a 20 20 69 66 28 20 61 64 64 72 48 69 74  );.  if( addrHit
21050 54 65 73 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  Test ){.    sqli
21060 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
21070 76 2c 20 61 64 64 72 48 69 74 54 65 73 74 29 3b  v, addrHitTest);
21080 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  .  }.}../*.** Ad
21090 64 20 61 20 73 69 6e 67 6c 65 20 4f 50 5f 45 78  d a single OP_Ex
210a0 70 6c 61 69 6e 20 69 6e 73 74 72 75 63 74 69 6f  plain instructio
210b0 6e 20 74 6f 20 74 68 65 20 56 44 42 45 20 74 6f  n to the VDBE to
210c0 20 65 78 70 6c 61 69 6e 20 61 20 73 69 6d 70 6c   explain a simpl
210d0 65 0a 2a 2a 20 63 6f 75 6e 74 28 2a 29 20 71 75  e.** count(*) qu
210e0 65 72 79 20 28 22 53 45 4c 45 43 54 20 63 6f 75  ery ("SELECT cou
210f0 6e 74 28 2a 29 20 46 52 4f 4d 20 70 54 61 62 22  nt(*) FROM pTab"
21100 29 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  )..*/.#ifndef SQ
21110 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
21120 4e 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78  N.static void ex
21130 70 6c 61 69 6e 53 69 6d 70 6c 65 43 6f 75 6e 74  plainSimpleCount
21140 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
21150 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
21160 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e      /* Parse con
21170 74 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20  text */.  Table 
21180 2a 70 54 61 62 2c 20 20 20 20 20 20 20 20 20 20  *pTab,          
21190 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62            /* Tab
211a0 6c 65 20 62 65 69 6e 67 20 71 75 65 72 69 65 64  le being queried
211b0 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64   */.  Index *pId
211c0 78 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x               
211d0 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 75        /* Index u
211e0 73 65 64 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20  sed to optimize 
211f0 73 63 61 6e 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f  scan, or NULL */
21200 0a 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65  .){.  if( pParse
21210 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a  ->explain==2 ){.
21220 20 20 20 20 63 68 61 72 20 2a 7a 45 71 70 20 3d      char *zEqp =
21230 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
21240 70 50 61 72 73 65 2d 3e 64 62 2c 20 22 53 43 41  pParse->db, "SCA
21250 4e 20 54 41 42 4c 45 20 25 73 20 25 73 25 73 28  N TABLE %s %s%s(
21260 7e 25 64 20 72 6f 77 73 29 22 2c 0a 20 20 20 20  ~%d rows)",.    
21270 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c      pTab->zName,
21280 20 0a 20 20 20 20 20 20 20 20 70 49 64 78 20 3f   .        pIdx ?
21290 20 22 55 53 49 4e 47 20 43 4f 56 45 52 49 4e 47   "USING COVERING
212a0 20 49 4e 44 45 58 20 22 20 3a 20 22 22 2c 0a 20   INDEX " : "",. 
212b0 20 20 20 20 20 20 20 70 49 64 78 20 3f 20 70 49         pIdx ? pI
212c0 64 78 2d 3e 7a 4e 61 6d 65 20 3a 20 22 22 2c 0a  dx->zName : "",.
212d0 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 52          pTab->nR
212e0 6f 77 45 73 74 0a 20 20 20 20 29 3b 0a 20 20 20  owEst.    );.   
212f0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
21300 70 34 28 0a 20 20 20 20 20 20 20 20 70 50 61 72  p4(.        pPar
21310 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 45 78  se->pVdbe, OP_Ex
21320 70 6c 61 69 6e 2c 20 70 50 61 72 73 65 2d 3e 69  plain, pParse->i
21330 53 65 6c 65 63 74 49 64 2c 20 30 2c 20 30 2c 20  SelectId, 0, 0, 
21340 7a 45 71 70 2c 20 50 34 5f 44 59 4e 41 4d 49 43  zEqp, P4_DYNAMIC
21350 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65  .    );.  }.}.#e
21360 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 65 78 70  lse.# define exp
21370 6c 61 69 6e 53 69 6d 70 6c 65 43 6f 75 6e 74 28  lainSimpleCount(
21380 61 2c 62 2c 63 29 0a 23 65 6e 64 69 66 0a 0a 2f  a,b,c).#endif../
21390 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
213a0 64 65 20 66 6f 72 20 74 68 65 20 53 45 4c 45 43  de for the SELEC
213b0 54 20 73 74 61 74 65 6d 65 6e 74 20 67 69 76 65  T statement give
213c0 6e 20 69 6e 20 74 68 65 20 70 20 61 72 67 75 6d  n in the p argum
213d0 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65  ent.  .**.** The
213e0 20 72 65 73 75 6c 74 73 20 61 72 65 20 64 69 73   results are dis
213f0 74 72 69 62 75 74 65 64 20 69 6e 20 76 61 72 69  tributed in vari
21400 6f 75 73 20 77 61 79 73 20 64 65 70 65 6e 64 69  ous ways dependi
21410 6e 67 20 6f 6e 20 74 68 65 0a 2a 2a 20 63 6f 6e  ng on the.** con
21420 74 65 6e 74 73 20 6f 66 20 74 68 65 20 53 65 6c  tents of the Sel
21430 65 63 74 44 65 73 74 20 73 74 72 75 63 74 75 72  ectDest structur
21440 65 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  e pointed to by 
21450 61 72 67 75 6d 65 6e 74 20 70 44 65 73 74 0a 2a  argument pDest.*
21460 2a 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  * as follows:.**
21470 0a 2a 2a 20 20 20 20 20 70 44 65 73 74 2d 3e 65  .**     pDest->e
21480 44 65 73 74 20 20 20 20 52 65 73 75 6c 74 0a 2a  Dest    Result.*
21490 2a 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *     ----------
214a0 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  --    ----------
214b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
214c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
214d0 2d 0a 2a 2a 20 20 20 20 20 53 52 54 5f 4f 75 74  -.**     SRT_Out
214e0 70 75 74 20 20 20 20 20 20 47 65 6e 65 72 61 74  put      Generat
214f0 65 20 61 20 72 6f 77 20 6f 66 20 6f 75 74 70 75  e a row of outpu
21500 74 20 28 75 73 69 6e 67 20 74 68 65 20 4f 50 5f  t (using the OP_
21510 52 65 73 75 6c 74 52 6f 77 0a 2a 2a 20 20 20 20  ResultRow.**    
21520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21530 20 6f 70 63 6f 64 65 29 20 66 6f 72 20 65 61 63   opcode) for eac
21540 68 20 72 6f 77 20 69 6e 20 74 68 65 20 72 65 73  h row in the res
21550 75 6c 74 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 20  ult set..**.**  
21560 20 20 20 53 52 54 5f 4d 65 6d 20 20 20 20 20 20     SRT_Mem      
21570 20 20 20 4f 6e 6c 79 20 76 61 6c 69 64 20 69 66     Only valid if
21580 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 61   the result is a
21590 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 2e 0a   single column..
215a0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
215b0 20 20 20 20 20 20 20 53 74 6f 72 65 20 74 68 65         Store the
215c0 20 66 69 72 73 74 20 63 6f 6c 75 6d 6e 20 6f 66   first column of
215d0 20 74 68 65 20 66 69 72 73 74 20 72 65 73 75 6c   the first resul
215e0 74 20 72 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20  t row.**        
215f0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 20               in 
21600 72 65 67 69 73 74 65 72 20 70 44 65 73 74 2d 3e  register pDest->
21610 69 53 44 50 61 72 6d 20 74 68 65 6e 20 61 62 61  iSDParm then aba
21620 6e 64 6f 6e 20 74 68 65 20 72 65 73 74 0a 2a 2a  ndon the rest.**
21630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21640 20 20 20 20 20 6f 66 20 74 68 65 20 71 75 65 72       of the quer
21650 79 2e 20 20 54 68 69 73 20 64 65 73 74 69 6e 61  y.  This destina
21660 74 69 6f 6e 20 69 6d 70 6c 69 65 73 20 22 4c 49  tion implies "LI
21670 4d 49 54 20 31 22 2e 0a 2a 2a 0a 2a 2a 20 20 20  MIT 1"..**.**   
21680 20 20 53 52 54 5f 53 65 74 20 20 20 20 20 20 20    SRT_Set       
21690 20 20 54 68 65 20 72 65 73 75 6c 74 20 6d 75 73    The result mus
216a0 74 20 62 65 20 61 20 73 69 6e 67 6c 65 20 63 6f  t be a single co
216b0 6c 75 6d 6e 2e 20 20 53 74 6f 72 65 20 65 61 63  lumn.  Store eac
216c0 68 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  h.**            
216d0 20 20 20 20 20 20 20 20 20 72 6f 77 20 6f 66 20           row of 
216e0 72 65 73 75 6c 74 20 61 73 20 74 68 65 20 6b 65  result as the ke
216f0 79 20 69 6e 20 74 61 62 6c 65 20 70 44 65 73 74  y in table pDest
21700 2d 3e 69 53 44 50 61 72 6d 2e 20 0a 2a 2a 20 20  ->iSDParm. .**  
21710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21720 20 20 20 41 70 70 6c 79 20 74 68 65 20 61 66 66     Apply the aff
21730 69 6e 69 74 79 20 70 44 65 73 74 2d 3e 61 66 66  inity pDest->aff
21740 53 64 73 74 20 62 65 66 6f 72 65 20 73 74 6f 72  Sdst before stor
21750 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ing.**          
21760 20 20 20 20 20 20 20 20 20 20 20 72 65 73 75 6c             resul
21770 74 73 2e 20 20 55 73 65 64 20 74 6f 20 69 6d 70  ts.  Used to imp
21780 6c 65 6d 65 6e 74 20 22 49 4e 20 28 53 45 4c 45  lement "IN (SELE
21790 43 54 20 2e 2e 2e 29 22 2e 0a 2a 2a 0a 2a 2a 20  CT ...)"..**.** 
217a0 20 20 20 20 53 52 54 5f 55 6e 69 6f 6e 20 20 20      SRT_Union   
217b0 20 20 20 20 53 74 6f 72 65 20 72 65 73 75 6c 74      Store result
217c0 73 20 61 73 20 61 20 6b 65 79 20 69 6e 20 61 20  s as a key in a 
217d0 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
217e0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
217f0 20 20 20 20 20 20 20 20 69 64 65 6e 74 69 66 69          identifi
21800 65 64 20 62 79 20 70 44 65 73 74 2d 3e 69 53 44  ed by pDest->iSD
21810 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  Parm..**.**     
21820 53 52 54 5f 45 78 63 65 70 74 20 20 20 20 20 20  SRT_Except      
21830 52 65 6d 6f 76 65 20 72 65 73 75 6c 74 73 20 66  Remove results f
21840 72 6f 6d 20 74 68 65 20 74 65 6d 70 6f 72 61 72  rom the temporar
21850 79 20 74 61 62 6c 65 20 70 44 65 73 74 2d 3e 69  y table pDest->i
21860 53 44 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20  SDParm..**.**   
21870 20 20 53 52 54 5f 54 61 62 6c 65 20 20 20 20 20    SRT_Table     
21880 20 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20    Store results 
21890 69 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  in temporary tab
218a0 6c 65 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72  le pDest->iSDPar
218b0 6d 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  m..**           
218c0 20 20 20 20 20 20 20 20 20 20 54 68 69 73 20 69            This i
218d0 73 20 6c 69 6b 65 20 53 52 54 5f 45 70 68 65 6d  s like SRT_Ephem
218e0 54 61 62 20 65 78 63 65 70 74 20 74 68 61 74 20  Tab except that 
218f0 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20 20 20 20  the table.**    
21900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21910 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20 61   is assumed to a
21920 6c 72 65 61 64 79 20 62 65 20 6f 70 65 6e 2e 0a  lready be open..
21930 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 45 70  **.**     SRT_Ep
21940 68 65 6d 54 61 62 20 20 20 20 43 72 65 61 74 65  hemTab    Create
21950 20 61 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61   an temporary ta
21960 62 6c 65 20 70 44 65 73 74 2d 3e 69 53 44 50 61  ble pDest->iSDPa
21970 72 6d 20 61 6e 64 20 73 74 6f 72 65 0a 2a 2a 20  rm and store.** 
21980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21990 20 20 20 20 74 68 65 20 72 65 73 75 6c 74 20 74      the result t
219a0 68 65 72 65 2e 20 54 68 65 20 63 75 72 73 6f 72  here. The cursor
219b0 20 69 73 20 6c 65 66 74 20 6f 70 65 6e 20 61 66   is left open af
219c0 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ter.**          
219d0 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
219e0 6e 69 6e 67 2e 20 20 54 68 69 73 20 69 73 20 6c  ning.  This is l
219f0 69 6b 65 20 53 52 54 5f 54 61 62 6c 65 20 65 78  ike SRT_Table ex
21a00 63 65 70 74 20 74 68 61 74 0a 2a 2a 20 20 20 20  cept that.**    
21a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a20 20 74 68 69 73 20 64 65 73 74 69 6e 61 74 69 6f   this destinatio
21a30 6e 20 75 73 65 73 20 4f 50 5f 4f 70 65 6e 45 70  n uses OP_OpenEp
21a40 68 65 6d 65 72 61 6c 20 74 6f 20 63 72 65 61 74  hemeral to creat
21a50 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
21a60 20 20 20 20 20 20 20 20 20 74 68 65 20 74 61 62           the tab
21a70 6c 65 20 66 69 72 73 74 2e 0a 2a 2a 0a 2a 2a 20  le first..**.** 
21a80 20 20 20 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e      SRT_Coroutin
21a90 65 20 20 20 47 65 6e 65 72 61 74 65 20 61 20 63  e   Generate a c
21aa0 6f 2d 72 6f 75 74 69 6e 65 20 74 68 61 74 20 72  o-routine that r
21ab0 65 74 75 72 6e 73 20 61 20 6e 65 77 20 72 6f 77  eturns a new row
21ac0 20 6f 66 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   of.**          
21ad0 20 20 20 20 20 20 20 20 20 20 20 72 65 73 75 6c             resul
21ae0 74 73 20 65 61 63 68 20 74 69 6d 65 20 69 74 20  ts each time it 
21af0 69 73 20 69 6e 76 6f 6b 65 64 2e 20 20 54 68 65  is invoked.  The
21b00 20 65 6e 74 72 79 20 70 6f 69 6e 74 0a 2a 2a 20   entry point.** 
21b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21b20 20 20 20 20 6f 66 20 74 68 65 20 63 6f 2d 72 6f      of the co-ro
21b30 75 74 69 6e 65 20 69 73 20 73 74 6f 72 65 64 20  utine is stored 
21b40 69 6e 20 72 65 67 69 73 74 65 72 20 70 44 65 73  in register pDes
21b50 74 2d 3e 69 53 44 50 61 72 6d 2e 0a 2a 2a 0a 2a  t->iSDParm..**.*
21b60 2a 20 20 20 20 20 53 52 54 5f 45 78 69 73 74 73  *     SRT_Exists
21b70 20 20 20 20 20 20 53 74 6f 72 65 20 61 20 31 20        Store a 1 
21b80 69 6e 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 70  in memory cell p
21b90 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 20 69 66  Dest->iSDParm if
21ba0 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 20   the result.**  
21bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21bc0 20 20 20 73 65 74 20 69 73 20 6e 6f 74 20 65 6d     set is not em
21bd0 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  pty..**.**     S
21be0 52 54 5f 44 69 73 63 61 72 64 20 20 20 20 20 54  RT_Discard     T
21bf0 68 72 6f 77 20 74 68 65 20 72 65 73 75 6c 74 73  hrow the results
21c00 20 61 77 61 79 2e 20 20 54 68 69 73 20 69 73 20   away.  This is 
21c10 75 73 65 64 20 62 79 20 53 45 4c 45 43 54 0a 2a  used by SELECT.*
21c20 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
21c30 20 20 20 20 20 20 73 74 61 74 65 6d 65 6e 74 73        statements
21c40 20 77 69 74 68 69 6e 20 74 72 69 67 67 65 72 73   within triggers
21c50 20 77 68 6f 73 65 20 6f 6e 6c 79 20 70 75 72 70   whose only purp
21c60 6f 73 65 20 69 73 0a 2a 2a 20 20 20 20 20 20 20  ose is.**       
21c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68                th
21c80 65 20 73 69 64 65 2d 65 66 66 65 63 74 73 20 6f  e side-effects o
21c90 66 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2a 0a  f functions..**.
21ca0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
21cb0 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62  returns the numb
21cc0 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 49  er of errors.  I
21cd0 66 20 61 6e 79 20 65 72 72 6f 72 73 20 61 72 65  f any errors are
21ce0 0a 2a 2a 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c  .** encountered,
21cf0 20 74 68 65 6e 20 61 6e 20 61 70 70 72 6f 70 72   then an appropr
21d00 69 61 74 65 20 65 72 72 6f 72 20 6d 65 73 73 61  iate error messa
21d10 67 65 20 69 73 20 6c 65 66 74 20 69 6e 0a 2a 2a  ge is left in.**
21d20 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67   pParse->zErrMsg
21d30 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
21d40 74 69 6e 65 20 64 6f 65 73 20 4e 4f 54 20 66 72  tine does NOT fr
21d50 65 65 20 74 68 65 20 53 65 6c 65 63 74 20 73 74  ee the Select st
21d60 72 75 63 74 75 72 65 20 70 61 73 73 65 64 20 69  ructure passed i
21d70 6e 2e 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 69  n.  The.** calli
21d80 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6e 65 65 64  ng function need
21d90 73 20 74 6f 20 64 6f 20 74 68 61 74 2e 0a 2a 2f  s to do that..*/
21da0 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 65 6c 65  .int sqlite3Sele
21db0 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ct(.  Parse *pPa
21dc0 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  rse,         /* 
21dd0 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65  The parser conte
21de0 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  xt */.  Select *
21df0 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  p,             /
21e00 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61  * The SELECT sta
21e10 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64  tement being cod
21e20 65 64 2e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  ed. */.  SelectD
21e30 65 73 74 20 2a 70 44 65 73 74 20 20 20 20 20 20  est *pDest      
21e40 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69  /* What to do wi
21e50 74 68 20 74 68 65 20 71 75 65 72 79 20 72 65 73  th the query res
21e60 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ults */.){.  int
21e70 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20   i, j;          
21e80 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
21e90 74 65 72 73 20 2a 2f 0a 20 20 57 68 65 72 65 49  ters */.  WhereI
21ea0 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20  nfo *pWInfo;    
21eb0 20 2f 2a 20 52 65 74 75 72 6e 20 66 72 6f 6d 20   /* Return from 
21ec0 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
21ed0 6e 28 29 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  n() */.  Vdbe *v
21ee0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
21ef0 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20 6d  /* The virtual m
21f00 61 63 68 69 6e 65 20 75 6e 64 65 72 20 63 6f 6e  achine under con
21f10 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69  struction */.  i
21f20 6e 74 20 69 73 41 67 67 3b 20 20 20 20 20 20 20  nt isAgg;       
21f30 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
21f40 72 20 73 65 6c 65 63 74 20 6c 69 73 74 73 20 6c  r select lists l
21f50 69 6b 65 20 22 63 6f 75 6e 74 28 2a 29 22 20 2a  ike "count(*)" *
21f60 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  /.  ExprList *pE
21f70 4c 69 73 74 3b 20 20 20 20 20 20 2f 2a 20 4c 69  List;      /* Li
21f80 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f  st of columns to
21f90 20 65 78 74 72 61 63 74 2e 20 2a 2f 0a 20 20 53   extract. */.  S
21fa0 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
21fb0 3b 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66  ;     /* List of
21fc0 20 74 61 62 6c 65 73 20 74 6f 20 73 65 6c 65 63   tables to selec
21fd0 74 20 66 72 6f 6d 20 2a 2f 0a 20 20 45 78 70 72  t from */.  Expr
21fe0 20 2a 70 57 68 65 72 65 3b 20 20 20 20 20 20 20   *pWhere;       
21ff0 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
22000 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20  clause.  May be 
22010 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69  NULL */.  ExprLi
22020 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 20  st *pOrderBy;   
22030 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59   /* The ORDER BY
22040 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65   clause.  May be
22050 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c   NULL */.  ExprL
22060 69 73 74 20 2a 70 47 72 6f 75 70 42 79 3b 20 20  ist *pGroupBy;  
22070 20 20 2f 2a 20 54 68 65 20 47 52 4f 55 50 20 42    /* The GROUP B
22080 59 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62  Y clause.  May b
22090 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72  e NULL */.  Expr
220a0 20 2a 70 48 61 76 69 6e 67 3b 20 20 20 20 20 20   *pHaving;      
220b0 20 20 20 2f 2a 20 54 68 65 20 48 41 56 49 4e 47     /* The HAVING
220c0 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65   clause.  May be
220d0 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 72   NULL */.  int r
220e0 63 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20  c = 1;          
220f0 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72 65    /* Value to re
22100 74 75 72 6e 20 66 72 6f 6d 20 74 68 69 73 20 66  turn from this f
22110 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  unction */.  int
22120 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78 3b 20   addrSortIndex; 
22130 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
22140 66 20 61 6e 20 4f 50 5f 4f 70 65 6e 45 70 68 65  f an OP_OpenEphe
22150 6d 65 72 61 6c 20 69 6e 73 74 72 75 63 74 69 6f  meral instructio
22160 6e 20 2a 2f 0a 20 20 44 69 73 74 69 6e 63 74 43  n */.  DistinctC
22170 74 78 20 73 44 69 73 74 69 6e 63 74 3b 20 2f 2a  tx sDistinct; /*
22180 20 49 6e 66 6f 20 6f 6e 20 68 6f 77 20 74 6f 20   Info on how to 
22190 63 6f 64 65 20 74 68 65 20 44 49 53 54 49 4e 43  code the DISTINC
221a0 54 20 6b 65 79 77 6f 72 64 20 2a 2f 0a 20 20 41  T keyword */.  A
221b0 67 67 49 6e 66 6f 20 73 41 67 67 49 6e 66 6f 3b  ggInfo sAggInfo;
221c0 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61        /* Informa
221d0 74 69 6f 6e 20 75 73 65 64 20 62 79 20 61 67 67  tion used by agg
221e0 72 65 67 61 74 65 20 71 75 65 72 69 65 73 20 2a  regate queries *
221f0 2f 0a 20 20 69 6e 74 20 69 45 6e 64 3b 20 20 20  /.  int iEnd;   
22200 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
22210 64 72 65 73 73 20 6f 66 20 74 68 65 20 65 6e 64  dress of the end
22220 20 6f 66 20 74 68 65 20 71 75 65 72 79 20 2a 2f   of the query */
22230 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20  .  sqlite3 *db; 
22240 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
22250 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
22260 74 69 6f 6e 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  tion */..#ifndef
22270 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50   SQLITE_OMIT_EXP
22280 4c 41 49 4e 0a 20 20 69 6e 74 20 69 52 65 73 74  LAIN.  int iRest
22290 6f 72 65 53 65 6c 65 63 74 49 64 20 3d 20 70 50  oreSelectId = pP
222a0 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 3b  arse->iSelectId;
222b0 0a 20 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65  .  pParse->iSele
222c0 63 74 49 64 20 3d 20 70 50 61 72 73 65 2d 3e 69  ctId = pParse->i
222d0 4e 65 78 74 53 65 6c 65 63 74 49 64 2b 2b 3b 0a  NextSelectId++;.
222e0 23 65 6e 64 69 66 0a 0a 20 20 64 62 20 3d 20 70  #endif..  db = p
222f0 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28  Parse->db;.  if(
22300 20 70 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c   p==0 || db->mal
22310 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70 50 61  locFailed || pPa
22320 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20  rse->nErr ){.   
22330 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
22340 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
22350 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
22360 4c 49 54 45 5f 53 45 4c 45 43 54 2c 20 30 2c 20  LITE_SELECT, 0, 
22370 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e 20 31  0, 0) ) return 1
22380 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 41 67 67  ;.  memset(&sAgg
22390 49 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Info, 0, sizeof(
223a0 73 41 67 67 49 6e 66 6f 29 29 3b 0a 0a 20 20 69  sAggInfo));..  i
223b0 66 28 20 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65  f( IgnorableOrde
223c0 72 62 79 28 70 44 65 73 74 29 20 29 7b 0a 20 20  rby(pDest) ){.  
223d0 20 20 61 73 73 65 72 74 28 70 44 65 73 74 2d 3e    assert(pDest->
223e0 65 44 65 73 74 3d 3d 53 52 54 5f 45 78 69 73 74  eDest==SRT_Exist
223f0 73 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73  s || pDest->eDes
22400 74 3d 3d 53 52 54 5f 55 6e 69 6f 6e 20 7c 7c 20  t==SRT_Union || 
22410 0a 20 20 20 20 20 20 20 20 20 20 20 70 44 65 73  .           pDes
22420 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45 78  t->eDest==SRT_Ex
22430 63 65 70 74 20 7c 7c 20 70 44 65 73 74 2d 3e 65  cept || pDest->e
22440 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 63 61 72  Dest==SRT_Discar
22450 64 29 3b 0a 20 20 20 20 2f 2a 20 49 66 20 4f 52  d);.    /* If OR
22460 44 45 52 20 42 59 20 6d 61 6b 65 73 20 6e 6f 20  DER BY makes no 
22470 64 69 66 66 65 72 65 6e 63 65 20 69 6e 20 74 68  difference in th
22480 65 20 6f 75 74 70 75 74 20 74 68 65 6e 20 6e 65  e output then ne
22490 69 74 68 65 72 20 64 6f 65 73 0a 20 20 20 20 2a  ither does.    *
224a0 2a 20 44 49 53 54 49 4e 43 54 20 73 6f 20 69 74  * DISTINCT so it
224b0 20 63 61 6e 20 62 65 20 72 65 6d 6f 76 65 64 20   can be removed 
224c0 74 6f 6f 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69  too. */.    sqli
224d0 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
224e0 65 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42  e(db, p->pOrderB
224f0 79 29 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65  y);.    p->pOrde
22500 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e  rBy = 0;.    p->
22510 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f  selFlags &= ~SF_
22520 44 69 73 74 69 6e 63 74 3b 0a 20 20 7d 0a 20 20  Distinct;.  }.  
22530 73 71 6c 69 74 65 33 53 65 6c 65 63 74 50 72 65  sqlite3SelectPre
22540 70 28 70 50 61 72 73 65 2c 20 70 2c 20 30 29 3b  p(pParse, p, 0);
22550 0a 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d  .  pOrderBy = p-
22560 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 70 54 61  >pOrderBy;.  pTa
22570 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b  bList = p->pSrc;
22580 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70  .  pEList = p->p
22590 45 4c 69 73 74 3b 0a 20 20 69 66 28 20 70 50 61  EList;.  if( pPa
225a0 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d  rse->nErr || db-
225b0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
225c0 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74  .    goto select
225d0 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 69 73 41 67  _end;.  }.  isAg
225e0 67 20 3d 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73  g = (p->selFlags
225f0 20 26 20 53 46 5f 41 67 67 72 65 67 61 74 65 29   & SF_Aggregate)
22600 21 3d 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70  !=0;.  assert( p
22610 45 4c 69 73 74 21 3d 30 20 29 3b 0a 0a 20 20 2f  EList!=0 );..  /
22620 2a 20 42 65 67 69 6e 20 67 65 6e 65 72 61 74 69  * Begin generati
22630 6e 67 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20  ng code..  */.  
22640 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
22650 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
22660 28 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65  ( v==0 ) goto se
22670 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20  lect_end;..  /* 
22680 49 66 20 77 72 69 74 69 6e 67 20 74 6f 20 6d 65  If writing to me
22690 6d 6f 72 79 20 6f 72 20 67 65 6e 65 72 61 74 69  mory or generati
226a0 6e 67 20 61 20 73 65 74 0a 20 20 2a 2a 20 6f 6e  ng a set.  ** on
226b0 6c 79 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75  ly a single colu
226c0 6d 6e 20 6d 61 79 20 62 65 20 6f 75 74 70 75 74  mn may be output
226d0 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ..  */.#ifndef S
226e0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
226f0 45 52 59 0a 20 20 69 66 28 20 63 68 65 63 6b 46  ERY.  if( checkF
22700 6f 72 4d 75 6c 74 69 43 6f 6c 75 6d 6e 53 65 6c  orMultiColumnSel
22710 65 63 74 45 72 72 6f 72 28 70 50 61 72 73 65 2c  ectError(pParse,
22720 20 70 44 65 73 74 2c 20 70 45 4c 69 73 74 2d 3e   pDest, pEList->
22730 6e 45 78 70 72 29 20 29 7b 0a 20 20 20 20 67 6f  nExpr) ){.    go
22740 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
22750 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
22760 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
22770 72 20 61 6c 6c 20 73 75 62 2d 71 75 65 72 69 65  r all sub-querie
22780 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  s in the FROM cl
22790 61 75 73 65 0a 20 20 2a 2f 0a 23 69 66 20 21 64  ause.  */.#if !d
227a0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
227b0 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20  IT_SUBQUERY) || 
227c0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
227d0 4f 4d 49 54 5f 56 49 45 57 29 0a 20 20 66 6f 72  OMIT_VIEW).  for
227e0 28 69 3d 30 3b 20 21 70 2d 3e 70 50 72 69 6f 72  (i=0; !p->pPrior
227f0 20 26 26 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e   && i<pTabList->
22800 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nSrc; i++){.    
22810 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
22820 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 54  tem *pItem = &pT
22830 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 3b 0a 20 20  abList->a[i];.  
22840 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73    SelectDest des
22850 74 3b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70  t;.    Select *p
22860 53 75 62 20 3d 20 70 49 74 65 6d 2d 3e 70 53 65  Sub = pItem->pSe
22870 6c 65 63 74 3b 0a 20 20 20 20 69 6e 74 20 69 73  lect;.    int is
22880 41 67 67 53 75 62 3b 0a 0a 20 20 20 20 69 66 28  AggSub;..    if(
22890 20 70 53 75 62 3d 3d 30 20 29 20 63 6f 6e 74 69   pSub==0 ) conti
228a0 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 53 6f 6d  nue;..    /* Som
228b0 65 74 69 6d 65 73 20 74 68 65 20 63 6f 64 65 20  etimes the code 
228c0 66 6f 72 20 61 20 73 75 62 71 75 65 72 79 20 77  for a subquery w
228d0 69 6c 6c 20 62 65 20 67 65 6e 65 72 61 74 65 64  ill be generated
228e0 20 6d 6f 72 65 20 74 68 61 6e 0a 20 20 20 20 2a   more than.    *
228f0 2a 20 6f 6e 63 65 2c 20 69 66 20 74 68 65 20 73  * once, if the s
22900 75 62 71 75 65 72 79 20 69 73 20 70 61 72 74 20  ubquery is part 
22910 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
22920 75 73 65 20 69 6e 20 61 20 4c 45 46 54 20 4a 4f  use in a LEFT JO
22930 49 4e 2c 0a 20 20 20 20 2a 2a 20 66 6f 72 20 65  IN,.    ** for e
22940 78 61 6d 70 6c 65 2e 20 20 49 6e 20 74 68 61 74  xample.  In that
22950 20 63 61 73 65 2c 20 64 6f 20 6e 6f 74 20 72 65   case, do not re
22960 67 65 6e 65 72 61 74 65 20 74 68 65 20 63 6f 64  generate the cod
22970 65 20 74 6f 20 6d 61 6e 69 66 65 73 74 0a 20 20  e to manifest.  
22980 20 20 2a 2a 20 61 20 76 69 65 77 20 6f 72 20 74    ** a view or t
22990 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20 74 6f  he co-routine to
229a0 20 69 6d 70 6c 65 6d 65 6e 74 20 61 20 76 69 65   implement a vie
229b0 77 2e 20 20 54 68 65 20 66 69 72 73 74 20 69 6e  w.  The first in
229c0 73 74 61 6e 63 65 0a 20 20 20 20 2a 2a 20 69 73  stance.    ** is
229d0 20 73 75 66 66 69 63 69 65 6e 74 2c 20 74 68 6f   sufficient, tho
229e0 75 67 68 20 74 68 65 20 73 75 62 72 6f 75 74 69  ugh the subrouti
229f0 6e 65 20 74 6f 20 6d 61 6e 69 66 65 73 74 20 74  ne to manifest t
22a00 68 65 20 76 69 65 77 20 64 6f 65 73 20 6e 65 65  he view does nee
22a10 64 0a 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 69  d.    ** to be i
22a20 6e 76 6f 6b 65 64 20 61 67 61 69 6e 2e 20 2a 2f  nvoked again. */
22a30 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e  .    if( pItem->
22a40 61 64 64 72 46 69 6c 6c 53 75 62 20 29 7b 0a 20  addrFillSub ){. 
22a50 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
22a60 76 69 61 43 6f 72 6f 75 74 69 6e 65 3d 3d 30 20  viaCoroutine==0 
22a70 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
22a80 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
22a90 4f 50 5f 47 6f 73 75 62 2c 20 70 49 74 65 6d 2d  OP_Gosub, pItem-
22aa0 3e 72 65 67 52 65 74 75 72 6e 2c 20 70 49 74 65  >regReturn, pIte
22ab0 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 29 3b  m->addrFillSub);
22ac0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63  .      }.      c
22ad0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 0a  ontinue;.    }..
22ae0 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74      /* Increment
22af0 20 50 61 72 73 65 2e 6e 48 65 69 67 68 74 20 62   Parse.nHeight b
22b00 79 20 74 68 65 20 68 65 69 67 68 74 20 6f 66 20  y the height of 
22b10 74 68 65 20 6c 61 72 67 65 73 74 20 65 78 70 72  the largest expr
22b20 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2a 20 74 72  ession.    ** tr
22b30 65 65 20 72 65 66 65 72 65 64 20 74 6f 20 62 79  ee refered to by
22b40 20 74 68 69 73 2c 20 74 68 65 20 70 61 72 65 6e   this, the paren
22b50 74 20 73 65 6c 65 63 74 2e 20 54 68 65 20 63 68  t select. The ch
22b60 69 6c 64 20 73 65 6c 65 63 74 0a 20 20 20 20 2a  ild select.    *
22b70 2a 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 65 78  * may contain ex
22b80 70 72 65 73 73 69 6f 6e 20 74 72 65 65 73 20 6f  pression trees o
22b90 66 20 61 74 20 6d 6f 73 74 0a 20 20 20 20 2a 2a  f at most.    **
22ba0 20 28 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50   (SQLITE_MAX_EXP
22bb0 52 5f 44 45 50 54 48 2d 50 61 72 73 65 2e 6e 48  R_DEPTH-Parse.nH
22bc0 65 69 67 68 74 29 20 68 65 69 67 68 74 2e 20 54  eight) height. T
22bd0 68 69 73 20 69 73 20 61 20 62 69 74 0a 20 20 20  his is a bit.   
22be0 20 2a 2a 20 6d 6f 72 65 20 63 6f 6e 73 65 72 76   ** more conserv
22bf0 61 74 69 76 65 20 74 68 61 6e 20 6e 65 63 65 73  ative than neces
22c00 73 61 72 79 2c 20 62 75 74 20 6d 75 63 68 20 65  sary, but much e
22c10 61 73 69 65 72 20 74 68 61 6e 20 65 6e 66 6f 72  asier than enfor
22c20 63 69 6e 67 0a 20 20 20 20 2a 2a 20 61 6e 20 65  cing.    ** an e
22c30 78 61 63 74 20 6c 69 6d 69 74 2e 0a 20 20 20 20  xact limit..    
22c40 2a 2f 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  */.    pParse->n
22c50 48 65 69 67 68 74 20 2b 3d 20 73 71 6c 69 74 65  Height += sqlite
22c60 33 53 65 6c 65 63 74 45 78 70 72 48 65 69 67 68  3SelectExprHeigh
22c70 74 28 70 29 3b 0a 0a 20 20 20 20 69 73 41 67 67  t(p);..    isAgg
22c80 53 75 62 20 3d 20 28 70 53 75 62 2d 3e 73 65 6c  Sub = (pSub->sel
22c90 46 6c 61 67 73 20 26 20 53 46 5f 41 67 67 72 65  Flags & SF_Aggre
22ca0 67 61 74 65 29 21 3d 30 3b 0a 20 20 20 20 69 66  gate)!=0;.    if
22cb0 28 20 66 6c 61 74 74 65 6e 53 75 62 71 75 65 72  ( flattenSubquer
22cc0 79 28 70 50 61 72 73 65 2c 20 70 2c 20 69 2c 20  y(pParse, p, i, 
22cd0 69 73 41 67 67 2c 20 69 73 41 67 67 53 75 62 29  isAgg, isAggSub)
22ce0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69   ){.      /* Thi
22cf0 73 20 73 75 62 71 75 65 72 79 20 63 61 6e 20 62  s subquery can b
22d00 65 20 61 62 73 6f 72 62 65 64 20 69 6e 74 6f 20  e absorbed into 
22d10 69 74 73 20 70 61 72 65 6e 74 2e 20 2a 2f 0a 20  its parent. */. 
22d20 20 20 20 20 20 69 66 28 20 69 73 41 67 67 53 75       if( isAggSu
22d30 62 20 29 7b 0a 20 20 20 20 20 20 20 20 69 73 41  b ){.        isA
22d40 67 67 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  gg = 1;.        
22d50 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53  p->selFlags |= S
22d60 46 5f 41 67 67 72 65 67 61 74 65 3b 0a 20 20 20  F_Aggregate;.   
22d70 20 20 20 7d 0a 20 20 20 20 20 20 69 20 3d 20 2d     }.      i = -
22d80 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  1;.    }else if(
22d90 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3d   pTabList->nSrc=
22da0 3d 31 20 26 26 20 28 70 2d 3e 73 65 6c 46 6c 61  =1 && (p->selFla
22db0 67 73 20 26 20 53 46 5f 4d 61 74 65 72 69 61 6c  gs & SF_Material
22dc0 69 7a 65 29 3d 3d 30 0a 20 20 20 20 20 20 26 26  ize)==0.      &&
22dd0 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61   OptimizationEna
22de0 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f  bled(db, SQLITE_
22df0 53 75 62 71 43 6f 72 6f 75 74 69 6e 65 29 0a 20  SubqCoroutine). 
22e00 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49     ){.      /* I
22e10 6d 70 6c 65 6d 65 6e 74 20 61 20 63 6f 2d 72 6f  mplement a co-ro
22e20 75 74 69 6e 65 20 74 68 61 74 20 77 69 6c 6c 20  utine that will 
22e30 72 65 74 75 72 6e 20 61 20 73 69 6e 67 6c 65 20  return a single 
22e40 72 6f 77 20 6f 66 20 74 68 65 20 72 65 73 75 6c  row of the resul
22e50 74 0a 20 20 20 20 20 20 2a 2a 20 73 65 74 20 6f  t.      ** set o
22e60 6e 20 65 61 63 68 20 69 6e 76 6f 63 61 74 69 6f  n each invocatio
22e70 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  n..      */.    
22e80 20 20 69 6e 74 20 61 64 64 72 54 6f 70 3b 0a 20    int addrTop;. 
22e90 20 20 20 20 20 69 6e 74 20 61 64 64 72 45 6f 66       int addrEof
22ea0 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 72  ;.      pItem->r
22eb0 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50 61  egReturn = ++pPa
22ec0 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
22ed0 20 61 64 64 72 45 6f 66 20 3d 20 2b 2b 70 50 61   addrEof = ++pPa
22ee0 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
22ef0 20 2f 2a 20 42 65 66 6f 72 65 20 63 6f 64 69 6e   /* Before codin
22f00 67 20 74 68 65 20 4f 50 5f 47 6f 74 6f 20 74 6f  g the OP_Goto to
22f10 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 73 74 61   jump to the sta
22f20 72 74 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 72  rt of the main r
22f30 6f 75 74 69 6e 65 2c 0a 20 20 20 20 20 20 2a 2a  outine,.      **
22f40 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65   ensure that the
22f50 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 76 65 72   jump to the ver
22f60 69 66 79 2d 73 63 68 65 6d 61 20 72 6f 75 74 69  ify-schema routi
22f70 6e 65 20 68 61 73 20 61 6c 72 65 61 64 79 0a 20  ne has already. 
22f80 20 20 20 20 20 2a 2a 20 62 65 65 6e 20 63 6f 64       ** been cod
22f90 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74  ed. Otherwise, t
22fa0 68 65 20 76 65 72 69 66 79 2d 73 63 68 65 6d 61  he verify-schema
22fb0 20 77 6f 75 6c 64 20 6c 69 6b 65 6c 79 20 62 65   would likely be
22fc0 20 63 6f 64 65 64 20 61 73 20 0a 20 20 20 20 20   coded as .     
22fd0 20 2a 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20   ** part of the 
22fe0 63 6f 2d 72 6f 75 74 69 6e 65 2e 20 49 66 20 74  co-routine. If t
22ff0 68 65 20 6d 61 69 6e 20 72 6f 75 74 69 6e 65 20  he main routine 
23000 74 68 65 6e 20 61 63 63 65 73 73 65 64 20 74 68  then accessed th
23010 65 20 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61  e .      ** data
23020 62 61 73 65 20 62 65 66 6f 72 65 20 69 6e 76 6f  base before invo
23030 6b 69 6e 67 20 74 68 65 20 63 6f 2d 72 6f 75 74  king the co-rout
23040 69 6e 65 20 66 6f 72 20 74 68 65 20 66 69 72 73  ine for the firs
23050 74 20 74 69 6d 65 20 28 66 6f 72 20 0a 20 20 20  t time (for .   
23060 20 20 20 2a 2a 20 65 78 61 6d 70 6c 65 20 74 6f     ** example to
23070 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 20 4c 49   initialize a LI
23080 4d 49 54 20 72 65 67 69 73 74 65 72 20 66 72 6f  MIT register fro
23090 6d 20 61 20 73 75 62 2d 73 65 6c 65 63 74 29 2c  m a sub-select),
230a0 20 69 74 20 77 6f 75 6c 64 20 0a 20 20 20 20 20   it would .     
230b0 20 2a 2a 20 62 65 20 64 6f 69 6e 67 20 73 6f 20   ** be doing so 
230c0 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 76  without having v
230d0 65 72 69 66 69 65 64 20 74 68 65 20 73 63 68 65  erified the sche
230e0 6d 61 20 76 65 72 73 69 6f 6e 20 61 6e 64 20 6f  ma version and o
230f0 62 74 61 69 6e 65 64 20 0a 20 20 20 20 20 20 2a  btained .      *
23100 2a 20 74 68 65 20 72 65 71 75 69 72 65 64 20 64  * the required d
23110 62 20 6c 6f 63 6b 73 2e 20 53 65 65 20 74 69 63  b locks. See tic
23120 6b 65 74 20 64 36 62 33 36 62 65 33 38 2e 20 20  ket d6b36be38.  
23130 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
23140 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61  CodeVerifySchema
23150 28 70 50 61 72 73 65 2c 20 2d 31 29 3b 0a 20 20  (pParse, -1);.  
23160 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
23170 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp0(v, OP_Goto
23180 29 3b 0a 20 20 20 20 20 20 61 64 64 72 54 6f 70  );.      addrTop
23190 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
231a0 64 4f 70 31 28 76 2c 20 4f 50 5f 4f 70 65 6e 50  dOp1(v, OP_OpenP
231b0 73 65 75 64 6f 2c 20 70 49 74 65 6d 2d 3e 69 43  seudo, pItem->iC
231c0 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 73 71  ursor);.      sq
231d0 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
231e0 35 28 76 2c 20 31 29 3b 0a 20 20 20 20 20 20 56  5(v, 1);.      V
231f0 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
23200 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20 25 73  coroutine for %s
23210 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e  ", pItem->pTab->
23220 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 70  zName));.      p
23230 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75  Item->addrFillSu
23240 62 20 3d 20 61 64 64 72 54 6f 70 3b 0a 20 20 20  b = addrTop;.   
23250 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
23260 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
23270 65 72 2c 20 30 2c 20 61 64 64 72 45 6f 66 29 3b  er, 0, addrEof);
23280 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
23290 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 31 29  beChangeP5(v, 1)
232a0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  ;.      sqlite3S
232b0 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64  electDestInit(&d
232c0 65 73 74 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69  est, SRT_Corouti
232d0 6e 65 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65  ne, pItem->regRe
232e0 74 75 72 6e 29 3b 0a 20 20 20 20 20 20 65 78 70  turn);.      exp
232f0 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 70  lainSetInteger(p
23300 49 74 65 6d 2d 3e 69 53 65 6c 65 63 74 49 64 2c  Item->iSelectId,
23310 20 28 75 38 29 70 50 61 72 73 65 2d 3e 69 4e 65   (u8)pParse->iNe
23320 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20  xtSelectId);.   
23330 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
23340 28 70 50 61 72 73 65 2c 20 70 53 75 62 2c 20 26  (pParse, pSub, &
23350 64 65 73 74 29 3b 0a 20 20 20 20 20 20 70 49 74  dest);.      pIt
23360 65 6d 2d 3e 70 54 61 62 2d 3e 6e 52 6f 77 45 73  em->pTab->nRowEs
23370 74 20 3d 20 28 75 6e 73 69 67 6e 65 64 29 70 53  t = (unsigned)pS
23380 75 62 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a  ub->nSelectRow;.
23390 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 76 69 61        pItem->via
233a0 43 6f 72 6f 75 74 69 6e 65 20 3d 20 31 3b 0a 20  Coroutine = 1;. 
233b0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
233c0 43 68 61 6e 67 65 50 32 28 76 2c 20 61 64 64 72  ChangeP2(v, addr
233d0 54 6f 70 2c 20 64 65 73 74 2e 69 53 64 73 74 29  Top, dest.iSdst)
233e0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
233f0 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 61  dbeChangeP3(v, a
23400 64 64 72 54 6f 70 2c 20 64 65 73 74 2e 6e 53 64  ddrTop, dest.nSd
23410 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  st);.      sqlit
23420 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
23430 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 61  OP_Integer, 1, a
23440 64 64 72 45 6f 66 29 3b 0a 20 20 20 20 20 20 73  ddrEof);.      s
23450 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
23460 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 70 49  (v, OP_Yield, pI
23470 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b  tem->regReturn);
23480 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
23490 6e 74 28 28 76 2c 20 22 65 6e 64 20 25 73 22 2c  nt((v, "end %s",
234a0 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e   pItem->pTab->zN
234b0 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  ame));.      sql
234c0 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
234d0 28 76 2c 20 61 64 64 72 54 6f 70 2d 31 29 3b 0a  (v, addrTop-1);.
234e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c 65        sqlite3Cle
234f0 61 72 54 65 6d 70 52 65 67 43 61 63 68 65 28 70  arTempRegCache(p
23500 50 61 72 73 65 29 3b 0a 20 20 20 20 7d 65 6c 73  Parse);.    }els
23510 65 7b 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65  e{.      /* Gene
23520 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e  rate a subroutin
23530 65 20 74 68 61 74 20 77 69 6c 6c 20 66 69 6c 6c  e that will fill
23540 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61   an ephemeral ta
23550 62 6c 65 20 77 69 74 68 0a 20 20 20 20 20 20 2a  ble with.      *
23560 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  * the content of
23570 20 74 68 69 73 20 73 75 62 71 75 65 72 79 2e 20   this subquery. 
23580 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c   pItem->addrFill
23590 53 75 62 20 77 69 6c 6c 20 70 6f 69 6e 74 0a 20  Sub will point. 
235a0 20 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 61       ** to the a
235b0 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 67 65  ddress of the ge
235c0 6e 65 72 61 74 65 64 20 73 75 62 72 6f 75 74 69  nerated subrouti
235d0 6e 65 2e 20 20 70 49 74 65 6d 2d 3e 72 65 67 52  ne.  pItem->regR
235e0 65 74 75 72 6e 0a 20 20 20 20 20 20 2a 2a 20 69  eturn.      ** i
235f0 73 20 61 20 72 65 67 69 73 74 65 72 20 61 6c 6c  s a register all
23600 6f 63 61 74 65 64 20 74 6f 20 68 6f 6c 64 20 74  ocated to hold t
23610 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20 72 65  he subroutine re
23620 74 75 72 6e 20 61 64 64 72 65 73 73 0a 20 20 20  turn address.   
23630 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20     */.      int 
23640 74 6f 70 41 64 64 72 3b 0a 20 20 20 20 20 20 69  topAddr;.      i
23650 6e 74 20 6f 6e 63 65 41 64 64 72 20 3d 20 30 3b  nt onceAddr = 0;
23660 0a 20 20 20 20 20 20 69 6e 74 20 72 65 74 41 64  .      int retAd
23670 64 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  dr;.      assert
23680 28 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c  ( pItem->addrFil
23690 6c 53 75 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20  lSub==0 );.     
236a0 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72   pItem->regRetur
236b0 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  n = ++pParse->nM
236c0 65 6d 3b 0a 20 20 20 20 20 20 74 6f 70 41 64 64  em;.      topAdd
236d0 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
236e0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
236f0 67 65 72 2c 20 30 2c 20 70 49 74 65 6d 2d 3e 72  ger, 0, pItem->r
23700 65 67 52 65 74 75 72 6e 29 3b 0a 20 20 20 20 20  egReturn);.     
23710 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c   pItem->addrFill
23720 53 75 62 20 3d 20 74 6f 70 41 64 64 72 2b 31 3b  Sub = topAddr+1;
23730 0a 20 20 20 20 20 20 56 64 62 65 4e 6f 6f 70 43  .      VdbeNoopC
23740 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6d 61 74 65  omment((v, "mate
23750 72 69 61 6c 69 7a 65 20 25 73 22 2c 20 70 49 74  rialize %s", pIt
23760 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  em->pTab->zName)
23770 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74  );.      if( pIt
23780 65 6d 2d 3e 69 73 43 6f 72 72 65 6c 61 74 65 64  em->isCorrelated
23790 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ==0 ){.        /
237a0 2a 20 49 66 20 74 68 65 20 73 75 62 71 75 65 72  * If the subquer
237b0 79 20 69 73 20 6e 6f 74 20 63 6f 72 72 65 6c 61  y is not correla
237c0 74 65 64 20 61 6e 64 20 69 66 20 77 65 20 61 72  ted and if we ar
237d0 65 20 6e 6f 74 20 69 6e 73 69 64 65 20 6f 66 0a  e not inside of.
237e0 20 20 20 20 20 20 20 20 2a 2a 20 61 20 74 72 69          ** a tri
237f0 67 67 65 72 2c 20 74 68 65 6e 20 77 65 20 6f 6e  gger, then we on
23800 6c 79 20 6e 65 65 64 20 74 6f 20 63 6f 6d 70 75  ly need to compu
23810 74 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  te the value of 
23820 74 68 65 20 73 75 62 71 75 65 72 79 0a 20 20 20  the subquery.   
23830 20 20 20 20 20 2a 2a 20 6f 6e 63 65 2e 20 2a 2f       ** once. */
23840 0a 20 20 20 20 20 20 20 20 6f 6e 63 65 41 64 64  .        onceAdd
23850 72 20 3d 20 73 71 6c 69 74 65 33 43 6f 64 65 4f  r = sqlite3CodeO
23860 6e 63 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20  nce(pParse);.   
23870 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
23880 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74  e3SelectDestInit
23890 28 26 64 65 73 74 2c 20 53 52 54 5f 45 70 68 65  (&dest, SRT_Ephe
238a0 6d 54 61 62 2c 20 70 49 74 65 6d 2d 3e 69 43 75  mTab, pItem->iCu
238b0 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 65 78 70  rsor);.      exp
238c0 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 70  lainSetInteger(p
238d0 49 74 65 6d 2d 3e 69 53 65 6c 65 63 74 49 64 2c  Item->iSelectId,
238e0 20 28 75 38 29 70 50 61 72 73 65 2d 3e 69 4e 65   (u8)pParse->iNe
238f0 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20  xtSelectId);.   
23900 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
23910 28 70 50 61 72 73 65 2c 20 70 53 75 62 2c 20 26  (pParse, pSub, &
23920 64 65 73 74 29 3b 0a 20 20 20 20 20 20 70 49 74  dest);.      pIt
23930 65 6d 2d 3e 70 54 61 62 2d 3e 6e 52 6f 77 45 73  em->pTab->nRowEs
23940 74 20 3d 20 28 75 6e 73 69 67 6e 65 64 29 70 53  t = (unsigned)pS
23950 75 62 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a  ub->nSelectRow;.
23960 20 20 20 20 20 20 69 66 28 20 6f 6e 63 65 41 64        if( onceAd
23970 64 72 20 29 20 73 71 6c 69 74 65 33 56 64 62 65  dr ) sqlite3Vdbe
23980 4a 75 6d 70 48 65 72 65 28 76 2c 20 6f 6e 63 65  JumpHere(v, once
23990 41 64 64 72 29 3b 0a 20 20 20 20 20 20 72 65 74  Addr);.      ret
239a0 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  Addr = sqlite3Vd
239b0 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52  beAddOp1(v, OP_R
239c0 65 74 75 72 6e 2c 20 70 49 74 65 6d 2d 3e 72 65  eturn, pItem->re
239d0 67 52 65 74 75 72 6e 29 3b 0a 20 20 20 20 20 20  gReturn);.      
239e0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
239f0 22 65 6e 64 20 25 73 22 2c 20 70 49 74 65 6d 2d  "end %s", pItem-
23a00 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a  >pTab->zName));.
23a10 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
23a20 65 43 68 61 6e 67 65 50 31 28 76 2c 20 74 6f 70  eChangeP1(v, top
23a30 41 64 64 72 2c 20 72 65 74 41 64 64 72 29 3b 0a  Addr, retAddr);.
23a40 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c 65        sqlite3Cle
23a50 61 72 54 65 6d 70 52 65 67 43 61 63 68 65 28 70  arTempRegCache(p
23a60 50 61 72 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20  Parse);.    }.  
23a70 20 20 69 66 28 20 2f 2a 70 50 61 72 73 65 2d 3e    if( /*pParse->
23a80 6e 45 72 72 20 7c 7c 2a 2f 20 64 62 2d 3e 6d 61  nErr ||*/ db->ma
23a90 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
23aa0 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
23ab0 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  end;.    }.    p
23ac0 50 61 72 73 65 2d 3e 6e 48 65 69 67 68 74 20 2d  Parse->nHeight -
23ad0 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45  = sqlite3SelectE
23ae0 78 70 72 48 65 69 67 68 74 28 70 29 3b 0a 20 20  xprHeight(p);.  
23af0 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e    pTabList = p->
23b00 70 53 72 63 3b 0a 20 20 20 20 69 66 28 20 21 49  pSrc;.    if( !I
23b10 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62 79 28  gnorableOrderby(
23b20 70 44 65 73 74 29 20 29 7b 0a 20 20 20 20 20 20  pDest) ){.      
23b30 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f  pOrderBy = p->pO
23b40 72 64 65 72 42 79 3b 0a 20 20 20 20 7d 0a 20 20  rderBy;.    }.  
23b50 7d 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e  }.  pEList = p->
23b60 70 45 4c 69 73 74 3b 0a 23 65 6e 64 69 66 0a 20  pEList;.#endif. 
23b70 20 70 57 68 65 72 65 20 3d 20 70 2d 3e 70 57 68   pWhere = p->pWh
23b80 65 72 65 3b 0a 20 20 70 47 72 6f 75 70 42 79 20  ere;.  pGroupBy 
23b90 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20  = p->pGroupBy;. 
23ba0 20 70 48 61 76 69 6e 67 20 3d 20 70 2d 3e 70 48   pHaving = p->pH
23bb0 61 76 69 6e 67 3b 0a 20 20 73 44 69 73 74 69 6e  aving;.  sDistin
23bc0 63 74 2e 69 73 54 6e 63 74 20 3d 20 28 70 2d 3e  ct.isTnct = (p->
23bd0 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69  selFlags & SF_Di
23be0 73 74 69 6e 63 74 29 21 3d 30 3b 0a 0a 23 69 66  stinct)!=0;..#if
23bf0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
23c00 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
23c10 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69  .  /* If there i
23c20 73 20 61 72 65 20 61 20 73 65 71 75 65 6e 63 65  s are a sequence
23c30 20 6f 66 20 71 75 65 72 69 65 73 2c 20 64 6f 20   of queries, do 
23c40 74 68 65 20 65 61 72 6c 69 65 72 20 6f 6e 65 73  the earlier ones
23c50 20 66 69 72 73 74 2e 0a 20 20 2a 2f 0a 20 20 69   first..  */.  i
23c60 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a  f( p->pPrior ){.
23c70 20 20 20 20 69 66 28 20 70 2d 3e 70 52 69 67 68      if( p->pRigh
23c80 74 6d 6f 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  tmost==0 ){.    
23c90 20 20 53 65 6c 65 63 74 20 2a 70 4c 6f 6f 70 2c    Select *pLoop,
23ca0 20 2a 70 52 69 67 68 74 20 3d 20 30 3b 0a 20 20   *pRight = 0;.  
23cb0 20 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b      int cnt = 0;
23cc0 0a 20 20 20 20 20 20 69 6e 74 20 6d 78 53 65 6c  .      int mxSel
23cd0 65 63 74 3b 0a 20 20 20 20 20 20 66 6f 72 28 70  ect;.      for(p
23ce0 4c 6f 6f 70 3d 70 3b 20 70 4c 6f 6f 70 3b 20 70  Loop=p; pLoop; p
23cf0 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 50 72 69  Loop=pLoop->pPri
23d00 6f 72 2c 20 63 6e 74 2b 2b 29 7b 0a 20 20 20 20  or, cnt++){.    
23d10 20 20 20 20 70 4c 6f 6f 70 2d 3e 70 52 69 67 68      pLoop->pRigh
23d20 74 6d 6f 73 74 20 3d 20 70 3b 0a 20 20 20 20 20  tmost = p;.     
23d30 20 20 20 70 4c 6f 6f 70 2d 3e 70 4e 65 78 74 20     pLoop->pNext 
23d40 3d 20 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  = pRight;.      
23d50 20 20 70 52 69 67 68 74 20 3d 20 70 4c 6f 6f 70    pRight = pLoop
23d60 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
23d70 6d 78 53 65 6c 65 63 74 20 3d 20 64 62 2d 3e 61  mxSelect = db->a
23d80 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
23d90 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  IT_COMPOUND_SELE
23da0 43 54 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 6d  CT];.      if( m
23db0 78 53 65 6c 65 63 74 20 26 26 20 63 6e 74 3e 6d  xSelect && cnt>m
23dc0 78 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  xSelect ){.     
23dd0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
23de0 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20  sg(pParse, "too 
23df0 6d 61 6e 79 20 74 65 72 6d 73 20 69 6e 20 63 6f  many terms in co
23e00 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 22 29 3b  mpound SELECT");
23e10 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65  .        goto se
23e20 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
23e30 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  }.    }.    rc =
23e40 20 6d 75 6c 74 69 53 65 6c 65 63 74 28 70 50 61   multiSelect(pPa
23e50 72 73 65 2c 20 70 2c 20 70 44 65 73 74 29 3b 0a  rse, p, pDest);.
23e60 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e      explainSetIn
23e70 74 65 67 65 72 28 70 50 61 72 73 65 2d 3e 69 53  teger(pParse->iS
23e80 65 6c 65 63 74 49 64 2c 20 69 52 65 73 74 6f 72  electId, iRestor
23e90 65 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20  eSelectId);.    
23ea0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23  return rc;.  }.#
23eb0 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74  endif..  /* If t
23ec0 68 65 72 65 20 69 73 20 62 6f 74 68 20 61 20 47  here is both a G
23ed0 52 4f 55 50 20 42 59 20 61 6e 64 20 61 6e 20 4f  ROUP BY and an O
23ee0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61  RDER BY clause a
23ef0 6e 64 20 74 68 65 79 20 61 72 65 0a 20 20 2a 2a  nd they are.  **
23f00 20 69 64 65 6e 74 69 63 61 6c 2c 20 74 68 65 6e   identical, then
23f10 20 64 69 73 61 62 6c 65 20 74 68 65 20 4f 52 44   disable the ORD
23f20 45 52 20 42 59 20 63 6c 61 75 73 65 20 73 69 6e  ER BY clause sin
23f30 63 65 20 74 68 65 20 47 52 4f 55 50 20 42 59 0a  ce the GROUP BY.
23f40 20 20 2a 2a 20 77 69 6c 6c 20 63 61 75 73 65 20    ** will cause 
23f50 65 6c 65 6d 65 6e 74 73 20 74 6f 20 63 6f 6d 65  elements to come
23f60 20 6f 75 74 20 69 6e 20 74 68 65 20 63 6f 72 72   out in the corr
23f70 65 63 74 20 6f 72 64 65 72 2e 20 20 54 68 69 73  ect order.  This
23f80 20 69 73 0a 20 20 2a 2a 20 61 6e 20 6f 70 74 69   is.  ** an opti
23f90 6d 69 7a 61 74 69 6f 6e 20 2d 20 74 68 65 20 63  mization - the c
23fa0 6f 72 72 65 63 74 20 61 6e 73 77 65 72 20 73 68  orrect answer sh
23fb0 6f 75 6c 64 20 72 65 73 75 6c 74 20 72 65 67 61  ould result rega
23fc0 72 64 6c 65 73 73 2e 0a 20 20 2a 2a 20 55 73 65  rdless..  ** Use
23fd0 20 74 68 65 20 53 51 4c 49 54 45 5f 47 72 6f 75   the SQLITE_Grou
23fe0 70 42 79 4f 72 64 65 72 20 66 6c 61 67 20 77 69  pByOrder flag wi
23ff0 74 68 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  th SQLITE_TESTCT
24000 52 4c 5f 4f 50 54 49 4d 49 5a 45 52 0a 20 20 2a  RL_OPTIMIZER.  *
24010 2a 20 74 6f 20 64 69 73 61 62 6c 65 20 74 68 69  * to disable thi
24020 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 66  s optimization f
24030 6f 72 20 74 65 73 74 69 6e 67 20 70 75 72 70 6f  or testing purpo
24040 73 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ses..  */.  if( 
24050 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43  sqlite3ExprListC
24060 6f 6d 70 61 72 65 28 70 2d 3e 70 47 72 6f 75 70  ompare(p->pGroup
24070 42 79 2c 20 70 4f 72 64 65 72 42 79 29 3d 3d 30  By, pOrderBy)==0
24080 0a 20 20 20 20 20 20 20 20 20 26 26 20 4f 70 74  .         && Opt
24090 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64  imizationEnabled
240a0 28 64 62 2c 20 53 51 4c 49 54 45 5f 47 72 6f 75  (db, SQLITE_Grou
240b0 70 42 79 4f 72 64 65 72 29 20 29 7b 0a 20 20 20  pByOrder) ){.   
240c0 20 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20   pOrderBy = 0;. 
240d0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
240e0 71 75 65 72 79 20 69 73 20 44 49 53 54 49 4e 43  query is DISTINC
240f0 54 20 77 69 74 68 20 61 6e 20 4f 52 44 45 52 20  T with an ORDER 
24100 42 59 20 62 75 74 20 69 73 20 6e 6f 74 20 61 6e  BY but is not an
24110 20 61 67 67 72 65 67 61 74 65 2c 20 61 6e 64 20   aggregate, and 
24120 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 73 65 6c  .  ** if the sel
24130 65 63 74 2d 6c 69 73 74 20 69 73 20 74 68 65 20  ect-list is the 
24140 73 61 6d 65 20 61 73 20 74 68 65 20 4f 52 44 45  same as the ORDE
24150 52 20 42 59 20 6c 69 73 74 2c 20 74 68 65 6e 20  R BY list, then 
24160 74 68 69 73 20 71 75 65 72 79 0a 20 20 2a 2a 20  this query.  ** 
24170 63 61 6e 20 62 65 20 72 65 77 72 69 74 74 65 6e  can be rewritten
24180 20 61 73 20 61 20 47 52 4f 55 50 20 42 59 2e 20   as a GROUP BY. 
24190 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
241a0 74 68 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  this:.  **.  ** 
241b0 20 20 20 20 53 45 4c 45 43 54 20 44 49 53 54 49      SELECT DISTI
241c0 4e 43 54 20 78 79 7a 20 46 52 4f 4d 20 2e 2e 2e  NCT xyz FROM ...
241d0 20 4f 52 44 45 52 20 42 59 20 78 79 7a 0a 20 20   ORDER BY xyz.  
241e0 2a 2a 0a 20 20 2a 2a 20 69 73 20 74 72 61 6e 73  **.  ** is trans
241f0 66 6f 72 6d 65 64 20 74 6f 3a 0a 20 20 2a 2a 0a  formed to:.  **.
24200 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20    **     SELECT 
24210 78 79 7a 20 46 52 4f 4d 20 2e 2e 2e 20 47 52 4f  xyz FROM ... GRO
24220 55 50 20 42 59 20 78 79 7a 0a 20 20 2a 2a 0a 20  UP BY xyz.  **. 
24230 20 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 66   ** The second f
24240 6f 72 6d 20 69 73 20 70 72 65 66 65 72 72 65 64  orm is preferred
24250 20 61 73 20 61 20 73 69 6e 67 6c 65 20 69 6e 64   as a single ind
24260 65 78 20 28 6f 72 20 74 65 6d 70 2d 74 61 62 6c  ex (or temp-tabl
24270 65 29 20 6d 61 79 20 62 65 20 0a 20 20 2a 2a 20  e) may be .  ** 
24280 75 73 65 64 20 66 6f 72 20 62 6f 74 68 20 74 68  used for both th
24290 65 20 4f 52 44 45 52 20 42 59 20 61 6e 64 20 44  e ORDER BY and D
242a0 49 53 54 49 4e 43 54 20 70 72 6f 63 65 73 73 69  ISTINCT processi
242b0 6e 67 2e 20 41 73 20 6f 72 69 67 69 6e 61 6c 6c  ng. As originall
242c0 79 20 0a 20 20 2a 2a 20 77 72 69 74 74 65 6e 20  y .  ** written 
242d0 74 68 65 20 71 75 65 72 79 20 6d 75 73 74 20 75  the query must u
242e0 73 65 20 61 20 74 65 6d 70 2d 74 61 62 6c 65 20  se a temp-table 
242f0 66 6f 72 20 61 74 20 6c 65 61 73 74 20 6f 6e 65  for at least one
24300 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 0a 20   of the ORDER . 
24310 20 2a 2a 20 42 59 20 61 6e 64 20 44 49 53 54 49   ** BY and DISTI
24320 4e 43 54 2c 20 61 6e 64 20 61 6e 20 69 6e 64 65  NCT, and an inde
24330 78 20 6f 72 20 73 65 70 61 72 61 74 65 20 74 65  x or separate te
24340 6d 70 2d 74 61 62 6c 65 20 66 6f 72 20 74 68 65  mp-table for the
24350 20 6f 74 68 65 72 2e 0a 20 20 2a 2f 0a 20 20 69   other..  */.  i
24360 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20  f( (p->selFlags 
24370 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53  & (SF_Distinct|S
24380 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53  F_Aggregate))==S
24390 46 5f 44 69 73 74 69 6e 63 74 20 0a 20 20 20 26  F_Distinct .   &
243a0 26 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  & sqlite3ExprLis
243b0 74 43 6f 6d 70 61 72 65 28 70 4f 72 64 65 72 42  tCompare(pOrderB
243c0 79 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3d 3d 30  y, p->pEList)==0
243d0 0a 20 20 29 7b 0a 20 20 20 20 70 2d 3e 73 65 6c  .  ){.    p->sel
243e0 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f 44 69 73  Flags &= ~SF_Dis
243f0 74 69 6e 63 74 3b 0a 20 20 20 20 70 2d 3e 70 47  tinct;.    p->pG
24400 72 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65 33  roupBy = sqlite3
24410 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20  ExprListDup(db, 
24420 70 2d 3e 70 45 4c 69 73 74 2c 20 30 29 3b 0a 20  p->pEList, 0);. 
24430 20 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d     pGroupBy = p-
24440 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 70  >pGroupBy;.    p
24450 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20  OrderBy = 0;.   
24460 20 2f 2a 20 4e 6f 74 69 63 65 20 74 68 61 74 20   /* Notice that 
24470 65 76 65 6e 20 74 68 6f 75 67 68 74 20 53 46 5f  even thought SF_
24480 44 69 73 74 69 6e 63 74 20 68 61 73 20 62 65 65  Distinct has bee
24490 6e 20 63 6c 65 61 72 65 64 20 66 72 6f 6d 20 70  n cleared from p
244a0 2d 3e 73 65 6c 46 6c 61 67 73 2c 0a 20 20 20 20  ->selFlags,.    
244b0 2a 2a 20 74 68 65 20 73 44 69 73 74 69 6e 63 74  ** the sDistinct
244c0 2e 69 73 54 6e 63 74 20 69 73 20 73 74 69 6c 6c  .isTnct is still
244d0 20 73 65 74 2e 20 20 48 65 6e 63 65 2c 20 69 73   set.  Hence, is
244e0 54 6e 63 74 20 72 65 70 72 65 73 65 6e 74 73 20  Tnct represents 
244f0 74 68 65 0a 20 20 20 20 2a 2a 20 6f 72 69 67 69  the.    ** origi
24500 6e 61 6c 20 73 65 74 74 69 6e 67 20 6f 66 20 74  nal setting of t
24510 68 65 20 53 46 5f 44 69 73 74 69 6e 63 74 20 66  he SF_Distinct f
24520 6c 61 67 2c 20 6e 6f 74 20 74 68 65 20 63 75 72  lag, not the cur
24530 72 65 6e 74 20 73 65 74 74 69 6e 67 20 2a 2f 0a  rent setting */.
24540 20 20 20 20 61 73 73 65 72 74 28 20 73 44 69 73      assert( sDis
24550 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 29 3b 0a  tinct.isTnct );.
24560 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
24570 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42  re is an ORDER B
24580 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 74  Y clause, then t
24590 68 69 73 20 73 6f 72 74 69 6e 67 0a 20 20 2a 2a  his sorting.  **
245a0 20 69 6e 64 65 78 20 6d 69 67 68 74 20 65 6e 64   index might end
245b0 20 75 70 20 62 65 69 6e 67 20 75 6e 75 73 65 64   up being unused
245c0 20 69 66 20 74 68 65 20 64 61 74 61 20 63 61 6e   if the data can
245d0 20 62 65 20 0a 20 20 2a 2a 20 65 78 74 72 61 63   be .  ** extrac
245e0 74 65 64 20 69 6e 20 70 72 65 2d 73 6f 72 74 65  ted in pre-sorte
245f0 64 20 6f 72 64 65 72 2e 20 20 49 66 20 74 68 61  d order.  If tha
24600 74 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74  t is the case, t
24610 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 4f 50 5f  hen the.  ** OP_
24620 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e  OpenEphemeral in
24630 73 74 72 75 63 74 69 6f 6e 20 77 69 6c 6c 20 62  struction will b
24640 65 20 63 68 61 6e 67 65 64 20 74 6f 20 61 6e 20  e changed to an 
24650 4f 50 5f 4e 6f 6f 70 20 6f 6e 63 65 0a 20 20 2a  OP_Noop once.  *
24660 2a 20 77 65 20 66 69 67 75 72 65 20 6f 75 74 20  * we figure out 
24670 74 68 61 74 20 74 68 65 20 73 6f 72 74 69 6e 67  that the sorting
24680 20 69 6e 64 65 78 20 69 73 20 6e 6f 74 20 6e 65   index is not ne
24690 65 64 65 64 2e 20 20 54 68 65 20 61 64 64 72 53  eded.  The addrS
246a0 6f 72 74 49 6e 64 65 78 0a 20 20 2a 2a 20 76 61  ortIndex.  ** va
246b0 72 69 61 62 6c 65 20 69 73 20 75 73 65 64 20 74  riable is used t
246c0 6f 20 66 61 63 69 6c 69 74 61 74 65 20 74 68 61  o facilitate tha
246d0 74 20 63 68 61 6e 67 65 2e 0a 20 20 2a 2f 0a 20  t change..  */. 
246e0 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b   if( pOrderBy ){
246f0 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  .    KeyInfo *pK
24700 65 79 49 6e 66 6f 3b 0a 20 20 20 20 70 4b 65 79  eyInfo;.    pKey
24710 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72  Info = keyInfoFr
24720 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  omExprList(pPars
24730 65 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a 20 20  e, pOrderBy);.  
24740 20 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75    pOrderBy->iECu
24750 72 73 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e  rsor = pParse->n
24760 54 61 62 2b 2b 3b 0a 20 20 20 20 70 2d 3e 61 64  Tab++;.    p->ad
24770 64 72 4f 70 65 6e 45 70 68 6d 5b 32 5d 20 3d 20  drOpenEphm[2] = 
24780 61 64 64 72 53 6f 72 74 49 6e 64 65 78 20 3d 0a  addrSortIndex =.
24790 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
247a0 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70  eAddOp4(v, OP_Op
247b0 65 6e 45 70 68 65 6d 65 72 61 6c 2c 0a 20 20 20  enEphemeral,.   
247c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
247d0 20 20 20 20 20 20 20 20 70 4f 72 64 65 72 42 79          pOrderBy
247e0 2d 3e 69 45 43 75 72 73 6f 72 2c 20 70 4f 72 64  ->iECursor, pOrd
247f0 65 72 42 79 2d 3e 6e 45 78 70 72 2b 32 2c 20 30  erBy->nExpr+2, 0
24800 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
24810 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
24820 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34  ar*)pKeyInfo, P4
24830 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46  _KEYINFO_HANDOFF
24840 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
24850 61 64 64 72 53 6f 72 74 49 6e 64 65 78 20 3d 20  addrSortIndex = 
24860 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  -1;.  }..  /* If
24870 20 74 68 65 20 6f 75 74 70 75 74 20 69 73 20 64   the output is d
24880 65 73 74 69 6e 65 64 20 66 6f 72 20 61 20 74 65  estined for a te
24890 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 6f  mporary table, o
248a0 70 65 6e 20 74 68 61 74 20 74 61 62 6c 65 2e 0a  pen that table..
248b0 20 20 2a 2f 0a 20 20 69 66 28 20 70 44 65 73 74    */.  if( pDest
248c0 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45 70 68  ->eDest==SRT_Eph
248d0 65 6d 54 61 62 20 29 7b 0a 20 20 20 20 73 71 6c  emTab ){.    sql
248e0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
248f0 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
24900 61 6c 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61  al, pDest->iSDPa
24910 72 6d 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  rm, pEList->nExp
24920 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65  r);.  }..  /* Se
24930 74 20 74 68 65 20 6c 69 6d 69 74 65 72 2e 0a 20  t the limiter.. 
24940 20 2a 2f 0a 20 20 69 45 6e 64 20 3d 20 73 71 6c   */.  iEnd = sql
24950 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
24960 6c 28 76 29 3b 0a 20 20 70 2d 3e 6e 53 65 6c 65  l(v);.  p->nSele
24970 63 74 52 6f 77 20 3d 20 28 64 6f 75 62 6c 65 29  ctRow = (double)
24980 4c 41 52 47 45 53 54 5f 49 4e 54 36 34 3b 0a 20  LARGEST_INT64;. 
24990 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67   computeLimitReg
249a0 69 73 74 65 72 73 28 70 50 61 72 73 65 2c 20 70  isters(pParse, p
249b0 2c 20 69 45 6e 64 29 3b 0a 20 20 69 66 28 20 70  , iEnd);.  if( p
249c0 2d 3e 69 4c 69 6d 69 74 3d 3d 30 20 26 26 20 61  ->iLimit==0 && a
249d0 64 64 72 53 6f 72 74 49 6e 64 65 78 3e 3d 30 20  ddrSortIndex>=0 
249e0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
249f0 62 65 47 65 74 4f 70 28 76 2c 20 61 64 64 72 53  beGetOp(v, addrS
24a00 6f 72 74 49 6e 64 65 78 29 2d 3e 6f 70 63 6f 64  ortIndex)->opcod
24a10 65 20 3d 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65  e = OP_SorterOpe
24a20 6e 3b 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61  n;.    p->selFla
24a30 67 73 20 7c 3d 20 53 46 5f 55 73 65 53 6f 72 74  gs |= SF_UseSort
24a40 65 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70  er;.  }..  /* Op
24a50 65 6e 20 61 20 76 69 72 74 75 61 6c 20 69 6e 64  en a virtual ind
24a60 65 78 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68  ex to use for th
24a70 65 20 64 69 73 74 69 6e 63 74 20 73 65 74 2e 0a  e distinct set..
24a80 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65    */.  if( p->se
24a90 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74  lFlags & SF_Dist
24aa0 69 6e 63 74 20 29 7b 0a 20 20 20 20 73 44 69 73  inct ){.    sDis
24ab0 74 69 6e 63 74 2e 74 61 62 54 6e 63 74 20 3d 20  tinct.tabTnct = 
24ac0 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
24ad0 20 20 20 20 73 44 69 73 74 69 6e 63 74 2e 61 64      sDistinct.ad
24ae0 64 72 54 6e 63 74 20 3d 20 73 71 6c 69 74 65 33  drTnct = sqlite3
24af0 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
24b00 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 0a  _OpenEphemeral,.
24b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24b30 73 44 69 73 74 69 6e 63 74 2e 74 61 62 54 6e 63  sDistinct.tabTnc
24b40 74 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20  t, 0, 0,.       
24b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24b60 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
24b70 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c  keyInfoFromExprL
24b80 69 73 74 28 70 50 61 72 73 65 2c 20 70 2d 3e 70  ist(pParse, p->p
24b90 45 4c 69 73 74 29 2c 0a 20 20 20 20 20 20 20 20  EList),.        
24ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24bb0 20 20 20 20 20 20 20 20 50 34 5f 4b 45 59 49 4e          P4_KEYIN
24bc0 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 20  FO_HANDOFF);.   
24bd0 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
24be0 67 65 50 35 28 76 2c 20 42 54 52 45 45 5f 55 4e  geP5(v, BTREE_UN
24bf0 4f 52 44 45 52 45 44 29 3b 0a 20 20 20 20 73 44  ORDERED);.    sD
24c00 69 73 74 69 6e 63 74 2e 65 54 6e 63 74 54 79 70  istinct.eTnctTyp
24c10 65 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e  e = WHERE_DISTIN
24c20 43 54 5f 55 4e 4f 52 44 45 52 45 44 3b 0a 20 20  CT_UNORDERED;.  
24c30 7d 65 6c 73 65 7b 0a 20 20 20 20 73 44 69 73 74  }else{.    sDist
24c40 69 6e 63 74 2e 65 54 6e 63 74 54 79 70 65 20 3d  inct.eTnctType =
24c50 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f   WHERE_DISTINCT_
24c60 4e 4f 4f 50 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  NOOP;.  }..  if(
24c70 20 21 69 73 41 67 67 20 26 26 20 70 47 72 6f 75   !isAgg && pGrou
24c80 70 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  pBy==0 ){.    /*
24c90 20 4e 6f 20 61 67 67 72 65 67 61 74 65 20 66 75   No aggregate fu
24ca0 6e 63 74 69 6f 6e 73 20 61 6e 64 20 6e 6f 20 47  nctions and no G
24cb0 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 2a  ROUP BY clause *
24cc0 2f 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a  /.    ExprList *
24cd0 70 44 69 73 74 20 3d 20 28 73 44 69 73 74 69 6e  pDist = (sDistin
24ce0 63 74 2e 69 73 54 6e 63 74 20 3f 20 70 2d 3e 70  ct.isTnct ? p->p
24cf0 45 4c 69 73 74 20 3a 20 30 29 3b 0a 0a 20 20 20  EList : 0);..   
24d00 20 2f 2a 20 42 65 67 69 6e 20 74 68 65 20 64 61   /* Begin the da
24d10 74 61 62 61 73 65 20 73 63 61 6e 2e 20 2a 2f 0a  tabase scan. */.
24d20 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c      pWInfo = sql
24d30 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 70  ite3WhereBegin(p
24d40 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c  Parse, pTabList,
24d50 20 70 57 68 65 72 65 2c 20 70 4f 72 64 65 72 42   pWhere, pOrderB
24d60 79 2c 20 70 44 69 73 74 2c 20 30 2c 30 29 3b 0a  y, pDist, 0,0);.
24d70 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d      if( pWInfo==
24d80 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f  0 ) goto select_
24d90 65 6e 64 3b 0a 20 20 20 20 69 66 28 20 70 57 49  end;.    if( pWI
24da0 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 20 3c 20 70  nfo->nRowOut < p
24db0 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 29 20 70  ->nSelectRow ) p
24dc0 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 70  ->nSelectRow = p
24dd0 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 3b 0a  WInfo->nRowOut;.
24de0 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e      if( pWInfo->
24df0 65 44 69 73 74 69 6e 63 74 20 29 20 73 44 69 73  eDistinct ) sDis
24e00 74 69 6e 63 74 2e 65 54 6e 63 74 54 79 70 65 20  tinct.eTnctType 
24e10 3d 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69  = pWInfo->eDisti
24e20 6e 63 74 3b 0a 20 20 20 20 69 66 28 20 70 4f 72  nct;.    if( pOr
24e30 64 65 72 42 79 20 26 26 20 70 57 49 6e 66 6f 2d  derBy && pWInfo-
24e40 3e 6e 4f 42 53 61 74 3d 3d 70 4f 72 64 65 72 42  >nOBSat==pOrderB
24e50 79 2d 3e 6e 45 78 70 72 20 29 20 70 4f 72 64 65  y->nExpr ) pOrde
24e60 72 42 79 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a  rBy = 0;..    /*
24e70 20 49 66 20 73 6f 72 74 69 6e 67 20 69 6e 64 65   If sorting inde
24e80 78 20 74 68 61 74 20 77 61 73 20 63 72 65 61 74  x that was creat
24e90 65 64 20 62 79 20 61 20 70 72 69 6f 72 20 4f 50  ed by a prior OP
24ea0 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 0a  _OpenEphemeral .
24eb0 20 20 20 20 2a 2a 20 69 6e 73 74 72 75 63 74 69      ** instructi
24ec0 6f 6e 20 65 6e 64 65 64 20 75 70 20 6e 6f 74 20  on ended up not 
24ed0 62 65 69 6e 67 20 6e 65 65 64 65 64 2c 20 74 68  being needed, th
24ee0 65 6e 20 63 68 61 6e 67 65 20 74 68 65 20 4f 50  en change the OP
24ef0 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 0a 20  _OpenEphemeral. 
24f00 20 20 20 2a 2a 20 69 6e 74 6f 20 61 6e 20 4f 50     ** into an OP
24f10 5f 4e 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20  _Noop..    */.  
24f20 20 20 69 66 28 20 61 64 64 72 53 6f 72 74 49 6e    if( addrSortIn
24f30 64 65 78 3e 3d 30 20 26 26 20 70 4f 72 64 65 72  dex>=0 && pOrder
24f40 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  By==0 ){.      s
24f50 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
24f60 54 6f 4e 6f 6f 70 28 76 2c 20 61 64 64 72 53 6f  ToNoop(v, addrSo
24f70 72 74 49 6e 64 65 78 29 3b 0a 20 20 20 20 20 20  rtIndex);.      
24f80 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
24f90 32 5d 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 0a  2] = -1;.    }..
24fa0 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65 20 73      /* Use the s
24fb0 74 61 6e 64 61 72 64 20 69 6e 6e 65 72 20 6c 6f  tandard inner lo
24fc0 6f 70 2e 20 2a 2f 0a 20 20 20 20 73 65 6c 65 63  op. */.    selec
24fd0 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73  tInnerLoop(pPars
24fe0 65 2c 20 70 2c 20 70 45 4c 69 73 74 2c 20 30 2c  e, p, pEList, 0,
24ff0 20 30 2c 20 70 4f 72 64 65 72 42 79 2c 20 26 73   0, pOrderBy, &s
25000 44 69 73 74 69 6e 63 74 2c 20 70 44 65 73 74 2c  Distinct, pDest,
25010 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
25020 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 69 43 6f       pWInfo->iCo
25030 6e 74 69 6e 75 65 2c 20 70 57 49 6e 66 6f 2d 3e  ntinue, pWInfo->
25040 69 42 72 65 61 6b 29 3b 0a 0a 20 20 20 20 2f 2a  iBreak);..    /*
25050 20 45 6e 64 20 74 68 65 20 64 61 74 61 62 61 73   End the databas
25060 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20  e scan loop..   
25070 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 57   */.    sqlite3W
25080 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b  hereEnd(pWInfo);
25090 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
250a0 20 54 68 69 73 20 63 61 73 65 20 77 68 65 6e 20   This case when 
250b0 74 68 65 72 65 20 65 78 69 73 74 20 61 67 67 72  there exist aggr
250c0 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20  egate functions 
250d0 6f 72 20 61 20 47 52 4f 55 50 20 42 59 20 63 6c  or a GROUP BY cl
250e0 61 75 73 65 0a 20 20 20 20 2a 2a 20 6f 72 20 62  ause.    ** or b
250f0 6f 74 68 20 2a 2f 0a 20 20 20 20 4e 61 6d 65 43  oth */.    NameC
25100 6f 6e 74 65 78 74 20 73 4e 43 3b 20 20 20 20 2f  ontext sNC;    /
25110 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20 66  * Name context f
25120 6f 72 20 70 72 6f 63 65 73 73 69 6e 67 20 61 67  or processing ag
25130 67 72 65 67 61 74 65 20 69 6e 66 6f 72 6d 61 74  gregate informat
25140 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  ion */.    int i
25150 41 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20 2f  AMem;          /
25160 2a 20 46 69 72 73 74 20 4d 65 6d 20 61 64 64 72  * First Mem addr
25170 65 73 73 20 66 6f 72 20 73 74 6f 72 69 6e 67 20  ess for storing 
25180 63 75 72 72 65 6e 74 20 47 52 4f 55 50 20 42 59  current GROUP BY
25190 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 42 4d 65   */.    int iBMe
251a0 6d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  m;          /* F
251b0 69 72 73 74 20 4d 65 6d 20 61 64 64 72 65 73 73  irst Mem address
251c0 20 66 6f 72 20 70 72 65 76 69 6f 75 73 20 47 52   for previous GR
251d0 4f 55 50 20 42 59 20 2a 2f 0a 20 20 20 20 69 6e  OUP BY */.    in
251e0 74 20 69 55 73 65 46 6c 61 67 3b 20 20 20 20 20  t iUseFlag;     
251f0 20 20 2f 2a 20 4d 65 6d 20 61 64 64 72 65 73 73    /* Mem address
25200 20 68 6f 6c 64 69 6e 67 20 66 6c 61 67 20 69 6e   holding flag in
25210 64 69 63 61 74 69 6e 67 20 74 68 61 74 20 61 74  dicating that at
25220 20 6c 65 61 73 74 0a 20 20 20 20 20 20 20 20 20   least.         
25230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
25240 2a 20 6f 6e 65 20 72 6f 77 20 6f 66 20 74 68 65  * one row of the
25250 20 69 6e 70 75 74 20 74 6f 20 74 68 65 20 61 67   input to the ag
25260 67 72 65 67 61 74 6f 72 20 68 61 73 20 62 65 65  gregator has bee
25270 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n.              
25280 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f            ** pro
25290 63 65 73 73 65 64 20 2a 2f 0a 20 20 20 20 69 6e  cessed */.    in
252a0 74 20 69 41 62 6f 72 74 46 6c 61 67 3b 20 20 20  t iAbortFlag;   
252b0 20 20 2f 2a 20 4d 65 6d 20 61 64 64 72 65 73 73    /* Mem address
252c0 20 77 68 69 63 68 20 63 61 75 73 65 73 20 71 75   which causes qu
252d0 65 72 79 20 61 62 6f 72 74 20 69 66 20 70 6f 73  ery abort if pos
252e0 69 74 69 76 65 20 2a 2f 0a 20 20 20 20 69 6e 74  itive */.    int
252f0 20 67 72 6f 75 70 42 79 53 6f 72 74 3b 20 20 20   groupBySort;   
25300 20 2f 2a 20 52 6f 77 73 20 63 6f 6d 65 20 66 72   /* Rows come fr
25310 6f 6d 20 73 6f 75 72 63 65 20 69 6e 20 47 52 4f  om source in GRO
25320 55 50 20 42 59 20 6f 72 64 65 72 20 2a 2f 0a 20  UP BY order */. 
25330 20 20 20 69 6e 74 20 61 64 64 72 45 6e 64 3b 20     int addrEnd; 
25340 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66         /* End of
25350 20 70 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20   processing for 
25360 74 68 69 73 20 53 45 4c 45 43 54 20 2a 2f 0a 20  this SELECT */. 
25370 20 20 20 69 6e 74 20 73 6f 72 74 50 54 61 62 20     int sortPTab 
25380 3d 20 30 3b 20 20 20 2f 2a 20 50 73 65 75 64 6f  = 0;   /* Pseudo
25390 74 61 62 6c 65 20 75 73 65 64 20 74 6f 20 64 65  table used to de
253a0 63 6f 64 65 20 73 6f 72 74 69 6e 67 20 72 65 73  code sorting res
253b0 75 6c 74 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ults */.    int 
253c0 73 6f 72 74 4f 75 74 20 3d 20 30 3b 20 20 20 20  sortOut = 0;    
253d0 2f 2a 20 4f 75 74 70 75 74 20 72 65 67 69 73 74  /* Output regist
253e0 65 72 20 66 72 6f 6d 20 74 68 65 20 73 6f 72 74  er from the sort
253f0 65 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 65  er */..    /* Re
25400 6d 6f 76 65 20 61 6e 79 20 61 6e 64 20 61 6c 6c  move any and all
25410 20 61 6c 69 61 73 65 73 20 62 65 74 77 65 65 6e   aliases between
25420 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
25430 61 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20 47  and the.    ** G
25440 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e 0a  ROUP BY clause..
25450 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
25460 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20  GroupBy ){.     
25470 20 69 6e 74 20 6b 3b 20 20 20 20 20 20 20 20 20   int k;         
25480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25490 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
254a0 2f 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45  /.      struct E
254b0 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
254c0 74 65 6d 3b 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f  tem;  /* For loo
254d0 70 69 6e 67 20 6f 76 65 72 20 65 78 70 72 65 73  ping over expres
254e0 73 69 6f 6e 20 69 6e 20 61 20 6c 69 73 74 20 2a  sion in a list *
254f0 2f 0a 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 70  /..      for(k=p
25500 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c  ->pEList->nExpr,
25510 20 70 49 74 65 6d 3d 70 2d 3e 70 45 4c 69 73 74   pItem=p->pEList
25520 2d 3e 61 3b 20 6b 3e 30 3b 20 6b 2d 2d 2c 20 70  ->a; k>0; k--, p
25530 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Item++){.       
25540 20 70 49 74 65 6d 2d 3e 69 41 6c 69 61 73 20 3d   pItem->iAlias =
25550 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
25560 20 20 66 6f 72 28 6b 3d 70 47 72 6f 75 70 42 79    for(k=pGroupBy
25570 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d 70  ->nExpr, pItem=p
25580 47 72 6f 75 70 42 79 2d 3e 61 3b 20 6b 3e 30 3b  GroupBy->a; k>0;
25590 20 6b 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   k--, pItem++){.
255a0 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69          pItem->i
255b0 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20 20 20 20  Alias = 0;.     
255c0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e   }.      if( p->
255d0 6e 53 65 6c 65 63 74 52 6f 77 3e 28 64 6f 75 62  nSelectRow>(doub
255e0 6c 65 29 31 30 30 20 29 20 70 2d 3e 6e 53 65 6c  le)100 ) p->nSel
255f0 65 63 74 52 6f 77 20 3d 20 28 64 6f 75 62 6c 65  ectRow = (double
25600 29 31 30 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  )100;.    }else{
25610 0a 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63  .      p->nSelec
25620 74 52 6f 77 20 3d 20 28 64 6f 75 62 6c 65 29 31  tRow = (double)1
25630 3b 0a 20 20 20 20 7d 0a 0a 20 0a 20 20 20 20 2f  ;.    }.. .    /
25640 2a 20 43 72 65 61 74 65 20 61 20 6c 61 62 65 6c  * Create a label
25650 20 74 6f 20 6a 75 6d 70 20 74 6f 20 77 68 65 6e   to jump to when
25660 20 77 65 20 77 61 6e 74 20 74 6f 20 61 62 6f 72   we want to abor
25670 74 20 74 68 65 20 71 75 65 72 79 20 2a 2f 0a 20  t the query */. 
25680 20 20 20 61 64 64 72 45 6e 64 20 3d 20 73 71 6c     addrEnd = sql
25690 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
256a0 6c 28 76 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f  l(v);..    /* Co
256b0 6e 76 65 72 74 20 54 4b 5f 43 4f 4c 55 4d 4e 20  nvert TK_COLUMN 
256c0 6e 6f 64 65 73 20 69 6e 74 6f 20 54 4b 5f 41 47  nodes into TK_AG
256d0 47 5f 43 4f 4c 55 4d 4e 20 61 6e 64 20 6d 61 6b  G_COLUMN and mak
256e0 65 20 65 6e 74 72 69 65 73 20 69 6e 0a 20 20 20  e entries in.   
256f0 20 2a 2a 20 73 41 67 67 49 6e 66 6f 20 66 6f 72   ** sAggInfo for
25700 20 61 6c 6c 20 54 4b 5f 41 47 47 5f 46 55 4e 43   all TK_AGG_FUNC
25710 54 49 4f 4e 20 6e 6f 64 65 73 20 69 6e 20 65 78  TION nodes in ex
25720 70 72 65 73 73 69 6f 6e 73 20 6f 66 20 74 68 65  pressions of the
25730 0a 20 20 20 20 2a 2a 20 53 45 4c 45 43 54 20 73  .    ** SELECT s
25740 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20 2a 2f  tatement..    */
25750 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73 4e 43  .    memset(&sNC
25760 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29  , 0, sizeof(sNC)
25770 29 3b 0a 20 20 20 20 73 4e 43 2e 70 50 61 72 73  );.    sNC.pPars
25780 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 20 20  e = pParse;.    
25790 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70  sNC.pSrcList = p
257a0 54 61 62 4c 69 73 74 3b 0a 20 20 20 20 73 4e 43  TabList;.    sNC
257b0 2e 70 41 67 67 49 6e 66 6f 20 3d 20 26 73 41 67  .pAggInfo = &sAg
257c0 67 49 6e 66 6f 3b 0a 20 20 20 20 73 41 67 67 49  gInfo;.    sAggI
257d0 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75  nfo.nSortingColu
257e0 6d 6e 20 3d 20 70 47 72 6f 75 70 42 79 20 3f 20  mn = pGroupBy ? 
257f0 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2b  pGroupBy->nExpr+
25800 31 20 3a 20 30 3b 0a 20 20 20 20 73 41 67 67 49  1 : 0;.    sAggI
25810 6e 66 6f 2e 70 47 72 6f 75 70 42 79 20 3d 20 70  nfo.pGroupBy = p
25820 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 73 71 6c  GroupBy;.    sql
25830 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
25840 67 67 4c 69 73 74 28 26 73 4e 43 2c 20 70 45 4c  ggList(&sNC, pEL
25850 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ist);.    sqlite
25860 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c  3ExprAnalyzeAggL
25870 69 73 74 28 26 73 4e 43 2c 20 70 4f 72 64 65 72  ist(&sNC, pOrder
25880 42 79 29 3b 0a 20 20 20 20 69 66 28 20 70 48 61  By);.    if( pHa
25890 76 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 73 71  ving ){.      sq
258a0 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65  lite3ExprAnalyze
258b0 41 67 67 72 65 67 61 74 65 73 28 26 73 4e 43 2c  Aggregates(&sNC,
258c0 20 70 48 61 76 69 6e 67 29 3b 0a 20 20 20 20 7d   pHaving);.    }
258d0 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6e 41  .    sAggInfo.nA
258e0 63 63 75 6d 75 6c 61 74 6f 72 20 3d 20 73 41 67  ccumulator = sAg
258f0 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 0a 20  gInfo.nColumn;. 
25900 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41     for(i=0; i<sA
25910 67 67 49 6e 66 6f 2e 6e 46 75 6e 63 3b 20 69 2b  ggInfo.nFunc; i+
25920 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  +){.      assert
25930 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
25940 74 79 28 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e  ty(sAggInfo.aFun
25950 63 5b 69 5d 2e 70 45 78 70 72 2c 20 45 50 5f 78  c[i].pExpr, EP_x
25960 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20  IsSelect) );.   
25970 20 20 20 73 4e 43 2e 6e 63 46 6c 61 67 73 20 7c     sNC.ncFlags |
25980 3d 20 4e 43 5f 49 6e 41 67 67 46 75 6e 63 3b 0a  = NC_InAggFunc;.
25990 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
259a0 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28  rAnalyzeAggList(
259b0 26 73 4e 43 2c 20 73 41 67 67 49 6e 66 6f 2e 61  &sNC, sAggInfo.a
259c0 46 75 6e 63 5b 69 5d 2e 70 45 78 70 72 2d 3e 78  Func[i].pExpr->x
259d0 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 73  .pList);.      s
259e0 4e 43 2e 6e 63 46 6c 61 67 73 20 26 3d 20 7e 4e  NC.ncFlags &= ~N
259f0 43 5f 49 6e 41 67 67 46 75 6e 63 3b 0a 20 20 20  C_InAggFunc;.   
25a00 20 7d 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d   }.    if( db->m
25a10 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f  allocFailed ) go
25a20 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a  to select_end;..
25a30 20 20 20 20 2f 2a 20 50 72 6f 63 65 73 73 69 6e      /* Processin
25a40 67 20 66 6f 72 20 61 67 67 72 65 67 61 74 65 73  g for aggregates
25a50 20 77 69 74 68 20 47 52 4f 55 50 20 42 59 20 69   with GROUP BY i
25a60 73 20 76 65 72 79 20 64 69 66 66 65 72 65 6e 74  s very different
25a70 20 61 6e 64 0a 20 20 20 20 2a 2a 20 6d 75 63 68   and.    ** much
25a80 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20 74 68   more complex th
25a90 61 6e 20 61 67 67 72 65 67 61 74 65 73 20 77 69  an aggregates wi
25aa0 74 68 6f 75 74 20 61 20 47 52 4f 55 50 20 42 59  thout a GROUP BY
25ab0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
25ac0 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20   pGroupBy ){.   
25ad0 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79     KeyInfo *pKey
25ae0 49 6e 66 6f 3b 20 20 2f 2a 20 4b 65 79 69 6e 67  Info;  /* Keying
25af0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72   information for
25b00 20 74 68 65 20 67 72 6f 75 70 20 62 79 20 63 6c   the group by cl
25b10 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ause */.      in
25b20 74 20 6a 31 3b 20 20 20 20 20 20 20 20 20 20 20  t j1;           
25b30 20 20 2f 2a 20 41 2d 76 73 2d 42 20 63 6f 6d 70    /* A-vs-B comp
25b40 61 72 69 73 69 6f 6e 20 6a 75 6d 70 20 2a 2f 0a  arision jump */.
25b50 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 4f 75        int addrOu
25b60 74 70 75 74 52 6f 77 3b 20 20 2f 2a 20 53 74 61  tputRow;  /* Sta
25b70 72 74 20 6f 66 20 73 75 62 72 6f 75 74 69 6e 65  rt of subroutine
25b80 20 74 68 61 74 20 6f 75 74 70 75 74 73 20 61 20   that outputs a 
25b90 72 65 73 75 6c 74 20 72 6f 77 20 2a 2f 0a 20 20  result row */.  
25ba0 20 20 20 20 69 6e 74 20 72 65 67 4f 75 74 70 75      int regOutpu
25bb0 74 52 6f 77 3b 20 20 20 2f 2a 20 52 65 74 75 72  tRow;   /* Retur
25bc0 6e 20 61 64 64 72 65 73 73 20 72 65 67 69 73 74  n address regist
25bd0 65 72 20 66 6f 72 20 6f 75 74 70 75 74 20 73 75  er for output su
25be0 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 20 20  broutine */.    
25bf0 20 20 69 6e 74 20 61 64 64 72 53 65 74 41 62 6f    int addrSetAbo
25c00 72 74 3b 20 20 20 2f 2a 20 53 65 74 20 74 68 65  rt;   /* Set the
25c10 20 61 62 6f 72 74 20 66 6c 61 67 20 61 6e 64 20   abort flag and 
25c20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 20 20 20 20  return */.      
25c30 69 6e 74 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f  int addrTopOfLoo
25c40 70 3b 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68  p;  /* Top of th
25c50 65 20 69 6e 70 75 74 20 6c 6f 6f 70 20 2a 2f 0a  e input loop */.
25c60 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 53 6f        int addrSo
25c70 72 74 69 6e 67 49 64 78 3b 20 2f 2a 20 54 68 65  rtingIdx; /* The
25c80 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
25c90 6c 20 66 6f 72 20 74 68 65 20 73 6f 72 74 69 6e  l for the sortin
25ca0 67 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20  g index */.     
25cb0 20 69 6e 74 20 61 64 64 72 52 65 73 65 74 3b 20   int addrReset; 
25cc0 20 20 20 20 20 2f 2a 20 53 75 62 72 6f 75 74 69       /* Subrouti
25cd0 6e 65 20 66 6f 72 20 72 65 73 65 74 74 69 6e 67  ne for resetting
25ce0 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74 6f 72   the accumulator
25cf0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 65   */.      int re
25d00 67 52 65 73 65 74 3b 20 20 20 20 20 20 20 2f 2a  gReset;       /*
25d10 20 52 65 74 75 72 6e 20 61 64 64 72 65 73 73 20   Return address 
25d20 72 65 67 69 73 74 65 72 20 66 6f 72 20 72 65 73  register for res
25d30 65 74 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f  et subroutine */
25d40 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  ..      /* If th
25d50 65 72 65 20 69 73 20 61 20 47 52 4f 55 50 20 42  ere is a GROUP B
25d60 59 20 63 6c 61 75 73 65 20 77 65 20 6d 69 67 68  Y clause we migh
25d70 74 20 6e 65 65 64 20 61 20 73 6f 72 74 69 6e 67  t need a sorting
25d80 20 69 6e 64 65 78 20 74 6f 0a 20 20 20 20 20 20   index to.      
25d90 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 69 74 2e  ** implement it.
25da0 20 20 41 6c 6c 6f 63 61 74 65 20 74 68 61 74 20    Allocate that 
25db0 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 6e 6f  sorting index no
25dc0 77 2e 20 20 49 66 20 69 74 20 74 75 72 6e 73 20  w.  If it turns 
25dd0 6f 75 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 61  out.      ** tha
25de0 74 20 77 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64  t we do not need
25df0 20 69 74 20 61 66 74 65 72 20 61 6c 6c 2c 20 74   it after all, t
25e00 68 65 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e  he OP_SorterOpen
25e10 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a 20 20 20   instruction.   
25e20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 63 6f     ** will be co
25e30 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61 20 4e  nverted into a N
25e40 6f 6f 70 2e 20 20 0a 20 20 20 20 20 20 2a 2f 0a  oop.  .      */.
25e50 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 73        sAggInfo.s
25e60 6f 72 74 69 6e 67 49 64 78 20 3d 20 70 50 61 72  ortingIdx = pPar
25e70 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
25e80 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79    pKeyInfo = key
25e90 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74  InfoFromExprList
25ea0 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42  (pParse, pGroupB
25eb0 79 29 3b 0a 20 20 20 20 20 20 61 64 64 72 53 6f  y);.      addrSo
25ec0 72 74 69 6e 67 49 64 78 20 3d 20 73 71 6c 69 74  rtingIdx = sqlit
25ed0 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
25ee0 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e 2c 20 0a  OP_SorterOpen, .
25ef0 20 20 20 20 20 20 20 20 20 20 73 41 67 67 49 6e            sAggIn
25f00 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 73  fo.sortingIdx, s
25f10 41 67 67 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67  AggInfo.nSorting
25f20 43 6f 6c 75 6d 6e 2c 20 0a 20 20 20 20 20 20 20  Column, .       
25f30 20 20 20 30 2c 20 28 63 68 61 72 2a 29 70 4b 65     0, (char*)pKe
25f40 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46  yInfo, P4_KEYINF
25f50 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 0a 20 20 20  O_HANDOFF);..   
25f60 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65     /* Initialize
25f70 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e   memory location
25f80 73 20 75 73 65 64 20 62 79 20 47 52 4f 55 50 20  s used by GROUP 
25f90 42 59 20 61 67 67 72 65 67 61 74 65 20 70 72 6f  BY aggregate pro
25fa0 63 65 73 73 69 6e 67 0a 20 20 20 20 20 20 2a 2f  cessing.      */
25fb0 0a 20 20 20 20 20 20 69 55 73 65 46 6c 61 67 20  .      iUseFlag 
25fc0 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
25fd0 3b 0a 20 20 20 20 20 20 69 41 62 6f 72 74 46 6c  ;.      iAbortFl
25fe0 61 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  ag = ++pParse->n
25ff0 4d 65 6d 3b 0a 20 20 20 20 20 20 72 65 67 4f 75  Mem;.      regOu
26000 74 70 75 74 52 6f 77 20 3d 20 2b 2b 70 50 61 72  tputRow = ++pPar
26010 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
26020 61 64 64 72 4f 75 74 70 75 74 52 6f 77 20 3d 20  addrOutputRow = 
26030 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
26040 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 72  abel(v);.      r
26050 65 67 52 65 73 65 74 20 3d 20 2b 2b 70 50 61 72  egReset = ++pPar
26060 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
26070 61 64 64 72 52 65 73 65 74 20 3d 20 73 71 6c 69  addrReset = sqli
26080 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
26090 28 76 29 3b 0a 20 20 20 20 20 20 69 41 4d 65 6d  (v);.      iAMem
260a0 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20   = pParse->nMem 
260b0 2b 20 31 3b 0a 20 20 20 20 20 20 70 50 61 72 73  + 1;.      pPars
260c0 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f 75  e->nMem += pGrou
260d0 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  pBy->nExpr;.    
260e0 20 20 69 42 4d 65 6d 20 3d 20 70 50 61 72 73 65    iBMem = pParse
260f0 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 20 20  ->nMem + 1;.    
26100 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
26110 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  = pGroupBy->nExp
26120 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  r;.      sqlite3
26130 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
26140 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 69 41 62  _Integer, 0, iAb
26150 6f 72 74 46 6c 61 67 29 3b 0a 20 20 20 20 20 20  ortFlag);.      
26160 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
26170 22 63 6c 65 61 72 20 61 62 6f 72 74 20 66 6c 61  "clear abort fla
26180 67 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  g"));.      sqli
26190 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
261a0 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
261b0 69 55 73 65 46 6c 61 67 29 3b 0a 20 20 20 20 20  iUseFlag);.     
261c0 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
261d0 20 22 69 6e 64 69 63 61 74 65 20 61 63 63 75 6d   "indicate accum
261e0 75 6c 61 74 6f 72 20 65 6d 70 74 79 22 29 29 3b  ulator empty"));
261f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
26200 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e  beAddOp3(v, OP_N
26210 75 6c 6c 2c 20 30 2c 20 69 41 4d 65 6d 2c 20 69  ull, 0, iAMem, i
26220 41 4d 65 6d 2b 70 47 72 6f 75 70 42 79 2d 3e 6e  AMem+pGroupBy->n
26230 45 78 70 72 2d 31 29 3b 0a 0a 20 20 20 20 20 20  Expr-1);..      
26240 2f 2a 20 42 65 67 69 6e 20 61 20 6c 6f 6f 70 20  /* Begin a loop 
26250 74 68 61 74 20 77 69 6c 6c 20 65 78 74 72 61 63  that will extrac
26260 74 20 61 6c 6c 20 73 6f 75 72 63 65 20 72 6f 77  t all source row
26270 73 20 69 6e 20 47 52 4f 55 50 20 42 59 20 6f 72  s in GROUP BY or
26280 64 65 72 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68  der..      ** Th
26290 69 73 20 6d 69 67 68 74 20 69 6e 76 6f 6c 76 65  is might involve
262a0 20 74 77 6f 20 73 65 70 61 72 61 74 65 20 6c 6f   two separate lo
262b0 6f 70 73 20 77 69 74 68 20 61 6e 20 4f 50 5f 53  ops with an OP_S
262c0 6f 72 74 20 69 6e 20 62 65 74 77 65 65 6e 2c 20  ort in between, 
262d0 6f 72 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 6d  or.      ** it m
262e0 69 67 68 74 20 62 65 20 61 20 73 69 6e 67 6c 65  ight be a single
262f0 20 6c 6f 6f 70 20 74 68 61 74 20 75 73 65 73 20   loop that uses 
26300 61 6e 20 69 6e 64 65 78 20 74 6f 20 65 78 74 72  an index to extr
26310 61 63 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a  act information.
26320 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20        ** in the 
26330 72 69 67 68 74 20 6f 72 64 65 72 20 74 6f 20 62  right order to b
26340 65 67 69 6e 20 77 69 74 68 2e 0a 20 20 20 20 20  egin with..     
26350 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
26360 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
26370 50 5f 47 6f 73 75 62 2c 20 72 65 67 52 65 73 65  P_Gosub, regRese
26380 74 2c 20 61 64 64 72 52 65 73 65 74 29 3b 0a 20  t, addrReset);. 
26390 20 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 73 71       pWInfo = sq
263a0 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
263b0 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74  pParse, pTabList
263c0 2c 20 70 57 68 65 72 65 2c 20 70 47 72 6f 75 70  , pWhere, pGroup
263d0 42 79 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  By, 0, 0, 0);.  
263e0 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d      if( pWInfo==
263f0 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f  0 ) goto select_
26400 65 6e 64 3b 0a 20 20 20 20 20 20 69 66 28 20 70  end;.      if( p
26410 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 3d 3d 70  WInfo->nOBSat==p
26420 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 20 29  GroupBy->nExpr )
26430 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
26440 20 6f 70 74 69 6d 69 7a 65 72 20 69 73 20 61 62   optimizer is ab
26450 6c 65 20 74 6f 20 64 65 6c 69 76 65 72 20 72 6f  le to deliver ro
26460 77 73 20 69 6e 20 67 72 6f 75 70 20 62 79 20 6f  ws in group by o
26470 72 64 65 72 20 73 6f 0a 20 20 20 20 20 20 20 20  rder so.        
26480 2a 2a 20 77 65 20 64 6f 20 6e 6f 74 20 68 61 76  ** we do not hav
26490 65 20 74 6f 20 73 6f 72 74 2e 20 20 54 68 65 20  e to sort.  The 
264a0 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
264b0 20 74 61 62 6c 65 20 77 69 6c 6c 20 62 65 0a 20   table will be. 
264c0 20 20 20 20 20 20 20 2a 2a 20 63 61 6e 63 65 6c         ** cancel
264d0 6c 65 64 20 6c 61 74 65 72 20 62 65 63 61 75 73  led later becaus
264e0 65 20 77 65 20 73 74 69 6c 6c 20 6e 65 65 64 20  e we still need 
264f0 74 6f 20 75 73 65 20 74 68 65 20 70 4b 65 79 49  to use the pKeyI
26500 6e 66 6f 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  nfo.        */. 
26510 20 20 20 20 20 20 20 67 72 6f 75 70 42 79 53 6f         groupBySo
26520 72 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65  rt = 0;.      }e
26530 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
26540 52 6f 77 73 20 61 72 65 20 63 6f 6d 69 6e 67 20  Rows are coming 
26550 6f 75 74 20 69 6e 20 75 6e 64 65 74 65 72 6d 69  out in undetermi
26560 6e 65 64 20 6f 72 64 65 72 2e 20 20 57 65 20 68  ned order.  We h
26570 61 76 65 20 74 6f 20 70 75 73 68 0a 20 20 20 20  ave to push.    
26580 20 20 20 20 2a 2a 20 65 61 63 68 20 72 6f 77 20      ** each row 
26590 69 6e 74 6f 20 61 20 73 6f 72 74 69 6e 67 20 69  into a sorting i
265a0 6e 64 65 78 2c 20 74 65 72 6d 69 6e 61 74 65 20  ndex, terminate 
265b0 74 68 65 20 66 69 72 73 74 20 6c 6f 6f 70 2c 0a  the first loop,.
265c0 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20          ** then 
265d0 6c 6f 6f 70 20 6f 76 65 72 20 74 68 65 20 73 6f  loop over the so
265e0 72 74 69 6e 67 20 69 6e 64 65 78 20 69 6e 20 6f  rting index in o
265f0 72 64 65 72 20 74 6f 20 67 65 74 20 74 68 65 20  rder to get the 
26600 6f 75 74 70 75 74 0a 20 20 20 20 20 20 20 20 2a  output.        *
26610 2a 20 69 6e 20 73 6f 72 74 65 64 20 6f 72 64 65  * in sorted orde
26620 72 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  r.        */.   
26630 20 20 20 20 20 69 6e 74 20 72 65 67 42 61 73 65       int regBase
26640 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 65  ;.        int re
26650 67 52 65 63 6f 72 64 3b 0a 20 20 20 20 20 20 20  gRecord;.       
26660 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 20 20 20   int nCol;.     
26670 20 20 20 69 6e 74 20 6e 47 72 6f 75 70 42 79 3b     int nGroupBy;
26680 0a 0a 20 20 20 20 20 20 20 20 65 78 70 6c 61 69  ..        explai
26690 6e 54 65 6d 70 54 61 62 6c 65 28 70 50 61 72 73  nTempTable(pPars
266a0 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  e, .            
266b0 28 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63  (sDistinct.isTnc
266c0 74 20 26 26 20 28 70 2d 3e 73 65 6c 46 6c 61 67  t && (p->selFlag
266d0 73 26 53 46 5f 44 69 73 74 69 6e 63 74 29 3d 3d  s&SF_Distinct)==
266e0 30 29 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20  0) ?.           
266f0 20 20 20 20 20 20 20 20 20 22 44 49 53 54 49 4e           "DISTIN
26700 43 54 22 20 3a 20 22 47 52 4f 55 50 20 42 59 22  CT" : "GROUP BY"
26710 29 3b 0a 0a 20 20 20 20 20 20 20 20 67 72 6f 75  );..        grou
26720 70 42 79 53 6f 72 74 20 3d 20 31 3b 0a 20 20 20  pBySort = 1;.   
26730 20 20 20 20 20 6e 47 72 6f 75 70 42 79 20 3d 20       nGroupBy = 
26740 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b  pGroupBy->nExpr;
26750 0a 20 20 20 20 20 20 20 20 6e 43 6f 6c 20 3d 20  .        nCol = 
26760 6e 47 72 6f 75 70 42 79 20 2b 20 31 3b 0a 20 20  nGroupBy + 1;.  
26770 20 20 20 20 20 20 6a 20 3d 20 6e 47 72 6f 75 70        j = nGroup
26780 42 79 2b 31 3b 0a 20 20 20 20 20 20 20 20 66 6f  By+1;.        fo
26790 72 28 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66  r(i=0; i<sAggInf
267a0 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b  o.nColumn; i++){
267b0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73  .          if( s
267c0 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69 5d 2e  AggInfo.aCol[i].
267d0 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3e 3d 6a  iSorterColumn>=j
267e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
267f0 6e 43 6f 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nCol++;.        
26800 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 20      j++;.       
26810 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
26820 20 20 20 20 20 20 20 72 65 67 42 61 73 65 20 3d         regBase =
26830 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
26840 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 43 6f  ange(pParse, nCo
26850 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  l);.        sqli
26860 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61  te3ExprCacheClea
26870 72 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  r(pParse);.     
26880 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
26890 64 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  deExprList(pPars
268a0 65 2c 20 70 47 72 6f 75 70 42 79 2c 20 72 65 67  e, pGroupBy, reg
268b0 42 61 73 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  Base, 0);.      
268c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
268d0 4f 70 32 28 76 2c 20 4f 50 5f 53 65 71 75 65 6e  Op2(v, OP_Sequen
268e0 63 65 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72  ce, sAggInfo.sor
268f0 74 69 6e 67 49 64 78 2c 72 65 67 42 61 73 65 2b  tingIdx,regBase+
26900 6e 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 20  nGroupBy);.     
26910 20 20 20 6a 20 3d 20 6e 47 72 6f 75 70 42 79 2b     j = nGroupBy+
26920 31 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  1;.        for(i
26930 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e  =0; i<sAggInfo.n
26940 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Column; i++){.  
26950 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 41          struct A
26960 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c  ggInfo_col *pCol
26970 20 3d 20 26 73 41 67 67 49 6e 66 6f 2e 61 43 6f   = &sAggInfo.aCo
26980 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  l[i];.          
26990 69 66 28 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65  if( pCol->iSorte
269a0 72 43 6f 6c 75 6d 6e 3e 3d 6a 20 29 7b 0a 20 20  rColumn>=j ){.  
269b0 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 72 31            int r1
269c0 20 3d 20 6a 20 2b 20 72 65 67 42 61 73 65 3b 0a   = j + regBase;.
269d0 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
269e0 72 32 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20  r2;..           
269f0 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r2 = sqlite3Exp
26a00 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28 70  rCodeGetColumn(p
26a10 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20  Parse, .        
26a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26a30 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 54 61         pCol->pTa
26a40 62 2c 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e  b, pCol->iColumn
26a50 2c 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 2c 20  , pCol->iTable, 
26a60 72 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  r1, 0);.        
26a70 20 20 20 20 69 66 28 20 72 31 21 3d 72 32 20 29      if( r1!=r2 )
26a80 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
26a90 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
26aa0 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 72  2(v, OP_SCopy, r
26ab0 32 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20  2, r1);.        
26ac0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
26ad0 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20    j++;.         
26ae0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
26af0 20 20 20 20 20 72 65 67 52 65 63 6f 72 64 20 3d       regRecord =
26b00 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
26b10 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
26b20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
26b30 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp3(v, OP_Make
26b40 52 65 63 6f 72 64 2c 20 72 65 67 42 61 73 65 2c  Record, regBase,
26b50 20 6e 43 6f 6c 2c 20 72 65 67 52 65 63 6f 72 64   nCol, regRecord
26b60 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
26b70 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
26b80 4f 50 5f 53 6f 72 74 65 72 49 6e 73 65 72 74 2c  OP_SorterInsert,
26b90 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e   sAggInfo.sortin
26ba0 67 49 64 78 2c 20 72 65 67 52 65 63 6f 72 64 29  gIdx, regRecord)
26bb0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
26bc0 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
26bd0 70 50 61 72 73 65 2c 20 72 65 67 52 65 63 6f 72  pParse, regRecor
26be0 64 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  d);.        sqli
26bf0 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61  te3ReleaseTempRa
26c00 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 42  nge(pParse, regB
26c10 61 73 65 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20  ase, nCol);.    
26c20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65      sqlite3Where
26c30 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20  End(pWInfo);.   
26c40 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 73 6f       sAggInfo.so
26c50 72 74 69 6e 67 49 64 78 50 54 61 62 20 3d 20 73  rtingIdxPTab = s
26c60 6f 72 74 50 54 61 62 20 3d 20 70 50 61 72 73 65  ortPTab = pParse
26c70 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20  ->nTab++;.      
26c80 20 20 73 6f 72 74 4f 75 74 20 3d 20 73 71 6c 69    sortOut = sqli
26c90 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
26ca0 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73  arse);.        s
26cb0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
26cc0 28 76 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64  (v, OP_OpenPseud
26cd0 6f 2c 20 73 6f 72 74 50 54 61 62 2c 20 73 6f 72  o, sortPTab, sor
26ce0 74 4f 75 74 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20  tOut, nCol);.   
26cf0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
26d00 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72  AddOp2(v, OP_Sor
26d10 74 65 72 53 6f 72 74 2c 20 73 41 67 67 49 6e 66  terSort, sAggInf
26d20 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 61 64  o.sortingIdx, ad
26d30 64 72 45 6e 64 29 3b 0a 20 20 20 20 20 20 20 20  drEnd);.        
26d40 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
26d50 22 47 52 4f 55 50 20 42 59 20 73 6f 72 74 22 29  "GROUP BY sort")
26d60 29 3b 0a 20 20 20 20 20 20 20 20 73 41 67 67 49  );.        sAggI
26d70 6e 66 6f 2e 75 73 65 53 6f 72 74 69 6e 67 49 64  nfo.useSortingId
26d80 78 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 73  x = 1;.        s
26d90 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43  qlite3ExprCacheC
26da0 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20  lear(pParse);.  
26db0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
26dc0 45 76 61 6c 75 61 74 65 20 74 68 65 20 63 75 72  Evaluate the cur
26dd0 72 65 6e 74 20 47 52 4f 55 50 20 42 59 20 74 65  rent GROUP BY te
26de0 72 6d 73 20 61 6e 64 20 73 74 6f 72 65 20 69 6e  rms and store in
26df0 20 62 30 2c 20 62 31 2c 20 62 32 2e 2e 2e 0a 20   b0, b1, b2.... 
26e00 20 20 20 20 20 2a 2a 20 28 62 30 20 69 73 20 6d       ** (b0 is m
26e10 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20 69  emory location i
26e20 42 4d 65 6d 2b 30 2c 20 62 31 20 69 73 20 69 42  BMem+0, b1 is iB
26e30 4d 65 6d 2b 31 2c 20 61 6e 64 20 73 6f 20 66 6f  Mem+1, and so fo
26e40 72 74 68 29 0a 20 20 20 20 20 20 2a 2a 20 54 68  rth).      ** Th
26e50 65 6e 20 63 6f 6d 70 61 72 65 20 74 68 65 20 63  en compare the c
26e60 75 72 72 65 6e 74 20 47 52 4f 55 50 20 42 59 20  urrent GROUP BY 
26e70 74 65 72 6d 73 20 61 67 61 69 6e 73 74 20 74 68  terms against th
26e80 65 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d 73  e GROUP BY terms
26e90 0a 20 20 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74  .      ** from t
26ea0 68 65 20 70 72 65 76 69 6f 75 73 20 72 6f 77 20  he previous row 
26eb0 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72 65 64  currently stored
26ec0 20 69 6e 20 61 30 2c 20 61 31 2c 20 61 32 2e 2e   in a0, a1, a2..
26ed0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
26ee0 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 20 3d   addrTopOfLoop =
26ef0 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
26f00 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
26f10 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
26f20 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b  heClear(pParse);
26f30 0a 20 20 20 20 20 20 69 66 28 20 67 72 6f 75 70  .      if( group
26f40 42 79 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20  BySort ){.      
26f50 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
26f60 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72  Op2(v, OP_Sorter
26f70 44 61 74 61 2c 20 73 41 67 67 49 6e 66 6f 2e 73  Data, sAggInfo.s
26f80 6f 72 74 69 6e 67 49 64 78 2c 20 73 6f 72 74 4f  ortingIdx, sortO
26f90 75 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ut);.      }.   
26fa0 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 47     for(j=0; j<pG
26fb0 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20 6a  roupBy->nExpr; j
26fc0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
26fd0 20 67 72 6f 75 70 42 79 53 6f 72 74 20 29 7b 0a   groupBySort ){.
26fe0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
26ff0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
27000 50 5f 43 6f 6c 75 6d 6e 2c 20 73 6f 72 74 50 54  P_Column, sortPT
27010 61 62 2c 20 6a 2c 20 69 42 4d 65 6d 2b 6a 29 3b  ab, j, iBMem+j);
27020 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6a  .          if( j
27030 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 56 64 62  ==0 ) sqlite3Vdb
27040 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46  eChangeP5(v, OPF
27050 4c 41 47 5f 43 4c 45 41 52 43 41 43 48 45 29 3b  LAG_CLEARCACHE);
27060 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
27070 20 20 20 20 20 20 20 20 20 20 73 41 67 67 49 6e            sAggIn
27080 66 6f 2e 64 69 72 65 63 74 4d 6f 64 65 20 3d 20  fo.directMode = 
27090 31 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  1;.          sql
270a0 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
270b0 72 73 65 2c 20 70 47 72 6f 75 70 42 79 2d 3e 61  rse, pGroupBy->a
270c0 5b 6a 5d 2e 70 45 78 70 72 2c 20 69 42 4d 65 6d  [j].pExpr, iBMem
270d0 2b 6a 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  +j);.        }. 
270e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
270f0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
27100 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 69 41  , OP_Compare, iA
27110 4d 65 6d 2c 20 69 42 4d 65 6d 2c 20 70 47 72 6f  Mem, iBMem, pGro
27120 75 70 42 79 2d 3e 6e 45 78 70 72 2c 0a 20 20 20  upBy->nExpr,.   
27130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27140 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b         (char*)pK
27150 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e  eyInfo, P4_KEYIN
27160 46 4f 29 3b 0a 20 20 20 20 20 20 6a 31 20 3d 20  FO);.      j1 = 
27170 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
27180 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20  ntAddr(v);.     
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 4a 75 6d 70 2c 20 6a  p3(v, OP_Jump, j
271b0 31 2b 31 2c 20 30 2c 20 6a 31 2b 31 29 3b 0a 0a  1+1, 0, j1+1);..
271c0 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
271d0 65 20 63 6f 64 65 20 74 68 61 74 20 72 75 6e 73  e code that runs
271e0 20 77 68 65 6e 65 76 65 72 20 74 68 65 20 47 52   whenever the GR
271f0 4f 55 50 20 42 59 20 63 68 61 6e 67 65 73 2e 0a  OUP BY changes..
27200 20 20 20 20 20 20 2a 2a 20 43 68 61 6e 67 65 73        ** Changes
27210 20 69 6e 20 74 68 65 20 47 52 4f 55 50 20 42 59   in the GROUP BY
27220 20 61 72 65 20 64 65 74 65 63 74 65 64 20 62 79   are detected by
27230 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 63 6f   the previous co
27240 64 65 0a 20 20 20 20 20 20 2a 2a 20 62 6c 6f 63  de.      ** bloc
27250 6b 2e 20 20 49 66 20 74 68 65 72 65 20 77 65 72  k.  If there wer
27260 65 20 6e 6f 20 63 68 61 6e 67 65 73 2c 20 74 68  e no changes, th
27270 69 73 20 62 6c 6f 63 6b 20 69 73 20 73 6b 69 70  is block is skip
27280 70 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ped..      **.  
27290 20 20 20 20 2a 2a 20 54 68 69 73 20 63 6f 64 65      ** This code
272a0 20 63 6f 70 69 65 73 20 63 75 72 72 65 6e 74 20   copies current 
272b0 67 72 6f 75 70 20 62 79 20 74 65 72 6d 73 20 69  group by terms i
272c0 6e 20 62 30 2c 62 31 2c 62 32 2c 2e 2e 2e 0a 20  n b0,b1,b2,.... 
272d0 20 20 20 20 20 2a 2a 20 6f 76 65 72 20 74 6f 20       ** over to 
272e0 61 30 2c 61 31 2c 61 32 2e 20 20 49 74 20 74 68  a0,a1,a2.  It th
272f0 65 6e 20 63 61 6c 6c 73 20 74 68 65 20 6f 75 74  en calls the out
27300 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65 0a 20  put subroutine. 
27310 20 20 20 20 20 2a 2a 20 61 6e 64 20 72 65 73 65       ** and rese
27320 74 73 20 74 68 65 20 61 67 67 72 65 67 61 74 65  ts the aggregate
27330 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 72 65 67   accumulator reg
27340 69 73 74 65 72 73 20 69 6e 20 70 72 65 70 61 72  isters in prepar
27350 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 66  ation.      ** f
27360 6f 72 20 74 68 65 20 6e 65 78 74 20 47 52 4f 55  or the next GROU
27370 50 20 42 59 20 62 61 74 63 68 2e 0a 20 20 20 20  P BY batch..    
27380 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74    */.      sqlit
27390 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70  e3ExprCodeMove(p
273a0 50 61 72 73 65 2c 20 69 42 4d 65 6d 2c 20 69 41  Parse, iBMem, iA
273b0 4d 65 6d 2c 20 70 47 72 6f 75 70 42 79 2d 3e 6e  Mem, pGroupBy->n
273c0 45 78 70 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  Expr);.      sql
273d0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
273e0 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f  , OP_Gosub, regO
273f0 75 74 70 75 74 52 6f 77 2c 20 61 64 64 72 4f 75  utputRow, addrOu
27400 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20  tputRow);.      
27410 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
27420 22 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f 77 22  "output one row"
27430 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
27440 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
27450 50 5f 49 66 50 6f 73 2c 20 69 41 62 6f 72 74 46  P_IfPos, iAbortF
27460 6c 61 67 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20  lag, addrEnd);. 
27470 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
27480 28 28 76 2c 20 22 63 68 65 63 6b 20 61 62 6f 72  ((v, "check abor
27490 74 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20 20  t flag"));.     
274a0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
274b0 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
274c0 72 65 67 52 65 73 65 74 2c 20 61 64 64 72 52 65  regReset, addrRe
274d0 73 65 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65  set);.      Vdbe
274e0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72 65 73  Comment((v, "res
274f0 65 74 20 61 63 63 75 6d 75 6c 61 74 6f 72 22 29  et accumulator")
27500 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 55 70 64  );..      /* Upd
27510 61 74 65 20 74 68 65 20 61 67 67 72 65 67 61 74  ate the aggregat
27520 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 73 20 62  e accumulators b
27530 61 73 65 64 20 6f 6e 20 74 68 65 20 63 6f 6e 74  ased on the cont
27540 65 6e 74 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20  ent of.      ** 
27550 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 0a  the current row.
27560 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
27570 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
27580 72 65 28 76 2c 20 6a 31 29 3b 0a 20 20 20 20 20  re(v, j1);.     
27590 20 75 70 64 61 74 65 41 63 63 75 6d 75 6c 61 74   updateAccumulat
275a0 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41 67 67  or(pParse, &sAgg
275b0 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c  Info);.      sql
275c0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
275d0 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c  , OP_Integer, 1,
275e0 20 69 55 73 65 46 6c 61 67 29 3b 0a 20 20 20 20   iUseFlag);.    
275f0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
27600 2c 20 22 69 6e 64 69 63 61 74 65 20 64 61 74 61  , "indicate data
27610 20 69 6e 20 61 63 63 75 6d 75 6c 61 74 6f 72 22   in accumulator"
27620 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 45 6e  ));..      /* En
27630 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70 0a 20 20  d of the loop.  
27640 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
27650 20 67 72 6f 75 70 42 79 53 6f 72 74 20 29 7b 0a   groupBySort ){.
27660 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
27670 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
27680 53 6f 72 74 65 72 4e 65 78 74 2c 20 73 41 67 67  SorterNext, sAgg
27690 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c  Info.sortingIdx,
276a0 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 29 3b   addrTopOfLoop);
276b0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
276c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65        sqlite3Whe
276d0 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20  reEnd(pWInfo);. 
276e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
276f0 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76  beChangeToNoop(v
27700 2c 20 61 64 64 72 53 6f 72 74 69 6e 67 49 64 78  , addrSortingIdx
27710 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
27720 20 20 2f 2a 20 4f 75 74 70 75 74 20 74 68 65 20    /* Output the 
27730 66 69 6e 61 6c 20 72 6f 77 20 6f 66 20 72 65 73  final row of res
27740 75 6c 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ult.      */.   
27750 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
27760 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
27770 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77 2c 20  , regOutputRow, 
27780 61 64 64 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a  addrOutputRow);.
27790 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
277a0 74 28 28 76 2c 20 22 6f 75 74 70 75 74 20 66 69  t((v, "output fi
277b0 6e 61 6c 20 72 6f 77 22 29 29 3b 0a 0a 20 20 20  nal row"));..   
277c0 20 20 20 2f 2a 20 4a 75 6d 70 20 6f 76 65 72 20     /* Jump over 
277d0 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 73 0a  the subroutines.
277e0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
277f0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
27800 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
27810 61 64 64 72 45 6e 64 29 3b 0a 0a 20 20 20 20 20  addrEnd);..     
27820 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73   /* Generate a s
27830 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f  ubroutine that o
27840 75 74 70 75 74 73 20 61 20 73 69 6e 67 6c 65 20  utputs a single 
27850 72 6f 77 20 6f 66 20 74 68 65 20 72 65 73 75 6c  row of the resul
27860 74 0a 20 20 20 20 20 20 2a 2a 20 73 65 74 2e 20  t.      ** set. 
27870 20 54 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65   This subroutine
27880 20 66 69 72 73 74 20 6c 6f 6f 6b 73 20 61 74 20   first looks at 
27890 74 68 65 20 69 55 73 65 46 6c 61 67 2e 20 20 49  the iUseFlag.  I
278a0 66 20 69 55 73 65 46 6c 61 67 0a 20 20 20 20 20  f iUseFlag.     
278b0 20 2a 2a 20 69 73 20 6c 65 73 73 20 74 68 61 6e   ** is less than
278c0 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 65 72   or equal to zer
278d0 6f 2c 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e  o, the subroutin
278e0 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 49  e is a no-op.  I
278f0 66 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70  f.      ** the p
27900 72 6f 63 65 73 73 69 6e 67 20 63 61 6c 6c 73 20  rocessing calls 
27910 66 6f 72 20 74 68 65 20 71 75 65 72 79 20 74 6f  for the query to
27920 20 61 62 6f 72 74 2c 20 74 68 69 73 20 73 75 62   abort, this sub
27930 72 6f 75 74 69 6e 65 0a 20 20 20 20 20 20 2a 2a  routine.      **
27940 20 69 6e 63 72 65 6d 65 6e 74 73 20 74 68 65 20   increments the 
27950 69 41 62 6f 72 74 46 6c 61 67 20 6d 65 6d 6f 72  iAbortFlag memor
27960 79 20 6c 6f 63 61 74 69 6f 6e 20 62 65 66 6f 72  y location befor
27970 65 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 0a 20  e returning in. 
27980 20 20 20 20 20 2a 2a 20 6f 72 64 65 72 20 74 6f       ** order to
27990 20 73 69 67 6e 61 6c 20 74 68 65 20 63 61 6c 6c   signal the call
279a0 65 72 20 74 6f 20 61 62 6f 72 74 2e 0a 20 20 20  er to abort..   
279b0 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 64 64 72     */.      addr
279c0 53 65 74 41 62 6f 72 74 20 3d 20 73 71 6c 69 74  SetAbort = sqlit
279d0 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
279e0 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  r(v);.      sqli
279f0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
27a00 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20   OP_Integer, 1, 
27a10 69 41 62 6f 72 74 46 6c 61 67 29 3b 0a 20 20 20  iAbortFlag);.   
27a20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
27a30 76 2c 20 22 73 65 74 20 61 62 6f 72 74 20 66 6c  v, "set abort fl
27a40 61 67 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  ag"));.      sql
27a50 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
27a60 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67  , OP_Return, reg
27a70 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20  OutputRow);.    
27a80 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
27a90 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64  olveLabel(v, add
27aa0 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20  rOutputRow);.   
27ab0 20 20 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77     addrOutputRow
27ac0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
27ad0 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
27ae0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
27af0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 50 6f  ddOp2(v, OP_IfPo
27b00 73 2c 20 69 55 73 65 46 6c 61 67 2c 20 61 64 64  s, iUseFlag, add
27b10 72 4f 75 74 70 75 74 52 6f 77 2b 32 29 3b 0a 20  rOutputRow+2);. 
27b20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
27b30 28 28 76 2c 20 22 47 72 6f 75 70 62 79 20 72 65  ((v, "Groupby re
27b40 73 75 6c 74 20 67 65 6e 65 72 61 74 6f 72 20 65  sult generator e
27b50 6e 74 72 79 20 70 6f 69 6e 74 22 29 29 3b 0a 20  ntry point"));. 
27b60 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
27b70 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74  AddOp1(v, OP_Ret
27b80 75 72 6e 2c 20 72 65 67 4f 75 74 70 75 74 52 6f  urn, regOutputRo
27b90 77 29 3b 0a 20 20 20 20 20 20 66 69 6e 61 6c 69  w);.      finali
27ba0 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e 73 28 70  zeAggFunctions(p
27bb0 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f  Parse, &sAggInfo
27bc0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
27bd0 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
27be0 73 65 2c 20 70 48 61 76 69 6e 67 2c 20 61 64 64  se, pHaving, add
27bf0 72 4f 75 74 70 75 74 52 6f 77 2b 31 2c 20 53 51  rOutputRow+1, SQ
27c00 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29  LITE_JUMPIFNULL)
27c10 3b 0a 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e  ;.      selectIn
27c20 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20  nerLoop(pParse, 
27c30 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 30 2c  p, p->pEList, 0,
27c40 20 30 2c 20 70 4f 72 64 65 72 42 79 2c 0a 20 20   0, pOrderBy,.  
27c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27c60 20 20 20 20 26 73 44 69 73 74 69 6e 63 74 2c 20      &sDistinct, 
27c70 70 44 65 73 74 2c 0a 20 20 20 20 20 20 20 20 20  pDest,.         
27c80 20 20 20 20 20 20 20 20 20 20 20 20 20 61 64 64               add
27c90 72 4f 75 74 70 75 74 52 6f 77 2b 31 2c 20 61 64  rOutputRow+1, ad
27ca0 64 72 53 65 74 41 62 6f 72 74 29 3b 0a 20 20 20  drSetAbort);.   
27cb0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
27cc0 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72  dOp1(v, OP_Retur
27cd0 6e 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77 29  n, regOutputRow)
27ce0 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
27cf0 65 6e 74 28 28 76 2c 20 22 65 6e 64 20 67 72 6f  ent((v, "end gro
27d00 75 70 62 79 20 72 65 73 75 6c 74 20 67 65 6e 65  upby result gene
27d10 72 61 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20  rator"));..     
27d20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73   /* Generate a s
27d30 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 77  ubroutine that w
27d40 69 6c 6c 20 72 65 73 65 74 20 74 68 65 20 67 72  ill reset the gr
27d50 6f 75 70 2d 62 79 20 61 63 63 75 6d 75 6c 61 74  oup-by accumulat
27d60 6f 72 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  or.      */.    
27d70 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
27d80 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64  olveLabel(v, add
27d90 72 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20 72  rReset);.      r
27da0 65 73 65 74 41 63 63 75 6d 75 6c 61 74 6f 72 28  esetAccumulator(
27db0 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66  pParse, &sAggInf
27dc0 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  o);.      sqlite
27dd0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
27de0 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 52 65 73  P_Return, regRes
27df0 65 74 29 3b 0a 20 20 20 20 20 0a 20 20 20 20 7d  et);.     .    }
27e00 20 2f 2a 20 65 6e 64 69 66 20 70 47 72 6f 75 70   /* endif pGroup
27e10 42 79 2e 20 20 42 65 67 69 6e 20 61 67 67 72 65  By.  Begin aggre
27e20 67 61 74 65 20 71 75 65 72 69 65 73 20 77 69 74  gate queries wit
27e30 68 6f 75 74 20 47 52 4f 55 50 20 42 59 3a 20 2a  hout GROUP BY: *
27e40 2f 0a 20 20 20 20 65 6c 73 65 20 7b 0a 20 20 20  /.    else {.   
27e50 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 44 65     ExprList *pDe
27e60 6c 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53  l = 0;.#ifndef S
27e70 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 54 52 45 45  QLITE_OMIT_BTREE
27e80 43 4f 55 4e 54 0a 20 20 20 20 20 20 54 61 62 6c  COUNT.      Tabl
27e90 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 20 20 69  e *pTab;.      i
27ea0 66 28 20 28 70 54 61 62 20 3d 20 69 73 53 69 6d  f( (pTab = isSim
27eb0 70 6c 65 43 6f 75 6e 74 28 70 2c 20 26 73 41 67  pleCount(p, &sAg
27ec0 67 49 6e 66 6f 29 29 21 3d 30 20 29 7b 0a 20 20  gInfo))!=0 ){.  
27ed0 20 20 20 20 20 20 2f 2a 20 49 66 20 69 73 53 69        /* If isSi
27ee0 6d 70 6c 65 43 6f 75 6e 74 28 29 20 72 65 74 75  mpleCount() retu
27ef0 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  rns a pointer to
27f00 20 61 20 54 61 62 6c 65 20 73 74 72 75 63 74 75   a Table structu
27f10 72 65 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 20  re, then.       
27f20 20 2a 2a 20 74 68 65 20 53 51 4c 20 73 74 61 74   ** the SQL stat
27f30 65 6d 65 6e 74 20 69 73 20 6f 66 20 74 68 65 20  ement is of the 
27f40 66 6f 72 6d 3a 0a 20 20 20 20 20 20 20 20 2a 2a  form:.        **
27f50 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 53 45  .        **   SE
27f60 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
27f70 4f 4d 20 3c 74 62 6c 3e 0a 20 20 20 20 20 20 20  OM <tbl>.       
27f80 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 77   **.        ** w
27f90 68 65 72 65 20 74 68 65 20 54 61 62 6c 65 20 73  here the Table s
27fa0 74 72 75 63 74 75 72 65 20 72 65 74 75 72 6e 65  tructure returne
27fb0 64 20 72 65 70 72 65 73 65 6e 74 73 20 74 61 62  d represents tab
27fc0 6c 65 20 3c 74 62 6c 3e 2e 0a 20 20 20 20 20 20  le <tbl>..      
27fd0 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
27fe0 54 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 69  This statement i
27ff0 73 20 73 6f 20 63 6f 6d 6d 6f 6e 20 74 68 61 74  s so common that
28000 20 69 74 20 69 73 20 6f 70 74 69 6d 69 7a 65 64   it is optimized
28010 20 73 70 65 63 69 61 6c 6c 79 2e 20 54 68 65 0a   specially. The.
28020 20 20 20 20 20 20 20 20 2a 2a 20 4f 50 5f 43 6f          ** OP_Co
28030 75 6e 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  unt instruction 
28040 69 73 20 65 78 65 63 75 74 65 64 20 65 69 74 68  is executed eith
28050 65 72 20 6f 6e 20 74 68 65 20 69 6e 74 6b 65 79  er on the intkey
28060 20 74 61 62 6c 65 20 74 68 61 74 0a 20 20 20 20   table that.    
28070 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20      ** contains 
28080 74 68 65 20 64 61 74 61 20 66 6f 72 20 74 61 62  the data for tab
28090 6c 65 20 3c 74 62 6c 3e 20 6f 72 20 6f 6e 20 6f  le <tbl> or on o
280a0 6e 65 20 6f 66 20 69 74 73 20 69 6e 64 65 78 65  ne of its indexe
280b0 73 2e 20 49 74 0a 20 20 20 20 20 20 20 20 2a 2a  s. It.        **
280c0 20 69 73 20 62 65 74 74 65 72 20 74 6f 20 65 78   is better to ex
280d0 65 63 75 74 65 20 74 68 65 20 6f 70 20 6f 6e 20  ecute the op on 
280e0 61 6e 20 69 6e 64 65 78 2c 20 61 73 20 69 6e 64  an index, as ind
280f0 65 78 65 73 20 61 72 65 20 61 6c 6d 6f 73 74 0a  exes are almost.
28100 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 77 61 79          ** alway
28110 73 20 73 70 72 65 61 64 20 61 63 72 6f 73 73 20  s spread across 
28120 6c 65 73 73 20 70 61 67 65 73 20 74 68 61 6e 20  less pages than 
28130 74 68 65 69 72 20 63 6f 72 72 65 73 70 6f 6e 64  their correspond
28140 69 6e 67 20 74 61 62 6c 65 73 2e 0a 20 20 20 20  ing tables..    
28150 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 63      */.        c
28160 6f 6e 73 74 20 69 6e 74 20 69 44 62 20 3d 20 73  onst int iDb = s
28170 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e  qlite3SchemaToIn
28180 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  dex(pParse->db, 
28190 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  pTab->pSchema);.
281a0 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e          const in
281b0 74 20 69 43 73 72 20 3d 20 70 50 61 72 73 65 2d  t iCsr = pParse-
281c0 3e 6e 54 61 62 2b 2b 3b 20 20 20 20 20 2f 2a 20  >nTab++;     /* 
281d0 43 75 72 73 6f 72 20 74 6f 20 73 63 61 6e 20 62  Cursor to scan b
281e0 2d 74 72 65 65 20 2a 2f 0a 20 20 20 20 20 20 20  -tree */.       
281f0 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20   Index *pIdx;   
28200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28210 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f        /* Iterato
28220 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20  r variable */.  
28230 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70        KeyInfo *p
28240 4b 65 79 49 6e 66 6f 20 3d 20 30 3b 20 20 20 20  KeyInfo = 0;    
28250 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4b 65             /* Ke
28260 79 69 6e 66 6f 20 66 6f 72 20 73 63 61 6e 6e 65  yinfo for scanne
28270 64 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20  d index */.     
28280 20 20 20 49 6e 64 65 78 20 2a 70 42 65 73 74 20     Index *pBest 
28290 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
282a0 20 20 20 20 20 20 20 20 2f 2a 20 42 65 73 74 20          /* Best 
282b0 69 6e 64 65 78 20 66 6f 75 6e 64 20 73 6f 20 66  index found so f
282c0 61 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  ar */.        in
282d0 74 20 69 52 6f 6f 74 20 3d 20 70 54 61 62 2d 3e  t iRoot = pTab->
282e0 74 6e 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20  tnum;           
282f0 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20     /* Root page 
28300 6f 66 20 73 63 61 6e 6e 65 64 20 62 2d 74 72 65  of scanned b-tre
28310 65 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 73 71  e */..        sq
28320 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53  lite3CodeVerifyS
28330 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44  chema(pParse, iD
28340 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  b);.        sqli
28350 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61  te3TableLock(pPa
28360 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e  rse, iDb, pTab->
28370 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e 7a  tnum, 0, pTab->z
28380 4e 61 6d 65 29 3b 0a 0a 20 20 20 20 20 20 20 20  Name);..        
28390 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 74 68  /* Search for th
283a0 65 20 69 6e 64 65 78 20 74 68 61 74 20 68 61 73  e index that has
283b0 20 74 68 65 20 6c 65 61 73 74 20 61 6d 6f 75 6e   the least amoun
283c0 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 2e 20 49 66  t of columns. If
283d0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 72  .        ** ther
283e0 65 20 69 73 20 73 75 63 68 20 61 6e 20 69 6e 64  e is such an ind
283f0 65 78 2c 20 61 6e 64 20 69 74 20 68 61 73 20 6c  ex, and it has l
28400 65 73 73 20 63 6f 6c 75 6d 6e 73 20 74 68 61 6e  ess columns than
28410 20 74 68 65 20 74 61 62 6c 65 0a 20 20 20 20 20   the table.     
28420 20 20 20 2a 2a 20 64 6f 65 73 2c 20 74 68 65 6e     ** does, then
28430 20 77 65 20 63 61 6e 20 61 73 73 75 6d 65 20 74   we can assume t
28440 68 61 74 20 69 74 20 63 6f 6e 73 75 6d 65 73 20  hat it consumes 
28450 6c 65 73 73 20 73 70 61 63 65 20 6f 6e 20 64 69  less space on di
28460 73 6b 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a  sk and.        *
28470 2a 20 77 69 6c 6c 20 74 68 65 72 65 66 6f 72 65  * will therefore
28480 20 62 65 20 63 68 65 61 70 65 72 20 74 6f 20 73   be cheaper to s
28490 63 61 6e 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  can to determine
284a0 20 74 68 65 20 71 75 65 72 79 20 72 65 73 75 6c   the query resul
284b0 74 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 6e  t..        ** In
284c0 20 74 68 69 73 20 63 61 73 65 20 73 65 74 20 69   this case set i
284d0 52 6f 6f 74 20 74 6f 20 74 68 65 20 72 6f 6f 74  Root to the root
284e0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
284f0 74 68 65 20 69 6e 64 65 78 20 62 2d 74 72 65 65  the index b-tree
28500 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20  .        ** and 
28510 70 4b 65 79 49 6e 66 6f 20 74 6f 20 74 68 65 20  pKeyInfo to the 
28520 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
28530 65 20 72 65 71 75 69 72 65 64 20 74 6f 20 6e 61  e required to na
28540 76 69 67 61 74 65 20 74 68 65 0a 20 20 20 20 20  vigate the.     
28550 20 20 20 2a 2a 20 69 6e 64 65 78 2e 0a 20 20 20     ** index..   
28560 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
28570 2a 2a 20 28 32 30 31 31 2d 30 34 2d 31 35 29 20  ** (2011-04-15) 
28580 44 6f 20 6e 6f 74 20 64 6f 20 61 20 66 75 6c 6c  Do not do a full
28590 20 73 63 61 6e 20 6f 66 20 61 6e 20 75 6e 6f 72   scan of an unor
285a0 64 65 72 65 64 20 69 6e 64 65 78 2e 0a 20 20 20  dered index..   
285b0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
285c0 2a 2a 20 49 6e 20 70 72 61 63 74 69 63 65 20 74  ** In practice t
285d0 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63  he KeyInfo struc
285e0 74 75 72 65 20 77 69 6c 6c 20 6e 6f 74 20 62 65  ture will not be
285f0 20 75 73 65 64 2e 20 49 74 20 69 73 20 6f 6e 6c   used. It is onl
28600 79 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61  y .        ** pa
28610 73 73 65 64 20 74 6f 20 6b 65 65 70 20 4f 50 5f  ssed to keep OP_
28620 4f 70 65 6e 52 65 61 64 20 68 61 70 70 79 2e 0a  OpenRead happy..
28630 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
28640 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62     for(pIdx=pTab
28650 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20  ->pIndex; pIdx; 
28660 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
28670 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
28680 20 70 49 64 78 2d 3e 62 55 6e 6f 72 64 65 72 65   pIdx->bUnordere
28690 64 3d 3d 30 20 26 26 20 28 21 70 42 65 73 74 20  d==0 && (!pBest 
286a0 7c 7c 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  || pIdx->nColumn
286b0 3c 70 42 65 73 74 2d 3e 6e 43 6f 6c 75 6d 6e 29  <pBest->nColumn)
286c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
286d0 70 42 65 73 74 20 3d 20 70 49 64 78 3b 0a 20 20  pBest = pIdx;.  
286e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
286f0 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
28700 70 42 65 73 74 20 26 26 20 70 42 65 73 74 2d 3e  pBest && pBest->
28710 6e 43 6f 6c 75 6d 6e 3c 70 54 61 62 2d 3e 6e 43  nColumn<pTab->nC
28720 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ol ){.          
28730 69 52 6f 6f 74 20 3d 20 70 42 65 73 74 2d 3e 74  iRoot = pBest->t
28740 6e 75 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 70  num;.          p
28750 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65  KeyInfo = sqlite
28760 33 49 6e 64 65 78 4b 65 79 69 6e 66 6f 28 70 50  3IndexKeyinfo(pP
28770 61 72 73 65 2c 20 70 42 65 73 74 29 3b 0a 20 20  arse, pBest);.  
28780 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
28790 20 2f 2a 20 4f 70 65 6e 20 61 20 72 65 61 64 2d   /* Open a read-
287a0 6f 6e 6c 79 20 63 75 72 73 6f 72 2c 20 65 78 65  only cursor, exe
287b0 63 75 74 65 20 74 68 65 20 4f 50 5f 43 6f 75 6e  cute the OP_Coun
287c0 74 2c 20 63 6c 6f 73 65 20 74 68 65 20 63 75 72  t, close the cur
287d0 73 6f 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  sor. */.        
287e0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
287f0 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64  3(v, OP_OpenRead
28800 2c 20 69 43 73 72 2c 20 69 52 6f 6f 74 2c 20 69  , iCsr, iRoot, i
28810 44 62 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  Db);.        if(
28820 20 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20   pKeyInfo ){.   
28830 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
28840 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31  beChangeP4(v, -1
28850 2c 20 28 63 68 61 72 20 2a 29 70 4b 65 79 49 6e  , (char *)pKeyIn
28860 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48  fo, P4_KEYINFO_H
28870 41 4e 44 4f 46 46 29 3b 0a 20 20 20 20 20 20 20  ANDOFF);.       
28880 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
28890 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
288a0 4f 50 5f 43 6f 75 6e 74 2c 20 69 43 73 72 2c 20  OP_Count, iCsr, 
288b0 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 30  sAggInfo.aFunc[0
288c0 5d 2e 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20  ].iMem);.       
288d0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
288e0 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  p1(v, OP_Close, 
288f0 69 43 73 72 29 3b 0a 20 20 20 20 20 20 20 20 65  iCsr);.        e
28900 78 70 6c 61 69 6e 53 69 6d 70 6c 65 43 6f 75 6e  xplainSimpleCoun
28910 74 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20  t(pParse, pTab, 
28920 70 42 65 73 74 29 3b 0a 20 20 20 20 20 20 7d 65  pBest);.      }e
28930 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  lse.#endif /* SQ
28940 4c 49 54 45 5f 4f 4d 49 54 5f 42 54 52 45 45 43  LITE_OMIT_BTREEC
28950 4f 55 4e 54 20 2a 2f 0a 20 20 20 20 20 20 7b 0a  OUNT */.      {.
28960 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b          /* Check
28970 20 69 66 20 74 68 65 20 71 75 65 72 79 20 69 73   if the query is
28980 20 6f 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 66   of one of the f
28990 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d 73 3a 0a  ollowing forms:.
289a0 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
289b0 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 6d     **   SELECT m
289c0 69 6e 28 78 29 20 46 52 4f 4d 20 2e 2e 2e 0a 20  in(x) FROM .... 
289d0 20 20 20 20 20 20 20 2a 2a 20 20 20 53 45 4c 45         **   SELE
289e0 43 54 20 6d 61 78 28 78 29 20 46 52 4f 4d 20 2e  CT max(x) FROM .
289f0 2e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  ...        **.  
28a00 20 20 20 20 20 20 2a 2a 20 49 66 20 69 74 20 69        ** If it i
28a10 73 2c 20 74 68 65 6e 20 61 73 6b 20 74 68 65 20  s, then ask the 
28a20 63 6f 64 65 20 69 6e 20 77 68 65 72 65 2e 63 20  code in where.c 
28a30 74 6f 20 61 74 74 65 6d 70 74 20 74 6f 20 73 6f  to attempt to so
28a40 72 74 20 72 65 73 75 6c 74 73 0a 20 20 20 20 20  rt results.     
28a50 20 20 20 2a 2a 20 61 73 20 69 66 20 74 68 65 72     ** as if ther
28a60 65 20 77 61 73 20 61 6e 20 22 4f 52 44 45 52 20  e was an "ORDER 
28a70 4f 4e 20 78 22 20 6f 72 20 22 4f 52 44 45 52 20  ON x" or "ORDER 
28a80 4f 4e 20 78 20 44 45 53 43 22 20 63 6c 61 75 73  ON x DESC" claus
28a90 65 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 49  e. .        ** I
28aa0 66 20 77 68 65 72 65 2e 63 20 69 73 20 61 62 6c  f where.c is abl
28ab0 65 20 74 6f 20 70 72 6f 64 75 63 65 20 72 65 73  e to produce res
28ac0 75 6c 74 73 20 73 6f 72 74 65 64 20 69 6e 20 74  ults sorted in t
28ad0 68 69 73 20 6f 72 64 65 72 2c 20 74 68 65 6e 0a  his order, then.
28ae0 20 20 20 20 20 20 20 20 2a 2a 20 61 64 64 20 76          ** add v
28af0 64 62 65 20 63 6f 64 65 20 74 6f 20 62 72 65 61  dbe code to brea
28b00 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 70 72 6f  k out of the pro
28b10 63 65 73 73 69 6e 67 20 6c 6f 6f 70 20 61 66 74  cessing loop aft
28b20 65 72 20 74 68 65 20 0a 20 20 20 20 20 20 20 20  er the .        
28b30 2a 2a 20 66 69 72 73 74 20 69 74 65 72 61 74 69  ** first iterati
28b40 6f 6e 20 28 73 69 6e 63 65 20 74 68 65 20 66 69  on (since the fi
28b50 72 73 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66  rst iteration of
28b60 20 74 68 65 20 6c 6f 6f 70 20 69 73 20 0a 20 20   the loop is .  
28b70 20 20 20 20 20 20 2a 2a 20 67 75 61 72 61 6e 74        ** guarant
28b80 65 65 64 20 74 6f 20 6f 70 65 72 61 74 65 20 6f  eed to operate o
28b90 6e 20 74 68 65 20 72 6f 77 20 77 69 74 68 20 74  n the row with t
28ba0 68 65 20 6d 69 6e 69 6d 75 6d 20 6f 72 20 6d 61  he minimum or ma
28bb0 78 69 6d 75 6d 20 0a 20 20 20 20 20 20 20 20 2a  ximum .        *
28bc0 2a 20 76 61 6c 75 65 20 6f 66 20 78 2c 20 74 68  * value of x, th
28bd0 65 20 6f 6e 6c 79 20 72 6f 77 20 72 65 71 75 69  e only row requi
28be0 72 65 64 29 2e 0a 20 20 20 20 20 20 20 20 2a 2a  red)..        **
28bf0 0a 20 20 20 20 20 20 20 20 2a 2a 20 41 20 73 70  .        ** A sp
28c00 65 63 69 61 6c 20 66 6c 61 67 20 6d 75 73 74 20  ecial flag must 
28c10 62 65 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c  be passed to sql
28c20 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
28c30 20 74 6f 20 73 6c 69 67 68 74 6c 79 0a 20 20 20   to slightly.   
28c40 20 20 20 20 20 2a 2a 20 6d 6f 64 69 66 79 20 62       ** modify b
28c50 65 68 61 76 69 6f 72 20 61 73 20 66 6f 6c 6c 6f  ehavior as follo
28c60 77 73 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ws:.        **. 
28c70 20 20 20 20 20 20 20 2a 2a 20 20 20 2b 20 49 66         **   + If
28c80 20 74 68 65 20 71 75 65 72 79 20 69 73 20 61 20   the query is a 
28c90 22 53 45 4c 45 43 54 20 6d 69 6e 28 78 29 22 2c  "SELECT min(x)",
28ca0 20 74 68 65 6e 20 74 68 65 20 6c 6f 6f 70 20 63   then the loop c
28cb0 6f 64 65 64 20 62 79 0a 20 20 20 20 20 20 20 20  oded by.        
28cc0 2a 2a 20 20 20 20 20 77 68 65 72 65 2e 63 20 73  **     where.c s
28cd0 68 6f 75 6c 64 20 6e 6f 74 20 69 74 65 72 61 74  hould not iterat
28ce0 65 20 6f 76 65 72 20 61 6e 79 20 76 61 6c 75 65  e over any value
28cf0 73 20 77 69 74 68 20 61 20 4e 55 4c 4c 20 76 61  s with a NULL va
28d00 6c 75 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 20  lue.        **  
28d10 20 20 20 66 6f 72 20 78 2e 0a 20 20 20 20 20 20     for x..      
28d20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
28d30 20 20 2b 20 54 68 65 20 6f 70 74 69 6d 69 7a 65    + The optimize
28d40 72 20 63 6f 64 65 20 69 6e 20 77 68 65 72 65 2e  r code in where.
28d50 63 20 28 74 68 65 20 74 68 69 6e 67 20 74 68 61  c (the thing tha
28d60 74 20 64 65 63 69 64 65 73 20 77 68 69 63 68 0a  t decides which.
28d70 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 69          **     i
28d80 6e 64 65 78 20 6f 72 20 69 6e 64 69 63 65 73 20  ndex or indices 
28d90 74 6f 20 75 73 65 29 20 73 68 6f 75 6c 64 20 70  to use) should p
28da0 6c 61 63 65 20 61 20 64 69 66 66 65 72 65 6e 74  lace a different
28db0 20 70 72 69 6f 72 69 74 79 20 6f 6e 20 0a 20 20   priority on .  
28dc0 20 20 20 20 20 20 2a 2a 20 20 20 20 20 73 61 74        **     sat
28dd0 69 73 66 79 69 6e 67 20 74 68 65 20 27 4f 52 44  isfying the 'ORD
28de0 45 52 20 42 59 27 20 63 6c 61 75 73 65 20 74 68  ER BY' clause th
28df0 61 6e 20 69 74 20 64 6f 65 73 20 69 6e 20 6f 74  an it does in ot
28e00 68 65 72 20 63 61 73 65 73 2e 0a 20 20 20 20 20  her cases..     
28e10 20 20 20 2a 2a 20 20 20 20 20 52 65 66 65 72 20     **     Refer 
28e20 74 6f 20 63 6f 64 65 20 61 6e 64 20 63 6f 6d 6d  to code and comm
28e30 65 6e 74 73 20 69 6e 20 77 68 65 72 65 2e 63 20  ents in where.c 
28e40 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 20 20 20  for details..   
28e50 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
28e60 45 78 70 72 4c 69 73 74 20 2a 70 4d 69 6e 4d 61  ExprList *pMinMa
28e70 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 75  x = 0;.        u
28e80 38 20 66 6c 61 67 20 3d 20 57 48 45 52 45 5f 4f  8 flag = WHERE_O
28e90 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b 0a 20  RDERBY_NORMAL;. 
28ea0 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20         .        
28eb0 61 73 73 65 72 74 28 20 70 2d 3e 70 47 72 6f 75  assert( p->pGrou
28ec0 70 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  pBy==0 );.      
28ed0 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 3d 3d    assert( flag==
28ee0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  0 );.        if(
28ef0 20 70 2d 3e 70 48 61 76 69 6e 67 3d 3d 30 20 29   p->pHaving==0 )
28f00 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6c 61 67  {.          flag
28f10 20 3d 20 6d 69 6e 4d 61 78 51 75 65 72 79 28 26   = minMaxQuery(&
28f20 73 41 67 67 49 6e 66 6f 2c 20 26 70 4d 69 6e 4d  sAggInfo, &pMinM
28f30 61 78 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ax);.        }. 
28f40 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 66         assert( f
28f50 6c 61 67 3d 3d 30 20 7c 7c 20 28 70 4d 69 6e 4d  lag==0 || (pMinM
28f60 61 78 21 3d 30 20 26 26 20 70 4d 69 6e 4d 61 78  ax!=0 && pMinMax
28f70 2d 3e 6e 45 78 70 72 3d 3d 31 29 20 29 3b 0a 0a  ->nExpr==1) );..
28f80 20 20 20 20 20 20 20 20 69 66 28 20 66 6c 61 67          if( flag
28f90 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4d   ){.          pM
28fa0 69 6e 4d 61 78 20 3d 20 73 71 6c 69 74 65 33 45  inMax = sqlite3E
28fb0 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70  xprListDup(db, p
28fc0 4d 69 6e 4d 61 78 2c 20 30 29 3b 0a 20 20 20 20  MinMax, 0);.    
28fd0 20 20 20 20 20 20 70 44 65 6c 20 3d 20 70 4d 69        pDel = pMi
28fe0 6e 4d 61 78 3b 0a 20 20 20 20 20 20 20 20 20 20  nMax;.          
28ff0 69 66 28 20 70 4d 69 6e 4d 61 78 20 26 26 20 21  if( pMinMax && !
29000 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
29010 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
29020 70 4d 69 6e 4d 61 78 2d 3e 61 5b 30 5d 2e 73 6f  pMinMax->a[0].so
29030 72 74 4f 72 64 65 72 20 3d 20 66 6c 61 67 21 3d  rtOrder = flag!=
29040 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49  WHERE_ORDERBY_MI
29050 4e 20 3f 31 3a 30 3b 0a 20 20 20 20 20 20 20 20  N ?1:0;.        
29060 20 20 20 20 70 4d 69 6e 4d 61 78 2d 3e 61 5b 30      pMinMax->a[0
29070 5d 2e 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b  ].pExpr->op = TK
29080 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 20  _COLUMN;.       
29090 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
290a0 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69   .        /* Thi
290b0 73 20 63 61 73 65 20 72 75 6e 73 20 69 66 20 74  s case runs if t
290c0 68 65 20 61 67 67 72 65 67 61 74 65 20 68 61 73  he aggregate has
290d0 20 6e 6f 20 47 52 4f 55 50 20 42 59 20 63 6c 61   no GROUP BY cla
290e0 75 73 65 2e 20 20 54 68 65 0a 20 20 20 20 20 20  use.  The.      
290f0 20 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 20    ** processing 
29100 69 73 20 6d 75 63 68 20 73 69 6d 70 6c 65 72 20  is much simpler 
29110 73 69 6e 63 65 20 74 68 65 72 65 20 69 73 20 6f  since there is o
29120 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 72 6f 77  nly a single row
29130 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 6f  .        ** of o
29140 75 74 70 75 74 2e 0a 20 20 20 20 20 20 20 20 2a  utput..        *
29150 2f 0a 20 20 20 20 20 20 20 20 72 65 73 65 74 41  /.        resetA
29160 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73  ccumulator(pPars
29170 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20  e, &sAggInfo);. 
29180 20 20 20 20 20 20 20 70 57 49 6e 66 6f 20 3d 20         pWInfo = 
29190 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
291a0 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69  n(pParse, pTabLi
291b0 73 74 2c 20 70 57 68 65 72 65 2c 20 70 4d 69 6e  st, pWhere, pMin
291c0 4d 61 78 2c 30 2c 66 6c 61 67 2c 30 29 3b 0a 20  Max,0,flag,0);. 
291d0 20 20 20 20 20 20 20 69 66 28 20 70 57 49 6e 66         if( pWInf
291e0 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  o==0 ){.        
291f0 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
29200 74 44 65 6c 65 74 65 28 64 62 2c 20 70 44 65 6c  tDelete(db, pDel
29210 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  );.          got
29220 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
29230 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
29240 75 70 64 61 74 65 41 63 63 75 6d 75 6c 61 74 6f  updateAccumulato
29250 72 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49  r(pParse, &sAggI
29260 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 61 73  nfo);.        as
29270 73 65 72 74 28 20 70 4d 69 6e 4d 61 78 3d 3d 30  sert( pMinMax==0
29280 20 7c 7c 20 70 4d 69 6e 4d 61 78 2d 3e 6e 45 78   || pMinMax->nEx
29290 70 72 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20  pr==1 );.       
292a0 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42   if( pWInfo->nOB
292b0 53 61 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  Sat>0 ){.       
292c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
292d0 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
292e0 20 30 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65   0, pWInfo->iBre
292f0 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 56  ak);.          V
29300 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
29310 25 73 28 29 20 62 79 20 69 6e 64 65 78 22 2c 0a  %s() by index",.
29320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29330 28 66 6c 61 67 3d 3d 57 48 45 52 45 5f 4f 52 44  (flag==WHERE_ORD
29340 45 52 42 59 5f 4d 49 4e 3f 22 6d 69 6e 22 3a 22  ERBY_MIN?"min":"
29350 6d 61 78 22 29 29 29 3b 0a 20 20 20 20 20 20 20  max")));.       
29360 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
29370 65 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66  e3WhereEnd(pWInf
29380 6f 29 3b 0a 20 20 20 20 20 20 20 20 66 69 6e 61  o);.        fina
29390 6c 69 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e 73  lizeAggFunctions
293a0 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e  (pParse, &sAggIn
293b0 66 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  fo);.      }..  
293c0 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20 30      pOrderBy = 0
293d0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
293e0 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
293f0 65 2c 20 70 48 61 76 69 6e 67 2c 20 61 64 64 72  e, pHaving, addr
29400 45 6e 64 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50  End, SQLITE_JUMP
29410 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73  IFNULL);.      s
29420 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70  electInnerLoop(p
29430 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c  Parse, p, p->pEL
29440 69 73 74 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  ist, 0, 0, 0, 0,
29450 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
29460 20 20 20 20 20 20 20 20 70 44 65 73 74 2c 20 61          pDest, a
29470 64 64 72 45 6e 64 2c 20 61 64 64 72 45 6e 64 29  ddrEnd, addrEnd)
29480 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
29490 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
294a0 2c 20 70 44 65 6c 29 3b 0a 20 20 20 20 7d 0a 20  , pDel);.    }. 
294b0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
294c0 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64  solveLabel(v, ad
294d0 64 72 45 6e 64 29 3b 0a 20 20 20 20 0a 20 20 7d  drEnd);.    .  }
294e0 20 2f 2a 20 65 6e 64 69 66 20 61 67 67 72 65 67   /* endif aggreg
294f0 61 74 65 20 71 75 65 72 79 20 2a 2f 0a 0a 20 20  ate query */..  
29500 69 66 28 20 73 44 69 73 74 69 6e 63 74 2e 65 54  if( sDistinct.eT
29510 6e 63 74 54 79 70 65 3d 3d 57 48 45 52 45 5f 44  nctType==WHERE_D
29520 49 53 54 49 4e 43 54 5f 55 4e 4f 52 44 45 52 45  ISTINCT_UNORDERE
29530 44 20 29 7b 0a 20 20 20 20 65 78 70 6c 61 69 6e  D ){.    explain
29540 54 65 6d 70 54 61 62 6c 65 28 70 50 61 72 73 65  TempTable(pParse
29550 2c 20 22 44 49 53 54 49 4e 43 54 22 29 3b 0a 20  , "DISTINCT");. 
29560 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72   }..  /* If ther
29570 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59  e is an ORDER BY
29580 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 77 65   clause, then we
29590 20 6e 65 65 64 20 74 6f 20 73 6f 72 74 20 74 68   need to sort th
295a0 65 20 72 65 73 75 6c 74 73 0a 20 20 2a 2a 20 61  e results.  ** a
295b0 6e 64 20 73 65 6e 64 20 74 68 65 6d 20 74 6f 20  nd send them to 
295c0 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 6f 6e 65  the callback one
295d0 20 62 79 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20   by one..  */.  
295e0 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a  if( pOrderBy ){.
295f0 20 20 20 20 65 78 70 6c 61 69 6e 54 65 6d 70 54      explainTempT
29600 61 62 6c 65 28 70 50 61 72 73 65 2c 20 22 4f 52  able(pParse, "OR
29610 44 45 52 20 42 59 22 29 3b 0a 20 20 20 20 67 65  DER BY");.    ge
29620 6e 65 72 61 74 65 53 6f 72 74 54 61 69 6c 28 70  nerateSortTail(p
29630 50 61 72 73 65 2c 20 70 2c 20 76 2c 20 70 45 4c  Parse, p, v, pEL
29640 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70 44 65 73  ist->nExpr, pDes
29650 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75  t);.  }..  /* Ju
29660 6d 70 20 68 65 72 65 20 74 6f 20 73 6b 69 70 20  mp here to skip 
29670 74 68 69 73 20 71 75 65 72 79 0a 20 20 2a 2f 0a  this query.  */.
29680 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
29690 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 45 6e  olveLabel(v, iEn
296a0 64 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 53 45  d);..  /* The SE
296b0 4c 45 43 54 20 77 61 73 20 73 75 63 63 65 73 73  LECT was success
296c0 66 75 6c 6c 79 20 63 6f 64 65 64 2e 20 20 20 53  fully coded.   S
296d0 65 74 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f  et the return co
296e0 64 65 20 74 6f 20 30 0a 20 20 2a 2a 20 74 6f 20  de to 0.  ** to 
296f0 69 6e 64 69 63 61 74 65 20 6e 6f 20 65 72 72 6f  indicate no erro
29700 72 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  rs..  */.  rc = 
29710 30 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c  0;..  /* Control
29720 20 6a 75 6d 70 73 20 74 6f 20 68 65 72 65 20 69   jumps to here i
29730 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 65 6e  f an error is en
29740 63 6f 75 6e 74 65 72 65 64 20 61 62 6f 76 65 2c  countered above,
29750 20 6f 72 20 75 70 6f 6e 0a 20 20 2a 2a 20 73 75   or upon.  ** su
29760 63 63 65 73 73 66 75 6c 20 63 6f 64 69 6e 67 20  ccessful coding 
29770 6f 66 20 74 68 65 20 53 45 4c 45 43 54 2e 0a 20  of the SELECT.. 
29780 20 2a 2f 0a 73 65 6c 65 63 74 5f 65 6e 64 3a 0a   */.select_end:.
29790 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65    explainSetInte
297a0 67 65 72 28 70 50 61 72 73 65 2d 3e 69 53 65 6c  ger(pParse->iSel
297b0 65 63 74 49 64 2c 20 69 52 65 73 74 6f 72 65 53  ectId, iRestoreS
297c0 65 6c 65 63 74 49 64 29 3b 0a 0a 20 20 2f 2a 20  electId);..  /* 
297d0 49 64 65 6e 74 69 66 79 20 63 6f 6c 75 6d 6e 20  Identify column 
297e0 6e 61 6d 65 73 20 69 66 20 72 65 73 75 6c 74 73  names if results
297f0 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 61   of the SELECT a
29800 72 65 20 74 6f 20 62 65 20 6f 75 74 70 75 74 2e  re to be output.
29810 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d  .  */.  if( rc==
29820 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 44 65  SQLITE_OK && pDe
29830 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 4f  st->eDest==SRT_O
29840 75 74 70 75 74 20 29 7b 0a 20 20 20 20 67 65 6e  utput ){.    gen
29850 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73  erateColumnNames
29860 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73  (pParse, pTabLis
29870 74 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a  t, pEList);.  }.
29880 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
29890 28 64 62 2c 20 73 41 67 67 49 6e 66 6f 2e 61 43  (db, sAggInfo.aC
298a0 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  ol);.  sqlite3Db
298b0 46 72 65 65 28 64 62 2c 20 73 41 67 67 49 6e 66  Free(db, sAggInf
298c0 6f 2e 61 46 75 6e 63 29 3b 0a 20 20 72 65 74 75  o.aFunc);.  retu
298d0 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 20 64 65  rn rc;.}..#if de
298e0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
298f0 42 4c 45 5f 54 52 45 45 5f 45 58 50 4c 41 49 4e  BLE_TREE_EXPLAIN
29900 29 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  )./*.** Generate
29910 20 61 20 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c   a human-readabl
29920 65 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66  e description of
29930 20 61 20 74 68 65 20 53 65 6c 65 63 74 20 6f 62   a the Select ob
29940 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ject..*/.static 
29950 76 6f 69 64 20 65 78 70 6c 61 69 6e 4f 6e 65 53  void explainOneS
29960 65 6c 65 63 74 28 56 64 62 65 20 2a 70 56 64 62  elect(Vdbe *pVdb
29970 65 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20  e, Select *p){. 
29980 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
29990 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22 53 45  rintf(pVdbe, "SE
299a0 4c 45 43 54 20 22 29 3b 0a 20 20 69 66 28 20 70  LECT ");.  if( p
299b0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46  ->selFlags & (SF
299c0 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67  _Distinct|SF_Agg
299d0 72 65 67 61 74 65 29 20 29 7b 0a 20 20 20 20 69  regate) ){.    i
299e0 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  f( p->selFlags &
299f0 20 53 46 5f 44 69 73 74 69 6e 63 74 20 29 7b 0a   SF_Distinct ){.
29a00 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
29a10 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65  lainPrintf(pVdbe
29a20 2c 20 22 44 49 53 54 49 4e 43 54 20 22 29 3b 0a  , "DISTINCT ");.
29a30 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d      }.    if( p-
29a40 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41  >selFlags & SF_A
29a50 67 67 72 65 67 61 74 65 20 29 7b 0a 20 20 20 20  ggregate ){.    
29a60 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
29a70 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22 61  Printf(pVdbe, "a
29a80 67 67 5f 66 6c 61 67 20 22 29 3b 0a 20 20 20 20  gg_flag ");.    
29a90 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  }.    sqlite3Exp
29aa0 6c 61 69 6e 4e 4c 28 70 56 64 62 65 29 3b 0a 20  lainNL(pVdbe);. 
29ab0 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
29ac0 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22  nPrintf(pVdbe, "
29ad0 20 20 20 22 29 3b 0a 20 20 7d 0a 20 20 73 71 6c     ");.  }.  sql
29ae0 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72 4c  ite3ExplainExprL
29af0 69 73 74 28 70 56 64 62 65 2c 20 70 2d 3e 70 45  ist(pVdbe, p->pE
29b00 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  List);.  sqlite3
29b10 45 78 70 6c 61 69 6e 4e 4c 28 70 56 64 62 65 29  ExplainNL(pVdbe)
29b20 3b 0a 20 20 69 66 28 20 70 2d 3e 70 53 72 63 20  ;.  if( p->pSrc 
29b30 26 26 20 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63  && p->pSrc->nSrc
29b40 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
29b50 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
29b60 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22  nPrintf(pVdbe, "
29b70 46 52 4f 4d 20 22 29 3b 0a 20 20 20 20 73 71 6c  FROM ");.    sql
29b80 69 74 65 33 45 78 70 6c 61 69 6e 50 75 73 68 28  ite3ExplainPush(
29b90 70 56 64 62 65 29 3b 0a 20 20 20 20 66 6f 72 28  pVdbe);.    for(
29ba0 69 3d 30 3b 20 69 3c 70 2d 3e 70 53 72 63 2d 3e  i=0; i<p->pSrc->
29bb0 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nSrc; i++){.    
29bc0 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
29bd0 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26  _item *pItem = &
29be0 70 2d 3e 70 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20  p->pSrc->a[i];. 
29bf0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
29c00 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c  ainPrintf(pVdbe,
29c10 20 22 7b 25 64 2c 2a 7d 20 3d 20 22 2c 20 70 49   "{%d,*} = ", pI
29c20 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20  tem->iCursor);. 
29c30 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
29c40 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  pSelect ){.     
29c50 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
29c60 6e 53 65 6c 65 63 74 28 70 56 64 62 65 2c 20 70  nSelect(pVdbe, p
29c70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a  Item->pSelect);.
29c80 20 20 20 20 20 20 20 20 69 66 28 20 70 49 74 65          if( pIte
29c90 6d 2d 3e 70 54 61 62 20 29 7b 0a 20 20 20 20 20  m->pTab ){.     
29ca0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
29cb0 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c  ainPrintf(pVdbe,
29cc0 20 22 20 28 74 61 62 6e 61 6d 65 3d 25 73 29 22   " (tabname=%s)"
29cd0 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a  , pItem->pTab->z
29ce0 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  Name);.        }
29cf0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
29d00 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 29 7b   pItem->zName ){
29d10 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
29d20 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56  ExplainPrintf(pV
29d30 64 62 65 2c 20 22 25 73 22 2c 20 70 49 74 65 6d  dbe, "%s", pItem
29d40 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
29d50 7d 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65  }.      if( pIte
29d60 6d 2d 3e 7a 41 6c 69 61 73 20 29 7b 0a 20 20 20  m->zAlias ){.   
29d70 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
29d80 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c  ainPrintf(pVdbe,
29d90 20 22 20 28 41 53 20 25 73 29 22 2c 20 70 49 74   " (AS %s)", pIt
29da0 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20  em->zAlias);.   
29db0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
29dc0 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 26  Item->jointype &
29dd0 20 4a 54 5f 4c 45 46 54 20 29 7b 0a 20 20 20 20   JT_LEFT ){.    
29de0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
29df0 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20  inPrintf(pVdbe, 
29e00 22 20 4c 45 46 54 2d 4a 4f 49 4e 22 29 3b 0a 20  " LEFT-JOIN");. 
29e10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
29e20 69 74 65 33 45 78 70 6c 61 69 6e 4e 4c 28 70 56  ite3ExplainNL(pV
29e30 64 62 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  dbe);.    }.    
29e40 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 6f  sqlite3ExplainPo
29e50 70 28 70 56 64 62 65 29 3b 0a 20 20 7d 0a 20 20  p(pVdbe);.  }.  
29e60 69 66 28 20 70 2d 3e 70 57 68 65 72 65 20 29 7b  if( p->pWhere ){
29e70 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c  .    sqlite3Expl
29e80 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c  ainPrintf(pVdbe,
29e90 20 22 57 48 45 52 45 20 22 29 3b 0a 20 20 20 20   "WHERE ");.    
29ea0 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78  sqlite3ExplainEx
29eb0 70 72 28 70 56 64 62 65 2c 20 70 2d 3e 70 57 68  pr(pVdbe, p->pWh
29ec0 65 72 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ere);.    sqlite
29ed0 33 45 78 70 6c 61 69 6e 4e 4c 28 70 56 64 62 65  3ExplainNL(pVdbe
29ee0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  );.  }.  if( p->
29ef0 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20  pGroupBy ){.    
29f00 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
29f10 69 6e 74 66 28 70 56 64 62 65 2c 20 22 47 52 4f  intf(pVdbe, "GRO
29f20 55 50 42 59 20 22 29 3b 0a 20 20 20 20 73 71 6c  UPBY ");.    sql
29f30 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72 4c  ite3ExplainExprL
29f40 69 73 74 28 70 56 64 62 65 2c 20 70 2d 3e 70 47  ist(pVdbe, p->pG
29f50 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 73 71 6c  roupBy);.    sql
29f60 69 74 65 33 45 78 70 6c 61 69 6e 4e 4c 28 70 56  ite3ExplainNL(pV
29f70 64 62 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  dbe);.  }.  if( 
29f80 70 2d 3e 70 48 61 76 69 6e 67 20 29 7b 0a 20 20  p->pHaving ){.  
29f90 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
29fa0 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22 48  Printf(pVdbe, "H
29fb0 41 56 49 4e 47 20 22 29 3b 0a 20 20 20 20 73 71  AVING ");.    sq
29fc0 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72  lite3ExplainExpr
29fd0 28 70 56 64 62 65 2c 20 70 2d 3e 70 48 61 76 69  (pVdbe, p->pHavi
29fe0 6e 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ng);.    sqlite3
29ff0 45 78 70 6c 61 69 6e 4e 4c 28 70 56 64 62 65 29  ExplainNL(pVdbe)
2a000 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70  ;.  }.  if( p->p
2a010 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 73  OrderBy ){.    s
2a020 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69  qlite3ExplainPri
2a030 6e 74 66 28 70 56 64 62 65 2c 20 22 4f 52 44 45  ntf(pVdbe, "ORDE
2a040 52 42 59 20 22 29 3b 0a 20 20 20 20 73 71 6c 69  RBY ");.    sqli
2a050 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72 4c 69  te3ExplainExprLi
2a060 73 74 28 70 56 64 62 65 2c 20 70 2d 3e 70 4f 72  st(pVdbe, p->pOr
2a070 64 65 72 42 79 29 3b 0a 20 20 20 20 73 71 6c 69  derBy);.    sqli
2a080 74 65 33 45 78 70 6c 61 69 6e 4e 4c 28 70 56 64  te3ExplainNL(pVd
2a090 62 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  be);.  }.  if( p
2a0a0 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20  ->pLimit ){.    
2a0b0 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
2a0c0 69 6e 74 66 28 70 56 64 62 65 2c 20 22 4c 49 4d  intf(pVdbe, "LIM
2a0d0 49 54 20 22 29 3b 0a 20 20 20 20 73 71 6c 69 74  IT ");.    sqlit
2a0e0 65 33 45 78 70 6c 61 69 6e 45 78 70 72 28 70 56  e3ExplainExpr(pV
2a0f0 64 62 65 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b  dbe, p->pLimit);
2a100 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c  .    sqlite3Expl
2a110 61 69 6e 4e 4c 28 70 56 64 62 65 29 3b 0a 20 20  ainNL(pVdbe);.  
2a120 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4f 66 66 73  }.  if( p->pOffs
2a130 65 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  et ){.    sqlite
2a140 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70  3ExplainPrintf(p
2a150 56 64 62 65 2c 20 22 4f 46 46 53 45 54 20 22 29  Vdbe, "OFFSET ")
2a160 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
2a170 6c 61 69 6e 45 78 70 72 28 70 56 64 62 65 2c 20  lainExpr(pVdbe, 
2a180 70 2d 3e 70 4f 66 66 73 65 74 29 3b 0a 20 20 20  p->pOffset);.   
2a190 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 4e   sqlite3ExplainN
2a1a0 4c 28 70 56 64 62 65 29 3b 0a 20 20 7d 0a 7d 0a  L(pVdbe);.  }.}.
2a1b0 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 6c  void sqlite3Expl
2a1c0 61 69 6e 53 65 6c 65 63 74 28 56 64 62 65 20 2a  ainSelect(Vdbe *
2a1d0 70 56 64 62 65 2c 20 53 65 6c 65 63 74 20 2a 70  pVdbe, Select *p
2a1e0 29 7b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b  ){.  if( p==0 ){
2a1f0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c  .    sqlite3Expl
2a200 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c  ainPrintf(pVdbe,
2a210 20 22 28 6e 75 6c 6c 2d 73 65 6c 65 63 74 29 22   "(null-select)"
2a220 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
2a230 20 7d 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 70   }.  while( p->p
2a240 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 70 2d 3e  Prior ){.    p->
2a250 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20  pPrior->pNext = 
2a260 70 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 50  p;.    p = p->pP
2a270 72 69 6f 72 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  rior;.  }.  sqli
2a280 74 65 33 45 78 70 6c 61 69 6e 50 75 73 68 28 70  te3ExplainPush(p
2a290 56 64 62 65 29 3b 0a 20 20 77 68 69 6c 65 28 20  Vdbe);.  while( 
2a2a0 70 20 29 7b 0a 20 20 20 20 65 78 70 6c 61 69 6e  p ){.    explain
2a2b0 4f 6e 65 53 65 6c 65 63 74 28 70 56 64 62 65 2c  OneSelect(pVdbe,
2a2c0 20 70 29 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e   p);.    p = p->
2a2d0 70 4e 65 78 74 3b 0a 20 20 20 20 69 66 28 20 70  pNext;.    if( p
2a2e0 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
2a2f0 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 4e   sqlite3ExplainN
2a300 4c 28 70 56 64 62 65 29 3b 0a 20 20 20 20 73 71  L(pVdbe);.    sq
2a310 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e  lite3ExplainPrin
2a320 74 66 28 70 56 64 62 65 2c 20 22 25 73 5c 6e 22  tf(pVdbe, "%s\n"
2a330 2c 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70  , selectOpName(p
2a340 2d 3e 6f 70 29 29 3b 0a 20 20 7d 0a 20 20 73 71  ->op));.  }.  sq
2a350 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e  lite3ExplainPrin
2a360 74 66 28 70 56 64 62 65 2c 20 22 45 4e 44 22 29  tf(pVdbe, "END")
2a370 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61  ;.  sqlite3Expla
2a380 69 6e 50 6f 70 28 70 56 64 62 65 29 3b 0a 7d 0a  inPop(pVdbe);.}.
2a390 0a 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 73  ./* End of the s
2a3a0 74 72 75 63 74 75 72 65 20 64 65 62 75 67 20 70  tructure debug p
2a3b0 72 69 6e 74 69 6e 67 20 63 6f 64 65 0a 2a 2a 2a  rinting code.***
2a3c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a3d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a3e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a3f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a400 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 23 65 6e 64  **********/.#end
2a410 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 53 51  if /* defined(SQ
2a420 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 54 52 45 45  LITE_ENABLE_TREE
2a430 5f 45 58 50 4c 41 49 4e 29 20 2a 2f 0a           _EXPLAIN) */.