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

Artifact 9d111a1adef56151b4bbddbcaea6d117d374e17d:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 70 61 72 73 65 72 0a 2a 2a 20 74 6f  the parser.** to
01c0: 20 68 61 6e 64 6c 65 20 53 45 4c 45 43 54 20 73   handle SELECT s
01d0: 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 53 51 4c  tatements in SQL
01e0: 69 74 65 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65  ite..*/.#include
01f0: 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a   "sqliteInt.h"..
0200: 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6c  ./*.** Delete al
0210: 6c 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  l the content of
0220: 20 61 20 53 65 6c 65 63 74 20 73 74 72 75 63 74   a Select struct
0230: 75 72 65 20 62 75 74 20 64 6f 20 6e 6f 74 20 64  ure but do not d
0240: 65 61 6c 6c 6f 63 61 74 65 0a 2a 2a 20 74 68 65  eallocate.** the
0250: 20 73 65 6c 65 63 74 20 73 74 72 75 63 74 75 72   select structur
0260: 65 20 69 74 73 65 6c 66 2e 0a 2a 2f 0a 73 74 61  e itself..*/.sta
0270: 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72 53 65  tic void clearSe
0280: 6c 65 63 74 28 73 71 6c 69 74 65 33 20 2a 64 62  lect(sqlite3 *db
0290: 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  , Select *p){.  
02a0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
02b0: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 45 4c  elete(db, p->pEL
02c0: 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  ist);.  sqlite3S
02d0: 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  rcListDelete(db,
02e0: 20 70 2d 3e 70 53 72 63 29 3b 0a 20 20 73 71 6c   p->pSrc);.  sql
02f0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
0300: 62 2c 20 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20  b, p->pWhere);. 
0310: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
0320: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 47  Delete(db, p->pG
0330: 72 6f 75 70 42 79 29 3b 0a 20 20 73 71 6c 69 74  roupBy);.  sqlit
0340: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
0350: 20 70 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20   p->pHaving);.  
0360: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
0370: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 72  elete(db, p->pOr
0380: 64 65 72 42 79 29 3b 0a 20 20 73 71 6c 69 74 65  derBy);.  sqlite
0390: 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
03a0: 2c 20 70 2d 3e 70 50 72 69 6f 72 29 3b 0a 20 20  , p->pPrior);.  
03b0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
03c0: 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29  e(db, p->pLimit)
03d0: 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  ;.  sqlite3ExprD
03e0: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 66  elete(db, p->pOf
03f0: 66 73 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  fset);.}../*.** 
0400: 49 6e 69 74 69 61 6c 69 7a 65 20 61 20 53 65 6c  Initialize a Sel
0410: 65 63 74 44 65 73 74 20 73 74 72 75 63 74 75 72  ectDest structur
0420: 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
0430: 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74  e3SelectDestInit
0440: 28 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65  (SelectDest *pDe
0450: 73 74 2c 20 69 6e 74 20 65 44 65 73 74 2c 20 69  st, int eDest, i
0460: 6e 74 20 69 50 61 72 6d 29 7b 0a 20 20 70 44 65  nt iParm){.  pDe
0470: 73 74 2d 3e 65 44 65 73 74 20 3d 20 28 75 38 29  st->eDest = (u8)
0480: 65 44 65 73 74 3b 0a 20 20 70 44 65 73 74 2d 3e  eDest;.  pDest->
0490: 69 53 44 50 61 72 6d 20 3d 20 69 50 61 72 6d 3b  iSDParm = iParm;
04a0: 0a 20 20 70 44 65 73 74 2d 3e 61 66 66 53 64 73  .  pDest->affSds
04b0: 74 20 3d 20 30 3b 0a 20 20 70 44 65 73 74 2d 3e  t = 0;.  pDest->
04c0: 69 53 64 73 74 20 3d 20 30 3b 0a 20 20 70 44 65  iSdst = 0;.  pDe
04d0: 73 74 2d 3e 6e 53 64 73 74 20 3d 20 30 3b 0a 7d  st->nSdst = 0;.}
04e0: 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  .../*.** Allocat
04f0: 65 20 61 20 6e 65 77 20 53 65 6c 65 63 74 20 73  e a new Select s
0500: 74 72 75 63 74 75 72 65 20 61 6e 64 20 72 65 74  tructure and ret
0510: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
0520: 20 74 68 61 74 0a 2a 2a 20 73 74 72 75 63 74 75   that.** structu
0530: 72 65 2e 0a 2a 2f 0a 53 65 6c 65 63 74 20 2a 73  re..*/.Select *s
0540: 71 6c 69 74 65 33 53 65 6c 65 63 74 4e 65 77 28  qlite3SelectNew(
0550: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
0560: 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  ,        /* Pars
0570: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
0580: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
0590: 74 2c 20 20 20 20 20 2f 2a 20 77 68 69 63 68 20  t,     /* which 
05a0: 63 6f 6c 75 6d 6e 73 20 74 6f 20 69 6e 63 6c 75  columns to inclu
05b0: 64 65 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  de in the result
05c0: 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
05d0: 53 72 63 2c 20 20 20 20 20 20 20 20 2f 2a 20 74  Src,        /* t
05e0: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2d  he FROM clause -
05f0: 2d 20 77 68 69 63 68 20 74 61 62 6c 65 73 20 74  - which tables t
0600: 6f 20 73 63 61 6e 20 2a 2f 0a 20 20 45 78 70 72  o scan */.  Expr
0610: 20 2a 70 57 68 65 72 65 2c 20 20 20 20 20 20 20   *pWhere,       
0620: 20 20 2f 2a 20 74 68 65 20 57 48 45 52 45 20 63    /* the WHERE c
0630: 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c  lause */.  ExprL
0640: 69 73 74 20 2a 70 47 72 6f 75 70 42 79 2c 20 20  ist *pGroupBy,  
0650: 20 2f 2a 20 74 68 65 20 47 52 4f 55 50 20 42 59   /* the GROUP BY
0660: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70   clause */.  Exp
0670: 72 20 2a 70 48 61 76 69 6e 67 2c 20 20 20 20 20  r *pHaving,     
0680: 20 20 20 2f 2a 20 74 68 65 20 48 41 56 49 4e 47     /* the HAVING
0690: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70   clause */.  Exp
06a0: 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c  rList *pOrderBy,
06b0: 20 20 20 2f 2a 20 74 68 65 20 4f 52 44 45 52 20     /* the ORDER 
06c0: 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 75  BY clause */.  u
06d0: 31 36 20 73 65 6c 46 6c 61 67 73 2c 20 20 20 20  16 selFlags,    
06e0: 20 20 20 20 20 2f 2a 20 46 6c 61 67 20 70 61 72       /* Flag par
06f0: 61 6d 65 74 65 72 73 2c 20 73 75 63 68 20 61 73  ameters, such as
0700: 20 53 46 5f 44 69 73 74 69 6e 63 74 20 2a 2f 0a   SF_Distinct */.
0710: 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20    Expr *pLimit, 
0720: 20 20 20 20 20 20 20 20 2f 2a 20 4c 49 4d 49 54          /* LIMIT
0730: 20 76 61 6c 75 65 2e 20 20 4e 55 4c 4c 20 6d 65   value.  NULL me
0740: 61 6e 73 20 6e 6f 74 20 75 73 65 64 20 2a 2f 0a  ans not used */.
0750: 20 20 45 78 70 72 20 2a 70 4f 66 66 73 65 74 20    Expr *pOffset 
0760: 20 20 20 20 20 20 20 20 2f 2a 20 4f 46 46 53 45          /* OFFSE
0770: 54 20 76 61 6c 75 65 2e 20 20 4e 55 4c 4c 20 6d  T value.  NULL m
0780: 65 61 6e 73 20 6e 6f 20 6f 66 66 73 65 74 20 2a  eans no offset *
0790: 2f 0a 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70  /.){.  Select *p
07a0: 4e 65 77 3b 0a 20 20 53 65 6c 65 63 74 20 73 74  New;.  Select st
07b0: 61 6e 64 69 6e 3b 0a 20 20 73 71 6c 69 74 65 33  andin;.  sqlite3
07c0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
07d0: 62 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  b;.  pNew = sqli
07e0: 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
07f0: 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77  db, sizeof(*pNew
0800: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64  ) );.  assert( d
0810: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
0820: 7c 7c 20 21 70 4f 66 66 73 65 74 20 7c 7c 20 70  || !pOffset || p
0830: 4c 69 6d 69 74 20 29 3b 20 2f 2a 20 4f 46 46 53  Limit ); /* OFFS
0840: 45 54 20 69 6d 70 6c 69 65 73 20 4c 49 4d 49 54  ET implies LIMIT
0850: 20 2a 2f 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d   */.  if( pNew==
0860: 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
0870: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
0880: 64 20 29 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20  d );.    pNew = 
0890: 26 73 74 61 6e 64 69 6e 3b 0a 20 20 20 20 6d 65  &standin;.    me
08a0: 6d 73 65 74 28 70 4e 65 77 2c 20 30 2c 20 73 69  mset(pNew, 0, si
08b0: 7a 65 6f 66 28 2a 70 4e 65 77 29 29 3b 0a 20 20  zeof(*pNew));.  
08c0: 7d 0a 20 20 69 66 28 20 70 45 4c 69 73 74 3d 3d  }.  if( pEList==
08d0: 30 20 29 7b 0a 20 20 20 20 70 45 4c 69 73 74 20  0 ){.    pEList 
08e0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
08f0: 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20  tAppend(pParse, 
0900: 30 2c 20 73 71 6c 69 74 65 33 45 78 70 72 28 64  0, sqlite3Expr(d
0910: 62 2c 54 4b 5f 41 4c 4c 2c 30 29 29 3b 0a 20 20  b,TK_ALL,0));.  
0920: 7d 0a 20 20 70 4e 65 77 2d 3e 70 45 4c 69 73 74  }.  pNew->pEList
0930: 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20 69 66 28   = pEList;.  if(
0940: 20 70 53 72 63 3d 3d 30 20 29 20 70 53 72 63 20   pSrc==0 ) pSrc 
0950: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
0960: 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66  cZero(db, sizeof
0970: 28 2a 70 53 72 63 29 29 3b 0a 20 20 70 4e 65 77  (*pSrc));.  pNew
0980: 2d 3e 70 53 72 63 20 3d 20 70 53 72 63 3b 0a 20  ->pSrc = pSrc;. 
0990: 20 70 4e 65 77 2d 3e 70 57 68 65 72 65 20 3d 20   pNew->pWhere = 
09a0: 70 57 68 65 72 65 3b 0a 20 20 70 4e 65 77 2d 3e  pWhere;.  pNew->
09b0: 70 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f 75  pGroupBy = pGrou
09c0: 70 42 79 3b 0a 20 20 70 4e 65 77 2d 3e 70 48 61  pBy;.  pNew->pHa
09d0: 76 69 6e 67 20 3d 20 70 48 61 76 69 6e 67 3b 0a  ving = pHaving;.
09e0: 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79    pNew->pOrderBy
09f0: 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 70   = pOrderBy;.  p
0a00: 4e 65 77 2d 3e 73 65 6c 46 6c 61 67 73 20 3d 20  New->selFlags = 
0a10: 73 65 6c 46 6c 61 67 73 3b 0a 20 20 70 4e 65 77  selFlags;.  pNew
0a20: 2d 3e 6f 70 20 3d 20 54 4b 5f 53 45 4c 45 43 54  ->op = TK_SELECT
0a30: 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 6d 69 74  ;.  pNew->pLimit
0a40: 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 70 4e 65   = pLimit;.  pNe
0a50: 77 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f 66  w->pOffset = pOf
0a60: 66 73 65 74 3b 0a 20 20 61 73 73 65 72 74 28 20  fset;.  assert( 
0a70: 70 4f 66 66 73 65 74 3d 3d 30 20 7c 7c 20 70 4c  pOffset==0 || pL
0a80: 69 6d 69 74 21 3d 30 20 29 3b 0a 20 20 70 4e 65  imit!=0 );.  pNe
0a90: 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  w->addrOpenEphm[
0aa0: 30 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d  0] = -1;.  pNew-
0ab0: 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d  >addrOpenEphm[1]
0ac0: 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 61   = -1;.  pNew->a
0ad0: 64 64 72 4f 70 65 6e 45 70 68 6d 5b 32 5d 20 3d  ddrOpenEphm[2] =
0ae0: 20 2d 31 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d   -1;.  if( db->m
0af0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 7b 0a  allocFailed ) {.
0b00: 20 20 20 20 63 6c 65 61 72 53 65 6c 65 63 74 28      clearSelect(
0b10: 64 62 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 69  db, pNew);.    i
0b20: 66 28 20 70 4e 65 77 21 3d 26 73 74 61 6e 64 69  f( pNew!=&standi
0b30: 6e 20 29 20 73 71 6c 69 74 65 33 44 62 46 72 65  n ) sqlite3DbFre
0b40: 65 28 64 62 2c 20 70 4e 65 77 29 3b 0a 20 20 20  e(db, pNew);.   
0b50: 20 70 4e 65 77 20 3d 20 30 3b 0a 20 20 7d 65 6c   pNew = 0;.  }el
0b60: 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
0b70: 70 4e 65 77 2d 3e 70 53 72 63 21 3d 30 20 7c 7c  pNew->pSrc!=0 ||
0b80: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20   pParse->nErr>0 
0b90: 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
0ba0: 20 70 4e 65 77 21 3d 26 73 74 61 6e 64 69 6e 20   pNew!=&standin 
0bb0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77  );.  return pNew
0bc0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  ;.}../*.** Delet
0bd0: 65 20 74 68 65 20 67 69 76 65 6e 20 53 65 6c 65  e the given Sele
0be0: 63 74 20 73 74 72 75 63 74 75 72 65 20 61 6e 64  ct structure and
0bf0: 20 61 6c 6c 20 6f 66 20 69 74 73 20 73 75 62 73   all of its subs
0c00: 74 72 75 63 74 75 72 65 73 2e 0a 2a 2f 0a 76 6f  tructures..*/.vo
0c10: 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  id sqlite3Select
0c20: 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a  Delete(sqlite3 *
0c30: 64 62 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a  db, Select *p){.
0c40: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 63    if( p ){.    c
0c50: 6c 65 61 72 53 65 6c 65 63 74 28 64 62 2c 20 70  learSelect(db, p
0c60: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
0c70: 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 20 20 7d  Free(db, p);.  }
0c80: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  .}../*.** Given 
0c90: 31 20 74 6f 20 33 20 69 64 65 6e 74 69 66 69 65  1 to 3 identifie
0ca0: 72 73 20 70 72 65 63 65 64 69 6e 67 20 74 68 65  rs preceding the
0cb0: 20 4a 4f 49 4e 20 6b 65 79 77 6f 72 64 2c 20 64   JOIN keyword, d
0cc0: 65 74 65 72 6d 69 6e 65 20 74 68 65 0a 2a 2a 20  etermine the.** 
0cd0: 74 79 70 65 20 6f 66 20 6a 6f 69 6e 2e 20 20 52  type of join.  R
0ce0: 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72  eturn an integer
0cf0: 20 63 6f 6e 73 74 61 6e 74 20 74 68 61 74 20 65   constant that e
0d00: 78 70 72 65 73 73 65 73 20 74 68 61 74 20 74 79  xpresses that ty
0d10: 70 65 0a 2a 2a 20 69 6e 20 74 65 72 6d 73 20 6f  pe.** in terms o
0d20: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
0d30: 62 69 74 20 76 61 6c 75 65 73 3a 0a 2a 2a 0a 2a  bit values:.**.*
0d40: 2a 20 20 20 20 20 4a 54 5f 49 4e 4e 45 52 0a 2a  *     JT_INNER.*
0d50: 2a 20 20 20 20 20 4a 54 5f 43 52 4f 53 53 0a 2a  *     JT_CROSS.*
0d60: 2a 20 20 20 20 20 4a 54 5f 4f 55 54 45 52 0a 2a  *     JT_OUTER.*
0d70: 2a 20 20 20 20 20 4a 54 5f 4e 41 54 55 52 41 4c  *     JT_NATURAL
0d80: 0a 2a 2a 20 20 20 20 20 4a 54 5f 4c 45 46 54 0a  .**     JT_LEFT.
0d90: 2a 2a 20 20 20 20 20 4a 54 5f 52 49 47 48 54 0a  **     JT_RIGHT.
0da0: 2a 2a 0a 2a 2a 20 41 20 66 75 6c 6c 20 6f 75 74  **.** A full out
0db0: 65 72 20 6a 6f 69 6e 20 69 73 20 74 68 65 20 63  er join is the c
0dc0: 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20 4a 54  ombination of JT
0dd0: 5f 4c 45 46 54 20 61 6e 64 20 4a 54 5f 52 49 47  _LEFT and JT_RIG
0de0: 48 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  HT..**.** If an 
0df0: 69 6c 6c 65 67 61 6c 20 6f 72 20 75 6e 73 75 70  illegal or unsup
0e00: 70 6f 72 74 65 64 20 6a 6f 69 6e 20 74 79 70 65  ported join type
0e10: 20 69 73 20 73 65 65 6e 2c 20 74 68 65 6e 20 73   is seen, then s
0e20: 74 69 6c 6c 20 72 65 74 75 72 6e 0a 2a 2a 20 61  till return.** a
0e30: 20 6a 6f 69 6e 20 74 79 70 65 2c 20 62 75 74 20   join type, but 
0e40: 70 75 74 20 61 6e 20 65 72 72 6f 72 20 69 6e 20  put an error in 
0e50: 74 68 65 20 70 50 61 72 73 65 20 73 74 72 75 63  the pParse struc
0e60: 74 75 72 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ture..*/.int sql
0e70: 69 74 65 33 4a 6f 69 6e 54 79 70 65 28 50 61 72  ite3JoinType(Par
0e80: 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65  se *pParse, Toke
0e90: 6e 20 2a 70 41 2c 20 54 6f 6b 65 6e 20 2a 70 42  n *pA, Token *pB
0ea0: 2c 20 54 6f 6b 65 6e 20 2a 70 43 29 7b 0a 20 20  , Token *pC){.  
0eb0: 69 6e 74 20 6a 6f 69 6e 74 79 70 65 20 3d 20 30  int jointype = 0
0ec0: 3b 0a 20 20 54 6f 6b 65 6e 20 2a 61 70 41 6c 6c  ;.  Token *apAll
0ed0: 5b 33 5d 3b 0a 20 20 54 6f 6b 65 6e 20 2a 70 3b  [3];.  Token *p;
0ee0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
0ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
0f00: 20 20 20 30 31 32 33 34 35 36 37 38 39 20 31 32     0123456789 12
0f10: 33 34 35 36 37 38 39 20 31 32 33 34 35 36 37 38  3456789 12345678
0f20: 39 20 31 32 33 20 2a 2f 0a 20 20 73 74 61 74 69  9 123 */.  stati
0f30: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 4b 65  c const char zKe
0f40: 79 54 65 78 74 5b 5d 20 3d 20 22 6e 61 74 75 72  yText[] = "natur
0f50: 61 6c 65 66 74 6f 75 74 65 72 69 67 68 74 66 75  aleftouterightfu
0f60: 6c 6c 69 6e 6e 65 72 63 72 6f 73 73 22 3b 0a 20  llinnercross";. 
0f70: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74   static const st
0f80: 72 75 63 74 20 7b 0a 20 20 20 20 75 38 20 69 3b  ruct {.    u8 i;
0f90: 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e          /* Begin
0fa0: 6e 69 6e 67 20 6f 66 20 6b 65 79 77 6f 72 64 20  ning of keyword 
0fb0: 74 65 78 74 20 69 6e 20 7a 4b 65 79 54 65 78 74  text in zKeyText
0fc0: 5b 5d 20 2a 2f 0a 20 20 20 20 75 38 20 6e 43 68  [] */.    u8 nCh
0fd0: 61 72 3b 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68  ar;    /* Length
0fe0: 20 6f 66 20 74 68 65 20 6b 65 79 77 6f 72 64 20   of the keyword 
0ff0: 69 6e 20 63 68 61 72 61 63 74 65 72 73 20 2a 2f  in characters */
1000: 0a 20 20 20 20 75 38 20 63 6f 64 65 3b 20 20 20  .    u8 code;   
1010: 20 20 2f 2a 20 4a 6f 69 6e 20 74 79 70 65 20 6d    /* Join type m
1020: 61 73 6b 20 2a 2f 0a 20 20 7d 20 61 4b 65 79 77  ask */.  } aKeyw
1030: 6f 72 64 5b 5d 20 3d 20 7b 0a 20 20 20 20 2f 2a  ord[] = {.    /*
1040: 20 6e 61 74 75 72 61 6c 20 2a 2f 20 7b 20 30 2c   natural */ { 0,
1050: 20 20 37 2c 20 4a 54 5f 4e 41 54 55 52 41 4c 20    7, JT_NATURAL 
1060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
1070: 2c 0a 20 20 20 20 2f 2a 20 6c 65 66 74 20 20 20  ,.    /* left   
1080: 20 2a 2f 20 7b 20 36 2c 20 20 34 2c 20 4a 54 5f   */ { 6,  4, JT_
1090: 4c 45 46 54 7c 4a 54 5f 4f 55 54 45 52 20 20 20  LEFT|JT_OUTER   
10a0: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a         },.    /*
10b0: 20 6f 75 74 65 72 20 20 20 2a 2f 20 7b 20 31 30   outer   */ { 10
10c0: 2c 20 35 2c 20 4a 54 5f 4f 55 54 45 52 20 20 20  , 5, JT_OUTER   
10d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
10e0: 2c 0a 20 20 20 20 2f 2a 20 72 69 67 68 74 20 20  ,.    /* right  
10f0: 20 2a 2f 20 7b 20 31 34 2c 20 35 2c 20 4a 54 5f   */ { 14, 5, JT_
1100: 52 49 47 48 54 7c 4a 54 5f 4f 55 54 45 52 20 20  RIGHT|JT_OUTER  
1110: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a         },.    /*
1120: 20 66 75 6c 6c 20 20 20 20 2a 2f 20 7b 20 31 39   full    */ { 19
1130: 2c 20 34 2c 20 4a 54 5f 4c 45 46 54 7c 4a 54 5f  , 4, JT_LEFT|JT_
1140: 52 49 47 48 54 7c 4a 54 5f 4f 55 54 45 52 20 7d  RIGHT|JT_OUTER }
1150: 2c 0a 20 20 20 20 2f 2a 20 69 6e 6e 65 72 20 20  ,.    /* inner  
1160: 20 2a 2f 20 7b 20 32 33 2c 20 35 2c 20 4a 54 5f   */ { 23, 5, JT_
1170: 49 4e 4e 45 52 20 20 20 20 20 20 20 20 20 20 20  INNER           
1180: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a         },.    /*
1190: 20 63 72 6f 73 73 20 20 20 2a 2f 20 7b 20 32 38   cross   */ { 28
11a0: 2c 20 35 2c 20 4a 54 5f 49 4e 4e 45 52 7c 4a 54  , 5, JT_INNER|JT
11b0: 5f 43 52 4f 53 53 20 20 20 20 20 20 20 20 20 7d  _CROSS         }
11c0: 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 2c 20  ,.  };.  int i, 
11d0: 6a 3b 0a 20 20 61 70 41 6c 6c 5b 30 5d 20 3d 20  j;.  apAll[0] = 
11e0: 70 41 3b 0a 20 20 61 70 41 6c 6c 5b 31 5d 20 3d  pA;.  apAll[1] =
11f0: 20 70 42 3b 0a 20 20 61 70 41 6c 6c 5b 32 5d 20   pB;.  apAll[2] 
1200: 3d 20 70 43 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  = pC;.  for(i=0;
1210: 20 69 3c 33 20 26 26 20 61 70 41 6c 6c 5b 69 5d   i<3 && apAll[i]
1220: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20  ; i++){.    p = 
1230: 61 70 41 6c 6c 5b 69 5d 3b 0a 20 20 20 20 66 6f  apAll[i];.    fo
1240: 72 28 6a 3d 30 3b 20 6a 3c 41 72 72 61 79 53 69  r(j=0; j<ArraySi
1250: 7a 65 28 61 4b 65 79 77 6f 72 64 29 3b 20 6a 2b  ze(aKeyword); j+
1260: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  +){.      if( p-
1270: 3e 6e 3d 3d 61 4b 65 79 77 6f 72 64 5b 6a 5d 2e  >n==aKeyword[j].
1280: 6e 43 68 61 72 20 0a 20 20 20 20 20 20 20 20 20  nChar .         
1290: 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 4e 49   && sqlite3StrNI
12a0: 43 6d 70 28 28 63 68 61 72 2a 29 70 2d 3e 7a 2c  Cmp((char*)p->z,
12b0: 20 26 7a 4b 65 79 54 65 78 74 5b 61 4b 65 79 77   &zKeyText[aKeyw
12c0: 6f 72 64 5b 6a 5d 2e 69 5d 2c 20 70 2d 3e 6e 29  ord[j].i], p->n)
12d0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6a  ==0 ){.        j
12e0: 6f 69 6e 74 79 70 65 20 7c 3d 20 61 4b 65 79 77  ointype |= aKeyw
12f0: 6f 72 64 5b 6a 5d 2e 63 6f 64 65 3b 0a 20 20 20  ord[j].code;.   
1300: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1310: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 74 65    }.    }.    te
1320: 73 74 63 61 73 65 28 20 6a 3d 3d 30 20 7c 7c 20  stcase( j==0 || 
1330: 6a 3d 3d 31 20 7c 7c 20 6a 3d 3d 32 20 7c 7c 20  j==1 || j==2 || 
1340: 6a 3d 3d 33 20 7c 7c 20 6a 3d 3d 34 20 7c 7c 20  j==3 || j==4 || 
1350: 6a 3d 3d 35 20 7c 7c 20 6a 3d 3d 36 20 29 3b 0a  j==5 || j==6 );.
1360: 20 20 20 20 69 66 28 20 6a 3e 3d 41 72 72 61 79      if( j>=Array
1370: 53 69 7a 65 28 61 4b 65 79 77 6f 72 64 29 20 29  Size(aKeyword) )
1380: 7b 0a 20 20 20 20 20 20 6a 6f 69 6e 74 79 70 65  {.      jointype
1390: 20 7c 3d 20 4a 54 5f 45 52 52 4f 52 3b 0a 20 20   |= JT_ERROR;.  
13a0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
13b0: 0a 20 20 7d 0a 20 20 69 66 28 0a 20 20 20 20 20  .  }.  if(.     
13c0: 28 6a 6f 69 6e 74 79 70 65 20 26 20 28 4a 54 5f  (jointype & (JT_
13d0: 49 4e 4e 45 52 7c 4a 54 5f 4f 55 54 45 52 29 29  INNER|JT_OUTER))
13e0: 3d 3d 28 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f 4f  ==(JT_INNER|JT_O
13f0: 55 54 45 52 29 20 7c 7c 0a 20 20 20 20 20 28 6a  UTER) ||.     (j
1400: 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 45 52 52  ointype & JT_ERR
1410: 4f 52 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20  OR)!=0.  ){.    
1420: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 70 20  const char *zSp 
1430: 3d 20 22 20 22 3b 0a 20 20 20 20 61 73 73 65 72  = " ";.    asser
1440: 74 28 20 70 42 21 3d 30 20 29 3b 0a 20 20 20 20  t( pB!=0 );.    
1450: 69 66 28 20 70 43 3d 3d 30 20 29 7b 20 7a 53 70  if( pC==0 ){ zSp
1460: 2b 2b 3b 20 7d 0a 20 20 20 20 73 71 6c 69 74 65  ++; }.    sqlite
1470: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
1480: 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6f 72 20 75 6e  , "unknown or un
1490: 73 75 70 70 6f 72 74 65 64 20 6a 6f 69 6e 20 74  supported join t
14a0: 79 70 65 3a 20 22 0a 20 20 20 20 20 20 20 22 25  ype: ".       "%
14b0: 54 20 25 54 25 73 25 54 22 2c 20 70 41 2c 20 70  T %T%s%T", pA, p
14c0: 42 2c 20 7a 53 70 2c 20 70 43 29 3b 0a 20 20 20  B, zSp, pC);.   
14d0: 20 6a 6f 69 6e 74 79 70 65 20 3d 20 4a 54 5f 49   jointype = JT_I
14e0: 4e 4e 45 52 3b 0a 20 20 7d 65 6c 73 65 20 69 66  NNER;.  }else if
14f0: 28 20 28 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54  ( (jointype & JT
1500: 5f 4f 55 54 45 52 29 21 3d 30 20 0a 20 20 20 20  _OUTER)!=0 .    
1510: 20 20 20 20 20 26 26 20 28 6a 6f 69 6e 74 79 70       && (jointyp
1520: 65 20 26 20 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f  e & (JT_LEFT|JT_
1530: 52 49 47 48 54 29 29 21 3d 4a 54 5f 4c 45 46 54  RIGHT))!=JT_LEFT
1540: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
1550: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
1560: 0a 20 20 20 20 20 20 22 52 49 47 48 54 20 61 6e  .      "RIGHT an
1570: 64 20 46 55 4c 4c 20 4f 55 54 45 52 20 4a 4f 49  d FULL OUTER JOI
1580: 4e 73 20 61 72 65 20 6e 6f 74 20 63 75 72 72 65  Ns are not curre
1590: 6e 74 6c 79 20 73 75 70 70 6f 72 74 65 64 22 29  ntly supported")
15a0: 3b 0a 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d  ;.    jointype =
15b0: 20 4a 54 5f 49 4e 4e 45 52 3b 0a 20 20 7d 0a 20   JT_INNER;.  }. 
15c0: 20 72 65 74 75 72 6e 20 6a 6f 69 6e 74 79 70 65   return jointype
15d0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
15e0: 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61  n the index of a
15f0: 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 20 74 61 62   column in a tab
1600: 6c 65 2e 20 20 52 65 74 75 72 6e 20 2d 31 20 69  le.  Return -1 i
1610: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20  f the column.** 
1620: 69 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64  is not contained
1630: 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a   in the table..*
1640: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 6c  /.static int col
1650: 75 6d 6e 49 6e 64 65 78 28 54 61 62 6c 65 20 2a  umnIndex(Table *
1660: 70 54 61 62 2c 20 63 6f 6e 73 74 20 63 68 61 72  pTab, const char
1670: 20 2a 7a 43 6f 6c 29 7b 0a 20 20 69 6e 74 20 69   *zCol){.  int i
1680: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
1690: 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  Tab->nCol; i++){
16a0: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
16b0: 53 74 72 49 43 6d 70 28 70 54 61 62 2d 3e 61 43  StrICmp(pTab->aC
16c0: 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 43 6f  ol[i].zName, zCo
16d0: 6c 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 69  l)==0 ) return i
16e0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d  ;.  }.  return -
16f0: 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72  1;.}../*.** Sear
1700: 63 68 20 74 68 65 20 66 69 72 73 74 20 4e 20 74  ch the first N t
1710: 61 62 6c 65 73 20 69 6e 20 70 53 72 63 2c 20 66  ables in pSrc, f
1720: 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68  rom left to righ
1730: 74 2c 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61  t, looking for a
1740: 0a 2a 2a 20 74 61 62 6c 65 20 74 68 61 74 20 68  .** table that h
1750: 61 73 20 61 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  as a column name
1760: 64 20 7a 43 6f 6c 2e 20 20 0a 2a 2a 0a 2a 2a 20  d zCol.  .**.** 
1770: 57 68 65 6e 20 66 6f 75 6e 64 2c 20 73 65 74 20  When found, set 
1780: 2a 70 69 54 61 62 20 61 6e 64 20 2a 70 69 43 6f  *piTab and *piCo
1790: 6c 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 69  l to the table i
17a0: 6e 64 65 78 20 61 6e 64 20 63 6f 6c 75 6d 6e 20  ndex and column 
17b0: 69 6e 64 65 78 0a 2a 2a 20 6f 66 20 74 68 65 20  index.** of the 
17c0: 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20  matching column 
17d0: 61 6e 64 20 72 65 74 75 72 6e 20 54 52 55 45 2e  and return TRUE.
17e0: 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 74 20 66 6f  .**.** If not fo
17f0: 75 6e 64 2c 20 72 65 74 75 72 6e 20 46 41 4c 53  und, return FALS
1800: 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  E..*/.static int
1810: 20 74 61 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49   tableAndColumnI
1820: 6e 64 65 78 28 0a 20 20 53 72 63 4c 69 73 74 20  ndex(.  SrcList 
1830: 2a 70 53 72 63 2c 20 20 20 20 20 20 20 2f 2a 20  *pSrc,       /* 
1840: 41 72 72 61 79 20 6f 66 20 74 61 62 6c 65 73 20  Array of tables 
1850: 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 69  to search */.  i
1860: 6e 74 20 4e 2c 20 20 20 20 20 20 20 20 20 20 20  nt N,           
1870: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1880: 20 74 61 62 6c 65 73 20 69 6e 20 70 53 72 63 2d   tables in pSrc-
1890: 3e 61 5b 5d 20 74 6f 20 73 65 61 72 63 68 20 2a  >a[] to search *
18a0: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
18b0: 7a 43 6f 6c 2c 20 20 20 20 2f 2a 20 4e 61 6d 65  zCol,    /* Name
18c0: 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 77   of the column w
18d0: 65 20 61 72 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f  e are looking fo
18e0: 72 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 54 61  r */.  int *piTa
18f0: 62 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  b,          /* W
1900: 72 69 74 65 20 69 6e 64 65 78 20 6f 66 20 70 53  rite index of pS
1910: 72 63 2d 3e 61 5b 5d 20 68 65 72 65 20 2a 2f 0a  rc->a[] here */.
1920: 20 20 69 6e 74 20 2a 70 69 43 6f 6c 20 20 20 20    int *piCol    
1930: 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
1940: 69 6e 64 65 78 20 6f 66 20 70 53 72 63 2d 3e 61  index of pSrc->a
1950: 5b 2a 70 69 54 61 62 5d 2e 70 54 61 62 2d 3e 61  [*piTab].pTab->a
1960: 43 6f 6c 5b 5d 20 68 65 72 65 20 2a 2f 0a 29 7b  Col[] here */.){
1970: 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
1980: 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c          /* For l
1990: 6f 6f 70 69 6e 67 20 6f 76 65 72 20 74 61 62 6c  ooping over tabl
19a0: 65 73 20 69 6e 20 70 53 72 63 20 2a 2f 0a 20 20  es in pSrc */.  
19b0: 69 6e 74 20 69 43 6f 6c 3b 20 20 20 20 20 20 20  int iCol;       
19c0: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
19d0: 20 63 6f 6c 75 6d 6e 20 6d 61 74 63 68 69 6e 67   column matching
19e0: 20 7a 43 6f 6c 20 2a 2f 0a 0a 20 20 61 73 73 65   zCol */..  asse
19f0: 72 74 28 20 28 70 69 54 61 62 3d 3d 30 29 3d 3d  rt( (piTab==0)==
1a00: 28 70 69 43 6f 6c 3d 3d 30 29 20 29 3b 20 20 2f  (piCol==0) );  /
1a10: 2a 20 42 6f 74 68 20 6f 72 20 6e 65 69 74 68 65  * Both or neithe
1a20: 72 20 61 72 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  r are NULL */.  
1a30: 66 6f 72 28 69 3d 30 3b 20 69 3c 4e 3b 20 69 2b  for(i=0; i<N; i+
1a40: 2b 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20 63  +){.    iCol = c
1a50: 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 53 72 63 2d  olumnIndex(pSrc-
1a60: 3e 61 5b 69 5d 2e 70 54 61 62 2c 20 7a 43 6f 6c  >a[i].pTab, zCol
1a70: 29 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3e  );.    if( iCol>
1a80: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
1a90: 70 69 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20  piTab ){.       
1aa0: 20 2a 70 69 54 61 62 20 3d 20 69 3b 0a 20 20 20   *piTab = i;.   
1ab0: 20 20 20 20 20 2a 70 69 43 6f 6c 20 3d 20 69 43       *piCol = iC
1ac0: 6f 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ol;.      }.    
1ad0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
1ae0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
1af0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
1b00: 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
1b10: 20 74 6f 20 61 64 64 20 74 65 72 6d 73 20 69 6d   to add terms im
1b20: 70 6c 69 65 64 20 62 79 20 4a 4f 49 4e 20 73 79  plied by JOIN sy
1b30: 6e 74 61 78 20 74 6f 20 74 68 65 0a 2a 2a 20 57  ntax to the.** W
1b40: 48 45 52 45 20 63 6c 61 75 73 65 20 65 78 70 72  HERE clause expr
1b50: 65 73 73 69 6f 6e 20 6f 66 20 61 20 53 45 4c 45  ession of a SELE
1b60: 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 54 68  CT statement. Th
1b70: 65 20 6e 65 77 20 74 65 72 6d 2c 20 77 68 69 63  e new term, whic
1b80: 68 0a 2a 2a 20 69 73 20 41 4e 44 65 64 20 77 69  h.** is ANDed wi
1b90: 74 68 20 74 68 65 20 65 78 69 73 74 69 6e 67 20  th the existing 
1ba0: 57 48 45 52 45 20 63 6c 61 75 73 65 2c 20 69 73  WHERE clause, is
1bb0: 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a   of the form:.**
1bc0: 0a 2a 2a 20 20 20 20 28 74 61 62 31 2e 63 6f 6c  .**    (tab1.col
1bd0: 31 20 3d 20 74 61 62 32 2e 63 6f 6c 32 29 0a 2a  1 = tab2.col2).*
1be0: 2a 0a 2a 2a 20 77 68 65 72 65 20 74 61 62 31 20  *.** where tab1 
1bf0: 69 73 20 74 68 65 20 69 53 72 63 27 74 68 20 74  is the iSrc'th t
1c00: 61 62 6c 65 20 69 6e 20 53 72 63 4c 69 73 74 20  able in SrcList 
1c10: 70 53 72 63 20 61 6e 64 20 74 61 62 32 20 69 73  pSrc and tab2 is
1c20: 20 74 68 65 20 0a 2a 2a 20 28 69 53 72 63 2b 31   the .** (iSrc+1
1c30: 29 27 74 68 2e 20 43 6f 6c 75 6d 6e 20 63 6f 6c  )'th. Column col
1c40: 31 20 69 73 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c  1 is column iCol
1c50: 4c 65 66 74 20 6f 66 20 74 61 62 31 2c 20 61 6e  Left of tab1, an
1c60: 64 20 63 6f 6c 32 20 69 73 0a 2a 2a 20 63 6f 6c  d col2 is.** col
1c70: 75 6d 6e 20 69 43 6f 6c 52 69 67 68 74 20 6f 66  umn iColRight of
1c80: 20 74 61 62 32 2e 0a 2a 2f 0a 73 74 61 74 69 63   tab2..*/.static
1c90: 20 76 6f 69 64 20 61 64 64 57 68 65 72 65 54 65   void addWhereTe
1ca0: 72 6d 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  rm(.  Parse *pPa
1cb0: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  rse,            
1cc0: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
1cd0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72   context */.  Sr
1ce0: 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20  cList *pSrc,    
1cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d00: 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20   List of tables 
1d10: 69 6e 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a  in FROM clause *
1d20: 2f 0a 20 20 69 6e 74 20 69 4c 65 66 74 2c 20 20  /.  int iLeft,  
1d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d40: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
1d50: 66 69 72 73 74 20 74 61 62 6c 65 20 74 6f 20 6a  first table to j
1d60: 6f 69 6e 20 69 6e 20 70 53 72 63 20 2a 2f 0a 20  oin in pSrc */. 
1d70: 20 69 6e 74 20 69 43 6f 6c 4c 65 66 74 2c 20 20   int iColLeft,  
1d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d90: 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c   /* Index of col
1da0: 75 6d 6e 20 69 6e 20 66 69 72 73 74 20 74 61 62  umn in first tab
1db0: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 69 67  le */.  int iRig
1dc0: 68 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ht,             
1dd0: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
1de0: 20 6f 66 20 73 65 63 6f 6e 64 20 74 61 62 6c 65   of second table
1df0: 20 69 6e 20 70 53 72 63 20 2a 2f 0a 20 20 69 6e   in pSrc */.  in
1e00: 74 20 69 43 6f 6c 52 69 67 68 74 2c 20 20 20 20  t iColRight,    
1e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e20: 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e   Index of column
1e30: 20 69 6e 20 73 65 63 6f 6e 64 20 74 61 62 6c 65   in second table
1e40: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4f 75 74 65   */.  int isOute
1e50: 72 4a 6f 69 6e 2c 20 20 20 20 20 20 20 20 20 20  rJoin,          
1e60: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
1e70: 20 74 68 69 73 20 69 73 20 61 6e 20 4f 55 54 45   this is an OUTE
1e80: 52 20 6a 6f 69 6e 20 2a 2f 0a 20 20 45 78 70 72  R join */.  Expr
1e90: 20 2a 2a 70 70 57 68 65 72 65 20 20 20 20 20 20   **ppWhere      
1ea0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
1eb0: 4e 2f 4f 55 54 3a 20 54 68 65 20 57 48 45 52 45  N/OUT: The WHERE
1ec0: 20 63 6c 61 75 73 65 20 74 6f 20 61 64 64 20 74   clause to add t
1ed0: 6f 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  o */.){.  sqlite
1ee0: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
1ef0: 64 62 3b 0a 20 20 45 78 70 72 20 2a 70 45 31 3b  db;.  Expr *pE1;
1f00: 0a 20 20 45 78 70 72 20 2a 70 45 32 3b 0a 20 20  .  Expr *pE2;.  
1f10: 45 78 70 72 20 2a 70 45 71 3b 0a 0a 20 20 61 73  Expr *pEq;..  as
1f20: 73 65 72 74 28 20 69 4c 65 66 74 3c 69 52 69 67  sert( iLeft<iRig
1f30: 68 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ht );.  assert( 
1f40: 70 53 72 63 2d 3e 6e 53 72 63 3e 69 52 69 67 68  pSrc->nSrc>iRigh
1f50: 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  t );.  assert( p
1f60: 53 72 63 2d 3e 61 5b 69 4c 65 66 74 5d 2e 70 54  Src->a[iLeft].pT
1f70: 61 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ab );.  assert( 
1f80: 70 53 72 63 2d 3e 61 5b 69 52 69 67 68 74 5d 2e  pSrc->a[iRight].
1f90: 70 54 61 62 20 29 3b 0a 0a 20 20 70 45 31 20 3d  pTab );..  pE1 =
1fa0: 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 43 6f   sqlite3CreateCo
1fb0: 6c 75 6d 6e 45 78 70 72 28 64 62 2c 20 70 53 72  lumnExpr(db, pSr
1fc0: 63 2c 20 69 4c 65 66 74 2c 20 69 43 6f 6c 4c 65  c, iLeft, iColLe
1fd0: 66 74 29 3b 0a 20 20 70 45 32 20 3d 20 73 71 6c  ft);.  pE2 = sql
1fe0: 69 74 65 33 43 72 65 61 74 65 43 6f 6c 75 6d 6e  ite3CreateColumn
1ff0: 45 78 70 72 28 64 62 2c 20 70 53 72 63 2c 20 69  Expr(db, pSrc, i
2000: 52 69 67 68 74 2c 20 69 43 6f 6c 52 69 67 68 74  Right, iColRight
2010: 29 3b 0a 0a 20 20 70 45 71 20 3d 20 73 71 6c 69  );..  pEq = sqli
2020: 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
2030: 20 54 4b 5f 45 51 2c 20 70 45 31 2c 20 70 45 32   TK_EQ, pE1, pE2
2040: 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 45 71 20  , 0);.  if( pEq 
2050: 26 26 20 69 73 4f 75 74 65 72 4a 6f 69 6e 20 29  && isOuterJoin )
2060: 7b 0a 20 20 20 20 45 78 70 72 53 65 74 50 72 6f  {.    ExprSetPro
2070: 70 65 72 74 79 28 70 45 71 2c 20 45 50 5f 46 72  perty(pEq, EP_Fr
2080: 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20 61 73 73  omJoin);.    ass
2090: 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
20a0: 70 65 72 74 79 28 70 45 71 2c 20 45 50 5f 54 6f  perty(pEq, EP_To
20b0: 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63  kenOnly|EP_Reduc
20c0: 65 64 29 20 29 3b 0a 20 20 20 20 45 78 70 72 53  ed) );.    ExprS
20d0: 65 74 56 56 41 50 72 6f 70 65 72 74 79 28 70 45  etVVAProperty(pE
20e0: 71 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b  q, EP_NoReduce);
20f0: 0a 20 20 20 20 70 45 71 2d 3e 69 52 69 67 68 74  .    pEq->iRight
2100: 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 28 69 31 36  JoinTable = (i16
2110: 29 70 45 32 2d 3e 69 54 61 62 6c 65 3b 0a 20 20  )pE2->iTable;.  
2120: 7d 0a 20 20 2a 70 70 57 68 65 72 65 20 3d 20 73  }.  *ppWhere = s
2130: 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 64 62  qlite3ExprAnd(db
2140: 2c 20 2a 70 70 57 68 65 72 65 2c 20 70 45 71 29  , *ppWhere, pEq)
2150: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
2160: 68 65 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 70  he EP_FromJoin p
2170: 72 6f 70 65 72 74 79 20 6f 6e 20 61 6c 6c 20 74  roperty on all t
2180: 65 72 6d 73 20 6f 66 20 74 68 65 20 67 69 76 65  erms of the give
2190: 6e 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a  n expression..**
21a0: 20 41 6e 64 20 73 65 74 20 74 68 65 20 45 78 70   And set the Exp
21b0: 72 2e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c  r.iRightJoinTabl
21c0: 65 20 74 6f 20 69 54 61 62 6c 65 20 66 6f 72 20  e to iTable for 
21d0: 65 76 65 72 79 20 74 65 72 6d 20 69 6e 20 74 68  every term in th
21e0: 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 2e  e.** expression.
21f0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 50 5f 46 72  .**.** The EP_Fr
2200: 6f 6d 4a 6f 69 6e 20 70 72 6f 70 65 72 74 79 20  omJoin property 
2210: 69 73 20 75 73 65 64 20 6f 6e 20 74 65 72 6d 73  is used on terms
2220: 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f   of an expressio
2230: 6e 20 74 6f 20 74 65 6c 6c 0a 2a 2a 20 74 68 65  n to tell.** the
2240: 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e   LEFT OUTER JOIN
2250: 20 70 72 6f 63 65 73 73 69 6e 67 20 6c 6f 67 69   processing logi
2260: 63 20 74 68 61 74 20 74 68 69 73 20 74 65 72 6d  c that this term
2270: 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 0a   is part of the.
2280: 2a 2a 20 6a 6f 69 6e 20 72 65 73 74 72 69 63 74  ** join restrict
2290: 69 6f 6e 20 73 70 65 63 69 66 69 65 64 20 69 6e  ion specified in
22a0: 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47   the ON or USING
22b0: 20 63 6c 61 75 73 65 20 61 6e 64 20 6e 6f 74 20   clause and not 
22c0: 61 20 70 61 72 74 0a 2a 2a 20 6f 66 20 74 68 65  a part.** of the
22d0: 20 6d 6f 72 65 20 67 65 6e 65 72 61 6c 20 57 48   more general WH
22e0: 45 52 45 20 63 6c 61 75 73 65 2e 20 20 54 68 65  ERE clause.  The
22f0: 73 65 20 74 65 72 6d 73 20 61 72 65 20 6d 6f 76  se terms are mov
2300: 65 64 20 6f 76 65 72 20 74 6f 20 74 68 65 0a 2a  ed over to the.*
2310: 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 64  * WHERE clause d
2320: 75 72 69 6e 67 20 6a 6f 69 6e 20 70 72 6f 63 65  uring join proce
2330: 73 73 69 6e 67 20 62 75 74 20 77 65 20 6e 65 65  ssing but we nee
2340: 64 20 74 6f 20 72 65 6d 65 6d 62 65 72 20 74 68  d to remember th
2350: 61 74 20 74 68 65 79 0a 2a 2a 20 6f 72 69 67 69  at they.** origi
2360: 6e 61 74 65 64 20 69 6e 20 74 68 65 20 4f 4e 20  nated in the ON 
2370: 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2e  or USING clause.
2380: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 78 70 72 2e  .**.** The Expr.
2390: 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20  iRightJoinTable 
23a0: 74 65 6c 6c 73 20 74 68 65 20 57 48 45 52 45 20  tells the WHERE 
23b0: 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e  clause processin
23c0: 67 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 65 78  g that the.** ex
23d0: 70 72 65 73 73 69 6f 6e 20 64 65 70 65 6e 64 73  pression depends
23e0: 20 6f 6e 20 74 61 62 6c 65 20 69 52 69 67 68 74   on table iRight
23f0: 4a 6f 69 6e 54 61 62 6c 65 20 65 76 65 6e 20 69  JoinTable even i
2400: 66 20 74 68 61 74 20 74 61 62 6c 65 20 69 73 20  f that table is 
2410: 6e 6f 74 0a 2a 2a 20 65 78 70 6c 69 63 69 74 6c  not.** explicitl
2420: 79 20 6d 65 6e 74 69 6f 6e 65 64 20 69 6e 20 74  y mentioned in t
2430: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20  he expression.  
2440: 54 68 61 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  That information
2450: 20 69 73 20 6e 65 65 64 65 64 0a 2a 2a 20 66 6f   is needed.** fo
2460: 72 20 63 61 73 65 73 20 6c 69 6b 65 20 74 68 69  r cases like thi
2470: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45  s:.**.**    SELE
2480: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4c 45 46  CT * FROM t1 LEF
2490: 54 20 4a 4f 49 4e 20 74 32 20 4f 4e 20 74 31 2e  T JOIN t2 ON t1.
24a0: 61 3d 74 32 2e 62 20 41 4e 44 20 74 31 2e 78 3d  a=t2.b AND t1.x=
24b0: 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 77 68 65 72  5.**.** The wher
24c0: 65 20 63 6c 61 75 73 65 20 6e 65 65 64 73 20 74  e clause needs t
24d0: 6f 20 64 65 66 65 72 20 74 68 65 20 68 61 6e 64  o defer the hand
24e0: 6c 69 6e 67 20 6f 66 20 74 68 65 20 74 31 2e 78  ling of the t1.x
24f0: 3d 35 0a 2a 2a 20 74 65 72 6d 20 75 6e 74 69 6c  =5.** term until
2500: 20 61 66 74 65 72 20 74 68 65 20 74 32 20 6c 6f   after the t2 lo
2510: 6f 70 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20  op of the join. 
2520: 20 49 6e 20 74 68 61 74 20 77 61 79 2c 20 61 0a   In that way, a.
2530: 2a 2a 20 4e 55 4c 4c 20 74 32 20 72 6f 77 20 77  ** NULL t2 row w
2540: 69 6c 6c 20 62 65 20 69 6e 73 65 72 74 65 64 20  ill be inserted 
2550: 77 68 65 6e 65 76 65 72 20 74 31 2e 78 21 3d 35  whenever t1.x!=5
2560: 2e 20 20 49 66 20 77 65 20 64 6f 20 6e 6f 74 0a  .  If we do not.
2570: 2a 2a 20 64 65 66 65 72 20 74 68 65 20 68 61 6e  ** defer the han
2580: 64 6c 69 6e 67 20 6f 66 20 74 31 2e 78 3d 35 2c  dling of t1.x=5,
2590: 20 69 74 20 77 69 6c 6c 20 62 65 20 70 72 6f 63   it will be proc
25a0: 65 73 73 65 64 20 69 6d 6d 65 64 69 61 74 65 6c  essed immediatel
25b0: 79 0a 2a 2a 20 61 66 74 65 72 20 74 68 65 20 74  y.** after the t
25c0: 31 20 6c 6f 6f 70 20 61 6e 64 20 72 6f 77 73 20  1 loop and rows 
25d0: 77 69 74 68 20 74 31 2e 78 21 3d 35 20 77 69 6c  with t1.x!=5 wil
25e0: 6c 20 6e 65 76 65 72 20 61 70 70 65 61 72 20 69  l never appear i
25f0: 6e 0a 2a 2a 20 74 68 65 20 6f 75 74 70 75 74 2c  n.** the output,
2600: 20 77 68 69 63 68 20 69 73 20 69 6e 63 6f 72 72   which is incorr
2610: 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ect..*/.static v
2620: 6f 69 64 20 73 65 74 4a 6f 69 6e 45 78 70 72 28  oid setJoinExpr(
2630: 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 69 54 61  Expr *p, int iTa
2640: 62 6c 65 29 7b 0a 20 20 77 68 69 6c 65 28 20 70  ble){.  while( p
2650: 20 29 7b 0a 20 20 20 20 45 78 70 72 53 65 74 50   ){.    ExprSetP
2660: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 46 72  roperty(p, EP_Fr
2670: 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20 61 73 73  omJoin);.    ass
2680: 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
2690: 70 65 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65  perty(p, EP_Toke
26a0: 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64  nOnly|EP_Reduced
26b0: 29 20 29 3b 0a 20 20 20 20 45 78 70 72 53 65 74  ) );.    ExprSet
26c0: 56 56 41 50 72 6f 70 65 72 74 79 28 70 2c 20 45  VVAProperty(p, E
26d0: 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a 20 20 20  P_NoReduce);.   
26e0: 20 70 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61   p->iRightJoinTa
26f0: 62 6c 65 20 3d 20 28 69 31 36 29 69 54 61 62 6c  ble = (i16)iTabl
2700: 65 3b 0a 20 20 20 20 73 65 74 4a 6f 69 6e 45 78  e;.    setJoinEx
2710: 70 72 28 70 2d 3e 70 4c 65 66 74 2c 20 69 54 61  pr(p->pLeft, iTa
2720: 62 6c 65 29 3b 0a 20 20 20 20 70 20 3d 20 70 2d  ble);.    p = p-
2730: 3e 70 52 69 67 68 74 3b 0a 20 20 7d 20 0a 7d 0a  >pRight;.  } .}.
2740: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
2750: 69 6e 65 20 70 72 6f 63 65 73 73 65 73 20 74 68  ine processes th
2760: 65 20 6a 6f 69 6e 20 69 6e 66 6f 72 6d 61 74 69  e join informati
2770: 6f 6e 20 66 6f 72 20 61 20 53 45 4c 45 43 54 20  on for a SELECT 
2780: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4f 4e  statement..** ON
2790: 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73   and USING claus
27a0: 65 73 20 61 72 65 20 63 6f 6e 76 65 72 74 65 64  es are converted
27b0: 20 69 6e 74 6f 20 65 78 74 72 61 20 74 65 72 6d   into extra term
27c0: 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  s of the WHERE c
27d0: 6c 61 75 73 65 2e 0a 2a 2a 20 4e 41 54 55 52 41  lause..** NATURA
27e0: 4c 20 6a 6f 69 6e 73 20 61 6c 73 6f 20 63 72 65  L joins also cre
27f0: 61 74 65 20 65 78 74 72 61 20 57 48 45 52 45 20  ate extra WHERE 
2800: 63 6c 61 75 73 65 20 74 65 72 6d 73 2e 0a 2a 2a  clause terms..**
2810: 0a 2a 2a 20 54 68 65 20 74 65 72 6d 73 20 6f 66  .** The terms of
2820: 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 61   a FROM clause a
2830: 72 65 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20  re contained in 
2840: 74 68 65 20 53 65 6c 65 63 74 2e 70 53 72 63 20  the Select.pSrc 
2850: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 20 54 68  structure..** Th
2860: 65 20 6c 65 66 74 20 6d 6f 73 74 20 74 61 62 6c  e left most tabl
2870: 65 20 69 73 20 74 68 65 20 66 69 72 73 74 20 65  e is the first e
2880: 6e 74 72 79 20 69 6e 20 53 65 6c 65 63 74 2e 70  ntry in Select.p
2890: 53 72 63 2e 20 20 54 68 65 20 72 69 67 68 74 2d  Src.  The right-
28a0: 6d 6f 73 74 0a 2a 2a 20 74 61 62 6c 65 20 69 73  most.** table is
28b0: 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 2e   the last entry.
28c0: 20 20 54 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61    The join opera
28d0: 74 6f 72 20 69 73 20 68 65 6c 64 20 69 6e 20 74  tor is held in t
28e0: 68 65 20 65 6e 74 72 79 20 74 6f 0a 2a 2a 20 74  he entry to.** t
28f0: 68 65 20 6c 65 66 74 2e 20 20 54 68 75 73 20 65  he left.  Thus e
2900: 6e 74 72 79 20 30 20 63 6f 6e 74 61 69 6e 73 20  ntry 0 contains 
2910: 74 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f  the join operato
2920: 72 20 66 6f 72 20 74 68 65 20 6a 6f 69 6e 20 62  r for the join b
2930: 65 74 77 65 65 6e 0a 2a 2a 20 65 6e 74 72 69 65  etween.** entrie
2940: 73 20 30 20 61 6e 64 20 31 2e 20 20 41 6e 79 20  s 0 and 1.  Any 
2950: 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75  ON or USING clau
2960: 73 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ses associated w
2970: 69 74 68 20 74 68 65 20 6a 6f 69 6e 20 61 72 65  ith the join are
2980: 0a 2a 2a 20 61 6c 73 6f 20 61 74 74 61 63 68 65  .** also attache
2990: 64 20 74 6f 20 74 68 65 20 6c 65 66 74 20 65 6e  d to the left en
29a0: 74 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  try..**.** This 
29b0: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
29c0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72  the number of er
29d0: 72 6f 72 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  rors encountered
29e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
29f0: 73 71 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f 69  sqliteProcessJoi
2a00: 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  n(Parse *pParse,
2a10: 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 53   Select *p){.  S
2a20: 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 20 20 20  rcList *pSrc;   
2a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a40: 2a 20 41 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20  * All tables in 
2a50: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
2a60: 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20  */.  int i, j;  
2a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a80: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
2a90: 6e 74 65 72 73 20 2a 2f 0a 20 20 73 74 72 75 63  nters */.  struc
2aa0: 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
2ab0: 70 4c 65 66 74 3b 20 20 20 20 20 2f 2a 20 4c 65  pLeft;     /* Le
2ac0: 66 74 20 74 61 62 6c 65 20 62 65 69 6e 67 20 6a  ft table being j
2ad0: 6f 69 6e 65 64 20 2a 2f 0a 20 20 73 74 72 75 63  oined */.  struc
2ae0: 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
2af0: 70 52 69 67 68 74 3b 20 20 20 20 2f 2a 20 52 69  pRight;    /* Ri
2b00: 67 68 74 20 74 61 62 6c 65 20 62 65 69 6e 67 20  ght table being 
2b10: 6a 6f 69 6e 65 64 20 2a 2f 0a 0a 20 20 70 53 72  joined */..  pSr
2b20: 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70  c = p->pSrc;.  p
2b30: 4c 65 66 74 20 3d 20 26 70 53 72 63 2d 3e 61 5b  Left = &pSrc->a[
2b40: 30 5d 3b 0a 20 20 70 52 69 67 68 74 20 3d 20 26  0];.  pRight = &
2b50: 70 4c 65 66 74 5b 31 5d 3b 0a 20 20 66 6f 72 28  pLeft[1];.  for(
2b60: 69 3d 30 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72  i=0; i<pSrc->nSr
2b70: 63 2d 31 3b 20 69 2b 2b 2c 20 70 52 69 67 68 74  c-1; i++, pRight
2b80: 2b 2b 2c 20 70 4c 65 66 74 2b 2b 29 7b 0a 20 20  ++, pLeft++){.  
2b90: 20 20 54 61 62 6c 65 20 2a 70 4c 65 66 74 54 61    Table *pLeftTa
2ba0: 62 20 3d 20 70 4c 65 66 74 2d 3e 70 54 61 62 3b  b = pLeft->pTab;
2bb0: 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 52 69 67  .    Table *pRig
2bc0: 68 74 54 61 62 20 3d 20 70 52 69 67 68 74 2d 3e  htTab = pRight->
2bd0: 70 54 61 62 3b 0a 20 20 20 20 69 6e 74 20 69 73  pTab;.    int is
2be0: 4f 75 74 65 72 3b 0a 0a 20 20 20 20 69 66 28 20  Outer;..    if( 
2bf0: 4e 45 56 45 52 28 70 4c 65 66 74 54 61 62 3d 3d  NEVER(pLeftTab==
2c00: 30 20 7c 7c 20 70 52 69 67 68 74 54 61 62 3d 3d  0 || pRightTab==
2c10: 30 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  0) ) continue;. 
2c20: 20 20 20 69 73 4f 75 74 65 72 20 3d 20 28 70 52     isOuter = (pR
2c30: 69 67 68 74 2d 3e 6a 6f 69 6e 74 79 70 65 20 26  ight->jointype &
2c40: 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30 3b 0a 0a   JT_OUTER)!=0;..
2c50: 20 20 20 20 2f 2a 20 57 68 65 6e 20 74 68 65 20      /* When the 
2c60: 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 20  NATURAL keyword 
2c70: 69 73 20 70 72 65 73 65 6e 74 2c 20 61 64 64 20  is present, add 
2c80: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
2c90: 6d 73 20 66 6f 72 0a 20 20 20 20 2a 2a 20 65 76  ms for.    ** ev
2ca0: 65 72 79 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20  ery column that 
2cb0: 74 68 65 20 74 77 6f 20 74 61 62 6c 65 73 20 68  the two tables h
2cc0: 61 76 65 20 69 6e 20 63 6f 6d 6d 6f 6e 2e 0a 20  ave in common.. 
2cd0: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52     */.    if( pR
2ce0: 69 67 68 74 2d 3e 6a 6f 69 6e 74 79 70 65 20 26  ight->jointype &
2cf0: 20 4a 54 5f 4e 41 54 55 52 41 4c 20 29 7b 0a 20   JT_NATURAL ){. 
2d00: 20 20 20 20 20 69 66 28 20 70 52 69 67 68 74 2d       if( pRight-
2d10: 3e 70 4f 6e 20 7c 7c 20 70 52 69 67 68 74 2d 3e  >pOn || pRight->
2d20: 70 55 73 69 6e 67 20 29 7b 0a 20 20 20 20 20 20  pUsing ){.      
2d30: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
2d40: 67 28 70 50 61 72 73 65 2c 20 22 61 20 4e 41 54  g(pParse, "a NAT
2d50: 55 52 41 4c 20 6a 6f 69 6e 20 6d 61 79 20 6e 6f  URAL join may no
2d60: 74 20 68 61 76 65 20 22 0a 20 20 20 20 20 20 20  t have ".       
2d70: 20 20 20 20 22 61 6e 20 4f 4e 20 6f 72 20 55 53      "an ON or US
2d80: 49 4e 47 20 63 6c 61 75 73 65 22 2c 20 30 29 3b  ING clause", 0);
2d90: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2da0: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
2db0: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 52 69 67   for(j=0; j<pRig
2dc0: 68 74 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b  htTab->nCol; j++
2dd0: 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
2de0: 2a 7a 4e 61 6d 65 3b 20 20 20 2f 2a 20 4e 61 6d  *zName;   /* Nam
2df0: 65 20 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 74  e of column in t
2e00: 68 65 20 72 69 67 68 74 20 74 61 62 6c 65 20 2a  he right table *
2e10: 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4c  /.        int iL
2e20: 65 66 74 3b 20 20 20 20 20 2f 2a 20 4d 61 74 63  eft;     /* Matc
2e30: 68 69 6e 67 20 6c 65 66 74 20 74 61 62 6c 65 20  hing left table 
2e40: 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  */.        int i
2e50: 4c 65 66 74 43 6f 6c 3b 20 20 2f 2a 20 4d 61 74  LeftCol;  /* Mat
2e60: 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 69 6e 20  ching column in 
2e70: 74 68 65 20 6c 65 66 74 20 74 61 62 6c 65 20 2a  the left table *
2e80: 2f 0a 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65  /..        zName
2e90: 20 3d 20 70 52 69 67 68 74 54 61 62 2d 3e 61 43   = pRightTab->aC
2ea0: 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  ol[j].zName;.   
2eb0: 20 20 20 20 20 69 66 28 20 74 61 62 6c 65 41 6e       if( tableAn
2ec0: 64 43 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 53 72  dColumnIndex(pSr
2ed0: 63 2c 20 69 2b 31 2c 20 7a 4e 61 6d 65 2c 20 26  c, i+1, zName, &
2ee0: 69 4c 65 66 74 2c 20 26 69 4c 65 66 74 43 6f 6c  iLeft, &iLeftCol
2ef0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  ) ){.          a
2f00: 64 64 57 68 65 72 65 54 65 72 6d 28 70 50 61 72  ddWhereTerm(pPar
2f10: 73 65 2c 20 70 53 72 63 2c 20 69 4c 65 66 74 2c  se, pSrc, iLeft,
2f20: 20 69 4c 65 66 74 43 6f 6c 2c 20 69 2b 31 2c 20   iLeftCol, i+1, 
2f30: 6a 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  j,.             
2f40: 20 20 20 20 20 20 20 20 20 20 69 73 4f 75 74 65            isOute
2f50: 72 2c 20 26 70 2d 3e 70 57 68 65 72 65 29 3b 0a  r, &p->pWhere);.
2f60: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2f70: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
2f80: 44 69 73 61 6c 6c 6f 77 20 62 6f 74 68 20 4f 4e  Disallow both ON
2f90: 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73   and USING claus
2fa0: 65 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20 6a  es in the same j
2fb0: 6f 69 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  oin.    */.    i
2fc0: 66 28 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20 26  f( pRight->pOn &
2fd0: 26 20 70 52 69 67 68 74 2d 3e 70 55 73 69 6e 67  & pRight->pUsing
2fe0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2ff0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
3000: 2c 20 22 63 61 6e 6e 6f 74 20 68 61 76 65 20 62  , "cannot have b
3010: 6f 74 68 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47  oth ON and USING
3020: 20 22 0a 20 20 20 20 20 20 20 20 22 63 6c 61 75   ".        "clau
3030: 73 65 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20  ses in the same 
3040: 6a 6f 69 6e 22 29 3b 0a 20 20 20 20 20 20 72 65  join");.      re
3050: 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 0a 20  turn 1;.    }.. 
3060: 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 4f 4e     /* Add the ON
3070: 20 63 6c 61 75 73 65 20 74 6f 20 74 68 65 20 65   clause to the e
3080: 6e 64 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  nd of the WHERE 
3090: 63 6c 61 75 73 65 2c 20 63 6f 6e 6e 65 63 74 65  clause, connecte
30a0: 64 20 62 79 0a 20 20 20 20 2a 2a 20 61 6e 20 41  d by.    ** an A
30b0: 4e 44 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 20  ND operator..   
30c0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 69 67   */.    if( pRig
30d0: 68 74 2d 3e 70 4f 6e 20 29 7b 0a 20 20 20 20 20  ht->pOn ){.     
30e0: 20 69 66 28 20 69 73 4f 75 74 65 72 20 29 20 73   if( isOuter ) s
30f0: 65 74 4a 6f 69 6e 45 78 70 72 28 70 52 69 67 68  etJoinExpr(pRigh
3100: 74 2d 3e 70 4f 6e 2c 20 70 52 69 67 68 74 2d 3e  t->pOn, pRight->
3110: 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20  iCursor);.      
3120: 70 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69  p->pWhere = sqli
3130: 74 65 33 45 78 70 72 41 6e 64 28 70 50 61 72 73  te3ExprAnd(pPars
3140: 65 2d 3e 64 62 2c 20 70 2d 3e 70 57 68 65 72 65  e->db, p->pWhere
3150: 2c 20 70 52 69 67 68 74 2d 3e 70 4f 6e 29 3b 0a  , pRight->pOn);.
3160: 20 20 20 20 20 20 70 52 69 67 68 74 2d 3e 70 4f        pRight->pO
3170: 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20  n = 0;.    }..  
3180: 20 20 2f 2a 20 43 72 65 61 74 65 20 65 78 74 72    /* Create extr
3190: 61 20 74 65 72 6d 73 20 6f 6e 20 74 68 65 20 57  a terms on the W
31a0: 48 45 52 45 20 63 6c 61 75 73 65 20 66 6f 72 20  HERE clause for 
31b0: 65 61 63 68 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  each column name
31c0: 64 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20  d.    ** in the 
31d0: 55 53 49 4e 47 20 63 6c 61 75 73 65 2e 20 20 45  USING clause.  E
31e0: 78 61 6d 70 6c 65 3a 20 49 66 20 74 68 65 20 74  xample: If the t
31f0: 77 6f 20 74 61 62 6c 65 73 20 74 6f 20 62 65 20  wo tables to be 
3200: 6a 6f 69 6e 65 64 20 61 72 65 20 0a 20 20 20 20  joined are .    
3210: 2a 2a 20 41 20 61 6e 64 20 42 20 61 6e 64 20 74  ** A and B and t
3220: 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20  he USING clause 
3230: 6e 61 6d 65 73 20 58 2c 20 59 2c 20 61 6e 64 20  names X, Y, and 
3240: 5a 2c 20 74 68 65 6e 20 61 64 64 20 74 68 69 73  Z, then add this
3250: 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 57  .    ** to the W
3260: 48 45 52 45 20 63 6c 61 75 73 65 3a 20 20 20 20  HERE clause:    
3270: 41 2e 58 3d 42 2e 58 20 41 4e 44 20 41 2e 59 3d  A.X=B.X AND A.Y=
3280: 42 2e 59 20 41 4e 44 20 41 2e 5a 3d 42 2e 5a 0a  B.Y AND A.Z=B.Z.
3290: 20 20 20 20 2a 2a 20 52 65 70 6f 72 74 20 61 6e      ** Report an
32a0: 20 65 72 72 6f 72 20 69 66 20 61 6e 79 20 63 6f   error if any co
32b0: 6c 75 6d 6e 20 6d 65 6e 74 69 6f 6e 65 64 20 69  lumn mentioned i
32c0: 6e 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75  n the USING clau
32d0: 73 65 20 69 73 0a 20 20 20 20 2a 2a 20 6e 6f 74  se is.    ** not
32e0: 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 62 6f   contained in bo
32f0: 74 68 20 74 61 62 6c 65 73 20 74 6f 20 62 65 20  th tables to be 
3300: 6a 6f 69 6e 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  joined..    */. 
3310: 20 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 70     if( pRight->p
3320: 55 73 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 49  Using ){.      I
3330: 64 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70  dList *pList = p
3340: 52 69 67 68 74 2d 3e 70 55 73 69 6e 67 3b 0a 20  Right->pUsing;. 
3350: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
3360: 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 6a 2b 2b 29  pList->nId; j++)
3370: 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  {.        char *
3380: 7a 4e 61 6d 65 3b 20 20 20 20 20 2f 2a 20 4e 61  zName;     /* Na
3390: 6d 65 20 6f 66 20 74 68 65 20 74 65 72 6d 20 69  me of the term i
33a0: 6e 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75  n the USING clau
33b0: 73 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  se */.        in
33c0: 74 20 69 4c 65 66 74 3b 20 20 20 20 20 20 20 2f  t iLeft;       /
33d0: 2a 20 54 61 62 6c 65 20 6f 6e 20 74 68 65 20 6c  * Table on the l
33e0: 65 66 74 20 77 69 74 68 20 6d 61 74 63 68 69 6e  eft with matchin
33f0: 67 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f  g column name */
3400: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4c 65  .        int iLe
3410: 66 74 43 6f 6c 3b 20 20 20 20 2f 2a 20 43 6f 6c  ftCol;    /* Col
3420: 75 6d 6e 20 6e 75 6d 62 65 72 20 6f 66 20 6d 61  umn number of ma
3430: 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 6f 6e  tching column on
3440: 20 74 68 65 20 6c 65 66 74 20 2a 2f 0a 20 20 20   the left */.   
3450: 20 20 20 20 20 69 6e 74 20 69 52 69 67 68 74 43       int iRightC
3460: 6f 6c 3b 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20  ol;   /* Column 
3470: 6e 75 6d 62 65 72 20 6f 66 20 6d 61 74 63 68 69  number of matchi
3480: 6e 67 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74 68 65  ng column on the
3490: 20 72 69 67 68 74 20 2a 2f 0a 0a 20 20 20 20 20   right */..     
34a0: 20 20 20 7a 4e 61 6d 65 20 3d 20 70 4c 69 73 74     zName = pList
34b0: 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  ->a[j].zName;.  
34c0: 20 20 20 20 20 20 69 52 69 67 68 74 43 6f 6c 20        iRightCol 
34d0: 3d 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 52  = columnIndex(pR
34e0: 69 67 68 74 54 61 62 2c 20 7a 4e 61 6d 65 29 3b  ightTab, zName);
34f0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 52 69  .        if( iRi
3500: 67 68 74 43 6f 6c 3c 30 0a 20 20 20 20 20 20 20  ghtCol<0.       
3510: 20 20 7c 7c 20 21 74 61 62 6c 65 41 6e 64 43 6f    || !tableAndCo
3520: 6c 75 6d 6e 49 6e 64 65 78 28 70 53 72 63 2c 20  lumnIndex(pSrc, 
3530: 69 2b 31 2c 20 7a 4e 61 6d 65 2c 20 26 69 4c 65  i+1, zName, &iLe
3540: 66 74 2c 20 26 69 4c 65 66 74 43 6f 6c 29 0a 20  ft, &iLeftCol). 
3550: 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
3560: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
3570: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63 61 6e  Msg(pParse, "can
3580: 6e 6f 74 20 6a 6f 69 6e 20 75 73 69 6e 67 20 63  not join using c
3590: 6f 6c 75 6d 6e 20 25 73 20 2d 20 63 6f 6c 75 6d  olumn %s - colum
35a0: 6e 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  n ".            
35b0: 22 6e 6f 74 20 70 72 65 73 65 6e 74 20 69 6e 20  "not present in 
35c0: 62 6f 74 68 20 74 61 62 6c 65 73 22 2c 20 7a 4e  both tables", zN
35d0: 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
35e0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
35f0: 20 20 7d 0a 20 20 20 20 20 20 20 20 61 64 64 57    }.        addW
3600: 68 65 72 65 54 65 72 6d 28 70 50 61 72 73 65 2c  hereTerm(pParse,
3610: 20 70 53 72 63 2c 20 69 4c 65 66 74 2c 20 69 4c   pSrc, iLeft, iL
3620: 65 66 74 43 6f 6c 2c 20 69 2b 31 2c 20 69 52 69  eftCol, i+1, iRi
3630: 67 68 74 43 6f 6c 2c 0a 20 20 20 20 20 20 20 20  ghtCol,.        
3640: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f               isO
3650: 75 74 65 72 2c 20 26 70 2d 3e 70 57 68 65 72 65  uter, &p->pWhere
3660: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
3670: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
3680: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74  .}../*.** Insert
3690: 20 63 6f 64 65 20 69 6e 74 6f 20 22 76 22 20 74   code into "v" t
36a0: 68 61 74 20 77 69 6c 6c 20 70 75 73 68 20 74 68  hat will push th
36b0: 65 20 72 65 63 6f 72 64 20 6f 6e 20 74 68 65 20  e record on the 
36c0: 74 6f 70 20 6f 66 20 74 68 65 0a 2a 2a 20 73 74  top of the.** st
36d0: 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 73 6f 72  ack into the sor
36e0: 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ter..*/.static v
36f0: 6f 69 64 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74  oid pushOntoSort
3700: 65 72 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  er(.  Parse *pPa
3710: 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  rse,         /* 
3720: 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  Parser context *
3730: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  /.  ExprList *pO
3740: 72 64 65 72 42 79 2c 20 20 20 20 2f 2a 20 54 68  rderBy,    /* Th
3750: 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
3760: 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  e */.  Select *p
3770: 53 65 6c 65 63 74 2c 20 20 20 20 20 20 20 2f 2a  Select,       /*
3780: 20 54 68 65 20 77 68 6f 6c 65 20 53 45 4c 45 43   The whole SELEC
3790: 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  T statement */. 
37a0: 20 69 6e 74 20 72 65 67 44 61 74 61 20 20 20 20   int regData    
37b0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73          /* Regis
37c0: 74 65 72 20 68 6f 6c 64 69 6e 67 20 64 61 74 61  ter holding data
37d0: 20 74 6f 20 62 65 20 73 6f 72 74 65 64 20 2a 2f   to be sorted */
37e0: 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  .){.  Vdbe *v = 
37f0: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
3800: 20 69 6e 74 20 6e 45 78 70 72 20 3d 20 70 4f 72   int nExpr = pOr
3810: 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20  derBy->nExpr;.  
3820: 69 6e 74 20 72 65 67 42 61 73 65 20 3d 20 73 71  int regBase = sq
3830: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67  lite3GetTempRang
3840: 65 28 70 50 61 72 73 65 2c 20 6e 45 78 70 72 2b  e(pParse, nExpr+
3850: 32 29 3b 0a 20 20 69 6e 74 20 72 65 67 52 65 63  2);.  int regRec
3860: 6f 72 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74  ord = sqlite3Get
3870: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
3880: 0a 20 20 69 6e 74 20 6f 70 3b 0a 20 20 73 71 6c  .  int op;.  sql
3890: 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65  ite3ExprCacheCle
38a0: 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71  ar(pParse);.  sq
38b0: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70  lite3ExprCodeExp
38c0: 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 4f  rList(pParse, pO
38d0: 72 64 65 72 42 79 2c 20 72 65 67 42 61 73 65 2c  rderBy, regBase,
38e0: 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64   0);.  sqlite3Vd
38f0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
3900: 65 71 75 65 6e 63 65 2c 20 70 4f 72 64 65 72 42  equence, pOrderB
3910: 79 2d 3e 69 45 43 75 72 73 6f 72 2c 20 72 65 67  y->iECursor, reg
3920: 42 61 73 65 2b 6e 45 78 70 72 29 3b 0a 20 20 73  Base+nExpr);.  s
3930: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f  qlite3ExprCodeMo
3940: 76 65 28 70 50 61 72 73 65 2c 20 72 65 67 44 61  ve(pParse, regDa
3950: 74 61 2c 20 72 65 67 42 61 73 65 2b 6e 45 78 70  ta, regBase+nExp
3960: 72 2b 31 2c 20 31 29 3b 0a 20 20 73 71 6c 69 74  r+1, 1);.  sqlit
3970: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
3980: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72  OP_MakeRecord, r
3990: 65 67 42 61 73 65 2c 20 6e 45 78 70 72 20 2b 20  egBase, nExpr + 
39a0: 32 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20  2, regRecord);. 
39b0: 20 69 66 28 20 70 53 65 6c 65 63 74 2d 3e 73 65   if( pSelect->se
39c0: 6c 46 6c 61 67 73 20 26 20 53 46 5f 55 73 65 53  lFlags & SF_UseS
39d0: 6f 72 74 65 72 20 29 7b 0a 20 20 20 20 6f 70 20  orter ){.    op 
39e0: 3d 20 4f 50 5f 53 6f 72 74 65 72 49 6e 73 65 72  = OP_SorterInser
39f0: 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  t;.  }else{.    
3a00: 6f 70 20 3d 20 4f 50 5f 49 64 78 49 6e 73 65 72  op = OP_IdxInser
3a10: 74 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  t;.  }.  sqlite3
3a20: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 6f 70  VdbeAddOp2(v, op
3a30: 2c 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75  , pOrderBy->iECu
3a40: 72 73 6f 72 2c 20 72 65 67 52 65 63 6f 72 64 29  rsor, regRecord)
3a50: 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  ;.  sqlite3Relea
3a60: 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
3a70: 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20  , regRecord);.  
3a80: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
3a90: 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
3aa0: 72 65 67 42 61 73 65 2c 20 6e 45 78 70 72 2b 32  regBase, nExpr+2
3ab0: 29 3b 0a 20 20 69 66 28 20 70 53 65 6c 65 63 74  );.  if( pSelect
3ac0: 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20  ->iLimit ){.    
3ad0: 69 6e 74 20 61 64 64 72 31 2c 20 61 64 64 72 32  int addr1, addr2
3ae0: 3b 0a 20 20 20 20 69 6e 74 20 69 4c 69 6d 69 74  ;.    int iLimit
3af0: 3b 0a 20 20 20 20 69 66 28 20 70 53 65 6c 65 63  ;.    if( pSelec
3b00: 74 2d 3e 69 4f 66 66 73 65 74 20 29 7b 0a 20 20  t->iOffset ){.  
3b10: 20 20 20 20 69 4c 69 6d 69 74 20 3d 20 70 53 65      iLimit = pSe
3b20: 6c 65 63 74 2d 3e 69 4f 66 66 73 65 74 2b 31 3b  lect->iOffset+1;
3b30: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
3b40: 20 20 69 4c 69 6d 69 74 20 3d 20 70 53 65 6c 65    iLimit = pSele
3b50: 63 74 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 20 20  ct->iLimit;.    
3b60: 7d 0a 20 20 20 20 61 64 64 72 31 20 3d 20 73 71  }.    addr1 = sq
3b70: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
3b80: 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c 20 69 4c  v, OP_IfZero, iL
3b90: 69 6d 69 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  imit);.    sqlit
3ba0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
3bb0: 4f 50 5f 41 64 64 49 6d 6d 2c 20 69 4c 69 6d 69  OP_AddImm, iLimi
3bc0: 74 2c 20 2d 31 29 3b 0a 20 20 20 20 61 64 64 72  t, -1);.    addr
3bd0: 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  2 = sqlite3VdbeA
3be0: 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp0(v, OP_Goto
3bf0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
3c00: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
3c10: 64 72 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  dr1);.    sqlite
3c20: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
3c30: 50 5f 4c 61 73 74 2c 20 70 4f 72 64 65 72 42 79  P_Last, pOrderBy
3c40: 2d 3e 69 45 43 75 72 73 6f 72 29 3b 0a 20 20 20  ->iECursor);.   
3c50: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
3c60: 70 31 28 76 2c 20 4f 50 5f 44 65 6c 65 74 65 2c  p1(v, OP_Delete,
3c70: 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72   pOrderBy->iECur
3c80: 73 6f 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  sor);.    sqlite
3c90: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
3ca0: 20 61 64 64 72 32 29 3b 0a 20 20 7d 0a 7d 0a 0a   addr2);.  }.}..
3cb0: 2f 2a 0a 2a 2a 20 41 64 64 20 63 6f 64 65 20 74  /*.** Add code t
3cc0: 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  o implement the 
3cd0: 4f 46 46 53 45 54 0a 2a 2f 0a 73 74 61 74 69 63  OFFSET.*/.static
3ce0: 20 76 6f 69 64 20 63 6f 64 65 4f 66 66 73 65 74   void codeOffset
3cf0: 28 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20  (.  Vdbe *v,    
3d00: 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
3d10: 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 69 73  e code into this
3d20: 20 56 4d 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20   VM */.  Select 
3d30: 2a 70 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68  *p,        /* Th
3d40: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
3d50: 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a  nt being coded *
3d60: 2f 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75  /.  int iContinu
3d70: 65 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65  e     /* Jump he
3d80: 72 65 20 74 6f 20 73 6b 69 70 20 74 68 65 20 63  re to skip the c
3d90: 75 72 72 65 6e 74 20 72 65 63 6f 72 64 20 2a 2f  urrent record */
3da0: 0a 29 7b 0a 20 20 69 66 28 20 70 2d 3e 69 4f 66  .){.  if( p->iOf
3db0: 66 73 65 74 20 26 26 20 69 43 6f 6e 74 69 6e 75  fset && iContinu
3dc0: 65 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  e!=0 ){.    int 
3dd0: 61 64 64 72 3b 0a 20 20 20 20 73 71 6c 69 74 65  addr;.    sqlite
3de0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
3df0: 50 5f 41 64 64 49 6d 6d 2c 20 70 2d 3e 69 4f 66  P_AddImm, p->iOf
3e00: 66 73 65 74 2c 20 2d 31 29 3b 0a 20 20 20 20 61  fset, -1);.    a
3e10: 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
3e20: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66  eAddOp1(v, OP_If
3e30: 4e 65 67 2c 20 70 2d 3e 69 4f 66 66 73 65 74 29  Neg, p->iOffset)
3e40: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
3e50: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
3e60: 74 6f 2c 20 30 2c 20 69 43 6f 6e 74 69 6e 75 65  to, 0, iContinue
3e70: 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  );.    VdbeComme
3e80: 6e 74 28 28 76 2c 20 22 73 6b 69 70 20 4f 46 46  nt((v, "skip OFF
3e90: 53 45 54 20 72 65 63 6f 72 64 73 22 29 29 3b 0a  SET records"));.
3ea0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
3eb0: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 29  umpHere(v, addr)
3ec0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ;.  }.}../*.** A
3ed0: 64 64 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c  dd code that wil
3ee0: 6c 20 63 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20  l check to make 
3ef0: 73 75 72 65 20 74 68 65 20 4e 20 72 65 67 69 73  sure the N regis
3f00: 74 65 72 73 20 73 74 61 72 74 69 6e 67 20 61 74  ters starting at
3f10: 20 69 4d 65 6d 0a 2a 2a 20 66 6f 72 6d 20 61 20   iMem.** form a 
3f20: 64 69 73 74 69 6e 63 74 20 65 6e 74 72 79 2e 20  distinct entry. 
3f30: 20 69 54 61 62 20 69 73 20 61 20 73 6f 72 74 69   iTab is a sorti
3f40: 6e 67 20 69 6e 64 65 78 20 74 68 61 74 20 68 6f  ng index that ho
3f50: 6c 64 73 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a  lds previously.*
3f60: 2a 20 73 65 65 6e 20 63 6f 6d 62 69 6e 61 74 69  * seen combinati
3f70: 6f 6e 73 20 6f 66 20 74 68 65 20 4e 20 76 61 6c  ons of the N val
3f80: 75 65 73 2e 20 20 41 20 6e 65 77 20 65 6e 74 72  ues.  A new entr
3f90: 79 20 69 73 20 6d 61 64 65 20 69 6e 20 69 54 61  y is made in iTa
3fa0: 62 0a 2a 2a 20 69 66 20 74 68 65 20 63 75 72 72  b.** if the curr
3fb0: 65 6e 74 20 4e 20 76 61 6c 75 65 73 20 61 72 65  ent N values are
3fc0: 20 6e 65 77 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a 75   new..**.** A ju
3fd0: 6d 70 20 74 6f 20 61 64 64 72 52 65 70 65 61 74  mp to addrRepeat
3fe0: 20 69 73 20 6d 61 64 65 20 61 6e 64 20 74 68 65   is made and the
3ff0: 20 4e 2b 31 20 76 61 6c 75 65 73 20 61 72 65 20   N+1 values are 
4000: 70 6f 70 70 65 64 20 66 72 6f 6d 20 74 68 65 0a  popped from the.
4010: 2a 2a 20 73 74 61 63 6b 20 69 66 20 74 68 65 20  ** stack if the 
4020: 74 6f 70 20 4e 20 65 6c 65 6d 65 6e 74 73 20 61  top N elements a
4030: 72 65 20 6e 6f 74 20 64 69 73 74 69 6e 63 74 2e  re not distinct.
4040: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
4050: 63 6f 64 65 44 69 73 74 69 6e 63 74 28 0a 20 20  codeDistinct(.  
4060: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
4070: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e     /* Parsing an
4080: 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e  d code generatin
4090: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69  g context */.  i
40a0: 6e 74 20 69 54 61 62 2c 20 20 20 20 20 20 20 20  nt iTab,        
40b0: 20 20 2f 2a 20 41 20 73 6f 72 74 69 6e 67 20 69    /* A sorting i
40c0: 6e 64 65 78 20 75 73 65 64 20 74 6f 20 74 65 73  ndex used to tes
40d0: 74 20 66 6f 72 20 64 69 73 74 69 6e 63 74 6e 65  t for distinctne
40e0: 73 73 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ss */.  int addr
40f0: 52 65 70 65 61 74 2c 20 20 20 20 2f 2a 20 4a 75  Repeat,    /* Ju
4100: 6d 70 20 74 6f 20 68 65 72 65 20 69 66 20 6e 6f  mp to here if no
4110: 74 20 64 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20  t distinct */.  
4120: 69 6e 74 20 4e 2c 20 20 20 20 20 20 20 20 20 20  int N,          
4130: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
4140: 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 6e  elements */.  in
4150: 74 20 69 4d 65 6d 20 20 20 20 20 20 20 20 20 20  t iMem          
4160: 20 2f 2a 20 46 69 72 73 74 20 65 6c 65 6d 65 6e   /* First elemen
4170: 74 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a  t */.){.  Vdbe *
4180: 76 3b 0a 20 20 69 6e 74 20 72 31 3b 0a 0a 20 20  v;.  int r1;..  
4190: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
41a0: 65 3b 0a 20 20 72 31 20 3d 20 73 71 6c 69 74 65  e;.  r1 = sqlite
41b0: 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
41c0: 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  se);.  sqlite3Vd
41d0: 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f  beAddOp4Int(v, O
41e0: 50 5f 46 6f 75 6e 64 2c 20 69 54 61 62 2c 20 61  P_Found, iTab, a
41f0: 64 64 72 52 65 70 65 61 74 2c 20 69 4d 65 6d 2c  ddrRepeat, iMem,
4200: 20 4e 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64   N);.  sqlite3Vd
4210: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d  beAddOp3(v, OP_M
4220: 61 6b 65 52 65 63 6f 72 64 2c 20 69 4d 65 6d 2c  akeRecord, iMem,
4230: 20 4e 2c 20 72 31 29 3b 0a 20 20 73 71 6c 69 74   N, r1);.  sqlit
4240: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
4250: 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 54  OP_IdxInsert, iT
4260: 61 62 2c 20 72 31 29 3b 0a 20 20 73 71 6c 69 74  ab, r1);.  sqlit
4270: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
4280: 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 7d 0a  (pParse, r1);.}.
4290: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
42a0: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a  OMIT_SUBQUERY./*
42b0: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 6e 20  .** Generate an 
42c0: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 77 68  error message wh
42d0: 65 6e 20 61 20 53 45 4c 45 43 54 20 69 73 20 75  en a SELECT is u
42e0: 73 65 64 20 77 69 74 68 69 6e 20 61 20 73 75 62  sed within a sub
42f0: 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 28 65  expression.** (e
4300: 78 61 6d 70 6c 65 3a 20 20 22 61 20 49 4e 20 28  xample:  "a IN (
4310: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 61  SELECT * FROM ta
4320: 62 6c 65 29 22 29 20 62 75 74 20 69 74 20 68 61  ble)") but it ha
4330: 73 20 6d 6f 72 65 20 74 68 61 6e 20 31 20 72 65  s more than 1 re
4340: 73 75 6c 74 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e 20  sult.** column. 
4350: 20 57 65 20 64 6f 20 74 68 69 73 20 69 6e 20 61   We do this in a
4360: 20 73 75 62 72 6f 75 74 69 6e 65 20 62 65 63 61   subroutine beca
4370: 75 73 65 20 74 68 65 20 65 72 72 6f 72 20 75 73  use the error us
4380: 65 64 20 74 6f 20 6f 63 63 75 72 0a 2a 2a 20 69  ed to occur.** i
4390: 6e 20 6d 75 6c 74 69 70 6c 65 20 70 6c 61 63 65  n multiple place
43a0: 73 2e 20 20 28 54 68 65 20 65 72 72 6f 72 20 6f  s.  (The error o
43b0: 6e 6c 79 20 6f 63 63 75 72 73 20 69 6e 20 6f 6e  nly occurs in on
43c0: 65 20 70 6c 61 63 65 20 6e 6f 77 2c 20 62 75 74  e place now, but
43d0: 20 77 65 0a 2a 2a 20 72 65 74 61 69 6e 20 74 68   we.** retain th
43e0: 65 20 73 75 62 72 6f 75 74 69 6e 65 20 74 6f 20  e subroutine to 
43f0: 6d 69 6e 69 6d 69 7a 65 20 63 6f 64 65 20 64 69  minimize code di
4400: 73 72 75 70 74 69 6f 6e 2e 29 0a 2a 2f 0a 73 74  sruption.).*/.st
4410: 61 74 69 63 20 69 6e 74 20 63 68 65 63 6b 46 6f  atic int checkFo
4420: 72 4d 75 6c 74 69 43 6f 6c 75 6d 6e 53 65 6c 65  rMultiColumnSele
4430: 63 74 45 72 72 6f 72 28 0a 20 20 50 61 72 73 65  ctError(.  Parse
4440: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
4450: 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74  /* Parse context
4460: 2e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  . */.  SelectDes
4470: 74 20 2a 70 44 65 73 74 2c 20 20 20 2f 2a 20 44  t *pDest,   /* D
4480: 65 73 74 69 6e 61 74 69 6f 6e 20 6f 66 20 53 45  estination of SE
4490: 4c 45 43 54 20 72 65 73 75 6c 74 73 20 2a 2f 0a  LECT results */.
44a0: 20 20 69 6e 74 20 6e 45 78 70 72 20 20 20 20 20    int nExpr     
44b0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
44c0: 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d   of result colum
44d0: 6e 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 53  ns returned by S
44e0: 45 4c 45 43 54 20 2a 2f 0a 29 7b 0a 20 20 69 6e  ELECT */.){.  in
44f0: 74 20 65 44 65 73 74 20 3d 20 70 44 65 73 74 2d  t eDest = pDest-
4500: 3e 65 44 65 73 74 3b 0a 20 20 69 66 28 20 6e 45  >eDest;.  if( nE
4510: 78 70 72 3e 31 20 26 26 20 28 65 44 65 73 74 3d  xpr>1 && (eDest=
4520: 3d 53 52 54 5f 4d 65 6d 20 7c 7c 20 65 44 65 73  =SRT_Mem || eDes
4530: 74 3d 3d 53 52 54 5f 53 65 74 29 20 29 7b 0a 20  t==SRT_Set) ){. 
4540: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
4550: 73 67 28 70 50 61 72 73 65 2c 20 22 6f 6e 6c 79  sg(pParse, "only
4560: 20 61 20 73 69 6e 67 6c 65 20 72 65 73 75 6c 74   a single result
4570: 20 61 6c 6c 6f 77 65 64 20 66 6f 72 20 22 0a 20   allowed for ". 
4580: 20 20 20 20 20 20 22 61 20 53 45 4c 45 43 54 20        "a SELECT 
4590: 74 68 61 74 20 69 73 20 70 61 72 74 20 6f 66 20  that is part of 
45a0: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 22 29 3b  an expression");
45b0: 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
45c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
45d0: 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  rn 0;.  }.}.#end
45e0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73  if../*.** An ins
45f0: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
4600: 6c 6f 77 69 6e 67 20 6f 62 6a 65 63 74 20 69 73  lowing object is
4610: 20 75 73 65 64 20 74 6f 20 72 65 63 6f 72 64 20   used to record 
4620: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  information abou
4630: 74 0a 2a 2a 20 68 6f 77 20 74 6f 20 70 72 6f 63  t.** how to proc
4640: 65 73 73 20 74 68 65 20 44 49 53 54 49 4e 43 54  ess the DISTINCT
4650: 20 6b 65 79 77 6f 72 64 2c 20 74 6f 20 73 69 6d   keyword, to sim
4660: 70 6c 69 66 79 20 70 61 73 73 69 6e 67 20 74 68  plify passing th
4670: 61 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a  at information.*
4680: 2a 20 69 6e 74 6f 20 74 68 65 20 73 65 6c 65 63  * into the selec
4690: 74 49 6e 6e 65 72 4c 6f 6f 70 28 29 20 72 6f 75  tInnerLoop() rou
46a0: 74 69 6e 65 2e 0a 2a 2f 0a 74 79 70 65 64 65 66  tine..*/.typedef
46b0: 20 73 74 72 75 63 74 20 44 69 73 74 69 6e 63 74   struct Distinct
46c0: 43 74 78 20 44 69 73 74 69 6e 63 74 43 74 78 3b  Ctx DistinctCtx;
46d0: 0a 73 74 72 75 63 74 20 44 69 73 74 69 6e 63 74  .struct Distinct
46e0: 43 74 78 20 7b 0a 20 20 75 38 20 69 73 54 6e 63  Ctx {.  u8 isTnc
46f0: 74 3b 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20  t;      /* True 
4700: 69 66 20 74 68 65 20 44 49 53 54 49 4e 43 54 20  if the DISTINCT 
4710: 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65 73 65  keyword is prese
4720: 6e 74 20 2a 2f 0a 20 20 75 38 20 65 54 6e 63 74  nt */.  u8 eTnct
4730: 54 79 70 65 3b 20 20 20 2f 2a 20 4f 6e 65 20 6f  Type;   /* One o
4740: 66 20 74 68 65 20 57 48 45 52 45 5f 44 49 53 54  f the WHERE_DIST
4750: 49 4e 43 54 5f 2a 20 6f 70 65 72 61 74 6f 72 73  INCT_* operators
4760: 20 2a 2f 0a 20 20 69 6e 74 20 74 61 62 54 6e 63   */.  int tabTnc
4770: 74 3b 20 20 20 20 2f 2a 20 45 70 68 65 6d 65 72  t;    /* Ephemer
4780: 61 6c 20 74 61 62 6c 65 20 75 73 65 64 20 66 6f  al table used fo
4790: 72 20 44 49 53 54 49 4e 43 54 20 70 72 6f 63 65  r DISTINCT proce
47a0: 73 73 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 61  ssing */.  int a
47b0: 64 64 72 54 6e 63 74 3b 20 20 20 2f 2a 20 41 64  ddrTnct;   /* Ad
47c0: 64 72 65 73 73 20 6f 66 20 4f 50 5f 4f 70 65 6e  dress of OP_Open
47d0: 45 70 68 65 6d 65 72 61 6c 20 6f 70 63 6f 64 65  Ephemeral opcode
47e0: 20 66 6f 72 20 74 61 62 54 6e 63 74 20 2a 2f 0a   for tabTnct */.
47f0: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  };../*.** This r
4800: 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73  outine generates
4810: 20 74 68 65 20 63 6f 64 65 20 66 6f 72 20 74 68   the code for th
4820: 65 20 69 6e 73 69 64 65 20 6f 66 20 74 68 65 20  e inside of the 
4830: 69 6e 6e 65 72 20 6c 6f 6f 70 0a 2a 2a 20 6f 66  inner loop.** of
4840: 20 61 20 53 45 4c 45 43 54 2e 0a 2a 2a 0a 2a 2a   a SELECT..**.**
4850: 20 49 66 20 73 72 63 54 61 62 20 61 6e 64 20 6e   If srcTab and n
4860: 43 6f 6c 75 6d 6e 20 61 72 65 20 62 6f 74 68 20  Column are both 
4870: 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 70  zero, then the p
4880: 45 4c 69 73 74 20 65 78 70 72 65 73 73 69 6f 6e  EList expression
4890: 73 0a 2a 2a 20 61 72 65 20 65 76 61 6c 75 61 74  s.** are evaluat
48a0: 65 64 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67  ed in order to g
48b0: 65 74 20 74 68 65 20 64 61 74 61 20 66 6f 72 20  et the data for 
48c0: 74 68 69 73 20 72 6f 77 2e 20 20 49 66 20 6e 43  this row.  If nC
48d0: 6f 6c 75 6d 6e 3e 30 0a 2a 2a 20 74 68 65 6e 20  olumn>0.** then 
48e0: 64 61 74 61 20 69 73 20 70 75 6c 6c 65 64 20 66  data is pulled f
48f0: 72 6f 6d 20 73 72 63 54 61 62 20 61 6e 64 20 70  rom srcTab and p
4900: 45 4c 69 73 74 20 69 73 20 75 73 65 64 20 6f 6e  EList is used on
4910: 6c 79 20 74 6f 20 67 65 74 20 74 68 65 0a 2a 2a  ly to get the.**
4920: 20 64 61 74 61 74 79 70 65 73 20 66 6f 72 20 65   datatypes for e
4930: 61 63 68 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 73  ach column..*/.s
4940: 74 61 74 69 63 20 76 6f 69 64 20 73 65 6c 65 63  tatic void selec
4950: 74 49 6e 6e 65 72 4c 6f 6f 70 28 0a 20 20 50 61  tInnerLoop(.  Pa
4960: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
4970: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
4980: 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ser context */. 
4990: 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
49a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
49b0: 63 6f 6d 70 6c 65 74 65 20 73 65 6c 65 63 74 20  complete select 
49c0: 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20  statement being 
49d0: 63 6f 64 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c  coded */.  ExprL
49e0: 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20  ist *pEList,    
49f0: 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 76 61     /* List of va
4a00: 6c 75 65 73 20 62 65 69 6e 67 20 65 78 74 72 61  lues being extra
4a10: 63 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 73 72  cted */.  int sr
4a20: 63 54 61 62 2c 20 20 20 20 20 20 20 20 20 20 20  cTab,           
4a30: 20 20 2f 2a 20 50 75 6c 6c 20 64 61 74 61 20 66    /* Pull data f
4a40: 72 6f 6d 20 74 68 69 73 20 74 61 62 6c 65 20 2a  rom this table *
4a50: 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e 2c  /.  int nColumn,
4a60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
4a70: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
4a80: 20 69 6e 20 74 68 65 20 73 6f 75 72 63 65 20 74   in the source t
4a90: 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69  able */.  ExprLi
4aa0: 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20  st *pOrderBy,   
4ab0: 20 20 2f 2a 20 49 66 20 6e 6f 74 20 4e 55 4c 4c    /* If not NULL
4ac0: 2c 20 73 6f 72 74 20 72 65 73 75 6c 74 73 20 75  , sort results u
4ad0: 73 69 6e 67 20 74 68 69 73 20 6b 65 79 20 2a 2f  sing this key */
4ae0: 0a 20 20 44 69 73 74 69 6e 63 74 43 74 78 20 2a  .  DistinctCtx *
4af0: 70 44 69 73 74 69 6e 63 74 2c 20 2f 2a 20 49 66  pDistinct, /* If
4b00: 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 6e 66 6f 20   not NULL, info 
4b10: 6f 6e 20 68 6f 77 20 74 6f 20 70 72 6f 63 65 73  on how to proces
4b20: 73 20 44 49 53 54 49 4e 43 54 20 2a 2f 0a 20 20  s DISTINCT */.  
4b30: 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73  SelectDest *pDes
4b40: 74 2c 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 74  t,      /* How t
4b50: 6f 20 64 69 73 70 6f 73 65 20 6f 66 20 74 68 65  o dispose of the
4b60: 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e   results */.  in
4b70: 74 20 69 43 6f 6e 74 69 6e 75 65 2c 20 20 20 20  t iContinue,    
4b80: 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
4b90: 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77  re to continue w
4ba0: 69 74 68 20 6e 65 78 74 20 72 6f 77 20 2a 2f 0a  ith next row */.
4bb0: 20 20 69 6e 74 20 69 42 72 65 61 6b 20 20 20 20    int iBreak    
4bc0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d            /* Jum
4bd0: 70 20 68 65 72 65 20 74 6f 20 62 72 65 61 6b 20  p here to break 
4be0: 6f 75 74 20 6f 66 20 74 68 65 20 69 6e 6e 65 72  out of the inner
4bf0: 20 6c 6f 6f 70 20 2a 2f 0a 29 7b 0a 20 20 56 64   loop */.){.  Vd
4c00: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
4c10: 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a  pVdbe;.  int i;.
4c20: 20 20 69 6e 74 20 68 61 73 44 69 73 74 69 6e 63    int hasDistinc
4c30: 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75  t;        /* Tru
4c40: 65 20 69 66 20 74 68 65 20 44 49 53 54 49 4e 43  e if the DISTINC
4c50: 54 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65  T keyword is pre
4c60: 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 72 65  sent */.  int re
4c70: 67 52 65 73 75 6c 74 3b 20 20 20 20 20 20 20 20  gResult;        
4c80: 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f        /* Start o
4c90: 66 20 6d 65 6d 6f 72 79 20 68 6f 6c 64 69 6e 67  f memory holding
4ca0: 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20   result set */. 
4cb0: 20 69 6e 74 20 65 44 65 73 74 20 3d 20 70 44 65   int eDest = pDe
4cc0: 73 74 2d 3e 65 44 65 73 74 3b 20 20 20 2f 2a 20  st->eDest;   /* 
4cd0: 48 6f 77 20 74 6f 20 64 69 73 70 6f 73 65 20 6f  How to dispose o
4ce0: 66 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69  f results */.  i
4cf0: 6e 74 20 69 50 61 72 6d 20 3d 20 70 44 65 73 74  nt iParm = pDest
4d00: 2d 3e 69 53 44 50 61 72 6d 3b 20 2f 2a 20 46 69  ->iSDParm; /* Fi
4d10: 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  rst argument to 
4d20: 64 69 73 70 6f 73 61 6c 20 6d 65 74 68 6f 64 20  disposal method 
4d30: 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 73 75 6c 74  */.  int nResult
4d40: 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Col;            
4d50: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65   /* Number of re
4d60: 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a  sult columns */.
4d70: 0a 20 20 61 73 73 65 72 74 28 20 76 20 29 3b 0a  .  assert( v );.
4d80: 20 20 69 66 28 20 4e 45 56 45 52 28 76 3d 3d 30    if( NEVER(v==0
4d90: 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73  ) ) return;.  as
4da0: 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20  sert( pEList!=0 
4db0: 29 3b 0a 20 20 68 61 73 44 69 73 74 69 6e 63 74  );.  hasDistinct
4dc0: 20 3d 20 70 44 69 73 74 69 6e 63 74 20 3f 20 70   = pDistinct ? p
4dd0: 44 69 73 74 69 6e 63 74 2d 3e 65 54 6e 63 74 54  Distinct->eTnctT
4de0: 79 70 65 20 3a 20 57 48 45 52 45 5f 44 49 53 54  ype : WHERE_DIST
4df0: 49 4e 43 54 5f 4e 4f 4f 50 3b 0a 20 20 69 66 28  INCT_NOOP;.  if(
4e00: 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 26 26 20   pOrderBy==0 && 
4e10: 21 68 61 73 44 69 73 74 69 6e 63 74 20 29 7b 0a  !hasDistinct ){.
4e20: 20 20 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76      codeOffset(v
4e30: 2c 20 70 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b  , p, iContinue);
4e40: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 75 6c 6c 20  .  }..  /* Pull 
4e50: 74 68 65 20 72 65 71 75 65 73 74 65 64 20 63 6f  the requested co
4e60: 6c 75 6d 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  lumns..  */.  if
4e70: 28 20 6e 43 6f 6c 75 6d 6e 3e 30 20 29 7b 0a 20  ( nColumn>0 ){. 
4e80: 20 20 20 6e 52 65 73 75 6c 74 43 6f 6c 20 3d 20     nResultCol = 
4e90: 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 7d 65 6c 73 65  nColumn;.  }else
4ea0: 7b 0a 20 20 20 20 6e 52 65 73 75 6c 74 43 6f 6c  {.    nResultCol
4eb0: 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   = pEList->nExpr
4ec0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 65 73  ;.  }.  if( pDes
4ed0: 74 2d 3e 69 53 64 73 74 3d 3d 30 20 29 7b 0a 20  t->iSdst==0 ){. 
4ee0: 20 20 20 70 44 65 73 74 2d 3e 69 53 64 73 74 20     pDest->iSdst 
4ef0: 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31  = pParse->nMem+1
4f00: 3b 0a 20 20 20 20 70 44 65 73 74 2d 3e 6e 53 64  ;.    pDest->nSd
4f10: 73 74 20 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b  st = nResultCol;
4f20: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65  .    pParse->nMe
4f30: 6d 20 2b 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b  m += nResultCol;
4f40: 0a 20 20 7d 65 6c 73 65 7b 20 0a 20 20 20 20 61  .  }else{ .    a
4f50: 73 73 65 72 74 28 20 70 44 65 73 74 2d 3e 6e 53  ssert( pDest->nS
4f60: 64 73 74 3d 3d 6e 52 65 73 75 6c 74 43 6f 6c 20  dst==nResultCol 
4f70: 29 3b 0a 20 20 7d 0a 20 20 72 65 67 52 65 73 75  );.  }.  regResu
4f80: 6c 74 20 3d 20 70 44 65 73 74 2d 3e 69 53 64 73  lt = pDest->iSds
4f90: 74 3b 0a 20 20 69 66 28 20 6e 43 6f 6c 75 6d 6e  t;.  if( nColumn
4fa0: 3e 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  >0 ){.    for(i=
4fb0: 30 3b 20 69 3c 6e 43 6f 6c 75 6d 6e 3b 20 69 2b  0; i<nColumn; i+
4fc0: 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
4fd0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
4fe0: 50 5f 43 6f 6c 75 6d 6e 2c 20 73 72 63 54 61 62  P_Column, srcTab
4ff0: 2c 20 69 2c 20 72 65 67 52 65 73 75 6c 74 2b 69  , i, regResult+i
5000: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
5010: 20 69 66 28 20 65 44 65 73 74 21 3d 53 52 54 5f   if( eDest!=SRT_
5020: 45 78 69 73 74 73 20 29 7b 0a 20 20 20 20 2f 2a  Exists ){.    /*
5030: 20 49 66 20 74 68 65 20 64 65 73 74 69 6e 61 74   If the destinat
5040: 69 6f 6e 20 69 73 20 61 6e 20 45 58 49 53 54 53  ion is an EXISTS
5050: 28 2e 2e 2e 29 20 65 78 70 72 65 73 73 69 6f 6e  (...) expression
5060: 2c 20 74 68 65 20 61 63 74 75 61 6c 0a 20 20 20  , the actual.   
5070: 20 2a 2a 20 76 61 6c 75 65 73 20 72 65 74 75 72   ** values retur
5080: 6e 65 64 20 62 79 20 74 68 65 20 53 45 4c 45 43  ned by the SELEC
5090: 54 20 61 72 65 20 6e 6f 74 20 72 65 71 75 69 72  T are not requir
50a0: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  ed..    */.    s
50b0: 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43  qlite3ExprCacheC
50c0: 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20  lear(pParse);.  
50d0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
50e0: 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  eExprList(pParse
50f0: 2c 20 70 45 4c 69 73 74 2c 20 72 65 67 52 65 73  , pEList, regRes
5100: 75 6c 74 2c 20 65 44 65 73 74 3d 3d 53 52 54 5f  ult, eDest==SRT_
5110: 4f 75 74 70 75 74 29 3b 0a 20 20 7d 0a 20 20 6e  Output);.  }.  n
5120: 43 6f 6c 75 6d 6e 20 3d 20 6e 52 65 73 75 6c 74  Column = nResult
5130: 43 6f 6c 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  Col;..  /* If th
5140: 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f  e DISTINCT keywo
5150: 72 64 20 77 61 73 20 70 72 65 73 65 6e 74 20 6f  rd was present o
5160: 6e 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  n the SELECT sta
5170: 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 61 6e 64 20  tement.  ** and 
5180: 74 68 69 73 20 72 6f 77 20 68 61 73 20 62 65 65  this row has bee
5190: 6e 20 73 65 65 6e 20 62 65 66 6f 72 65 2c 20 74  n seen before, t
51a0: 68 65 6e 20 64 6f 20 6e 6f 74 20 6d 61 6b 65 20  hen do not make 
51b0: 74 68 69 73 20 72 6f 77 0a 20 20 2a 2a 20 70 61  this row.  ** pa
51c0: 72 74 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74  rt of the result
51d0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 68 61 73  ..  */.  if( has
51e0: 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20  Distinct ){.    
51f0: 61 73 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d  assert( pEList!=
5200: 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
5210: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d   pEList->nExpr==
5220: 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 20 20 73  nColumn );.    s
5230: 77 69 74 63 68 28 20 70 44 69 73 74 69 6e 63 74  witch( pDistinct
5240: 2d 3e 65 54 6e 63 74 54 79 70 65 20 29 7b 0a 20  ->eTnctType ){. 
5250: 20 20 20 20 20 63 61 73 65 20 57 48 45 52 45 5f       case WHERE_
5260: 44 49 53 54 49 4e 43 54 5f 4f 52 44 45 52 45 44  DISTINCT_ORDERED
5270: 3a 20 7b 0a 20 20 20 20 20 20 20 20 56 64 62 65  : {.        Vdbe
5280: 4f 70 20 2a 70 4f 70 3b 20 20 20 20 20 20 20 20  Op *pOp;        
5290: 20 20 20 20 2f 2a 20 4e 6f 20 6c 6f 6e 67 65 72      /* No longer
52a0: 20 72 65 71 75 69 72 65 64 20 4f 70 65 6e 45 70   required OpenEp
52b0: 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 2e 20 2a  hemeral instr. *
52c0: 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4a  /.        int iJ
52d0: 75 6d 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  ump;            
52e0: 20 20 2f 2a 20 4a 75 6d 70 20 64 65 73 74 69 6e    /* Jump destin
52f0: 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20  ation */.       
5300: 20 69 6e 74 20 72 65 67 50 72 65 76 3b 20 20 20   int regPrev;   
5310: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 76           /* Prev
5320: 69 6f 75 73 20 72 6f 77 20 63 6f 6e 74 65 6e 74  ious row content
5330: 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20   */..        /* 
5340: 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  Allocate space f
5350: 6f 72 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  or the previous 
5360: 72 6f 77 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  row */.        r
5370: 65 67 50 72 65 76 20 3d 20 70 50 61 72 73 65 2d  egPrev = pParse-
5380: 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 20 20 20  >nMem+1;.       
5390: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
53a0: 20 6e 43 6f 6c 75 6d 6e 3b 0a 0a 20 20 20 20 20   nColumn;..     
53b0: 20 20 20 2f 2a 20 43 68 61 6e 67 65 20 74 68 65     /* Change the
53c0: 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
53d0: 6c 20 63 6f 64 65 64 20 65 61 72 6c 69 65 72 20  l coded earlier 
53e0: 74 6f 20 61 6e 20 4f 50 5f 4e 75 6c 6c 0a 20 20  to an OP_Null.  
53f0: 20 20 20 20 20 20 2a 2a 20 73 65 74 73 20 74 68        ** sets th
5400: 65 20 4d 45 4d 5f 43 6c 65 61 72 65 64 20 62 69  e MEM_Cleared bi
5410: 74 20 6f 6e 20 74 68 65 20 66 69 72 73 74 20 72  t on the first r
5420: 65 67 69 73 74 65 72 20 6f 66 20 74 68 65 0a 20  egister of the. 
5430: 20 20 20 20 20 20 20 2a 2a 20 70 72 65 76 69 6f         ** previo
5440: 75 73 20 76 61 6c 75 65 2e 20 20 54 68 69 73 20  us value.  This 
5450: 77 69 6c 6c 20 63 61 75 73 65 20 74 68 65 20 4f  will cause the O
5460: 50 5f 4e 65 20 62 65 6c 6f 77 20 74 6f 20 61 6c  P_Ne below to al
5470: 77 61 79 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  ways.        ** 
5480: 66 61 69 6c 20 6f 6e 20 74 68 65 20 66 69 72 73  fail on the firs
5490: 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74  t iteration of t
54a0: 68 65 20 6c 6f 6f 70 20 65 76 65 6e 20 69 66 20  he loop even if 
54b0: 74 68 65 20 66 69 72 73 74 0a 20 20 20 20 20 20  the first.      
54c0: 20 20 2a 2a 20 72 6f 77 20 69 73 20 61 6c 6c 20    ** row is all 
54d0: 4e 55 4c 4c 73 2e 0a 20 20 20 20 20 20 20 20 2a  NULLs..        *
54e0: 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  /.        sqlite
54f0: 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f  3VdbeChangeToNoo
5500: 70 28 76 2c 20 70 44 69 73 74 69 6e 63 74 2d 3e  p(v, pDistinct->
5510: 61 64 64 72 54 6e 63 74 29 3b 0a 20 20 20 20 20  addrTnct);.     
5520: 20 20 20 70 4f 70 20 3d 20 73 71 6c 69 74 65 33     pOp = sqlite3
5530: 56 64 62 65 47 65 74 4f 70 28 76 2c 20 70 44 69  VdbeGetOp(v, pDi
5540: 73 74 69 6e 63 74 2d 3e 61 64 64 72 54 6e 63 74  stinct->addrTnct
5550: 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e  );.        pOp->
5560: 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 4e 75 6c 6c  opcode = OP_Null
5570: 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70  ;.        pOp->p
5580: 31 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70  1 = 1;.        p
5590: 4f 70 2d 3e 70 32 20 3d 20 72 65 67 50 72 65 76  Op->p2 = regPrev
55a0: 3b 0a 0a 20 20 20 20 20 20 20 20 69 4a 75 6d 70  ;..        iJump
55b0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
55c0: 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20 6e  rrentAddr(v) + n
55d0: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20  Column;.        
55e0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 75  for(i=0; i<nColu
55f0: 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  mn; i++){.      
5600: 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
5610: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
5620: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
5630: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  pEList->a[i].pEx
5640: 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  pr);.          i
5650: 66 28 20 69 3c 6e 43 6f 6c 75 6d 6e 2d 31 20 29  f( i<nColumn-1 )
5660: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
5670: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
5680: 76 2c 20 4f 50 5f 4e 65 2c 20 72 65 67 52 65 73  v, OP_Ne, regRes
5690: 75 6c 74 2b 69 2c 20 69 4a 75 6d 70 2c 20 72 65  ult+i, iJump, re
56a0: 67 50 72 65 76 2b 69 29 3b 0a 20 20 20 20 20 20  gPrev+i);.      
56b0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
56c0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
56d0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 45  beAddOp3(v, OP_E
56e0: 71 2c 20 72 65 67 52 65 73 75 6c 74 2b 69 2c 20  q, regResult+i, 
56f0: 69 43 6f 6e 74 69 6e 75 65 2c 20 72 65 67 50 72  iContinue, regPr
5700: 65 76 2b 69 29 3b 0a 20 20 20 20 20 20 20 20 20  ev+i);.         
5710: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c   }.          sql
5720: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
5730: 28 76 2c 20 2d 31 2c 20 28 63 6f 6e 73 74 20 63  (v, -1, (const c
5740: 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f  har *)pColl, P4_
5750: 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20 20  COLLSEQ);.      
5760: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
5770: 68 61 6e 67 65 50 35 28 76 2c 20 53 51 4c 49 54  hangeP5(v, SQLIT
5780: 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20  E_NULLEQ);.     
5790: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73     }.        ass
57a0: 65 72 74 28 20 73 71 6c 69 74 65 33 56 64 62 65  ert( sqlite3Vdbe
57b0: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3d 3d  CurrentAddr(v)==
57c0: 69 4a 75 6d 70 20 29 3b 0a 20 20 20 20 20 20 20  iJump );.       
57d0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
57e0: 70 33 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72  p3(v, OP_Copy, r
57f0: 65 67 52 65 73 75 6c 74 2c 20 72 65 67 50 72 65  egResult, regPre
5800: 76 2c 20 6e 43 6f 6c 75 6d 6e 2d 31 29 3b 0a 20  v, nColumn-1);. 
5810: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
5820: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 63 61 73      }..      cas
5830: 65 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  e WHERE_DISTINCT
5840: 5f 55 4e 49 51 55 45 3a 20 7b 0a 20 20 20 20 20  _UNIQUE: {.     
5850: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
5860: 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 70 44  angeToNoop(v, pD
5870: 69 73 74 69 6e 63 74 2d 3e 61 64 64 72 54 6e 63  istinct->addrTnc
5880: 74 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  t);.        brea
5890: 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  k;.      }..    
58a0: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
58b0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 44 69       assert( pDi
58c0: 73 74 69 6e 63 74 2d 3e 65 54 6e 63 74 54 79 70  stinct->eTnctTyp
58d0: 65 3d 3d 57 48 45 52 45 5f 44 49 53 54 49 4e 43  e==WHERE_DISTINC
58e0: 54 5f 55 4e 4f 52 44 45 52 45 44 20 29 3b 0a 20  T_UNORDERED );. 
58f0: 20 20 20 20 20 20 20 63 6f 64 65 44 69 73 74 69         codeDisti
5900: 6e 63 74 28 70 50 61 72 73 65 2c 20 70 44 69 73  nct(pParse, pDis
5910: 74 69 6e 63 74 2d 3e 74 61 62 54 6e 63 74 2c 20  tinct->tabTnct, 
5920: 69 43 6f 6e 74 69 6e 75 65 2c 20 6e 43 6f 6c 75  iContinue, nColu
5930: 6d 6e 2c 20 72 65 67 52 65 73 75 6c 74 29 3b 0a  mn, regResult);.
5940: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
5950: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
5960: 20 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d 30   if( pOrderBy==0
5970: 20 29 7b 0a 20 20 20 20 20 20 63 6f 64 65 4f 66   ){.      codeOf
5980: 66 73 65 74 28 76 2c 20 70 2c 20 69 43 6f 6e 74  fset(v, p, iCont
5990: 69 6e 75 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  inue);.    }.  }
59a0: 0a 0a 20 20 73 77 69 74 63 68 28 20 65 44 65 73  ..  switch( eDes
59b0: 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74  t ){.    /* In t
59c0: 68 69 73 20 6d 6f 64 65 2c 20 77 72 69 74 65 20  his mode, write 
59d0: 65 61 63 68 20 71 75 65 72 79 20 72 65 73 75 6c  each query resul
59e0: 74 20 74 6f 20 74 68 65 20 6b 65 79 20 6f 66 20  t to the key of 
59f0: 74 68 65 20 74 65 6d 70 6f 72 61 72 79 0a 20 20  the temporary.  
5a00: 20 20 2a 2a 20 74 61 62 6c 65 20 69 50 61 72 6d    ** table iParm
5a10: 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66  ..    */.#ifndef
5a20: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d   SQLITE_OMIT_COM
5a30: 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 20 20 20  POUND_SELECT.   
5a40: 20 63 61 73 65 20 53 52 54 5f 55 6e 69 6f 6e 3a   case SRT_Union:
5a50: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31 3b   {.      int r1;
5a60: 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
5a70: 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
5a80: 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  arse);.      sql
5a90: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
5aa0: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
5ab0: 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 43 6f 6c   regResult, nCol
5ac0: 75 6d 6e 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  umn, r1);.      
5ad0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5ae0: 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72  2(v, OP_IdxInser
5af0: 74 2c 20 69 50 61 72 6d 2c 20 72 31 29 3b 0a 20  t, iParm, r1);. 
5b00: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
5b10: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
5b20: 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72  e, r1);.      br
5b30: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
5b40: 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20 72  /* Construct a r
5b50: 65 63 6f 72 64 20 66 72 6f 6d 20 74 68 65 20 71  ecord from the q
5b60: 75 65 72 79 20 72 65 73 75 6c 74 2c 20 62 75 74  uery result, but
5b70: 20 69 6e 73 74 65 61 64 20 6f 66 0a 20 20 20 20   instead of.    
5b80: 2a 2a 20 73 61 76 69 6e 67 20 74 68 61 74 20 72  ** saving that r
5b90: 65 63 6f 72 64 2c 20 75 73 65 20 69 74 20 61 73  ecord, use it as
5ba0: 20 61 20 6b 65 79 20 74 6f 20 64 65 6c 65 74 65   a key to delete
5bb0: 20 65 6c 65 6d 65 6e 74 73 20 66 72 6f 6d 0a 20   elements from. 
5bc0: 20 20 20 2a 2a 20 74 68 65 20 74 65 6d 70 6f 72     ** the tempor
5bd0: 61 72 79 20 74 61 62 6c 65 20 69 50 61 72 6d 2e  ary table iParm.
5be0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
5bf0: 20 53 52 54 5f 45 78 63 65 70 74 3a 20 7b 0a 20   SRT_Except: {. 
5c00: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
5c10: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 64 78  AddOp3(v, OP_Idx
5c20: 44 65 6c 65 74 65 2c 20 69 50 61 72 6d 2c 20 72  Delete, iParm, r
5c30: 65 67 52 65 73 75 6c 74 2c 20 6e 43 6f 6c 75 6d  egResult, nColum
5c40: 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  n);.      break;
5c50: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
5c60: 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20     /* Store the 
5c70: 72 65 73 75 6c 74 20 61 73 20 64 61 74 61 20 75  result as data u
5c80: 73 69 6e 67 20 61 20 75 6e 69 71 75 65 20 6b 65  sing a unique ke
5c90: 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  y..    */.    ca
5ca0: 73 65 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20  se SRT_Table:.  
5cb0: 20 20 63 61 73 65 20 53 52 54 5f 45 70 68 65 6d    case SRT_Ephem
5cc0: 54 61 62 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  Tab: {.      int
5cd0: 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
5ce0: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
5cf0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
5d00: 20 65 44 65 73 74 3d 3d 53 52 54 5f 54 61 62 6c   eDest==SRT_Tabl
5d10: 65 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  e );.      testc
5d20: 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f  ase( eDest==SRT_
5d30: 45 70 68 65 6d 54 61 62 20 29 3b 0a 20 20 20 20  EphemTab );.    
5d40: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
5d50: 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op3(v, OP_MakeRe
5d60: 63 6f 72 64 2c 20 72 65 67 52 65 73 75 6c 74 2c  cord, regResult,
5d70: 20 6e 43 6f 6c 75 6d 6e 2c 20 72 31 29 3b 0a 20   nColumn, r1);. 
5d80: 20 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42       if( pOrderB
5d90: 79 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75 73  y ){.        pus
5da0: 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72  hOntoSorter(pPar
5db0: 73 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 2c  se, pOrderBy, p,
5dc0: 20 72 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73   r1);.      }els
5dd0: 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  e{.        int r
5de0: 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  2 = sqlite3GetTe
5df0: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
5e00: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
5e10: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
5e20: 65 77 52 6f 77 69 64 2c 20 69 50 61 72 6d 2c 20  ewRowid, iParm, 
5e30: 72 32 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  r2);.        sql
5e40: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
5e50: 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 69 50 61  , OP_Insert, iPa
5e60: 72 6d 2c 20 72 31 2c 20 72 32 29 3b 0a 20 20 20  rm, r1, r2);.   
5e70: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
5e80: 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
5e90: 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20  AG_APPEND);.    
5ea0: 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
5eb0: 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
5ec0: 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20  , r2);.      }. 
5ed0: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
5ee0: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
5ef0: 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72  e, r1);.      br
5f00: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e  eak;.    }..#ifn
5f10: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
5f20: 53 55 42 51 55 45 52 59 0a 20 20 20 20 2f 2a 20  SUBQUERY.    /* 
5f30: 49 66 20 77 65 20 61 72 65 20 63 72 65 61 74 69  If we are creati
5f40: 6e 67 20 61 20 73 65 74 20 66 6f 72 20 61 6e 20  ng a set for an 
5f50: 22 65 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54  "expr IN (SELECT
5f60: 20 2e 2e 2e 29 22 20 63 6f 6e 73 74 72 75 63 74   ...)" construct
5f70: 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68  ,.    ** then th
5f80: 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20 61 20  ere should be a 
5f90: 73 69 6e 67 6c 65 20 69 74 65 6d 20 6f 6e 20 74  single item on t
5fa0: 68 65 20 73 74 61 63 6b 2e 20 20 57 72 69 74 65  he stack.  Write
5fb0: 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 74 65   this.    ** ite
5fc0: 6d 20 69 6e 74 6f 20 74 68 65 20 73 65 74 20 74  m into the set t
5fd0: 61 62 6c 65 20 77 69 74 68 20 62 6f 67 75 73 20  able with bogus 
5fe0: 64 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  data..    */.   
5ff0: 20 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b   case SRT_Set: {
6000: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
6010: 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20  Column==1 );.   
6020: 20 20 20 70 44 65 73 74 2d 3e 61 66 66 53 64 73     pDest->affSds
6030: 74 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20  t =.            
6040: 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6d        sqlite3Com
6050: 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 45 4c  pareAffinity(pEL
6060: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c  ist->a[0].pExpr,
6070: 20 70 44 65 73 74 2d 3e 61 66 66 53 64 73 74 29   pDest->affSdst)
6080: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 64  ;.      if( pOrd
6090: 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20  erBy ){.        
60a0: 2f 2a 20 41 74 20 66 69 72 73 74 20 67 6c 61 6e  /* At first glan
60b0: 63 65 20 79 6f 75 20 77 6f 75 6c 64 20 74 68 69  ce you would thi
60c0: 6e 6b 20 77 65 20 63 6f 75 6c 64 20 6f 70 74 69  nk we could opti
60d0: 6d 69 7a 65 20 6f 75 74 20 74 68 65 0a 20 20 20  mize out the.   
60e0: 20 20 20 20 20 2a 2a 20 4f 52 44 45 52 20 42 59       ** ORDER BY
60f0: 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 73 69   in this case si
6100: 6e 63 65 20 74 68 65 20 6f 72 64 65 72 20 6f 66  nce the order of
6110: 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
6120: 73 65 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 64  set.        ** d
6130: 6f 65 73 20 6e 6f 74 20 6d 61 74 74 65 72 2e 20  oes not matter. 
6140: 20 42 75 74 20 74 68 65 72 65 20 6d 69 67 68 74   But there might
6150: 20 62 65 20 61 20 4c 49 4d 49 54 20 63 6c 61 75   be a LIMIT clau
6160: 73 65 2c 20 69 6e 20 77 68 69 63 68 0a 20 20 20  se, in which.   
6170: 20 20 20 20 20 2a 2a 20 63 61 73 65 20 74 68 65       ** case the
6180: 20 6f 72 64 65 72 20 64 6f 65 73 20 6d 61 74 74   order does matt
6190: 65 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 75  er */.        pu
61a0: 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61  shOntoSorter(pPa
61b0: 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 70  rse, pOrderBy, p
61c0: 2c 20 72 65 67 52 65 73 75 6c 74 29 3b 0a 20 20  , regResult);.  
61d0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
61e0: 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69     int r1 = sqli
61f0: 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
6200: 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73  arse);.        s
6210: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
6220: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
6230: 64 2c 20 72 65 67 52 65 73 75 6c 74 2c 31 2c 72  d, regResult,1,r
6240: 31 2c 20 26 70 44 65 73 74 2d 3e 61 66 66 53 64  1, &pDest->affSd
6250: 73 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  st, 1);.        
6260: 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
6270: 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70  AffinityChange(p
6280: 50 61 72 73 65 2c 20 72 65 67 52 65 73 75 6c 74  Parse, regResult
6290: 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 1);.        sq
62a0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
62b0: 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c  v, OP_IdxInsert,
62c0: 20 69 50 61 72 6d 2c 20 72 31 29 3b 0a 20 20 20   iParm, r1);.   
62d0: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
62e0: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
62f0: 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 7d 0a  e, r1);.      }.
6300: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
6310: 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 6e   }..    /* If an
6320: 79 20 72 6f 77 20 65 78 69 73 74 20 69 6e 20 74  y row exist in t
6330: 68 65 20 72 65 73 75 6c 74 20 73 65 74 2c 20 72  he result set, r
6340: 65 63 6f 72 64 20 74 68 61 74 20 66 61 63 74 20  ecord that fact 
6350: 61 6e 64 20 61 62 6f 72 74 2e 0a 20 20 20 20 2a  and abort..    *
6360: 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 45  /.    case SRT_E
6370: 78 69 73 74 73 3a 20 7b 0a 20 20 20 20 20 20 73  xists: {.      s
6380: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
6390: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
63a0: 31 2c 20 69 50 61 72 6d 29 3b 0a 20 20 20 20 20  1, iParm);.     
63b0: 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c   /* The LIMIT cl
63c0: 61 75 73 65 20 77 69 6c 6c 20 74 65 72 6d 69 6e  ause will termin
63d0: 61 74 65 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72  ate the loop for
63e0: 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 62 72 65   us */.      bre
63f0: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
6400: 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20 73  * If this is a s
6410: 63 61 6c 61 72 20 73 65 6c 65 63 74 20 74 68 61  calar select tha
6420: 74 20 69 73 20 70 61 72 74 20 6f 66 20 61 6e 20  t is part of an 
6430: 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e  expression, then
6440: 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65 20 74 68  .    ** store th
6450: 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74 68 65  e results in the
6460: 20 61 70 70 72 6f 70 72 69 61 74 65 20 6d 65 6d   appropriate mem
6470: 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20 62 72 65  ory cell and bre
6480: 61 6b 20 6f 75 74 0a 20 20 20 20 2a 2a 20 6f 66  ak out.    ** of
6490: 20 74 68 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a   the scan loop..
64a0: 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
64b0: 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20  SRT_Mem: {.     
64c0: 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e   assert( nColumn
64d0: 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ==1 );.      if(
64e0: 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20   pOrderBy ){.   
64f0: 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72       pushOntoSor
6500: 74 65 72 28 70 50 61 72 73 65 2c 20 70 4f 72 64  ter(pParse, pOrd
6510: 65 72 42 79 2c 20 70 2c 20 72 65 67 52 65 73 75  erBy, p, regResu
6520: 6c 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  lt);.      }else
6530: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
6540: 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50  3ExprCodeMove(pP
6550: 61 72 73 65 2c 20 72 65 67 52 65 73 75 6c 74 2c  arse, regResult,
6560: 20 69 50 61 72 6d 2c 20 31 29 3b 0a 20 20 20 20   iParm, 1);.    
6570: 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54      /* The LIMIT
6580: 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 6a 75 6d   clause will jum
6590: 70 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f  p out of the loo
65a0: 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20  p for us */.    
65b0: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
65c0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  .    }.#endif /*
65d0: 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f   #ifndef SQLITE_
65e0: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f  OMIT_SUBQUERY */
65f0: 0a 0a 20 20 20 20 2f 2a 20 53 65 6e 64 20 74 68  ..    /* Send th
6600: 65 20 64 61 74 61 20 74 6f 20 74 68 65 20 63 61  e data to the ca
6610: 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20  llback function 
6620: 6f 72 20 74 6f 20 61 20 73 75 62 72 6f 75 74 69  or to a subrouti
6630: 6e 65 2e 20 20 49 6e 20 74 68 65 0a 20 20 20 20  ne.  In the.    
6640: 2a 2a 20 63 61 73 65 20 6f 66 20 61 20 73 75 62  ** case of a sub
6650: 72 6f 75 74 69 6e 65 2c 20 74 68 65 20 73 75 62  routine, the sub
6660: 72 6f 75 74 69 6e 65 20 69 74 73 65 6c 66 20 69  routine itself i
6670: 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
6680: 72 0a 20 20 20 20 2a 2a 20 70 6f 70 70 69 6e 67  r.    ** popping
6690: 20 74 68 65 20 64 61 74 61 20 66 72 6f 6d 20 74   the data from t
66a0: 68 65 20 73 74 61 63 6b 2e 0a 20 20 20 20 2a 2f  he stack..    */
66b0: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 43 6f  .    case SRT_Co
66c0: 72 6f 75 74 69 6e 65 3a 0a 20 20 20 20 63 61 73  routine:.    cas
66d0: 65 20 53 52 54 5f 4f 75 74 70 75 74 3a 20 7b 0a  e SRT_Output: {.
66e0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
66f0: 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75  eDest==SRT_Corou
6700: 74 69 6e 65 20 29 3b 0a 20 20 20 20 20 20 74 65  tine );.      te
6710: 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53  stcase( eDest==S
6720: 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20 20 20  RT_Output );.   
6730: 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20     if( pOrderBy 
6740: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  ){.        int r
6750: 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
6760: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
6770: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
6780: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d  beAddOp3(v, OP_M
6790: 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52 65  akeRecord, regRe
67a0: 73 75 6c 74 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 72  sult, nColumn, r
67b0: 31 29 3b 0a 20 20 20 20 20 20 20 20 70 75 73 68  1);.        push
67c0: 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73  OntoSorter(pPars
67d0: 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 2c 20  e, pOrderBy, p, 
67e0: 72 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  r1);.        sql
67f0: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
6800: 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a  eg(pParse, r1);.
6810: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
6820: 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75  eDest==SRT_Corou
6830: 74 69 6e 65 20 29 7b 0a 20 20 20 20 20 20 20 20  tine ){.        
6840: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6850: 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 70  1(v, OP_Yield, p
6860: 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 29 3b 0a  Dest->iSDParm);.
6870: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
6880: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
6890: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73  AddOp2(v, OP_Res
68a0: 75 6c 74 52 6f 77 2c 20 72 65 67 52 65 73 75 6c  ultRow, regResul
68b0: 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20  t, nColumn);.   
68c0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
68d0: 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61  CacheAffinityCha
68e0: 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 52  nge(pParse, regR
68f0: 65 73 75 6c 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b  esult, nColumn);
6900: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
6910: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66  reak;.    }..#if
6920: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
6930: 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 29 0a 20  _OMIT_TRIGGER). 
6940: 20 20 20 2f 2a 20 44 69 73 63 61 72 64 20 74 68     /* Discard th
6950: 65 20 72 65 73 75 6c 74 73 2e 20 20 54 68 69 73  e results.  This
6960: 20 69 73 20 75 73 65 64 20 66 6f 72 20 53 45 4c   is used for SEL
6970: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 69  ECT statements i
6980: 6e 73 69 64 65 0a 20 20 20 20 2a 2a 20 74 68 65  nside.    ** the
6990: 20 62 6f 64 79 20 6f 66 20 61 20 54 52 49 47 47   body of a TRIGG
69a0: 45 52 2e 20 20 54 68 65 20 70 75 72 70 6f 73 65  ER.  The purpose
69b0: 20 6f 66 20 73 75 63 68 20 73 65 6c 65 63 74 73   of such selects
69c0: 20 69 73 20 74 6f 20 63 61 6c 6c 0a 20 20 20 20   is to call.    
69d0: 2a 2a 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20  ** user-defined 
69e0: 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 68  functions that h
69f0: 61 76 65 20 73 69 64 65 20 65 66 66 65 63 74 73  ave side effects
6a00: 2e 20 20 57 65 20 64 6f 20 6e 6f 74 20 63 61 72  .  We do not car
6a10: 65 0a 20 20 20 20 2a 2a 20 61 62 6f 75 74 20 74  e.    ** about t
6a20: 68 65 20 61 63 74 75 61 6c 20 72 65 73 75 6c 74  he actual result
6a30: 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2e  s of the select.
6a40: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 65 66 61  .    */.    defa
6a50: 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  ult: {.      ass
6a60: 65 72 74 28 20 65 44 65 73 74 3d 3d 53 52 54 5f  ert( eDest==SRT_
6a70: 44 69 73 63 61 72 64 20 29 3b 0a 20 20 20 20 20  Discard );.     
6a80: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
6a90: 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a  ndif.  }..  /* J
6aa0: 75 6d 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  ump to the end o
6ab0: 66 20 74 68 65 20 6c 6f 6f 70 20 69 66 20 74 68  f the loop if th
6ac0: 65 20 4c 49 4d 49 54 20 69 73 20 72 65 61 63 68  e LIMIT is reach
6ad0: 65 64 2e 20 20 45 78 63 65 70 74 2c 20 69 66 0a  ed.  Except, if.
6ae0: 20 20 2a 2a 20 74 68 65 72 65 20 69 73 20 61 20    ** there is a 
6af0: 73 6f 72 74 65 72 2c 20 69 6e 20 77 68 69 63 68  sorter, in which
6b00: 20 63 61 73 65 20 74 68 65 20 73 6f 72 74 65 72   case the sorter
6b10: 20 68 61 73 20 61 6c 72 65 61 64 79 20 6c 69 6d   has already lim
6b20: 69 74 65 64 0a 20 20 2a 2a 20 74 68 65 20 6f 75  ited.  ** the ou
6b30: 74 70 75 74 20 66 6f 72 20 75 73 2e 0a 20 20 2a  tput for us..  *
6b40: 2f 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79  /.  if( pOrderBy
6b50: 3d 3d 30 20 26 26 20 70 2d 3e 69 4c 69 6d 69 74  ==0 && p->iLimit
6b60: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
6b70: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
6b80: 49 66 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69  IfZero, p->iLimi
6b90: 74 2c 20 69 42 72 65 61 6b 2c 20 2d 31 29 3b 0a  t, iBreak, -1);.
6ba0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c    }.}../*.** All
6bb0: 6f 63 61 74 65 20 61 20 4b 65 79 49 6e 66 6f 20  ocate a KeyInfo 
6bc0: 6f 62 6a 65 63 74 20 73 75 66 66 69 63 69 65 6e  object sufficien
6bd0: 74 20 66 6f 72 20 61 6e 20 69 6e 64 65 78 20 6f  t for an index o
6be0: 66 20 4e 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2a 0a  f N columns..**.
6bf0: 2a 2a 20 41 63 74 75 61 6c 6c 79 2c 20 61 6c 77  ** Actually, alw
6c00: 61 79 73 20 61 6c 6c 6f 63 61 74 65 20 6f 6e 65  ays allocate one
6c10: 20 65 78 74 72 61 20 63 6f 6c 75 6d 6e 20 66 6f   extra column fo
6c20: 72 20 74 68 65 20 72 6f 77 69 64 20 61 74 20 74  r the rowid at t
6c30: 68 65 20 65 6e 64 0a 2a 2a 20 6f 66 20 74 68 65  he end.** of the
6c40: 20 69 6e 64 65 78 2e 20 20 53 6f 20 74 68 65 20   index.  So the 
6c50: 4b 65 79 49 6e 66 6f 20 72 65 74 75 72 6e 65 64  KeyInfo returned
6c60: 20 77 69 6c 6c 20 68 61 76 65 20 73 70 61 63 65   will have space
6c70: 20 73 75 66 66 69 63 69 65 6e 74 20 66 6f 72 0a   sufficient for.
6c80: 2a 2a 20 4e 2b 31 20 63 6f 6c 75 6d 6e 73 2e 0a  ** N+1 columns..
6c90: 2a 2f 0a 4b 65 79 49 6e 66 6f 20 2a 73 71 6c 69  */.KeyInfo *sqli
6ca0: 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28  te3KeyInfoAlloc(
6cb0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
6cc0: 20 4e 29 7b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a   N){.  KeyInfo *
6cd0: 70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  p = sqlite3DbMal
6ce0: 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 0a 20 20 20  locZero(db, .   
6cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6d00: 73 69 7a 65 6f 66 28 4b 65 79 49 6e 66 6f 29 20  sizeof(KeyInfo) 
6d10: 2b 20 28 4e 2b 31 29 2a 28 73 69 7a 65 6f 66 28  + (N+1)*(sizeof(
6d20: 43 6f 6c 6c 53 65 71 2a 29 2b 31 29 29 3b 0a 20  CollSeq*)+1));. 
6d30: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 70 2d   if( p ){.    p-
6d40: 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75  >aSortOrder = (u
6d50: 38 2a 29 26 70 2d 3e 61 43 6f 6c 6c 5b 4e 2b 31  8*)&p->aColl[N+1
6d60: 5d 3b 0a 20 20 20 20 70 2d 3e 6e 46 69 65 6c 64  ];.    p->nField
6d70: 20 3d 20 28 75 31 36 29 4e 3b 0a 20 20 20 20 70   = (u16)N;.    p
6d80: 2d 3e 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b  ->enc = ENC(db);
6d90: 0a 20 20 20 20 70 2d 3e 64 62 20 3d 20 64 62 3b  .    p->db = db;
6da0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b  .  }.  return p;
6db0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  .}../*.** Given 
6dc0: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  an expression li
6dd0: 73 74 2c 20 67 65 6e 65 72 61 74 65 20 61 20 4b  st, generate a K
6de0: 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
6df0: 20 74 68 61 74 20 72 65 63 6f 72 64 73 0a 2a 2a   that records.**
6e00: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73   the collating s
6e10: 65 71 75 65 6e 63 65 20 66 6f 72 20 65 61 63 68  equence for each
6e20: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 74   expression in t
6e30: 68 61 74 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  hat expression l
6e40: 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ist..**.** If th
6e50: 65 20 45 78 70 72 4c 69 73 74 20 69 73 20 61 6e  e ExprList is an
6e60: 20 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f   ORDER BY or GRO
6e70: 55 50 20 42 59 20 63 6c 61 75 73 65 20 74 68 65  UP BY clause the
6e80: 6e 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67 0a  n the resulting.
6e90: 2a 2a 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63  ** KeyInfo struc
6ea0: 74 75 72 65 20 69 73 20 61 70 70 72 6f 70 72 69  ture is appropri
6eb0: 61 74 65 20 66 6f 72 20 69 6e 69 74 69 61 6c 69  ate for initiali
6ec0: 7a 69 6e 67 20 61 20 76 69 72 74 75 61 6c 20 69  zing a virtual i
6ed0: 6e 64 65 78 20 74 6f 0a 2a 2a 20 69 6d 70 6c 65  ndex to.** imple
6ee0: 6d 65 6e 74 20 74 68 61 74 20 63 6c 61 75 73 65  ment that clause
6ef0: 2e 20 20 49 66 20 74 68 65 20 45 78 70 72 4c 69  .  If the ExprLi
6f00: 73 74 20 69 73 20 74 68 65 20 72 65 73 75 6c 74  st is the result
6f10: 20 73 65 74 20 6f 66 20 61 20 53 45 4c 45 43 54   set of a SELECT
6f20: 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 4b 65 79  .** then the Key
6f30: 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69  Info structure i
6f40: 73 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f  s appropriate fo
6f50: 72 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 61  r initializing a
6f60: 20 76 69 72 74 75 61 6c 0a 2a 2a 20 69 6e 64 65   virtual.** inde
6f70: 78 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61  x to implement a
6f80: 20 44 49 53 54 49 4e 43 54 20 74 65 73 74 2e 0a   DISTINCT test..
6f90: 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68  **.** Space to h
6fa0: 6f 6c 64 20 74 68 65 20 4b 65 79 49 6e 66 6f 20  old the KeyInfo 
6fb0: 73 74 72 75 63 74 75 72 65 20 69 73 20 6f 62 74  structure is obt
6fc0: 61 69 6e 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e  ain from malloc.
6fd0: 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a    The calling.**
6fe0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 73   function is res
6ff0: 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 73 65 65  ponsible for see
7000: 69 6e 67 20 74 68 61 74 20 74 68 69 73 20 73 74  ing that this st
7010: 72 75 63 74 75 72 65 20 69 73 20 65 76 65 6e 74  ructure is event
7020: 75 61 6c 6c 79 0a 2a 2a 20 66 72 65 65 64 2e 20  ually.** freed. 
7030: 20 41 64 64 20 74 68 65 20 4b 65 79 49 6e 66 6f   Add the KeyInfo
7040: 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 74 68   structure to th
7050: 65 20 50 34 20 66 69 65 6c 64 20 6f 66 20 61 6e  e P4 field of an
7060: 20 6f 70 63 6f 64 65 20 75 73 69 6e 67 0a 2a 2a   opcode using.**
7070: 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44   P4_KEYINFO_HAND
7080: 4f 46 46 20 69 73 20 74 68 65 20 75 73 75 61 6c  OFF is the usual
7090: 20 77 61 79 20 6f 66 20 64 65 61 6c 69 6e 67 20   way of dealing 
70a0: 77 69 74 68 20 74 68 69 73 2e 0a 2a 2f 0a 73 74  with this..*/.st
70b0: 61 74 69 63 20 4b 65 79 49 6e 66 6f 20 2a 6b 65  atic KeyInfo *ke
70c0: 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73  yInfoFromExprLis
70d0: 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  t(Parse *pParse,
70e0: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
70f0: 29 7b 0a 20 20 69 6e 74 20 6e 45 78 70 72 3b 0a  ){.  int nExpr;.
7100: 20 20 4b 65 79 49 6e 66 6f 20 2a 70 49 6e 66 6f    KeyInfo *pInfo
7110: 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c  ;.  struct ExprL
7120: 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
7130: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
7140: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
7150: 6e 74 20 69 3b 0a 0a 20 20 6e 45 78 70 72 20 3d  nt i;..  nExpr =
7160: 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20   pList->nExpr;. 
7170: 20 70 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33   pInfo = sqlite3
7180: 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c  KeyInfoAlloc(db,
7190: 20 6e 45 78 70 72 29 3b 0a 20 20 69 66 28 20 70   nExpr);.  if( p
71a0: 49 6e 66 6f 20 29 7b 0a 20 20 20 20 66 6f 72 28  Info ){.    for(
71b0: 69 3d 30 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74  i=0, pItem=pList
71c0: 2d 3e 61 3b 20 69 3c 6e 45 78 70 72 3b 20 69 2b  ->a; i<nExpr; i+
71d0: 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
71e0: 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
71f0: 6c 3b 0a 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d  l;.      pColl =
7200: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
7210: 53 65 71 28 70 50 61 72 73 65 2c 20 70 49 74 65  Seq(pParse, pIte
7220: 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  m->pExpr);.     
7230: 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 20 70 43   if( !pColl ) pC
7240: 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43  oll = db->pDfltC
7250: 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 49 6e 66 6f  oll;.      pInfo
7260: 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 70 43 6f  ->aColl[i] = pCo
7270: 6c 6c 3b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d  ll;.      pInfo-
7280: 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d  >aSortOrder[i] =
7290: 20 70 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65   pItem->sortOrde
72a0: 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  r;.    }.  }.  r
72b0: 65 74 75 72 6e 20 70 49 6e 66 6f 3b 0a 7d 0a 0a  eturn pInfo;.}..
72c0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
72d0: 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
72e0: 45 43 54 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65 20 6f  ECT./*.** Name o
72f0: 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  f the connection
7300: 20 6f 70 65 72 61 74 6f 72 2c 20 75 73 65 64 20   operator, used 
7310: 66 6f 72 20 65 72 72 6f 72 20 6d 65 73 73 61 67  for error messag
7320: 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  es..*/.static co
7330: 6e 73 74 20 63 68 61 72 20 2a 73 65 6c 65 63 74  nst char *select
7340: 4f 70 4e 61 6d 65 28 69 6e 74 20 69 64 29 7b 0a  OpName(int id){.
7350: 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 73 77 69    char *z;.  swi
7360: 74 63 68 28 20 69 64 20 29 7b 0a 20 20 20 20 63  tch( id ){.    c
7370: 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 20 20 20 20  ase TK_ALL:     
7380: 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 20 41 4c 4c    z = "UNION ALL
7390: 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ";   break;.    
73a0: 63 61 73 65 20 54 4b 5f 49 4e 54 45 52 53 45 43  case TK_INTERSEC
73b0: 54 3a 20 7a 20 3d 20 22 49 4e 54 45 52 53 45 43  T: z = "INTERSEC
73c0: 54 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  T";   break;.   
73d0: 20 63 61 73 65 20 54 4b 5f 45 58 43 45 50 54 3a   case TK_EXCEPT:
73e0: 20 20 20 20 7a 20 3d 20 22 45 58 43 45 50 54 22      z = "EXCEPT"
73f0: 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ;      break;.  
7400: 20 20 64 65 66 61 75 6c 74 3a 20 20 20 20 20 20    default:      
7410: 20 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 22       z = "UNION"
7420: 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;       break;. 
7430: 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d   }.  return z;.}
7440: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
7450: 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
7460: 53 45 4c 45 43 54 20 2a 2f 0a 0a 23 69 66 6e 64  SELECT */..#ifnd
7470: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  ef SQLITE_OMIT_E
7480: 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 55 6e 6c  XPLAIN./*.** Unl
7490: 65 73 73 20 61 6e 20 22 45 58 50 4c 41 49 4e 20  ess an "EXPLAIN 
74a0: 51 55 45 52 59 20 50 4c 41 4e 22 20 63 6f 6d 6d  QUERY PLAN" comm
74b0: 61 6e 64 20 69 73 20 62 65 69 6e 67 20 70 72 6f  and is being pro
74c0: 63 65 73 73 65 64 2c 20 74 68 69 73 20 66 75 6e  cessed, this fun
74d0: 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 61 20 6e 6f  ction.** is a no
74e0: 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  -op. Otherwise, 
74f0: 69 74 20 61 64 64 73 20 61 20 73 69 6e 67 6c 65  it adds a single
7500: 20 72 6f 77 20 6f 66 20 6f 75 74 70 75 74 20 74   row of output t
7510: 6f 20 74 68 65 20 45 51 50 20 72 65 73 75 6c 74  o the EQP result
7520: 2c 0a 2a 2a 20 77 68 65 72 65 20 74 68 65 20 63  ,.** where the c
7530: 61 70 74 69 6f 6e 20 69 73 20 6f 66 20 74 68 65  aption is of the
7540: 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 22   form:.**.**   "
7550: 55 53 45 20 54 45 4d 50 20 42 2d 54 52 45 45 20  USE TEMP B-TREE 
7560: 46 4f 52 20 78 78 78 22 0a 2a 2a 0a 2a 2a 20 77  FOR xxx".**.** w
7570: 68 65 72 65 20 78 78 78 20 69 73 20 6f 6e 65 20  here xxx is one 
7580: 6f 66 20 22 44 49 53 54 49 4e 43 54 22 2c 20 22  of "DISTINCT", "
7590: 4f 52 44 45 52 20 42 59 22 20 6f 72 20 22 47 52  ORDER BY" or "GR
75a0: 4f 55 50 20 42 59 22 2e 20 45 78 61 63 74 6c 79  OUP BY". Exactly
75b0: 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 64 65 74   which.** is det
75c0: 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 7a  ermined by the z
75d0: 55 73 61 67 65 20 61 72 67 75 6d 65 6e 74 2e 0a  Usage argument..
75e0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
75f0: 78 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65 28  xplainTempTable(
7600: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63  Parse *pParse, c
7610: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 73 61 67  onst char *zUsag
7620: 65 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65  e){.  if( pParse
7630: 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a  ->explain==2 ){.
7640: 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50      Vdbe *v = pP
7650: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 20  arse->pVdbe;.   
7660: 20 63 68 61 72 20 2a 7a 4d 73 67 20 3d 20 73 71   char *zMsg = sq
7670: 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 70 50 61  lite3MPrintf(pPa
7680: 72 73 65 2d 3e 64 62 2c 20 22 55 53 45 20 54 45  rse->db, "USE TE
7690: 4d 50 20 42 2d 54 52 45 45 20 46 4f 52 20 25 73  MP B-TREE FOR %s
76a0: 22 2c 20 7a 55 73 61 67 65 29 3b 0a 20 20 20 20  ", zUsage);.    
76b0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
76c0: 34 28 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c  4(v, OP_Explain,
76d0: 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74   pParse->iSelect
76e0: 49 64 2c 20 30 2c 20 30 2c 20 7a 4d 73 67 2c 20  Id, 0, 0, zMsg, 
76f0: 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d  P4_DYNAMIC);.  }
7700: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e  .}../*.** Assign
7710: 20 65 78 70 72 65 73 73 69 6f 6e 20 62 20 74 6f   expression b to
7720: 20 6c 76 61 6c 75 65 20 61 2e 20 41 20 73 65 63   lvalue a. A sec
7730: 6f 6e 64 2c 20 6e 6f 2d 6f 70 2c 20 76 65 72 73  ond, no-op, vers
7740: 69 6f 6e 20 6f 66 20 74 68 69 73 20 6d 61 63 72  ion of this macr
7750: 6f 0a 2a 2a 20 69 73 20 70 72 6f 76 69 64 65 64  o.** is provided
7760: 20 77 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4d 49   when SQLITE_OMI
7770: 54 5f 45 58 50 4c 41 49 4e 20 69 73 20 64 65 66  T_EXPLAIN is def
7780: 69 6e 65 64 2e 20 54 68 69 73 20 61 6c 6c 6f 77  ined. This allow
7790: 73 20 74 68 65 20 63 6f 64 65 0a 2a 2a 20 69 6e  s the code.** in
77a0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29   sqlite3Select()
77b0: 20 74 6f 20 61 73 73 69 67 6e 20 76 61 6c 75 65   to assign value
77c0: 73 20 74 6f 20 73 74 72 75 63 74 75 72 65 20 6d  s to structure m
77d0: 65 6d 62 65 72 20 76 61 72 69 61 62 6c 65 73 20  ember variables 
77e0: 74 68 61 74 0a 2a 2a 20 6f 6e 6c 79 20 65 78 69  that.** only exi
77f0: 73 74 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49  st if SQLITE_OMI
7800: 54 5f 45 58 50 4c 41 49 4e 20 69 73 20 6e 6f 74  T_EXPLAIN is not
7810: 20 64 65 66 69 6e 65 64 20 77 69 74 68 6f 75 74   defined without
7820: 20 70 6f 6c 6c 75 74 69 6e 67 20 74 68 65 0a 2a   polluting the.*
7830: 2a 20 63 6f 64 65 20 77 69 74 68 20 23 69 66 6e  * code with #ifn
7840: 64 65 66 20 64 69 72 65 63 74 69 76 65 73 2e 0a  def directives..
7850: 2a 2f 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c  */.# define expl
7860: 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 61 2c  ainSetInteger(a,
7870: 20 62 29 20 61 20 3d 20 62 0a 0a 23 65 6c 73 65   b) a = b..#else
7880: 0a 2f 2a 20 4e 6f 2d 6f 70 20 76 65 72 73 69 6f  ./* No-op versio
7890: 6e 73 20 6f 66 20 74 68 65 20 65 78 70 6c 61 69  ns of the explai
78a0: 6e 58 58 58 28 29 20 66 75 6e 63 74 69 6f 6e 73  nXXX() functions
78b0: 20 61 6e 64 20 6d 61 63 72 6f 73 2e 20 2a 2f 0a   and macros. */.
78c0: 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69 6e  # define explain
78d0: 54 65 6d 70 54 61 62 6c 65 28 79 2c 7a 29 0a 23  TempTable(y,z).#
78e0: 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69 6e 53   define explainS
78f0: 65 74 49 6e 74 65 67 65 72 28 79 2c 7a 29 0a 23  etInteger(y,z).#
7900: 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69  endif..#if !defi
7910: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
7920: 45 58 50 4c 41 49 4e 29 20 26 26 20 21 64 65 66  EXPLAIN) && !def
7930: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
7940: 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
7950: 29 0a 2f 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 61  )./*.** Unless a
7960: 6e 20 22 45 58 50 4c 41 49 4e 20 51 55 45 52 59  n "EXPLAIN QUERY
7970: 20 50 4c 41 4e 22 20 63 6f 6d 6d 61 6e 64 20 69   PLAN" command i
7980: 73 20 62 65 69 6e 67 20 70 72 6f 63 65 73 73 65  s being processe
7990: 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  d, this function
79a0: 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20  .** is a no-op. 
79b0: 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 61 64  Otherwise, it ad
79c0: 64 73 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20  ds a single row 
79d0: 6f 66 20 6f 75 74 70 75 74 20 74 6f 20 74 68 65  of output to the
79e0: 20 45 51 50 20 72 65 73 75 6c 74 2c 0a 2a 2a 20   EQP result,.** 
79f0: 77 68 65 72 65 20 74 68 65 20 63 61 70 74 69 6f  where the captio
7a00: 6e 20 69 73 20 6f 66 20 6f 6e 65 20 6f 66 20 74  n is of one of t
7a10: 68 65 20 74 77 6f 20 66 6f 72 6d 73 3a 0a 2a 2a  he two forms:.**
7a20: 0a 2a 2a 20 20 20 22 43 4f 4d 50 4f 53 49 54 45  .**   "COMPOSITE
7a30: 20 53 55 42 51 55 45 52 49 45 53 20 69 53 75 62   SUBQUERIES iSub
7a40: 31 20 61 6e 64 20 69 53 75 62 32 20 28 6f 70 29  1 and iSub2 (op)
7a50: 22 0a 2a 2a 20 20 20 22 43 4f 4d 50 4f 53 49 54  ".**   "COMPOSIT
7a60: 45 20 53 55 42 51 55 45 52 49 45 53 20 69 53 75  E SUBQUERIES iSu
7a70: 62 31 20 61 6e 64 20 69 53 75 62 32 20 55 53 49  b1 and iSub2 USI
7a80: 4e 47 20 54 45 4d 50 20 42 2d 54 52 45 45 20 28  NG TEMP B-TREE (
7a90: 6f 70 29 22 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65  op)".**.** where
7aa0: 20 69 53 75 62 31 20 61 6e 64 20 69 53 75 62 32   iSub1 and iSub2
7ab0: 20 61 72 65 20 74 68 65 20 69 6e 74 65 67 65 72   are the integer
7ac0: 73 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  s passed as the 
7ad0: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a  corresponding.**
7ae0: 20 66 75 6e 63 74 69 6f 6e 20 70 61 72 61 6d 65   function parame
7af0: 74 65 72 73 2c 20 61 6e 64 20 6f 70 20 69 73 20  ters, and op is 
7b00: 74 68 65 20 74 65 78 74 20 72 65 70 72 65 73 65  the text represe
7b10: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 70  ntation of the p
7b20: 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 66 20 74  arameter.** of t
7b30: 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20 54 68  he same name. Th
7b40: 65 20 70 61 72 61 6d 65 74 65 72 20 22 6f 70 22  e parameter "op"
7b50: 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66 20   must be one of 
7b60: 54 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f 45 58 43  TK_UNION, TK_EXC
7b70: 45 50 54 2c 0a 2a 2a 20 54 4b 5f 49 4e 54 45 52  EPT,.** TK_INTER
7b80: 53 45 43 54 20 6f 72 20 54 4b 5f 41 4c 4c 2e 20  SECT or TK_ALL. 
7b90: 54 68 65 20 66 69 72 73 74 20 66 6f 72 6d 20 69  The first form i
7ba0: 73 20 75 73 65 64 20 69 66 20 61 72 67 75 6d 65  s used if argume
7bb0: 6e 74 20 62 55 73 65 54 6d 70 20 69 73 20 0a 2a  nt bUseTmp is .*
7bc0: 2a 20 66 61 6c 73 65 2c 20 6f 72 20 74 68 65 20  * false, or the 
7bd0: 73 65 63 6f 6e 64 20 66 6f 72 6d 20 69 66 20 69  second form if i
7be0: 74 20 69 73 20 74 72 75 65 2e 0a 2a 2f 0a 73 74  t is true..*/.st
7bf0: 61 74 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69  atic void explai
7c00: 6e 43 6f 6d 70 6f 73 69 74 65 28 0a 20 20 50 61  nComposite(.  Pa
7c10: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
7c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7c30: 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a   Parse context *
7c40: 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20  /.  int op,     
7c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7c60: 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 54 4b      /* One of TK
7c70: 5f 55 4e 49 4f 4e 2c 20 54 4b 5f 45 58 43 45 50  _UNION, TK_EXCEP
7c80: 54 20 65 74 63 2e 20 2a 2f 0a 20 20 69 6e 74 20  T etc. */.  int 
7c90: 69 53 75 62 31 2c 20 20 20 20 20 20 20 20 20 20  iSub1,          
7ca0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
7cb0: 75 62 71 75 65 72 79 20 69 64 20 31 20 2a 2f 0a  ubquery id 1 */.
7cc0: 20 20 69 6e 74 20 69 53 75 62 32 2c 20 20 20 20    int iSub2,    
7cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ce0: 20 20 2f 2a 20 53 75 62 71 75 65 72 79 20 69 64    /* Subquery id
7cf0: 20 32 20 2a 2f 0a 20 20 69 6e 74 20 62 55 73 65   2 */.  int bUse
7d00: 54 6d 70 20 20 20 20 20 20 20 20 20 20 20 20 20  Tmp             
7d10: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
7d20: 69 66 20 61 20 74 65 6d 70 20 74 61 62 6c 65 20  if a temp table 
7d30: 77 61 73 20 75 73 65 64 20 2a 2f 0a 29 7b 0a 20  was used */.){. 
7d40: 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 54 4b 5f   assert( op==TK_
7d50: 55 4e 49 4f 4e 20 7c 7c 20 6f 70 3d 3d 54 4b 5f  UNION || op==TK_
7d60: 45 58 43 45 50 54 20 7c 7c 20 6f 70 3d 3d 54 4b  EXCEPT || op==TK
7d70: 5f 49 4e 54 45 52 53 45 43 54 20 7c 7c 20 6f 70  _INTERSECT || op
7d80: 3d 3d 54 4b 5f 41 4c 4c 20 29 3b 0a 20 20 69 66  ==TK_ALL );.  if
7d90: 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69  ( pParse->explai
7da0: 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 56 64 62 65  n==2 ){.    Vdbe
7db0: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
7dc0: 64 62 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  dbe;.    char *z
7dd0: 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  Msg = sqlite3MPr
7de0: 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 70 50  intf(.        pP
7df0: 61 72 73 65 2d 3e 64 62 2c 20 22 43 4f 4d 50 4f  arse->db, "COMPO
7e00: 55 4e 44 20 53 55 42 51 55 45 52 49 45 53 20 25  UND SUBQUERIES %
7e10: 64 20 41 4e 44 20 25 64 20 25 73 28 25 73 29 22  d AND %d %s(%s)"
7e20: 2c 20 69 53 75 62 31 2c 20 69 53 75 62 32 2c 0a  , iSub1, iSub2,.
7e30: 20 20 20 20 20 20 20 20 62 55 73 65 54 6d 70 3f          bUseTmp?
7e40: 22 55 53 49 4e 47 20 54 45 4d 50 20 42 2d 54 52  "USING TEMP B-TR
7e50: 45 45 20 22 3a 22 22 2c 20 73 65 6c 65 63 74 4f  EE ":"", selectO
7e60: 70 4e 61 6d 65 28 6f 70 29 0a 20 20 20 20 29 3b  pName(op).    );
7e70: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
7e80: 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45 78 70  AddOp4(v, OP_Exp
7e90: 6c 61 69 6e 2c 20 70 50 61 72 73 65 2d 3e 69 53  lain, pParse->iS
7ea0: 65 6c 65 63 74 49 64 2c 20 30 2c 20 30 2c 20 7a  electId, 0, 0, z
7eb0: 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29  Msg, P4_DYNAMIC)
7ec0: 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 2f 2a  ;.  }.}.#else./*
7ed0: 20 4e 6f 2d 6f 70 20 76 65 72 73 69 6f 6e 73 20   No-op versions 
7ee0: 6f 66 20 74 68 65 20 65 78 70 6c 61 69 6e 58 58  of the explainXX
7ef0: 58 28 29 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e  X() functions an
7f00: 64 20 6d 61 63 72 6f 73 2e 20 2a 2f 0a 23 20 64  d macros. */.# d
7f10: 65 66 69 6e 65 20 65 78 70 6c 61 69 6e 43 6f 6d  efine explainCom
7f20: 70 6f 73 69 74 65 28 76 2c 77 2c 78 2c 79 2c 7a  posite(v,w,x,y,z
7f30: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
7f40: 49 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f  If the inner loo
7f50: 70 20 77 61 73 20 67 65 6e 65 72 61 74 65 64 20  p was generated 
7f60: 75 73 69 6e 67 20 61 20 6e 6f 6e 2d 6e 75 6c 6c  using a non-null
7f70: 20 70 4f 72 64 65 72 42 79 20 61 72 67 75 6d 65   pOrderBy argume
7f80: 6e 74 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20  nt,.** then the 
7f90: 72 65 73 75 6c 74 73 20 77 65 72 65 20 70 6c 61  results were pla
7fa0: 63 65 64 20 69 6e 20 61 20 73 6f 72 74 65 72 2e  ced in a sorter.
7fb0: 20 20 41 66 74 65 72 20 74 68 65 20 6c 6f 6f 70    After the loop
7fc0: 20 69 73 20 74 65 72 6d 69 6e 61 74 65 64 0a 2a   is terminated.*
7fd0: 2a 20 77 65 20 6e 65 65 64 20 74 6f 20 72 75 6e  * we need to run
7fe0: 20 74 68 65 20 73 6f 72 74 65 72 20 61 6e 64 20   the sorter and 
7ff0: 6f 75 74 70 75 74 20 74 68 65 20 72 65 73 75 6c  output the resul
8000: 74 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  ts.  The followi
8010: 6e 67 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67 65  ng.** routine ge
8020: 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f 64 65  nerates the code
8030: 20 6e 65 65 64 65 64 20 74 6f 20 64 6f 20 74 68   needed to do th
8040: 61 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  at..*/.static vo
8050: 69 64 20 67 65 6e 65 72 61 74 65 53 6f 72 74 54  id generateSortT
8060: 61 69 6c 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ail(.  Parse *pP
8070: 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73  arse,    /* Pars
8080: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
8090: 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
80a0: 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54     /* The SELECT
80b0: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
80c0: 56 64 62 65 20 2a 76 2c 20 20 20 20 20 20 20 20  Vdbe *v,        
80d0: 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
80e0: 64 65 20 69 6e 74 6f 20 74 68 69 73 20 56 44 42  de into this VDB
80f0: 45 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 75  E */.  int nColu
8100: 6d 6e 2c 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62  mn,      /* Numb
8110: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 6f 66  er of columns of
8120: 20 64 61 74 61 20 2a 2f 0a 20 20 53 65 6c 65 63   data */.  Selec
8130: 74 44 65 73 74 20 2a 70 44 65 73 74 20 2f 2a 20  tDest *pDest /* 
8140: 57 72 69 74 65 20 74 68 65 20 73 6f 72 74 65 64  Write the sorted
8150: 20 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f   results here */
8160: 0a 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 42 72  .){.  int addrBr
8170: 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62  eak = sqlite3Vdb
8180: 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 20 20  eMakeLabel(v);  
8190: 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
81a0: 74 6f 20 65 78 69 74 20 6c 6f 6f 70 20 2a 2f 0a  to exit loop */.
81b0: 20 20 69 6e 74 20 61 64 64 72 43 6f 6e 74 69 6e    int addrContin
81c0: 75 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ue = sqlite3Vdbe
81d0: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 20 20 2f  MakeLabel(v);  /
81e0: 2a 20 4a 75 6d 70 20 68 65 72 65 20 66 6f 72 20  * Jump here for 
81f0: 6e 65 78 74 20 63 79 63 6c 65 20 2a 2f 0a 20 20  next cycle */.  
8200: 69 6e 74 20 61 64 64 72 3b 0a 20 20 69 6e 74 20  int addr;.  int 
8210: 69 54 61 62 3b 0a 20 20 69 6e 74 20 70 73 65 75  iTab;.  int pseu
8220: 64 6f 54 61 62 20 3d 20 30 3b 0a 20 20 45 78 70  doTab = 0;.  Exp
8230: 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20  rList *pOrderBy 
8240: 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 0a  = p->pOrderBy;..
8250: 20 20 69 6e 74 20 65 44 65 73 74 20 3d 20 70 44    int eDest = pD
8260: 65 73 74 2d 3e 65 44 65 73 74 3b 0a 20 20 69 6e  est->eDest;.  in
8270: 74 20 69 50 61 72 6d 20 3d 20 70 44 65 73 74 2d  t iParm = pDest-
8280: 3e 69 53 44 50 61 72 6d 3b 0a 0a 20 20 69 6e 74  >iSDParm;..  int
8290: 20 72 65 67 52 6f 77 3b 0a 20 20 69 6e 74 20 72   regRow;.  int r
82a0: 65 67 52 6f 77 69 64 3b 0a 0a 20 20 69 54 61 62  egRowid;..  iTab
82b0: 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43   = pOrderBy->iEC
82c0: 75 72 73 6f 72 3b 0a 20 20 72 65 67 52 6f 77 20  ursor;.  regRow 
82d0: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
82e0: 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 69  Reg(pParse);.  i
82f0: 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75  f( eDest==SRT_Ou
8300: 74 70 75 74 20 7c 7c 20 65 44 65 73 74 3d 3d 53  tput || eDest==S
8310: 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a  RT_Coroutine ){.
8320: 20 20 20 20 70 73 65 75 64 6f 54 61 62 20 3d 20      pseudoTab = 
8330: 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
8340: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
8350: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp3(v, OP_Open
8360: 50 73 65 75 64 6f 2c 20 70 73 65 75 64 6f 54 61  Pseudo, pseudoTa
8370: 62 2c 20 72 65 67 52 6f 77 2c 20 6e 43 6f 6c 75  b, regRow, nColu
8380: 6d 6e 29 3b 0a 20 20 20 20 72 65 67 52 6f 77 69  mn);.    regRowi
8390: 64 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  d = 0;.  }else{.
83a0: 20 20 20 20 72 65 67 52 6f 77 69 64 20 3d 20 73      regRowid = s
83b0: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
83c0: 28 70 50 61 72 73 65 29 3b 0a 20 20 7d 0a 20 20  (pParse);.  }.  
83d0: 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  if( p->selFlags 
83e0: 26 20 53 46 5f 55 73 65 53 6f 72 74 65 72 20 29  & SF_UseSorter )
83f0: 7b 0a 20 20 20 20 69 6e 74 20 72 65 67 53 6f 72  {.    int regSor
8400: 74 4f 75 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d  tOut = ++pParse-
8410: 3e 6e 4d 65 6d 3b 0a 20 20 20 20 69 6e 74 20 70  >nMem;.    int p
8420: 74 61 62 32 20 3d 20 70 50 61 72 73 65 2d 3e 6e  tab2 = pParse->n
8430: 54 61 62 2b 2b 3b 0a 20 20 20 20 73 71 6c 69 74  Tab++;.    sqlit
8440: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
8450: 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f 2c 20 70  OP_OpenPseudo, p
8460: 74 61 62 32 2c 20 72 65 67 53 6f 72 74 4f 75 74  tab2, regSortOut
8470: 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  , pOrderBy->nExp
8480: 72 2b 32 29 3b 0a 20 20 20 20 61 64 64 72 20 3d  r+2);.    addr =
8490: 20 31 20 2b 20 73 71 6c 69 74 65 33 56 64 62 65   1 + sqlite3Vdbe
84a0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72  AddOp2(v, OP_Sor
84b0: 74 65 72 53 6f 72 74 2c 20 69 54 61 62 2c 20 61  terSort, iTab, a
84c0: 64 64 72 42 72 65 61 6b 29 3b 0a 20 20 20 20 63  ddrBreak);.    c
84d0: 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2c 20  odeOffset(v, p, 
84e0: 61 64 64 72 43 6f 6e 74 69 6e 75 65 29 3b 0a 20  addrContinue);. 
84f0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
8500: 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65  dOp2(v, OP_Sorte
8510: 72 44 61 74 61 2c 20 69 54 61 62 2c 20 72 65 67  rData, iTab, reg
8520: 53 6f 72 74 4f 75 74 29 3b 0a 20 20 20 20 73 71  SortOut);.    sq
8530: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
8540: 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 74  v, OP_Column, pt
8550: 61 62 32 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e  ab2, pOrderBy->n
8560: 45 78 70 72 2b 31 2c 20 72 65 67 52 6f 77 29 3b  Expr+1, regRow);
8570: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
8580: 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
8590: 41 47 5f 43 4c 45 41 52 43 41 43 48 45 29 3b 0a  AG_CLEARCACHE);.
85a0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 64 64    }else{.    add
85b0: 72 20 3d 20 31 20 2b 20 73 71 6c 69 74 65 33 56  r = 1 + sqlite3V
85c0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
85d0: 53 6f 72 74 2c 20 69 54 61 62 2c 20 61 64 64 72  Sort, iTab, addr
85e0: 42 72 65 61 6b 29 3b 0a 20 20 20 20 63 6f 64 65  Break);.    code
85f0: 4f 66 66 73 65 74 28 76 2c 20 70 2c 20 61 64 64  Offset(v, p, add
8600: 72 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20  rContinue);.    
8610: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
8620: 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  3(v, OP_Column, 
8630: 69 54 61 62 2c 20 70 4f 72 64 65 72 42 79 2d 3e  iTab, pOrderBy->
8640: 6e 45 78 70 72 2b 31 2c 20 72 65 67 52 6f 77 29  nExpr+1, regRow)
8650: 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63 68 28 20  ;.  }.  switch( 
8660: 65 44 65 73 74 20 29 7b 0a 20 20 20 20 63 61 73  eDest ){.    cas
8670: 65 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20  e SRT_Table:.   
8680: 20 63 61 73 65 20 53 52 54 5f 45 70 68 65 6d 54   case SRT_EphemT
8690: 61 62 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74  ab: {.      test
86a0: 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54  case( eDest==SRT
86b0: 5f 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 20 20  _Table );.      
86c0: 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d  testcase( eDest=
86d0: 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29 3b  =SRT_EphemTab );
86e0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
86f0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
8700: 65 77 52 6f 77 69 64 2c 20 69 50 61 72 6d 2c 20  ewRowid, iParm, 
8710: 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  regRowid);.     
8720: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
8730: 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c  p3(v, OP_Insert,
8740: 20 69 50 61 72 6d 2c 20 72 65 67 52 6f 77 2c 20   iParm, regRow, 
8750: 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  regRowid);.     
8760: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
8770: 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41  geP5(v, OPFLAG_A
8780: 50 50 45 4e 44 29 3b 0a 20 20 20 20 20 20 62 72  PPEND);.      br
8790: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  eak;.    }.#ifnd
87a0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
87b0: 55 42 51 55 45 52 59 0a 20 20 20 20 63 61 73 65  UBQUERY.    case
87c0: 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20   SRT_Set: {.    
87d0: 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d    assert( nColum
87e0: 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71  n==1 );.      sq
87f0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
8800: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
8810: 2c 20 72 65 67 52 6f 77 2c 20 31 2c 20 72 65 67  , regRow, 1, reg
8820: 52 6f 77 69 64 2c 0a 20 20 20 20 20 20 20 20 20  Rowid,.         
8830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
8840: 70 44 65 73 74 2d 3e 61 66 66 53 64 73 74 2c 20  pDest->affSdst, 
8850: 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
8860: 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69  3ExprCacheAffini
8870: 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c  tyChange(pParse,
8880: 20 72 65 67 52 6f 77 2c 20 31 29 3b 0a 20 20 20   regRow, 1);.   
8890: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
88a0: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e  dOp2(v, OP_IdxIn
88b0: 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 65 67  sert, iParm, reg
88c0: 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 62 72  Rowid);.      br
88d0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
88e0: 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20  ase SRT_Mem: {. 
88f0: 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f       assert( nCo
8900: 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20  lumn==1 );.     
8910: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
8920: 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 72 65 67  Move(pParse, reg
8930: 52 6f 77 2c 20 69 50 61 72 6d 2c 20 31 29 3b 0a  Row, iParm, 1);.
8940: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d        /* The LIM
8950: 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 74  IT clause will t
8960: 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f  erminate the loo
8970: 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20  p for us */.    
8980: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
8990: 65 6e 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c  endif.    defaul
89a0: 74 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  t: {.      int i
89b0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
89c0: 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75  eDest==SRT_Outpu
89d0: 74 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f  t || eDest==SRT_
89e0: 43 6f 72 6f 75 74 69 6e 65 20 29 3b 20 0a 20 20  Coroutine ); .  
89f0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44      testcase( eD
8a00: 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20  est==SRT_Output 
8a10: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
8a20: 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f  e( eDest==SRT_Co
8a30: 72 6f 75 74 69 6e 65 20 29 3b 0a 20 20 20 20 20  routine );.     
8a40: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c   for(i=0; i<nCol
8a50: 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  umn; i++){.     
8a60: 20 20 20 61 73 73 65 72 74 28 20 72 65 67 52 6f     assert( regRo
8a70: 77 21 3d 70 44 65 73 74 2d 3e 69 53 64 73 74 2b  w!=pDest->iSdst+
8a80: 69 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  i );.        sql
8a90: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
8aa0: 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 73 65  , OP_Column, pse
8ab0: 75 64 6f 54 61 62 2c 20 69 2c 20 70 44 65 73 74  udoTab, i, pDest
8ac0: 2d 3e 69 53 64 73 74 2b 69 29 3b 0a 20 20 20 20  ->iSdst+i);.    
8ad0: 20 20 20 20 69 66 28 20 69 3d 3d 30 20 29 7b 0a      if( i==0 ){.
8ae0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
8af0: 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
8b00: 20 4f 50 46 4c 41 47 5f 43 4c 45 41 52 43 41 43   OPFLAG_CLEARCAC
8b10: 48 45 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  HE);.        }. 
8b20: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
8b30: 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70   eDest==SRT_Outp
8b40: 75 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ut ){.        sq
8b50: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
8b60: 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c  v, OP_ResultRow,
8b70: 20 70 44 65 73 74 2d 3e 69 53 64 73 74 2c 20 6e   pDest->iSdst, n
8b80: 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20  Column);.       
8b90: 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
8ba0: 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  eAffinityChange(
8bb0: 70 50 61 72 73 65 2c 20 70 44 65 73 74 2d 3e 69  pParse, pDest->i
8bc0: 53 64 73 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a  Sdst, nColumn);.
8bd0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
8be0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
8bf0: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65  AddOp1(v, OP_Yie
8c00: 6c 64 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61  ld, pDest->iSDPa
8c10: 72 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rm);.      }.   
8c20: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
8c30: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c    }.  sqlite3Rel
8c40: 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
8c50: 73 65 2c 20 72 65 67 52 6f 77 29 3b 0a 20 20 73  se, regRow);.  s
8c60: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
8c70: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
8c80: 52 6f 77 69 64 29 3b 0a 0a 20 20 2f 2a 20 54 68  Rowid);..  /* Th
8c90: 65 20 62 6f 74 74 6f 6d 20 6f 66 20 74 68 65 20  e bottom of the 
8ca0: 6c 6f 6f 70 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  loop.  */.  sqli
8cb0: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
8cc0: 62 65 6c 28 76 2c 20 61 64 64 72 43 6f 6e 74 69  bel(v, addrConti
8cd0: 6e 75 65 29 3b 0a 20 20 69 66 28 20 70 2d 3e 73  nue);.  if( p->s
8ce0: 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 55 73 65  elFlags & SF_Use
8cf0: 53 6f 72 74 65 72 20 29 7b 0a 20 20 20 20 73 71  Sorter ){.    sq
8d00: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
8d10: 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4e 65 78 74  v, OP_SorterNext
8d20: 2c 20 69 54 61 62 2c 20 61 64 64 72 29 3b 0a 20  , iTab, addr);. 
8d30: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
8d40: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
8d50: 20 4f 50 5f 4e 65 78 74 2c 20 69 54 61 62 2c 20   OP_Next, iTab, 
8d60: 61 64 64 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  addr);.  }.  sql
8d70: 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
8d80: 61 62 65 6c 28 76 2c 20 61 64 64 72 42 72 65 61  abel(v, addrBrea
8d90: 6b 29 3b 0a 20 20 69 66 28 20 65 44 65 73 74 3d  k);.  if( eDest=
8da0: 3d 53 52 54 5f 4f 75 74 70 75 74 20 7c 7c 20 65  =SRT_Output || e
8db0: 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74  Dest==SRT_Corout
8dc0: 69 6e 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ine ){.    sqlit
8dd0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
8de0: 4f 50 5f 43 6c 6f 73 65 2c 20 70 73 65 75 64 6f  OP_Close, pseudo
8df0: 54 61 62 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a  Tab, 0);.  }.}..
8e00: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  /*.** Return a p
8e10: 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74 72 69  ointer to a stri
8e20: 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ng containing th
8e30: 65 20 27 64 65 63 6c 61 72 61 74 69 6f 6e 20 74  e 'declaration t
8e40: 79 70 65 27 20 6f 66 20 74 68 65 0a 2a 2a 20 65  ype' of the.** e
8e50: 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e  xpression pExpr.
8e60: 20 54 68 65 20 73 74 72 69 6e 67 20 6d 61 79 20   The string may 
8e70: 62 65 20 74 72 65 61 74 65 64 20 61 73 20 73 74  be treated as st
8e80: 61 74 69 63 20 62 79 20 74 68 65 20 63 61 6c 6c  atic by the call
8e90: 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65  er..**.** The de
8ea0: 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20 69  claration type i
8eb0: 73 20 74 68 65 20 65 78 61 63 74 20 64 61 74 61  s the exact data
8ec0: 74 79 70 65 20 64 65 66 69 6e 69 74 69 6f 6e 20  type definition 
8ed0: 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74  extracted from t
8ee0: 68 65 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 43  he.** original C
8ef0: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
8f00: 65 6d 65 6e 74 20 69 66 20 74 68 65 20 65 78 70  ement if the exp
8f10: 72 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c  ression is a col
8f20: 75 6d 6e 2e 20 54 68 65 0a 2a 2a 20 64 65 63 6c  umn. The.** decl
8f30: 61 72 61 74 69 6f 6e 20 74 79 70 65 20 66 6f 72  aration type for
8f40: 20 61 20 52 4f 57 49 44 20 66 69 65 6c 64 20 69   a ROWID field i
8f50: 73 20 49 4e 54 45 47 45 52 2e 20 45 78 61 63 74  s INTEGER. Exact
8f60: 6c 79 20 77 68 65 6e 20 61 6e 20 65 78 70 72 65  ly when an expre
8f70: 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6e 73  ssion.** is cons
8f80: 69 64 65 72 65 64 20 61 20 63 6f 6c 75 6d 6e 20  idered a column 
8f90: 63 61 6e 20 62 65 20 63 6f 6d 70 6c 65 78 20 69  can be complex i
8fa0: 6e 20 74 68 65 20 70 72 65 73 65 6e 63 65 20 6f  n the presence o
8fb0: 66 20 73 75 62 71 75 65 72 69 65 73 2e 20 54 68  f subqueries. Th
8fc0: 65 0a 2a 2a 20 72 65 73 75 6c 74 2d 73 65 74 20  e.** result-set 
8fd0: 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 61 6c  expression in al
8fe0: 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  l of the followi
8ff0: 6e 67 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  ng SELECT statem
9000: 65 6e 74 73 20 69 73 20 0a 2a 2a 20 63 6f 6e 73  ents is .** cons
9010: 69 64 65 72 65 64 20 61 20 63 6f 6c 75 6d 6e 20  idered a column 
9020: 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
9030: 2e 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54  ..**.**   SELECT
9040: 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b 0a 2a   col FROM tbl;.*
9050: 2a 20 20 20 53 45 4c 45 43 54 20 28 53 45 4c 45  *   SELECT (SELE
9060: 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b  CT col FROM tbl;
9070: 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 28 53 45  .**   SELECT (SE
9080: 4c 45 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62  LECT col FROM tb
9090: 6c 29 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20  l);.**   SELECT 
90a0: 61 62 63 20 46 52 4f 4d 20 28 53 45 4c 45 43 54  abc FROM (SELECT
90b0: 20 63 6f 6c 20 41 53 20 61 62 63 20 46 52 4f 4d   col AS abc FROM
90c0: 20 74 62 6c 29 3b 0a 2a 2a 20 0a 2a 2a 20 54 68   tbl);.** .** Th
90d0: 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79  e declaration ty
90e0: 70 65 20 66 6f 72 20 61 6e 79 20 65 78 70 72 65  pe for any expre
90f0: 73 73 69 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e  ssion other than
9100: 20 61 20 63 6f 6c 75 6d 6e 20 69 73 20 4e 55 4c   a column is NUL
9110: 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  L..*/.static con
9120: 73 74 20 63 68 61 72 20 2a 63 6f 6c 75 6d 6e 54  st char *columnT
9130: 79 70 65 28 0a 20 20 4e 61 6d 65 43 6f 6e 74 65  ype(.  NameConte
9140: 78 74 20 2a 70 4e 43 2c 20 0a 20 20 45 78 70 72  xt *pNC, .  Expr
9150: 20 2a 70 45 78 70 72 2c 0a 20 20 63 6f 6e 73 74   *pExpr,.  const
9160: 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67 69 6e   char **pzOrigin
9170: 44 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  Db,.  const char
9180: 20 2a 2a 70 7a 4f 72 69 67 69 6e 54 61 62 2c 0a   **pzOriginTab,.
9190: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70    const char **p
91a0: 7a 4f 72 69 67 69 6e 43 6f 6c 0a 29 7b 0a 20 20  zOriginCol.){.  
91b0: 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 54 79 70  char const *zTyp
91c0: 65 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 63 6f  e = 0;.  char co
91d0: 6e 73 74 20 2a 7a 4f 72 69 67 69 6e 44 62 20 3d  nst *zOriginDb =
91e0: 20 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74   0;.  char const
91f0: 20 2a 7a 4f 72 69 67 69 6e 54 61 62 20 3d 20 30   *zOriginTab = 0
9200: 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a  ;.  char const *
9210: 7a 4f 72 69 67 69 6e 43 6f 6c 20 3d 20 30 3b 0a  zOriginCol = 0;.
9220: 20 20 69 6e 74 20 6a 3b 0a 20 20 69 66 28 20 4e    int j;.  if( N
9230: 45 56 45 52 28 70 45 78 70 72 3d 3d 30 29 20 7c  EVER(pExpr==0) |
9240: 7c 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3d  | pNC->pSrcList=
9250: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a  =0 ) return 0;..
9260: 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d    switch( pExpr-
9270: 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20  >op ){.    case 
9280: 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20  TK_AGG_COLUMN:. 
9290: 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d     case TK_COLUM
92a0: 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  N: {.      /* Th
92b0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
92c0: 61 20 63 6f 6c 75 6d 6e 2e 20 4c 6f 63 61 74 65  a column. Locate
92d0: 20 74 68 65 20 74 61 62 6c 65 20 74 68 65 20 63   the table the c
92e0: 6f 6c 75 6d 6e 20 69 73 20 62 65 69 6e 67 0a 20  olumn is being. 
92f0: 20 20 20 20 20 2a 2a 20 65 78 74 72 61 63 74 65       ** extracte
9300: 64 20 66 72 6f 6d 20 69 6e 20 4e 61 6d 65 43 6f  d from in NameCo
9310: 6e 74 65 78 74 2e 70 53 72 63 4c 69 73 74 2e 20  ntext.pSrcList. 
9320: 54 68 69 73 20 74 61 62 6c 65 20 6d 61 79 20 62  This table may b
9330: 65 20 72 65 61 6c 0a 20 20 20 20 20 20 2a 2a 20  e real.      ** 
9340: 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 20 6f  database table o
9350: 72 20 61 20 73 75 62 71 75 65 72 79 2e 0a 20 20  r a subquery..  
9360: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 54 61 62      */.      Tab
9370: 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b 20 20 20  le *pTab = 0;   
9380: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
9390: 65 20 73 74 72 75 63 74 75 72 65 20 63 6f 6c 75  e structure colu
93a0: 6d 6e 20 69 73 20 65 78 74 72 61 63 74 65 64 20  mn is extracted 
93b0: 66 72 6f 6d 20 2a 2f 0a 20 20 20 20 20 20 53 65  from */.      Se
93c0: 6c 65 63 74 20 2a 70 53 20 3d 20 30 3b 20 20 20  lect *pS = 0;   
93d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 6c            /* Sel
93e0: 65 63 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69  ect the column i
93f0: 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  s extracted from
9400: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 43   */.      int iC
9410: 6f 6c 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c  ol = pExpr->iCol
9420: 75 6d 6e 3b 20 20 2f 2a 20 49 6e 64 65 78 20 6f  umn;  /* Index o
9430: 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 54 61 62  f column in pTab
9440: 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61   */.      testca
9450: 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
9460: 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a  K_AGG_COLUMN );.
9470: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
9480: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pExpr->op==TK_CO
9490: 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 77 68  LUMN );.      wh
94a0: 69 6c 65 28 20 70 4e 43 20 26 26 20 21 70 54 61  ile( pNC && !pTa
94b0: 62 20 29 7b 0a 20 20 20 20 20 20 20 20 53 72 63  b ){.        Src
94c0: 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 20 3d  List *pTabList =
94d0: 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a   pNC->pSrcList;.
94e0: 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b          for(j=0;
94f0: 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  j<pTabList->nSrc
9500: 20 26 26 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b   && pTabList->a[
9510: 6a 5d 2e 69 43 75 72 73 6f 72 21 3d 70 45 78 70  j].iCursor!=pExp
9520: 72 2d 3e 69 54 61 62 6c 65 3b 6a 2b 2b 29 3b 0a  r->iTable;j++);.
9530: 20 20 20 20 20 20 20 20 69 66 28 20 6a 3c 70 54          if( j<pT
9540: 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 7b 0a  abList->nSrc ){.
9550: 20 20 20 20 20 20 20 20 20 20 70 54 61 62 20 3d            pTab =
9560: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e   pTabList->a[j].
9570: 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20  pTab;.          
9580: 70 53 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61  pS = pTabList->a
9590: 5b 6a 5d 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20  [j].pSelect;.   
95a0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
95b0: 20 20 20 20 20 20 70 4e 43 20 3d 20 70 4e 43 2d        pNC = pNC-
95c0: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20  >pNext;.        
95d0: 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  }.      }..     
95e0: 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a   if( pTab==0 ){.
95f0: 20 20 20 20 20 20 20 20 2f 2a 20 41 74 20 6f 6e          /* At on
9600: 65 20 74 69 6d 65 2c 20 63 6f 64 65 20 73 75 63  e time, code suc
9610: 68 20 61 73 20 22 53 45 4c 45 43 54 20 6e 65 77  h as "SELECT new
9620: 2e 78 22 20 77 69 74 68 69 6e 20 61 20 74 72 69  .x" within a tri
9630: 67 67 65 72 20 77 6f 75 6c 64 0a 20 20 20 20 20  gger would.     
9640: 20 20 20 2a 2a 20 63 61 75 73 65 20 74 68 69 73     ** cause this
9650: 20 63 6f 6e 64 69 74 69 6f 6e 20 74 6f 20 72 75   condition to ru
9660: 6e 2e 20 20 53 69 6e 63 65 20 74 68 65 6e 2c 20  n.  Since then, 
9670: 77 65 20 68 61 76 65 20 72 65 73 74 72 75 63 74  we have restruct
9680: 75 72 65 64 20 68 6f 77 0a 20 20 20 20 20 20 20  ured how.       
9690: 20 2a 2a 20 74 72 69 67 67 65 72 20 63 6f 64 65   ** trigger code
96a0: 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 61 6e   is generated an
96b0: 64 20 73 6f 20 74 68 69 73 20 63 6f 6e 64 69 74  d so this condit
96c0: 69 6f 6e 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72  ion is no longer
96d0: 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 73   .        ** pos
96e0: 73 69 62 6c 65 2e 20 48 6f 77 65 76 65 72 2c 20  sible. However, 
96f0: 69 74 20 63 61 6e 20 73 74 69 6c 6c 20 62 65 20  it can still be 
9700: 74 72 75 65 20 66 6f 72 20 73 74 61 74 65 6d 65  true for stateme
9710: 6e 74 73 20 6c 69 6b 65 0a 20 20 20 20 20 20 20  nts like.       
9720: 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   ** the followin
9730: 67 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  g:.        **.  
9740: 20 20 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54        **   CREAT
9750: 45 20 54 41 42 4c 45 20 74 31 28 63 6f 6c 20 49  E TABLE t1(col I
9760: 4e 54 45 47 45 52 29 3b 0a 20 20 20 20 20 20 20  NTEGER);.       
9770: 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 28 53 45   **   SELECT (SE
9780: 4c 45 43 54 20 74 31 2e 63 6f 6c 29 20 46 52 4f  LECT t1.col) FRO
9790: 4d 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 20  M FROM t1;.     
97a0: 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
97b0: 20 77 68 65 6e 20 63 6f 6c 75 6d 6e 54 79 70 65   when columnType
97c0: 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20  () is called on 
97d0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 22  the expression "
97e0: 74 31 2e 63 6f 6c 22 20 69 6e 20 74 68 65 20 0a  t1.col" in the .
97f0: 20 20 20 20 20 20 20 20 2a 2a 20 73 75 62 2d 73          ** sub-s
9800: 65 6c 65 63 74 2e 20 49 6e 20 74 68 69 73 20 63  elect. In this c
9810: 61 73 65 2c 20 73 65 74 20 74 68 65 20 63 6f 6c  ase, set the col
9820: 75 6d 6e 20 74 79 70 65 20 74 6f 20 4e 55 4c 4c  umn type to NULL
9830: 2c 20 65 76 65 6e 0a 20 20 20 20 20 20 20 20 2a  , even.        *
9840: 2a 20 74 68 6f 75 67 68 20 69 74 20 73 68 6f 75  * though it shou
9850: 6c 64 20 72 65 61 6c 6c 79 20 62 65 20 22 49 4e  ld really be "IN
9860: 54 45 47 45 52 22 2e 0a 20 20 20 20 20 20 20 20  TEGER"..        
9870: 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68  **.        ** Th
9880: 69 73 20 69 73 20 6e 6f 74 20 61 20 70 72 6f 62  is is not a prob
9890: 6c 65 6d 2c 20 61 73 20 74 68 65 20 63 6f 6c 75  lem, as the colu
98a0: 6d 6e 20 74 79 70 65 20 6f 66 20 22 74 31 2e 63  mn type of "t1.c
98b0: 6f 6c 22 20 69 73 20 6e 65 76 65 72 0a 20 20 20  ol" is never.   
98c0: 20 20 20 20 20 2a 2a 20 75 73 65 64 2e 20 57 68       ** used. Wh
98d0: 65 6e 20 63 6f 6c 75 6d 6e 54 79 70 65 28 29 20  en columnType() 
98e0: 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65  is called on the
98f0: 20 65 78 70 72 65 73 73 69 6f 6e 20 0a 20 20 20   expression .   
9900: 20 20 20 20 20 2a 2a 20 22 28 53 45 4c 45 43 54       ** "(SELECT
9910: 20 74 31 2e 63 6f 6c 29 22 2c 20 74 68 65 20 63   t1.col)", the c
9920: 6f 72 72 65 63 74 20 74 79 70 65 20 69 73 20 72  orrect type is r
9930: 65 74 75 72 6e 65 64 20 28 73 65 65 20 74 68 65  eturned (see the
9940: 20 54 4b 5f 53 45 4c 45 43 54 0a 20 20 20 20 20   TK_SELECT.     
9950: 20 20 20 2a 2a 20 62 72 61 6e 63 68 20 62 65 6c     ** branch bel
9960: 6f 77 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  ow.  */.        
9970: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a  break;.      }..
9980: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
9990: 61 62 20 26 26 20 70 45 78 70 72 2d 3e 70 54 61  ab && pExpr->pTa
99a0: 62 3d 3d 70 54 61 62 20 29 3b 0a 20 20 20 20 20  b==pTab );.     
99b0: 20 69 66 28 20 70 53 20 29 7b 0a 20 20 20 20 20   if( pS ){.     
99c0: 20 20 20 2f 2a 20 54 68 65 20 22 74 61 62 6c 65     /* The "table
99d0: 22 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61 20  " is actually a 
99e0: 73 75 62 2d 73 65 6c 65 63 74 20 6f 72 20 61 20  sub-select or a 
99f0: 76 69 65 77 20 69 6e 20 74 68 65 20 46 52 4f 4d  view in the FROM
9a00: 20 63 6c 61 75 73 65 0a 20 20 20 20 20 20 20 20   clause.        
9a10: 2a 2a 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  ** of the SELECT
9a20: 20 73 74 61 74 65 6d 65 6e 74 2e 20 52 65 74 75   statement. Retu
9a30: 72 6e 20 74 68 65 20 64 65 63 6c 61 72 61 74 69  rn the declarati
9a40: 6f 6e 20 74 79 70 65 20 61 6e 64 20 6f 72 69 67  on type and orig
9a50: 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 61  in.        ** da
9a60: 74 61 20 66 6f 72 20 74 68 65 20 72 65 73 75 6c  ta for the resul
9a70: 74 2d 73 65 74 20 63 6f 6c 75 6d 6e 20 6f 66 20  t-set column of 
9a80: 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74 2e 0a  the sub-select..
9a90: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
9aa0: 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 26     if( iCol>=0 &
9ab0: 26 20 41 4c 57 41 59 53 28 69 43 6f 6c 3c 70 53  & ALWAYS(iCol<pS
9ac0: 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29  ->pEList->nExpr)
9ad0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
9ae0: 20 49 66 20 69 43 6f 6c 20 69 73 20 6c 65 73 73   If iCol is less
9af0: 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e   than zero, then
9b00: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
9b10: 72 65 71 75 65 73 74 73 20 74 68 65 0a 20 20 20  requests the.   
9b20: 20 20 20 20 20 20 20 2a 2a 20 72 6f 77 69 64 20         ** rowid 
9b30: 6f 66 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63  of the sub-selec
9b40: 74 20 6f 72 20 76 69 65 77 2e 20 54 68 69 73 20  t or view. This 
9b50: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6c 65  expression is le
9b60: 67 61 6c 20 28 73 65 65 20 0a 20 20 20 20 20 20  gal (see .      
9b70: 20 20 20 20 2a 2a 20 74 65 73 74 20 63 61 73 65      ** test case
9b80: 20 6d 69 73 63 32 2e 32 2e 32 29 20 2d 20 69 74   misc2.2.2) - it
9b90: 20 61 6c 77 61 79 73 20 65 76 61 6c 75 61 74 65   always evaluate
9ba0: 73 20 74 6f 20 4e 55 4c 4c 2e 0a 20 20 20 20 20  s to NULL..     
9bb0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
9bc0: 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e    NameContext sN
9bd0: 43 3b 0a 20 20 20 20 20 20 20 20 20 20 45 78 70  C;.          Exp
9be0: 72 20 2a 70 20 3d 20 70 53 2d 3e 70 45 4c 69 73  r *p = pS->pELis
9bf0: 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78 70 72  t->a[iCol].pExpr
9c00: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 4e 43 2e  ;.          sNC.
9c10: 70 53 72 63 4c 69 73 74 20 3d 20 70 53 2d 3e 70  pSrcList = pS->p
9c20: 53 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73  Src;.          s
9c30: 4e 43 2e 70 4e 65 78 74 20 3d 20 70 4e 43 3b 0a  NC.pNext = pNC;.
9c40: 20 20 20 20 20 20 20 20 20 20 73 4e 43 2e 70 50            sNC.pP
9c50: 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72  arse = pNC->pPar
9c60: 73 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 54  se;.          zT
9c70: 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65  ype = columnType
9c80: 28 26 73 4e 43 2c 20 70 2c 20 26 7a 4f 72 69 67  (&sNC, p, &zOrig
9c90: 69 6e 44 62 2c 20 26 7a 4f 72 69 67 69 6e 54 61  inDb, &zOriginTa
9ca0: 62 2c 20 26 7a 4f 72 69 67 69 6e 43 6f 6c 29 3b  b, &zOriginCol);
9cb0: 20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20   .        }.    
9cc0: 20 20 7d 65 6c 73 65 20 69 66 28 20 41 4c 57 41    }else if( ALWA
9cd0: 59 53 28 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  YS(pTab->pSchema
9ce0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
9cf0: 41 20 72 65 61 6c 20 74 61 62 6c 65 20 2a 2f 0a  A real table */.
9d00: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
9d10: 21 70 53 20 29 3b 0a 20 20 20 20 20 20 20 20 69  !pS );.        i
9d20: 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c  f( iCol<0 ) iCol
9d30: 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a   = pTab->iPKey;.
9d40: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
9d50: 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f  iCol==-1 || (iCo
9d60: 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61  l>=0 && iCol<pTa
9d70: 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20 20 20  b->nCol) );.    
9d80: 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29      if( iCol<0 )
9d90: 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79 70  {.          zTyp
9da0: 65 20 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a 20  e = "INTEGER";. 
9db0: 20 20 20 20 20 20 20 20 20 7a 4f 72 69 67 69 6e           zOrigin
9dc0: 43 6f 6c 20 3d 20 22 72 6f 77 69 64 22 3b 0a 20  Col = "rowid";. 
9dd0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
9de0: 20 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20          zType = 
9df0: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
9e00: 2e 7a 54 79 70 65 3b 0a 20 20 20 20 20 20 20 20  .zType;.        
9e10: 20 20 7a 4f 72 69 67 69 6e 43 6f 6c 20 3d 20 70    zOriginCol = p
9e20: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
9e30: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 7d  zName;.        }
9e40: 0a 20 20 20 20 20 20 20 20 7a 4f 72 69 67 69 6e  .        zOrigin
9e50: 54 61 62 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d  Tab = pTab->zNam
9e60: 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  e;.        if( p
9e70: 4e 43 2d 3e 70 50 61 72 73 65 20 29 7b 0a 20 20  NC->pParse ){.  
9e80: 20 20 20 20 20 20 20 20 69 6e 74 20 69 44 62 20          int iDb 
9e90: 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
9ea0: 6f 49 6e 64 65 78 28 70 4e 43 2d 3e 70 50 61 72  oIndex(pNC->pPar
9eb0: 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53  se->db, pTab->pS
9ec0: 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 20 20  chema);.        
9ed0: 20 20 7a 4f 72 69 67 69 6e 44 62 20 3d 20 70 4e    zOriginDb = pN
9ee0: 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61  C->pParse->db->a
9ef0: 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20  Db[iDb].zName;. 
9f00: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
9f10: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
9f20: 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
9f30: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
9f40: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c  .    case TK_SEL
9f50: 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  ECT: {.      /* 
9f60: 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  The expression i
9f70: 73 20 61 20 73 75 62 2d 73 65 6c 65 63 74 2e 20  s a sub-select. 
9f80: 52 65 74 75 72 6e 20 74 68 65 20 64 65 63 6c 61  Return the decla
9f90: 72 61 74 69 6f 6e 20 74 79 70 65 20 61 6e 64 0a  ration type and.
9fa0: 20 20 20 20 20 20 2a 2a 20 6f 72 69 67 69 6e 20        ** origin 
9fb0: 69 6e 66 6f 20 66 6f 72 20 74 68 65 20 73 69 6e  info for the sin
9fc0: 67 6c 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68  gle column in th
9fd0: 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20  e result set of 
9fe0: 74 68 65 20 53 45 4c 45 43 54 0a 20 20 20 20 20  the SELECT.     
9ff0: 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20   ** statement.. 
a000: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 4e 61       */.      Na
a010: 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20  meContext sNC;. 
a020: 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 20       Select *pS 
a030: 3d 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65  = pExpr->x.pSele
a040: 63 74 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  ct;.      Expr *
a050: 70 20 3d 20 70 53 2d 3e 70 45 4c 69 73 74 2d 3e  p = pS->pEList->
a060: 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[0].pExpr;.    
a070: 20 20 61 73 73 65 72 74 28 20 45 78 70 72 48 61    assert( ExprHa
a080: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
a090: 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
a0a0: 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70 53 72 63  ;.      sNC.pSrc
a0b0: 4c 69 73 74 20 3d 20 70 53 2d 3e 70 53 72 63 3b  List = pS->pSrc;
a0c0: 0a 20 20 20 20 20 20 73 4e 43 2e 70 4e 65 78 74  .      sNC.pNext
a0d0: 20 3d 20 70 4e 43 3b 0a 20 20 20 20 20 20 73 4e   = pNC;.      sN
a0e0: 43 2e 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e  C.pParse = pNC->
a0f0: 70 50 61 72 73 65 3b 0a 20 20 20 20 20 20 7a 54  pParse;.      zT
a100: 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65  ype = columnType
a110: 28 26 73 4e 43 2c 20 70 2c 20 26 7a 4f 72 69 67  (&sNC, p, &zOrig
a120: 69 6e 44 62 2c 20 26 7a 4f 72 69 67 69 6e 54 61  inDb, &zOriginTa
a130: 62 2c 20 26 7a 4f 72 69 67 69 6e 43 6f 6c 29 3b  b, &zOriginCol);
a140: 20 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20   .      break;. 
a150: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
a160: 20 20 0a 20 20 69 66 28 20 70 7a 4f 72 69 67 69    .  if( pzOrigi
a170: 6e 44 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72  nDb ){.    asser
a180: 74 28 20 70 7a 4f 72 69 67 69 6e 54 61 62 20 26  t( pzOriginTab &
a190: 26 20 70 7a 4f 72 69 67 69 6e 43 6f 6c 20 29 3b  & pzOriginCol );
a1a0: 0a 20 20 20 20 2a 70 7a 4f 72 69 67 69 6e 44 62  .    *pzOriginDb
a1b0: 20 3d 20 7a 4f 72 69 67 69 6e 44 62 3b 0a 20 20   = zOriginDb;.  
a1c0: 20 20 2a 70 7a 4f 72 69 67 69 6e 54 61 62 20 3d    *pzOriginTab =
a1d0: 20 7a 4f 72 69 67 69 6e 54 61 62 3b 0a 20 20 20   zOriginTab;.   
a1e0: 20 2a 70 7a 4f 72 69 67 69 6e 43 6f 6c 20 3d 20   *pzOriginCol = 
a1f0: 7a 4f 72 69 67 69 6e 43 6f 6c 3b 0a 20 20 7d 0a  zOriginCol;.  }.
a200: 20 20 72 65 74 75 72 6e 20 7a 54 79 70 65 3b 0a    return zType;.
a210: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
a220: 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
a230: 20 74 65 6c 6c 20 74 68 65 20 56 44 42 45 20 74   tell the VDBE t
a240: 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74  he declaration t
a250: 79 70 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a  ypes of columns.
a260: 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ** in the result
a270: 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   set..*/.static 
a280: 76 6f 69 64 20 67 65 6e 65 72 61 74 65 43 6f 6c  void generateCol
a290: 75 6d 6e 54 79 70 65 73 28 0a 20 20 50 61 72 73  umnTypes(.  Pars
a2a0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
a2b0: 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78  /* Parser contex
a2c0: 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  t */.  SrcList *
a2d0: 70 54 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69  pTabList,  /* Li
a2e0: 73 74 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a  st of tables */.
a2f0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
a300: 73 74 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73  st    /* Express
a310: 69 6f 6e 73 20 64 65 66 69 6e 69 6e 67 20 74 68  ions defining th
a320: 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a  e result set */.
a330: 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
a340: 45 5f 4f 4d 49 54 5f 44 45 43 4c 54 59 50 45 0a  E_OMIT_DECLTYPE.
a350: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
a360: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
a370: 20 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78   i;.  NameContex
a380: 74 20 73 4e 43 3b 0a 20 20 73 4e 43 2e 70 53 72  t sNC;.  sNC.pSr
a390: 63 4c 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74  cList = pTabList
a3a0: 3b 0a 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d  ;.  sNC.pParse =
a3b0: 20 70 50 61 72 73 65 3b 0a 20 20 66 6f 72 28 69   pParse;.  for(i
a3c0: 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45  =0; i<pEList->nE
a3d0: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45  xpr; i++){.    E
a3e0: 78 70 72 20 2a 70 20 3d 20 70 45 4c 69 73 74 2d  xpr *p = pEList-
a3f0: 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
a400: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79   const char *zTy
a410: 70 65 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  pe;.#ifdef SQLIT
a420: 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f  E_ENABLE_COLUMN_
a430: 4d 45 54 41 44 41 54 41 0a 20 20 20 20 63 6f 6e  METADATA.    con
a440: 73 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 44 62  st char *zOrigDb
a450: 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20   = 0;.    const 
a460: 63 68 61 72 20 2a 7a 4f 72 69 67 54 61 62 20 3d  char *zOrigTab =
a470: 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   0;.    const ch
a480: 61 72 20 2a 7a 4f 72 69 67 43 6f 6c 20 3d 20 30  ar *zOrigCol = 0
a490: 3b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f  ;.    zType = co
a4a0: 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70  lumnType(&sNC, p
a4b0: 2c 20 26 7a 4f 72 69 67 44 62 2c 20 26 7a 4f 72  , &zOrigDb, &zOr
a4c0: 69 67 54 61 62 2c 20 26 7a 4f 72 69 67 43 6f 6c  igTab, &zOrigCol
a4d0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 76  );..    /* The v
a4e0: 64 62 65 20 6d 75 73 74 20 6d 61 6b 65 20 69 74  dbe must make it
a4f0: 73 20 6f 77 6e 20 63 6f 70 79 20 6f 66 20 74 68  s own copy of th
a500: 65 20 63 6f 6c 75 6d 6e 2d 74 79 70 65 20 61 6e  e column-type an
a510: 64 20 6f 74 68 65 72 20 0a 20 20 20 20 2a 2a 20  d other .    ** 
a520: 63 6f 6c 75 6d 6e 20 73 70 65 63 69 66 69 63 20  column specific 
a530: 73 74 72 69 6e 67 73 2c 20 69 6e 20 63 61 73 65  strings, in case
a540: 20 74 68 65 20 73 63 68 65 6d 61 20 69 73 20 72   the schema is r
a550: 65 73 65 74 20 62 65 66 6f 72 65 20 74 68 69 73  eset before this
a560: 0a 20 20 20 20 2a 2a 20 76 69 72 74 75 61 6c 20  .    ** virtual 
a570: 6d 61 63 68 69 6e 65 20 69 73 20 64 65 6c 65 74  machine is delet
a580: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  ed..    */.    s
a590: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
a5a0: 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41  Name(v, i, COLNA
a5b0: 4d 45 5f 44 41 54 41 42 41 53 45 2c 20 7a 4f 72  ME_DATABASE, zOr
a5c0: 69 67 44 62 2c 20 53 51 4c 49 54 45 5f 54 52 41  igDb, SQLITE_TRA
a5d0: 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c  NSIENT);.    sql
a5e0: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
a5f0: 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45  me(v, i, COLNAME
a600: 5f 54 41 42 4c 45 2c 20 7a 4f 72 69 67 54 61 62  _TABLE, zOrigTab
a610: 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
a620: 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  NT);.    sqlite3
a630: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76  VdbeSetColName(v
a640: 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 43 4f 4c  , i, COLNAME_COL
a650: 55 4d 4e 2c 20 7a 4f 72 69 67 43 6f 6c 2c 20 53  UMN, zOrigCol, S
a660: 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
a670: 3b 0a 23 65 6c 73 65 0a 20 20 20 20 7a 54 79 70  ;.#else.    zTyp
a680: 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26  e = columnType(&
a690: 73 4e 43 2c 20 70 2c 20 30 2c 20 30 2c 20 30 29  sNC, p, 0, 0, 0)
a6a0: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71 6c  ;.#endif.    sql
a6b0: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
a6c0: 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45  me(v, i, COLNAME
a6d0: 5f 44 45 43 4c 54 59 50 45 2c 20 7a 54 79 70 65  _DECLTYPE, zType
a6e0: 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
a6f0: 4e 54 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20  NT);.  }.#endif 
a700: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  /* SQLITE_OMIT_D
a710: 45 43 4c 54 59 50 45 20 2a 2f 0a 7d 0a 0a 2f 2a  ECLTYPE */.}../*
a720: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
a730: 65 20 74 68 61 74 20 77 69 6c 6c 20 74 65 6c 6c  e that will tell
a740: 20 74 68 65 20 56 44 42 45 20 74 68 65 20 6e 61   the VDBE the na
a750: 6d 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a  mes of columns.*
a760: 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  * in the result 
a770: 73 65 74 2e 20 20 54 68 69 73 20 69 6e 66 6f 72  set.  This infor
a780: 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  mation is used t
a790: 6f 20 70 72 6f 76 69 64 65 20 74 68 65 0a 2a 2a  o provide the.**
a7a0: 20 61 7a 43 6f 6c 5b 5d 20 76 61 6c 75 65 73 20   azCol[] values 
a7b0: 69 6e 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 2e  in the callback.
a7c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
a7d0: 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61  generateColumnNa
a7e0: 6d 65 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50  mes(.  Parse *pP
a7f0: 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61  arse,      /* Pa
a800: 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
a810: 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
a820: 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66  ist,  /* List of
a830: 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 45 78 70   tables */.  Exp
a840: 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20  rList *pEList   
a850: 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73 20   /* Expressions 
a860: 64 65 66 69 6e 69 6e 67 20 74 68 65 20 72 65 73  defining the res
a870: 75 6c 74 20 73 65 74 20 2a 2f 0a 29 7b 0a 20 20  ult set */.){.  
a880: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
a890: 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
a8a0: 2c 20 6a 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  , j;.  sqlite3 *
a8b0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
a8c0: 0a 20 20 69 6e 74 20 66 75 6c 6c 4e 61 6d 65 73  .  int fullNames
a8d0: 2c 20 73 68 6f 72 74 4e 61 6d 65 73 3b 0a 0a 23  , shortNames;..#
a8e0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
a8f0: 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 2f 2a 20  IT_EXPLAIN.  /* 
a900: 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 45 58  If this is an EX
a910: 50 4c 41 49 4e 2c 20 73 6b 69 70 20 74 68 69 73  PLAIN, skip this
a920: 20 73 74 65 70 20 2a 2f 0a 20 20 69 66 28 20 70   step */.  if( p
a930: 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29  Parse->explain )
a940: 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
a950: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20  }.#endif..  if( 
a960: 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73  pParse->colNames
a970: 53 65 74 20 7c 7c 20 4e 45 56 45 52 28 76 3d 3d  Set || NEVER(v==
a980: 30 29 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  0) || db->malloc
a990: 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b  Failed ) return;
a9a0: 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61  .  pParse->colNa
a9b0: 6d 65 73 53 65 74 20 3d 20 31 3b 0a 20 20 66 75  mesSet = 1;.  fu
a9c0: 6c 6c 4e 61 6d 65 73 20 3d 20 28 64 62 2d 3e 66  llNames = (db->f
a9d0: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 75  lags & SQLITE_Fu
a9e0: 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a  llColNames)!=0;.
a9f0: 20 20 73 68 6f 72 74 4e 61 6d 65 73 20 3d 20 28    shortNames = (
aa00: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
aa10: 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73  TE_ShortColNames
aa20: 29 21 3d 30 3b 0a 20 20 73 71 6c 69 74 65 33 56  )!=0;.  sqlite3V
aa30: 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 76 2c  dbeSetNumCols(v,
aa40: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b   pEList->nExpr);
aa50: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45  .  for(i=0; i<pE
aa60: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
aa70: 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 3b 0a  ){.    Expr *p;.
aa80: 20 20 20 20 70 20 3d 20 70 45 4c 69 73 74 2d 3e      p = pEList->
aa90: 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
aaa0: 69 66 28 20 4e 45 56 45 52 28 70 3d 3d 30 29 20  if( NEVER(p==0) 
aab0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
aac0: 69 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  if( pEList->a[i]
aad0: 2e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  .zName ){.      
aae0: 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 45  char *zName = pE
aaf0: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
ab00: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
ab10: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
ab20: 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45   i, COLNAME_NAME
ab30: 2c 20 7a 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f  , zName, SQLITE_
ab40: 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20  TRANSIENT);.    
ab50: 7d 65 6c 73 65 20 69 66 28 20 28 70 2d 3e 6f 70  }else if( (p->op
ab60: 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70  ==TK_COLUMN || p
ab70: 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c  ->op==TK_AGG_COL
ab80: 55 4d 4e 29 20 26 26 20 70 54 61 62 4c 69 73 74  UMN) && pTabList
ab90: 20 29 7b 0a 20 20 20 20 20 20 54 61 62 6c 65 20   ){.      Table 
aba0: 2a 70 54 61 62 3b 0a 20 20 20 20 20 20 63 68 61  *pTab;.      cha
abb0: 72 20 2a 7a 43 6f 6c 3b 0a 20 20 20 20 20 20 69  r *zCol;.      i
abc0: 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 69 43 6f  nt iCol = p->iCo
abd0: 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 66 6f 72 28  lumn;.      for(
abe0: 6a 3d 30 3b 20 41 4c 57 41 59 53 28 6a 3c 70 54  j=0; ALWAYS(j<pT
abf0: 61 62 4c 69 73 74 2d 3e 6e 53 72 63 29 3b 20 6a  abList->nSrc); j
ac00: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
ac10: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e   pTabList->a[j].
ac20: 69 43 75 72 73 6f 72 3d 3d 70 2d 3e 69 54 61 62  iCursor==p->iTab
ac30: 6c 65 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  le ) break;.    
ac40: 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
ac50: 28 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  ( j<pTabList->nS
ac60: 72 63 20 29 3b 0a 20 20 20 20 20 20 70 54 61 62  rc );.      pTab
ac70: 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a   = pTabList->a[j
ac80: 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 69 66  ].pTab;.      if
ac90: 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20  ( iCol<0 ) iCol 
aca0: 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20  = pTab->iPKey;. 
acb0: 20 20 20 20 20 61 73 73 65 72 74 28 20 69 43 6f       assert( iCo
acc0: 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d  l==-1 || (iCol>=
acd0: 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e  0 && iCol<pTab->
ace0: 6e 43 6f 6c 29 20 29 3b 0a 20 20 20 20 20 20 69  nCol) );.      i
acf0: 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20  f( iCol<0 ){.   
ad00: 20 20 20 20 20 7a 43 6f 6c 20 3d 20 22 72 6f 77       zCol = "row
ad10: 69 64 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  id";.      }else
ad20: 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d  {.        zCol =
ad30: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
ad40: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 7d  ].zName;.      }
ad50: 0a 20 20 20 20 20 20 69 66 28 20 21 73 68 6f 72  .      if( !shor
ad60: 74 4e 61 6d 65 73 20 26 26 20 21 66 75 6c 6c 4e  tNames && !fullN
ad70: 61 6d 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20  ames ){.        
ad80: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
ad90: 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e  lName(v, i, COLN
ada0: 41 4d 45 5f 4e 41 4d 45 2c 20 0a 20 20 20 20 20  AME_NAME, .     
adb0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
adc0: 53 74 72 44 75 70 28 64 62 2c 20 70 45 4c 69 73  StrDup(db, pELis
add0: 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 29 2c 20  t->a[i].zSpan), 
ade0: 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b  SQLITE_DYNAMIC);
adf0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
ae00: 20 66 75 6c 6c 4e 61 6d 65 73 20 29 7b 0a 20 20   fullNames ){.  
ae10: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d        char *zNam
ae20: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7a  e = 0;.        z
ae30: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50  Name = sqlite3MP
ae40: 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2e 25 73  rintf(db, "%s.%s
ae50: 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  ", pTab->zName, 
ae60: 7a 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73  zCol);.        s
ae70: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
ae80: 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41  Name(v, i, COLNA
ae90: 4d 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20  ME_NAME, zName, 
aea0: 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b  SQLITE_DYNAMIC);
aeb0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
aec0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
aed0: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69  eSetColName(v, i
aee0: 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20  , COLNAME_NAME, 
aef0: 7a 43 6f 6c 2c 20 53 51 4c 49 54 45 5f 54 52 41  zCol, SQLITE_TRA
af00: 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 20 20 7d  NSIENT);.      }
af10: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
af20: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
af30: 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f  ColName(v, i, CO
af40: 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 0a 20 20 20  LNAME_NAME, .   
af50: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
af60: 53 74 72 44 75 70 28 64 62 2c 20 70 45 4c 69 73  StrDup(db, pELis
af70: 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 29 2c 20  t->a[i].zSpan), 
af80: 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b  SQLITE_DYNAMIC);
af90: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 67 65 6e  .    }.  }.  gen
afa0: 65 72 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73  erateColumnTypes
afb0: 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73  (pParse, pTabLis
afc0: 74 2c 20 70 45 4c 69 73 74 29 3b 0a 7d 0a 0a 2f  t, pEList);.}../
afd0: 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 61 6e 20  *.** Given a an 
afe0: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20  expression list 
aff0: 28 77 68 69 63 68 20 69 73 20 72 65 61 6c 6c 79  (which is really
b000: 20 74 68 65 20 6c 69 73 74 20 6f 66 20 65 78 70   the list of exp
b010: 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 74 68 61 74  ressions.** that
b020: 20 66 6f 72 6d 20 74 68 65 20 72 65 73 75 6c 74   form the result
b030: 20 73 65 74 20 6f 66 20 61 20 53 45 4c 45 43 54   set of a SELECT
b040: 20 73 74 61 74 65 6d 65 6e 74 29 20 63 6f 6d 70   statement) comp
b050: 75 74 65 20 61 70 70 72 6f 70 72 69 61 74 65 0a  ute appropriate.
b060: 2a 2a 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  ** column names 
b070: 66 6f 72 20 61 20 74 61 62 6c 65 20 74 68 61 74  for a table that
b080: 20 77 6f 75 6c 64 20 68 6f 6c 64 20 74 68 65 20   would hold the 
b090: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e  expression list.
b0a0: 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 63 6f 6c 75 6d  .**.** All colum
b0b0: 6e 20 6e 61 6d 65 73 20 77 69 6c 6c 20 62 65 20  n names will be 
b0c0: 75 6e 69 71 75 65 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  unique..**.** On
b0d0: 6c 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  ly the column na
b0e0: 6d 65 73 20 61 72 65 20 63 6f 6d 70 75 74 65 64  mes are computed
b0f0: 2e 20 20 43 6f 6c 75 6d 6e 2e 7a 54 79 70 65 2c  .  Column.zType,
b100: 20 43 6f 6c 75 6d 6e 2e 7a 43 6f 6c 6c 2c 0a 2a   Column.zColl,.*
b110: 2a 20 61 6e 64 20 6f 74 68 65 72 20 66 69 65 6c  * and other fiel
b120: 64 73 20 6f 66 20 43 6f 6c 75 6d 6e 20 61 72 65  ds of Column are
b130: 20 7a 65 72 6f 65 64 2e 0a 2a 2a 0a 2a 2a 20 52   zeroed..**.** R
b140: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
b150: 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66 20  on success.  If 
b160: 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  a memory allocat
b170: 69 6f 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73  ion error occurs
b180: 2c 0a 2a 2a 20 73 74 6f 72 65 20 4e 55 4c 4c 20  ,.** store NULL 
b190: 69 6e 20 2a 70 61 43 6f 6c 20 61 6e 64 20 30 20  in *paCol and 0 
b1a0: 69 6e 20 2a 70 6e 43 6f 6c 20 61 6e 64 20 72 65  in *pnCol and re
b1b0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
b1c0: 4d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  M..*/.static int
b1d0: 20 73 65 6c 65 63 74 43 6f 6c 75 6d 6e 73 46 72   selectColumnsFr
b1e0: 6f 6d 45 78 70 72 4c 69 73 74 28 0a 20 20 50 61  omExprList(.  Pa
b1f0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
b200: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
b210: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
b220: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20  prList *pEList, 
b230: 20 20 20 20 20 20 2f 2a 20 45 78 70 72 20 6c 69        /* Expr li
b240: 73 74 20 66 72 6f 6d 20 77 68 69 63 68 20 74 6f  st from which to
b250: 20 64 65 72 69 76 65 20 63 6f 6c 75 6d 6e 20 6e   derive column n
b260: 61 6d 65 73 20 2a 2f 0a 20 20 69 31 36 20 2a 70  ames */.  i16 *p
b270: 6e 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20  nCol,           
b280: 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e    /* Write the n
b290: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
b2a0: 20 68 65 72 65 20 2a 2f 0a 20 20 43 6f 6c 75 6d   here */.  Colum
b2b0: 6e 20 2a 2a 70 61 43 6f 6c 20 20 20 20 20 20 20  n **paCol       
b2c0: 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
b2d0: 6e 65 77 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20  new column list 
b2e0: 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  here */.){.  sql
b2f0: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
b300: 65 2d 3e 64 62 3b 20 20 20 2f 2a 20 44 61 74 61  e->db;   /* Data
b310: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
b320: 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20  */.  int i, j;  
b330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b340: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
b350: 73 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 3b 20  s */.  int cnt; 
b360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b370: 20 20 20 2f 2a 20 49 6e 64 65 78 20 61 64 64 65     /* Index adde
b380: 64 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 6e 61  d to make the na
b390: 6d 65 20 75 6e 69 71 75 65 20 2a 2f 0a 20 20 43  me unique */.  C
b3a0: 6f 6c 75 6d 6e 20 2a 61 43 6f 6c 2c 20 2a 70 43  olumn *aCol, *pC
b3b0: 6f 6c 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 6f  ol;        /* Fo
b3c0: 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 72  r looping over r
b3d0: 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f  esult columns */
b3e0: 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20  .  int nCol;    
b3f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
b400: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  * Number of colu
b410: 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c  mns in the resul
b420: 74 20 73 65 74 20 2a 2f 0a 20 20 45 78 70 72 20  t set */.  Expr 
b430: 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *p;             
b440: 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73         /* Expres
b450: 73 69 6f 6e 20 66 6f 72 20 61 20 73 69 6e 67 6c  sion for a singl
b460: 65 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 20  e result column 
b470: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65  */.  char *zName
b480: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
b490: 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65 20   /* Column name 
b4a0: 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 20  */.  int nName; 
b4b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b4c0: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6e 61 6d 65   /* Size of name
b4d0: 20 69 6e 20 7a 4e 61 6d 65 5b 5d 20 2a 2f 0a 0a   in zName[] */..
b4e0: 20 20 69 66 28 20 70 45 4c 69 73 74 20 29 7b 0a    if( pEList ){.
b4f0: 20 20 20 20 6e 43 6f 6c 20 3d 20 70 45 4c 69 73      nCol = pELis
b500: 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 61 43  t->nExpr;.    aC
b510: 6f 6c 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ol = sqlite3DbMa
b520: 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
b530: 65 6f 66 28 61 43 6f 6c 5b 30 5d 29 2a 6e 43 6f  eof(aCol[0])*nCo
b540: 6c 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  l);.    testcase
b550: 28 20 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 7d  ( aCol==0 );.  }
b560: 65 6c 73 65 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d  else{.    nCol =
b570: 20 30 3b 0a 20 20 20 20 61 43 6f 6c 20 3d 20 30   0;.    aCol = 0
b580: 3b 0a 20 20 7d 0a 20 20 2a 70 6e 43 6f 6c 20 3d  ;.  }.  *pnCol =
b590: 20 6e 43 6f 6c 3b 0a 20 20 2a 70 61 43 6f 6c 20   nCol;.  *paCol 
b5a0: 3d 20 61 43 6f 6c 3b 0a 0a 20 20 66 6f 72 28 69  = aCol;..  for(i
b5b0: 3d 30 2c 20 70 43 6f 6c 3d 61 43 6f 6c 3b 20 69  =0, pCol=aCol; i
b5c0: 3c 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c  <nCol; i++, pCol
b5d0: 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20 47 65 74 20  ++){.    /* Get 
b5e0: 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 6e  an appropriate n
b5f0: 61 6d 65 20 66 6f 72 20 74 68 65 20 63 6f 6c 75  ame for the colu
b600: 6d 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 20  mn.    */.    p 
b610: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69  = sqlite3ExprSki
b620: 70 43 6f 6c 6c 61 74 65 28 70 45 4c 69 73 74 2d  pCollate(pEList-
b630: 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[i].pExpr);.  
b640: 20 20 69 66 28 20 28 7a 4e 61 6d 65 20 3d 20 70    if( (zName = p
b650: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  EList->a[i].zNam
b660: 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  e)!=0 ){.      /
b670: 2a 20 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  * If the column 
b680: 63 6f 6e 74 61 69 6e 73 20 61 6e 20 22 41 53 20  contains an "AS 
b690: 3c 6e 61 6d 65 3e 22 20 70 68 72 61 73 65 2c 20  <name>" phrase, 
b6a0: 75 73 65 20 3c 6e 61 6d 65 3e 20 61 73 20 74 68  use <name> as th
b6b0: 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20  e name */.      
b6c0: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44  zName = sqlite3D
b6d0: 62 53 74 72 44 75 70 28 64 62 2c 20 7a 4e 61 6d  bStrDup(db, zNam
b6e0: 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  e);.    }else{. 
b6f0: 20 20 20 20 20 45 78 70 72 20 2a 70 43 6f 6c 45       Expr *pColE
b700: 78 70 72 20 3d 20 70 3b 20 20 2f 2a 20 54 68 65  xpr = p;  /* The
b710: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74   expression that
b720: 20 69 73 20 74 68 65 20 72 65 73 75 6c 74 20 63   is the result c
b730: 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  olumn name */.  
b740: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b      Table *pTab;
b750: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
b760: 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  e associated wit
b770: 68 20 74 68 69 73 20 65 78 70 72 65 73 73 69 6f  h this expressio
b780: 6e 20 2a 2f 0a 20 20 20 20 20 20 77 68 69 6c 65  n */.      while
b790: 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f 70 3d 3d  ( pColExpr->op==
b7a0: 54 4b 5f 44 4f 54 20 29 7b 0a 20 20 20 20 20 20  TK_DOT ){.      
b7b0: 20 20 70 43 6f 6c 45 78 70 72 20 3d 20 70 43 6f    pColExpr = pCo
b7c0: 6c 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20  lExpr->pRight;. 
b7d0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
b7e0: 43 6f 6c 45 78 70 72 21 3d 30 20 29 3b 0a 20 20  ColExpr!=0 );.  
b7f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
b800: 70 43 6f 6c 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  pColExpr->op==TK
b810: 5f 43 4f 4c 55 4d 4e 20 26 26 20 41 4c 57 41 59  _COLUMN && ALWAY
b820: 53 28 70 43 6f 6c 45 78 70 72 2d 3e 70 54 61 62  S(pColExpr->pTab
b830: 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  !=0) ){.        
b840: 2f 2a 20 46 6f 72 20 63 6f 6c 75 6d 6e 73 20 75  /* For columns u
b850: 73 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  se the column na
b860: 6d 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20  me name */.     
b870: 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 43     int iCol = pC
b880: 6f 6c 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b  olExpr->iColumn;
b890: 0a 20 20 20 20 20 20 20 20 70 54 61 62 20 3d 20  .        pTab = 
b8a0: 70 43 6f 6c 45 78 70 72 2d 3e 70 54 61 62 3b 0a  pColExpr->pTab;.
b8b0: 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c          if( iCol
b8c0: 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70 54 61 62  <0 ) iCol = pTab
b8d0: 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 20  ->iPKey;.       
b8e0: 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
b8f0: 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 22  MPrintf(db, "%s"
b900: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
b910: 20 20 20 69 43 6f 6c 3e 3d 30 20 3f 20 70 54 61     iCol>=0 ? pTa
b920: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e  b->aCol[iCol].zN
b930: 61 6d 65 20 3a 20 22 72 6f 77 69 64 22 29 3b 0a  ame : "rowid");.
b940: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
b950: 70 43 6f 6c 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  pColExpr->op==TK
b960: 5f 49 44 20 29 7b 0a 20 20 20 20 20 20 20 20 61  _ID ){.        a
b970: 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
b980: 72 6f 70 65 72 74 79 28 70 43 6f 6c 45 78 70 72  roperty(pColExpr
b990: 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29  , EP_IntValue) )
b9a0: 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  ;.        zName 
b9b0: 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
b9c0: 28 64 62 2c 20 22 25 73 22 2c 20 70 43 6f 6c 45  (db, "%s", pColE
b9d0: 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a  xpr->u.zToken);.
b9e0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
b9f0: 20 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65 20       /* Use the 
ba00: 6f 72 69 67 69 6e 61 6c 20 74 65 78 74 20 6f 66  original text of
ba10: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 65 78 70 72   the column expr
ba20: 65 73 73 69 6f 6e 20 61 73 20 69 74 73 20 6e 61  ession as its na
ba30: 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 7a 4e  me */.        zN
ba40: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  ame = sqlite3MPr
ba50: 69 6e 74 66 28 64 62 2c 20 22 25 73 22 2c 20 70  intf(db, "%s", p
ba60: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61  EList->a[i].zSpa
ba70: 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  n);.      }.    
ba80: 7d 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61  }.    if( db->ma
ba90: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
baa0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
bab0: 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  e(db, zName);.  
bac0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
bad0: 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75  ..    /* Make su
bae0: 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  re the column na
baf0: 6d 65 20 69 73 20 75 6e 69 71 75 65 2e 20 20 49  me is unique.  I
bb00: 66 20 74 68 65 20 6e 61 6d 65 20 69 73 20 6e 6f  f the name is no
bb10: 74 20 75 6e 69 71 75 65 2c 0a 20 20 20 20 2a 2a  t unique,.    **
bb20: 20 61 70 70 65 6e 64 20 61 20 69 6e 74 65 67 65   append a intege
bb30: 72 20 74 6f 20 74 68 65 20 6e 61 6d 65 20 73 6f  r to the name so
bb40: 20 74 68 61 74 20 69 74 20 62 65 63 6f 6d 65 73   that it becomes
bb50: 20 75 6e 69 71 75 65 2e 0a 20 20 20 20 2a 2f 0a   unique..    */.
bb60: 20 20 20 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69      nName = sqli
bb70: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d  te3Strlen30(zNam
bb80: 65 29 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 63 6e  e);.    for(j=cn
bb90: 74 3d 30 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a  t=0; j<i; j++){.
bba0: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
bbb0: 33 53 74 72 49 43 6d 70 28 61 43 6f 6c 5b 6a 5d  3StrICmp(aCol[j]
bbc0: 2e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d  .zName, zName)==
bbd0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  0 ){.        cha
bbe0: 72 20 2a 7a 4e 65 77 4e 61 6d 65 3b 0a 20 20 20  r *zNewName;.   
bbf0: 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20       int k;.    
bc00: 20 20 20 20 66 6f 72 28 6b 3d 6e 4e 61 6d 65 2d      for(k=nName-
bc10: 31 3b 20 6b 3e 31 20 26 26 20 73 71 6c 69 74 65  1; k>1 && sqlite
bc20: 33 49 73 64 69 67 69 74 28 7a 4e 61 6d 65 5b 6b  3Isdigit(zName[k
bc30: 5d 29 3b 20 6b 2d 2d 29 7b 7d 0a 20 20 20 20 20  ]); k--){}.     
bc40: 20 20 20 69 66 28 20 7a 4e 61 6d 65 5b 6b 5d 3d     if( zName[k]=
bc50: 3d 27 3a 27 20 29 20 6e 4e 61 6d 65 20 3d 20 6b  =':' ) nName = k
bc60: 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 5b  ;.        zName[
bc70: 6e 4e 61 6d 65 5d 20 3d 20 30 3b 0a 20 20 20 20  nName] = 0;.    
bc80: 20 20 20 20 7a 4e 65 77 4e 61 6d 65 20 3d 20 73      zNewName = s
bc90: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
bca0: 2c 20 22 25 73 3a 25 64 22 2c 20 7a 4e 61 6d 65  , "%s:%d", zName
bcb0: 2c 20 2b 2b 63 6e 74 29 3b 0a 20 20 20 20 20 20  , ++cnt);.      
bcc0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
bcd0: 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  db, zName);.    
bce0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 7a 4e 65 77      zName = zNew
bcf0: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 6a 20  Name;.        j 
bd00: 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 69 66  = -1;.        if
bd10: 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 62 72 65  ( zName==0 ) bre
bd20: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
bd30: 7d 0a 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d  }.    pCol->zNam
bd40: 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 7d 0a 20  e = zName;.  }. 
bd50: 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
bd60: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 66 6f 72  ailed ){.    for
bd70: 28 6a 3d 30 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 7b  (j=0; j<i; j++){
bd80: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
bd90: 46 72 65 65 28 64 62 2c 20 61 43 6f 6c 5b 6a 5d  Free(db, aCol[j]
bda0: 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20  .zName);.    }. 
bdb0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
bdc0: 28 64 62 2c 20 61 43 6f 6c 29 3b 0a 20 20 20 20  (db, aCol);.    
bdd0: 2a 70 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  *paCol = 0;.    
bde0: 2a 70 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  *pnCol = 0;.    
bdf0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
be00: 4d 45 4d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  MEM;.  }.  retur
be10: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
be20: 2f 2a 0a 2a 2a 20 41 64 64 20 74 79 70 65 20 61  /*.** Add type a
be30: 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 69 6e 66  nd collation inf
be40: 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 61 20 63 6f  ormation to a co
be50: 6c 75 6d 6e 20 6c 69 73 74 20 62 61 73 65 64 20  lumn list based 
be60: 6f 6e 0a 2a 2a 20 61 20 53 45 4c 45 43 54 20 73  on.** a SELECT s
be70: 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 0a 2a 2a  tatement..** .**
be80: 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74   The column list
be90: 20 70 72 65 73 75 6d 61 62 6c 79 20 63 61 6d 65   presumably came
bea0: 20 66 72 6f 6d 20 73 65 6c 65 63 74 43 6f 6c 75   from selectColu
beb0: 6d 6e 4e 61 6d 65 73 46 72 6f 6d 45 78 70 72 4c  mnNamesFromExprL
bec0: 69 73 74 28 29 2e 0a 2a 2a 20 54 68 65 20 63 6f  ist()..** The co
bed0: 6c 75 6d 6e 20 6c 69 73 74 20 68 61 73 20 6f 6e  lumn list has on
bee0: 6c 79 20 6e 61 6d 65 73 2c 20 6e 6f 74 20 74 79  ly names, not ty
bef0: 70 65 73 20 6f 72 20 63 6f 6c 6c 61 74 69 6f 6e  pes or collation
bf00: 73 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74  s.  This.** rout
bf10: 69 6e 65 20 67 6f 65 73 20 74 68 72 6f 75 67 68  ine goes through
bf20: 20 61 6e 64 20 61 64 64 73 20 74 68 65 20 74 79   and adds the ty
bf30: 70 65 73 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f  pes and collatio
bf40: 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ns..**.** This r
bf50: 6f 75 74 69 6e 65 20 72 65 71 75 69 72 65 73 20  outine requires 
bf60: 74 68 61 74 20 61 6c 6c 20 69 64 65 6e 74 69 66  that all identif
bf70: 69 65 72 73 20 69 6e 20 74 68 65 20 53 45 4c 45  iers in the SELE
bf80: 43 54 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20  CT.** statement 
bf90: 62 65 20 72 65 73 6f 6c 76 65 64 2e 0a 2a 2f 0a  be resolved..*/.
bfa0: 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 6c 65  static void sele
bfb0: 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41  ctAddColumnTypeA
bfc0: 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20 50  ndCollation(.  P
bfd0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
bfe0: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
bff0: 63 6f 6e 74 65 78 74 73 20 2a 2f 0a 20 20 54 61  contexts */.  Ta
c000: 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20 20  ble *pTab,      
c010: 20 20 20 20 2f 2a 20 41 64 64 20 63 6f 6c 75 6d      /* Add colum
c020: 6e 20 74 79 70 65 20 69 6e 66 6f 72 6d 61 74 69  n type informati
c030: 6f 6e 20 74 6f 20 74 68 69 73 20 74 61 62 6c 65  on to this table
c040: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53   */.  Select *pS
c050: 65 6c 65 63 74 20 20 20 20 20 20 20 2f 2a 20 53  elect       /* S
c060: 45 4c 45 43 54 20 75 73 65 64 20 74 6f 20 64 65  ELECT used to de
c070: 74 65 72 6d 69 6e 65 20 74 79 70 65 73 20 61 6e  termine types an
c080: 64 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 2a 2f 0a  d collations */.
c090: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
c0a0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
c0b0: 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43   NameContext sNC
c0c0: 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c  ;.  Column *pCol
c0d0: 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f  ;.  CollSeq *pCo
c0e0: 6c 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 45  ll;.  int i;.  E
c0f0: 78 70 72 20 2a 70 3b 0a 20 20 73 74 72 75 63 74  xpr *p;.  struct
c100: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
c110: 61 3b 0a 20 20 75 36 34 20 73 7a 41 6c 6c 20 3d  a;.  u64 szAll =
c120: 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   0;..  assert( p
c130: 53 65 6c 65 63 74 21 3d 30 20 29 3b 0a 20 20 61  Select!=0 );.  a
c140: 73 73 65 72 74 28 20 28 70 53 65 6c 65 63 74 2d  ssert( (pSelect-
c150: 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52  >selFlags & SF_R
c160: 65 73 6f 6c 76 65 64 29 21 3d 30 20 29 3b 0a 20  esolved)!=0 );. 
c170: 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 6e   assert( pTab->n
c180: 43 6f 6c 3d 3d 70 53 65 6c 65 63 74 2d 3e 70 45  Col==pSelect->pE
c190: 4c 69 73 74 2d 3e 6e 45 78 70 72 20 7c 7c 20 64  List->nExpr || d
c1a0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
c1b0: 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  );.  if( db->mal
c1c0: 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75  locFailed ) retu
c1d0: 72 6e 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 4e  rn;.  memset(&sN
c1e0: 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43  C, 0, sizeof(sNC
c1f0: 29 29 3b 0a 20 20 73 4e 43 2e 70 53 72 63 4c 69  ));.  sNC.pSrcLi
c200: 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 53  st = pSelect->pS
c210: 72 63 3b 0a 20 20 61 20 3d 20 70 53 65 6c 65 63  rc;.  a = pSelec
c220: 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20  t->pEList->a;.  
c230: 66 6f 72 28 69 3d 30 2c 20 70 43 6f 6c 3d 70 54  for(i=0, pCol=pT
c240: 61 62 2d 3e 61 43 6f 6c 3b 20 69 3c 70 54 61 62  ab->aCol; i<pTab
c250: 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f  ->nCol; i++, pCo
c260: 6c 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20 61 5b  l++){.    p = a[
c270: 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 43  i].pExpr;.    pC
c280: 6f 6c 2d 3e 7a 54 79 70 65 20 3d 20 73 71 6c 69  ol->zType = sqli
c290: 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
c2a0: 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c  columnType(&sNC,
c2b0: 20 70 2c 20 30 2c 20 30 2c 20 30 29 29 3b 0a 20   p, 0, 0, 0));. 
c2c0: 20 20 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69     sqlite3Affini
c2d0: 74 79 54 79 70 65 28 70 43 6f 6c 2d 3e 7a 54 79  tyType(pCol->zTy
c2e0: 70 65 2c 20 26 70 43 6f 6c 2d 3e 73 7a 45 73 74  pe, &pCol->szEst
c2f0: 29 3b 0a 20 20 20 20 73 7a 41 6c 6c 20 2b 3d 20  );.    szAll += 
c300: 70 43 6f 6c 2d 3e 73 7a 45 73 74 3b 0a 20 20 20  pCol->szEst;.   
c310: 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20   pCol->affinity 
c320: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66  = sqlite3ExprAff
c330: 69 6e 69 74 79 28 70 29 3b 0a 20 20 20 20 69 66  inity(p);.    if
c340: 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79  ( pCol->affinity
c350: 3d 3d 30 20 29 20 70 43 6f 6c 2d 3e 61 66 66 69  ==0 ) pCol->affi
c360: 6e 69 74 79 20 3d 20 53 51 4c 49 54 45 5f 41 46  nity = SQLITE_AF
c370: 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 70 43 6f 6c  F_NONE;.    pCol
c380: 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
c390: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
c3a0: 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c  );.    if( pColl
c3b0: 20 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e   ){.      pCol->
c3c0: 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 44  zColl = sqlite3D
c3d0: 62 53 74 72 44 75 70 28 64 62 2c 20 70 43 6f 6c  bStrDup(db, pCol
c3e0: 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  l->zName);.    }
c3f0: 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e 73 7a 54  .  }.  pTab->szT
c400: 61 62 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c  abRow = sqlite3L
c410: 6f 67 45 73 74 28 73 7a 41 6c 6c 2a 34 29 3b 0a  ogEst(szAll*4);.
c420: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61  }../*.** Given a
c430: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
c440: 74 2c 20 67 65 6e 65 72 61 74 65 20 61 20 54 61  t, generate a Ta
c450: 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 68  ble structure th
c460: 61 74 20 64 65 73 63 72 69 62 65 73 0a 2a 2a 20  at describes.** 
c470: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f  the result set o
c480: 66 20 74 68 61 74 20 53 45 4c 45 43 54 2e 0a 2a  f that SELECT..*
c490: 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74 65 33  /.Table *sqlite3
c4a0: 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63  ResultSetOfSelec
c4b0: 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  t(Parse *pParse,
c4c0: 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
c4d0: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  ){.  Table *pTab
c4e0: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
c4f0: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
c500: 69 6e 74 20 73 61 76 65 64 46 6c 61 67 73 3b 0a  int savedFlags;.
c510: 0a 20 20 73 61 76 65 64 46 6c 61 67 73 20 3d 20  .  savedFlags = 
c520: 64 62 2d 3e 66 6c 61 67 73 3b 0a 20 20 64 62 2d  db->flags;.  db-
c530: 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54  >flags &= ~SQLIT
c540: 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 3b 0a  E_FullColNames;.
c550: 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53    db->flags |= S
c560: 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61  QLITE_ShortColNa
c570: 6d 65 73 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  mes;.  sqlite3Se
c580: 6c 65 63 74 50 72 65 70 28 70 50 61 72 73 65 2c  lectPrep(pParse,
c590: 20 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20   pSelect, 0);.  
c5a0: 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
c5b0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 77   ) return 0;.  w
c5c0: 68 69 6c 65 28 20 70 53 65 6c 65 63 74 2d 3e 70  hile( pSelect->p
c5d0: 50 72 69 6f 72 20 29 20 70 53 65 6c 65 63 74 20  Prior ) pSelect 
c5e0: 3d 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f  = pSelect->pPrio
c5f0: 72 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 3d  r;.  db->flags =
c600: 20 73 61 76 65 64 46 6c 61 67 73 3b 0a 20 20 70   savedFlags;.  p
c610: 54 61 62 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  Tab = sqlite3DbM
c620: 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
c630: 7a 65 6f 66 28 54 61 62 6c 65 29 20 29 3b 0a 20  zeof(Table) );. 
c640: 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a   if( pTab==0 ){.
c650: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
c660: 7d 0a 20 20 2f 2a 20 54 68 65 20 73 71 6c 69 74  }.  /* The sqlit
c670: 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c  e3ResultSetOfSel
c680: 65 63 74 28 29 20 69 73 20 6f 6e 6c 79 20 75 73  ect() is only us
c690: 65 64 20 6e 20 63 6f 6e 74 65 78 74 73 20 77 68  ed n contexts wh
c6a0: 65 72 65 20 6c 6f 6f 6b 61 73 69 64 65 0a 20 20  ere lookaside.  
c6b0: 2a 2a 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a  ** is disabled *
c6c0: 2f 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e  /.  assert( db->
c6d0: 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e 61 62 6c  lookaside.bEnabl
c6e0: 65 64 3d 3d 30 20 29 3b 0a 20 20 70 54 61 62 2d  ed==0 );.  pTab-
c6f0: 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 70 54 61  >nRef = 1;.  pTa
c700: 62 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20  b->zName = 0;.  
c710: 70 54 61 62 2d 3e 6e 52 6f 77 45 73 74 20 3d 20  pTab->nRowEst = 
c720: 31 30 34 38 35 37 36 3b 0a 20 20 73 65 6c 65 63  1048576;.  selec
c730: 74 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72  tColumnsFromExpr
c740: 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 53 65  List(pParse, pSe
c750: 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2c 20 26 70  lect->pEList, &p
c760: 54 61 62 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61 62  Tab->nCol, &pTab
c770: 2d 3e 61 43 6f 6c 29 3b 0a 20 20 73 65 6c 65 63  ->aCol);.  selec
c780: 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e  tAddColumnTypeAn
c790: 64 43 6f 6c 6c 61 74 69 6f 6e 28 70 50 61 72 73  dCollation(pPars
c7a0: 65 2c 20 70 54 61 62 2c 20 70 53 65 6c 65 63 74  e, pTab, pSelect
c7b0: 29 3b 0a 20 20 70 54 61 62 2d 3e 69 50 4b 65 79  );.  pTab->iPKey
c7c0: 20 3d 20 2d 31 3b 0a 20 20 69 66 28 20 64 62 2d   = -1;.  if( db-
c7d0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
c7e0: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65  .    sqlite3Dele
c7f0: 74 65 54 61 62 6c 65 28 64 62 2c 20 70 54 61 62  teTable(db, pTab
c800: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
c810: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 54  .  }.  return pT
c820: 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74  ab;.}../*.** Get
c830: 20 61 20 56 44 42 45 20 66 6f 72 20 74 68 65 20   a VDBE for the 
c840: 67 69 76 65 6e 20 70 61 72 73 65 72 20 63 6f 6e  given parser con
c850: 74 65 78 74 2e 20 20 43 72 65 61 74 65 20 61 20  text.  Create a 
c860: 6e 65 77 20 6f 6e 65 20 69 66 20 6e 65 63 65 73  new one if neces
c870: 73 61 72 79 2e 0a 2a 2a 20 49 66 20 61 6e 20 65  sary..** If an e
c880: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74  rror occurs, ret
c890: 75 72 6e 20 4e 55 4c 4c 20 61 6e 64 20 6c 65 61  urn NULL and lea
c8a0: 76 65 20 61 20 6d 65 73 73 61 67 65 20 69 6e 20  ve a message in 
c8b0: 70 50 61 72 73 65 2e 0a 2a 2f 0a 56 64 62 65 20  pParse..*/.Vdbe 
c8c0: 2a 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28  *sqlite3GetVdbe(
c8d0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
c8e0: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
c8f0: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 66 28  se->pVdbe;.  if(
c900: 20 76 3d 3d 30 20 29 7b 0a 20 20 20 20 76 20 3d   v==0 ){.    v =
c910: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 20 3d   pParse->pVdbe =
c920: 20 73 71 6c 69 74 65 33 56 64 62 65 43 72 65 61   sqlite3VdbeCrea
c930: 74 65 28 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a  te(pParse->db);.
c940: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
c950: 4d 49 54 5f 54 52 41 43 45 0a 20 20 20 20 69 66  MIT_TRACE.    if
c960: 28 20 76 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ( v ){.      sql
c970: 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76  ite3VdbeAddOp0(v
c980: 2c 20 4f 50 5f 54 72 61 63 65 29 3b 0a 20 20 20  , OP_Trace);.   
c990: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20   }.#endif.  }.  
c9a0: 72 65 74 75 72 6e 20 76 3b 0a 7d 0a 0a 0a 2f 2a  return v;.}.../*
c9b0: 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20  .** Compute the 
c9c0: 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73  iLimit and iOffs
c9d0: 65 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65  et fields of the
c9e0: 20 53 45 4c 45 43 54 20 62 61 73 65 64 20 6f 6e   SELECT based on
c9f0: 20 74 68 65 0a 2a 2a 20 70 4c 69 6d 69 74 20 61   the.** pLimit a
ca00: 6e 64 20 70 4f 66 66 73 65 74 20 65 78 70 72 65  nd pOffset expre
ca10: 73 73 69 6f 6e 73 2e 20 20 70 4c 69 6d 69 74 20  ssions.  pLimit 
ca20: 61 6e 64 20 70 4f 66 66 73 65 74 20 68 6f 6c 64  and pOffset hold
ca30: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73   the expressions
ca40: 0a 2a 2a 20 74 68 61 74 20 61 70 70 65 61 72 20  .** that appear 
ca50: 69 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  in the original 
ca60: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 61 66  SQL statement af
ca70: 74 65 72 20 74 68 65 20 4c 49 4d 49 54 20 61 6e  ter the LIMIT an
ca80: 64 20 4f 46 46 53 45 54 0a 2a 2a 20 6b 65 79 77  d OFFSET.** keyw
ca90: 6f 72 64 73 2e 20 20 4f 72 20 4e 55 4c 4c 20 69  ords.  Or NULL i
caa0: 66 20 74 68 6f 73 65 20 6b 65 79 77 6f 72 64 73  f those keywords
cab0: 20 61 72 65 20 6f 6d 69 74 74 65 64 2e 20 69 4c   are omitted. iL
cac0: 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74  imit and iOffset
cad0: 20 0a 2a 2a 20 61 72 65 20 74 68 65 20 69 6e 74   .** are the int
cae0: 65 67 65 72 20 6d 65 6d 6f 72 79 20 72 65 67 69  eger memory regi
caf0: 73 74 65 72 20 6e 75 6d 62 65 72 73 20 66 6f 72  ster numbers for
cb00: 20 63 6f 75 6e 74 65 72 73 20 75 73 65 64 20 74   counters used t
cb10: 6f 20 63 6f 6d 70 75 74 65 20 0a 2a 2a 20 74 68  o compute .** th
cb20: 65 20 6c 69 6d 69 74 20 61 6e 64 20 6f 66 66 73  e limit and offs
cb30: 65 74 2e 20 20 49 66 20 74 68 65 72 65 20 69 73  et.  If there is
cb40: 20 6e 6f 20 6c 69 6d 69 74 20 61 6e 64 2f 6f 72   no limit and/or
cb50: 20 6f 66 66 73 65 74 2c 20 74 68 65 6e 20 0a 2a   offset, then .*
cb60: 2a 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66  * iLimit and iOf
cb70: 66 73 65 74 20 61 72 65 20 6e 65 67 61 74 69 76  fset are negativ
cb80: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
cb90: 75 74 69 6e 65 20 63 68 61 6e 67 65 73 20 74 68  utine changes th
cba0: 65 20 76 61 6c 75 65 73 20 6f 66 20 69 4c 69 6d  e values of iLim
cbb0: 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20 6f  it and iOffset o
cbc0: 6e 6c 79 20 69 66 0a 2a 2a 20 61 20 6c 69 6d 69  nly if.** a limi
cbd0: 74 20 6f 72 20 6f 66 66 73 65 74 20 69 73 20 64  t or offset is d
cbe0: 65 66 69 6e 65 64 20 62 79 20 70 4c 69 6d 69 74  efined by pLimit
cbf0: 20 61 6e 64 20 70 4f 66 66 73 65 74 2e 20 20 69   and pOffset.  i
cc00: 4c 69 6d 69 74 20 61 6e 64 0a 2a 2a 20 69 4f 66  Limit and.** iOf
cc10: 66 73 65 74 20 73 68 6f 75 6c 64 20 68 61 76 65  fset should have
cc20: 20 62 65 65 6e 20 70 72 65 73 65 74 20 74 6f 20   been preset to 
cc30: 61 70 70 72 6f 70 72 69 61 74 65 20 64 65 66 61  appropriate defa
cc40: 75 6c 74 20 76 61 6c 75 65 73 0a 2a 2a 20 28 75  ult values.** (u
cc50: 73 75 61 6c 6c 79 20 62 75 74 20 6e 6f 74 20 61  sually but not a
cc60: 6c 77 61 79 73 20 2d 31 29 20 70 72 69 6f 72 20  lways -1) prior 
cc70: 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20  to calling this 
cc80: 72 6f 75 74 69 6e 65 2e 0a 2a 2a 20 4f 6e 6c 79  routine..** Only
cc90: 20 69 66 20 70 4c 69 6d 69 74 21 3d 30 20 6f 72   if pLimit!=0 or
cca0: 20 70 4f 66 66 73 65 74 21 3d 30 20 64 6f 20 74   pOffset!=0 do t
ccb0: 68 65 20 6c 69 6d 69 74 20 72 65 67 69 73 74 65  he limit registe
ccc0: 72 73 20 67 65 74 0a 2a 2a 20 72 65 64 65 66 69  rs get.** redefi
ccd0: 6e 65 64 2e 20 20 54 68 65 20 55 4e 49 4f 4e 20  ned.  The UNION 
cce0: 41 4c 4c 20 6f 70 65 72 61 74 6f 72 20 75 73 65  ALL operator use
ccf0: 73 20 74 68 69 73 20 70 72 6f 70 65 72 74 79 20  s this property 
cd00: 74 6f 20 66 6f 72 63 65 0a 2a 2a 20 74 68 65 20  to force.** the 
cd10: 72 65 75 73 65 20 6f 66 20 74 68 65 20 73 61 6d  reuse of the sam
cd20: 65 20 6c 69 6d 69 74 20 61 6e 64 20 6f 66 66 73  e limit and offs
cd30: 65 74 20 72 65 67 69 73 74 65 72 73 20 61 63 72  et registers acr
cd40: 6f 73 73 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20  oss multiple.** 
cd50: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
cd60: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
cd70: 64 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65  d computeLimitRe
cd80: 67 69 73 74 65 72 73 28 50 61 72 73 65 20 2a 70  gisters(Parse *p
cd90: 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70  Parse, Select *p
cda0: 2c 20 69 6e 74 20 69 42 72 65 61 6b 29 7b 0a 20  , int iBreak){. 
cdb0: 20 56 64 62 65 20 2a 76 20 3d 20 30 3b 0a 20 20   Vdbe *v = 0;.  
cdc0: 69 6e 74 20 69 4c 69 6d 69 74 20 3d 20 30 3b 0a  int iLimit = 0;.
cdd0: 20 20 69 6e 74 20 69 4f 66 66 73 65 74 3b 0a 20    int iOffset;. 
cde0: 20 69 6e 74 20 61 64 64 72 31 2c 20 6e 3b 0a 20   int addr1, n;. 
cdf0: 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29   if( p->iLimit )
ce00: 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 0a   return;..  /* .
ce10: 20 20 2a 2a 20 22 4c 49 4d 49 54 20 2d 31 22 20    ** "LIMIT -1" 
ce20: 61 6c 77 61 79 73 20 73 68 6f 77 73 20 61 6c 6c  always shows all
ce30: 20 72 6f 77 73 2e 20 20 54 68 65 72 65 20 69 73   rows.  There is
ce40: 20 73 6f 6d 65 0a 20 20 2a 2a 20 63 6f 6e 74 72   some.  ** contr
ce50: 6f 76 65 72 73 79 20 61 62 6f 75 74 20 77 68 61  oversy about wha
ce60: 74 20 74 68 65 20 63 6f 72 72 65 63 74 20 62 65  t the correct be
ce70: 68 61 76 69 6f 72 20 73 68 6f 75 6c 64 20 62 65  havior should be
ce80: 2e 0a 20 20 2a 2a 20 54 68 65 20 63 75 72 72 65  ..  ** The curre
ce90: 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  nt implementatio
cea0: 6e 20 69 6e 74 65 72 70 72 65 74 73 20 22 4c 49  n interprets "LI
ceb0: 4d 49 54 20 30 22 20 74 6f 20 6d 65 61 6e 0a 20  MIT 0" to mean. 
cec0: 20 2a 2a 20 6e 6f 20 72 6f 77 73 2e 0a 20 20 2a   ** no rows..  *
ced0: 2f 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43  /.  sqlite3ExprC
cee0: 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65  acheClear(pParse
cef0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
cf00: 70 4f 66 66 73 65 74 3d 3d 30 20 7c 7c 20 70 2d  pOffset==0 || p-
cf10: 3e 70 4c 69 6d 69 74 21 3d 30 20 29 3b 0a 20 20  >pLimit!=0 );.  
cf20: 69 66 28 20 70 2d 3e 70 4c 69 6d 69 74 20 29 7b  if( p->pLimit ){
cf30: 0a 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d  .    p->iLimit =
cf40: 20 69 4c 69 6d 69 74 20 3d 20 2b 2b 70 50 61 72   iLimit = ++pPar
cf50: 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 76 20  se->nMem;.    v 
cf60: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
cf70: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66  (pParse);.    if
cf80: 28 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 29 20  ( NEVER(v==0) ) 
cf90: 72 65 74 75 72 6e 3b 20 20 2f 2a 20 56 44 42 45  return;  /* VDBE
cfa0: 20 73 68 6f 75 6c 64 20 68 61 76 65 20 61 6c 72   should have alr
cfb0: 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61  eady been alloca
cfc0: 74 65 64 20 2a 2f 0a 20 20 20 20 69 66 28 20 73  ted */.    if( s
cfd0: 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65  qlite3ExprIsInte
cfe0: 67 65 72 28 70 2d 3e 70 4c 69 6d 69 74 2c 20 26  ger(p->pLimit, &
cff0: 6e 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  n) ){.      sqli
d000: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
d010: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 6e 2c 20   OP_Integer, n, 
d020: 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 56  iLimit);.      V
d030: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
d040: 4c 49 4d 49 54 20 63 6f 75 6e 74 65 72 22 29 29  LIMIT counter"))
d050: 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 3d 3d 30  ;.      if( n==0
d060: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
d070: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
d080: 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 69 42 72   OP_Goto, 0, iBr
d090: 65 61 6b 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  eak);.      }els
d0a0: 65 20 69 66 28 20 6e 3e 3d 30 20 26 26 20 70 2d  e if( n>=0 && p-
d0b0: 3e 6e 53 65 6c 65 63 74 52 6f 77 3e 28 75 36 34  >nSelectRow>(u64
d0c0: 29 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  )n ){.        p-
d0d0: 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 6e 3b  >nSelectRow = n;
d0e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
d0f0: 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
d100: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
d110: 2c 20 70 2d 3e 70 4c 69 6d 69 74 2c 20 69 4c 69  , p->pLimit, iLi
d120: 6d 69 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  mit);.      sqli
d130: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
d140: 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 69   OP_MustBeInt, i
d150: 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 56 64  Limit);.      Vd
d160: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c  beComment((v, "L
d170: 49 4d 49 54 20 63 6f 75 6e 74 65 72 22 29 29 3b  IMIT counter"));
d180: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
d190: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
d1a0: 66 5a 65 72 6f 2c 20 69 4c 69 6d 69 74 2c 20 69  fZero, iLimit, i
d1b0: 42 72 65 61 6b 29 3b 0a 20 20 20 20 7d 0a 20 20  Break);.    }.  
d1c0: 20 20 69 66 28 20 70 2d 3e 70 4f 66 66 73 65 74    if( p->pOffset
d1d0: 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69 4f 66   ){.      p->iOf
d1e0: 66 73 65 74 20 3d 20 69 4f 66 66 73 65 74 20 3d  fset = iOffset =
d1f0: 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
d200: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
d210: 4d 65 6d 2b 2b 3b 20 20 20 2f 2a 20 41 6c 6c 6f  Mem++;   /* Allo
d220: 63 61 74 65 20 61 6e 20 65 78 74 72 61 20 72 65  cate an extra re
d230: 67 69 73 74 65 72 20 66 6f 72 20 6c 69 6d 69 74  gister for limit
d240: 2b 6f 66 66 73 65 74 20 2a 2f 0a 20 20 20 20 20  +offset */.     
d250: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
d260: 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 4f 66 66  (pParse, p->pOff
d270: 73 65 74 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20  set, iOffset);. 
d280: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
d290: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4d 75 73  AddOp1(v, OP_Mus
d2a0: 74 42 65 49 6e 74 2c 20 69 4f 66 66 73 65 74 29  tBeInt, iOffset)
d2b0: 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
d2c0: 65 6e 74 28 28 76 2c 20 22 4f 46 46 53 45 54 20  ent((v, "OFFSET 
d2d0: 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20 20 20  counter"));.    
d2e0: 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65    addr1 = sqlite
d2f0: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
d300: 50 5f 49 66 50 6f 73 2c 20 69 4f 66 66 73 65 74  P_IfPos, iOffset
d310: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
d320: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
d330: 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 69 4f 66  _Integer, 0, iOf
d340: 66 73 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  fset);.      sql
d350: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
d360: 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 20 20  (v, addr1);.    
d370: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
d380: 4f 70 33 28 76 2c 20 4f 50 5f 41 64 64 2c 20 69  Op3(v, OP_Add, i
d390: 4c 69 6d 69 74 2c 20 69 4f 66 66 73 65 74 2c 20  Limit, iOffset, 
d3a0: 69 4f 66 66 73 65 74 2b 31 29 3b 0a 20 20 20 20  iOffset+1);.    
d3b0: 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
d3c0: 2c 20 22 4c 49 4d 49 54 2b 4f 46 46 53 45 54 22  , "LIMIT+OFFSET"
d3d0: 29 29 3b 0a 20 20 20 20 20 20 61 64 64 72 31 20  ));.      addr1 
d3e0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
d3f0: 4f 70 31 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c  Op1(v, OP_IfPos,
d400: 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20   iLimit);.      
d410: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
d420: 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
d430: 20 2d 31 2c 20 69 4f 66 66 73 65 74 2b 31 29 3b   -1, iOffset+1);
d440: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
d450: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
d460: 64 72 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  dr1);.    }.  }.
d470: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
d480: 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
d490: 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 52 65 74  SELECT./*.** Ret
d4a0: 75 72 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69  urn the appropri
d4b0: 61 74 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  ate collating se
d4c0: 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20 69  quence for the i
d4d0: 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66  Col-th column of
d4e0: 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 73  .** the result s
d4f0: 65 74 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 6f  et for the compo
d500: 75 6e 64 2d 73 65 6c 65 63 74 20 73 74 61 74 65  und-select state
d510: 6d 65 6e 74 20 22 70 22 2e 20 20 52 65 74 75 72  ment "p".  Retur
d520: 6e 20 4e 55 4c 4c 20 69 66 0a 2a 2a 20 74 68 65  n NULL if.** the
d530: 20 63 6f 6c 75 6d 6e 20 68 61 73 20 6e 6f 20 64   column has no d
d540: 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6e 67  efault collating
d550: 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a   sequence..**.**
d560: 20 54 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73   The collating s
d570: 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20  equence for the 
d580: 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20  compound select 
d590: 69 73 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68  is taken from th
d5a0: 65 0a 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74 20 74  e.** left-most t
d5b0: 65 72 6d 20 6f 66 20 74 68 65 20 73 65 6c 65 63  erm of the selec
d5c0: 74 20 74 68 61 74 20 68 61 73 20 61 20 63 6f 6c  t that has a col
d5d0: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e  lating sequence.
d5e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 43 6f 6c 6c 53  .*/.static CollS
d5f0: 65 71 20 2a 6d 75 6c 74 69 53 65 6c 65 63 74 43  eq *multiSelectC
d600: 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50  ollSeq(Parse *pP
d610: 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c  arse, Select *p,
d620: 20 69 6e 74 20 69 43 6f 6c 29 7b 0a 20 20 43 6f   int iCol){.  Co
d630: 6c 6c 53 65 71 20 2a 70 52 65 74 3b 0a 20 20 69  llSeq *pRet;.  i
d640: 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a  f( p->pPrior ){.
d650: 20 20 20 20 70 52 65 74 20 3d 20 6d 75 6c 74 69      pRet = multi
d660: 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50  SelectCollSeq(pP
d670: 61 72 73 65 2c 20 70 2d 3e 70 50 72 69 6f 72 2c  arse, p->pPrior,
d680: 20 69 43 6f 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b   iCol);.  }else{
d690: 0a 20 20 20 20 70 52 65 74 20 3d 20 30 3b 0a 20  .    pRet = 0;. 
d6a0: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 69 43 6f   }.  assert( iCo
d6b0: 6c 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 52  l>=0 );.  if( pR
d6c0: 65 74 3d 3d 30 20 26 26 20 69 43 6f 6c 3c 70 2d  et==0 && iCol<p-
d6d0: 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  >pEList->nExpr )
d6e0: 7b 0a 20 20 20 20 70 52 65 74 20 3d 20 73 71 6c  {.    pRet = sql
d6f0: 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
d700: 70 50 61 72 73 65 2c 20 70 2d 3e 70 45 4c 69 73  pParse, p->pELis
d710: 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78 70 72  t->a[iCol].pExpr
d720: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
d730: 70 52 65 74 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  pRet;.}.#endif /
d740: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  * SQLITE_OMIT_CO
d750: 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f  MPOUND_SELECT */
d760: 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66  ../* Forward ref
d770: 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63  erence */.static
d780: 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74   int multiSelect
d790: 4f 72 64 65 72 42 79 28 0a 20 20 50 61 72 73 65  OrderBy(.  Parse
d7a0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
d7b0: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
d7c0: 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
d7d0: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  *p,            /
d7e0: 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  * The right-most
d7f0: 20 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62   of SELECTs to b
d800: 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c  e coded */.  Sel
d810: 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 20  ectDest *pDest  
d820: 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f     /* What to do
d830: 20 77 69 74 68 20 71 75 65 72 79 20 72 65 73 75   with query resu
d840: 6c 74 73 20 2a 2f 0a 29 3b 0a 0a 0a 23 69 66 6e  lts */.);...#ifn
d850: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
d860: 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a  COMPOUND_SELECT.
d870: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
d880: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  ne is called to 
d890: 70 72 6f 63 65 73 73 20 61 20 63 6f 6d 70 6f 75  process a compou
d8a0: 6e 64 20 71 75 65 72 79 20 66 6f 72 6d 20 66 72  nd query form fr
d8b0: 6f 6d 0a 2a 2a 20 74 77 6f 20 6f 72 20 6d 6f 72  om.** two or mor
d8c0: 65 20 73 65 70 61 72 61 74 65 20 71 75 65 72 69  e separate queri
d8d0: 65 73 20 75 73 69 6e 67 20 55 4e 49 4f 4e 2c 20  es using UNION, 
d8e0: 55 4e 49 4f 4e 20 41 4c 4c 2c 20 45 58 43 45 50  UNION ALL, EXCEP
d8f0: 54 2c 20 6f 72 0a 2a 2a 20 49 4e 54 45 52 53 45  T, or.** INTERSE
d900: 43 54 0a 2a 2a 0a 2a 2a 20 22 70 22 20 70 6f 69  CT.**.** "p" poi
d910: 6e 74 73 20 74 6f 20 74 68 65 20 72 69 67 68 74  nts to the right
d920: 2d 6d 6f 73 74 20 6f 66 20 74 68 65 20 74 77 6f  -most of the two
d930: 20 71 75 65 72 69 65 73 2e 20 20 74 68 65 20 71   queries.  the q
d940: 75 65 72 79 20 6f 6e 20 74 68 65 0a 2a 2a 20 6c  uery on the.** l
d950: 65 66 74 20 69 73 20 70 2d 3e 70 50 72 69 6f 72  eft is p->pPrior
d960: 2e 20 20 54 68 65 20 6c 65 66 74 20 71 75 65 72  .  The left quer
d970: 79 20 63 6f 75 6c 64 20 61 6c 73 6f 20 62 65 20  y could also be 
d980: 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79  a compound query
d990: 0a 2a 2a 20 69 6e 20 77 68 69 63 68 20 63 61 73  .** in which cas
d9a0: 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  e this routine w
d9b0: 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 72 65  ill be called re
d9c0: 63 75 72 73 69 76 65 6c 79 2e 20 0a 2a 2a 0a 2a  cursively. .**.*
d9d0: 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20 6f 66  * The results of
d9e0: 20 74 68 65 20 74 6f 74 61 6c 20 71 75 65 72 79   the total query
d9f0: 20 61 72 65 20 74 6f 20 62 65 20 77 72 69 74 74   are to be writt
da00: 65 6e 20 69 6e 74 6f 20 61 20 64 65 73 74 69 6e  en into a destin
da10: 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74 79 70 65  ation.** of type
da20: 20 65 44 65 73 74 20 77 69 74 68 20 70 61 72 61   eDest with para
da30: 6d 65 74 65 72 20 69 50 61 72 6d 2e 0a 2a 2a 0a  meter iParm..**.
da40: 2a 2a 20 45 78 61 6d 70 6c 65 20 31 3a 20 20 43  ** Example 1:  C
da50: 6f 6e 73 69 64 65 72 20 61 20 74 68 72 65 65 2d  onsider a three-
da60: 77 61 79 20 63 6f 6d 70 6f 75 6e 64 20 53 51 4c  way compound SQL
da70: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a   statement..**.*
da80: 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61 20 46  *     SELECT a F
da90: 52 4f 4d 20 74 31 20 55 4e 49 4f 4e 20 53 45 4c  ROM t1 UNION SEL
daa0: 45 43 54 20 62 20 46 52 4f 4d 20 74 32 20 55 4e  ECT b FROM t2 UN
dab0: 49 4f 4e 20 53 45 4c 45 43 54 20 63 20 46 52 4f  ION SELECT c FRO
dac0: 4d 20 74 33 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  M t3.**.** This 
dad0: 73 74 61 74 65 6d 65 6e 74 20 69 73 20 70 61 72  statement is par
dae0: 73 65 64 20 75 70 20 61 73 20 66 6f 6c 6c 6f 77  sed up as follow
daf0: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c  s:.**.**     SEL
db00: 45 43 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a 2a  ECT c FROM t3.**
db10: 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
db20: 60 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20  `----->  SELECT 
db30: 62 20 46 52 4f 4d 20 74 32 0a 2a 2a 20 20 20 20  b FROM t2.**    
db40: 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a              |.**
db50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db60: 60 2d 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54  `------>  SELECT
db70: 20 61 20 46 52 4f 4d 20 74 31 0a 2a 2a 0a 2a 2a   a FROM t1.**.**
db80: 20 54 68 65 20 61 72 72 6f 77 73 20 69 6e 20 74   The arrows in t
db90: 68 65 20 64 69 61 67 72 61 6d 20 61 62 6f 76 65  he diagram above
dba0: 20 72 65 70 72 65 73 65 6e 74 20 74 68 65 20 53   represent the S
dbb0: 65 6c 65 63 74 2e 70 50 72 69 6f 72 20 70 6f 69  elect.pPrior poi
dbc0: 6e 74 65 72 2e 0a 2a 2a 20 53 6f 20 69 66 20 74  nter..** So if t
dbd0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
dbe0: 61 6c 6c 65 64 20 77 69 74 68 20 70 20 65 71 75  alled with p equ
dbf0: 61 6c 20 74 6f 20 74 68 65 20 74 33 20 71 75 65  al to the t3 que
dc00: 72 79 2c 20 74 68 65 6e 0a 2a 2a 20 70 50 72 69  ry, then.** pPri
dc10: 6f 72 20 77 69 6c 6c 20 62 65 20 74 68 65 20 74  or will be the t
dc20: 32 20 71 75 65 72 79 2e 20 20 70 2d 3e 6f 70 20  2 query.  p->op 
dc30: 77 69 6c 6c 20 62 65 20 54 4b 5f 55 4e 49 4f 4e  will be TK_UNION
dc40: 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a   in this case..*
dc50: 2a 0a 2a 2a 20 4e 6f 74 69 63 65 20 74 68 61 74  *.** Notice that
dc60: 20 62 65 63 61 75 73 65 20 6f 66 20 74 68 65 20   because of the 
dc70: 77 61 79 20 53 51 4c 69 74 65 20 70 61 72 73 65  way SQLite parse
dc80: 73 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43  s compound SELEC
dc90: 54 73 2c 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76  Ts, the.** indiv
dca0: 69 64 75 61 6c 20 73 65 6c 65 63 74 73 20 61 6c  idual selects al
dcb0: 77 61 79 73 20 67 72 6f 75 70 20 66 72 6f 6d 20  ways group from 
dcc0: 6c 65 66 74 20 74 6f 20 72 69 67 68 74 2e 0a 2a  left to right..*
dcd0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c  /.static int mul
dce0: 74 69 53 65 6c 65 63 74 28 0a 20 20 50 61 72 73  tiSelect(.  Pars
dcf0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
dd00: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
dd10: 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
dd20: 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
dd30: 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73  /* The right-mos
dd40: 74 20 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20  t of SELECTs to 
dd50: 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65  be coded */.  Se
dd60: 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20  lectDest *pDest 
dd70: 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64      /* What to d
dd80: 6f 20 77 69 74 68 20 71 75 65 72 79 20 72 65 73  o with query res
dd90: 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ults */.){.  int
dda0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
ddb0: 20 20 20 2f 2a 20 53 75 63 63 65 73 73 20 63 6f     /* Success co
ddc0: 64 65 20 66 72 6f 6d 20 61 20 73 75 62 72 6f 75  de from a subrou
ddd0: 74 69 6e 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74  tine */.  Select
dde0: 20 2a 70 50 72 69 6f 72 3b 20 20 20 20 20 20 20   *pPrior;       
ddf0: 2f 2a 20 41 6e 6f 74 68 65 72 20 53 45 4c 45 43  /* Another SELEC
de00: 54 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f  T immediately to
de10: 20 6f 75 72 20 6c 65 66 74 20 2a 2f 0a 20 20 56   our left */.  V
de20: 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20  dbe *v;         
de30: 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
de40: 20 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56 44   code to this VD
de50: 42 45 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  BE */.  SelectDe
de60: 73 74 20 64 65 73 74 3b 20 20 20 20 20 20 2f 2a  st dest;      /*
de70: 20 41 6c 74 65 72 6e 61 74 69 76 65 20 64 61 74   Alternative dat
de80: 61 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 2a 2f  a destination */
de90: 0a 20 20 53 65 6c 65 63 74 20 2a 70 44 65 6c 65  .  Select *pDele
dea0: 74 65 20 3d 20 30 3b 20 20 2f 2a 20 43 68 61 69  te = 0;  /* Chai
deb0: 6e 20 6f 66 20 73 69 6d 70 6c 65 20 73 65 6c 65  n of simple sele
dec0: 63 74 73 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f  cts to delete */
ded0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20  .  sqlite3 *db; 
dee0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
def0: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
df00: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
df10: 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20  E_OMIT_EXPLAIN. 
df20: 20 69 6e 74 20 69 53 75 62 31 3b 20 20 20 20 20   int iSub1;     
df30: 20 20 20 20 20 20 20 2f 2a 20 45 51 50 20 69 64         /* EQP id
df40: 20 6f 66 20 6c 65 66 74 2d 68 61 6e 64 20 71 75   of left-hand qu
df50: 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75  ery */.  int iSu
df60: 62 32 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  b2;            /
df70: 2a 20 45 51 50 20 69 64 20 6f 66 20 72 69 67 68  * EQP id of righ
df80: 74 2d 68 61 6e 64 20 71 75 65 72 79 20 2a 2f 0a  t-hand query */.
df90: 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4d 61 6b  #endif..  /* Mak
dfa0: 65 20 73 75 72 65 20 74 68 65 72 65 20 69 73 20  e sure there is 
dfb0: 6e 6f 20 4f 52 44 45 52 20 42 59 20 6f 72 20 4c  no ORDER BY or L
dfc0: 49 4d 49 54 20 63 6c 61 75 73 65 20 6f 6e 20 70  IMIT clause on p
dfd0: 72 69 6f 72 20 53 45 4c 45 43 54 73 2e 20 20 4f  rior SELECTs.  O
dfe0: 6e 6c 79 0a 20 20 2a 2a 20 74 68 65 20 6c 61 73  nly.  ** the las
dff0: 74 20 28 72 69 67 68 74 2d 6d 6f 73 74 29 20 53  t (right-most) S
e000: 45 4c 45 43 54 20 69 6e 20 74 68 65 20 73 65 72  ELECT in the ser
e010: 69 65 73 20 6d 61 79 20 68 61 76 65 20 61 6e 20  ies may have an 
e020: 4f 52 44 45 52 20 42 59 20 6f 72 20 4c 49 4d 49  ORDER BY or LIMI
e030: 54 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  T..  */.  assert
e040: 28 20 70 20 26 26 20 70 2d 3e 70 50 72 69 6f 72  ( p && p->pPrior
e050: 20 29 3b 20 20 2f 2a 20 43 61 6c 6c 69 6e 67 20   );  /* Calling 
e060: 66 75 6e 63 74 69 6f 6e 20 67 75 61 72 61 6e 74  function guarant
e070: 65 65 73 20 74 68 69 73 20 6d 75 63 68 20 2a 2f  ees this much */
e080: 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  .  db = pParse->
e090: 64 62 3b 0a 20 20 70 50 72 69 6f 72 20 3d 20 70  db;.  pPrior = p
e0a0: 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 61 73 73 65  ->pPrior;.  asse
e0b0: 72 74 28 20 70 50 72 69 6f 72 2d 3e 70 52 69 67  rt( pPrior->pRig
e0c0: 68 74 6d 6f 73 74 21 3d 70 50 72 69 6f 72 20 29  htmost!=pPrior )
e0d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 72 69  ;.  assert( pPri
e0e0: 6f 72 2d 3e 70 52 69 67 68 74 6d 6f 73 74 3d 3d  or->pRightmost==
e0f0: 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 20 29 3b  p->pRightmost );
e100: 0a 20 20 64 65 73 74 20 3d 20 2a 70 44 65 73 74  .  dest = *pDest
e110: 3b 0a 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e  ;.  if( pPrior->
e120: 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
e130: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
e140: 70 50 61 72 73 65 2c 22 4f 52 44 45 52 20 42 59  pParse,"ORDER BY
e150: 20 63 6c 61 75 73 65 20 73 68 6f 75 6c 64 20 63   clause should c
e160: 6f 6d 65 20 61 66 74 65 72 20 25 73 20 6e 6f 74  ome after %s not
e170: 20 62 65 66 6f 72 65 22 2c 0a 20 20 20 20 20 20   before",.      
e180: 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e  selectOpName(p->
e190: 6f 70 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 31  op));.    rc = 1
e1a0: 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69  ;.    goto multi
e1b0: 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d  _select_end;.  }
e1c0: 0a 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70  .  if( pPrior->p
e1d0: 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c  Limit ){.    sql
e1e0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
e1f0: 72 73 65 2c 22 4c 49 4d 49 54 20 63 6c 61 75 73  rse,"LIMIT claus
e200: 65 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20 61 66  e should come af
e210: 74 65 72 20 25 73 20 6e 6f 74 20 62 65 66 6f 72  ter %s not befor
e220: 65 22 2c 0a 20 20 20 20 20 20 73 65 6c 65 63 74  e",.      select
e230: 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a  OpName(p->op));.
e240: 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
e250: 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
e260: 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 76 20  t_end;.  }..  v 
e270: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
e280: 28 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73 65  (pParse);.  asse
e290: 72 74 28 20 76 21 3d 30 20 29 3b 20 20 2f 2a 20  rt( v!=0 );  /* 
e2a0: 54 68 65 20 56 44 42 45 20 61 6c 72 65 61 64 79  The VDBE already
e2b0: 20 63 72 65 61 74 65 64 20 62 79 20 63 61 6c 6c   created by call
e2c0: 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  ing function */.
e2d0: 0a 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65  .  /* Create the
e2e0: 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 74 65 6d   destination tem
e2f0: 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 66 20  porary table if 
e300: 6e 65 63 65 73 73 61 72 79 0a 20 20 2a 2f 0a 20  necessary.  */. 
e310: 20 69 66 28 20 64 65 73 74 2e 65 44 65 73 74 3d   if( dest.eDest=
e320: 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29 7b  =SRT_EphemTab ){
e330: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
e340: 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 73 71  pEList );.    sq
e350: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
e360: 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
e370: 72 61 6c 2c 20 64 65 73 74 2e 69 53 44 50 61 72  ral, dest.iSDPar
e380: 6d 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  m, p->pEList->nE
e390: 78 70 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  xpr);.    sqlite
e3a0: 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
e3b0: 20 42 54 52 45 45 5f 55 4e 4f 52 44 45 52 45 44   BTREE_UNORDERED
e3c0: 29 3b 0a 20 20 20 20 64 65 73 74 2e 65 44 65 73  );.    dest.eDes
e3d0: 74 20 3d 20 53 52 54 5f 54 61 62 6c 65 3b 0a 20  t = SRT_Table;. 
e3e0: 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75   }..  /* Make su
e3f0: 72 65 20 61 6c 6c 20 53 45 4c 45 43 54 73 20 69  re all SELECTs i
e400: 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  n the statement 
e410: 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e 75  have the same nu
e420: 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73  mber of elements
e430: 0a 20 20 2a 2a 20 69 6e 20 74 68 65 69 72 20 72  .  ** in their r
e440: 65 73 75 6c 74 20 73 65 74 73 2e 0a 20 20 2a 2f  esult sets..  */
e450: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45  .  assert( p->pE
e460: 4c 69 73 74 20 26 26 20 70 50 72 69 6f 72 2d 3e  List && pPrior->
e470: 70 45 4c 69 73 74 20 29 3b 0a 20 20 69 66 28 20  pEList );.  if( 
e480: 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
e490: 21 3d 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74  !=pPrior->pEList
e4a0: 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 69  ->nExpr ){.    i
e4b0: 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  f( p->selFlags &
e4c0: 20 53 46 5f 56 61 6c 75 65 73 20 29 7b 0a 20 20   SF_Values ){.  
e4d0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
e4e0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61 6c 6c  Msg(pParse, "all
e4f0: 20 56 41 4c 55 45 53 20 6d 75 73 74 20 68 61 76   VALUES must hav
e500: 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65  e the same numbe
e510: 72 20 6f 66 20 74 65 72 6d 73 22 29 3b 0a 20 20  r of terms");.  
e520: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
e530: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
e540: 50 61 72 73 65 2c 20 22 53 45 4c 45 43 54 73 20  Parse, "SELECTs 
e550: 74 6f 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20  to the left and 
e560: 72 69 67 68 74 20 6f 66 20 25 73 22 0a 20 20 20  right of %s".   
e570: 20 20 20 20 20 22 20 64 6f 20 6e 6f 74 20 68 61       " do not ha
e580: 76 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62  ve the same numb
e590: 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c  er of result col
e5a0: 75 6d 6e 73 22 2c 20 73 65 6c 65 63 74 4f 70 4e  umns", selectOpN
e5b0: 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20  ame(p->op));.   
e5c0: 20 7d 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20   }.    rc = 1;. 
e5d0: 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
e5e0: 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20  lect_end;.  }.. 
e5f0: 20 2f 2a 20 43 6f 6d 70 6f 75 6e 64 20 53 45 4c   /* Compound SEL
e600: 45 43 54 73 20 74 68 61 74 20 68 61 76 65 20 61  ECTs that have a
e610: 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
e620: 65 20 61 72 65 20 68 61 6e 64 6c 65 64 20 73 65  e are handled se
e630: 70 61 72 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20  parately..  */. 
e640: 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79   if( p->pOrderBy
e650: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6d   ){.    return m
e660: 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42  ultiSelectOrderB
e670: 79 28 70 50 61 72 73 65 2c 20 70 2c 20 70 44 65  y(pParse, p, pDe
e680: 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47  st);.  }..  /* G
e690: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
e6a0: 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20 72 69   the left and ri
e6b0: 67 68 74 20 53 45 4c 45 43 54 20 73 74 61 74 65  ght SELECT state
e6c0: 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 73 77  ments..  */.  sw
e6d0: 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20  itch( p->op ){. 
e6e0: 20 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20     case TK_ALL: 
e6f0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  {.      int addr
e700: 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20   = 0;.      int 
e710: 6e 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 61 73  nLimit;.      as
e720: 73 65 72 74 28 20 21 70 50 72 69 6f 72 2d 3e 70  sert( !pPrior->p
e730: 4c 69 6d 69 74 20 29 3b 0a 20 20 20 20 20 20 70  Limit );.      p
e740: 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 20 3d 20  Prior->iLimit = 
e750: 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 20 20 20  p->iLimit;.     
e760: 20 70 50 72 69 6f 72 2d 3e 69 4f 66 66 73 65 74   pPrior->iOffset
e770: 20 3d 20 70 2d 3e 69 4f 66 66 73 65 74 3b 0a 20   = p->iOffset;. 
e780: 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 70 4c 69       pPrior->pLi
e790: 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b  mit = p->pLimit;
e7a0: 0a 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 70  .      pPrior->p
e7b0: 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66  Offset = p->pOff
e7c0: 73 65 74 3b 0a 20 20 20 20 20 20 65 78 70 6c 61  set;.      expla
e7d0: 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53 75  inSetInteger(iSu
e7e0: 62 31 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78  b1, pParse->iNex
e7f0: 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20  tSelectId);.    
e800: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65    rc = sqlite3Se
e810: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50 72  lect(pParse, pPr
e820: 69 6f 72 2c 20 26 64 65 73 74 29 3b 0a 20 20 20  ior, &dest);.   
e830: 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30     p->pLimit = 0
e840: 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73  ;.      p->pOffs
e850: 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66  et = 0;.      if
e860: 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
e870: 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
e880: 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20  t_end;.      }. 
e890: 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d       p->pPrior =
e8a0: 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4c 69   0;.      p->iLi
e8b0: 6d 69 74 20 3d 20 70 50 72 69 6f 72 2d 3e 69 4c  mit = pPrior->iL
e8c0: 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 69  imit;.      p->i
e8d0: 4f 66 66 73 65 74 20 3d 20 70 50 72 69 6f 72 2d  Offset = pPrior-
e8e0: 3e 69 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  >iOffset;.      
e8f0: 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29 7b  if( p->iLimit ){
e900: 0a 20 20 20 20 20 20 20 20 61 64 64 72 20 3d 20  .        addr = 
e910: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
e920: 31 28 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c 20  1(v, OP_IfZero, 
e930: 70 2d 3e 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20  p->iLimit);.    
e940: 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
e950: 28 76 2c 20 22 4a 75 6d 70 20 61 68 65 61 64 20  (v, "Jump ahead 
e960: 69 66 20 4c 49 4d 49 54 20 72 65 61 63 68 65 64  if LIMIT reached
e970: 22 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  "));.      }.   
e980: 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74     explainSetInt
e990: 65 67 65 72 28 69 53 75 62 32 2c 20 70 50 61 72  eger(iSub2, pPar
e9a0: 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49  se->iNextSelectI
e9b0: 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  d);.      rc = s
e9c0: 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
e9d0: 72 73 65 2c 20 70 2c 20 26 64 65 73 74 29 3b 0a  rse, p, &dest);.
e9e0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
e9f0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc!=SQLITE_OK );
ea00: 0a 20 20 20 20 20 20 70 44 65 6c 65 74 65 20 3d  .      pDelete =
ea10: 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20   p->pPrior;.    
ea20: 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50    p->pPrior = pP
ea30: 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 6e  rior;.      p->n
ea40: 53 65 6c 65 63 74 52 6f 77 20 2b 3d 20 70 50 72  SelectRow += pPr
ea50: 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b  ior->nSelectRow;
ea60: 0a 20 20 20 20 20 20 69 66 28 20 70 50 72 69 6f  .      if( pPrio
ea70: 72 2d 3e 70 4c 69 6d 69 74 0a 20 20 20 20 20 20  r->pLimit.      
ea80: 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 49   && sqlite3ExprI
ea90: 73 49 6e 74 65 67 65 72 28 70 50 72 69 6f 72 2d  sInteger(pPrior-
eaa0: 3e 70 4c 69 6d 69 74 2c 20 26 6e 4c 69 6d 69 74  >pLimit, &nLimit
eab0: 29 0a 20 20 20 20 20 20 20 26 26 20 6e 4c 69 6d  ).       && nLim
eac0: 69 74 3e 30 20 26 26 20 70 2d 3e 6e 53 65 6c 65  it>0 && p->nSele
ead0: 63 74 52 6f 77 20 3e 20 28 75 36 34 29 6e 4c 69  ctRow > (u64)nLi
eae0: 6d 69 74 20 0a 20 20 20 20 20 20 29 7b 0a 20 20  mit .      ){.  
eaf0: 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74        p->nSelect
eb00: 52 6f 77 20 3d 20 6e 4c 69 6d 69 74 3b 0a 20 20  Row = nLimit;.  
eb10: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
eb20: 61 64 64 72 20 29 7b 0a 20 20 20 20 20 20 20 20  addr ){.        
eb30: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
eb40: 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20  ere(v, addr);.  
eb50: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
eb60: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
eb70: 65 20 54 4b 5f 45 58 43 45 50 54 3a 0a 20 20 20  e TK_EXCEPT:.   
eb80: 20 63 61 73 65 20 54 4b 5f 55 4e 49 4f 4e 3a 20   case TK_UNION: 
eb90: 7b 0a 20 20 20 20 20 20 69 6e 74 20 75 6e 69 6f  {.      int unio
eba0: 6e 54 61 62 3b 20 20 20 20 2f 2a 20 43 75 72 73  nTab;    /* Curs
ebb0: 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  or number of the
ebc0: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
ebd0: 20 68 6f 6c 64 69 6e 67 20 72 65 73 75 6c 74 20   holding result 
ebe0: 2a 2f 0a 20 20 20 20 20 20 75 38 20 6f 70 20 3d  */.      u8 op =
ebf0: 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65   0;       /* One
ec00: 20 6f 66 20 74 68 65 20 53 52 54 5f 20 6f 70 65   of the SRT_ ope
ec10: 72 61 74 69 6f 6e 73 20 74 6f 20 61 70 70 6c 79  rations to apply
ec20: 20 74 6f 20 73 65 6c 66 20 2a 2f 0a 20 20 20 20   to self */.    
ec30: 20 20 69 6e 74 20 70 72 69 6f 72 4f 70 3b 20 20    int priorOp;  
ec40: 20 20 20 2f 2a 20 54 68 65 20 53 52 54 5f 20 6f     /* The SRT_ o
ec50: 70 65 72 61 74 69 6f 6e 20 74 6f 20 61 70 70 6c  peration to appl
ec60: 79 20 74 6f 20 70 72 69 6f 72 20 73 65 6c 65 63  y to prior selec
ec70: 74 73 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72  ts */.      Expr
ec80: 20 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f 66 66 73   *pLimit, *pOffs
ec90: 65 74 3b 20 2f 2a 20 53 61 76 65 64 20 76 61 6c  et; /* Saved val
eca0: 75 65 73 20 6f 66 20 70 2d 3e 6e 4c 69 6d 69 74  ues of p->nLimit
ecb0: 20 61 6e 64 20 70 2d 3e 6e 4f 66 66 73 65 74 20   and p->nOffset 
ecc0: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  */.      int add
ecd0: 72 3b 0a 20 20 20 20 20 20 53 65 6c 65 63 74 44  r;.      SelectD
ece0: 65 73 74 20 75 6e 69 6f 6e 64 65 73 74 3b 0a 0a  est uniondest;..
ecf0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
ed00: 70 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54  p->op==TK_EXCEPT
ed10: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
ed20: 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e  se( p->op==TK_UN
ed30: 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 70 72 69  ION );.      pri
ed40: 6f 72 4f 70 20 3d 20 53 52 54 5f 55 6e 69 6f 6e  orOp = SRT_Union
ed50: 3b 0a 20 20 20 20 20 20 69 66 28 20 64 65 73 74  ;.      if( dest
ed60: 2e 65 44 65 73 74 3d 3d 70 72 69 6f 72 4f 70 20  .eDest==priorOp 
ed70: 26 26 20 41 4c 57 41 59 53 28 21 70 2d 3e 70 4c  && ALWAYS(!p->pL
ed80: 69 6d 69 74 20 26 26 21 70 2d 3e 70 4f 66 66 73  imit &&!p->pOffs
ed90: 65 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  et) ){.        /
eda0: 2a 20 57 65 20 63 61 6e 20 72 65 75 73 65 20 61  * We can reuse a
edb0: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
edc0: 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 61 20   generated by a 
edd0: 53 45 4c 45 43 54 20 74 6f 20 6f 75 72 0a 20 20  SELECT to our.  
ede0: 20 20 20 20 20 20 2a 2a 20 72 69 67 68 74 2e 0a        ** right..
edf0: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
ee00: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52     assert( p->pR
ee10: 69 67 68 74 6d 6f 73 74 21 3d 70 20 29 3b 20 20  ightmost!=p );  
ee20: 2f 2a 20 43 61 6e 20 6f 6e 6c 79 20 68 61 70 70  /* Can only happ
ee30: 65 6e 20 66 6f 72 20 6c 65 66 74 77 61 72 64 20  en for leftward 
ee40: 65 6c 65 6d 65 6e 74 73 0a 20 20 20 20 20 20 20  elements.       
ee50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
ee70: 20 6f 66 20 61 20 33 2d 77 61 79 20 6f 72 20 6d   of a 3-way or m
ee80: 6f 72 65 20 63 6f 6d 70 6f 75 6e 64 20 2a 2f 0a  ore compound */.
ee90: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
eea0: 70 2d 3e 70 4c 69 6d 69 74 3d 3d 30 20 29 3b 20  p->pLimit==0 ); 
eeb0: 20 20 20 20 20 2f 2a 20 4e 6f 74 20 61 6c 6c 6f       /* Not allo
eec0: 77 65 64 20 6f 6e 20 6c 65 66 74 77 61 72 64 20  wed on leftward 
eed0: 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20  elements */.    
eee0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
eef0: 4f 66 66 73 65 74 3d 3d 30 20 29 3b 20 20 20 20  Offset==0 );    
ef00: 20 2f 2a 20 4e 6f 74 20 61 6c 6c 6f 77 65 64 20   /* Not allowed 
ef10: 6f 6e 20 6c 65 66 74 77 61 72 64 20 65 6c 65 6d  on leftward elem
ef20: 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  ents */.        
ef30: 75 6e 69 6f 6e 54 61 62 20 3d 20 64 65 73 74 2e  unionTab = dest.
ef40: 69 53 44 50 61 72 6d 3b 0a 20 20 20 20 20 20 7d  iSDParm;.      }
ef50: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
ef60: 20 57 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f   We will need to
ef70: 20 63 72 65 61 74 65 20 6f 75 72 20 6f 77 6e 20   create our own 
ef80: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
ef90: 74 6f 20 68 6f 6c 64 20 74 68 65 0a 20 20 20 20  to hold the.    
efa0: 20 20 20 20 2a 2a 20 69 6e 74 65 72 6d 65 64 69      ** intermedi
efb0: 61 74 65 20 72 65 73 75 6c 74 73 2e 0a 20 20 20  ate results..   
efc0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
efd0: 75 6e 69 6f 6e 54 61 62 20 3d 20 70 50 61 72 73  unionTab = pPars
efe0: 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20  e->nTab++;.     
eff0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f     assert( p->pO
f000: 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20 20  rderBy==0 );.   
f010: 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69       addr = sqli
f020: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
f030: 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
f040: 6c 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b  l, unionTab, 0);
f050: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
f060: 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d   p->addrOpenEphm
f070: 5b 30 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20  [0] == -1 );.   
f080: 20 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e       p->addrOpen
f090: 45 70 68 6d 5b 30 5d 20 3d 20 61 64 64 72 3b 0a  Ephm[0] = addr;.
f0a0: 20 20 20 20 20 20 20 20 70 2d 3e 70 52 69 67 68          p->pRigh
f0b0: 74 6d 6f 73 74 2d 3e 73 65 6c 46 6c 61 67 73 20  tmost->selFlags 
f0c0: 7c 3d 20 53 46 5f 55 73 65 73 45 70 68 65 6d 65  |= SF_UsesEpheme
f0d0: 72 61 6c 3b 0a 20 20 20 20 20 20 20 20 61 73 73  ral;.        ass
f0e0: 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29  ert( p->pEList )
f0f0: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
f100: 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 53 45 4c   /* Code the SEL
f110: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 74  ECT statements t
f120: 6f 20 6f 75 72 20 6c 65 66 74 0a 20 20 20 20 20  o our left.     
f130: 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
f140: 28 20 21 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65  ( !pPrior->pOrde
f150: 72 42 79 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  rBy );.      sql
f160: 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e  ite3SelectDestIn
f170: 69 74 28 26 75 6e 69 6f 6e 64 65 73 74 2c 20 70  it(&uniondest, p
f180: 72 69 6f 72 4f 70 2c 20 75 6e 69 6f 6e 54 61 62  riorOp, unionTab
f190: 29 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e  );.      explain
f1a0: 53 65 74 49 6e 74 65 67 65 72 28 69 53 75 62 31  SetInteger(iSub1
f1b0: 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53  , pParse->iNextS
f1c0: 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20  electId);.      
f1d0: 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  rc = sqlite3Sele
f1e0: 63 74 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f  ct(pParse, pPrio
f1f0: 72 2c 20 26 75 6e 69 6f 6e 64 65 73 74 29 3b 0a  r, &uniondest);.
f200: 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
f210: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c          goto mul
f220: 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
f230: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
f240: 20 43 6f 64 65 20 74 68 65 20 63 75 72 72 65 6e   Code the curren
f250: 74 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  t SELECT stateme
f260: 6e 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  nt.      */.    
f270: 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f    if( p->op==TK_
f280: 45 58 43 45 50 54 20 29 7b 0a 20 20 20 20 20 20  EXCEPT ){.      
f290: 20 20 6f 70 20 3d 20 53 52 54 5f 45 78 63 65 70    op = SRT_Excep
f2a0: 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  t;.      }else{.
f2b0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
f2c0: 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20  p->op==TK_UNION 
f2d0: 29 3b 0a 20 20 20 20 20 20 20 20 6f 70 20 3d 20  );.        op = 
f2e0: 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20 20  SRT_Union;.     
f2f0: 20 7d 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69   }.      p->pPri
f300: 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4c  or = 0;.      pL
f310: 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74  imit = p->pLimit
f320: 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69  ;.      p->pLimi
f330: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f 66  t = 0;.      pOf
f340: 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65  fset = p->pOffse
f350: 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66  t;.      p->pOff
f360: 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 75  set = 0;.      u
f370: 6e 69 6f 6e 64 65 73 74 2e 65 44 65 73 74 20 3d  niondest.eDest =
f380: 20 6f 70 3b 0a 20 20 20 20 20 20 65 78 70 6c 61   op;.      expla
f390: 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53 75  inSetInteger(iSu
f3a0: 62 32 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78  b2, pParse->iNex
f3b0: 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20  tSelectId);.    
f3c0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65    rc = sqlite3Se
f3d0: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20  lect(pParse, p, 
f3e0: 26 75 6e 69 6f 6e 64 65 73 74 29 3b 0a 20 20 20  &uniondest);.   
f3f0: 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21     testcase( rc!
f400: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
f410: 20 20 20 20 2f 2a 20 51 75 65 72 79 20 66 6c 61      /* Query fla
f420: 74 74 65 6e 69 6e 67 20 69 6e 20 73 71 6c 69 74  ttening in sqlit
f430: 65 33 53 65 6c 65 63 74 28 29 20 6d 69 67 68 74  e3Select() might
f440: 20 72 65 66 69 6c 6c 20 70 2d 3e 70 4f 72 64 65   refill p->pOrde
f450: 72 42 79 2e 0a 20 20 20 20 20 20 2a 2a 20 42 65  rBy..      ** Be
f460: 20 73 75 72 65 20 74 6f 20 64 65 6c 65 74 65 20   sure to delete 
f470: 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 74 68 65  p->pOrderBy, the
f480: 72 65 66 6f 72 65 2c 20 74 6f 20 61 76 6f 69 64  refore, to avoid
f490: 20 61 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 2e 20   a memory leak. 
f4a0: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
f4b0: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
f4c0: 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b  b, p->pOrderBy);
f4d0: 0a 20 20 20 20 20 20 70 44 65 6c 65 74 65 20 3d  .      pDelete =
f4e0: 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20   p->pPrior;.    
f4f0: 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50    p->pPrior = pP
f500: 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70  rior;.      p->p
f510: 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20  OrderBy = 0;.   
f520: 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b     if( p->op==TK
f530: 5f 55 4e 49 4f 4e 20 29 20 70 2d 3e 6e 53 65 6c  _UNION ) p->nSel
f540: 65 63 74 52 6f 77 20 2b 3d 20 70 50 72 69 6f 72  ectRow += pPrior
f550: 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20  ->nSelectRow;.  
f560: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
f570: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69  elete(db, p->pLi
f580: 6d 69 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70  mit);.      p->p
f590: 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a  Limit = pLimit;.
f5a0: 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74        p->pOffset
f5b0: 20 3d 20 70 4f 66 66 73 65 74 3b 0a 20 20 20 20   = pOffset;.    
f5c0: 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b    p->iLimit = 0;
f5d0: 0a 20 20 20 20 20 20 70 2d 3e 69 4f 66 66 73 65  .      p->iOffse
f5e0: 74 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 2f 2a  t = 0;..      /*
f5f0: 20 43 6f 6e 76 65 72 74 20 74 68 65 20 64 61 74   Convert the dat
f600: 61 20 69 6e 20 74 68 65 20 74 65 6d 70 6f 72 61  a in the tempora
f610: 72 79 20 74 61 62 6c 65 20 69 6e 74 6f 20 77 68  ry table into wh
f620: 61 74 65 76 65 72 20 66 6f 72 6d 0a 20 20 20 20  atever form.    
f630: 20 20 2a 2a 20 69 74 20 69 73 20 74 68 61 74 20    ** it is that 
f640: 77 65 20 63 75 72 72 65 6e 74 6c 79 20 6e 65 65  we currently nee
f650: 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  d..      */.    
f660: 20 20 61 73 73 65 72 74 28 20 75 6e 69 6f 6e 54    assert( unionT
f670: 61 62 3d 3d 64 65 73 74 2e 69 53 44 50 61 72 6d  ab==dest.iSDParm
f680: 20 7c 7c 20 64 65 73 74 2e 65 44 65 73 74 21 3d   || dest.eDest!=
f690: 70 72 69 6f 72 4f 70 20 29 3b 0a 20 20 20 20 20  priorOp );.     
f6a0: 20 69 66 28 20 64 65 73 74 2e 65 44 65 73 74 21   if( dest.eDest!
f6b0: 3d 70 72 69 6f 72 4f 70 20 29 7b 0a 20 20 20 20  =priorOp ){.    
f6c0: 20 20 20 20 69 6e 74 20 69 43 6f 6e 74 2c 20 69      int iCont, i
f6d0: 42 72 65 61 6b 2c 20 69 53 74 61 72 74 3b 0a 20  Break, iStart;. 
f6e0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
f6f0: 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20  ->pEList );.    
f700: 20 20 20 20 69 66 28 20 64 65 73 74 2e 65 44 65      if( dest.eDe
f710: 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29  st==SRT_Output )
f720: 7b 0a 20 20 20 20 20 20 20 20 20 20 53 65 6c 65  {.          Sele
f730: 63 74 20 2a 70 46 69 72 73 74 20 3d 20 70 3b 0a  ct *pFirst = p;.
f740: 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28            while(
f750: 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 20   pFirst->pPrior 
f760: 29 20 70 46 69 72 73 74 20 3d 20 70 46 69 72 73  ) pFirst = pFirs
f770: 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20  t->pPrior;.     
f780: 20 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c       generateCol
f790: 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c  umnNames(pParse,
f7a0: 20 30 2c 20 70 46 69 72 73 74 2d 3e 70 45 4c 69   0, pFirst->pELi
f7b0: 73 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  st);.        }. 
f7c0: 20 20 20 20 20 20 20 69 42 72 65 61 6b 20 3d 20         iBreak = 
f7d0: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
f7e0: 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20  abel(v);.       
f7f0: 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33   iCont = sqlite3
f800: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
f810: 3b 0a 20 20 20 20 20 20 20 20 63 6f 6d 70 75 74  ;.        comput
f820: 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28  eLimitRegisters(
f830: 70 50 61 72 73 65 2c 20 70 2c 20 69 42 72 65 61  pParse, p, iBrea
f840: 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  k);.        sqli
f850: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
f860: 20 4f 50 5f 52 65 77 69 6e 64 2c 20 75 6e 69 6f   OP_Rewind, unio
f870: 6e 54 61 62 2c 20 69 42 72 65 61 6b 29 3b 0a 20  nTab, iBreak);. 
f880: 20 20 20 20 20 20 20 69 53 74 61 72 74 20 3d 20         iStart = 
f890: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
f8a0: 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20  ntAddr(v);.     
f8b0: 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f     selectInnerLo
f8c0: 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d  op(pParse, p, p-
f8d0: 3e 70 45 4c 69 73 74 2c 20 75 6e 69 6f 6e 54 61  >pEList, unionTa
f8e0: 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  b, p->pEList->nE
f8f0: 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20  xpr,.           
f900: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20               0, 
f910: 30 2c 20 26 64 65 73 74 2c 20 69 43 6f 6e 74 2c  0, &dest, iCont,
f920: 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
f930: 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
f940: 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f  olveLabel(v, iCo
f950: 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  nt);.        sql
f960: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
f970: 2c 20 4f 50 5f 4e 65 78 74 2c 20 75 6e 69 6f 6e  , OP_Next, union
f980: 54 61 62 2c 20 69 53 74 61 72 74 29 3b 0a 20 20  Tab, iStart);.  
f990: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
f9a0: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
f9b0: 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
f9c0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
f9d0: 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  Op2(v, OP_Close,
f9e0: 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a 20   unionTab, 0);. 
f9f0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
fa00: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65  ak;.    }.    de
fa10: 66 61 75 6c 74 3a 20 61 73 73 65 72 74 28 20 70  fault: assert( p
fa20: 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45  ->op==TK_INTERSE
fa30: 43 54 20 29 3b 20 7b 0a 20 20 20 20 20 20 69 6e  CT ); {.      in
fa40: 74 20 74 61 62 31 2c 20 74 61 62 32 3b 0a 20 20  t tab1, tab2;.  
fa50: 20 20 20 20 69 6e 74 20 69 43 6f 6e 74 2c 20 69      int iCont, i
fa60: 42 72 65 61 6b 2c 20 69 53 74 61 72 74 3b 0a 20  Break, iStart;. 
fa70: 20 20 20 20 20 45 78 70 72 20 2a 70 4c 69 6d 69       Expr *pLimi
fa80: 74 2c 20 2a 70 4f 66 66 73 65 74 3b 0a 20 20 20  t, *pOffset;.   
fa90: 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20     int addr;.   
faa0: 20 20 20 53 65 6c 65 63 74 44 65 73 74 20 69 6e     SelectDest in
fab0: 74 65 72 73 65 63 74 64 65 73 74 3b 0a 20 20 20  tersectdest;.   
fac0: 20 20 20 69 6e 74 20 72 31 3b 0a 0a 20 20 20 20     int r1;..    
fad0: 20 20 2f 2a 20 49 4e 54 45 52 53 45 43 54 20 69    /* INTERSECT i
fae0: 73 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d  s different from
faf0: 20 74 68 65 20 6f 74 68 65 72 73 20 73 69 6e 63   the others sinc
fb00: 65 20 69 74 20 72 65 71 75 69 72 65 73 0a 20 20  e it requires.  
fb10: 20 20 20 20 2a 2a 20 74 77 6f 20 74 65 6d 70 6f      ** two tempo
fb20: 72 61 72 79 20 74 61 62 6c 65 73 2e 20 20 48 65  rary tables.  He
fb30: 6e 63 65 20 69 74 20 68 61 73 20 69 74 73 20 6f  nce it has its o
fb40: 77 6e 20 63 61 73 65 2e 20 20 42 65 67 69 6e 0a  wn case.  Begin.
fb50: 20 20 20 20 20 20 2a 2a 20 62 79 20 61 6c 6c 6f        ** by allo
fb60: 63 61 74 69 6e 67 20 74 68 65 20 74 61 62 6c 65  cating the table
fb70: 73 20 77 65 20 77 69 6c 6c 20 6e 65 65 64 2e 0a  s we will need..
fb80: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 74        */.      t
fb90: 61 62 31 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  ab1 = pParse->nT
fba0: 61 62 2b 2b 3b 0a 20 20 20 20 20 20 74 61 62 32  ab++;.      tab2
fbb0: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
fbc0: 2b 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  +;.      assert(
fbd0: 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20   p->pOrderBy==0 
fbe0: 29 3b 0a 0a 20 20 20 20 20 20 61 64 64 72 20 3d  );..      addr =
fbf0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
fc00: 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p2(v, OP_OpenEph
fc10: 65 6d 65 72 61 6c 2c 20 74 61 62 31 2c 20 30 29  emeral, tab1, 0)
fc20: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
fc30: 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
fc40: 30 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20  0] == -1 );.    
fc50: 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68    p->addrOpenEph
fc60: 6d 5b 30 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20  m[0] = addr;.   
fc70: 20 20 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74     p->pRightmost
fc80: 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46  ->selFlags |= SF
fc90: 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a  _UsesEphemeral;.
fca0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
fcb0: 3e 70 45 4c 69 73 74 20 29 3b 0a 0a 20 20 20 20  >pEList );..    
fcc0: 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 53 45    /* Code the SE
fcd0: 4c 45 43 54 73 20 74 6f 20 6f 75 72 20 6c 65 66  LECTs to our lef
fce0: 74 20 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79  t into temporary
fcf0: 20 74 61 62 6c 65 20 22 74 61 62 31 22 2e 0a 20   table "tab1".. 
fd00: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
fd10: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49  lite3SelectDestI
fd20: 6e 69 74 28 26 69 6e 74 65 72 73 65 63 74 64 65  nit(&intersectde
fd30: 73 74 2c 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 74  st, SRT_Union, t
fd40: 61 62 31 29 3b 0a 20 20 20 20 20 20 65 78 70 6c  ab1);.      expl
fd50: 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53  ainSetInteger(iS
fd60: 75 62 31 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65  ub1, pParse->iNe
fd70: 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20  xtSelectId);.   
fd80: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53     rc = sqlite3S
fd90: 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50  elect(pParse, pP
fda0: 72 69 6f 72 2c 20 26 69 6e 74 65 72 73 65 63 74  rior, &intersect
fdb0: 64 65 73 74 29 3b 0a 20 20 20 20 20 20 69 66 28  dest);.      if(
fdc0: 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67   rc ){.        g
fdd0: 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
fde0: 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  _end;.      }.. 
fdf0: 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65       /* Code the
fe00: 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20   current SELECT 
fe10: 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79 20 74  into temporary t
fe20: 61 62 6c 65 20 22 74 61 62 32 22 0a 20 20 20 20  able "tab2".    
fe30: 20 20 2a 2f 0a 20 20 20 20 20 20 61 64 64 72 20    */.      addr 
fe40: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
fe50: 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  Op2(v, OP_OpenEp
fe60: 68 65 6d 65 72 61 6c 2c 20 74 61 62 32 2c 20 30  hemeral, tab2, 0
fe70: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
fe80: 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d   p->addrOpenEphm
fe90: 5b 31 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20  [1] == -1 );.   
fea0: 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70     p->addrOpenEp
feb0: 68 6d 5b 31 5d 20 3d 20 61 64 64 72 3b 0a 20 20  hm[1] = addr;.  
fec0: 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
fed0: 30 3b 0a 20 20 20 20 20 20 70 4c 69 6d 69 74 20  0;.      pLimit 
fee0: 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20  = p->pLimit;.   
fef0: 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30     p->pLimit = 0
ff00: 3b 0a 20 20 20 20 20 20 70 4f 66 66 73 65 74 20  ;.      pOffset 
ff10: 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20  = p->pOffset;.  
ff20: 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d      p->pOffset =
ff30: 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 65 72 73   0;.      inters
ff40: 65 63 74 64 65 73 74 2e 69 53 44 50 61 72 6d 20  ectdest.iSDParm 
ff50: 3d 20 74 61 62 32 3b 0a 20 20 20 20 20 20 65 78  = tab2;.      ex
ff60: 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28  plainSetInteger(
ff70: 69 53 75 62 32 2c 20 70 50 61 72 73 65 2d 3e 69  iSub2, pParse->i
ff80: 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20  NextSelectId);. 
ff90: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
ffa0: 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
ffb0: 70 2c 20 26 69 6e 74 65 72 73 65 63 74 64 65 73  p, &intersectdes
ffc0: 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  t);.      testca
ffd0: 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  se( rc!=SQLITE_O
ffe0: 4b 20 29 3b 0a 20 20 20 20 20 20 70 44 65 6c 65  K );.      pDele
fff0: 74 65 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a  te = p->pPrior;.
10000 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20        p->pPrior 
10010 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20  = pPrior;.      
10020 69 66 28 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f  if( p->nSelectRo
10030 77 3e 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63  w>pPrior->nSelec
10040 74 52 6f 77 20 29 20 70 2d 3e 6e 53 65 6c 65 63  tRow ) p->nSelec
10050 74 52 6f 77 20 3d 20 70 50 72 69 6f 72 2d 3e 6e  tRow = pPrior->n
10060 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20 20  SelectRow;.     
10070 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
10080 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74  te(db, p->pLimit
10090 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d  );.      p->pLim
100a0 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20  it = pLimit;.   
100b0 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20     p->pOffset = 
100c0 70 4f 66 66 73 65 74 3b 0a 0a 20 20 20 20 20 20  pOffset;..      
100d0 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
100e0 20 74 6f 20 74 61 6b 65 20 74 68 65 20 69 6e 74   to take the int
100f0 65 72 73 65 63 74 69 6f 6e 20 6f 66 20 74 68 65  ersection of the
10100 20 74 77 6f 20 74 65 6d 70 6f 72 61 72 79 0a 20   two temporary. 
10110 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 73 2e 0a       ** tables..
10120 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61        */.      a
10130 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
10140 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64 65   );.      if( de
10150 73 74 2e 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75  st.eDest==SRT_Ou
10160 74 70 75 74 20 29 7b 0a 20 20 20 20 20 20 20 20  tput ){.        
10170 53 65 6c 65 63 74 20 2a 70 46 69 72 73 74 20 3d  Select *pFirst =
10180 20 70 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c   p;.        whil
10190 65 28 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f  e( pFirst->pPrio
101a0 72 20 29 20 70 46 69 72 73 74 20 3d 20 70 46 69  r ) pFirst = pFi
101b0 72 73 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20  rst->pPrior;.   
101c0 20 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c       generateCol
101d0 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c  umnNames(pParse,
101e0 20 30 2c 20 70 46 69 72 73 74 2d 3e 70 45 4c 69   0, pFirst->pELi
101f0 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  st);.      }.   
10200 20 20 20 69 42 72 65 61 6b 20 3d 20 73 71 6c 69     iBreak = sqli
10210 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
10220 28 76 29 3b 0a 20 20 20 20 20 20 69 43 6f 6e 74  (v);.      iCont
10230 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
10240 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
10250 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65    computeLimitRe
10260 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c 20  gisters(pParse, 
10270 70 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20  p, iBreak);.    
10280 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
10290 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64  Op2(v, OP_Rewind
102a0 2c 20 74 61 62 31 2c 20 69 42 72 65 61 6b 29 3b  , tab1, iBreak);
102b0 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
102c0 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
102d0 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69 53 74  arse);.      iSt
102e0 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  art = sqlite3Vdb
102f0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f  eAddOp2(v, OP_Ro
10300 77 4b 65 79 2c 20 74 61 62 31 2c 20 72 31 29 3b  wKey, tab1, r1);
10310 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
10320 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f  beAddOp4Int(v, O
10330 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 74 61 62 32  P_NotFound, tab2
10340 2c 20 69 43 6f 6e 74 2c 20 72 31 2c 20 30 29 3b  , iCont, r1, 0);
10350 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
10360 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
10370 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  rse, r1);.      
10380 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28  selectInnerLoop(
10390 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45  pParse, p, p->pE
103a0 4c 69 73 74 2c 20 74 61 62 31 2c 20 70 2d 3e 70  List, tab1, p->p
103b0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 0a 20 20  EList->nExpr,.  
103c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
103d0 20 20 20 20 30 2c 20 30 2c 20 26 64 65 73 74 2c      0, 0, &dest,
103e0 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 29 3b   iCont, iBreak);
103f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
10400 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
10410 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20  , iCont);.      
10420 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10430 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 74 61  2(v, OP_Next, ta
10440 62 31 2c 20 69 53 74 61 72 74 29 3b 0a 20 20 20  b1, iStart);.   
10450 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
10460 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 42  solveLabel(v, iB
10470 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c  reak);.      sql
10480 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
10490 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62 32  , OP_Close, tab2
104a0 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
104b0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
104c0 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62 31 2c   OP_Close, tab1,
104d0 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   0);.      break
104e0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 65  ;.    }.  }..  e
104f0 78 70 6c 61 69 6e 43 6f 6d 70 6f 73 69 74 65 28  xplainComposite(
10500 70 50 61 72 73 65 2c 20 70 2d 3e 6f 70 2c 20 69  pParse, p->op, i
10510 53 75 62 31 2c 20 69 53 75 62 32 2c 20 70 2d 3e  Sub1, iSub2, p->
10520 6f 70 21 3d 54 4b 5f 41 4c 4c 29 3b 0a 0a 20 20  op!=TK_ALL);..  
10530 2f 2a 20 43 6f 6d 70 75 74 65 20 63 6f 6c 6c 61  /* Compute colla
10540 74 69 6e 67 20 73 65 71 75 65 6e 63 65 73 20 75  ting sequences u
10550 73 65 64 20 62 79 20 0a 20 20 2a 2a 20 74 65 6d  sed by .  ** tem
10560 70 6f 72 61 72 79 20 74 61 62 6c 65 73 20 6e 65  porary tables ne
10570 65 64 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  eded to implemen
10580 74 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73  t the compound s
10590 65 6c 65 63 74 2e 0a 20 20 2a 2a 20 41 74 74 61  elect..  ** Atta
105a0 63 68 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73  ch the KeyInfo s
105b0 74 72 75 63 74 75 72 65 20 74 6f 20 61 6c 6c 20  tructure to all 
105c0 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73  temporary tables
105d0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73  ..  **.  ** This
105e0 20 73 65 63 74 69 6f 6e 20 69 73 20 72 75 6e 20   section is run 
105f0 62 79 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  by the right-mos
10600 74 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  t SELECT stateme
10610 6e 74 20 6f 6e 6c 79 2e 0a 20 20 2a 2a 20 53 45  nt only..  ** SE
10620 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20  LECT statements 
10630 74 6f 20 74 68 65 20 6c 65 66 74 20 61 6c 77 61  to the left alwa
10640 79 73 20 73 6b 69 70 20 74 68 69 73 20 70 61 72  ys skip this par
10650 74 2e 20 20 54 68 65 20 72 69 67 68 74 2d 6d 6f  t.  The right-mo
10660 73 74 0a 20 20 2a 2a 20 53 45 4c 45 43 54 20 6d  st.  ** SELECT m
10670 69 67 68 74 20 61 6c 73 6f 20 73 6b 69 70 20 74  ight also skip t
10680 68 69 73 20 70 61 72 74 20 69 66 20 69 74 20 68  his part if it h
10690 61 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 63  as no ORDER BY c
106a0 6c 61 75 73 65 20 61 6e 64 0a 20 20 2a 2a 20 6e  lause and.  ** n
106b0 6f 20 74 65 6d 70 20 74 61 62 6c 65 73 20 61 72  o temp tables ar
106c0 65 20 72 65 71 75 69 72 65 64 2e 0a 20 20 2a 2f  e required..  */
106d0 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61  .  if( p->selFla
106e0 67 73 20 26 20 53 46 5f 55 73 65 73 45 70 68 65  gs & SF_UsesEphe
106f0 6d 65 72 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74  meral ){.    int
10700 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
10710 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
10720 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
10730 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
10740 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20  nfo;            
10750 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71  /* Collating seq
10760 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20 72 65  uence for the re
10770 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 20 20  sult set */.    
10780 53 65 6c 65 63 74 20 2a 70 4c 6f 6f 70 3b 20 20  Select *pLoop;  
10790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
107a0 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72   For looping thr
107b0 6f 75 67 68 20 53 45 4c 45 43 54 20 73 74 61 74  ough SELECT stat
107c0 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 43 6f  ements */.    Co
107d0 6c 6c 53 65 71 20 2a 2a 61 70 43 6f 6c 6c 3b 20  llSeq **apColl; 
107e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
107f0 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75  or looping throu
10800 67 68 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f  gh pKeyInfo->aCo
10810 6c 6c 5b 5d 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ll[] */.    int 
10820 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20  nCol;           
10830 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
10840 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
10850 6e 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a  n result set */.
10860 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
10870 70 52 69 67 68 74 6d 6f 73 74 3d 3d 70 20 29 3b  pRightmost==p );
10880 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70 2d 3e 70  .    nCol = p->p
10890 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  EList->nExpr;.  
108a0 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c    pKeyInfo = sql
108b0 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63  ite3KeyInfoAlloc
108c0 28 64 62 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20  (db, nCol);.    
108d0 69 66 28 20 21 70 4b 65 79 49 6e 66 6f 20 29 7b  if( !pKeyInfo ){
108e0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
108f0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
10900 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
10910 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20  t_end;.    }.   
10920 20 66 6f 72 28 69 3d 30 2c 20 61 70 43 6f 6c 6c   for(i=0, apColl
10930 3d 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c  =pKeyInfo->aColl
10940 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 61  ; i<nCol; i++, a
10950 70 43 6f 6c 6c 2b 2b 29 7b 0a 20 20 20 20 20 20  pColl++){.      
10960 2a 61 70 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69 53  *apColl = multiS
10970 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61  electCollSeq(pPa
10980 72 73 65 2c 20 70 2c 20 69 29 3b 0a 20 20 20 20  rse, p, i);.    
10990 20 20 69 66 28 20 30 3d 3d 2a 61 70 43 6f 6c 6c    if( 0==*apColl
109a0 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 61 70 43   ){.        *apC
109b0 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43  oll = db->pDfltC
109c0 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  oll;.      }.   
109d0 20 7d 0a 0a 20 20 20 20 66 6f 72 28 70 4c 6f 6f   }..    for(pLoo
109e0 70 3d 70 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f  p=p; pLoop; pLoo
109f0 70 3d 70 4c 6f 6f 70 2d 3e 70 50 72 69 6f 72 29  p=pLoop->pPrior)
10a00 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  {.      for(i=0;
10a10 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<2; i++){.    
10a20 20 20 20 20 69 6e 74 20 61 64 64 72 20 3d 20 70      int addr = p
10a30 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70  Loop->addrOpenEp
10a40 68 6d 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 69  hm[i];.        i
10a50 66 28 20 61 64 64 72 3c 30 20 29 7b 0a 20 20 20  f( addr<0 ){.   
10a60 20 20 20 20 20 20 20 2f 2a 20 49 66 20 5b 30 5d         /* If [0]
10a70 20 69 73 20 75 6e 75 73 65 64 20 74 68 65 6e 20   is unused then 
10a80 5b 31 5d 20 69 73 20 61 6c 73 6f 20 75 6e 75 73  [1] is also unus
10a90 65 64 2e 20 20 53 6f 20 77 65 20 63 61 6e 0a 20  ed.  So we can. 
10aa0 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 77 61           ** alwa
10ab0 79 73 20 73 61 66 65 6c 79 20 61 62 6f 72 74 20  ys safely abort 
10ac0 61 73 20 73 6f 6f 6e 20 61 73 20 74 68 65 20 66  as soon as the f
10ad0 69 72 73 74 20 75 6e 75 73 65 64 20 73 6c 6f 74  irst unused slot
10ae0 20 69 73 20 66 6f 75 6e 64 20 2a 2f 0a 20 20 20   is found */.   
10af0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
10b00 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70  Loop->addrOpenEp
10b10 68 6d 5b 31 5d 3c 30 20 29 3b 0a 20 20 20 20 20  hm[1]<0 );.     
10b20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
10b30 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
10b40 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
10b50 32 28 76 2c 20 61 64 64 72 2c 20 6e 43 6f 6c 29  2(v, addr, nCol)
10b60 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
10b70 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c  3VdbeChangeP4(v,
10b80 20 61 64 64 72 2c 20 28 63 68 61 72 2a 29 70 4b   addr, (char*)pK
10b90 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e  eyInfo, P4_KEYIN
10ba0 46 4f 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 6f  FO);.        pLo
10bb0 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d  op->addrOpenEphm
10bc0 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  [i] = -1;.      
10bd0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
10be0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4b  te3DbFree(db, pK
10bf0 65 79 49 6e 66 6f 29 3b 0a 20 20 7d 0a 0a 6d 75  eyInfo);.  }..mu
10c00 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3a 0a  lti_select_end:.
10c10 20 20 70 44 65 73 74 2d 3e 69 53 64 73 74 20 3d    pDest->iSdst =
10c20 20 64 65 73 74 2e 69 53 64 73 74 3b 0a 20 20 70   dest.iSdst;.  p
10c30 44 65 73 74 2d 3e 6e 53 64 73 74 20 3d 20 64 65  Dest->nSdst = de
10c40 73 74 2e 6e 53 64 73 74 3b 0a 20 20 73 71 6c 69  st.nSdst;.  sqli
10c50 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
10c60 64 62 2c 20 70 44 65 6c 65 74 65 29 3b 0a 20 20  db, pDelete);.  
10c70 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
10c80 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
10c90 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  IT_COMPOUND_SELE
10ca0 43 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64  CT */../*.** Cod
10cb0 65 20 61 6e 20 6f 75 74 70 75 74 20 73 75 62 72  e an output subr
10cc0 6f 75 74 69 6e 65 20 66 6f 72 20 61 20 63 6f 72  outine for a cor
10cd0 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74  outine implement
10ce0 61 74 69 6f 6e 20 6f 66 20 61 0a 2a 2a 20 53 45  ation of a.** SE
10cf0 4c 45 43 54 20 73 74 61 74 6d 65 6e 74 2e 0a 2a  LECT statment..*
10d00 2a 0a 2a 2a 20 54 68 65 20 64 61 74 61 20 74 6f  *.** The data to
10d10 20 62 65 20 6f 75 74 70 75 74 20 69 73 20 63 6f   be output is co
10d20 6e 74 61 69 6e 65 64 20 69 6e 20 70 49 6e 2d 3e  ntained in pIn->
10d30 69 53 64 73 74 2e 20 20 54 68 65 72 65 20 61 72  iSdst.  There ar
10d40 65 0a 2a 2a 20 70 49 6e 2d 3e 6e 53 64 73 74 20  e.** pIn->nSdst 
10d50 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20 6f 75  columns to be ou
10d60 74 70 75 74 2e 20 20 70 44 65 73 74 20 69 73 20  tput.  pDest is 
10d70 77 68 65 72 65 20 74 68 65 20 6f 75 74 70 75 74  where the output
10d80 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 73 65   should.** be se
10d90 6e 74 2e 0a 2a 2a 0a 2a 2a 20 72 65 67 52 65 74  nt..**.** regRet
10da0 75 72 6e 20 69 73 20 74 68 65 20 6e 75 6d 62 65  urn is the numbe
10db0 72 20 6f 66 20 74 68 65 20 72 65 67 69 73 74 65  r of the registe
10dc0 72 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 75  r holding the su
10dd0 62 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75  broutine.** retu
10de0 72 6e 20 61 64 64 72 65 73 73 2e 0a 2a 2a 0a 2a  rn address..**.*
10df0 2a 20 49 66 20 72 65 67 50 72 65 76 3e 30 20 74  * If regPrev>0 t
10e00 68 65 6e 20 69 74 20 69 73 20 74 68 65 20 66 69  hen it is the fi
10e10 72 73 74 20 72 65 67 69 73 74 65 72 20 69 6e 20  rst register in 
10e20 61 20 76 65 63 74 6f 72 20 74 68 61 74 0a 2a 2a  a vector that.**
10e30 20 72 65 63 6f 72 64 73 20 74 68 65 20 70 72 65   records the pre
10e40 76 69 6f 75 73 20 6f 75 74 70 75 74 2e 20 20 6d  vious output.  m
10e50 65 6d 5b 72 65 67 50 72 65 76 5d 20 69 73 20 61  em[regPrev] is a
10e60 20 66 6c 61 67 20 74 68 61 74 20 69 73 20 66 61   flag that is fa
10e70 6c 73 65 0a 2a 2a 20 69 66 20 74 68 65 72 65 20  lse.** if there 
10e80 68 61 73 20 62 65 65 6e 20 6e 6f 20 70 72 65 76  has been no prev
10e90 69 6f 75 73 20 6f 75 74 70 75 74 2e 20 20 49 66  ious output.  If
10ea0 20 72 65 67 50 72 65 76 3e 30 20 74 68 65 6e 20   regPrev>0 then 
10eb0 63 6f 64 65 20 69 73 0a 2a 2a 20 67 65 6e 65 72  code is.** gener
10ec0 61 74 65 64 20 74 6f 20 73 75 70 70 72 65 73 73  ated to suppress
10ed0 20 64 75 70 6c 69 63 61 74 65 73 2e 20 20 70 4b   duplicates.  pK
10ee0 65 79 49 6e 66 6f 20 69 73 20 75 73 65 64 20 66  eyInfo is used f
10ef0 6f 72 20 63 6f 6d 70 61 72 69 6e 67 0a 2a 2a 20  or comparing.** 
10f00 6b 65 79 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  keys..**.** If t
10f10 68 65 20 4c 49 4d 49 54 20 66 6f 75 6e 64 20 69  he LIMIT found i
10f20 6e 20 70 2d 3e 69 4c 69 6d 69 74 20 69 73 20 72  n p->iLimit is r
10f30 65 61 63 68 65 64 2c 20 6a 75 6d 70 20 69 6d 6d  eached, jump imm
10f40 65 64 69 61 74 65 6c 79 20 74 6f 0a 2a 2a 20 69  ediately to.** i
10f50 42 72 65 61 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63  Break..*/.static
10f60 20 69 6e 74 20 67 65 6e 65 72 61 74 65 4f 75 74   int generateOut
10f70 70 75 74 53 75 62 72 6f 75 74 69 6e 65 28 0a 20  putSubroutine(. 
10f80 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
10f90 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
10fa0 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
10fb0 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
10fc0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
10fd0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
10fe0 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74   */.  SelectDest
10ff0 20 2a 70 49 6e 2c 20 20 20 20 20 20 20 20 2f 2a   *pIn,        /*
11000 20 43 6f 72 6f 75 74 69 6e 65 20 73 75 70 70 6c   Coroutine suppl
11010 79 69 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20 53  ying data */.  S
11020 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74  electDest *pDest
11030 2c 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20  ,      /* Where 
11040 74 6f 20 73 65 6e 64 20 74 68 65 20 64 61 74 61  to send the data
11050 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 74   */.  int regRet
11060 75 72 6e 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  urn,          /*
11070 20 54 68 65 20 72 65 74 75 72 6e 20 61 64 64 72   The return addr
11080 65 73 73 20 72 65 67 69 73 74 65 72 20 2a 2f 0a  ess register */.
11090 20 20 69 6e 74 20 72 65 67 50 72 65 76 2c 20 20    int regPrev,  
110a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65            /* Pre
110b0 76 69 6f 75 73 20 72 65 73 75 6c 74 20 72 65 67  vious result reg
110c0 69 73 74 65 72 2e 20 20 4e 6f 20 75 6e 69 71 75  ister.  No uniqu
110d0 65 6e 65 73 73 20 69 66 20 30 20 2a 2f 0a 20 20  eness if 0 */.  
110e0 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
110f0 6f 2c 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 63  o,      /* For c
11100 6f 6d 70 61 72 69 6e 67 20 77 69 74 68 20 70 72  omparing with pr
11110 65 76 69 6f 75 73 20 65 6e 74 72 79 20 2a 2f 0a  evious entry */.
11120 20 20 69 6e 74 20 70 34 74 79 70 65 2c 20 20 20    int p4type,   
11130 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
11140 20 70 34 20 74 79 70 65 20 66 6f 72 20 70 4b 65   p4 type for pKe
11150 79 49 6e 66 6f 20 2a 2f 0a 20 20 69 6e 74 20 69  yInfo */.  int i
11160 42 72 65 61 6b 20 20 20 20 20 20 20 20 20 20 20  Break           
11170 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
11180 69 66 20 77 65 20 68 69 74 20 74 68 65 20 4c 49  if we hit the LI
11190 4d 49 54 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65  MIT */.){.  Vdbe
111a0 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
111b0 64 62 65 3b 0a 20 20 69 6e 74 20 69 43 6f 6e 74  dbe;.  int iCont
111c0 69 6e 75 65 3b 0a 20 20 69 6e 74 20 61 64 64 72  inue;.  int addr
111d0 3b 0a 0a 20 20 61 64 64 72 20 3d 20 73 71 6c 69  ;..  addr = sqli
111e0 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
111f0 64 72 28 76 29 3b 0a 20 20 69 43 6f 6e 74 69 6e  dr(v);.  iContin
11200 75 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ue = sqlite3Vdbe
11210 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20  MakeLabel(v);.. 
11220 20 2f 2a 20 53 75 70 70 72 65 73 73 20 64 75 70   /* Suppress dup
11230 6c 69 63 61 74 65 73 20 66 6f 72 20 55 4e 49 4f  licates for UNIO
11240 4e 2c 20 45 58 43 45 50 54 2c 20 61 6e 64 20 49  N, EXCEPT, and I
11250 4e 54 45 52 53 45 43 54 20 0a 20 20 2a 2f 0a 20  NTERSECT .  */. 
11260 20 69 66 28 20 72 65 67 50 72 65 76 20 29 7b 0a   if( regPrev ){.
11270 20 20 20 20 69 6e 74 20 6a 31 2c 20 6a 32 3b 0a      int j1, j2;.
11280 20 20 20 20 6a 31 20 3d 20 73 71 6c 69 74 65 33      j1 = sqlite3
11290 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
112a0 5f 49 66 4e 6f 74 2c 20 72 65 67 50 72 65 76 29  _IfNot, regPrev)
112b0 3b 0a 20 20 20 20 6a 32 20 3d 20 73 71 6c 69 74  ;.    j2 = sqlit
112c0 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
112d0 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 70 49 6e 2d  OP_Compare, pIn-
112e0 3e 69 53 64 73 74 2c 20 72 65 67 50 72 65 76 2b  >iSdst, regPrev+
112f0 31 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 2c 0a 20  1, pIn->nSdst,. 
11300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11310 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
11320 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 70 34  ar*)pKeyInfo, p4
11330 74 79 70 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  type);.    sqlit
11340 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
11350 4f 50 5f 4a 75 6d 70 2c 20 6a 32 2b 32 2c 20 69  OP_Jump, j2+2, i
11360 43 6f 6e 74 69 6e 75 65 2c 20 6a 32 2b 32 29 3b  Continue, j2+2);
11370 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
11380 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 31 29 3b  JumpHere(v, j1);
11390 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
113a0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 70  AddOp3(v, OP_Cop
113b0 79 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 72  y, pIn->iSdst, r
113c0 65 67 50 72 65 76 2b 31 2c 20 70 49 6e 2d 3e 6e  egPrev+1, pIn->n
113d0 53 64 73 74 2d 31 29 3b 0a 20 20 20 20 73 71 6c  Sdst-1);.    sql
113e0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
113f0 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c  , OP_Integer, 1,
11400 20 72 65 67 50 72 65 76 29 3b 0a 20 20 7d 0a 20   regPrev);.  }. 
11410 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d   if( pParse->db-
11420 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
11430 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20  return 0;..  /* 
11440 53 75 70 70 72 65 73 73 20 74 68 65 20 66 69 72  Suppress the fir
11450 73 74 20 4f 46 46 53 45 54 20 65 6e 74 72 69 65  st OFFSET entrie
11460 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e  s if there is an
11470 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65 0a 20   OFFSET clause. 
11480 20 2a 2f 0a 20 20 63 6f 64 65 4f 66 66 73 65 74   */.  codeOffset
11490 28 76 2c 20 70 2c 20 69 43 6f 6e 74 69 6e 75 65  (v, p, iContinue
114a0 29 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 70 44  );..  switch( pD
114b0 65 73 74 2d 3e 65 44 65 73 74 20 29 7b 0a 20 20  est->eDest ){.  
114c0 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 72    /* Store the r
114d0 65 73 75 6c 74 20 61 73 20 64 61 74 61 20 75 73  esult as data us
114e0 69 6e 67 20 61 20 75 6e 69 71 75 65 20 6b 65 79  ing a unique key
114f0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
11500 65 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20  e SRT_Table:.   
11510 20 63 61 73 65 20 53 52 54 5f 45 70 68 65 6d 54   case SRT_EphemT
11520 61 62 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  ab: {.      int 
11530 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
11540 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
11550 20 20 20 20 20 20 69 6e 74 20 72 32 20 3d 20 73        int r2 = s
11560 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
11570 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
11580 74 65 73 74 63 61 73 65 28 20 70 44 65 73 74 2d  testcase( pDest-
11590 3e 65 44 65 73 74 3d 3d 53 52 54 5f 54 61 62 6c  >eDest==SRT_Tabl
115a0 65 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  e );.      testc
115b0 61 73 65 28 20 70 44 65 73 74 2d 3e 65 44 65 73  ase( pDest->eDes
115c0 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20  t==SRT_EphemTab 
115d0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
115e0 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
115f0 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 70 49 6e  _MakeRecord, pIn
11600 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53  ->iSdst, pIn->nS
11610 64 73 74 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  dst, r1);.      
11620 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
11630 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64  2(v, OP_NewRowid
11640 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d  , pDest->iSDParm
11650 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 73 71 6c  , r2);.      sql
11660 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
11670 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 70 44 65  , OP_Insert, pDe
11680 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 72 31 2c  st->iSDParm, r1,
11690 20 72 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   r2);.      sqli
116a0 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
116b0 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44  v, OPFLAG_APPEND
116c0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
116d0 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
116e0 50 61 72 73 65 2c 20 72 32 29 3b 0a 20 20 20 20  Parse, r2);.    
116f0 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
11700 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
11710 72 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  r1);.      break
11720 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66  ;.    }..#ifndef
11730 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
11740 51 55 45 52 59 0a 20 20 20 20 2f 2a 20 49 66 20  QUERY.    /* If 
11750 77 65 20 61 72 65 20 63 72 65 61 74 69 6e 67 20  we are creating 
11760 61 20 73 65 74 20 66 6f 72 20 61 6e 20 22 65 78  a set for an "ex
11770 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e  pr IN (SELECT ..
11780 2e 29 22 20 63 6f 6e 73 74 72 75 63 74 2c 0a 20  .)" construct,. 
11790 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65     ** then there
117a0 20 73 68 6f 75 6c 64 20 62 65 20 61 20 73 69 6e   should be a sin
117b0 67 6c 65 20 69 74 65 6d 20 6f 6e 20 74 68 65 20  gle item on the 
117c0 73 74 61 63 6b 2e 20 20 57 72 69 74 65 20 74 68  stack.  Write th
117d0 69 73 0a 20 20 20 20 2a 2a 20 69 74 65 6d 20 69  is.    ** item i
117e0 6e 74 6f 20 74 68 65 20 73 65 74 20 74 61 62 6c  nto the set tabl
117f0 65 20 77 69 74 68 20 62 6f 67 75 73 20 64 61 74  e with bogus dat
11800 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  a..    */.    ca
11810 73 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20  se SRT_Set: {.  
11820 20 20 20 20 69 6e 74 20 72 31 3b 0a 20 20 20 20      int r1;.    
11830 20 20 61 73 73 65 72 74 28 20 70 49 6e 2d 3e 6e    assert( pIn->n
11840 53 64 73 74 3d 3d 31 20 29 3b 0a 20 20 20 20 20  Sdst==1 );.     
11850 20 70 44 65 73 74 2d 3e 61 66 66 53 64 73 74 20   pDest->affSdst 
11860 3d 20 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69  = .         sqli
11870 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69  te3CompareAffini
11880 74 79 28 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b  ty(p->pEList->a[
11890 30 5d 2e 70 45 78 70 72 2c 20 70 44 65 73 74 2d  0].pExpr, pDest-
118a0 3e 61 66 66 53 64 73 74 29 3b 0a 20 20 20 20 20  >affSdst);.     
118b0 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
118c0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
118d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
118e0 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d  beAddOp4(v, OP_M
118f0 61 6b 65 52 65 63 6f 72 64 2c 20 70 49 6e 2d 3e  akeRecord, pIn->
11900 69 53 64 73 74 2c 20 31 2c 20 72 31 2c 20 26 70  iSdst, 1, r1, &p
11910 44 65 73 74 2d 3e 61 66 66 53 64 73 74 2c 31 29  Dest->affSdst,1)
11920 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
11930 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79  xprCacheAffinity
11940 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 70  Change(pParse, p
11950 49 6e 2d 3e 69 53 64 73 74 2c 20 31 29 3b 0a 20  In->iSdst, 1);. 
11960 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
11970 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78  AddOp2(v, OP_Idx
11980 49 6e 73 65 72 74 2c 20 70 44 65 73 74 2d 3e 69  Insert, pDest->i
11990 53 44 50 61 72 6d 2c 20 72 31 29 3b 0a 20 20 20  SDParm, r1);.   
119a0 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
119b0 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
119c0 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61   r1);.      brea
119d0 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20 30 20  k;.    }..#if 0 
119e0 20 2f 2a 20 4e 65 76 65 72 20 6f 63 63 75 72 73   /* Never occurs
119f0 20 6f 6e 20 61 6e 20 4f 52 44 45 52 20 42 59 20   on an ORDER BY 
11a00 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 2f 2a 20  query */.    /* 
11a10 49 66 20 61 6e 79 20 72 6f 77 20 65 78 69 73 74  If any row exist
11a20 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
11a30 65 74 2c 20 72 65 63 6f 72 64 20 74 68 61 74 20  et, record that 
11a40 66 61 63 74 20 61 6e 64 20 61 62 6f 72 74 2e 0a  fact and abort..
11a50 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
11a60 53 52 54 5f 45 78 69 73 74 73 3a 20 7b 0a 20 20  SRT_Exists: {.  
11a70 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
11a80 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
11a90 67 65 72 2c 20 31 2c 20 70 44 65 73 74 2d 3e 69  ger, 1, pDest->i
11aa0 53 44 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 2f  SDParm);.      /
11ab0 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75  * The LIMIT clau
11ac0 73 65 20 77 69 6c 6c 20 74 65 72 6d 69 6e 61 74  se will terminat
11ad0 65 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75  e the loop for u
11ae0 73 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b  s */.      break
11af0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ;.    }.#endif..
11b00 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
11b10 73 20 61 20 73 63 61 6c 61 72 20 73 65 6c 65 63  s a scalar selec
11b20 74 20 74 68 61 74 20 69 73 20 70 61 72 74 20 6f  t that is part o
11b30 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c  f an expression,
11b40 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 73 74 6f   then.    ** sto
11b50 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69  re the results i
11b60 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  n the appropriat
11b70 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e  e memory cell an
11b80 64 20 62 72 65 61 6b 20 6f 75 74 0a 20 20 20 20  d break out.    
11b90 2a 2a 20 6f 66 20 74 68 65 20 73 63 61 6e 20 6c  ** of the scan l
11ba0 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  oop..    */.    
11bb0 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a  case SRT_Mem: {.
11bc0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
11bd0 6e 2d 3e 6e 53 64 73 74 3d 3d 31 20 29 3b 0a 20  n->nSdst==1 );. 
11be0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
11bf0 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c  CodeMove(pParse,
11c00 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 44 65   pIn->iSdst, pDe
11c10 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 31 29 3b  st->iSDParm, 1);
11c20 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49  .      /* The LI
11c30 4d 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20  MIT clause will 
11c40 6a 75 6d 70 20 6f 75 74 20 6f 66 20 74 68 65 20  jump out of the 
11c50 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20  loop for us */. 
11c60 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
11c70 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e  }.#endif /* #ifn
11c80 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
11c90 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 20 20 20  SUBQUERY */..   
11ca0 20 2f 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20   /* The results 
11cb0 61 72 65 20 73 74 6f 72 65 64 20 69 6e 20 61 20  are stored in a 
11cc0 73 65 71 75 65 6e 63 65 20 6f 66 20 72 65 67 69  sequence of regi
11cd0 73 74 65 72 73 0a 20 20 20 20 2a 2a 20 73 74 61  sters.    ** sta
11ce0 72 74 69 6e 67 20 61 74 20 70 44 65 73 74 2d 3e  rting at pDest->
11cf0 69 53 64 73 74 2e 20 20 54 68 65 6e 20 74 68 65  iSdst.  Then the
11d00 20 63 6f 2d 72 6f 75 74 69 6e 65 20 79 69 65 6c   co-routine yiel
11d10 64 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ds..    */.    c
11d20 61 73 65 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e  ase SRT_Coroutin
11d30 65 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70  e: {.      if( p
11d40 44 65 73 74 2d 3e 69 53 64 73 74 3d 3d 30 20 29  Dest->iSdst==0 )
11d50 7b 0a 20 20 20 20 20 20 20 20 70 44 65 73 74 2d  {.        pDest-
11d60 3e 69 53 64 73 74 20 3d 20 73 71 6c 69 74 65 33  >iSdst = sqlite3
11d70 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61  GetTempRange(pPa
11d80 72 73 65 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29  rse, pIn->nSdst)
11d90 3b 0a 20 20 20 20 20 20 20 20 70 44 65 73 74 2d  ;.        pDest-
11da0 3e 6e 53 64 73 74 20 3d 20 70 49 6e 2d 3e 6e 53  >nSdst = pIn->nS
11db0 64 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  dst;.      }.   
11dc0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
11dd0 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 70  deMove(pParse, p
11de0 49 6e 2d 3e 69 53 64 73 74 2c 20 70 44 65 73 74  In->iSdst, pDest
11df0 2d 3e 69 53 64 73 74 2c 20 70 44 65 73 74 2d 3e  ->iSdst, pDest->
11e00 6e 53 64 73 74 29 3b 0a 20 20 20 20 20 20 73 71  nSdst);.      sq
11e10 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
11e20 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 70 44 65  v, OP_Yield, pDe
11e30 73 74 2d 3e 69 53 44 50 61 72 6d 29 3b 0a 20 20  st->iSDParm);.  
11e40 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
11e50 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 65  ..    /* If none
11e60 20 6f 66 20 74 68 65 20 61 62 6f 76 65 2c 20 74   of the above, t
11e70 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 64  hen the result d
11e80 65 73 74 69 6e 61 74 69 6f 6e 20 6d 75 73 74 20  estination must 
11e90 62 65 0a 20 20 20 20 2a 2a 20 53 52 54 5f 4f 75  be.    ** SRT_Ou
11ea0 74 70 75 74 2e 20 20 54 68 69 73 20 72 6f 75 74  tput.  This rout
11eb0 69 6e 65 20 69 73 20 6e 65 76 65 72 20 63 61 6c  ine is never cal
11ec0 6c 65 64 20 77 69 74 68 20 61 6e 79 20 6f 74 68  led with any oth
11ed0 65 72 0a 20 20 20 20 2a 2a 20 64 65 73 74 69 6e  er.    ** destin
11ee0 61 74 69 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e  ation other than
11ef0 20 74 68 65 20 6f 6e 65 73 20 68 61 6e 64 6c 65   the ones handle
11f00 64 20 61 62 6f 76 65 20 6f 72 20 53 52 54 5f 4f  d above or SRT_O
11f10 75 74 70 75 74 2e 0a 20 20 20 20 2a 2a 0a 20 20  utput..    **.  
11f20 20 20 2a 2a 20 46 6f 72 20 53 52 54 5f 4f 75 74    ** For SRT_Out
11f30 70 75 74 2c 20 72 65 73 75 6c 74 73 20 61 72 65  put, results are
11f40 20 73 74 6f 72 65 64 20 69 6e 20 61 20 73 65 71   stored in a seq
11f50 75 65 6e 63 65 20 6f 66 20 72 65 67 69 73 74 65  uence of registe
11f60 72 73 2e 20 20 0a 20 20 20 20 2a 2a 20 54 68 65  rs.  .    ** The
11f70 6e 20 74 68 65 20 4f 50 5f 52 65 73 75 6c 74 52  n the OP_ResultR
11f80 6f 77 20 6f 70 63 6f 64 65 20 69 73 20 75 73 65  ow opcode is use
11f90 64 20 74 6f 20 63 61 75 73 65 20 73 71 6c 69 74  d to cause sqlit
11fa0 65 33 5f 73 74 65 70 28 29 20 74 6f 0a 20 20 20  e3_step() to.   
11fb0 20 2a 2a 20 72 65 74 75 72 6e 20 74 68 65 20 6e   ** return the n
11fc0 65 78 74 20 72 6f 77 20 6f 66 20 72 65 73 75 6c  ext row of resul
11fd0 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 65  t..    */.    de
11fe0 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61  fault: {.      a
11ff0 73 73 65 72 74 28 20 70 44 65 73 74 2d 3e 65 44  ssert( pDest->eD
12000 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20  est==SRT_Output 
12010 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
12020 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
12030 5f 52 65 73 75 6c 74 52 6f 77 2c 20 70 49 6e 2d  _ResultRow, pIn-
12040 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64  >iSdst, pIn->nSd
12050 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  st);.      sqlit
12060 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e  e3ExprCacheAffin
12070 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65  ityChange(pParse
12080 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49  , pIn->iSdst, pI
12090 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20 20  n->nSdst);.     
120a0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
120b0 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20  }..  /* Jump to 
120c0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c  the end of the l
120d0 6f 6f 70 20 69 66 20 74 68 65 20 4c 49 4d 49 54  oop if the LIMIT
120e0 20 69 73 20 72 65 61 63 68 65 64 2e 0a 20 20 2a   is reached..  *
120f0 2f 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69  /.  if( p->iLimi
12100 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
12110 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
12120 5f 49 66 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d  _IfZero, p->iLim
12130 69 74 2c 20 69 42 72 65 61 6b 2c 20 2d 31 29 3b  it, iBreak, -1);
12140 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  .  }..  /* Gener
12150 61 74 65 20 74 68 65 20 73 75 62 72 6f 75 74 69  ate the subrouti
12160 6e 65 20 72 65 74 75 72 6e 0a 20 20 2a 2f 0a 20  ne return.  */. 
12170 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
12180 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e  lveLabel(v, iCon
12190 74 69 6e 75 65 29 3b 0a 20 20 73 71 6c 69 74 65  tinue);.  sqlite
121a0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
121b0 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 52 65 74  P_Return, regRet
121c0 75 72 6e 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  urn);..  return 
121d0 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  addr;.}../*.** A
121e0 6c 74 65 72 6e 61 74 69 76 65 20 63 6f 6d 70 6f  lternative compo
121f0 75 6e 64 20 73 65 6c 65 63 74 20 63 6f 64 65 20  und select code 
12200 67 65 6e 65 72 61 74 6f 72 20 66 6f 72 20 63 61  generator for ca
12210 73 65 73 20 77 68 65 6e 20 74 68 65 72 65 0a 2a  ses when there.*
12220 2a 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59  * is an ORDER BY
12230 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 57   clause..**.** W
12240 65 20 61 73 73 75 6d 65 20 61 20 71 75 65 72 79  e assume a query
12250 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
12260 67 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20  g form:.**.**   
12270 20 20 20 3c 73 65 6c 65 63 74 41 3e 20 20 3c 6f     <selectA>  <o
12280 70 65 72 61 74 6f 72 3e 20 20 3c 73 65 6c 65 63  perator>  <selec
12290 74 42 3e 20 20 4f 52 44 45 52 20 42 59 20 3c 6f  tB>  ORDER BY <o
122a0 72 64 65 72 62 79 6c 69 73 74 3e 0a 2a 2a 0a 2a  rderbylist>.**.*
122b0 2a 20 3c 6f 70 65 72 61 74 6f 72 3e 20 69 73 20  * <operator> is 
122c0 6f 6e 65 20 6f 66 20 55 4e 49 4f 4e 20 41 4c 4c  one of UNION ALL
122d0 2c 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c  , UNION, EXCEPT,
122e0 20 6f 72 20 49 4e 54 45 52 53 45 43 54 2e 20 20   or INTERSECT.  
122f0 54 68 65 20 69 64 65 61 0a 2a 2a 20 69 73 20 74  The idea.** is t
12300 6f 20 63 6f 64 65 20 62 6f 74 68 20 3c 73 65 6c  o code both <sel
12310 65 63 74 41 3e 20 61 6e 64 20 3c 73 65 6c 65 63  ectA> and <selec
12320 74 42 3e 20 77 69 74 68 20 74 68 65 20 4f 52 44  tB> with the ORD
12330 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 73 0a  ER BY clause as.
12340 2a 2a 20 63 6f 2d 72 6f 75 74 69 6e 65 73 2e 20  ** co-routines. 
12350 20 54 68 65 6e 20 72 75 6e 20 74 68 65 20 63 6f   Then run the co
12360 2d 72 6f 75 74 69 6e 65 73 20 69 6e 20 70 61 72  -routines in par
12370 61 6c 6c 65 6c 20 61 6e 64 20 6d 65 72 67 65 20  allel and merge 
12380 74 68 65 20 72 65 73 75 6c 74 73 0a 2a 2a 20 69  the results.** i
12390 6e 74 6f 20 74 68 65 20 6f 75 74 70 75 74 2e 20  nto the output. 
123a0 20 49 6e 20 61 64 64 69 74 69 6f 6e 20 74 6f 20   In addition to 
123b0 74 68 65 20 74 77 6f 20 63 6f 72 6f 75 74 69 6e  the two coroutin
123c0 65 73 20 28 63 61 6c 6c 65 64 20 73 65 6c 65 63  es (called selec
123d0 74 41 20 61 6e 64 0a 2a 2a 20 73 65 6c 65 63 74  tA and.** select
123e0 42 29 20 74 68 65 72 65 20 61 72 65 20 37 20 73  B) there are 7 s
123f0 75 62 72 6f 75 74 69 6e 65 73 3a 0a 2a 2a 0a 2a  ubroutines:.**.*
12400 2a 20 20 20 20 6f 75 74 41 3a 20 20 20 20 4d 6f  *    outA:    Mo
12410 76 65 20 74 68 65 20 6f 75 74 70 75 74 20 6f 66  ve the output of
12420 20 74 68 65 20 73 65 6c 65 63 74 41 20 63 6f 72   the selectA cor
12430 6f 75 74 69 6e 65 20 69 6e 74 6f 20 74 68 65 20  outine into the 
12440 6f 75 74 70 75 74 0a 2a 2a 20 20 20 20 20 20 20  output.**       
12450 20 20 20 20 20 20 6f 66 20 74 68 65 20 63 6f 6d        of the com
12460 70 6f 75 6e 64 20 71 75 65 72 79 2e 0a 2a 2a 0a  pound query..**.
12470 2a 2a 20 20 20 20 6f 75 74 42 3a 20 20 20 20 4d  **    outB:    M
12480 6f 76 65 20 74 68 65 20 6f 75 74 70 75 74 20 6f  ove the output o
12490 66 20 74 68 65 20 73 65 6c 65 63 74 42 20 63 6f  f the selectB co
124a0 72 6f 75 74 69 6e 65 20 69 6e 74 6f 20 74 68 65  routine into the
124b0 20 6f 75 74 70 75 74 0a 2a 2a 20 20 20 20 20 20   output.**      
124c0 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 63 6f         of the co
124d0 6d 70 6f 75 6e 64 20 71 75 65 72 79 2e 20 20 28  mpound query.  (
124e0 4f 6e 6c 79 20 67 65 6e 65 72 61 74 65 64 20 66  Only generated f
124f0 6f 72 20 55 4e 49 4f 4e 20 61 6e 64 0a 2a 2a 20  or UNION and.** 
12500 20 20 20 20 20 20 20 20 20 20 20 20 55 4e 49 4f              UNIO
12510 4e 20 41 4c 4c 2e 20 20 45 58 43 45 50 54 20 61  N ALL.  EXCEPT a
12520 6e 64 20 49 4e 53 45 52 54 53 45 43 54 20 6e 65  nd INSERTSECT ne
12530 76 65 72 20 6f 75 74 70 75 74 20 61 20 72 6f 77  ver output a row
12540 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20   that.**        
12550 20 20 20 20 20 61 70 70 65 61 72 73 20 6f 6e 6c       appears onl
12560 79 20 69 6e 20 42 2e 29 0a 2a 2a 0a 2a 2a 20 20  y in B.).**.**  
12570 20 20 41 6c 74 42 3a 20 20 20 20 43 61 6c 6c 65    AltB:    Calle
12580 64 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20  d when there is 
12590 64 61 74 61 20 66 72 6f 6d 20 62 6f 74 68 20 63  data from both c
125a0 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 41 3c  oroutines and A<
125b0 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 65 71 42  B..**.**    AeqB
125c0 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e  :    Called when
125d0 20 74 68 65 72 65 20 69 73 20 64 61 74 61 20 66   there is data f
125e0 72 6f 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74 69  rom both corouti
125f0 6e 65 73 20 61 6e 64 20 41 3d 3d 42 2e 0a 2a 2a  nes and A==B..**
12600 0a 2a 2a 20 20 20 20 41 67 74 42 3a 20 20 20 20  .**    AgtB:    
12610 43 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 72  Called when ther
12620 65 20 69 73 20 64 61 74 61 20 66 72 6f 6d 20 62  e is data from b
12630 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65 73 20 61  oth coroutines a
12640 6e 64 20 41 3e 42 2e 0a 2a 2a 0a 2a 2a 20 20 20  nd A>B..**.**   
12650 20 45 6f 66 41 3a 20 20 20 20 43 61 6c 6c 65 64   EofA:    Called
12660 20 77 68 65 6e 20 64 61 74 61 20 69 73 20 65 78   when data is ex
12670 68 61 75 73 74 65 64 20 66 72 6f 6d 20 73 65 6c  hausted from sel
12680 65 63 74 41 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 45  ectA..**.**    E
12690 6f 66 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77  ofB:    Called w
126a0 68 65 6e 20 64 61 74 61 20 69 73 20 65 78 68 61  hen data is exha
126b0 75 73 74 65 64 20 66 72 6f 6d 20 73 65 6c 65 63  usted from selec
126c0 74 42 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6d  tB..**.** The im
126d0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
126e0 74 68 65 20 6c 61 74 74 65 72 20 66 69 76 65 20  the latter five 
126f0 73 75 62 72 6f 75 74 69 6e 65 73 20 64 65 70 65  subroutines depe
12700 6e 64 20 6f 6e 20 77 68 69 63 68 20 0a 2a 2a 20  nd on which .** 
12710 3c 6f 70 65 72 61 74 6f 72 3e 20 69 73 20 75 73  <operator> is us
12720 65 64 3a 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 20 20 20  ed:.**.**.**    
12730 20 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 41           UNION A
12740 4c 4c 20 20 20 20 20 20 20 20 20 55 4e 49 4f 4e  LL         UNION
12750 20 20 20 20 20 20 20 20 20 20 20 20 45 58 43 45              EXCE
12760 50 54 20 20 20 20 20 20 20 20 20 20 49 4e 54 45  PT          INTE
12770 52 53 45 43 54 0a 2a 2a 20 20 20 20 20 20 20 20  RSECT.**        
12780 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20    ------------- 
12790 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
127a0 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  --  ------------
127b0 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  --  ------------
127c0 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 41 6c 74 42 3a  -----.**   AltB:
127d0 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20     outA, nextA  
127e0 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20      outA, nextA 
127f0 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74        outA, next
12800 41 20 20 20 20 20 20 20 20 20 6e 65 78 74 41 0a  A         nextA.
12810 2a 2a 0a 2a 2a 20 20 20 41 65 71 42 3a 20 20 20  **.**   AeqB:   
12820 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20  outA, nextA     
12830 20 20 20 20 6e 65 78 74 41 20 20 20 20 20 20 20      nextA       
12840 20 20 20 20 20 20 6e 65 78 74 41 20 20 20 20 20        nextA     
12850 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 0a      outA, nextA.
12860 2a 2a 0a 2a 2a 20 20 20 41 67 74 42 3a 20 20 20  **.**   AgtB:   
12870 6f 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20  outB, nextB     
12880 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20   outB, nextB    
12890 20 20 20 20 20 20 6e 65 78 74 42 20 20 20 20 20        nextB     
128a0 20 20 20 20 20 20 20 6e 65 78 74 42 0a 2a 2a 0a         nextB.**.
128b0 2a 2a 20 20 20 45 6f 66 41 3a 20 20 20 6f 75 74  **   EofA:   out
128c0 42 2c 20 6e 65 78 74 42 20 20 20 20 20 20 6f 75  B, nextB      ou
128d0 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20 20 20  tB, nextB       
128e0 20 20 20 68 61 6c 74 20 20 20 20 20 20 20 20 20     halt         
128f0 20 20 20 20 68 61 6c 74 0a 2a 2a 0a 2a 2a 20 20      halt.**.**  
12900 20 45 6f 66 42 3a 20 20 20 6f 75 74 41 2c 20 6e   EofB:   outA, n
12910 65 78 74 41 20 20 20 20 20 20 6f 75 74 41 2c 20  extA      outA, 
12920 6e 65 78 74 41 20 20 20 20 20 20 20 6f 75 74 41  nextA       outA
12930 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20 20 20  , nextA         
12940 68 61 6c 74 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68  halt.**.** In th
12950 65 20 41 6c 74 42 2c 20 41 65 71 42 2c 20 61 6e  e AltB, AeqB, an
12960 64 20 41 67 74 42 20 73 75 62 72 6f 75 74 69 6e  d AgtB subroutin
12970 65 73 2c 20 61 6e 20 45 4f 46 20 6f 6e 20 41 20  es, an EOF on A 
12980 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78 74 41 0a  following nextA.
12990 2a 2a 20 63 61 75 73 65 73 20 61 6e 20 69 6d 6d  ** causes an imm
129a0 65 64 69 61 74 65 20 6a 75 6d 70 20 74 6f 20 45  ediate jump to E
129b0 6f 66 41 20 61 6e 64 20 61 6e 20 45 4f 46 20 6f  ofA and an EOF o
129c0 6e 20 42 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65  n B following ne
129d0 78 74 42 20 63 61 75 73 65 73 0a 2a 2a 20 61 6e  xtB causes.** an
129e0 20 69 6d 6d 65 64 69 61 74 65 20 6a 75 6d 70 20   immediate jump 
129f0 74 6f 20 45 6f 66 42 2e 20 20 57 69 74 68 69 6e  to EofB.  Within
12a00 20 45 6f 66 41 20 61 6e 64 20 45 6f 66 42 2c 20   EofA and EofB, 
12a10 61 6e 64 20 45 4f 46 20 6f 6e 20 65 6e 74 72 79  and EOF on entry
12a20 20 6f 72 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67   or.** following
12a30 20 6e 65 78 74 58 20 63 61 75 73 65 73 20 61 20   nextX causes a 
12a40 6a 75 6d 70 20 74 6f 20 74 68 65 20 65 6e 64 20  jump to the end 
12a50 6f 66 20 74 68 65 20 73 65 6c 65 63 74 20 70 72  of the select pr
12a60 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  ocessing..**.** 
12a70 44 75 70 6c 69 63 61 74 65 20 72 65 6d 6f 76 61  Duplicate remova
12a80 6c 20 69 6e 20 74 68 65 20 55 4e 49 4f 4e 2c 20  l in the UNION, 
12a90 45 58 43 45 50 54 2c 20 61 6e 64 20 49 4e 54 45  EXCEPT, and INTE
12aa0 52 53 45 43 54 20 63 61 73 65 73 20 69 73 20 68  RSECT cases is h
12ab0 61 6e 64 6c 65 64 0a 2a 2a 20 77 69 74 68 69 6e  andled.** within
12ac0 20 74 68 65 20 6f 75 74 70 75 74 20 73 75 62 72   the output subr
12ad0 6f 75 74 69 6e 65 2e 20 20 54 68 65 20 72 65 67  outine.  The reg
12ae0 50 72 65 76 20 72 65 67 69 73 74 65 72 20 73 65  Prev register se
12af0 74 20 68 6f 6c 64 73 20 74 68 65 20 70 72 65 76  t holds the prev
12b00 69 6f 75 73 6c 79 0a 2a 2a 20 6f 75 74 70 75 74  iously.** output
12b10 20 76 61 6c 75 65 2e 20 20 41 20 63 6f 6d 70 61   value.  A compa
12b20 72 69 73 6f 6e 20 69 73 20 6d 61 64 65 20 61 67  rison is made ag
12b30 61 69 6e 73 74 20 74 68 69 73 20 76 61 6c 75 65  ainst this value
12b40 20 61 6e 64 20 74 68 65 20 6f 75 74 70 75 74 0a   and the output.
12b50 2a 2a 20 69 73 20 73 6b 69 70 70 65 64 20 69 66  ** is skipped if
12b60 20 74 68 65 20 6e 65 78 74 20 72 65 73 75 6c 74   the next result
12b70 73 20 77 6f 75 6c 64 20 62 65 20 74 68 65 20 73  s would be the s
12b80 61 6d 65 20 61 73 20 74 68 65 20 70 72 65 76 69  ame as the previ
12b90 6f 75 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69  ous..**.** The i
12ba0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 70 6c  mplementation pl
12bb0 61 6e 20 69 73 20 74 6f 20 69 6d 70 6c 65 6d 65  an is to impleme
12bc0 6e 74 20 74 68 65 20 74 77 6f 20 63 6f 72 6f 75  nt the two corou
12bd0 74 69 6e 65 73 20 61 6e 64 20 73 65 76 65 6e 0a  tines and seven.
12be0 2a 2a 20 73 75 62 72 6f 75 74 69 6e 65 73 20 66  ** subroutines f
12bf0 69 72 73 74 2c 20 74 68 65 6e 20 70 75 74 20 74  irst, then put t
12c00 68 65 20 63 6f 6e 74 72 6f 6c 20 6c 6f 67 69 63  he control logic
12c10 20 61 74 20 74 68 65 20 62 6f 74 74 6f 6d 2e 20   at the bottom. 
12c20 20 4c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a   Like this:.**.*
12c30 2a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  *          goto 
12c40 49 6e 69 74 0a 2a 2a 20 20 20 20 20 63 6f 41 3a  Init.**     coA:
12c50 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20 6c   coroutine for l
12c60 65 66 74 20 71 75 65 72 79 20 28 41 29 0a 2a 2a  eft query (A).**
12c70 20 20 20 20 20 63 6f 42 3a 20 63 6f 72 6f 75 74       coB: corout
12c80 69 6e 65 20 66 6f 72 20 72 69 67 68 74 20 71 75  ine for right qu
12c90 65 72 79 20 28 42 29 0a 2a 2a 20 20 20 20 6f 75  ery (B).**    ou
12ca0 74 41 3a 20 6f 75 74 70 75 74 20 6f 6e 65 20 72  tA: output one r
12cb0 6f 77 20 6f 66 20 41 0a 2a 2a 20 20 20 20 6f 75  ow of A.**    ou
12cc0 74 42 3a 20 6f 75 74 70 75 74 20 6f 6e 65 20 72  tB: output one r
12cd0 6f 77 20 6f 66 20 42 20 28 55 4e 49 4f 4e 20 61  ow of B (UNION a
12ce0 6e 64 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 6e 6c  nd UNION ALL onl
12cf0 79 29 0a 2a 2a 20 20 20 20 45 6f 66 41 3a 20 2e  y).**    EofA: .
12d00 2e 2e 0a 2a 2a 20 20 20 20 45 6f 66 42 3a 20 2e  ...**    EofB: .
12d10 2e 2e 0a 2a 2a 20 20 20 20 41 6c 74 42 3a 20 2e  ...**    AltB: .
12d20 2e 2e 0a 2a 2a 20 20 20 20 41 65 71 42 3a 20 2e  ...**    AeqB: .
12d30 2e 2e 0a 2a 2a 20 20 20 20 41 67 74 42 3a 20 2e  ...**    AgtB: .
12d40 2e 2e 0a 2a 2a 20 20 20 20 49 6e 69 74 3a 20 69  ...**    Init: i
12d50 6e 69 74 69 61 6c 69 7a 65 20 63 6f 72 6f 75 74  nitialize corout
12d60 69 6e 65 20 72 65 67 69 73 74 65 72 73 0a 2a 2a  ine registers.**
12d70 20 20 20 20 20 20 20 20 20 20 79 69 65 6c 64 20            yield 
12d80 63 6f 41 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  coA.**          
12d90 69 66 20 65 6f 66 28 41 29 20 67 6f 74 6f 20 45  if eof(A) goto E
12da0 6f 66 41 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ofA.**          
12db0 79 69 65 6c 64 20 63 6f 42 0a 2a 2a 20 20 20 20  yield coB.**    
12dc0 20 20 20 20 20 20 69 66 20 65 6f 66 28 42 29 20        if eof(B) 
12dd0 67 6f 74 6f 20 45 6f 66 42 0a 2a 2a 20 20 20 20  goto EofB.**    
12de0 43 6d 70 72 3a 20 43 6f 6d 70 61 72 65 20 41 2c  Cmpr: Compare A,
12df0 20 42 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 4a   B.**          J
12e00 75 6d 70 20 41 6c 74 42 2c 20 41 65 71 42 2c 20  ump AltB, AeqB, 
12e10 41 67 74 42 0a 2a 2a 20 20 20 20 20 45 6e 64 3a  AgtB.**     End:
12e20 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 63 61   ....**.** We ca
12e30 6c 6c 20 41 6c 74 42 2c 20 41 65 71 42 2c 20 41  ll AltB, AeqB, A
12e40 67 74 42 2c 20 45 6f 66 41 2c 20 61 6e 64 20 45  gtB, EofA, and E
12e50 6f 66 42 20 22 73 75 62 72 6f 75 74 69 6e 65 73  ofB "subroutines
12e60 22 20 62 75 74 20 74 68 65 79 20 61 72 65 20 6e  " but they are n
12e70 6f 74 0a 2a 2a 20 61 63 74 75 61 6c 6c 79 20 63  ot.** actually c
12e80 61 6c 6c 65 64 20 75 73 69 6e 67 20 47 6f 73 75  alled using Gosu
12e90 62 20 61 6e 64 20 74 68 65 79 20 64 6f 20 6e 6f  b and they do no
12ea0 74 20 52 65 74 75 72 6e 2e 20 20 45 6f 66 41 20  t Return.  EofA 
12eb0 61 6e 64 20 45 6f 66 42 20 6c 6f 6f 70 0a 2a 2a  and EofB loop.**
12ec0 20 75 6e 74 69 6c 20 61 6c 6c 20 64 61 74 61 20   until all data 
12ed0 69 73 20 65 78 68 61 75 73 74 65 64 20 74 68 65  is exhausted the
12ee0 6e 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 22 65  n jump to the "e
12ef0 6e 64 22 20 6c 61 62 65 2e 20 20 41 6c 74 42 2c  nd" labe.  AltB,
12f00 20 41 65 71 42 2c 0a 2a 2a 20 61 6e 64 20 41 67   AeqB,.** and Ag
12f10 74 42 20 6a 75 6d 70 20 74 6f 20 65 69 74 68 65  tB jump to eithe
12f20 72 20 4c 32 20 6f 72 20 74 6f 20 6f 6e 65 20 6f  r L2 or to one o
12f30 66 20 45 6f 66 41 20 6f 72 20 45 6f 66 42 2e 0a  f EofA or EofB..
12f40 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
12f50 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
12f60 53 45 4c 45 43 54 0a 73 74 61 74 69 63 20 69 6e  SELECT.static in
12f70 74 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64  t multiSelectOrd
12f80 65 72 42 79 28 0a 20 20 50 61 72 73 65 20 2a 70  erBy(.  Parse *p
12f90 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a  Parse,        /*
12fa0 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
12fb0 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
12fc0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
12fd0 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66  he right-most of
12fe0 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63   SELECTs to be c
12ff0 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74  oded */.  Select
13000 44 65 73 74 20 2a 70 44 65 73 74 20 20 20 20 20  Dest *pDest     
13010 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69  /* What to do wi
13020 74 68 20 71 75 65 72 79 20 72 65 73 75 6c 74 73  th query results
13030 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20   */.){.  int i, 
13040 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  j;             /
13050 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20  * Loop counters 
13060 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 72  */.  Select *pPr
13070 69 6f 72 3b 20 20 20 20 20 20 20 2f 2a 20 41 6e  ior;       /* An
13080 6f 74 68 65 72 20 53 45 4c 45 43 54 20 69 6d 6d  other SELECT imm
13090 65 64 69 61 74 65 6c 79 20 74 6f 20 6f 75 72 20  ediately to our 
130a0 6c 65 66 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a  left */.  Vdbe *
130b0 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
130c0 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
130d0 20 74 6f 20 74 68 69 73 20 56 44 42 45 20 2a 2f   to this VDBE */
130e0 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65  .  SelectDest de
130f0 73 74 41 3b 20 20 20 20 20 2f 2a 20 44 65 73 74  stA;     /* Dest
13100 69 6e 61 74 69 6f 6e 20 66 6f 72 20 63 6f 72 6f  ination for coro
13110 75 74 69 6e 65 20 41 20 2a 2f 0a 20 20 53 65 6c  utine A */.  Sel
13120 65 63 74 44 65 73 74 20 64 65 73 74 42 3b 20 20  ectDest destB;  
13130 20 20 20 2f 2a 20 44 65 73 74 69 6e 61 74 69 6f     /* Destinatio
13140 6e 20 66 6f 72 20 63 6f 72 6f 75 74 69 6e 65 20  n for coroutine 
13150 42 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 41 64  B */.  int regAd
13160 64 72 41 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  drA;         /* 
13170 41 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72  Address register
13180 20 66 6f 72 20 73 65 6c 65 63 74 2d 41 20 63 6f   for select-A co
13190 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
131a0 20 72 65 67 45 6f 66 41 3b 20 20 20 20 20 20 20   regEofA;       
131b0 20 20 20 2f 2a 20 46 6c 61 67 20 74 6f 20 69 6e     /* Flag to in
131c0 64 69 63 61 74 65 20 77 68 65 6e 20 73 65 6c 65  dicate when sele
131d0 63 74 2d 41 20 69 73 20 63 6f 6d 70 6c 65 74 65  ct-A is complete
131e0 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 41 64 64   */.  int regAdd
131f0 72 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41  rB;         /* A
13200 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20  ddress register 
13210 66 6f 72 20 73 65 6c 65 63 74 2d 42 20 63 6f 72  for select-B cor
13220 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
13230 72 65 67 45 6f 66 42 3b 20 20 20 20 20 20 20 20  regEofB;        
13240 20 20 2f 2a 20 46 6c 61 67 20 74 6f 20 69 6e 64    /* Flag to ind
13250 69 63 61 74 65 20 77 68 65 6e 20 73 65 6c 65 63  icate when selec
13260 74 2d 42 20 69 73 20 63 6f 6d 70 6c 65 74 65 20  t-B is complete 
13270 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 53 65 6c  */.  int addrSel
13280 65 63 74 41 3b 20 20 20 20 20 20 2f 2a 20 41 64  ectA;      /* Ad
13290 64 72 65 73 73 20 6f 66 20 74 68 65 20 73 65 6c  dress of the sel
132a0 65 63 74 2d 41 20 63 6f 72 6f 75 74 69 6e 65 20  ect-A coroutine 
132b0 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 53 65 6c  */.  int addrSel
132c0 65 63 74 42 3b 20 20 20 20 20 20 2f 2a 20 41 64  ectB;      /* Ad
132d0 64 72 65 73 73 20 6f 66 20 74 68 65 20 73 65 6c  dress of the sel
132e0 65 63 74 2d 42 20 63 6f 72 6f 75 74 69 6e 65 20  ect-B coroutine 
132f0 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75 74 41  */.  int regOutA
13300 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64  ;          /* Ad
13310 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66  dress register f
13320 6f 72 20 74 68 65 20 6f 75 74 70 75 74 2d 41 20  or the output-A 
13330 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
13340 69 6e 74 20 72 65 67 4f 75 74 42 3b 20 20 20 20  int regOutB;    
13350 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
13360 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 74 68   register for th
13370 65 20 6f 75 74 70 75 74 2d 42 20 73 75 62 72 6f  e output-B subro
13380 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61  utine */.  int a
13390 64 64 72 4f 75 74 41 3b 20 20 20 20 20 20 20 20  ddrOutA;        
133a0 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
133b0 68 65 20 6f 75 74 70 75 74 2d 41 20 73 75 62 72  he output-A subr
133c0 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
133d0 61 64 64 72 4f 75 74 42 20 3d 20 30 3b 20 20 20  addrOutB = 0;   
133e0 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
133f0 74 68 65 20 6f 75 74 70 75 74 2d 42 20 73 75 62  the output-B sub
13400 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
13410 20 61 64 64 72 45 6f 66 41 3b 20 20 20 20 20 20   addrEofA;      
13420 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
13430 20 74 68 65 20 73 65 6c 65 63 74 2d 41 2d 65 78   the select-A-ex
13440 68 61 75 73 74 65 64 20 73 75 62 72 6f 75 74 69  hausted subrouti
13450 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ne */.  int addr
13460 45 6f 66 42 3b 20 20 20 20 20 20 20 20 20 2f 2a  EofB;         /*
13470 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
13480 73 65 6c 65 63 74 2d 42 2d 65 78 68 61 75 73 74  select-B-exhaust
13490 65 64 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f  ed subroutine */
134a0 0a 20 20 69 6e 74 20 61 64 64 72 41 6c 74 42 3b  .  int addrAltB;
134b0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
134c0 65 73 73 20 6f 66 20 74 68 65 20 41 3c 42 20 73  ess of the A<B s
134d0 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  ubroutine */.  i
134e0 6e 74 20 61 64 64 72 41 65 71 42 3b 20 20 20 20  nt addrAeqB;    
134f0 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
13500 6f 66 20 74 68 65 20 41 3d 3d 42 20 73 75 62 72  of the A==B subr
13510 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
13520 61 64 64 72 41 67 74 42 3b 20 20 20 20 20 20 20  addrAgtB;       
13530 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
13540 74 68 65 20 41 3e 42 20 73 75 62 72 6f 75 74 69  the A>B subrouti
13550 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4c  ne */.  int regL
13560 69 6d 69 74 41 3b 20 20 20 20 20 20 20 20 2f 2a  imitA;        /*
13570 20 4c 69 6d 69 74 20 72 65 67 69 73 74 65 72 20   Limit register 
13580 66 6f 72 20 73 65 6c 65 63 74 2d 41 20 2a 2f 0a  for select-A */.
13590 20 20 69 6e 74 20 72 65 67 4c 69 6d 69 74 42 3b    int regLimitB;
135a0 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6d 69 74          /* Limit
135b0 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 73 65   register for se
135c0 6c 65 63 74 2d 41 20 2a 2f 0a 20 20 69 6e 74 20  lect-A */.  int 
135d0 72 65 67 50 72 65 76 3b 20 20 20 20 20 20 20 20  regPrev;        
135e0 20 20 2f 2a 20 41 20 72 61 6e 67 65 20 6f 66 20    /* A range of 
135f0 72 65 67 69 73 74 65 72 73 20 74 6f 20 68 6f 6c  registers to hol
13600 64 20 70 72 65 76 69 6f 75 73 20 6f 75 74 70 75  d previous outpu
13610 74 20 2a 2f 0a 20 20 69 6e 74 20 73 61 76 65 64  t */.  int saved
13620 4c 69 6d 69 74 3b 20 20 20 20 20 20 20 2f 2a 20  Limit;       /* 
13630 53 61 76 65 64 20 76 61 6c 75 65 20 6f 66 20 70  Saved value of p
13640 2d 3e 69 4c 69 6d 69 74 20 2a 2f 0a 20 20 69 6e  ->iLimit */.  in
13650 74 20 73 61 76 65 64 4f 66 66 73 65 74 3b 20 20  t savedOffset;  
13660 20 20 20 20 2f 2a 20 53 61 76 65 64 20 76 61 6c      /* Saved val
13670 75 65 20 6f 66 20 70 2d 3e 69 4f 66 66 73 65 74  ue of p->iOffset
13680 20 2a 2f 0a 20 20 69 6e 74 20 6c 61 62 65 6c 43   */.  int labelC
13690 6d 70 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c  mpr;        /* L
136a0 61 62 65 6c 20 66 6f 72 20 74 68 65 20 73 74 61  abel for the sta
136b0 72 74 20 6f 66 20 74 68 65 20 6d 65 72 67 65 20  rt of the merge 
136c0 61 6c 67 6f 72 69 74 68 6d 20 2a 2f 0a 20 20 69  algorithm */.  i
136d0 6e 74 20 6c 61 62 65 6c 45 6e 64 3b 20 20 20 20  nt labelEnd;    
136e0 20 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20 66 6f       /* Label fo
136f0 72 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  r the end of the
13700 20 6f 76 65 72 61 6c 6c 20 53 45 4c 45 43 54 20   overall SELECT 
13710 73 74 6d 74 20 2a 2f 0a 20 20 69 6e 74 20 6a 31  stmt */.  int j1
13720 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
13730 2f 2a 20 4a 75 6d 70 20 69 6e 73 74 72 75 63 74  /* Jump instruct
13740 69 6f 6e 73 20 74 68 61 74 20 67 65 74 20 72 65  ions that get re
13750 74 61 72 67 65 74 74 65 64 20 2a 2f 0a 20 20 69  targetted */.  i
13760 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20  nt op;          
13770 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 54       /* One of T
13780 4b 5f 41 4c 4c 2c 20 54 4b 5f 55 4e 49 4f 4e 2c  K_ALL, TK_UNION,
13790 20 54 4b 5f 45 58 43 45 50 54 2c 20 54 4b 5f 49   TK_EXCEPT, TK_I
137a0 4e 54 45 52 53 45 43 54 20 2a 2f 0a 20 20 4b 65  NTERSECT */.  Ke
137b0 79 49 6e 66 6f 20 2a 70 4b 65 79 44 75 70 20 3d  yInfo *pKeyDup =
137c0 20 30 3b 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f   0; /* Compariso
137d0 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f  n information fo
137e0 72 20 64 75 70 6c 69 63 61 74 65 20 72 65 6d 6f  r duplicate remo
137f0 76 61 6c 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f  val */.  KeyInfo
13800 20 2a 70 4b 65 79 4d 65 72 67 65 3b 20 20 20 2f   *pKeyMerge;   /
13810 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 66  * Comparison inf
13820 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 6d 65 72  ormation for mer
13830 67 69 6e 67 20 72 6f 77 73 20 2a 2f 0a 20 20 73  ging rows */.  s
13840 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20  qlite3 *db;     
13850 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
13860 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
13870 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
13880 72 42 79 3b 20 20 20 2f 2a 20 54 68 65 20 4f 52  rBy;   /* The OR
13890 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  DER BY clause */
138a0 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72 42 79 3b  .  int nOrderBy;
138b0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
138c0 65 72 20 6f 66 20 74 65 72 6d 73 20 69 6e 20 74  er of terms in t
138d0 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
138e0 73 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 50 65  se */.  int *aPe
138f0 72 6d 75 74 65 3b 20 20 20 20 20 20 20 20 2f 2a  rmute;        /*
13900 20 4d 61 70 70 69 6e 67 20 66 72 6f 6d 20 4f 52   Mapping from OR
13910 44 45 52 20 42 59 20 74 65 72 6d 73 20 74 6f 20  DER BY terms to 
13920 72 65 73 75 6c 74 20 73 65 74 20 63 6f 6c 75 6d  result set colum
13930 6e 73 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  ns */.#ifndef SQ
13940 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
13950 4e 0a 20 20 69 6e 74 20 69 53 75 62 31 3b 20 20  N.  int iSub1;  
13960 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 51 50            /* EQP
13970 20 69 64 20 6f 66 20 6c 65 66 74 2d 68 61 6e 64   id of left-hand
13980 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20   query */.  int 
13990 69 53 75 62 32 3b 20 20 20 20 20 20 20 20 20 20  iSub2;          
139a0 20 20 2f 2a 20 45 51 50 20 69 64 20 6f 66 20 72    /* EQP id of r
139b0 69 67 68 74 2d 68 61 6e 64 20 71 75 65 72 79 20  ight-hand query 
139c0 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73  */.#endif..  ass
139d0 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79  ert( p->pOrderBy
139e0 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
139f0 20 70 4b 65 79 44 75 70 3d 3d 30 20 29 3b 20 2f   pKeyDup==0 ); /
13a00 2a 20 22 4d 61 6e 61 67 65 64 22 20 63 6f 64 65  * "Managed" code
13a10 20 6e 65 65 64 73 20 74 68 69 73 2e 20 20 54 69   needs this.  Ti
13a20 63 6b 65 74 20 23 33 33 38 32 2e 20 2a 2f 0a 20  cket #3382. */. 
13a30 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
13a40 3b 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e  ;.  v = pParse->
13a50 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74 28  pVdbe;.  assert(
13a60 20 76 21 3d 30 20 29 3b 20 20 20 20 20 20 20 2f   v!=0 );       /
13a70 2a 20 41 6c 72 65 61 64 79 20 74 68 72 6f 77 6e  * Already thrown
13a80 20 74 68 65 20 65 72 72 6f 72 20 69 66 20 56 44   the error if VD
13a90 42 45 20 61 6c 6c 6f 63 20 66 61 69 6c 65 64 20  BE alloc failed 
13aa0 2a 2f 0a 20 20 6c 61 62 65 6c 45 6e 64 20 3d 20  */.  labelEnd = 
13ab0 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
13ac0 61 62 65 6c 28 76 29 3b 0a 20 20 6c 61 62 65 6c  abel(v);.  label
13ad0 43 6d 70 72 20 3d 20 73 71 6c 69 74 65 33 56 64  Cmpr = sqlite3Vd
13ae0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
13af0 0a 0a 20 20 2f 2a 20 50 61 74 63 68 20 75 70 20  ..  /* Patch up 
13b00 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
13b10 75 73 65 0a 20 20 2a 2f 0a 20 20 6f 70 20 3d 20  use.  */.  op = 
13b20 70 2d 3e 6f 70 3b 20 20 0a 20 20 70 50 72 69 6f  p->op;  .  pPrio
13b30 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20  r = p->pPrior;. 
13b40 20 61 73 73 65 72 74 28 20 70 50 72 69 6f 72 2d   assert( pPrior-
13b50 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a  >pOrderBy==0 );.
13b60 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e    pOrderBy = p->
13b70 70 4f 72 64 65 72 42 79 3b 0a 20 20 61 73 73 65  pOrderBy;.  asse
13b80 72 74 28 20 70 4f 72 64 65 72 42 79 20 29 3b 0a  rt( pOrderBy );.
13b90 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 70 4f 72    nOrderBy = pOr
13ba0 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 0a 20  derBy->nExpr;.. 
13bb0 20 2f 2a 20 46 6f 72 20 6f 70 65 72 61 74 6f 72   /* For operator
13bc0 73 20 6f 74 68 65 72 20 74 68 61 6e 20 55 4e 49  s other than UNI
13bd0 4f 4e 20 41 4c 4c 20 77 65 20 68 61 76 65 20 74  ON ALL we have t
13be0 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  o make sure that
13bf0 0a 20 20 2a 2a 20 74 68 65 20 4f 52 44 45 52 20  .  ** the ORDER 
13c00 42 59 20 63 6c 61 75 73 65 20 63 6f 76 65 72 73  BY clause covers
13c10 20 65 76 65 72 79 20 74 65 72 6d 20 6f 66 20 74   every term of t
13c20 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20 20  he result set.  
13c30 41 64 64 0a 20 20 2a 2a 20 74 65 72 6d 73 20 74  Add.  ** terms t
13c40 6f 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  o the ORDER BY c
13c50 6c 61 75 73 65 20 61 73 20 6e 65 63 65 73 73 61  lause as necessa
13c60 72 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f  ry..  */.  if( o
13c70 70 21 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20  p!=TK_ALL ){.   
13c80 20 66 6f 72 28 69 3d 31 3b 20 64 62 2d 3e 6d 61   for(i=1; db->ma
13c90 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 26 26  llocFailed==0 &&
13ca0 20 69 3c 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e   i<=p->pEList->n
13cb0 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
13cc0 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
13cd0 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
13ce0 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 49       for(j=0, pI
13cf0 74 65 6d 3d 70 4f 72 64 65 72 42 79 2d 3e 61 3b  tem=pOrderBy->a;
13d00 20 6a 3c 6e 4f 72 64 65 72 42 79 3b 20 6a 2b 2b   j<nOrderBy; j++
13d10 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
13d20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65      assert( pIte
13d30 6d 2d 3e 69 4f 72 64 65 72 42 79 43 6f 6c 3e 30  m->iOrderByCol>0
13d40 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
13d50 70 49 74 65 6d 2d 3e 69 4f 72 64 65 72 42 79 43  pItem->iOrderByC
13d60 6f 6c 3d 3d 69 20 29 20 62 72 65 61 6b 3b 0a 20  ol==i ) break;. 
13d70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
13d80 20 6a 3d 3d 6e 4f 72 64 65 72 42 79 20 29 7b 0a   j==nOrderBy ){.
13d90 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e          Expr *pN
13da0 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ew = sqlite3Expr
13db0 28 64 62 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c  (db, TK_INTEGER,
13dc0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
13dd0 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72   pNew==0 ) retur
13de0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
13df0 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c          pNew->fl
13e00 61 67 73 20 7c 3d 20 45 50 5f 49 6e 74 56 61 6c  ags |= EP_IntVal
13e10 75 65 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  ue;.        pNew
13e20 2d 3e 75 2e 69 56 61 6c 75 65 20 3d 20 69 3b 0a  ->u.iValue = i;.
13e30 20 20 20 20 20 20 20 20 70 4f 72 64 65 72 42 79          pOrderBy
13e40 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
13e50 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c  stAppend(pParse,
13e60 20 70 4f 72 64 65 72 42 79 2c 20 70 4e 65 77 29   pOrderBy, pNew)
13e70 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f  ;.        if( pO
13e80 72 64 65 72 42 79 20 29 20 70 4f 72 64 65 72 42  rderBy ) pOrderB
13e90 79 2d 3e 61 5b 6e 4f 72 64 65 72 42 79 2b 2b 5d  y->a[nOrderBy++]
13ea0 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20 3d 20 28  .iOrderByCol = (
13eb0 75 31 36 29 69 3b 0a 20 20 20 20 20 20 7d 0a 20  u16)i;.      }. 
13ec0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43     }.  }..  /* C
13ed0 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6d 70 61  ompute the compa
13ee0 72 69 73 6f 6e 20 70 65 72 6d 75 74 61 74 69 6f  rison permutatio
13ef0 6e 20 61 6e 64 20 6b 65 79 69 6e 66 6f 20 74 68  n and keyinfo th
13f00 61 74 20 69 73 20 75 73 65 64 20 77 69 74 68 0a  at is used with.
13f10 20 20 2a 2a 20 74 68 65 20 70 65 72 6d 75 74 61    ** the permuta
13f20 74 69 6f 6e 20 75 73 65 64 20 74 6f 20 64 65 74  tion used to det
13f30 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20 6e 65  ermine if the ne
13f40 78 74 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20 72  xt.  ** row of r
13f50 65 73 75 6c 74 73 20 63 6f 6d 65 73 20 66 72 6f  esults comes fro
13f60 6d 20 73 65 6c 65 63 74 41 20 6f 72 20 73 65 6c  m selectA or sel
13f70 65 63 74 42 2e 20 20 41 6c 73 6f 20 61 64 64 20  ectB.  Also add 
13f80 65 78 70 6c 69 63 69 74 0a 20 20 2a 2a 20 63 6f  explicit.  ** co
13f90 6c 6c 61 74 69 6f 6e 73 20 74 6f 20 74 68 65 20  llations to the 
13fa0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
13fb0 74 65 72 6d 73 20 73 6f 20 74 68 61 74 20 77 68  terms so that wh
13fc0 65 6e 20 74 68 65 20 73 75 62 71 75 65 72 69 65  en the subquerie
13fd0 73 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 72 69  s.  ** to the ri
13fe0 67 68 74 20 61 6e 64 20 74 68 65 20 6c 65 66 74  ght and the left
13ff0 20 61 72 65 20 65 76 61 6c 75 61 74 65 64 2c 20   are evaluated, 
14000 74 68 65 79 20 75 73 65 20 74 68 65 20 63 6f 72  they use the cor
14010 72 65 63 74 0a 20 20 2a 2a 20 63 6f 6c 6c 61 74  rect.  ** collat
14020 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 61 50 65 72  ion..  */.  aPer
14030 6d 75 74 65 20 3d 20 73 71 6c 69 74 65 33 44 62  mute = sqlite3Db
14040 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69  MallocRaw(db, si
14050 7a 65 6f 66 28 69 6e 74 29 2a 6e 4f 72 64 65 72  zeof(int)*nOrder
14060 42 79 29 3b 0a 20 20 69 66 28 20 61 50 65 72 6d  By);.  if( aPerm
14070 75 74 65 20 29 7b 0a 20 20 20 20 73 74 72 75 63  ute ){.    struc
14080 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
14090 2a 70 49 74 65 6d 3b 0a 20 20 20 20 66 6f 72 28  *pItem;.    for(
140a0 69 3d 30 2c 20 70 49 74 65 6d 3d 70 4f 72 64 65  i=0, pItem=pOrde
140b0 72 42 79 2d 3e 61 3b 20 69 3c 6e 4f 72 64 65 72  rBy->a; i<nOrder
140c0 42 79 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  By; i++, pItem++
140d0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
140e0 20 70 49 74 65 6d 2d 3e 69 4f 72 64 65 72 42 79   pItem->iOrderBy
140f0 43 6f 6c 3e 30 20 20 26 26 20 70 49 74 65 6d 2d  Col>0  && pItem-
14100 3e 69 4f 72 64 65 72 42 79 43 6f 6c 3c 3d 70 2d  >iOrderByCol<=p-
14110 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  >pEList->nExpr )
14120 3b 0a 20 20 20 20 20 20 61 50 65 72 6d 75 74 65  ;.      aPermute
14130 5b 69 5d 20 3d 20 70 49 74 65 6d 2d 3e 69 4f 72  [i] = pItem->iOr
14140 64 65 72 42 79 43 6f 6c 20 2d 20 31 3b 0a 20 20  derByCol - 1;.  
14150 20 20 7d 0a 20 20 20 20 70 4b 65 79 4d 65 72 67    }.    pKeyMerg
14160 65 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  e = sqlite3KeyIn
14170 66 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e 4f 72 64  foAlloc(db, nOrd
14180 65 72 42 79 29 3b 0a 20 20 20 20 69 66 28 20 70  erBy);.    if( p
14190 4b 65 79 4d 65 72 67 65 20 29 7b 0a 20 20 20 20  KeyMerge ){.    
141a0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72    for(i=0; i<nOr
141b0 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20  derBy; i++){.   
141c0 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43       CollSeq *pC
141d0 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 45 78 70  oll;.        Exp
141e0 72 20 2a 70 54 65 72 6d 20 3d 20 70 4f 72 64 65  r *pTerm = pOrde
141f0 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  rBy->a[i].pExpr;
14200 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54 65  .        if( pTe
14210 72 6d 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 43  rm->flags & EP_C
14220 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 20 20  ollate ){.      
14230 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
14240 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
14250 50 61 72 73 65 2c 20 70 54 65 72 6d 29 3b 0a 20  Parse, pTerm);. 
14260 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
14270 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20          pColl = 
14280 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53  multiSelectCollS
14290 65 71 28 70 50 61 72 73 65 2c 20 70 2c 20 61 50  eq(pParse, p, aP
142a0 65 72 6d 75 74 65 5b 69 5d 29 3b 0a 20 20 20 20  ermute[i]);.    
142b0 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 3d        if( pColl=
142c0 3d 30 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d  =0 ) pColl = db-
142d0 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20  >pDfltColl;.    
142e0 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 2d 3e        pOrderBy->
142f0 61 5b 69 5d 2e 70 45 78 70 72 20 3d 0a 20 20 20  a[i].pExpr =.   
14300 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
14310 33 45 78 70 72 41 64 64 43 6f 6c 6c 61 74 65 53  3ExprAddCollateS
14320 74 72 69 6e 67 28 70 50 61 72 73 65 2c 20 70 54  tring(pParse, pT
14330 65 72 6d 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  erm, pColl->zNam
14340 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e);.        }.  
14350 20 20 20 20 20 20 70 4b 65 79 4d 65 72 67 65 2d        pKeyMerge-
14360 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 70 43 6f 6c  >aColl[i] = pCol
14370 6c 3b 0a 20 20 20 20 20 20 20 20 70 4b 65 79 4d  l;.        pKeyM
14380 65 72 67 65 2d 3e 61 53 6f 72 74 4f 72 64 65 72  erge->aSortOrder
14390 5b 69 5d 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e  [i] = pOrderBy->
143a0 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a  a[i].sortOrder;.
143b0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
143c0 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4b 65 79 4d  }else{.    pKeyM
143d0 65 72 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  erge = 0;.  }.. 
143e0 20 2f 2a 20 52 65 61 74 74 61 63 68 20 74 68 65   /* Reattach the
143f0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
14400 20 74 6f 20 74 68 65 20 71 75 65 72 79 2e 0a 20   to the query.. 
14410 20 2a 2f 0a 20 20 70 2d 3e 70 4f 72 64 65 72 42   */.  p->pOrderB
14420 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20  y = pOrderBy;.  
14430 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79  pPrior->pOrderBy
14440 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
14450 73 74 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62  stDup(pParse->db
14460 2c 20 70 4f 72 64 65 72 42 79 2c 20 30 29 3b 0a  , pOrderBy, 0);.
14470 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61  .  /* Allocate a
14480 20 72 61 6e 67 65 20 6f 66 20 74 65 6d 70 6f 72   range of tempor
14490 61 72 79 20 72 65 67 69 73 74 65 72 73 20 61 6e  ary registers an
144a0 64 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 6e 65  d the KeyInfo ne
144b0 65 64 65 64 0a 20 20 2a 2a 20 66 6f 72 20 74 68  eded.  ** for th
144c0 65 20 6c 6f 67 69 63 20 74 68 61 74 20 72 65 6d  e logic that rem
144d0 6f 76 65 73 20 64 75 70 6c 69 63 61 74 65 20 72  oves duplicate r
144e0 65 73 75 6c 74 20 72 6f 77 73 20 77 68 65 6e 20  esult rows when 
144f0 74 68 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74 6f  the.  ** operato
14500 72 20 69 73 20 55 4e 49 4f 4e 2c 20 45 58 43 45  r is UNION, EXCE
14510 50 54 2c 20 6f 72 20 49 4e 54 45 52 53 45 43 54  PT, or INTERSECT
14520 20 28 62 75 74 20 6e 6f 74 20 55 4e 49 4f 4e 20   (but not UNION 
14530 41 4c 4c 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ALL)..  */.  if(
14540 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20   op==TK_ALL ){. 
14550 20 20 20 72 65 67 50 72 65 76 20 3d 20 30 3b 0a     regPrev = 0;.
14560 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
14570 20 6e 45 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69   nExpr = p->pELi
14580 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 61  st->nExpr;.    a
14590 73 73 65 72 74 28 20 6e 4f 72 64 65 72 42 79 3e  ssert( nOrderBy>
145a0 3d 6e 45 78 70 72 20 7c 7c 20 64 62 2d 3e 6d 61  =nExpr || db->ma
145b0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
145c0 20 20 72 65 67 50 72 65 76 20 3d 20 70 50 61 72    regPrev = pPar
145d0 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20  se->nMem+1;.    
145e0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20  pParse->nMem += 
145f0 6e 45 78 70 72 2b 31 3b 0a 20 20 20 20 73 71 6c  nExpr+1;.    sql
14600 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
14610 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
14620 20 72 65 67 50 72 65 76 29 3b 0a 20 20 20 20 70   regPrev);.    p
14630 4b 65 79 44 75 70 20 3d 20 73 71 6c 69 74 65 33  KeyDup = sqlite3
14640 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c  KeyInfoAlloc(db,
14650 20 6e 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28   nExpr);.    if(
14660 20 70 4b 65 79 44 75 70 20 29 7b 0a 20 20 20 20   pKeyDup ){.    
14670 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78    for(i=0; i<nEx
14680 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
14690 20 20 70 4b 65 79 44 75 70 2d 3e 61 43 6f 6c 6c    pKeyDup->aColl
146a0 5b 69 5d 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63  [i] = multiSelec
146b0 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  tCollSeq(pParse,
146c0 20 70 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20   p, i);.        
146d0 70 4b 65 79 44 75 70 2d 3e 61 53 6f 72 74 4f 72  pKeyDup->aSortOr
146e0 64 65 72 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20  der[i] = 0;.    
146f0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 0a    }.    }.  }. .
14700 20 20 2f 2a 20 53 65 70 61 72 61 74 65 20 74 68    /* Separate th
14710 65 20 6c 65 66 74 20 61 6e 64 20 74 68 65 20 72  e left and the r
14720 69 67 68 74 20 71 75 65 72 79 20 66 72 6f 6d 20  ight query from 
14730 6f 6e 65 20 61 6e 6f 74 68 65 72 0a 20 20 2a 2f  one another.  */
14740 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30  .  p->pPrior = 0
14750 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c  ;.  sqlite3Resol
14760 76 65 4f 72 64 65 72 47 72 6f 75 70 42 79 28 70  veOrderGroupBy(p
14770 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 4f 72  Parse, p, p->pOr
14780 64 65 72 42 79 2c 20 22 4f 52 44 45 52 22 29 3b  derBy, "ORDER");
14790 0a 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70  .  if( pPrior->p
147a0 50 72 69 6f 72 3d 3d 30 20 29 7b 0a 20 20 20 20  Prior==0 ){.    
147b0 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 4f 72  sqlite3ResolveOr
147c0 64 65 72 47 72 6f 75 70 42 79 28 70 50 61 72 73  derGroupBy(pPars
147d0 65 2c 20 70 50 72 69 6f 72 2c 20 70 50 72 69 6f  e, pPrior, pPrio
147e0 72 2d 3e 70 4f 72 64 65 72 42 79 2c 20 22 4f 52  r->pOrderBy, "OR
147f0 44 45 52 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  DER");.  }..  /*
14800 20 43 6f 6d 70 75 74 65 20 74 68 65 20 6c 69 6d   Compute the lim
14810 69 74 20 72 65 67 69 73 74 65 72 73 20 2a 2f 0a  it registers */.
14820 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65    computeLimitRe
14830 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c 20  gisters(pParse, 
14840 70 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20  p, labelEnd);.  
14850 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 26 26  if( p->iLimit &&
14860 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20   op==TK_ALL ){. 
14870 20 20 20 72 65 67 4c 69 6d 69 74 41 20 3d 20 2b     regLimitA = +
14880 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
14890 20 20 20 72 65 67 4c 69 6d 69 74 42 20 3d 20 2b     regLimitB = +
148a0 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
148b0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
148c0 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c  dOp2(v, OP_Copy,
148d0 20 70 2d 3e 69 4f 66 66 73 65 74 20 3f 20 70 2d   p->iOffset ? p-
148e0 3e 69 4f 66 66 73 65 74 2b 31 20 3a 20 70 2d 3e  >iOffset+1 : p->
148f0 69 4c 69 6d 69 74 2c 0a 20 20 20 20 20 20 20 20  iLimit,.        
14900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14910 20 20 20 20 20 20 20 20 20 20 72 65 67 4c 69 6d            regLim
14920 69 74 41 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  itA);.    sqlite
14930 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
14940 50 5f 43 6f 70 79 2c 20 72 65 67 4c 69 6d 69 74  P_Copy, regLimit
14950 41 2c 20 72 65 67 4c 69 6d 69 74 42 29 3b 0a 20  A, regLimitB);. 
14960 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 67 4c   }else{.    regL
14970 69 6d 69 74 41 20 3d 20 72 65 67 4c 69 6d 69 74  imitA = regLimit
14980 42 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c  B = 0;.  }.  sql
14990 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
149a0 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20  b, p->pLimit);. 
149b0 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a   p->pLimit = 0;.
149c0 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
149d0 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 66 66 73  ete(db, p->pOffs
149e0 65 74 29 3b 0a 20 20 70 2d 3e 70 4f 66 66 73 65  et);.  p->pOffse
149f0 74 20 3d 20 30 3b 0a 0a 20 20 72 65 67 41 64 64  t = 0;..  regAdd
14a00 72 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  rA = ++pParse->n
14a10 4d 65 6d 3b 0a 20 20 72 65 67 45 6f 66 41 20 3d  Mem;.  regEofA =
14a20 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
14a30 0a 20 20 72 65 67 41 64 64 72 42 20 3d 20 2b 2b  .  regAddrB = ++
14a40 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
14a50 72 65 67 45 6f 66 42 20 3d 20 2b 2b 70 50 61 72  regEofB = ++pPar
14a60 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 4f  se->nMem;.  regO
14a70 75 74 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  utA = ++pParse->
14a80 6e 4d 65 6d 3b 0a 20 20 72 65 67 4f 75 74 42 20  nMem;.  regOutB 
14a90 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
14aa0 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ;.  sqlite3Selec
14ab0 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 41  tDestInit(&destA
14ac0 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c  , SRT_Coroutine,
14ad0 20 72 65 67 41 64 64 72 41 29 3b 0a 20 20 73 71   regAddrA);.  sq
14ae0 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49  lite3SelectDestI
14af0 6e 69 74 28 26 64 65 73 74 42 2c 20 53 52 54 5f  nit(&destB, SRT_
14b00 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64  Coroutine, regAd
14b10 64 72 42 29 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70  drB);..  /* Jump
14b20 20 70 61 73 74 20 74 68 65 20 76 61 72 69 6f 75   past the variou
14b30 73 20 73 75 62 72 6f 75 74 69 6e 65 73 20 61 6e  s subroutines an
14b40 64 20 63 6f 72 6f 75 74 69 6e 65 73 20 74 6f 20  d coroutines to 
14b50 74 68 65 20 6d 61 69 6e 0a 20 20 2a 2a 20 6d 65  the main.  ** me
14b60 72 67 65 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20 20  rge loop.  */.  
14b70 6a 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  j1 = sqlite3Vdbe
14b80 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74  AddOp0(v, OP_Got
14b90 6f 29 3b 0a 20 20 61 64 64 72 53 65 6c 65 63 74  o);.  addrSelect
14ba0 41 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  A = sqlite3VdbeC
14bb0 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 0a  urrentAddr(v);..
14bc0 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61  .  /* Generate a
14bd0 20 63 6f 72 6f 75 74 69 6e 65 20 74 6f 20 65 76   coroutine to ev
14be0 61 6c 75 61 74 65 20 74 68 65 20 53 45 4c 45 43  aluate the SELEC
14bf0 54 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 74  T statement to t
14c00 68 65 0a 20 20 2a 2a 20 6c 65 66 74 20 6f 66 20  he.  ** left of 
14c10 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 6f 70 65  the compound ope
14c20 72 61 74 6f 72 20 2d 20 74 68 65 20 22 41 22 20  rator - the "A" 
14c30 73 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 56  select..  */.  V
14c40 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28  dbeNoopComment((
14c50 76 2c 20 22 42 65 67 69 6e 20 63 6f 72 6f 75 74  v, "Begin corout
14c60 69 6e 65 20 66 6f 72 20 6c 65 66 74 20 53 45 4c  ine for left SEL
14c70 45 43 54 22 29 29 3b 0a 20 20 70 50 72 69 6f 72  ECT"));.  pPrior
14c80 2d 3e 69 4c 69 6d 69 74 20 3d 20 72 65 67 4c 69  ->iLimit = regLi
14c90 6d 69 74 41 3b 0a 20 20 65 78 70 6c 61 69 6e 53  mitA;.  explainS
14ca0 65 74 49 6e 74 65 67 65 72 28 69 53 75 62 31 2c  etInteger(iSub1,
14cb0 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65   pParse->iNextSe
14cc0 6c 65 63 74 49 64 29 3b 0a 20 20 73 71 6c 69 74  lectId);.  sqlit
14cd0 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
14ce0 20 70 50 72 69 6f 72 2c 20 26 64 65 73 74 41 29   pPrior, &destA)
14cf0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
14d00 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
14d10 67 65 72 2c 20 31 2c 20 72 65 67 45 6f 66 41 29  ger, 1, regEofA)
14d20 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
14d30 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c  ddOp1(v, OP_Yiel
14d40 64 2c 20 72 65 67 41 64 64 72 41 29 3b 0a 20 20  d, regAddrA);.  
14d50 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28  VdbeNoopComment(
14d60 28 76 2c 20 22 45 6e 64 20 63 6f 72 6f 75 74 69  (v, "End corouti
14d70 6e 65 20 66 6f 72 20 6c 65 66 74 20 53 45 4c 45  ne for left SELE
14d80 43 54 22 29 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e  CT"));..  /* Gen
14d90 65 72 61 74 65 20 61 20 63 6f 72 6f 75 74 69 6e  erate a coroutin
14da0 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68  e to evaluate th
14db0 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
14dc0 6e 74 20 6f 6e 20 0a 20 20 2a 2a 20 74 68 65 20  nt on .  ** the 
14dd0 72 69 67 68 74 20 2d 20 74 68 65 20 22 42 22 20  right - the "B" 
14de0 73 65 6c 65 63 74 0a 20 20 2a 2f 0a 20 20 61 64  select.  */.  ad
14df0 64 72 53 65 6c 65 63 74 42 20 3d 20 73 71 6c 69  drSelectB = sqli
14e00 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
14e10 64 72 28 76 29 3b 0a 20 20 56 64 62 65 4e 6f 6f  dr(v);.  VdbeNoo
14e20 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 42 65  pComment((v, "Be
14e30 67 69 6e 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f  gin coroutine fo
14e40 72 20 72 69 67 68 74 20 53 45 4c 45 43 54 22 29  r right SELECT")
14e50 29 3b 0a 20 20 73 61 76 65 64 4c 69 6d 69 74 20  );.  savedLimit 
14e60 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 73  = p->iLimit;.  s
14e70 61 76 65 64 4f 66 66 73 65 74 20 3d 20 70 2d 3e  avedOffset = p->
14e80 69 4f 66 66 73 65 74 3b 0a 20 20 70 2d 3e 69 4c  iOffset;.  p->iL
14e90 69 6d 69 74 20 3d 20 72 65 67 4c 69 6d 69 74 42  imit = regLimitB
14ea0 3b 0a 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d  ;.  p->iOffset =
14eb0 20 30 3b 20 20 0a 20 20 65 78 70 6c 61 69 6e 53   0;  .  explainS
14ec0 65 74 49 6e 74 65 67 65 72 28 69 53 75 62 32 2c  etInteger(iSub2,
14ed0 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65   pParse->iNextSe
14ee0 6c 65 63 74 49 64 29 3b 0a 20 20 73 71 6c 69 74  lectId);.  sqlit
14ef0 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
14f00 20 70 2c 20 26 64 65 73 74 42 29 3b 0a 20 20 70   p, &destB);.  p
14f10 2d 3e 69 4c 69 6d 69 74 20 3d 20 73 61 76 65 64  ->iLimit = saved
14f20 4c 69 6d 69 74 3b 0a 20 20 70 2d 3e 69 4f 66 66  Limit;.  p->iOff
14f30 73 65 74 20 3d 20 73 61 76 65 64 4f 66 66 73 65  set = savedOffse
14f40 74 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  t;.  sqlite3Vdbe
14f50 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
14f60 65 67 65 72 2c 20 31 2c 20 72 65 67 45 6f 66 42  eger, 1, regEofB
14f70 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
14f80 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65  AddOp1(v, OP_Yie
14f90 6c 64 2c 20 72 65 67 41 64 64 72 42 29 3b 0a 20  ld, regAddrB);. 
14fa0 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74   VdbeNoopComment
14fb0 28 28 76 2c 20 22 45 6e 64 20 63 6f 72 6f 75 74  ((v, "End corout
14fc0 69 6e 65 20 66 6f 72 20 72 69 67 68 74 20 53 45  ine for right SE
14fd0 4c 45 43 54 22 29 29 3b 0a 0a 20 20 2f 2a 20 47  LECT"));..  /* G
14fe0 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75  enerate a subrou
14ff0 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74  tine that output
15000 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f  s the current ro
15010 77 20 6f 66 20 74 68 65 20 41 0a 20 20 2a 2a 20  w of the A.  ** 
15020 73 65 6c 65 63 74 20 61 73 20 74 68 65 20 6e 65  select as the ne
15030 78 74 20 6f 75 74 70 75 74 20 72 6f 77 20 6f 66  xt output row of
15040 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65   the compound se
15050 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 56 64 62  lect..  */.  Vdb
15060 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c  eNoopComment((v,
15070 20 22 4f 75 74 70 75 74 20 72 6f 75 74 69 6e 65   "Output routine
15080 20 66 6f 72 20 41 22 29 29 3b 0a 20 20 61 64 64   for A"));.  add
15090 72 4f 75 74 41 20 3d 20 67 65 6e 65 72 61 74 65  rOutA = generate
150a0 4f 75 74 70 75 74 53 75 62 72 6f 75 74 69 6e 65  OutputSubroutine
150b0 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20  (pParse,.       
150c0 20 20 20 20 20 20 20 20 20 20 70 2c 20 26 64 65            p, &de
150d0 73 74 41 2c 20 70 44 65 73 74 2c 20 72 65 67 4f  stA, pDest, regO
150e0 75 74 41 2c 0a 20 20 20 20 20 20 20 20 20 20 20  utA,.           
150f0 20 20 20 20 20 20 72 65 67 50 72 65 76 2c 20 70        regPrev, p
15100 4b 65 79 44 75 70 2c 20 50 34 5f 4b 45 59 49 4e  KeyDup, P4_KEYIN
15110 46 4f 5f 48 41 4e 44 4f 46 46 2c 20 6c 61 62 65  FO_HANDOFF, labe
15120 6c 45 6e 64 29 3b 0a 20 20 0a 20 20 2f 2a 20 47  lEnd);.  .  /* G
15130 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75  enerate a subrou
15140 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74  tine that output
15150 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f  s the current ro
15160 77 20 6f 66 20 74 68 65 20 42 0a 20 20 2a 2a 20  w of the B.  ** 
15170 73 65 6c 65 63 74 20 61 73 20 74 68 65 20 6e 65  select as the ne
15180 78 74 20 6f 75 74 70 75 74 20 72 6f 77 20 6f 66  xt output row of
15190 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65   the compound se
151a0 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  lect..  */.  if(
151b0 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 6f   op==TK_ALL || o
151c0 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20  p==TK_UNION ){. 
151d0 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65     VdbeNoopComme
151e0 6e 74 28 28 76 2c 20 22 4f 75 74 70 75 74 20 72  nt((v, "Output r
151f0 6f 75 74 69 6e 65 20 66 6f 72 20 42 22 29 29 3b  outine for B"));
15200 0a 20 20 20 20 61 64 64 72 4f 75 74 42 20 3d 20  .    addrOutB = 
15210 67 65 6e 65 72 61 74 65 4f 75 74 70 75 74 53 75  generateOutputSu
15220 62 72 6f 75 74 69 6e 65 28 70 50 61 72 73 65 2c  broutine(pParse,
15230 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
15240 20 20 70 2c 20 26 64 65 73 74 42 2c 20 70 44 65    p, &destB, pDe
15250 73 74 2c 20 72 65 67 4f 75 74 42 2c 0a 20 20 20  st, regOutB,.   
15260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
15270 67 50 72 65 76 2c 20 70 4b 65 79 44 75 70 2c 20  gPrev, pKeyDup, 
15280 50 34 5f 4b 45 59 49 4e 46 4f 5f 53 54 41 54 49  P4_KEYINFO_STATI
15290 43 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20  C, labelEnd);.  
152a0 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  }..  /* Generate
152b0 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 6f   a subroutine to
152c0 20 72 75 6e 20 77 68 65 6e 20 74 68 65 20 72 65   run when the re
152d0 73 75 6c 74 73 20 66 72 6f 6d 20 73 65 6c 65 63  sults from selec
152e0 74 20 41 0a 20 20 2a 2a 20 61 72 65 20 65 78 68  t A.  ** are exh
152f0 61 75 73 74 65 64 20 61 6e 64 20 6f 6e 6c 79 20  austed and only 
15300 64 61 74 61 20 69 6e 20 73 65 6c 65 63 74 20 42  data in select B
15310 20 72 65 6d 61 69 6e 73 2e 0a 20 20 2a 2f 0a 20   remains..  */. 
15320 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74   VdbeNoopComment
15330 28 28 76 2c 20 22 65 6f 66 2d 41 20 73 75 62 72  ((v, "eof-A subr
15340 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 69 66 28  outine"));.  if(
15350 20 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20 7c   op==TK_EXCEPT |
15360 7c 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45  | op==TK_INTERSE
15370 43 54 20 29 7b 0a 20 20 20 20 61 64 64 72 45 6f  CT ){.    addrEo
15380 66 41 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  fA = sqlite3Vdbe
15390 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
153a0 6f 2c 20 30 2c 20 6c 61 62 65 6c 45 6e 64 29 3b  o, 0, labelEnd);
153b0 0a 20 20 7d 65 6c 73 65 7b 20 20 0a 20 20 20 20  .  }else{  .    
153c0 61 64 64 72 45 6f 66 41 20 3d 20 73 71 6c 69 74  addrEofA = sqlit
153d0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
153e0 4f 50 5f 49 66 2c 20 72 65 67 45 6f 66 42 2c 20  OP_If, regEofB, 
153f0 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 20 20 73  labelEnd);.    s
15400 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
15410 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65  (v, OP_Gosub, re
15420 67 4f 75 74 42 2c 20 61 64 64 72 4f 75 74 42 29  gOutB, addrOutB)
15430 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
15440 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69  eAddOp1(v, OP_Yi
15450 65 6c 64 2c 20 72 65 67 41 64 64 72 42 29 3b 0a  eld, regAddrB);.
15460 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
15470 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
15480 2c 20 30 2c 20 61 64 64 72 45 6f 66 41 29 3b 0a  , 0, addrEofA);.
15490 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f      p->nSelectRo
154a0 77 20 2b 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65  w += pPrior->nSe
154b0 6c 65 63 74 52 6f 77 3b 0a 20 20 7d 0a 0a 20 20  lectRow;.  }..  
154c0 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75  /* Generate a su
154d0 62 72 6f 75 74 69 6e 65 20 74 6f 20 72 75 6e 20  broutine to run 
154e0 77 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 73  when the results
154f0 20 66 72 6f 6d 20 73 65 6c 65 63 74 20 42 0a 20   from select B. 
15500 20 2a 2a 20 61 72 65 20 65 78 68 61 75 73 74 65   ** are exhauste
15510 64 20 61 6e 64 20 6f 6e 6c 79 20 64 61 74 61 20  d and only data 
15520 69 6e 20 73 65 6c 65 63 74 20 41 20 72 65 6d 61  in select A rema
15530 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ins..  */.  if( 
15540 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54  op==TK_INTERSECT
15550 20 29 7b 0a 20 20 20 20 61 64 64 72 45 6f 66 42   ){.    addrEofB
15560 20 3d 20 61 64 64 72 45 6f 66 41 3b 0a 20 20 20   = addrEofA;.   
15570 20 69 66 28 20 70 2d 3e 6e 53 65 6c 65 63 74 52   if( p->nSelectR
15580 6f 77 20 3e 20 70 50 72 69 6f 72 2d 3e 6e 53 65  ow > pPrior->nSe
15590 6c 65 63 74 52 6f 77 20 29 20 70 2d 3e 6e 53 65  lectRow ) p->nSe
155a0 6c 65 63 74 52 6f 77 20 3d 20 70 50 72 69 6f 72  lectRow = pPrior
155b0 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20  ->nSelectRow;.  
155c0 7d 65 6c 73 65 7b 20 20 0a 20 20 20 20 56 64 62  }else{  .    Vdb
155d0 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c  eNoopComment((v,
155e0 20 22 65 6f 66 2d 42 20 73 75 62 72 6f 75 74 69   "eof-B subrouti
155f0 6e 65 22 29 29 3b 0a 20 20 20 20 61 64 64 72 45  ne"));.    addrE
15600 6f 66 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ofB = sqlite3Vdb
15610 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66  eAddOp2(v, OP_If
15620 2c 20 72 65 67 45 6f 66 41 2c 20 6c 61 62 65 6c  , regEofA, label
15630 45 6e 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  End);.    sqlite
15640 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
15650 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 41  P_Gosub, regOutA
15660 2c 20 61 64 64 72 4f 75 74 41 29 3b 0a 20 20 20  , addrOutA);.   
15670 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15680 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p1(v, OP_Yield, 
15690 72 65 67 41 64 64 72 41 29 3b 0a 20 20 20 20 73  regAddrA);.    s
156a0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
156b0 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
156c0 61 64 64 72 45 6f 66 42 29 3b 0a 20 20 7d 0a 0a  addrEofB);.  }..
156d0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
156e0 64 65 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65  de to handle the
156f0 20 63 61 73 65 20 6f 66 20 41 3c 42 0a 20 20 2a   case of A<B.  *
15700 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d  /.  VdbeNoopComm
15710 65 6e 74 28 28 76 2c 20 22 41 2d 6c 74 2d 42 20  ent((v, "A-lt-B 
15720 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20  subroutine"));. 
15730 20 61 64 64 72 41 6c 74 42 20 3d 20 73 71 6c 69   addrAltB = sqli
15740 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
15750 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75   OP_Gosub, regOu
15760 74 41 2c 20 61 64 64 72 4f 75 74 41 29 3b 0a 20  tA, addrOutA);. 
15770 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15780 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p1(v, OP_Yield, 
15790 72 65 67 41 64 64 72 41 29 3b 0a 20 20 73 71 6c  regAddrA);.  sql
157a0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
157b0 2c 20 4f 50 5f 49 66 2c 20 72 65 67 45 6f 66 41  , OP_If, regEofA
157c0 2c 20 61 64 64 72 45 6f 66 41 29 3b 0a 20 20 73  , addrEofA);.  s
157d0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
157e0 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
157f0 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 0a 20 20 2f  labelCmpr);..  /
15800 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
15810 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 63 61  to handle the ca
15820 73 65 20 6f 66 20 41 3d 3d 42 0a 20 20 2a 2f 0a  se of A==B.  */.
15830 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c    if( op==TK_ALL
15840 20 29 7b 0a 20 20 20 20 61 64 64 72 41 65 71 42   ){.    addrAeqB
15850 20 3d 20 61 64 64 72 41 6c 74 42 3b 0a 20 20 7d   = addrAltB;.  }
15860 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  else if( op==TK_
15870 49 4e 54 45 52 53 45 43 54 20 29 7b 0a 20 20 20  INTERSECT ){.   
15880 20 61 64 64 72 41 65 71 42 20 3d 20 61 64 64 72   addrAeqB = addr
15890 41 6c 74 42 3b 0a 20 20 20 20 61 64 64 72 41 6c  AltB;.    addrAl
158a0 74 42 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  tB++;.  }else{. 
158b0 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65     VdbeNoopComme
158c0 6e 74 28 28 76 2c 20 22 41 2d 65 71 2d 42 20 73  nt((v, "A-eq-B s
158d0 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20  ubroutine"));.  
158e0 20 20 61 64 64 72 41 65 71 42 20 3d 0a 20 20 20    addrAeqB =.   
158f0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15900 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p1(v, OP_Yield, 
15910 72 65 67 41 64 64 72 41 29 3b 0a 20 20 20 20 73  regAddrA);.    s
15920 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
15930 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 45 6f  (v, OP_If, regEo
15940 66 41 2c 20 61 64 64 72 45 6f 66 41 29 3b 0a 20  fA, addrEofA);. 
15950 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
15960 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
15970 20 30 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a   0, labelCmpr);.
15980 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61    }..  /* Genera
15990 74 65 20 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c  te code to handl
159a0 65 20 74 68 65 20 63 61 73 65 20 6f 66 20 41 3e  e the case of A>
159b0 42 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f  B.  */.  VdbeNoo
159c0 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 41 2d  pComment((v, "A-
159d0 67 74 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 22  gt-B subroutine"
159e0 29 29 3b 0a 20 20 61 64 64 72 41 67 74 42 20 3d  ));.  addrAgtB =
159f0 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
15a00 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 69 66  entAddr(v);.  if
15a10 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20  ( op==TK_ALL || 
15a20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a  op==TK_UNION ){.
15a30 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
15a40 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75  ddOp2(v, OP_Gosu
15a50 62 2c 20 72 65 67 4f 75 74 42 2c 20 61 64 64 72  b, regOutB, addr
15a60 4f 75 74 42 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  OutB);.  }.  sql
15a70 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
15a80 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41  , OP_Yield, regA
15a90 64 64 72 42 29 3b 0a 20 20 73 71 6c 69 74 65 33  ddrB);.  sqlite3
15aa0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
15ab0 5f 49 66 2c 20 72 65 67 45 6f 66 42 2c 20 61 64  _If, regEofB, ad
15ac0 64 72 45 6f 66 42 29 3b 0a 20 20 73 71 6c 69 74  drEofB);.  sqlit
15ad0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
15ae0 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c 61 62 65  OP_Goto, 0, labe
15af0 6c 43 6d 70 72 29 3b 0a 0a 20 20 2f 2a 20 54 68  lCmpr);..  /* Th
15b00 69 73 20 63 6f 64 65 20 72 75 6e 73 20 6f 6e 63  is code runs onc
15b10 65 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20  e to initialize 
15b20 65 76 65 72 79 74 68 69 6e 67 2e 0a 20 20 2a 2f  everything..  */
15b30 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75  .  sqlite3VdbeJu
15b40 6d 70 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a 20  mpHere(v, j1);. 
15b50 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15b60 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
15b70 2c 20 30 2c 20 72 65 67 45 6f 66 41 29 3b 0a 20  , 0, regEofA);. 
15b80 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15b90 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
15ba0 2c 20 30 2c 20 72 65 67 45 6f 66 42 29 3b 0a 20  , 0, regEofB);. 
15bb0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15bc0 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
15bd0 72 65 67 41 64 64 72 41 2c 20 61 64 64 72 53 65  regAddrA, addrSe
15be0 6c 65 63 74 41 29 3b 0a 20 20 73 71 6c 69 74 65  lectA);.  sqlite
15bf0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
15c00 50 5f 47 6f 73 75 62 2c 20 72 65 67 41 64 64 72  P_Gosub, regAddr
15c10 42 2c 20 61 64 64 72 53 65 6c 65 63 74 42 29 3b  B, addrSelectB);
15c20 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
15c30 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20 72  dOp2(v, OP_If, r
15c40 65 67 45 6f 66 41 2c 20 61 64 64 72 45 6f 66 41  egEofA, addrEofA
15c50 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
15c60 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c  AddOp2(v, OP_If,
15c70 20 72 65 67 45 6f 66 42 2c 20 61 64 64 72 45 6f   regEofB, addrEo
15c80 66 42 29 3b 0a 0a 20 20 2f 2a 20 49 6d 70 6c 65  fB);..  /* Imple
15c90 6d 65 6e 74 20 74 68 65 20 6d 61 69 6e 20 6d 65  ment the main me
15ca0 72 67 65 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20 20  rge loop.  */.  
15cb0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
15cc0 76 65 4c 61 62 65 6c 28 76 2c 20 6c 61 62 65 6c  veLabel(v, label
15cd0 43 6d 70 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  Cmpr);.  sqlite3
15ce0 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
15cf0 5f 50 65 72 6d 75 74 61 74 69 6f 6e 2c 20 30 2c  _Permutation, 0,
15d00 20 30 2c 20 30 2c 20 28 63 68 61 72 2a 29 61 50   0, 0, (char*)aP
15d10 65 72 6d 75 74 65 2c 20 50 34 5f 49 4e 54 41 52  ermute, P4_INTAR
15d20 52 41 59 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  RAY);.  sqlite3V
15d30 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
15d40 43 6f 6d 70 61 72 65 2c 20 64 65 73 74 41 2e 69  Compare, destA.i
15d50 53 64 73 74 2c 20 64 65 73 74 42 2e 69 53 64 73  Sdst, destB.iSds
15d60 74 2c 20 6e 4f 72 64 65 72 42 79 2c 0a 20 20 20  t, nOrderBy,.   
15d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d80 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65        (char*)pKe
15d90 79 4d 65 72 67 65 2c 20 50 34 5f 4b 45 59 49 4e  yMerge, P4_KEYIN
15da0 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 73  FO_HANDOFF);.  s
15db0 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
15dc0 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 50 45 52  P5(v, OPFLAG_PER
15dd0 4d 55 54 45 29 3b 0a 20 20 73 71 6c 69 74 65 33  MUTE);.  sqlite3
15de0 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
15df0 5f 4a 75 6d 70 2c 20 61 64 64 72 41 6c 74 42 2c  _Jump, addrAltB,
15e00 20 61 64 64 72 41 65 71 42 2c 20 61 64 64 72 41   addrAeqB, addrA
15e10 67 74 42 29 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70  gtB);..  /* Jump
15e20 20 74 6f 20 74 68 65 20 74 68 69 73 20 70 6f 69   to the this poi
15e30 6e 74 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 74  nt in order to t
15e40 65 72 6d 69 6e 61 74 65 20 74 68 65 20 71 75 65  erminate the que
15e50 72 79 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ry..  */.  sqlit
15e60 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
15e70 65 6c 28 76 2c 20 6c 61 62 65 6c 45 6e 64 29 3b  el(v, labelEnd);
15e80 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6e  ..  /* Set the n
15e90 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20  umber of output 
15ea0 63 6f 6c 75 6d 6e 73 0a 20 20 2a 2f 0a 20 20 69  columns.  */.  i
15eb0 66 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d  f( pDest->eDest=
15ec0 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20  =SRT_Output ){. 
15ed0 20 20 20 53 65 6c 65 63 74 20 2a 70 46 69 72 73     Select *pFirs
15ee0 74 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20  t = pPrior;.    
15ef0 77 68 69 6c 65 28 20 70 46 69 72 73 74 2d 3e 70  while( pFirst->p
15f00 50 72 69 6f 72 20 29 20 70 46 69 72 73 74 20 3d  Prior ) pFirst =
15f10 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 3b   pFirst->pPrior;
15f20 0a 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c  .    generateCol
15f30 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c  umnNames(pParse,
15f40 20 30 2c 20 70 46 69 72 73 74 2d 3e 70 45 4c 69   0, pFirst->pELi
15f50 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52  st);.  }..  /* R
15f60 65 61 73 73 65 6d 62 6c 79 20 74 68 65 20 63 6f  eassembly the co
15f70 6d 70 6f 75 6e 64 20 71 75 65 72 79 20 73 6f 20  mpound query so 
15f80 74 68 61 74 20 69 74 20 77 69 6c 6c 20 62 65 20  that it will be 
15f90 66 72 65 65 64 20 63 6f 72 72 65 63 74 6c 79 0a  freed correctly.
15fa0 20 20 2a 2a 20 62 79 20 74 68 65 20 63 61 6c 6c    ** by the call
15fb0 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  ing function */.
15fc0 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20    if( p->pPrior 
15fd0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  ){.    sqlite3Se
15fe0 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70  lectDelete(db, p
15ff0 2d 3e 70 50 72 69 6f 72 29 3b 0a 20 20 7d 0a 20  ->pPrior);.  }. 
16000 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72   p->pPrior = pPr
16010 69 6f 72 3b 0a 0a 20 20 2f 2a 2a 2a 20 54 42 44  ior;..  /*** TBD
16020 3a 20 20 49 6e 73 65 72 74 20 73 75 62 72 6f 75  :  Insert subrou
16030 74 69 6e 65 20 63 61 6c 6c 73 20 74 6f 20 63 6c  tine calls to cl
16040 6f 73 65 20 63 75 72 73 6f 72 73 20 6f 6e 20 69  ose cursors on i
16050 6e 63 6f 6d 70 6c 65 74 65 0a 20 20 2a 2a 2a 2a  ncomplete.  ****
16060 20 73 75 62 71 75 65 72 69 65 73 20 2a 2a 2a 2a   subqueries ****
16070 2f 0a 20 20 65 78 70 6c 61 69 6e 43 6f 6d 70 6f  /.  explainCompo
16080 73 69 74 65 28 70 50 61 72 73 65 2c 20 70 2d 3e  site(pParse, p->
16090 6f 70 2c 20 69 53 75 62 31 2c 20 69 53 75 62 32  op, iSub1, iSub2
160a0 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  , 0);.  return S
160b0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  QLITE_OK;.}.#end
160c0 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  if..#if !defined
160d0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42  (SQLITE_OMIT_SUB
160e0 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e  QUERY) || !defin
160f0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
16100 49 45 57 29 0a 2f 2a 20 46 6f 72 77 61 72 64 20  IEW)./* Forward 
16110 44 65 63 6c 61 72 61 74 69 6f 6e 73 20 2a 2f 0a  Declarations */.
16120 73 74 61 74 69 63 20 76 6f 69 64 20 73 75 62 73  static void subs
16130 74 45 78 70 72 4c 69 73 74 28 73 71 6c 69 74 65  tExprList(sqlite
16140 33 2a 2c 20 45 78 70 72 4c 69 73 74 2a 2c 20 69  3*, ExprList*, i
16150 6e 74 2c 20 45 78 70 72 4c 69 73 74 2a 29 3b 0a  nt, ExprList*);.
16160 73 74 61 74 69 63 20 76 6f 69 64 20 73 75 62 73  static void subs
16170 74 53 65 6c 65 63 74 28 73 71 6c 69 74 65 33 2a  tSelect(sqlite3*
16180 2c 20 53 65 6c 65 63 74 20 2a 2c 20 69 6e 74 2c  , Select *, int,
16190 20 45 78 70 72 4c 69 73 74 20 2a 29 3b 0a 0a 2f   ExprList *);../
161a0 2a 0a 2a 2a 20 53 63 61 6e 20 74 68 72 6f 75 67  *.** Scan throug
161b0 68 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  h the expression
161c0 20 70 45 78 70 72 2e 20 20 52 65 70 6c 61 63 65   pExpr.  Replace
161d0 20 65 76 65 72 79 20 72 65 66 65 72 65 6e 63 65   every reference
161e0 20 74 6f 0a 2a 2a 20 61 20 63 6f 6c 75 6d 6e 20   to.** a column 
161f0 69 6e 20 74 61 62 6c 65 20 6e 75 6d 62 65 72 20  in table number 
16200 69 54 61 62 6c 65 20 77 69 74 68 20 61 20 63 6f  iTable with a co
16210 70 79 20 6f 66 20 74 68 65 20 69 43 6f 6c 75 6d  py of the iColum
16220 6e 2d 74 68 0a 2a 2a 20 65 6e 74 72 79 20 69 6e  n-th.** entry in
16230 20 70 45 4c 69 73 74 2e 20 20 28 42 75 74 20 6c   pEList.  (But l
16240 65 61 76 65 20 72 65 66 65 72 65 6e 63 65 73 20  eave references 
16250 74 6f 20 74 68 65 20 52 4f 57 49 44 20 63 6f 6c  to the ROWID col
16260 75 6d 6e 20 0a 2a 2a 20 75 6e 63 68 61 6e 67 65  umn .** unchange
16270 64 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  d.).**.** This r
16280 6f 75 74 69 6e 65 20 69 73 20 70 61 72 74 20 6f  outine is part o
16290 66 20 74 68 65 20 66 6c 61 74 74 65 6e 69 6e 67  f the flattening
162a0 20 70 72 6f 63 65 64 75 72 65 2e 20 20 41 20 73   procedure.  A s
162b0 75 62 71 75 65 72 79 0a 2a 2a 20 77 68 6f 73 65  ubquery.** whose
162c0 20 72 65 73 75 6c 74 20 73 65 74 20 69 73 20 64   result set is d
162d0 65 66 69 6e 65 64 20 62 79 20 70 45 4c 69 73 74  efined by pEList
162e0 20 61 70 70 65 61 72 73 20 61 73 20 65 6e 74 72   appears as entr
162f0 79 20 69 6e 20 74 68 65 0a 2a 2a 20 46 52 4f 4d  y in the.** FROM
16300 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c   clause of a SEL
16310 45 43 54 20 73 75 63 68 20 74 68 61 74 20 74 68  ECT such that th
16320 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 61 73  e VDBE cursor as
16330 73 69 67 6e 65 64 20 74 6f 20 74 68 61 74 0a 2a  signed to that.*
16340 2a 20 46 4f 52 4d 20 63 6c 61 75 73 65 20 65 6e  * FORM clause en
16350 74 72 79 20 69 73 20 69 54 61 62 6c 65 2e 20 20  try is iTable.  
16360 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 6b  This routine mak
16370 65 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20  e the necessary 
16380 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 70  .** changes to p
16390 45 78 70 72 20 73 6f 20 74 68 61 74 20 69 74 20  Expr so that it 
163a0 72 65 66 65 72 73 20 64 69 72 65 63 74 6c 79 20  refers directly 
163b0 74 6f 20 74 68 65 20 73 6f 75 72 63 65 20 74 61  to the source ta
163c0 62 6c 65 0a 2a 2a 20 6f 66 20 74 68 65 20 73 75  ble.** of the su
163d0 62 71 75 65 72 79 20 72 61 74 68 65 72 20 74 68  bquery rather th
163e0 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20  e result set of 
163f0 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a 2a 2f  the subquery..*/
16400 0a 73 74 61 74 69 63 20 45 78 70 72 20 2a 73 75  .static Expr *su
16410 62 73 74 45 78 70 72 28 0a 20 20 73 71 6c 69 74  bstExpr(.  sqlit
16420 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 2f  e3 *db,        /
16430 2a 20 52 65 70 6f 72 74 20 6d 61 6c 6c 6f 63 20  * Report malloc 
16440 65 72 72 6f 72 73 20 74 6f 20 74 68 69 73 20 63  errors to this c
16450 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 45  onnection */.  E
16460 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20  xpr *pExpr,     
16470 20 20 20 2f 2a 20 45 78 70 72 20 69 6e 20 77 68     /* Expr in wh
16480 69 63 68 20 73 75 62 73 74 69 74 75 74 69 6f 6e  ich substitution
16490 20 6f 63 63 75 72 73 20 2a 2f 0a 20 20 69 6e 74   occurs */.  int
164a0 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20   iTable,        
164b0 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20   /* Table to be 
164c0 73 75 62 73 74 69 74 75 74 65 64 20 2a 2f 0a 20  substituted */. 
164d0 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
164e0 74 20 20 20 20 2f 2a 20 53 75 62 73 74 69 74 75  t    /* Substitu
164f0 74 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 2a  te expressions *
16500 2f 0a 29 7b 0a 20 20 69 66 28 20 70 45 78 70 72  /.){.  if( pExpr
16510 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
16520 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d    if( pExpr->op=
16530 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 45  =TK_COLUMN && pE
16540 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61  xpr->iTable==iTa
16550 62 6c 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ble ){.    if( p
16560 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20  Expr->iColumn<0 
16570 29 7b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  ){.      pExpr->
16580 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20  op = TK_NULL;.  
16590 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 45    }else{.      E
165a0 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 20 20 20  xpr *pNew;.     
165b0 20 61 73 73 65 72 74 28 20 70 45 4c 69 73 74 21   assert( pEList!
165c0 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 69 43 6f  =0 && pExpr->iCo
165d0 6c 75 6d 6e 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  lumn<pEList->nEx
165e0 70 72 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  pr );.      asse
165f0 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  rt( pExpr->pLeft
16600 3d 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 70 52  ==0 && pExpr->pR
16610 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ight==0 );.     
16620 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45   pNew = sqlite3E
16630 78 70 72 44 75 70 28 64 62 2c 20 70 45 4c 69 73  xprDup(db, pELis
16640 74 2d 3e 61 5b 70 45 78 70 72 2d 3e 69 43 6f 6c  t->a[pExpr->iCol
16650 75 6d 6e 5d 2e 70 45 78 70 72 2c 20 30 29 3b 0a  umn].pExpr, 0);.
16660 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
16670 72 44 65 6c 65 74 65 28 64 62 2c 20 70 45 78 70  rDelete(db, pExp
16680 72 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72 20  r);.      pExpr 
16690 3d 20 70 4e 65 77 3b 0a 20 20 20 20 7d 0a 20 20  = pNew;.    }.  
166a0 7d 65 6c 73 65 7b 0a 20 20 20 20 70 45 78 70 72  }else{.    pExpr
166b0 2d 3e 70 4c 65 66 74 20 3d 20 73 75 62 73 74 45  ->pLeft = substE
166c0 78 70 72 28 64 62 2c 20 70 45 78 70 72 2d 3e 70  xpr(db, pExpr->p
166d0 4c 65 66 74 2c 20 69 54 61 62 6c 65 2c 20 70 45  Left, iTable, pE
166e0 4c 69 73 74 29 3b 0a 20 20 20 20 70 45 78 70 72  List);.    pExpr
166f0 2d 3e 70 52 69 67 68 74 20 3d 20 73 75 62 73 74  ->pRight = subst
16700 45 78 70 72 28 64 62 2c 20 70 45 78 70 72 2d 3e  Expr(db, pExpr->
16710 70 52 69 67 68 74 2c 20 69 54 61 62 6c 65 2c 20  pRight, iTable, 
16720 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 69 66 28  pEList);.    if(
16730 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
16740 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  (pExpr, EP_xIsSe
16750 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20 73  lect) ){.      s
16760 75 62 73 74 53 65 6c 65 63 74 28 64 62 2c 20 70  ubstSelect(db, p
16770 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2c  Expr->x.pSelect,
16780 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
16790 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
167a0 20 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74     substExprList
167b0 28 64 62 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c  (db, pExpr->x.pL
167c0 69 73 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c  ist, iTable, pEL
167d0 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ist);.    }.  }.
167e0 20 20 72 65 74 75 72 6e 20 70 45 78 70 72 3b 0a    return pExpr;.
167f0 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75  }.static void su
16800 62 73 74 45 78 70 72 4c 69 73 74 28 0a 20 20 73  bstExprList(.  s
16810 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
16820 20 20 20 20 2f 2a 20 52 65 70 6f 72 74 20 6d 61      /* Report ma
16830 6c 6c 6f 63 20 65 72 72 6f 72 73 20 68 65 72 65  lloc errors here
16840 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
16850 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 4c 69  pList,     /* Li
16860 73 74 20 74 6f 20 73 63 61 6e 20 61 6e 64 20 69  st to scan and i
16870 6e 20 77 68 69 63 68 20 74 6f 20 6d 61 6b 65 20  n which to make 
16880 73 75 62 73 74 69 74 75 74 65 73 20 2a 2f 0a 20  substitutes */. 
16890 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20   int iTable,    
168a0 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74        /* Table t
168b0 6f 20 62 65 20 73 75 62 73 74 69 74 75 74 65 64  o be substituted
168c0 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
168d0 70 45 4c 69 73 74 20 20 20 20 20 2f 2a 20 53 75  pEList     /* Su
168e0 62 73 74 69 74 75 74 65 20 76 61 6c 75 65 73 20  bstitute values 
168f0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  */.){.  int i;. 
16900 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
16910 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d  return;.  for(i=
16920 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  0; i<pList->nExp
16930 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 4c 69  r; i++){.    pLi
16940 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 20 3d  st->a[i].pExpr =
16950 20 73 75 62 73 74 45 78 70 72 28 64 62 2c 20 70   substExpr(db, p
16960 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
16970 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
16980 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20  );.  }.}.static 
16990 76 6f 69 64 20 73 75 62 73 74 53 65 6c 65 63 74  void substSelect
169a0 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
169b0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 70 6f           /* Repo
169c0 72 74 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73  rt malloc errors
169d0 20 68 65 72 65 20 2a 2f 0a 20 20 53 65 6c 65 63   here */.  Selec
169e0 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
169f0 2f 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  /* SELECT statem
16a00 65 6e 74 20 69 6e 20 77 68 69 63 68 20 74 6f 20  ent in which to 
16a10 6d 61 6b 65 20 73 75 62 73 74 69 74 75 74 69 6f  make substitutio
16a20 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  ns */.  int iTab
16a30 6c 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  le,          /* 
16a40 54 61 62 6c 65 20 74 6f 20 62 65 20 72 65 70 6c  Table to be repl
16a50 61 63 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69  aced */.  ExprLi
16a60 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20 20 2f  st *pEList     /
16a70 2a 20 53 75 62 73 74 69 74 75 74 65 20 76 61 6c  * Substitute val
16a80 75 65 73 20 2a 2f 0a 29 7b 0a 20 20 53 72 63 4c  ues */.){.  SrcL
16a90 69 73 74 20 2a 70 53 72 63 3b 0a 20 20 73 74 72  ist *pSrc;.  str
16aa0 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
16ab0 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69   *pItem;.  int i
16ac0 3b 0a 20 20 69 66 28 20 21 70 20 29 20 72 65 74  ;.  if( !p ) ret
16ad0 75 72 6e 3b 0a 20 20 73 75 62 73 74 45 78 70 72  urn;.  substExpr
16ae0 4c 69 73 74 28 64 62 2c 20 70 2d 3e 70 45 4c 69  List(db, p->pELi
16af0 73 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69  st, iTable, pELi
16b00 73 74 29 3b 0a 20 20 73 75 62 73 74 45 78 70 72  st);.  substExpr
16b10 4c 69 73 74 28 64 62 2c 20 70 2d 3e 70 47 72 6f  List(db, p->pGro
16b20 75 70 42 79 2c 20 69 54 61 62 6c 65 2c 20 70 45  upBy, iTable, pE
16b30 4c 69 73 74 29 3b 0a 20 20 73 75 62 73 74 45 78  List);.  substEx
16b40 70 72 4c 69 73 74 28 64 62 2c 20 70 2d 3e 70 4f  prList(db, p->pO
16b50 72 64 65 72 42 79 2c 20 69 54 61 62 6c 65 2c 20  rderBy, iTable, 
16b60 70 45 4c 69 73 74 29 3b 0a 20 20 70 2d 3e 70 48  pEList);.  p->pH
16b70 61 76 69 6e 67 20 3d 20 73 75 62 73 74 45 78 70  aving = substExp
16b80 72 28 64 62 2c 20 70 2d 3e 70 48 61 76 69 6e 67  r(db, p->pHaving
16b90 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
16ba0 29 3b 0a 20 20 70 2d 3e 70 57 68 65 72 65 20 3d  );.  p->pWhere =
16bb0 20 73 75 62 73 74 45 78 70 72 28 64 62 2c 20 70   substExpr(db, p
16bc0 2d 3e 70 57 68 65 72 65 2c 20 69 54 61 62 6c 65  ->pWhere, iTable
16bd0 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 73 75 62  , pEList);.  sub
16be0 73 74 53 65 6c 65 63 74 28 64 62 2c 20 70 2d 3e  stSelect(db, p->
16bf0 70 50 72 69 6f 72 2c 20 69 54 61 62 6c 65 2c 20  pPrior, iTable, 
16c00 70 45 4c 69 73 74 29 3b 0a 20 20 70 53 72 63 20  pEList);.  pSrc 
16c10 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73  = p->pSrc;.  ass
16c20 65 72 74 28 20 70 53 72 63 20 29 3b 20 20 2f 2a  ert( pSrc );  /*
16c30 20 45 76 65 6e 20 66 6f 72 20 28 53 45 4c 45 43   Even for (SELEC
16c40 54 20 31 29 20 77 65 20 68 61 76 65 3a 20 70 53  T 1) we have: pS
16c50 72 63 21 3d 30 20 62 75 74 20 70 53 72 63 2d 3e  rc!=0 but pSrc->
16c60 6e 53 72 63 3d 3d 30 20 2a 2f 0a 20 20 69 66 28  nSrc==0 */.  if(
16c70 20 41 4c 57 41 59 53 28 70 53 72 63 29 20 29 7b   ALWAYS(pSrc) ){
16c80 0a 20 20 20 20 66 6f 72 28 69 3d 70 53 72 63 2d  .    for(i=pSrc-
16c90 3e 6e 53 72 63 2c 20 70 49 74 65 6d 3d 70 53 72  >nSrc, pItem=pSr
16ca0 63 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20  c->a; i>0; i--, 
16cb0 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
16cc0 73 75 62 73 74 53 65 6c 65 63 74 28 64 62 2c 20  substSelect(db, 
16cd0 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2c 20  pItem->pSelect, 
16ce0 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
16cf0 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e  .    }.  }.}.#en
16d00 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
16d10 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
16d20 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65  UERY) || !define
16d30 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
16d40 45 57 29 20 2a 2f 0a 0a 23 69 66 20 21 64 65 66  EW) */..#if !def
16d50 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
16d60 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64  _SUBQUERY) || !d
16d70 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
16d80 49 54 5f 56 49 45 57 29 0a 2f 2a 0a 2a 2a 20 54  IT_VIEW)./*.** T
16d90 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65  his routine atte
16da0 6d 70 74 73 20 74 6f 20 66 6c 61 74 74 65 6e 20  mpts to flatten 
16db0 73 75 62 71 75 65 72 69 65 73 20 61 73 20 61 20  subqueries as a 
16dc0 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f 70 74 69  performance opti
16dd0 6d 69 7a 61 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69  mization..** Thi
16de0 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
16df0 73 20 31 20 69 66 20 69 74 20 6d 61 6b 65 73 20  s 1 if it makes 
16e00 63 68 61 6e 67 65 73 20 61 6e 64 20 30 20 69 66  changes and 0 if
16e10 20 6e 6f 20 66 6c 61 74 74 65 6e 69 6e 67 20 6f   no flattening o
16e20 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20  ccurs..**.** To 
16e30 75 6e 64 65 72 73 74 61 6e 64 20 74 68 65 20 63  understand the c
16e40 6f 6e 63 65 70 74 20 6f 66 20 66 6c 61 74 74 65  oncept of flatte
16e50 6e 69 6e 67 2c 20 63 6f 6e 73 69 64 65 72 20 74  ning, consider t
16e60 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20  he following.** 
16e70 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  query:.**.**    
16e80 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 28   SELECT a FROM (
16e90 53 45 4c 45 43 54 20 78 2b 79 20 41 53 20 61 20  SELECT x+y AS a 
16ea0 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 7a 3c  FROM t1 WHERE z<
16eb0 31 30 30 29 20 57 48 45 52 45 20 61 3e 35 0a 2a  100) WHERE a>5.*
16ec0 2a 0a 2a 2a 20 54 68 65 20 64 65 66 61 75 6c 74  *.** The default
16ed0 20 77 61 79 20 6f 66 20 69 6d 70 6c 65 6d 65 6e   way of implemen
16ee0 74 69 6e 67 20 74 68 69 73 20 71 75 65 72 79 20  ting this query 
16ef0 69 73 20 74 6f 20 65 78 65 63 75 74 65 20 74 68  is to execute th
16f00 65 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 66 69  e.** subquery fi
16f10 72 73 74 20 61 6e 64 20 73 74 6f 72 65 20 74 68  rst and store th
16f20 65 20 72 65 73 75 6c 74 73 20 69 6e 20 61 20 74  e results in a t
16f30 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20  emporary table, 
16f40 74 68 65 6e 0a 2a 2a 20 72 75 6e 20 74 68 65 20  then.** run the 
16f50 6f 75 74 65 72 20 71 75 65 72 79 20 6f 6e 20 74  outer query on t
16f60 68 61 74 20 74 65 6d 70 6f 72 61 72 79 20 74 61  hat temporary ta
16f70 62 6c 65 2e 20 20 54 68 69 73 20 72 65 71 75 69  ble.  This requi
16f80 72 65 73 20 74 77 6f 0a 2a 2a 20 70 61 73 73 65  res two.** passe
16f90 73 20 6f 76 65 72 20 74 68 65 20 64 61 74 61 2e  s over the data.
16fa0 20 20 46 75 72 74 68 65 72 6d 6f 72 65 2c 20 62    Furthermore, b
16fb0 65 63 61 75 73 65 20 74 68 65 20 74 65 6d 70 6f  ecause the tempo
16fc0 72 61 72 79 20 74 61 62 6c 65 0a 2a 2a 20 68 61  rary table.** ha
16fd0 73 20 6e 6f 20 69 6e 64 69 63 65 73 2c 20 74 68  s no indices, th
16fe0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f  e WHERE clause o
16ff0 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  n the outer quer
17000 79 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6f  y cannot be.** o
17010 70 74 69 6d 69 7a 65 64 2e 0a 2a 2a 0a 2a 2a 20  ptimized..**.** 
17020 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74  This routine att
17030 65 6d 70 74 73 20 74 6f 20 72 65 77 72 69 74 65  empts to rewrite
17040 20 71 75 65 72 69 65 73 20 73 75 63 68 20 61 73   queries such as
17050 20 74 68 65 20 61 62 6f 76 65 20 69 6e 74 6f 0a   the above into.
17060 2a 2a 20 61 20 73 69 6e 67 6c 65 20 66 6c 61 74  ** a single flat
17070 20 73 65 6c 65 63 74 2c 20 6c 69 6b 65 20 74 68   select, like th
17080 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45  is:.**.**     SE
17090 4c 45 43 54 20 78 2b 79 20 41 53 20 61 20 46 52  LECT x+y AS a FR
170a0 4f 4d 20 74 31 20 57 48 45 52 45 20 7a 3c 31 30  OM t1 WHERE z<10
170b0 30 20 41 4e 44 20 61 3e 35 0a 2a 2a 0a 2a 2a 20  0 AND a>5.**.** 
170c0 54 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74  The code generat
170d0 65 64 20 66 6f 72 20 74 68 69 73 20 73 69 6d 70  ed for this simp
170e0 69 66 69 63 61 74 69 6f 6e 20 67 69 76 65 73 20  ification gives 
170f0 74 68 65 20 73 61 6d 65 20 72 65 73 75 6c 74 0a  the same result.
17100 2a 2a 20 62 75 74 20 6f 6e 6c 79 20 68 61 73 20  ** but only has 
17110 74 6f 20 73 63 61 6e 20 74 68 65 20 64 61 74 61  to scan the data
17120 20 6f 6e 63 65 2e 20 20 41 6e 64 20 62 65 63 61   once.  And beca
17130 75 73 65 20 69 6e 64 69 63 65 73 20 6d 69 67 68  use indices migh
17140 74 20 0a 2a 2a 20 65 78 69 73 74 20 6f 6e 20 74  t .** exist on t
17150 68 65 20 74 61 62 6c 65 20 74 31 2c 20 61 20 63  he table t1, a c
17160 6f 6d 70 6c 65 74 65 20 73 63 61 6e 20 6f 66 20  omplete scan of 
17170 74 68 65 20 64 61 74 61 20 6d 69 67 68 74 20 62  the data might b
17180 65 0a 2a 2a 20 61 76 6f 69 64 65 64 2e 0a 2a 2a  e.** avoided..**
17190 0a 2a 2a 20 46 6c 61 74 74 65 6e 69 6e 67 20 69  .** Flattening i
171a0 73 20 6f 6e 6c 79 20 61 74 74 65 6d 70 74 65 64  s only attempted
171b0 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66   if all of the f
171c0 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75  ollowing are tru
171d0 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 20  e:.**.**   (1)  
171e0 54 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64  The subquery and
171f0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
17200 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20 75 73 65   do not both use
17210 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a   aggregates..**.
17220 2a 2a 20 20 20 28 32 29 20 20 54 68 65 20 73 75  **   (2)  The su
17230 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 6e  bquery is not an
17240 20 61 67 67 72 65 67 61 74 65 20 6f 72 20 74 68   aggregate or th
17250 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73  e outer query is
17260 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a   not a join..**.
17270 2a 2a 20 20 20 28 33 29 20 20 54 68 65 20 73 75  **   (3)  The su
17280 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 74 68  bquery is not th
17290 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20  e right operand 
172a0 6f 66 20 61 20 6c 65 66 74 20 6f 75 74 65 72 20  of a left outer 
172b0 6a 6f 69 6e 0a 2a 2a 20 20 20 20 20 20 20 20 28  join.**        (
172c0 4f 72 69 67 69 6e 61 6c 6c 79 20 74 69 63 6b 65  Originally ticke
172d0 74 20 23 33 30 36 2e 20 20 53 74 72 65 6e 67 74  t #306.  Strengt
172e0 68 65 6e 65 64 20 62 79 20 74 69 63 6b 65 74 20  hened by ticket 
172f0 23 33 33 30 30 29 0a 2a 2a 0a 2a 2a 20 20 20 28  #3300).**.**   (
17300 34 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  4)  The subquery
17310 20 69 73 20 6e 6f 74 20 44 49 53 54 49 4e 43 54   is not DISTINCT
17320 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 41  ..**.**  (**)  A
17330 74 20 6f 6e 65 20 70 6f 69 6e 74 20 72 65 73 74  t one point rest
17340 72 69 63 74 69 6f 6e 73 20 28 34 29 20 61 6e 64  rictions (4) and
17350 20 28 35 29 20 64 65 66 69 6e 65 64 20 61 20 73   (5) defined a s
17360 75 62 73 65 74 20 6f 66 20 44 49 53 54 49 4e 43  ubset of DISTINC
17370 54 0a 2a 2a 20 20 20 20 20 20 20 20 73 75 62 2d  T.**        sub-
17380 71 75 65 72 69 65 73 20 74 68 61 74 20 77 65 72  queries that wer
17390 65 20 65 78 63 6c 75 64 65 64 20 66 72 6f 6d 20  e excluded from 
173a0 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f  this optimizatio
173b0 6e 2e 20 52 65 73 74 72 69 63 74 69 6f 6e 20 0a  n. Restriction .
173c0 2a 2a 20 20 20 20 20 20 20 20 28 34 29 20 68 61  **        (4) ha
173d0 73 20 73 69 6e 63 65 20 62 65 65 6e 20 65 78 70  s since been exp
173e0 61 6e 64 65 64 20 74 6f 20 65 78 63 6c 75 64 65  anded to exclude
173f0 20 61 6c 6c 20 44 49 53 54 49 4e 43 54 20 73 75   all DISTINCT su
17400 62 71 75 65 72 69 65 73 2e 0a 2a 2a 0a 2a 2a 20  bqueries..**.** 
17410 20 20 28 36 29 20 20 54 68 65 20 73 75 62 71 75    (6)  The subqu
17420 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  ery does not use
17430 20 61 67 67 72 65 67 61 74 65 73 20 6f 72 20 74   aggregates or t
17440 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69  he outer query i
17450 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20  s not.**        
17460 44 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20  DISTINCT..**.** 
17470 20 20 28 37 29 20 20 54 68 65 20 73 75 62 71 75    (7)  The subqu
17480 65 72 79 20 68 61 73 20 61 20 46 52 4f 4d 20 63  ery has a FROM c
17490 6c 61 75 73 65 2e 20 20 54 4f 44 4f 3a 20 20 46  lause.  TODO:  F
174a0 6f 72 20 73 75 62 71 75 65 72 69 65 73 20 77 69  or subqueries wi
174b0 74 68 6f 75 74 0a 2a 2a 20 20 20 20 20 20 20 20  thout.**        
174c0 41 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c 20 63  A FROM clause, c
174d0 6f 6e 73 69 64 65 72 20 61 64 64 69 6e 67 20 61  onsider adding a
174e0 20 46 52 4f 4d 20 63 6c 6f 73 65 20 77 69 74 68   FROM close with
174f0 20 74 68 65 20 73 70 65 63 69 61 6c 0a 2a 2a 20   the special.** 
17500 20 20 20 20 20 20 20 74 61 62 6c 65 20 73 71 6c         table sql
17510 69 74 65 5f 6f 6e 63 65 20 74 68 61 74 20 63 6f  ite_once that co
17520 6e 73 69 73 74 73 20 6f 66 20 61 20 73 69 6e 67  nsists of a sing
17530 6c 65 20 72 6f 77 20 63 6f 6e 74 61 69 6e 69 6e  le row containin
17540 67 20 61 0a 2a 2a 20 20 20 20 20 20 20 20 73 69  g a.**        si
17550 6e 67 6c 65 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  ngle NULL..**.**
17560 20 20 20 28 38 29 20 20 54 68 65 20 73 75 62 71     (8)  The subq
17570 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73  uery does not us
17580 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65 20 6f  e LIMIT or the o
17590 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f  uter query is no
175a0 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20  t a join..**.** 
175b0 20 20 28 39 29 20 20 54 68 65 20 73 75 62 71 75    (9)  The subqu
175c0 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  ery does not use
175d0 20 4c 49 4d 49 54 20 6f 72 20 74 68 65 20 6f 75   LIMIT or the ou
175e0 74 65 72 20 71 75 65 72 79 20 64 6f 65 73 20 6e  ter query does n
175f0 6f 74 20 75 73 65 0a 2a 2a 20 20 20 20 20 20 20  ot use.**       
17600 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a   aggregates..**.
17610 2a 2a 20 20 28 31 30 29 20 20 54 68 65 20 73 75  **  (10)  The su
17620 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20  bquery does not 
17630 75 73 65 20 61 67 67 72 65 67 61 74 65 73 20 6f  use aggregates o
17640 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  r the outer quer
17650 79 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 20 20  y does not.**   
17660 20 20 20 20 20 75 73 65 20 4c 49 4d 49 54 2e 0a       use LIMIT..
17670 2a 2a 0a 2a 2a 20 20 28 31 31 29 20 20 54 68 65  **.**  (11)  The
17680 20 73 75 62 71 75 65 72 79 20 61 6e 64 20 74 68   subquery and th
17690 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f  e outer query do
176a0 20 6e 6f 74 20 62 6f 74 68 20 68 61 76 65 20 4f   not both have O
176b0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 73 2e  RDER BY clauses.
176c0 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 4e 6f  .**.**  (**)  No
176d0 74 20 69 6d 70 6c 65 6d 65 6e 74 65 64 2e 20 20  t implemented.  
176e0 53 75 62 73 75 6d 65 64 20 69 6e 74 6f 20 72 65  Subsumed into re
176f0 73 74 72 69 63 74 69 6f 6e 20 28 33 29 2e 20 20  striction (3).  
17700 57 61 73 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a  Was previously.*
17710 2a 20 20 20 20 20 20 20 20 61 20 73 65 70 61 72  *        a separ
17720 61 74 65 20 72 65 73 74 72 69 63 74 69 6f 6e 20  ate restriction 
17730 64 65 72 69 76 69 6e 67 20 66 72 6f 6d 20 74 69  deriving from ti
17740 63 6b 65 74 20 23 33 35 30 2e 0a 2a 2a 0a 2a 2a  cket #350..**.**
17750 20 20 28 31 33 29 20 20 54 68 65 20 73 75 62 71    (13)  The subq
17760 75 65 72 79 20 61 6e 64 20 6f 75 74 65 72 20 71  uery and outer q
17770 75 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68  uery do not both
17780 20 75 73 65 20 4c 49 4d 49 54 2e 0a 2a 2a 0a 2a   use LIMIT..**.*
17790 2a 20 20 28 31 34 29 20 20 54 68 65 20 73 75 62  *  (14)  The sub
177a0 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75  query does not u
177b0 73 65 20 4f 46 46 53 45 54 2e 0a 2a 2a 0a 2a 2a  se OFFSET..**.**
177c0 20 20 28 31 35 29 20 20 54 68 65 20 6f 75 74 65    (15)  The oute
177d0 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20 70  r query is not p
177e0 61 72 74 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e  art of a compoun
177f0 64 20 73 65 6c 65 63 74 20 6f 72 20 74 68 65 0a  d select or the.
17800 2a 2a 20 20 20 20 20 20 20 20 73 75 62 71 75 65  **        subque
17810 72 79 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65  ry does not have
17820 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 2e   a LIMIT clause.
17830 0a 2a 2a 20 20 20 20 20 20 20 20 28 53 65 65 20  .**        (See 
17840 74 69 63 6b 65 74 20 23 32 33 33 39 20 61 6e 64  ticket #2339 and
17850 20 74 69 63 6b 65 74 20 5b 30 32 61 38 65 38 31   ticket [02a8e81
17860 64 34 34 5d 29 2e 0a 2a 2a 0a 2a 2a 20 20 28 31  d44])..**.**  (1
17870 36 29 20 20 54 68 65 20 6f 75 74 65 72 20 71 75  6)  The outer qu
17880 65 72 79 20 69 73 20 6e 6f 74 20 61 6e 20 61 67  ery is not an ag
17890 67 72 65 67 61 74 65 20 6f 72 20 74 68 65 20 73  gregate or the s
178a0 75 62 71 75 65 72 79 20 64 6f 65 73 0a 2a 2a 20  ubquery does.** 
178b0 20 20 20 20 20 20 20 6e 6f 74 20 63 6f 6e 74 61         not conta
178c0 69 6e 20 4f 52 44 45 52 20 42 59 2e 20 20 28 54  in ORDER BY.  (T
178d0 69 63 6b 65 74 20 23 32 39 34 32 29 20 20 54 68  icket #2942)  Th
178e0 69 73 20 75 73 65 64 20 74 6f 20 6e 6f 74 20 6d  is used to not m
178f0 61 74 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 20  atter.**        
17900 75 6e 74 69 6c 20 77 65 20 69 6e 74 72 6f 64 75  until we introdu
17910 63 65 64 20 74 68 65 20 67 72 6f 75 70 5f 63 6f  ced the group_co
17920 6e 63 61 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e  ncat() function.
17930 20 20 0a 2a 2a 0a 2a 2a 20 20 28 31 37 29 20 20    .**.**  (17)  
17940 54 68 65 20 73 75 62 2d 71 75 65 72 79 20 69 73  The sub-query is
17950 20 6e 6f 74 20 61 20 63 6f 6d 70 6f 75 6e 64 20   not a compound 
17960 73 65 6c 65 63 74 2c 20 6f 72 20 69 74 20 69 73  select, or it is
17970 20 61 20 55 4e 49 4f 4e 20 41 4c 4c 20 0a 2a 2a   a UNION ALL .**
17980 20 20 20 20 20 20 20 20 63 6f 6d 70 6f 75 6e 64          compound
17990 20 63 6c 61 75 73 65 20 6d 61 64 65 20 75 70 20   clause made up 
179a0 65 6e 74 69 72 65 6c 79 20 6f 66 20 6e 6f 6e 2d  entirely of non-
179b0 61 67 67 72 65 67 61 74 65 20 71 75 65 72 69 65  aggregate querie
179c0 73 2c 20 61 6e 64 20 0a 2a 2a 20 20 20 20 20 20  s, and .**      
179d0 20 20 74 68 65 20 70 61 72 65 6e 74 20 71 75 65    the parent que
179e0 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  ry:.**.**       
179f0 20 20 20 2a 20 69 73 20 6e 6f 74 20 69 74 73 65     * is not itse
17a00 6c 66 20 70 61 72 74 20 6f 66 20 61 20 63 6f 6d  lf part of a com
17a10 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c 0a 2a 2a  pound select,.**
17a20 20 20 20 20 20 20 20 20 20 20 2a 20 69 73 20 6e            * is n
17a30 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74 65 20  ot an aggregate 
17a40 6f 72 20 44 49 53 54 49 4e 43 54 20 71 75 65 72  or DISTINCT quer
17a50 79 2c 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20  y, and.**       
17a60 20 20 20 2a 20 69 73 20 6e 6f 74 20 61 20 6a 6f     * is not a jo
17a70 69 6e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  in.**.**        
17a80 54 68 65 20 70 61 72 65 6e 74 20 61 6e 64 20 73  The parent and s
17a90 75 62 2d 71 75 65 72 79 20 6d 61 79 20 63 6f 6e  ub-query may con
17aa0 74 61 69 6e 20 57 48 45 52 45 20 63 6c 61 75 73  tain WHERE claus
17ab0 65 73 2e 20 53 75 62 6a 65 63 74 20 74 6f 0a 2a  es. Subject to.*
17ac0 2a 20 20 20 20 20 20 20 20 72 75 6c 65 73 20 28  *        rules (
17ad0 31 31 29 2c 20 28 31 33 29 20 61 6e 64 20 28 31  11), (13) and (1
17ae0 34 29 2c 20 74 68 65 79 20 6d 61 79 20 61 6c 73  4), they may als
17af0 6f 20 63 6f 6e 74 61 69 6e 20 4f 52 44 45 52 20  o contain ORDER 
17b00 42 59 2c 0a 2a 2a 20 20 20 20 20 20 20 20 4c 49  BY,.**        LI
17b10 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20 63  MIT and OFFSET c
17b20 6c 61 75 73 65 73 2e 20 20 54 68 65 20 73 75 62  lauses.  The sub
17b30 71 75 65 72 79 20 63 61 6e 6e 6f 74 20 75 73 65  query cannot use
17b40 20 61 6e 79 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a   any compound.**
17b50 20 20 20 20 20 20 20 20 6f 70 65 72 61 74 6f 72          operator
17b60 20 6f 74 68 65 72 20 74 68 61 6e 20 55 4e 49 4f   other than UNIO
17b70 4e 20 41 4c 4c 20 62 65 63 61 75 73 65 20 61 6c  N ALL because al
17b80 6c 20 74 68 65 20 6f 74 68 65 72 20 63 6f 6d 70  l the other comp
17b90 6f 75 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 6f  ound.**        o
17ba0 70 65 72 61 74 6f 72 73 20 68 61 76 65 20 61 6e  perators have an
17bb0 20 69 6d 70 6c 69 65 64 20 44 49 53 54 49 4e 43   implied DISTINC
17bc0 54 20 77 68 69 63 68 20 69 73 20 64 69 73 61 6c  T which is disal
17bd0 6c 6f 77 65 64 20 62 79 0a 2a 2a 20 20 20 20 20  lowed by.**     
17be0 20 20 20 72 65 73 74 72 69 63 74 69 6f 6e 20 28     restriction (
17bf0 34 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  4)..**.**       
17c00 20 41 6c 73 6f 2c 20 65 61 63 68 20 63 6f 6d 70   Also, each comp
17c10 6f 6e 65 6e 74 20 6f 66 20 74 68 65 20 73 75 62  onent of the sub
17c20 2d 71 75 65 72 79 20 6d 75 73 74 20 72 65 74 75  -query must retu
17c30 72 6e 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62  rn the same numb
17c40 65 72 0a 2a 2a 20 20 20 20 20 20 20 20 6f 66 20  er.**        of 
17c50 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 2e 20  result columns. 
17c60 54 68 69 73 20 69 73 20 61 63 74 75 61 6c 6c 79  This is actually
17c70 20 61 20 72 65 71 75 69 72 65 6d 65 6e 74 20 66   a requirement f
17c80 6f 72 20 61 6e 79 20 63 6f 6d 70 6f 75 6e 64 0a  or any compound.
17c90 2a 2a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54  **        SELECT
17ca0 20 73 74 61 74 65 6d 65 6e 74 2c 20 62 75 74 20   statement, but 
17cb0 61 6c 6c 20 74 68 65 20 63 6f 64 65 20 68 65 72  all the code her
17cc0 65 20 64 6f 65 73 20 69 73 20 6d 61 6b 65 20 73  e does is make s
17cd0 75 72 65 20 74 68 61 74 20 6e 6f 0a 2a 2a 20 20  ure that no.**  
17ce0 20 20 20 20 20 20 73 75 63 68 20 28 69 6c 6c 65        such (ille
17cf0 67 61 6c 29 20 73 75 62 2d 71 75 65 72 79 20 69  gal) sub-query i
17d00 73 20 66 6c 61 74 74 65 6e 65 64 2e 20 54 68 65  s flattened. The
17d10 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 64 65 74   caller will det
17d20 65 63 74 20 74 68 65 0a 2a 2a 20 20 20 20 20 20  ect the.**      
17d30 20 20 73 79 6e 74 61 78 20 65 72 72 6f 72 20 61    syntax error a
17d40 6e 64 20 72 65 74 75 72 6e 20 61 20 64 65 74 61  nd return a deta
17d50 69 6c 65 64 20 6d 65 73 73 61 67 65 2e 0a 2a 2a  iled message..**
17d60 0a 2a 2a 20 20 28 31 38 29 20 20 49 66 20 74 68  .**  (18)  If th
17d70 65 20 73 75 62 2d 71 75 65 72 79 20 69 73 20 61  e sub-query is a
17d80 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74   compound select
17d90 2c 20 74 68 65 6e 20 61 6c 6c 20 74 65 72 6d 73  , then all terms
17da0 20 6f 66 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   of the.**      
17db0 20 20 4f 52 44 45 52 20 62 79 20 63 6c 61 75 73    ORDER by claus
17dc0 65 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20  e of the parent 
17dd0 6d 75 73 74 20 62 65 20 73 69 6d 70 6c 65 20 72  must be simple r
17de0 65 66 65 72 65 6e 63 65 73 20 74 6f 20 0a 2a 2a  eferences to .**
17df0 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 73 20          columns 
17e00 6f 66 20 74 68 65 20 73 75 62 2d 71 75 65 72 79  of the sub-query
17e10 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 39 29 20 20 54  ..**.**  (19)  T
17e20 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73  he subquery does
17e30 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 20 6f   not use LIMIT o
17e40 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  r the outer quer
17e50 79 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 20 20  y does not.**   
17e60 20 20 20 20 20 68 61 76 65 20 61 20 57 48 45 52       have a WHER
17e70 45 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20  E clause..**.** 
17e80 20 28 32 30 29 20 20 49 66 20 74 68 65 20 73 75   (20)  If the su
17e90 62 2d 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d  b-query is a com
17ea0 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20 74 68  pound select, th
17eb0 65 6e 20 69 74 20 6d 75 73 74 20 6e 6f 74 20 75  en it must not u
17ec0 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 61 6e 20  se.**        an 
17ed0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e  ORDER BY clause.
17ee0 20 20 54 69 63 6b 65 74 20 23 33 37 37 33 2e 20    Ticket #3773. 
17ef0 20 57 65 20 63 6f 75 6c 64 20 72 65 6c 61 78 20   We could relax 
17f00 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 0a  this constraint.
17f10 2a 2a 20 20 20 20 20 20 20 20 73 6f 6d 65 77 68  **        somewh
17f20 61 74 20 62 79 20 73 61 79 69 6e 67 20 74 68 61  at by saying tha
17f30 74 20 74 68 65 20 74 65 72 6d 73 20 6f 66 20 74  t the terms of t
17f40 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
17f50 73 65 20 6d 75 73 74 0a 2a 2a 20 20 20 20 20 20  se must.**      
17f60 20 20 61 70 70 65 61 72 20 61 73 20 75 6e 6d 6f    appear as unmo
17f70 64 69 66 69 65 64 20 72 65 73 75 6c 74 20 63 6f  dified result co
17f80 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 6f 75 74  lumns in the out
17f90 65 72 20 71 75 65 72 79 2e 20 20 42 75 74 20 77  er query.  But w
17fa0 65 0a 2a 2a 20 20 20 20 20 20 20 20 68 61 76 65  e.**        have
17fb0 20 6f 74 68 65 72 20 6f 70 74 69 6d 69 7a 61 74   other optimizat
17fc0 69 6f 6e 73 20 69 6e 20 6d 69 6e 64 20 74 6f 20  ions in mind to 
17fd0 64 65 61 6c 20 77 69 74 68 20 74 68 61 74 20 63  deal with that c
17fe0 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 31 29  ase..**.**  (21)
17ff0 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64    The subquery d
18000 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49  oes not use LIMI
18010 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71  T or the outer q
18020 75 65 72 79 20 69 73 20 6e 6f 74 0a 2a 2a 20 20  uery is not.**  
18030 20 20 20 20 20 20 44 49 53 54 49 4e 43 54 2e 20        DISTINCT. 
18040 20 28 53 65 65 20 74 69 63 6b 65 74 20 5b 37 35   (See ticket [75
18050 32 65 31 36 34 36 66 63 5d 29 2e 0a 2a 2a 0a 2a  2e1646fc])..**.*
18060 2a 20 49 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  * In this routin
18070 65 2c 20 74 68 65 20 22 70 22 20 70 61 72 61 6d  e, the "p" param
18080 65 74 65 72 20 69 73 20 61 20 70 6f 69 6e 74 65  eter is a pointe
18090 72 20 74 6f 20 74 68 65 20 6f 75 74 65 72 20 71  r to the outer q
180a0 75 65 72 79 2e 0a 2a 2a 20 54 68 65 20 73 75 62  uery..** The sub
180b0 71 75 65 72 79 20 69 73 20 70 2d 3e 70 53 72 63  query is p->pSrc
180c0 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 20 20 69 73 41  ->a[iFrom].  isA
180d0 67 67 20 69 73 20 74 72 75 65 20 69 66 20 74 68  gg is true if th
180e0 65 20 6f 75 74 65 72 20 71 75 65 72 79 0a 2a 2a  e outer query.**
180f0 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65 73   uses aggregates
18100 20 61 6e 64 20 73 75 62 71 75 65 72 79 49 73 41   and subqueryIsA
18110 67 67 20 69 73 20 74 72 75 65 20 69 66 20 74 68  gg is true if th
18120 65 20 73 75 62 71 75 65 72 79 20 75 73 65 73 20  e subquery uses 
18130 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a  aggregates..**.*
18140 2a 20 49 66 20 66 6c 61 74 74 65 6e 69 6e 67 20  * If flattening 
18150 69 73 20 6e 6f 74 20 61 74 74 65 6d 70 74 65 64  is not attempted
18160 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
18170 73 20 61 20 6e 6f 2d 6f 70 20 61 6e 64 20 72 65  s a no-op and re
18180 74 75 72 6e 73 20 30 2e 0a 2a 2a 20 49 66 20 66  turns 0..** If f
18190 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 61 74 74  lattening is att
181a0 65 6d 70 74 65 64 20 74 68 69 73 20 72 6f 75 74  empted this rout
181b0 69 6e 65 20 72 65 74 75 72 6e 73 20 31 2e 0a 2a  ine returns 1..*
181c0 2a 0a 2a 2a 20 41 6c 6c 20 6f 66 20 74 68 65 20  *.** All of the 
181d0 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 61 6c 79  expression analy
181e0 73 69 73 20 6d 75 73 74 20 6f 63 63 75 72 20 6f  sis must occur o
181f0 6e 20 62 6f 74 68 20 74 68 65 20 6f 75 74 65 72  n both the outer
18200 20 71 75 65 72 79 20 61 6e 64 0a 2a 2a 20 74 68   query and.** th
18210 65 20 73 75 62 71 75 65 72 79 20 62 65 66 6f 72  e subquery befor
18220 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  e this routine r
18230 75 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  uns..*/.static i
18240 6e 74 20 66 6c 61 74 74 65 6e 53 75 62 71 75 65  nt flattenSubque
18250 72 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ry(.  Parse *pPa
18260 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61  rse,       /* Pa
18270 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
18280 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
18290 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
182a0 61 72 65 6e 74 20 6f 72 20 6f 75 74 65 72 20 53  arent or outer S
182b0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
182c0 2a 2f 0a 20 20 69 6e 74 20 69 46 72 6f 6d 2c 20  */.  int iFrom, 
182d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
182e0 65 78 20 69 6e 20 70 2d 3e 70 53 72 63 2d 3e 61  ex in p->pSrc->a
182f0 5b 5d 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20  [] of the inner 
18300 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e  subquery */.  in
18310 74 20 69 73 41 67 67 2c 20 20 20 20 20 20 20 20  t isAgg,        
18320 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6f 75     /* True if ou
18330 74 65 72 20 53 45 4c 45 43 54 20 75 73 65 73 20  ter SELECT uses 
18340 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
18350 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 73 75 62  ons */.  int sub
18360 71 75 65 72 79 49 73 41 67 67 20 20 20 20 2f 2a  queryIsAgg    /*
18370 20 54 72 75 65 20 69 66 20 74 68 65 20 73 75 62   True if the sub
18380 71 75 65 72 79 20 75 73 65 73 20 61 67 67 72 65  query uses aggre
18390 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a  gate functions *
183a0 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  /.){.  const cha
183b0 72 20 2a 7a 53 61 76 65 64 41 75 74 68 43 6f 6e  r *zSavedAuthCon
183c0 74 65 78 74 20 3d 20 70 50 61 72 73 65 2d 3e 7a  text = pParse->z
183d0 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a 20 20 53  AuthContext;.  S
183e0 65 6c 65 63 74 20 2a 70 50 61 72 65 6e 74 3b 0a  elect *pParent;.
183f0 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 3b 20    Select *pSub; 
18400 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 6e        /* The inn
18410 65 72 20 71 75 65 72 79 20 6f 72 20 22 73 75 62  er query or "sub
18420 71 75 65 72 79 22 20 2a 2f 0a 20 20 53 65 6c 65  query" */.  Sele
18430 63 74 20 2a 70 53 75 62 31 3b 20 20 20 20 20 20  ct *pSub1;      
18440 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68  /* Pointer to th
18450 65 20 72 69 67 68 74 6d 6f 73 74 20 73 65 6c 65  e rightmost sele
18460 63 74 20 69 6e 20 73 75 62 2d 71 75 65 72 79 20  ct in sub-query 
18470 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  */.  SrcList *pS
18480 72 63 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20  rc;      /* The 
18490 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74  FROM clause of t
184a0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a  he outer query *
184b0 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 75  /.  SrcList *pSu
184c0 62 53 72 63 3b 20 20 20 2f 2a 20 54 68 65 20 46  bSrc;   /* The F
184d0 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ROM clause of th
184e0 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20  e subquery */.  
184f0 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b  ExprList *pList;
18500 20 20 20 20 2f 2a 20 54 68 65 20 72 65 73 75 6c      /* The resul
18510 74 20 73 65 74 20 6f 66 20 74 68 65 20 6f 75 74  t set of the out
18520 65 72 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e  er query */.  in
18530 74 20 69 50 61 72 65 6e 74 3b 20 20 20 20 20 20  t iParent;      
18540 20 20 2f 2a 20 56 44 42 45 20 63 75 72 73 6f 72    /* VDBE cursor
18550 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70   number of the p
18560 53 75 62 20 72 65 73 75 6c 74 20 73 65 74 20 74  Sub result set t
18570 65 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  emp table */.  i
18580 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
18590 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
185a0 65 72 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57  er */.  Expr *pW
185b0 68 65 72 65 3b 20 20 20 20 20 20 20 20 20 20 20  here;           
185c0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
185d0 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
185e0 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
185f0 5f 69 74 65 6d 20 2a 70 53 75 62 69 74 65 6d 3b  _item *pSubitem;
18600 20 20 20 2f 2a 20 54 68 65 20 73 75 62 71 75 65     /* The subque
18610 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  ry */.  sqlite3 
18620 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
18630 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f  ;..  /* Check to
18640 20 73 65 65 20 69 66 20 66 6c 61 74 74 65 6e 69   see if flatteni
18650 6e 67 20 69 73 20 70 65 72 6d 69 74 74 65 64 2e  ng is permitted.
18660 20 20 52 65 74 75 72 6e 20 30 20 69 66 20 6e 6f    Return 0 if no
18670 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  t..  */.  assert
18680 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ( p!=0 );.  asse
18690 72 74 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30  rt( p->pPrior==0
186a0 20 29 3b 20 20 2f 2a 20 55 6e 61 62 6c 65 20 74   );  /* Unable t
186b0 6f 20 66 6c 61 74 74 65 6e 20 63 6f 6d 70 6f 75  o flatten compou
186c0 6e 64 20 71 75 65 72 69 65 73 20 2a 2f 0a 20 20  nd queries */.  
186d0 69 66 28 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e  if( Optimization
186e0 44 69 73 61 62 6c 65 64 28 64 62 2c 20 53 51 4c  Disabled(db, SQL
186f0 49 54 45 5f 51 75 65 72 79 46 6c 61 74 74 65 6e  ITE_QueryFlatten
18700 65 72 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  er) ) return 0;.
18710 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63    pSrc = p->pSrc
18720 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72 63  ;.  assert( pSrc
18730 20 26 26 20 69 46 72 6f 6d 3e 3d 30 20 26 26 20   && iFrom>=0 && 
18740 69 46 72 6f 6d 3c 70 53 72 63 2d 3e 6e 53 72 63  iFrom<pSrc->nSrc
18750 20 29 3b 0a 20 20 70 53 75 62 69 74 65 6d 20 3d   );.  pSubitem =
18760 20 26 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d   &pSrc->a[iFrom]
18770 3b 0a 20 20 69 50 61 72 65 6e 74 20 3d 20 70 53  ;.  iParent = pS
18780 75 62 69 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b  ubitem->iCursor;
18790 0a 20 20 70 53 75 62 20 3d 20 70 53 75 62 69 74  .  pSub = pSubit
187a0 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 61  em->pSelect;.  a
187b0 73 73 65 72 74 28 20 70 53 75 62 21 3d 30 20 29  ssert( pSub!=0 )
187c0 3b 0a 20 20 69 66 28 20 69 73 41 67 67 20 26 26  ;.  if( isAgg &&
187d0 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20 29   subqueryIsAgg )
187e0 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
187f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
18800 73 74 72 69 63 74 69 6f 6e 20 28 31 29 20 20 2a  striction (1)  *
18810 2f 0a 20 20 69 66 28 20 73 75 62 71 75 65 72 79  /.  if( subquery
18820 49 73 41 67 67 20 26 26 20 70 53 72 63 2d 3e 6e  IsAgg && pSrc->n
18830 53 72 63 3e 31 20 29 20 72 65 74 75 72 6e 20 30  Src>1 ) return 0
18840 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  ;          /* Re
18850 73 74 72 69 63 74 69 6f 6e 20 28 32 29 20 20 2a  striction (2)  *
18860 2f 0a 20 20 70 53 75 62 53 72 63 20 3d 20 70 53  /.  pSubSrc = pS
18870 75 62 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65  ub->pSrc;.  asse
18880 72 74 28 20 70 53 75 62 53 72 63 20 29 3b 0a 20  rt( pSubSrc );. 
18890 20 2f 2a 20 50 72 69 6f 72 20 74 6f 20 76 65 72   /* Prior to ver
188a0 73 69 6f 6e 20 33 2e 31 2e 32 2c 20 77 68 65 6e  sion 3.1.2, when
188b0 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45   LIMIT and OFFSE
188c0 54 20 68 61 64 20 74 6f 20 62 65 20 73 69 6d 70  T had to be simp
188d0 6c 65 20 63 6f 6e 73 74 61 6e 74 73 2c 0a 20 20  le constants,.  
188e0 2a 2a 20 6e 6f 74 20 61 72 62 69 74 72 61 72 79  ** not arbitrary
188f0 20 65 78 70 72 65 73 73 73 69 6f 6e 73 2c 20 77   expresssions, w
18900 65 20 61 6c 6c 6f 77 65 64 20 73 6f 6d 65 20 63  e allowed some c
18910 6f 6d 62 69 6e 69 6e 67 20 6f 66 20 4c 49 4d 49  ombining of LIMI
18920 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 20 20 2a  T and OFFSET.  *
18930 2a 20 62 65 63 61 75 73 65 20 74 68 65 79 20 63  * because they c
18940 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64  ould be computed
18950 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65   at compile-time
18960 2e 20 20 42 75 74 20 77 68 65 6e 20 4c 49 4d 49  .  But when LIMI
18970 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 20 20 2a  T and OFFSET.  *
18980 2a 20 62 65 63 61 6d 65 20 61 72 62 69 74 72 61  * became arbitra
18990 72 79 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20  ry expressions, 
189a0 77 65 20 77 65 72 65 20 66 6f 72 63 65 64 20 74  we were forced t
189b0 6f 20 61 64 64 20 72 65 73 74 72 69 63 74 69 6f  o add restrictio
189c0 6e 73 20 28 31 33 29 0a 20 20 2a 2a 20 61 6e 64  ns (13).  ** and
189d0 20 28 31 34 29 2e 20 2a 2f 0a 20 20 69 66 28 20   (14). */.  if( 
189e0 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20  pSub->pLimit && 
189f0 70 2d 3e 70 4c 69 6d 69 74 20 29 20 72 65 74 75  p->pLimit ) retu
18a00 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
18a10 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
18a20 6e 20 28 31 33 29 20 2a 2f 0a 20 20 69 66 28 20  n (13) */.  if( 
18a30 70 53 75 62 2d 3e 70 4f 66 66 73 65 74 20 29 20  pSub->pOffset ) 
18a40 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
18a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18a60 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
18a70 6e 20 28 31 34 29 20 2a 2f 0a 20 20 69 66 28 20  n (14) */.  if( 
18a80 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 20 26 26  p->pRightmost &&
18a90 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 29 7b   pSub->pLimit ){
18aa0 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20  .    return 0;  
18ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18ad0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
18ae0 74 72 69 63 74 69 6f 6e 20 28 31 35 29 20 2a 2f  triction (15) */
18af0 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 75 62 53  .  }.  if( pSubS
18b00 72 63 2d 3e 6e 53 72 63 3d 3d 30 20 29 20 72 65  rc->nSrc==0 ) re
18b10 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
18b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18b30 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 37 29   Restriction (7)
18b40 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d    */.  if( pSub-
18b50 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44  >selFlags & SF_D
18b60 69 73 74 69 6e 63 74 20 29 20 72 65 74 75 72 6e  istinct ) return
18b70 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
18b80 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 35 29   Restriction (5)
18b90 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d    */.  if( pSub-
18ba0 3e 70 4c 69 6d 69 74 20 26 26 20 28 70 53 72 63  >pLimit && (pSrc
18bb0 2d 3e 6e 53 72 63 3e 31 20 7c 7c 20 69 73 41 67  ->nSrc>1 || isAg
18bc0 67 29 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72  g) ){.     retur
18bd0 6e 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  n 0;         /* 
18be0 52 65 73 74 72 69 63 74 69 6f 6e 73 20 28 38 29  Restrictions (8)
18bf0 28 39 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28  (9) */.  }.  if(
18c00 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
18c10 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30 20  SF_Distinct)!=0 
18c20 26 26 20 73 75 62 71 75 65 72 79 49 73 41 67 67  && subqueryIsAgg
18c30 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20   ){.     return 
18c40 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  0;         /* Re
18c50 73 74 72 69 63 74 69 6f 6e 20 28 36 29 20 20 2a  striction (6)  *
18c60 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70  /.  }.  if( p->p
18c70 4f 72 64 65 72 42 79 20 26 26 20 70 53 75 62 2d  OrderBy && pSub-
18c80 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  >pOrderBy ){.   
18c90 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20    return 0;     
18ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18cc0 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
18cd0 74 69 6f 6e 20 28 31 31 29 20 2a 2f 0a 20 20 7d  tion (11) */.  }
18ce0 0a 20 20 69 66 28 20 69 73 41 67 67 20 26 26 20  .  if( isAgg && 
18cf0 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29  pSub->pOrderBy )
18d00 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
18d10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
18d20 74 72 69 63 74 69 6f 6e 20 28 31 36 29 20 2a 2f  triction (16) */
18d30 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69  .  if( pSub->pLi
18d40 6d 69 74 20 26 26 20 70 2d 3e 70 57 68 65 72 65  mit && p->pWhere
18d50 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
18d60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
18d70 74 72 69 63 74 69 6f 6e 20 28 31 39 29 20 2a 2f  triction (19) */
18d80 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69  .  if( pSub->pLi
18d90 6d 69 74 20 26 26 20 28 70 2d 3e 73 65 6c 46 6c  mit && (p->selFl
18da0 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63  ags & SF_Distinc
18db0 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 72 65  t)!=0 ){.     re
18dc0 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
18dd0 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
18de0 32 31 29 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a  21) */.  }..  /*
18df0 20 4f 42 53 4f 4c 45 54 45 20 43 4f 4d 4d 45 4e   OBSOLETE COMMEN
18e00 54 20 31 3a 0a 20 20 2a 2a 20 52 65 73 74 72 69  T 1:.  ** Restri
18e10 63 74 69 6f 6e 20 33 3a 20 20 49 66 20 74 68 65  ction 3:  If the
18e20 20 73 75 62 71 75 65 72 79 20 69 73 20 61 20 6a   subquery is a j
18e30 6f 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74  oin, make sure t
18e40 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 0a  he subquery is .
18e50 20 20 2a 2a 20 6e 6f 74 20 75 73 65 64 20 61 73    ** not used as
18e60 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61   the right opera
18e70 6e 64 20 6f 66 20 61 6e 20 6f 75 74 65 72 20 6a  nd of an outer j
18e80 6f 69 6e 2e 20 20 45 78 61 6d 70 6c 65 73 20 6f  oin.  Examples o
18e90 66 20 77 68 79 20 74 68 69 73 0a 20 20 2a 2a 20  f why this.  ** 
18ea0 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a  is not allowed:.
18eb0 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20    **.  **       
18ec0 20 20 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20    t1 LEFT OUTER 
18ed0 4a 4f 49 4e 20 28 74 32 20 4a 4f 49 4e 20 74 33  JOIN (t2 JOIN t3
18ee0 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 77  ).  **.  ** If w
18ef0 65 20 66 6c 61 74 74 65 6e 20 74 68 65 20 61 62  e flatten the ab
18f00 6f 76 65 2c 20 77 65 20 77 6f 75 6c 64 20 67 65  ove, we would ge
18f10 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  t.  **.  **     
18f20 20 20 20 20 28 74 31 20 4c 45 46 54 20 4f 55 54      (t1 LEFT OUT
18f30 45 52 20 4a 4f 49 4e 20 74 32 29 20 4a 4f 49 4e  ER JOIN t2) JOIN
18f40 20 74 33 0a 20 20 2a 2a 0a 20 20 2a 2a 20 77 68   t3.  **.  ** wh
18f50 69 63 68 20 69 73 20 6e 6f 74 20 61 74 20 61 6c  ich is not at al
18f60 6c 20 74 68 65 20 73 61 6d 65 20 74 68 69 6e 67  l the same thing
18f70 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 42 53 4f  ..  **.  ** OBSO
18f80 4c 45 54 45 20 43 4f 4d 4d 45 4e 54 20 32 3a 0a  LETE COMMENT 2:.
18f90 20 20 2a 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    ** Restriction
18fa0 20 31 32 3a 20 20 49 66 20 74 68 65 20 73 75 62   12:  If the sub
18fb0 71 75 65 72 79 20 69 73 20 74 68 65 20 72 69 67  query is the rig
18fc0 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20  ht operand of a 
18fd0 6c 65 66 74 20 6f 75 74 65 72 0a 20 20 2a 2a 20  left outer.  ** 
18fe0 6a 6f 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20  join, make sure 
18ff0 74 68 65 20 73 75 62 71 75 65 72 79 20 68 61 73  the subquery has
19000 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65   no WHERE clause
19010 2e 0a 20 20 2a 2a 20 41 6e 20 65 78 61 6d 70 6c  ..  ** An exampl
19020 65 73 20 6f 66 20 77 68 79 20 74 68 69 73 20 69  es of why this i
19030 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a 20  s not allowed:. 
19040 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20   **.  **        
19050 20 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a   t1 LEFT OUTER J
19060 4f 49 4e 20 28 53 45 4c 45 43 54 20 2a 20 46 52  OIN (SELECT * FR
19070 4f 4d 20 74 32 20 57 48 45 52 45 20 74 32 2e 78  OM t2 WHERE t2.x
19080 3e 30 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  >0).  **.  ** If
19090 20 77 65 20 66 6c 61 74 74 65 6e 20 74 68 65 20   we flatten the 
190a0 61 62 6f 76 65 2c 20 77 65 20 77 6f 75 6c 64 20  above, we would 
190b0 67 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  get.  **.  **   
190c0 20 20 20 20 20 20 28 74 31 20 4c 45 46 54 20 4f        (t1 LEFT O
190d0 55 54 45 52 20 4a 4f 49 4e 20 74 32 29 20 57 48  UTER JOIN t2) WH
190e0 45 52 45 20 74 32 2e 78 3e 30 0a 20 20 2a 2a 0a  ERE t2.x>0.  **.
190f0 20 20 2a 2a 20 42 75 74 20 74 68 65 20 74 32 2e    ** But the t2.
19100 78 3e 30 20 74 65 73 74 20 77 69 6c 6c 20 61 6c  x>0 test will al
19110 77 61 79 73 20 66 61 69 6c 20 6f 6e 20 61 20 4e  ways fail on a N
19120 55 4c 4c 20 72 6f 77 20 6f 66 20 74 32 2c 20 77  ULL row of t2, w
19130 68 69 63 68 0a 20 20 2a 2a 20 65 66 66 65 63 74  hich.  ** effect
19140 69 76 65 6c 79 20 63 6f 6e 76 65 72 74 73 20 74  ively converts t
19150 68 65 20 4f 55 54 45 52 20 4a 4f 49 4e 20 69 6e  he OUTER JOIN in
19160 74 6f 20 61 6e 20 49 4e 4e 45 52 20 4a 4f 49 4e  to an INNER JOIN
19170 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 48 49 53  ..  **.  ** THIS
19180 20 4f 56 45 52 52 49 44 45 53 20 4f 42 53 4f 4c   OVERRIDES OBSOL
19190 45 54 45 20 43 4f 4d 4d 45 4e 54 53 20 31 20 41  ETE COMMENTS 1 A
191a0 4e 44 20 32 20 41 42 4f 56 45 3a 0a 20 20 2a 2a  ND 2 ABOVE:.  **
191b0 20 54 69 63 6b 65 74 20 23 33 33 30 30 20 73 68   Ticket #3300 sh
191c0 6f 77 73 20 74 68 61 74 20 66 6c 61 74 74 65 6e  ows that flatten
191d0 69 6e 67 20 74 68 65 20 72 69 67 68 74 20 74 65  ing the right te
191e0 72 6d 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49  rm of a LEFT JOI
191f0 4e 0a 20 20 2a 2a 20 69 73 20 66 72 61 75 67 68  N.  ** is fraugh
19200 74 20 77 69 74 68 20 64 61 6e 67 65 72 2e 20 20  t with danger.  
19210 42 65 73 74 20 74 6f 20 61 76 6f 69 64 20 74 68  Best to avoid th
19220 65 20 77 68 6f 6c 65 20 74 68 69 6e 67 2e 20 20  e whole thing.  
19230 49 66 20 74 68 65 0a 20 20 2a 2a 20 73 75 62 71  If the.  ** subq
19240 75 65 72 79 20 69 73 20 74 68 65 20 72 69 67 68  uery is the righ
19250 74 20 74 65 72 6d 20 6f 66 20 61 20 4c 45 46 54  t term of a LEFT
19260 20 4a 4f 49 4e 2c 20 74 68 65 6e 20 64 6f 20 6e   JOIN, then do n
19270 6f 74 20 66 6c 61 74 74 65 6e 2e 0a 20 20 2a 2f  ot flatten..  */
19280 0a 20 20 69 66 28 20 28 70 53 75 62 69 74 65 6d  .  if( (pSubitem
19290 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f  ->jointype & JT_
192a0 4f 55 54 45 52 29 21 3d 30 20 29 7b 0a 20 20 20  OUTER)!=0 ){.   
192b0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a   return 0;.  }..
192c0 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
192d0 20 31 37 3a 20 49 66 20 74 68 65 20 73 75 62 2d   17: If the sub-
192e0 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f  query is a compo
192f0 75 6e 64 20 53 45 4c 45 43 54 2c 20 74 68 65 6e  und SELECT, then
19300 20 69 74 20 6d 75 73 74 0a 20 20 2a 2a 20 75 73   it must.  ** us
19310 65 20 6f 6e 6c 79 20 74 68 65 20 55 4e 49 4f 4e  e only the UNION
19320 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72 2e 20 41   ALL operator. A
19330 6e 64 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 73  nd none of the s
19340 69 6d 70 6c 65 20 73 65 6c 65 63 74 20 71 75 65  imple select que
19350 72 69 65 73 0a 20 20 2a 2a 20 74 68 61 74 20 6d  ries.  ** that m
19360 61 6b 65 20 75 70 20 74 68 65 20 63 6f 6d 70 6f  ake up the compo
19370 75 6e 64 20 53 45 4c 45 43 54 20 61 72 65 20 61  und SELECT are a
19380 6c 6c 6f 77 65 64 20 74 6f 20 62 65 20 61 67 67  llowed to be agg
19390 72 65 67 61 74 65 20 6f 72 20 64 69 73 74 69 6e  regate or distin
193a0 63 74 0a 20 20 2a 2a 20 71 75 65 72 69 65 73 2e  ct.  ** queries.
193b0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62  .  */.  if( pSub
193c0 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20  ->pPrior ){.    
193d0 69 66 28 20 70 53 75 62 2d 3e 70 4f 72 64 65 72  if( pSub->pOrder
193e0 42 79 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  By ){.      retu
193f0 72 6e 20 30 3b 20 20 2f 2a 20 52 65 73 74 72 69  rn 0;  /* Restri
19400 63 74 69 6f 6e 20 32 30 20 2a 2f 0a 20 20 20 20  ction 20 */.    
19410 7d 0a 20 20 20 20 69 66 28 20 69 73 41 67 67 20  }.    if( isAgg 
19420 7c 7c 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20  || (p->selFlags 
19430 26 20 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d  & SF_Distinct)!=
19440 30 20 7c 7c 20 70 53 72 63 2d 3e 6e 53 72 63 21  0 || pSrc->nSrc!
19450 3d 31 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =1 ){.      retu
19460 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 0;.    }.    
19470 66 6f 72 28 70 53 75 62 31 3d 70 53 75 62 3b 20  for(pSub1=pSub; 
19480 70 53 75 62 31 3b 20 70 53 75 62 31 3d 70 53 75  pSub1; pSub1=pSu
19490 62 31 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20  b1->pPrior){.   
194a0 20 20 20 74 65 73 74 63 61 73 65 28 20 28 70 53     testcase( (pS
194b0 75 62 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ub1->selFlags & 
194c0 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f  (SF_Distinct|SF_
194d0 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f  Aggregate))==SF_
194e0 44 69 73 74 69 6e 63 74 20 29 3b 0a 20 20 20 20  Distinct );.    
194f0 20 20 74 65 73 74 63 61 73 65 28 20 28 70 53 75    testcase( (pSu
19500 62 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28  b1->selFlags & (
19510 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41  SF_Distinct|SF_A
19520 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 41  ggregate))==SF_A
19530 67 67 72 65 67 61 74 65 20 29 3b 0a 20 20 20 20  ggregate );.    
19540 20 20 61 73 73 65 72 74 28 20 70 53 75 62 2d 3e    assert( pSub->
19550 70 53 72 63 21 3d 30 20 29 3b 0a 20 20 20 20 20  pSrc!=0 );.     
19560 20 69 66 28 20 28 70 53 75 62 31 2d 3e 73 65 6c   if( (pSub1->sel
19570 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74  Flags & (SF_Dist
19580 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74  inct|SF_Aggregat
19590 65 29 29 21 3d 30 0a 20 20 20 20 20 20 20 7c 7c  e))!=0.       ||
195a0 20 28 70 53 75 62 31 2d 3e 70 50 72 69 6f 72 20   (pSub1->pPrior 
195b0 26 26 20 70 53 75 62 31 2d 3e 6f 70 21 3d 54 4b  && pSub1->op!=TK
195c0 5f 41 4c 4c 29 20 0a 20 20 20 20 20 20 20 7c 7c  _ALL) .       ||
195d0 20 70 53 75 62 31 2d 3e 70 53 72 63 2d 3e 6e 53   pSub1->pSrc->nS
195e0 72 63 3c 31 0a 20 20 20 20 20 20 20 7c 7c 20 70  rc<1.       || p
195f0 53 75 62 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  Sub->pEList->nEx
19600 70 72 21 3d 70 53 75 62 31 2d 3e 70 45 4c 69 73  pr!=pSub1->pELis
19610 74 2d 3e 6e 45 78 70 72 0a 20 20 20 20 20 20 29  t->nExpr.      )
19620 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
19630 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
19640 20 20 74 65 73 74 63 61 73 65 28 20 70 53 75 62    testcase( pSub
19650 31 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20  1->pSrc->nSrc>1 
19660 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
19670 20 52 65 73 74 72 69 63 74 69 6f 6e 20 31 38 2e   Restriction 18.
19680 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 70   */.    if( p->p
19690 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
196a0 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20 66   int ii;.      f
196b0 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 2d 3e 70  or(ii=0; ii<p->p
196c0 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20  OrderBy->nExpr; 
196d0 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69  ii++){.        i
196e0 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e  f( p->pOrderBy->
196f0 61 5b 69 69 5d 2e 69 4f 72 64 65 72 42 79 43 6f  a[ii].iOrderByCo
19700 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  l==0 ) return 0;
19710 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
19720 20 7d 0a 0a 20 20 2f 2a 2a 2a 2a 2a 20 49 66 20   }..  /***** If 
19730 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f  we reach this po
19740 69 6e 74 2c 20 66 6c 61 74 74 65 6e 69 6e 67 20  int, flattening 
19750 69 73 20 70 65 72 6d 69 74 74 65 64 2e 20 2a 2a  is permitted. **
19760 2a 2a 2a 2f 0a 0a 20 20 2f 2a 20 41 75 74 68 6f  ***/..  /* Autho
19770 72 69 7a 65 20 74 68 65 20 73 75 62 71 75 65 72  rize the subquer
19780 79 20 2a 2f 0a 20 20 70 50 61 72 73 65 2d 3e 7a  y */.  pParse->z
19790 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70 53  AuthContext = pS
197a0 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20  ubitem->zName;. 
197b0 20 54 45 53 54 4f 4e 4c 59 28 69 20 3d 29 20 73   TESTONLY(i =) s
197c0 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
197d0 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 53  pParse, SQLITE_S
197e0 45 4c 45 43 54 2c 20 30 2c 20 30 2c 20 30 29 3b  ELECT, 0, 0, 0);
197f0 0a 20 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d  .  testcase( i==
19800 53 51 4c 49 54 45 5f 44 45 4e 59 20 29 3b 0a 20  SQLITE_DENY );. 
19810 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f   pParse->zAuthCo
19820 6e 74 65 78 74 20 3d 20 7a 53 61 76 65 64 41 75  ntext = zSavedAu
19830 74 68 43 6f 6e 74 65 78 74 3b 0a 0a 20 20 2f 2a  thContext;..  /*
19840 20 49 66 20 74 68 65 20 73 75 62 2d 71 75 65 72   If the sub-quer
19850 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20  y is a compound 
19860 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
19870 2c 20 74 68 65 6e 20 28 62 79 20 72 65 73 74 72  , then (by restr
19880 69 63 74 69 6f 6e 73 0a 20 20 2a 2a 20 31 37 20  ictions.  ** 17 
19890 61 6e 64 20 31 38 20 61 62 6f 76 65 29 20 69 74  and 18 above) it
198a0 20 6d 75 73 74 20 62 65 20 61 20 55 4e 49 4f 4e   must be a UNION
198b0 20 41 4c 4c 20 61 6e 64 20 74 68 65 20 70 61 72   ALL and the par
198c0 65 6e 74 20 71 75 65 72 79 20 6d 75 73 74 20 0a  ent query must .
198d0 20 20 2a 2a 20 62 65 20 6f 66 20 74 68 65 20 66    ** be of the f
198e0 6f 72 6d 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  orm:.  **.  **  
198f0 20 20 20 53 45 4c 45 43 54 20 3c 65 78 70 72 2d     SELECT <expr-
19900 6c 69 73 74 3e 20 46 52 4f 4d 20 28 3c 73 75 62  list> FROM (<sub
19910 2d 71 75 65 72 79 3e 29 20 3c 77 68 65 72 65 2d  -query>) <where-
19920 63 6c 61 75 73 65 3e 20 0a 20 20 2a 2a 0a 20 20  clause> .  **.  
19930 2a 2a 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61  ** followed by a
19940 6e 79 20 4f 52 44 45 52 20 42 59 2c 20 4c 49 4d  ny ORDER BY, LIM
19950 49 54 20 61 6e 64 2f 6f 72 20 4f 46 46 53 45 54  IT and/or OFFSET
19960 20 63 6c 61 75 73 65 73 2e 20 54 68 69 73 20 62   clauses. This b
19970 6c 6f 63 6b 0a 20 20 2a 2a 20 63 72 65 61 74 65  lock.  ** create
19980 73 20 4e 2d 31 20 63 6f 70 69 65 73 20 6f 66 20  s N-1 copies of 
19990 74 68 65 20 70 61 72 65 6e 74 20 71 75 65 72 79  the parent query
199a0 20 77 69 74 68 6f 75 74 20 61 6e 79 20 4f 52 44   without any ORD
199b0 45 52 20 42 59 2c 20 4c 49 4d 49 54 20 6f 72 20  ER BY, LIMIT or 
199c0 0a 20 20 2a 2a 20 4f 46 46 53 45 54 20 63 6c 61  .  ** OFFSET cla
199d0 75 73 65 73 20 61 6e 64 20 6a 6f 69 6e 73 20 74  uses and joins t
199e0 68 65 6d 20 74 6f 20 74 68 65 20 6c 65 66 74 2d  hem to the left-
199f0 68 61 6e 64 2d 73 69 64 65 20 6f 66 20 74 68 65  hand-side of the
19a00 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 75   original.  ** u
19a10 73 69 6e 67 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f  sing UNION ALL o
19a20 70 65 72 61 74 6f 72 73 2e 20 49 6e 20 74 68 69  perators. In thi
19a30 73 20 63 61 73 65 20 4e 20 69 73 20 74 68 65 20  s case N is the 
19a40 6e 75 6d 62 65 72 20 6f 66 20 73 69 6d 70 6c 65  number of simple
19a50 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20 73 74 61  .  ** select sta
19a60 74 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 63  tements in the c
19a70 6f 6d 70 6f 75 6e 64 20 73 75 62 2d 71 75 65 72  ompound sub-quer
19a80 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 61  y..  **.  ** Exa
19a90 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  mple:.  **.  ** 
19aa0 20 20 20 20 53 45 4c 45 43 54 20 61 2b 31 20 46      SELECT a+1 F
19ab0 52 4f 4d 20 28 0a 20 20 2a 2a 20 20 20 20 20 20  ROM (.  **      
19ac0 20 20 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20    SELECT x FROM 
19ad0 74 61 62 0a 20 20 2a 2a 20 20 20 20 20 20 20 20  tab.  **        
19ae0 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20  UNION ALL.  **  
19af0 20 20 20 20 20 20 53 45 4c 45 43 54 20 79 20 46        SELECT y F
19b00 52 4f 4d 20 74 61 62 0a 20 20 2a 2a 20 20 20 20  ROM tab.  **    
19b10 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20      UNION ALL.  
19b20 2a 2a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54  **        SELECT
19b30 20 61 62 73 28 7a 2a 32 29 20 46 52 4f 4d 20 74   abs(z*2) FROM t
19b40 61 62 32 0a 20 20 2a 2a 20 20 20 20 20 29 20 57  ab2.  **     ) W
19b50 48 45 52 45 20 61 21 3d 35 20 4f 52 44 45 52 20  HERE a!=5 ORDER 
19b60 42 59 20 31 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  BY 1.  **.  ** T
19b70 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f 3a  ransformed into:
19b80 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53  .  **.  **     S
19b90 45 4c 45 43 54 20 78 2b 31 20 46 52 4f 4d 20 74  ELECT x+1 FROM t
19ba0 61 62 20 57 48 45 52 45 20 78 2b 31 21 3d 35 0a  ab WHERE x+1!=5.
19bb0 20 20 2a 2a 20 20 20 20 20 55 4e 49 4f 4e 20 41    **     UNION A
19bc0 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45  LL.  **     SELE
19bd0 43 54 20 79 2b 31 20 46 52 4f 4d 20 74 61 62 20  CT y+1 FROM tab 
19be0 57 48 45 52 45 20 79 2b 31 21 3d 35 0a 20 20 2a  WHERE y+1!=5.  *
19bf0 2a 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a  *     UNION ALL.
19c00 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20    **     SELECT 
19c10 61 62 73 28 7a 2a 32 29 2b 31 20 46 52 4f 4d 20  abs(z*2)+1 FROM 
19c20 74 61 62 32 20 57 48 45 52 45 20 61 62 73 28 7a  tab2 WHERE abs(z
19c30 2a 32 29 2b 31 21 3d 35 0a 20 20 2a 2a 20 20 20  *2)+1!=5.  **   
19c40 20 20 4f 52 44 45 52 20 42 59 20 31 0a 20 20 2a    ORDER BY 1.  *
19c50 2a 0a 20 20 2a 2a 20 57 65 20 63 61 6c 6c 20 74  *.  ** We call t
19c60 68 69 73 20 74 68 65 20 22 63 6f 6d 70 6f 75 6e  his the "compoun
19c70 64 2d 73 75 62 71 75 65 72 79 20 66 6c 61 74 74  d-subquery flatt
19c80 65 6e 69 6e 67 22 2e 0a 20 20 2a 2f 0a 20 20 66  ening"..  */.  f
19c90 6f 72 28 70 53 75 62 3d 70 53 75 62 2d 3e 70 50  or(pSub=pSub->pP
19ca0 72 69 6f 72 3b 20 70 53 75 62 3b 20 70 53 75 62  rior; pSub; pSub
19cb0 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72 29 7b 0a  =pSub->pPrior){.
19cc0 20 20 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 77      Select *pNew
19cd0 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a  ;.    ExprList *
19ce0 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f  pOrderBy = p->pO
19cf0 72 64 65 72 42 79 3b 0a 20 20 20 20 45 78 70 72  rderBy;.    Expr
19d00 20 2a 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c   *pLimit = p->pL
19d10 69 6d 69 74 3b 0a 20 20 20 20 45 78 70 72 20 2a  imit;.    Expr *
19d20 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66  pOffset = p->pOf
19d30 66 73 65 74 3b 0a 20 20 20 20 53 65 6c 65 63 74  fset;.    Select
19d40 20 2a 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50   *pPrior = p->pP
19d50 72 69 6f 72 3b 0a 20 20 20 20 70 2d 3e 70 4f 72  rior;.    p->pOr
19d60 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 70  derBy = 0;.    p
19d70 2d 3e 70 53 72 63 20 3d 20 30 3b 0a 20 20 20 20  ->pSrc = 0;.    
19d80 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20  p->pPrior = 0;. 
19d90 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30     p->pLimit = 0
19da0 3b 0a 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74  ;.    p->pOffset
19db0 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 20 3d   = 0;.    pNew =
19dc0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75   sqlite3SelectDu
19dd0 70 28 64 62 2c 20 70 2c 20 30 29 3b 0a 20 20 20  p(db, p, 0);.   
19de0 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f   p->pOffset = pO
19df0 66 66 73 65 74 3b 0a 20 20 20 20 70 2d 3e 70 4c  ffset;.    p->pL
19e00 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20  imit = pLimit;. 
19e10 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d     p->pOrderBy =
19e20 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 70   pOrderBy;.    p
19e30 2d 3e 70 53 72 63 20 3d 20 70 53 72 63 3b 0a 20  ->pSrc = pSrc;. 
19e40 20 20 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f 41 4c     p->op = TK_AL
19e50 4c 3b 0a 20 20 20 20 70 2d 3e 70 52 69 67 68 74  L;.    p->pRight
19e60 6d 6f 73 74 20 3d 20 30 3b 0a 20 20 20 20 69 66  most = 0;.    if
19e70 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20  ( pNew==0 ){.   
19e80 20 20 20 70 4e 65 77 20 3d 20 70 50 72 69 6f 72     pNew = pPrior
19e90 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
19ea0 20 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72 20     pNew->pPrior 
19eb0 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20  = pPrior;.      
19ec0 70 4e 65 77 2d 3e 70 52 69 67 68 74 6d 6f 73 74  pNew->pRightmost
19ed0 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
19ee0 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 4e 65 77  p->pPrior = pNew
19ef0 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61  ;.    if( db->ma
19f00 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74  llocFailed ) ret
19f10 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  urn 1;.  }..  /*
19f20 20 42 65 67 69 6e 20 66 6c 61 74 74 65 6e 69 6e   Begin flattenin
19f30 67 20 74 68 65 20 69 46 72 6f 6d 2d 74 68 20 65  g the iFrom-th e
19f40 6e 74 72 79 20 6f 66 20 74 68 65 20 46 52 4f 4d  ntry of the FROM
19f50 20 63 6c 61 75 73 65 20 0a 20 20 2a 2a 20 69 6e   clause .  ** in
19f60 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
19f70 2e 0a 20 20 2a 2f 0a 20 20 70 53 75 62 20 3d 20  ..  */.  pSub = 
19f80 70 53 75 62 31 20 3d 20 70 53 75 62 69 74 65 6d  pSub1 = pSubitem
19f90 2d 3e 70 53 65 6c 65 63 74 3b 0a 0a 20 20 2f 2a  ->pSelect;..  /*
19fa0 20 44 65 6c 65 74 65 20 74 68 65 20 74 72 61 6e   Delete the tran
19fb0 73 69 65 6e 74 20 74 61 62 6c 65 20 73 74 72 75  sient table stru
19fc0 63 74 75 72 65 20 61 73 73 6f 63 69 61 74 65 64  cture associated
19fd0 20 77 69 74 68 20 74 68 65 0a 20 20 2a 2a 20 73   with the.  ** s
19fe0 75 62 71 75 65 72 79 0a 20 20 2a 2f 0a 20 20 73  ubquery.  */.  s
19ff0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
1a000 20 70 53 75 62 69 74 65 6d 2d 3e 7a 44 61 74 61   pSubitem->zData
1a010 62 61 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  base);.  sqlite3
1a020 44 62 46 72 65 65 28 64 62 2c 20 70 53 75 62 69  DbFree(db, pSubi
1a030 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 73  tem->zName);.  s
1a040 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
1a050 20 70 53 75 62 69 74 65 6d 2d 3e 7a 41 6c 69 61   pSubitem->zAlia
1a060 73 29 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e  s);.  pSubitem->
1a070 7a 44 61 74 61 62 61 73 65 20 3d 20 30 3b 0a 20  zDatabase = 0;. 
1a080 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65   pSubitem->zName
1a090 20 3d 20 30 3b 0a 20 20 70 53 75 62 69 74 65 6d   = 0;.  pSubitem
1a0a0 2d 3e 7a 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20  ->zAlias = 0;.  
1a0b0 70 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63  pSubitem->pSelec
1a0c0 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 44 65 66  t = 0;..  /* Def
1a0d0 65 72 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20  er deleting the 
1a0e0 54 61 62 6c 65 20 6f 62 6a 65 63 74 20 61 73 73  Table object ass
1a0f0 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
1a100 0a 20 20 2a 2a 20 73 75 62 71 75 65 72 79 20 75  .  ** subquery u
1a110 6e 74 69 6c 20 63 6f 64 65 20 67 65 6e 65 72 61  ntil code genera
1a120 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 63 6f 6d  tion is.  ** com
1a130 70 6c 65 74 65 2c 20 73 69 6e 63 65 20 74 68 65  plete, since the
1a140 72 65 20 6d 61 79 20 73 74 69 6c 6c 20 65 78 69  re may still exi
1a150 73 74 20 45 78 70 72 2e 70 54 61 62 20 65 6e 74  st Expr.pTab ent
1a160 72 69 65 73 20 74 68 61 74 0a 20 20 2a 2a 20 72  ries that.  ** r
1a170 65 66 65 72 20 74 6f 20 74 68 65 20 73 75 62 71  efer to the subq
1a180 75 65 72 79 20 65 76 65 6e 20 61 66 74 65 72 20  uery even after 
1a190 66 6c 61 74 74 65 6e 69 6e 67 2e 20 20 54 69 63  flattening.  Tic
1a1a0 6b 65 74 20 23 33 33 34 36 2e 0a 20 20 2a 2a 0a  ket #3346..  **.
1a1b0 20 20 2a 2a 20 70 53 75 62 69 74 65 6d 2d 3e 70    ** pSubitem->p
1a1c0 54 61 62 20 69 73 20 61 6c 77 61 79 73 20 6e 6f  Tab is always no
1a1d0 6e 2d 4e 55 4c 4c 20 62 79 20 74 65 73 74 20 72  n-NULL by test r
1a1e0 65 73 74 72 69 63 74 69 6f 6e 73 20 61 6e 64 20  estrictions and 
1a1f0 74 65 73 74 73 20 61 62 6f 76 65 2e 0a 20 20 2a  tests above..  *
1a200 2f 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70  /.  if( ALWAYS(p
1a210 53 75 62 69 74 65 6d 2d 3e 70 54 61 62 21 3d 30  Subitem->pTab!=0
1a220 29 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  ) ){.    Table *
1a230 70 54 61 62 54 6f 44 65 6c 20 3d 20 70 53 75 62  pTabToDel = pSub
1a240 69 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20  item->pTab;.    
1a250 69 66 28 20 70 54 61 62 54 6f 44 65 6c 2d 3e 6e  if( pTabToDel->n
1a260 52 65 66 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  Ref==1 ){.      
1a270 50 61 72 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c  Parse *pToplevel
1a280 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65 54   = sqlite3ParseT
1a290 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 65 29 3b  oplevel(pParse);
1a2a0 0a 20 20 20 20 20 20 70 54 61 62 54 6f 44 65 6c  .      pTabToDel
1a2b0 2d 3e 70 4e 65 78 74 5a 6f 6d 62 69 65 20 3d 20  ->pNextZombie = 
1a2c0 70 54 6f 70 6c 65 76 65 6c 2d 3e 70 5a 6f 6d 62  pToplevel->pZomb
1a2d0 69 65 54 61 62 3b 0a 20 20 20 20 20 20 70 54 6f  ieTab;.      pTo
1a2e0 70 6c 65 76 65 6c 2d 3e 70 5a 6f 6d 62 69 65 54  plevel->pZombieT
1a2f0 61 62 20 3d 20 70 54 61 62 54 6f 44 65 6c 3b 0a  ab = pTabToDel;.
1a300 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1a310 20 70 54 61 62 54 6f 44 65 6c 2d 3e 6e 52 65 66   pTabToDel->nRef
1a320 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53  --;.    }.    pS
1a330 75 62 69 74 65 6d 2d 3e 70 54 61 62 20 3d 20 30  ubitem->pTab = 0
1a340 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  ;.  }..  /* The 
1a350 66 6f 6c 6c 6f 77 69 6e 67 20 6c 6f 6f 70 20 72  following loop r
1a360 75 6e 73 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  uns once for eac
1a370 68 20 74 65 72 6d 20 69 6e 20 61 20 63 6f 6d 70  h term in a comp
1a380 6f 75 6e 64 2d 73 75 62 71 75 65 72 79 0a 20 20  ound-subquery.  
1a390 2a 2a 20 66 6c 61 74 74 65 6e 69 6e 67 20 28 61  ** flattening (a
1a3a0 73 20 64 65 73 63 72 69 62 65 64 20 61 62 6f 76  s described abov
1a3b0 65 29 2e 20 20 49 66 20 77 65 20 61 72 65 20 64  e).  If we are d
1a3c0 6f 69 6e 67 20 61 20 64 69 66 66 65 72 65 6e 74  oing a different
1a3d0 20 6b 69 6e 64 0a 20 20 2a 2a 20 6f 66 20 66 6c   kind.  ** of fl
1a3e0 61 74 74 65 6e 69 6e 67 20 2d 20 61 20 66 6c 61  attening - a fla
1a3f0 74 74 65 6e 69 6e 67 20 6f 74 68 65 72 20 74 68  ttening other th
1a400 61 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 2d 73 75  an a compound-su
1a410 62 71 75 65 72 79 20 66 6c 61 74 74 65 6e 69 6e  bquery flattenin
1a420 67 20 2d 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68  g -.  ** then th
1a430 69 73 20 6c 6f 6f 70 20 6f 6e 6c 79 20 72 75 6e  is loop only run
1a440 73 20 6f 6e 63 65 2e 0a 20 20 2a 2a 0a 20 20 2a  s once..  **.  *
1a450 2a 20 54 68 69 73 20 6c 6f 6f 70 20 6d 6f 76 65  * This loop move
1a460 73 20 61 6c 6c 20 6f 66 20 74 68 65 20 46 52 4f  s all of the FRO
1a470 4d 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68  M elements of th
1a480 65 20 73 75 62 71 75 65 72 79 20 69 6e 74 6f 20  e subquery into 
1a490 74 68 65 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f  the.  ** the FRO
1a4a0 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
1a4b0 6f 75 74 65 72 20 71 75 65 72 79 2e 20 20 42 65  outer query.  Be
1a4c0 66 6f 72 65 20 64 6f 69 6e 67 20 74 68 69 73 2c  fore doing this,
1a4d0 20 72 65 6d 65 6d 62 65 72 0a 20 20 2a 2a 20 74   remember.  ** t
1a4e0 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  he cursor number
1a4f0 20 66 6f 72 20 74 68 65 20 6f 72 69 67 69 6e 61   for the origina
1a500 6c 20 6f 75 74 65 72 20 71 75 65 72 79 20 46 52  l outer query FR
1a510 4f 4d 20 65 6c 65 6d 65 6e 74 20 69 6e 0a 20 20  OM element in.  
1a520 2a 2a 20 69 50 61 72 65 6e 74 2e 20 20 54 68 65  ** iParent.  The
1a530 20 69 50 61 72 65 6e 74 20 63 75 72 73 6f 72 20   iParent cursor 
1a540 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 75 73  will never be us
1a550 65 64 2e 20 20 53 75 62 73 65 71 75 65 6e 74 20  ed.  Subsequent 
1a560 63 6f 64 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 73  code.  ** will s
1a570 63 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 73 20  can expressions 
1a580 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 69 50 61 72  looking for iPar
1a590 65 6e 74 20 72 65 66 65 72 65 6e 63 65 73 20 61  ent references a
1a5a0 6e 64 20 72 65 70 6c 61 63 65 0a 20 20 2a 2a 20  nd replace.  ** 
1a5b0 74 68 6f 73 65 20 72 65 66 65 72 65 6e 63 65 73  those references
1a5c0 20 77 69 74 68 20 65 78 70 72 65 73 73 69 6f 6e   with expression
1a5d0 73 20 74 68 61 74 20 72 65 73 6f 6c 76 65 20 74  s that resolve t
1a5e0 6f 20 74 68 65 20 73 75 62 71 75 65 72 79 20 46  o the subquery F
1a5f0 52 4f 4d 0a 20 20 2a 2a 20 65 6c 65 6d 65 6e 74  ROM.  ** element
1a600 73 20 77 65 20 61 72 65 20 6e 6f 77 20 63 6f 70  s we are now cop
1a610 79 69 6e 67 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20  ying in..  */.  
1a620 66 6f 72 28 70 50 61 72 65 6e 74 3d 70 3b 20 70  for(pParent=p; p
1a630 50 61 72 65 6e 74 3b 20 70 50 61 72 65 6e 74 3d  Parent; pParent=
1a640 70 50 61 72 65 6e 74 2d 3e 70 50 72 69 6f 72 2c  pParent->pPrior,
1a650 20 70 53 75 62 3d 70 53 75 62 2d 3e 70 50 72 69   pSub=pSub->pPri
1a660 6f 72 29 7b 0a 20 20 20 20 69 6e 74 20 6e 53 75  or){.    int nSu
1a670 62 53 72 63 3b 0a 20 20 20 20 75 38 20 6a 6f 69  bSrc;.    u8 joi
1a680 6e 74 79 70 65 20 3d 20 30 3b 0a 20 20 20 20 70  ntype = 0;.    p
1a690 53 75 62 53 72 63 20 3d 20 70 53 75 62 2d 3e 70  SubSrc = pSub->p
1a6a0 53 72 63 3b 20 20 20 20 20 2f 2a 20 46 52 4f 4d  Src;     /* FROM
1a6b0 20 63 6c 61 75 73 65 20 6f 66 20 73 75 62 71 75   clause of subqu
1a6c0 65 72 79 20 2a 2f 0a 20 20 20 20 6e 53 75 62 53  ery */.    nSubS
1a6d0 72 63 20 3d 20 70 53 75 62 53 72 63 2d 3e 6e 53  rc = pSubSrc->nS
1a6e0 72 63 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f  rc;  /* Number o
1a6f0 66 20 74 65 72 6d 73 20 69 6e 20 73 75 62 71 75  f terms in subqu
1a700 65 72 79 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  ery FROM clause 
1a710 2a 2f 0a 20 20 20 20 70 53 72 63 20 3d 20 70 50  */.    pSrc = pP
1a720 61 72 65 6e 74 2d 3e 70 53 72 63 3b 20 20 20 20  arent->pSrc;    
1a730 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20   /* FROM clause 
1a740 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  of the outer que
1a750 72 79 20 2a 2f 0a 0a 20 20 20 20 69 66 28 20 70  ry */..    if( p
1a760 53 72 63 20 29 7b 0a 20 20 20 20 20 20 61 73 73  Src ){.      ass
1a770 65 72 74 28 20 70 50 61 72 65 6e 74 3d 3d 70 20  ert( pParent==p 
1a780 29 3b 20 20 2f 2a 20 46 69 72 73 74 20 74 69 6d  );  /* First tim
1a790 65 20 74 68 72 6f 75 67 68 20 74 68 65 20 6c 6f  e through the lo
1a7a0 6f 70 20 2a 2f 0a 20 20 20 20 20 20 6a 6f 69 6e  op */.      join
1a7b0 74 79 70 65 20 3d 20 70 53 75 62 69 74 65 6d 2d  type = pSubitem-
1a7c0 3e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20 7d  >jointype;.    }
1a7d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
1a7e0 72 74 28 20 70 50 61 72 65 6e 74 21 3d 70 20 29  rt( pParent!=p )
1a7f0 3b 20 20 2f 2a 20 32 6e 64 20 61 6e 64 20 73 75  ;  /* 2nd and su
1a800 62 73 65 71 75 65 6e 74 20 74 69 6d 65 73 20 74  bsequent times t
1a810 68 72 6f 75 67 68 20 74 68 65 20 6c 6f 6f 70 20  hrough the loop 
1a820 2a 2f 0a 20 20 20 20 20 20 70 53 72 63 20 3d 20  */.      pSrc = 
1a830 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 20 3d 20  pParent->pSrc = 
1a840 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70  sqlite3SrcListAp
1a850 70 65 6e 64 28 64 62 2c 20 30 2c 20 30 2c 20 30  pend(db, 0, 0, 0
1a860 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 72  );.      if( pSr
1a870 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  c==0 ){.        
1a880 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c  assert( db->mall
1a890 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
1a8a0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1a8b0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
1a8c0 20 54 68 65 20 73 75 62 71 75 65 72 79 20 75 73   The subquery us
1a8d0 65 73 20 61 20 73 69 6e 67 6c 65 20 73 6c 6f 74  es a single slot
1a8e0 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   of the FROM cla
1a8f0 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72  use of the outer
1a900 0a 20 20 20 20 2a 2a 20 71 75 65 72 79 2e 20 20  .    ** query.  
1a910 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  If the subquery 
1a920 68 61 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  has more than on
1a930 65 20 65 6c 65 6d 65 6e 74 20 69 6e 20 69 74 73  e element in its
1a940 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c 0a 20 20   FROM clause,.  
1a950 20 20 2a 2a 20 74 68 65 6e 20 65 78 70 61 6e 64    ** then expand
1a960 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1a970 20 74 6f 20 6d 61 6b 65 20 73 70 61 63 65 20 66   to make space f
1a980 6f 72 20 69 74 20 74 6f 20 68 6f 6c 64 20 61 6c  or it to hold al
1a990 6c 20 65 6c 65 6d 65 6e 74 73 0a 20 20 20 20 2a  l elements.    *
1a9a0 2a 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72  * of the subquer
1a9b0 79 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  y..    **.    **
1a9c0 20 45 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a   Example:.    **
1a9d0 0a 20 20 20 20 2a 2a 20 20 20 20 53 45 4c 45 43  .    **    SELEC
1a9e0 54 20 2a 20 46 52 4f 4d 20 74 61 62 41 2c 20 28  T * FROM tabA, (
1a9f0 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73 75  SELECT * FROM su
1aa00 62 31 2c 20 73 75 62 32 29 2c 20 74 61 62 42 3b  b1, sub2), tabB;
1aa10 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
1aa20 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 68  he outer query h
1aa30 61 73 20 33 20 73 6c 6f 74 73 20 69 6e 20 69 74  as 3 slots in it
1aa40 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20  s FROM clause.  
1aa50 4f 6e 65 20 73 6c 6f 74 20 6f 66 20 74 68 65 0a  One slot of the.
1aa60 20 20 20 20 2a 2a 20 6f 75 74 65 72 20 71 75 65      ** outer que
1aa70 72 79 20 28 74 68 65 20 6d 69 64 64 6c 65 20 73  ry (the middle s
1aa80 6c 6f 74 29 20 69 73 20 75 73 65 64 20 62 79 20  lot) is used by 
1aa90 74 68 65 20 73 75 62 71 75 65 72 79 2e 20 20 54  the subquery.  T
1aaa0 68 65 20 6e 65 78 74 0a 20 20 20 20 2a 2a 20 62  he next.    ** b
1aab0 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 77 69 6c  lock of code wil
1aac0 6c 20 65 78 70 61 6e 64 20 74 68 65 20 6f 75 74  l expand the out
1aad0 20 71 75 65 72 79 20 74 6f 20 34 20 73 6c 6f 74   query to 4 slot
1aae0 73 2e 20 20 54 68 65 20 6d 69 64 64 6c 65 0a 20  s.  The middle. 
1aaf0 20 20 20 2a 2a 20 73 6c 6f 74 20 69 73 20 65 78     ** slot is ex
1ab00 70 61 6e 64 65 64 20 74 6f 20 74 77 6f 20 73 6c  panded to two sl
1ab10 6f 74 73 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ots in order to 
1ab20 6d 61 6b 65 20 73 70 61 63 65 20 66 6f 72 20 74  make space for t
1ab30 68 65 0a 20 20 20 20 2a 2a 20 74 77 6f 20 65 6c  he.    ** two el
1ab40 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 46 52  ements in the FR
1ab50 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
1ab60 20 73 75 62 71 75 65 72 79 2e 0a 20 20 20 20 2a   subquery..    *
1ab70 2f 0a 20 20 20 20 69 66 28 20 6e 53 75 62 53 72  /.    if( nSubSr
1ab80 63 3e 31 20 29 7b 0a 20 20 20 20 20 20 70 50 61  c>1 ){.      pPa
1ab90 72 65 6e 74 2d 3e 70 53 72 63 20 3d 20 70 53 72  rent->pSrc = pSr
1aba0 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69  c = sqlite3SrcLi
1abb0 73 74 45 6e 6c 61 72 67 65 28 64 62 2c 20 70 53  stEnlarge(db, pS
1abc0 72 63 2c 20 6e 53 75 62 53 72 63 2d 31 2c 69 46  rc, nSubSrc-1,iF
1abd0 72 6f 6d 2b 31 29 3b 0a 20 20 20 20 20 20 69 66  rom+1);.      if
1abe0 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
1abf0 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72  ed ){.        br
1ac00 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
1ac10 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 72 61 6e 73   }..    /* Trans
1ac20 66 65 72 20 74 68 65 20 46 52 4f 4d 20 63 6c 61  fer the FROM cla
1ac30 75 73 65 20 74 65 72 6d 73 20 66 72 6f 6d 20 74  use terms from t
1ac40 68 65 20 73 75 62 71 75 65 72 79 20 69 6e 74 6f  he subquery into
1ac50 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65   the.    ** oute
1ac60 72 20 71 75 65 72 79 2e 0a 20 20 20 20 2a 2f 0a  r query..    */.
1ac70 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
1ac80 53 75 62 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20  SubSrc; i++){.  
1ac90 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73      sqlite3IdLis
1aca0 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 72 63  tDelete(db, pSrc
1acb0 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 2e 70 55 73  ->a[i+iFrom].pUs
1acc0 69 6e 67 29 3b 0a 20 20 20 20 20 20 70 53 72 63  ing);.      pSrc
1acd0 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 20 3d 20 70  ->a[i+iFrom] = p
1ace0 53 75 62 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20  SubSrc->a[i];.  
1acf0 20 20 20 20 6d 65 6d 73 65 74 28 26 70 53 75 62      memset(&pSub
1ad00 53 72 63 2d 3e 61 5b 69 5d 2c 20 30 2c 20 73 69  Src->a[i], 0, si
1ad10 7a 65 6f 66 28 70 53 75 62 53 72 63 2d 3e 61 5b  zeof(pSubSrc->a[
1ad20 69 5d 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  i]));.    }.    
1ad30 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 6a  pSrc->a[iFrom].j
1ad40 6f 69 6e 74 79 70 65 20 3d 20 6a 6f 69 6e 74 79  ointype = jointy
1ad50 70 65 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 4e 6f  pe;.  .    /* No
1ad60 77 20 62 65 67 69 6e 20 73 75 62 73 74 69 74 75  w begin substitu
1ad70 74 69 6e 67 20 73 75 62 71 75 65 72 79 20 72 65  ting subquery re
1ad80 73 75 6c 74 20 73 65 74 20 65 78 70 72 65 73 73  sult set express
1ad90 69 6f 6e 73 20 66 6f 72 20 0a 20 20 20 20 2a 2a  ions for .    **
1ada0 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
1adb0 68 65 20 69 50 61 72 65 6e 74 20 69 6e 20 74 68  he iParent in th
1adc0 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20  e outer query.. 
1add0 20 20 20 2a 2a 20 0a 20 20 20 20 2a 2a 20 45 78     ** .    ** Ex
1ade0 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20  ample:.    **.  
1adf0 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 61 2b    **   SELECT a+
1ae00 35 2c 20 62 2a 31 30 20 46 52 4f 4d 20 28 53 45  5, b*10 FROM (SE
1ae10 4c 45 43 54 20 78 2a 33 20 41 53 20 61 2c 20 79  LECT x*3 AS a, y
1ae20 2b 31 30 20 41 53 20 62 20 46 52 4f 4d 20 74 31  +10 AS b FROM t1
1ae30 29 20 57 48 45 52 45 20 61 3e 62 3b 0a 20 20 20  ) WHERE a>b;.   
1ae40 20 2a 2a 20 20 20 5c 20 20 20 20 20 20 20 20 20   **   \         
1ae50 20 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f              \___
1ae60 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 73 75 62 71 75  __________ subqu
1ae70 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20  ery __________/ 
1ae80 20 20 20 20 20 20 20 20 20 2f 0a 20 20 20 20 2a           /.    *
1ae90 2a 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  *    \__________
1aea0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65  ___________ oute
1aeb0 72 20 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f  r query ________
1aec0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
1aed0 5f 5f 5f 5f 5f 5f 2f 0a 20 20 20 20 2a 2a 0a 20  ______/.    **. 
1aee0 20 20 20 2a 2a 20 57 65 20 6c 6f 6f 6b 20 61 74     ** We look at
1aef0 20 65 76 65 72 79 20 65 78 70 72 65 73 73 69 6f   every expressio
1af00 6e 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71  n in the outer q
1af10 75 65 72 79 20 61 6e 64 20 65 76 65 72 79 20 70  uery and every p
1af20 6c 61 63 65 20 77 65 20 73 65 65 0a 20 20 20 20  lace we see.    
1af30 2a 2a 20 22 61 22 20 77 65 20 73 75 62 73 74 69  ** "a" we substi
1af40 74 75 74 65 20 22 78 2a 33 22 20 61 6e 64 20 65  tute "x*3" and e
1af50 76 65 72 79 20 70 6c 61 63 65 20 77 65 20 73 65  very place we se
1af60 65 20 22 62 22 20 77 65 20 73 75 62 73 74 69 74  e "b" we substit
1af70 75 74 65 20 22 79 2b 31 30 22 2e 0a 20 20 20 20  ute "y+10"..    
1af80 2a 2f 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70  */.    pList = p
1af90 50 61 72 65 6e 74 2d 3e 70 45 4c 69 73 74 3b 0a  Parent->pEList;.
1afa0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
1afb0 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
1afc0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 69  ){.      if( pLi
1afd0 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3d 3d  st->a[i].zName==
1afe0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  0 ){.        cha
1aff0 72 20 2a 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  r *zName = sqlit
1b000 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70  e3DbStrDup(db, p
1b010 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e  List->a[i].zSpan
1b020 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
1b030 65 33 44 65 71 75 6f 74 65 28 7a 4e 61 6d 65 29  e3Dequote(zName)
1b040 3b 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74 2d  ;.        pList-
1b050 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 7a 4e  >a[i].zName = zN
1b060 61 6d 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ame;.      }.   
1b070 20 7d 0a 20 20 20 20 73 75 62 73 74 45 78 70 72   }.    substExpr
1b080 4c 69 73 74 28 64 62 2c 20 70 50 61 72 65 6e 74  List(db, pParent
1b090 2d 3e 70 45 4c 69 73 74 2c 20 69 50 61 72 65 6e  ->pEList, iParen
1b0a0 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29  t, pSub->pEList)
1b0b0 3b 0a 20 20 20 20 69 66 28 20 69 73 41 67 67 20  ;.    if( isAgg 
1b0c0 29 7b 0a 20 20 20 20 20 20 73 75 62 73 74 45 78  ){.      substEx
1b0d0 70 72 4c 69 73 74 28 64 62 2c 20 70 50 61 72 65  prList(db, pPare
1b0e0 6e 74 2d 3e 70 47 72 6f 75 70 42 79 2c 20 69 50  nt->pGroupBy, iP
1b0f0 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c  arent, pSub->pEL
1b100 69 73 74 29 3b 0a 20 20 20 20 20 20 70 50 61 72  ist);.      pPar
1b110 65 6e 74 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73  ent->pHaving = s
1b120 75 62 73 74 45 78 70 72 28 64 62 2c 20 70 50 61  ubstExpr(db, pPa
1b130 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 2c 20 69  rent->pHaving, i
1b140 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45  Parent, pSub->pE
1b150 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20  List);.    }.   
1b160 20 69 66 28 20 70 53 75 62 2d 3e 70 4f 72 64 65   if( pSub->pOrde
1b170 72 42 79 20 29 7b 0a 20 20 20 20 20 20 61 73 73  rBy ){.      ass
1b180 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 70 4f  ert( pParent->pO
1b190 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20 20  rderBy==0 );.   
1b1a0 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 4f 72 64     pParent->pOrd
1b1b0 65 72 42 79 20 3d 20 70 53 75 62 2d 3e 70 4f 72  erBy = pSub->pOr
1b1c0 64 65 72 42 79 3b 0a 20 20 20 20 20 20 70 53 75  derBy;.      pSu
1b1d0 62 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b  b->pOrderBy = 0;
1b1e0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
1b1f0 50 61 72 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79  Parent->pOrderBy
1b200 20 29 7b 0a 20 20 20 20 20 20 73 75 62 73 74 45   ){.      substE
1b210 78 70 72 4c 69 73 74 28 64 62 2c 20 70 50 61 72  xprList(db, pPar
1b220 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79 2c 20 69  ent->pOrderBy, i
1b230 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45  Parent, pSub->pE
1b240 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20  List);.    }.   
1b250 20 69 66 28 20 70 53 75 62 2d 3e 70 57 68 65 72   if( pSub->pWher
1b260 65 20 29 7b 0a 20 20 20 20 20 20 70 57 68 65 72  e ){.      pWher
1b270 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  e = sqlite3ExprD
1b280 75 70 28 64 62 2c 20 70 53 75 62 2d 3e 70 57 68  up(db, pSub->pWh
1b290 65 72 65 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c  ere, 0);.    }el
1b2a0 73 65 7b 0a 20 20 20 20 20 20 70 57 68 65 72 65  se{.      pWhere
1b2b0 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
1b2c0 69 66 28 20 73 75 62 71 75 65 72 79 49 73 41 67  if( subqueryIsAg
1b2d0 67 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  g ){.      asser
1b2e0 74 28 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76  t( pParent->pHav
1b2f0 69 6e 67 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ing==0 );.      
1b300 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67  pParent->pHaving
1b310 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65   = pParent->pWhe
1b320 72 65 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e  re;.      pParen
1b330 74 2d 3e 70 57 68 65 72 65 20 3d 20 70 57 68 65  t->pWhere = pWhe
1b340 72 65 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e  re;.      pParen
1b350 74 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 75 62  t->pHaving = sub
1b360 73 74 45 78 70 72 28 64 62 2c 20 70 50 61 72 65  stExpr(db, pPare
1b370 6e 74 2d 3e 70 48 61 76 69 6e 67 2c 20 69 50 61  nt->pHaving, iPa
1b380 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69  rent, pSub->pELi
1b390 73 74 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65  st);.      pPare
1b3a0 6e 74 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 71  nt->pHaving = sq
1b3b0 6c 69 74 65 33 45 78 70 72 41 6e 64 28 64 62 2c  lite3ExprAnd(db,
1b3c0 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e   pParent->pHavin
1b3d0 67 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  g, .            
1b3e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b3f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1b400 72 44 75 70 28 64 62 2c 20 70 53 75 62 2d 3e 70  rDup(db, pSub->p
1b410 48 61 76 69 6e 67 2c 20 30 29 29 3b 0a 20 20 20  Having, 0));.   
1b420 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65     assert( pPare
1b430 6e 74 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20  nt->pGroupBy==0 
1b440 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74  );.      pParent
1b450 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71 6c  ->pGroupBy = sql
1b460 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
1b470 64 62 2c 20 70 53 75 62 2d 3e 70 47 72 6f 75 70  db, pSub->pGroup
1b480 42 79 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73  By, 0);.    }els
1b490 65 7b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74  e{.      pParent
1b4a0 2d 3e 70 57 68 65 72 65 20 3d 20 73 75 62 73 74  ->pWhere = subst
1b4b0 45 78 70 72 28 64 62 2c 20 70 50 61 72 65 6e 74  Expr(db, pParent
1b4c0 2d 3e 70 57 68 65 72 65 2c 20 69 50 61 72 65 6e  ->pWhere, iParen
1b4d0 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29  t, pSub->pEList)
1b4e0 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d  ;.      pParent-
1b4f0 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65  >pWhere = sqlite
1b500 33 45 78 70 72 41 6e 64 28 64 62 2c 20 70 50 61  3ExprAnd(db, pPa
1b510 72 65 6e 74 2d 3e 70 57 68 65 72 65 2c 20 70 57  rent->pWhere, pW
1b520 68 65 72 65 29 3b 0a 20 20 20 20 7d 0a 20 20 0a  here);.    }.  .
1b530 20 20 20 20 2f 2a 20 54 68 65 20 66 6c 61 74 74      /* The flatt
1b540 65 6e 65 64 20 71 75 65 72 79 20 69 73 20 64 69  ened query is di
1b550 73 74 69 6e 63 74 20 69 66 20 65 69 74 68 65 72  stinct if either
1b560 20 74 68 65 20 69 6e 6e 65 72 20 6f 72 20 74 68   the inner or th
1b570 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72 20 71  e.    ** outer q
1b580 75 65 72 79 20 69 73 20 64 69 73 74 69 6e 63 74  uery is distinct
1b590 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50  . .    */.    pP
1b5a0 61 72 65 6e 74 2d 3e 73 65 6c 46 6c 61 67 73 20  arent->selFlags 
1b5b0 7c 3d 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67  |= pSub->selFlag
1b5c0 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 3b  s & SF_Distinct;
1b5d0 0a 20 20 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a  .  .    /*.    *
1b5e0 2a 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f  * SELECT ... FRO
1b5f0 4d 20 28 53 45 4c 45 43 54 20 2e 2e 2e 20 4c 49  M (SELECT ... LI
1b600 4d 49 54 20 61 20 4f 46 46 53 45 54 20 62 29 20  MIT a OFFSET b) 
1b610 4c 49 4d 49 54 20 78 20 4f 46 46 53 45 54 20 79  LIMIT x OFFSET y
1b620 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ;.    **.    ** 
1b630 4f 6e 65 20 69 73 20 74 65 6d 70 74 65 64 20 74  One is tempted t
1b640 6f 20 74 72 79 20 74 6f 20 61 64 64 20 61 20 61  o try to add a a
1b650 6e 64 20 62 20 74 6f 20 63 6f 6d 62 69 6e 65 20  nd b to combine 
1b660 74 68 65 20 6c 69 6d 69 74 73 2e 20 20 42 75 74  the limits.  But
1b670 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 64 6f 65   this.    ** doe
1b680 73 20 6e 6f 74 20 77 6f 72 6b 20 69 66 20 65 69  s not work if ei
1b690 74 68 65 72 20 6c 69 6d 69 74 20 69 73 20 6e 65  ther limit is ne
1b6a0 67 61 74 69 76 65 2e 0a 20 20 20 20 2a 2f 0a 20  gative..    */. 
1b6b0 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69     if( pSub->pLi
1b6c0 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 70 50 61  mit ){.      pPa
1b6d0 72 65 6e 74 2d 3e 70 4c 69 6d 69 74 20 3d 20 70  rent->pLimit = p
1b6e0 53 75 62 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20  Sub->pLimit;.   
1b6f0 20 20 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20     pSub->pLimit 
1b700 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  = 0;.    }.  }..
1b710 20 20 2f 2a 20 46 69 6e 69 61 6c 6c 79 2c 20 64    /* Finially, d
1b720 65 6c 65 74 65 20 77 68 61 74 20 69 73 20 6c 65  elete what is le
1b730 66 74 20 6f 66 20 74 68 65 20 73 75 62 71 75 65  ft of the subque
1b740 72 79 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20  ry and return.  
1b750 2a 2a 20 73 75 63 63 65 73 73 2e 0a 20 20 2a 2f  ** success..  */
1b760 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
1b770 44 65 6c 65 74 65 28 64 62 2c 20 70 53 75 62 31  Delete(db, pSub1
1b780 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a  );..  return 1;.
1b790 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  }.#endif /* !def
1b7a0 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
1b7b0 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64  _SUBQUERY) || !d
1b7c0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
1b7d0 49 54 5f 56 49 45 57 29 20 2a 2f 0a 0a 2f 2a 0a  IT_VIEW) */../*.
1b7e0 2a 2a 20 42 61 73 65 64 20 6f 6e 20 74 68 65 20  ** Based on the 
1b7f0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
1b800 41 67 67 49 6e 66 6f 20 73 74 72 75 63 74 75 72  AggInfo structur
1b810 65 20 69 6e 64 69 63 61 74 65 64 20 62 79 20 74  e indicated by t
1b820 68 65 20 66 69 72 73 74 0a 2a 2a 20 61 72 67 75  he first.** argu
1b830 6d 65 6e 74 2c 20 74 68 69 73 20 66 75 6e 63 74  ment, this funct
1b840 69 6f 6e 20 63 68 65 63 6b 73 20 69 66 20 74 68  ion checks if th
1b850 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20  e following are 
1b860 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a  true:.**.**    *
1b870 20 74 68 65 20 71 75 65 72 79 20 63 6f 6e 74 61   the query conta
1b880 69 6e 73 20 6a 75 73 74 20 61 20 73 69 6e 67 6c  ins just a singl
1b890 65 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  e aggregate func
1b8a0 74 69 6f 6e 2c 0a 2a 2a 20 20 20 20 2a 20 74 68  tion,.**    * th
1b8b0 65 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  e aggregate func
1b8c0 74 69 6f 6e 20 69 73 20 65 69 74 68 65 72 20 6d  tion is either m
1b8d0 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 2c 20 61  in() or max(), a
1b8e0 6e 64 0a 2a 2a 20 20 20 20 2a 20 74 68 65 20 61  nd.**    * the a
1b8f0 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 61  rgument to the a
1b900 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
1b910 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 76 61  n is a column va
1b920 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6c  lue..**.** If al
1b930 6c 20 6f 66 20 74 68 65 20 61 62 6f 76 65 20 61  l of the above a
1b940 72 65 20 74 72 75 65 2c 20 74 68 65 6e 20 57 48  re true, then WH
1b950 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 20  ERE_ORDERBY_MIN 
1b960 6f 72 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59  or WHERE_ORDERBY
1b970 5f 4d 41 58 0a 2a 2a 20 69 73 20 72 65 74 75 72  _MAX.** is retur
1b980 6e 65 64 20 61 73 20 61 70 70 72 6f 70 72 69 61  ned as appropria
1b990 74 65 2e 20 41 6c 73 6f 2c 20 2a 70 70 4d 69 6e  te. Also, *ppMin
1b9a0 4d 61 78 20 69 73 20 73 65 74 20 74 6f 20 70 6f  Max is set to po
1b9b0 69 6e 74 20 74 6f 20 74 68 65 20 0a 2a 2a 20 6c  int to the .** l
1b9c0 69 73 74 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ist of arguments
1b9d0 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 61   passed to the a
1b9e0 67 67 72 65 67 61 74 65 20 62 65 66 6f 72 65 20  ggregate before 
1b9f0 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a  returning..**.**
1ba00 20 4f 72 2c 20 69 66 20 74 68 65 20 63 6f 6e 64   Or, if the cond
1ba10 69 74 69 6f 6e 73 20 61 62 6f 76 65 20 61 72 65  itions above are
1ba20 20 6e 6f 74 20 6d 65 74 2c 20 2a 70 70 4d 69 6e   not met, *ppMin
1ba30 4d 61 78 20 69 73 20 73 65 74 20 74 6f 20 30 20  Max is set to 0 
1ba40 61 6e 64 0a 2a 2a 20 57 48 45 52 45 5f 4f 52 44  and.** WHERE_ORD
1ba50 45 52 42 59 5f 4e 4f 52 4d 41 4c 20 69 73 20 72  ERBY_NORMAL is r
1ba60 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
1ba70 69 63 20 75 38 20 6d 69 6e 4d 61 78 51 75 65 72  ic u8 minMaxQuer
1ba80 79 28 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49  y(AggInfo *pAggI
1ba90 6e 66 6f 2c 20 45 78 70 72 4c 69 73 74 20 2a 2a  nfo, ExprList **
1baa0 70 70 4d 69 6e 4d 61 78 29 7b 0a 20 20 69 6e 74  ppMinMax){.  int
1bab0 20 65 52 65 74 20 3d 20 57 48 45 52 45 5f 4f 52   eRet = WHERE_OR
1bac0 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b 20 20 20  DERBY_NORMAL;   
1bad0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
1bae0 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 2a 70 70   value */..  *pp
1baf0 4d 69 6e 4d 61 78 20 3d 20 30 3b 0a 20 20 69 66  MinMax = 0;.  if
1bb00 28 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e  ( pAggInfo->nFun
1bb10 63 3d 3d 31 20 29 7b 0a 20 20 20 20 45 78 70 72  c==1 ){.    Expr
1bb20 20 2a 70 45 78 70 72 20 3d 20 70 41 67 67 49 6e   *pExpr = pAggIn
1bb30 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d 2e 70 45 78  fo->aFunc[0].pEx
1bb40 70 72 3b 20 2f 2a 20 41 67 67 72 65 67 61 74 65  pr; /* Aggregate
1bb50 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20   function */.   
1bb60 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
1bb70 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  t = pExpr->x.pLi
1bb80 73 74 3b 20 20 20 20 20 20 2f 2a 20 41 72 67 75  st;      /* Argu
1bb90 6d 65 6e 74 73 20 74 6f 20 61 67 67 20 66 75 6e  ments to agg fun
1bba0 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 20 20 61 73  ction */..    as
1bbb0 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d  sert( pExpr->op=
1bbc0 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e  =TK_AGG_FUNCTION
1bbd0 20 29 3b 0a 20 20 20 20 69 66 28 20 70 45 4c 69   );.    if( pELi
1bbe0 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45  st && pEList->nE
1bbf0 78 70 72 3d 3d 31 20 26 26 20 70 45 4c 69 73 74  xpr==1 && pEList
1bc00 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70  ->a[0].pExpr->op
1bc10 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20  ==TK_AGG_COLUMN 
1bc20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  ){.      const c
1bc30 68 61 72 20 2a 7a 46 75 6e 63 20 3d 20 70 45 78  har *zFunc = pEx
1bc40 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20  pr->u.zToken;.  
1bc50 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
1bc60 74 72 49 43 6d 70 28 7a 46 75 6e 63 2c 20 22 6d  trICmp(zFunc, "m
1bc70 69 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  in")==0 ){.     
1bc80 20 20 20 65 52 65 74 20 3d 20 57 48 45 52 45 5f     eRet = WHERE_
1bc90 4f 52 44 45 52 42 59 5f 4d 49 4e 3b 0a 20 20 20  ORDERBY_MIN;.   
1bca0 20 20 20 20 20 2a 70 70 4d 69 6e 4d 61 78 20 3d       *ppMinMax =
1bcb0 20 70 45 4c 69 73 74 3b 0a 20 20 20 20 20 20 7d   pEList;.      }
1bcc0 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33  else if( sqlite3
1bcd0 53 74 72 49 43 6d 70 28 7a 46 75 6e 63 2c 20 22  StrICmp(zFunc, "
1bce0 6d 61 78 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  max")==0 ){.    
1bcf0 20 20 20 20 65 52 65 74 20 3d 20 57 48 45 52 45      eRet = WHERE
1bd00 5f 4f 52 44 45 52 42 59 5f 4d 41 58 3b 0a 20 20  _ORDERBY_MAX;.  
1bd10 20 20 20 20 20 20 2a 70 70 4d 69 6e 4d 61 78 20        *ppMinMax 
1bd20 3d 20 70 45 4c 69 73 74 3b 0a 20 20 20 20 20 20  = pEList;.      
1bd30 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61  }.    }.  }..  a
1bd40 73 73 65 72 74 28 20 2a 70 70 4d 69 6e 4d 61 78  ssert( *ppMinMax
1bd50 3d 3d 30 20 7c 7c 20 28 2a 70 70 4d 69 6e 4d 61  ==0 || (*ppMinMa
1bd60 78 29 2d 3e 6e 45 78 70 72 3d 3d 31 20 29 3b 0a  x)->nExpr==1 );.
1bd70 20 20 72 65 74 75 72 6e 20 65 52 65 74 3b 0a 7d    return eRet;.}
1bd80 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 6c 65  ../*.** The sele
1bd90 63 74 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73  ct statement pas
1bda0 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74  sed as the first
1bdb0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 6e 20   argument is an 
1bdc0 61 67 67 72 65 67 61 74 65 20 71 75 65 72 79 2e  aggregate query.
1bdd0 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 61  .** The second a
1bde0 72 67 6d 65 6e 74 20 69 73 20 74 68 65 20 61 73  rgment is the as
1bdf0 73 6f 63 69 61 74 65 64 20 61 67 67 72 65 67 61  sociated aggrega
1be00 74 65 2d 69 6e 66 6f 20 6f 62 6a 65 63 74 2e 20  te-info object. 
1be10 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f  This .** functio
1be20 6e 20 74 65 73 74 73 20 69 66 20 74 68 65 20 53  n tests if the S
1be30 45 4c 45 43 54 20 69 73 20 6f 66 20 74 68 65 20  ELECT is of the 
1be40 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45  form:.**.**   SE
1be50 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
1be60 4f 4d 20 3c 74 62 6c 3e 0a 2a 2a 0a 2a 2a 20 77  OM <tbl>.**.** w
1be70 68 65 72 65 20 74 61 62 6c 65 20 69 73 20 61 20  here table is a 
1be80 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 2c 20  database table, 
1be90 6e 6f 74 20 61 20 73 75 62 2d 73 65 6c 65 63 74  not a sub-select
1bea0 20 6f 72 20 76 69 65 77 2e 20 49 66 20 74 68 65   or view. If the
1beb0 20 71 75 65 72 79 0a 2a 2a 20 64 6f 65 73 20 6d   query.** does m
1bec0 61 74 63 68 20 74 68 69 73 20 70 61 74 74 65 72  atch this patter
1bed0 6e 2c 20 74 68 65 6e 20 61 20 70 6f 69 6e 74 65  n, then a pointe
1bee0 72 20 74 6f 20 74 68 65 20 54 61 62 6c 65 20 6f  r to the Table o
1bef0 62 6a 65 63 74 20 72 65 70 72 65 73 65 6e 74 69  bject representi
1bf00 6e 67 0a 2a 2a 20 3c 74 62 6c 3e 20 69 73 20 72  ng.** <tbl> is r
1bf10 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69  eturned. Otherwi
1bf20 73 65 2c 20 30 20 69 73 20 72 65 74 75 72 6e 65  se, 0 is returne
1bf30 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 54 61 62  d..*/.static Tab
1bf40 6c 65 20 2a 69 73 53 69 6d 70 6c 65 43 6f 75 6e  le *isSimpleCoun
1bf50 74 28 53 65 6c 65 63 74 20 2a 70 2c 20 41 67 67  t(Select *p, Agg
1bf60 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b  Info *pAggInfo){
1bf70 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a  .  Table *pTab;.
1bf80 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b 0a 0a    Expr *pExpr;..
1bf90 20 20 61 73 73 65 72 74 28 20 21 70 2d 3e 70 47    assert( !p->pG
1bfa0 72 6f 75 70 42 79 20 29 3b 0a 0a 20 20 69 66 28  roupBy );..  if(
1bfb0 20 70 2d 3e 70 57 68 65 72 65 20 7c 7c 20 70 2d   p->pWhere || p-
1bfc0 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d  >pEList->nExpr!=
1bfd0 31 20 0a 20 20 20 7c 7c 20 70 2d 3e 70 53 72 63  1 .   || p->pSrc
1bfe0 2d 3e 6e 53 72 63 21 3d 31 20 7c 7c 20 70 2d 3e  ->nSrc!=1 || p->
1bff0 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65  pSrc->a[0].pSele
1c000 63 74 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75  ct.  ){.    retu
1c010 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 54 61 62  rn 0;.  }.  pTab
1c020 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d   = p->pSrc->a[0]
1c030 2e 70 54 61 62 3b 0a 20 20 70 45 78 70 72 20 3d  .pTab;.  pExpr =
1c040 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d   p->pEList->a[0]
1c050 2e 70 45 78 70 72 3b 0a 20 20 61 73 73 65 72 74  .pExpr;.  assert
1c060 28 20 70 54 61 62 20 26 26 20 21 70 54 61 62 2d  ( pTab && !pTab-
1c070 3e 70 53 65 6c 65 63 74 20 26 26 20 70 45 78 70  >pSelect && pExp
1c080 72 20 29 3b 0a 0a 20 20 69 66 28 20 49 73 56 69  r );..  if( IsVi
1c090 72 74 75 61 6c 28 70 54 61 62 29 20 29 20 72 65  rtual(pTab) ) re
1c0a0 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 45  turn 0;.  if( pE
1c0b0 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f  xpr->op!=TK_AGG_
1c0c0 46 55 4e 43 54 49 4f 4e 20 29 20 72 65 74 75 72  FUNCTION ) retur
1c0d0 6e 20 30 3b 0a 20 20 69 66 28 20 4e 45 56 45 52  n 0;.  if( NEVER
1c0e0 28 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63  (pAggInfo->nFunc
1c0f0 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 20 30 3b  ==0) ) return 0;
1c100 0a 20 20 69 66 28 20 28 70 41 67 67 49 6e 66 6f  .  if( (pAggInfo
1c110 2d 3e 61 46 75 6e 63 5b 30 5d 2e 70 46 75 6e 63  ->aFunc[0].pFunc
1c120 2d 3e 66 75 6e 63 46 6c 61 67 73 26 53 51 4c 49  ->funcFlags&SQLI
1c130 54 45 5f 46 55 4e 43 5f 43 4f 55 4e 54 29 3d 3d  TE_FUNC_COUNT)==
1c140 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
1c150 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73  if( pExpr->flags
1c160 26 45 50 5f 44 69 73 74 69 6e 63 74 20 29 20 72  &EP_Distinct ) r
1c170 65 74 75 72 6e 20 30 3b 0a 0a 20 20 72 65 74 75  eturn 0;..  retu
1c180 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pTab;.}../*.*
1c190 2a 20 49 66 20 74 68 65 20 73 6f 75 72 63 65 2d  * If the source-
1c1a0 6c 69 73 74 20 69 74 65 6d 20 70 61 73 73 65 64  list item passed
1c1b0 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 20   as an argument 
1c1c0 77 61 73 20 61 75 67 6d 65 6e 74 65 64 20 77 69  was augmented wi
1c1d0 74 68 20 61 6e 0a 2a 2a 20 49 4e 44 45 58 45 44  th an.** INDEXED
1c1e0 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e   BY clause, then
1c1f0 20 74 72 79 20 74 6f 20 6c 6f 63 61 74 65 20 74   try to locate t
1c200 68 65 20 73 70 65 63 69 66 69 65 64 20 69 6e 64  he specified ind
1c210 65 78 2e 20 49 66 20 74 68 65 72 65 0a 2a 2a 20  ex. If there.** 
1c220 77 61 73 20 73 75 63 68 20 61 20 63 6c 61 75 73  was such a claus
1c230 65 20 61 6e 64 20 74 68 65 20 6e 61 6d 65 64 20  e and the named 
1c240 69 6e 64 65 78 20 63 61 6e 6e 6f 74 20 62 65 20  index cannot be 
1c250 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20 0a 2a  found, return .*
1c260 2a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 61  * SQLITE_ERROR a
1c270 6e 64 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f  nd leave an erro
1c280 72 20 69 6e 20 70 50 61 72 73 65 2e 20 4f 74 68  r in pParse. Oth
1c290 65 72 77 69 73 65 2c 20 70 6f 70 75 6c 61 74 65  erwise, populate
1c2a0 20 0a 2a 2a 20 70 46 72 6f 6d 2d 3e 70 49 6e 64   .** pFrom->pInd
1c2b0 65 78 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51  ex and return SQ
1c2c0 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20  LITE_OK..*/.int 
1c2d0 73 71 6c 69 74 65 33 49 6e 64 65 78 65 64 42 79  sqlite3IndexedBy
1c2e0 4c 6f 6f 6b 75 70 28 50 61 72 73 65 20 2a 70 50  Lookup(Parse *pP
1c2f0 61 72 73 65 2c 20 73 74 72 75 63 74 20 53 72 63  arse, struct Src
1c300 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d  List_item *pFrom
1c310 29 7b 0a 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e  ){.  if( pFrom->
1c320 70 54 61 62 20 26 26 20 70 46 72 6f 6d 2d 3e 7a  pTab && pFrom->z
1c330 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 54 61 62  Index ){.    Tab
1c340 6c 65 20 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d  le *pTab = pFrom
1c350 2d 3e 70 54 61 62 3b 0a 20 20 20 20 63 68 61 72  ->pTab;.    char
1c360 20 2a 7a 49 6e 64 65 78 20 3d 20 70 46 72 6f 6d   *zIndex = pFrom
1c370 2d 3e 7a 49 6e 64 65 78 3b 0a 20 20 20 20 49 6e  ->zIndex;.    In
1c380 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 66  dex *pIdx;.    f
1c390 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49  or(pIdx=pTab->pI
1c3a0 6e 64 65 78 3b 20 0a 20 20 20 20 20 20 20 20 70  ndex; .        p
1c3b0 49 64 78 20 26 26 20 73 71 6c 69 74 65 33 53 74  Idx && sqlite3St
1c3c0 72 49 43 6d 70 28 70 49 64 78 2d 3e 7a 4e 61 6d  rICmp(pIdx->zNam
1c3d0 65 2c 20 7a 49 6e 64 65 78 29 3b 20 0a 20 20 20  e, zIndex); .   
1c3e0 20 20 20 20 20 70 49 64 78 3d 70 49 64 78 2d 3e       pIdx=pIdx->
1c3f0 70 4e 65 78 74 0a 20 20 20 20 29 3b 0a 20 20 20  pNext.    );.   
1c400 20 69 66 28 20 21 70 49 64 78 20 29 7b 0a 20 20   if( !pIdx ){.  
1c410 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
1c420 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20  Msg(pParse, "no 
1c430 73 75 63 68 20 69 6e 64 65 78 3a 20 25 73 22 2c  such index: %s",
1c440 20 7a 49 6e 64 65 78 2c 20 30 29 3b 0a 20 20 20   zIndex, 0);.   
1c450 20 20 20 70 50 61 72 73 65 2d 3e 63 68 65 63 6b     pParse->check
1c460 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 20 20  Schema = 1;.    
1c470 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1c480 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
1c490 20 70 46 72 6f 6d 2d 3e 70 49 6e 64 65 78 20 3d   pFrom->pIndex =
1c4a0 20 70 49 64 78 3b 0a 20 20 7d 0a 20 20 72 65 74   pIdx;.  }.  ret
1c4b0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1c4c0 0a 2f 2a 0a 2a 2a 20 44 65 74 65 63 74 20 63 6f  ./*.** Detect co
1c4d0 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 73 74  mpound SELECT st
1c4e0 61 74 65 6d 65 6e 74 73 20 74 68 61 74 20 75 73  atements that us
1c4f0 65 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  e an ORDER BY cl
1c500 61 75 73 65 20 77 69 74 68 20 0a 2a 2a 20 61 6e  ause with .** an
1c510 20 61 6c 74 65 72 6e 61 74 69 76 65 20 63 6f 6c   alternative col
1c520 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e  lating sequence.
1c530 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54  .**.**    SELECT
1c540 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 45 58 43   ... FROM t1 EXC
1c550 45 50 54 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46  EPT SELECT ... F
1c560 52 4f 4d 20 74 32 20 4f 52 44 45 52 20 42 59 20  ROM t2 ORDER BY 
1c570 2e 2e 20 43 4f 4c 4c 41 54 45 20 2e 2e 2e 0a 2a  .. COLLATE ....*
1c580 2a 0a 2a 2a 20 54 68 65 73 65 20 61 72 65 20 72  *.** These are r
1c590 65 77 72 69 74 74 65 6e 20 61 73 20 61 20 73 75  ewritten as a su
1c5a0 62 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20  bquery:.**.**   
1c5b0 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 28   SELECT * FROM (
1c5c0 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20  SELECT ... FROM 
1c5d0 74 31 20 45 58 43 45 50 54 20 53 45 4c 45 43 54  t1 EXCEPT SELECT
1c5e0 20 2e 2e 2e 20 46 52 4f 4d 20 74 32 29 0a 2a 2a   ... FROM t2).**
1c5f0 20 20 20 20 20 4f 52 44 45 52 20 42 59 20 2e 2e       ORDER BY ..
1c600 2e 20 43 4f 4c 4c 41 54 45 20 2e 2e 2e 0a 2a 2a  . COLLATE ....**
1c610 0a 2a 2a 20 54 68 69 73 20 74 72 61 6e 73 66 6f  .** This transfo
1c620 72 6d 61 74 69 6f 6e 20 69 73 20 6e 65 63 65 73  rmation is neces
1c630 73 61 72 79 20 62 65 63 61 75 73 65 20 74 68 65  sary because the
1c640 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65   multiSelectOrde
1c650 72 42 79 28 29 20 72 6f 75 74 69 6e 65 0a 2a 2a  rBy() routine.**
1c660 20 61 62 6f 76 65 20 74 68 61 74 20 67 65 6e 65   above that gene
1c670 72 61 74 65 73 20 74 68 65 20 63 6f 64 65 20 66  rates the code f
1c680 6f 72 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45  or a compound SE
1c690 4c 45 43 54 20 77 69 74 68 20 61 6e 20 4f 52 44  LECT with an ORD
1c6a0 45 52 20 42 59 20 63 6c 61 75 73 65 0a 2a 2a 20  ER BY clause.** 
1c6b0 75 73 65 73 20 61 20 6d 65 72 67 65 20 61 6c 67  uses a merge alg
1c6c0 6f 72 69 74 68 6d 20 74 68 61 74 20 72 65 71 75  orithm that requ
1c6d0 69 72 65 73 20 74 68 65 20 73 61 6d 65 20 63 6f  ires the same co
1c6e0 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
1c6f0 20 6f 6e 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c   on the.** resul
1c700 74 20 63 6f 6c 75 6d 6e 73 20 61 73 20 6f 6e 20  t columns as on 
1c710 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
1c720 75 73 65 2e 20 20 53 65 65 20 74 69 63 6b 65 74  use.  See ticket
1c730 0a 2a 2a 20 68 74 74 70 3a 2f 2f 77 77 77 2e 73  .** http://www.s
1c740 71 6c 69 74 65 2e 6f 72 67 2f 73 72 63 2f 69 6e  qlite.org/src/in
1c750 66 6f 2f 36 37 30 39 35 37 34 64 32 61 0a 2a 2a  fo/6709574d2a.**
1c760 0a 2a 2a 20 54 68 69 73 20 74 72 61 6e 73 66 6f  .** This transfo
1c770 72 6d 61 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20  rmation is only 
1c780 6e 65 65 64 65 64 20 66 6f 72 20 45 58 43 45 50  needed for EXCEP
1c790 54 2c 20 49 4e 54 45 52 53 45 43 54 2c 20 61 6e  T, INTERSECT, an
1c7a0 64 20 55 4e 49 4f 4e 2e 0a 2a 2a 20 54 68 65 20  d UNION..** The 
1c7b0 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74  UNION ALL operat
1c7c0 6f 72 20 77 6f 72 6b 73 20 66 69 6e 65 20 77 69  or works fine wi
1c7d0 74 68 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72  th multiSelectOr
1c7e0 64 65 72 42 79 28 29 20 65 76 65 6e 20 77 68 65  derBy() even whe
1c7f0 6e 0a 2a 2a 20 74 68 65 72 65 20 61 72 65 20 43  n.** there are C
1c800 4f 4c 4c 41 54 45 20 74 65 72 6d 73 20 69 6e 20  OLLATE terms in 
1c810 74 68 65 20 4f 52 44 45 52 20 42 59 2e 0a 2a 2f  the ORDER BY..*/
1c820 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 6e 76  .static int conv
1c830 65 72 74 43 6f 6d 70 6f 75 6e 64 53 65 6c 65 63  ertCompoundSelec
1c840 74 54 6f 53 75 62 71 75 65 72 79 28 57 61 6c 6b  tToSubquery(Walk
1c850 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c  er *pWalker, Sel
1c860 65 63 74 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69  ect *p){.  int i
1c870 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 77  ;.  Select *pNew
1c880 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 58 3b 0a  ;.  Select *pX;.
1c890 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
1c8a0 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
1c8b0 5f 69 74 65 6d 20 2a 61 3b 0a 20 20 53 72 63 4c  _item *a;.  SrcL
1c8c0 69 73 74 20 2a 70 4e 65 77 53 72 63 3b 0a 20 20  ist *pNewSrc;.  
1c8d0 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 0a 20  Parse *pParse;. 
1c8e0 20 54 6f 6b 65 6e 20 64 75 6d 6d 79 3b 0a 0a 20   Token dummy;.. 
1c8f0 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d   if( p->pPrior==
1c900 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 43  0 ) return WRC_C
1c910 6f 6e 74 69 6e 75 65 3b 0a 20 20 69 66 28 20 70  ontinue;.  if( p
1c920 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 20  ->pOrderBy==0 ) 
1c930 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
1c940 6e 75 65 3b 0a 20 20 66 6f 72 28 70 58 3d 70 3b  nue;.  for(pX=p;
1c950 20 70 58 20 26 26 20 28 70 58 2d 3e 6f 70 3d 3d   pX && (pX->op==
1c960 54 4b 5f 41 4c 4c 20 7c 7c 20 70 58 2d 3e 6f 70  TK_ALL || pX->op
1c970 3d 3d 54 4b 5f 53 45 4c 45 43 54 29 3b 20 70 58  ==TK_SELECT); pX
1c980 3d 70 58 2d 3e 70 50 72 69 6f 72 29 7b 7d 0a 20  =pX->pPrior){}. 
1c990 20 69 66 28 20 70 58 3d 3d 30 20 29 20 72 65 74   if( pX==0 ) ret
1c9a0 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
1c9b0 3b 0a 20 20 61 20 3d 20 70 2d 3e 70 4f 72 64 65  ;.  a = p->pOrde
1c9c0 72 42 79 2d 3e 61 3b 0a 20 20 66 6f 72 28 69 3d  rBy->a;.  for(i=
1c9d0 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  p->pOrderBy->nEx
1c9e0 70 72 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29  pr-1; i>=0; i--)
1c9f0 7b 0a 20 20 20 20 69 66 28 20 61 5b 69 5d 2e 70  {.    if( a[i].p
1ca00 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50  Expr->flags & EP
1ca10 5f 43 6f 6c 6c 61 74 65 20 29 20 62 72 65 61 6b  _Collate ) break
1ca20 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 3c 30 20  ;.  }.  if( i<0 
1ca30 29 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e  ) return WRC_Con
1ca40 74 69 6e 75 65 3b 0a 0a 20 20 2f 2a 20 49 66 20  tinue;..  /* If 
1ca50 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f  we reach this po
1ca60 69 6e 74 2c 20 74 68 61 74 20 6d 65 61 6e 73 20  int, that means 
1ca70 74 68 65 20 74 72 61 6e 73 66 6f 72 6d 61 74 69  the transformati
1ca80 6f 6e 20 69 73 20 72 65 71 75 69 72 65 64 2e 20  on is required. 
1ca90 2a 2f 0a 0a 20 20 70 50 61 72 73 65 20 3d 20 70  */..  pParse = p
1caa0 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a  Walker->pParse;.
1cab0 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64    db = pParse->d
1cac0 62 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  b;.  pNew = sqli
1cad0 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
1cae0 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77  db, sizeof(*pNew
1caf0 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d  ) );.  if( pNew=
1cb00 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f  =0 ) return WRC_
1cb10 41 62 6f 72 74 3b 0a 20 20 6d 65 6d 73 65 74 28  Abort;.  memset(
1cb20 26 64 75 6d 6d 79 2c 20 30 2c 20 73 69 7a 65 6f  &dummy, 0, sizeo
1cb30 66 28 64 75 6d 6d 79 29 29 3b 0a 20 20 70 4e 65  f(dummy));.  pNe
1cb40 77 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53 72  wSrc = sqlite3Sr
1cb50 63 4c 69 73 74 41 70 70 65 6e 64 46 72 6f 6d 54  cListAppendFromT
1cb60 65 72 6d 28 70 50 61 72 73 65 2c 30 2c 30 2c 30  erm(pParse,0,0,0
1cb70 2c 26 64 75 6d 6d 79 2c 70 4e 65 77 2c 30 2c 30  ,&dummy,pNew,0,0
1cb80 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 53 72 63  );.  if( pNewSrc
1cb90 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43  ==0 ) return WRC
1cba0 5f 41 62 6f 72 74 3b 0a 20 20 2a 70 4e 65 77 20  _Abort;.  *pNew 
1cbb0 3d 20 2a 70 3b 0a 20 20 70 2d 3e 70 53 72 63 20  = *p;.  p->pSrc 
1cbc0 3d 20 70 4e 65 77 53 72 63 3b 0a 20 20 70 2d 3e  = pNewSrc;.  p->
1cbd0 70 45 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33  pEList = sqlite3
1cbe0 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
1cbf0 50 61 72 73 65 2c 20 30 2c 20 73 71 6c 69 74 65  Parse, 0, sqlite
1cc00 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 41 4c 4c  3Expr(db, TK_ALL
1cc10 2c 20 30 29 29 3b 0a 20 20 70 2d 3e 6f 70 20 3d  , 0));.  p->op =
1cc20 20 54 4b 5f 53 45 4c 45 43 54 3b 0a 20 20 70 2d   TK_SELECT;.  p-
1cc30 3e 70 57 68 65 72 65 20 3d 20 30 3b 0a 20 20 70  >pWhere = 0;.  p
1cc40 4e 65 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20  New->pGroupBy = 
1cc50 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 48 61 76 69  0;.  pNew->pHavi
1cc60 6e 67 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  ng = 0;.  pNew->
1cc70 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  pOrderBy = 0;.  
1cc80 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20  p->pPrior = 0;. 
1cc90 20 70 4e 65 77 2d 3e 70 4c 69 6d 69 74 20 3d 20   pNew->pLimit = 
1cca0 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 66 66 73  0;.  pNew->pOffs
1ccb0 65 74 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  et = 0;.  return
1ccc0 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d   WRC_Continue;.}
1ccd0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
1cce0 74 69 6e 65 20 69 73 20 61 20 57 61 6c 6b 65 72  tine is a Walker
1ccf0 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 22 65   callback for "e
1cd00 78 70 61 6e 64 69 6e 67 22 20 61 20 53 45 4c 45  xpanding" a SELE
1cd10 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  CT statement..**
1cd20 20 22 45 78 70 61 6e 64 69 6e 67 22 20 6d 65 61   "Expanding" mea
1cd30 6e 73 20 74 6f 20 64 6f 20 74 68 65 20 66 6f 6c  ns to do the fol
1cd40 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20  lowing:.**.**   
1cd50 20 28 31 29 20 20 4d 61 6b 65 20 73 75 72 65 20   (1)  Make sure 
1cd60 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62  VDBE cursor numb
1cd70 65 72 73 20 68 61 76 65 20 62 65 65 6e 20 61 73  ers have been as
1cd80 73 69 67 6e 65 64 20 74 6f 20 65 76 65 72 79 0a  signed to every.
1cd90 2a 2a 20 20 20 20 20 20 20 20 20 65 6c 65 6d 65  **         eleme
1cda0 6e 74 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63  nt of the FROM c
1cdb0 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  lause..**.**    
1cdc0 28 32 29 20 20 46 69 6c 6c 20 69 6e 20 74 68 65  (2)  Fill in the
1cdd0 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70   pTabList->a[].p
1cde0 54 61 62 20 66 69 65 6c 64 73 20 69 6e 20 74 68  Tab fields in th
1cdf0 65 20 53 72 63 4c 69 73 74 20 74 68 61 74 20 0a  e SrcList that .
1ce00 2a 2a 20 20 20 20 20 20 20 20 20 64 65 66 69 6e  **         defin
1ce10 65 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20  es FROM clause. 
1ce20 20 57 68 65 6e 20 76 69 65 77 73 20 61 70 70 65   When views appe
1ce30 61 72 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  ar in the FROM c
1ce40 6c 61 75 73 65 2c 0a 2a 2a 20 20 20 20 20 20 20  lause,.**       
1ce50 20 20 66 69 6c 6c 20 70 54 61 62 4c 69 73 74 2d    fill pTabList-
1ce60 3e 61 5b 5d 2e 70 53 65 6c 65 63 74 20 77 69 74  >a[].pSelect wit
1ce70 68 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  h a copy of the 
1ce80 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
1ce90 0a 2a 2a 20 20 20 20 20 20 20 20 20 74 68 61 74  .**         that
1cea0 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20   implements the 
1ceb0 76 69 65 77 2e 20 20 41 20 63 6f 70 79 20 69 73  view.  A copy is
1cec0 20 6d 61 64 65 20 6f 66 20 74 68 65 20 76 69 65   made of the vie
1ced0 77 27 73 20 53 45 4c 45 43 54 0a 2a 2a 20 20 20  w's SELECT.**   
1cee0 20 20 20 20 20 20 73 74 61 74 65 6d 65 6e 74 20        statement 
1cef0 73 6f 20 74 68 61 74 20 77 65 20 63 61 6e 20 66  so that we can f
1cf00 72 65 65 6c 79 20 6d 6f 64 69 66 79 20 6f 72 20  reely modify or 
1cf10 64 65 6c 65 74 65 20 74 68 61 74 20 73 74 61 74  delete that stat
1cf20 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20  ement.**        
1cf30 20 77 69 74 68 6f 75 74 20 77 6f 72 72 79 69 6e   without worryin
1cf40 67 20 61 62 6f 75 74 20 6d 65 73 73 69 6e 67 20  g about messing 
1cf50 75 70 20 74 68 65 20 70 72 65 73 69 73 74 65 6e  up the presisten
1cf60 74 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  t representation
1cf70 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f 66 20 74  .**         of t
1cf80 68 65 20 76 69 65 77 2e 0a 2a 2a 0a 2a 2a 20 20  he view..**.**  
1cf90 20 20 28 33 29 20 20 41 64 64 20 74 65 72 6d 73    (3)  Add terms
1cfa0 20 74 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c   to the WHERE cl
1cfb0 61 75 73 65 20 74 6f 20 61 63 63 6f 6d 6f 64 61  ause to accomoda
1cfc0 74 65 20 74 68 65 20 4e 41 54 55 52 41 4c 20 6b  te the NATURAL k
1cfd0 65 79 77 6f 72 64 0a 2a 2a 20 20 20 20 20 20 20  eyword.**       
1cfe0 20 20 6f 6e 20 6a 6f 69 6e 73 20 61 6e 64 20 74    on joins and t
1cff0 68 65 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20  he ON and USING 
1d000 63 6c 61 75 73 65 20 6f 66 20 6a 6f 69 6e 73 2e  clause of joins.
1d010 0a 2a 2a 0a 2a 2a 20 20 20 20 28 34 29 20 20 53  .**.**    (4)  S
1d020 63 61 6e 20 74 68 65 20 6c 69 73 74 20 6f 66 20  can the list of 
1d030 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72  columns in the r
1d040 65 73 75 6c 74 20 73 65 74 20 28 70 45 4c 69 73  esult set (pELis
1d050 74 29 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20 20 20  t) looking.**   
1d060 20 20 20 20 20 20 66 6f 72 20 69 6e 73 74 61 6e        for instan
1d070 63 65 73 20 6f 66 20 74 68 65 20 22 2a 22 20 6f  ces of the "*" o
1d080 70 65 72 61 74 6f 72 20 6f 72 20 74 68 65 20 54  perator or the T
1d090 41 42 4c 45 2e 2a 20 6f 70 65 72 61 74 6f 72 2e  ABLE.* operator.
1d0a0 0a 2a 2a 20 20 20 20 20 20 20 20 20 49 66 20 66  .**         If f
1d0b0 6f 75 6e 64 2c 20 65 78 70 61 6e 64 20 65 61 63  ound, expand eac
1d0c0 68 20 22 2a 22 20 74 6f 20 62 65 20 65 76 65 72  h "*" to be ever
1d0d0 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 65 76 65 72  y column in ever
1d0e0 79 20 74 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20  y table.**      
1d0f0 20 20 20 61 6e 64 20 54 41 42 4c 45 2e 2a 20 74     and TABLE.* t
1d100 6f 20 62 65 20 65 76 65 72 79 20 63 6f 6c 75 6d  o be every colum
1d110 6e 20 69 6e 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a  n in TABLE..**.*
1d120 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6c  /.static int sel
1d130 65 63 74 45 78 70 61 6e 64 65 72 28 57 61 6c 6b  ectExpander(Walk
1d140 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c  er *pWalker, Sel
1d150 65 63 74 20 2a 70 29 7b 0a 20 20 50 61 72 73 65  ect *p){.  Parse
1d160 20 2a 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b   *pParse = pWalk
1d170 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69 6e  er->pParse;.  in
1d180 74 20 69 2c 20 6a 2c 20 6b 3b 0a 20 20 53 72 63  t i, j, k;.  Src
1d190 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 0a  List *pTabList;.
1d1a0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
1d1b0 73 74 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63  st;.  struct Src
1d1c0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d  List_item *pFrom
1d1d0 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
1d1e0 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
1d1f0 45 78 70 72 20 2a 70 45 2c 20 2a 70 52 69 67 68  Expr *pE, *pRigh
1d200 74 2c 20 2a 70 45 78 70 72 3b 0a 20 20 75 31 36  t, *pExpr;.  u16
1d210 20 73 65 6c 46 6c 61 67 73 20 3d 20 70 2d 3e 73   selFlags = p->s
1d220 65 6c 46 6c 61 67 73 3b 0a 0a 20 20 70 2d 3e 73  elFlags;..  p->s
1d230 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 45 78  elFlags |= SF_Ex
1d240 70 61 6e 64 65 64 3b 0a 20 20 69 66 28 20 64 62  panded;.  if( db
1d250 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 20  ->mallocFailed  
1d260 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52  ){.    return WR
1d270 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 20 20 69  C_Abort;.  }.  i
1d280 66 28 20 4e 45 56 45 52 28 70 2d 3e 70 53 72 63  f( NEVER(p->pSrc
1d290 3d 3d 30 29 20 7c 7c 20 28 73 65 6c 46 6c 61 67  ==0) || (selFlag
1d2a0 73 20 26 20 53 46 5f 45 78 70 61 6e 64 65 64 29  s & SF_Expanded)
1d2b0 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  !=0 ){.    retur
1d2c0 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 7d  n WRC_Prune;.  }
1d2d0 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d  .  pTabList = p-
1d2e0 3e 70 53 72 63 3b 0a 20 20 70 45 4c 69 73 74 20  >pSrc;.  pEList 
1d2f0 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 0a 20 20  = p->pEList;..  
1d300 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 63 75 72  /* Make sure cur
1d310 73 6f 72 20 6e 75 6d 62 65 72 73 20 68 61 76 65  sor numbers have
1d320 20 62 65 65 6e 20 61 73 73 69 67 6e 65 64 20 74   been assigned t
1d330 6f 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 69 6e  o all entries in
1d340 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63  .  ** the FROM c
1d350 6c 61 75 73 65 20 6f 66 20 74 68 65 20 53 45 4c  lause of the SEL
1d360 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20  ECT statement.. 
1d370 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 53 72 63   */.  sqlite3Src
1d380 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72  ListAssignCursor
1d390 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69  s(pParse, pTabLi
1d3a0 73 74 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20  st);..  /* Look 
1d3b0 75 70 20 65 76 65 72 79 20 74 61 62 6c 65 20 6e  up every table n
1d3c0 61 6d 65 64 20 69 6e 20 74 68 65 20 46 52 4f 4d  amed in the FROM
1d3d0 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 73   clause of the s
1d3e0 65 6c 65 63 74 2e 20 20 49 66 0a 20 20 2a 2a 20  elect.  If.  ** 
1d3f0 61 6e 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20  an entry of the 
1d400 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 61  FROM clause is a
1d410 20 73 75 62 71 75 65 72 79 20 69 6e 73 74 65 61   subquery instea
1d420 64 20 6f 66 20 61 20 74 61 62 6c 65 20 6f 72 20  d of a table or 
1d430 76 69 65 77 2c 0a 20 20 2a 2a 20 74 68 65 6e 20  view,.  ** then 
1d440 63 72 65 61 74 65 20 61 20 74 72 61 6e 73 69 65  create a transie
1d450 6e 74 20 74 61 62 6c 65 20 73 74 72 75 63 74 75  nt table structu
1d460 72 65 20 74 6f 20 64 65 73 63 72 69 62 65 20 74  re to describe t
1d470 68 65 20 73 75 62 71 75 65 72 79 2e 0a 20 20 2a  he subquery..  *
1d480 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 72  /.  for(i=0, pFr
1d490 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20  om=pTabList->a; 
1d4a0 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  i<pTabList->nSrc
1d4b0 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b  ; i++, pFrom++){
1d4c0 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
1d4d0 3b 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d  ;.    if( pFrom-
1d4e0 3e 70 54 61 62 21 3d 30 20 29 7b 0a 20 20 20 20  >pTab!=0 ){.    
1d4f0 20 20 2f 2a 20 54 68 69 73 20 73 74 61 74 65 6d    /* This statem
1d500 65 6e 74 20 68 61 73 20 61 6c 72 65 61 64 79 20  ent has already 
1d510 62 65 65 6e 20 70 72 65 70 61 72 65 64 2e 20 20  been prepared.  
1d520 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64  There is no need
1d530 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 67 6f 20  .      ** to go 
1d540 66 75 72 74 68 65 72 2e 20 2a 2f 0a 20 20 20 20  further. */.    
1d550 20 20 61 73 73 65 72 74 28 20 69 3d 3d 30 20 29    assert( i==0 )
1d560 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57  ;.      return W
1d570 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 7d 0a  RC_Prune;.    }.
1d580 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 7a      if( pFrom->z
1d590 4e 61 6d 65 3d 3d 30 20 29 7b 0a 23 69 66 6e 64  Name==0 ){.#ifnd
1d5a0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
1d5b0 55 42 51 55 45 52 59 0a 20 20 20 20 20 20 53 65  UBQUERY.      Se
1d5c0 6c 65 63 74 20 2a 70 53 65 6c 20 3d 20 70 46 72  lect *pSel = pFr
1d5d0 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20  om->pSelect;.   
1d5e0 20 20 20 2f 2a 20 41 20 73 75 62 2d 71 75 65 72     /* A sub-quer
1d5f0 79 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  y in the FROM cl
1d600 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54  ause of a SELECT
1d610 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
1d620 28 20 70 53 65 6c 21 3d 30 20 29 3b 0a 20 20 20  ( pSel!=0 );.   
1d630 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d     assert( pFrom
1d640 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20  ->pTab==0 );.   
1d650 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65     sqlite3WalkSe
1d660 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c 20 70 53  lect(pWalker, pS
1d670 65 6c 29 3b 0a 20 20 20 20 20 20 70 46 72 6f 6d  el);.      pFrom
1d680 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 20 3d 20  ->pTab = pTab = 
1d690 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
1d6a0 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 54  ero(db, sizeof(T
1d6b0 61 62 6c 65 29 29 3b 0a 20 20 20 20 20 20 69 66  able));.      if
1d6c0 28 20 70 54 61 62 3d 3d 30 20 29 20 72 65 74 75  ( pTab==0 ) retu
1d6d0 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
1d6e0 20 20 20 20 70 54 61 62 2d 3e 6e 52 65 66 20 3d      pTab->nRef =
1d6f0 20 31 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e   1;.      pTab->
1d700 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d  zName = sqlite3M
1d710 50 72 69 6e 74 66 28 64 62 2c 20 22 73 71 6c 69  Printf(db, "sqli
1d720 74 65 5f 73 71 5f 25 70 22 2c 20 28 76 6f 69 64  te_sq_%p", (void
1d730 2a 29 70 54 61 62 29 3b 0a 20 20 20 20 20 20 77  *)pTab);.      w
1d740 68 69 6c 65 28 20 70 53 65 6c 2d 3e 70 50 72 69  hile( pSel->pPri
1d750 6f 72 20 29 7b 20 70 53 65 6c 20 3d 20 70 53 65  or ){ pSel = pSe
1d760 6c 2d 3e 70 50 72 69 6f 72 3b 20 7d 0a 20 20 20  l->pPrior; }.   
1d770 20 20 20 73 65 6c 65 63 74 43 6f 6c 75 6d 6e 73     selectColumns
1d780 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61  FromExprList(pPa
1d790 72 73 65 2c 20 70 53 65 6c 2d 3e 70 45 4c 69 73  rse, pSel->pELis
1d7a0 74 2c 20 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20  t, &pTab->nCol, 
1d7b0 26 70 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20 20  &pTab->aCol);.  
1d7c0 20 20 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20      pTab->iPKey 
1d7d0 3d 20 2d 31 3b 0a 20 20 20 20 20 20 70 54 61 62  = -1;.      pTab
1d7e0 2d 3e 6e 52 6f 77 45 73 74 20 3d 20 31 30 34 38  ->nRowEst = 1048
1d7f0 35 37 36 3b 0a 20 20 20 20 20 20 70 54 61 62 2d  576;.      pTab-
1d800 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f  >tabFlags |= TF_
1d810 45 70 68 65 6d 65 72 61 6c 3b 0a 23 65 6e 64 69  Ephemeral;.#endi
1d820 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  f.    }else{.   
1d830 20 20 20 2f 2a 20 41 6e 20 6f 72 64 69 6e 61 72     /* An ordinar
1d840 79 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20  y table or view 
1d850 6e 61 6d 65 20 69 6e 20 74 68 65 20 46 52 4f 4d  name in the FROM
1d860 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20   clause */.     
1d870 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e   assert( pFrom->
1d880 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20  pTab==0 );.     
1d890 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70   pFrom->pTab = p
1d8a0 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63  Tab = sqlite3Loc
1d8b0 61 74 65 54 61 62 6c 65 49 74 65 6d 28 70 50 61  ateTableItem(pPa
1d8c0 72 73 65 2c 20 30 2c 20 70 46 72 6f 6d 29 3b 0a  rse, 0, pFrom);.
1d8d0 20 20 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d        if( pTab==
1d8e0 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41  0 ) return WRC_A
1d8f0 62 6f 72 74 3b 0a 20 20 20 20 20 20 69 66 28 20  bort;.      if( 
1d900 70 54 61 62 2d 3e 6e 52 65 66 3d 3d 30 78 66 66  pTab->nRef==0xff
1d910 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ff ){.        sq
1d920 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
1d930 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20  arse, "too many 
1d940 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 5c 22  references to \"
1d950 25 73 5c 22 3a 20 6d 61 78 20 36 35 35 33 35 22  %s\": max 65535"
1d960 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 54 61  ,.           pTa
1d970 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  b->zName);.     
1d980 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d     pFrom->pTab =
1d990 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   0;.        retu
1d9a0 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
1d9b0 20 20 20 20 7d 0a 20 20 20 20 20 20 70 54 61 62      }.      pTab
1d9c0 2d 3e 6e 52 65 66 2b 2b 3b 0a 23 69 66 20 21 64  ->nRef++;.#if !d
1d9d0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
1d9e0 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66  IT_VIEW) || !def
1d9f0 69 6e 65 64 20 28 53 51 4c 49 54 45 5f 4f 4d 49  ined (SQLITE_OMI
1da00 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 0a  T_VIRTUALTABLE).
1da10 20 20 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e        if( pTab->
1da20 70 53 65 6c 65 63 74 20 7c 7c 20 49 73 56 69 72  pSelect || IsVir
1da30 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20  tual(pTab) ){.  
1da40 20 20 20 20 20 20 2f 2a 20 57 65 20 72 65 61 63        /* We reac
1da50 68 20 68 65 72 65 20 69 66 20 74 68 65 20 6e 61  h here if the na
1da60 6d 65 64 20 74 61 62 6c 65 20 69 73 20 61 20 72  med table is a r
1da70 65 61 6c 6c 79 20 61 20 76 69 65 77 20 2a 2f 0a  eally a view */.
1da80 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
1da90 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e  te3ViewGetColumn
1daa0 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 54  Names(pParse, pT
1dab0 61 62 29 20 29 20 72 65 74 75 72 6e 20 57 52 43  ab) ) return WRC
1dac0 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 20 20  _Abort;.        
1dad0 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70  assert( pFrom->p
1dae0 53 65 6c 65 63 74 3d 3d 30 20 29 3b 0a 20 20 20  Select==0 );.   
1daf0 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 53 65 6c       pFrom->pSel
1db00 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  ect = sqlite3Sel
1db10 65 63 74 44 75 70 28 64 62 2c 20 70 54 61 62 2d  ectDup(db, pTab-
1db20 3e 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20  >pSelect, 0);.  
1db30 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c        sqlite3Wal
1db40 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c  kSelect(pWalker,
1db50 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 29   pFrom->pSelect)
1db60 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
1db70 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4c  .    }..    /* L
1db80 6f 63 61 74 65 20 74 68 65 20 69 6e 64 65 78 20  ocate the index 
1db90 6e 61 6d 65 64 20 62 79 20 74 68 65 20 49 4e 44  named by the IND
1dba0 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 2c 20  EXED BY clause, 
1dbb0 69 66 20 61 6e 79 2e 20 2a 2f 0a 20 20 20 20 69  if any. */.    i
1dbc0 66 28 20 73 71 6c 69 74 65 33 49 6e 64 65 78 65  f( sqlite3Indexe
1dbd0 64 42 79 4c 6f 6f 6b 75 70 28 70 50 61 72 73 65  dByLookup(pParse
1dbe0 2c 20 70 46 72 6f 6d 29 20 29 7b 0a 20 20 20 20  , pFrom) ){.    
1dbf0 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f    return WRC_Abo
1dc00 72 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  rt;.    }.  }.. 
1dc10 20 2f 2a 20 50 72 6f 63 65 73 73 20 4e 41 54 55   /* Process NATU
1dc20 52 41 4c 20 6b 65 79 77 6f 72 64 73 2c 20 61 6e  RAL keywords, an
1dc30 64 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63  d ON and USING c
1dc40 6c 61 75 73 65 73 20 6f 66 20 6a 6f 69 6e 73 2e  lauses of joins.
1dc50 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  .  */.  if( db->
1dc60 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20  mallocFailed || 
1dc70 73 71 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f 69  sqliteProcessJoi
1dc80 6e 28 70 50 61 72 73 65 2c 20 70 29 20 29 7b 0a  n(pParse, p) ){.
1dc90 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41      return WRC_A
1dca0 62 6f 72 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  bort;.  }..  /* 
1dcb0 46 6f 72 20 65 76 65 72 79 20 22 2a 22 20 74 68  For every "*" th
1dcc0 61 74 20 6f 63 63 75 72 73 20 69 6e 20 74 68 65  at occurs in the
1dcd0 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2c 20 69 6e   column list, in
1dce0 73 65 72 74 20 74 68 65 20 6e 61 6d 65 73 20 6f  sert the names o
1dcf0 66 0a 20 20 2a 2a 20 61 6c 6c 20 63 6f 6c 75 6d  f.  ** all colum
1dd00 6e 73 20 69 6e 20 61 6c 6c 20 74 61 62 6c 65 73  ns in all tables
1dd10 2e 20 20 41 6e 64 20 66 6f 72 20 65 76 65 72 79  .  And for every
1dd20 20 54 41 42 4c 45 2e 2a 20 69 6e 73 65 72 74 20   TABLE.* insert 
1dd30 74 68 65 20 6e 61 6d 65 73 0a 20 20 2a 2a 20 6f  the names.  ** o
1dd40 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e  f all columns in
1dd50 20 54 41 42 4c 45 2e 20 20 54 68 65 20 70 61 72   TABLE.  The par
1dd60 73 65 72 20 69 6e 73 65 72 74 65 64 20 61 20 73  ser inserted a s
1dd70 70 65 63 69 61 6c 20 65 78 70 72 65 73 73 69 6f  pecial expressio
1dd80 6e 0a 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20  n.  ** with the 
1dd90 54 4b 5f 41 4c 4c 20 6f 70 65 72 61 74 6f 72 20  TK_ALL operator 
1dda0 66 6f 72 20 65 61 63 68 20 22 2a 22 20 74 68 61  for each "*" tha
1ddb0 74 20 69 74 20 66 6f 75 6e 64 20 69 6e 20 74 68  t it found in th
1ddc0 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2e 0a 20  e column list.. 
1ddd0 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   ** The followin
1dde0 67 20 63 6f 64 65 20 6a 75 73 74 20 68 61 73 20  g code just has 
1ddf0 74 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 54 4b  to locate the TK
1de00 5f 41 4c 4c 20 65 78 70 72 65 73 73 69 6f 6e 73  _ALL expressions
1de10 20 61 6e 64 20 65 78 70 61 6e 64 0a 20 20 2a 2a   and expand.  **
1de20 20 65 61 63 68 20 6f 6e 65 20 74 6f 20 74 68 65   each one to the
1de30 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 63 6f 6c   list of all col
1de40 75 6d 6e 73 20 69 6e 20 61 6c 6c 20 74 61 62 6c  umns in all tabl
1de50 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  es..  **.  ** Th
1de60 65 20 66 69 72 73 74 20 6c 6f 6f 70 20 6a 75 73  e first loop jus
1de70 74 20 63 68 65 63 6b 73 20 74 6f 20 73 65 65 20  t checks to see 
1de80 69 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79  if there are any
1de90 20 22 2a 22 20 6f 70 65 72 61 74 6f 72 73 0a 20   "*" operators. 
1dea0 20 2a 2a 20 74 68 61 74 20 6e 65 65 64 20 65 78   ** that need ex
1deb0 70 61 6e 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20  panding..  */.  
1dec0 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73  for(k=0; k<pELis
1ded0 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a  t->nExpr; k++){.
1dee0 20 20 20 20 70 45 20 3d 20 70 45 4c 69 73 74 2d      pE = pEList-
1def0 3e 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[k].pExpr;.   
1df00 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f   if( pE->op==TK_
1df10 41 4c 4c 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ALL ) break;.   
1df20 20 61 73 73 65 72 74 28 20 70 45 2d 3e 6f 70 21   assert( pE->op!
1df30 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 45 2d 3e 70  =TK_DOT || pE->p
1df40 52 69 67 68 74 21 3d 30 20 29 3b 0a 20 20 20 20  Right!=0 );.    
1df50 61 73 73 65 72 74 28 20 70 45 2d 3e 6f 70 21 3d  assert( pE->op!=
1df60 54 4b 5f 44 4f 54 20 7c 7c 20 28 70 45 2d 3e 70  TK_DOT || (pE->p
1df70 4c 65 66 74 21 3d 30 20 26 26 20 70 45 2d 3e 70  Left!=0 && pE->p
1df80 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 29  Left->op==TK_ID)
1df90 20 29 3b 0a 20 20 20 20 69 66 28 20 70 45 2d 3e   );.    if( pE->
1dfa0 6f 70 3d 3d 54 4b 5f 44 4f 54 20 26 26 20 70 45  op==TK_DOT && pE
1dfb0 2d 3e 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b  ->pRight->op==TK
1dfc0 5f 41 4c 4c 20 29 20 62 72 65 61 6b 3b 0a 20 20  _ALL ) break;.  
1dfd0 7d 0a 20 20 69 66 28 20 6b 3c 70 45 4c 69 73 74  }.  if( k<pEList
1dfe0 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 2f  ->nExpr ){.    /
1dff0 2a 0a 20 20 20 20 2a 2a 20 49 66 20 77 65 20 67  *.    ** If we g
1e000 65 74 20 68 65 72 65 20 69 74 20 6d 65 61 6e 73  et here it means
1e010 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
1e020 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20  contains one or 
1e030 6d 6f 72 65 20 22 2a 22 0a 20 20 20 20 2a 2a 20  more "*".    ** 
1e040 6f 70 65 72 61 74 6f 72 73 20 74 68 61 74 20 6e  operators that n
1e050 65 65 64 20 74 6f 20 62 65 20 65 78 70 61 6e 64  eed to be expand
1e060 65 64 2e 20 20 4c 6f 6f 70 20 74 68 72 6f 75 67  ed.  Loop throug
1e070 68 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f  h each expressio
1e080 6e 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20  n.    ** in the 
1e090 72 65 73 75 6c 74 20 73 65 74 20 61 6e 64 20 65  result set and e
1e0a0 78 70 61 6e 64 20 74 68 65 6d 20 6f 6e 65 20 62  xpand them one b
1e0b0 79 20 6f 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  y one..    */.  
1e0c0 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
1e0d0 74 5f 69 74 65 6d 20 2a 61 20 3d 20 70 45 4c 69  t_item *a = pELi
1e0e0 73 74 2d 3e 61 3b 0a 20 20 20 20 45 78 70 72 4c  st->a;.    ExprL
1e0f0 69 73 74 20 2a 70 4e 65 77 20 3d 20 30 3b 0a 20  ist *pNew = 0;. 
1e100 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 70     int flags = p
1e110 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73  Parse->db->flags
1e120 3b 0a 20 20 20 20 69 6e 74 20 6c 6f 6e 67 4e 61  ;.    int longNa
1e130 6d 65 73 20 3d 20 28 66 6c 61 67 73 20 26 20 53  mes = (flags & S
1e140 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d  QLITE_FullColNam
1e150 65 73 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20  es)!=0.         
1e160 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
1e170 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
1e180 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 29 3d 3d  ShortColNames)==
1e190 30 3b 0a 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20  0;..    /* When 
1e1a0 70 72 6f 63 65 73 73 69 6e 67 20 46 52 4f 4d 2d  processing FROM-
1e1b0 63 6c 61 75 73 65 20 73 75 62 71 75 65 72 69 65  clause subquerie
1e1c0 73 2c 20 69 74 20 69 73 20 61 6c 77 61 79 73 20  s, it is always 
1e1d0 74 68 65 20 63 61 73 65 0a 20 20 20 20 2a 2a 20  the case.    ** 
1e1e0 74 68 61 74 20 66 75 6c 6c 5f 63 6f 6c 75 6d 6e  that full_column
1e1f0 5f 6e 61 6d 65 73 3d 4f 46 46 20 61 6e 64 20 73  _names=OFF and s
1e200 68 6f 72 74 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65  hort_column_name
1e210 73 3d 4f 4e 2e 20 20 54 68 65 0a 20 20 20 20 2a  s=ON.  The.    *
1e220 2a 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53  * sqlite3ResultS
1e230 65 74 4f 66 53 65 6c 65 63 74 28 29 20 72 6f 75  etOfSelect() rou
1e240 74 69 6e 65 20 6d 61 6b 65 73 20 69 74 20 73 6f  tine makes it so
1e250 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
1e260 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
1e270 53 46 5f 4e 65 73 74 65 64 46 72 6f 6d 29 3d 3d  SF_NestedFrom)==
1e280 30 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28  0.          || (
1e290 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
1e2a0 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 3d 3d 30  FullColNames)==0
1e2b0 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20   &&.            
1e2c0 20 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54    (flags & SQLIT
1e2d0 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 29  E_ShortColNames)
1e2e0 21 3d 30 29 20 29 3b 0a 0a 20 20 20 20 66 6f 72  !=0) );..    for
1e2f0 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e  (k=0; k<pEList->
1e300 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20  nExpr; k++){.   
1e310 20 20 20 70 45 20 3d 20 61 5b 6b 5d 2e 70 45 78     pE = a[k].pEx
1e320 70 72 3b 0a 20 20 20 20 20 20 70 52 69 67 68 74  pr;.      pRight
1e330 20 3d 20 70 45 2d 3e 70 52 69 67 68 74 3b 0a 20   = pE->pRight;. 
1e340 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 2d       assert( pE-
1e350 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70  >op!=TK_DOT || p
1e360 52 69 67 68 74 21 3d 30 20 29 3b 0a 20 20 20 20  Right!=0 );.    
1e370 20 20 69 66 28 20 70 45 2d 3e 6f 70 21 3d 54 4b    if( pE->op!=TK
1e380 5f 41 4c 4c 20 26 26 20 28 70 45 2d 3e 6f 70 21  _ALL && (pE->op!
1e390 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 52 69 67 68  =TK_DOT || pRigh
1e3a0 74 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29 20 29  t->op!=TK_ALL) )
1e3b0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69  {.        /* Thi
1e3c0 73 20 70 61 72 74 69 63 75 6c 61 72 20 65 78 70  s particular exp
1e3d0 72 65 73 73 69 6f 6e 20 64 6f 65 73 20 6e 6f 74  ression does not
1e3e0 20 6e 65 65 64 20 74 6f 20 62 65 20 65 78 70 61   need to be expa
1e3f0 6e 64 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f  nded..        */
1e400 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20  .        pNew = 
1e410 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
1e420 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70 4e  ppend(pParse, pN
1e430 65 77 2c 20 61 5b 6b 5d 2e 70 45 78 70 72 29 3b  ew, a[k].pExpr);
1e440 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65  .        if( pNe
1e450 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  w ){.          p
1e460 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78  New->a[pNew->nEx
1e470 70 72 2d 31 5d 2e 7a 4e 61 6d 65 20 3d 20 61 5b  pr-1].zName = a[
1e480 6b 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  k].zName;.      
1e490 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77      pNew->a[pNew
1e4a0 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a 53 70 61 6e  ->nExpr-1].zSpan
1e4b0 20 3d 20 61 5b 6b 5d 2e 7a 53 70 61 6e 3b 0a 20   = a[k].zSpan;. 
1e4c0 20 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 7a 4e           a[k].zN
1e4d0 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ame = 0;.       
1e4e0 20 20 20 61 5b 6b 5d 2e 7a 53 70 61 6e 20 3d 20     a[k].zSpan = 
1e4f0 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
1e500 20 20 20 20 20 61 5b 6b 5d 2e 70 45 78 70 72 20       a[k].pExpr 
1e510 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 0;.      }else
1e520 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69  {.        /* Thi
1e530 73 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  s expression is 
1e540 61 20 22 2a 22 20 6f 72 20 61 20 22 54 41 42 4c  a "*" or a "TABL
1e550 45 2e 2a 22 20 61 6e 64 20 6e 65 65 64 73 20 74  E.*" and needs t
1e560 6f 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  o be.        ** 
1e570 65 78 70 61 6e 64 65 64 2e 20 2a 2f 0a 20 20 20  expanded. */.   
1e580 20 20 20 20 20 69 6e 74 20 74 61 62 6c 65 53 65       int tableSe
1e590 65 6e 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20  en = 0;      /* 
1e5a0 53 65 74 20 74 6f 20 31 20 77 68 65 6e 20 54 41  Set to 1 when TA
1e5b0 42 4c 45 20 6d 61 74 63 68 65 73 20 2a 2f 0a 20  BLE matches */. 
1e5c0 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 4e         char *zTN
1e5d0 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  ame = 0;       /
1e5e0 2a 20 74 65 78 74 20 6f 66 20 6e 61 6d 65 20 6f  * text of name o
1e5f0 66 20 54 41 42 4c 45 20 2a 2f 0a 20 20 20 20 20  f TABLE */.     
1e600 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54     if( pE->op==T
1e610 4b 5f 44 4f 54 20 29 7b 0a 20 20 20 20 20 20 20  K_DOT ){.       
1e620 20 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e 70     assert( pE->p
1e630 4c 65 66 74 21 3d 30 20 29 3b 0a 20 20 20 20 20  Left!=0 );.     
1e640 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
1e650 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
1e660 2d 3e 70 4c 65 66 74 2c 20 45 50 5f 49 6e 74 56  ->pLeft, EP_IntV
1e670 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20  alue) );.       
1e680 20 20 20 7a 54 4e 61 6d 65 20 3d 20 70 45 2d 3e     zTName = pE->
1e690 70 4c 65 66 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b  pLeft->u.zToken;
1e6a0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1e6b0 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f     for(i=0, pFro
1e6c0 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69  m=pTabList->a; i
1e6d0 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b  <pTabList->nSrc;
1e6e0 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a   i++, pFrom++){.
1e6f0 20 20 20 20 20 20 20 20 20 20 54 61 62 6c 65 20            Table 
1e700 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70  *pTab = pFrom->p
1e710 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20 53  Tab;.          S
1e720 65 6c 65 63 74 20 2a 70 53 75 62 20 3d 20 70 46  elect *pSub = pF
1e730 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20  rom->pSelect;.  
1e740 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54          char *zT
1e750 61 62 4e 61 6d 65 20 3d 20 70 46 72 6f 6d 2d 3e  abName = pFrom->
1e760 7a 41 6c 69 61 73 3b 0a 20 20 20 20 20 20 20 20  zAlias;.        
1e770 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
1e780 63 68 65 6d 61 4e 61 6d 65 20 3d 20 30 3b 0a 20  chemaName = 0;. 
1e790 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 44 62           int iDb
1e7a0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
1e7b0 7a 54 61 62 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20  zTabName==0 ){. 
1e7c0 20 20 20 20 20 20 20 20 20 20 20 7a 54 61 62 4e             zTabN
1e7d0 61 6d 65 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d  ame = pTab->zNam
1e7e0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  e;.          }. 
1e7f0 20 20 20 20 20 20 20 20 20 69 66 28 20 64 62 2d           if( db-
1e800 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
1e810 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
1e820 20 69 66 28 20 70 53 75 62 3d 3d 30 20 7c 7c 20   if( pSub==0 || 
1e830 28 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20  (pSub->selFlags 
1e840 26 20 53 46 5f 4e 65 73 74 65 64 46 72 6f 6d 29  & SF_NestedFrom)
1e850 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
1e860 20 20 20 70 53 75 62 20 3d 20 30 3b 0a 20 20 20     pSub = 0;.   
1e870 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 4e           if( zTN
1e880 61 6d 65 20 26 26 20 73 71 6c 69 74 65 33 53 74  ame && sqlite3St
1e890 72 49 43 6d 70 28 7a 54 4e 61 6d 65 2c 20 7a 54  rICmp(zTName, zT
1e8a0 61 62 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20  abName)!=0 ){.  
1e8b0 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
1e8c0 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
1e8d0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
1e8e0 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
1e8f0 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70  emaToIndex(db, p
1e900 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  Tab->pSchema);. 
1e910 20 20 20 20 20 20 20 20 20 20 20 7a 53 63 68 65             zSche
1e920 6d 61 4e 61 6d 65 20 3d 20 69 44 62 3e 3d 30 20  maName = iDb>=0 
1e930 3f 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a  ? db->aDb[iDb].z
1e940 4e 61 6d 65 20 3a 20 22 2a 22 3b 0a 20 20 20 20  Name : "*";.    
1e950 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1e960 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61    for(j=0; j<pTa
1e970 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20  b->nCol; j++){. 
1e980 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20             char 
1e990 2a 7a 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 61  *zName = pTab->a
1e9a0 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  Col[j].zName;.  
1e9b0 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a            char *
1e9c0 7a 43 6f 6c 6e 61 6d 65 3b 20 20 2f 2a 20 54 68  zColname;  /* Th
1e9d0 65 20 63 6f 6d 70 75 74 65 64 20 63 6f 6c 75 6d  e computed colum
1e9e0 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20  n name */.      
1e9f0 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 6f 46        char *zToF
1ea00 72 65 65 3b 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63  ree;   /* Malloc
1ea10 65 64 20 73 74 72 69 6e 67 20 74 68 61 74 20 6e  ed string that n
1ea20 65 65 64 73 20 74 6f 20 62 65 20 66 72 65 65 64  eeds to be freed
1ea30 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
1ea40 54 6f 6b 65 6e 20 73 43 6f 6c 6e 61 6d 65 3b 20  Token sColname; 
1ea50 20 2f 2a 20 43 6f 6d 70 75 74 65 64 20 63 6f 6c   /* Computed col
1ea60 75 6d 6e 20 6e 61 6d 65 20 61 73 20 61 20 74 6f  umn name as a to
1ea70 6b 65 6e 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20  ken */..        
1ea80 20 20 20 20 61 73 73 65 72 74 28 20 7a 4e 61 6d      assert( zNam
1ea90 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  e );.           
1eaa0 20 69 66 28 20 7a 54 4e 61 6d 65 20 26 26 20 70   if( zTName && p
1eab0 53 75 62 0a 20 20 20 20 20 20 20 20 20 20 20 20  Sub.            
1eac0 20 26 26 20 73 71 6c 69 74 65 33 4d 61 74 63 68   && sqlite3Match
1ead0 53 70 61 6e 4e 61 6d 65 28 70 53 75 62 2d 3e 70  SpanName(pSub->p
1eae0 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 53 70 61  EList->a[j].zSpa
1eaf0 6e 2c 20 30 2c 20 7a 54 4e 61 6d 65 2c 20 30 29  n, 0, zTName, 0)
1eb00 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20  ==0.            
1eb10 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
1eb20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
1eb30 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
1eb40 20 20 20 20 20 20 2f 2a 20 49 66 20 61 20 63 6f        /* If a co
1eb50 6c 75 6d 6e 20 69 73 20 6d 61 72 6b 65 64 20 61  lumn is marked a
1eb60 73 20 27 68 69 64 64 65 6e 27 20 28 63 75 72 72  s 'hidden' (curr
1eb70 65 6e 74 6c 79 20 6f 6e 6c 79 20 70 6f 73 73 69  ently only possi
1eb80 62 6c 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  ble.            
1eb90 2a 2a 20 66 6f 72 20 76 69 72 74 75 61 6c 20 74  ** for virtual t
1eba0 61 62 6c 65 73 29 2c 20 64 6f 20 6e 6f 74 20 69  ables), do not i
1ebb0 6e 63 6c 75 64 65 20 69 74 20 69 6e 20 74 68 65  nclude it in the
1ebc0 20 65 78 70 61 6e 64 65 64 0a 20 20 20 20 20 20   expanded.      
1ebd0 20 20 20 20 20 20 2a 2a 20 72 65 73 75 6c 74 2d        ** result-
1ebe0 73 65 74 20 6c 69 73 74 2e 0a 20 20 20 20 20 20  set list..      
1ebf0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
1ec00 20 20 20 20 20 69 66 28 20 49 73 48 69 64 64 65       if( IsHidde
1ec10 6e 43 6f 6c 75 6d 6e 28 26 70 54 61 62 2d 3e 61  nColumn(&pTab->a
1ec20 43 6f 6c 5b 6a 5d 29 20 29 7b 0a 20 20 20 20 20  Col[j]) ){.     
1ec30 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
1ec40 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 29  IsVirtual(pTab))
1ec50 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1ec60 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
1ec70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1ec80 20 20 20 20 74 61 62 6c 65 53 65 65 6e 20 3d 20      tableSeen = 
1ec90 31 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20  1;..            
1eca0 69 66 28 20 69 3e 30 20 26 26 20 7a 54 4e 61 6d  if( i>0 && zTNam
1ecb0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
1ecc0 20 20 20 20 20 20 69 66 28 20 28 70 46 72 6f 6d        if( (pFrom
1ecd0 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f  ->jointype & JT_
1ece0 4e 41 54 55 52 41 4c 29 21 3d 30 0a 20 20 20 20  NATURAL)!=0.    
1ecf0 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 74              && t
1ed00 61 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64  ableAndColumnInd
1ed10 65 78 28 70 54 61 62 4c 69 73 74 2c 20 69 2c 20  ex(pTabList, i, 
1ed20 7a 4e 61 6d 65 2c 20 30 2c 20 30 29 0a 20 20 20  zName, 0, 0).   
1ed30 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20             ){.  
1ed40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ed50 20 49 6e 20 61 20 4e 41 54 55 52 41 4c 20 6a 6f   In a NATURAL jo
1ed60 69 6e 2c 20 6f 6d 69 74 20 74 68 65 20 6a 6f 69  in, omit the joi
1ed70 6e 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20 74  n columns from t
1ed80 68 65 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  he .            
1ed90 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 74 6f 20      ** table to 
1eda0 74 68 65 20 72 69 67 68 74 20 6f 66 20 74 68 65  the right of the
1edb0 20 6a 6f 69 6e 20 2a 2f 0a 20 20 20 20 20 20 20   join */.       
1edc0 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
1edd0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e;.             
1ede0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
1edf0 20 69 66 28 20 73 71 6c 69 74 65 33 49 64 4c 69   if( sqlite3IdLi
1ee00 73 74 49 6e 64 65 78 28 70 46 72 6f 6d 2d 3e 70  stIndex(pFrom->p
1ee10 55 73 69 6e 67 2c 20 7a 4e 61 6d 65 29 3e 3d 30  Using, zName)>=0
1ee20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1ee30 20 20 20 20 2f 2a 20 49 6e 20 61 20 6a 6f 69 6e      /* In a join
1ee40 20 77 69 74 68 20 61 20 55 53 49 4e 47 20 63 6c   with a USING cl
1ee50 61 75 73 65 2c 20 6f 6d 69 74 20 63 6f 6c 75 6d  ause, omit colum
1ee60 6e 73 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20  ns in the.      
1ee70 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75 73 69            ** usi
1ee80 6e 67 20 63 6c 61 75 73 65 20 66 72 6f 6d 20 74  ng clause from t
1ee90 68 65 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20  he table on the 
1eea0 72 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20 20 20  right. */.      
1eeb0 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
1eec0 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
1eed0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
1eee0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 52  }.            pR
1eef0 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78  ight = sqlite3Ex
1ef00 70 72 28 64 62 2c 20 54 4b 5f 49 44 2c 20 7a 4e  pr(db, TK_ID, zN
1ef10 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
1ef20 20 20 7a 43 6f 6c 6e 61 6d 65 20 3d 20 7a 4e 61    zColname = zNa
1ef30 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  me;.            
1ef40 7a 54 6f 46 72 65 65 20 3d 20 30 3b 0a 20 20 20  zToFree = 0;.   
1ef50 20 20 20 20 20 20 20 20 20 69 66 28 20 6c 6f 6e           if( lon
1ef60 67 4e 61 6d 65 73 20 7c 7c 20 70 54 61 62 4c 69  gNames || pTabLi
1ef70 73 74 2d 3e 6e 53 72 63 3e 31 20 29 7b 0a 20 20  st->nSrc>1 ){.  
1ef80 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72              Expr
1ef90 20 2a 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 20   *pLeft;.       
1efa0 20 20 20 20 20 20 20 70 4c 65 66 74 20 3d 20 73         pLeft = s
1efb0 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20 54  qlite3Expr(db, T
1efc0 4b 5f 49 44 2c 20 7a 54 61 62 4e 61 6d 65 29 3b  K_ID, zTabName);
1efd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
1efe0 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45  Expr = sqlite3PE
1eff0 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 44  xpr(pParse, TK_D
1f000 4f 54 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68  OT, pLeft, pRigh
1f010 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  t, 0);.         
1f020 20 20 20 20 20 69 66 28 20 7a 53 63 68 65 6d 61       if( zSchema
1f030 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Name ){.        
1f040 20 20 20 20 20 20 20 20 70 4c 65 66 74 20 3d 20          pLeft = 
1f050 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20  sqlite3Expr(db, 
1f060 54 4b 5f 49 44 2c 20 7a 53 63 68 65 6d 61 4e 61  TK_ID, zSchemaNa
1f070 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  me);.           
1f080 20 20 20 20 20 70 45 78 70 72 20 3d 20 73 71 6c       pExpr = sql
1f090 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
1f0a0 2c 20 54 4b 5f 44 4f 54 2c 20 70 4c 65 66 74 2c  , TK_DOT, pLeft,
1f0b0 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20   pExpr, 0);.    
1f0c0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1f0d0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6c 6f            if( lo
1f0e0 6e 67 4e 61 6d 65 73 20 29 7b 0a 20 20 20 20 20  ngNames ){.     
1f0f0 20 20 20 20 20 20 20 20 20 20 20 7a 43 6f 6c 6e             zColn
1f100 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  ame = sqlite3MPr
1f110 69 6e 74 66 28 64 62 2c 20 22 25 73 2e 25 73 22  intf(db, "%s.%s"
1f120 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 7a 4e 61 6d  , zTabName, zNam
1f130 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
1f140 20 20 20 20 7a 54 6f 46 72 65 65 20 3d 20 7a 43      zToFree = zC
1f150 6f 6c 6e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  olname;.        
1f160 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1f170 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1f180 20 20 20 20 20 20 20 20 20 70 45 78 70 72 20 3d           pExpr =
1f190 20 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20   pRight;.       
1f1a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1f1b0 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65     pNew = sqlite
1f1c0 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
1f1d0 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 70 45  pParse, pNew, pE
1f1e0 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  xpr);.          
1f1f0 20 20 73 43 6f 6c 6e 61 6d 65 2e 7a 20 3d 20 7a    sColname.z = z
1f200 43 6f 6c 6e 61 6d 65 3b 0a 20 20 20 20 20 20 20  Colname;.       
1f210 20 20 20 20 20 73 43 6f 6c 6e 61 6d 65 2e 6e 20       sColname.n 
1f220 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
1f230 30 28 7a 43 6f 6c 6e 61 6d 65 29 3b 0a 20 20 20  0(zColname);.   
1f240 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1f250 45 78 70 72 4c 69 73 74 53 65 74 4e 61 6d 65 28  ExprListSetName(
1f260 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 26 73  pParse, pNew, &s
1f270 43 6f 6c 6e 61 6d 65 2c 20 30 29 3b 0a 20 20 20  Colname, 0);.   
1f280 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65           if( pNe
1f290 77 20 26 26 20 28 70 2d 3e 73 65 6c 46 6c 61 67  w && (p->selFlag
1f2a0 73 20 26 20 53 46 5f 4e 65 73 74 65 64 46 72 6f  s & SF_NestedFro
1f2b0 6d 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  m)!=0 ){.       
1f2c0 20 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78         struct Ex
1f2d0 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 58 20  prList_item *pX 
1f2e0 3d 20 26 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d  = &pNew->a[pNew-
1f2f0 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20 20 20 20  >nExpr-1];.     
1f300 20 20 20 20 20 20 20 20 20 69 66 28 20 70 53 75           if( pSu
1f310 62 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  b ){.           
1f320 20 20 20 20 20 70 58 2d 3e 7a 53 70 61 6e 20 3d       pX->zSpan =
1f330 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
1f340 28 64 62 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73  (db, pSub->pELis
1f350 74 2d 3e 61 5b 6a 5d 2e 7a 53 70 61 6e 29 3b 0a  t->a[j].zSpan);.
1f360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f370 74 65 73 74 63 61 73 65 28 20 70 58 2d 3e 7a 53  testcase( pX->zS
1f380 70 61 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  pan==0 );.      
1f390 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1f3a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1f3b0 58 2d 3e 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74  X->zSpan = sqlit
1f3c0 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25  e3MPrintf(db, "%
1f3d0 73 2e 25 73 2e 25 73 22 2c 0a 20 20 20 20 20 20  s.%s.%s",.      
1f3e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f3f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f400 20 20 20 20 20 7a 53 63 68 65 6d 61 4e 61 6d 65       zSchemaName
1f410 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 7a 43 6f 6c  , zTabName, zCol
1f420 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  name);.         
1f430 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
1f440 20 70 58 2d 3e 7a 53 70 61 6e 3d 3d 30 20 29 3b   pX->zSpan==0 );
1f450 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
1f460 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
1f470 58 2d 3e 62 53 70 61 6e 49 73 54 61 62 20 3d 20  X->bSpanIsTab = 
1f480 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  1;.            }
1f490 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
1f4a0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
1f4b0 54 6f 46 72 65 65 29 3b 0a 20 20 20 20 20 20 20  ToFree);.       
1f4c0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
1f4d0 20 20 20 20 20 20 20 69 66 28 20 21 74 61 62 6c         if( !tabl
1f4e0 65 53 65 65 6e 20 29 7b 0a 20 20 20 20 20 20 20  eSeen ){.       
1f4f0 20 20 20 69 66 28 20 7a 54 4e 61 6d 65 20 29 7b     if( zTName ){
1f500 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
1f510 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
1f520 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 74 61  rse, "no such ta
1f530 62 6c 65 3a 20 25 73 22 2c 20 7a 54 4e 61 6d 65  ble: %s", zTName
1f540 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
1f550 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
1f560 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
1f570 70 50 61 72 73 65 2c 20 22 6e 6f 20 74 61 62 6c  pParse, "no tabl
1f580 65 73 20 73 70 65 63 69 66 69 65 64 22 29 3b 0a  es specified");.
1f590 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1f5a0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1f5b0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45    }.    sqlite3E
1f5c0 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
1f5d0 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 70  , pEList);.    p
1f5e0 2d 3e 70 45 4c 69 73 74 20 3d 20 70 4e 65 77 3b  ->pEList = pNew;
1f5f0 0a 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f  .  }.#if SQLITE_
1f600 4d 41 58 5f 43 4f 4c 55 4d 4e 0a 20 20 69 66 28  MAX_COLUMN.  if(
1f610 20 70 2d 3e 70 45 4c 69 73 74 20 26 26 20 70 2d   p->pEList && p-
1f620 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 64  >pEList->nExpr>d
1f630 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45  b->aLimit[SQLITE
1f640 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20 29  _LIMIT_COLUMN] )
1f650 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
1f660 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
1f670 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20  oo many columns 
1f680 69 6e 20 72 65 73 75 6c 74 20 73 65 74 22 29 3b  in result set");
1f690 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65  .  }.#endif.  re
1f6a0 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75  turn WRC_Continu
1f6b0 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4e 6f 2d 6f  e;.}../*.** No-o
1f6c0 70 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 74 68  p routine for th
1f6d0 65 20 70 61 72 73 65 2d 74 72 65 65 20 77 61 6c  e parse-tree wal
1f6e0 6b 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  ker..**.** When 
1f6f0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
1f700 74 68 65 20 57 61 6c 6b 65 72 2e 78 45 78 70 72  the Walker.xExpr
1f710 43 61 6c 6c 62 61 63 6b 20 74 68 65 6e 20 65 78  Callback then ex
1f720 70 72 65 73 73 69 6f 6e 20 74 72 65 65 73 0a 2a  pression trees.*
1f730 2a 20 61 72 65 20 77 61 6c 6b 65 64 20 77 69 74  * are walked wit
1f740 68 6f 75 74 20 61 6e 79 20 61 63 74 69 6f 6e 73  hout any actions
1f750 20 62 65 69 6e 67 20 74 61 6b 65 6e 20 61 74 20   being taken at 
1f760 65 61 63 68 20 6e 6f 64 65 2e 20 20 50 72 65 73  each node.  Pres
1f770 75 6d 61 62 6c 79 2c 0a 2a 2a 20 77 68 65 6e 20  umably,.** when 
1f780 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
1f790 75 73 65 64 20 66 6f 72 20 57 61 6c 6b 65 72 2e  used for Walker.
1f7a0 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 74 68  xExprCallback th
1f7b0 65 6e 20 0a 2a 2a 20 57 61 6c 6b 65 72 2e 78 53  en .** Walker.xS
1f7c0 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 69 73  electCallback is
1f7d0 20 73 65 74 20 74 6f 20 64 6f 20 73 6f 6d 65 74   set to do somet
1f7e0 68 69 6e 67 20 75 73 65 66 75 6c 20 66 6f 72 20  hing useful for 
1f7f0 65 76 65 72 79 20 0a 2a 2a 20 73 75 62 71 75 65  every .** subque
1f800 72 79 20 69 6e 20 74 68 65 20 70 61 72 73 65 72  ry in the parser
1f810 20 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   tree..*/.static
1f820 20 69 6e 74 20 65 78 70 72 57 61 6c 6b 4e 6f 6f   int exprWalkNoo
1f830 70 28 57 61 6c 6b 65 72 20 2a 4e 6f 74 55 73 65  p(Walker *NotUse
1f840 64 2c 20 45 78 70 72 20 2a 4e 6f 74 55 73 65 64  d, Expr *NotUsed
1f850 32 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  2){.  UNUSED_PAR
1f860 41 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c  AMETER2(NotUsed,
1f870 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 72 65   NotUsed2);.  re
1f880 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75  turn WRC_Continu
1f890 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  e;.}../*.** This
1f8a0 20 72 6f 75 74 69 6e 65 20 22 65 78 70 61 6e 64   routine "expand
1f8b0 73 22 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  s" a SELECT stat
1f8c0 65 6d 65 6e 74 20 61 6e 64 20 61 6c 6c 20 6f 66  ement and all of
1f8d0 20 69 74 73 20 73 75 62 71 75 65 72 69 65 73 2e   its subqueries.
1f8e0 0a 2a 2a 20 46 6f 72 20 61 64 64 69 74 69 6f 6e  .** For addition
1f8f0 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f  al information o
1f900 6e 20 77 68 61 74 20 69 74 20 6d 65 61 6e 73 20  n what it means 
1f910 74 6f 20 22 65 78 70 61 6e 64 22 20 61 20 53 45  to "expand" a SE
1f920 4c 45 43 54 0a 2a 2a 20 73 74 61 74 65 6d 65 6e  LECT.** statemen
1f930 74 2c 20 73 65 65 20 74 68 65 20 63 6f 6d 6d 65  t, see the comme
1f940 6e 74 20 6f 6e 20 74 68 65 20 73 65 6c 65 63 74  nt on the select
1f950 45 78 70 61 6e 64 20 77 6f 72 6b 65 72 20 63 61  Expand worker ca
1f960 6c 6c 62 61 63 6b 20 61 62 6f 76 65 2e 0a 2a 2a  llback above..**
1f970 0a 2a 2a 20 45 78 70 61 6e 64 69 6e 67 20 61 20  .** Expanding a 
1f980 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
1f990 20 69 73 20 74 68 65 20 66 69 72 73 74 20 73 74   is the first st
1f9a0 65 70 20 69 6e 20 70 72 6f 63 65 73 73 69 6e 67  ep in processing
1f9b0 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61   a.** SELECT sta
1f9c0 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 53 45 4c  tement.  The SEL
1f9d0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 6d 75  ECT statement mu
1f9e0 73 74 20 62 65 20 65 78 70 61 6e 64 65 64 20 62  st be expanded b
1f9f0 65 66 6f 72 65 0a 2a 2a 20 6e 61 6d 65 20 72 65  efore.** name re
1fa00 73 6f 6c 75 74 69 6f 6e 20 69 73 20 70 65 72 66  solution is perf
1fa10 6f 72 6d 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ormed..**.** If 
1fa20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20 77 72  anything goes wr
1fa30 6f 6e 67 2c 20 61 6e 20 65 72 72 6f 72 20 6d 65  ong, an error me
1fa40 73 73 61 67 65 20 69 73 20 77 72 69 74 74 65 6e  ssage is written
1fa50 20 69 6e 74 6f 20 70 50 61 72 73 65 2e 0a 2a 2a   into pParse..**
1fa60 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e   The calling fun
1fa70 63 74 69 6f 6e 20 63 61 6e 20 64 65 74 65 63 74  ction can detect
1fa80 20 74 68 65 20 70 72 6f 62 6c 65 6d 20 62 79 20   the problem by 
1fa90 6c 6f 6f 6b 69 6e 67 20 61 74 20 70 50 61 72 73  looking at pPars
1faa0 65 2d 3e 6e 45 72 72 0a 2a 2a 20 61 6e 64 2f 6f  e->nErr.** and/o
1fab0 72 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  r pParse->db->ma
1fac0 6c 6c 6f 63 46 61 69 6c 65 64 2e 0a 2a 2f 0a 73  llocFailed..*/.s
1fad0 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74  tatic void sqlit
1fae0 65 33 53 65 6c 65 63 74 45 78 70 61 6e 64 28 50  e3SelectExpand(P
1faf0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65  arse *pParse, Se
1fb00 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a  lect *pSelect){.
1fb10 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 6d 65    Walker w;.  me
1fb20 6d 73 65 74 28 26 77 2c 20 30 2c 20 73 69 7a 65  mset(&w, 0, size
1fb30 6f 66 28 77 29 29 3b 0a 20 20 77 2e 78 45 78 70  of(w));.  w.xExp
1fb40 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72  rCallback = expr
1fb50 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 70 50  WalkNoop;.  w.pP
1fb60 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20  arse = pParse;. 
1fb70 20 69 66 28 20 70 50 61 72 73 65 2d 3e 68 61 73   if( pParse->has
1fb80 43 6f 6d 70 6f 75 6e 64 20 29 7b 0a 20 20 20 20  Compound ){.    
1fb90 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  w.xSelectCallbac
1fba0 6b 20 3d 20 63 6f 6e 76 65 72 74 43 6f 6d 70 6f  k = convertCompo
1fbb0 75 6e 64 53 65 6c 65 63 74 54 6f 53 75 62 71 75  undSelectToSubqu
1fbc0 65 72 79 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ery;.    sqlite3
1fbd0 57 61 6c 6b 53 65 6c 65 63 74 28 26 77 2c 20 70  WalkSelect(&w, p
1fbe0 53 65 6c 65 63 74 29 3b 0a 20 20 7d 0a 20 20 77  Select);.  }.  w
1fbf0 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
1fc00 20 3d 20 73 65 6c 65 63 74 45 78 70 61 6e 64 65   = selectExpande
1fc10 72 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b  r;.  sqlite3Walk
1fc20 53 65 6c 65 63 74 28 26 77 2c 20 70 53 65 6c 65  Select(&w, pSele
1fc30 63 74 29 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66  ct);.}...#ifndef
1fc40 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
1fc50 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 54 68 69 73  QUERY./*.** This
1fc60 20 69 73 20 61 20 57 61 6c 6b 65 72 2e 78 53 65   is a Walker.xSe
1fc70 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 63 61 6c  lectCallback cal
1fc80 6c 62 61 63 6b 20 66 6f 72 20 74 68 65 20 73 71  lback for the sq
1fc90 6c 69 74 65 33 53 65 6c 65 63 74 54 79 70 65 49  lite3SelectTypeI
1fca0 6e 66 6f 28 29 0a 2a 2a 20 69 6e 74 65 72 66 61  nfo().** interfa
1fcb0 63 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 61  ce..**.** For ea
1fcc0 63 68 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73  ch FROM-clause s
1fcd0 75 62 71 75 65 72 79 2c 20 61 64 64 20 43 6f 6c  ubquery, add Col
1fce0 75 6d 6e 2e 7a 54 79 70 65 20 61 6e 64 20 43 6f  umn.zType and Co
1fcf0 6c 75 6d 6e 2e 7a 43 6f 6c 6c 0a 2a 2a 20 69 6e  lumn.zColl.** in
1fd00 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 74 68 65  formation to the
1fd10 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   Table structure
1fd20 20 74 68 61 74 20 72 65 70 72 65 73 65 6e 74 73   that represents
1fd30 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 0a   the result set.
1fd40 2a 2a 20 6f 66 20 74 68 61 74 20 73 75 62 71 75  ** of that subqu
1fd50 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 54  ery..**.** The T
1fd60 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 74  able structure t
1fd70 68 61 74 20 72 65 70 72 65 73 65 6e 74 73 20 74  hat represents t
1fd80 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 77 61  he result set wa
1fd90 73 20 63 6f 6e 73 74 72 75 63 74 65 64 0a 2a 2a  s constructed.**
1fda0 20 62 79 20 73 65 6c 65 63 74 45 78 70 61 6e 64   by selectExpand
1fdb0 65 72 28 29 20 62 75 74 20 74 68 65 20 74 79 70  er() but the typ
1fdc0 65 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 20  e and collation 
1fdd0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 61 73 20  information was 
1fde0 6f 6d 69 74 74 65 64 0a 2a 2a 20 61 74 20 74 68  omitted.** at th
1fdf0 61 74 20 70 6f 69 6e 74 20 62 65 63 61 75 73 65  at point because
1fe00 20 69 64 65 6e 74 69 66 69 65 72 73 20 68 61 64   identifiers had
1fe10 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 72 65   not yet been re
1fe20 73 6f 6c 76 65 64 2e 20 20 54 68 69 73 0a 2a 2a  solved.  This.**
1fe30 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
1fe40 65 64 20 61 66 74 65 72 20 69 64 65 6e 74 69 66  ed after identif
1fe50 69 65 72 20 72 65 73 6f 6c 75 74 69 6f 6e 2e 0a  ier resolution..
1fe60 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
1fe70 6c 65 63 74 41 64 64 53 75 62 71 75 65 72 79 54  lectAddSubqueryT
1fe80 79 70 65 49 6e 66 6f 28 57 61 6c 6b 65 72 20 2a  ypeInfo(Walker *
1fe90 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20  pWalker, Select 
1fea0 2a 70 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50  *p){.  Parse *pP
1feb0 61 72 73 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  arse;.  int i;. 
1fec0 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
1fed0 73 74 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63  st;.  struct Src
1fee0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d  List_item *pFrom
1fef0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ;..  assert( p->
1ff00 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65  selFlags & SF_Re
1ff10 73 6f 6c 76 65 64 20 29 3b 0a 20 20 69 66 28 20  solved );.  if( 
1ff20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  (p->selFlags & S
1ff30 46 5f 48 61 73 54 79 70 65 49 6e 66 6f 29 3d 3d  F_HasTypeInfo)==
1ff40 30 20 29 7b 0a 20 20 20 20 70 2d 3e 73 65 6c 46  0 ){.    p->selF
1ff50 6c 61 67 73 20 7c 3d 20 53 46 5f 48 61 73 54 79  lags |= SF_HasTy
1ff60 70 65 49 6e 66 6f 3b 0a 20 20 20 20 70 50 61 72  peInfo;.    pPar
1ff70 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50  se = pWalker->pP
1ff80 61 72 73 65 3b 0a 20 20 20 20 70 54 61 62 4c 69  arse;.    pTabLi
1ff90 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20  st = p->pSrc;.  
1ffa0 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d    for(i=0, pFrom
1ffb0 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c  =pTabList->a; i<
1ffc0 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20  pTabList->nSrc; 
1ffd0 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20  i++, pFrom++){. 
1ffe0 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62       Table *pTab
1fff0 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a   = pFrom->pTab;.
20000 20 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53        if( ALWAYS
20010 28 70 54 61 62 21 3d 30 29 20 26 26 20 28 70 54  (pTab!=0) && (pT
20020 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54  ab->tabFlags & T
20030 46 5f 45 70 68 65 6d 65 72 61 6c 29 21 3d 30 20  F_Ephemeral)!=0 
20040 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 20  ){.        /* A 
20050 73 75 62 2d 71 75 65 72 79 20 69 6e 20 74 68 65  sub-query in the
20060 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
20070 61 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20  a SELECT */.    
20080 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c      Select *pSel
20090 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63   = pFrom->pSelec
200a0 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  t;.        asser
200b0 74 28 20 70 53 65 6c 20 29 3b 0a 20 20 20 20 20  t( pSel );.     
200c0 20 20 20 77 68 69 6c 65 28 20 70 53 65 6c 2d 3e     while( pSel->
200d0 70 50 72 69 6f 72 20 29 20 70 53 65 6c 20 3d 20  pPrior ) pSel = 
200e0 70 53 65 6c 2d 3e 70 50 72 69 6f 72 3b 0a 20 20  pSel->pPrior;.  
200f0 20 20 20 20 20 20 73 65 6c 65 63 74 41 64 64 43        selectAddC
20100 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43 6f 6c 6c  olumnTypeAndColl
20110 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 70 54  ation(pParse, pT
20120 61 62 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20 20  ab, pSel);.     
20130 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
20140 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
20150 75 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f  ue;.}.#endif.../
20160 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
20170 65 20 61 64 64 73 20 64 61 74 61 74 79 70 65 20  e adds datatype 
20180 61 6e 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  and collating se
20190 71 75 65 6e 63 65 20 69 6e 66 6f 72 6d 61 74 69  quence informati
201a0 6f 6e 20 74 6f 0a 2a 2a 20 74 68 65 20 54 61 62  on to.** the Tab
201b0 6c 65 20 73 74 72 75 63 74 75 72 65 73 20 6f 66  le structures of
201c0 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65   all FROM-clause
201d0 20 73 75 62 71 75 65 72 69 65 73 20 69 6e 20 61   subqueries in a
201e0 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65  .** SELECT state
201f0 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20  ment..**.** Use 
20200 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 66 74  this routine aft
20210 65 72 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69  er name resoluti
20220 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  on..*/.static vo
20230 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  id sqlite3Select
20240 41 64 64 54 79 70 65 49 6e 66 6f 28 50 61 72 73  AddTypeInfo(Pars
20250 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63  e *pParse, Selec
20260 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 23 69 66  t *pSelect){.#if
20270 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
20280 5f 53 55 42 51 55 45 52 59 0a 20 20 57 61 6c 6b  _SUBQUERY.  Walk
20290 65 72 20 77 3b 0a 20 20 6d 65 6d 73 65 74 28 26  er w;.  memset(&
202a0 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 29 29  w, 0, sizeof(w))
202b0 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c  ;.  w.xSelectCal
202c0 6c 62 61 63 6b 20 3d 20 73 65 6c 65 63 74 41 64  lback = selectAd
202d0 64 53 75 62 71 75 65 72 79 54 79 70 65 49 6e 66  dSubqueryTypeInf
202e0 6f 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c  o;.  w.xExprCall
202f0 62 61 63 6b 20 3d 20 65 78 70 72 57 61 6c 6b 4e  back = exprWalkN
20300 6f 6f 70 3b 0a 20 20 77 2e 70 50 61 72 73 65 20  oop;.  w.pParse 
20310 3d 20 70 50 61 72 73 65 3b 0a 20 20 77 2e 62 53  = pParse;.  w.bS
20320 65 6c 65 63 74 44 65 70 74 68 46 69 72 73 74 20  electDepthFirst 
20330 3d 20 31 3b 0a 20 20 73 71 6c 69 74 65 33 57 61  = 1;.  sqlite3Wa
20340 6c 6b 53 65 6c 65 63 74 28 26 77 2c 20 70 53 65  lkSelect(&w, pSe
20350 6c 65 63 74 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a  lect);.#endif.}.
20360 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
20370 74 69 6e 65 20 73 65 74 73 20 75 70 20 61 20 53  tine sets up a S
20380 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
20390 66 6f 72 20 70 72 6f 63 65 73 73 69 6e 67 2e 20  for processing. 
203a0 20 54 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e   The.** followin
203b0 67 20 69 73 20 61 63 63 6f 6d 70 6c 69 73 68 65  g is accomplishe
203c0 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 20  d:.**.**     *  
203d0 56 44 42 45 20 43 75 72 73 6f 72 20 6e 75 6d 62  VDBE Cursor numb
203e0 65 72 73 20 61 72 65 20 61 73 73 69 67 6e 65 64  ers are assigned
203f0 20 74 6f 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61   to all FROM-cla
20400 75 73 65 20 74 65 72 6d 73 2e 0a 2a 2a 20 20 20  use terms..**   
20410 20 20 2a 20 20 45 70 68 65 6d 65 72 61 6c 20 54    *  Ephemeral T
20420 61 62 6c 65 20 6f 62 6a 65 63 74 73 20 61 72 65  able objects are
20430 20 63 72 65 61 74 65 64 20 66 6f 72 20 61 6c 6c   created for all
20440 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62   FROM-clause sub
20450 71 75 65 72 69 65 73 2e 0a 2a 2a 20 20 20 20 20  queries..**     
20460 2a 20 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20  *  ON and USING 
20470 63 6c 61 75 73 65 73 20 61 72 65 20 73 68 69 66  clauses are shif
20480 74 65 64 20 69 6e 74 6f 20 57 48 45 52 45 20 73  ted into WHERE s
20490 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 20 20 20  tatements.**    
204a0 20 2a 20 20 57 69 6c 64 63 61 72 64 73 20 22 2a   *  Wildcards "*
204b0 22 20 61 6e 64 20 22 54 41 42 4c 45 2e 2a 22 20  " and "TABLE.*" 
204c0 69 6e 20 72 65 73 75 6c 74 20 73 65 74 73 20 61  in result sets a
204d0 72 65 20 65 78 70 61 6e 64 65 64 2e 0a 2a 2a 20  re expanded..** 
204e0 20 20 20 20 2a 20 20 49 64 65 6e 74 69 66 69 65      *  Identifie
204f0 72 73 20 69 6e 20 65 78 70 72 65 73 73 69 6f 6e  rs in expression
20500 20 61 72 65 20 6d 61 74 63 68 65 64 20 74 6f 20   are matched to 
20510 74 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  tables..**.** Th
20520 69 73 20 72 6f 75 74 69 6e 65 20 61 63 74 73 20  is routine acts 
20530 72 65 63 75 72 73 69 76 65 6c 79 20 6f 6e 20 61  recursively on a
20540 6c 6c 20 73 75 62 71 75 65 72 69 65 73 20 77 69  ll subqueries wi
20550 74 68 69 6e 20 74 68 65 20 53 45 4c 45 43 54 2e  thin the SELECT.
20560 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
20570 53 65 6c 65 63 74 50 72 65 70 28 0a 20 20 50 61  SelectPrep(.  Pa
20580 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
20590 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
205a0 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
205b0 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20  Select *p,      
205c0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45         /* The SE
205d0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 62  LECT statement b
205e0 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20  eing coded. */. 
205f0 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4f   NameContext *pO
20600 75 74 65 72 4e 43 20 20 2f 2a 20 4e 61 6d 65 20  uterNC  /* Name 
20610 63 6f 6e 74 65 78 74 20 66 6f 72 20 63 6f 6e 74  context for cont
20620 61 69 6e 65 72 20 2a 2f 0a 29 7b 0a 20 20 73 71  ainer */.){.  sq
20630 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 66 28  lite3 *db;.  if(
20640 20 4e 45 56 45 52 28 70 3d 3d 30 29 20 29 20 72   NEVER(p==0) ) r
20650 65 74 75 72 6e 3b 0a 20 20 64 62 20 3d 20 70 50  eturn;.  db = pP
20660 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20  arse->db;.  if( 
20670 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
20680 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
20690 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53   p->selFlags & S
206a0 46 5f 48 61 73 54 79 70 65 49 6e 66 6f 20 29 20  F_HasTypeInfo ) 
206b0 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65  return;.  sqlite
206c0 33 53 65 6c 65 63 74 45 78 70 61 6e 64 28 70 50  3SelectExpand(pP
206d0 61 72 73 65 2c 20 70 29 3b 0a 20 20 69 66 28 20  arse, p);.  if( 
206e0 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
206f0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
20700 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c   ) return;.  sql
20710 69 74 65 33 52 65 73 6f 6c 76 65 53 65 6c 65 63  ite3ResolveSelec
20720 74 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70  tNames(pParse, p
20730 2c 20 70 4f 75 74 65 72 4e 43 29 3b 0a 20 20 69  , pOuterNC);.  i
20740 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
20750 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
20760 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  led ) return;.  
20770 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41 64 64  sqlite3SelectAdd
20780 54 79 70 65 49 6e 66 6f 28 70 50 61 72 73 65 2c  TypeInfo(pParse,
20790 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   p);.}../*.** Re
207a0 73 65 74 20 74 68 65 20 61 67 67 72 65 67 61 74  set the aggregat
207b0 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 2e 0a 2a  e accumulator..*
207c0 2a 0a 2a 2a 20 54 68 65 20 61 67 67 72 65 67 61  *.** The aggrega
207d0 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 69  te accumulator i
207e0 73 20 61 20 73 65 74 20 6f 66 20 6d 65 6d 6f 72  s a set of memor
207f0 79 20 63 65 6c 6c 73 20 74 68 61 74 20 68 6f 6c  y cells that hol
20800 64 0a 2a 2a 20 69 6e 74 65 72 6d 65 64 69 61 74  d.** intermediat
20810 65 20 72 65 73 75 6c 74 73 20 77 68 69 6c 65 20  e results while 
20820 63 61 6c 63 75 6c 61 74 69 6e 67 20 61 6e 20 61  calculating an a
20830 67 67 72 65 67 61 74 65 2e 20 20 54 68 69 73 0a  ggregate.  This.
20840 2a 2a 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72  ** routine gener
20850 61 74 65 73 20 63 6f 64 65 20 74 68 61 74 20 73  ates code that s
20860 74 6f 72 65 73 20 4e 55 4c 4c 73 20 69 6e 20 61  tores NULLs in a
20870 6c 6c 20 6f 66 20 74 68 6f 73 65 20 6d 65 6d 6f  ll of those memo
20880 72 79 0a 2a 2a 20 63 65 6c 6c 73 2e 0a 2a 2f 0a  ry.** cells..*/.
20890 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 73 65  static void rese
208a0 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 50 61 72  tAccumulator(Par
208b0 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67 67 49  se *pParse, AggI
208c0 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a  nfo *pAggInfo){.
208d0 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
208e0 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
208f0 20 69 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67   i;.  struct Agg
20900 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 75 6e 63  Info_func *pFunc
20910 3b 0a 20 20 69 66 28 20 70 41 67 67 49 6e 66 6f  ;.  if( pAggInfo
20920 2d 3e 6e 46 75 6e 63 2b 70 41 67 67 49 6e 66 6f  ->nFunc+pAggInfo
20930 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 30 20 29 7b 0a  ->nColumn==0 ){.
20940 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
20950 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 67    for(i=0; i<pAg
20960 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20  gInfo->nColumn; 
20970 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
20980 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
20990 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 41 67 67 49  P_Null, 0, pAggI
209a0 6e 66 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 4d 65  nfo->aCol[i].iMe
209b0 6d 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 70 46  m);.  }.  for(pF
209c0 75 6e 63 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46  unc=pAggInfo->aF
209d0 75 6e 63 2c 20 69 3d 30 3b 20 69 3c 70 41 67 67  unc, i=0; i<pAgg
209e0 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b  Info->nFunc; i++
209f0 2c 20 70 46 75 6e 63 2b 2b 29 7b 0a 20 20 20 20  , pFunc++){.    
20a00 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
20a10 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  2(v, OP_Null, 0,
20a20 20 70 46 75 6e 63 2d 3e 69 4d 65 6d 29 3b 0a 20   pFunc->iMem);. 
20a30 20 20 20 69 66 28 20 70 46 75 6e 63 2d 3e 69 44     if( pFunc->iD
20a40 69 73 74 69 6e 63 74 3e 3d 30 20 29 7b 0a 20 20  istinct>=0 ){.  
20a50 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70      Expr *pE = p
20a60 46 75 6e 63 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Func->pExpr;.   
20a70 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
20a80 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 2c 20  HasProperty(pE, 
20a90 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b  EP_xIsSelect) );
20aa0 0a 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e 78  .      if( pE->x
20ab0 2e 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 45 2d  .pList==0 || pE-
20ac0 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21  >x.pList->nExpr!
20ad0 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =1 ){.        sq
20ae0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
20af0 61 72 73 65 2c 20 22 44 49 53 54 49 4e 43 54 20  arse, "DISTINCT 
20b00 61 67 67 72 65 67 61 74 65 73 20 6d 75 73 74 20  aggregates must 
20b10 68 61 76 65 20 65 78 61 63 74 6c 79 20 6f 6e 65  have exactly one
20b20 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 22 61   ".           "a
20b30 72 67 75 6d 65 6e 74 22 29 3b 0a 20 20 20 20 20  rgument");.     
20b40 20 20 20 70 46 75 6e 63 2d 3e 69 44 69 73 74 69     pFunc->iDisti
20b50 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  nct = -1;.      
20b60 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 4b  }else{.        K
20b70 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
20b80 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78   = keyInfoFromEx
20b90 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
20ba0 45 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20  E->x.pList);.   
20bb0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
20bc0 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65  AddOp4(v, OP_Ope
20bd0 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70 46 75 6e  nEphemeral, pFun
20be0 63 2d 3e 69 44 69 73 74 69 6e 63 74 2c 20 30 2c  c->iDistinct, 0,
20bf0 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
20c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
20c10 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50  har*)pKeyInfo, P
20c20 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46  4_KEYINFO_HANDOF
20c30 46 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  F);.      }.    
20c40 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  }.  }.}../*.** I
20c50 6e 76 6f 6b 65 20 74 68 65 20 4f 50 5f 41 67 67  nvoke the OP_Agg
20c60 46 69 6e 61 6c 69 7a 65 20 6f 70 63 6f 64 65 20  Finalize opcode 
20c70 66 6f 72 20 65 76 65 72 79 20 61 67 67 72 65 67  for every aggreg
20c80 61 74 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  ate function.** 
20c90 69 6e 20 74 68 65 20 41 67 67 49 6e 66 6f 20 73  in the AggInfo s
20ca0 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61  tructure..*/.sta
20cb0 74 69 63 20 76 6f 69 64 20 66 69 6e 61 6c 69 7a  tic void finaliz
20cc0 65 41 67 67 46 75 6e 63 74 69 6f 6e 73 28 50 61  eAggFunctions(Pa
20cd0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67 67  rse *pParse, Agg
20ce0 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b  Info *pAggInfo){
20cf0 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
20d00 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
20d10 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 41 67  t i;.  struct Ag
20d20 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a  gInfo_func *pF;.
20d30 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 3d 70 41    for(i=0, pF=pA
20d40 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20 69  ggInfo->aFunc; i
20d50 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63  <pAggInfo->nFunc
20d60 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20  ; i++, pF++){.  
20d70 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
20d80 74 20 3d 20 70 46 2d 3e 70 45 78 70 72 2d 3e 78  t = pF->pExpr->x
20d90 2e 70 4c 69 73 74 3b 0a 20 20 20 20 61 73 73 65  .pList;.    asse
20da0 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
20db0 65 72 74 79 28 70 46 2d 3e 70 45 78 70 72 2c 20  erty(pF->pExpr, 
20dc0 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b  EP_xIsSelect) );
20dd0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
20de0 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 41 67 67  AddOp4(v, OP_Agg
20df0 46 69 6e 61 6c 2c 20 70 46 2d 3e 69 4d 65 6d 2c  Final, pF->iMem,
20e00 20 70 4c 69 73 74 20 3f 20 70 4c 69 73 74 2d 3e   pList ? pList->
20e10 6e 45 78 70 72 20 3a 20 30 2c 20 30 2c 0a 20 20  nExpr : 0, 0,.  
20e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20e30 20 20 20 20 28 76 6f 69 64 2a 29 70 46 2d 3e 70      (void*)pF->p
20e40 46 75 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45 46  Func, P4_FUNCDEF
20e50 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
20e60 55 70 64 61 74 65 20 74 68 65 20 61 63 63 75 6d  Update the accum
20e70 75 6c 61 74 6f 72 20 6d 65 6d 6f 72 79 20 63 65  ulator memory ce
20e80 6c 6c 73 20 66 6f 72 20 61 6e 20 61 67 67 72 65  lls for an aggre
20e90 67 61 74 65 20 62 61 73 65 64 20 6f 6e 0a 2a 2a  gate based on.**
20ea0 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 75 72   the current cur
20eb0 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f  sor position..*/
20ec0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 70 64  .static void upd
20ed0 61 74 65 41 63 63 75 6d 75 6c 61 74 6f 72 28 50  ateAccumulator(P
20ee0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67  arse *pParse, Ag
20ef0 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29  gInfo *pAggInfo)
20f00 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
20f10 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
20f20 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 65 67 48  nt i;.  int regH
20f30 69 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 61 64  it = 0;.  int ad
20f40 64 72 48 69 74 54 65 73 74 20 3d 20 30 3b 0a 20  drHitTest = 0;. 
20f50 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f   struct AggInfo_
20f60 66 75 6e 63 20 2a 70 46 3b 0a 20 20 73 74 72 75  func *pF;.  stru
20f70 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a  ct AggInfo_col *
20f80 70 43 3b 0a 0a 20 20 70 41 67 67 49 6e 66 6f 2d  pC;..  pAggInfo-
20f90 3e 64 69 72 65 63 74 4d 6f 64 65 20 3d 20 31 3b  >directMode = 1;
20fa0 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  .  sqlite3ExprCa
20fb0 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29  cheClear(pParse)
20fc0 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 3d  ;.  for(i=0, pF=
20fd0 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b  pAggInfo->aFunc;
20fe0 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75   i<pAggInfo->nFu
20ff0 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a  nc; i++, pF++){.
21000 20 20 20 20 69 6e 74 20 6e 41 72 67 3b 0a 20 20      int nArg;.  
21010 20 20 69 6e 74 20 61 64 64 72 4e 65 78 74 20 3d    int addrNext =
21020 20 30 3b 0a 20 20 20 20 69 6e 74 20 72 65 67 41   0;.    int regA
21030 67 67 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74  gg;.    ExprList
21040 20 2a 70 4c 69 73 74 20 3d 20 70 46 2d 3e 70 45   *pList = pF->pE
21050 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20  xpr->x.pList;.  
21060 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
21070 61 73 50 72 6f 70 65 72 74 79 28 70 46 2d 3e 70  asProperty(pF->p
21080 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
21090 63 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ct) );.    if( p
210a0 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 6e 41  List ){.      nA
210b0 72 67 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70  rg = pList->nExp
210c0 72 3b 0a 20 20 20 20 20 20 72 65 67 41 67 67 20  r;.      regAgg 
210d0 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
210e0 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 41  Range(pParse, nA
210f0 72 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  rg);.      sqlit
21100 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69  e3ExprCodeExprLi
21110 73 74 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74  st(pParse, pList
21120 2c 20 72 65 67 41 67 67 2c 20 31 29 3b 0a 20 20  , regAgg, 1);.  
21130 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e    }else{.      n
21140 41 72 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  Arg = 0;.      r
21150 65 67 41 67 67 20 3d 20 30 3b 0a 20 20 20 20 7d  egAgg = 0;.    }
21160 0a 20 20 20 20 69 66 28 20 70 46 2d 3e 69 44 69  .    if( pF->iDi
21170 73 74 69 6e 63 74 3e 3d 30 20 29 7b 0a 20 20 20  stinct>=0 ){.   
21180 20 20 20 61 64 64 72 4e 65 78 74 20 3d 20 73 71     addrNext = sq
21190 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
211a0 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 61 73 73  el(v);.      ass
211b0 65 72 74 28 20 6e 41 72 67 3d 3d 31 20 29 3b 0a  ert( nArg==1 );.
211c0 20 20 20 20 20 20 63 6f 64 65 44 69 73 74 69 6e        codeDistin
211d0 63 74 28 70 50 61 72 73 65 2c 20 70 46 2d 3e 69  ct(pParse, pF->i
211e0 44 69 73 74 69 6e 63 74 2c 20 61 64 64 72 4e 65  Distinct, addrNe
211f0 78 74 2c 20 31 2c 20 72 65 67 41 67 67 29 3b 0a  xt, 1, regAgg);.
21200 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 46      }.    if( pF
21210 2d 3e 70 46 75 6e 63 2d 3e 66 75 6e 63 46 6c 61  ->pFunc->funcFla
21220 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43  gs & SQLITE_FUNC
21230 5f 4e 45 45 44 43 4f 4c 4c 20 29 7b 0a 20 20 20  _NEEDCOLL ){.   
21240 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
21250 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 74 72  l = 0;.      str
21260 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
21270 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20 20  m *pItem;.      
21280 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 61 73 73  int j;.      ass
21290 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20 29 3b  ert( pList!=0 );
212a0 20 20 2f 2a 20 70 4c 69 73 74 21 3d 30 20 69 66    /* pList!=0 if
212b0 20 70 46 2d 3e 70 46 75 6e 63 20 68 61 73 20 4e   pF->pFunc has N
212c0 45 45 44 43 4f 4c 4c 20 2a 2f 0a 20 20 20 20 20  EEDCOLL */.     
212d0 20 66 6f 72 28 6a 3d 30 2c 20 70 49 74 65 6d 3d   for(j=0, pItem=
212e0 70 4c 69 73 74 2d 3e 61 3b 20 21 70 43 6f 6c 6c  pList->a; !pColl
212f0 20 26 26 20 6a 3c 6e 41 72 67 3b 20 6a 2b 2b 2c   && j<nArg; j++,
21300 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
21310 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
21320 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
21330 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70 45 78  arse, pItem->pEx
21340 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  pr);.      }.   
21350 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b     if( !pColl ){
21360 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d  .        pColl =
21370 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66   pParse->db->pDf
21380 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a  ltColl;.      }.
21390 20 20 20 20 20 20 69 66 28 20 72 65 67 48 69 74        if( regHit
213a0 3d 3d 30 20 26 26 20 70 41 67 67 49 6e 66 6f 2d  ==0 && pAggInfo-
213b0 3e 6e 41 63 63 75 6d 75 6c 61 74 6f 72 20 29 20  >nAccumulator ) 
213c0 72 65 67 48 69 74 20 3d 20 2b 2b 70 50 61 72 73  regHit = ++pPars
213d0 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73  e->nMem;.      s
213e0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
213f0 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20  (v, OP_CollSeq, 
21400 72 65 67 48 69 74 2c 20 30 2c 20 30 2c 20 28 63  regHit, 0, 0, (c
21410 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f  har *)pColl, P4_
21420 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 7d 0a  COLLSEQ);.    }.
21430 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
21440 64 64 4f 70 34 28 76 2c 20 4f 50 5f 41 67 67 53  ddOp4(v, OP_AggS
21450 74 65 70 2c 20 30 2c 20 72 65 67 41 67 67 2c 20  tep, 0, regAgg, 
21460 70 46 2d 3e 69 4d 65 6d 2c 0a 20 20 20 20 20 20  pF->iMem,.      
21470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21480 28 76 6f 69 64 2a 29 70 46 2d 3e 70 46 75 6e 63  (void*)pF->pFunc
21490 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20  , P4_FUNCDEF);. 
214a0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
214b0 61 6e 67 65 50 35 28 76 2c 20 28 75 38 29 6e 41  angeP5(v, (u8)nA
214c0 72 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  rg);.    sqlite3
214d0 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74  ExprCacheAffinit
214e0 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20  yChange(pParse, 
214f0 72 65 67 41 67 67 2c 20 6e 41 72 67 29 3b 0a 20  regAgg, nArg);. 
21500 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
21510 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  eTempRange(pPars
21520 65 2c 20 72 65 67 41 67 67 2c 20 6e 41 72 67 29  e, regAgg, nArg)
21530 3b 0a 20 20 20 20 69 66 28 20 61 64 64 72 4e 65  ;.    if( addrNe
21540 78 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  xt ){.      sqli
21550 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
21560 62 65 6c 28 76 2c 20 61 64 64 72 4e 65 78 74 29  bel(v, addrNext)
21570 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
21580 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50  xprCacheClear(pP
21590 61 72 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  arse);.    }.  }
215a0 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65 20 70 6f  ..  /* Before po
215b0 70 75 6c 61 74 69 6e 67 20 74 68 65 20 61 63 63  pulating the acc
215c0 75 6d 75 6c 61 74 6f 72 20 72 65 67 69 73 74 65  umulator registe
215d0 72 73 2c 20 63 6c 65 61 72 20 74 68 65 20 63 6f  rs, clear the co
215e0 6c 75 6d 6e 20 63 61 63 68 65 2e 0a 20 20 2a 2a  lumn cache..  **
215f0 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 61   Otherwise, if a
21600 6e 79 20 6f 66 20 74 68 65 20 72 65 71 75 69 72  ny of the requir
21610 65 64 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 73  ed column values
21620 20 61 72 65 20 61 6c 72 65 61 64 79 20 70 72 65   are already pre
21630 73 65 6e 74 20 0a 20 20 2a 2a 20 69 6e 20 72 65  sent .  ** in re
21640 67 69 73 74 65 72 73 2c 20 73 71 6c 69 74 65 33  gisters, sqlite3
21650 45 78 70 72 43 6f 64 65 28 29 20 6d 61 79 20 75  ExprCode() may u
21660 73 65 20 4f 50 5f 53 43 6f 70 79 20 74 6f 20 63  se OP_SCopy to c
21670 6f 70 79 20 74 68 65 20 76 61 6c 75 65 0a 20 20  opy the value.  
21680 2a 2a 20 74 6f 20 70 43 2d 3e 69 4d 65 6d 2e 20  ** to pC->iMem. 
21690 42 75 74 20 62 79 20 74 68 65 20 74 69 6d 65 20  But by the time 
216a0 74 68 65 20 76 61 6c 75 65 20 69 73 20 75 73 65  the value is use
216b0 64 2c 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  d, the original 
216c0 72 65 67 69 73 74 65 72 0a 20 20 2a 2a 20 6d 61  register.  ** ma
216d0 79 20 68 61 76 65 20 62 65 65 6e 20 75 73 65 64  y have been used
216e0 2c 20 69 6e 76 61 6c 69 64 61 74 69 6e 67 20 74  , invalidating t
216f0 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 62 75  he underlying bu
21700 66 66 65 72 20 68 6f 6c 64 69 6e 67 20 74 68 65  ffer holding the
21710 0a 20 20 2a 2a 20 74 65 78 74 20 6f 72 20 62 6c  .  ** text or bl
21720 6f 62 20 76 61 6c 75 65 2e 20 53 65 65 20 74 69  ob value. See ti
21730 63 6b 65 74 20 5b 38 38 33 30 33 34 64 63 62 35  cket [883034dcb5
21740 5d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 6f  ]..  **.  ** Ano
21750 74 68 65 72 20 73 6f 6c 75 74 69 6f 6e 20 77 6f  ther solution wo
21760 75 6c 64 20 62 65 20 74 6f 20 63 68 61 6e 67 65  uld be to change
21770 20 74 68 65 20 4f 50 5f 53 43 6f 70 79 20 75 73   the OP_SCopy us
21780 65 64 20 74 6f 20 63 6f 70 79 20 63 61 63 68 65  ed to copy cache
21790 64 0a 20 20 2a 2a 20 76 61 6c 75 65 73 20 74 6f  d.  ** values to
217a0 20 61 6e 20 4f 50 5f 43 6f 70 79 2e 0a 20 20 2a   an OP_Copy..  *
217b0 2f 0a 20 20 69 66 28 20 72 65 67 48 69 74 20 29  /.  if( regHit )
217c0 7b 0a 20 20 20 20 61 64 64 72 48 69 74 54 65 73  {.    addrHitTes
217d0 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  t = sqlite3VdbeA
217e0 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 2c 20  ddOp1(v, OP_If, 
217f0 72 65 67 48 69 74 29 3b 0a 20 20 7d 0a 20 20 73  regHit);.  }.  s
21800 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43  qlite3ExprCacheC
21810 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20  lear(pParse);.  
21820 66 6f 72 28 69 3d 30 2c 20 70 43 3d 70 41 67 67  for(i=0, pC=pAgg
21830 49 6e 66 6f 2d 3e 61 43 6f 6c 3b 20 69 3c 70 41  Info->aCol; i<pA
21840 67 67 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c  ggInfo->nAccumul
21850 61 74 6f 72 3b 20 69 2b 2b 2c 20 70 43 2b 2b 29  ator; i++, pC++)
21860 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
21870 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 43  rCode(pParse, pC
21880 2d 3e 70 45 78 70 72 2c 20 70 43 2d 3e 69 4d 65  ->pExpr, pC->iMe
21890 6d 29 3b 0a 20 20 7d 0a 20 20 70 41 67 67 49 6e  m);.  }.  pAggIn
218a0 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20 3d  fo->directMode =
218b0 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70   0;.  sqlite3Exp
218c0 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72  rCacheClear(pPar
218d0 73 65 29 3b 0a 20 20 69 66 28 20 61 64 64 72 48  se);.  if( addrH
218e0 69 74 54 65 73 74 20 29 7b 0a 20 20 20 20 73 71  itTest ){.    sq
218f0 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
21900 65 28 76 2c 20 61 64 64 72 48 69 74 54 65 73 74  e(v, addrHitTest
21910 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
21920 41 64 64 20 61 20 73 69 6e 67 6c 65 20 4f 50 5f  Add a single OP_
21930 45 78 70 6c 61 69 6e 20 69 6e 73 74 72 75 63 74  Explain instruct
21940 69 6f 6e 20 74 6f 20 74 68 65 20 56 44 42 45 20  ion to the VDBE 
21950 74 6f 20 65 78 70 6c 61 69 6e 20 61 20 73 69 6d  to explain a sim
21960 70 6c 65 0a 2a 2a 20 63 6f 75 6e 74 28 2a 29 20  ple.** count(*) 
21970 71 75 65 72 79 20 28 22 53 45 4c 45 43 54 20 63  query ("SELECT c
21980 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 70 54 61  ount(*) FROM pTa
21990 62 22 29 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  b")..*/.#ifndef 
219a0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
219b0 41 49 4e 0a 73 74 61 74 69 63 20 76 6f 69 64 20  AIN.static void 
219c0 65 78 70 6c 61 69 6e 53 69 6d 70 6c 65 43 6f 75  explainSimpleCou
219d0 6e 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  nt(.  Parse *pPa
219e0 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  rse,            
219f0 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63        /* Parse c
21a00 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c  ontext */.  Tabl
21a10 65 20 2a 70 54 61 62 2c 20 20 20 20 20 20 20 20  e *pTab,        
21a20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
21a30 61 62 6c 65 20 62 65 69 6e 67 20 71 75 65 72 69  able being queri
21a40 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  ed */.  Index *p
21a50 49 64 78 20 20 20 20 20 20 20 20 20 20 20 20 20  Idx             
21a60 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
21a70 20 75 73 65 64 20 74 6f 20 6f 70 74 69 6d 69 7a   used to optimiz
21a80 65 20 73 63 61 6e 2c 20 6f 72 20 4e 55 4c 4c 20  e scan, or NULL 
21a90 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 50 61 72  */.){.  if( pPar
21aa0 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29  se->explain==2 )
21ab0 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 71 70  {.    char *zEqp
21ac0 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
21ad0 66 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 22 53  f(pParse->db, "S
21ae0 43 41 4e 20 54 41 42 4c 45 20 25 73 25 73 25 73  CAN TABLE %s%s%s
21af0 22 2c 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d  ",.        pTab-
21b00 3e 7a 4e 61 6d 65 2c 20 0a 20 20 20 20 20 20 20  >zName, .       
21b10 20 70 49 64 78 20 3f 20 22 20 55 53 49 4e 47 20   pIdx ? " USING 
21b20 43 4f 56 45 52 49 4e 47 20 49 4e 44 45 58 20 22  COVERING INDEX "
21b30 20 3a 20 22 22 2c 0a 20 20 20 20 20 20 20 20 70   : "",.        p
21b40 49 64 78 20 3f 20 70 49 64 78 2d 3e 7a 4e 61 6d  Idx ? pIdx->zNam
21b50 65 20 3a 20 22 22 0a 20 20 20 20 29 3b 0a 20 20  e : "".    );.  
21b60 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
21b70 4f 70 34 28 0a 20 20 20 20 20 20 20 20 70 50 61  Op4(.        pPa
21b80 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 45  rse->pVdbe, OP_E
21b90 78 70 6c 61 69 6e 2c 20 70 50 61 72 73 65 2d 3e  xplain, pParse->
21ba0 69 53 65 6c 65 63 74 49 64 2c 20 30 2c 20 30 2c  iSelectId, 0, 0,
21bb0 20 7a 45 71 70 2c 20 50 34 5f 44 59 4e 41 4d 49   zEqp, P4_DYNAMI
21bc0 43 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 7d 0a 23  C.    );.  }.}.#
21bd0 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 65 78  else.# define ex
21be0 70 6c 61 69 6e 53 69 6d 70 6c 65 43 6f 75 6e 74  plainSimpleCount
21bf0 28 61 2c 62 2c 63 29 0a 23 65 6e 64 69 66 0a 0a  (a,b,c).#endif..
21c00 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
21c10 6f 64 65 20 66 6f 72 20 74 68 65 20 53 45 4c 45  ode for the SELE
21c20 43 54 20 73 74 61 74 65 6d 65 6e 74 20 67 69 76  CT statement giv
21c30 65 6e 20 69 6e 20 74 68 65 20 70 20 61 72 67 75  en in the p argu
21c40 6d 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68  ment.  .**.** Th
21c50 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 64 69  e results are di
21c60 73 74 72 69 62 75 74 65 64 20 69 6e 20 76 61 72  stributed in var
21c70 69 6f 75 73 20 77 61 79 73 20 64 65 70 65 6e 64  ious ways depend
21c80 69 6e 67 20 6f 6e 20 74 68 65 0a 2a 2a 20 63 6f  ing on the.** co
21c90 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 53 65  ntents of the Se
21ca0 6c 65 63 74 44 65 73 74 20 73 74 72 75 63 74 75  lectDest structu
21cb0 72 65 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  re pointed to by
21cc0 20 61 72 67 75 6d 65 6e 74 20 70 44 65 73 74 0a   argument pDest.
21cd0 2a 2a 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  ** as follows:.*
21ce0 2a 0a 2a 2a 20 20 20 20 20 70 44 65 73 74 2d 3e  *.**     pDest->
21cf0 65 44 65 73 74 20 20 20 20 52 65 73 75 6c 74 0a  eDest    Result.
21d00 2a 2a 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  **     ---------
21d10 2d 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  ---    ---------
21d20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
21d30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
21d40 2d 2d 0a 2a 2a 20 20 20 20 20 53 52 54 5f 4f 75  --.**     SRT_Ou
21d50 74 70 75 74 20 20 20 20 20 20 47 65 6e 65 72 61  tput      Genera
21d60 74 65 20 61 20 72 6f 77 20 6f 66 20 6f 75 74 70  te a row of outp
21d70 75 74 20 28 75 73 69 6e 67 20 74 68 65 20 4f 50  ut (using the OP
21d80 5f 52 65 73 75 6c 74 52 6f 77 0a 2a 2a 20 20 20  _ResultRow.**   
21d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21da0 20 20 6f 70 63 6f 64 65 29 20 66 6f 72 20 65 61    opcode) for ea
21db0 63 68 20 72 6f 77 20 69 6e 20 74 68 65 20 72 65  ch row in the re
21dc0 73 75 6c 74 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20  sult set..**.** 
21dd0 20 20 20 20 53 52 54 5f 4d 65 6d 20 20 20 20 20      SRT_Mem     
21de0 20 20 20 20 4f 6e 6c 79 20 76 61 6c 69 64 20 69      Only valid i
21df0 66 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20  f the result is 
21e00 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 2e  a single column.
21e10 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
21e20 20 20 20 20 20 20 20 20 53 74 6f 72 65 20 74 68          Store th
21e30 65 20 66 69 72 73 74 20 63 6f 6c 75 6d 6e 20 6f  e first column o
21e40 66 20 74 68 65 20 66 69 72 73 74 20 72 65 73 75  f the first resu
21e50 6c 74 20 72 6f 77 0a 2a 2a 20 20 20 20 20 20 20  lt row.**       
21e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e                in
21e70 20 72 65 67 69 73 74 65 72 20 70 44 65 73 74 2d   register pDest-
21e80 3e 69 53 44 50 61 72 6d 20 74 68 65 6e 20 61 62  >iSDParm then ab
21e90 61 6e 64 6f 6e 20 74 68 65 20 72 65 73 74 0a 2a  andon the rest.*
21ea0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
21eb0 20 20 20 20 20 20 6f 66 20 74 68 65 20 71 75 65        of the que
21ec0 72 79 2e 20 20 54 68 69 73 20 64 65 73 74 69 6e  ry.  This destin
21ed0 61 74 69 6f 6e 20 69 6d 70 6c 69 65 73 20 22 4c  ation implies "L
21ee0 49 4d 49 54 20 31 22 2e 0a 2a 2a 0a 2a 2a 20 20  IMIT 1"..**.**  
21ef0 20 20 20 53 52 54 5f 53 65 74 20 20 20 20 20 20     SRT_Set      
21f00 20 20 20 54 68 65 20 72 65 73 75 6c 74 20 6d 75     The result mu
21f10 73 74 20 62 65 20 61 20 73 69 6e 67 6c 65 20 63  st be a single c
21f20 6f 6c 75 6d 6e 2e 20 20 53 74 6f 72 65 20 65 61  olumn.  Store ea
21f30 63 68 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ch.**           
21f40 20 20 20 20 20 20 20 20 20 20 72 6f 77 20 6f 66            row of
21f50 20 72 65 73 75 6c 74 20 61 73 20 74 68 65 20 6b   result as the k
21f60 65 79 20 69 6e 20 74 61 62 6c 65 20 70 44 65 73  ey in table pDes
21f70 74 2d 3e 69 53 44 50 61 72 6d 2e 20 0a 2a 2a 20  t->iSDParm. .** 
21f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21f90 20 20 20 20 41 70 70 6c 79 20 74 68 65 20 61 66      Apply the af
21fa0 66 69 6e 69 74 79 20 70 44 65 73 74 2d 3e 61 66  finity pDest->af
21fb0 66 53 64 73 74 20 62 65 66 6f 72 65 20 73 74 6f  fSdst before sto
21fc0 72 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20  ring.**         
21fd0 20 20 20 20 20 20 20 20 20 20 20 20 72 65 73 75              resu
21fe0 6c 74 73 2e 20 20 55 73 65 64 20 74 6f 20 69 6d  lts.  Used to im
21ff0 70 6c 65 6d 65 6e 74 20 22 49 4e 20 28 53 45 4c  plement "IN (SEL
22000 45 43 54 20 2e 2e 2e 29 22 2e 0a 2a 2a 0a 2a 2a  ECT ...)"..**.**
22010 20 20 20 20 20 53 52 54 5f 55 6e 69 6f 6e 20 20       SRT_Union  
22020 20 20 20 20 20 53 74 6f 72 65 20 72 65 73 75 6c       Store resul
22030 74 73 20 61 73 20 61 20 6b 65 79 20 69 6e 20 61  ts as a key in a
22040 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
22050 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20   .**            
22060 20 20 20 20 20 20 20 20 20 69 64 65 6e 74 69 66           identif
22070 69 65 64 20 62 79 20 70 44 65 73 74 2d 3e 69 53  ied by pDest->iS
22080 44 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  DParm..**.**    
22090 20 53 52 54 5f 45 78 63 65 70 74 20 20 20 20 20   SRT_Except     
220a0 20 52 65 6d 6f 76 65 20 72 65 73 75 6c 74 73 20   Remove results 
220b0 66 72 6f 6d 20 74 68 65 20 74 65 6d 70 6f 72 61  from the tempora
220c0 72 79 20 74 61 62 6c 65 20 70 44 65 73 74 2d 3e  ry table pDest->
220d0 69 53 44 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20  iSDParm..**.**  
220e0 20 20 20 53 52 54 5f 54 61 62 6c 65 20 20 20 20     SRT_Table    
220f0 20 20 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73     Store results
22100 20 69 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61   in temporary ta
22110 62 6c 65 20 70 44 65 73 74 2d 3e 69 53 44 50 61  ble pDest->iSDPa
22120 72 6d 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  rm..**          
22130 20 20 20 20 20 20 20 20 20 20 20 54 68 69 73 20             This 
22140 69 73 20 6c 69 6b 65 20 53 52 54 5f 45 70 68 65  is like SRT_Ephe
22150 6d 54 61 62 20 65 78 63 65 70 74 20 74 68 61 74  mTab except that
22160 20 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20 20 20   the table.**   
22170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22180 20 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20    is assumed to 
22190 61 6c 72 65 61 64 79 20 62 65 20 6f 70 65 6e 2e  already be open.
221a0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 45  .**.**     SRT_E
221b0 70 68 65 6d 54 61 62 20 20 20 20 43 72 65 61 74  phemTab    Creat
221c0 65 20 61 6e 20 74 65 6d 70 6f 72 61 72 79 20 74  e an temporary t
221d0 61 62 6c 65 20 70 44 65 73 74 2d 3e 69 53 44 50  able pDest->iSDP
221e0 61 72 6d 20 61 6e 64 20 73 74 6f 72 65 0a 2a 2a  arm and store.**
221f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22200 20 20 20 20 20 74 68 65 20 72 65 73 75 6c 74 20       the result 
22210 74 68 65 72 65 2e 20 54 68 65 20 63 75 72 73 6f  there. The curso
22220 72 20 69 73 20 6c 65 66 74 20 6f 70 65 6e 20 61  r is left open a
22230 66 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 20 20  fter.**         
22240 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
22250 72 6e 69 6e 67 2e 20 20 54 68 69 73 20 69 73 20  rning.  This is 
22260 6c 69 6b 65 20 53 52 54 5f 54 61 62 6c 65 20 65  like SRT_Table e
22270 78 63 65 70 74 20 74 68 61 74 0a 2a 2a 20 20 20  xcept that.**   
22280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22290 20 20 74 68 69 73 20 64 65 73 74 69 6e 61 74 69    this destinati
222a0 6f 6e 20 75 73 65 73 20 4f 50 5f 4f 70 65 6e 45  on uses OP_OpenE
222b0 70 68 65 6d 65 72 61 6c 20 74 6f 20 63 72 65 61  phemeral to crea
222c0 74 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  te.**           
222d0 20 20 20 20 20 20 20 20 20 20 74 68 65 20 74 61            the ta
222e0 62 6c 65 20 66 69 72 73 74 2e 0a 2a 2a 0a 2a 2a  ble first..**.**
222f0 20 20 20 20 20 53 52 54 5f 43 6f 72 6f 75 74 69       SRT_Corouti
22300 6e 65 20 20 20 47 65 6e 65 72 61 74 65 20 61 20  ne   Generate a 
22310 63 6f 2d 72 6f 75 74 69 6e 65 20 74 68 61 74 20  co-routine that 
22320 72 65 74 75 72 6e 73 20 61 20 6e 65 77 20 72 6f  returns a new ro
22330 77 20 6f 66 0a 2a 2a 20 20 20 20 20 20 20 20 20  w of.**         
22340 20 20 20 20 20 20 20 20 20 20 20 20 72 65 73 75              resu
22350 6c 74 73 20 65 61 63 68 20 74 69 6d 65 20 69 74  lts each time it
22360 20 69 73 20 69 6e 76 6f 6b 65 64 2e 20 20 54 68   is invoked.  Th
22370 65 20 65 6e 74 72 79 20 70 6f 69 6e 74 0a 2a 2a  e entry point.**
22380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22390 20 20 20 20 20 6f 66 20 74 68 65 20 63 6f 2d 72       of the co-r
223a0 6f 75 74 69 6e 65 20 69 73 20 73 74 6f 72 65 64  outine is stored
223b0 20 69 6e 20 72 65 67 69 73 74 65 72 20 70 44 65   in register pDe
223c0 73 74 2d 3e 69 53 44 50 61 72 6d 2e 0a 2a 2a 0a  st->iSDParm..**.
223d0 2a 2a 20 20 20 20 20 53 52 54 5f 45 78 69 73 74  **     SRT_Exist
223e0 73 20 20 20 20 20 20 53 74 6f 72 65 20 61 20 31  s      Store a 1
223f0 20 69 6e 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20   in memory cell 
22400 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 20 69  pDest->iSDParm i
22410 66 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20  f the result.** 
22420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22430 20 20 20 20 73 65 74 20 69 73 20 6e 6f 74 20 65      set is not e
22440 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  mpty..**.**     
22450 53 52 54 5f 44 69 73 63 61 72 64 20 20 20 20 20  SRT_Discard     
22460 54 68 72 6f 77 20 74 68 65 20 72 65 73 75 6c 74  Throw the result
22470 73 20 61 77 61 79 2e 20 20 54 68 69 73 20 69 73  s away.  This is
22480 20 75 73 65 64 20 62 79 20 53 45 4c 45 43 54 0a   used by SELECT.
22490 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
224a0 20 20 20 20 20 20 20 73 74 61 74 65 6d 65 6e 74         statement
224b0 73 20 77 69 74 68 69 6e 20 74 72 69 67 67 65 72  s within trigger
224c0 73 20 77 68 6f 73 65 20 6f 6e 6c 79 20 70 75 72  s whose only pur
224d0 70 6f 73 65 20 69 73 0a 2a 2a 20 20 20 20 20 20  pose is.**      
224e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
224f0 68 65 20 73 69 64 65 2d 65 66 66 65 63 74 73 20  he side-effects 
22500 6f 66 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2a  of functions..**
22510 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
22520 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d   returns the num
22530 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 20 20  ber of errors.  
22540 49 66 20 61 6e 79 20 65 72 72 6f 72 73 20 61 72  If any errors ar
22550 65 0a 2a 2a 20 65 6e 63 6f 75 6e 74 65 72 65 64  e.** encountered
22560 2c 20 74 68 65 6e 20 61 6e 20 61 70 70 72 6f 70  , then an approp
22570 72 69 61 74 65 20 65 72 72 6f 72 20 6d 65 73 73  riate error mess
22580 61 67 65 20 69 73 20 6c 65 66 74 20 69 6e 0a 2a  age is left in.*
22590 2a 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  * pParse->zErrMs
225a0 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  g..**.** This ro
225b0 75 74 69 6e 65 20 64 6f 65 73 20 4e 4f 54 20 66  utine does NOT f
225c0 72 65 65 20 74 68 65 20 53 65 6c 65 63 74 20 73  ree the Select s
225d0 74 72 75 63 74 75 72 65 20 70 61 73 73 65 64 20  tructure passed 
225e0 69 6e 2e 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c  in.  The.** call
225f0 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6e 65 65  ing function nee
22600 64 73 20 74 6f 20 64 6f 20 74 68 61 74 2e 0a 2a  ds to do that..*
22610 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 65 6c  /.int sqlite3Sel
22620 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ect(.  Parse *pP
22630 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  arse,         /*
22640 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74   The parser cont
22650 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
22660 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
22670 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74  /* The SELECT st
22680 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f  atement being co
22690 64 65 64 2e 20 2a 2f 0a 20 20 53 65 6c 65 63 74  ded. */.  Select
226a0 44 65 73 74 20 2a 70 44 65 73 74 20 20 20 20 20  Dest *pDest     
226b0 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77   /* What to do w
226c0 69 74 68 20 74 68 65 20 71 75 65 72 79 20 72 65  ith the query re
226d0 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  sults */.){.  in
226e0 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20  t i, j;         
226f0 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
22700 6e 74 65 72 73 20 2a 2f 0a 20 20 57 68 65 72 65  nters */.  Where
22710 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20  Info *pWInfo;   
22720 20 20 2f 2a 20 52 65 74 75 72 6e 20 66 72 6f 6d    /* Return from
22730 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
22740 69 6e 28 29 20 2a 2f 0a 20 20 56 64 62 65 20 2a  in() */.  Vdbe *
22750 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
22760 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20   /* The virtual 
22770 6d 61 63 68 69 6e 65 20 75 6e 64 65 72 20 63 6f  machine under co
22780 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20  nstruction */.  
22790 69 6e 74 20 69 73 41 67 67 3b 20 20 20 20 20 20  int isAgg;      
227a0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66         /* True f
227b0 6f 72 20 73 65 6c 65 63 74 20 6c 69 73 74 73 20  or select lists 
227c0 6c 69 6b 65 20 22 63 6f 75 6e 74 28 2a 29 22 20  like "count(*)" 
227d0 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
227e0 45 4c 69 73 74 3b 20 20 20 20 20 20 2f 2a 20 4c  EList;      /* L
227f0 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74  ist of columns t
22800 6f 20 65 78 74 72 61 63 74 2e 20 2a 2f 0a 20 20  o extract. */.  
22810 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
22820 74 3b 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f  t;     /* List o
22830 66 20 74 61 62 6c 65 73 20 74 6f 20 73 65 6c 65  f tables to sele
22840 63 74 20 66 72 6f 6d 20 2a 2f 0a 20 20 45 78 70  ct from */.  Exp
22850 72 20 2a 70 57 68 65 72 65 3b 20 20 20 20 20 20  r *pWhere;      
22860 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
22870 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65   clause.  May be
22880 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c   NULL */.  ExprL
22890 69 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 20 20  ist *pOrderBy;  
228a0 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42    /* The ORDER B
228b0 59 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62  Y clause.  May b
228c0 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72  e NULL */.  Expr
228d0 4c 69 73 74 20 2a 70 47 72 6f 75 70 42 79 3b 20  List *pGroupBy; 
228e0 20 20 20 2f 2a 20 54 68 65 20 47 52 4f 55 50 20     /* The GROUP 
228f0 42 59 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20  BY clause.  May 
22900 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70  be NULL */.  Exp
22910 72 20 2a 70 48 61 76 69 6e 67 3b 20 20 20 20 20  r *pHaving;     
22920 20 20 20 20 2f 2a 20 54 68 65 20 48 41 56 49 4e      /* The HAVIN
22930 47 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62  G clause.  May b
22940 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20  e NULL */.  int 
22950 72 63 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20  rc = 1;         
22960 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72     /* Value to r
22970 65 74 75 72 6e 20 66 72 6f 6d 20 74 68 69 73 20  eturn from this 
22980 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  function */.  in
22990 74 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78 3b  t addrSortIndex;
229a0 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
229b0 6f 66 20 61 6e 20 4f 50 5f 4f 70 65 6e 45 70 68  of an OP_OpenEph
229c0 65 6d 65 72 61 6c 20 69 6e 73 74 72 75 63 74 69  emeral instructi
229d0 6f 6e 20 2a 2f 0a 20 20 44 69 73 74 69 6e 63 74  on */.  Distinct
229e0 43 74 78 20 73 44 69 73 74 69 6e 63 74 3b 20 2f  Ctx sDistinct; /
229f0 2a 20 49 6e 66 6f 20 6f 6e 20 68 6f 77 20 74 6f  * Info on how to
22a00 20 63 6f 64 65 20 74 68 65 20 44 49 53 54 49 4e   code the DISTIN
22a10 43 54 20 6b 65 79 77 6f 72 64 20 2a 2f 0a 20 20  CT keyword */.  
22a20 41 67 67 49 6e 66 6f 20 73 41 67 67 49 6e 66 6f  AggInfo sAggInfo
22a30 3b 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d  ;      /* Inform
22a40 61 74 69 6f 6e 20 75 73 65 64 20 62 79 20 61 67  ation used by ag
22a50 67 72 65 67 61 74 65 20 71 75 65 72 69 65 73 20  gregate queries 
22a60 2a 2f 0a 20 20 69 6e 74 20 69 45 6e 64 3b 20 20  */.  int iEnd;  
22a70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
22a80 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 65 6e  ddress of the en
22a90 64 20 6f 66 20 74 68 65 20 71 75 65 72 79 20 2a  d of the query *
22aa0 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  /.  sqlite3 *db;
22ab0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
22ac0 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
22ad0 63 74 69 6f 6e 20 2a 2f 0a 0a 23 69 66 6e 64 65  ction */..#ifnde
22ae0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  f SQLITE_OMIT_EX
22af0 50 4c 41 49 4e 0a 20 20 69 6e 74 20 69 52 65 73  PLAIN.  int iRes
22b00 74 6f 72 65 53 65 6c 65 63 74 49 64 20 3d 20 70  toreSelectId = p
22b10 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64  Parse->iSelectId
22b20 3b 0a 20 20 70 50 61 72 73 65 2d 3e 69 53 65 6c  ;.  pParse->iSel
22b30 65 63 74 49 64 20 3d 20 70 50 61 72 73 65 2d 3e  ectId = pParse->
22b40 69 4e 65 78 74 53 65 6c 65 63 74 49 64 2b 2b 3b  iNextSelectId++;
22b50 0a 23 65 6e 64 69 66 0a 0a 20 20 64 62 20 3d 20  .#endif..  db = 
22b60 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66  pParse->db;.  if
22b70 28 20 70 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61  ( p==0 || db->ma
22b80 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70 50  llocFailed || pP
22b90 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20  arse->nErr ){.  
22ba0 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
22bb0 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
22bc0 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
22bd0 51 4c 49 54 45 5f 53 45 4c 45 43 54 2c 20 30 2c  QLITE_SELECT, 0,
22be0 20 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e 20   0, 0) ) return 
22bf0 31 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 41 67  1;.  memset(&sAg
22c00 67 49 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66  gInfo, 0, sizeof
22c10 28 73 41 67 67 49 6e 66 6f 29 29 3b 0a 0a 20 20  (sAggInfo));..  
22c20 69 66 28 20 49 67 6e 6f 72 61 62 6c 65 4f 72 64  if( IgnorableOrd
22c30 65 72 62 79 28 70 44 65 73 74 29 20 29 7b 0a 20  erby(pDest) ){. 
22c40 20 20 20 61 73 73 65 72 74 28 70 44 65 73 74 2d     assert(pDest-
22c50 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45 78 69 73  >eDest==SRT_Exis
22c60 74 73 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65  ts || pDest->eDe
22c70 73 74 3d 3d 53 52 54 5f 55 6e 69 6f 6e 20 7c 7c  st==SRT_Union ||
22c80 20 0a 20 20 20 20 20 20 20 20 20 20 20 70 44 65   .           pDe
22c90 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45  st->eDest==SRT_E
22ca0 78 63 65 70 74 20 7c 7c 20 70 44 65 73 74 2d 3e  xcept || pDest->
22cb0 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 63 61  eDest==SRT_Disca
22cc0 72 64 29 3b 0a 20 20 20 20 2f 2a 20 49 66 20 4f  rd);.    /* If O
22cd0 52 44 45 52 20 42 59 20 6d 61 6b 65 73 20 6e 6f  RDER BY makes no
22ce0 20 64 69 66 66 65 72 65 6e 63 65 20 69 6e 20 74   difference in t
22cf0 68 65 20 6f 75 74 70 75 74 20 74 68 65 6e 20 6e  he output then n
22d00 65 69 74 68 65 72 20 64 6f 65 73 0a 20 20 20 20  either does.    
22d10 2a 2a 20 44 49 53 54 49 4e 43 54 20 73 6f 20 69  ** DISTINCT so i
22d20 74 20 63 61 6e 20 62 65 20 72 65 6d 6f 76 65 64  t can be removed
22d30 20 74 6f 6f 2e 20 2a 2f 0a 20 20 20 20 73 71 6c   too. */.    sql
22d40 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
22d50 74 65 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72  te(db, p->pOrder
22d60 42 79 29 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64  By);.    p->pOrd
22d70 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 70 2d  erBy = 0;.    p-
22d80 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46  >selFlags &= ~SF
22d90 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20 7d 0a 20  _Distinct;.  }. 
22da0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 50 72   sqlite3SelectPr
22db0 65 70 28 70 50 61 72 73 65 2c 20 70 2c 20 30 29  ep(pParse, p, 0)
22dc0 3b 0a 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70  ;.  pOrderBy = p
22dd0 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 70 54  ->pOrderBy;.  pT
22de0 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63  abList = p->pSrc
22df0 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e  ;.  pEList = p->
22e00 70 45 4c 69 73 74 3b 0a 20 20 69 66 28 20 70 50  pEList;.  if( pP
22e10 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62  arse->nErr || db
22e20 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
22e30 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63  {.    goto selec
22e40 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 69 73 41  t_end;.  }.  isA
22e50 67 67 20 3d 20 28 70 2d 3e 73 65 6c 46 6c 61 67  gg = (p->selFlag
22e60 73 20 26 20 53 46 5f 41 67 67 72 65 67 61 74 65  s & SF_Aggregate
22e70 29 21 3d 30 3b 0a 20 20 61 73 73 65 72 74 28 20  )!=0;.  assert( 
22e80 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 0a 20 20  pEList!=0 );..  
22e90 2f 2a 20 42 65 67 69 6e 20 67 65 6e 65 72 61 74  /* Begin generat
22ea0 69 6e 67 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20  ing code..  */. 
22eb0 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
22ec0 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
22ed0 66 28 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20 73  f( v==0 ) goto s
22ee0 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a  elect_end;..  /*
22ef0 20 49 66 20 77 72 69 74 69 6e 67 20 74 6f 20 6d   If writing to m
22f00 65 6d 6f 72 79 20 6f 72 20 67 65 6e 65 72 61 74  emory or generat
22f10 69 6e 67 20 61 20 73 65 74 0a 20 20 2a 2a 20 6f  ing a set.  ** o
22f20 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c  nly a single col
22f30 75 6d 6e 20 6d 61 79 20 62 65 20 6f 75 74 70 75  umn may be outpu
22f40 74 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20  t..  */.#ifndef 
22f50 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
22f60 55 45 52 59 0a 20 20 69 66 28 20 63 68 65 63 6b  UERY.  if( check
22f70 46 6f 72 4d 75 6c 74 69 43 6f 6c 75 6d 6e 53 65  ForMultiColumnSe
22f80 6c 65 63 74 45 72 72 6f 72 28 70 50 61 72 73 65  lectError(pParse
22f90 2c 20 70 44 65 73 74 2c 20 70 45 4c 69 73 74 2d  , pDest, pEList-
22fa0 3e 6e 45 78 70 72 29 20 29 7b 0a 20 20 20 20 67  >nExpr) ){.    g
22fb0 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
22fc0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
22fd0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
22fe0 6f 72 20 61 6c 6c 20 73 75 62 2d 71 75 65 72 69  or all sub-queri
22ff0 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  es in the FROM c
23000 6c 61 75 73 65 0a 20 20 2a 2f 0a 23 69 66 20 21  lause.  */.#if !
23010 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
23020 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c  MIT_SUBQUERY) ||
23030 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
23040 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 20 20 66 6f  _OMIT_VIEW).  fo
23050 72 28 69 3d 30 3b 20 21 70 2d 3e 70 50 72 69 6f  r(i=0; !p->pPrio
23060 72 20 26 26 20 69 3c 70 54 61 62 4c 69 73 74 2d  r && i<pTabList-
23070 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nSrc; i++){.   
23080 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
23090 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70  item *pItem = &p
230a0 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 3b 0a 20  TabList->a[i];. 
230b0 20 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65     SelectDest de
230c0 73 74 3b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a  st;.    Select *
230d0 70 53 75 62 20 3d 20 70 49 74 65 6d 2d 3e 70 53  pSub = pItem->pS
230e0 65 6c 65 63 74 3b 0a 20 20 20 20 69 6e 74 20 69  elect;.    int i
230f0 73 41 67 67 53 75 62 3b 0a 0a 20 20 20 20 69 66  sAggSub;..    if
23100 28 20 70 53 75 62 3d 3d 30 20 29 20 63 6f 6e 74  ( pSub==0 ) cont
23110 69 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 53 6f  inue;..    /* So
23120 6d 65 74 69 6d 65 73 20 74 68 65 20 63 6f 64 65  metimes the code
23130 20 66 6f 72 20 61 20 73 75 62 71 75 65 72 79 20   for a subquery 
23140 77 69 6c 6c 20 62 65 20 67 65 6e 65 72 61 74 65  will be generate
23150 64 20 6d 6f 72 65 20 74 68 61 6e 0a 20 20 20 20  d more than.    
23160 2a 2a 20 6f 6e 63 65 2c 20 69 66 20 74 68 65 20  ** once, if the 
23170 73 75 62 71 75 65 72 79 20 69 73 20 70 61 72 74  subquery is part
23180 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
23190 61 75 73 65 20 69 6e 20 61 20 4c 45 46 54 20 4a  ause in a LEFT J
231a0 4f 49 4e 2c 0a 20 20 20 20 2a 2a 20 66 6f 72 20  OIN,.    ** for 
231b0 65 78 61 6d 70 6c 65 2e 20 20 49 6e 20 74 68 61  example.  In tha
231c0 74 20 63 61 73 65 2c 20 64 6f 20 6e 6f 74 20 72  t case, do not r
231d0 65 67 65 6e 65 72 61 74 65 20 74 68 65 20 63 6f  egenerate the co
231e0 64 65 20 74 6f 20 6d 61 6e 69 66 65 73 74 0a 20  de to manifest. 
231f0 20 20 20 2a 2a 20 61 20 76 69 65 77 20 6f 72 20     ** a view or 
23200 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20 74  the co-routine t
23210 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 20 76 69  o implement a vi
23220 65 77 2e 20 20 54 68 65 20 66 69 72 73 74 20 69  ew.  The first i
23230 6e 73 74 61 6e 63 65 0a 20 20 20 20 2a 2a 20 69  nstance.    ** i
23240 73 20 73 75 66 66 69 63 69 65 6e 74 2c 20 74 68  s sufficient, th
23250 6f 75 67 68 20 74 68 65 20 73 75 62 72 6f 75 74  ough the subrout
23260 69 6e 65 20 74 6f 20 6d 61 6e 69 66 65 73 74 20  ine to manifest 
23270 74 68 65 20 76 69 65 77 20 64 6f 65 73 20 6e 65  the view does ne
23280 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20 62 65 20  ed.    ** to be 
23290 69 6e 76 6f 6b 65 64 20 61 67 61 69 6e 2e 20 2a  invoked again. *
232a0 2f 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d  /.    if( pItem-
232b0 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 29 7b 0a  >addrFillSub ){.
232c0 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d        if( pItem-
232d0 3e 76 69 61 43 6f 72 6f 75 74 69 6e 65 3d 3d 30  >viaCoroutine==0
232e0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
232f0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
23300 20 4f 50 5f 47 6f 73 75 62 2c 20 70 49 74 65 6d   OP_Gosub, pItem
23310 2d 3e 72 65 67 52 65 74 75 72 6e 2c 20 70 49 74  ->regReturn, pIt
23320 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 29  em->addrFillSub)
23330 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
23340 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a  continue;.    }.
23350 0a 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e  .    /* Incremen
23360 74 20 50 61 72 73 65 2e 6e 48 65 69 67 68 74 20  t Parse.nHeight 
23370 62 79 20 74 68 65 20 68 65 69 67 68 74 20 6f 66  by the height of
23380 20 74 68 65 20 6c 61 72 67 65 73 74 20 65 78 70   the largest exp
23390 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2a 20 74  ression.    ** t
233a0 72 65 65 20 72 65 66 65 72 72 65 64 20 74 6f 20  ree referred to 
233b0 62 79 20 74 68 69 73 2c 20 74 68 65 20 70 61 72  by this, the par
233c0 65 6e 74 20 73 65 6c 65 63 74 2e 20 54 68 65 20  ent select. The 
233d0 63 68 69 6c 64 20 73 65 6c 65 63 74 0a 20 20 20  child select.   
233e0 20 2a 2a 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20   ** may contain 
233f0 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 73  expression trees
23400 20 6f 66 20 61 74 20 6d 6f 73 74 0a 20 20 20 20   of at most.    
23410 2a 2a 20 28 53 51 4c 49 54 45 5f 4d 41 58 5f 45  ** (SQLITE_MAX_E
23420 58 50 52 5f 44 45 50 54 48 2d 50 61 72 73 65 2e  XPR_DEPTH-Parse.
23430 6e 48 65 69 67 68 74 29 20 68 65 69 67 68 74 2e  nHeight) height.
23440 20 54 68 69 73 20 69 73 20 61 20 62 69 74 0a 20   This is a bit. 
23450 20 20 20 2a 2a 20 6d 6f 72 65 20 63 6f 6e 73 65     ** more conse
23460 72 76 61 74 69 76 65 20 74 68 61 6e 20 6e 65 63  rvative than nec
23470 65 73 73 61 72 79 2c 20 62 75 74 20 6d 75 63 68  essary, but much
23480 20 65 61 73 69 65 72 20 74 68 61 6e 20 65 6e 66   easier than enf
23490 6f 72 63 69 6e 67 0a 20 20 20 20 2a 2a 20 61 6e  orcing.    ** an
234a0 20 65 78 61 63 74 20 6c 69 6d 69 74 2e 0a 20 20   exact limit..  
234b0 20 20 2a 2f 0a 20 20 20 20 70 50 61 72 73 65 2d    */.    pParse-
234c0 3e 6e 48 65 69 67 68 74 20 2b 3d 20 73 71 6c 69  >nHeight += sqli
234d0 74 65 33 53 65 6c 65 63 74 45 78 70 72 48 65 69  te3SelectExprHei
234e0 67 68 74 28 70 29 3b 0a 0a 20 20 20 20 69 73 41  ght(p);..    isA
234f0 67 67 53 75 62 20 3d 20 28 70 53 75 62 2d 3e 73  ggSub = (pSub->s
23500 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67 67  elFlags & SF_Agg
23510 72 65 67 61 74 65 29 21 3d 30 3b 0a 20 20 20 20  regate)!=0;.    
23520 69 66 28 20 66 6c 61 74 74 65 6e 53 75 62 71 75  if( flattenSubqu
23530 65 72 79 28 70 50 61 72 73 65 2c 20 70 2c 20 69  ery(pParse, p, i
23540 2c 20 69 73 41 67 67 2c 20 69 73 41 67 67 53 75  , isAgg, isAggSu
23550 62 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  b) ){.      /* T
23560 68 69 73 20 73 75 62 71 75 65 72 79 20 63 61 6e  his subquery can
23570 20 62 65 20 61 62 73 6f 72 62 65 64 20 69 6e 74   be absorbed int
23580 6f 20 69 74 73 20 70 61 72 65 6e 74 2e 20 2a 2f  o its parent. */
23590 0a 20 20 20 20 20 20 69 66 28 20 69 73 41 67 67  .      if( isAgg
235a0 53 75 62 20 29 7b 0a 20 20 20 20 20 20 20 20 69  Sub ){.        i
235b0 73 41 67 67 20 3d 20 31 3b 0a 20 20 20 20 20 20  sAgg = 1;.      
235c0 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d    p->selFlags |=
235d0 20 53 46 5f 41 67 67 72 65 67 61 74 65 3b 0a 20   SF_Aggregate;. 
235e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 20 3d       }.      i =
235f0 20 2d 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69   -1;.    }else i
23600 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  f( pTabList->nSr
23610 63 3d 3d 31 20 26 26 20 28 70 2d 3e 73 65 6c 46  c==1 && (p->selF
23620 6c 61 67 73 20 26 20 53 46 5f 4d 61 74 65 72 69  lags & SF_Materi
23630 61 6c 69 7a 65 29 3d 3d 30 0a 20 20 20 20 20 20  alize)==0.      
23640 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45  && OptimizationE
23650 6e 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54  nabled(db, SQLIT
23660 45 5f 53 75 62 71 43 6f 72 6f 75 74 69 6e 65 29  E_SubqCoroutine)
23670 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a  .    ){.      /*
23680 20 49 6d 70 6c 65 6d 65 6e 74 20 61 20 63 6f 2d   Implement a co-
23690 72 6f 75 74 69 6e 65 20 74 68 61 74 20 77 69 6c  routine that wil
236a0 6c 20 72 65 74 75 72 6e 20 61 20 73 69 6e 67 6c  l return a singl
236b0 65 20 72 6f 77 20 6f 66 20 74 68 65 20 72 65 73  e row of the res
236c0 75 6c 74 0a 20 20 20 20 20 20 2a 2a 20 73 65 74  ult.      ** set
236d0 20 6f 6e 20 65 61 63 68 20 69 6e 76 6f 63 61 74   on each invocat
236e0 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ion..      */.  
236f0 20 20 20 20 69 6e 74 20 61 64 64 72 54 6f 70 3b      int addrTop;
23700 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 45  .      int addrE
23710 6f 66 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d  of;.      pItem-
23720 3e 72 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70  >regReturn = ++p
23730 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
23740 20 20 20 61 64 64 72 45 6f 66 20 3d 20 2b 2b 70     addrEof = ++p
23750 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
23760 20 20 20 2f 2a 20 42 65 66 6f 72 65 20 63 6f 64     /* Before cod
23770 69 6e 67 20 74 68 65 20 4f 50 5f 47 6f 74 6f 20  ing the OP_Goto 
23780 74 6f 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 73  to jump to the s
23790 74 61 72 74 20 6f 66 20 74 68 65 20 6d 61 69 6e  tart of the main
237a0 20 72 6f 75 74 69 6e 65 2c 0a 20 20 20 20 20 20   routine,.      
237b0 2a 2a 20 65 6e 73 75 72 65 20 74 68 61 74 20 74  ** ensure that t
237c0 68 65 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 76  he jump to the v
237d0 65 72 69 66 79 2d 73 63 68 65 6d 61 20 72 6f 75  erify-schema rou
237e0 74 69 6e 65 20 68 61 73 20 61 6c 72 65 61 64 79  tine has already
237f0 0a 20 20 20 20 20 20 2a 2a 20 62 65 65 6e 20 63  .      ** been c
23800 6f 64 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  oded. Otherwise,
23810 20 74 68 65 20 76 65 72 69 66 79 2d 73 63 68 65   the verify-sche
23820 6d 61 20 77 6f 75 6c 64 20 6c 69 6b 65 6c 79 20  ma would likely 
23830 62 65 20 63 6f 64 65 64 20 61 73 20 0a 20 20 20  be coded as .   
23840 20 20 20 2a 2a 20 70 61 72 74 20 6f 66 20 74 68     ** part of th
23850 65 20 63 6f 2d 72 6f 75 74 69 6e 65 2e 20 49 66  e co-routine. If
23860 20 74 68 65 20 6d 61 69 6e 20 72 6f 75 74 69 6e   the main routin
23870 65 20 74 68 65 6e 20 61 63 63 65 73 73 65 64 20  e then accessed 
23880 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 64 61  the .      ** da
23890 74 61 62 61 73 65 20 62 65 66 6f 72 65 20 69 6e  tabase before in
238a0 76 6f 6b 69 6e 67 20 74 68 65 20 63 6f 2d 72 6f  voking the co-ro
238b0 75 74 69 6e 65 20 66 6f 72 20 74 68 65 20 66 69  utine for the fi
238c0 72 73 74 20 74 69 6d 65 20 28 66 6f 72 20 0a 20  rst time (for . 
238d0 20 20 20 20 20 2a 2a 20 65 78 61 6d 70 6c 65 20       ** example 
238e0 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 20  to initialize a 
238f0 4c 49 4d 49 54 20 72 65 67 69 73 74 65 72 20 66  LIMIT register f
23900 72 6f 6d 20 61 20 73 75 62 2d 73 65 6c 65 63 74  rom a sub-select
23910 29 2c 20 69 74 20 77 6f 75 6c 64 20 0a 20 20 20  ), it would .   
23920 20 20 20 2a 2a 20 62 65 20 64 6f 69 6e 67 20 73     ** be doing s
23930 6f 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67  o without having
23940 20 76 65 72 69 66 69 65 64 20 74 68 65 20 73 63   verified the sc
23950 68 65 6d 61 20 76 65 72 73 69 6f 6e 20 61 6e 64  hema version and
23960 20 6f 62 74 61 69 6e 65 64 20 0a 20 20 20 20 20   obtained .     
23970 20 2a 2a 20 74 68 65 20 72 65 71 75 69 72 65 64   ** the required
23980 20 64 62 20 6c 6f 63 6b 73 2e 20 53 65 65 20 74   db locks. See t
23990 69 63 6b 65 74 20 64 36 62 33 36 62 65 33 38 2e  icket d6b36be38.
239a0 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74    */.      sqlit
239b0 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
239c0 6d 61 28 70 50 61 72 73 65 2c 20 2d 31 29 3b 0a  ma(pParse, -1);.
239d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
239e0 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f  eAddOp0(v, OP_Go
239f0 74 6f 29 3b 0a 20 20 20 20 20 20 61 64 64 72 54  to);.      addrT
23a00 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  op = sqlite3Vdbe
23a10 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4f 70 65  AddOp1(v, OP_Ope
23a20 6e 50 73 65 75 64 6f 2c 20 70 49 74 65 6d 2d 3e  nPseudo, pItem->
23a30 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20  iCursor);.      
23a40 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
23a50 65 50 35 28 76 2c 20 31 29 3b 0a 20 20 20 20 20  eP5(v, 1);.     
23a60 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
23a70 20 22 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20   "coroutine for 
23a80 25 73 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62  %s", pItem->pTab
23a90 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20  ->zName));.     
23aa0 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c   pItem->addrFill
23ab0 53 75 62 20 3d 20 61 64 64 72 54 6f 70 3b 0a 20  Sub = addrTop;. 
23ac0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
23ad0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
23ae0 65 67 65 72 2c 20 30 2c 20 61 64 64 72 45 6f 66  eger, 0, addrEof
23af0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
23b00 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
23b10 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
23b20 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28  3SelectDestInit(
23b30 26 64 65 73 74 2c 20 53 52 54 5f 43 6f 72 6f 75  &dest, SRT_Corou
23b40 74 69 6e 65 2c 20 70 49 74 65 6d 2d 3e 72 65 67  tine, pItem->reg
23b50 52 65 74 75 72 6e 29 3b 0a 20 20 20 20 20 20 65  Return);.      e
23b60 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72  xplainSetInteger
23b70 28 70 49 74 65 6d 2d 3e 69 53 65 6c 65 63 74 49  (pItem->iSelectI
23b80 64 2c 20 28 75 38 29 70 50 61 72 73 65 2d 3e 69  d, (u8)pParse->i
23b90 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20  NextSelectId);. 
23ba0 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
23bb0 63 74 28 70 50 61 72 73 65 2c 20 70 53 75 62 2c  ct(pParse, pSub,
23bc0 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20 20 70   &dest);.      p
23bd0 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 6e 52 6f 77  Item->pTab->nRow
23be0 45 73 74 20 3d 20 28 75 6e 73 69 67 6e 65 64 29  Est = (unsigned)
23bf0 70 53 75 62 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  pSub->nSelectRow
23c00 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 76  ;.      pItem->v
23c10 69 61 43 6f 72 6f 75 74 69 6e 65 20 3d 20 31 3b  iaCoroutine = 1;
23c20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
23c30 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20 61 64  beChangeP2(v, ad
23c40 64 72 54 6f 70 2c 20 64 65 73 74 2e 69 53 64 73  drTop, dest.iSds
23c50 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
23c60 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  3VdbeChangeP3(v,
23c70 20 61 64 64 72 54 6f 70 2c 20 64 65 73 74 2e 6e   addrTop, dest.n
23c80 53 64 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  Sdst);.      sql
23c90 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
23ca0 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c  , OP_Integer, 1,
23cb0 20 61 64 64 72 45 6f 66 29 3b 0a 20 20 20 20 20   addrEof);.     
23cc0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
23cd0 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p1(v, OP_Yield, 
23ce0 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e  pItem->regReturn
23cf0 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
23d00 6d 65 6e 74 28 28 76 2c 20 22 65 6e 64 20 25 73  ment((v, "end %s
23d10 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e  ", pItem->pTab->
23d20 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 73  zName));.      s
23d30 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
23d40 72 65 28 76 2c 20 61 64 64 72 54 6f 70 2d 31 29  re(v, addrTop-1)
23d50 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43  ;.      sqlite3C
23d60 6c 65 61 72 54 65 6d 70 52 65 67 43 61 63 68 65  learTempRegCache
23d70 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 7d 65  (pParse);.    }e
23d80 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 47 65  lse{.      /* Ge
23d90 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74  nerate a subrout
23da0 69 6e 65 20 74 68 61 74 20 77 69 6c 6c 20 66 69  ine that will fi
23db0 6c 6c 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20  ll an ephemeral 
23dc0 74 61 62 6c 65 20 77 69 74 68 0a 20 20 20 20 20  table with.     
23dd0 20 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 20   ** the content 
23de0 6f 66 20 74 68 69 73 20 73 75 62 71 75 65 72 79  of this subquery
23df0 2e 20 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69  .  pItem->addrFi
23e00 6c 6c 53 75 62 20 77 69 6c 6c 20 70 6f 69 6e 74  llSub will point
23e10 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 68 65  .      ** to the
23e20 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   address of the 
23e30 67 65 6e 65 72 61 74 65 64 20 73 75 62 72 6f 75  generated subrou
23e40 74 69 6e 65 2e 20 20 70 49 74 65 6d 2d 3e 72 65  tine.  pItem->re
23e50 67 52 65 74 75 72 6e 0a 20 20 20 20 20 20 2a 2a  gReturn.      **
23e60 20 69 73 20 61 20 72 65 67 69 73 74 65 72 20 61   is a register a
23e70 6c 6c 6f 63 61 74 65 64 20 74 6f 20 68 6f 6c 64  llocated to hold
23e80 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20   the subroutine 
23e90 72 65 74 75 72 6e 20 61 64 64 72 65 73 73 0a 20  return address. 
23ea0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e       */.      in
23eb0 74 20 74 6f 70 41 64 64 72 3b 0a 20 20 20 20 20  t topAddr;.     
23ec0 20 69 6e 74 20 6f 6e 63 65 41 64 64 72 20 3d 20   int onceAddr = 
23ed0 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 65 74  0;.      int ret
23ee0 41 64 64 72 3b 0a 20 20 20 20 20 20 61 73 73 65  Addr;.      asse
23ef0 72 74 28 20 70 49 74 65 6d 2d 3e 61 64 64 72 46  rt( pItem->addrF
23f00 69 6c 6c 53 75 62 3d 3d 30 20 29 3b 0a 20 20 20  illSub==0 );.   
23f10 20 20 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74     pItem->regRet
23f20 75 72 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  urn = ++pParse->
23f30 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 74 6f 70 41  nMem;.      topA
23f40 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
23f50 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
23f60 74 65 67 65 72 2c 20 30 2c 20 70 49 74 65 6d 2d  teger, 0, pItem-
23f70 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a 20 20 20  >regReturn);.   
23f80 20 20 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69     pItem->addrFi
23f90 6c 6c 53 75 62 20 3d 20 74 6f 70 41 64 64 72 2b  llSub = topAddr+
23fa0 31 3b 0a 20 20 20 20 20 20 56 64 62 65 4e 6f 6f  1;.      VdbeNoo
23fb0 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6d 61  pComment((v, "ma
23fc0 74 65 72 69 61 6c 69 7a 65 20 25 73 22 2c 20 70  terialize %s", p
23fd0 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d  Item->pTab->zNam
23fe0 65 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  e));.      if( p
23ff0 49 74 65 6d 2d 3e 69 73 43 6f 72 72 65 6c 61 74  Item->isCorrelat
24000 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ed==0 ){.       
24010 20 2f 2a 20 49 66 20 74 68 65 20 73 75 62 71 75   /* If the subqu
24020 65 72 79 20 69 73 20 6e 6f 74 20 63 6f 72 72 65  ery is not corre
24030 6c 61 74 65 64 20 61 6e 64 20 69 66 20 77 65 20  lated and if we 
24040 61 72 65 20 6e 6f 74 20 69 6e 73 69 64 65 20 6f  are not inside o
24050 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 74  f.        ** a t
24060 72 69 67 67 65 72 2c 20 74 68 65 6e 20 77 65 20  rigger, then we 
24070 6f 6e 6c 79 20 6e 65 65 64 20 74 6f 20 63 6f 6d  only need to com
24080 70 75 74 65 20 74 68 65 20 76 61 6c 75 65 20 6f  pute the value o
24090 66 20 74 68 65 20 73 75 62 71 75 65 72 79 0a 20  f the subquery. 
240a0 20 20 20 20 20 20 20 2a 2a 20 6f 6e 63 65 2e 20         ** once. 
240b0 2a 2f 0a 20 20 20 20 20 20 20 20 6f 6e 63 65 41  */.        onceA
240c0 64 64 72 20 3d 20 73 71 6c 69 74 65 33 43 6f 64  ddr = sqlite3Cod
240d0 65 4f 6e 63 65 28 70 50 61 72 73 65 29 3b 0a 20  eOnce(pParse);. 
240e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
240f0 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e  ite3SelectDestIn
24100 69 74 28 26 64 65 73 74 2c 20 53 52 54 5f 45 70  it(&dest, SRT_Ep
24110 68 65 6d 54 61 62 2c 20 70 49 74 65 6d 2d 3e 69  hemTab, pItem->i
24120 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 65  Cursor);.      e
24130 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72  xplainSetInteger
24140 28 70 49 74 65 6d 2d 3e 69 53 65 6c 65 63 74 49  (pItem->iSelectI
24150 64 2c 20 28 75 38 29 70 50 61 72 73 65 2d 3e 69  d, (u8)pParse->i
24160 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20  NextSelectId);. 
24170 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
24180 63 74 28 70 50 61 72 73 65 2c 20 70 53 75 62 2c  ct(pParse, pSub,
24190 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20 20 70   &dest);.      p
241a0 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 6e 52 6f 77  Item->pTab->nRow
241b0 45 73 74 20 3d 20 28 75 6e 73 69 67 6e 65 64 29  Est = (unsigned)
241c0 70 53 75 62 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  pSub->nSelectRow
241d0 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 6e 63 65  ;.      if( once
241e0 41 64 64 72 20 29 20 73 71 6c 69 74 65 33 56 64  Addr ) sqlite3Vd
241f0 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6f 6e  beJumpHere(v, on
24200 63 65 41 64 64 72 29 3b 0a 20 20 20 20 20 20 72  ceAddr);.      r
24210 65 74 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33  etAddr = sqlite3
24220 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
24230 5f 52 65 74 75 72 6e 2c 20 70 49 74 65 6d 2d 3e  _Return, pItem->
24240 72 65 67 52 65 74 75 72 6e 29 3b 0a 20 20 20 20  regReturn);.    
24250 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
24260 2c 20 22 65 6e 64 20 25 73 22 2c 20 70 49 74 65  , "end %s", pIte
24270 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29  m->pTab->zName))
24280 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
24290 64 62 65 43 68 61 6e 67 65 50 31 28 76 2c 20 74  dbeChangeP1(v, t
242a0 6f 70 41 64 64 72 2c 20 72 65 74 41 64 64 72 29  opAddr, retAddr)
242b0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43  ;.      sqlite3C
242c0 6c 65 61 72 54 65 6d 70 52 65 67 43 61 63 68 65  learTempRegCache
242d0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 7d 0a  (pParse);.    }.
242e0 20 20 20 20 69 66 28 20 2f 2a 70 50 61 72 73 65      if( /*pParse
242f0 2d 3e 6e 45 72 72 20 7c 7c 2a 2f 20 64 62 2d 3e  ->nErr ||*/ db->
24300 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
24310 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63        goto selec
24320 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20  t_end;.    }.   
24330 20 70 50 61 72 73 65 2d 3e 6e 48 65 69 67 68 74   pParse->nHeight
24340 20 2d 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63   -= sqlite3Selec
24350 74 45 78 70 72 48 65 69 67 68 74 28 70 29 3b 0a  tExprHeight(p);.
24360 20 20 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70      pTabList = p
24370 2d 3e 70 53 72 63 3b 0a 20 20 20 20 69 66 28 20  ->pSrc;.    if( 
24380 21 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62  !IgnorableOrderb
24390 79 28 70 44 65 73 74 29 20 29 7b 0a 20 20 20 20  y(pDest) ){.    
243a0 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e    pOrderBy = p->
243b0 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 7d 0a  pOrderBy;.    }.
243c0 20 20 7d 0a 20 20 70 45 4c 69 73 74 20 3d 20 70    }.  pEList = p
243d0 2d 3e 70 45 4c 69 73 74 3b 0a 23 65 6e 64 69 66  ->pEList;.#endif
243e0 0a 20 20 70 57 68 65 72 65 20 3d 20 70 2d 3e 70  .  pWhere = p->p
243f0 57 68 65 72 65 3b 0a 20 20 70 47 72 6f 75 70 42  Where;.  pGroupB
24400 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b  y = p->pGroupBy;
24410 0a 20 20 70 48 61 76 69 6e 67 20 3d 20 70 2d 3e  .  pHaving = p->
24420 70 48 61 76 69 6e 67 3b 0a 20 20 73 44 69 73 74  pHaving;.  sDist
24430 69 6e 63 74 2e 69 73 54 6e 63 74 20 3d 20 28 70  inct.isTnct = (p
24440 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
24450 44 69 73 74 69 6e 63 74 29 21 3d 30 3b 0a 0a 23  Distinct)!=0;..#
24460 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
24470 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  IT_COMPOUND_SELE
24480 43 54 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  CT.  /* If there
24490 20 69 73 20 61 72 65 20 61 20 73 65 71 75 65 6e   is are a sequen
244a0 63 65 20 6f 66 20 71 75 65 72 69 65 73 2c 20 64  ce of queries, d
244b0 6f 20 74 68 65 20 65 61 72 6c 69 65 72 20 6f 6e  o the earlier on
244c0 65 73 20 66 69 72 73 74 2e 0a 20 20 2a 2f 0a 20  es first..  */. 
244d0 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29   if( p->pPrior )
244e0 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 52 69  {.    if( p->pRi
244f0 67 68 74 6d 6f 73 74 3d 3d 30 20 29 7b 0a 20 20  ghtmost==0 ){.  
24500 20 20 20 20 53 65 6c 65 63 74 20 2a 70 4c 6f 6f      Select *pLoo
24510 70 2c 20 2a 70 52 69 67 68 74 20 3d 20 30 3b 0a  p, *pRight = 0;.
24520 20 20 20 20 20 20 69 6e 74 20 63 6e 74 20 3d 20        int cnt = 
24530 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 6d 78 53  0;.      int mxS
24540 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 66 6f 72  elect;.      for
24550 28 70 4c 6f 6f 70 3d 70 3b 20 70 4c 6f 6f 70 3b  (pLoop=p; pLoop;
24560 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 50   pLoop=pLoop->pP
24570 72 69 6f 72 2c 20 63 6e 74 2b 2b 29 7b 0a 20 20  rior, cnt++){.  
24580 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 70 52 69        pLoop->pRi
24590 67 68 74 6d 6f 73 74 20 3d 20 70 3b 0a 20 20 20  ghtmost = p;.   
245a0 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 70 4e 65 78       pLoop->pNex
245b0 74 20 3d 20 70 52 69 67 68 74 3b 0a 20 20 20 20  t = pRight;.    
245c0 20 20 20 20 70 52 69 67 68 74 20 3d 20 70 4c 6f      pRight = pLo
245d0 6f 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  op;.      }.    
245e0 20 20 6d 78 53 65 6c 65 63 74 20 3d 20 64 62 2d    mxSelect = db-
245f0 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  >aLimit[SQLITE_L
24600 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  IMIT_COMPOUND_SE
24610 4c 45 43 54 5d 3b 0a 20 20 20 20 20 20 69 66 28  LECT];.      if(
24620 20 6d 78 53 65 6c 65 63 74 20 26 26 20 63 6e 74   mxSelect && cnt
24630 3e 6d 78 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  >mxSelect ){.   
24640 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
24650 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f  rMsg(pParse, "to
24660 6f 20 6d 61 6e 79 20 74 65 72 6d 73 20 69 6e 20  o many terms in 
24670 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 22  compound SELECT"
24680 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  );.        goto 
24690 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
246a0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 63    }.    }.    rc
246b0 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 28 70   = multiSelect(p
246c0 50 61 72 73 65 2c 20 70 2c 20 70 44 65 73 74 29  Parse, p, pDest)
246d0 3b 0a 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74  ;.    explainSet
246e0 49 6e 74 65 67 65 72 28 70 50 61 72 73 65 2d 3e  Integer(pParse->
246f0 69 53 65 6c 65 63 74 49 64 2c 20 69 52 65 73 74  iSelectId, iRest
24700 6f 72 65 53 65 6c 65 63 74 49 64 29 3b 0a 20 20  oreSelectId);.  
24710 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
24720 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66  .#endif..  /* If
24730 20 74 68 65 72 65 20 69 73 20 62 6f 74 68 20 61   there is both a
24740 20 47 52 4f 55 50 20 42 59 20 61 6e 64 20 61 6e   GROUP BY and an
24750 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
24760 20 61 6e 64 20 74 68 65 79 20 61 72 65 0a 20 20   and they are.  
24770 2a 2a 20 69 64 65 6e 74 69 63 61 6c 2c 20 74 68  ** identical, th
24780 65 6e 20 64 69 73 61 62 6c 65 20 74 68 65 20 4f  en disable the O
24790 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 73  RDER BY clause s
247a0 69 6e 63 65 20 74 68 65 20 47 52 4f 55 50 20 42  ince the GROUP B
247b0 59 0a 20 20 2a 2a 20 77 69 6c 6c 20 63 61 75 73  Y.  ** will caus
247c0 65 20 65 6c 65 6d 65 6e 74 73 20 74 6f 20 63 6f  e elements to co
247d0 6d 65 20 6f 75 74 20 69 6e 20 74 68 65 20 63 6f  me out in the co
247e0 72 72 65 63 74 20 6f 72 64 65 72 2e 20 20 54 68  rrect order.  Th
247f0 69 73 20 69 73 0a 20 20 2a 2a 20 61 6e 20 6f 70  is is.  ** an op
24800 74 69 6d 69 7a 61 74 69 6f 6e 20 2d 20 74 68 65  timization - the
24810 20 63 6f 72 72 65 63 74 20 61 6e 73 77 65 72 20   correct answer 
24820 73 68 6f 75 6c 64 20 72 65 73 75 6c 74 20 72 65  should result re
24830 67 61 72 64 6c 65 73 73 2e 0a 20 20 2a 2a 20 55  gardless..  ** U
24840 73 65 20 74 68 65 20 53 51 4c 49 54 45 5f 47 72  se the SQLITE_Gr
24850 6f 75 70 42 79 4f 72 64 65 72 20 66 6c 61 67 20  oupByOrder flag 
24860 77 69 74 68 20 53 51 4c 49 54 45 5f 54 45 53 54  with SQLITE_TEST
24870 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 45 52 0a 20  CTRL_OPTIMIZER. 
24880 20 2a 2a 20 74 6f 20 64 69 73 61 62 6c 65 20 74   ** to disable t
24890 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  his optimization
248a0 20 66 6f 72 20 74 65 73 74 69 6e 67 20 70 75 72   for testing pur
248b0 70 6f 73 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  poses..  */.  if
248c0 28 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  ( sqlite3ExprLis
248d0 74 43 6f 6d 70 61 72 65 28 70 2d 3e 70 47 72 6f  tCompare(p->pGro
248e0 75 70 42 79 2c 20 70 4f 72 64 65 72 42 79 2c 20  upBy, pOrderBy, 
248f0 2d 31 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  -1)==0.         
24900 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45  && OptimizationE
24910 6e 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54  nabled(db, SQLIT
24920 45 5f 47 72 6f 75 70 42 79 4f 72 64 65 72 29 20  E_GroupByOrder) 
24930 29 7b 0a 20 20 20 20 70 4f 72 64 65 72 42 79 20  ){.    pOrderBy 
24940 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  = 0;.  }..  /* I
24950 66 20 74 68 65 20 71 75 65 72 79 20 69 73 20 44  f the query is D
24960 49 53 54 49 4e 43 54 20 77 69 74 68 20 61 6e 20  ISTINCT with an 
24970 4f 52 44 45 52 20 42 59 20 62 75 74 20 69 73 20  ORDER BY but is 
24980 6e 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74 65  not an aggregate
24990 2c 20 61 6e 64 20 0a 20 20 2a 2a 20 69 66 20 74  , and .  ** if t
249a0 68 65 20 73 65 6c 65 63 74 2d 6c 69 73 74 20 69  he select-list i
249b0 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68  s the same as th
249c0 65 20 4f 52 44 45 52 20 42 59 20 6c 69 73 74 2c  e ORDER BY list,
249d0 20 74 68 65 6e 20 74 68 69 73 20 71 75 65 72 79   then this query
249e0 0a 20 20 2a 2a 20 63 61 6e 20 62 65 20 72 65 77  .  ** can be rew
249f0 72 69 74 74 65 6e 20 61 73 20 61 20 47 52 4f 55  ritten as a GROU
24a00 50 20 42 59 2e 20 49 6e 20 6f 74 68 65 72 20 77  P BY. In other w
24a10 6f 72 64 73 2c 20 74 68 69 73 3a 0a 20 20 2a 2a  ords, this:.  **
24a20 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  .  **     SELECT
24a30 20 44 49 53 54 49 4e 43 54 20 78 79 7a 20 46 52   DISTINCT xyz FR
24a40 4f 4d 20 2e 2e 2e 20 4f 52 44 45 52 20 42 59 20  OM ... ORDER BY 
24a50 78 79 7a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 69 73  xyz.  **.  ** is
24a60 20 74 72 61 6e 73 66 6f 72 6d 65 64 20 74 6f 3a   transformed to:
24a70 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53  .  **.  **     S
24a80 45 4c 45 43 54 20 78 79 7a 20 46 52 4f 4d 20 2e  ELECT xyz FROM .
24a90 2e 2e 20 47 52 4f 55 50 20 42 59 20 78 79 7a 0a  .. GROUP BY xyz.
24aa0 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 73 65    **.  ** The se
24ab0 63 6f 6e 64 20 66 6f 72 6d 20 69 73 20 70 72 65  cond form is pre
24ac0 66 65 72 72 65 64 20 61 73 20 61 20 73 69 6e 67  ferred as a sing
24ad0 6c 65 20 69 6e 64 65 78 20 28 6f 72 20 74 65 6d  le index (or tem
24ae0 70 2d 74 61 62 6c 65 29 20 6d 61 79 20 62 65 20  p-table) may be 
24af0 0a 20 20 2a 2a 20 75 73 65 64 20 66 6f 72 20 62  .  ** used for b
24b00 6f 74 68 20 74 68 65 20 4f 52 44 45 52 20 42 59  oth the ORDER BY
24b10 20 61 6e 64 20 44 49 53 54 49 4e 43 54 20 70 72   and DISTINCT pr
24b20 6f 63 65 73 73 69 6e 67 2e 20 41 73 20 6f 72 69  ocessing. As ori
24b30 67 69 6e 61 6c 6c 79 20 0a 20 20 2a 2a 20 77 72  ginally .  ** wr
24b40 69 74 74 65 6e 20 74 68 65 20 71 75 65 72 79 20  itten the query 
24b50 6d 75 73 74 20 75 73 65 20 61 20 74 65 6d 70 2d  must use a temp-
24b60 74 61 62 6c 65 20 66 6f 72 20 61 74 20 6c 65 61  table for at lea
24b70 73 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 4f 52  st one of the OR
24b80 44 45 52 20 0a 20 20 2a 2a 20 42 59 20 61 6e 64  DER .  ** BY and
24b90 20 44 49 53 54 49 4e 43 54 2c 20 61 6e 64 20 61   DISTINCT, and a
24ba0 6e 20 69 6e 64 65 78 20 6f 72 20 73 65 70 61 72  n index or separ
24bb0 61 74 65 20 74 65 6d 70 2d 74 61 62 6c 65 20 66  ate temp-table f
24bc0 6f 72 20 74 68 65 20 6f 74 68 65 72 2e 0a 20 20  or the other..  
24bd0 2a 2f 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c  */.  if( (p->sel
24be0 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74  Flags & (SF_Dist
24bf0 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74  inct|SF_Aggregat
24c00 65 29 29 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74  e))==SF_Distinct
24c10 20 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33 45   .   && sqlite3E
24c20 78 70 72 4c 69 73 74 43 6f 6d 70 61 72 65 28 70  xprListCompare(p
24c30 4f 72 64 65 72 42 79 2c 20 70 2d 3e 70 45 4c 69  OrderBy, p->pELi
24c40 73 74 2c 20 2d 31 29 3d 3d 30 0a 20 20 29 7b 0a  st, -1)==0.  ){.
24c50 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20      p->selFlags 
24c60 26 3d 20 7e 53 46 5f 44 69 73 74 69 6e 63 74 3b  &= ~SF_Distinct;
24c70 0a 20 20 20 20 70 2d 3e 70 47 72 6f 75 70 42 79  .    p->pGroupBy
24c80 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
24c90 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 45 4c  stDup(db, p->pEL
24ca0 69 73 74 2c 20 30 29 3b 0a 20 20 20 20 70 47 72  ist, 0);.    pGr
24cb0 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75  oupBy = p->pGrou
24cc0 70 42 79 3b 0a 20 20 20 20 70 4f 72 64 65 72 42  pBy;.    pOrderB
24cd0 79 20 3d 20 30 3b 0a 20 20 20 20 2f 2a 20 4e 6f  y = 0;.    /* No
24ce0 74 69 63 65 20 74 68 61 74 20 65 76 65 6e 20 74  tice that even t
24cf0 68 6f 75 67 68 74 20 53 46 5f 44 69 73 74 69 6e  hought SF_Distin
24d00 63 74 20 68 61 73 20 62 65 65 6e 20 63 6c 65 61  ct has been clea
24d10 72 65 64 20 66 72 6f 6d 20 70 2d 3e 73 65 6c 46  red from p->selF
24d20 6c 61 67 73 2c 0a 20 20 20 20 2a 2a 20 74 68 65  lags,.    ** the
24d30 20 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63   sDistinct.isTnc
24d40 74 20 69 73 20 73 74 69 6c 6c 20 73 65 74 2e 20  t is still set. 
24d50 20 48 65 6e 63 65 2c 20 69 73 54 6e 63 74 20 72   Hence, isTnct r
24d60 65 70 72 65 73 65 6e 74 73 20 74 68 65 0a 20 20  epresents the.  
24d70 20 20 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 73 65    ** original se
24d80 74 74 69 6e 67 20 6f 66 20 74 68 65 20 53 46 5f  tting of the SF_
24d90 44 69 73 74 69 6e 63 74 20 66 6c 61 67 2c 20 6e  Distinct flag, n
24da0 6f 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  ot the current s
24db0 65 74 74 69 6e 67 20 2a 2f 0a 20 20 20 20 61 73  etting */.    as
24dc0 73 65 72 74 28 20 73 44 69 73 74 69 6e 63 74 2e  sert( sDistinct.
24dd0 69 73 54 6e 63 74 20 29 3b 0a 20 20 7d 0a 0a 20  isTnct );.  }.. 
24de0 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
24df0 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
24e00 73 65 2c 20 74 68 65 6e 20 74 68 69 73 20 73 6f  se, then this so
24e10 72 74 69 6e 67 0a 20 20 2a 2a 20 69 6e 64 65 78  rting.  ** index
24e20 20 6d 69 67 68 74 20 65 6e 64 20 75 70 20 62 65   might end up be
24e30 69 6e 67 20 75 6e 75 73 65 64 20 69 66 20 74 68  ing unused if th
24e40 65 20 64 61 74 61 20 63 61 6e 20 62 65 20 0a 20  e data can be . 
24e50 20 2a 2a 20 65 78 74 72 61 63 74 65 64 20 69 6e   ** extracted in
24e60 20 70 72 65 2d 73 6f 72 74 65 64 20 6f 72 64 65   pre-sorted orde
24e70 72 2e 20 20 49 66 20 74 68 61 74 20 69 73 20 74  r.  If that is t
24e80 68 65 20 63 61 73 65 2c 20 74 68 65 6e 20 74 68  he case, then th
24e90 65 0a 20 20 2a 2a 20 4f 50 5f 4f 70 65 6e 45 70  e.  ** OP_OpenEp
24ea0 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 75 63 74  hemeral instruct
24eb0 69 6f 6e 20 77 69 6c 6c 20 62 65 20 63 68 61 6e  ion will be chan
24ec0 67 65 64 20 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f  ged to an OP_Noo
24ed0 70 20 6f 6e 63 65 0a 20 20 2a 2a 20 77 65 20 66  p once.  ** we f
24ee0 69 67 75 72 65 20 6f 75 74 20 74 68 61 74 20 74  igure out that t
24ef0 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78  he sorting index
24f00 20 69 73 20 6e 6f 74 20 6e 65 65 64 65 64 2e 20   is not needed. 
24f10 20 54 68 65 20 61 64 64 72 53 6f 72 74 49 6e 64   The addrSortInd
24f20 65 78 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c 65  ex.  ** variable
24f30 20 69 73 20 75 73 65 64 20 74 6f 20 66 61 63 69   is used to faci
24f40 6c 69 74 61 74 65 20 74 68 61 74 20 63 68 61 6e  litate that chan
24f50 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ge..  */.  if( p
24f60 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 4b  OrderBy ){.    K
24f70 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
24f80 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d  ;.    pKeyInfo =
24f90 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72   keyInfoFromExpr
24fa0 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 4f 72  List(pParse, pOr
24fb0 64 65 72 42 79 29 3b 0a 20 20 20 20 70 4f 72 64  derBy);.    pOrd
24fc0 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 20 3d  erBy->iECursor =
24fd0 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
24fe0 0a 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e  .    p->addrOpen
24ff0 45 70 68 6d 5b 32 5d 20 3d 20 61 64 64 72 53 6f  Ephm[2] = addrSo
25000 72 74 49 6e 64 65 78 20 3d 0a 20 20 20 20 20 20  rtIndex =.      
25010 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
25020 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65  4(v, OP_OpenEphe
25030 6d 65 72 61 6c 2c 0a 20 20 20 20 20 20 20 20 20  meral,.         
25040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25050 20 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75    pOrderBy->iECu
25060 72 73 6f 72 2c 20 70 4f 72 64 65 72 42 79 2d 3e  rsor, pOrderBy->
25070 6e 45 78 70 72 2b 32 2c 20 30 2c 0a 20 20 20 20  nExpr+2, 0,.    
25080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25090 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b         (char*)pK
250a0 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e  eyInfo, P4_KEYIN
250b0 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 7d  FO_HANDOFF);.  }
250c0 65 6c 73 65 7b 0a 20 20 20 20 61 64 64 72 53 6f  else{.    addrSo
250d0 72 74 49 6e 64 65 78 20 3d 20 2d 31 3b 0a 20 20  rtIndex = -1;.  
250e0 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6f  }..  /* If the o
250f0 75 74 70 75 74 20 69 73 20 64 65 73 74 69 6e 65  utput is destine
25100 64 20 66 6f 72 20 61 20 74 65 6d 70 6f 72 61 72  d for a temporar
25110 79 20 74 61 62 6c 65 2c 20 6f 70 65 6e 20 74 68  y table, open th
25120 61 74 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20  at table..  */. 
25130 20 69 66 28 20 70 44 65 73 74 2d 3e 65 44 65 73   if( pDest->eDes
25140 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20  t==SRT_EphemTab 
25150 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
25160 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f  beAddOp2(v, OP_O
25170 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70 44  penEphemeral, pD
25180 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 70 45  est->iSDParm, pE
25190 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20  List->nExpr);.  
251a0 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20  }..  /* Set the 
251b0 6c 69 6d 69 74 65 72 2e 0a 20 20 2a 2f 0a 20 20  limiter..  */.  
251c0 69 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64  iEnd = sqlite3Vd
251d0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
251e0 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20    p->nSelectRow 
251f0 3d 20 4c 41 52 47 45 53 54 5f 49 4e 54 36 34 3b  = LARGEST_INT64;
25200 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52  .  computeLimitR
25210 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c  egisters(pParse,
25220 20 70 2c 20 69 45 6e 64 29 3b 0a 20 20 69 66 28   p, iEnd);.  if(
25230 20 70 2d 3e 69 4c 69 6d 69 74 3d 3d 30 20 26 26   p->iLimit==0 &&
25240 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78 3e 3d   addrSortIndex>=
25250 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
25260 56 64 62 65 47 65 74 4f 70 28 76 2c 20 61 64 64  VdbeGetOp(v, add
25270 72 53 6f 72 74 49 6e 64 65 78 29 2d 3e 6f 70 63  rSortIndex)->opc
25280 6f 64 65 20 3d 20 4f 50 5f 53 6f 72 74 65 72 4f  ode = OP_SorterO
25290 70 65 6e 3b 0a 20 20 20 20 70 2d 3e 73 65 6c 46  pen;.    p->selF
252a0 6c 61 67 73 20 7c 3d 20 53 46 5f 55 73 65 53 6f  lags |= SF_UseSo
252b0 72 74 65 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rter;.  }..  /* 
252c0 4f 70 65 6e 20 61 20 76 69 72 74 75 61 6c 20 69  Open a virtual i
252d0 6e 64 65 78 20 74 6f 20 75 73 65 20 66 6f 72 20  ndex to use for 
252e0 74 68 65 20 64 69 73 74 69 6e 63 74 20 73 65 74  the distinct set
252f0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
25300 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69  selFlags & SF_Di
25310 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 73 44  stinct ){.    sD
25320 69 73 74 69 6e 63 74 2e 74 61 62 54 6e 63 74 20  istinct.tabTnct 
25330 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
25340 3b 0a 20 20 20 20 73 44 69 73 74 69 6e 63 74 2e  ;.    sDistinct.
25350 61 64 64 72 54 6e 63 74 20 3d 20 73 71 6c 69 74  addrTnct = sqlit
25360 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
25370 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
25380 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
25390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
253a0 20 20 73 44 69 73 74 69 6e 63 74 2e 74 61 62 54    sDistinct.tabT
253b0 6e 63 74 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20  nct, 0, 0,.     
253c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
253d0 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
253e0 2a 29 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70  *)keyInfoFromExp
253f0 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 2d  rList(pParse, p-
25400 3e 70 45 4c 69 73 74 29 2c 0a 20 20 20 20 20 20  >pEList),.      
25410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25420 20 20 20 20 20 20 20 20 20 20 50 34 5f 4b 45 59            P4_KEY
25430 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20  INFO_HANDOFF);. 
25440 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
25450 61 6e 67 65 50 35 28 76 2c 20 42 54 52 45 45 5f  angeP5(v, BTREE_
25460 55 4e 4f 52 44 45 52 45 44 29 3b 0a 20 20 20 20  UNORDERED);.    
25470 73 44 69 73 74 69 6e 63 74 2e 65 54 6e 63 74 54  sDistinct.eTnctT
25480 79 70 65 20 3d 20 57 48 45 52 45 5f 44 49 53 54  ype = WHERE_DIST
25490 49 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44 3b 0a  INCT_UNORDERED;.
254a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 44 69    }else{.    sDi
254b0 73 74 69 6e 63 74 2e 65 54 6e 63 74 54 79 70 65  stinct.eTnctType
254c0 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43   = WHERE_DISTINC
254d0 54 5f 4e 4f 4f 50 3b 0a 20 20 7d 0a 0a 20 20 69  T_NOOP;.  }..  i
254e0 66 28 20 21 69 73 41 67 67 20 26 26 20 70 47 72  f( !isAgg && pGr
254f0 6f 75 70 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20  oupBy==0 ){.    
25500 2f 2a 20 4e 6f 20 61 67 67 72 65 67 61 74 65 20  /* No aggregate 
25510 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 20 6e 6f  functions and no
25520 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
25530 20 2a 2f 0a 20 20 20 20 75 31 36 20 77 63 74 72   */.    u16 wctr
25540 6c 46 6c 61 67 73 20 3d 20 28 73 44 69 73 74 69  lFlags = (sDisti
25550 6e 63 74 2e 69 73 54 6e 63 74 20 3f 20 57 48 45  nct.isTnct ? WHE
25560 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54  RE_WANT_DISTINCT
25570 20 3a 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 42   : 0);..    /* B
25580 65 67 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  egin the databas
25590 65 20 73 63 61 6e 2e 20 2a 2f 0a 20 20 20 20 70  e scan. */.    p
255a0 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57  WInfo = sqlite3W
255b0 68 65 72 65 42 65 67 69 6e 28 70 50 61 72 73 65  hereBegin(pParse
255c0 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65  , pTabList, pWhe
255d0 72 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 2d  re, pOrderBy, p-
255e0 3e 70 45 4c 69 73 74 2c 0a 20 20 20 20 20 20 20  >pEList,.       
255f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25600 20 20 20 20 20 20 20 20 77 63 74 72 6c 46 6c 61          wctrlFla
25610 67 73 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  gs, 0);.    if( 
25620 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f  pWInfo==0 ) goto
25630 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
25640 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72   if( sqlite3Wher
25650 65 4f 75 74 70 75 74 52 6f 77 43 6f 75 6e 74 28  eOutputRowCount(
25660 70 57 49 6e 66 6f 29 20 3c 20 70 2d 3e 6e 53 65  pWInfo) < p->nSe
25670 6c 65 63 74 52 6f 77 20 29 7b 0a 20 20 20 20 20  lectRow ){.     
25680 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d   p->nSelectRow =
25690 20 73 71 6c 69 74 65 33 57 68 65 72 65 4f 75 74   sqlite3WhereOut
256a0 70 75 74 52 6f 77 43 6f 75 6e 74 28 70 57 49 6e  putRowCount(pWIn
256b0 66 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  fo);.    }.    i
256c0 66 28 20 73 44 69 73 74 69 6e 63 74 2e 69 73 54  f( sDistinct.isT
256d0 6e 63 74 20 26 26 20 73 71 6c 69 74 65 33 57 68  nct && sqlite3Wh
256e0 65 72 65 49 73 44 69 73 74 69 6e 63 74 28 70 57  ereIsDistinct(pW
256f0 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20 20 20 73  Info) ){.      s
25700 44 69 73 74 69 6e 63 74 2e 65 54 6e 63 74 54 79  Distinct.eTnctTy
25710 70 65 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72  pe = sqlite3Wher
25720 65 49 73 44 69 73 74 69 6e 63 74 28 70 57 49 6e  eIsDistinct(pWIn
25730 66 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  fo);.    }.    i
25740 66 28 20 70 4f 72 64 65 72 42 79 20 26 26 20 73  f( pOrderBy && s
25750 71 6c 69 74 65 33 57 68 65 72 65 49 73 4f 72 64  qlite3WhereIsOrd
25760 65 72 65 64 28 70 57 49 6e 66 6f 29 20 29 20 70  ered(pWInfo) ) p
25770 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 0a 20 20  OrderBy = 0;..  
25780 20 20 2f 2a 20 49 66 20 73 6f 72 74 69 6e 67 20    /* If sorting 
25790 69 6e 64 65 78 20 74 68 61 74 20 77 61 73 20 63  index that was c
257a0 72 65 61 74 65 64 20 62 79 20 61 20 70 72 69 6f  reated by a prio
257b0 72 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  r OP_OpenEphemer
257c0 61 6c 20 0a 20 20 20 20 2a 2a 20 69 6e 73 74 72  al .    ** instr
257d0 75 63 74 69 6f 6e 20 65 6e 64 65 64 20 75 70 20  uction ended up 
257e0 6e 6f 74 20 62 65 69 6e 67 20 6e 65 65 64 65 64  not being needed
257f0 2c 20 74 68 65 6e 20 63 68 61 6e 67 65 20 74 68  , then change th
25800 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  e OP_OpenEphemer
25810 61 6c 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20 61  al.    ** into a
25820 6e 20 4f 50 5f 4e 6f 6f 70 2e 0a 20 20 20 20 2a  n OP_Noop..    *
25830 2f 0a 20 20 20 20 69 66 28 20 61 64 64 72 53 6f  /.    if( addrSo
25840 72 74 49 6e 64 65 78 3e 3d 30 20 26 26 20 70 4f  rtIndex>=0 && pO
25850 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20  rderBy==0 ){.   
25860 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
25870 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 61 64  angeToNoop(v, ad
25880 64 72 53 6f 72 74 49 6e 64 65 78 29 3b 0a 20 20  drSortIndex);.  
25890 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45      p->addrOpenE
258a0 70 68 6d 5b 32 5d 20 3d 20 2d 31 3b 0a 20 20 20  phm[2] = -1;.   
258b0 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 73 65 20 74   }..    /* Use t
258c0 68 65 20 73 74 61 6e 64 61 72 64 20 69 6e 6e 65  he standard inne
258d0 72 20 6c 6f 6f 70 2e 20 2a 2f 0a 20 20 20 20 73  r loop. */.    s
258e0 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70  electInnerLoop(p
258f0 50 61 72 73 65 2c 20 70 2c 20 70 45 4c 69 73 74  Parse, p, pEList
25900 2c 20 30 2c 20 30 2c 20 70 4f 72 64 65 72 42 79  , 0, 0, pOrderBy
25910 2c 20 26 73 44 69 73 74 69 6e 63 74 2c 20 70 44  , &sDistinct, pD
25920 65 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  est,.           
25930 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
25940 57 68 65 72 65 43 6f 6e 74 69 6e 75 65 4c 61 62  WhereContinueLab
25950 65 6c 28 70 57 49 6e 66 6f 29 2c 0a 20 20 20 20  el(pWInfo),.    
25960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25970 73 71 6c 69 74 65 33 57 68 65 72 65 42 72 65 61  sqlite3WhereBrea
25980 6b 4c 61 62 65 6c 28 70 57 49 6e 66 6f 29 29 3b  kLabel(pWInfo));
25990 0a 0a 20 20 20 20 2f 2a 20 45 6e 64 20 74 68 65  ..    /* End the
259a0 20 64 61 74 61 62 61 73 65 20 73 63 61 6e 20 6c   database scan l
259b0 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  oop..    */.    
259c0 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
259d0 70 57 49 6e 66 6f 29 3b 0a 20 20 7d 65 6c 73 65  pWInfo);.  }else
259e0 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61  {.    /* This ca
259f0 73 65 20 77 68 65 6e 20 74 68 65 72 65 20 65 78  se when there ex
25a00 69 73 74 20 61 67 67 72 65 67 61 74 65 20 66 75  ist aggregate fu
25a10 6e 63 74 69 6f 6e 73 20 6f 72 20 61 20 47 52 4f  nctions or a GRO
25a20 55 50 20 42 59 20 63 6c 61 75 73 65 0a 20 20 20  UP BY clause.   
25a30 20 2a 2a 20 6f 72 20 62 6f 74 68 20 2a 2f 0a 20   ** or both */. 
25a40 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73     NameContext s
25a50 4e 43 3b 20 20 20 20 2f 2a 20 4e 61 6d 65 20 63  NC;    /* Name c
25a60 6f 6e 74 65 78 74 20 66 6f 72 20 70 72 6f 63 65  ontext for proce
25a70 73 73 69 6e 67 20 61 67 67 72 65 67 61 74 65 20  ssing aggregate 
25a80 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20  information */. 
25a90 20 20 20 69 6e 74 20 69 41 4d 65 6d 3b 20 20 20     int iAMem;   
25aa0 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
25ab0 4d 65 6d 20 61 64 64 72 65 73 73 20 66 6f 72 20  Mem address for 
25ac0 73 74 6f 72 69 6e 67 20 63 75 72 72 65 6e 74 20  storing current 
25ad0 47 52 4f 55 50 20 42 59 20 2a 2f 0a 20 20 20 20  GROUP BY */.    
25ae0 69 6e 74 20 69 42 4d 65 6d 3b 20 20 20 20 20 20  int iBMem;      
25af0 20 20 20 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d      /* First Mem
25b00 20 61 64 64 72 65 73 73 20 66 6f 72 20 70 72 65   address for pre
25b10 76 69 6f 75 73 20 47 52 4f 55 50 20 42 59 20 2a  vious GROUP BY *
25b20 2f 0a 20 20 20 20 69 6e 74 20 69 55 73 65 46 6c  /.    int iUseFl
25b30 61 67 3b 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d  ag;       /* Mem
25b40 20 61 64 64 72 65 73 73 20 68 6f 6c 64 69 6e 67   address holding
25b50 20 66 6c 61 67 20 69 6e 64 69 63 61 74 69 6e 67   flag indicating
25b60 20 74 68 61 74 20 61 74 20 6c 65 61 73 74 0a 20   that at least. 
25b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25b80 20 20 20 20 20 20 20 2a 2a 20 6f 6e 65 20 72 6f         ** one ro
25b90 77 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 74  w of the input t
25ba0 6f 20 74 68 65 20 61 67 67 72 65 67 61 74 6f 72  o the aggregator
25bb0 20 68 61 73 20 62 65 65 6e 0a 20 20 20 20 20 20   has been.      
25bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25bd0 20 20 2a 2a 20 70 72 6f 63 65 73 73 65 64 20 2a    ** processed *
25be0 2f 0a 20 20 20 20 69 6e 74 20 69 41 62 6f 72 74  /.    int iAbort
25bf0 46 6c 61 67 3b 20 20 20 20 20 2f 2a 20 4d 65 6d  Flag;     /* Mem
25c00 20 61 64 64 72 65 73 73 20 77 68 69 63 68 20 63   address which c
25c10 61 75 73 65 73 20 71 75 65 72 79 20 61 62 6f 72  auses query abor
25c20 74 20 69 66 20 70 6f 73 69 74 69 76 65 20 2a 2f  t if positive */
25c30 0a 20 20 20 20 69 6e 74 20 67 72 6f 75 70 42 79  .    int groupBy
25c40 53 6f 72 74 3b 20 20 20 20 2f 2a 20 52 6f 77 73  Sort;    /* Rows
25c50 20 63 6f 6d 65 20 66 72 6f 6d 20 73 6f 75 72 63   come from sourc
25c60 65 20 69 6e 20 47 52 4f 55 50 20 42 59 20 6f 72  e in GROUP BY or
25c70 64 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61  der */.    int a
25c80 64 64 72 45 6e 64 3b 20 20 20 20 20 20 20 20 2f  ddrEnd;        /
25c90 2a 20 45 6e 64 20 6f 66 20 70 72 6f 63 65 73 73  * End of process
25ca0 69 6e 67 20 66 6f 72 20 74 68 69 73 20 53 45 4c  ing for this SEL
25cb0 45 43 54 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73  ECT */.    int s
25cc0 6f 72 74 50 54 61 62 20 3d 20 30 3b 20 20 20 2f  ortPTab = 0;   /
25cd0 2a 20 50 73 65 75 64 6f 74 61 62 6c 65 20 75 73  * Pseudotable us
25ce0 65 64 20 74 6f 20 64 65 63 6f 64 65 20 73 6f 72  ed to decode sor
25cf0 74 69 6e 67 20 72 65 73 75 6c 74 73 20 2a 2f 0a  ting results */.
25d00 20 20 20 20 69 6e 74 20 73 6f 72 74 4f 75 74 20      int sortOut 
25d10 3d 20 30 3b 20 20 20 20 2f 2a 20 4f 75 74 70 75  = 0;    /* Outpu
25d20 74 20 72 65 67 69 73 74 65 72 20 66 72 6f 6d 20  t register from 
25d30 74 68 65 20 73 6f 72 74 65 72 20 2a 2f 0a 0a 20  the sorter */.. 
25d40 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 61 6e 79     /* Remove any
25d50 20 61 6e 64 20 61 6c 6c 20 61 6c 69 61 73 65 73   and all aliases
25d60 20 62 65 74 77 65 65 6e 20 74 68 65 20 72 65 73   between the res
25d70 75 6c 74 20 73 65 74 20 61 6e 64 20 74 68 65 0a  ult set and the.
25d80 20 20 20 20 2a 2a 20 47 52 4f 55 50 20 42 59 20      ** GROUP BY 
25d90 63 6c 61 75 73 65 2e 0a 20 20 20 20 2a 2f 0a 20  clause..    */. 
25da0 20 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 20     if( pGroupBy 
25db0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6b 3b 20  ){.      int k; 
25dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25dd0 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
25de0 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20  ounter */.      
25df0 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
25e00 69 74 65 6d 20 2a 70 49 74 65 6d 3b 20 20 2f 2a  item *pItem;  /*
25e10 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65   For looping ove
25e20 72 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20  r expression in 
25e30 61 20 6c 69 73 74 20 2a 2f 0a 0a 20 20 20 20 20  a list */..     
25e40 20 66 6f 72 28 6b 3d 70 2d 3e 70 45 4c 69 73 74   for(k=p->pEList
25e50 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d 70  ->nExpr, pItem=p
25e60 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b 20 6b 3e 30  ->pEList->a; k>0
25e70 3b 20 6b 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; k--, pItem++){
25e80 0a 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  .        pItem->
25e90 69 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20 20 20  iAlias = 0;.    
25ea0 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d    }.      for(k=
25eb0 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2c  pGroupBy->nExpr,
25ec0 20 70 49 74 65 6d 3d 70 47 72 6f 75 70 42 79 2d   pItem=pGroupBy-
25ed0 3e 61 3b 20 6b 3e 30 3b 20 6b 2d 2d 2c 20 70 49  >a; k>0; k--, pI
25ee0 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  tem++){.        
25ef0 70 49 74 65 6d 2d 3e 69 41 6c 69 61 73 20 3d 20  pItem->iAlias = 
25f00 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
25f10 20 69 66 28 20 70 2d 3e 6e 53 65 6c 65 63 74 52   if( p->nSelectR
25f20 6f 77 3e 31 30 30 20 29 20 70 2d 3e 6e 53 65 6c  ow>100 ) p->nSel
25f30 65 63 74 52 6f 77 20 3d 20 31 30 30 3b 0a 20 20  ectRow = 100;.  
25f40 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
25f50 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 31  ->nSelectRow = 1
25f60 3b 0a 20 20 20 20 7d 0a 0a 20 0a 20 20 20 20 2f  ;.    }.. .    /
25f70 2a 20 43 72 65 61 74 65 20 61 20 6c 61 62 65 6c  * Create a label
25f80 20 74 6f 20 6a 75 6d 70 20 74 6f 20 77 68 65 6e   to jump to when
25f90 20 77 65 20 77 61 6e 74 20 74 6f 20 61 62 6f 72   we want to abor
25fa0 74 20 74 68 65 20 71 75 65 72 79 20 2a 2f 0a 20  t the query */. 
25fb0 20 20 20 61 64 64 72 45 6e 64 20 3d 20 73 71 6c     addrEnd = sql
25fc0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
25fd0 6c 28 76 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f  l(v);..    /* Co
25fe0 6e 76 65 72 74 20 54 4b 5f 43 4f 4c 55 4d 4e 20  nvert TK_COLUMN 
25ff0 6e 6f 64 65 73 20 69 6e 74 6f 20 54 4b 5f 41 47  nodes into TK_AG
26000 47 5f 43 4f 4c 55 4d 4e 20 61 6e 64 20 6d 61 6b  G_COLUMN and mak
26010 65 20 65 6e 74 72 69 65 73 20 69 6e 0a 20 20 20  e entries in.   
26020 20 2a 2a 20 73 41 67 67 49 6e 66 6f 20 66 6f 72   ** sAggInfo for
26030 20 61 6c 6c 20 54 4b 5f 41 47 47 5f 46 55 4e 43   all TK_AGG_FUNC
26040 54 49 4f 4e 20 6e 6f 64 65 73 20 69 6e 20 65 78  TION nodes in ex
26050 70 72 65 73 73 69 6f 6e 73 20 6f 66 20 74 68 65  pressions of the
26060 0a 20 20 20 20 2a 2a 20 53 45 4c 45 43 54 20 73  .    ** SELECT s
26070 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20 2a 2f  tatement..    */
26080 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73 4e 43  .    memset(&sNC
26090 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29  , 0, sizeof(sNC)
260a0 29 3b 0a 20 20 20 20 73 4e 43 2e 70 50 61 72 73  );.    sNC.pPars
260b0 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 20 20  e = pParse;.    
260c0 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70  sNC.pSrcList = p
260d0 54 61 62 4c 69 73 74 3b 0a 20 20 20 20 73 4e 43  TabList;.    sNC
260e0 2e 70 41 67 67 49 6e 66 6f 20 3d 20 26 73 41 67  .pAggInfo = &sAg
260f0 67 49 6e 66 6f 3b 0a 20 20 20 20 73 41 67 67 49  gInfo;.    sAggI
26100 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75  nfo.nSortingColu
26110 6d 6e 20 3d 20 70 47 72 6f 75 70 42 79 20 3f 20  mn = pGroupBy ? 
26120 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2b  pGroupBy->nExpr+
26130 31 20 3a 20 30 3b 0a 20 20 20 20 73 41 67 67 49  1 : 0;.    sAggI
26140 6e 66 6f 2e 70 47 72 6f 75 70 42 79 20 3d 20 70  nfo.pGroupBy = p
26150 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 73 71 6c  GroupBy;.    sql
26160 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
26170 67 67 4c 69 73 74 28 26 73 4e 43 2c 20 70 45 4c  ggList(&sNC, pEL
26180 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ist);.    sqlite
26190 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c  3ExprAnalyzeAggL
261a0 69 73 74 28 26 73 4e 43 2c 20 70 4f 72 64 65 72  ist(&sNC, pOrder
261b0 42 79 29 3b 0a 20 20 20 20 69 66 28 20 70 48 61  By);.    if( pHa
261c0 76 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 73 71  ving ){.      sq
261d0 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65  lite3ExprAnalyze
261e0 41 67 67 72 65 67 61 74 65 73 28 26 73 4e 43 2c  Aggregates(&sNC,
261f0 20 70 48 61 76 69 6e 67 29 3b 0a 20 20 20 20 7d   pHaving);.    }
26200 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6e 41  .    sAggInfo.nA
26210 63 63 75 6d 75 6c 61 74 6f 72 20 3d 20 73 41 67  ccumulator = sAg
26220 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 0a 20  gInfo.nColumn;. 
26230 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41     for(i=0; i<sA
26240 67 67 49 6e 66 6f 2e 6e 46 75 6e 63 3b 20 69 2b  ggInfo.nFunc; i+
26250 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  +){.      assert
26260 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
26270 74 79 28 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e  ty(sAggInfo.aFun
26280 63 5b 69 5d 2e 70 45 78 70 72 2c 20 45 50 5f 78  c[i].pExpr, EP_x
26290 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20  IsSelect) );.   
262a0 20 20 20 73 4e 43 2e 6e 63 46 6c 61 67 73 20 7c     sNC.ncFlags |
262b0 3d 20 4e 43 5f 49 6e 41 67 67 46 75 6e 63 3b 0a  = NC_InAggFunc;.
262c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
262d0 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28  rAnalyzeAggList(
262e0 26 73 4e 43 2c 20 73 41 67 67 49 6e 66 6f 2e 61  &sNC, sAggInfo.a
262f0 46 75 6e 63 5b 69 5d 2e 70 45 78 70 72 2d 3e 78  Func[i].pExpr->x
26300 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 73  .pList);.      s
26310 4e 43 2e 6e 63 46 6c 61 67 73 20 26 3d 20 7e 4e  NC.ncFlags &= ~N
26320 43 5f 49 6e 41 67 67 46 75 6e 63 3b 0a 20 20 20  C_InAggFunc;.   
26330 20 7d 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d   }.    if( db->m
26340 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f  allocFailed ) go
26350 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a  to select_end;..
26360 20 20 20 20 2f 2a 20 50 72 6f 63 65 73 73 69 6e      /* Processin
26370 67 20 66 6f 72 20 61 67 67 72 65 67 61 74 65 73  g for aggregates
26380 20 77 69 74 68 20 47 52 4f 55 50 20 42 59 20 69   with GROUP BY i
26390 73 20 76 65 72 79 20 64 69 66 66 65 72 65 6e 74  s very different
263a0 20 61 6e 64 0a 20 20 20 20 2a 2a 20 6d 75 63 68   and.    ** much
263b0 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20 74 68   more complex th
263c0 61 6e 20 61 67 67 72 65 67 61 74 65 73 20 77 69  an aggregates wi
263d0 74 68 6f 75 74 20 61 20 47 52 4f 55 50 20 42 59  thout a GROUP BY
263e0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
263f0 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20   pGroupBy ){.   
26400 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79     KeyInfo *pKey
26410 49 6e 66 6f 3b 20 20 2f 2a 20 4b 65 79 69 6e 67  Info;  /* Keying
26420 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72   information for
26430 20 74 68 65 20 67 72 6f 75 70 20 62 79 20 63 6c   the group by cl
26440 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ause */.      in
26450 74 20 6a 31 3b 20 20 20 20 20 20 20 20 20 20 20  t j1;           
26460 20 20 2f 2a 20 41 2d 76 73 2d 42 20 63 6f 6d 70    /* A-vs-B comp
26470 61 72 69 73 69 6f 6e 20 6a 75 6d 70 20 2a 2f 0a  arision jump */.
26480 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 4f 75        int addrOu
26490 74 70 75 74 52 6f 77 3b 20 20 2f 2a 20 53 74 61  tputRow;  /* Sta
264a0 72 74 20 6f 66 20 73 75 62 72 6f 75 74 69 6e 65  rt of subroutine
264b0 20 74 68 61 74 20 6f 75 74 70 75 74 73 20 61 20   that outputs a 
264c0 72 65 73 75 6c 74 20 72 6f 77 20 2a 2f 0a 20 20  result row */.  
264d0 20 20 20 20 69 6e 74 20 72 65 67 4f 75 74 70 75      int regOutpu
264e0 74 52 6f 77 3b 20 20 20 2f 2a 20 52 65 74 75 72  tRow;   /* Retur
264f0 6e 20 61 64 64 72 65 73 73 20 72 65 67 69 73 74  n address regist
26500 65 72 20 66 6f 72 20 6f 75 74 70 75 74 20 73 75  er for output su
26510 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 20 20  broutine */.    
26520 20 20 69 6e 74 20 61 64 64 72 53 65 74 41 62 6f    int addrSetAbo
26530 72 74 3b 20 20 20 2f 2a 20 53 65 74 20 74 68 65  rt;   /* Set the
26540 20 61 62 6f 72 74 20 66 6c 61 67 20 61 6e 64 20   abort flag and 
26550 72 65 74 75 72 6e 20 2a 2f 0a 20 20 20 20 20 20  return */.      
26560 69 6e 74 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f  int addrTopOfLoo
26570 70 3b 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68  p;  /* Top of th
26580 65 20 69 6e 70 75 74 20 6c 6f 6f 70 20 2a 2f 0a  e input loop */.
26590 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 53 6f        int addrSo
265a0 72 74 69 6e 67 49 64 78 3b 20 2f 2a 20 54 68 65  rtingIdx; /* The
265b0 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
265c0 6c 20 66 6f 72 20 74 68 65 20 73 6f 72 74 69 6e  l for the sortin
265d0 67 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20  g index */.     
265e0 20 69 6e 74 20 61 64 64 72 52 65 73 65 74 3b 20   int addrReset; 
265f0 20 20 20 20 20 2f 2a 20 53 75 62 72 6f 75 74 69       /* Subrouti
26600 6e 65 20 66 6f 72 20 72 65 73 65 74 74 69 6e 67  ne for resetting
26610 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74 6f 72   the accumulator
26620 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 65   */.      int re
26630 67 52 65 73 65 74 3b 20 20 20 20 20 20 20 2f 2a  gReset;       /*
26640 20 52 65 74 75 72 6e 20 61 64 64 72 65 73 73 20   Return address 
26650 72 65 67 69 73 74 65 72 20 66 6f 72 20 72 65 73  register for res
26660 65 74 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f  et subroutine */
26670 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  ..      /* If th
26680 65 72 65 20 69 73 20 61 20 47 52 4f 55 50 20 42  ere is a GROUP B
26690 59 20 63 6c 61 75 73 65 20 77 65 20 6d 69 67 68  Y clause we migh
266a0 74 20 6e 65 65 64 20 61 20 73 6f 72 74 69 6e 67  t need a sorting
266b0 20 69 6e 64 65 78 20 74 6f 0a 20 20 20 20 20 20   index to.      
266c0 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 69 74 2e  ** implement it.
266d0 20 20 41 6c 6c 6f 63 61 74 65 20 74 68 61 74 20    Allocate that 
266e0 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 6e 6f  sorting index no
266f0 77 2e 20 20 49 66 20 69 74 20 74 75 72 6e 73 20  w.  If it turns 
26700 6f 75 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 61  out.      ** tha
26710 74 20 77 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64  t we do not need
26720 20 69 74 20 61 66 74 65 72 20 61 6c 6c 2c 20 74   it after all, t
26730 68 65 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e  he OP_SorterOpen
26740 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a 20 20 20   instruction.   
26750 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 63 6f     ** will be co
26760 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61 20 4e  nverted into a N
26770 6f 6f 70 2e 20 20 0a 20 20 20 20 20 20 2a 2f 0a  oop.  .      */.
26780 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 73        sAggInfo.s
26790 6f 72 74 69 6e 67 49 64 78 20 3d 20 70 50 61 72  ortingIdx = pPar
267a0 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
267b0 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79    pKeyInfo = key
267c0 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74  InfoFromExprList
267d0 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42  (pParse, pGroupB
267e0 79 29 3b 0a 20 20 20 20 20 20 61 64 64 72 53 6f  y);.      addrSo
267f0 72 74 69 6e 67 49 64 78 20 3d 20 73 71 6c 69 74  rtingIdx = sqlit
26800 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
26810 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e 2c 20 0a  OP_SorterOpen, .
26820 20 20 20 20 20 20 20 20 20 20 73 41 67 67 49 6e            sAggIn
26830 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 73  fo.sortingIdx, s
26840 41 67 67 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67  AggInfo.nSorting
26850 43 6f 6c 75 6d 6e 2c 20 0a 20 20 20 20 20 20 20  Column, .       
26860 20 20 20 30 2c 20 28 63 68 61 72 2a 29 70 4b 65     0, (char*)pKe
26870 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46  yInfo, P4_KEYINF
26880 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 0a 20 20 20  O_HANDOFF);..   
26890 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65     /* Initialize
268a0 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e   memory location
268b0 73 20 75 73 65 64 20 62 79 20 47 52 4f 55 50 20  s used by GROUP 
268c0 42 59 20 61 67 67 72 65 67 61 74 65 20 70 72 6f  BY aggregate pro
268d0 63 65 73 73 69 6e 67 0a 20 20 20 20 20 20 2a 2f  cessing.      */
268e0 0a 20 20 20 20 20 20 69 55 73 65 46 6c 61 67 20  .      iUseFlag 
268f0 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
26900 3b 0a 20 20 20 20 20 20 69 41 62 6f 72 74 46 6c  ;.      iAbortFl
26910 61 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  ag = ++pParse->n
26920 4d 65 6d 3b 0a 20 20 20 20 20 20 72 65 67 4f 75  Mem;.      regOu
26930 74 70 75 74 52 6f 77 20 3d 20 2b 2b 70 50 61 72  tputRow = ++pPar
26940 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
26950 61 64 64 72 4f 75 74 70 75 74 52 6f 77 20 3d 20  addrOutputRow = 
26960 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
26970 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 72  abel(v);.      r
26980 65 67 52 65 73 65 74 20 3d 20 2b 2b 70 50 61 72  egReset = ++pPar
26990 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
269a0 61 64 64 72 52 65 73 65 74 20 3d 20 73 71 6c 69  addrReset = sqli
269b0 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
269c0 28 76 29 3b 0a 20 20 20 20 20 20 69 41 4d 65 6d  (v);.      iAMem
269d0 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20   = pParse->nMem 
269e0 2b 20 31 3b 0a 20 20 20 20 20 20 70 50 61 72 73  + 1;.      pPars
269f0 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f 75  e->nMem += pGrou
26a00 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  pBy->nExpr;.    
26a10 20 20 69 42 4d 65 6d 20 3d 20 70 50 61 72 73 65    iBMem = pParse
26a20 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 20 20  ->nMem + 1;.    
26a30 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
26a40 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  = pGroupBy->nExp
26a50 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  r;.      sqlite3
26a60 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
26a70 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 69 41 62  _Integer, 0, iAb
26a80 6f 72 74 46 6c 61 67 29 3b 0a 20 20 20 20 20 20  ortFlag);.      
26a90 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
26aa0 22 63 6c 65 61 72 20 61 62 6f 72 74 20 66 6c 61  "clear abort fla
26ab0 67 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  g"));.      sqli
26ac0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
26ad0 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
26ae0 69 55 73 65 46 6c 61 67 29 3b 0a 20 20 20 20 20  iUseFlag);.     
26af0 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
26b00 20 22 69 6e 64 69 63 61 74 65 20 61 63 63 75 6d   "indicate accum
26b10 75 6c 61 74 6f 72 20 65 6d 70 74 79 22 29 29 3b  ulator empty"));
26b20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
26b30 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e  beAddOp3(v, OP_N
26b40 75 6c 6c 2c 20 30 2c 20 69 41 4d 65 6d 2c 20 69  ull, 0, iAMem, i
26b50 41 4d 65 6d 2b 70 47 72 6f 75 70 42 79 2d 3e 6e  AMem+pGroupBy->n
26b60 45 78 70 72 2d 31 29 3b 0a 0a 20 20 20 20 20 20  Expr-1);..      
26b70 2f 2a 20 42 65 67 69 6e 20 61 20 6c 6f 6f 70 20  /* Begin a loop 
26b80 74 68 61 74 20 77 69 6c 6c 20 65 78 74 72 61 63  that will extrac
26b90 74 20 61 6c 6c 20 73 6f 75 72 63 65 20 72 6f 77  t all source row
26ba0 73 20 69 6e 20 47 52 4f 55 50 20 42 59 20 6f 72  s in GROUP BY or
26bb0 64 65 72 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68  der..      ** Th
26bc0 69 73 20 6d 69 67 68 74 20 69 6e 76 6f 6c 76 65  is might involve
26bd0 20 74 77 6f 20 73 65 70 61 72 61 74 65 20 6c 6f   two separate lo
26be0 6f 70 73 20 77 69 74 68 20 61 6e 20 4f 50 5f 53  ops with an OP_S
26bf0 6f 72 74 20 69 6e 20 62 65 74 77 65 65 6e 2c 20  ort in between, 
26c00 6f 72 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 6d  or.      ** it m
26c10 69 67 68 74 20 62 65 20 61 20 73 69 6e 67 6c 65  ight be a single
26c20 20 6c 6f 6f 70 20 74 68 61 74 20 75 73 65 73 20   loop that uses 
26c30 61 6e 20 69 6e 64 65 78 20 74 6f 20 65 78 74 72  an index to extr
26c40 61 63 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a  act information.
26c50 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20        ** in the 
26c60 72 69 67 68 74 20 6f 72 64 65 72 20 74 6f 20 62  right order to b
26c70 65 67 69 6e 20 77 69 74 68 2e 0a 20 20 20 20 20  egin with..     
26c80 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
26c90 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
26ca0 50 5f 47 6f 73 75 62 2c 20 72 65 67 52 65 73 65  P_Gosub, regRese
26cb0 74 2c 20 61 64 64 72 52 65 73 65 74 29 3b 0a 20  t, addrReset);. 
26cc0 20 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 73 71       pWInfo = sq
26cd0 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
26ce0 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74  pParse, pTabList
26cf0 2c 20 70 57 68 65 72 65 2c 20 70 47 72 6f 75 70  , pWhere, pGroup
26d00 42 79 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20  By, 0, .        
26d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26d20 20 20 20 20 20 20 20 20 20 57 48 45 52 45 5f 47           WHERE_G
26d30 52 4f 55 50 42 59 2c 20 30 29 3b 0a 20 20 20 20  ROUPBY, 0);.    
26d40 20 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20    if( pWInfo==0 
26d50 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e  ) goto select_en
26d60 64 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  d;.      if( sql
26d70 69 74 65 33 57 68 65 72 65 49 73 4f 72 64 65 72  ite3WhereIsOrder
26d80 65 64 28 70 57 49 6e 66 6f 29 20 29 7b 0a 20 20  ed(pWInfo) ){.  
26d90 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 74        /* The opt
26da0 69 6d 69 7a 65 72 20 69 73 20 61 62 6c 65 20 74  imizer is able t
26db0 6f 20 64 65 6c 69 76 65 72 20 72 6f 77 73 20 69  o deliver rows i
26dc0 6e 20 67 72 6f 75 70 20 62 79 20 6f 72 64 65 72  n group by order
26dd0 20 73 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 77   so.        ** w
26de0 65 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f  e do not have to
26df0 20 73 6f 72 74 2e 20 20 54 68 65 20 4f 50 5f 4f   sort.  The OP_O
26e00 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 74 61 62  penEphemeral tab
26e10 6c 65 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 20  le will be.     
26e20 20 20 20 2a 2a 20 63 61 6e 63 65 6c 6c 65 64 20     ** cancelled 
26e30 6c 61 74 65 72 20 62 65 63 61 75 73 65 20 77 65  later because we
26e40 20 73 74 69 6c 6c 20 6e 65 65 64 20 74 6f 20 75   still need to u
26e50 73 65 20 74 68 65 20 70 4b 65 79 49 6e 66 6f 0a  se the pKeyInfo.
26e60 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
26e70 20 20 20 67 72 6f 75 70 42 79 53 6f 72 74 20 3d     groupBySort =
26e80 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   0;.      }else{
26e90 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 73  .        /* Rows
26ea0 20 61 72 65 20 63 6f 6d 69 6e 67 20 6f 75 74 20   are coming out 
26eb0 69 6e 20 75 6e 64 65 74 65 72 6d 69 6e 65 64 20  in undetermined 
26ec0 6f 72 64 65 72 2e 20 20 57 65 20 68 61 76 65 20  order.  We have 
26ed0 74 6f 20 70 75 73 68 0a 20 20 20 20 20 20 20 20  to push.        
26ee0 2a 2a 20 65 61 63 68 20 72 6f 77 20 69 6e 74 6f  ** each row into
26ef0 20 61 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78   a sorting index
26f00 2c 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20  , terminate the 
26f10 66 69 72 73 74 20 6c 6f 6f 70 2c 0a 20 20 20 20  first loop,.    
26f20 20 20 20 20 2a 2a 20 74 68 65 6e 20 6c 6f 6f 70      ** then loop
26f30 20 6f 76 65 72 20 74 68 65 20 73 6f 72 74 69 6e   over the sortin
26f40 67 20 69 6e 64 65 78 20 69 6e 20 6f 72 64 65 72  g index in order
26f50 20 74 6f 20 67 65 74 20 74 68 65 20 6f 75 74 70   to get the outp
26f60 75 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e  ut.        ** in
26f70 20 73 6f 72 74 65 64 20 6f 72 64 65 72 0a 20 20   sorted order.  
26f80 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
26f90 20 69 6e 74 20 72 65 67 42 61 73 65 3b 0a 20 20   int regBase;.  
26fa0 20 20 20 20 20 20 69 6e 74 20 72 65 67 52 65 63        int regRec
26fb0 6f 72 64 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  ord;.        int
26fc0 20 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 69   nCol;.        i
26fd0 6e 74 20 6e 47 72 6f 75 70 42 79 3b 0a 0a 20 20  nt nGroupBy;..  
26fe0 20 20 20 20 20 20 65 78 70 6c 61 69 6e 54 65 6d        explainTem
26ff0 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 0a  pTable(pParse, .
27000 20 20 20 20 20 20 20 20 20 20 20 20 28 73 44 69              (sDi
27010 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 26 26  stinct.isTnct &&
27020 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 26 53 46   (p->selFlags&SF
27030 5f 44 69 73 74 69 6e 63 74 29 3d 3d 30 29 20 3f  _Distinct)==0) ?
27040 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
27050 20 20 20 20 20 22 44 49 53 54 49 4e 43 54 22 20       "DISTINCT" 
27060 3a 20 22 47 52 4f 55 50 20 42 59 22 29 3b 0a 0a  : "GROUP BY");..
27070 20 20 20 20 20 20 20 20 67 72 6f 75 70 42 79 53          groupByS
27080 6f 72 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ort = 1;.       
27090 20 6e 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f   nGroupBy = pGro
270a0 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  upBy->nExpr;.   
270b0 20 20 20 20 20 6e 43 6f 6c 20 3d 20 6e 47 72 6f       nCol = nGro
270c0 75 70 42 79 20 2b 20 31 3b 0a 20 20 20 20 20 20  upBy + 1;.      
270d0 20 20 6a 20 3d 20 6e 47 72 6f 75 70 42 79 2b 31    j = nGroupBy+1
270e0 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
270f0 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 43  0; i<sAggInfo.nC
27100 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  olumn; i++){.   
27110 20 20 20 20 20 20 20 69 66 28 20 73 41 67 67 49         if( sAggI
27120 6e 66 6f 2e 61 43 6f 6c 5b 69 5d 2e 69 53 6f 72  nfo.aCol[i].iSor
27130 74 65 72 43 6f 6c 75 6d 6e 3e 3d 6a 20 29 7b 0a  terColumn>=j ){.
27140 20 20 20 20 20 20 20 20 20 20 20 20 6e 43 6f 6c              nCol
27150 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ++;.            
27160 6a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  j++;.          }
27170 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
27180 20 20 20 72 65 67 42 61 73 65 20 3d 20 73 71 6c     regBase = sql
27190 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65  ite3GetTempRange
271a0 28 70 50 61 72 73 65 2c 20 6e 43 6f 6c 29 3b 0a  (pParse, nCol);.
271b0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
271c0 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50  xprCacheClear(pP
271d0 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73  arse);.        s
271e0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78  qlite3ExprCodeEx
271f0 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
27200 47 72 6f 75 70 42 79 2c 20 72 65 67 42 61 73 65  GroupBy, regBase
27210 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 0);.        sq
27220 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
27230 76 2c 20 4f 50 5f 53 65 71 75 65 6e 63 65 2c 20  v, OP_Sequence, 
27240 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67  sAggInfo.sorting
27250 49 64 78 2c 72 65 67 42 61 73 65 2b 6e 47 72 6f  Idx,regBase+nGro
27260 75 70 42 79 29 3b 0a 20 20 20 20 20 20 20 20 6a  upBy);.        j
27270 20 3d 20 6e 47 72 6f 75 70 42 79 2b 31 3b 0a 20   = nGroupBy+1;. 
27280 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
27290 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75  i<sAggInfo.nColu
272a0 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  mn; i++){.      
272b0 20 20 20 20 73 74 72 75 63 74 20 41 67 67 49 6e      struct AggIn
272c0 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20 3d 20 26  fo_col *pCol = &
272d0 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69 5d  sAggInfo.aCol[i]
272e0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
272f0 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c  pCol->iSorterCol
27300 75 6d 6e 3e 3d 6a 20 29 7b 0a 20 20 20 20 20 20  umn>=j ){.      
27310 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20 6a        int r1 = j
27320 20 2b 20 72 65 67 42 61 73 65 3b 0a 20 20 20 20   + regBase;.    
27330 20 20 20 20 20 20 20 20 69 6e 74 20 72 32 3b 0a          int r2;.
27340 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 32 20  .            r2 
27350 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
27360 65 47 65 74 43 6f 6c 75 6d 6e 28 70 50 61 72 73  eGetColumn(pPars
27370 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  e, .            
27380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27390 20 20 20 70 43 6f 6c 2d 3e 70 54 61 62 2c 20 70     pCol->pTab, p
273a0 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 70 43  Col->iColumn, pC
273b0 6f 6c 2d 3e 69 54 61 62 6c 65 2c 20 72 31 2c 20  ol->iTable, r1, 
273c0 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
273d0 69 66 28 20 72 31 21 3d 72 32 20 29 7b 0a 20 20  if( r1!=r2 ){.  
273e0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
273f0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
27400 20 4f 50 5f 53 43 6f 70 79 2c 20 72 32 2c 20 72   OP_SCopy, r2, r
27410 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  1);.            
27420 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a 2b  }.            j+
27430 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  +;.          }. 
27440 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
27450 20 72 65 67 52 65 63 6f 72 64 20 3d 20 73 71 6c   regRecord = sql
27460 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
27470 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
27480 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
27490 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  3(v, OP_MakeReco
274a0 72 64 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f  rd, regBase, nCo
274b0 6c 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20  l, regRecord);. 
274c0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
274d0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
274e0 6f 72 74 65 72 49 6e 73 65 72 74 2c 20 73 41 67  orterInsert, sAg
274f0 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78  gInfo.sortingIdx
27500 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20  , regRecord);.  
27510 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
27520 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
27530 73 65 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a  se, regRecord);.
27540 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
27550 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28  eleaseTempRange(
27560 70 50 61 72 73 65 2c 20 72 65 67 42 61 73 65 2c  pParse, regBase,
27570 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20   nCol);.        
27580 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
27590 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20  pWInfo);.       
275a0 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e   sAggInfo.sortin
275b0 67 49 64 78 50 54 61 62 20 3d 20 73 6f 72 74 50  gIdxPTab = sortP
275c0 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  Tab = pParse->nT
275d0 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 73 6f  ab++;.        so
275e0 72 74 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 47  rtOut = sqlite3G
275f0 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
27600 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
27610 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
27620 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f 2c 20 73  OP_OpenPseudo, s
27630 6f 72 74 50 54 61 62 2c 20 73 6f 72 74 4f 75 74  ortPTab, sortOut
27640 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20  , nCol);.       
27650 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
27660 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 53  p2(v, OP_SorterS
27670 6f 72 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f  ort, sAggInfo.so
27680 72 74 69 6e 67 49 64 78 2c 20 61 64 64 72 45 6e  rtingIdx, addrEn
27690 64 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  d);.        Vdbe
276a0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 47 52 4f  Comment((v, "GRO
276b0 55 50 20 42 59 20 73 6f 72 74 22 29 29 3b 0a 20  UP BY sort"));. 
276c0 20 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e         sAggInfo.
276d0 75 73 65 53 6f 72 74 69 6e 67 49 64 78 20 3d 20  useSortingIdx = 
276e0 31 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  1;.        sqlit
276f0 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72  e3ExprCacheClear
27700 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
27710 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 45 76 61 6c  }..      /* Eval
27720 75 61 74 65 20 74 68 65 20 63 75 72 72 65 6e 74  uate the current
27730 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d 73 20   GROUP BY terms 
27740 61 6e 64 20 73 74 6f 72 65 20 69 6e 20 62 30 2c  and store in b0,
27750 20 62 31 2c 20 62 32 2e 2e 2e 0a 20 20 20 20 20   b1, b2....     
27760 20 2a 2a 20 28 62 30 20 69 73 20 6d 65 6d 6f 72   ** (b0 is memor
27770 79 20 6c 6f 63 61 74 69 6f 6e 20 69 42 4d 65 6d  y location iBMem
27780 2b 30 2c 20 62 31 20 69 73 20 69 42 4d 65 6d 2b  +0, b1 is iBMem+
27790 31 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 29  1, and so forth)
277a0 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 6e 20 63  .      ** Then c
277b0 6f 6d 70 61 72 65 20 74 68 65 20 63 75 72 72 65  ompare the curre
277c0 6e 74 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d  nt GROUP BY term
277d0 73 20 61 67 61 69 6e 73 74 20 74 68 65 20 47 52  s against the GR
277e0 4f 55 50 20 42 59 20 74 65 72 6d 73 0a 20 20 20  OUP BY terms.   
277f0 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 70     ** from the p
27800 72 65 76 69 6f 75 73 20 72 6f 77 20 63 75 72 72  revious row curr
27810 65 6e 74 6c 79 20 73 74 6f 72 65 64 20 69 6e 20  ently stored in 
27820 61 30 2c 20 61 31 2c 20 61 32 2e 2e 2e 0a 20 20  a0, a1, a2....  
27830 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 64 64      */.      add
27840 72 54 6f 70 4f 66 4c 6f 6f 70 20 3d 20 73 71 6c  rTopOfLoop = sql
27850 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
27860 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71  ddr(v);.      sq
27870 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c  lite3ExprCacheCl
27880 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 20  ear(pParse);.   
27890 20 20 20 69 66 28 20 67 72 6f 75 70 42 79 53 6f     if( groupBySo
278a0 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  rt ){.        sq
278b0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
278c0 76 2c 20 4f 50 5f 53 6f 72 74 65 72 44 61 74 61  v, OP_SorterData
278d0 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69  , sAggInfo.sorti
278e0 6e 67 49 64 78 2c 20 73 6f 72 74 4f 75 74 29 3b  ngIdx, sortOut);
278f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
27900 6f 72 28 6a 3d 30 3b 20 6a 3c 70 47 72 6f 75 70  or(j=0; j<pGroup
27910 42 79 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b  By->nExpr; j++){
27920 0a 20 20 20 20 20 20 20 20 69 66 28 20 67 72 6f  .        if( gro
27930 75 70 42 79 53 6f 72 74 20 29 7b 0a 20 20 20 20  upBySort ){.    
27940 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
27950 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
27960 6c 75 6d 6e 2c 20 73 6f 72 74 50 54 61 62 2c 20  lumn, sortPTab, 
27970 6a 2c 20 69 42 4d 65 6d 2b 6a 29 3b 0a 20 20 20  j, iBMem+j);.   
27980 20 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 30 20         if( j==0 
27990 29 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61  ) sqlite3VdbeCha
279a0 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f  ngeP5(v, OPFLAG_
279b0 43 4c 45 41 52 43 41 43 48 45 29 3b 0a 20 20 20  CLEARCACHE);.   
279c0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
279d0 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 64        sAggInfo.d
279e0 69 72 65 63 74 4d 6f 64 65 20 3d 20 31 3b 0a 20  irectMode = 1;. 
279f0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
27a00 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
27a10 20 70 47 72 6f 75 70 42 79 2d 3e 61 5b 6a 5d 2e   pGroupBy->a[j].
27a20 70 45 78 70 72 2c 20 69 42 4d 65 6d 2b 6a 29 3b  pExpr, iBMem+j);
27a30 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
27a40 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
27a50 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
27a60 5f 43 6f 6d 70 61 72 65 2c 20 69 41 4d 65 6d 2c  _Compare, iAMem,
27a70 20 69 42 4d 65 6d 2c 20 70 47 72 6f 75 70 42 79   iBMem, pGroupBy
27a80 2d 3e 6e 45 78 70 72 2c 0a 20 20 20 20 20 20 20  ->nExpr,.       
27a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27aa0 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e     (char*)pKeyIn
27ab0 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b  fo, P4_KEYINFO);
27ac0 0a 20 20 20 20 20 20 6a 31 20 3d 20 73 71 6c 69  .      j1 = sqli
27ad0 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
27ae0 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c  dr(v);.      sql
27af0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
27b00 2c 20 4f 50 5f 4a 75 6d 70 2c 20 6a 31 2b 31 2c  , OP_Jump, j1+1,
27b10 20 30 2c 20 6a 31 2b 31 29 3b 0a 0a 20 20 20 20   0, j1+1);..    
27b20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
27b30 64 65 20 74 68 61 74 20 72 75 6e 73 20 77 68 65  de that runs whe
27b40 6e 65 76 65 72 20 74 68 65 20 47 52 4f 55 50 20  never the GROUP 
27b50 42 59 20 63 68 61 6e 67 65 73 2e 0a 20 20 20 20  BY changes..    
27b60 20 20 2a 2a 20 43 68 61 6e 67 65 73 20 69 6e 20    ** Changes in 
27b70 74 68 65 20 47 52 4f 55 50 20 42 59 20 61 72 65  the GROUP BY are
27b80 20 64 65 74 65 63 74 65 64 20 62 79 20 74 68 65   detected by the
27b90 20 70 72 65 76 69 6f 75 73 20 63 6f 64 65 0a 20   previous code. 
27ba0 20 20 20 20 20 2a 2a 20 62 6c 6f 63 6b 2e 20 20       ** block.  
27bb0 49 66 20 74 68 65 72 65 20 77 65 72 65 20 6e 6f  If there were no
27bc0 20 63 68 61 6e 67 65 73 2c 20 74 68 69 73 20 62   changes, this b
27bd0 6c 6f 63 6b 20 69 73 20 73 6b 69 70 70 65 64 2e  lock is skipped.
27be0 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
27bf0 2a 2a 20 54 68 69 73 20 63 6f 64 65 20 63 6f 70  ** This code cop
27c00 69 65 73 20 63 75 72 72 65 6e 74 20 67 72 6f 75  ies current grou
27c10 70 20 62 79 20 74 65 72 6d 73 20 69 6e 20 62 30  p by terms in b0
27c20 2c 62 31 2c 62 32 2c 2e 2e 2e 0a 20 20 20 20 20  ,b1,b2,....     
27c30 20 2a 2a 20 6f 76 65 72 20 74 6f 20 61 30 2c 61   ** over to a0,a
27c40 31 2c 61 32 2e 20 20 49 74 20 74 68 65 6e 20 63  1,a2.  It then c
27c50 61 6c 6c 73 20 74 68 65 20 6f 75 74 70 75 74 20  alls the output 
27c60 73 75 62 72 6f 75 74 69 6e 65 0a 20 20 20 20 20  subroutine.     
27c70 20 2a 2a 20 61 6e 64 20 72 65 73 65 74 73 20 74   ** and resets t
27c80 68 65 20 61 67 67 72 65 67 61 74 65 20 61 63 63  he aggregate acc
27c90 75 6d 75 6c 61 74 6f 72 20 72 65 67 69 73 74 65  umulator registe
27ca0 72 73 20 69 6e 20 70 72 65 70 61 72 61 74 69 6f  rs in preparatio
27cb0 6e 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74  n.      ** for t
27cc0 68 65 20 6e 65 78 74 20 47 52 4f 55 50 20 42 59  he next GROUP BY
27cd0 20 62 61 74 63 68 2e 0a 20 20 20 20 20 20 2a 2f   batch..      */
27ce0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
27cf0 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73  prCodeMove(pPars
27d00 65 2c 20 69 42 4d 65 6d 2c 20 69 41 4d 65 6d 2c  e, iBMem, iAMem,
27d10 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72   pGroupBy->nExpr
27d20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
27d30 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
27d40 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 70 75  _Gosub, regOutpu
27d50 74 52 6f 77 2c 20 61 64 64 72 4f 75 74 70 75 74  tRow, addrOutput
27d60 52 6f 77 29 3b 0a 20 20 20 20 20 20 56 64 62 65  Row);.      Vdbe
27d70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6f 75 74  Comment((v, "out
27d80 70 75 74 20 6f 6e 65 20 72 6f 77 22 29 29 3b 0a  put one row"));.
27d90 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
27da0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66  eAddOp2(v, OP_If
27db0 50 6f 73 2c 20 69 41 62 6f 72 74 46 6c 61 67 2c  Pos, iAbortFlag,
27dc0 20 61 64 64 72 45 6e 64 29 3b 0a 20 20 20 20 20   addrEnd);.     
27dd0 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
27de0 20 22 63 68 65 63 6b 20 61 62 6f 72 74 20 66 6c   "check abort fl
27df0 61 67 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  ag"));.      sql
27e00 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
27e10 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 52  , OP_Gosub, regR
27e20 65 73 65 74 2c 20 61 64 64 72 52 65 73 65 74 29  eset, addrReset)
27e30 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
27e40 65 6e 74 28 28 76 2c 20 22 72 65 73 65 74 20 61  ent((v, "reset a
27e50 63 63 75 6d 75 6c 61 74 6f 72 22 29 29 3b 0a 0a  ccumulator"));..
27e60 20 20 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20        /* Update 
27e70 74 68 65 20 61 67 67 72 65 67 61 74 65 20 61 63  the aggregate ac
27e80 63 75 6d 75 6c 61 74 6f 72 73 20 62 61 73 65 64  cumulators based
27e90 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20   on the content 
27ea0 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  of.      ** the 
27eb0 63 75 72 72 65 6e 74 20 72 6f 77 0a 20 20 20 20  current row.    
27ec0 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74    */.      sqlit
27ed0 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
27ee0 2c 20 6a 31 29 3b 0a 20 20 20 20 20 20 75 70 64  , j1);.      upd
27ef0 61 74 65 41 63 63 75 6d 75 6c 61 74 6f 72 28 70  ateAccumulator(p
27f00 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f  Parse, &sAggInfo
27f10 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
27f20 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
27f30 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 69 55 73  _Integer, 1, iUs
27f40 65 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64  eFlag);.      Vd
27f50 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 69  beComment((v, "i
27f60 6e 64 69 63 61 74 65 20 64 61 74 61 20 69 6e 20  ndicate data in 
27f70 61 63 63 75 6d 75 6c 61 74 6f 72 22 29 29 3b 0a  accumulator"));.
27f80 0a 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66  .      /* End of
27f90 20 74 68 65 20 6c 6f 6f 70 0a 20 20 20 20 20 20   the loop.      
27fa0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 67 72 6f  */.      if( gro
27fb0 75 70 42 79 53 6f 72 74 20 29 7b 0a 20 20 20 20  upBySort ){.    
27fc0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
27fd0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74  ddOp2(v, OP_Sort
27fe0 65 72 4e 65 78 74 2c 20 73 41 67 67 49 6e 66 6f  erNext, sAggInfo
27ff0 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 61 64 64  .sortingIdx, add
28000 72 54 6f 70 4f 66 4c 6f 6f 70 29 3b 0a 20 20 20  rTopOfLoop);.   
28010 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
28020 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e    sqlite3WhereEn
28030 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20  d(pWInfo);.     
28040 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
28050 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 61 64  angeToNoop(v, ad
28060 64 72 53 6f 72 74 69 6e 67 49 64 78 29 3b 0a 20  drSortingIdx);. 
28070 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
28080 20 4f 75 74 70 75 74 20 74 68 65 20 66 69 6e 61   Output the fina
28090 6c 20 72 6f 77 20 6f 66 20 72 65 73 75 6c 74 0a  l row of result.
280a0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
280b0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
280c0 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65  (v, OP_Gosub, re
280d0 67 4f 75 74 70 75 74 52 6f 77 2c 20 61 64 64 72  gOutputRow, addr
280e0 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20  OutputRow);.    
280f0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
28100 2c 20 22 6f 75 74 70 75 74 20 66 69 6e 61 6c 20  , "output final 
28110 72 6f 77 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f  row"));..      /
28120 2a 20 4a 75 6d 70 20 6f 76 65 72 20 74 68 65 20  * Jump over the 
28130 73 75 62 72 6f 75 74 69 6e 65 73 0a 20 20 20 20  subroutines.    
28140 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74    */.      sqlit
28150 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
28160 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72  OP_Goto, 0, addr
28170 45 6e 64 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  End);..      /* 
28180 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f  Generate a subro
28190 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75  utine that outpu
281a0 74 73 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20  ts a single row 
281b0 6f 66 20 74 68 65 20 72 65 73 75 6c 74 0a 20 20  of the result.  
281c0 20 20 20 20 2a 2a 20 73 65 74 2e 20 20 54 68 69      ** set.  Thi
281d0 73 20 73 75 62 72 6f 75 74 69 6e 65 20 66 69 72  s subroutine fir
281e0 73 74 20 6c 6f 6f 6b 73 20 61 74 20 74 68 65 20  st looks at the 
281f0 69 55 73 65 46 6c 61 67 2e 20 20 49 66 20 69 55  iUseFlag.  If iU
28200 73 65 46 6c 61 67 0a 20 20 20 20 20 20 2a 2a 20  seFlag.      ** 
28210 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20  is less than or 
28220 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f 2c 20 74  equal to zero, t
28230 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20 69 73  he subroutine is
28240 20 61 20 6e 6f 2d 6f 70 2e 20 20 49 66 0a 20 20   a no-op.  If.  
28250 20 20 20 20 2a 2a 20 74 68 65 20 70 72 6f 63 65      ** the proce
28260 73 73 69 6e 67 20 63 61 6c 6c 73 20 66 6f 72 20  ssing calls for 
28270 74 68 65 20 71 75 65 72 79 20 74 6f 20 61 62 6f  the query to abo
28280 72 74 2c 20 74 68 69 73 20 73 75 62 72 6f 75 74  rt, this subrout
28290 69 6e 65 0a 20 20 20 20 20 20 2a 2a 20 69 6e 63  ine.      ** inc
282a0 72 65 6d 65 6e 74 73 20 74 68 65 20 69 41 62 6f  rements the iAbo
282b0 72 74 46 6c 61 67 20 6d 65 6d 6f 72 79 20 6c 6f  rtFlag memory lo
282c0 63 61 74 69 6f 6e 20 62 65 66 6f 72 65 20 72 65  cation before re
282d0 74 75 72 6e 69 6e 67 20 69 6e 0a 20 20 20 20 20  turning in.     
282e0 20 2a 2a 20 6f 72 64 65 72 20 74 6f 20 73 69 67   ** order to sig
282f0 6e 61 6c 20 74 68 65 20 63 61 6c 6c 65 72 20 74  nal the caller t
28300 6f 20 61 62 6f 72 74 2e 0a 20 20 20 20 20 20 2a  o abort..      *
28310 2f 0a 20 20 20 20 20 20 61 64 64 72 53 65 74 41  /.      addrSetA
28320 62 6f 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64  bort = sqlite3Vd
28330 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
28340 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
28350 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
28360 49 6e 74 65 67 65 72 2c 20 31 2c 20 69 41 62 6f  Integer, 1, iAbo
28370 72 74 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56  rtFlag);.      V
28380 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
28390 73 65 74 20 61 62 6f 72 74 20 66 6c 61 67 22 29  set abort flag")
283a0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
283b0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
283c0 5f 52 65 74 75 72 6e 2c 20 72 65 67 4f 75 74 70  _Return, regOutp
283d0 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 73 71  utRow);.      sq
283e0 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
283f0 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 4f 75 74  Label(v, addrOut
28400 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 61  putRow);.      a
28410 64 64 72 4f 75 74 70 75 74 52 6f 77 20 3d 20 73  ddrOutputRow = s
28420 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
28430 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20  tAddr(v);.      
28440 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
28450 32 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69  2(v, OP_IfPos, i
28460 55 73 65 46 6c 61 67 2c 20 61 64 64 72 4f 75 74  UseFlag, addrOut
28470 70 75 74 52 6f 77 2b 32 29 3b 0a 20 20 20 20 20  putRow+2);.     
28480 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
28490 20 22 47 72 6f 75 70 62 79 20 72 65 73 75 6c 74   "Groupby result
284a0 20 67 65 6e 65 72 61 74 6f 72 20 65 6e 74 72 79   generator entry
284b0 20 70 6f 69 6e 74 22 29 29 3b 0a 20 20 20 20 20   point"));.     
284c0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
284d0 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c  p1(v, OP_Return,
284e0 20 72 65 67 4f 75 74 70 75 74 52 6f 77 29 3b 0a   regOutputRow);.
284f0 20 20 20 20 20 20 66 69 6e 61 6c 69 7a 65 41 67        finalizeAg
28500 67 46 75 6e 63 74 69 6f 6e 73 28 70 50 61 72 73  gFunctions(pPars
28510 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20  e, &sAggInfo);. 
28520 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
28530 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
28540 70 48 61 76 69 6e 67 2c 20 61 64 64 72 4f 75 74  pHaving, addrOut
28550 70 75 74 52 6f 77 2b 31 2c 20 53 51 4c 49 54 45  putRow+1, SQLITE
28560 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20  _JUMPIFNULL);.  
28570 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c      selectInnerL
28580 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70  oop(pParse, p, p
28590 2d 3e 70 45 4c 69 73 74 2c 20 30 2c 20 30 2c 20  ->pEList, 0, 0, 
285a0 70 4f 72 64 65 72 42 79 2c 0a 20 20 20 20 20 20  pOrderBy,.      
285b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
285c0 26 73 44 69 73 74 69 6e 63 74 2c 20 70 44 65 73  &sDistinct, pDes
285d0 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
285e0 20 20 20 20 20 20 20 20 20 61 64 64 72 4f 75 74           addrOut
285f0 70 75 74 52 6f 77 2b 31 2c 20 61 64 64 72 53 65  putRow+1, addrSe
28600 74 41 62 6f 72 74 29 3b 0a 20 20 20 20 20 20 73  tAbort);.      s
28610 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
28620 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72  (v, OP_Return, r
28630 65 67 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20  egOutputRow);.  
28640 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
28650 28 76 2c 20 22 65 6e 64 20 67 72 6f 75 70 62 79  (v, "end groupby
28660 20 72 65 73 75 6c 74 20 67 65 6e 65 72 61 74 6f   result generato
28670 72 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  r"));..      /* 
28680 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f  Generate a subro
28690 75 74 69 6e 65 20 74 68 61 74 20 77 69 6c 6c 20  utine that will 
286a0 72 65 73 65 74 20 74 68 65 20 67 72 6f 75 70 2d  reset the group-
286b0 62 79 20 61 63 63 75 6d 75 6c 61 74 6f 72 0a 20  by accumulator. 
286c0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
286d0 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
286e0 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 52 65 73  Label(v, addrRes
286f0 65 74 29 3b 0a 20 20 20 20 20 20 72 65 73 65 74  et);.      reset
28700 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72  Accumulator(pPar
28710 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a  se, &sAggInfo);.
28720 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
28730 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65  eAddOp1(v, OP_Re
28740 74 75 72 6e 2c 20 72 65 67 52 65 73 65 74 29 3b  turn, regReset);
28750 0a 20 20 20 20 20 0a 20 20 20 20 7d 20 2f 2a 20  .     .    } /* 
28760 65 6e 64 69 66 20 70 47 72 6f 75 70 42 79 2e 20  endif pGroupBy. 
28770 20 42 65 67 69 6e 20 61 67 67 72 65 67 61 74 65   Begin aggregate
28780 20 71 75 65 72 69 65 73 20 77 69 74 68 6f 75 74   queries without
28790 20 47 52 4f 55 50 20 42 59 3a 20 2a 2f 0a 20 20   GROUP BY: */.  
287a0 20 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 45    else {.      E
287b0 78 70 72 4c 69 73 74 20 2a 70 44 65 6c 20 3d 20  xprList *pDel = 
287c0 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  0;.#ifndef SQLIT
287d0 45 5f 4f 4d 49 54 5f 42 54 52 45 45 43 4f 55 4e  E_OMIT_BTREECOUN
287e0 54 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70  T.      Table *p
287f0 54 61 62 3b 0a 20 20 20 20 20 20 69 66 28 20 28  Tab;.      if( (
28800 70 54 61 62 20 3d 20 69 73 53 69 6d 70 6c 65 43  pTab = isSimpleC
28810 6f 75 6e 74 28 70 2c 20 26 73 41 67 67 49 6e 66  ount(p, &sAggInf
28820 6f 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  o))!=0 ){.      
28830 20 20 2f 2a 20 49 66 20 69 73 53 69 6d 70 6c 65    /* If isSimple
28840 43 6f 75 6e 74 28 29 20 72 65 74 75 72 6e 73 20  Count() returns 
28850 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 54  a pointer to a T
28860 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 2c 20  able structure, 
28870 74 68 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  then.        ** 
28880 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  the SQL statemen
28890 74 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  t is of the form
288a0 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  :.        **.   
288b0 20 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54       **   SELECT
288c0 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 3c   count(*) FROM <
288d0 74 62 6c 3e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  tbl>.        **.
288e0 20 20 20 20 20 20 20 20 2a 2a 20 77 68 65 72 65          ** where
288f0 20 74 68 65 20 54 61 62 6c 65 20 73 74 72 75 63   the Table struc
28900 74 75 72 65 20 72 65 74 75 72 6e 65 64 20 72 65  ture returned re
28910 70 72 65 73 65 6e 74 73 20 74 61 62 6c 65 20 3c  presents table <
28920 74 62 6c 3e 2e 0a 20 20 20 20 20 20 20 20 2a 2a  tbl>..        **
28930 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73  .        ** This
28940 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 73 6f   statement is so
28950 20 63 6f 6d 6d 6f 6e 20 74 68 61 74 20 69 74 20   common that it 
28960 69 73 20 6f 70 74 69 6d 69 7a 65 64 20 73 70 65  is optimized spe
28970 63 69 61 6c 6c 79 2e 20 54 68 65 0a 20 20 20 20  cially. The.    
28980 20 20 20 20 2a 2a 20 4f 50 5f 43 6f 75 6e 74 20      ** OP_Count 
28990 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20 65  instruction is e
289a0 78 65 63 75 74 65 64 20 65 69 74 68 65 72 20 6f  xecuted either o
289b0 6e 20 74 68 65 20 69 6e 74 6b 65 79 20 74 61 62  n the intkey tab
289c0 6c 65 20 74 68 61 74 0a 20 20 20 20 20 20 20 20  le that.        
289d0 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  ** contains the 
289e0 64 61 74 61 20 66 6f 72 20 74 61 62 6c 65 20 3c  data for table <
289f0 74 62 6c 3e 20 6f 72 20 6f 6e 20 6f 6e 65 20 6f  tbl> or on one o
28a00 66 20 69 74 73 20 69 6e 64 65 78 65 73 2e 20 49  f its indexes. I
28a10 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20  t.        ** is 
28a20 62 65 74 74 65 72 20 74 6f 20 65 78 65 63 75 74  better to execut
28a30 65 20 74 68 65 20 6f 70 20 6f 6e 20 61 6e 20 69  e the op on an i
28a40 6e 64 65 78 2c 20 61 73 20 69 6e 64 65 78 65 73  ndex, as indexes
28a50 20 61 72 65 20 61 6c 6d 6f 73 74 0a 20 20 20 20   are almost.    
28a60 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 73 70      ** always sp
28a70 72 65 61 64 20 61 63 72 6f 73 73 20 6c 65 73 73  read across less
28a80 20 70 61 67 65 73 20 74 68 61 6e 20 74 68 65 69   pages than thei
28a90 72 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  r corresponding 
28aa0 74 61 62 6c 65 73 2e 0a 20 20 20 20 20 20 20 20  tables..        
28ab0 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  */.        const
28ac0 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74   int iDb = sqlit
28ad0 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
28ae0 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62  pParse->db, pTab
28af0 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
28b00 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 43      const int iC
28b10 73 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  sr = pParse->nTa
28b20 62 2b 2b 3b 20 20 20 20 20 2f 2a 20 43 75 72 73  b++;     /* Curs
28b30 6f 72 20 74 6f 20 73 63 61 6e 20 62 2d 74 72 65  or to scan b-tre
28b40 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 49 6e 64  e */.        Ind
28b50 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20  ex *pIdx;       
28b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b70 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61    /* Iterator va
28b80 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20  riable */.      
28b90 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
28ba0 6e 66 6f 20 3d 20 30 3b 20 20 20 20 20 20 20 20  nfo = 0;        
28bb0 20 20 20 20 20 20 20 2f 2a 20 4b 65 79 69 6e 66         /* Keyinf
28bc0 6f 20 66 6f 72 20 73 63 61 6e 6e 65 64 20 69 6e  o for scanned in
28bd0 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 20 20 49  dex */.        I
28be0 6e 64 65 78 20 2a 70 42 65 73 74 20 3d 20 30 3b  ndex *pBest = 0;
28bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28c00 20 20 20 20 2f 2a 20 42 65 73 74 20 69 6e 64 65      /* Best inde
28c10 78 20 66 6f 75 6e 64 20 73 6f 20 66 61 72 20 2a  x found so far *
28c20 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 52  /.        int iR
28c30 6f 6f 74 20 3d 20 70 54 61 62 2d 3e 74 6e 75 6d  oot = pTab->tnum
28c40 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
28c50 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 73  * Root page of s
28c60 63 61 6e 6e 65 64 20 62 2d 74 72 65 65 20 2a 2f  canned b-tree */
28c70 0a 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ..        sqlite
28c80 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d  3CodeVerifySchem
28c90 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a  a(pParse, iDb);.
28ca0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 54          sqlite3T
28cb0 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c  ableLock(pParse,
28cc0 20 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d   iDb, pTab->tnum
28cd0 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  , 0, pTab->zName
28ce0 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 53  );..        /* S
28cf0 65 61 72 63 68 20 66 6f 72 20 74 68 65 20 69 6e  earch for the in
28d00 64 65 78 20 74 68 61 74 20 68 61 73 20 74 68 65  dex that has the
28d10 20 6c 6f 77 65 73 74 20 73 63 61 6e 20 63 6f 73   lowest scan cos
28d20 74 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  t..        **.  
28d30 20 20 20 20 20 20 2a 2a 20 28 32 30 31 31 2d 30        ** (2011-0
28d40 34 2d 31 35 29 20 44 6f 20 6e 6f 74 20 64 6f 20  4-15) Do not do 
28d50 61 20 66 75 6c 6c 20 73 63 61 6e 20 6f 66 20 61  a full scan of a
28d60 6e 20 75 6e 6f 72 64 65 72 65 64 20 69 6e 64 65  n unordered inde
28d70 78 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  x..        **.  
28d80 20 20 20 20 20 20 2a 2a 20 28 32 30 31 33 2d 31        ** (2013-1
28d90 30 2d 30 33 29 20 44 6f 20 6e 6f 74 20 63 6f 75  0-03) Do not cou
28da0 6e 74 20 74 68 65 20 65 6e 74 69 72 65 73 20 69  nt the entires i
28db0 6e 20 61 20 70 61 72 74 69 61 6c 20 69 6e 64 65  n a partial inde
28dc0 78 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  x..        **.  
28dd0 20 20 20 20 20 20 2a 2a 20 49 6e 20 70 72 61 63        ** In prac
28de0 74 69 63 65 20 74 68 65 20 4b 65 79 49 6e 66 6f  tice the KeyInfo
28df0 20 73 74 72 75 63 74 75 72 65 20 77 69 6c 6c 20   structure will 
28e00 6e 6f 74 20 62 65 20 75 73 65 64 2e 20 49 74 20  not be used. It 
28e10 69 73 20 6f 6e 6c 79 20 0a 20 20 20 20 20 20 20  is only .       
28e20 20 2a 2a 20 70 61 73 73 65 64 20 74 6f 20 6b 65   ** passed to ke
28e30 65 70 20 4f 50 5f 4f 70 65 6e 52 65 61 64 20 68  ep OP_OpenRead h
28e40 61 70 70 79 2e 0a 20 20 20 20 20 20 20 20 2a 2f  appy..        */
28e50 0a 20 20 20 20 20 20 20 20 66 6f 72 28 70 49 64  .        for(pId
28e60 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20  x=pTab->pIndex; 
28e70 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d  pIdx; pIdx=pIdx-
28e80 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20  >pNext){.       
28e90 20 20 20 69 66 28 20 70 49 64 78 2d 3e 62 55 6e     if( pIdx->bUn
28ea0 6f 72 64 65 72 65 64 3d 3d 30 0a 20 20 20 20 20  ordered==0.     
28eb0 20 20 20 20 20 20 26 26 20 70 49 64 78 2d 3e 73        && pIdx->s
28ec0 7a 49 64 78 52 6f 77 3c 70 54 61 62 2d 3e 73 7a  zIdxRow<pTab->sz
28ed0 54 61 62 52 6f 77 0a 20 20 20 20 20 20 20 20 20  TabRow.         
28ee0 20 20 26 26 20 70 49 64 78 2d 3e 70 50 61 72 74    && pIdx->pPart
28ef0 49 64 78 57 68 65 72 65 3d 3d 30 0a 20 20 20 20  IdxWhere==0.    
28f00 20 20 20 20 20 20 20 26 26 20 28 21 70 42 65 73         && (!pBes
28f10 74 20 7c 7c 20 70 49 64 78 2d 3e 73 7a 49 64 78  t || pIdx->szIdx
28f20 52 6f 77 3c 70 42 65 73 74 2d 3e 73 7a 49 64 78  Row<pBest->szIdx
28f30 52 6f 77 29 0a 20 20 20 20 20 20 20 20 20 20 29  Row).          )
28f40 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 42  {.            pB
28f50 65 73 74 20 3d 20 70 49 64 78 3b 0a 20 20 20 20  est = pIdx;.    
28f60 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
28f70 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 42  }.        if( pB
28f80 65 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  est ){.         
28f90 20 69 52 6f 6f 74 20 3d 20 70 42 65 73 74 2d 3e   iRoot = pBest->
28fa0 74 6e 75 6d 3b 0a 20 20 20 20 20 20 20 20 20 20  tnum;.          
28fb0 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74  pKeyInfo = sqlit
28fc0 65 33 49 6e 64 65 78 4b 65 79 69 6e 66 6f 28 70  e3IndexKeyinfo(p
28fd0 50 61 72 73 65 2c 20 70 42 65 73 74 29 3b 0a 20  Parse, pBest);. 
28fe0 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
28ff0 20 20 2f 2a 20 4f 70 65 6e 20 61 20 72 65 61 64    /* Open a read
29000 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 2c 20 65 78  -only cursor, ex
29010 65 63 75 74 65 20 74 68 65 20 4f 50 5f 43 6f 75  ecute the OP_Cou
29020 6e 74 2c 20 63 6c 6f 73 65 20 74 68 65 20 63 75  nt, close the cu
29030 72 73 6f 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20  rsor. */.       
29040 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
29050 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61  p3(v, OP_OpenRea
29060 64 2c 20 69 43 73 72 2c 20 69 52 6f 6f 74 2c 20  d, iCsr, iRoot, 
29070 69 44 62 29 3b 0a 20 20 20 20 20 20 20 20 69 66  iDb);.        if
29080 28 20 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20  ( pKeyInfo ){.  
29090 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
290a0 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d  dbeChangeP4(v, -
290b0 31 2c 20 28 63 68 61 72 20 2a 29 70 4b 65 79 49  1, (char *)pKeyI
290c0 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f  nfo, P4_KEYINFO_
290d0 48 41 4e 44 4f 46 46 29 3b 0a 20 20 20 20 20 20  HANDOFF);.      
290e0 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
290f0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
29100 20 4f 50 5f 43 6f 75 6e 74 2c 20 69 43 73 72 2c   OP_Count, iCsr,
29110 20 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b   sAggInfo.aFunc[
29120 30 5d 2e 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20  0].iMem);.      
29130 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
29140 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  Op1(v, OP_Close,
29150 20 69 43 73 72 29 3b 0a 20 20 20 20 20 20 20 20   iCsr);.        
29160 65 78 70 6c 61 69 6e 53 69 6d 70 6c 65 43 6f 75  explainSimpleCou
29170 6e 74 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c  nt(pParse, pTab,
29180 20 70 42 65 73 74 29 3b 0a 20 20 20 20 20 20 7d   pBest);.      }
29190 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53  else.#endif /* S
291a0 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 54 52 45 45  QLITE_OMIT_BTREE
291b0 43 4f 55 4e 54 20 2a 2f 0a 20 20 20 20 20 20 7b  COUNT */.      {
291c0 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63  .        /* Chec
291d0 6b 20 69 66 20 74 68 65 20 71 75 65 72 79 20 69  k if the query i
291e0 73 20 6f 66 20 6f 6e 65 20 6f 66 20 74 68 65 20  s of one of the 
291f0 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d 73 3a  following forms:
29200 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
29210 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20      **   SELECT 
29220 6d 69 6e 28 78 29 20 46 52 4f 4d 20 2e 2e 2e 0a  min(x) FROM ....
29230 20 20 20 20 20 20 20 20 2a 2a 20 20 20 53 45 4c          **   SEL
29240 45 43 54 20 6d 61 78 28 78 29 20 46 52 4f 4d 20  ECT max(x) FROM 
29250 2e 2e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ....        **. 
29260 20 20 20 20 20 20 20 2a 2a 20 49 66 20 69 74 20         ** If it 
29270 69 73 2c 20 74 68 65 6e 20 61 73 6b 20 74 68 65  is, then ask the
29280 20 63 6f 64 65 20 69 6e 20 77 68 65 72 65 2e 63   code in where.c
29290 20 74 6f 20 61 74 74 65 6d 70 74 20 74 6f 20 73   to attempt to s
292a0 6f 72 74 20 72 65 73 75 6c 74 73 0a 20 20 20 20  ort results.    
292b0 20 20 20 20 2a 2a 20 61 73 20 69 66 20 74 68 65      ** as if the
292c0 72 65 20 77 61 73 20 61 6e 20 22 4f 52 44 45 52  re was an "ORDER
292d0 20 4f 4e 20 78 22 20 6f 72 20 22 4f 52 44 45 52   ON x" or "ORDER
292e0 20 4f 4e 20 78 20 44 45 53 43 22 20 63 6c 61 75   ON x DESC" clau
292f0 73 65 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  se. .        ** 
29300 49 66 20 77 68 65 72 65 2e 63 20 69 73 20 61 62  If where.c is ab
29310 6c 65 20 74 6f 20 70 72 6f 64 75 63 65 20 72 65  le to produce re
29320 73 75 6c 74 73 20 73 6f 72 74 65 64 20 69 6e 20  sults sorted in 
29330 74 68 69 73 20 6f 72 64 65 72 2c 20 74 68 65 6e  this order, then
29340 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 64 64 20  .        ** add 
29350 76 64 62 65 20 63 6f 64 65 20 74 6f 20 62 72 65  vdbe code to bre
29360 61 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 70 72  ak out of the pr
29370 6f 63 65 73 73 69 6e 67 20 6c 6f 6f 70 20 61 66  ocessing loop af
29380 74 65 72 20 74 68 65 20 0a 20 20 20 20 20 20 20  ter the .       
29390 20 2a 2a 20 66 69 72 73 74 20 69 74 65 72 61 74   ** first iterat
293a0 69 6f 6e 20 28 73 69 6e 63 65 20 74 68 65 20 66  ion (since the f
293b0 69 72 73 74 20 69 74 65 72 61 74 69 6f 6e 20 6f  irst iteration o
293c0 66 20 74 68 65 20 6c 6f 6f 70 20 69 73 20 0a 20  f the loop is . 
293d0 20 20 20 20 20 20 20 2a 2a 20 67 75 61 72 61 6e         ** guaran
293e0 74 65 65 64 20 74 6f 20 6f 70 65 72 61 74 65 20  teed to operate 
293f0 6f 6e 20 74 68 65 20 72 6f 77 20 77 69 74 68 20  on the row with 
29400 74 68 65 20 6d 69 6e 69 6d 75 6d 20 6f 72 20 6d  the minimum or m
29410 61 78 69 6d 75 6d 20 0a 20 20 20 20 20 20 20 20  aximum .        
29420 2a 2a 20 76 61 6c 75 65 20 6f 66 20 78 2c 20 74  ** value of x, t
29430 68 65 20 6f 6e 6c 79 20 72 6f 77 20 72 65 71 75  he only row requ
29440 69 72 65 64 29 2e 0a 20 20 20 20 20 20 20 20 2a  ired)..        *
29450 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 41 20 73  *.        ** A s
29460 70 65 63 69 61 6c 20 66 6c 61 67 20 6d 75 73 74  pecial flag must
29470 20 62 65 20 70 61 73 73 65 64 20 74 6f 20 73 71   be passed to sq
29480 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
29490 29 20 74 6f 20 73 6c 69 67 68 74 6c 79 0a 20 20  ) to slightly.  
294a0 20 20 20 20 20 20 2a 2a 20 6d 6f 64 69 66 79 20        ** modify 
294b0 62 65 68 61 76 69 6f 72 20 61 73 20 66 6f 6c 6c  behavior as foll
294c0 6f 77 73 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ows:.        **.
294d0 20 20 20 20 20 20 20 20 2a 2a 20 20 20 2b 20 49          **   + I
294e0 66 20 74 68 65 20 71 75 65 72 79 20 69 73 20 61  f the query is a
294f0 20 22 53 45 4c 45 43 54 20 6d 69 6e 28 78 29 22   "SELECT min(x)"
29500 2c 20 74 68 65 6e 20 74 68 65 20 6c 6f 6f 70 20  , then the loop 
29510 63 6f 64 65 64 20 62 79 0a 20 20 20 20 20 20 20  coded by.       
29520 20 2a 2a 20 20 20 20 20 77 68 65 72 65 2e 63 20   **     where.c 
29530 73 68 6f 75 6c 64 20 6e 6f 74 20 69 74 65 72 61  should not itera
29540 74 65 20 6f 76 65 72 20 61 6e 79 20 76 61 6c 75  te over any valu
29550 65 73 20 77 69 74 68 20 61 20 4e 55 4c 4c 20 76  es with a NULL v
29560 61 6c 75 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  alue.        ** 
29570 20 20 20 20 66 6f 72 20 78 2e 0a 20 20 20 20 20      for x..     
29580 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
29590 20 20 20 2b 20 54 68 65 20 6f 70 74 69 6d 69 7a     + The optimiz
295a0 65 72 20 63 6f 64 65 20 69 6e 20 77 68 65 72 65  er code in where
295b0 2e 63 20 28 74 68 65 20 74 68 69 6e 67 20 74 68  .c (the thing th
295c0 61 74 20 64 65 63 69 64 65 73 20 77 68 69 63 68  at decides which
295d0 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20  .        **     
295e0 69 6e 64 65 78 20 6f 72 20 69 6e 64 69 63 65 73  index or indices
295f0 20 74 6f 20 75 73 65 29 20 73 68 6f 75 6c 64 20   to use) should 
29600 70 6c 61 63 65 20 61 20 64 69 66 66 65 72 65 6e  place a differen
29610 74 20 70 72 69 6f 72 69 74 79 20 6f 6e 20 0a 20  t priority on . 
29620 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 73 61         **     sa
29630 74 69 73 66 79 69 6e 67 20 74 68 65 20 27 4f 52  tisfying the 'OR
29640 44 45 52 20 42 59 27 20 63 6c 61 75 73 65 20 74  DER BY' clause t
29650 68 61 6e 20 69 74 20 64 6f 65 73 20 69 6e 20 6f  han it does in o
29660 74 68 65 72 20 63 61 73 65 73 2e 0a 20 20 20 20  ther cases..    
29670 20 20 20 20 2a 2a 20 20 20 20 20 52 65 66 65 72      **     Refer
29680 20 74 6f 20 63 6f 64 65 20 61 6e 64 20 63 6f 6d   to code and com
29690 6d 65 6e 74 73 20 69 6e 20 77 68 65 72 65 2e 63  ments in where.c
296a0 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 20 20   for details..  
296b0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
296c0 20 45 78 70 72 4c 69 73 74 20 2a 70 4d 69 6e 4d   ExprList *pMinM
296d0 61 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ax = 0;.        
296e0 75 38 20 66 6c 61 67 20 3d 20 57 48 45 52 45 5f  u8 flag = WHERE_
296f0 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b 0a  ORDERBY_NORMAL;.
29700 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20          .       
29710 20 61 73 73 65 72 74 28 20 70 2d 3e 70 47 72 6f   assert( p->pGro
29720 75 70 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20  upBy==0 );.     
29730 20 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 3d     assert( flag=
29740 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  =0 );.        if
29750 28 20 70 2d 3e 70 48 61 76 69 6e 67 3d 3d 30 20  ( p->pHaving==0 
29760 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6c 61  ){.          fla
29770 67 20 3d 20 6d 69 6e 4d 61 78 51 75 65 72 79 28  g = minMaxQuery(
29780 26 73 41 67 67 49 6e 66 6f 2c 20 26 70 4d 69 6e  &sAggInfo, &pMin
29790 4d 61 78 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Max);.        }.
297a0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
297b0 66 6c 61 67 3d 3d 30 20 7c 7c 20 28 70 4d 69 6e  flag==0 || (pMin
297c0 4d 61 78 21 3d 30 20 26 26 20 70 4d 69 6e 4d 61  Max!=0 && pMinMa
297d0 78 2d 3e 6e 45 78 70 72 3d 3d 31 29 20 29 3b 0a  x->nExpr==1) );.
297e0 0a 20 20 20 20 20 20 20 20 69 66 28 20 66 6c 61  .        if( fla
297f0 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  g ){.          p
29800 4d 69 6e 4d 61 78 20 3d 20 73 71 6c 69 74 65 33  MinMax = sqlite3
29810 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20  ExprListDup(db, 
29820 70 4d 69 6e 4d 61 78 2c 20 30 29 3b 0a 20 20 20  pMinMax, 0);.   
29830 20 20 20 20 20 20 20 70 44 65 6c 20 3d 20 70 4d         pDel = pM
29840 69 6e 4d 61 78 3b 0a 20 20 20 20 20 20 20 20 20  inMax;.         
29850 20 69 66 28 20 70 4d 69 6e 4d 61 78 20 26 26 20   if( pMinMax && 
29860 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
29870 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  d ){.           
29880 20 70 4d 69 6e 4d 61 78 2d 3e 61 5b 30 5d 2e 73   pMinMax->a[0].s
29890 6f 72 74 4f 72 64 65 72 20 3d 20 66 6c 61 67 21  ortOrder = flag!
298a0 3d 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d  =WHERE_ORDERBY_M
298b0 49 4e 20 3f 31 3a 30 3b 0a 20 20 20 20 20 20 20  IN ?1:0;.       
298c0 20 20 20 20 20 70 4d 69 6e 4d 61 78 2d 3e 61 5b       pMinMax->a[
298d0 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54  0].pExpr->op = T
298e0 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20  K_COLUMN;.      
298f0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
29900 20 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68    .        /* Th
29910 69 73 20 63 61 73 65 20 72 75 6e 73 20 69 66 20  is case runs if 
29920 74 68 65 20 61 67 67 72 65 67 61 74 65 20 68 61  the aggregate ha
29930 73 20 6e 6f 20 47 52 4f 55 50 20 42 59 20 63 6c  s no GROUP BY cl
29940 61 75 73 65 2e 20 20 54 68 65 0a 20 20 20 20 20  ause.  The.     
29950 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67     ** processing
29960 20 69 73 20 6d 75 63 68 20 73 69 6d 70 6c 65 72   is much simpler
29970 20 73 69 6e 63 65 20 74 68 65 72 65 20 69 73 20   since there is 
29980 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 72 6f  only a single ro
29990 77 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20  w.        ** of 
299a0 6f 75 74 70 75 74 2e 0a 20 20 20 20 20 20 20 20  output..        
299b0 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 73 65 74  */.        reset
299c0 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72  Accumulator(pPar
299d0 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a  se, &sAggInfo);.
299e0 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f 20 3d          pWInfo =
299f0 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
29a00 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c  in(pParse, pTabL
29a10 69 73 74 2c 20 70 57 68 65 72 65 2c 20 70 4d 69  ist, pWhere, pMi
29a20 6e 4d 61 78 2c 30 2c 66 6c 61 67 2c 30 29 3b 0a  nMax,0,flag,0);.
29a30 20 20 20 20 20 20 20 20 69 66 28 20 70 57 49 6e          if( pWIn
29a40 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  fo==0 ){.       
29a50 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
29a60 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 44 65  stDelete(db, pDe
29a70 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  l);.          go
29a80 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
29a90 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
29aa0 20 75 70 64 61 74 65 41 63 63 75 6d 75 6c 61 74   updateAccumulat
29ab0 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41 67 67  or(pParse, &sAgg
29ac0 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 61  Info);.        a
29ad0 73 73 65 72 74 28 20 70 4d 69 6e 4d 61 78 3d 3d  ssert( pMinMax==
29ae0 30 20 7c 7c 20 70 4d 69 6e 4d 61 78 2d 3e 6e 45  0 || pMinMax->nE
29af0 78 70 72 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  xpr==1 );.      
29b00 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65    if( sqlite3Whe
29b10 72 65 49 73 4f 72 64 65 72 65 64 28 70 57 49 6e  reIsOrdered(pWIn
29b20 66 6f 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  fo) ){.         
29b30 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
29b40 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
29b50 2c 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 72  , sqlite3WhereBr
29b60 65 61 6b 4c 61 62 65 6c 28 70 57 49 6e 66 6f 29  eakLabel(pWInfo)
29b70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 56 64 62  );.          Vdb
29b80 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73  eComment((v, "%s
29b90 28 29 20 62 79 20 69 6e 64 65 78 22 2c 0a 20 20  () by index",.  
29ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 66                (f
29bb0 6c 61 67 3d 3d 57 48 45 52 45 5f 4f 52 44 45 52  lag==WHERE_ORDER
29bc0 42 59 5f 4d 49 4e 3f 22 6d 69 6e 22 3a 22 6d 61  BY_MIN?"min":"ma
29bd0 78 22 29 29 29 3b 0a 20 20 20 20 20 20 20 20 7d  x")));.        }
29be0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
29bf0 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29  WhereEnd(pWInfo)
29c00 3b 0a 20 20 20 20 20 20 20 20 66 69 6e 61 6c 69  ;.        finali
29c10 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e 73 28 70  zeAggFunctions(p
29c20 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f  Parse, &sAggInfo
29c30 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
29c40 20 20 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a    pOrderBy = 0;.
29c50 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
29c60 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
29c70 20 70 48 61 76 69 6e 67 2c 20 61 64 64 72 45 6e   pHaving, addrEn
29c80 64 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  d, SQLITE_JUMPIF
29c90 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 65 6c  NULL);.      sel
29ca0 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61  ectInnerLoop(pPa
29cb0 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73  rse, p, p->pELis
29cc0 74 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 0a  t, 0, 0, 0, 0, .
29cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29ce0 20 20 20 20 20 20 70 44 65 73 74 2c 20 61 64 64        pDest, add
29cf0 72 45 6e 64 2c 20 61 64 64 72 45 6e 64 29 3b 0a  rEnd, addrEnd);.
29d00 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
29d10 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
29d20 70 44 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20  pDel);.    }.   
29d30 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
29d40 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72  lveLabel(v, addr
29d50 45 6e 64 29 3b 0a 20 20 20 20 0a 20 20 7d 20 2f  End);.    .  } /
29d60 2a 20 65 6e 64 69 66 20 61 67 67 72 65 67 61 74  * endif aggregat
29d70 65 20 71 75 65 72 79 20 2a 2f 0a 0a 20 20 69 66  e query */..  if
29d80 28 20 73 44 69 73 74 69 6e 63 74 2e 65 54 6e 63  ( sDistinct.eTnc
29d90 74 54 79 70 65 3d 3d 57 48 45 52 45 5f 44 49 53  tType==WHERE_DIS
29da0 54 49 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44 20  TINCT_UNORDERED 
29db0 29 7b 0a 20 20 20 20 65 78 70 6c 61 69 6e 54 65  ){.    explainTe
29dc0 6d 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  mpTable(pParse, 
29dd0 22 44 49 53 54 49 4e 43 54 22 29 3b 0a 20 20 7d  "DISTINCT");.  }
29de0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
29df0 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  is an ORDER BY c
29e00 6c 61 75 73 65 2c 20 74 68 65 6e 20 77 65 20 6e  lause, then we n
29e10 65 65 64 20 74 6f 20 73 6f 72 74 20 74 68 65 20  eed to sort the 
29e20 72 65 73 75 6c 74 73 0a 20 20 2a 2a 20 61 6e 64  results.  ** and
29e30 20 73 65 6e 64 20 74 68 65 6d 20 74 6f 20 74 68   send them to th
29e40 65 20 63 61 6c 6c 62 61 63 6b 20 6f 6e 65 20 62  e callback one b
29e50 79 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  y one..  */.  if
29e60 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ( pOrderBy ){.  
29e70 20 20 65 78 70 6c 61 69 6e 54 65 6d 70 54 61 62    explainTempTab
29e80 6c 65 28 70 50 61 72 73 65 2c 20 22 4f 52 44 45  le(pParse, "ORDE
29e90 52 20 42 59 22 29 3b 0a 20 20 20 20 67 65 6e 65  R BY");.    gene
29ea0 72 61 74 65 53 6f 72 74 54 61 69 6c 28 70 50 61  rateSortTail(pPa
29eb0 72 73 65 2c 20 70 2c 20 76 2c 20 70 45 4c 69 73  rse, p, v, pELis
29ec0 74 2d 3e 6e 45 78 70 72 2c 20 70 44 65 73 74 29  t->nExpr, pDest)
29ed0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70  ;.  }..  /* Jump
29ee0 20 68 65 72 65 20 74 6f 20 73 6b 69 70 20 74 68   here to skip th
29ef0 69 73 20 71 75 65 72 79 0a 20 20 2a 2f 0a 20 20  is query.  */.  
29f00 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
29f10 76 65 4c 61 62 65 6c 28 76 2c 20 69 45 6e 64 29  veLabel(v, iEnd)
29f20 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 53 45 4c 45  ;..  /* The SELE
29f30 43 54 20 77 61 73 20 73 75 63 63 65 73 73 66 75  CT was successfu
29f40 6c 6c 79 20 63 6f 64 65 64 2e 20 20 20 53 65 74  lly coded.   Set
29f50 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65   the return code
29f60 20 74 6f 20 30 0a 20 20 2a 2a 20 74 6f 20 69 6e   to 0.  ** to in
29f70 64 69 63 61 74 65 20 6e 6f 20 65 72 72 6f 72 73  dicate no errors
29f80 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 30 3b  ..  */.  rc = 0;
29f90 0a 0a 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20 6a  ..  /* Control j
29fa0 75 6d 70 73 20 74 6f 20 68 65 72 65 20 69 66 20  umps to here if 
29fb0 61 6e 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f  an error is enco
29fc0 75 6e 74 65 72 65 64 20 61 62 6f 76 65 2c 20 6f  untered above, o
29fd0 72 20 75 70 6f 6e 0a 20 20 2a 2a 20 73 75 63 63  r upon.  ** succ
29fe0 65 73 73 66 75 6c 20 63 6f 64 69 6e 67 20 6f 66  essful coding of
29ff0 20 74 68 65 20 53 45 4c 45 43 54 2e 0a 20 20 2a   the SELECT..  *
2a000 2f 0a 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 20 20  /.select_end:.  
2a010 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65  explainSetIntege
2a020 72 28 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63  r(pParse->iSelec
2a030 74 49 64 2c 20 69 52 65 73 74 6f 72 65 53 65 6c  tId, iRestoreSel
2a040 65 63 74 49 64 29 3b 0a 0a 20 20 2f 2a 20 49 64  ectId);..  /* Id
2a050 65 6e 74 69 66 79 20 63 6f 6c 75 6d 6e 20 6e 61  entify column na
2a060 6d 65 73 20 69 66 20 72 65 73 75 6c 74 73 20 6f  mes if results o
2a070 66 20 74 68 65 20 53 45 4c 45 43 54 20 61 72 65  f the SELECT are
2a080 20 74 6f 20 62 65 20 6f 75 74 70 75 74 2e 0a 20   to be output.. 
2a090 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   */.  if( rc==SQ
2a0a0 4c 49 54 45 5f 4f 4b 20 26 26 20 70 44 65 73 74  LITE_OK && pDest
2a0b0 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74  ->eDest==SRT_Out
2a0c0 70 75 74 20 29 7b 0a 20 20 20 20 67 65 6e 65 72  put ){.    gener
2a0d0 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70  ateColumnNames(p
2a0e0 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c  Parse, pTabList,
2a0f0 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a 20   pEList);.  }.. 
2a100 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
2a110 62 2c 20 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c  b, sAggInfo.aCol
2a120 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
2a130 65 65 28 64 62 2c 20 73 41 67 67 49 6e 66 6f 2e  ee(db, sAggInfo.
2a140 61 46 75 6e 63 29 3b 0a 20 20 72 65 74 75 72 6e  aFunc);.  return
2a150 20 72 63 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69   rc;.}..#if defi
2a160 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
2a170 45 5f 54 52 45 45 5f 45 58 50 4c 41 49 4e 29 0a  E_TREE_EXPLAIN).
2a180 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61  /*.** Generate a
2a190 20 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20   human-readable 
2a1a0 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 61  description of a
2a1b0 20 74 68 65 20 53 65 6c 65 63 74 20 6f 62 6a 65   the Select obje
2a1c0 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ct..*/.static vo
2a1d0 69 64 20 65 78 70 6c 61 69 6e 4f 6e 65 53 65 6c  id explainOneSel
2a1e0 65 63 74 28 56 64 62 65 20 2a 70 56 64 62 65 2c  ect(Vdbe *pVdbe,
2a1f0 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 73   Select *p){.  s
2a200 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69  qlite3ExplainPri
2a210 6e 74 66 28 70 56 64 62 65 2c 20 22 53 45 4c 45  ntf(pVdbe, "SELE
2a220 43 54 20 22 29 3b 0a 20 20 69 66 28 20 70 2d 3e  CT ");.  if( p->
2a230 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44  selFlags & (SF_D
2a240 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65  istinct|SF_Aggre
2a250 67 61 74 65 29 20 29 7b 0a 20 20 20 20 69 66 28  gate) ){.    if(
2a260 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53   p->selFlags & S
2a270 46 5f 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20  F_Distinct ){.  
2a280 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
2a290 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20  inPrintf(pVdbe, 
2a2a0 22 44 49 53 54 49 4e 43 54 20 22 29 3b 0a 20 20  "DISTINCT ");.  
2a2b0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 73    }.    if( p->s
2a2c0 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67 67  elFlags & SF_Agg
2a2d0 72 65 67 61 74 65 20 29 7b 0a 20 20 20 20 20 20  regate ){.      
2a2e0 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
2a2f0 69 6e 74 66 28 70 56 64 62 65 2c 20 22 61 67 67  intf(pVdbe, "agg
2a300 5f 66 6c 61 67 20 22 29 3b 0a 20 20 20 20 7d 0a  _flag ");.    }.
2a310 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
2a320 69 6e 4e 4c 28 70 56 64 62 65 29 3b 0a 20 20 20  inNL(pVdbe);.   
2a330 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
2a340 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22 20 20  rintf(pVdbe, "  
2a350 20 22 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74   ");.  }.  sqlit
2a360 65 33 45 78 70 6c 61 69 6e 45 78 70 72 4c 69 73  e3ExplainExprLis
2a370 74 28 70 56 64 62 65 2c 20 70 2d 3e 70 45 4c 69  t(pVdbe, p->pELi
2a380 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  st);.  sqlite3Ex
2a390 70 6c 61 69 6e 4e 4c 28 70 56 64 62 65 29 3b 0a  plainNL(pVdbe);.
2a3a0 20 20 69 66 28 20 70 2d 3e 70 53 72 63 20 26 26    if( p->pSrc &&
2a3b0 20 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 20 29   p->pSrc->nSrc )
2a3c0 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
2a3d0 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
2a3e0 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22 46 52  rintf(pVdbe, "FR
2a3f0 4f 4d 20 22 29 3b 0a 20 20 20 20 73 71 6c 69 74  OM ");.    sqlit
2a400 65 33 45 78 70 6c 61 69 6e 50 75 73 68 28 70 56  e3ExplainPush(pV
2a410 64 62 65 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  dbe);.    for(i=
2a420 30 3b 20 69 3c 70 2d 3e 70 53 72 63 2d 3e 6e 53  0; i<p->pSrc->nS
2a430 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rc; i++){.      
2a440 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
2a450 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 2d  tem *pItem = &p-
2a460 3e 70 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20  >pSrc->a[i];.   
2a470 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
2a480 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22  nPrintf(pVdbe, "
2a490 7b 25 64 2c 2a 7d 20 3d 20 22 2c 20 70 49 74 65  {%d,*} = ", pIte
2a4a0 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20  m->iCursor);.   
2a4b0 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 53     if( pItem->pS
2a4c0 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20  elect ){.       
2a4d0 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 53   sqlite3ExplainS
2a4e0 65 6c 65 63 74 28 70 56 64 62 65 2c 20 70 49 74  elect(pVdbe, pIt
2a4f0 65 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20  em->pSelect);.  
2a500 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d        if( pItem-
2a510 3e 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20  >pTab ){.       
2a520 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
2a530 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22  nPrintf(pVdbe, "
2a540 20 28 74 61 62 6e 61 6d 65 3d 25 73 29 22 2c 20   (tabname=%s)", 
2a550 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61  pItem->pTab->zNa
2a560 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  me);.        }. 
2a570 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
2a580 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 29 7b 0a 20  Item->zName ){. 
2a590 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
2a5a0 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62  plainPrintf(pVdb
2a5b0 65 2c 20 22 25 73 22 2c 20 70 49 74 65 6d 2d 3e  e, "%s", pItem->
2a5c0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a  zName);.      }.
2a5d0 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d        if( pItem-
2a5e0 3e 7a 41 6c 69 61 73 20 29 7b 0a 20 20 20 20 20  >zAlias ){.     
2a5f0 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
2a600 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22  nPrintf(pVdbe, "
2a610 20 28 41 53 20 25 73 29 22 2c 20 70 49 74 65 6d   (AS %s)", pItem
2a620 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 20  ->zAlias);.     
2a630 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 49 74   }.      if( pIt
2a640 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a  em->jointype & J
2a650 54 5f 4c 45 46 54 20 29 7b 0a 20 20 20 20 20 20  T_LEFT ){.      
2a660 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
2a670 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22 20  Printf(pVdbe, " 
2a680 4c 45 46 54 2d 4a 4f 49 4e 22 29 3b 0a 20 20 20  LEFT-JOIN");.   
2a690 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
2a6a0 65 33 45 78 70 6c 61 69 6e 4e 4c 28 70 56 64 62  e3ExplainNL(pVdb
2a6b0 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  e);.    }.    sq
2a6c0 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 6f 70 28  lite3ExplainPop(
2a6d0 70 56 64 62 65 29 3b 0a 20 20 7d 0a 20 20 69 66  pVdbe);.  }.  if
2a6e0 28 20 70 2d 3e 70 57 68 65 72 65 20 29 7b 0a 20  ( p->pWhere ){. 
2a6f0 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
2a700 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22  nPrintf(pVdbe, "
2a710 57 48 45 52 45 20 22 29 3b 0a 20 20 20 20 73 71  WHERE ");.    sq
2a720 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72  lite3ExplainExpr
2a730 28 70 56 64 62 65 2c 20 70 2d 3e 70 57 68 65 72  (pVdbe, p->pWher
2a740 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  e);.    sqlite3E
2a750 78 70 6c 61 69 6e 4e 4c 28 70 56 64 62 65 29 3b  xplainNL(pVdbe);
2a760 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 47  .  }.  if( p->pG
2a770 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 73 71  roupBy ){.    sq
2a780 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e  lite3ExplainPrin
2a790 74 66 28 70 56 64 62 65 2c 20 22 47 52 4f 55 50  tf(pVdbe, "GROUP
2a7a0 42 59 20 22 29 3b 0a 20 20 20 20 73 71 6c 69 74  BY ");.    sqlit
2a7b0 65 33 45 78 70 6c 61 69 6e 45 78 70 72 4c 69 73  e3ExplainExprLis
2a7c0 74 28 70 56 64 62 65 2c 20 70 2d 3e 70 47 72 6f  t(pVdbe, p->pGro
2a7d0 75 70 42 79 29 3b 0a 20 20 20 20 73 71 6c 69 74  upBy);.    sqlit
2a7e0 65 33 45 78 70 6c 61 69 6e 4e 4c 28 70 56 64 62  e3ExplainNL(pVdb
2a7f0 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d  e);.  }.  if( p-
2a800 3e 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20  >pHaving ){.    
2a810 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
2a820 69 6e 74 66 28 70 56 64 62 65 2c 20 22 48 41 56  intf(pVdbe, "HAV
2a830 49 4e 47 20 22 29 3b 0a 20 20 20 20 73 71 6c 69  ING ");.    sqli
2a840 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72 28 70  te3ExplainExpr(p
2a850 56 64 62 65 2c 20 70 2d 3e 70 48 61 76 69 6e 67  Vdbe, p->pHaving
2a860 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
2a870 70 6c 61 69 6e 4e 4c 28 70 56 64 62 65 29 3b 0a  plainNL(pVdbe);.
2a880 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72    }.  if( p->pOr
2a890 64 65 72 42 79 20 29 7b 0a 20 20 20 20 73 71 6c  derBy ){.    sql
2a8a0 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74  ite3ExplainPrint
2a8b0 66 28 70 56 64 62 65 2c 20 22 4f 52 44 45 52 42  f(pVdbe, "ORDERB
2a8c0 59 20 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Y ");.    sqlite
2a8d0 33 45 78 70 6c 61 69 6e 45 78 70 72 4c 69 73 74  3ExplainExprList
2a8e0 28 70 56 64 62 65 2c 20 70 2d 3e 70 4f 72 64 65  (pVdbe, p->pOrde
2a8f0 72 42 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  rBy);.    sqlite
2a900 33 45 78 70 6c 61 69 6e 4e 4c 28 70 56 64 62 65  3ExplainNL(pVdbe
2a910 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  );.  }.  if( p->
2a920 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71  pLimit ){.    sq
2a930 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e  lite3ExplainPrin
2a940 74 66 28 70 56 64 62 65 2c 20 22 4c 49 4d 49 54  tf(pVdbe, "LIMIT
2a950 20 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   ");.    sqlite3
2a960 45 78 70 6c 61 69 6e 45 78 70 72 28 70 56 64 62  ExplainExpr(pVdb
2a970 65 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20  e, p->pLimit);. 
2a980 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
2a990 6e 4e 4c 28 70 56 64 62 65 29 3b 0a 20 20 7d 0a  nNL(pVdbe);.  }.
2a9a0 20 20 69 66 28 20 70 2d 3e 70 4f 66 66 73 65 74    if( p->pOffset
2a9b0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
2a9c0 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64  xplainPrintf(pVd
2a9d0 62 65 2c 20 22 4f 46 46 53 45 54 20 22 29 3b 0a  be, "OFFSET ");.
2a9e0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
2a9f0 69 6e 45 78 70 72 28 70 56 64 62 65 2c 20 70 2d  inExpr(pVdbe, p-
2aa00 3e 70 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 73  >pOffset);.    s
2aa10 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 4e 4c 28  qlite3ExplainNL(
2aa20 70 56 64 62 65 29 3b 0a 20 20 7d 0a 7d 0a 76 6f  pVdbe);.  }.}.vo
2aa30 69 64 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69  id sqlite3Explai
2aa40 6e 53 65 6c 65 63 74 28 56 64 62 65 20 2a 70 56  nSelect(Vdbe *pV
2aa50 64 62 65 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b  dbe, Select *p){
2aa60 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20  .  if( p==0 ){. 
2aa70 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
2aa80 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22  nPrintf(pVdbe, "
2aa90 28 6e 75 6c 6c 2d 73 65 6c 65 63 74 29 22 29 3b  (null-select)");
2aaa0 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
2aab0 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 70 50 72  .  while( p->pPr
2aac0 69 6f 72 20 29 7b 0a 20 20 20 20 70 2d 3e 70 50  ior ){.    p->pP
2aad0 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 70 3b  rior->pNext = p;
2aae0 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 50 72 69  .    p = p->pPri
2aaf0 6f 72 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  or;.  }.  sqlite
2ab00 33 45 78 70 6c 61 69 6e 50 75 73 68 28 70 56 64  3ExplainPush(pVd
2ab10 62 65 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 20  be);.  while( p 
2ab20 29 7b 0a 20 20 20 20 65 78 70 6c 61 69 6e 4f 6e  ){.    explainOn
2ab30 65 53 65 6c 65 63 74 28 70 56 64 62 65 2c 20 70  eSelect(pVdbe, p
2ab40 29 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e  );.    p = p->pN
2ab50 65 78 74 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d  ext;.    if( p==
2ab60 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 73  0 ) break;.    s
2ab70 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 4e 4c 28  qlite3ExplainNL(
2ab80 70 56 64 62 65 29 3b 0a 20 20 20 20 73 71 6c 69  pVdbe);.    sqli
2ab90 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
2aba0 28 70 56 64 62 65 2c 20 22 25 73 5c 6e 22 2c 20  (pVdbe, "%s\n", 
2abb0 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e  selectOpName(p->
2abc0 6f 70 29 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  op));.  }.  sqli
2abd0 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
2abe0 28 70 56 64 62 65 2c 20 22 45 4e 44 22 29 3b 0a  (pVdbe, "END");.
2abf0 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
2ac00 50 6f 70 28 70 56 64 62 65 29 3b 0a 7d 0a 0a 2f  Pop(pVdbe);.}../
2ac10 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 73 74 72  * End of the str
2ac20 75 63 74 75 72 65 20 64 65 62 75 67 20 70 72 69  ucture debug pri
2ac30 6e 74 69 6e 67 20 63 6f 64 65 0a 2a 2a 2a 2a 2a  nting code.*****
2ac40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ac50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ac60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ac70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ac80 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 23 65 6e 64 69 66  ********/.#endif
2ac90 20 2f 2a 20 64 65 66 69 6e 65 64 28 53 51 4c 49   /* defined(SQLI
2aca0 54 45 5f 45 4e 41 42 4c 45 5f 54 52 45 45 5f 45  TE_ENABLE_TREE_E
2acb0 58 50 4c 41 49 4e 29 20 2a 2f 0a                 XPLAIN) */.