/ Hex Artifact Content
Login

Artifact 588ae13fc3d10dc812a0832fd143374583beb847:


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 41 6e 79  ert( !ExprHasAny
20a0: 50 72 6f 70 65 72 74 79 28 70 45 71 2c 20 45 50  Property(pEq, EP
20b0: 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65  _TokenOnly|EP_Re
20c0: 64 75 63 65 64 29 20 29 3b 0a 20 20 20 20 45 78  duced) );.    Ex
20d0: 70 72 53 65 74 49 72 72 65 64 75 63 69 62 6c 65  prSetIrreducible
20e0: 28 70 45 71 29 3b 0a 20 20 20 20 70 45 71 2d 3e  (pEq);.    pEq->
20f0: 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20  iRightJoinTable 
2100: 3d 20 28 69 31 36 29 70 45 32 2d 3e 69 54 61 62  = (i16)pE2->iTab
2110: 6c 65 3b 0a 20 20 7d 0a 20 20 2a 70 70 57 68 65  le;.  }.  *ppWhe
2120: 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  re = sqlite3Expr
2130: 41 6e 64 28 64 62 2c 20 2a 70 70 57 68 65 72 65  And(db, *ppWhere
2140: 2c 20 70 45 71 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  , pEq);.}../*.**
2150: 20 53 65 74 20 74 68 65 20 45 50 5f 46 72 6f 6d   Set the EP_From
2160: 4a 6f 69 6e 20 70 72 6f 70 65 72 74 79 20 6f 6e  Join property on
2170: 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74 68   all terms of th
2180: 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73 69  e given expressi
2190: 6f 6e 2e 0a 2a 2a 20 41 6e 64 20 73 65 74 20 74  on..** And set t
21a0: 68 65 20 45 78 70 72 2e 69 52 69 67 68 74 4a 6f  he Expr.iRightJo
21b0: 69 6e 54 61 62 6c 65 20 74 6f 20 69 54 61 62 6c  inTable to iTabl
21c0: 65 20 66 6f 72 20 65 76 65 72 79 20 74 65 72 6d  e for every term
21d0: 20 69 6e 20 74 68 65 0a 2a 2a 20 65 78 70 72 65   in the.** expre
21e0: 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ssion..**.** The
21f0: 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 70 72 6f   EP_FromJoin pro
2200: 70 65 72 74 79 20 69 73 20 75 73 65 64 20 6f 6e  perty is used on
2210: 20 74 65 72 6d 73 20 6f 66 20 61 6e 20 65 78 70   terms of an exp
2220: 72 65 73 73 69 6f 6e 20 74 6f 20 74 65 6c 6c 0a  ression to tell.
2230: 2a 2a 20 74 68 65 20 4c 45 46 54 20 4f 55 54 45  ** the LEFT OUTE
2240: 52 20 4a 4f 49 4e 20 70 72 6f 63 65 73 73 69 6e  R JOIN processin
2250: 67 20 6c 6f 67 69 63 20 74 68 61 74 20 74 68 69  g logic that thi
2260: 73 20 74 65 72 6d 20 69 73 20 70 61 72 74 20 6f  s term is part o
2270: 66 20 74 68 65 0a 2a 2a 20 6a 6f 69 6e 20 72 65  f the.** join re
2280: 73 74 72 69 63 74 69 6f 6e 20 73 70 65 63 69 66  striction specif
2290: 69 65 64 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72  ied in the ON or
22a0: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 61 6e   USING clause an
22b0: 64 20 6e 6f 74 20 61 20 70 61 72 74 0a 2a 2a 20  d not a part.** 
22c0: 6f 66 20 74 68 65 20 6d 6f 72 65 20 67 65 6e 65  of the more gene
22d0: 72 61 6c 20 57 48 45 52 45 20 63 6c 61 75 73 65  ral WHERE clause
22e0: 2e 20 20 54 68 65 73 65 20 74 65 72 6d 73 20 61  .  These terms a
22f0: 72 65 20 6d 6f 76 65 64 20 6f 76 65 72 20 74 6f  re moved over to
2300: 20 74 68 65 0a 2a 2a 20 57 48 45 52 45 20 63 6c   the.** WHERE cl
2310: 61 75 73 65 20 64 75 72 69 6e 67 20 6a 6f 69 6e  ause during join
2320: 20 70 72 6f 63 65 73 73 69 6e 67 20 62 75 74 20   processing but 
2330: 77 65 20 6e 65 65 64 20 74 6f 20 72 65 6d 65 6d  we need to remem
2340: 62 65 72 20 74 68 61 74 20 74 68 65 79 0a 2a 2a  ber that they.**
2350: 20 6f 72 69 67 69 6e 61 74 65 64 20 69 6e 20 74   originated in t
2360: 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63  he ON or USING c
2370: 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  lause..**.** The
2380: 20 45 78 70 72 2e 69 52 69 67 68 74 4a 6f 69 6e   Expr.iRightJoin
2390: 54 61 62 6c 65 20 74 65 6c 6c 73 20 74 68 65 20  Table tells the 
23a0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 70 72 6f  WHERE clause pro
23b0: 63 65 73 73 69 6e 67 20 74 68 61 74 20 74 68 65  cessing that the
23c0: 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 64  .** expression d
23d0: 65 70 65 6e 64 73 20 6f 6e 20 74 61 62 6c 65 20  epends on table 
23e0: 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20  iRightJoinTable 
23f0: 65 76 65 6e 20 69 66 20 74 68 61 74 20 74 61 62  even if that tab
2400: 6c 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 65 78 70  le is not.** exp
2410: 6c 69 63 69 74 6c 79 20 6d 65 6e 74 69 6f 6e 65  licitly mentione
2420: 64 20 69 6e 20 74 68 65 20 65 78 70 72 65 73 73  d in the express
2430: 69 6f 6e 2e 20 20 54 68 61 74 20 69 6e 66 6f 72  ion.  That infor
2440: 6d 61 74 69 6f 6e 20 69 73 20 6e 65 65 64 65 64  mation is needed
2450: 0a 2a 2a 20 66 6f 72 20 63 61 73 65 73 20 6c 69  .** for cases li
2460: 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  ke this:.**.**  
2470: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
2480: 74 31 20 4c 45 46 54 20 4a 4f 49 4e 20 74 32 20  t1 LEFT JOIN t2 
2490: 4f 4e 20 74 31 2e 61 3d 74 32 2e 62 20 41 4e 44  ON t1.a=t2.b AND
24a0: 20 74 31 2e 78 3d 35 0a 2a 2a 0a 2a 2a 20 54 68   t1.x=5.**.** Th
24b0: 65 20 77 68 65 72 65 20 63 6c 61 75 73 65 20 6e  e where clause n
24c0: 65 65 64 73 20 74 6f 20 64 65 66 65 72 20 74 68  eeds to defer th
24d0: 65 20 68 61 6e 64 6c 69 6e 67 20 6f 66 20 74 68  e handling of th
24e0: 65 20 74 31 2e 78 3d 35 0a 2a 2a 20 74 65 72 6d  e t1.x=5.** term
24f0: 20 75 6e 74 69 6c 20 61 66 74 65 72 20 74 68 65   until after the
2500: 20 74 32 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20   t2 loop of the 
2510: 6a 6f 69 6e 2e 20 20 49 6e 20 74 68 61 74 20 77  join.  In that w
2520: 61 79 2c 20 61 0a 2a 2a 20 4e 55 4c 4c 20 74 32  ay, a.** NULL t2
2530: 20 72 6f 77 20 77 69 6c 6c 20 62 65 20 69 6e 73   row will be ins
2540: 65 72 74 65 64 20 77 68 65 6e 65 76 65 72 20 74  erted whenever t
2550: 31 2e 78 21 3d 35 2e 20 20 49 66 20 77 65 20 64  1.x!=5.  If we d
2560: 6f 20 6e 6f 74 0a 2a 2a 20 64 65 66 65 72 20 74  o not.** defer t
2570: 68 65 20 68 61 6e 64 6c 69 6e 67 20 6f 66 20 74  he handling of t
2580: 31 2e 78 3d 35 2c 20 69 74 20 77 69 6c 6c 20 62  1.x=5, it will b
2590: 65 20 70 72 6f 63 65 73 73 65 64 20 69 6d 6d 65  e processed imme
25a0: 64 69 61 74 65 6c 79 0a 2a 2a 20 61 66 74 65 72  diately.** after
25b0: 20 74 68 65 20 74 31 20 6c 6f 6f 70 20 61 6e 64   the t1 loop and
25c0: 20 72 6f 77 73 20 77 69 74 68 20 74 31 2e 78 21   rows with t1.x!
25d0: 3d 35 20 77 69 6c 6c 20 6e 65 76 65 72 20 61 70  =5 will never ap
25e0: 70 65 61 72 20 69 6e 0a 2a 2a 20 74 68 65 20 6f  pear in.** the o
25f0: 75 74 70 75 74 2c 20 77 68 69 63 68 20 69 73 20  utput, which is 
2600: 69 6e 63 6f 72 72 65 63 74 2e 0a 2a 2f 0a 73 74  incorrect..*/.st
2610: 61 74 69 63 20 76 6f 69 64 20 73 65 74 4a 6f 69  atic void setJoi
2620: 6e 45 78 70 72 28 45 78 70 72 20 2a 70 2c 20 69  nExpr(Expr *p, i
2630: 6e 74 20 69 54 61 62 6c 65 29 7b 0a 20 20 77 68  nt iTable){.  wh
2640: 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 45 78  ile( p ){.    Ex
2650: 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 2c  prSetProperty(p,
2660: 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20   EP_FromJoin);. 
2670: 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
2680: 48 61 73 41 6e 79 50 72 6f 70 65 72 74 79 28 70  HasAnyProperty(p
2690: 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45  , EP_TokenOnly|E
26a0: 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a 20 20  P_Reduced) );.  
26b0: 20 20 45 78 70 72 53 65 74 49 72 72 65 64 75 63    ExprSetIrreduc
26c0: 69 62 6c 65 28 70 29 3b 0a 20 20 20 20 70 2d 3e  ible(p);.    p->
26d0: 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20  iRightJoinTable 
26e0: 3d 20 28 69 31 36 29 69 54 61 62 6c 65 3b 0a 20  = (i16)iTable;. 
26f0: 20 20 20 73 65 74 4a 6f 69 6e 45 78 70 72 28 70     setJoinExpr(p
2700: 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 6c 65 29  ->pLeft, iTable)
2710: 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 52 69  ;.    p = p->pRi
2720: 67 68 74 3b 0a 20 20 7d 20 0a 7d 0a 0a 2f 2a 0a  ght;.  } .}../*.
2730: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
2740: 70 72 6f 63 65 73 73 65 73 20 74 68 65 20 6a 6f  processes the jo
2750: 69 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  in information f
2760: 6f 72 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  or a SELECT stat
2770: 65 6d 65 6e 74 2e 0a 2a 2a 20 4f 4e 20 61 6e 64  ement..** ON and
2780: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20 61   USING clauses a
2790: 72 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74  re converted int
27a0: 6f 20 65 78 74 72 61 20 74 65 72 6d 73 20 6f 66  o extra terms of
27b0: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
27c0: 65 2e 0a 2a 2a 20 4e 41 54 55 52 41 4c 20 6a 6f  e..** NATURAL jo
27d0: 69 6e 73 20 61 6c 73 6f 20 63 72 65 61 74 65 20  ins also create 
27e0: 65 78 74 72 61 20 57 48 45 52 45 20 63 6c 61 75  extra WHERE clau
27f0: 73 65 20 74 65 72 6d 73 2e 0a 2a 2a 0a 2a 2a 20  se terms..**.** 
2800: 54 68 65 20 74 65 72 6d 73 20 6f 66 20 61 20 46  The terms of a F
2810: 52 4f 4d 20 63 6c 61 75 73 65 20 61 72 65 20 63  ROM clause are c
2820: 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20  ontained in the 
2830: 53 65 6c 65 63 74 2e 70 53 72 63 20 73 74 72 75  Select.pSrc stru
2840: 63 74 75 72 65 2e 0a 2a 2a 20 54 68 65 20 6c 65  cture..** The le
2850: 66 74 20 6d 6f 73 74 20 74 61 62 6c 65 20 69 73  ft most table is
2860: 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79   the first entry
2870: 20 69 6e 20 53 65 6c 65 63 74 2e 70 53 72 63 2e   in Select.pSrc.
2880: 20 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74    The right-most
2890: 0a 2a 2a 20 74 61 62 6c 65 20 69 73 20 74 68 65  .** table is the
28a0: 20 6c 61 73 74 20 65 6e 74 72 79 2e 20 20 54 68   last entry.  Th
28b0: 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 20  e join operator 
28c0: 69 73 20 68 65 6c 64 20 69 6e 20 74 68 65 20 65  is held in the e
28d0: 6e 74 72 79 20 74 6f 0a 2a 2a 20 74 68 65 20 6c  ntry to.** the l
28e0: 65 66 74 2e 20 20 54 68 75 73 20 65 6e 74 72 79  eft.  Thus entry
28f0: 20 30 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20   0 contains the 
2900: 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 20 66 6f  join operator fo
2910: 72 20 74 68 65 20 6a 6f 69 6e 20 62 65 74 77 65  r the join betwe
2920: 65 6e 0a 2a 2a 20 65 6e 74 72 69 65 73 20 30 20  en.** entries 0 
2930: 61 6e 64 20 31 2e 20 20 41 6e 79 20 4f 4e 20 6f  and 1.  Any ON o
2940: 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20  r USING clauses 
2950: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
2960: 74 68 65 20 6a 6f 69 6e 20 61 72 65 0a 2a 2a 20  the join are.** 
2970: 61 6c 73 6f 20 61 74 74 61 63 68 65 64 20 74 6f  also attached to
2980: 20 74 68 65 20 6c 65 66 74 20 65 6e 74 72 79 2e   the left entry.
2990: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
29a0: 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65 20  ine returns the 
29b0: 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73  number of errors
29c0: 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2f   encountered..*/
29d0: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69  .static int sqli
29e0: 74 65 50 72 6f 63 65 73 73 4a 6f 69 6e 28 50 61  teProcessJoin(Pa
29f0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c  rse *pParse, Sel
2a00: 65 63 74 20 2a 70 29 7b 0a 20 20 53 72 63 4c 69  ect *p){.  SrcLi
2a10: 73 74 20 2a 70 53 72 63 3b 20 20 20 20 20 20 20  st *pSrc;       
2a20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c             /* Al
2a30: 6c 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20  l tables in the 
2a40: 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20  FROM clause */. 
2a50: 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20   int i, j;      
2a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a70: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
2a80: 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72  s */.  struct Sr
2a90: 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4c 65 66  cList_item *pLef
2aa0: 74 3b 20 20 20 20 20 2f 2a 20 4c 65 66 74 20 74  t;     /* Left t
2ab0: 61 62 6c 65 20 62 65 69 6e 67 20 6a 6f 69 6e 65  able being joine
2ac0: 64 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72  d */.  struct Sr
2ad0: 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 52 69 67  cList_item *pRig
2ae0: 68 74 3b 20 20 20 20 2f 2a 20 52 69 67 68 74 20  ht;    /* Right 
2af0: 74 61 62 6c 65 20 62 65 69 6e 67 20 6a 6f 69 6e  table being join
2b00: 65 64 20 2a 2f 0a 0a 20 20 70 53 72 63 20 3d 20  ed */..  pSrc = 
2b10: 70 2d 3e 70 53 72 63 3b 0a 20 20 70 4c 65 66 74  p->pSrc;.  pLeft
2b20: 20 3d 20 26 70 53 72 63 2d 3e 61 5b 30 5d 3b 0a   = &pSrc->a[0];.
2b30: 20 20 70 52 69 67 68 74 20 3d 20 26 70 4c 65 66    pRight = &pLef
2b40: 74 5b 31 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  t[1];.  for(i=0;
2b50: 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63 2d 31 3b   i<pSrc->nSrc-1;
2b60: 20 69 2b 2b 2c 20 70 52 69 67 68 74 2b 2b 2c 20   i++, pRight++, 
2b70: 70 4c 65 66 74 2b 2b 29 7b 0a 20 20 20 20 54 61  pLeft++){.    Ta
2b80: 62 6c 65 20 2a 70 4c 65 66 74 54 61 62 20 3d 20  ble *pLeftTab = 
2b90: 70 4c 65 66 74 2d 3e 70 54 61 62 3b 0a 20 20 20  pLeft->pTab;.   
2ba0: 20 54 61 62 6c 65 20 2a 70 52 69 67 68 74 54 61   Table *pRightTa
2bb0: 62 20 3d 20 70 52 69 67 68 74 2d 3e 70 54 61 62  b = pRight->pTab
2bc0: 3b 0a 20 20 20 20 69 6e 74 20 69 73 4f 75 74 65  ;.    int isOute
2bd0: 72 3b 0a 0a 20 20 20 20 69 66 28 20 4e 45 56 45  r;..    if( NEVE
2be0: 52 28 70 4c 65 66 74 54 61 62 3d 3d 30 20 7c 7c  R(pLeftTab==0 ||
2bf0: 20 70 52 69 67 68 74 54 61 62 3d 3d 30 29 20 29   pRightTab==0) )
2c00: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
2c10: 73 4f 75 74 65 72 20 3d 20 28 70 52 69 67 68 74  sOuter = (pRight
2c20: 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f  ->jointype & JT_
2c30: 4f 55 54 45 52 29 21 3d 30 3b 0a 0a 20 20 20 20  OUTER)!=0;..    
2c40: 2f 2a 20 57 68 65 6e 20 74 68 65 20 4e 41 54 55  /* When the NATU
2c50: 52 41 4c 20 6b 65 79 77 6f 72 64 20 69 73 20 70  RAL keyword is p
2c60: 72 65 73 65 6e 74 2c 20 61 64 64 20 57 48 45 52  resent, add WHER
2c70: 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 66  E clause terms f
2c80: 6f 72 0a 20 20 20 20 2a 2a 20 65 76 65 72 79 20  or.    ** every 
2c90: 63 6f 6c 75 6d 6e 20 74 68 61 74 20 74 68 65 20  column that the 
2ca0: 74 77 6f 20 74 61 62 6c 65 73 20 68 61 76 65 20  two tables have 
2cb0: 69 6e 20 63 6f 6d 6d 6f 6e 2e 0a 20 20 20 20 2a  in common..    *
2cc0: 2f 0a 20 20 20 20 69 66 28 20 70 52 69 67 68 74  /.    if( pRight
2cd0: 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f  ->jointype & JT_
2ce0: 4e 41 54 55 52 41 4c 20 29 7b 0a 20 20 20 20 20  NATURAL ){.     
2cf0: 20 69 66 28 20 70 52 69 67 68 74 2d 3e 70 4f 6e   if( pRight->pOn
2d00: 20 7c 7c 20 70 52 69 67 68 74 2d 3e 70 55 73 69   || pRight->pUsi
2d10: 6e 67 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ng ){.        sq
2d20: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
2d30: 61 72 73 65 2c 20 22 61 20 4e 41 54 55 52 41 4c  arse, "a NATURAL
2d40: 20 6a 6f 69 6e 20 6d 61 79 20 6e 6f 74 20 68 61   join may not ha
2d50: 76 65 20 22 0a 20 20 20 20 20 20 20 20 20 20 20  ve ".           
2d60: 22 61 6e 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20  "an ON or USING 
2d70: 63 6c 61 75 73 65 22 2c 20 30 29 3b 0a 20 20 20  clause", 0);.   
2d80: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
2d90: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72       }.      for
2da0: 28 6a 3d 30 3b 20 6a 3c 70 52 69 67 68 74 54 61  (j=0; j<pRightTa
2db0: 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20  b->nCol; j++){. 
2dc0: 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61         char *zNa
2dd0: 6d 65 3b 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  me;   /* Name of
2de0: 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 72   column in the r
2df0: 69 67 68 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20  ight table */.  
2e00: 20 20 20 20 20 20 69 6e 74 20 69 4c 65 66 74 3b        int iLeft;
2e10: 20 20 20 20 20 2f 2a 20 4d 61 74 63 68 69 6e 67       /* Matching
2e20: 20 6c 65 66 74 20 74 61 62 6c 65 20 2a 2f 0a 20   left table */. 
2e30: 20 20 20 20 20 20 20 69 6e 74 20 69 4c 65 66 74         int iLeft
2e40: 43 6f 6c 3b 20 20 2f 2a 20 4d 61 74 63 68 69 6e  Col;  /* Matchin
2e50: 67 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20  g column in the 
2e60: 6c 65 66 74 20 74 61 62 6c 65 20 2a 2f 0a 0a 20  left table */.. 
2e70: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 70         zName = p
2e80: 52 69 67 68 74 54 61 62 2d 3e 61 43 6f 6c 5b 6a  RightTab->aCol[j
2e90: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ].zName;.       
2ea0: 20 69 66 28 20 74 61 62 6c 65 41 6e 64 43 6f 6c   if( tableAndCol
2eb0: 75 6d 6e 49 6e 64 65 78 28 70 53 72 63 2c 20 69  umnIndex(pSrc, i
2ec0: 2b 31 2c 20 7a 4e 61 6d 65 2c 20 26 69 4c 65 66  +1, zName, &iLef
2ed0: 74 2c 20 26 69 4c 65 66 74 43 6f 6c 29 20 29 7b  t, &iLeftCol) ){
2ee0: 0a 20 20 20 20 20 20 20 20 20 20 61 64 64 57 68  .          addWh
2ef0: 65 72 65 54 65 72 6d 28 70 50 61 72 73 65 2c 20  ereTerm(pParse, 
2f00: 70 53 72 63 2c 20 69 4c 65 66 74 2c 20 69 4c 65  pSrc, iLeft, iLe
2f10: 66 74 43 6f 6c 2c 20 69 2b 31 2c 20 6a 2c 0a 20  ftCol, i+1, j,. 
2f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f30: 20 20 20 20 20 20 69 73 4f 75 74 65 72 2c 20 26        isOuter, &
2f40: 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20  p->pWhere);.    
2f50: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
2f60: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 69 73 61    }..    /* Disa
2f70: 6c 6c 6f 77 20 62 6f 74 68 20 4f 4e 20 61 6e 64  llow both ON and
2f80: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20 69   USING clauses i
2f90: 6e 20 74 68 65 20 73 61 6d 65 20 6a 6f 69 6e 0a  n the same join.
2fa0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
2fb0: 52 69 67 68 74 2d 3e 70 4f 6e 20 26 26 20 70 52  Right->pOn && pR
2fc0: 69 67 68 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a  ight->pUsing ){.
2fd0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
2fe0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63  orMsg(pParse, "c
2ff0: 61 6e 6e 6f 74 20 68 61 76 65 20 62 6f 74 68 20  annot have both 
3000: 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 22 0a 20  ON and USING ". 
3010: 20 20 20 20 20 20 20 22 63 6c 61 75 73 65 73 20         "clauses 
3020: 69 6e 20 74 68 65 20 73 61 6d 65 20 6a 6f 69 6e  in the same join
3030: 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
3040: 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f   1;.    }..    /
3050: 2a 20 41 64 64 20 74 68 65 20 4f 4e 20 63 6c 61  * Add the ON cla
3060: 75 73 65 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  use to the end o
3070: 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
3080: 73 65 2c 20 63 6f 6e 6e 65 63 74 65 64 20 62 79  se, connected by
3090: 0a 20 20 20 20 2a 2a 20 61 6e 20 41 4e 44 20 6f  .    ** an AND o
30a0: 70 65 72 61 74 6f 72 2e 0a 20 20 20 20 2a 2f 0a  perator..    */.
30b0: 20 20 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e      if( pRight->
30c0: 70 4f 6e 20 29 7b 0a 20 20 20 20 20 20 69 66 28  pOn ){.      if(
30d0: 20 69 73 4f 75 74 65 72 20 29 20 73 65 74 4a 6f   isOuter ) setJo
30e0: 69 6e 45 78 70 72 28 70 52 69 67 68 74 2d 3e 70  inExpr(pRight->p
30f0: 4f 6e 2c 20 70 52 69 67 68 74 2d 3e 69 43 75 72  On, pRight->iCur
3100: 73 6f 72 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70  sor);.      p->p
3110: 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45  Where = sqlite3E
3120: 78 70 72 41 6e 64 28 70 50 61 72 73 65 2d 3e 64  xprAnd(pParse->d
3130: 62 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20 70 52  b, p->pWhere, pR
3140: 69 67 68 74 2d 3e 70 4f 6e 29 3b 0a 20 20 20 20  ight->pOn);.    
3150: 20 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20 3d 20    pRight->pOn = 
3160: 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  0;.    }..    /*
3170: 20 43 72 65 61 74 65 20 65 78 74 72 61 20 74 65   Create extra te
3180: 72 6d 73 20 6f 6e 20 74 68 65 20 57 48 45 52 45  rms on the WHERE
3190: 20 63 6c 61 75 73 65 20 66 6f 72 20 65 61 63 68   clause for each
31a0: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64 0a 20 20   column named.  
31b0: 20 20 2a 2a 20 69 6e 20 74 68 65 20 55 53 49 4e    ** in the USIN
31c0: 47 20 63 6c 61 75 73 65 2e 20 20 45 78 61 6d 70  G clause.  Examp
31d0: 6c 65 3a 20 49 66 20 74 68 65 20 74 77 6f 20 74  le: If the two t
31e0: 61 62 6c 65 73 20 74 6f 20 62 65 20 6a 6f 69 6e  ables to be join
31f0: 65 64 20 61 72 65 20 0a 20 20 20 20 2a 2a 20 41  ed are .    ** A
3200: 20 61 6e 64 20 42 20 61 6e 64 20 74 68 65 20 55   and B and the U
3210: 53 49 4e 47 20 63 6c 61 75 73 65 20 6e 61 6d 65  SING clause name
3220: 73 20 58 2c 20 59 2c 20 61 6e 64 20 5a 2c 20 74  s X, Y, and Z, t
3230: 68 65 6e 20 61 64 64 20 74 68 69 73 0a 20 20 20  hen add this.   
3240: 20 2a 2a 20 74 6f 20 74 68 65 20 57 48 45 52 45   ** to the WHERE
3250: 20 63 6c 61 75 73 65 3a 20 20 20 20 41 2e 58 3d   clause:    A.X=
3260: 42 2e 58 20 41 4e 44 20 41 2e 59 3d 42 2e 59 20  B.X AND A.Y=B.Y 
3270: 41 4e 44 20 41 2e 5a 3d 42 2e 5a 0a 20 20 20 20  AND A.Z=B.Z.    
3280: 2a 2a 20 52 65 70 6f 72 74 20 61 6e 20 65 72 72  ** Report an err
3290: 6f 72 20 69 66 20 61 6e 79 20 63 6f 6c 75 6d 6e  or if any column
32a0: 20 6d 65 6e 74 69 6f 6e 65 64 20 69 6e 20 74 68   mentioned in th
32b0: 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 69  e USING clause i
32c0: 73 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 63 6f 6e  s.    ** not con
32d0: 74 61 69 6e 65 64 20 69 6e 20 62 6f 74 68 20 74  tained in both t
32e0: 61 62 6c 65 73 20 74 6f 20 62 65 20 6a 6f 69 6e  ables to be join
32f0: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ed..    */.    i
3300: 66 28 20 70 52 69 67 68 74 2d 3e 70 55 73 69 6e  f( pRight->pUsin
3310: 67 20 29 7b 0a 20 20 20 20 20 20 49 64 4c 69 73  g ){.      IdLis
3320: 74 20 2a 70 4c 69 73 74 20 3d 20 70 52 69 67 68  t *pList = pRigh
3330: 74 2d 3e 70 55 73 69 6e 67 3b 0a 20 20 20 20 20  t->pUsing;.     
3340: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4c 69 73   for(j=0; j<pLis
3350: 74 2d 3e 6e 49 64 3b 20 6a 2b 2b 29 7b 0a 20 20  t->nId; j++){.  
3360: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d        char *zNam
3370: 65 3b 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f  e;     /* Name o
3380: 66 20 74 68 65 20 74 65 72 6d 20 69 6e 20 74 68  f the term in th
3390: 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 2a  e USING clause *
33a0: 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4c  /.        int iL
33b0: 65 66 74 3b 20 20 20 20 20 20 20 2f 2a 20 54 61  eft;       /* Ta
33c0: 62 6c 65 20 6f 6e 20 74 68 65 20 6c 65 66 74 20  ble on the left 
33d0: 77 69 74 68 20 6d 61 74 63 68 69 6e 67 20 63 6f  with matching co
33e0: 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 20  lumn name */.   
33f0: 20 20 20 20 20 69 6e 74 20 69 4c 65 66 74 43 6f       int iLeftCo
3400: 6c 3b 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20  l;    /* Column 
3410: 6e 75 6d 62 65 72 20 6f 66 20 6d 61 74 63 68 69  number of matchi
3420: 6e 67 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74 68 65  ng column on the
3430: 20 6c 65 66 74 20 2a 2f 0a 20 20 20 20 20 20 20   left */.       
3440: 20 69 6e 74 20 69 52 69 67 68 74 43 6f 6c 3b 20   int iRightCol; 
3450: 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62    /* Column numb
3460: 65 72 20 6f 66 20 6d 61 74 63 68 69 6e 67 20 63  er of matching c
3470: 6f 6c 75 6d 6e 20 6f 6e 20 74 68 65 20 72 69 67  olumn on the rig
3480: 68 74 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 7a  ht */..        z
3490: 4e 61 6d 65 20 3d 20 70 4c 69 73 74 2d 3e 61 5b  Name = pList->a[
34a0: 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  j].zName;.      
34b0: 20 20 69 52 69 67 68 74 43 6f 6c 20 3d 20 63 6f    iRightCol = co
34c0: 6c 75 6d 6e 49 6e 64 65 78 28 70 52 69 67 68 74  lumnIndex(pRight
34d0: 54 61 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab, zName);.   
34e0: 20 20 20 20 20 69 66 28 20 69 52 69 67 68 74 43       if( iRightC
34f0: 6f 6c 3c 30 0a 20 20 20 20 20 20 20 20 20 7c 7c  ol<0.         ||
3500: 20 21 74 61 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e   !tableAndColumn
3510: 49 6e 64 65 78 28 70 53 72 63 2c 20 69 2b 31 2c  Index(pSrc, i+1,
3520: 20 7a 4e 61 6d 65 2c 20 26 69 4c 65 66 74 2c 20   zName, &iLeft, 
3530: 26 69 4c 65 66 74 43 6f 6c 29 0a 20 20 20 20 20  &iLeftCol).     
3540: 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
3550: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
3560: 70 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20  pParse, "cannot 
3570: 6a 6f 69 6e 20 75 73 69 6e 67 20 63 6f 6c 75 6d  join using colum
3580: 6e 20 25 73 20 2d 20 63 6f 6c 75 6d 6e 20 22 0a  n %s - column ".
3590: 20 20 20 20 20 20 20 20 20 20 20 20 22 6e 6f 74              "not
35a0: 20 70 72 65 73 65 6e 74 20 69 6e 20 62 6f 74 68   present in both
35b0: 20 74 61 62 6c 65 73 22 2c 20 7a 4e 61 6d 65 29   tables", zName)
35c0: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
35d0: 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a  rn 1;.        }.
35e0: 20 20 20 20 20 20 20 20 61 64 64 57 68 65 72 65          addWhere
35f0: 54 65 72 6d 28 70 50 61 72 73 65 2c 20 70 53 72  Term(pParse, pSr
3600: 63 2c 20 69 4c 65 66 74 2c 20 69 4c 65 66 74 43  c, iLeft, iLeftC
3610: 6f 6c 2c 20 69 2b 31 2c 20 69 52 69 67 68 74 43  ol, i+1, iRightC
3620: 6f 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ol,.            
3630: 20 20 20 20 20 20 20 20 20 69 73 4f 75 74 65 72           isOuter
3640: 2c 20 26 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20  , &p->pWhere);. 
3650: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
3660: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
3670: 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 63 6f 64  /*.** Insert cod
3680: 65 20 69 6e 74 6f 20 22 76 22 20 74 68 61 74 20  e into "v" that 
3690: 77 69 6c 6c 20 70 75 73 68 20 74 68 65 20 72 65  will push the re
36a0: 63 6f 72 64 20 6f 6e 20 74 68 65 20 74 6f 70 20  cord on the top 
36b0: 6f 66 20 74 68 65 0a 2a 2a 20 73 74 61 63 6b 20  of the.** stack 
36c0: 69 6e 74 6f 20 74 68 65 20 73 6f 72 74 65 72 2e  into the sorter.
36d0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
36e0: 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 0a  pushOntoSorter(.
36f0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
3700: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
3710: 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
3720: 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
3730: 42 79 2c 20 20 20 20 2f 2a 20 54 68 65 20 4f 52  By,    /* The OR
3740: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  DER BY clause */
3750: 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  .  Select *pSele
3760: 63 74 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ct,       /* The
3770: 20 77 68 6f 6c 65 20 53 45 4c 45 43 54 20 73 74   whole SELECT st
3780: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  atement */.  int
3790: 20 72 65 67 44 61 74 61 20 20 20 20 20 20 20 20   regData        
37a0: 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20      /* Register 
37b0: 68 6f 6c 64 69 6e 67 20 64 61 74 61 20 74 6f 20  holding data to 
37c0: 62 65 20 73 6f 72 74 65 64 20 2a 2f 0a 29 7b 0a  be sorted */.){.
37d0: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
37e0: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
37f0: 20 6e 45 78 70 72 20 3d 20 70 4f 72 64 65 72 42   nExpr = pOrderB
3800: 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 69 6e 74 20  y->nExpr;.  int 
3810: 72 65 67 42 61 73 65 20 3d 20 73 71 6c 69 74 65  regBase = sqlite
3820: 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50  3GetTempRange(pP
3830: 61 72 73 65 2c 20 6e 45 78 70 72 2b 32 29 3b 0a  arse, nExpr+2);.
3840: 20 20 69 6e 74 20 72 65 67 52 65 63 6f 72 64 20    int regRecord 
3850: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
3860: 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 69  Reg(pParse);.  i
3870: 6e 74 20 6f 70 3b 0a 20 20 73 71 6c 69 74 65 33  nt op;.  sqlite3
3880: 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70  ExprCacheClear(p
3890: 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65  Parse);.  sqlite
38a0: 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73  3ExprCodeExprLis
38b0: 74 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72  t(pParse, pOrder
38c0: 42 79 2c 20 72 65 67 42 61 73 65 2c 20 30 29 3b  By, regBase, 0);
38d0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
38e0: 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65 71 75 65  dOp2(v, OP_Seque
38f0: 6e 63 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 69  nce, pOrderBy->i
3900: 45 43 75 72 73 6f 72 2c 20 72 65 67 42 61 73 65  ECursor, regBase
3910: 2b 6e 45 78 70 72 29 3b 0a 20 20 73 71 6c 69 74  +nExpr);.  sqlit
3920: 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70  e3ExprCodeMove(p
3930: 50 61 72 73 65 2c 20 72 65 67 44 61 74 61 2c 20  Parse, regData, 
3940: 72 65 67 42 61 73 65 2b 6e 45 78 70 72 2b 31 2c  regBase+nExpr+1,
3950: 20 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64   1);.  sqlite3Vd
3960: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d  beAddOp3(v, OP_M
3970: 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 42 61  akeRecord, regBa
3980: 73 65 2c 20 6e 45 78 70 72 20 2b 20 32 2c 20 72  se, nExpr + 2, r
3990: 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 69 66 28  egRecord);.  if(
39a0: 20 70 53 65 6c 65 63 74 2d 3e 73 65 6c 46 6c 61   pSelect->selFla
39b0: 67 73 20 26 20 53 46 5f 55 73 65 53 6f 72 74 65  gs & SF_UseSorte
39c0: 72 20 29 7b 0a 20 20 20 20 6f 70 20 3d 20 4f 50  r ){.    op = OP
39d0: 5f 53 6f 72 74 65 72 49 6e 73 65 72 74 3b 0a 20  _SorterInsert;. 
39e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 70 20 3d   }else{.    op =
39f0: 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 3b 0a 20   OP_IdxInsert;. 
3a00: 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
3a10: 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20 70 4f  AddOp2(v, op, pO
3a20: 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72  rderBy->iECursor
3a30: 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20  , regRecord);.  
3a40: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
3a50: 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
3a60: 67 52 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69  gRecord);.  sqli
3a70: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61  te3ReleaseTempRa
3a80: 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 42  nge(pParse, regB
3a90: 61 73 65 2c 20 6e 45 78 70 72 2b 32 29 3b 0a 20  ase, nExpr+2);. 
3aa0: 20 69 66 28 20 70 53 65 6c 65 63 74 2d 3e 69 4c   if( pSelect->iL
3ab0: 69 6d 69 74 20 29 7b 0a 20 20 20 20 69 6e 74 20  imit ){.    int 
3ac0: 61 64 64 72 31 2c 20 61 64 64 72 32 3b 0a 20 20  addr1, addr2;.  
3ad0: 20 20 69 6e 74 20 69 4c 69 6d 69 74 3b 0a 20 20    int iLimit;.  
3ae0: 20 20 69 66 28 20 70 53 65 6c 65 63 74 2d 3e 69    if( pSelect->i
3af0: 4f 66 66 73 65 74 20 29 7b 0a 20 20 20 20 20 20  Offset ){.      
3b00: 69 4c 69 6d 69 74 20 3d 20 70 53 65 6c 65 63 74  iLimit = pSelect
3b10: 2d 3e 69 4f 66 66 73 65 74 2b 31 3b 0a 20 20 20  ->iOffset+1;.   
3b20: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 4c   }else{.      iL
3b30: 69 6d 69 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e  imit = pSelect->
3b40: 69 4c 69 6d 69 74 3b 0a 20 20 20 20 7d 0a 20 20  iLimit;.    }.  
3b50: 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65    addr1 = sqlite
3b60: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
3b70: 50 5f 49 66 5a 65 72 6f 2c 20 69 4c 69 6d 69 74  P_IfZero, iLimit
3b80: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
3b90: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41  beAddOp2(v, OP_A
3ba0: 64 64 49 6d 6d 2c 20 69 4c 69 6d 69 74 2c 20 2d  ddImm, iLimit, -
3bb0: 31 29 3b 0a 20 20 20 20 61 64 64 72 32 20 3d 20  1);.    addr2 = 
3bc0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
3bd0: 30 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20  0(v, OP_Goto);. 
3be0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
3bf0: 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29  mpHere(v, addr1)
3c00: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
3c10: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4c 61  eAddOp1(v, OP_La
3c20: 73 74 2c 20 70 4f 72 64 65 72 42 79 2d 3e 69 45  st, pOrderBy->iE
3c30: 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 73 71 6c  Cursor);.    sql
3c40: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
3c50: 2c 20 4f 50 5f 44 65 6c 65 74 65 2c 20 70 4f 72  , OP_Delete, pOr
3c60: 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 29  derBy->iECursor)
3c70: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
3c80: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
3c90: 72 32 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  r2);.  }.}../*.*
3ca0: 2a 20 41 64 64 20 63 6f 64 65 20 74 6f 20 69 6d  * Add code to im
3cb0: 70 6c 65 6d 65 6e 74 20 74 68 65 20 4f 46 46 53  plement the OFFS
3cc0: 45 54 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ET.*/.static voi
3cd0: 64 20 63 6f 64 65 4f 66 66 73 65 74 28 0a 20 20  d codeOffset(.  
3ce0: 56 64 62 65 20 2a 76 2c 20 20 20 20 20 20 20 20  Vdbe *v,        
3cf0: 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
3d00: 64 65 20 69 6e 74 6f 20 74 68 69 73 20 56 4d 20  de into this VM 
3d10: 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
3d20: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45         /* The SE
3d30: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 62  LECT statement b
3d40: 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20  eing coded */.  
3d50: 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 20 20 20  int iContinue   
3d60: 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74    /* Jump here t
3d70: 6f 20 73 6b 69 70 20 74 68 65 20 63 75 72 72 65  o skip the curre
3d80: 6e 74 20 72 65 63 6f 72 64 20 2a 2f 0a 29 7b 0a  nt record */.){.
3d90: 20 20 69 66 28 20 70 2d 3e 69 4f 66 66 73 65 74    if( p->iOffset
3da0: 20 26 26 20 69 43 6f 6e 74 69 6e 75 65 21 3d 30   && iContinue!=0
3db0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72   ){.    int addr
3dc0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
3dd0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64  eAddOp2(v, OP_Ad
3de0: 64 49 6d 6d 2c 20 70 2d 3e 69 4f 66 66 73 65 74  dImm, p->iOffset
3df0: 2c 20 2d 31 29 3b 0a 20 20 20 20 61 64 64 72 20  , -1);.    addr 
3e00: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
3e10: 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e 65 67 2c  Op1(v, OP_IfNeg,
3e20: 20 70 2d 3e 69 4f 66 66 73 65 74 29 3b 0a 20 20   p->iOffset);.  
3e30: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
3e40: 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
3e50: 30 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20  0, iContinue);. 
3e60: 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
3e70: 76 2c 20 22 73 6b 69 70 20 4f 46 46 53 45 54 20  v, "skip OFFSET 
3e80: 72 65 63 6f 72 64 73 22 29 29 3b 0a 20 20 20 20  records"));.    
3e90: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
3ea0: 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20  ere(v, addr);.  
3eb0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 63  }.}../*.** Add c
3ec0: 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 63 68  ode that will ch
3ed0: 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  eck to make sure
3ee0: 20 74 68 65 20 4e 20 72 65 67 69 73 74 65 72 73   the N registers
3ef0: 20 73 74 61 72 74 69 6e 67 20 61 74 20 69 4d 65   starting at iMe
3f00: 6d 0a 2a 2a 20 66 6f 72 6d 20 61 20 64 69 73 74  m.** form a dist
3f10: 69 6e 63 74 20 65 6e 74 72 79 2e 20 20 69 54 61  inct entry.  iTa
3f20: 62 20 69 73 20 61 20 73 6f 72 74 69 6e 67 20 69  b is a sorting i
3f30: 6e 64 65 78 20 74 68 61 74 20 68 6f 6c 64 73 20  ndex that holds 
3f40: 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 73 65  previously.** se
3f50: 65 6e 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20  en combinations 
3f60: 6f 66 20 74 68 65 20 4e 20 76 61 6c 75 65 73 2e  of the N values.
3f70: 20 20 41 20 6e 65 77 20 65 6e 74 72 79 20 69 73    A new entry is
3f80: 20 6d 61 64 65 20 69 6e 20 69 54 61 62 0a 2a 2a   made in iTab.**
3f90: 20 69 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   if the current 
3fa0: 4e 20 76 61 6c 75 65 73 20 61 72 65 20 6e 65 77  N values are new
3fb0: 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a 75 6d 70 20 74  ..**.** A jump t
3fc0: 6f 20 61 64 64 72 52 65 70 65 61 74 20 69 73 20  o addrRepeat is 
3fd0: 6d 61 64 65 20 61 6e 64 20 74 68 65 20 4e 2b 31  made and the N+1
3fe0: 20 76 61 6c 75 65 73 20 61 72 65 20 70 6f 70 70   values are popp
3ff0: 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 73  ed from the.** s
4000: 74 61 63 6b 20 69 66 20 74 68 65 20 74 6f 70 20  tack if the top 
4010: 4e 20 65 6c 65 6d 65 6e 74 73 20 61 72 65 20 6e  N elements are n
4020: 6f 74 20 64 69 73 74 69 6e 63 74 2e 0a 2a 2f 0a  ot distinct..*/.
4030: 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65  static void code
4040: 44 69 73 74 69 6e 63 74 28 0a 20 20 50 61 72 73  Distinct(.  Pars
4050: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f  e *pParse,     /
4060: 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f  * Parsing and co
4070: 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f  de generating co
4080: 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69  ntext */.  int i
4090: 54 61 62 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  Tab,          /*
40a0: 20 41 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78   A sorting index
40b0: 20 75 73 65 64 20 74 6f 20 74 65 73 74 20 66 6f   used to test fo
40c0: 72 20 64 69 73 74 69 6e 63 74 6e 65 73 73 20 2a  r distinctness *
40d0: 2f 0a 20 20 69 6e 74 20 61 64 64 72 52 65 70 65  /.  int addrRepe
40e0: 61 74 2c 20 20 20 20 2f 2a 20 4a 75 6d 70 20 74  at,    /* Jump t
40f0: 6f 20 68 65 72 65 20 69 66 20 6e 6f 74 20 64 69  o here if not di
4100: 73 74 69 6e 63 74 20 2a 2f 0a 20 20 69 6e 74 20  stinct */.  int 
4110: 4e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  N,             /
4120: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d  * Number of elem
4130: 65 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69 4d  ents */.  int iM
4140: 65 6d 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  em           /* 
4150: 46 69 72 73 74 20 65 6c 65 6d 65 6e 74 20 2a 2f  First element */
4160: 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20  .){.  Vdbe *v;. 
4170: 20 69 6e 74 20 72 31 3b 0a 0a 20 20 76 20 3d 20   int r1;..  v = 
4180: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
4190: 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
41a0: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
41b0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
41c0: 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f  dOp4Int(v, OP_Fo
41d0: 75 6e 64 2c 20 69 54 61 62 2c 20 61 64 64 72 52  und, iTab, addrR
41e0: 65 70 65 61 74 2c 20 69 4d 65 6d 2c 20 4e 29 3b  epeat, iMem, N);
41f0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
4200: 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp3(v, OP_MakeR
4210: 65 63 6f 72 64 2c 20 69 4d 65 6d 2c 20 4e 2c 20  ecord, iMem, N, 
4220: 72 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  r1);.  sqlite3Vd
4230: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
4240: 64 78 49 6e 73 65 72 74 2c 20 69 54 61 62 2c 20  dxInsert, iTab, 
4250: 72 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65  r1);.  sqlite3Re
4260: 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
4270: 72 73 65 2c 20 72 31 29 3b 0a 7d 0a 0a 23 69 66  rse, r1);.}..#if
4280: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
4290: 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20  _SUBQUERY./*.** 
42a0: 47 65 6e 65 72 61 74 65 20 61 6e 20 65 72 72 6f  Generate an erro
42b0: 72 20 6d 65 73 73 61 67 65 20 77 68 65 6e 20 61  r message when a
42c0: 20 53 45 4c 45 43 54 20 69 73 20 75 73 65 64 20   SELECT is used 
42d0: 77 69 74 68 69 6e 20 61 20 73 75 62 65 78 70 72  within a subexpr
42e0: 65 73 73 69 6f 6e 0a 2a 2a 20 28 65 78 61 6d 70  ession.** (examp
42f0: 6c 65 3a 20 20 22 61 20 49 4e 20 28 53 45 4c 45  le:  "a IN (SELE
4300: 43 54 20 2a 20 46 52 4f 4d 20 74 61 62 6c 65 29  CT * FROM table)
4310: 22 29 20 62 75 74 20 69 74 20 68 61 73 20 6d 6f  ") but it has mo
4320: 72 65 20 74 68 61 6e 20 31 20 72 65 73 75 6c 74  re than 1 result
4330: 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e 20 20 57 65 20  .** column.  We 
4340: 64 6f 20 74 68 69 73 20 69 6e 20 61 20 73 75 62  do this in a sub
4350: 72 6f 75 74 69 6e 65 20 62 65 63 61 75 73 65 20  routine because 
4360: 74 68 65 20 65 72 72 6f 72 20 75 73 65 64 20 74  the error used t
4370: 6f 20 6f 63 63 75 72 0a 2a 2a 20 69 6e 20 6d 75  o occur.** in mu
4380: 6c 74 69 70 6c 65 20 70 6c 61 63 65 73 2e 20 20  ltiple places.  
4390: 28 54 68 65 20 65 72 72 6f 72 20 6f 6e 6c 79 20  (The error only 
43a0: 6f 63 63 75 72 73 20 69 6e 20 6f 6e 65 20 70 6c  occurs in one pl
43b0: 61 63 65 20 6e 6f 77 2c 20 62 75 74 20 77 65 0a  ace now, but we.
43c0: 2a 2a 20 72 65 74 61 69 6e 20 74 68 65 20 73 75  ** retain the su
43d0: 62 72 6f 75 74 69 6e 65 20 74 6f 20 6d 69 6e 69  broutine to mini
43e0: 6d 69 7a 65 20 63 6f 64 65 20 64 69 73 72 75 70  mize code disrup
43f0: 74 69 6f 6e 2e 29 0a 2a 2f 0a 73 74 61 74 69 63  tion.).*/.static
4400: 20 69 6e 74 20 63 68 65 63 6b 46 6f 72 4d 75 6c   int checkForMul
4410: 74 69 43 6f 6c 75 6d 6e 53 65 6c 65 63 74 45 72  tiColumnSelectEr
4420: 72 6f 72 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ror(.  Parse *pP
4430: 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50  arse,       /* P
4440: 61 72 73 65 20 63 6f 6e 74 65 78 74 2e 20 2a 2f  arse context. */
4450: 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70  .  SelectDest *p
4460: 44 65 73 74 2c 20 20 20 2f 2a 20 44 65 73 74 69  Dest,   /* Desti
4470: 6e 61 74 69 6f 6e 20 6f 66 20 53 45 4c 45 43 54  nation of SELECT
4480: 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e   results */.  in
4490: 74 20 6e 45 78 70 72 20 20 20 20 20 20 20 20 20  t nExpr         
44a0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
44b0: 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 72  result columns r
44c0: 65 74 75 72 6e 65 64 20 62 79 20 53 45 4c 45 43  eturned by SELEC
44d0: 54 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 65 44  T */.){.  int eD
44e0: 65 73 74 20 3d 20 70 44 65 73 74 2d 3e 65 44 65  est = pDest->eDe
44f0: 73 74 3b 0a 20 20 69 66 28 20 6e 45 78 70 72 3e  st;.  if( nExpr>
4500: 31 20 26 26 20 28 65 44 65 73 74 3d 3d 53 52 54  1 && (eDest==SRT
4510: 5f 4d 65 6d 20 7c 7c 20 65 44 65 73 74 3d 3d 53  _Mem || eDest==S
4520: 52 54 5f 53 65 74 29 20 29 7b 0a 20 20 20 20 73  RT_Set) ){.    s
4530: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
4540: 50 61 72 73 65 2c 20 22 6f 6e 6c 79 20 61 20 73  Parse, "only a s
4550: 69 6e 67 6c 65 20 72 65 73 75 6c 74 20 61 6c 6c  ingle result all
4560: 6f 77 65 64 20 66 6f 72 20 22 0a 20 20 20 20 20  owed for ".     
4570: 20 20 22 61 20 53 45 4c 45 43 54 20 74 68 61 74    "a SELECT that
4580: 20 69 73 20 70 61 72 74 20 6f 66 20 61 6e 20 65   is part of an e
4590: 78 70 72 65 73 73 69 6f 6e 22 29 3b 0a 20 20 20  xpression");.   
45a0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 65 6c   return 1;.  }el
45b0: 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  se{.    return 0
45c0: 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ;.  }.}.#endif..
45d0: 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63  /*.** An instanc
45e0: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
45f0: 6e 67 20 6f 62 6a 65 63 74 20 69 73 20 75 73 65  ng object is use
4600: 64 20 74 6f 20 72 65 63 6f 72 64 20 69 6e 66 6f  d to record info
4610: 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 0a 2a 2a  rmation about.**
4620: 20 68 6f 77 20 74 6f 20 70 72 6f 63 65 73 73 20   how to process 
4630: 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79  the DISTINCT key
4640: 77 6f 72 64 2c 20 74 6f 20 73 69 6d 70 6c 69 66  word, to simplif
4650: 79 20 70 61 73 73 69 6e 67 20 74 68 61 74 20 69  y passing that i
4660: 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 69 6e  nformation.** in
4670: 74 6f 20 74 68 65 20 73 65 6c 65 63 74 49 6e 6e  to the selectInn
4680: 65 72 4c 6f 6f 70 28 29 20 72 6f 75 74 69 6e 65  erLoop() routine
4690: 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  ..*/.typedef str
46a0: 75 63 74 20 44 69 73 74 69 6e 63 74 43 74 78 20  uct DistinctCtx 
46b0: 44 69 73 74 69 6e 63 74 43 74 78 3b 0a 73 74 72  DistinctCtx;.str
46c0: 75 63 74 20 44 69 73 74 69 6e 63 74 43 74 78 20  uct DistinctCtx 
46d0: 7b 0a 20 20 75 38 20 69 73 54 6e 63 74 3b 20 20  {.  u8 isTnct;  
46e0: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
46f0: 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77  he DISTINCT keyw
4700: 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74 20 2a  ord is present *
4710: 2f 0a 20 20 75 38 20 65 54 6e 63 74 54 79 70 65  /.  u8 eTnctType
4720: 3b 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68  ;   /* One of th
4730: 65 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  e WHERE_DISTINCT
4740: 5f 2a 20 6f 70 65 72 61 74 6f 72 73 20 2a 2f 0a  _* operators */.
4750: 20 20 69 6e 74 20 74 61 62 54 6e 63 74 3b 20 20    int tabTnct;  
4760: 20 20 2f 2a 20 45 70 68 65 6d 65 72 61 6c 20 74    /* Ephemeral t
4770: 61 62 6c 65 20 75 73 65 64 20 66 6f 72 20 44 49  able used for DI
4780: 53 54 49 4e 43 54 20 70 72 6f 63 65 73 73 69 6e  STINCT processin
4790: 67 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 54  g */.  int addrT
47a0: 6e 63 74 3b 20 20 20 2f 2a 20 41 64 64 72 65 73  nct;   /* Addres
47b0: 73 20 6f 66 20 4f 50 5f 4f 70 65 6e 45 70 68 65  s of OP_OpenEphe
47c0: 6d 65 72 61 6c 20 6f 70 63 6f 64 65 20 66 6f 72  meral opcode for
47d0: 20 74 61 62 54 6e 63 74 20 2a 2f 0a 7d 3b 0a 0a   tabTnct */.};..
47e0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
47f0: 6e 65 20 67 65 6e 65 72 61 74 65 73 20 74 68 65  ne generates the
4800: 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 69 6e   code for the in
4810: 73 69 64 65 20 6f 66 20 74 68 65 20 69 6e 6e 65  side of the inne
4820: 72 20 6c 6f 6f 70 0a 2a 2a 20 6f 66 20 61 20 53  r loop.** of a S
4830: 45 4c 45 43 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ELECT..**.** If 
4840: 73 72 63 54 61 62 20 61 6e 64 20 6e 43 6f 6c 75  srcTab and nColu
4850: 6d 6e 20 61 72 65 20 62 6f 74 68 20 7a 65 72 6f  mn are both zero
4860: 2c 20 74 68 65 6e 20 74 68 65 20 70 45 4c 69 73  , then the pELis
4870: 74 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a  t expressions.**
4880: 20 61 72 65 20 65 76 61 6c 75 61 74 65 64 20 69   are evaluated i
4890: 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 74 20 74  n order to get t
48a0: 68 65 20 64 61 74 61 20 66 6f 72 20 74 68 69 73  he data for this
48b0: 20 72 6f 77 2e 20 20 49 66 20 6e 43 6f 6c 75 6d   row.  If nColum
48c0: 6e 3e 30 0a 2a 2a 20 74 68 65 6e 20 64 61 74 61  n>0.** then data
48d0: 20 69 73 20 70 75 6c 6c 65 64 20 66 72 6f 6d 20   is pulled from 
48e0: 73 72 63 54 61 62 20 61 6e 64 20 70 45 4c 69 73  srcTab and pELis
48f0: 74 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 74  t is used only t
4900: 6f 20 67 65 74 20 74 68 65 0a 2a 2a 20 64 61 74  o get the.** dat
4910: 61 74 79 70 65 73 20 66 6f 72 20 65 61 63 68 20  atypes for each 
4920: 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 73 74 61 74 69  column..*/.stati
4930: 63 20 76 6f 69 64 20 73 65 6c 65 63 74 49 6e 6e  c void selectInn
4940: 65 72 4c 6f 6f 70 28 0a 20 20 50 61 72 73 65 20  erLoop(.  Parse 
4950: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
4960: 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20    /* The parser 
4970: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
4980: 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
4990: 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70       /* The comp
49a0: 6c 65 74 65 20 73 65 6c 65 63 74 20 73 74 61 74  lete select stat
49b0: 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65  ement being code
49c0: 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  d */.  ExprList 
49d0: 2a 70 45 4c 69 73 74 2c 20 20 20 20 20 20 20 2f  *pEList,       /
49e0: 2a 20 4c 69 73 74 20 6f 66 20 76 61 6c 75 65 73  * List of values
49f0: 20 62 65 69 6e 67 20 65 78 74 72 61 63 74 65 64   being extracted
4a00: 20 2a 2f 0a 20 20 69 6e 74 20 73 72 63 54 61 62   */.  int srcTab
4a10: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
4a20: 20 50 75 6c 6c 20 64 61 74 61 20 66 72 6f 6d 20   Pull data from 
4a30: 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20  this table */.  
4a40: 69 6e 74 20 6e 43 6f 6c 75 6d 6e 2c 20 20 20 20  int nColumn,    
4a50: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
4a60: 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
4a70: 74 68 65 20 73 6f 75 72 63 65 20 74 61 62 6c 65  the source table
4a80: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
4a90: 70 4f 72 64 65 72 42 79 2c 20 20 20 20 20 2f 2a  pOrderBy,     /*
4aa0: 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 73 6f   If not NULL, so
4ab0: 72 74 20 72 65 73 75 6c 74 73 20 75 73 69 6e 67  rt results using
4ac0: 20 74 68 69 73 20 6b 65 79 20 2a 2f 0a 20 20 44   this key */.  D
4ad0: 69 73 74 69 6e 63 74 43 74 78 20 2a 70 44 69 73  istinctCtx *pDis
4ae0: 74 69 6e 63 74 2c 20 2f 2a 20 49 66 20 6e 6f 74  tinct, /* If not
4af0: 20 4e 55 4c 4c 2c 20 69 6e 66 6f 20 6f 6e 20 68   NULL, info on h
4b00: 6f 77 20 74 6f 20 70 72 6f 63 65 73 73 20 44 49  ow to process DI
4b10: 53 54 49 4e 43 54 20 2a 2f 0a 20 20 53 65 6c 65  STINCT */.  Sele
4b20: 63 74 44 65 73 74 20 2a 70 44 65 73 74 2c 20 20  ctDest *pDest,  
4b30: 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20 64 69      /* How to di
4b40: 73 70 6f 73 65 20 6f 66 20 74 68 65 20 72 65 73  spose of the res
4b50: 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43  ults */.  int iC
4b60: 6f 6e 74 69 6e 75 65 2c 20 20 20 20 20 20 20 20  ontinue,        
4b70: 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74    /* Jump here t
4b80: 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20  o continue with 
4b90: 6e 65 78 74 20 72 6f 77 20 2a 2f 0a 20 20 69 6e  next row */.  in
4ba0: 74 20 69 42 72 65 61 6b 20 20 20 20 20 20 20 20  t iBreak        
4bb0: 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
4bc0: 72 65 20 74 6f 20 62 72 65 61 6b 20 6f 75 74 20  re to break out 
4bd0: 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f  of the inner loo
4be0: 70 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a  p */.){.  Vdbe *
4bf0: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
4c00: 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  e;.  int i;.  in
4c10: 74 20 68 61 73 44 69 73 74 69 6e 63 74 3b 20 20  t hasDistinct;  
4c20: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
4c30: 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65   the DISTINCT ke
4c40: 79 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74  yword is present
4c50: 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 73   */.  int regRes
4c60: 75 6c 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ult;            
4c70: 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 6d 65    /* Start of me
4c80: 6d 6f 72 79 20 68 6f 6c 64 69 6e 67 20 72 65 73  mory holding res
4c90: 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 69 6e 74  ult set */.  int
4ca0: 20 65 44 65 73 74 20 3d 20 70 44 65 73 74 2d 3e   eDest = pDest->
4cb0: 65 44 65 73 74 3b 20 20 20 2f 2a 20 48 6f 77 20  eDest;   /* How 
4cc0: 74 6f 20 64 69 73 70 6f 73 65 20 6f 66 20 72 65  to dispose of re
4cd0: 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69  sults */.  int i
4ce0: 50 61 72 6d 20 3d 20 70 44 65 73 74 2d 3e 69 53  Parm = pDest->iS
4cf0: 44 50 61 72 6d 3b 20 2f 2a 20 46 69 72 73 74 20  DParm; /* First 
4d00: 61 72 67 75 6d 65 6e 74 20 74 6f 20 64 69 73 70  argument to disp
4d10: 6f 73 61 6c 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  osal method */. 
4d20: 20 69 6e 74 20 6e 52 65 73 75 6c 74 43 6f 6c 3b   int nResultCol;
4d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4d40: 4e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74  Number of result
4d50: 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 0a 20 20 61   columns */..  a
4d60: 73 73 65 72 74 28 20 76 20 29 3b 0a 20 20 69 66  ssert( v );.  if
4d70: 28 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 29 20  ( NEVER(v==0) ) 
4d80: 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74  return;.  assert
4d90: 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 20  ( pEList!=0 );. 
4da0: 20 68 61 73 44 69 73 74 69 6e 63 74 20 3d 20 70   hasDistinct = p
4db0: 44 69 73 74 69 6e 63 74 20 3f 20 70 44 69 73 74  Distinct ? pDist
4dc0: 69 6e 63 74 2d 3e 65 54 6e 63 74 54 79 70 65 20  inct->eTnctType 
4dd0: 3a 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  : WHERE_DISTINCT
4de0: 5f 4e 4f 4f 50 3b 0a 20 20 69 66 28 20 70 4f 72  _NOOP;.  if( pOr
4df0: 64 65 72 42 79 3d 3d 30 20 26 26 20 21 68 61 73  derBy==0 && !has
4e00: 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20  Distinct ){.    
4e10: 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2c  codeOffset(v, p,
4e20: 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 7d   iContinue);.  }
4e30: 0a 0a 20 20 2f 2a 20 50 75 6c 6c 20 74 68 65 20  ..  /* Pull the 
4e40: 72 65 71 75 65 73 74 65 64 20 63 6f 6c 75 6d 6e  requested column
4e50: 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 43  s..  */.  if( nC
4e60: 6f 6c 75 6d 6e 3e 30 20 29 7b 0a 20 20 20 20 6e  olumn>0 ){.    n
4e70: 52 65 73 75 6c 74 43 6f 6c 20 3d 20 6e 43 6f 6c  ResultCol = nCol
4e80: 75 6d 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  umn;.  }else{.  
4e90: 20 20 6e 52 65 73 75 6c 74 43 6f 6c 20 3d 20 70    nResultCol = p
4ea0: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  EList->nExpr;.  
4eb0: 7d 0a 20 20 69 66 28 20 70 44 65 73 74 2d 3e 69  }.  if( pDest->i
4ec0: 53 64 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70  Sdst==0 ){.    p
4ed0: 44 65 73 74 2d 3e 69 53 64 73 74 20 3d 20 70 50  Dest->iSdst = pP
4ee0: 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20  arse->nMem+1;.  
4ef0: 20 20 70 44 65 73 74 2d 3e 6e 53 64 73 74 20 3d    pDest->nSdst =
4f00: 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20 20   nResultCol;.   
4f10: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
4f20: 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20 7d   nResultCol;.  }
4f30: 65 6c 73 65 7b 20 0a 20 20 20 20 61 73 73 65 72  else{ .    asser
4f40: 74 28 20 70 44 65 73 74 2d 3e 6e 53 64 73 74 3d  t( pDest->nSdst=
4f50: 3d 6e 52 65 73 75 6c 74 43 6f 6c 20 29 3b 0a 20  =nResultCol );. 
4f60: 20 7d 0a 20 20 72 65 67 52 65 73 75 6c 74 20 3d   }.  regResult =
4f70: 20 70 44 65 73 74 2d 3e 69 53 64 73 74 3b 0a 20   pDest->iSdst;. 
4f80: 20 69 66 28 20 6e 43 6f 6c 75 6d 6e 3e 30 20 29   if( nColumn>0 )
4f90: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
4fa0: 3c 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a  <nColumn; i++){.
4fb0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
4fc0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
4fd0: 6c 75 6d 6e 2c 20 73 72 63 54 61 62 2c 20 69 2c  lumn, srcTab, i,
4fe0: 20 72 65 67 52 65 73 75 6c 74 2b 69 29 3b 0a 20   regResult+i);. 
4ff0: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
5000: 20 65 44 65 73 74 21 3d 53 52 54 5f 45 78 69 73   eDest!=SRT_Exis
5010: 74 73 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  ts ){.    /* If 
5020: 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20  the destination 
5030: 69 73 20 61 6e 20 45 58 49 53 54 53 28 2e 2e 2e  is an EXISTS(...
5040: 29 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68  ) expression, th
5050: 65 20 61 63 74 75 61 6c 0a 20 20 20 20 2a 2a 20  e actual.    ** 
5060: 76 61 6c 75 65 73 20 72 65 74 75 72 6e 65 64 20  values returned 
5070: 62 79 20 74 68 65 20 53 45 4c 45 43 54 20 61 72  by the SELECT ar
5080: 65 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e 0a  e not required..
5090: 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
50a0: 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72  e3ExprCacheClear
50b0: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 73 71  (pParse);.    sq
50c0: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70  lite3ExprCodeExp
50d0: 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 45  rList(pParse, pE
50e0: 4c 69 73 74 2c 20 72 65 67 52 65 73 75 6c 74 2c  List, regResult,
50f0: 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70   eDest==SRT_Outp
5100: 75 74 29 3b 0a 20 20 7d 0a 20 20 6e 43 6f 6c 75  ut);.  }.  nColu
5110: 6d 6e 20 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b  mn = nResultCol;
5120: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 44 49  ..  /* If the DI
5130: 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 77  STINCT keyword w
5140: 61 73 20 70 72 65 73 65 6e 74 20 6f 6e 20 74 68  as present on th
5150: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
5160: 6e 74 0a 20 20 2a 2a 20 61 6e 64 20 74 68 69 73  nt.  ** and this
5170: 20 72 6f 77 20 68 61 73 20 62 65 65 6e 20 73 65   row has been se
5180: 65 6e 20 62 65 66 6f 72 65 2c 20 74 68 65 6e 20  en before, then 
5190: 64 6f 20 6e 6f 74 20 6d 61 6b 65 20 74 68 69 73  do not make this
51a0: 20 72 6f 77 0a 20 20 2a 2a 20 70 61 72 74 20 6f   row.  ** part o
51b0: 66 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 20 20  f the result..  
51c0: 2a 2f 0a 20 20 69 66 28 20 68 61 73 44 69 73 74  */.  if( hasDist
51d0: 69 6e 63 74 20 29 7b 0a 20 20 20 20 61 73 73 65  inct ){.    asse
51e0: 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b  rt( pEList!=0 );
51f0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45 4c  .    assert( pEL
5200: 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 6e 43 6f 6c  ist->nExpr==nCol
5210: 75 6d 6e 20 29 3b 0a 20 20 20 20 73 77 69 74 63  umn );.    switc
5220: 68 28 20 70 44 69 73 74 69 6e 63 74 2d 3e 65 54  h( pDistinct->eT
5230: 6e 63 74 54 79 70 65 20 29 7b 0a 20 20 20 20 20  nctType ){.     
5240: 20 63 61 73 65 20 57 48 45 52 45 5f 44 49 53 54   case WHERE_DIST
5250: 49 4e 43 54 5f 4f 52 44 45 52 45 44 3a 20 7b 0a  INCT_ORDERED: {.
5260: 20 20 20 20 20 20 20 20 56 64 62 65 4f 70 20 2a          VdbeOp *
5270: 70 4f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  pOp;            
5280: 2f 2a 20 4e 6f 20 6c 6f 6e 67 65 72 20 72 65 71  /* No longer req
5290: 75 69 72 65 64 20 4f 70 65 6e 45 70 68 65 6d 65  uired OpenEpheme
52a0: 72 61 6c 20 69 6e 73 74 72 2e 20 2a 2f 0a 20 20  ral instr. */.  
52b0: 20 20 20 20 20 20 69 6e 74 20 69 4a 75 6d 70 3b        int iJump;
52c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
52d0: 20 4a 75 6d 70 20 64 65 73 74 69 6e 61 74 69 6f   Jump destinatio
52e0: 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74  n */.        int
52f0: 20 72 65 67 50 72 65 76 3b 20 20 20 20 20 20 20   regPrev;       
5300: 20 20 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73       /* Previous
5310: 20 72 6f 77 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a   row content */.
5320: 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f  .        /* Allo
5330: 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 74  cate space for t
5340: 68 65 20 70 72 65 76 69 6f 75 73 20 72 6f 77 20  he previous row 
5350: 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 67 50 72  */.        regPr
5360: 65 76 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  ev = pParse->nMe
5370: 6d 2b 31 3b 0a 20 20 20 20 20 20 20 20 70 50 61  m+1;.        pPa
5380: 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 43 6f  rse->nMem += nCo
5390: 6c 75 6d 6e 3b 0a 0a 20 20 20 20 20 20 20 20 2f  lumn;..        /
53a0: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 4f 50 5f  * Change the OP_
53b0: 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 63 6f  OpenEphemeral co
53c0: 64 65 64 20 65 61 72 6c 69 65 72 20 74 6f 20 61  ded earlier to a
53d0: 6e 20 4f 50 5f 4e 75 6c 6c 0a 20 20 20 20 20 20  n OP_Null.      
53e0: 20 20 2a 2a 20 73 65 74 73 20 74 68 65 20 4d 45    ** sets the ME
53f0: 4d 5f 43 6c 65 61 72 65 64 20 62 69 74 20 6f 6e  M_Cleared bit on
5400: 20 74 68 65 20 66 69 72 73 74 20 72 65 67 69 73   the first regis
5410: 74 65 72 20 6f 66 20 74 68 65 0a 20 20 20 20 20  ter of the.     
5420: 20 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 20 76     ** previous v
5430: 61 6c 75 65 2e 20 20 54 68 69 73 20 77 69 6c 6c  alue.  This will
5440: 20 63 61 75 73 65 20 74 68 65 20 4f 50 5f 4e 65   cause the OP_Ne
5450: 20 62 65 6c 6f 77 20 74 6f 20 61 6c 77 61 79 73   below to always
5460: 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 61 69 6c  .        ** fail
5470: 20 6f 6e 20 74 68 65 20 66 69 72 73 74 20 69 74   on the first it
5480: 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c  eration of the l
5490: 6f 6f 70 20 65 76 65 6e 20 69 66 20 74 68 65 20  oop even if the 
54a0: 66 69 72 73 74 0a 20 20 20 20 20 20 20 20 2a 2a  first.        **
54b0: 20 72 6f 77 20 69 73 20 61 6c 6c 20 4e 55 4c 4c   row is all NULL
54c0: 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  s..        */.  
54d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
54e0: 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c  eChangeToNoop(v,
54f0: 20 70 44 69 73 74 69 6e 63 74 2d 3e 61 64 64 72   pDistinct->addr
5500: 54 6e 63 74 29 3b 0a 20 20 20 20 20 20 20 20 70  Tnct);.        p
5510: 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  Op = sqlite3Vdbe
5520: 47 65 74 4f 70 28 76 2c 20 70 44 69 73 74 69 6e  GetOp(v, pDistin
5530: 63 74 2d 3e 61 64 64 72 54 6e 63 74 29 3b 0a 20  ct->addrTnct);. 
5540: 20 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f         pOp->opco
5550: 64 65 20 3d 20 4f 50 5f 4e 75 6c 6c 3b 0a 20 20  de = OP_Null;.  
5560: 20 20 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20        pOp->p1 = 
5570: 31 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e  1;.        pOp->
5580: 70 32 20 3d 20 72 65 67 50 72 65 76 3b 0a 0a 20  p2 = regPrev;.. 
5590: 20 20 20 20 20 20 20 69 4a 75 6d 70 20 3d 20 73         iJump = s
55a0: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
55b0: 74 41 64 64 72 28 76 29 20 2b 20 6e 43 6f 6c 75  tAddr(v) + nColu
55c0: 6d 6e 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  mn;.        for(
55d0: 69 3d 30 3b 20 69 3c 6e 43 6f 6c 75 6d 6e 3b 20  i=0; i<nColumn; 
55e0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
55f0: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d  CollSeq *pColl =
5600: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
5610: 53 65 71 28 70 50 61 72 73 65 2c 20 70 45 4c 69  Seq(pParse, pELi
5620: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b  st->a[i].pExpr);
5630: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
5640: 3c 6e 43 6f 6c 75 6d 6e 2d 31 20 29 7b 0a 20 20  <nColumn-1 ){.  
5650: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
5660: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
5670: 50 5f 4e 65 2c 20 72 65 67 52 65 73 75 6c 74 2b  P_Ne, regResult+
5680: 69 2c 20 69 4a 75 6d 70 2c 20 72 65 67 50 72 65  i, iJump, regPre
5690: 76 2b 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20  v+i);.          
56a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
56b0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
56c0: 64 4f 70 33 28 76 2c 20 4f 50 5f 45 71 2c 20 72  dOp3(v, OP_Eq, r
56d0: 65 67 52 65 73 75 6c 74 2b 69 2c 20 69 43 6f 6e  egResult+i, iCon
56e0: 74 69 6e 75 65 2c 20 72 65 67 50 72 65 76 2b 69  tinue, regPrev+i
56f0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
5700: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
5710: 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20  VdbeChangeP4(v, 
5720: 2d 31 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 20  -1, (const char 
5730: 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c  *)pColl, P4_COLL
5740: 53 45 51 29 3b 0a 20 20 20 20 20 20 20 20 20 20  SEQ);.          
5750: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
5760: 65 50 35 28 76 2c 20 53 51 4c 49 54 45 5f 4e 55  eP5(v, SQLITE_NU
5770: 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 20 20 7d  LLEQ);.        }
5780: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
5790: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
57a0: 65 6e 74 41 64 64 72 28 76 29 3d 3d 69 4a 75 6d  entAddr(v)==iJum
57b0: 70 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  p );.        sql
57c0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
57d0: 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 65 67 52 65  , OP_Copy, regRe
57e0: 73 75 6c 74 2c 20 72 65 67 50 72 65 76 2c 20 6e  sult, regPrev, n
57f0: 43 6f 6c 75 6d 6e 2d 31 29 3b 0a 20 20 20 20 20  Column-1);.     
5800: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
5810: 7d 0a 0a 20 20 20 20 20 20 63 61 73 65 20 57 48  }..      case WH
5820: 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49  ERE_DISTINCT_UNI
5830: 51 55 45 3a 20 7b 0a 20 20 20 20 20 20 20 20 73  QUE: {.        s
5840: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
5850: 54 6f 4e 6f 6f 70 28 76 2c 20 70 44 69 73 74 69  ToNoop(v, pDisti
5860: 6e 63 74 2d 3e 61 64 64 72 54 6e 63 74 29 3b 0a  nct->addrTnct);.
5870: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
5880: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 64 65       }..      de
5890: 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 20  fault: {.       
58a0: 20 61 73 73 65 72 74 28 20 70 44 69 73 74 69 6e   assert( pDistin
58b0: 63 74 2d 3e 65 54 6e 63 74 54 79 70 65 3d 3d 57  ct->eTnctType==W
58c0: 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e  HERE_DISTINCT_UN
58d0: 4f 52 44 45 52 45 44 20 29 3b 0a 20 20 20 20 20  ORDERED );.     
58e0: 20 20 20 63 6f 64 65 44 69 73 74 69 6e 63 74 28     codeDistinct(
58f0: 70 50 61 72 73 65 2c 20 70 44 69 73 74 69 6e 63  pParse, pDistinc
5900: 74 2d 3e 74 61 62 54 6e 63 74 2c 20 69 43 6f 6e  t->tabTnct, iCon
5910: 74 69 6e 75 65 2c 20 6e 43 6f 6c 75 6d 6e 2c 20  tinue, nColumn, 
5920: 72 65 67 52 65 73 75 6c 74 29 3b 0a 20 20 20 20  regResult);.    
5930: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
5940: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
5950: 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a   pOrderBy==0 ){.
5960: 20 20 20 20 20 20 63 6f 64 65 4f 66 66 73 65 74        codeOffset
5970: 28 76 2c 20 70 2c 20 69 43 6f 6e 74 69 6e 75 65  (v, p, iContinue
5980: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
5990: 73 77 69 74 63 68 28 20 65 44 65 73 74 20 29 7b  switch( eDest ){
59a0: 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20  .    /* In this 
59b0: 6d 6f 64 65 2c 20 77 72 69 74 65 20 65 61 63 68  mode, write each
59c0: 20 71 75 65 72 79 20 72 65 73 75 6c 74 20 74 6f   query result to
59d0: 20 74 68 65 20 6b 65 79 20 6f 66 20 74 68 65 20   the key of the 
59e0: 74 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 2a 2a  temporary.    **
59f0: 20 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a 20 20   table iParm..  
5a00: 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c    */.#ifndef SQL
5a10: 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e  ITE_OMIT_COMPOUN
5a20: 44 5f 53 45 4c 45 43 54 0a 20 20 20 20 63 61 73  D_SELECT.    cas
5a30: 65 20 53 52 54 5f 55 6e 69 6f 6e 3a 20 7b 0a 20  e SRT_Union: {. 
5a40: 20 20 20 20 20 69 6e 74 20 72 31 3b 0a 20 20 20       int r1;.   
5a50: 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47     r1 = sqlite3G
5a60: 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
5a70: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
5a80: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
5a90: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67  _MakeRecord, reg
5aa0: 52 65 73 75 6c 74 2c 20 6e 43 6f 6c 75 6d 6e 2c  Result, nColumn,
5ab0: 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   r1);.      sqli
5ac0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
5ad0: 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69   OP_IdxInsert, i
5ae0: 50 61 72 6d 2c 20 72 31 29 3b 0a 20 20 20 20 20  Parm, r1);.     
5af0: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
5b00: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
5b10: 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  1);.      break;
5b20: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
5b30: 6f 6e 73 74 72 75 63 74 20 61 20 72 65 63 6f 72  onstruct a recor
5b40: 64 20 66 72 6f 6d 20 74 68 65 20 71 75 65 72 79  d from the query
5b50: 20 72 65 73 75 6c 74 2c 20 62 75 74 20 69 6e 73   result, but ins
5b60: 74 65 61 64 20 6f 66 0a 20 20 20 20 2a 2a 20 73  tead of.    ** s
5b70: 61 76 69 6e 67 20 74 68 61 74 20 72 65 63 6f 72  aving that recor
5b80: 64 2c 20 75 73 65 20 69 74 20 61 73 20 61 20 6b  d, use it as a k
5b90: 65 79 20 74 6f 20 64 65 6c 65 74 65 20 65 6c 65  ey to delete ele
5ba0: 6d 65 6e 74 73 20 66 72 6f 6d 0a 20 20 20 20 2a  ments from.    *
5bb0: 2a 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  * the temporary 
5bc0: 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a 20 20 20  table iParm..   
5bd0: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
5be0: 5f 45 78 63 65 70 74 3a 20 7b 0a 20 20 20 20 20  _Except: {.     
5bf0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5c00: 70 33 28 76 2c 20 4f 50 5f 49 64 78 44 65 6c 65  p3(v, OP_IdxDele
5c10: 74 65 2c 20 69 50 61 72 6d 2c 20 72 65 67 52 65  te, iParm, regRe
5c20: 73 75 6c 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a  sult, nColumn);.
5c30: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5c40: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f   }.#endif..    /
5c50: 2a 20 53 74 6f 72 65 20 74 68 65 20 72 65 73 75  * Store the resu
5c60: 6c 74 20 61 73 20 64 61 74 61 20 75 73 69 6e 67  lt as data using
5c70: 20 61 20 75 6e 69 71 75 65 20 6b 65 79 2e 0a 20   a unique key.. 
5c80: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
5c90: 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20 20 63 61  RT_Table:.    ca
5ca0: 73 65 20 53 52 54 5f 45 70 68 65 6d 54 61 62 3a  se SRT_EphemTab:
5cb0: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31 20   {.      int r1 
5cc0: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
5cd0: 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
5ce0: 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65     testcase( eDe
5cf0: 73 74 3d 3d 53 52 54 5f 54 61 62 6c 65 20 29 3b  st==SRT_Table );
5d00: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
5d10: 20 65 44 65 73 74 3d 3d 53 52 54 5f 45 70 68 65   eDest==SRT_Ephe
5d20: 6d 54 61 62 20 29 3b 0a 20 20 20 20 20 20 73 71  mTab );.      sq
5d30: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
5d40: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
5d50: 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 43 6f  , regResult, nCo
5d60: 6c 75 6d 6e 2c 20 72 31 29 3b 0a 20 20 20 20 20  lumn, r1);.     
5d70: 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b   if( pOrderBy ){
5d80: 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74  .        pushOnt
5d90: 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20  oSorter(pParse, 
5da0: 70 4f 72 64 65 72 42 79 2c 20 70 2c 20 72 31 29  pOrderBy, p, r1)
5db0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
5dc0: 20 20 20 20 20 20 20 69 6e 74 20 72 32 20 3d 20         int r2 = 
5dd0: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
5de0: 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
5df0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
5e00: 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f  dOp2(v, OP_NewRo
5e10: 77 69 64 2c 20 69 50 61 72 6d 2c 20 72 32 29 3b  wid, iParm, r2);
5e20: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
5e30: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
5e40: 5f 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20  _Insert, iParm, 
5e50: 72 31 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 20  r1, r2);.       
5e60: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
5e70: 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41  geP5(v, OPFLAG_A
5e80: 50 50 45 4e 44 29 3b 0a 20 20 20 20 20 20 20 20  PPEND);.        
5e90: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
5ea0: 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 32  mpReg(pParse, r2
5eb0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
5ec0: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
5ed0: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
5ee0: 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  1);.      break;
5ef0: 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20  .    }..#ifndef 
5f00: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
5f10: 55 45 52 59 0a 20 20 20 20 2f 2a 20 49 66 20 77  UERY.    /* If w
5f20: 65 20 61 72 65 20 63 72 65 61 74 69 6e 67 20 61  e are creating a
5f30: 20 73 65 74 20 66 6f 72 20 61 6e 20 22 65 78 70   set for an "exp
5f40: 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e  r IN (SELECT ...
5f50: 29 22 20 63 6f 6e 73 74 72 75 63 74 2c 0a 20 20  )" construct,.  
5f60: 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65 20    ** then there 
5f70: 73 68 6f 75 6c 64 20 62 65 20 61 20 73 69 6e 67  should be a sing
5f80: 6c 65 20 69 74 65 6d 20 6f 6e 20 74 68 65 20 73  le item on the s
5f90: 74 61 63 6b 2e 20 20 57 72 69 74 65 20 74 68 69  tack.  Write thi
5fa0: 73 0a 20 20 20 20 2a 2a 20 69 74 65 6d 20 69 6e  s.    ** item in
5fb0: 74 6f 20 74 68 65 20 73 65 74 20 74 61 62 6c 65  to the set table
5fc0: 20 77 69 74 68 20 62 6f 67 75 73 20 64 61 74 61   with bogus data
5fd0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
5fe0: 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20  e SRT_Set: {.   
5ff0: 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75     assert( nColu
6000: 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 70  mn==1 );.      p
6010: 44 65 73 74 2d 3e 61 66 66 53 64 73 74 20 3d 0a  Dest->affSdst =.
6020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6030: 20 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65    sqlite3Compare
6040: 41 66 66 69 6e 69 74 79 28 70 45 4c 69 73 74 2d  Affinity(pEList-
6050: 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20 70 44 65  >a[0].pExpr, pDe
6060: 73 74 2d 3e 61 66 66 53 64 73 74 29 3b 0a 20 20  st->affSdst);.  
6070: 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79      if( pOrderBy
6080: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41   ){.        /* A
6090: 74 20 66 69 72 73 74 20 67 6c 61 6e 63 65 20 79  t first glance y
60a0: 6f 75 20 77 6f 75 6c 64 20 74 68 69 6e 6b 20 77  ou would think w
60b0: 65 20 63 6f 75 6c 64 20 6f 70 74 69 6d 69 7a 65  e could optimize
60c0: 20 6f 75 74 20 74 68 65 0a 20 20 20 20 20 20 20   out the.       
60d0: 20 2a 2a 20 4f 52 44 45 52 20 42 59 20 69 6e 20   ** ORDER BY in 
60e0: 74 68 69 73 20 63 61 73 65 20 73 69 6e 63 65 20  this case since 
60f0: 74 68 65 20 6f 72 64 65 72 20 6f 66 20 65 6e 74  the order of ent
6100: 72 69 65 73 20 69 6e 20 74 68 65 20 73 65 74 0a  ries in the set.
6110: 20 20 20 20 20 20 20 20 2a 2a 20 64 6f 65 73 20          ** does 
6120: 6e 6f 74 20 6d 61 74 74 65 72 2e 20 20 42 75 74  not matter.  But
6130: 20 74 68 65 72 65 20 6d 69 67 68 74 20 62 65 20   there might be 
6140: 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 2c 20  a LIMIT clause, 
6150: 69 6e 20 77 68 69 63 68 0a 20 20 20 20 20 20 20  in which.       
6160: 20 2a 2a 20 63 61 73 65 20 74 68 65 20 6f 72 64   ** case the ord
6170: 65 72 20 64 6f 65 73 20 6d 61 74 74 65 72 20 2a  er does matter *
6180: 2f 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e  /.        pushOn
6190: 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c  toSorter(pParse,
61a0: 20 70 4f 72 64 65 72 42 79 2c 20 70 2c 20 72 65   pOrderBy, p, re
61b0: 67 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 20 20  gResult);.      
61c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
61d0: 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47  nt r1 = sqlite3G
61e0: 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
61f0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
6200: 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
6210: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72  OP_MakeRecord, r
6220: 65 67 52 65 73 75 6c 74 2c 31 2c 72 31 2c 20 26  egResult,1,r1, &
6230: 70 44 65 73 74 2d 3e 61 66 66 53 64 73 74 2c 20  pDest->affSdst, 
6240: 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  1);.        sqli
6250: 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69  te3ExprCacheAffi
6260: 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73  nityChange(pPars
6270: 65 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 31 29  e, regResult, 1)
6280: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
6290: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
62a0: 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61  P_IdxInsert, iPa
62b0: 72 6d 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20  rm, r1);.       
62c0: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
62d0: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
62e0: 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  1);.      }.    
62f0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
6300: 20 20 20 20 2f 2a 20 49 66 20 61 6e 79 20 72 6f      /* If any ro
6310: 77 20 65 78 69 73 74 20 69 6e 20 74 68 65 20 72  w exist in the r
6320: 65 73 75 6c 74 20 73 65 74 2c 20 72 65 63 6f 72  esult set, recor
6330: 64 20 74 68 61 74 20 66 61 63 74 20 61 6e 64 20  d that fact and 
6340: 61 62 6f 72 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  abort..    */.  
6350: 20 20 63 61 73 65 20 53 52 54 5f 45 78 69 73 74    case SRT_Exist
6360: 73 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  s: {.      sqlit
6370: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
6380: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 69  OP_Integer, 1, i
6390: 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 2f 2a 20  Parm);.      /* 
63a0: 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65  The LIMIT clause
63b0: 20 77 69 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20   will terminate 
63c0: 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20  the loop for us 
63d0: 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  */.      break;.
63e0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
63f0: 20 74 68 69 73 20 69 73 20 61 20 73 63 61 6c 61   this is a scala
6400: 72 20 73 65 6c 65 63 74 20 74 68 61 74 20 69 73  r select that is
6410: 20 70 61 72 74 20 6f 66 20 61 6e 20 65 78 70 72   part of an expr
6420: 65 73 73 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20  ession, then.   
6430: 20 2a 2a 20 73 74 6f 72 65 20 74 68 65 20 72 65   ** store the re
6440: 73 75 6c 74 73 20 69 6e 20 74 68 65 20 61 70 70  sults in the app
6450: 72 6f 70 72 69 61 74 65 20 6d 65 6d 6f 72 79 20  ropriate memory 
6460: 63 65 6c 6c 20 61 6e 64 20 62 72 65 61 6b 20 6f  cell and break o
6470: 75 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  ut.    ** of the
6480: 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20   scan loop..    
6490: 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
64a0: 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  Mem: {.      ass
64b0: 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20  ert( nColumn==1 
64c0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72  );.      if( pOr
64d0: 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20  derBy ){.       
64e0: 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28   pushOntoSorter(
64f0: 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79  pParse, pOrderBy
6500: 2c 20 70 2c 20 72 65 67 52 65 73 75 6c 74 29 3b  , p, regResult);
6510: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
6520: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
6530: 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65  rCodeMove(pParse
6540: 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 69 50 61  , regResult, iPa
6550: 72 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  rm, 1);.        
6560: 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61  /* The LIMIT cla
6570: 75 73 65 20 77 69 6c 6c 20 6a 75 6d 70 20 6f 75  use will jump ou
6580: 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 66 6f  t of the loop fo
6590: 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 7d 0a  r us */.      }.
65a0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
65b0: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66   }.#endif /* #if
65c0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
65d0: 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 20 20  _SUBQUERY */..  
65e0: 20 20 2f 2a 20 53 65 6e 64 20 74 68 65 20 64 61    /* Send the da
65f0: 74 61 20 74 6f 20 74 68 65 20 63 61 6c 6c 62 61  ta to the callba
6600: 63 6b 20 66 75 6e 63 74 69 6f 6e 20 6f 72 20 74  ck function or t
6610: 6f 20 61 20 73 75 62 72 6f 75 74 69 6e 65 2e 20  o a subroutine. 
6620: 20 49 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 63   In the.    ** c
6630: 61 73 65 20 6f 66 20 61 20 73 75 62 72 6f 75 74  ase of a subrout
6640: 69 6e 65 2c 20 74 68 65 20 73 75 62 72 6f 75 74  ine, the subrout
6650: 69 6e 65 20 69 74 73 65 6c 66 20 69 73 20 72 65  ine itself is re
6660: 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 0a 20 20  sponsible for.  
6670: 20 20 2a 2a 20 70 6f 70 70 69 6e 67 20 74 68 65    ** popping the
6680: 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 73   data from the s
6690: 74 61 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tack..    */.   
66a0: 20 63 61 73 65 20 53 52 54 5f 43 6f 72 6f 75 74   case SRT_Corout
66b0: 69 6e 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52  ine:.    case SR
66c0: 54 5f 4f 75 74 70 75 74 3a 20 7b 0a 20 20 20 20  T_Output: {.    
66d0: 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73    testcase( eDes
66e0: 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65  t==SRT_Coroutine
66f0: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
6700: 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f  se( eDest==SRT_O
6710: 75 74 70 75 74 20 29 3b 0a 20 20 20 20 20 20 69  utput );.      i
6720: 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  f( pOrderBy ){. 
6730: 20 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20         int r1 = 
6740: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
6750: 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
6760: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
6770: 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp3(v, OP_MakeR
6780: 65 63 6f 72 64 2c 20 72 65 67 52 65 73 75 6c 74  ecord, regResult
6790: 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 72 31 29 3b 0a  , nColumn, r1);.
67a0: 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f          pushOnto
67b0: 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20 70  Sorter(pParse, p
67c0: 4f 72 64 65 72 42 79 2c 20 70 2c 20 72 31 29 3b  OrderBy, p, r1);
67d0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
67e0: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
67f0: 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20  Parse, r1);.    
6800: 20 20 7d 65 6c 73 65 20 69 66 28 20 65 44 65 73    }else if( eDes
6810: 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65  t==SRT_Coroutine
6820: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
6830: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
6840: 20 4f 50 5f 59 69 65 6c 64 2c 20 70 44 65 73 74   OP_Yield, pDest
6850: 2d 3e 69 53 44 50 61 72 6d 29 3b 0a 20 20 20 20  ->iSDParm);.    
6860: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
6870: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6880: 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52  p2(v, OP_ResultR
6890: 6f 77 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e  ow, regResult, n
68a0: 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20  Column);.       
68b0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
68c0: 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  eAffinityChange(
68d0: 70 50 61 72 73 65 2c 20 72 65 67 52 65 73 75 6c  pParse, regResul
68e0: 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20  t, nColumn);.   
68f0: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
6900: 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20 21 64 65  ;.    }..#if !de
6910: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
6920: 54 5f 54 52 49 47 47 45 52 29 0a 20 20 20 20 2f  T_TRIGGER).    /
6930: 2a 20 44 69 73 63 61 72 64 20 74 68 65 20 72 65  * Discard the re
6940: 73 75 6c 74 73 2e 20 20 54 68 69 73 20 69 73 20  sults.  This is 
6950: 75 73 65 64 20 66 6f 72 20 53 45 4c 45 43 54 20  used for SELECT 
6960: 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 73 69 64  statements insid
6970: 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 62 6f 64  e.    ** the bod
6980: 79 20 6f 66 20 61 20 54 52 49 47 47 45 52 2e 20  y of a TRIGGER. 
6990: 20 54 68 65 20 70 75 72 70 6f 73 65 20 6f 66 20   The purpose of 
69a0: 73 75 63 68 20 73 65 6c 65 63 74 73 20 69 73 20  such selects is 
69b0: 74 6f 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 75  to call.    ** u
69c0: 73 65 72 2d 64 65 66 69 6e 65 64 20 66 75 6e 63  ser-defined func
69d0: 74 69 6f 6e 73 20 74 68 61 74 20 68 61 76 65 20  tions that have 
69e0: 73 69 64 65 20 65 66 66 65 63 74 73 2e 20 20 57  side effects.  W
69f0: 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 0a 20 20  e do not care.  
6a00: 20 20 2a 2a 20 61 62 6f 75 74 20 74 68 65 20 61    ** about the a
6a10: 63 74 75 61 6c 20 72 65 73 75 6c 74 73 20 6f 66  ctual results of
6a20: 20 74 68 65 20 73 65 6c 65 63 74 2e 0a 20 20 20   the select..   
6a30: 20 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c 74 3a   */.    default:
6a40: 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
6a50: 20 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 63   eDest==SRT_Disc
6a60: 61 72 64 20 29 3b 0a 20 20 20 20 20 20 62 72 65  ard );.      bre
6a70: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
6a80: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20  .  }..  /* Jump 
6a90: 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
6aa0: 65 20 6c 6f 6f 70 20 69 66 20 74 68 65 20 4c 49  e loop if the LI
6ab0: 4d 49 54 20 69 73 20 72 65 61 63 68 65 64 2e 20  MIT is reached. 
6ac0: 20 45 78 63 65 70 74 2c 20 69 66 0a 20 20 2a 2a   Except, if.  **
6ad0: 20 74 68 65 72 65 20 69 73 20 61 20 73 6f 72 74   there is a sort
6ae0: 65 72 2c 20 69 6e 20 77 68 69 63 68 20 63 61 73  er, in which cas
6af0: 65 20 74 68 65 20 73 6f 72 74 65 72 20 68 61 73  e the sorter has
6b00: 20 61 6c 72 65 61 64 79 20 6c 69 6d 69 74 65 64   already limited
6b10: 0a 20 20 2a 2a 20 74 68 65 20 6f 75 74 70 75 74  .  ** the output
6b20: 20 66 6f 72 20 75 73 2e 0a 20 20 2a 2f 0a 20 20   for us..  */.  
6b30: 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d 30 20  if( pOrderBy==0 
6b40: 26 26 20 70 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a  && p->iLimit ){.
6b50: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
6b60: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 5a 65  ddOp3(v, OP_IfZe
6b70: 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 69  ro, p->iLimit, i
6b80: 42 72 65 61 6b 2c 20 2d 31 29 3b 0a 20 20 7d 0a  Break, -1);.  }.
6b90: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61  }../*.** Given a
6ba0: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  n expression lis
6bb0: 74 2c 20 67 65 6e 65 72 61 74 65 20 61 20 4b 65  t, generate a Ke
6bc0: 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  yInfo structure 
6bd0: 74 68 61 74 20 72 65 63 6f 72 64 73 0a 2a 2a 20  that records.** 
6be0: 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  the collating se
6bf0: 71 75 65 6e 63 65 20 66 6f 72 20 65 61 63 68 20  quence for each 
6c00: 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68  expression in th
6c10: 61 74 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  at expression li
6c20: 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  st..**.** If the
6c30: 20 45 78 70 72 4c 69 73 74 20 69 73 20 61 6e 20   ExprList is an 
6c40: 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55  ORDER BY or GROU
6c50: 50 20 42 59 20 63 6c 61 75 73 65 20 74 68 65 6e  P BY clause then
6c60: 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67 0a 2a   the resulting.*
6c70: 2a 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74  * KeyInfo struct
6c80: 75 72 65 20 69 73 20 61 70 70 72 6f 70 72 69 61  ure is appropria
6c90: 74 65 20 66 6f 72 20 69 6e 69 74 69 61 6c 69 7a  te for initializ
6ca0: 69 6e 67 20 61 20 76 69 72 74 75 61 6c 20 69 6e  ing a virtual in
6cb0: 64 65 78 20 74 6f 0a 2a 2a 20 69 6d 70 6c 65 6d  dex to.** implem
6cc0: 65 6e 74 20 74 68 61 74 20 63 6c 61 75 73 65 2e  ent that clause.
6cd0: 20 20 49 66 20 74 68 65 20 45 78 70 72 4c 69 73    If the ExprLis
6ce0: 74 20 69 73 20 74 68 65 20 72 65 73 75 6c 74 20  t is the result 
6cf0: 73 65 74 20 6f 66 20 61 20 53 45 4c 45 43 54 0a  set of a SELECT.
6d00: 2a 2a 20 74 68 65 6e 20 74 68 65 20 4b 65 79 49  ** then the KeyI
6d10: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 73  nfo structure is
6d20: 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72   appropriate for
6d30: 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 61 20   initializing a 
6d40: 76 69 72 74 75 61 6c 0a 2a 2a 20 69 6e 64 65 78  virtual.** index
6d50: 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 20   to implement a 
6d60: 44 49 53 54 49 4e 43 54 20 74 65 73 74 2e 0a 2a  DISTINCT test..*
6d70: 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f  *.** Space to ho
6d80: 6c 64 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73  ld the KeyInfo s
6d90: 74 72 75 63 74 75 72 65 20 69 73 20 6f 62 74 61  tructure is obta
6da0: 69 6e 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 20  in from malloc. 
6db0: 20 54 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20   The calling.** 
6dc0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 73 70  function is resp
6dd0: 6f 6e 73 69 62 6c 65 20 66 6f 72 20 73 65 65 69  onsible for seei
6de0: 6e 67 20 74 68 61 74 20 74 68 69 73 20 73 74 72  ng that this str
6df0: 75 63 74 75 72 65 20 69 73 20 65 76 65 6e 74 75  ucture is eventu
6e00: 61 6c 6c 79 0a 2a 2a 20 66 72 65 65 64 2e 20 20  ally.** freed.  
6e10: 41 64 64 20 74 68 65 20 4b 65 79 49 6e 66 6f 20  Add the KeyInfo 
6e20: 73 74 72 75 63 74 75 72 65 20 74 6f 20 74 68 65  structure to the
6e30: 20 50 34 20 66 69 65 6c 64 20 6f 66 20 61 6e 20   P4 field of an 
6e40: 6f 70 63 6f 64 65 20 75 73 69 6e 67 0a 2a 2a 20  opcode using.** 
6e50: 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f  P4_KEYINFO_HANDO
6e60: 46 46 20 69 73 20 74 68 65 20 75 73 75 61 6c 20  FF is the usual 
6e70: 77 61 79 20 6f 66 20 64 65 61 6c 69 6e 67 20 77  way of dealing w
6e80: 69 74 68 20 74 68 69 73 2e 0a 2a 2f 0a 73 74 61  ith this..*/.sta
6e90: 74 69 63 20 4b 65 79 49 6e 66 6f 20 2a 6b 65 79  tic KeyInfo *key
6ea0: 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74  InfoFromExprList
6eb0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
6ec0: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29  ExprList *pList)
6ed0: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
6ee0: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
6ef0: 69 6e 74 20 6e 45 78 70 72 3b 0a 20 20 4b 65 79  int nExpr;.  Key
6f00: 49 6e 66 6f 20 2a 70 49 6e 66 6f 3b 0a 20 20 73  Info *pInfo;.  s
6f10: 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
6f20: 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e  tem *pItem;.  in
6f30: 74 20 69 3b 0a 0a 20 20 6e 45 78 70 72 20 3d 20  t i;..  nExpr = 
6f40: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  pList->nExpr;.  
6f50: 70 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44  pInfo = sqlite3D
6f60: 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
6f70: 73 69 7a 65 6f 66 28 2a 70 49 6e 66 6f 29 20 2b  sizeof(*pInfo) +
6f80: 20 6e 45 78 70 72 2a 28 73 69 7a 65 6f 66 28 43   nExpr*(sizeof(C
6f90: 6f 6c 6c 53 65 71 2a 29 2b 31 29 20 29 3b 0a 20  ollSeq*)+1) );. 
6fa0: 20 69 66 28 20 70 49 6e 66 6f 20 29 7b 0a 20 20   if( pInfo ){.  
6fb0: 20 20 70 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72    pInfo->aSortOr
6fc0: 64 65 72 20 3d 20 28 75 38 2a 29 26 70 49 6e 66  der = (u8*)&pInf
6fd0: 6f 2d 3e 61 43 6f 6c 6c 5b 6e 45 78 70 72 5d 3b  o->aColl[nExpr];
6fe0: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 46 69 65  .    pInfo->nFie
6ff0: 6c 64 20 3d 20 28 75 31 36 29 6e 45 78 70 72 3b  ld = (u16)nExpr;
7000: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 65 6e 63 20  .    pInfo->enc 
7010: 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20 20 20 70  = ENC(db);.    p
7020: 49 6e 66 6f 2d 3e 64 62 20 3d 20 64 62 3b 0a 20  Info->db = db;. 
7030: 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 49 74 65     for(i=0, pIte
7040: 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3c 6e 45  m=pList->a; i<nE
7050: 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  xpr; i++, pItem+
7060: 2b 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65  +){.      CollSe
7070: 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  q *pColl;.      
7080: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
7090: 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
70a0: 65 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29  e, pItem->pExpr)
70b0: 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 43 6f  ;.      if( !pCo
70c0: 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  ll ){.        pC
70d0: 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43  oll = db->pDfltC
70e0: 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  oll;.      }.   
70f0: 20 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b     pInfo->aColl[
7100: 69 5d 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20 20  i] = pColl;.    
7110: 20 20 70 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72    pInfo->aSortOr
7120: 64 65 72 5b 69 5d 20 3d 20 70 49 74 65 6d 2d 3e  der[i] = pItem->
7130: 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 7d  sortOrder;.    }
7140: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 49  .  }.  return pI
7150: 6e 66 6f 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  nfo;.}..#ifndef 
7160: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50  SQLITE_OMIT_COMP
7170: 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a  OUND_SELECT./*.*
7180: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f  * Name of the co
7190: 6e 6e 65 63 74 69 6f 6e 20 6f 70 65 72 61 74 6f  nnection operato
71a0: 72 2c 20 75 73 65 64 20 66 6f 72 20 65 72 72 6f  r, used for erro
71b0: 72 20 6d 65 73 73 61 67 65 73 2e 0a 2a 2f 0a 73  r messages..*/.s
71c0: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
71d0: 20 2a 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 69   *selectOpName(i
71e0: 6e 74 20 69 64 29 7b 0a 20 20 63 68 61 72 20 2a  nt id){.  char *
71f0: 7a 3b 0a 20 20 73 77 69 74 63 68 28 20 69 64 20  z;.  switch( id 
7200: 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  ){.    case TK_A
7210: 4c 4c 3a 20 20 20 20 20 20 20 7a 20 3d 20 22 55  LL:       z = "U
7220: 4e 49 4f 4e 20 41 4c 4c 22 3b 20 20 20 62 72 65  NION ALL";   bre
7230: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
7240: 49 4e 54 45 52 53 45 43 54 3a 20 7a 20 3d 20 22  INTERSECT: z = "
7250: 49 4e 54 45 52 53 45 43 54 22 3b 20 20 20 62 72  INTERSECT";   br
7260: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
7270: 5f 45 58 43 45 50 54 3a 20 20 20 20 7a 20 3d 20  _EXCEPT:    z = 
7280: 22 45 58 43 45 50 54 22 3b 20 20 20 20 20 20 62  "EXCEPT";      b
7290: 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c  reak;.    defaul
72a0: 74 3a 20 20 20 20 20 20 20 20 20 20 20 7a 20 3d  t:           z =
72b0: 20 22 55 4e 49 4f 4e 22 3b 20 20 20 20 20 20 20   "UNION";       
72c0: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74  break;.  }.  ret
72d0: 75 72 6e 20 7a 3b 0a 7d 0a 23 65 6e 64 69 66 20  urn z;.}.#endif 
72e0: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  /* SQLITE_OMIT_C
72f0: 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a  OMPOUND_SELECT *
7300: 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
7310: 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 2f  E_OMIT_EXPLAIN./
7320: 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 61 6e 20 22  *.** Unless an "
7330: 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c  EXPLAIN QUERY PL
7340: 41 4e 22 20 63 6f 6d 6d 61 6e 64 20 69 73 20 62  AN" command is b
7350: 65 69 6e 67 20 70 72 6f 63 65 73 73 65 64 2c 20  eing processed, 
7360: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  this function.**
7370: 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 4f 74 68   is a no-op. Oth
7380: 65 72 77 69 73 65 2c 20 69 74 20 61 64 64 73 20  erwise, it adds 
7390: 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20  a single row of 
73a0: 6f 75 74 70 75 74 20 74 6f 20 74 68 65 20 45 51  output to the EQ
73b0: 50 20 72 65 73 75 6c 74 2c 0a 2a 2a 20 77 68 65  P result,.** whe
73c0: 72 65 20 74 68 65 20 63 61 70 74 69 6f 6e 20 69  re the caption i
73d0: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a  s of the form:.*
73e0: 2a 0a 2a 2a 20 20 20 22 55 53 45 20 54 45 4d 50  *.**   "USE TEMP
73f0: 20 42 2d 54 52 45 45 20 46 4f 52 20 78 78 78 22   B-TREE FOR xxx"
7400: 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 78 78 78  .**.** where xxx
7410: 20 69 73 20 6f 6e 65 20 6f 66 20 22 44 49 53 54   is one of "DIST
7420: 49 4e 43 54 22 2c 20 22 4f 52 44 45 52 20 42 59  INCT", "ORDER BY
7430: 22 20 6f 72 20 22 47 52 4f 55 50 20 42 59 22 2e  " or "GROUP BY".
7440: 20 45 78 61 63 74 6c 79 20 77 68 69 63 68 0a 2a   Exactly which.*
7450: 2a 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20  * is determined 
7460: 62 79 20 74 68 65 20 7a 55 73 61 67 65 20 61 72  by the zUsage ar
7470: 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  gument..*/.stati
7480: 63 20 76 6f 69 64 20 65 78 70 6c 61 69 6e 54 65  c void explainTe
7490: 6d 70 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70  mpTable(Parse *p
74a0: 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61  Parse, const cha
74b0: 72 20 2a 7a 55 73 61 67 65 29 7b 0a 20 20 69 66  r *zUsage){.  if
74c0: 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69  ( pParse->explai
74d0: 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 56 64 62 65  n==2 ){.    Vdbe
74e0: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
74f0: 64 62 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  dbe;.    char *z
7500: 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  Msg = sqlite3MPr
7510: 69 6e 74 66 28 70 50 61 72 73 65 2d 3e 64 62 2c  intf(pParse->db,
7520: 20 22 55 53 45 20 54 45 4d 50 20 42 2d 54 52 45   "USE TEMP B-TRE
7530: 45 20 46 4f 52 20 25 73 22 2c 20 7a 55 73 61 67  E FOR %s", zUsag
7540: 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  e);.    sqlite3V
7550: 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
7560: 45 78 70 6c 61 69 6e 2c 20 70 50 61 72 73 65 2d  Explain, pParse-
7570: 3e 69 53 65 6c 65 63 74 49 64 2c 20 30 2c 20 30  >iSelectId, 0, 0
7580: 2c 20 7a 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d  , zMsg, P4_DYNAM
7590: 49 43 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  IC);.  }.}../*.*
75a0: 2a 20 41 73 73 69 67 6e 20 65 78 70 72 65 73 73  * Assign express
75b0: 69 6f 6e 20 62 20 74 6f 20 6c 76 61 6c 75 65 20  ion b to lvalue 
75c0: 61 2e 20 41 20 73 65 63 6f 6e 64 2c 20 6e 6f 2d  a. A second, no-
75d0: 6f 70 2c 20 76 65 72 73 69 6f 6e 20 6f 66 20 74  op, version of t
75e0: 68 69 73 20 6d 61 63 72 6f 0a 2a 2a 20 69 73 20  his macro.** is 
75f0: 70 72 6f 76 69 64 65 64 20 77 68 65 6e 20 53 51  provided when SQ
7600: 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
7610: 4e 20 69 73 20 64 65 66 69 6e 65 64 2e 20 54 68  N is defined. Th
7620: 69 73 20 61 6c 6c 6f 77 73 20 74 68 65 20 63 6f  is allows the co
7630: 64 65 0a 2a 2a 20 69 6e 20 73 71 6c 69 74 65 33  de.** in sqlite3
7640: 53 65 6c 65 63 74 28 29 20 74 6f 20 61 73 73 69  Select() to assi
7650: 67 6e 20 76 61 6c 75 65 73 20 74 6f 20 73 74 72  gn values to str
7660: 75 63 74 75 72 65 20 6d 65 6d 62 65 72 20 76 61  ucture member va
7670: 72 69 61 62 6c 65 73 20 74 68 61 74 0a 2a 2a 20  riables that.** 
7680: 6f 6e 6c 79 20 65 78 69 73 74 20 69 66 20 53 51  only exist if SQ
7690: 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
76a0: 4e 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64  N is not defined
76b0: 20 77 69 74 68 6f 75 74 20 70 6f 6c 6c 75 74 69   without polluti
76c0: 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 64 65 20 77  ng the.** code w
76d0: 69 74 68 20 23 69 66 6e 64 65 66 20 64 69 72 65  ith #ifndef dire
76e0: 63 74 69 76 65 73 2e 0a 2a 2f 0a 23 20 64 65 66  ctives..*/.# def
76f0: 69 6e 65 20 65 78 70 6c 61 69 6e 53 65 74 49 6e  ine explainSetIn
7700: 74 65 67 65 72 28 61 2c 20 62 29 20 61 20 3d 20  teger(a, b) a = 
7710: 62 0a 0a 23 65 6c 73 65 0a 2f 2a 20 4e 6f 2d 6f  b..#else./* No-o
7720: 70 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68  p versions of th
7730: 65 20 65 78 70 6c 61 69 6e 58 58 58 28 29 20 66  e explainXXX() f
7740: 75 6e 63 74 69 6f 6e 73 20 61 6e 64 20 6d 61 63  unctions and mac
7750: 72 6f 73 2e 20 2a 2f 0a 23 20 64 65 66 69 6e 65  ros. */.# define
7760: 20 65 78 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c   explainTempTabl
7770: 65 28 79 2c 7a 29 0a 23 20 64 65 66 69 6e 65 20  e(y,z).# define 
7780: 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65  explainSetIntege
7790: 72 28 79 2c 7a 29 0a 23 65 6e 64 69 66 0a 0a 23  r(y,z).#endif..#
77a0: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
77b0: 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 29  TE_OMIT_EXPLAIN)
77c0: 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
77d0: 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e  ITE_OMIT_COMPOUN
77e0: 44 5f 53 45 4c 45 43 54 29 0a 2f 2a 0a 2a 2a 20  D_SELECT)./*.** 
77f0: 55 6e 6c 65 73 73 20 61 6e 20 22 45 58 50 4c 41  Unless an "EXPLA
7800: 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 22 20 63  IN QUERY PLAN" c
7810: 6f 6d 6d 61 6e 64 20 69 73 20 62 65 69 6e 67 20  ommand is being 
7820: 70 72 6f 63 65 73 73 65 64 2c 20 74 68 69 73 20  processed, this 
7830: 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 61  function.** is a
7840: 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73   no-op. Otherwis
7850: 65 2c 20 69 74 20 61 64 64 73 20 61 20 73 69 6e  e, it adds a sin
7860: 67 6c 65 20 72 6f 77 20 6f 66 20 6f 75 74 70 75  gle row of outpu
7870: 74 20 74 6f 20 74 68 65 20 45 51 50 20 72 65 73  t to the EQP res
7880: 75 6c 74 2c 0a 2a 2a 20 77 68 65 72 65 20 74 68  ult,.** where th
7890: 65 20 63 61 70 74 69 6f 6e 20 69 73 20 6f 66 20  e caption is of 
78a0: 6f 6e 65 20 6f 66 20 74 68 65 20 74 77 6f 20 66  one of the two f
78b0: 6f 72 6d 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 43  orms:.**.**   "C
78c0: 4f 4d 50 4f 53 49 54 45 20 53 55 42 51 55 45 52  OMPOSITE SUBQUER
78d0: 49 45 53 20 69 53 75 62 31 20 61 6e 64 20 69 53  IES iSub1 and iS
78e0: 75 62 32 20 28 6f 70 29 22 0a 2a 2a 20 20 20 22  ub2 (op)".**   "
78f0: 43 4f 4d 50 4f 53 49 54 45 20 53 55 42 51 55 45  COMPOSITE SUBQUE
7900: 52 49 45 53 20 69 53 75 62 31 20 61 6e 64 20 69  RIES iSub1 and i
7910: 53 75 62 32 20 55 53 49 4e 47 20 54 45 4d 50 20  Sub2 USING TEMP 
7920: 42 2d 54 52 45 45 20 28 6f 70 29 22 0a 2a 2a 0a  B-TREE (op)".**.
7930: 2a 2a 20 77 68 65 72 65 20 69 53 75 62 31 20 61  ** where iSub1 a
7940: 6e 64 20 69 53 75 62 32 20 61 72 65 20 74 68 65  nd iSub2 are the
7950: 20 69 6e 74 65 67 65 72 73 20 70 61 73 73 65 64   integers passed
7960: 20 61 73 20 74 68 65 20 63 6f 72 72 65 73 70 6f   as the correspo
7970: 6e 64 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f  nding.** functio
7980: 6e 20 70 61 72 61 6d 65 74 65 72 73 2c 20 61 6e  n parameters, an
7990: 64 20 6f 70 20 69 73 20 74 68 65 20 74 65 78 74  d op is the text
79a0: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
79b0: 6f 66 20 74 68 65 20 70 61 72 61 6d 65 74 65 72  of the parameter
79c0: 0a 2a 2a 20 6f 66 20 74 68 65 20 73 61 6d 65 20  .** of the same 
79d0: 6e 61 6d 65 2e 20 54 68 65 20 70 61 72 61 6d 65  name. The parame
79e0: 74 65 72 20 22 6f 70 22 20 6d 75 73 74 20 62 65  ter "op" must be
79f0: 20 6f 6e 65 20 6f 66 20 54 4b 5f 55 4e 49 4f 4e   one of TK_UNION
7a00: 2c 20 54 4b 5f 45 58 43 45 50 54 2c 0a 2a 2a 20  , TK_EXCEPT,.** 
7a10: 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 6f 72 20  TK_INTERSECT or 
7a20: 54 4b 5f 41 4c 4c 2e 20 54 68 65 20 66 69 72 73  TK_ALL. The firs
7a30: 74 20 66 6f 72 6d 20 69 73 20 75 73 65 64 20 69  t form is used i
7a40: 66 20 61 72 67 75 6d 65 6e 74 20 62 55 73 65 54  f argument bUseT
7a50: 6d 70 20 69 73 20 0a 2a 2a 20 66 61 6c 73 65 2c  mp is .** false,
7a60: 20 6f 72 20 74 68 65 20 73 65 63 6f 6e 64 20 66   or the second f
7a70: 6f 72 6d 20 69 66 20 69 74 20 69 73 20 74 72 75  orm if it is tru
7a80: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
7a90: 64 20 65 78 70 6c 61 69 6e 43 6f 6d 70 6f 73 69  d explainComposi
7aa0: 74 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  te(.  Parse *pPa
7ab0: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  rse,            
7ac0: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63        /* Parse c
7ad0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20  ontext */.  int 
7ae0: 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  op,             
7af0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
7b00: 6e 65 20 6f 66 20 54 4b 5f 55 4e 49 4f 4e 2c 20  ne of TK_UNION, 
7b10: 54 4b 5f 45 58 43 45 50 54 20 65 74 63 2e 20 2a  TK_EXCEPT etc. *
7b20: 2f 0a 20 20 69 6e 74 20 69 53 75 62 31 2c 20 20  /.  int iSub1,  
7b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7b40: 20 20 20 20 2f 2a 20 53 75 62 71 75 65 72 79 20      /* Subquery 
7b50: 69 64 20 31 20 2a 2f 0a 20 20 69 6e 74 20 69 53  id 1 */.  int iS
7b60: 75 62 32 2c 20 20 20 20 20 20 20 20 20 20 20 20  ub2,            
7b70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62            /* Sub
7b80: 71 75 65 72 79 20 69 64 20 32 20 2a 2f 0a 20 20  query id 2 */.  
7b90: 69 6e 74 20 62 55 73 65 54 6d 70 20 20 20 20 20  int bUseTmp     
7ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7bb0: 2f 2a 20 54 72 75 65 20 69 66 20 61 20 74 65 6d  /* True if a tem
7bc0: 70 20 74 61 62 6c 65 20 77 61 73 20 75 73 65 64  p table was used
7bd0: 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28   */.){.  assert(
7be0: 20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 7c 7c   op==TK_UNION ||
7bf0: 20 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20 7c   op==TK_EXCEPT |
7c00: 7c 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45  | op==TK_INTERSE
7c10: 43 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 41 4c 4c  CT || op==TK_ALL
7c20: 20 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65   );.  if( pParse
7c30: 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a  ->explain==2 ){.
7c40: 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50      Vdbe *v = pP
7c50: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 20  arse->pVdbe;.   
7c60: 20 63 68 61 72 20 2a 7a 4d 73 67 20 3d 20 73 71   char *zMsg = sq
7c70: 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 0a 20 20  lite3MPrintf(.  
7c80: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64 62        pParse->db
7c90: 2c 20 22 43 4f 4d 50 4f 55 4e 44 20 53 55 42 51  , "COMPOUND SUBQ
7ca0: 55 45 52 49 45 53 20 25 64 20 41 4e 44 20 25 64  UERIES %d AND %d
7cb0: 20 25 73 28 25 73 29 22 2c 20 69 53 75 62 31 2c   %s(%s)", iSub1,
7cc0: 20 69 53 75 62 32 2c 0a 20 20 20 20 20 20 20 20   iSub2,.        
7cd0: 62 55 73 65 54 6d 70 3f 22 55 53 49 4e 47 20 54  bUseTmp?"USING T
7ce0: 45 4d 50 20 42 2d 54 52 45 45 20 22 3a 22 22 2c  EMP B-TREE ":"",
7cf0: 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 6f 70   selectOpName(op
7d00: 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c  ).    );.    sql
7d10: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
7d20: 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 70 50  , OP_Explain, pP
7d30: 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c  arse->iSelectId,
7d40: 20 30 2c 20 30 2c 20 7a 4d 73 67 2c 20 50 34 5f   0, 0, zMsg, P4_
7d50: 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 7d 0a  DYNAMIC);.  }.}.
7d60: 23 65 6c 73 65 0a 2f 2a 20 4e 6f 2d 6f 70 20 76  #else./* No-op v
7d70: 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 65  ersions of the e
7d80: 78 70 6c 61 69 6e 58 58 58 28 29 20 66 75 6e 63  xplainXXX() func
7d90: 74 69 6f 6e 73 20 61 6e 64 20 6d 61 63 72 6f 73  tions and macros
7da0: 2e 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 65 78  . */.# define ex
7db0: 70 6c 61 69 6e 43 6f 6d 70 6f 73 69 74 65 28 76  plainComposite(v
7dc0: 2c 77 2c 78 2c 79 2c 7a 29 0a 23 65 6e 64 69 66  ,w,x,y,z).#endif
7dd0: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69  ../*.** If the i
7de0: 6e 6e 65 72 20 6c 6f 6f 70 20 77 61 73 20 67 65  nner loop was ge
7df0: 6e 65 72 61 74 65 64 20 75 73 69 6e 67 20 61 20  nerated using a 
7e00: 6e 6f 6e 2d 6e 75 6c 6c 20 70 4f 72 64 65 72 42  non-null pOrderB
7e10: 79 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 74  y argument,.** t
7e20: 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20  hen the results 
7e30: 77 65 72 65 20 70 6c 61 63 65 64 20 69 6e 20 61  were placed in a
7e40: 20 73 6f 72 74 65 72 2e 20 20 41 66 74 65 72 20   sorter.  After 
7e50: 74 68 65 20 6c 6f 6f 70 20 69 73 20 74 65 72 6d  the loop is term
7e60: 69 6e 61 74 65 64 0a 2a 2a 20 77 65 20 6e 65 65  inated.** we nee
7e70: 64 20 74 6f 20 72 75 6e 20 74 68 65 20 73 6f 72  d to run the sor
7e80: 74 65 72 20 61 6e 64 20 6f 75 74 70 75 74 20 74  ter and output t
7e90: 68 65 20 72 65 73 75 6c 74 73 2e 20 20 54 68 65  he results.  The
7ea0: 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 72 6f   following.** ro
7eb0: 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20  utine generates 
7ec0: 74 68 65 20 63 6f 64 65 20 6e 65 65 64 65 64 20  the code needed 
7ed0: 74 6f 20 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a 73  to do that..*/.s
7ee0: 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72  tatic void gener
7ef0: 61 74 65 53 6f 72 74 54 61 69 6c 28 0a 20 20 50  ateSortTail(.  P
7f00: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
7f10: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
7f20: 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
7f30: 2a 70 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68  *p,        /* Th
7f40: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
7f50: 6e 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 2c  nt */.  Vdbe *v,
7f60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e            /* Gen
7f70: 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20  erate code into 
7f80: 74 68 69 73 20 56 44 42 45 20 2a 2f 0a 20 20 69  this VDBE */.  i
7f90: 6e 74 20 6e 43 6f 6c 75 6d 6e 2c 20 20 20 20 20  nt nColumn,     
7fa0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f   /* Number of co
7fb0: 6c 75 6d 6e 73 20 6f 66 20 64 61 74 61 20 2a 2f  lumns of data */
7fc0: 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70  .  SelectDest *p
7fd0: 44 65 73 74 20 2f 2a 20 57 72 69 74 65 20 74 68  Dest /* Write th
7fe0: 65 20 73 6f 72 74 65 64 20 72 65 73 75 6c 74 73  e sorted results
7ff0: 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   here */.){.  in
8000: 74 20 61 64 64 72 42 72 65 61 6b 20 3d 20 73 71  t addrBreak = sq
8010: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
8020: 65 6c 28 76 29 3b 20 20 20 20 20 2f 2a 20 4a 75  el(v);     /* Ju
8030: 6d 70 20 68 65 72 65 20 74 6f 20 65 78 69 74 20  mp here to exit 
8040: 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64  loop */.  int ad
8050: 64 72 43 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c  drContinue = sql
8060: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
8070: 6c 28 76 29 3b 20 20 2f 2a 20 4a 75 6d 70 20 68  l(v);  /* Jump h
8080: 65 72 65 20 66 6f 72 20 6e 65 78 74 20 63 79 63  ere for next cyc
8090: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  le */.  int addr
80a0: 3b 0a 20 20 69 6e 74 20 69 54 61 62 3b 0a 20 20  ;.  int iTab;.  
80b0: 69 6e 74 20 70 73 65 75 64 6f 54 61 62 20 3d 20  int pseudoTab = 
80c0: 30 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  0;.  ExprList *p
80d0: 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72  OrderBy = p->pOr
80e0: 64 65 72 42 79 3b 0a 0a 20 20 69 6e 74 20 65 44  derBy;..  int eD
80f0: 65 73 74 20 3d 20 70 44 65 73 74 2d 3e 65 44 65  est = pDest->eDe
8100: 73 74 3b 0a 20 20 69 6e 74 20 69 50 61 72 6d 20  st;.  int iParm 
8110: 3d 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d  = pDest->iSDParm
8120: 3b 0a 0a 20 20 69 6e 74 20 72 65 67 52 6f 77 3b  ;..  int regRow;
8130: 0a 20 20 69 6e 74 20 72 65 67 52 6f 77 69 64 3b  .  int regRowid;
8140: 0a 0a 20 20 69 54 61 62 20 3d 20 70 4f 72 64 65  ..  iTab = pOrde
8150: 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 3b 0a 20  rBy->iECursor;. 
8160: 20 72 65 67 52 6f 77 20 3d 20 73 71 6c 69 74 65   regRow = sqlite
8170: 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
8180: 73 65 29 3b 0a 20 20 69 66 28 20 65 44 65 73 74  se);.  if( eDest
8190: 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 7c 7c 20  ==SRT_Output || 
81a0: 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75  eDest==SRT_Corou
81b0: 74 69 6e 65 20 29 7b 0a 20 20 20 20 70 73 65 75  tine ){.    pseu
81c0: 64 6f 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e  doTab = pParse->
81d0: 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 73 71 6c 69  nTab++;.    sqli
81e0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
81f0: 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f 2c 20   OP_OpenPseudo, 
8200: 70 73 65 75 64 6f 54 61 62 2c 20 72 65 67 52 6f  pseudoTab, regRo
8210: 77 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20  w, nColumn);.   
8220: 20 72 65 67 52 6f 77 69 64 20 3d 20 30 3b 0a 20   regRowid = 0;. 
8230: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 67 52   }else{.    regR
8240: 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33 47 65  owid = sqlite3Ge
8250: 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
8260: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 73  ;.  }.  if( p->s
8270: 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 55 73 65  elFlags & SF_Use
8280: 53 6f 72 74 65 72 20 29 7b 0a 20 20 20 20 69 6e  Sorter ){.    in
8290: 74 20 72 65 67 53 6f 72 74 4f 75 74 20 3d 20 2b  t regSortOut = +
82a0: 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
82b0: 20 20 20 69 6e 74 20 70 74 61 62 32 20 3d 20 70     int ptab2 = p
82c0: 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
82d0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
82e0: 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 50  dOp3(v, OP_OpenP
82f0: 73 65 75 64 6f 2c 20 70 74 61 62 32 2c 20 72 65  seudo, ptab2, re
8300: 67 53 6f 72 74 4f 75 74 2c 20 70 4f 72 64 65 72  gSortOut, pOrder
8310: 42 79 2d 3e 6e 45 78 70 72 2b 32 29 3b 0a 20 20  By->nExpr+2);.  
8320: 20 20 61 64 64 72 20 3d 20 31 20 2b 20 73 71 6c    addr = 1 + sql
8330: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
8340: 2c 20 4f 50 5f 53 6f 72 74 65 72 53 6f 72 74 2c  , OP_SorterSort,
8350: 20 69 54 61 62 2c 20 61 64 64 72 42 72 65 61 6b   iTab, addrBreak
8360: 29 3b 0a 20 20 20 20 63 6f 64 65 4f 66 66 73 65  );.    codeOffse
8370: 74 28 76 2c 20 70 2c 20 61 64 64 72 43 6f 6e 74  t(v, p, addrCont
8380: 69 6e 75 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  inue);.    sqlit
8390: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
83a0: 4f 50 5f 53 6f 72 74 65 72 44 61 74 61 2c 20 69  OP_SorterData, i
83b0: 54 61 62 2c 20 72 65 67 53 6f 72 74 4f 75 74 29  Tab, regSortOut)
83c0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
83d0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
83e0: 6c 75 6d 6e 2c 20 70 74 61 62 32 2c 20 70 4f 72  lumn, ptab2, pOr
83f0: 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b 31 2c 20  derBy->nExpr+1, 
8400: 72 65 67 52 6f 77 29 3b 0a 20 20 20 20 73 71 6c  regRow);.    sql
8410: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
8420: 28 76 2c 20 4f 50 46 4c 41 47 5f 43 4c 45 41 52  (v, OPFLAG_CLEAR
8430: 43 41 43 48 45 29 3b 0a 20 20 7d 65 6c 73 65 7b  CACHE);.  }else{
8440: 0a 20 20 20 20 61 64 64 72 20 3d 20 31 20 2b 20  .    addr = 1 + 
8450: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
8460: 32 28 76 2c 20 4f 50 5f 53 6f 72 74 2c 20 69 54  2(v, OP_Sort, iT
8470: 61 62 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a  ab, addrBreak);.
8480: 20 20 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76      codeOffset(v
8490: 2c 20 70 2c 20 61 64 64 72 43 6f 6e 74 69 6e 75  , p, addrContinu
84a0: 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  e);.    sqlite3V
84b0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
84c0: 43 6f 6c 75 6d 6e 2c 20 69 54 61 62 2c 20 70 4f  Column, iTab, pO
84d0: 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b 31 2c  rderBy->nExpr+1,
84e0: 20 72 65 67 52 6f 77 29 3b 0a 20 20 7d 0a 20 20   regRow);.  }.  
84f0: 73 77 69 74 63 68 28 20 65 44 65 73 74 20 29 7b  switch( eDest ){
8500: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 54 61  .    case SRT_Ta
8510: 62 6c 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52  ble:.    case SR
8520: 54 5f 45 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20  T_EphemTab: {.  
8530: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44      testcase( eD
8540: 65 73 74 3d 3d 53 52 54 5f 54 61 62 6c 65 20 29  est==SRT_Table )
8550: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
8560: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 45 70 68  ( eDest==SRT_Eph
8570: 65 6d 54 61 62 20 29 3b 0a 20 20 20 20 20 20 73  emTab );.      s
8580: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
8590: 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c  (v, OP_NewRowid,
85a0: 20 69 50 61 72 6d 2c 20 72 65 67 52 6f 77 69 64   iParm, regRowid
85b0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
85c0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
85d0: 5f 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20  _Insert, iParm, 
85e0: 72 65 67 52 6f 77 2c 20 72 65 67 52 6f 77 69 64  regRow, regRowid
85f0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
8600: 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
8610: 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a  OPFLAG_APPEND);.
8620: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
8630: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
8640: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
8650: 20 20 20 20 63 61 73 65 20 53 52 54 5f 53 65 74      case SRT_Set
8660: 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
8670: 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a  ( nColumn==1 );.
8680: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
8690: 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61  eAddOp4(v, OP_Ma
86a0: 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52 6f 77  keRecord, regRow
86b0: 2c 20 31 2c 20 72 65 67 52 6f 77 69 64 2c 0a 20  , 1, regRowid,. 
86c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
86d0: 20 20 20 20 20 20 20 26 70 44 65 73 74 2d 3e 61         &pDest->a
86e0: 66 66 53 64 73 74 2c 20 31 29 3b 0a 20 20 20 20  ffSdst, 1);.    
86f0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
8700: 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  heAffinityChange
8710: 28 70 50 61 72 73 65 2c 20 72 65 67 52 6f 77 2c  (pParse, regRow,
8720: 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   1);.      sqlit
8730: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
8740: 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50  OP_IdxInsert, iP
8750: 61 72 6d 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a  arm, regRowid);.
8760: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
8770: 20 7d 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f   }.    case SRT_
8780: 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  Mem: {.      ass
8790: 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20  ert( nColumn==1 
87a0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
87b0: 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61  ExprCodeMove(pPa
87c0: 72 73 65 2c 20 72 65 67 52 6f 77 2c 20 69 50 61  rse, regRow, iPa
87d0: 72 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20 2f 2a  rm, 1);.      /*
87e0: 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73   The LIMIT claus
87f0: 65 20 77 69 6c 6c 20 74 65 72 6d 69 6e 61 74 65  e will terminate
8800: 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73   the loop for us
8810: 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   */.      break;
8820: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
8830: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
8840: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
8850: 61 73 73 65 72 74 28 20 65 44 65 73 74 3d 3d 53  assert( eDest==S
8860: 52 54 5f 4f 75 74 70 75 74 20 7c 7c 20 65 44 65  RT_Output || eDe
8870: 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e  st==SRT_Coroutin
8880: 65 20 29 3b 20 0a 20 20 20 20 20 20 74 65 73 74  e ); .      test
8890: 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54  case( eDest==SRT
88a0: 5f 4f 75 74 70 75 74 20 29 3b 0a 20 20 20 20 20  _Output );.     
88b0: 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74   testcase( eDest
88c0: 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20  ==SRT_Coroutine 
88d0: 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  );.      for(i=0
88e0: 3b 20 69 3c 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b  ; i<nColumn; i++
88f0: 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
8900: 74 28 20 72 65 67 52 6f 77 21 3d 70 44 65 73 74  t( regRow!=pDest
8910: 2d 3e 69 53 64 73 74 2b 69 20 29 3b 0a 20 20 20  ->iSdst+i );.   
8920: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
8930: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
8940: 75 6d 6e 2c 20 70 73 65 75 64 6f 54 61 62 2c 20  umn, pseudoTab, 
8950: 69 2c 20 70 44 65 73 74 2d 3e 69 53 64 73 74 2b  i, pDest->iSdst+
8960: 69 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  i);.        if( 
8970: 69 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  i==0 ){.        
8980: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
8990: 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f  ngeP5(v, OPFLAG_
89a0: 43 4c 45 41 52 43 41 43 48 45 29 3b 0a 20 20 20  CLEARCACHE);.   
89b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
89c0: 20 20 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d       if( eDest==
89d0: 53 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20  SRT_Output ){.  
89e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
89f0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65  eAddOp2(v, OP_Re
8a00: 73 75 6c 74 52 6f 77 2c 20 70 44 65 73 74 2d 3e  sultRow, pDest->
8a10: 69 53 64 73 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b  iSdst, nColumn);
8a20: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
8a30: 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74  ExprCacheAffinit
8a40: 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20  yChange(pParse, 
8a50: 70 44 65 73 74 2d 3e 69 53 64 73 74 2c 20 6e 43  pDest->iSdst, nC
8a60: 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 7d 65  olumn);.      }e
8a70: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
8a80: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
8a90: 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 70 44 65 73  , OP_Yield, pDes
8aa0: 74 2d 3e 69 53 44 50 61 72 6d 29 3b 0a 20 20 20  t->iSDParm);.   
8ab0: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
8ac0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
8ad0: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
8ae0: 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 52  Reg(pParse, regR
8af0: 6f 77 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65  ow);.  sqlite3Re
8b00: 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
8b10: 72 73 65 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a  rse, regRowid);.
8b20: 0a 20 20 2f 2a 20 54 68 65 20 62 6f 74 74 6f 6d  .  /* The bottom
8b30: 20 6f 66 20 74 68 65 20 6c 6f 6f 70 0a 20 20 2a   of the loop.  *
8b40: 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  /.  sqlite3VdbeR
8b50: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61  esolveLabel(v, a
8b60: 64 64 72 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20  ddrContinue);.  
8b70: 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  if( p->selFlags 
8b80: 26 20 53 46 5f 55 73 65 53 6f 72 74 65 72 20 29  & SF_UseSorter )
8b90: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
8ba0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f  eAddOp2(v, OP_So
8bb0: 72 74 65 72 4e 65 78 74 2c 20 69 54 61 62 2c 20  rterNext, iTab, 
8bc0: 61 64 64 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  addr);.  }else{.
8bd0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
8be0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74  ddOp2(v, OP_Next
8bf0: 2c 20 69 54 61 62 2c 20 61 64 64 72 29 3b 0a 20  , iTab, addr);. 
8c00: 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
8c10: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
8c20: 61 64 64 72 42 72 65 61 6b 29 3b 0a 20 20 69 66  addrBreak);.  if
8c30: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74  ( eDest==SRT_Out
8c40: 70 75 74 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52  put || eDest==SR
8c50: 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20  T_Coroutine ){. 
8c60: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
8c70: 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  dOp2(v, OP_Close
8c80: 2c 20 70 73 65 75 64 6f 54 61 62 2c 20 30 29 3b  , pseudoTab, 0);
8c90: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
8ca0: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
8cb0: 6f 20 61 20 73 74 72 69 6e 67 20 63 6f 6e 74 61  o a string conta
8cc0: 69 6e 69 6e 67 20 74 68 65 20 27 64 65 63 6c 61  ining the 'decla
8cd0: 72 61 74 69 6f 6e 20 74 79 70 65 27 20 6f 66 20  ration type' of 
8ce0: 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  the.** expressio
8cf0: 6e 20 70 45 78 70 72 2e 20 54 68 65 20 73 74 72  n pExpr. The str
8d00: 69 6e 67 20 6d 61 79 20 62 65 20 74 72 65 61 74  ing may be treat
8d10: 65 64 20 61 73 20 73 74 61 74 69 63 20 62 79 20  ed as static by 
8d20: 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a  the caller..**.*
8d30: 2a 20 54 68 65 20 64 65 63 6c 61 72 61 74 69 6f  * The declaratio
8d40: 6e 20 74 79 70 65 20 69 73 20 74 68 65 20 65 78  n type is the ex
8d50: 61 63 74 20 64 61 74 61 74 79 70 65 20 64 65 66  act datatype def
8d60: 69 6e 69 74 69 6f 6e 20 65 78 74 72 61 63 74 65  inition extracte
8d70: 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 6f 72  d from the.** or
8d80: 69 67 69 6e 61 6c 20 43 52 45 41 54 45 20 54 41  iginal CREATE TA
8d90: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 69 66  BLE statement if
8da0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
8db0: 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 54 68 65  is a column. The
8dc0: 0a 2a 2a 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  .** declaration 
8dd0: 74 79 70 65 20 66 6f 72 20 61 20 52 4f 57 49 44  type for a ROWID
8de0: 20 66 69 65 6c 64 20 69 73 20 49 4e 54 45 47 45   field is INTEGE
8df0: 52 2e 20 45 78 61 63 74 6c 79 20 77 68 65 6e 20  R. Exactly when 
8e00: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a  an expression.**
8e10: 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61   is considered a
8e20: 20 63 6f 6c 75 6d 6e 20 63 61 6e 20 62 65 20 63   column can be c
8e30: 6f 6d 70 6c 65 78 20 69 6e 20 74 68 65 20 70 72  omplex in the pr
8e40: 65 73 65 6e 63 65 20 6f 66 20 73 75 62 71 75 65  esence of subque
8e50: 72 69 65 73 2e 20 54 68 65 0a 2a 2a 20 72 65 73  ries. The.** res
8e60: 75 6c 74 2d 73 65 74 20 65 78 70 72 65 73 73 69  ult-set expressi
8e70: 6f 6e 20 69 6e 20 61 6c 6c 20 6f 66 20 74 68 65  on in all of the
8e80: 20 66 6f 6c 6c 6f 77 69 6e 67 20 53 45 4c 45 43   following SELEC
8e90: 54 20 73 74 61 74 65 6d 65 6e 74 73 20 69 73 20  T statements is 
8ea0: 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 20 61  .** considered a
8eb0: 20 63 6f 6c 75 6d 6e 20 62 79 20 74 68 69 73 20   column by this 
8ec0: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  function..**.** 
8ed0: 20 20 53 45 4c 45 43 54 20 63 6f 6c 20 46 52 4f    SELECT col FRO
8ee0: 4d 20 74 62 6c 3b 0a 2a 2a 20 20 20 53 45 4c 45  M tbl;.**   SELE
8ef0: 43 54 20 28 53 45 4c 45 43 54 20 63 6f 6c 20 46  CT (SELECT col F
8f00: 52 4f 4d 20 74 62 6c 3b 0a 2a 2a 20 20 20 53 45  ROM tbl;.**   SE
8f10: 4c 45 43 54 20 28 53 45 4c 45 43 54 20 63 6f 6c  LECT (SELECT col
8f20: 20 46 52 4f 4d 20 74 62 6c 29 3b 0a 2a 2a 20 20   FROM tbl);.**  
8f30: 20 53 45 4c 45 43 54 20 61 62 63 20 46 52 4f 4d   SELECT abc FROM
8f40: 20 28 53 45 4c 45 43 54 20 63 6f 6c 20 41 53 20   (SELECT col AS 
8f50: 61 62 63 20 46 52 4f 4d 20 74 62 6c 29 3b 0a 2a  abc FROM tbl);.*
8f60: 2a 20 0a 2a 2a 20 54 68 65 20 64 65 63 6c 61 72  * .** The declar
8f70: 61 74 69 6f 6e 20 74 79 70 65 20 66 6f 72 20 61  ation type for a
8f80: 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 74  ny expression ot
8f90: 68 65 72 20 74 68 61 6e 20 61 20 63 6f 6c 75 6d  her than a colum
8fa0: 6e 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74  n is NULL..*/.st
8fb0: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
8fc0: 2a 63 6f 6c 75 6d 6e 54 79 70 65 28 0a 20 20 4e  *columnType(.  N
8fd0: 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c  ameContext *pNC,
8fe0: 20 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c   .  Expr *pExpr,
8ff0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a  .  const char **
9000: 70 7a 4f 72 69 67 69 6e 44 62 2c 0a 20 20 63 6f  pzOriginDb,.  co
9010: 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69  nst char **pzOri
9020: 67 69 6e 54 61 62 2c 0a 20 20 63 6f 6e 73 74 20  ginTab,.  const 
9030: 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67 69 6e 43  char **pzOriginC
9040: 6f 6c 0a 29 7b 0a 20 20 63 68 61 72 20 63 6f 6e  ol.){.  char con
9050: 73 74 20 2a 7a 54 79 70 65 20 3d 20 30 3b 0a 20  st *zType = 0;. 
9060: 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72   char const *zOr
9070: 69 67 69 6e 44 62 20 3d 20 30 3b 0a 20 20 63 68  iginDb = 0;.  ch
9080: 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67 69  ar const *zOrigi
9090: 6e 54 61 62 20 3d 20 30 3b 0a 20 20 63 68 61 72  nTab = 0;.  char
90a0: 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67 69 6e 43   const *zOriginC
90b0: 6f 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6a 3b  ol = 0;.  int j;
90c0: 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 45 78  .  if( NEVER(pEx
90d0: 70 72 3d 3d 30 29 20 7c 7c 20 70 4e 43 2d 3e 70  pr==0) || pNC->p
90e0: 53 72 63 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  SrcList==0 ) ret
90f0: 75 72 6e 20 30 3b 0a 0a 20 20 73 77 69 74 63 68  urn 0;..  switch
9100: 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20  ( pExpr->op ){. 
9110: 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 43     case TK_AGG_C
9120: 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20  OLUMN:.    case 
9130: 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20  TK_COLUMN: {.   
9140: 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73     /* The expres
9150: 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e  sion is a column
9160: 2e 20 4c 6f 63 61 74 65 20 74 68 65 20 74 61 62  . Locate the tab
9170: 6c 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73  le the column is
9180: 20 62 65 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20   being.      ** 
9190: 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 69  extracted from i
91a0: 6e 20 4e 61 6d 65 43 6f 6e 74 65 78 74 2e 70 53  n NameContext.pS
91b0: 72 63 4c 69 73 74 2e 20 54 68 69 73 20 74 61 62  rcList. This tab
91c0: 6c 65 20 6d 61 79 20 62 65 20 72 65 61 6c 0a 20  le may be real. 
91d0: 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65       ** database
91e0: 20 74 61 62 6c 65 20 6f 72 20 61 20 73 75 62 71   table or a subq
91f0: 75 65 72 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  uery..      */. 
9200: 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62       Table *pTab
9210: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
9220: 20 2f 2a 20 54 61 62 6c 65 20 73 74 72 75 63 74   /* Table struct
9230: 75 72 65 20 63 6f 6c 75 6d 6e 20 69 73 20 65 78  ure column is ex
9240: 74 72 61 63 74 65 64 20 66 72 6f 6d 20 2a 2f 0a  tracted from */.
9250: 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53        Select *pS
9260: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
9270: 20 20 2f 2a 20 53 65 6c 65 63 74 20 74 68 65 20    /* Select the 
9280: 63 6f 6c 75 6d 6e 20 69 73 20 65 78 74 72 61 63  column is extrac
9290: 74 65 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 20 20  ted from */.    
92a0: 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 45 78    int iCol = pEx
92b0: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 20 20 2f 2a  pr->iColumn;  /*
92c0: 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e   Index of column
92d0: 20 69 6e 20 70 54 61 62 20 2a 2f 0a 20 20 20 20   in pTab */.    
92e0: 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
92f0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f  r->op==TK_AGG_CO
9300: 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 74 65  LUMN );.      te
9310: 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
9320: 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a  p==TK_COLUMN );.
9330: 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 4e 43        while( pNC
9340: 20 26 26 20 21 70 54 61 62 20 29 7b 0a 20 20 20   && !pTab ){.   
9350: 20 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 54       SrcList *pT
9360: 61 62 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53  abList = pNC->pS
9370: 72 63 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20  rcList;.        
9380: 66 6f 72 28 6a 3d 30 3b 6a 3c 70 54 61 62 4c 69  for(j=0;j<pTabLi
9390: 73 74 2d 3e 6e 53 72 63 20 26 26 20 70 54 61 62  st->nSrc && pTab
93a0: 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73  List->a[j].iCurs
93b0: 6f 72 21 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c  or!=pExpr->iTabl
93c0: 65 3b 6a 2b 2b 29 3b 0a 20 20 20 20 20 20 20 20  e;j++);.        
93d0: 69 66 28 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e  if( j<pTabList->
93e0: 6e 53 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  nSrc ){.        
93f0: 20 20 70 54 61 62 20 3d 20 70 54 61 62 4c 69 73    pTab = pTabLis
9400: 74 2d 3e 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20  t->a[j].pTab;.  
9410: 20 20 20 20 20 20 20 20 70 53 20 3d 20 70 54 61          pS = pTa
9420: 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 53 65 6c  bList->a[j].pSel
9430: 65 63 74 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ect;.        }el
9440: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e  se{.          pN
9450: 43 20 3d 20 70 4e 43 2d 3e 70 4e 65 78 74 3b 0a  C = pNC->pNext;.
9460: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
9470: 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 70 54 61  }..      if( pTa
9480: 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  b==0 ){.        
9490: 2f 2a 20 41 74 20 6f 6e 65 20 74 69 6d 65 2c 20  /* At one time, 
94a0: 63 6f 64 65 20 73 75 63 68 20 61 73 20 22 53 45  code such as "SE
94b0: 4c 45 43 54 20 6e 65 77 2e 78 22 20 77 69 74 68  LECT new.x" with
94c0: 69 6e 20 61 20 74 72 69 67 67 65 72 20 77 6f 75  in a trigger wou
94d0: 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61  ld.        ** ca
94e0: 75 73 65 20 74 68 69 73 20 63 6f 6e 64 69 74 69  use this conditi
94f0: 6f 6e 20 74 6f 20 72 75 6e 2e 20 20 53 69 6e 63  on to run.  Sinc
9500: 65 20 74 68 65 6e 2c 20 77 65 20 68 61 76 65 20  e then, we have 
9510: 72 65 73 74 72 75 63 74 75 72 65 64 20 68 6f 77  restructured how
9520: 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72 69 67  .        ** trig
9530: 67 65 72 20 63 6f 64 65 20 69 73 20 67 65 6e 65  ger code is gene
9540: 72 61 74 65 64 20 61 6e 64 20 73 6f 20 74 68 69  rated and so thi
9550: 73 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20 6e  s condition is n
9560: 6f 20 6c 6f 6e 67 65 72 20 0a 20 20 20 20 20 20  o longer .      
9570: 20 20 2a 2a 20 70 6f 73 73 69 62 6c 65 2e 20 48    ** possible. H
9580: 6f 77 65 76 65 72 2c 20 69 74 20 63 61 6e 20 73  owever, it can s
9590: 74 69 6c 6c 20 62 65 20 74 72 75 65 20 66 6f 72  till be true for
95a0: 20 73 74 61 74 65 6d 65 6e 74 73 20 6c 69 6b 65   statements like
95b0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
95c0: 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20 20 20 20  following:.     
95d0: 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
95e0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
95f0: 74 31 28 63 6f 6c 20 49 4e 54 45 47 45 52 29 3b  t1(col INTEGER);
9600: 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 53 45  .        **   SE
9610: 4c 45 43 54 20 28 53 45 4c 45 43 54 20 74 31 2e  LECT (SELECT t1.
9620: 63 6f 6c 29 20 46 52 4f 4d 20 46 52 4f 4d 20 74  col) FROM FROM t
9630: 31 3b 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  1;.        **.  
9640: 20 20 20 20 20 20 2a 2a 20 77 68 65 6e 20 63 6f        ** when co
9650: 6c 75 6d 6e 54 79 70 65 28 29 20 69 73 20 63 61  lumnType() is ca
9660: 6c 6c 65 64 20 6f 6e 20 74 68 65 20 65 78 70 72  lled on the expr
9670: 65 73 73 69 6f 6e 20 22 74 31 2e 63 6f 6c 22 20  ession "t1.col" 
9680: 69 6e 20 74 68 65 20 0a 20 20 20 20 20 20 20 20  in the .        
9690: 2a 2a 20 73 75 62 2d 73 65 6c 65 63 74 2e 20 49  ** sub-select. I
96a0: 6e 20 74 68 69 73 20 63 61 73 65 2c 20 73 65 74  n this case, set
96b0: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 79 70 65   the column type
96c0: 20 74 6f 20 4e 55 4c 4c 2c 20 65 76 65 6e 0a 20   to NULL, even. 
96d0: 20 20 20 20 20 20 20 2a 2a 20 74 68 6f 75 67 68         ** though
96e0: 20 69 74 20 73 68 6f 75 6c 64 20 72 65 61 6c 6c   it should reall
96f0: 79 20 62 65 20 22 49 4e 54 45 47 45 52 22 2e 0a  y be "INTEGER"..
9700: 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
9710: 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f     ** This is no
9720: 74 20 61 20 70 72 6f 62 6c 65 6d 2c 20 61 73 20  t a problem, as 
9730: 74 68 65 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20  the column type 
9740: 6f 66 20 22 74 31 2e 63 6f 6c 22 20 69 73 20 6e  of "t1.col" is n
9750: 65 76 65 72 0a 20 20 20 20 20 20 20 20 2a 2a 20  ever.        ** 
9760: 75 73 65 64 2e 20 57 68 65 6e 20 63 6f 6c 75 6d  used. When colum
9770: 6e 54 79 70 65 28 29 20 69 73 20 63 61 6c 6c 65  nType() is calle
9780: 64 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73  d on the express
9790: 69 6f 6e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ion .        ** 
97a0: 22 28 53 45 4c 45 43 54 20 74 31 2e 63 6f 6c 29  "(SELECT t1.col)
97b0: 22 2c 20 74 68 65 20 63 6f 72 72 65 63 74 20 74  ", the correct t
97c0: 79 70 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ype is returned 
97d0: 28 73 65 65 20 74 68 65 20 54 4b 5f 53 45 4c 45  (see the TK_SELE
97e0: 43 54 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 72  CT.        ** br
97f0: 61 6e 63 68 20 62 65 6c 6f 77 2e 20 20 2a 2f 0a  anch below.  */.
9800: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
9810: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 73       }..      as
9820: 73 65 72 74 28 20 70 54 61 62 20 26 26 20 70 45  sert( pTab && pE
9830: 78 70 72 2d 3e 70 54 61 62 3d 3d 70 54 61 62 20  xpr->pTab==pTab 
9840: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 20  );.      if( pS 
9850: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
9860: 65 20 22 74 61 62 6c 65 22 20 69 73 20 61 63 74  e "table" is act
9870: 75 61 6c 6c 79 20 61 20 73 75 62 2d 73 65 6c 65  ually a sub-sele
9880: 63 74 20 6f 72 20 61 20 76 69 65 77 20 69 6e 20  ct or a view in 
9890: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a  the FROM clause.
98a0: 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68          ** of th
98b0: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
98c0: 6e 74 2e 20 52 65 74 75 72 6e 20 74 68 65 20 64  nt. Return the d
98d0: 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20  eclaration type 
98e0: 61 6e 64 20 6f 72 69 67 69 6e 0a 20 20 20 20 20  and origin.     
98f0: 20 20 20 2a 2a 20 64 61 74 61 20 66 6f 72 20 74     ** data for t
9900: 68 65 20 72 65 73 75 6c 74 2d 73 65 74 20 63 6f  he result-set co
9910: 6c 75 6d 6e 20 6f 66 20 74 68 65 20 73 75 62 2d  lumn of the sub-
9920: 73 65 6c 65 63 74 2e 0a 20 20 20 20 20 20 20 20  select..        
9930: 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  */.        if( i
9940: 43 6f 6c 3e 3d 30 20 26 26 20 41 4c 57 41 59 53  Col>=0 && ALWAYS
9950: 28 69 43 6f 6c 3c 70 53 2d 3e 70 45 4c 69 73 74  (iCol<pS->pEList
9960: 2d 3e 6e 45 78 70 72 29 20 29 7b 0a 20 20 20 20  ->nExpr) ){.    
9970: 20 20 20 20 20 20 2f 2a 20 49 66 20 69 43 6f 6c        /* If iCol
9980: 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65   is less than ze
9990: 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 65 78 70  ro, then the exp
99a0: 72 65 73 73 69 6f 6e 20 72 65 71 75 65 73 74 73  ression requests
99b0: 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a   the.          *
99c0: 2a 20 72 6f 77 69 64 20 6f 66 20 74 68 65 20 73  * rowid of the s
99d0: 75 62 2d 73 65 6c 65 63 74 20 6f 72 20 76 69 65  ub-select or vie
99e0: 77 2e 20 54 68 69 73 20 65 78 70 72 65 73 73 69  w. This expressi
99f0: 6f 6e 20 69 73 20 6c 65 67 61 6c 20 28 73 65 65  on is legal (see
9a00: 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74   .          ** t
9a10: 65 73 74 20 63 61 73 65 20 6d 69 73 63 32 2e 32  est case misc2.2
9a20: 2e 32 29 20 2d 20 69 74 20 61 6c 77 61 79 73 20  .2) - it always 
9a30: 65 76 61 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c  evaluates to NUL
9a40: 4c 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  L..          */.
9a50: 20 20 20 20 20 20 20 20 20 20 4e 61 6d 65 43 6f            NameCo
9a60: 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20 20 20 20  ntext sNC;.     
9a70: 20 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70       Expr *p = p
9a80: 53 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f  S->pEList->a[iCo
9a90: 6c 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  l].pExpr;.      
9aa0: 20 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74      sNC.pSrcList
9ab0: 20 3d 20 70 53 2d 3e 70 53 72 63 3b 0a 20 20 20   = pS->pSrc;.   
9ac0: 20 20 20 20 20 20 20 73 4e 43 2e 70 4e 65 78 74         sNC.pNext
9ad0: 20 3d 20 70 4e 43 3b 0a 20 20 20 20 20 20 20 20   = pNC;.        
9ae0: 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70    sNC.pParse = p
9af0: 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20 20  NC->pParse;.    
9b00: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f        zType = co
9b10: 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70  lumnType(&sNC, p
9b20: 2c 20 26 7a 4f 72 69 67 69 6e 44 62 2c 20 26 7a  , &zOriginDb, &z
9b30: 4f 72 69 67 69 6e 54 61 62 2c 20 26 7a 4f 72 69  OriginTab, &zOri
9b40: 67 69 6e 43 6f 6c 29 3b 20 0a 20 20 20 20 20 20  ginCol); .      
9b50: 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20    }.      }else 
9b60: 69 66 28 20 41 4c 57 41 59 53 28 70 54 61 62 2d  if( ALWAYS(pTab-
9b70: 3e 70 53 63 68 65 6d 61 29 20 29 7b 0a 20 20 20  >pSchema) ){.   
9b80: 20 20 20 20 20 2f 2a 20 41 20 72 65 61 6c 20 74       /* A real t
9b90: 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  able */.        
9ba0: 61 73 73 65 72 74 28 20 21 70 53 20 29 3b 0a 20  assert( !pS );. 
9bb0: 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c         if( iCol<
9bc0: 30 20 29 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d  0 ) iCol = pTab-
9bd0: 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 20 20  >iPKey;.        
9be0: 61 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d 2d 31  assert( iCol==-1
9bf0: 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20 26 26 20   || (iCol>=0 && 
9c00: 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29  iCol<pTab->nCol)
9c10: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
9c20: 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20  iCol<0 ){.      
9c30: 20 20 20 20 7a 54 79 70 65 20 3d 20 22 49 4e 54      zType = "INT
9c40: 45 47 45 52 22 3b 0a 20 20 20 20 20 20 20 20 20  EGER";.         
9c50: 20 7a 4f 72 69 67 69 6e 43 6f 6c 20 3d 20 22 72   zOriginCol = "r
9c60: 6f 77 69 64 22 3b 0a 20 20 20 20 20 20 20 20 7d  owid";.        }
9c70: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
9c80: 7a 54 79 70 65 20 3d 20 70 54 61 62 2d 3e 61 43  zType = pTab->aC
9c90: 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a  ol[iCol].zType;.
9ca0: 20 20 20 20 20 20 20 20 20 20 7a 4f 72 69 67 69            zOrigi
9cb0: 6e 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f  nCol = pTab->aCo
9cc0: 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20  l[iCol].zName;. 
9cd0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
9ce0: 20 7a 4f 72 69 67 69 6e 54 61 62 20 3d 20 70 54   zOriginTab = pT
9cf0: 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  ab->zName;.     
9d00: 20 20 20 69 66 28 20 70 4e 43 2d 3e 70 50 61 72     if( pNC->pPar
9d10: 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  se ){.          
9d20: 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65  int iDb = sqlite
9d30: 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70  3SchemaToIndex(p
9d40: 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2c 20  NC->pParse->db, 
9d50: 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  pTab->pSchema);.
9d60: 20 20 20 20 20 20 20 20 20 20 7a 4f 72 69 67 69            zOrigi
9d70: 6e 44 62 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73  nDb = pNC->pPars
9d80: 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e  e->db->aDb[iDb].
9d90: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 7d  zName;.        }
9da0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
9db0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  reak;.    }.#ifn
9dc0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
9dd0: 53 55 42 51 55 45 52 59 0a 20 20 20 20 63 61 73  SUBQUERY.    cas
9de0: 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20  e TK_SELECT: {. 
9df0: 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72       /* The expr
9e00: 65 73 73 69 6f 6e 20 69 73 20 61 20 73 75 62 2d  ession is a sub-
9e10: 73 65 6c 65 63 74 2e 20 52 65 74 75 72 6e 20 74  select. Return t
9e20: 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74  he declaration t
9e30: 79 70 65 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a  ype and.      **
9e40: 20 6f 72 69 67 69 6e 20 69 6e 66 6f 20 66 6f 72   origin info for
9e50: 20 74 68 65 20 73 69 6e 67 6c 65 20 63 6f 6c 75   the single colu
9e60: 6d 6e 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  mn in the result
9e70: 20 73 65 74 20 6f 66 20 74 68 65 20 53 45 4c 45   set of the SELE
9e80: 43 54 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74  CT.      ** stat
9e90: 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a  ement..      */.
9ea0: 20 20 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78        NameContex
9eb0: 74 20 73 4e 43 3b 0a 20 20 20 20 20 20 53 65 6c  t sNC;.      Sel
9ec0: 65 63 74 20 2a 70 53 20 3d 20 70 45 78 70 72 2d  ect *pS = pExpr-
9ed0: 3e 78 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20  >x.pSelect;.    
9ee0: 20 20 45 78 70 72 20 2a 70 20 3d 20 70 53 2d 3e    Expr *p = pS->
9ef0: 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  pEList->a[0].pEx
9f00: 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  pr;.      assert
9f10: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
9f20: 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
9f30: 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20  elect) );.      
9f40: 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70  sNC.pSrcList = p
9f50: 53 2d 3e 70 53 72 63 3b 0a 20 20 20 20 20 20 73  S->pSrc;.      s
9f60: 4e 43 2e 70 4e 65 78 74 20 3d 20 70 4e 43 3b 0a  NC.pNext = pNC;.
9f70: 20 20 20 20 20 20 73 4e 43 2e 70 50 61 72 73 65        sNC.pParse
9f80: 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a   = pNC->pParse;.
9f90: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f        zType = co
9fa0: 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70  lumnType(&sNC, p
9fb0: 2c 20 26 7a 4f 72 69 67 69 6e 44 62 2c 20 26 7a  , &zOriginDb, &z
9fc0: 4f 72 69 67 69 6e 54 61 62 2c 20 26 7a 4f 72 69  OriginTab, &zOri
9fd0: 67 69 6e 43 6f 6c 29 3b 20 0a 20 20 20 20 20 20  ginCol); .      
9fe0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
9ff0: 64 69 66 0a 20 20 7d 0a 20 20 0a 20 20 69 66 28  dif.  }.  .  if(
a000: 20 70 7a 4f 72 69 67 69 6e 44 62 20 29 7b 0a 20   pzOriginDb ){. 
a010: 20 20 20 61 73 73 65 72 74 28 20 70 7a 4f 72 69     assert( pzOri
a020: 67 69 6e 54 61 62 20 26 26 20 70 7a 4f 72 69 67  ginTab && pzOrig
a030: 69 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 2a 70 7a  inCol );.    *pz
a040: 4f 72 69 67 69 6e 44 62 20 3d 20 7a 4f 72 69 67  OriginDb = zOrig
a050: 69 6e 44 62 3b 0a 20 20 20 20 2a 70 7a 4f 72 69  inDb;.    *pzOri
a060: 67 69 6e 54 61 62 20 3d 20 7a 4f 72 69 67 69 6e  ginTab = zOrigin
a070: 54 61 62 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67  Tab;.    *pzOrig
a080: 69 6e 43 6f 6c 20 3d 20 7a 4f 72 69 67 69 6e 43  inCol = zOriginC
a090: 6f 6c 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ol;.  }.  return
a0a0: 20 7a 54 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   zType;.}../*.**
a0b0: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
a0c0: 68 61 74 20 77 69 6c 6c 20 74 65 6c 6c 20 74 68  hat will tell th
a0d0: 65 20 56 44 42 45 20 74 68 65 20 64 65 63 6c 61  e VDBE the decla
a0e0: 72 61 74 69 6f 6e 20 74 79 70 65 73 20 6f 66 20  ration types of 
a0f0: 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68  columns.** in th
a100: 65 20 72 65 73 75 6c 74 20 73 65 74 2e 0a 2a 2f  e result set..*/
a110: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e  .static void gen
a120: 65 72 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73  erateColumnTypes
a130: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
a140: 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65  e,      /* Parse
a150: 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  r context */.  S
a160: 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
a170: 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61  ,  /* List of ta
a180: 62 6c 65 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69  bles */.  ExprLi
a190: 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a  st *pEList    /*
a1a0: 20 45 78 70 72 65 73 73 69 6f 6e 73 20 64 65 66   Expressions def
a1b0: 69 6e 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74  ining the result
a1c0: 20 73 65 74 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64   set */.){.#ifnd
a1d0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ef SQLITE_OMIT_D
a1e0: 45 43 4c 54 59 50 45 0a 20 20 56 64 62 65 20 2a  ECLTYPE.  Vdbe *
a1f0: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
a200: 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4e 61  e;.  int i;.  Na
a210: 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20  meContext sNC;. 
a220: 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20   sNC.pSrcList = 
a230: 70 54 61 62 4c 69 73 74 3b 0a 20 20 73 4e 43 2e  pTabList;.  sNC.
a240: 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b  pParse = pParse;
a250: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45  .  for(i=0; i<pE
a260: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
a270: 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 20 3d  ){.    Expr *p =
a280: 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45   pEList->a[i].pE
a290: 78 70 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  xpr;.    const c
a2a0: 68 61 72 20 2a 7a 54 79 70 65 3b 0a 23 69 66 64  har *zType;.#ifd
a2b0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
a2c0: 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41  _COLUMN_METADATA
a2d0: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
a2e0: 2a 7a 4f 72 69 67 44 62 20 3d 20 30 3b 0a 20 20  *zOrigDb = 0;.  
a2f0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f    const char *zO
a300: 72 69 67 54 61 62 20 3d 20 30 3b 0a 20 20 20 20  rigTab = 0;.    
a310: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72 69  const char *zOri
a320: 67 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 7a 54  gCol = 0;.    zT
a330: 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65  ype = columnType
a340: 28 26 73 4e 43 2c 20 70 2c 20 26 7a 4f 72 69 67  (&sNC, p, &zOrig
a350: 44 62 2c 20 26 7a 4f 72 69 67 54 61 62 2c 20 26  Db, &zOrigTab, &
a360: 7a 4f 72 69 67 43 6f 6c 29 3b 0a 0a 20 20 20 20  zOrigCol);..    
a370: 2f 2a 20 54 68 65 20 76 64 62 65 20 6d 75 73 74  /* The vdbe must
a380: 20 6d 61 6b 65 20 69 74 73 20 6f 77 6e 20 63 6f   make its own co
a390: 70 79 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  py of the column
a3a0: 2d 74 79 70 65 20 61 6e 64 20 6f 74 68 65 72 20  -type and other 
a3b0: 0a 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 73  .    ** column s
a3c0: 70 65 63 69 66 69 63 20 73 74 72 69 6e 67 73 2c  pecific strings,
a3d0: 20 69 6e 20 63 61 73 65 20 74 68 65 20 73 63 68   in case the sch
a3e0: 65 6d 61 20 69 73 20 72 65 73 65 74 20 62 65 66  ema is reset bef
a3f0: 6f 72 65 20 74 68 69 73 0a 20 20 20 20 2a 2a 20  ore this.    ** 
a400: 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20  virtual machine 
a410: 69 73 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20  is deleted..    
a420: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  */.    sqlite3Vd
a430: 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20  beSetColName(v, 
a440: 69 2c 20 43 4f 4c 4e 41 4d 45 5f 44 41 54 41 42  i, COLNAME_DATAB
a450: 41 53 45 2c 20 7a 4f 72 69 67 44 62 2c 20 53 51  ASE, zOrigDb, SQ
a460: 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
a470: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
a480: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c  SetColName(v, i,
a490: 20 43 4f 4c 4e 41 4d 45 5f 54 41 42 4c 45 2c 20   COLNAME_TABLE, 
a4a0: 7a 4f 72 69 67 54 61 62 2c 20 53 51 4c 49 54 45  zOrigTab, SQLITE
a4b0: 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20  _TRANSIENT);.   
a4c0: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
a4d0: 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c  olName(v, i, COL
a4e0: 4e 41 4d 45 5f 43 4f 4c 55 4d 4e 2c 20 7a 4f 72  NAME_COLUMN, zOr
a4f0: 69 67 43 6f 6c 2c 20 53 51 4c 49 54 45 5f 54 52  igCol, SQLITE_TR
a500: 41 4e 53 49 45 4e 54 29 3b 0a 23 65 6c 73 65 0a  ANSIENT);.#else.
a510: 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75      zType = colu
a520: 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20  mnType(&sNC, p, 
a530: 30 2c 20 30 2c 20 30 29 3b 0a 23 65 6e 64 69 66  0, 0, 0);.#endif
a540: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
a550: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c  SetColName(v, i,
a560: 20 43 4f 4c 4e 41 4d 45 5f 44 45 43 4c 54 59 50   COLNAME_DECLTYP
a570: 45 2c 20 7a 54 79 70 65 2c 20 53 51 4c 49 54 45  E, zType, SQLITE
a580: 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d  _TRANSIENT);.  }
a590: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
a5a0: 45 5f 4f 4d 49 54 5f 44 45 43 4c 54 59 50 45 20  E_OMIT_DECLTYPE 
a5b0: 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  */.}../*.** Gene
a5c0: 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77  rate code that w
a5d0: 69 6c 6c 20 74 65 6c 6c 20 74 68 65 20 56 44 42  ill tell the VDB
a5e0: 45 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 63  E the names of c
a5f0: 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65  olumns.** in the
a600: 20 72 65 73 75 6c 74 20 73 65 74 2e 20 20 54 68   result set.  Th
a610: 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  is information i
a620: 73 20 75 73 65 64 20 74 6f 20 70 72 6f 76 69 64  s used to provid
a630: 65 20 74 68 65 0a 2a 2a 20 61 7a 43 6f 6c 5b 5d  e the.** azCol[]
a640: 20 76 61 6c 75 65 73 20 69 6e 20 74 68 65 20 63   values in the c
a650: 61 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74  allback..*/.stat
a660: 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65  ic void generate
a670: 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 0a 20 20 50  ColumnNames(.  P
a680: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
a690: 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e     /* Parser con
a6a0: 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73  text */.  SrcLis
a6b0: 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 2f 2a  t *pTabList,  /*
a6c0: 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20   List of tables 
a6d0: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
a6e0: 45 4c 69 73 74 20 20 20 20 2f 2a 20 45 78 70 72  EList    /* Expr
a6f0: 65 73 73 69 6f 6e 73 20 64 65 66 69 6e 69 6e 67  essions defining
a700: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
a710: 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  */.){.  Vdbe *v 
a720: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
a730: 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 73  .  int i, j;.  s
a740: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
a750: 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 66  rse->db;.  int f
a760: 75 6c 6c 4e 61 6d 65 73 2c 20 73 68 6f 72 74 4e  ullNames, shortN
a770: 61 6d 65 73 3b 0a 0a 23 69 66 6e 64 65 66 20 53  ames;..#ifndef S
a780: 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
a790: 49 4e 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  IN.  /* If this 
a7a0: 69 73 20 61 6e 20 45 58 50 4c 41 49 4e 2c 20 73  is an EXPLAIN, s
a7b0: 6b 69 70 20 74 68 69 73 20 73 74 65 70 20 2a 2f  kip this step */
a7c0: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65  .  if( pParse->e
a7d0: 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 72 65  xplain ){.    re
a7e0: 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  turn;.  }.#endif
a7f0: 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ..  if( pParse->
a800: 63 6f 6c 4e 61 6d 65 73 53 65 74 20 7c 7c 20 4e  colNamesSet || N
a810: 45 56 45 52 28 76 3d 3d 30 29 20 7c 7c 20 64 62  EVER(v==0) || db
a820: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
a830: 20 72 65 74 75 72 6e 3b 0a 20 20 70 50 61 72 73   return;.  pPars
a840: 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 3d  e->colNamesSet =
a850: 20 31 3b 0a 20 20 66 75 6c 6c 4e 61 6d 65 73 20   1;.  fullNames 
a860: 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  = (db->flags & S
a870: 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d  QLITE_FullColNam
a880: 65 73 29 21 3d 30 3b 0a 20 20 73 68 6f 72 74 4e  es)!=0;.  shortN
a890: 61 6d 65 73 20 3d 20 28 64 62 2d 3e 66 6c 61 67  ames = (db->flag
a8a0: 73 20 26 20 53 51 4c 49 54 45 5f 53 68 6f 72 74  s & SQLITE_Short
a8b0: 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a 20 20  ColNames)!=0;.  
a8c0: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75  sqlite3VdbeSetNu
a8d0: 6d 43 6f 6c 73 28 76 2c 20 70 45 4c 69 73 74 2d  mCols(v, pEList-
a8e0: 3e 6e 45 78 70 72 29 3b 0a 20 20 66 6f 72 28 69  >nExpr);.  for(i
a8f0: 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45  =0; i<pEList->nE
a900: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45  xpr; i++){.    E
a910: 78 70 72 20 2a 70 3b 0a 20 20 20 20 70 20 3d 20  xpr *p;.    p = 
a920: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  pEList->a[i].pEx
a930: 70 72 3b 0a 20 20 20 20 69 66 28 20 4e 45 56 45  pr;.    if( NEVE
a940: 52 28 70 3d 3d 30 29 20 29 20 63 6f 6e 74 69 6e  R(p==0) ) contin
a950: 75 65 3b 0a 20 20 20 20 69 66 28 20 70 45 4c 69  ue;.    if( pELi
a960: 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 29  st->a[i].zName )
a970: 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e  {.      char *zN
a980: 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b  ame = pEList->a[
a990: 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  i].zName;.      
a9a0: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
a9b0: 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e  lName(v, i, COLN
a9c0: 41 4d 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c  AME_NAME, zName,
a9d0: 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
a9e0: 54 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  T);.    }else if
a9f0: 28 20 28 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  ( (p->op==TK_COL
aa00: 55 4d 4e 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b  UMN || p->op==TK
aa10: 5f 41 47 47 5f 43 4f 4c 55 4d 4e 29 20 26 26 20  _AGG_COLUMN) && 
aa20: 70 54 61 62 4c 69 73 74 20 29 7b 0a 20 20 20 20  pTabList ){.    
aa30: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
aa40: 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 3b       char *zCol;
aa50: 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20  .      int iCol 
aa60: 3d 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  = p->iColumn;.  
aa70: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 41 4c 57      for(j=0; ALW
aa80: 41 59 53 28 6a 3c 70 54 61 62 4c 69 73 74 2d 3e  AYS(j<pTabList->
aa90: 6e 53 72 63 29 3b 20 6a 2b 2b 29 7b 0a 20 20 20  nSrc); j++){.   
aaa0: 20 20 20 20 20 69 66 28 20 70 54 61 62 4c 69 73       if( pTabLis
aab0: 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f 72 3d  t->a[j].iCursor=
aac0: 3d 70 2d 3e 69 54 61 62 6c 65 20 29 20 62 72 65  =p->iTable ) bre
aad0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
aae0: 20 20 61 73 73 65 72 74 28 20 6a 3c 70 54 61 62    assert( j<pTab
aaf0: 4c 69 73 74 2d 3e 6e 53 72 63 20 29 3b 0a 20 20  List->nSrc );.  
ab00: 20 20 20 20 70 54 61 62 20 3d 20 70 54 61 62 4c      pTab = pTabL
ab10: 69 73 74 2d 3e 61 5b 6a 5d 2e 70 54 61 62 3b 0a  ist->a[j].pTab;.
ab20: 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30        if( iCol<0
ab30: 20 29 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e   ) iCol = pTab->
ab40: 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 61 73 73  iPKey;.      ass
ab50: 65 72 74 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c  ert( iCol==-1 ||
ab60: 20 28 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f   (iCol>=0 && iCo
ab70: 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b  l<pTab->nCol) );
ab80: 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c  .      if( iCol<
ab90: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f  0 ){.        zCo
aba0: 6c 20 3d 20 22 72 6f 77 69 64 22 3b 0a 20 20 20  l = "rowid";.   
abb0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
abc0: 20 20 7a 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61    zCol = pTab->a
abd0: 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b  Col[iCol].zName;
abe0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
abf0: 66 28 20 21 73 68 6f 72 74 4e 61 6d 65 73 20 26  f( !shortNames &
ac00: 26 20 21 66 75 6c 6c 4e 61 6d 65 73 20 29 7b 0a  & !fullNames ){.
ac10: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
ac20: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
ac30: 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45   i, COLNAME_NAME
ac40: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  , .            s
ac50: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
ac60: 62 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e  b, pEList->a[i].
ac70: 7a 53 70 61 6e 29 2c 20 53 51 4c 49 54 45 5f 44  zSpan), SQLITE_D
ac80: 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 7d  YNAMIC);.      }
ac90: 65 6c 73 65 20 69 66 28 20 66 75 6c 6c 4e 61 6d  else if( fullNam
aca0: 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68  es ){.        ch
acb0: 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20  ar *zName = 0;. 
acc0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73         zName = s
acd0: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
ace0: 2c 20 22 25 73 2e 25 73 22 2c 20 70 54 61 62 2d  , "%s.%s", pTab-
acf0: 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3b 0a 20  >zName, zCol);. 
ad00: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
ad10: 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20  beSetColName(v, 
ad20: 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c  i, COLNAME_NAME,
ad30: 20 7a 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 44   zName, SQLITE_D
ad40: 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 7d  YNAMIC);.      }
ad50: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
ad60: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
ad70: 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d  ame(v, i, COLNAM
ad80: 45 5f 4e 41 4d 45 2c 20 7a 43 6f 6c 2c 20 53 51  E_NAME, zCol, SQ
ad90: 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
ada0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
adb0: 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
adc0: 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
add0: 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41  v, i, COLNAME_NA
ade0: 4d 45 2c 20 0a 20 20 20 20 20 20 20 20 20 20 73  ME, .          s
adf0: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
ae00: 62 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e  b, pEList->a[i].
ae10: 7a 53 70 61 6e 29 2c 20 53 51 4c 49 54 45 5f 44  zSpan), SQLITE_D
ae20: 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 7d 0a 20  YNAMIC);.    }. 
ae30: 20 7d 0a 20 20 67 65 6e 65 72 61 74 65 43 6f 6c   }.  generateCol
ae40: 75 6d 6e 54 79 70 65 73 28 70 50 61 72 73 65 2c  umnTypes(pParse,
ae50: 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73   pTabList, pELis
ae60: 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76  t);.}../*.** Giv
ae70: 65 6e 20 61 20 61 6e 20 65 78 70 72 65 73 73 69  en a an expressi
ae80: 6f 6e 20 6c 69 73 74 20 28 77 68 69 63 68 20 69  on list (which i
ae90: 73 20 72 65 61 6c 6c 79 20 74 68 65 20 6c 69 73  s really the lis
aea0: 74 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73  t of expressions
aeb0: 0a 2a 2a 20 74 68 61 74 20 66 6f 72 6d 20 74 68  .** that form th
aec0: 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20  e result set of 
aed0: 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
aee0: 6e 74 29 20 63 6f 6d 70 75 74 65 20 61 70 70 72  nt) compute appr
aef0: 6f 70 72 69 61 74 65 0a 2a 2a 20 63 6f 6c 75 6d  opriate.** colum
af00: 6e 20 6e 61 6d 65 73 20 66 6f 72 20 61 20 74 61  n names for a ta
af10: 62 6c 65 20 74 68 61 74 20 77 6f 75 6c 64 20 68  ble that would h
af20: 6f 6c 64 20 74 68 65 20 65 78 70 72 65 73 73 69  old the expressi
af30: 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 41  on list..**.** A
af40: 6c 6c 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  ll column names 
af50: 77 69 6c 6c 20 62 65 20 75 6e 69 71 75 65 2e 0a  will be unique..
af60: 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65 20 63  **.** Only the c
af70: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61 72 65 20  olumn names are 
af80: 63 6f 6d 70 75 74 65 64 2e 20 20 43 6f 6c 75 6d  computed.  Colum
af90: 6e 2e 7a 54 79 70 65 2c 20 43 6f 6c 75 6d 6e 2e  n.zType, Column.
afa0: 7a 43 6f 6c 6c 2c 0a 2a 2a 20 61 6e 64 20 6f 74  zColl,.** and ot
afb0: 68 65 72 20 66 69 65 6c 64 73 20 6f 66 20 43 6f  her fields of Co
afc0: 6c 75 6d 6e 20 61 72 65 20 7a 65 72 6f 65 64 2e  lumn are zeroed.
afd0: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
afe0: 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
aff0: 73 73 2e 20 20 49 66 20 61 20 6d 65 6d 6f 72 79  ss.  If a memory
b000: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f   allocation erro
b010: 72 20 6f 63 63 75 72 73 2c 0a 2a 2a 20 73 74 6f  r occurs,.** sto
b020: 72 65 20 4e 55 4c 4c 20 69 6e 20 2a 70 61 43 6f  re NULL in *paCo
b030: 6c 20 61 6e 64 20 30 20 69 6e 20 2a 70 6e 43 6f  l and 0 in *pnCo
b040: 6c 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c  l and return SQL
b050: 49 54 45 5f 4e 4f 4d 45 4d 2e 0a 2a 2f 0a 73 74  ITE_NOMEM..*/.st
b060: 61 74 69 63 20 69 6e 74 20 73 65 6c 65 63 74 43  atic int selectC
b070: 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69  olumnsFromExprLi
b080: 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  st(.  Parse *pPa
b090: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  rse,          /*
b0a0: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
b0b0: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
b0c0: 70 45 4c 69 73 74 2c 20 20 20 20 20 20 20 2f 2a  pEList,       /*
b0d0: 20 45 78 70 72 20 6c 69 73 74 20 66 72 6f 6d 20   Expr list from 
b0e0: 77 68 69 63 68 20 74 6f 20 64 65 72 69 76 65 20  which to derive 
b0f0: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a  column names */.
b100: 20 20 69 31 36 20 2a 70 6e 43 6f 6c 2c 20 20 20    i16 *pnCol,   
b110: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
b120: 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  te the number of
b130: 20 63 6f 6c 75 6d 6e 73 20 68 65 72 65 20 2a 2f   columns here */
b140: 0a 20 20 43 6f 6c 75 6d 6e 20 2a 2a 70 61 43 6f  .  Column **paCo
b150: 6c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72  l          /* Wr
b160: 69 74 65 20 74 68 65 20 6e 65 77 20 63 6f 6c 75  ite the new colu
b170: 6d 6e 20 6c 69 73 74 20 68 65 72 65 20 2a 2f 0a  mn list here */.
b180: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
b190: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20   = pParse->db;  
b1a0: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
b1b0: 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  nection */.  int
b1c0: 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20   i, j;          
b1d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
b1e0: 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69   counters */.  i
b1f0: 6e 74 20 63 6e 74 3b 20 20 20 20 20 20 20 20 20  nt cnt;         
b200: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
b210: 64 65 78 20 61 64 64 65 64 20 74 6f 20 6d 61 6b  dex added to mak
b220: 65 20 74 68 65 20 6e 61 6d 65 20 75 6e 69 71 75  e the name uniqu
b230: 65 20 2a 2f 0a 20 20 43 6f 6c 75 6d 6e 20 2a 61  e */.  Column *a
b240: 43 6f 6c 2c 20 2a 70 43 6f 6c 3b 20 20 20 20 20  Col, *pCol;     
b250: 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e     /* For loopin
b260: 67 20 6f 76 65 72 20 72 65 73 75 6c 74 20 63 6f  g over result co
b270: 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  lumns */.  int n
b280: 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Col;            
b290: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
b2a0: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   of columns in t
b2b0: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f  he result set */
b2c0: 0a 20 20 45 78 70 72 20 2a 70 3b 20 20 20 20 20  .  Expr *p;     
b2d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
b2e0: 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 66 6f 72  * Expression for
b2f0: 20 61 20 73 69 6e 67 6c 65 20 72 65 73 75 6c 74   a single result
b300: 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63 68 61   column */.  cha
b310: 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20  r *zName;       
b320: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75           /* Colu
b330: 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74  mn name */.  int
b340: 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20   nName;         
b350: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
b360: 20 6f 66 20 6e 61 6d 65 20 69 6e 20 7a 4e 61 6d   of name in zNam
b370: 65 5b 5d 20 2a 2f 0a 0a 20 20 69 66 28 20 70 45  e[] */..  if( pE
b380: 4c 69 73 74 20 29 7b 0a 20 20 20 20 6e 43 6f 6c  List ){.    nCol
b390: 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   = pEList->nExpr
b3a0: 3b 0a 20 20 20 20 61 43 6f 6c 20 3d 20 73 71 6c  ;.    aCol = sql
b3b0: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
b3c0: 28 64 62 2c 20 73 69 7a 65 6f 66 28 61 43 6f 6c  (db, sizeof(aCol
b3d0: 5b 30 5d 29 2a 6e 43 6f 6c 29 3b 0a 20 20 20 20  [0])*nCol);.    
b3e0: 74 65 73 74 63 61 73 65 28 20 61 43 6f 6c 3d 3d  testcase( aCol==
b3f0: 30 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  0 );.  }else{.  
b400: 20 20 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20    nCol = 0;.    
b410: 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  aCol = 0;.  }.  
b420: 2a 70 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20  *pnCol = nCol;. 
b430: 20 2a 70 61 43 6f 6c 20 3d 20 61 43 6f 6c 3b 0a   *paCol = aCol;.
b440: 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 43 6f 6c  .  for(i=0, pCol
b450: 3d 61 43 6f 6c 3b 20 69 3c 6e 43 6f 6c 3b 20 69  =aCol; i<nCol; i
b460: 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20  ++, pCol++){.   
b470: 20 2f 2a 20 47 65 74 20 61 6e 20 61 70 70 72 6f   /* Get an appro
b480: 70 72 69 61 74 65 20 6e 61 6d 65 20 66 6f 72 20  priate name for 
b490: 74 68 65 20 63 6f 6c 75 6d 6e 0a 20 20 20 20 2a  the column.    *
b4a0: 2f 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65  /.    p = sqlite
b4b0: 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65  3ExprSkipCollate
b4c0: 28 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  (pEList->a[i].pE
b4d0: 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20 28 7a  xpr);.    if( (z
b4e0: 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61  Name = pEList->a
b4f0: 5b 69 5d 2e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b  [i].zName)!=0 ){
b500: 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
b510: 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 73   column contains
b520: 20 61 6e 20 22 41 53 20 3c 6e 61 6d 65 3e 22 20   an "AS <name>" 
b530: 70 68 72 61 73 65 2c 20 75 73 65 20 3c 6e 61 6d  phrase, use <nam
b540: 65 3e 20 61 73 20 74 68 65 20 6e 61 6d 65 20 2a  e> as the name *
b550: 2f 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20  /.      zName = 
b560: 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
b570: 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  db, zName);.    
b580: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 45 78 70  }else{.      Exp
b590: 72 20 2a 70 43 6f 6c 45 78 70 72 20 3d 20 70 3b  r *pColExpr = p;
b5a0: 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73    /* The express
b5b0: 69 6f 6e 20 74 68 61 74 20 69 73 20 74 68 65 20  ion that is the 
b5c0: 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 20 6e 61  result column na
b5d0: 6d 65 20 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c  me */.      Tabl
b5e0: 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20  e *pTab;        
b5f0: 20 2f 2a 20 54 61 62 6c 65 20 61 73 73 6f 63 69   /* Table associ
b600: 61 74 65 64 20 77 69 74 68 20 74 68 69 73 20 65  ated with this e
b610: 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20  xpression */.   
b620: 20 20 20 77 68 69 6c 65 28 20 70 43 6f 6c 45 78     while( pColEx
b630: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29  pr->op==TK_DOT )
b640: 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 45 78  {.        pColEx
b650: 70 72 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 70  pr = pColExpr->p
b660: 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 61  Right;.        a
b670: 73 73 65 72 74 28 20 70 43 6f 6c 45 78 70 72 21  ssert( pColExpr!
b680: 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  =0 );.      }.  
b690: 20 20 20 20 69 66 28 20 70 43 6f 6c 45 78 70 72      if( pColExpr
b6a0: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
b6b0: 26 26 20 41 4c 57 41 59 53 28 70 43 6f 6c 45 78  && ALWAYS(pColEx
b6c0: 70 72 2d 3e 70 54 61 62 21 3d 30 29 20 29 7b 0a  pr->pTab!=0) ){.
b6d0: 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 63          /* For c
b6e0: 6f 6c 75 6d 6e 73 20 75 73 65 20 74 68 65 20 63  olumns use the c
b6f0: 6f 6c 75 6d 6e 20 6e 61 6d 65 20 6e 61 6d 65 20  olumn name name 
b700: 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  */.        int i
b710: 43 6f 6c 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e  Col = pColExpr->
b720: 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20  iColumn;.       
b730: 20 70 54 61 62 20 3d 20 70 43 6f 6c 45 78 70 72   pTab = pColExpr
b740: 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20  ->pTab;.        
b750: 69 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f  if( iCol<0 ) iCo
b760: 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b  l = pTab->iPKey;
b770: 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  .        zName =
b780: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
b790: 64 62 2c 20 22 25 73 22 2c 0a 20 20 20 20 20 20  db, "%s",.      
b7a0: 20 20 20 20 20 20 20 20 20 20 20 69 43 6f 6c 3e             iCol>
b7b0: 3d 30 20 3f 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  =0 ? pTab->aCol[
b7c0: 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 20 3a 20 22 72  iCol].zName : "r
b7d0: 6f 77 69 64 22 29 3b 0a 20 20 20 20 20 20 7d 65  owid");.      }e
b7e0: 6c 73 65 20 69 66 28 20 70 43 6f 6c 45 78 70 72  lse if( pColExpr
b7f0: 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 7b 0a 20  ->op==TK_ID ){. 
b800: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
b810: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
b820: 70 43 6f 6c 45 78 70 72 2c 20 45 50 5f 49 6e 74  pColExpr, EP_Int
b830: 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20  Value) );.      
b840: 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
b850: 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73  3MPrintf(db, "%s
b860: 22 2c 20 70 43 6f 6c 45 78 70 72 2d 3e 75 2e 7a  ", pColExpr->u.z
b870: 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 7d 65  Token);.      }e
b880: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
b890: 55 73 65 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  Use the original
b8a0: 20 74 65 78 74 20 6f 66 20 74 68 65 20 63 6f 6c   text of the col
b8b0: 75 6d 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61  umn expression a
b8c0: 73 20 69 74 73 20 6e 61 6d 65 20 2a 2f 0a 20 20  s its name */.  
b8d0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71        zName = sq
b8e0: 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
b8f0: 20 22 25 73 22 2c 20 70 45 4c 69 73 74 2d 3e 61   "%s", pEList->a
b900: 5b 69 5d 2e 7a 53 70 61 6e 29 3b 0a 20 20 20 20  [i].zSpan);.    
b910: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
b920: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
b930: 65 64 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ed ){.      sqli
b940: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e  te3DbFree(db, zN
b950: 61 6d 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ame);.      brea
b960: 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
b970: 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 63   Make sure the c
b980: 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 73 20 75 6e  olumn name is un
b990: 69 71 75 65 2e 20 20 49 66 20 74 68 65 20 6e 61  ique.  If the na
b9a0: 6d 65 20 69 73 20 6e 6f 74 20 75 6e 69 71 75 65  me is not unique
b9b0: 2c 0a 20 20 20 20 2a 2a 20 61 70 70 65 6e 64 20  ,.    ** append 
b9c0: 61 20 69 6e 74 65 67 65 72 20 74 6f 20 74 68 65  a integer to the
b9d0: 20 6e 61 6d 65 20 73 6f 20 74 68 61 74 20 69 74   name so that it
b9e0: 20 62 65 63 6f 6d 65 73 20 75 6e 69 71 75 65 2e   becomes unique.
b9f0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e 4e 61 6d  .    */.    nNam
ba00: 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  e = sqlite3Strle
ba10: 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  n30(zName);.    
ba20: 66 6f 72 28 6a 3d 63 6e 74 3d 30 3b 20 6a 3c 69  for(j=cnt=0; j<i
ba30: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; j++){.      if
ba40: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
ba50: 28 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20  (aCol[j].zName, 
ba60: 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20  zName)==0 ){.   
ba70: 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 65 77 4e       char *zNewN
ba80: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  ame;.        int
ba90: 20 6b 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   k;.        for(
baa0: 6b 3d 6e 4e 61 6d 65 2d 31 3b 20 6b 3e 31 20 26  k=nName-1; k>1 &
bab0: 26 20 73 71 6c 69 74 65 33 49 73 64 69 67 69 74  & sqlite3Isdigit
bac0: 28 7a 4e 61 6d 65 5b 6b 5d 29 3b 20 6b 2d 2d 29  (zName[k]); k--)
bad0: 7b 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a  {}.        if( z
bae0: 4e 61 6d 65 5b 6b 5d 3d 3d 27 3a 27 20 29 20 6e  Name[k]==':' ) n
baf0: 4e 61 6d 65 20 3d 20 6b 3b 0a 20 20 20 20 20 20  Name = k;.      
bb00: 20 20 7a 4e 61 6d 65 5b 6e 4e 61 6d 65 5d 20 3d    zName[nName] =
bb10: 20 30 3b 0a 20 20 20 20 20 20 20 20 7a 4e 65 77   0;.        zNew
bb20: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50  Name = sqlite3MP
bb30: 72 69 6e 74 66 28 64 62 2c 20 22 25 73 3a 25 64  rintf(db, "%s:%d
bb40: 22 2c 20 7a 4e 61 6d 65 2c 20 2b 2b 63 6e 74 29  ", zName, ++cnt)
bb50: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
bb60: 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d  3DbFree(db, zNam
bb70: 65 29 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d  e);.        zNam
bb80: 65 20 3d 20 7a 4e 65 77 4e 61 6d 65 3b 0a 20 20  e = zNewName;.  
bb90: 20 20 20 20 20 20 6a 20 3d 20 2d 31 3b 0a 20 20        j = -1;.  
bba0: 20 20 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d        if( zName=
bbb0: 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
bbc0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 43    }.    }.    pC
bbd0: 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d  ol->zName = zNam
bbe0: 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 64 62 2d  e;.  }.  if( db-
bbf0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
bc00: 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  .    for(j=0; j<
bc10: 69 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 73  i; j++){.      s
bc20: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
bc30: 20 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 29 3b   aCol[j].zName);
bc40: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
bc50: 65 33 44 62 46 72 65 65 28 64 62 2c 20 61 43 6f  e3DbFree(db, aCo
bc60: 6c 29 3b 0a 20 20 20 20 2a 70 61 43 6f 6c 20 3d  l);.    *paCol =
bc70: 20 30 3b 0a 20 20 20 20 2a 70 6e 43 6f 6c 20 3d   0;.    *pnCol =
bc80: 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   0;.    return S
bc90: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
bca0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
bcb0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  _OK;.}../*.** Ad
bcc0: 64 20 74 79 70 65 20 61 6e 64 20 63 6f 6c 6c 61  d type and colla
bcd0: 74 69 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  tion information
bce0: 20 74 6f 20 61 20 63 6f 6c 75 6d 6e 20 6c 69 73   to a column lis
bcf0: 74 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 61 20  t based on.** a 
bd00: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
bd10: 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 65 20 63 6f 6c  ..** .** The col
bd20: 75 6d 6e 20 6c 69 73 74 20 70 72 65 73 75 6d 61  umn list presuma
bd30: 62 6c 79 20 63 61 6d 65 20 66 72 6f 6d 20 73 65  bly came from se
bd40: 6c 65 63 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 46  lectColumnNamesF
bd50: 72 6f 6d 45 78 70 72 4c 69 73 74 28 29 2e 0a 2a  romExprList()..*
bd60: 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73  * The column lis
bd70: 74 20 68 61 73 20 6f 6e 6c 79 20 6e 61 6d 65 73  t has only names
bd80: 2c 20 6e 6f 74 20 74 79 70 65 73 20 6f 72 20 63  , not types or c
bd90: 6f 6c 6c 61 74 69 6f 6e 73 2e 20 20 54 68 69 73  ollations.  This
bda0: 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67 6f 65 73  .** routine goes
bdb0: 20 74 68 72 6f 75 67 68 20 61 6e 64 20 61 64 64   through and add
bdc0: 73 20 74 68 65 20 74 79 70 65 73 20 61 6e 64 20  s the types and 
bdd0: 63 6f 6c 6c 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a  collations..**.*
bde0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
bdf0: 65 71 75 69 72 65 73 20 74 68 61 74 20 61 6c 6c  equires that all
be00: 20 69 64 65 6e 74 69 66 69 65 72 73 20 69 6e 20   identifiers in 
be10: 74 68 65 20 53 45 4c 45 43 54 0a 2a 2a 20 73 74  the SELECT.** st
be20: 61 74 65 6d 65 6e 74 20 62 65 20 72 65 73 6f 6c  atement be resol
be30: 76 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ved..*/.static v
be40: 6f 69 64 20 73 65 6c 65 63 74 41 64 64 43 6f 6c  oid selectAddCol
be50: 75 6d 6e 54 79 70 65 41 6e 64 43 6f 6c 6c 61 74  umnTypeAndCollat
be60: 69 6f 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ion(.  Parse *pP
be70: 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  arse,        /* 
be80: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 73  Parsing contexts
be90: 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 2c 20   */.  int nCol, 
bea0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
beb0: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
bec0: 20 2a 2f 0a 20 20 43 6f 6c 75 6d 6e 20 2a 61 43   */.  Column *aC
bed0: 6f 6c 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4c  ol,         /* L
bee0: 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 2a  ist of columns *
bef0: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  /.  Select *pSel
bf00: 65 63 74 20 20 20 20 20 20 20 2f 2a 20 53 45 4c  ect       /* SEL
bf10: 45 43 54 20 75 73 65 64 20 74 6f 20 64 65 74 65  ECT used to dete
bf20: 72 6d 69 6e 65 20 74 79 70 65 73 20 61 6e 64 20  rmine types and 
bf30: 63 6f 6c 6c 61 74 69 6f 6e 73 20 2a 2f 0a 29 7b  collations */.){
bf40: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
bf50: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 4e   pParse->db;.  N
bf60: 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a  ameContext sNC;.
bf70: 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a    Column *pCol;.
bf80: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
bf90: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 45 78 70  ;.  int i;.  Exp
bfa0: 72 20 2a 70 3b 0a 20 20 73 74 72 75 63 74 20 45  r *p;.  struct E
bfb0: 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b  xprList_item *a;
bfc0: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 53 65 6c  ..  assert( pSel
bfd0: 65 63 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ect!=0 );.  asse
bfe0: 72 74 28 20 28 70 53 65 6c 65 63 74 2d 3e 73 65  rt( (pSelect->se
bff0: 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65 73 6f  lFlags & SF_Reso
c000: 6c 76 65 64 29 21 3d 30 20 29 3b 0a 20 20 61 73  lved)!=0 );.  as
c010: 73 65 72 74 28 20 6e 43 6f 6c 3d 3d 70 53 65 6c  sert( nCol==pSel
c020: 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  ect->pEList->nEx
c030: 70 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  pr || db->malloc
c040: 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20  Failed );.  if( 
c050: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
c060: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 6d 65 6d   ) return;.  mem
c070: 73 65 74 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a  set(&sNC, 0, siz
c080: 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20 73 4e 43  eof(sNC));.  sNC
c090: 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 53 65 6c  .pSrcList = pSel
c0a0: 65 63 74 2d 3e 70 53 72 63 3b 0a 20 20 61 20 3d  ect->pSrc;.  a =
c0b0: 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74   pSelect->pEList
c0c0: 2d 3e 61 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20  ->a;.  for(i=0, 
c0d0: 70 43 6f 6c 3d 61 43 6f 6c 3b 20 69 3c 6e 43 6f  pCol=aCol; i<nCo
c0e0: 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b  l; i++, pCol++){
c0f0: 0a 20 20 20 20 70 20 3d 20 61 5b 69 5d 2e 70 45  .    p = a[i].pE
c100: 78 70 72 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 7a  xpr;.    pCol->z
c110: 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33 44 62  Type = sqlite3Db
c120: 53 74 72 44 75 70 28 64 62 2c 20 63 6f 6c 75 6d  StrDup(db, colum
c130: 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 30  nType(&sNC, p, 0
c140: 2c 20 30 2c 20 30 29 29 3b 0a 20 20 20 20 70 43  , 0, 0));.    pC
c150: 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 73  ol->affinity = s
c160: 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69  qlite3ExprAffini
c170: 74 79 28 70 29 3b 0a 20 20 20 20 69 66 28 20 70  ty(p);.    if( p
c180: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 30  Col->affinity==0
c190: 20 29 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74   ) pCol->affinit
c1a0: 79 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  y = SQLITE_AFF_N
c1b0: 4f 4e 45 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d  ONE;.    pColl =
c1c0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
c1d0: 53 65 71 28 70 50 61 72 73 65 2c 20 70 29 3b 0a  Seq(pParse, p);.
c1e0: 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b      if( pColl ){
c1f0: 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 43 6f  .      pCol->zCo
c200: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  ll = sqlite3DbSt
c210: 72 44 75 70 28 64 62 2c 20 70 43 6f 6c 6c 2d 3e  rDup(db, pColl->
c220: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20  zName);.    }.  
c230: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  }.}../*.** Given
c240: 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
c250: 65 6e 74 2c 20 67 65 6e 65 72 61 74 65 20 61 20  ent, generate a 
c260: 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  Table structure 
c270: 74 68 61 74 20 64 65 73 63 72 69 62 65 73 0a 2a  that describes.*
c280: 2a 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  * the result set
c290: 20 6f 66 20 74 68 61 74 20 53 45 4c 45 43 54 2e   of that SELECT.
c2a0: 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74  .*/.Table *sqlit
c2b0: 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c  e3ResultSetOfSel
c2c0: 65 63 74 28 50 61 72 73 65 20 2a 70 50 61 72 73  ect(Parse *pPars
c2d0: 65 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  e, Select *pSele
c2e0: 63 74 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54  ct){.  Table *pT
c2f0: 61 62 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ab;.  sqlite3 *d
c300: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
c310: 20 20 69 6e 74 20 73 61 76 65 64 46 6c 61 67 73    int savedFlags
c320: 3b 0a 0a 20 20 73 61 76 65 64 46 6c 61 67 73 20  ;..  savedFlags 
c330: 3d 20 64 62 2d 3e 66 6c 61 67 73 3b 0a 20 20 64  = db->flags;.  d
c340: 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c  b->flags &= ~SQL
c350: 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73  ITE_FullColNames
c360: 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d  ;.  db->flags |=
c370: 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c   SQLITE_ShortCol
c380: 4e 61 6d 65 73 3b 0a 20 20 73 71 6c 69 74 65 33  Names;.  sqlite3
c390: 53 65 6c 65 63 74 50 72 65 70 28 70 50 61 72 73  SelectPrep(pPars
c3a0: 65 2c 20 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a  e, pSelect, 0);.
c3b0: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
c3c0: 72 72 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  rr ) return 0;. 
c3d0: 20 77 68 69 6c 65 28 20 70 53 65 6c 65 63 74 2d   while( pSelect-
c3e0: 3e 70 50 72 69 6f 72 20 29 20 70 53 65 6c 65 63  >pPrior ) pSelec
c3f0: 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 50 72  t = pSelect->pPr
c400: 69 6f 72 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73  ior;.  db->flags
c410: 20 3d 20 73 61 76 65 64 46 6c 61 67 73 3b 0a 20   = savedFlags;. 
c420: 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 44   pTab = sqlite3D
c430: 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
c440: 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 20 29 3b  sizeof(Table) );
c450: 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29  .  if( pTab==0 )
c460: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
c470: 20 20 7d 0a 20 20 2f 2a 20 54 68 65 20 73 71 6c    }.  /* The sql
c480: 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53  ite3ResultSetOfS
c490: 65 6c 65 63 74 28 29 20 69 73 20 6f 6e 6c 79 20  elect() is only 
c4a0: 75 73 65 64 20 6e 20 63 6f 6e 74 65 78 74 73 20  used n contexts 
c4b0: 77 68 65 72 65 20 6c 6f 6f 6b 61 73 69 64 65 0a  where lookaside.
c4c0: 20 20 2a 2a 20 69 73 20 64 69 73 61 62 6c 65 64    ** is disabled
c4d0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 64 62   */.  assert( db
c4e0: 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e 61  ->lookaside.bEna
c4f0: 62 6c 65 64 3d 3d 30 20 29 3b 0a 20 20 70 54 61  bled==0 );.  pTa
c500: 62 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 70  b->nRef = 1;.  p
c510: 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a  Tab->zName = 0;.
c520: 20 20 70 54 61 62 2d 3e 6e 52 6f 77 45 73 74 20    pTab->nRowEst 
c530: 3d 20 31 30 30 30 30 30 30 3b 0a 20 20 73 65 6c  = 1000000;.  sel
c540: 65 63 74 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78  ectColumnsFromEx
c550: 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
c560: 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2c 20  Select->pEList, 
c570: 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 26 70 54  &pTab->nCol, &pT
c580: 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20 20 73 65 6c  ab->aCol);.  sel
c590: 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65  ectAddColumnType
c5a0: 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 70 50 61  AndCollation(pPa
c5b0: 72 73 65 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c 2c  rse, pTab->nCol,
c5c0: 20 70 54 61 62 2d 3e 61 43 6f 6c 2c 20 70 53 65   pTab->aCol, pSe
c5d0: 6c 65 63 74 29 3b 0a 20 20 70 54 61 62 2d 3e 69  lect);.  pTab->i
c5e0: 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 69 66 28  PKey = -1;.  if(
c5f0: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
c600: 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  d ){.    sqlite3
c610: 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20  DeleteTable(db, 
c620: 70 54 61 62 29 3b 0a 20 20 20 20 72 65 74 75 72  pTab);.    retur
c630: 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 0;.  }.  retur
c640: 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pTab;.}../*.**
c650: 20 47 65 74 20 61 20 56 44 42 45 20 66 6f 72 20   Get a VDBE for 
c660: 74 68 65 20 67 69 76 65 6e 20 70 61 72 73 65 72  the given parser
c670: 20 63 6f 6e 74 65 78 74 2e 20 20 43 72 65 61 74   context.  Creat
c680: 65 20 61 20 6e 65 77 20 6f 6e 65 20 69 66 20 6e  e a new one if n
c690: 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20 49 66 20  ecessary..** If 
c6a0: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
c6b0: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20 61 6e 64   return NULL and
c6c0: 20 6c 65 61 76 65 20 61 20 6d 65 73 73 61 67 65   leave a message
c6d0: 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 56   in pParse..*/.V
c6e0: 64 62 65 20 2a 73 71 6c 69 74 65 33 47 65 74 56  dbe *sqlite3GetV
c6f0: 64 62 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  dbe(Parse *pPars
c700: 65 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  e){.  Vdbe *v = 
c710: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
c720: 20 69 66 28 20 76 3d 3d 30 20 29 7b 0a 20 20 20   if( v==0 ){.   
c730: 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64   v = pParse->pVd
c740: 62 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  be = sqlite3Vdbe
c750: 43 72 65 61 74 65 28 70 50 61 72 73 65 2d 3e 64  Create(pParse->d
c760: 62 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  b);.#ifndef SQLI
c770: 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a 20 20  TE_OMIT_TRACE.  
c780: 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 20    if( v ){.     
c790: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
c7a0: 70 30 28 76 2c 20 4f 50 5f 54 72 61 63 65 29 3b  p0(v, OP_Trace);
c7b0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
c7c0: 7d 0a 20 20 72 65 74 75 72 6e 20 76 3b 0a 7d 0a  }.  return v;.}.
c7d0: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20  ../*.** Compute 
c7e0: 74 68 65 20 69 4c 69 6d 69 74 20 61 6e 64 20 69  the iLimit and i
c7f0: 4f 66 66 73 65 74 20 66 69 65 6c 64 73 20 6f 66  Offset fields of
c800: 20 74 68 65 20 53 45 4c 45 43 54 20 62 61 73 65   the SELECT base
c810: 64 20 6f 6e 20 74 68 65 0a 2a 2a 20 70 4c 69 6d  d on the.** pLim
c820: 69 74 20 61 6e 64 20 70 4f 66 66 73 65 74 20 65  it and pOffset e
c830: 78 70 72 65 73 73 69 6f 6e 73 2e 20 20 70 4c 69  xpressions.  pLi
c840: 6d 69 74 20 61 6e 64 20 70 4f 66 66 73 65 74 20  mit and pOffset 
c850: 68 6f 6c 64 20 74 68 65 20 65 78 70 72 65 73 73  hold the express
c860: 69 6f 6e 73 0a 2a 2a 20 74 68 61 74 20 61 70 70  ions.** that app
c870: 65 61 72 20 69 6e 20 74 68 65 20 6f 72 69 67 69  ear in the origi
c880: 6e 61 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  nal SQL statemen
c890: 74 20 61 66 74 65 72 20 74 68 65 20 4c 49 4d 49  t after the LIMI
c8a0: 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 2a 2a 20  T and OFFSET.** 
c8b0: 6b 65 79 77 6f 72 64 73 2e 20 20 4f 72 20 4e 55  keywords.  Or NU
c8c0: 4c 4c 20 69 66 20 74 68 6f 73 65 20 6b 65 79 77  LL if those keyw
c8d0: 6f 72 64 73 20 61 72 65 20 6f 6d 69 74 74 65 64  ords are omitted
c8e0: 2e 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66  . iLimit and iOf
c8f0: 66 73 65 74 20 0a 2a 2a 20 61 72 65 20 74 68 65  fset .** are the
c900: 20 69 6e 74 65 67 65 72 20 6d 65 6d 6f 72 79 20   integer memory 
c910: 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 73  register numbers
c920: 20 66 6f 72 20 63 6f 75 6e 74 65 72 73 20 75 73   for counters us
c930: 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 0a 2a  ed to compute .*
c940: 2a 20 74 68 65 20 6c 69 6d 69 74 20 61 6e 64 20  * the limit and 
c950: 6f 66 66 73 65 74 2e 20 20 49 66 20 74 68 65 72  offset.  If ther
c960: 65 20 69 73 20 6e 6f 20 6c 69 6d 69 74 20 61 6e  e is no limit an
c970: 64 2f 6f 72 20 6f 66 66 73 65 74 2c 20 74 68 65  d/or offset, the
c980: 6e 20 0a 2a 2a 20 69 4c 69 6d 69 74 20 61 6e 64  n .** iLimit and
c990: 20 69 4f 66 66 73 65 74 20 61 72 65 20 6e 65 67   iOffset are neg
c9a0: 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ative..**.** Thi
c9b0: 73 20 72 6f 75 74 69 6e 65 20 63 68 61 6e 67 65  s routine change
c9c0: 73 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66 20  s the values of 
c9d0: 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73  iLimit and iOffs
c9e0: 65 74 20 6f 6e 6c 79 20 69 66 0a 2a 2a 20 61 20  et only if.** a 
c9f0: 6c 69 6d 69 74 20 6f 72 20 6f 66 66 73 65 74 20  limit or offset 
ca00: 69 73 20 64 65 66 69 6e 65 64 20 62 79 20 70 4c  is defined by pL
ca10: 69 6d 69 74 20 61 6e 64 20 70 4f 66 66 73 65 74  imit and pOffset
ca20: 2e 20 20 69 4c 69 6d 69 74 20 61 6e 64 0a 2a 2a  .  iLimit and.**
ca30: 20 69 4f 66 66 73 65 74 20 73 68 6f 75 6c 64 20   iOffset should 
ca40: 68 61 76 65 20 62 65 65 6e 20 70 72 65 73 65 74  have been preset
ca50: 20 74 6f 20 61 70 70 72 6f 70 72 69 61 74 65 20   to appropriate 
ca60: 64 65 66 61 75 6c 74 20 76 61 6c 75 65 73 0a 2a  default values.*
ca70: 2a 20 28 75 73 75 61 6c 6c 79 20 62 75 74 20 6e  * (usually but n
ca80: 6f 74 20 61 6c 77 61 79 73 20 2d 31 29 20 70 72  ot always -1) pr
ca90: 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74  ior to calling t
caa0: 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 20  his routine..** 
cab0: 4f 6e 6c 79 20 69 66 20 70 4c 69 6d 69 74 21 3d  Only if pLimit!=
cac0: 30 20 6f 72 20 70 4f 66 66 73 65 74 21 3d 30 20  0 or pOffset!=0 
cad0: 64 6f 20 74 68 65 20 6c 69 6d 69 74 20 72 65 67  do the limit reg
cae0: 69 73 74 65 72 73 20 67 65 74 0a 2a 2a 20 72 65  isters get.** re
caf0: 64 65 66 69 6e 65 64 2e 20 20 54 68 65 20 55 4e  defined.  The UN
cb00: 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72  ION ALL operator
cb10: 20 75 73 65 73 20 74 68 69 73 20 70 72 6f 70 65   uses this prope
cb20: 72 74 79 20 74 6f 20 66 6f 72 63 65 0a 2a 2a 20  rty to force.** 
cb30: 74 68 65 20 72 65 75 73 65 20 6f 66 20 74 68 65  the reuse of the
cb40: 20 73 61 6d 65 20 6c 69 6d 69 74 20 61 6e 64 20   same limit and 
cb50: 6f 66 66 73 65 74 20 72 65 67 69 73 74 65 72 73  offset registers
cb60: 20 61 63 72 6f 73 73 20 6d 75 6c 74 69 70 6c 65   across multiple
cb70: 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65  .** SELECT state
cb80: 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  ments..*/.static
cb90: 20 76 6f 69 64 20 63 6f 6d 70 75 74 65 4c 69 6d   void computeLim
cba0: 69 74 52 65 67 69 73 74 65 72 73 28 50 61 72 73  itRegisters(Pars
cbb0: 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63  e *pParse, Selec
cbc0: 74 20 2a 70 2c 20 69 6e 74 20 69 42 72 65 61 6b  t *p, int iBreak
cbd0: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 30  ){.  Vdbe *v = 0
cbe0: 3b 0a 20 20 69 6e 74 20 69 4c 69 6d 69 74 20 3d  ;.  int iLimit =
cbf0: 20 30 3b 0a 20 20 69 6e 74 20 69 4f 66 66 73 65   0;.  int iOffse
cc00: 74 3b 0a 20 20 69 6e 74 20 61 64 64 72 31 2c 20  t;.  int addr1, 
cc10: 6e 3b 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d  n;.  if( p->iLim
cc20: 69 74 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  it ) return;..  
cc30: 2f 2a 20 0a 20 20 2a 2a 20 22 4c 49 4d 49 54 20  /* .  ** "LIMIT 
cc40: 2d 31 22 20 61 6c 77 61 79 73 20 73 68 6f 77 73  -1" always shows
cc50: 20 61 6c 6c 20 72 6f 77 73 2e 20 20 54 68 65 72   all rows.  Ther
cc60: 65 20 69 73 20 73 6f 6d 65 0a 20 20 2a 2a 20 63  e is some.  ** c
cc70: 6f 6e 74 72 6f 76 65 72 73 79 20 61 62 6f 75 74  ontroversy about
cc80: 20 77 68 61 74 20 74 68 65 20 63 6f 72 72 65 63   what the correc
cc90: 74 20 62 65 68 61 76 69 6f 72 20 73 68 6f 75 6c  t behavior shoul
cca0: 64 20 62 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63  d be..  ** The c
ccb0: 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74  urrent implement
ccc0: 61 74 69 6f 6e 20 69 6e 74 65 72 70 72 65 74 73  ation interprets
ccd0: 20 22 4c 49 4d 49 54 20 30 22 20 74 6f 20 6d 65   "LIMIT 0" to me
cce0: 61 6e 0a 20 20 2a 2a 20 6e 6f 20 72 6f 77 73 2e  an.  ** no rows.
ccf0: 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45  .  */.  sqlite3E
cd00: 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50  xprCacheClear(pP
cd10: 61 72 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28  arse);.  assert(
cd20: 20 70 2d 3e 70 4f 66 66 73 65 74 3d 3d 30 20 7c   p->pOffset==0 |
cd30: 7c 20 70 2d 3e 70 4c 69 6d 69 74 21 3d 30 20 29  | p->pLimit!=0 )
cd40: 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4c 69 6d 69  ;.  if( p->pLimi
cd50: 74 20 29 7b 0a 20 20 20 20 70 2d 3e 69 4c 69 6d  t ){.    p->iLim
cd60: 69 74 20 3d 20 69 4c 69 6d 69 74 20 3d 20 2b 2b  it = iLimit = ++
cd70: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
cd80: 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
cd90: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
cda0: 20 20 69 66 28 20 4e 45 56 45 52 28 76 3d 3d 30    if( NEVER(v==0
cdb0: 29 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20  ) ) return;  /* 
cdc0: 56 44 42 45 20 73 68 6f 75 6c 64 20 68 61 76 65  VDBE should have
cdd0: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c   already been al
cde0: 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20 20 20 69  located */.    i
cdf0: 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  f( sqlite3ExprIs
ce00: 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c 69 6d 69  Integer(p->pLimi
ce10: 74 2c 20 26 6e 29 20 29 7b 0a 20 20 20 20 20 20  t, &n) ){.      
ce20: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
ce30: 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
ce40: 20 6e 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20   n, iLimit);.   
ce50: 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
ce60: 76 2c 20 22 4c 49 4d 49 54 20 63 6f 75 6e 74 65  v, "LIMIT counte
ce70: 72 22 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  r"));.      if( 
ce80: 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  n==0 ){.        
ce90: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
cea0: 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
ceb0: 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
cec0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
ced0: 66 28 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  f( p->nSelectRow
cee0: 20 3e 20 6e 20 29 20 70 2d 3e 6e 53 65 6c 65 63   > n ) p->nSelec
cef0: 74 52 6f 77 20 3d 20 6e 3b 0a 20 20 20 20 20 20  tRow = n;.      
cf00: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
cf10: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
cf20: 64 65 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 4c  de(pParse, p->pL
cf30: 69 6d 69 74 2c 20 69 4c 69 6d 69 74 29 3b 0a 20  imit, iLimit);. 
cf40: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
cf50: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4d 75 73  AddOp1(v, OP_Mus
cf60: 74 42 65 49 6e 74 2c 20 69 4c 69 6d 69 74 29 3b  tBeInt, iLimit);
cf70: 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
cf80: 6e 74 28 28 76 2c 20 22 4c 49 4d 49 54 20 63 6f  nt((v, "LIMIT co
cf90: 75 6e 74 65 72 22 29 29 3b 0a 20 20 20 20 20 20  unter"));.      
cfa0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
cfb0: 32 28 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c 20  2(v, OP_IfZero, 
cfc0: 69 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b 29 3b  iLimit, iBreak);
cfd0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
cfe0: 2d 3e 70 4f 66 66 73 65 74 20 29 7b 0a 20 20 20  ->pOffset ){.   
cff0: 20 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20     p->iOffset = 
d000: 69 4f 66 66 73 65 74 20 3d 20 2b 2b 70 50 61 72  iOffset = ++pPar
d010: 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
d020: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 20  pParse->nMem++; 
d030: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e    /* Allocate an
d040: 20 65 78 74 72 61 20 72 65 67 69 73 74 65 72 20   extra register 
d050: 66 6f 72 20 6c 69 6d 69 74 2b 6f 66 66 73 65 74  for limit+offset
d060: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
d070: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
d080: 2c 20 70 2d 3e 70 4f 66 66 73 65 74 2c 20 69 4f  , p->pOffset, iO
d090: 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 73 71  ffset);.      sq
d0a0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
d0b0: 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c  v, OP_MustBeInt,
d0c0: 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20   iOffset);.     
d0d0: 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
d0e0: 20 22 4f 46 46 53 45 54 20 63 6f 75 6e 74 65 72   "OFFSET counter
d0f0: 22 29 29 3b 0a 20 20 20 20 20 20 61 64 64 72 31  "));.      addr1
d100: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
d110: 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 50 6f 73  dOp1(v, OP_IfPos
d120: 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20  , iOffset);.    
d130: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
d140: 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
d150: 72 2c 20 30 2c 20 69 4f 66 66 73 65 74 29 3b 0a  r, 0, iOffset);.
d160: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
d170: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
d180: 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  r1);.      sqlit
d190: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
d1a0: 4f 50 5f 41 64 64 2c 20 69 4c 69 6d 69 74 2c 20  OP_Add, iLimit, 
d1b0: 69 4f 66 66 73 65 74 2c 20 69 4f 66 66 73 65 74  iOffset, iOffset
d1c0: 2b 31 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  +1);.      VdbeC
d1d0: 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c 49 4d 49  omment((v, "LIMI
d1e0: 54 2b 4f 46 46 53 45 54 22 29 29 3b 0a 20 20 20  T+OFFSET"));.   
d1f0: 20 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74     addr1 = sqlit
d200: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
d210: 4f 50 5f 49 66 50 6f 73 2c 20 69 4c 69 6d 69 74  OP_IfPos, iLimit
d220: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
d230: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
d240: 5f 49 6e 74 65 67 65 72 2c 20 2d 31 2c 20 69 4f  _Integer, -1, iO
d250: 66 66 73 65 74 2b 31 29 3b 0a 20 20 20 20 20 20  ffset+1);.      
d260: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
d270: 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20  ere(v, addr1);. 
d280: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e     }.  }.}..#ifn
d290: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
d2a0: 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a  COMPOUND_SELECT.
d2b0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
d2c0: 20 61 70 70 72 6f 70 72 69 61 74 65 20 63 6f 6c   appropriate col
d2d0: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
d2e0: 66 6f 72 20 74 68 65 20 69 43 6f 6c 2d 74 68 20  for the iCol-th 
d2f0: 63 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a 20 74 68 65  column of.** the
d300: 20 72 65 73 75 6c 74 20 73 65 74 20 66 6f 72 20   result set for 
d310: 74 68 65 20 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c  the compound-sel
d320: 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20 22 70  ect statement "p
d330: 22 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20  ".  Return NULL 
d340: 69 66 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e  if.** the column
d350: 20 68 61 73 20 6e 6f 20 64 65 66 61 75 6c 74 20   has no default 
d360: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
d370: 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f  ce..**.** The co
d380: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
d390: 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 6f 75 6e   for the compoun
d3a0: 64 20 73 65 6c 65 63 74 20 69 73 20 74 61 6b 65  d select is take
d3b0: 6e 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 6c 65  n from the.** le
d3c0: 66 74 2d 6d 6f 73 74 20 74 65 72 6d 20 6f 66 20  ft-most term of 
d3d0: 74 68 65 20 73 65 6c 65 63 74 20 74 68 61 74 20  the select that 
d3e0: 68 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20  has a collating 
d3f0: 73 65 71 75 65 6e 63 65 2e 0a 2a 2f 0a 73 74 61  sequence..*/.sta
d400: 74 69 63 20 43 6f 6c 6c 53 65 71 20 2a 6d 75 6c  tic CollSeq *mul
d410: 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28  tiSelectCollSeq(
d420: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
d430: 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 69 43  elect *p, int iC
d440: 6f 6c 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a  ol){.  CollSeq *
d450: 70 52 65 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70  pRet;.  if( p->p
d460: 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 70 52 65  Prior ){.    pRe
d470: 74 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43  t = multiSelectC
d480: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
d490: 2d 3e 70 50 72 69 6f 72 2c 20 69 43 6f 6c 29 3b  ->pPrior, iCol);
d4a0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 52  .  }else{.    pR
d4b0: 65 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73  et = 0;.  }.  as
d4c0: 73 65 72 74 28 20 69 43 6f 6c 3e 3d 30 20 29 3b  sert( iCol>=0 );
d4d0: 0a 20 20 69 66 28 20 70 52 65 74 3d 3d 30 20 26  .  if( pRet==0 &
d4e0: 26 20 69 43 6f 6c 3c 70 2d 3e 70 45 4c 69 73 74  & iCol<p->pEList
d4f0: 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 70  ->nExpr ){.    p
d500: 52 65 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Ret = sqlite3Exp
d510: 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
d520: 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 43   p->pEList->a[iC
d530: 6f 6c 5d 2e 70 45 78 70 72 29 3b 0a 20 20 7d 0a  ol].pExpr);.  }.
d540: 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d    return pRet;.}
d550: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
d560: 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
d570: 53 45 4c 45 43 54 20 2a 2f 0a 0a 2f 2a 20 46 6f  SELECT */../* Fo
d580: 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20  rward reference 
d590: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 75  */.static int mu
d5a0: 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79  ltiSelectOrderBy
d5b0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
d5c0: 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72  e,        /* Par
d5d0: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
d5e0: 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
d5f0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
d600: 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c  ight-most of SEL
d610: 45 43 54 73 20 74 6f 20 62 65 20 63 6f 64 65 64  ECTs to be coded
d620: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74   */.  SelectDest
d630: 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a 20 57   *pDest     /* W
d640: 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 71  hat to do with q
d650: 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a  uery results */.
d660: 29 3b 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  );...#ifndef SQL
d670: 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e  ITE_OMIT_COMPOUN
d680: 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 54  D_SELECT./*.** T
d690: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
d6a0: 61 6c 6c 65 64 20 74 6f 20 70 72 6f 63 65 73 73  alled to process
d6b0: 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72   a compound quer
d6c0: 79 20 66 6f 72 6d 20 66 72 6f 6d 0a 2a 2a 20 74  y form from.** t
d6d0: 77 6f 20 6f 72 20 6d 6f 72 65 20 73 65 70 61 72  wo or more separ
d6e0: 61 74 65 20 71 75 65 72 69 65 73 20 75 73 69 6e  ate queries usin
d6f0: 67 20 55 4e 49 4f 4e 2c 20 55 4e 49 4f 4e 20 41  g UNION, UNION A
d700: 4c 4c 2c 20 45 58 43 45 50 54 2c 20 6f 72 0a 2a  LL, EXCEPT, or.*
d710: 2a 20 49 4e 54 45 52 53 45 43 54 0a 2a 2a 0a 2a  * INTERSECT.**.*
d720: 2a 20 22 70 22 20 70 6f 69 6e 74 73 20 74 6f 20  * "p" points to 
d730: 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f  the right-most o
d740: 66 20 74 68 65 20 74 77 6f 20 71 75 65 72 69 65  f the two querie
d750: 73 2e 20 20 74 68 65 20 71 75 65 72 79 20 6f 6e  s.  the query on
d760: 20 74 68 65 0a 2a 2a 20 6c 65 66 74 20 69 73 20   the.** left is 
d770: 70 2d 3e 70 50 72 69 6f 72 2e 20 20 54 68 65 20  p->pPrior.  The 
d780: 6c 65 66 74 20 71 75 65 72 79 20 63 6f 75 6c 64  left query could
d790: 20 61 6c 73 6f 20 62 65 20 61 20 63 6f 6d 70 6f   also be a compo
d7a0: 75 6e 64 20 71 75 65 72 79 0a 2a 2a 20 69 6e 20  und query.** in 
d7b0: 77 68 69 63 68 20 63 61 73 65 20 74 68 69 73 20  which case this 
d7c0: 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 62 65 20  routine will be 
d7d0: 63 61 6c 6c 65 64 20 72 65 63 75 72 73 69 76 65  called recursive
d7e0: 6c 79 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72  ly. .**.** The r
d7f0: 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 74 6f  esults of the to
d800: 74 61 6c 20 71 75 65 72 79 20 61 72 65 20 74 6f  tal query are to
d810: 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   be written into
d820: 20 61 20 64 65 73 74 69 6e 61 74 69 6f 6e 0a 2a   a destination.*
d830: 2a 20 6f 66 20 74 79 70 65 20 65 44 65 73 74 20  * of type eDest 
d840: 77 69 74 68 20 70 61 72 61 6d 65 74 65 72 20 69  with parameter i
d850: 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d  Parm..**.** Exam
d860: 70 6c 65 20 31 3a 20 20 43 6f 6e 73 69 64 65 72  ple 1:  Consider
d870: 20 61 20 74 68 72 65 65 2d 77 61 79 20 63 6f 6d   a three-way com
d880: 70 6f 75 6e 64 20 53 51 4c 20 73 74 61 74 65 6d  pound SQL statem
d890: 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  ent..**.**     S
d8a0: 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31 20  ELECT a FROM t1 
d8b0: 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 62 20 46  UNION SELECT b F
d8c0: 52 4f 4d 20 74 32 20 55 4e 49 4f 4e 20 53 45 4c  ROM t2 UNION SEL
d8d0: 45 43 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a 2a  ECT c FROM t3.**
d8e0: 0a 2a 2a 20 54 68 69 73 20 73 74 61 74 65 6d 65  .** This stateme
d8f0: 6e 74 20 69 73 20 70 61 72 73 65 64 20 75 70 20  nt is parsed up 
d900: 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
d910: 2a 20 20 20 20 20 53 45 4c 45 43 54 20 63 20 46  *     SELECT c F
d920: 52 4f 4d 20 74 33 0a 2a 2a 20 20 20 20 20 20 7c  ROM t3.**      |
d930: 0a 2a 2a 20 20 20 20 20 20 60 2d 2d 2d 2d 2d 3e  .**      `----->
d940: 20 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20    SELECT b FROM 
d950: 74 32 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  t2.**           
d960: 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20       |.**       
d970: 20 20 20 20 20 20 20 20 20 60 2d 2d 2d 2d 2d 2d           `------
d980: 3e 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d  >  SELECT a FROM
d990: 20 74 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 72   t1.**.** The ar
d9a0: 72 6f 77 73 20 69 6e 20 74 68 65 20 64 69 61 67  rows in the diag
d9b0: 72 61 6d 20 61 62 6f 76 65 20 72 65 70 72 65 73  ram above repres
d9c0: 65 6e 74 20 74 68 65 20 53 65 6c 65 63 74 2e 70  ent the Select.p
d9d0: 50 72 69 6f 72 20 70 6f 69 6e 74 65 72 2e 0a 2a  Prior pointer..*
d9e0: 2a 20 53 6f 20 69 66 20 74 68 69 73 20 72 6f 75  * So if this rou
d9f0: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77  tine is called w
da00: 69 74 68 20 70 20 65 71 75 61 6c 20 74 6f 20 74  ith p equal to t
da10: 68 65 20 74 33 20 71 75 65 72 79 2c 20 74 68 65  he t3 query, the
da20: 6e 0a 2a 2a 20 70 50 72 69 6f 72 20 77 69 6c 6c  n.** pPrior will
da30: 20 62 65 20 74 68 65 20 74 32 20 71 75 65 72 79   be the t2 query
da40: 2e 20 20 70 2d 3e 6f 70 20 77 69 6c 6c 20 62 65  .  p->op will be
da50: 20 54 4b 5f 55 4e 49 4f 4e 20 69 6e 20 74 68 69   TK_UNION in thi
da60: 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  s case..**.** No
da70: 74 69 63 65 20 74 68 61 74 20 62 65 63 61 75 73  tice that becaus
da80: 65 20 6f 66 20 74 68 65 20 77 61 79 20 53 51 4c  e of the way SQL
da90: 69 74 65 20 70 61 72 73 65 73 20 63 6f 6d 70 6f  ite parses compo
daa0: 75 6e 64 20 53 45 4c 45 43 54 73 2c 20 74 68 65  und SELECTs, the
dab0: 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c 20 73  .** individual s
dac0: 65 6c 65 63 74 73 20 61 6c 77 61 79 73 20 67 72  elects always gr
dad0: 6f 75 70 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f  oup from left to
dae0: 20 72 69 67 68 74 2e 0a 2a 2f 0a 73 74 61 74 69   right..*/.stati
daf0: 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63  c int multiSelec
db00: 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
db10: 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61  se,        /* Pa
db20: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
db30: 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
db40: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
db50: 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45  right-most of SE
db60: 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f 64 65  LECTs to be code
db70: 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  d */.  SelectDes
db80: 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a 20  t *pDest     /* 
db90: 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20  What to do with 
dba0: 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f  query results */
dbb0: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .){.  int rc = S
dbc0: 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 2f 2a 20 53  QLITE_OK;   /* S
dbd0: 75 63 63 65 73 73 20 63 6f 64 65 20 66 72 6f 6d  uccess code from
dbe0: 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f   a subroutine */
dbf0: 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f  .  Select *pPrio
dc00: 72 3b 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f 74  r;       /* Anot
dc10: 68 65 72 20 53 45 4c 45 43 54 20 69 6d 6d 65 64  her SELECT immed
dc20: 69 61 74 65 6c 79 20 74 6f 20 6f 75 72 20 6c 65  iately to our le
dc30: 66 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b  ft */.  Vdbe *v;
dc40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
dc50: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
dc60: 6f 20 74 68 69 73 20 56 44 42 45 20 2a 2f 0a 20  o this VDBE */. 
dc70: 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74   SelectDest dest
dc80: 3b 20 20 20 20 20 20 2f 2a 20 41 6c 74 65 72 6e  ;      /* Altern
dc90: 61 74 69 76 65 20 64 61 74 61 20 64 65 73 74 69  ative data desti
dca0: 6e 61 74 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65  nation */.  Sele
dcb0: 63 74 20 2a 70 44 65 6c 65 74 65 20 3d 20 30 3b  ct *pDelete = 0;
dcc0: 20 20 2f 2a 20 43 68 61 69 6e 20 6f 66 20 73 69    /* Chain of si
dcd0: 6d 70 6c 65 20 73 65 6c 65 63 74 73 20 74 6f 20  mple selects to 
dce0: 64 65 6c 65 74 65 20 2a 2f 0a 20 20 73 71 6c 69  delete */.  sqli
dcf0: 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20  te3 *db;        
dd00: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f    /* Database co
dd10: 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 23 69 66 6e  nnection */.#ifn
dd20: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
dd30: 45 58 50 4c 41 49 4e 0a 20 20 69 6e 74 20 69 53  EXPLAIN.  int iS
dd40: 75 62 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  ub1;            
dd50: 2f 2a 20 45 51 50 20 69 64 20 6f 66 20 6c 65 66  /* EQP id of lef
dd60: 74 2d 68 61 6e 64 20 71 75 65 72 79 20 2a 2f 0a  t-hand query */.
dd70: 20 20 69 6e 74 20 69 53 75 62 32 3b 20 20 20 20    int iSub2;    
dd80: 20 20 20 20 20 20 20 20 2f 2a 20 45 51 50 20 69          /* EQP i
dd90: 64 20 6f 66 20 72 69 67 68 74 2d 68 61 6e 64 20  d of right-hand 
dda0: 71 75 65 72 79 20 2a 2f 0a 23 65 6e 64 69 66 0a  query */.#endif.
ddb0: 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
ddc0: 74 68 65 72 65 20 69 73 20 6e 6f 20 4f 52 44 45  there is no ORDE
ddd0: 52 20 42 59 20 6f 72 20 4c 49 4d 49 54 20 63 6c  R BY or LIMIT cl
dde0: 61 75 73 65 20 6f 6e 20 70 72 69 6f 72 20 53 45  ause on prior SE
ddf0: 4c 45 43 54 73 2e 20 20 4f 6e 6c 79 0a 20 20 2a  LECTs.  Only.  *
de00: 2a 20 74 68 65 20 6c 61 73 74 20 28 72 69 67 68  * the last (righ
de10: 74 2d 6d 6f 73 74 29 20 53 45 4c 45 43 54 20 69  t-most) SELECT i
de20: 6e 20 74 68 65 20 73 65 72 69 65 73 20 6d 61 79  n the series may
de30: 20 68 61 76 65 20 61 6e 20 4f 52 44 45 52 20 42   have an ORDER B
de40: 59 20 6f 72 20 4c 49 4d 49 54 2e 0a 20 20 2a 2f  Y or LIMIT..  */
de50: 0a 20 20 61 73 73 65 72 74 28 20 70 20 26 26 20  .  assert( p && 
de60: 70 2d 3e 70 50 72 69 6f 72 20 29 3b 20 20 2f 2a  p->pPrior );  /*
de70: 20 43 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   Calling functio
de80: 6e 20 67 75 61 72 61 6e 74 65 65 73 20 74 68 69  n guarantees thi
de90: 73 20 6d 75 63 68 20 2a 2f 0a 20 20 64 62 20 3d  s much */.  db =
dea0: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70   pParse->db;.  p
deb0: 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f  Prior = p->pPrio
dec0: 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 72  r;.  assert( pPr
ded0: 69 6f 72 2d 3e 70 52 69 67 68 74 6d 6f 73 74 21  ior->pRightmost!
dee0: 3d 70 50 72 69 6f 72 20 29 3b 0a 20 20 61 73 73  =pPrior );.  ass
def0: 65 72 74 28 20 70 50 72 69 6f 72 2d 3e 70 52 69  ert( pPrior->pRi
df00: 67 68 74 6d 6f 73 74 3d 3d 70 2d 3e 70 52 69 67  ghtmost==p->pRig
df10: 68 74 6d 6f 73 74 20 29 3b 0a 20 20 64 65 73 74  htmost );.  dest
df20: 20 3d 20 2a 70 44 65 73 74 3b 0a 20 20 69 66 28   = *pDest;.  if(
df30: 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42   pPrior->pOrderB
df40: 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  y ){.    sqlite3
df50: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
df60: 22 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65  "ORDER BY clause
df70: 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20 61 66 74   should come aft
df80: 65 72 20 25 73 20 6e 6f 74 20 62 65 66 6f 72 65  er %s not before
df90: 22 2c 0a 20 20 20 20 20 20 73 65 6c 65 63 74 4f  ",.      selectO
dfa0: 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20  pName(p->op));. 
dfb0: 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67     rc = 1;.    g
dfc0: 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
dfd0: 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20  _end;.  }.  if( 
dfe0: 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 29  pPrior->pLimit )
dff0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
e000: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22 4c 49  orMsg(pParse,"LI
e010: 4d 49 54 20 63 6c 61 75 73 65 20 73 68 6f 75 6c  MIT clause shoul
e020: 64 20 63 6f 6d 65 20 61 66 74 65 72 20 25 73 20  d come after %s 
e030: 6e 6f 74 20 62 65 66 6f 72 65 22 2c 0a 20 20 20  not before",.   
e040: 20 20 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28     selectOpName(
e050: 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63 20  p->op));.    rc 
e060: 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75  = 1;.    goto mu
e070: 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
e080: 20 20 7d 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74    }..  v = sqlit
e090: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
e0a0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d  );.  assert( v!=
e0b0: 30 20 29 3b 20 20 2f 2a 20 54 68 65 20 56 44 42  0 );  /* The VDB
e0c0: 45 20 61 6c 72 65 61 64 79 20 63 72 65 61 74 65  E already create
e0d0: 64 20 62 79 20 63 61 6c 6c 69 6e 67 20 66 75 6e  d by calling fun
e0e0: 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 43  ction */..  /* C
e0f0: 72 65 61 74 65 20 74 68 65 20 64 65 73 74 69 6e  reate the destin
e100: 61 74 69 6f 6e 20 74 65 6d 70 6f 72 61 72 79 20  ation temporary 
e110: 74 61 62 6c 65 20 69 66 20 6e 65 63 65 73 73 61  table if necessa
e120: 72 79 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 65  ry.  */.  if( de
e130: 73 74 2e 65 44 65 73 74 3d 3d 53 52 54 5f 45 70  st.eDest==SRT_Ep
e140: 68 65 6d 54 61 62 20 29 7b 0a 20 20 20 20 61 73  hemTab ){.    as
e150: 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20  sert( p->pEList 
e160: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
e170: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f  beAddOp2(v, OP_O
e180: 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 64 65  penEphemeral, de
e190: 73 74 2e 69 53 44 50 61 72 6d 2c 20 70 2d 3e 70  st.iSDParm, p->p
e1a0: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20  EList->nExpr);. 
e1b0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
e1c0: 61 6e 67 65 50 35 28 76 2c 20 42 54 52 45 45 5f  angeP5(v, BTREE_
e1d0: 55 4e 4f 52 44 45 52 45 44 29 3b 0a 20 20 20 20  UNORDERED);.    
e1e0: 64 65 73 74 2e 65 44 65 73 74 20 3d 20 53 52 54  dest.eDest = SRT
e1f0: 5f 54 61 62 6c 65 3b 0a 20 20 7d 0a 0a 20 20 2f  _Table;.  }..  /
e200: 2a 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20  * Make sure all 
e210: 53 45 4c 45 43 54 73 20 69 6e 20 74 68 65 20 73  SELECTs in the s
e220: 74 61 74 65 6d 65 6e 74 20 68 61 76 65 20 74 68  tatement have th
e230: 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66  e same number of
e240: 20 65 6c 65 6d 65 6e 74 73 0a 20 20 2a 2a 20 69   elements.  ** i
e250: 6e 20 74 68 65 69 72 20 72 65 73 75 6c 74 20 73  n their result s
e260: 65 74 73 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ets..  */.  asse
e270: 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 26 26  rt( p->pEList &&
e280: 20 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74 20   pPrior->pEList 
e290: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 45 4c 69  );.  if( p->pELi
e2a0: 73 74 2d 3e 6e 45 78 70 72 21 3d 70 50 72 69 6f  st->nExpr!=pPrio
e2b0: 72 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  r->pEList->nExpr
e2c0: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 73   ){.    if( p->s
e2d0: 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 56 61 6c  elFlags & SF_Val
e2e0: 75 65 73 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ues ){.      sql
e2f0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
e300: 72 73 65 2c 20 22 61 6c 6c 20 56 41 4c 55 45 53  rse, "all VALUES
e310: 20 6d 75 73 74 20 68 61 76 65 20 74 68 65 20 73   must have the s
e320: 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 65  ame number of te
e330: 72 6d 73 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65  rms");.    }else
e340: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
e350: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
e360: 22 53 45 4c 45 43 54 73 20 74 6f 20 74 68 65 20  "SELECTs to the 
e370: 6c 65 66 74 20 61 6e 64 20 72 69 67 68 74 20 6f  left and right o
e380: 66 20 25 73 22 0a 20 20 20 20 20 20 20 20 22 20  f %s".        " 
e390: 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 68 65 20  do not have the 
e3a0: 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 72  same number of r
e3b0: 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 22 2c 20  esult columns", 
e3c0: 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e  selectOpName(p->
e3d0: 6f 70 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  op));.    }.    
e3e0: 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f  rc = 1;.    goto
e3f0: 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
e400: 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d  d;.  }..  /* Com
e410: 70 6f 75 6e 64 20 53 45 4c 45 43 54 73 20 74 68  pound SELECTs th
e420: 61 74 20 68 61 76 65 20 61 6e 20 4f 52 44 45 52  at have an ORDER
e430: 20 42 59 20 63 6c 61 75 73 65 20 61 72 65 20 68   BY clause are h
e440: 61 6e 64 6c 65 64 20 73 65 70 61 72 61 74 65 6c  andled separatel
e450: 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  y..  */.  if( p-
e460: 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  >pOrderBy ){.   
e470: 20 72 65 74 75 72 6e 20 6d 75 6c 74 69 53 65 6c   return multiSel
e480: 65 63 74 4f 72 64 65 72 42 79 28 70 50 61 72 73  ectOrderBy(pPars
e490: 65 2c 20 70 2c 20 70 44 65 73 74 29 3b 0a 20 20  e, p, pDest);.  
e4a0: 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  }..  /* Generate
e4b0: 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 6c 65   code for the le
e4c0: 66 74 20 61 6e 64 20 72 69 67 68 74 20 53 45 4c  ft and right SEL
e4d0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a  ECT statements..
e4e0: 20 20 2a 2f 0a 20 20 73 77 69 74 63 68 28 20 70    */.  switch( p
e4f0: 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ->op ){.    case
e500: 20 54 4b 5f 41 4c 4c 3a 20 7b 0a 20 20 20 20 20   TK_ALL: {.     
e510: 20 69 6e 74 20 61 64 64 72 20 3d 20 30 3b 0a 20   int addr = 0;. 
e520: 20 20 20 20 20 69 6e 74 20 6e 4c 69 6d 69 74 3b       int nLimit;
e530: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
e540: 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 29  pPrior->pLimit )
e550: 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e  ;.      pPrior->
e560: 69 4c 69 6d 69 74 20 3d 20 70 2d 3e 69 4c 69 6d  iLimit = p->iLim
e570: 69 74 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72  it;.      pPrior
e580: 2d 3e 69 4f 66 66 73 65 74 20 3d 20 70 2d 3e 69  ->iOffset = p->i
e590: 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70 50  Offset;.      pP
e5a0: 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 3d 20 70  rior->pLimit = p
e5b0: 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  ->pLimit;.      
e5c0: 70 50 72 69 6f 72 2d 3e 70 4f 66 66 73 65 74 20  pPrior->pOffset 
e5d0: 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20  = p->pOffset;.  
e5e0: 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e      explainSetIn
e5f0: 74 65 67 65 72 28 69 53 75 62 31 2c 20 70 50 61  teger(iSub1, pPa
e600: 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74  rse->iNextSelect
e610: 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  Id);.      rc = 
e620: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
e630: 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 64  arse, pPrior, &d
e640: 65 73 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70  est);.      p->p
e650: 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20  Limit = 0;.     
e660: 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b   p->pOffset = 0;
e670: 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
e680: 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75  .        goto mu
e690: 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
e6a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d        }.      p-
e6b0: 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20  >pPrior = 0;.   
e6c0: 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 70     p->iLimit = p
e6d0: 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 3b 0a 20  Prior->iLimit;. 
e6e0: 20 20 20 20 20 70 2d 3e 69 4f 66 66 73 65 74 20       p->iOffset 
e6f0: 3d 20 70 50 72 69 6f 72 2d 3e 69 4f 66 66 73 65  = pPrior->iOffse
e700: 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  t;.      if( p->
e710: 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20  iLimit ){.      
e720: 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
e730: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
e740: 5f 49 66 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d  _IfZero, p->iLim
e750: 69 74 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  it);.        Vdb
e760: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4a 75  eComment((v, "Ju
e770: 6d 70 20 61 68 65 61 64 20 69 66 20 4c 49 4d 49  mp ahead if LIMI
e780: 54 20 72 65 61 63 68 65 64 22 29 29 3b 0a 20 20  T reached"));.  
e790: 20 20 20 20 7d 0a 20 20 20 20 20 20 65 78 70 6c      }.      expl
e7a0: 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53  ainSetInteger(iS
e7b0: 75 62 32 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65  ub2, pParse->iNe
e7c0: 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20  xtSelectId);.   
e7d0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53     rc = sqlite3S
e7e0: 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c  elect(pParse, p,
e7f0: 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20 20 74   &dest);.      t
e800: 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c  estcase( rc!=SQL
e810: 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
e820: 70 44 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50 72  pDelete = p->pPr
e830: 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50  ior;.      p->pP
e840: 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20  rior = pPrior;. 
e850: 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52       p->nSelectR
e860: 6f 77 20 2b 3d 20 70 50 72 69 6f 72 2d 3e 6e 53  ow += pPrior->nS
e870: 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20 20 20  electRow;.      
e880: 69 66 28 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d  if( pPrior->pLim
e890: 69 74 0a 20 20 20 20 20 20 20 26 26 20 73 71 6c  it.       && sql
e8a0: 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65  ite3ExprIsIntege
e8b0: 72 28 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74  r(pPrior->pLimit
e8c0: 2c 20 26 6e 4c 69 6d 69 74 29 0a 20 20 20 20 20  , &nLimit).     
e8d0: 20 20 26 26 20 70 2d 3e 6e 53 65 6c 65 63 74 52    && p->nSelectR
e8e0: 6f 77 20 3e 20 6e 4c 69 6d 69 74 20 0a 20 20 20  ow > nLimit .   
e8f0: 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d     ){.        p-
e900: 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 6e 4c  >nSelectRow = nL
e910: 69 6d 69 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  imit;.      }.  
e920: 20 20 20 20 69 66 28 20 61 64 64 72 20 29 7b 0a      if( addr ){.
e930: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
e940: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
e950: 64 64 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ddr);.      }.  
e960: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
e970: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43  .    case TK_EXC
e980: 45 50 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  EPT:.    case TK
e990: 5f 55 4e 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20  _UNION: {.      
e9a0: 69 6e 74 20 75 6e 69 6f 6e 54 61 62 3b 20 20 20  int unionTab;   
e9b0: 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65   /* Cursor numbe
e9c0: 72 20 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61  r of the tempora
e9d0: 72 79 20 74 61 62 6c 65 20 68 6f 6c 64 69 6e 67  ry table holding
e9e0: 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 20 20 20   result */.     
e9f0: 20 75 38 20 6f 70 20 3d 20 30 3b 20 20 20 20 20   u8 op = 0;     
ea00: 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20    /* One of the 
ea10: 53 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e 73 20  SRT_ operations 
ea20: 74 6f 20 61 70 70 6c 79 20 74 6f 20 73 65 6c 66  to apply to self
ea30: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 70 72   */.      int pr
ea40: 69 6f 72 4f 70 3b 20 20 20 20 20 2f 2a 20 54 68  iorOp;     /* Th
ea50: 65 20 53 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e  e SRT_ operation
ea60: 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 70 72 69   to apply to pri
ea70: 6f 72 20 73 65 6c 65 63 74 73 20 2a 2f 0a 20 20  or selects */.  
ea80: 20 20 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74      Expr *pLimit
ea90: 2c 20 2a 70 4f 66 66 73 65 74 3b 20 2f 2a 20 53  , *pOffset; /* S
eaa0: 61 76 65 64 20 76 61 6c 75 65 73 20 6f 66 20 70  aved values of p
eab0: 2d 3e 6e 4c 69 6d 69 74 20 61 6e 64 20 70 2d 3e  ->nLimit and p->
eac0: 6e 4f 66 66 73 65 74 20 2a 2f 0a 20 20 20 20 20  nOffset */.     
ead0: 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20   int addr;.     
eae0: 20 53 65 6c 65 63 74 44 65 73 74 20 75 6e 69 6f   SelectDest unio
eaf0: 6e 64 65 73 74 3b 0a 0a 20 20 20 20 20 20 74 65  ndest;..      te
eb00: 73 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54  stcase( p->op==T
eb10: 4b 5f 45 58 43 45 50 54 20 29 3b 0a 20 20 20 20  K_EXCEPT );.    
eb20: 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e 6f    testcase( p->o
eb30: 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20  p==TK_UNION );. 
eb40: 20 20 20 20 20 70 72 69 6f 72 4f 70 20 3d 20 53       priorOp = S
eb50: 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20 20 20  RT_Union;.      
eb60: 69 66 28 20 64 65 73 74 2e 65 44 65 73 74 3d 3d  if( dest.eDest==
eb70: 70 72 69 6f 72 4f 70 20 26 26 20 41 4c 57 41 59  priorOp && ALWAY
eb80: 53 28 21 70 2d 3e 70 4c 69 6d 69 74 20 26 26 21  S(!p->pLimit &&!
eb90: 70 2d 3e 70 4f 66 66 73 65 74 29 20 29 7b 0a 20  p->pOffset) ){. 
eba0: 20 20 20 20 20 20 20 2f 2a 20 57 65 20 63 61 6e         /* We can
ebb0: 20 72 65 75 73 65 20 61 20 74 65 6d 70 6f 72 61   reuse a tempora
ebc0: 72 79 20 74 61 62 6c 65 20 67 65 6e 65 72 61 74  ry table generat
ebd0: 65 64 20 62 79 20 61 20 53 45 4c 45 43 54 20 74  ed by a SELECT t
ebe0: 6f 20 6f 75 72 0a 20 20 20 20 20 20 20 20 2a 2a  o our.        **
ebf0: 20 72 69 67 68 74 2e 0a 20 20 20 20 20 20 20 20   right..        
ec00: 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
ec10: 74 28 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74  t( p->pRightmost
ec20: 21 3d 70 20 29 3b 20 20 2f 2a 20 43 61 6e 20 6f  !=p );  /* Can o
ec30: 6e 6c 79 20 68 61 70 70 65 6e 20 66 6f 72 20 6c  nly happen for l
ec40: 65 66 74 77 61 72 64 20 65 6c 65 6d 65 6e 74 73  eftward elements
ec50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
ec60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ec70: 20 20 20 20 20 20 2a 2a 20 6f 66 20 61 20 33 2d        ** of a 3-
ec80: 77 61 79 20 6f 72 20 6d 6f 72 65 20 63 6f 6d 70  way or more comp
ec90: 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 20 20  ound */.        
eca0: 61 73 73 65 72 74 28 20 70 2d 3e 70 4c 69 6d 69  assert( p->pLimi
ecb0: 74 3d 3d 30 20 29 3b 20 20 20 20 20 20 2f 2a 20  t==0 );      /* 
ecc0: 4e 6f 74 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 6c  Not allowed on l
ecd0: 65 66 74 77 61 72 64 20 65 6c 65 6d 65 6e 74 73  eftward elements
ece0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
ecf0: 72 74 28 20 70 2d 3e 70 4f 66 66 73 65 74 3d 3d  rt( p->pOffset==
ed00: 30 20 29 3b 20 20 20 20 20 2f 2a 20 4e 6f 74 20  0 );     /* Not 
ed10: 61 6c 6c 6f 77 65 64 20 6f 6e 20 6c 65 66 74 77  allowed on leftw
ed20: 61 72 64 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a  ard elements */.
ed30: 20 20 20 20 20 20 20 20 75 6e 69 6f 6e 54 61 62          unionTab
ed40: 20 3d 20 64 65 73 74 2e 69 53 44 50 61 72 6d 3b   = dest.iSDParm;
ed50: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
ed60: 20 20 20 20 20 20 2f 2a 20 57 65 20 77 69 6c 6c        /* We will
ed70: 20 6e 65 65 64 20 74 6f 20 63 72 65 61 74 65 20   need to create 
ed80: 6f 75 72 20 6f 77 6e 20 74 65 6d 70 6f 72 61 72  our own temporar
ed90: 79 20 74 61 62 6c 65 20 74 6f 20 68 6f 6c 64 20  y table to hold 
eda0: 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  the.        ** i
edb0: 6e 74 65 72 6d 65 64 69 61 74 65 20 72 65 73 75  ntermediate resu
edc0: 6c 74 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  lts..        */.
edd0: 20 20 20 20 20 20 20 20 75 6e 69 6f 6e 54 61 62          unionTab
ede0: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
edf0: 2b 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  +;.        asser
ee00: 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d  t( p->pOrderBy==
ee10: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61 64 64  0 );.        add
ee20: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
ee30: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp2(v, OP_Open
ee40: 45 70 68 65 6d 65 72 61 6c 2c 20 75 6e 69 6f 6e  Ephemeral, union
ee50: 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  Tab, 0);.       
ee60: 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72   assert( p->addr
ee70: 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20 2d  OpenEphm[0] == -
ee80: 31 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  1 );.        p->
ee90: 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20  addrOpenEphm[0] 
eea0: 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20 20 20  = addr;.        
eeb0: 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 2d 3e 73  p->pRightmost->s
eec0: 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 55 73  elFlags |= SF_Us
eed0: 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20 20  esEphemeral;.   
eee0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
eef0: 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20  pEList );.      
ef00: 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65  }..      /* Code
ef10: 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
ef20: 65 6d 65 6e 74 73 20 74 6f 20 6f 75 72 20 6c 65  ements to our le
ef30: 66 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  ft.      */.    
ef40: 20 20 61 73 73 65 72 74 28 20 21 70 50 72 69 6f    assert( !pPrio
ef50: 72 2d 3e 70 4f 72 64 65 72 42 79 20 29 3b 0a 20  r->pOrderBy );. 
ef60: 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
ef70: 63 74 44 65 73 74 49 6e 69 74 28 26 75 6e 69 6f  ctDestInit(&unio
ef80: 6e 64 65 73 74 2c 20 70 72 69 6f 72 4f 70 2c 20  ndest, priorOp, 
ef90: 75 6e 69 6f 6e 54 61 62 29 3b 0a 20 20 20 20 20  unionTab);.     
efa0: 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67   explainSetInteg
efb0: 65 72 28 69 53 75 62 31 2c 20 70 50 61 72 73 65  er(iSub1, pParse
efc0: 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29  ->iNextSelectId)
efd0: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
efe0: 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
eff0: 65 2c 20 70 50 72 69 6f 72 2c 20 26 75 6e 69 6f  e, pPrior, &unio
f000: 6e 64 65 73 74 29 3b 0a 20 20 20 20 20 20 69 66  ndest);.      if
f010: 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
f020: 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
f030: 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a  t_end;.      }..
f040: 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68        /* Code th
f050: 65 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54  e current SELECT
f060: 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 20 20 20   statement.     
f070: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 2d   */.      if( p-
f080: 3e 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20 29  >op==TK_EXCEPT )
f090: 7b 0a 20 20 20 20 20 20 20 20 6f 70 20 3d 20 53  {.        op = S
f0a0: 52 54 5f 45 78 63 65 70 74 3b 0a 20 20 20 20 20  RT_Except;.     
f0b0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
f0c0: 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 3d 3d 54  assert( p->op==T
f0d0: 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 20 20 20  K_UNION );.     
f0e0: 20 20 20 6f 70 20 3d 20 53 52 54 5f 55 6e 69 6f     op = SRT_Unio
f0f0: 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  n;.      }.     
f100: 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a   p->pPrior = 0;.
f110: 20 20 20 20 20 20 70 4c 69 6d 69 74 20 3d 20 70        pLimit = p
f120: 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  ->pLimit;.      
f130: 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  p->pLimit = 0;. 
f140: 20 20 20 20 20 70 4f 66 66 73 65 74 20 3d 20 70       pOffset = p
f150: 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20  ->pOffset;.     
f160: 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b   p->pOffset = 0;
f170: 0a 20 20 20 20 20 20 75 6e 69 6f 6e 64 65 73 74  .      uniondest
f180: 2e 65 44 65 73 74 20 3d 20 6f 70 3b 0a 20 20 20  .eDest = op;.   
f190: 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74     explainSetInt
f1a0: 65 67 65 72 28 69 53 75 62 32 2c 20 70 50 61 72  eger(iSub2, pPar
f1b0: 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49  se->iNextSelectI
f1c0: 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  d);.      rc = s
f1d0: 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
f1e0: 72 73 65 2c 20 70 2c 20 26 75 6e 69 6f 6e 64 65  rse, p, &unionde
f1f0: 73 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  st);.      testc
f200: 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ase( rc!=SQLITE_
f210: 4f 4b 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20 51  OK );.      /* Q
f220: 75 65 72 79 20 66 6c 61 74 74 65 6e 69 6e 67 20  uery flattening 
f230: 69 6e 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  in sqlite3Select
f240: 28 29 20 6d 69 67 68 74 20 72 65 66 69 6c 6c 20  () might refill 
f250: 70 2d 3e 70 4f 72 64 65 72 42 79 2e 0a 20 20 20  p->pOrderBy..   
f260: 20 20 20 2a 2a 20 42 65 20 73 75 72 65 20 74 6f     ** Be sure to
f270: 20 64 65 6c 65 74 65 20 70 2d 3e 70 4f 72 64 65   delete p->pOrde
f280: 72 42 79 2c 20 74 68 65 72 65 66 6f 72 65 2c 20  rBy, therefore, 
f290: 74 6f 20 61 76 6f 69 64 20 61 20 6d 65 6d 6f 72  to avoid a memor
f2a0: 79 20 6c 65 61 6b 2e 20 2a 2f 0a 20 20 20 20 20  y leak. */.     
f2b0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
f2c0: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f  Delete(db, p->pO
f2d0: 72 64 65 72 42 79 29 3b 0a 20 20 20 20 20 20 70  rderBy);.      p
f2e0: 44 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50 72 69  Delete = p->pPri
f2f0: 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72  or;.      p->pPr
f300: 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20  ior = pPrior;.  
f310: 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20      p->pOrderBy 
f320: 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70  = 0;.      if( p
f330: 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29  ->op==TK_UNION )
f340: 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 2b   p->nSelectRow +
f350: 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63  = pPrior->nSelec
f360: 74 52 6f 77 3b 0a 20 20 20 20 20 20 73 71 6c 69  tRow;.      sqli
f370: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
f380: 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20  , p->pLimit);.  
f390: 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20      p->pLimit = 
f3a0: 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d  pLimit;.      p-
f3b0: 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f 66 66 73  >pOffset = pOffs
f3c0: 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4c 69  et;.      p->iLi
f3d0: 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  mit = 0;.      p
f3e0: 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b 0a 0a  ->iOffset = 0;..
f3f0: 20 20 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74        /* Convert
f400: 20 74 68 65 20 64 61 74 61 20 69 6e 20 74 68 65   the data in the
f410: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
f420: 20 69 6e 74 6f 20 77 68 61 74 65 76 65 72 20 66   into whatever f
f430: 6f 72 6d 0a 20 20 20 20 20 20 2a 2a 20 69 74 20  orm.      ** it 
f440: 69 73 20 74 68 61 74 20 77 65 20 63 75 72 72 65  is that we curre
f450: 6e 74 6c 79 20 6e 65 65 64 2e 0a 20 20 20 20 20  ntly need..     
f460: 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
f470: 28 20 75 6e 69 6f 6e 54 61 62 3d 3d 64 65 73 74  ( unionTab==dest
f480: 2e 69 53 44 50 61 72 6d 20 7c 7c 20 64 65 73 74  .iSDParm || dest
f490: 2e 65 44 65 73 74 21 3d 70 72 69 6f 72 4f 70 20  .eDest!=priorOp 
f4a0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64 65 73  );.      if( des
f4b0: 74 2e 65 44 65 73 74 21 3d 70 72 69 6f 72 4f 70  t.eDest!=priorOp
f4c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
f4d0: 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 69  iCont, iBreak, i
f4e0: 53 74 61 72 74 3b 0a 20 20 20 20 20 20 20 20 61  Start;.        a
f4f0: 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
f500: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
f510: 64 65 73 74 2e 65 44 65 73 74 3d 3d 53 52 54 5f  dest.eDest==SRT_
f520: 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20 20 20  Output ){.      
f530: 20 20 20 20 53 65 6c 65 63 74 20 2a 70 46 69 72      Select *pFir
f540: 73 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20  st = p;.        
f550: 20 20 77 68 69 6c 65 28 20 70 46 69 72 73 74 2d    while( pFirst-
f560: 3e 70 50 72 69 6f 72 20 29 20 70 46 69 72 73 74  >pPrior ) pFirst
f570: 20 3d 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f   = pFirst->pPrio
f580: 72 3b 0a 20 20 20 20 20 20 20 20 20 20 67 65 6e  r;.          gen
f590: 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73  erateColumnNames
f5a0: 28 70 50 61 72 73 65 2c 20 30 2c 20 70 46 69 72  (pParse, 0, pFir
f5b0: 73 74 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20  st->pEList);.   
f5c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
f5d0: 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56  Break = sqlite3V
f5e0: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
f5f0: 0a 20 20 20 20 20 20 20 20 69 43 6f 6e 74 20 3d  .        iCont =
f600: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
f610: 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
f620: 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65    computeLimitRe
f630: 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c 20  gisters(pParse, 
f640: 70 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20  p, iBreak);.    
f650: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
f660: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69  ddOp2(v, OP_Rewi
f670: 6e 64 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69 42  nd, unionTab, iB
f680: 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 69  reak);.        i
f690: 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56  Start = sqlite3V
f6a0: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
f6b0: 29 3b 0a 20 20 20 20 20 20 20 20 73 65 6c 65 63  );.        selec
f6c0: 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73  tInnerLoop(pPars
f6d0: 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c  e, p, p->pEList,
f6e0: 20 75 6e 69 6f 6e 54 61 62 2c 20 70 2d 3e 70 45   unionTab, p->pE
f6f0: 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 0a 20 20 20  List->nExpr,.   
f700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f710: 20 20 20 20 20 30 2c 20 30 2c 20 26 64 65 73 74       0, 0, &dest
f720: 2c 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 29  , iCont, iBreak)
f730: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
f740: 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
f750: 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20  l(v, iCont);.   
f760: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
f770: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78  AddOp2(v, OP_Nex
f780: 74 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69 53 74  t, unionTab, iSt
f790: 61 72 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71  art);.        sq
f7a0: 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
f7b0: 4c 61 62 65 6c 28 76 2c 20 69 42 72 65 61 6b 29  Label(v, iBreak)
f7c0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
f7d0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
f7e0: 50 5f 43 6c 6f 73 65 2c 20 75 6e 69 6f 6e 54 61  P_Close, unionTa
f7f0: 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  b, 0);.      }. 
f800: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
f810: 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 61  }.    default: a
f820: 73 73 65 72 74 28 20 70 2d 3e 6f 70 3d 3d 54 4b  ssert( p->op==TK
f830: 5f 49 4e 54 45 52 53 45 43 54 20 29 3b 20 7b 0a  _INTERSECT ); {.
f840: 20 20 20 20 20 20 69 6e 74 20 74 61 62 31 2c 20        int tab1, 
f850: 74 61 62 32 3b 0a 20 20 20 20 20 20 69 6e 74 20  tab2;.      int 
f860: 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 69  iCont, iBreak, i
f870: 53 74 61 72 74 3b 0a 20 20 20 20 20 20 45 78 70  Start;.      Exp
f880: 72 20 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f 66 66  r *pLimit, *pOff
f890: 73 65 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 61  set;.      int a
f8a0: 64 64 72 3b 0a 20 20 20 20 20 20 53 65 6c 65 63  ddr;.      Selec
f8b0: 74 44 65 73 74 20 69 6e 74 65 72 73 65 63 74 64  tDest intersectd
f8c0: 65 73 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 72  est;.      int r
f8d0: 31 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 4e 54  1;..      /* INT
f8e0: 45 52 53 45 43 54 20 69 73 20 64 69 66 66 65 72  ERSECT is differ
f8f0: 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 6f 74 68  ent from the oth
f900: 65 72 73 20 73 69 6e 63 65 20 69 74 20 72 65 71  ers since it req
f910: 75 69 72 65 73 0a 20 20 20 20 20 20 2a 2a 20 74  uires.      ** t
f920: 77 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  wo temporary tab
f930: 6c 65 73 2e 20 20 48 65 6e 63 65 20 69 74 20 68  les.  Hence it h
f940: 61 73 20 69 74 73 20 6f 77 6e 20 63 61 73 65 2e  as its own case.
f950: 20 20 42 65 67 69 6e 0a 20 20 20 20 20 20 2a 2a    Begin.      **
f960: 20 62 79 20 61 6c 6c 6f 63 61 74 69 6e 67 20 74   by allocating t
f970: 68 65 20 74 61 62 6c 65 73 20 77 65 20 77 69 6c  he tables we wil
f980: 6c 20 6e 65 65 64 2e 0a 20 20 20 20 20 20 2a 2f  l need..      */
f990: 0a 20 20 20 20 20 20 74 61 62 31 20 3d 20 70 50  .      tab1 = pP
f9a0: 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
f9b0: 20 20 20 20 74 61 62 32 20 3d 20 70 50 61 72 73      tab2 = pPars
f9c0: 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20  e->nTab++;.     
f9d0: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64   assert( p->pOrd
f9e0: 65 72 42 79 3d 3d 30 20 29 3b 0a 0a 20 20 20 20  erBy==0 );..    
f9f0: 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
fa00: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
fa10: 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20  _OpenEphemeral, 
fa20: 74 61 62 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  tab1, 0);.      
fa30: 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f  assert( p->addrO
fa40: 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20 2d 31  penEphm[0] == -1
fa50: 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64 64   );.      p->add
fa60: 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 61  rOpenEphm[0] = a
fa70: 64 64 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 52  ddr;.      p->pR
fa80: 69 67 68 74 6d 6f 73 74 2d 3e 73 65 6c 46 6c 61  ightmost->selFla
fa90: 67 73 20 7c 3d 20 53 46 5f 55 73 65 73 45 70 68  gs |= SF_UsesEph
faa0: 65 6d 65 72 61 6c 3b 0a 20 20 20 20 20 20 61 73  emeral;.      as
fab0: 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20  sert( p->pEList 
fac0: 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64  );..      /* Cod
fad0: 65 20 74 68 65 20 53 45 4c 45 43 54 73 20 74 6f  e the SELECTs to
fae0: 20 6f 75 72 20 6c 65 66 74 20 69 6e 74 6f 20 74   our left into t
faf0: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 22  emporary table "
fb00: 74 61 62 31 22 2e 0a 20 20 20 20 20 20 2a 2f 0a  tab1"..      */.
fb10: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
fb20: 65 63 74 44 65 73 74 49 6e 69 74 28 26 69 6e 74  ectDestInit(&int
fb30: 65 72 73 65 63 74 64 65 73 74 2c 20 53 52 54 5f  ersectdest, SRT_
fb40: 55 6e 69 6f 6e 2c 20 74 61 62 31 29 3b 0a 20 20  Union, tab1);.  
fb50: 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e      explainSetIn
fb60: 74 65 67 65 72 28 69 53 75 62 31 2c 20 70 50 61  teger(iSub1, pPa
fb70: 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74  rse->iNextSelect
fb80: 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  Id);.      rc = 
fb90: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
fba0: 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 69  arse, pPrior, &i
fbb0: 6e 74 65 72 73 65 63 74 64 65 73 74 29 3b 0a 20  ntersectdest);. 
fbc0: 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
fbd0: 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74         goto mult
fbe0: 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
fbf0: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
fc00: 43 6f 64 65 20 74 68 65 20 63 75 72 72 65 6e 74  Code the current
fc10: 20 53 45 4c 45 43 54 20 69 6e 74 6f 20 74 65 6d   SELECT into tem
fc20: 70 6f 72 61 72 79 20 74 61 62 6c 65 20 22 74 61  porary table "ta
fc30: 62 32 22 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  b2".      */.   
fc40: 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
fc50: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
fc60: 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
fc70: 20 74 61 62 32 2c 20 30 29 3b 0a 20 20 20 20 20   tab2, 0);.     
fc80: 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72   assert( p->addr
fc90: 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 3d 20 2d  OpenEphm[1] == -
fca0: 31 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64  1 );.      p->ad
fcb0: 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 20  drOpenEphm[1] = 
fcc0: 61 64 64 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70  addr;.      p->p
fcd0: 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20  Prior = 0;.     
fce0: 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69   pLimit = p->pLi
fcf0: 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c  mit;.      p->pL
fd00: 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  imit = 0;.      
fd10: 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66  pOffset = p->pOf
fd20: 66 73 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70  fset;.      p->p
fd30: 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20  Offset = 0;.    
fd40: 20 20 69 6e 74 65 72 73 65 63 74 64 65 73 74 2e    intersectdest.
fd50: 69 53 44 50 61 72 6d 20 3d 20 74 61 62 32 3b 0a  iSDParm = tab2;.
fd60: 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74        explainSet
fd70: 49 6e 74 65 67 65 72 28 69 53 75 62 32 2c 20 70  Integer(iSub2, p
fd80: 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65  Parse->iNextSele
fd90: 63 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20  ctId);.      rc 
fda0: 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  = sqlite3Select(
fdb0: 70 50 61 72 73 65 2c 20 70 2c 20 26 69 6e 74 65  pParse, p, &inte
fdc0: 72 73 65 63 74 64 65 73 74 29 3b 0a 20 20 20 20  rsectdest);.    
fdd0: 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d    testcase( rc!=
fde0: 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
fdf0: 20 20 20 70 44 65 6c 65 74 65 20 3d 20 70 2d 3e     pDelete = p->
fe00: 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d  pPrior;.      p-
fe10: 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72  >pPrior = pPrior
fe20: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e  ;.      if( p->n
fe30: 53 65 6c 65 63 74 52 6f 77 3e 70 50 72 69 6f 72  SelectRow>pPrior
fe40: 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 29 20 70  ->nSelectRow ) p
fe50: 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 70  ->nSelectRow = p
fe60: 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f  Prior->nSelectRo
fe70: 77 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  w;.      sqlite3
fe80: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
fe90: 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20  ->pLimit);.     
fea0: 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69   p->pLimit = pLi
feb0: 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f  mit;.      p->pO
fec0: 66 66 73 65 74 20 3d 20 70 4f 66 66 73 65 74 3b  ffset = pOffset;
fed0: 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72  ..      /* Gener
fee0: 61 74 65 20 63 6f 64 65 20 74 6f 20 74 61 6b 65  ate code to take
fef0: 20 74 68 65 20 69 6e 74 65 72 73 65 63 74 69 6f   the intersectio
ff00: 6e 20 6f 66 20 74 68 65 20 74 77 6f 20 74 65 6d  n of the two tem
ff10: 70 6f 72 61 72 79 0a 20 20 20 20 20 20 2a 2a 20  porary.      ** 
ff20: 74 61 62 6c 65 73 2e 0a 20 20 20 20 20 20 2a 2f  tables..      */
ff30: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
ff40: 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20  ->pEList );.    
ff50: 20 20 69 66 28 20 64 65 73 74 2e 65 44 65 73 74    if( dest.eDest
ff60: 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a  ==SRT_Output ){.
ff70: 20 20 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a          Select *
ff80: 70 46 69 72 73 74 20 3d 20 70 3b 0a 20 20 20 20  pFirst = p;.    
ff90: 20 20 20 20 77 68 69 6c 65 28 20 70 46 69 72 73      while( pFirs
ffa0: 74 2d 3e 70 50 72 69 6f 72 20 29 20 70 46 69 72  t->pPrior ) pFir
ffb0: 73 74 20 3d 20 70 46 69 72 73 74 2d 3e 70 50 72  st = pFirst->pPr
ffc0: 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 67 65 6e  ior;.        gen
ffd0: 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73  erateColumnNames
ffe0: 28 70 50 61 72 73 65 2c 20 30 2c 20 70 46 69 72  (pParse, 0, pFir
fff0: 73 74 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20  st->pEList);.   
10000 20 20 20 7d 0a 20 20 20 20 20 20 69 42 72 65 61     }.      iBrea
10010 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  k = sqlite3VdbeM
10020 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
10030 20 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74     iCont = sqlit
10040 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
10050 76 29 3b 0a 20 20 20 20 20 20 63 6f 6d 70 75 74  v);.      comput
10060 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28  eLimitRegisters(
10070 70 50 61 72 73 65 2c 20 70 2c 20 69 42 72 65 61  pParse, p, iBrea
10080 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  k);.      sqlite
10090 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
100a0 50 5f 52 65 77 69 6e 64 2c 20 74 61 62 31 2c 20  P_Rewind, tab1, 
100b0 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 72  iBreak);.      r
100c0 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
100d0 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
100e0 20 20 20 20 20 69 53 74 61 72 74 20 3d 20 73 71       iStart = sq
100f0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
10100 76 2c 20 4f 50 5f 52 6f 77 4b 65 79 2c 20 74 61  v, OP_RowKey, ta
10110 62 31 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73  b1, r1);.      s
10120 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
10130 49 6e 74 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75  Int(v, OP_NotFou
10140 6e 64 2c 20 74 61 62 32 2c 20 69 43 6f 6e 74 2c  nd, tab2, iCont,
10150 20 72 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73   r1, 0);.      s
10160 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
10170 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
10180 3b 0a 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e  ;.      selectIn
10190 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20  nerLoop(pParse, 
101a0 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 74 61  p, p->pEList, ta
101b0 62 31 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  b1, p->pEList->n
101c0 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20  Expr,.          
101d0 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 30              0, 0
101e0 2c 20 26 64 65 73 74 2c 20 69 43 6f 6e 74 2c 20  , &dest, iCont, 
101f0 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 73  iBreak);.      s
10200 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
10210 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29  eLabel(v, iCont)
10220 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
10230 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
10240 4e 65 78 74 2c 20 74 61 62 31 2c 20 69 53 74 61  Next, tab1, iSta
10250 72 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  rt);.      sqlit
10260 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
10270 65 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20  el(v, iBreak);. 
10280 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
10290 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f  AddOp2(v, OP_Clo
102a0 73 65 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20 20  se, tab2, 0);.  
102b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
102c0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73  ddOp2(v, OP_Clos
102d0 65 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20 20 20  e, tab1, 0);.   
102e0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
102f0 20 20 7d 0a 0a 20 20 65 78 70 6c 61 69 6e 43 6f    }..  explainCo
10300 6d 70 6f 73 69 74 65 28 70 50 61 72 73 65 2c 20  mposite(pParse, 
10310 70 2d 3e 6f 70 2c 20 69 53 75 62 31 2c 20 69 53  p->op, iSub1, iS
10320 75 62 32 2c 20 70 2d 3e 6f 70 21 3d 54 4b 5f 41  ub2, p->op!=TK_A
10330 4c 4c 29 3b 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75  LL);..  /* Compu
10340 74 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  te collating seq
10350 75 65 6e 63 65 73 20 75 73 65 64 20 62 79 20 0a  uences used by .
10360 20 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 74    ** temporary t
10370 61 62 6c 65 73 20 6e 65 65 64 65 64 20 74 6f 20  ables needed to 
10380 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f  implement the co
10390 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20  mpound select.. 
103a0 20 2a 2a 20 41 74 74 61 63 68 20 74 68 65 20 4b   ** Attach the K
103b0 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
103c0 20 74 6f 20 61 6c 6c 20 74 65 6d 70 6f 72 61 72   to all temporar
103d0 79 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20  y tables..  **. 
103e0 20 2a 2a 20 54 68 69 73 20 73 65 63 74 69 6f 6e   ** This section
103f0 20 69 73 20 72 75 6e 20 62 79 20 74 68 65 20 72   is run by the r
10400 69 67 68 74 2d 6d 6f 73 74 20 53 45 4c 45 43 54  ight-most SELECT
10410 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 6c 79 2e   statement only.
10420 0a 20 20 2a 2a 20 53 45 4c 45 43 54 20 73 74 61  .  ** SELECT sta
10430 74 65 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 6c  tements to the l
10440 65 66 74 20 61 6c 77 61 79 73 20 73 6b 69 70 20  eft always skip 
10450 74 68 69 73 20 70 61 72 74 2e 20 20 54 68 65 20  this part.  The 
10460 72 69 67 68 74 2d 6d 6f 73 74 0a 20 20 2a 2a 20  right-most.  ** 
10470 53 45 4c 45 43 54 20 6d 69 67 68 74 20 61 6c 73  SELECT might als
10480 6f 20 73 6b 69 70 20 74 68 69 73 20 70 61 72 74  o skip this part
10490 20 69 66 20 69 74 20 68 61 73 20 6e 6f 20 4f 52   if it has no OR
104a0 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 6e  DER BY clause an
104b0 64 0a 20 20 2a 2a 20 6e 6f 20 74 65 6d 70 20 74  d.  ** no temp t
104c0 61 62 6c 65 73 20 61 72 65 20 72 65 71 75 69 72  ables are requir
104d0 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ed..  */.  if( p
104e0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
104f0 55 73 65 73 45 70 68 65 6d 65 72 61 6c 20 29 7b  UsesEphemeral ){
10500 0a 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20  .    int i;     
10510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10520 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
10530 65 72 20 2a 2f 0a 20 20 20 20 4b 65 79 49 6e 66  er */.    KeyInf
10540 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 20 20 20 20  o *pKeyInfo;    
10550 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61          /* Colla
10560 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f  ting sequence fo
10570 72 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  r the result set
10580 20 2a 2f 0a 20 20 20 20 53 65 6c 65 63 74 20 2a   */.    Select *
10590 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20  pLoop;          
105a0 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f        /* For loo
105b0 70 69 6e 67 20 74 68 72 6f 75 67 68 20 53 45 4c  ping through SEL
105c0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 2a  ECT statements *
105d0 2f 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 2a  /.    CollSeq **
105e0 61 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20  apColl;         
105f0 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69      /* For loopi
10600 6e 67 20 74 68 72 6f 75 67 68 20 70 4b 65 79 49  ng through pKeyI
10610 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 5d 20 2a 2f 0a  nfo->aColl[] */.
10620 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20      int nCol;   
10630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10640 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
10650 6f 6c 75 6d 6e 73 20 69 6e 20 72 65 73 75 6c 74  olumns in result
10660 20 73 65 74 20 2a 2f 0a 0a 20 20 20 20 61 73 73   set */..    ass
10670 65 72 74 28 20 70 2d 3e 70 52 69 67 68 74 6d 6f  ert( p->pRightmo
10680 73 74 3d 3d 70 20 29 3b 0a 20 20 20 20 6e 43 6f  st==p );.    nCo
10690 6c 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  l = p->pEList->n
106a0 45 78 70 72 3b 0a 20 20 20 20 70 4b 65 79 49 6e  Expr;.    pKeyIn
106b0 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  fo = sqlite3DbMa
106c0 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 0a 20 20 20  llocZero(db,.   
106d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
106e0 20 20 20 20 73 69 7a 65 6f 66 28 2a 70 4b 65 79      sizeof(*pKey
106f0 49 6e 66 6f 29 2b 6e 43 6f 6c 2a 28 73 69 7a 65  Info)+nCol*(size
10700 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 20 2b 20 31  of(CollSeq*) + 1
10710 29 29 3b 0a 20 20 20 20 69 66 28 20 21 70 4b 65  ));.    if( !pKe
10720 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 72  yInfo ){.      r
10730 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
10740 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c  ;.      goto mul
10750 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
10760 20 20 20 7d 0a 0a 20 20 20 20 70 4b 65 79 49 6e     }..    pKeyIn
10770 66 6f 2d 3e 65 6e 63 20 3d 20 45 4e 43 28 64 62  fo->enc = ENC(db
10780 29 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d  );.    pKeyInfo-
10790 3e 6e 46 69 65 6c 64 20 3d 20 28 75 31 36 29 6e  >nField = (u16)n
107a0 43 6f 6c 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d  Col;..    for(i=
107b0 30 2c 20 61 70 43 6f 6c 6c 3d 70 4b 65 79 49 6e  0, apColl=pKeyIn
107c0 66 6f 2d 3e 61 43 6f 6c 6c 3b 20 69 3c 6e 43 6f  fo->aColl; i<nCo
107d0 6c 3b 20 69 2b 2b 2c 20 61 70 43 6f 6c 6c 2b 2b  l; i++, apColl++
107e0 29 7b 0a 20 20 20 20 20 20 2a 61 70 43 6f 6c 6c  ){.      *apColl
107f0 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f   = multiSelectCo
10800 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 2c  llSeq(pParse, p,
10810 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20 30   i);.      if( 0
10820 3d 3d 2a 61 70 43 6f 6c 6c 20 29 7b 0a 20 20 20  ==*apColl ){.   
10830 20 20 20 20 20 2a 61 70 43 6f 6c 6c 20 3d 20 64       *apColl = d
10840 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20  b->pDfltColl;.  
10850 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
10860 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f  pKeyInfo->aSortO
10870 72 64 65 72 20 3d 20 28 75 38 2a 29 61 70 43 6f  rder = (u8*)apCo
10880 6c 6c 3b 0a 0a 20 20 20 20 66 6f 72 28 70 4c 6f  ll;..    for(pLo
10890 6f 70 3d 70 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f  op=p; pLoop; pLo
108a0 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 50 72 69 6f 72  op=pLoop->pPrior
108b0 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  ){.      for(i=0
108c0 3b 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<2; i++){.   
108d0 20 20 20 20 20 69 6e 74 20 61 64 64 72 20 3d 20       int addr = 
108e0 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45  pLoop->addrOpenE
108f0 70 68 6d 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20  phm[i];.        
10900 69 66 28 20 61 64 64 72 3c 30 20 29 7b 0a 20 20  if( addr<0 ){.  
10910 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 5b 30          /* If [0
10920 5d 20 69 73 20 75 6e 75 73 65 64 20 74 68 65 6e  ] is unused then
10930 20 5b 31 5d 20 69 73 20 61 6c 73 6f 20 75 6e 75   [1] is also unu
10940 73 65 64 2e 20 20 53 6f 20 77 65 20 63 61 6e 0a  sed.  So we can.
10950 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 77            ** alw
10960 61 79 73 20 73 61 66 65 6c 79 20 61 62 6f 72 74  ays safely abort
10970 20 61 73 20 73 6f 6f 6e 20 61 73 20 74 68 65 20   as soon as the 
10980 66 69 72 73 74 20 75 6e 75 73 65 64 20 73 6c 6f  first unused slo
10990 74 20 69 73 20 66 6f 75 6e 64 20 2a 2f 0a 20 20  t is found */.  
109a0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
109b0 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45  pLoop->addrOpenE
109c0 70 68 6d 5b 31 5d 3c 30 20 29 3b 0a 20 20 20 20  phm[1]<0 );.    
109d0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
109e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
109f0 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
10a00 50 32 28 76 2c 20 61 64 64 72 2c 20 6e 43 6f 6c  P2(v, addr, nCol
10a10 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
10a20 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76  e3VdbeChangeP4(v
10a30 2c 20 61 64 64 72 2c 20 28 63 68 61 72 2a 29 70  , addr, (char*)p
10a40 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49  KeyInfo, P4_KEYI
10a50 4e 46 4f 29 3b 0a 20 20 20 20 20 20 20 20 70 4c  NFO);.        pL
10a60 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68  oop->addrOpenEph
10a70 6d 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20 20 20 20  m[i] = -1;.     
10a80 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
10a90 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
10aa0 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 7d 0a 0a 6d  KeyInfo);.  }..m
10ab0 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3a  ulti_select_end:
10ac0 0a 20 20 70 44 65 73 74 2d 3e 69 53 64 73 74 20  .  pDest->iSdst 
10ad0 3d 20 64 65 73 74 2e 69 53 64 73 74 3b 0a 20 20  = dest.iSdst;.  
10ae0 70 44 65 73 74 2d 3e 6e 53 64 73 74 20 3d 20 64  pDest->nSdst = d
10af0 65 73 74 2e 6e 53 64 73 74 3b 0a 20 20 73 71 6c  est.nSdst;.  sql
10b00 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
10b10 28 64 62 2c 20 70 44 65 6c 65 74 65 29 3b 0a 20  (db, pDelete);. 
10b20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
10b30 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
10b40 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
10b50 45 43 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f  ECT */../*.** Co
10b60 64 65 20 61 6e 20 6f 75 74 70 75 74 20 73 75 62  de an output sub
10b70 72 6f 75 74 69 6e 65 20 66 6f 72 20 61 20 63 6f  routine for a co
10b80 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e  routine implemen
10b90 74 61 74 69 6f 6e 20 6f 66 20 61 0a 2a 2a 20 53  tation of a.** S
10ba0 45 4c 45 43 54 20 73 74 61 74 6d 65 6e 74 2e 0a  ELECT statment..
10bb0 2a 2a 0a 2a 2a 20 54 68 65 20 64 61 74 61 20 74  **.** The data t
10bc0 6f 20 62 65 20 6f 75 74 70 75 74 20 69 73 20 63  o be output is c
10bd0 6f 6e 74 61 69 6e 65 64 20 69 6e 20 70 49 6e 2d  ontained in pIn-
10be0 3e 69 53 64 73 74 2e 20 20 54 68 65 72 65 20 61  >iSdst.  There a
10bf0 72 65 0a 2a 2a 20 70 49 6e 2d 3e 6e 53 64 73 74  re.** pIn->nSdst
10c00 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20 6f   columns to be o
10c10 75 74 70 75 74 2e 20 20 70 44 65 73 74 20 69 73  utput.  pDest is
10c20 20 77 68 65 72 65 20 74 68 65 20 6f 75 74 70 75   where the outpu
10c30 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 73  t should.** be s
10c40 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 72 65 67 52 65  ent..**.** regRe
10c50 74 75 72 6e 20 69 73 20 74 68 65 20 6e 75 6d 62  turn is the numb
10c60 65 72 20 6f 66 20 74 68 65 20 72 65 67 69 73 74  er of the regist
10c70 65 72 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73  er holding the s
10c80 75 62 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74  ubroutine.** ret
10c90 75 72 6e 20 61 64 64 72 65 73 73 2e 0a 2a 2a 0a  urn address..**.
10ca0 2a 2a 20 49 66 20 72 65 67 50 72 65 76 3e 30 20  ** If regPrev>0 
10cb0 74 68 65 6e 20 69 74 20 69 73 20 74 68 65 20 66  then it is the f
10cc0 69 72 73 74 20 72 65 67 69 73 74 65 72 20 69 6e  irst register in
10cd0 20 61 20 76 65 63 74 6f 72 20 74 68 61 74 0a 2a   a vector that.*
10ce0 2a 20 72 65 63 6f 72 64 73 20 74 68 65 20 70 72  * records the pr
10cf0 65 76 69 6f 75 73 20 6f 75 74 70 75 74 2e 20 20  evious output.  
10d00 6d 65 6d 5b 72 65 67 50 72 65 76 5d 20 69 73 20  mem[regPrev] is 
10d10 61 20 66 6c 61 67 20 74 68 61 74 20 69 73 20 66  a flag that is f
10d20 61 6c 73 65 0a 2a 2a 20 69 66 20 74 68 65 72 65  alse.** if there
10d30 20 68 61 73 20 62 65 65 6e 20 6e 6f 20 70 72 65   has been no pre
10d40 76 69 6f 75 73 20 6f 75 74 70 75 74 2e 20 20 49  vious output.  I
10d50 66 20 72 65 67 50 72 65 76 3e 30 20 74 68 65 6e  f regPrev>0 then
10d60 20 63 6f 64 65 20 69 73 0a 2a 2a 20 67 65 6e 65   code is.** gene
10d70 72 61 74 65 64 20 74 6f 20 73 75 70 70 72 65 73  rated to suppres
10d80 73 20 64 75 70 6c 69 63 61 74 65 73 2e 20 20 70  s duplicates.  p
10d90 4b 65 79 49 6e 66 6f 20 69 73 20 75 73 65 64 20  KeyInfo is used 
10da0 66 6f 72 20 63 6f 6d 70 61 72 69 6e 67 0a 2a 2a  for comparing.**
10db0 20 6b 65 79 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   keys..**.** If 
10dc0 74 68 65 20 4c 49 4d 49 54 20 66 6f 75 6e 64 20  the LIMIT found 
10dd0 69 6e 20 70 2d 3e 69 4c 69 6d 69 74 20 69 73 20  in p->iLimit is 
10de0 72 65 61 63 68 65 64 2c 20 6a 75 6d 70 20 69 6d  reached, jump im
10df0 6d 65 64 69 61 74 65 6c 79 20 74 6f 0a 2a 2a 20  mediately to.** 
10e00 69 42 72 65 61 6b 2e 0a 2a 2f 0a 73 74 61 74 69  iBreak..*/.stati
10e10 63 20 69 6e 74 20 67 65 6e 65 72 61 74 65 4f 75  c int generateOu
10e20 74 70 75 74 53 75 62 72 6f 75 74 69 6e 65 28 0a  tputSubroutine(.
10e30 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
10e40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
10e50 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
10e60 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
10e70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
10e80 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
10e90 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  t */.  SelectDes
10ea0 74 20 2a 70 49 6e 2c 20 20 20 20 20 20 20 20 2f  t *pIn,        /
10eb0 2a 20 43 6f 72 6f 75 74 69 6e 65 20 73 75 70 70  * Coroutine supp
10ec0 6c 79 69 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20  lying data */.  
10ed0 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73  SelectDest *pDes
10ee0 74 2c 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65  t,      /* Where
10ef0 20 74 6f 20 73 65 6e 64 20 74 68 65 20 64 61 74   to send the dat
10f00 61 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65  a */.  int regRe
10f10 74 75 72 6e 2c 20 20 20 20 20 20 20 20 20 20 2f  turn,          /
10f20 2a 20 54 68 65 20 72 65 74 75 72 6e 20 61 64 64  * The return add
10f30 72 65 73 73 20 72 65 67 69 73 74 65 72 20 2a 2f  ress register */
10f40 0a 20 20 69 6e 74 20 72 65 67 50 72 65 76 2c 20  .  int regPrev, 
10f50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72             /* Pr
10f60 65 76 69 6f 75 73 20 72 65 73 75 6c 74 20 72 65  evious result re
10f70 67 69 73 74 65 72 2e 20 20 4e 6f 20 75 6e 69 71  gister.  No uniq
10f80 75 65 6e 65 73 73 20 69 66 20 30 20 2a 2f 0a 20  ueness if 0 */. 
10f90 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
10fa0 66 6f 2c 20 20 20 20 20 20 2f 2a 20 46 6f 72 20  fo,      /* For 
10fb0 63 6f 6d 70 61 72 69 6e 67 20 77 69 74 68 20 70  comparing with p
10fc0 72 65 76 69 6f 75 73 20 65 6e 74 72 79 20 2a 2f  revious entry */
10fd0 0a 20 20 69 6e 74 20 70 34 74 79 70 65 2c 20 20  .  int p4type,  
10fe0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
10ff0 65 20 70 34 20 74 79 70 65 20 66 6f 72 20 70 4b  e p4 type for pK
11000 65 79 49 6e 66 6f 20 2a 2f 0a 20 20 69 6e 74 20  eyInfo */.  int 
11010 69 42 72 65 61 6b 20 20 20 20 20 20 20 20 20 20  iBreak          
11020 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65      /* Jump here
11030 20 69 66 20 77 65 20 68 69 74 20 74 68 65 20 4c   if we hit the L
11040 49 4d 49 54 20 2a 2f 0a 29 7b 0a 20 20 56 64 62  IMIT */.){.  Vdb
11050 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
11060 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 43 6f 6e  Vdbe;.  int iCon
11070 74 69 6e 75 65 3b 0a 20 20 69 6e 74 20 61 64 64  tinue;.  int add
11080 72 3b 0a 0a 20 20 61 64 64 72 20 3d 20 73 71 6c  r;..  addr = sql
11090 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
110a0 64 64 72 28 76 29 3b 0a 20 20 69 43 6f 6e 74 69  ddr(v);.  iConti
110b0 6e 75 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62  nue = sqlite3Vdb
110c0 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a  eMakeLabel(v);..
110d0 20 20 2f 2a 20 53 75 70 70 72 65 73 73 20 64 75    /* Suppress du
110e0 70 6c 69 63 61 74 65 73 20 66 6f 72 20 55 4e 49  plicates for UNI
110f0 4f 4e 2c 20 45 58 43 45 50 54 2c 20 61 6e 64 20  ON, EXCEPT, and 
11100 49 4e 54 45 52 53 45 43 54 20 0a 20 20 2a 2f 0a  INTERSECT .  */.
11110 20 20 69 66 28 20 72 65 67 50 72 65 76 20 29 7b    if( regPrev ){
11120 0a 20 20 20 20 69 6e 74 20 6a 31 2c 20 6a 32 3b  .    int j1, j2;
11130 0a 20 20 20 20 6a 31 20 3d 20 73 71 6c 69 74 65  .    j1 = sqlite
11140 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
11150 50 5f 49 66 4e 6f 74 2c 20 72 65 67 50 72 65 76  P_IfNot, regPrev
11160 29 3b 0a 20 20 20 20 6a 32 20 3d 20 73 71 6c 69  );.    j2 = sqli
11170 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
11180 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 70 49 6e   OP_Compare, pIn
11190 2d 3e 69 53 64 73 74 2c 20 72 65 67 50 72 65 76  ->iSdst, regPrev
111a0 2b 31 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 2c 0a  +1, pIn->nSdst,.
111b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
111c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
111d0 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 70  har*)pKeyInfo, p
111e0 34 74 79 70 65 29 3b 0a 20 20 20 20 73 71 6c 69  4type);.    sqli
111f0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
11200 20 4f 50 5f 4a 75 6d 70 2c 20 6a 32 2b 32 2c 20   OP_Jump, j2+2, 
11210 69 43 6f 6e 74 69 6e 75 65 2c 20 6a 32 2b 32 29  iContinue, j2+2)
11220 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
11230 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 31 29  eJumpHere(v, j1)
11240 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
11250 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
11260 70 79 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20  py, pIn->iSdst, 
11270 72 65 67 50 72 65 76 2b 31 2c 20 70 49 6e 2d 3e  regPrev+1, pIn->
11280 6e 53 64 73 74 2d 31 29 3b 0a 20 20 20 20 73 71  nSdst-1);.    sq
11290 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
112a0 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31  v, OP_Integer, 1
112b0 2c 20 72 65 67 50 72 65 76 29 3b 0a 20 20 7d 0a  , regPrev);.  }.
112c0 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62    if( pParse->db
112d0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
112e0 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a   return 0;..  /*
112f0 20 53 75 70 70 72 65 73 73 20 74 68 65 20 66 69   Suppress the fi
11300 72 73 74 20 4f 46 46 53 45 54 20 65 6e 74 72 69  rst OFFSET entri
11310 65 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61  es if there is a
11320 6e 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65 0a  n OFFSET clause.
11330 20 20 2a 2f 0a 20 20 63 6f 64 65 4f 66 66 73 65    */.  codeOffse
11340 74 28 76 2c 20 70 2c 20 69 43 6f 6e 74 69 6e 75  t(v, p, iContinu
11350 65 29 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 70  e);..  switch( p
11360 44 65 73 74 2d 3e 65 44 65 73 74 20 29 7b 0a 20  Dest->eDest ){. 
11370 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20     /* Store the 
11380 72 65 73 75 6c 74 20 61 73 20 64 61 74 61 20 75  result as data u
11390 73 69 6e 67 20 61 20 75 6e 69 71 75 65 20 6b 65  sing a unique ke
113a0 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  y..    */.    ca
113b0 73 65 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20  se SRT_Table:.  
113c0 20 20 63 61 73 65 20 53 52 54 5f 45 70 68 65 6d    case SRT_Ephem
113d0 54 61 62 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  Tab: {.      int
113e0 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
113f0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
11400 0a 20 20 20 20 20 20 69 6e 74 20 72 32 20 3d 20  .      int r2 = 
11410 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
11420 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
11430 20 74 65 73 74 63 61 73 65 28 20 70 44 65 73 74   testcase( pDest
11440 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 54 61 62  ->eDest==SRT_Tab
11450 6c 65 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  le );.      test
11460 63 61 73 65 28 20 70 44 65 73 74 2d 3e 65 44 65  case( pDest->eDe
11470 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61 62  st==SRT_EphemTab
11480 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
11490 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
114a0 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 70 49  P_MakeRecord, pI
114b0 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e  n->iSdst, pIn->n
114c0 53 64 73 74 2c 20 72 31 29 3b 0a 20 20 20 20 20  Sdst, r1);.     
114d0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
114e0 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69  p2(v, OP_NewRowi
114f0 64 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72  d, pDest->iSDPar
11500 6d 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 73 71  m, r2);.      sq
11510 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
11520 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 70 44  v, OP_Insert, pD
11530 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 72 31  est->iSDParm, r1
11540 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 73 71 6c  , r2);.      sql
11550 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
11560 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e  (v, OPFLAG_APPEN
11570 44 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  D);.      sqlite
11580 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
11590 70 50 61 72 73 65 2c 20 72 32 29 3b 0a 20 20 20  pParse, r2);.   
115a0 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
115b0 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
115c0 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61   r1);.      brea
115d0 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65  k;.    }..#ifnde
115e0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
115f0 42 51 55 45 52 59 0a 20 20 20 20 2f 2a 20 49 66  BQUERY.    /* If
11600 20 77 65 20 61 72 65 20 63 72 65 61 74 69 6e 67   we are creating
11610 20 61 20 73 65 74 20 66 6f 72 20 61 6e 20 22 65   a set for an "e
11620 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e  xpr IN (SELECT .
11630 2e 2e 29 22 20 63 6f 6e 73 74 72 75 63 74 2c 0a  ..)" construct,.
11640 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 72      ** then ther
11650 65 20 73 68 6f 75 6c 64 20 62 65 20 61 20 73 69  e should be a si
11660 6e 67 6c 65 20 69 74 65 6d 20 6f 6e 20 74 68 65  ngle item on the
11670 20 73 74 61 63 6b 2e 20 20 57 72 69 74 65 20 74   stack.  Write t
11680 68 69 73 0a 20 20 20 20 2a 2a 20 69 74 65 6d 20  his.    ** item 
11690 69 6e 74 6f 20 74 68 65 20 73 65 74 20 74 61 62  into the set tab
116a0 6c 65 20 77 69 74 68 20 62 6f 67 75 73 20 64 61  le with bogus da
116b0 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ta..    */.    c
116c0 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20  ase SRT_Set: {. 
116d0 20 20 20 20 20 69 6e 74 20 72 31 3b 0a 20 20 20       int r1;.   
116e0 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 2d 3e     assert( pIn->
116f0 6e 53 64 73 74 3d 3d 31 20 29 3b 0a 20 20 20 20  nSdst==1 );.    
11700 20 20 70 44 65 73 74 2d 3e 61 66 66 53 64 73 74    pDest->affSdst
11710 20 3d 20 0a 20 20 20 20 20 20 20 20 20 73 71 6c   = .         sql
11720 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e  ite3CompareAffin
11730 69 74 79 28 70 2d 3e 70 45 4c 69 73 74 2d 3e 61  ity(p->pEList->a
11740 5b 30 5d 2e 70 45 78 70 72 2c 20 70 44 65 73 74  [0].pExpr, pDest
11750 2d 3e 61 66 66 53 64 73 74 29 3b 0a 20 20 20 20  ->affSdst);.    
11760 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65    r1 = sqlite3Ge
11770 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
11780 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
11790 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
117a0 4d 61 6b 65 52 65 63 6f 72 64 2c 20 70 49 6e 2d  MakeRecord, pIn-
117b0 3e 69 53 64 73 74 2c 20 31 2c 20 72 31 2c 20 26  >iSdst, 1, r1, &
117c0 70 44 65 73 74 2d 3e 61 66 66 53 64 73 74 2c 31  pDest->affSdst,1
117d0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
117e0 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74  ExprCacheAffinit
117f0 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20  yChange(pParse, 
11800 70 49 6e 2d 3e 69 53 64 73 74 2c 20 31 29 3b 0a  pIn->iSdst, 1);.
11810 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
11820 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64  eAddOp2(v, OP_Id
11830 78 49 6e 73 65 72 74 2c 20 70 44 65 73 74 2d 3e  xInsert, pDest->
11840 69 53 44 50 61 72 6d 2c 20 72 31 29 3b 0a 20 20  iSDParm, r1);.  
11850 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
11860 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
11870 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72 65  , r1);.      bre
11880 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20 30  ak;.    }..#if 0
11890 20 20 2f 2a 20 4e 65 76 65 72 20 6f 63 63 75 72    /* Never occur
118a0 73 20 6f 6e 20 61 6e 20 4f 52 44 45 52 20 42 59  s on an ORDER BY
118b0 20 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 2f 2a   query */.    /*
118c0 20 49 66 20 61 6e 79 20 72 6f 77 20 65 78 69 73   If any row exis
118d0 74 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  t in the result 
118e0 73 65 74 2c 20 72 65 63 6f 72 64 20 74 68 61 74  set, record that
118f0 20 66 61 63 74 20 61 6e 64 20 61 62 6f 72 74 2e   fact and abort.
11900 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
11910 20 53 52 54 5f 45 78 69 73 74 73 3a 20 7b 0a 20   SRT_Exists: {. 
11920 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
11930 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
11940 65 67 65 72 2c 20 31 2c 20 70 44 65 73 74 2d 3e  eger, 1, pDest->
11950 69 53 44 50 61 72 6d 29 3b 0a 20 20 20 20 20 20  iSDParm);.      
11960 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61  /* The LIMIT cla
11970 75 73 65 20 77 69 6c 6c 20 74 65 72 6d 69 6e 61  use will termina
11980 74 65 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20  te the loop for 
11990 75 73 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61  us */.      brea
119a0 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
119b0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
119c0 69 73 20 61 20 73 63 61 6c 61 72 20 73 65 6c 65  is a scalar sele
119d0 63 74 20 74 68 61 74 20 69 73 20 70 61 72 74 20  ct that is part 
119e0 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  of an expression
119f0 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 73 74  , then.    ** st
11a00 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20  ore the results 
11a10 69 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  in the appropria
11a20 74 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61  te memory cell a
11a30 6e 64 20 62 72 65 61 6b 20 6f 75 74 0a 20 20 20  nd break out.   
11a40 20 2a 2a 20 6f 66 20 74 68 65 20 73 63 61 6e 20   ** of the scan 
11a50 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  loop..    */.   
11a60 20 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b   case SRT_Mem: {
11a70 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
11a80 49 6e 2d 3e 6e 53 64 73 74 3d 3d 31 20 29 3b 0a  In->nSdst==1 );.
11a90 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
11aa0 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65  rCodeMove(pParse
11ab0 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 44  , pIn->iSdst, pD
11ac0 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 31 29  est->iSDParm, 1)
11ad0 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c  ;.      /* The L
11ae0 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c  IMIT clause will
11af0 20 6a 75 6d 70 20 6f 75 74 20 6f 66 20 74 68 65   jump out of the
11b00 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a   loop for us */.
11b10 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
11b20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66   }.#endif /* #if
11b30 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
11b40 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 20 20  _SUBQUERY */..  
11b50 20 20 2f 2a 20 54 68 65 20 72 65 73 75 6c 74 73    /* The results
11b60 20 61 72 65 20 73 74 6f 72 65 64 20 69 6e 20 61   are stored in a
11b70 20 73 65 71 75 65 6e 63 65 20 6f 66 20 72 65 67   sequence of reg
11b80 69 73 74 65 72 73 0a 20 20 20 20 2a 2a 20 73 74  isters.    ** st
11b90 61 72 74 69 6e 67 20 61 74 20 70 44 65 73 74 2d  arting at pDest-
11ba0 3e 69 53 64 73 74 2e 20 20 54 68 65 6e 20 74 68  >iSdst.  Then th
11bb0 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20 79 69 65  e co-routine yie
11bc0 6c 64 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  lds..    */.    
11bd0 63 61 73 65 20 53 52 54 5f 43 6f 72 6f 75 74 69  case SRT_Corouti
11be0 6e 65 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  ne: {.      if( 
11bf0 70 44 65 73 74 2d 3e 69 53 64 73 74 3d 3d 30 20  pDest->iSdst==0 
11c00 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65 73 74  ){.        pDest
11c10 2d 3e 69 53 64 73 74 20 3d 20 73 71 6c 69 74 65  ->iSdst = sqlite
11c20 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50  3GetTempRange(pP
11c30 61 72 73 65 2c 20 70 49 6e 2d 3e 6e 53 64 73 74  arse, pIn->nSdst
11c40 29 3b 0a 20 20 20 20 20 20 20 20 70 44 65 73 74  );.        pDest
11c50 2d 3e 6e 53 64 73 74 20 3d 20 70 49 6e 2d 3e 6e  ->nSdst = pIn->n
11c60 53 64 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Sdst;.      }.  
11c70 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
11c80 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20  odeMove(pParse, 
11c90 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 44 65 73  pIn->iSdst, pDes
11ca0 74 2d 3e 69 53 64 73 74 2c 20 70 44 65 73 74 2d  t->iSdst, pDest-
11cb0 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20 20 20 73  >nSdst);.      s
11cc0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
11cd0 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 70 44  (v, OP_Yield, pD
11ce0 65 73 74 2d 3e 69 53 44 50 61 72 6d 29 3b 0a 20  est->iSDParm);. 
11cf0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
11d00 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e  }..    /* If non
11d10 65 20 6f 66 20 74 68 65 20 61 62 6f 76 65 2c 20  e of the above, 
11d20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20  then the result 
11d30 64 65 73 74 69 6e 61 74 69 6f 6e 20 6d 75 73 74  destination must
11d40 20 62 65 0a 20 20 20 20 2a 2a 20 53 52 54 5f 4f   be.    ** SRT_O
11d50 75 74 70 75 74 2e 20 20 54 68 69 73 20 72 6f 75  utput.  This rou
11d60 74 69 6e 65 20 69 73 20 6e 65 76 65 72 20 63 61  tine is never ca
11d70 6c 6c 65 64 20 77 69 74 68 20 61 6e 79 20 6f 74  lled with any ot
11d80 68 65 72 0a 20 20 20 20 2a 2a 20 64 65 73 74 69  her.    ** desti
11d90 6e 61 74 69 6f 6e 20 6f 74 68 65 72 20 74 68 61  nation other tha
11da0 6e 20 74 68 65 20 6f 6e 65 73 20 68 61 6e 64 6c  n the ones handl
11db0 65 64 20 61 62 6f 76 65 20 6f 72 20 53 52 54 5f  ed above or SRT_
11dc0 4f 75 74 70 75 74 2e 0a 20 20 20 20 2a 2a 0a 20  Output..    **. 
11dd0 20 20 20 2a 2a 20 46 6f 72 20 53 52 54 5f 4f 75     ** For SRT_Ou
11de0 74 70 75 74 2c 20 72 65 73 75 6c 74 73 20 61 72  tput, results ar
11df0 65 20 73 74 6f 72 65 64 20 69 6e 20 61 20 73 65  e stored in a se
11e00 71 75 65 6e 63 65 20 6f 66 20 72 65 67 69 73 74  quence of regist
11e10 65 72 73 2e 20 20 0a 20 20 20 20 2a 2a 20 54 68  ers.  .    ** Th
11e20 65 6e 20 74 68 65 20 4f 50 5f 52 65 73 75 6c 74  en the OP_Result
11e30 52 6f 77 20 6f 70 63 6f 64 65 20 69 73 20 75 73  Row opcode is us
11e40 65 64 20 74 6f 20 63 61 75 73 65 20 73 71 6c 69  ed to cause sqli
11e50 74 65 33 5f 73 74 65 70 28 29 20 74 6f 0a 20 20  te3_step() to.  
11e60 20 20 2a 2a 20 72 65 74 75 72 6e 20 74 68 65 20    ** return the 
11e70 6e 65 78 74 20 72 6f 77 20 6f 66 20 72 65 73 75  next row of resu
11e80 6c 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64  lt..    */.    d
11e90 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
11ea0 61 73 73 65 72 74 28 20 70 44 65 73 74 2d 3e 65  assert( pDest->e
11eb0 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74  Dest==SRT_Output
11ec0 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
11ed0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
11ee0 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 70 49 6e  P_ResultRow, pIn
11ef0 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53  ->iSdst, pIn->nS
11f00 64 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  dst);.      sqli
11f10 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69  te3ExprCacheAffi
11f20 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73  nityChange(pPars
11f30 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70  e, pIn->iSdst, p
11f40 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20  In->nSdst);.    
11f50 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
11f60 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f   }..  /* Jump to
11f70 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
11f80 6c 6f 6f 70 20 69 66 20 74 68 65 20 4c 49 4d 49  loop if the LIMI
11f90 54 20 69 73 20 72 65 61 63 68 65 64 2e 0a 20 20  T is reached..  
11fa0 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d  */.  if( p->iLim
11fb0 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  it ){.    sqlite
11fc0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
11fd0 50 5f 49 66 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69  P_IfZero, p->iLi
11fe0 6d 69 74 2c 20 69 42 72 65 61 6b 2c 20 2d 31 29  mit, iBreak, -1)
11ff0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65  ;.  }..  /* Gene
12000 72 61 74 65 20 74 68 65 20 73 75 62 72 6f 75 74  rate the subrout
12010 69 6e 65 20 72 65 74 75 72 6e 0a 20 20 2a 2f 0a  ine return.  */.
12020 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
12030 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f  olveLabel(v, iCo
12040 6e 74 69 6e 75 65 29 3b 0a 20 20 73 71 6c 69 74  ntinue);.  sqlit
12050 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
12060 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 52 65  OP_Return, regRe
12070 74 75 72 6e 29 3b 0a 0a 20 20 72 65 74 75 72 6e  turn);..  return
12080 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   addr;.}../*.** 
12090 41 6c 74 65 72 6e 61 74 69 76 65 20 63 6f 6d 70  Alternative comp
120a0 6f 75 6e 64 20 73 65 6c 65 63 74 20 63 6f 64 65  ound select code
120b0 20 67 65 6e 65 72 61 74 6f 72 20 66 6f 72 20 63   generator for c
120c0 61 73 65 73 20 77 68 65 6e 20 74 68 65 72 65 0a  ases when there.
120d0 2a 2a 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42  ** is an ORDER B
120e0 59 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20  Y clause..**.** 
120f0 57 65 20 61 73 73 75 6d 65 20 61 20 71 75 65 72  We assume a quer
12100 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  y of the followi
12110 6e 67 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20  ng form:.**.**  
12120 20 20 20 20 3c 73 65 6c 65 63 74 41 3e 20 20 3c      <selectA>  <
12130 6f 70 65 72 61 74 6f 72 3e 20 20 3c 73 65 6c 65  operator>  <sele
12140 63 74 42 3e 20 20 4f 52 44 45 52 20 42 59 20 3c  ctB>  ORDER BY <
12150 6f 72 64 65 72 62 79 6c 69 73 74 3e 0a 2a 2a 0a  orderbylist>.**.
12160 2a 2a 20 3c 6f 70 65 72 61 74 6f 72 3e 20 69 73  ** <operator> is
12170 20 6f 6e 65 20 6f 66 20 55 4e 49 4f 4e 20 41 4c   one of UNION AL
12180 4c 2c 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54  L, UNION, EXCEPT
12190 2c 20 6f 72 20 49 4e 54 45 52 53 45 43 54 2e 20  , or INTERSECT. 
121a0 20 54 68 65 20 69 64 65 61 0a 2a 2a 20 69 73 20   The idea.** is 
121b0 74 6f 20 63 6f 64 65 20 62 6f 74 68 20 3c 73 65  to code both <se
121c0 6c 65 63 74 41 3e 20 61 6e 64 20 3c 73 65 6c 65  lectA> and <sele
121d0 63 74 42 3e 20 77 69 74 68 20 74 68 65 20 4f 52  ctB> with the OR
121e0 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 73  DER BY clause as
121f0 0a 2a 2a 20 63 6f 2d 72 6f 75 74 69 6e 65 73 2e  .** co-routines.
12200 20 20 54 68 65 6e 20 72 75 6e 20 74 68 65 20 63    Then run the c
12210 6f 2d 72 6f 75 74 69 6e 65 73 20 69 6e 20 70 61  o-routines in pa
12220 72 61 6c 6c 65 6c 20 61 6e 64 20 6d 65 72 67 65  rallel and merge
12230 20 74 68 65 20 72 65 73 75 6c 74 73 0a 2a 2a 20   the results.** 
12240 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75 74 2e  into the output.
12250 20 20 49 6e 20 61 64 64 69 74 69 6f 6e 20 74 6f    In addition to
12260 20 74 68 65 20 74 77 6f 20 63 6f 72 6f 75 74 69   the two corouti
12270 6e 65 73 20 28 63 61 6c 6c 65 64 20 73 65 6c 65  nes (called sele
12280 63 74 41 20 61 6e 64 0a 2a 2a 20 73 65 6c 65 63  ctA and.** selec
12290 74 42 29 20 74 68 65 72 65 20 61 72 65 20 37 20  tB) there are 7 
122a0 73 75 62 72 6f 75 74 69 6e 65 73 3a 0a 2a 2a 0a  subroutines:.**.
122b0 2a 2a 20 20 20 20 6f 75 74 41 3a 20 20 20 20 4d  **    outA:    M
122c0 6f 76 65 20 74 68 65 20 6f 75 74 70 75 74 20 6f  ove the output o
122d0 66 20 74 68 65 20 73 65 6c 65 63 74 41 20 63 6f  f the selectA co
122e0 72 6f 75 74 69 6e 65 20 69 6e 74 6f 20 74 68 65  routine into the
122f0 20 6f 75 74 70 75 74 0a 2a 2a 20 20 20 20 20 20   output.**      
12300 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 63 6f         of the co
12310 6d 70 6f 75 6e 64 20 71 75 65 72 79 2e 0a 2a 2a  mpound query..**
12320 0a 2a 2a 20 20 20 20 6f 75 74 42 3a 20 20 20 20  .**    outB:    
12330 4d 6f 76 65 20 74 68 65 20 6f 75 74 70 75 74 20  Move the output 
12340 6f 66 20 74 68 65 20 73 65 6c 65 63 74 42 20 63  of the selectB c
12350 6f 72 6f 75 74 69 6e 65 20 69 6e 74 6f 20 74 68  oroutine into th
12360 65 20 6f 75 74 70 75 74 0a 2a 2a 20 20 20 20 20  e output.**     
12370 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 63          of the c
12380 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 2e 20 20  ompound query.  
12390 28 4f 6e 6c 79 20 67 65 6e 65 72 61 74 65 64 20  (Only generated 
123a0 66 6f 72 20 55 4e 49 4f 4e 20 61 6e 64 0a 2a 2a  for UNION and.**
123b0 20 20 20 20 20 20 20 20 20 20 20 20 20 55 4e 49               UNI
123c0 4f 4e 20 41 4c 4c 2e 20 20 45 58 43 45 50 54 20  ON ALL.  EXCEPT 
123d0 61 6e 64 20 49 4e 53 45 52 54 53 45 43 54 20 6e  and INSERTSECT n
123e0 65 76 65 72 20 6f 75 74 70 75 74 20 61 20 72 6f  ever output a ro
123f0 77 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20  w that.**       
12400 20 20 20 20 20 20 61 70 70 65 61 72 73 20 6f 6e        appears on
12410 6c 79 20 69 6e 20 42 2e 29 0a 2a 2a 0a 2a 2a 20  ly in B.).**.** 
12420 20 20 20 41 6c 74 42 3a 20 20 20 20 43 61 6c 6c     AltB:    Call
12430 65 64 20 77 68 65 6e 20 74 68 65 72 65 20 69 73  ed when there is
12440 20 64 61 74 61 20 66 72 6f 6d 20 62 6f 74 68 20   data from both 
12450 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 41  coroutines and A
12460 3c 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 65 71  <B..**.**    Aeq
12470 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65  B:    Called whe
12480 6e 20 74 68 65 72 65 20 69 73 20 64 61 74 61 20  n there is data 
12490 66 72 6f 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74  from both corout
124a0 69 6e 65 73 20 61 6e 64 20 41 3d 3d 42 2e 0a 2a  ines and A==B..*
124b0 2a 0a 2a 2a 20 20 20 20 41 67 74 42 3a 20 20 20  *.**    AgtB:   
124c0 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65   Called when the
124d0 72 65 20 69 73 20 64 61 74 61 20 66 72 6f 6d 20  re is data from 
124e0 62 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65 73 20  both coroutines 
124f0 61 6e 64 20 41 3e 42 2e 0a 2a 2a 0a 2a 2a 20 20  and A>B..**.**  
12500 20 20 45 6f 66 41 3a 20 20 20 20 43 61 6c 6c 65    EofA:    Calle
12510 64 20 77 68 65 6e 20 64 61 74 61 20 69 73 20 65  d when data is e
12520 78 68 61 75 73 74 65 64 20 66 72 6f 6d 20 73 65  xhausted from se
12530 6c 65 63 74 41 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  lectA..**.**    
12540 45 6f 66 42 3a 20 20 20 20 43 61 6c 6c 65 64 20  EofB:    Called 
12550 77 68 65 6e 20 64 61 74 61 20 69 73 20 65 78 68  when data is exh
12560 61 75 73 74 65 64 20 66 72 6f 6d 20 73 65 6c 65  austed from sele
12570 63 74 42 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69  ctB..**.** The i
12580 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
12590 20 74 68 65 20 6c 61 74 74 65 72 20 66 69 76 65   the latter five
125a0 20 73 75 62 72 6f 75 74 69 6e 65 73 20 64 65 70   subroutines dep
125b0 65 6e 64 20 6f 6e 20 77 68 69 63 68 20 0a 2a 2a  end on which .**
125c0 20 3c 6f 70 65 72 61 74 6f 72 3e 20 69 73 20 75   <operator> is u
125d0 73 65 64 3a 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 20 20  sed:.**.**.**   
125e0 20 20 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20            UNION 
125f0 41 4c 4c 20 20 20 20 20 20 20 20 20 55 4e 49 4f  ALL         UNIO
12600 4e 20 20 20 20 20 20 20 20 20 20 20 20 45 58 43  N            EXC
12610 45 50 54 20 20 20 20 20 20 20 20 20 20 49 4e 54  EPT          INT
12620 45 52 53 45 43 54 0a 2a 2a 20 20 20 20 20 20 20  ERSECT.**       
12630 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d     -------------
12640 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
12650 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ---  -----------
12660 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ---  -----------
12670 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 41 6c 74 42  ------.**   AltB
12680 3a 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20  :   outA, nextA 
12690 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41       outA, nextA
126a0 20 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78         outA, nex
126b0 74 41 20 20 20 20 20 20 20 20 20 6e 65 78 74 41  tA         nextA
126c0 0a 2a 2a 0a 2a 2a 20 20 20 41 65 71 42 3a 20 20  .**.**   AeqB:  
126d0 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20   outA, nextA    
126e0 20 20 20 20 20 6e 65 78 74 41 20 20 20 20 20 20       nextA      
126f0 20 20 20 20 20 20 20 6e 65 78 74 41 20 20 20 20         nextA    
12700 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41       outA, nextA
12710 0a 2a 2a 0a 2a 2a 20 20 20 41 67 74 42 3a 20 20  .**.**   AgtB:  
12720 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20   outB, nextB    
12730 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20 20    outB, nextB   
12740 20 20 20 20 20 20 20 6e 65 78 74 42 20 20 20 20         nextB    
12750 20 20 20 20 20 20 20 20 6e 65 78 74 42 0a 2a 2a          nextB.**
12760 0a 2a 2a 20 20 20 45 6f 66 41 3a 20 20 20 6f 75  .**   EofA:   ou
12770 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20 20 6f  tB, nextB      o
12780 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20 20  utB, nextB      
12790 20 20 20 20 68 61 6c 74 20 20 20 20 20 20 20 20      halt        
127a0 20 20 20 20 20 68 61 6c 74 0a 2a 2a 0a 2a 2a 20       halt.**.** 
127b0 20 20 45 6f 66 42 3a 20 20 20 6f 75 74 41 2c 20    EofB:   outA, 
127c0 6e 65 78 74 41 20 20 20 20 20 20 6f 75 74 41 2c  nextA      outA,
127d0 20 6e 65 78 74 41 20 20 20 20 20 20 20 6f 75 74   nextA       out
127e0 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20 20  A, nextA        
127f0 20 68 61 6c 74 0a 2a 2a 0a 2a 2a 20 49 6e 20 74   halt.**.** In t
12800 68 65 20 41 6c 74 42 2c 20 41 65 71 42 2c 20 61  he AltB, AeqB, a
12810 6e 64 20 41 67 74 42 20 73 75 62 72 6f 75 74 69  nd AgtB subrouti
12820 6e 65 73 2c 20 61 6e 20 45 4f 46 20 6f 6e 20 41  nes, an EOF on A
12830 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78 74 41   following nextA
12840 0a 2a 2a 20 63 61 75 73 65 73 20 61 6e 20 69 6d  .** causes an im
12850 6d 65 64 69 61 74 65 20 6a 75 6d 70 20 74 6f 20  mediate jump to 
12860 45 6f 66 41 20 61 6e 64 20 61 6e 20 45 4f 46 20  EofA and an EOF 
12870 6f 6e 20 42 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e  on B following n
12880 65 78 74 42 20 63 61 75 73 65 73 0a 2a 2a 20 61  extB causes.** a
12890 6e 20 69 6d 6d 65 64 69 61 74 65 20 6a 75 6d 70  n immediate jump
128a0 20 74 6f 20 45 6f 66 42 2e 20 20 57 69 74 68 69   to EofB.  Withi
128b0 6e 20 45 6f 66 41 20 61 6e 64 20 45 6f 66 42 2c  n EofA and EofB,
128c0 20 61 6e 64 20 45 4f 46 20 6f 6e 20 65 6e 74 72   and EOF on entr
128d0 79 20 6f 72 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e  y or.** followin
128e0 67 20 6e 65 78 74 58 20 63 61 75 73 65 73 20 61  g nextX causes a
128f0 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 65 6e 64   jump to the end
12900 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 20 70   of the select p
12910 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a  rocessing..**.**
12920 20 44 75 70 6c 69 63 61 74 65 20 72 65 6d 6f 76   Duplicate remov
12930 61 6c 20 69 6e 20 74 68 65 20 55 4e 49 4f 4e 2c  al in the UNION,
12940 20 45 58 43 45 50 54 2c 20 61 6e 64 20 49 4e 54   EXCEPT, and INT
12950 45 52 53 45 43 54 20 63 61 73 65 73 20 69 73 20  ERSECT cases is 
12960 68 61 6e 64 6c 65 64 0a 2a 2a 20 77 69 74 68 69  handled.** withi
12970 6e 20 74 68 65 20 6f 75 74 70 75 74 20 73 75 62  n the output sub
12980 72 6f 75 74 69 6e 65 2e 20 20 54 68 65 20 72 65  routine.  The re
12990 67 50 72 65 76 20 72 65 67 69 73 74 65 72 20 73  gPrev register s
129a0 65 74 20 68 6f 6c 64 73 20 74 68 65 20 70 72 65  et holds the pre
129b0 76 69 6f 75 73 6c 79 0a 2a 2a 20 6f 75 74 70 75  viously.** outpu
129c0 74 20 76 61 6c 75 65 2e 20 20 41 20 63 6f 6d 70  t value.  A comp
129d0 61 72 69 73 6f 6e 20 69 73 20 6d 61 64 65 20 61  arison is made a
129e0 67 61 69 6e 73 74 20 74 68 69 73 20 76 61 6c 75  gainst this valu
129f0 65 20 61 6e 64 20 74 68 65 20 6f 75 74 70 75 74  e and the output
12a00 0a 2a 2a 20 69 73 20 73 6b 69 70 70 65 64 20 69  .** is skipped i
12a10 66 20 74 68 65 20 6e 65 78 74 20 72 65 73 75 6c  f the next resul
12a20 74 73 20 77 6f 75 6c 64 20 62 65 20 74 68 65 20  ts would be the 
12a30 73 61 6d 65 20 61 73 20 74 68 65 20 70 72 65 76  same as the prev
12a40 69 6f 75 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ious..**.** The 
12a50 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 70  implementation p
12a60 6c 61 6e 20 69 73 20 74 6f 20 69 6d 70 6c 65 6d  lan is to implem
12a70 65 6e 74 20 74 68 65 20 74 77 6f 20 63 6f 72 6f  ent the two coro
12a80 75 74 69 6e 65 73 20 61 6e 64 20 73 65 76 65 6e  utines and seven
12a90 0a 2a 2a 20 73 75 62 72 6f 75 74 69 6e 65 73 20  .** subroutines 
12aa0 66 69 72 73 74 2c 20 74 68 65 6e 20 70 75 74 20  first, then put 
12ab0 74 68 65 20 63 6f 6e 74 72 6f 6c 20 6c 6f 67 69  the control logi
12ac0 63 20 61 74 20 74 68 65 20 62 6f 74 74 6f 6d 2e  c at the bottom.
12ad0 20 20 4c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a    Like this:.**.
12ae0 2a 2a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  **          goto
12af0 20 49 6e 69 74 0a 2a 2a 20 20 20 20 20 63 6f 41   Init.**     coA
12b00 3a 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20  : coroutine for 
12b10 6c 65 66 74 20 71 75 65 72 79 20 28 41 29 0a 2a  left query (A).*
12b20 2a 20 20 20 20 20 63 6f 42 3a 20 63 6f 72 6f 75  *     coB: corou
12b30 74 69 6e 65 20 66 6f 72 20 72 69 67 68 74 20 71  tine for right q
12b40 75 65 72 79 20 28 42 29 0a 2a 2a 20 20 20 20 6f  uery (B).**    o
12b50 75 74 41 3a 20 6f 75 74 70 75 74 20 6f 6e 65 20  utA: output one 
12b60 72 6f 77 20 6f 66 20 41 0a 2a 2a 20 20 20 20 6f  row of A.**    o
12b70 75 74 42 3a 20 6f 75 74 70 75 74 20 6f 6e 65 20  utB: output one 
12b80 72 6f 77 20 6f 66 20 42 20 28 55 4e 49 4f 4e 20  row of B (UNION 
12b90 61 6e 64 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 6e  and UNION ALL on
12ba0 6c 79 29 0a 2a 2a 20 20 20 20 45 6f 66 41 3a 20  ly).**    EofA: 
12bb0 2e 2e 2e 0a 2a 2a 20 20 20 20 45 6f 66 42 3a 20  ....**    EofB: 
12bc0 2e 2e 2e 0a 2a 2a 20 20 20 20 41 6c 74 42 3a 20  ....**    AltB: 
12bd0 2e 2e 2e 0a 2a 2a 20 20 20 20 41 65 71 42 3a 20  ....**    AeqB: 
12be0 2e 2e 2e 0a 2a 2a 20 20 20 20 41 67 74 42 3a 20  ....**    AgtB: 
12bf0 2e 2e 2e 0a 2a 2a 20 20 20 20 49 6e 69 74 3a 20  ....**    Init: 
12c00 69 6e 69 74 69 61 6c 69 7a 65 20 63 6f 72 6f 75  initialize corou
12c10 74 69 6e 65 20 72 65 67 69 73 74 65 72 73 0a 2a  tine registers.*
12c20 2a 20 20 20 20 20 20 20 20 20 20 79 69 65 6c 64  *          yield
12c30 20 63 6f 41 0a 2a 2a 20 20 20 20 20 20 20 20 20   coA.**         
12c40 20 69 66 20 65 6f 66 28 41 29 20 67 6f 74 6f 20   if eof(A) goto 
12c50 45 6f 66 41 0a 2a 2a 20 20 20 20 20 20 20 20 20  EofA.**         
12c60 20 79 69 65 6c 64 20 63 6f 42 0a 2a 2a 20 20 20   yield coB.**   
12c70 20 20 20 20 20 20 20 69 66 20 65 6f 66 28 42 29         if eof(B)
12c80 20 67 6f 74 6f 20 45 6f 66 42 0a 2a 2a 20 20 20   goto EofB.**   
12c90 20 43 6d 70 72 3a 20 43 6f 6d 70 61 72 65 20 41   Cmpr: Compare A
12ca0 2c 20 42 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  , B.**          
12cb0 4a 75 6d 70 20 41 6c 74 42 2c 20 41 65 71 42 2c  Jump AltB, AeqB,
12cc0 20 41 67 74 42 0a 2a 2a 20 20 20 20 20 45 6e 64   AgtB.**     End
12cd0 3a 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 63  : ....**.** We c
12ce0 61 6c 6c 20 41 6c 74 42 2c 20 41 65 71 42 2c 20  all AltB, AeqB, 
12cf0 41 67 74 42 2c 20 45 6f 66 41 2c 20 61 6e 64 20  AgtB, EofA, and 
12d00 45 6f 66 42 20 22 73 75 62 72 6f 75 74 69 6e 65  EofB "subroutine
12d10 73 22 20 62 75 74 20 74 68 65 79 20 61 72 65 20  s" but they are 
12d20 6e 6f 74 0a 2a 2a 20 61 63 74 75 61 6c 6c 79 20  not.** actually 
12d30 63 61 6c 6c 65 64 20 75 73 69 6e 67 20 47 6f 73  called using Gos
12d40 75 62 20 61 6e 64 20 74 68 65 79 20 64 6f 20 6e  ub and they do n
12d50 6f 74 20 52 65 74 75 72 6e 2e 20 20 45 6f 66 41  ot Return.  EofA
12d60 20 61 6e 64 20 45 6f 66 42 20 6c 6f 6f 70 0a 2a   and EofB loop.*
12d70 2a 20 75 6e 74 69 6c 20 61 6c 6c 20 64 61 74 61  * until all data
12d80 20 69 73 20 65 78 68 61 75 73 74 65 64 20 74 68   is exhausted th
12d90 65 6e 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 22  en jump to the "
12da0 65 6e 64 22 20 6c 61 62 65 2e 20 20 41 6c 74 42  end" labe.  AltB
12db0 2c 20 41 65 71 42 2c 0a 2a 2a 20 61 6e 64 20 41  , AeqB,.** and A
12dc0 67 74 42 20 6a 75 6d 70 20 74 6f 20 65 69 74 68  gtB jump to eith
12dd0 65 72 20 4c 32 20 6f 72 20 74 6f 20 6f 6e 65 20  er L2 or to one 
12de0 6f 66 20 45 6f 66 41 20 6f 72 20 45 6f 66 42 2e  of EofA or EofB.
12df0 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
12e00 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  TE_OMIT_COMPOUND
12e10 5f 53 45 4c 45 43 54 0a 73 74 61 74 69 63 20 69  _SELECT.static i
12e20 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72  nt multiSelectOr
12e30 64 65 72 42 79 28 0a 20 20 50 61 72 73 65 20 2a  derBy(.  Parse *
12e40 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f  pParse,        /
12e50 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
12e60 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
12e70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
12e80 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f  The right-most o
12e90 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65 20  f SELECTs to be 
12ea0 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63  coded */.  Selec
12eb0 74 44 65 73 74 20 2a 70 44 65 73 74 20 20 20 20  tDest *pDest    
12ec0 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77   /* What to do w
12ed0 69 74 68 20 71 75 65 72 79 20 72 65 73 75 6c 74  ith query result
12ee0 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c  s */.){.  int i,
12ef0 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   j;             
12f00 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73  /* Loop counters
12f10 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 50   */.  Select *pP
12f20 72 69 6f 72 3b 20 20 20 20 20 20 20 2f 2a 20 41  rior;       /* A
12f30 6e 6f 74 68 65 72 20 53 45 4c 45 43 54 20 69 6d  nother SELECT im
12f40 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 6f 75 72  mediately to our
12f50 20 6c 65 66 74 20 2a 2f 0a 20 20 56 64 62 65 20   left */.  Vdbe 
12f60 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *v;             
12f70 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
12f80 65 20 74 6f 20 74 68 69 73 20 56 44 42 45 20 2a  e to this VDBE *
12f90 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 64  /.  SelectDest d
12fa0 65 73 74 41 3b 20 20 20 20 20 2f 2a 20 44 65 73  estA;     /* Des
12fb0 74 69 6e 61 74 69 6f 6e 20 66 6f 72 20 63 6f 72  tination for cor
12fc0 6f 75 74 69 6e 65 20 41 20 2a 2f 0a 20 20 53 65  outine A */.  Se
12fd0 6c 65 63 74 44 65 73 74 20 64 65 73 74 42 3b 20  lectDest destB; 
12fe0 20 20 20 20 2f 2a 20 44 65 73 74 69 6e 61 74 69      /* Destinati
12ff0 6f 6e 20 66 6f 72 20 63 6f 72 6f 75 74 69 6e 65  on for coroutine
13000 20 42 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 41   B */.  int regA
13010 64 64 72 41 3b 20 20 20 20 20 20 20 20 20 2f 2a  ddrA;         /*
13020 20 41 64 64 72 65 73 73 20 72 65 67 69 73 74 65   Address registe
13030 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 41 20 63  r for select-A c
13040 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  oroutine */.  in
13050 74 20 72 65 67 45 6f 66 41 3b 20 20 20 20 20 20  t regEofA;      
13060 20 20 20 20 2f 2a 20 46 6c 61 67 20 74 6f 20 69      /* Flag to i
13070 6e 64 69 63 61 74 65 20 77 68 65 6e 20 73 65 6c  ndicate when sel
13080 65 63 74 2d 41 20 69 73 20 63 6f 6d 70 6c 65 74  ect-A is complet
13090 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 41 64  e */.  int regAd
130a0 64 72 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  drB;         /* 
130b0 41 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72  Address register
130c0 20 66 6f 72 20 73 65 6c 65 63 74 2d 42 20 63 6f   for select-B co
130d0 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
130e0 20 72 65 67 45 6f 66 42 3b 20 20 20 20 20 20 20   regEofB;       
130f0 20 20 20 2f 2a 20 46 6c 61 67 20 74 6f 20 69 6e     /* Flag to in
13100 64 69 63 61 74 65 20 77 68 65 6e 20 73 65 6c 65  dicate when sele
13110 63 74 2d 42 20 69 73 20 63 6f 6d 70 6c 65 74 65  ct-B is complete
13120 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 53 65   */.  int addrSe
13130 6c 65 63 74 41 3b 20 20 20 20 20 20 2f 2a 20 41  lectA;      /* A
13140 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 73 65  ddress of the se
13150 6c 65 63 74 2d 41 20 63 6f 72 6f 75 74 69 6e 65  lect-A coroutine
13160 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 53 65   */.  int addrSe
13170 6c 65 63 74 42 3b 20 20 20 20 20 20 2f 2a 20 41  lectB;      /* A
13180 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 73 65  ddress of the se
13190 6c 65 63 74 2d 42 20 63 6f 72 6f 75 74 69 6e 65  lect-B coroutine
131a0 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75 74   */.  int regOut
131b0 41 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  A;          /* A
131c0 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20  ddress register 
131d0 66 6f 72 20 74 68 65 20 6f 75 74 70 75 74 2d 41  for the output-A
131e0 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
131f0 20 69 6e 74 20 72 65 67 4f 75 74 42 3b 20 20 20   int regOutB;   
13200 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
13210 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 74  s register for t
13220 68 65 20 6f 75 74 70 75 74 2d 42 20 73 75 62 72  he output-B subr
13230 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
13240 61 64 64 72 4f 75 74 41 3b 20 20 20 20 20 20 20  addrOutA;       
13250 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
13260 74 68 65 20 6f 75 74 70 75 74 2d 41 20 73 75 62  the output-A sub
13270 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
13280 20 61 64 64 72 4f 75 74 42 20 3d 20 30 3b 20 20   addrOutB = 0;  
13290 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
132a0 20 74 68 65 20 6f 75 74 70 75 74 2d 42 20 73 75   the output-B su
132b0 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  broutine */.  in
132c0 74 20 61 64 64 72 45 6f 66 41 3b 20 20 20 20 20  t addrEofA;     
132d0 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
132e0 66 20 74 68 65 20 73 65 6c 65 63 74 2d 41 2d 65  f the select-A-e
132f0 78 68 61 75 73 74 65 64 20 73 75 62 72 6f 75 74  xhausted subrout
13300 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ine */.  int add
13310 72 45 6f 66 42 3b 20 20 20 20 20 20 20 20 20 2f  rEofB;         /
13320 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
13330 20 73 65 6c 65 63 74 2d 42 2d 65 78 68 61 75 73   select-B-exhaus
13340 74 65 64 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  ted subroutine *
13350 2f 0a 20 20 69 6e 74 20 61 64 64 72 41 6c 74 42  /.  int addrAltB
13360 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64  ;         /* Add
13370 72 65 73 73 20 6f 66 20 74 68 65 20 41 3c 42 20  ress of the A<B 
13380 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
13390 69 6e 74 20 61 64 64 72 41 65 71 42 3b 20 20 20  int addrAeqB;   
133a0 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
133b0 20 6f 66 20 74 68 65 20 41 3d 3d 42 20 73 75 62   of the A==B sub
133c0 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
133d0 20 61 64 64 72 41 67 74 42 3b 20 20 20 20 20 20   addrAgtB;      
133e0 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
133f0 20 74 68 65 20 41 3e 42 20 73 75 62 72 6f 75 74   the A>B subrout
13400 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ine */.  int reg
13410 4c 69 6d 69 74 41 3b 20 20 20 20 20 20 20 20 2f  LimitA;        /
13420 2a 20 4c 69 6d 69 74 20 72 65 67 69 73 74 65 72  * Limit register
13430 20 66 6f 72 20 73 65 6c 65 63 74 2d 41 20 2a 2f   for select-A */
13440 0a 20 20 69 6e 74 20 72 65 67 4c 69 6d 69 74 42  .  int regLimitB
13450 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6d 69  ;        /* Limi
13460 74 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 73  t register for s
13470 65 6c 65 63 74 2d 41 20 2a 2f 0a 20 20 69 6e 74  elect-A */.  int
13480 20 72 65 67 50 72 65 76 3b 20 20 20 20 20 20 20   regPrev;       
13490 20 20 20 2f 2a 20 41 20 72 61 6e 67 65 20 6f 66     /* A range of
134a0 20 72 65 67 69 73 74 65 72 73 20 74 6f 20 68 6f   registers to ho
134b0 6c 64 20 70 72 65 76 69 6f 75 73 20 6f 75 74 70  ld previous outp
134c0 75 74 20 2a 2f 0a 20 20 69 6e 74 20 73 61 76 65  ut */.  int save
134d0 64 4c 69 6d 69 74 3b 20 20 20 20 20 20 20 2f 2a  dLimit;       /*
134e0 20 53 61 76 65 64 20 76 61 6c 75 65 20 6f 66 20   Saved value of 
134f0 70 2d 3e 69 4c 69 6d 69 74 20 2a 2f 0a 20 20 69  p->iLimit */.  i
13500 6e 74 20 73 61 76 65 64 4f 66 66 73 65 74 3b 20  nt savedOffset; 
13510 20 20 20 20 20 2f 2a 20 53 61 76 65 64 20 76 61       /* Saved va
13520 6c 75 65 20 6f 66 20 70 2d 3e 69 4f 66 66 73 65  lue of p->iOffse
13530 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 61 62 65 6c  t */.  int label
13540 43 6d 70 72 3b 20 20 20 20 20 20 20 20 2f 2a 20  Cmpr;        /* 
13550 4c 61 62 65 6c 20 66 6f 72 20 74 68 65 20 73 74  Label for the st
13560 61 72 74 20 6f 66 20 74 68 65 20 6d 65 72 67 65  art of the merge
13570 20 61 6c 67 6f 72 69 74 68 6d 20 2a 2f 0a 20 20   algorithm */.  
13580 69 6e 74 20 6c 61 62 65 6c 45 6e 64 3b 20 20 20  int labelEnd;   
13590 20 20 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20 66        /* Label f
135a0 6f 72 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  or the end of th
135b0 65 20 6f 76 65 72 61 6c 6c 20 53 45 4c 45 43 54  e overall SELECT
135c0 20 73 74 6d 74 20 2a 2f 0a 20 20 69 6e 74 20 6a   stmt */.  int j
135d0 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1;              
135e0 20 2f 2a 20 4a 75 6d 70 20 69 6e 73 74 72 75 63   /* Jump instruc
135f0 74 69 6f 6e 73 20 74 68 61 74 20 67 65 74 20 72  tions that get r
13600 65 74 61 72 67 65 74 74 65 64 20 2a 2f 0a 20 20  etargetted */.  
13610 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20  int op;         
13620 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20        /* One of 
13630 54 4b 5f 41 4c 4c 2c 20 54 4b 5f 55 4e 49 4f 4e  TK_ALL, TK_UNION
13640 2c 20 54 4b 5f 45 58 43 45 50 54 2c 20 54 4b 5f  , TK_EXCEPT, TK_
13650 49 4e 54 45 52 53 45 43 54 20 2a 2f 0a 20 20 4b  INTERSECT */.  K
13660 65 79 49 6e 66 6f 20 2a 70 4b 65 79 44 75 70 20  eyInfo *pKeyDup 
13670 3d 20 30 3b 20 2f 2a 20 43 6f 6d 70 61 72 69 73  = 0; /* Comparis
13680 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  on information f
13690 6f 72 20 64 75 70 6c 69 63 61 74 65 20 72 65 6d  or duplicate rem
136a0 6f 76 61 6c 20 2a 2f 0a 20 20 4b 65 79 49 6e 66  oval */.  KeyInf
136b0 6f 20 2a 70 4b 65 79 4d 65 72 67 65 3b 20 20 20  o *pKeyMerge;   
136c0 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20 69 6e  /* Comparison in
136d0 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 6d 65  formation for me
136e0 72 67 69 6e 67 20 72 6f 77 73 20 2a 2f 0a 20 20  rging rows */.  
136f0 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20  sqlite3 *db;    
13700 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
13710 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
13720 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
13730 65 72 42 79 3b 20 20 20 2f 2a 20 54 68 65 20 4f  erBy;   /* The O
13740 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a  RDER BY clause *
13750 2f 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72 42 79  /.  int nOrderBy
13760 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  ;         /* Num
13770 62 65 72 20 6f 66 20 74 65 72 6d 73 20 69 6e 20  ber of terms in 
13780 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
13790 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 50  use */.  int *aP
137a0 65 72 6d 75 74 65 3b 20 20 20 20 20 20 20 20 2f  ermute;        /
137b0 2a 20 4d 61 70 70 69 6e 67 20 66 72 6f 6d 20 4f  * Mapping from O
137c0 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 74 6f  RDER BY terms to
137d0 20 72 65 73 75 6c 74 20 73 65 74 20 63 6f 6c 75   result set colu
137e0 6d 6e 73 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  mns */.#ifndef S
137f0 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
13800 49 4e 0a 20 20 69 6e 74 20 69 53 75 62 31 3b 20  IN.  int iSub1; 
13810 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 51             /* EQ
13820 50 20 69 64 20 6f 66 20 6c 65 66 74 2d 68 61 6e  P id of left-han
13830 64 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74  d query */.  int
13840 20 69 53 75 62 32 3b 20 20 20 20 20 20 20 20 20   iSub2;         
13850 20 20 20 2f 2a 20 45 51 50 20 69 64 20 6f 66 20     /* EQP id of 
13860 72 69 67 68 74 2d 68 61 6e 64 20 71 75 65 72 79  right-hand query
13870 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73   */.#endif..  as
13880 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42  sert( p->pOrderB
13890 79 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  y!=0 );.  assert
138a0 28 20 70 4b 65 79 44 75 70 3d 3d 30 20 29 3b 20  ( pKeyDup==0 ); 
138b0 2f 2a 20 22 4d 61 6e 61 67 65 64 22 20 63 6f 64  /* "Managed" cod
138c0 65 20 6e 65 65 64 73 20 74 68 69 73 2e 20 20 54  e needs this.  T
138d0 69 63 6b 65 74 20 23 33 33 38 32 2e 20 2a 2f 0a  icket #3382. */.
138e0 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64    db = pParse->d
138f0 62 3b 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d  b;.  v = pParse-
13900 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74  >pVdbe;.  assert
13910 28 20 76 21 3d 30 20 29 3b 20 20 20 20 20 20 20  ( v!=0 );       
13920 2f 2a 20 41 6c 72 65 61 64 79 20 74 68 72 6f 77  /* Already throw
13930 6e 20 74 68 65 20 65 72 72 6f 72 20 69 66 20 56  n the error if V
13940 44 42 45 20 61 6c 6c 6f 63 20 66 61 69 6c 65 64  DBE alloc failed
13950 20 2a 2f 0a 20 20 6c 61 62 65 6c 45 6e 64 20 3d   */.  labelEnd =
13960 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
13970 4c 61 62 65 6c 28 76 29 3b 0a 20 20 6c 61 62 65  Label(v);.  labe
13980 6c 43 6d 70 72 20 3d 20 73 71 6c 69 74 65 33 56  lCmpr = sqlite3V
13990 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
139a0 0a 0a 0a 20 20 2f 2a 20 50 61 74 63 68 20 75 70  ...  /* Patch up
139b0 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
139c0 61 75 73 65 0a 20 20 2a 2f 0a 20 20 6f 70 20 3d  ause.  */.  op =
139d0 20 70 2d 3e 6f 70 3b 20 20 0a 20 20 70 50 72 69   p->op;  .  pPri
139e0 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a  or = p->pPrior;.
139f0 20 20 61 73 73 65 72 74 28 20 70 50 72 69 6f 72    assert( pPrior
13a00 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b  ->pOrderBy==0 );
13a10 0a 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d  .  pOrderBy = p-
13a20 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 61 73 73  >pOrderBy;.  ass
13a30 65 72 74 28 20 70 4f 72 64 65 72 42 79 20 29 3b  ert( pOrderBy );
13a40 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 70 4f  .  nOrderBy = pO
13a50 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 0a  rderBy->nExpr;..
13a60 20 20 2f 2a 20 46 6f 72 20 6f 70 65 72 61 74 6f    /* For operato
13a70 72 73 20 6f 74 68 65 72 20 74 68 61 6e 20 55 4e  rs other than UN
13a80 49 4f 4e 20 41 4c 4c 20 77 65 20 68 61 76 65 20  ION ALL we have 
13a90 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  to make sure tha
13aa0 74 0a 20 20 2a 2a 20 74 68 65 20 4f 52 44 45 52  t.  ** the ORDER
13ab0 20 42 59 20 63 6c 61 75 73 65 20 63 6f 76 65 72   BY clause cover
13ac0 73 20 65 76 65 72 79 20 74 65 72 6d 20 6f 66 20  s every term of 
13ad0 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20  the result set. 
13ae0 20 41 64 64 0a 20 20 2a 2a 20 74 65 72 6d 73 20   Add.  ** terms 
13af0 74 6f 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  to the ORDER BY 
13b00 63 6c 61 75 73 65 20 61 73 20 6e 65 63 65 73 73  clause as necess
13b10 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ary..  */.  if( 
13b20 6f 70 21 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20  op!=TK_ALL ){.  
13b30 20 20 66 6f 72 28 69 3d 31 3b 20 64 62 2d 3e 6d    for(i=1; db->m
13b40 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 26  allocFailed==0 &
13b50 26 20 69 3c 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e  & i<=p->pEList->
13b60 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
13b70 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
13b80 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
13b90 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70        for(j=0, p
13ba0 49 74 65 6d 3d 70 4f 72 64 65 72 42 79 2d 3e 61  Item=pOrderBy->a
13bb0 3b 20 6a 3c 6e 4f 72 64 65 72 42 79 3b 20 6a 2b  ; j<nOrderBy; j+
13bc0 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
13bd0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74       assert( pIt
13be0 65 6d 2d 3e 69 4f 72 64 65 72 42 79 43 6f 6c 3e  em->iOrderByCol>
13bf0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  0 );.        if(
13c00 20 70 49 74 65 6d 2d 3e 69 4f 72 64 65 72 42 79   pItem->iOrderBy
13c10 43 6f 6c 3d 3d 69 20 29 20 62 72 65 61 6b 3b 0a  Col==i ) break;.
13c20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
13c30 28 20 6a 3d 3d 6e 4f 72 64 65 72 42 79 20 29 7b  ( j==nOrderBy ){
13c40 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70  .        Expr *p
13c50 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70  New = sqlite3Exp
13c60 72 28 64 62 2c 20 54 4b 5f 49 4e 54 45 47 45 52  r(db, TK_INTEGER
13c70 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 0);.        if
13c80 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75  ( pNew==0 ) retu
13c90 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
13ca0 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 66  .        pNew->f
13cb0 6c 61 67 73 20 7c 3d 20 45 50 5f 49 6e 74 56 61  lags |= EP_IntVa
13cc0 6c 75 65 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  lue;.        pNe
13cd0 77 2d 3e 75 2e 69 56 61 6c 75 65 20 3d 20 69 3b  w->u.iValue = i;
13ce0 0a 20 20 20 20 20 20 20 20 70 4f 72 64 65 72 42  .        pOrderB
13cf0 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  y = sqlite3ExprL
13d00 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65  istAppend(pParse
13d10 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 4e 65 77  , pOrderBy, pNew
13d20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
13d30 4f 72 64 65 72 42 79 20 29 20 70 4f 72 64 65 72  OrderBy ) pOrder
13d40 42 79 2d 3e 61 5b 6e 4f 72 64 65 72 42 79 2b 2b  By->a[nOrderBy++
13d50 5d 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20 3d 20  ].iOrderByCol = 
13d60 28 75 31 36 29 69 3b 0a 20 20 20 20 20 20 7d 0a  (u16)i;.      }.
13d70 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
13d80 43 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6d 70  Compute the comp
13d90 61 72 69 73 6f 6e 20 70 65 72 6d 75 74 61 74 69  arison permutati
13da0 6f 6e 20 61 6e 64 20 6b 65 79 69 6e 66 6f 20 74  on and keyinfo t
13db0 68 61 74 20 69 73 20 75 73 65 64 20 77 69 74 68  hat is used with
13dc0 0a 20 20 2a 2a 20 74 68 65 20 70 65 72 6d 75 74  .  ** the permut
13dd0 61 74 69 6f 6e 20 75 73 65 64 20 74 6f 20 64 65  ation used to de
13de0 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20 6e  termine if the n
13df0 65 78 74 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20  ext.  ** row of 
13e00 72 65 73 75 6c 74 73 20 63 6f 6d 65 73 20 66 72  results comes fr
13e10 6f 6d 20 73 65 6c 65 63 74 41 20 6f 72 20 73 65  om selectA or se
13e20 6c 65 63 74 42 2e 20 20 41 6c 73 6f 20 61 64 64  lectB.  Also add
13e30 20 65 78 70 6c 69 63 69 74 0a 20 20 2a 2a 20 63   explicit.  ** c
13e40 6f 6c 6c 61 74 69 6f 6e 73 20 74 6f 20 74 68 65  ollations to the
13e50 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
13e60 20 74 65 72 6d 73 20 73 6f 20 74 68 61 74 20 77   terms so that w
13e70 68 65 6e 20 74 68 65 20 73 75 62 71 75 65 72 69  hen the subqueri
13e80 65 73 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 72  es.  ** to the r
13e90 69 67 68 74 20 61 6e 64 20 74 68 65 20 6c 65 66  ight and the lef
13ea0 74 20 61 72 65 20 65 76 61 6c 75 61 74 65 64 2c  t are evaluated,
13eb0 20 74 68 65 79 20 75 73 65 20 74 68 65 20 63 6f   they use the co
13ec0 72 72 65 63 74 0a 20 20 2a 2a 20 63 6f 6c 6c 61  rrect.  ** colla
13ed0 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 61 50 65  tion..  */.  aPe
13ee0 72 6d 75 74 65 20 3d 20 73 71 6c 69 74 65 33 44  rmute = sqlite3D
13ef0 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73  bMallocRaw(db, s
13f00 69 7a 65 6f 66 28 69 6e 74 29 2a 6e 4f 72 64 65  izeof(int)*nOrde
13f10 72 42 79 29 3b 0a 20 20 69 66 28 20 61 50 65 72  rBy);.  if( aPer
13f20 6d 75 74 65 20 29 7b 0a 20 20 20 20 73 74 72 75  mute ){.    stru
13f30 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
13f40 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 66 6f 72   *pItem;.    for
13f50 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70 4f 72 64  (i=0, pItem=pOrd
13f60 65 72 42 79 2d 3e 61 3b 20 69 3c 6e 4f 72 64 65  erBy->a; i<nOrde
13f70 72 42 79 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  rBy; i++, pItem+
13f80 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  +){.      assert
13f90 28 20 70 49 74 65 6d 2d 3e 69 4f 72 64 65 72 42  ( pItem->iOrderB
13fa0 79 43 6f 6c 3e 30 20 20 26 26 20 70 49 74 65 6d  yCol>0  && pItem
13fb0 2d 3e 69 4f 72 64 65 72 42 79 43 6f 6c 3c 3d 70  ->iOrderByCol<=p
13fc0 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  ->pEList->nExpr 
13fd0 29 3b 0a 20 20 20 20 20 20 61 50 65 72 6d 75 74  );.      aPermut
13fe0 65 5b 69 5d 20 3d 20 70 49 74 65 6d 2d 3e 69 4f  e[i] = pItem->iO
13ff0 72 64 65 72 42 79 43 6f 6c 20 2d 20 31 3b 0a 20  rderByCol - 1;. 
14000 20 20 20 7d 0a 20 20 20 20 70 4b 65 79 4d 65 72     }.    pKeyMer
14010 67 65 20 3d 0a 20 20 20 20 20 20 73 71 6c 69 74  ge =.      sqlit
14020 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62  e3DbMallocRaw(db
14030 2c 20 73 69 7a 65 6f 66 28 2a 70 4b 65 79 4d 65  , sizeof(*pKeyMe
14040 72 67 65 29 2b 6e 4f 72 64 65 72 42 79 2a 28 73  rge)+nOrderBy*(s
14050 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 2b  izeof(CollSeq*)+
14060 31 29 29 3b 0a 20 20 20 20 69 66 28 20 70 4b 65  1));.    if( pKe
14070 79 4d 65 72 67 65 20 29 7b 0a 20 20 20 20 20 20  yMerge ){.      
14080 70 4b 65 79 4d 65 72 67 65 2d 3e 61 53 6f 72 74  pKeyMerge->aSort
14090 4f 72 64 65 72 20 3d 20 28 75 38 2a 29 26 70 4b  Order = (u8*)&pK
140a0 65 79 4d 65 72 67 65 2d 3e 61 43 6f 6c 6c 5b 6e  eyMerge->aColl[n
140b0 4f 72 64 65 72 42 79 5d 3b 0a 20 20 20 20 20 20  OrderBy];.      
140c0 70 4b 65 79 4d 65 72 67 65 2d 3e 6e 46 69 65 6c  pKeyMerge->nFiel
140d0 64 20 3d 20 28 75 31 36 29 6e 4f 72 64 65 72 42  d = (u16)nOrderB
140e0 79 3b 0a 20 20 20 20 20 20 70 4b 65 79 4d 65 72  y;.      pKeyMer
140f0 67 65 2d 3e 65 6e 63 20 3d 20 45 4e 43 28 64 62  ge->enc = ENC(db
14100 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  );.      for(i=0
14110 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b  ; i<nOrderBy; i+
14120 2b 29 7b 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c  +){.        Coll
14130 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20  Seq *pColl;.    
14140 20 20 20 20 45 78 70 72 20 2a 70 54 65 72 6d 20      Expr *pTerm 
14150 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  = pOrderBy->a[i]
14160 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  .pExpr;.        
14170 69 66 28 20 70 54 65 72 6d 2d 3e 66 6c 61 67 73  if( pTerm->flags
14180 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 20 29 7b   & EP_Collate ){
14190 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 6c  .          pColl
141a0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
141b0 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 54  llSeq(pParse, pT
141c0 65 72 6d 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  erm);.        }e
141d0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70  lse{.          p
141e0 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69 53 65 6c 65  Coll = multiSele
141f0 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  ctCollSeq(pParse
14200 2c 20 70 2c 20 61 50 65 72 6d 75 74 65 5b 69 5d  , p, aPermute[i]
14210 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
14220 20 70 43 6f 6c 6c 3d 3d 30 20 29 20 70 43 6f 6c   pColl==0 ) pCol
14230 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c  l = db->pDfltCol
14240 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 72  l;.          pOr
14250 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  derBy->a[i].pExp
14260 72 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20  r =.            
14270 20 73 71 6c 69 74 65 33 45 78 70 72 41 64 64 43   sqlite3ExprAddC
14280 6f 6c 6c 61 74 65 53 74 72 69 6e 67 28 70 50 61  ollateString(pPa
14290 72 73 65 2c 20 70 54 65 72 6d 2c 20 70 43 6f 6c  rse, pTerm, pCol
142a0 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  l->zName);.     
142b0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 4b 65     }.        pKe
142c0 79 4d 65 72 67 65 2d 3e 61 43 6f 6c 6c 5b 69 5d  yMerge->aColl[i]
142d0 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20   = pColl;.      
142e0 20 20 70 4b 65 79 4d 65 72 67 65 2d 3e 61 53 6f    pKeyMerge->aSo
142f0 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 70 4f 72  rtOrder[i] = pOr
14300 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74  derBy->a[i].sort
14310 4f 72 64 65 72 3b 0a 20 20 20 20 20 20 7d 0a 20  Order;.      }. 
14320 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
14330 20 20 70 4b 65 79 4d 65 72 67 65 20 3d 20 30 3b    pKeyMerge = 0;
14340 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 74 74  .  }..  /* Reatt
14350 61 63 68 20 74 68 65 20 4f 52 44 45 52 20 42 59  ach the ORDER BY
14360 20 63 6c 61 75 73 65 20 74 6f 20 74 68 65 20 71   clause to the q
14370 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e  uery..  */.  p->
14380 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65  pOrderBy = pOrde
14390 72 42 79 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 70  rBy;.  pPrior->p
143a0 4f 72 64 65 72 42 79 20 3d 20 73 71 6c 69 74 65  OrderBy = sqlite
143b0 33 45 78 70 72 4c 69 73 74 44 75 70 28 70 50 61  3ExprListDup(pPa
143c0 72 73 65 2d 3e 64 62 2c 20 70 4f 72 64 65 72 42  rse->db, pOrderB
143d0 79 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c  y, 0);..  /* All
143e0 6f 63 61 74 65 20 61 20 72 61 6e 67 65 20 6f 66  ocate a range of
143f0 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73   temporary regis
14400 74 65 72 73 20 61 6e 64 20 74 68 65 20 4b 65 79  ters and the Key
14410 49 6e 66 6f 20 6e 65 65 64 65 64 0a 20 20 2a 2a  Info needed.  **
14420 20 66 6f 72 20 74 68 65 20 6c 6f 67 69 63 20 74   for the logic t
14430 68 61 74 20 72 65 6d 6f 76 65 73 20 64 75 70 6c  hat removes dupl
14440 69 63 61 74 65 20 72 65 73 75 6c 74 20 72 6f 77  icate result row
14450 73 20 77 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20  s when the.  ** 
14460 6f 70 65 72 61 74 6f 72 20 69 73 20 55 4e 49 4f  operator is UNIO
14470 4e 2c 20 45 58 43 45 50 54 2c 20 6f 72 20 49 4e  N, EXCEPT, or IN
14480 54 45 52 53 45 43 54 20 28 62 75 74 20 6e 6f 74  TERSECT (but not
14490 20 55 4e 49 4f 4e 20 41 4c 4c 29 2e 0a 20 20 2a   UNION ALL)..  *
144a0 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41  /.  if( op==TK_A
144b0 4c 4c 20 29 7b 0a 20 20 20 20 72 65 67 50 72 65  LL ){.    regPre
144c0 76 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  v = 0;.  }else{.
144d0 20 20 20 20 69 6e 74 20 6e 45 78 70 72 20 3d 20      int nExpr = 
144e0 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
144f0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 4f  ;.    assert( nO
14500 72 64 65 72 42 79 3e 3d 6e 45 78 70 72 20 7c 7c  rderBy>=nExpr ||
14510 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
14520 64 20 29 3b 0a 20 20 20 20 72 65 67 50 72 65 76  d );.    regPrev
14530 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b   = pParse->nMem+
14540 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  1;.    pParse->n
14550 4d 65 6d 20 2b 3d 20 6e 45 78 70 72 2b 31 3b 0a  Mem += nExpr+1;.
14560 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
14570 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
14580 67 65 72 2c 20 30 2c 20 72 65 67 50 72 65 76 29  ger, 0, regPrev)
14590 3b 0a 20 20 20 20 70 4b 65 79 44 75 70 20 3d 20  ;.    pKeyDup = 
145a0 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
145b0 65 72 6f 28 64 62 2c 0a 20 20 20 20 20 20 20 20  ero(db,.        
145c0 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66            sizeof
145d0 28 2a 70 4b 65 79 44 75 70 29 20 2b 20 6e 45 78  (*pKeyDup) + nEx
145e0 70 72 2a 28 73 69 7a 65 6f 66 28 43 6f 6c 6c 53  pr*(sizeof(CollS
145f0 65 71 2a 29 2b 31 29 20 29 3b 0a 20 20 20 20 69  eq*)+1) );.    i
14600 66 28 20 70 4b 65 79 44 75 70 20 29 7b 0a 20 20  f( pKeyDup ){.  
14610 20 20 20 20 70 4b 65 79 44 75 70 2d 3e 61 53 6f      pKeyDup->aSo
14620 72 74 4f 72 64 65 72 20 3d 20 28 75 38 2a 29 26  rtOrder = (u8*)&
14630 70 4b 65 79 44 75 70 2d 3e 61 43 6f 6c 6c 5b 6e  pKeyDup->aColl[n
14640 45 78 70 72 5d 3b 0a 20 20 20 20 20 20 70 4b 65  Expr];.      pKe
14650 79 44 75 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 28  yDup->nField = (
14660 75 31 36 29 6e 45 78 70 72 3b 0a 20 20 20 20 20  u16)nExpr;.     
14670 20 70 4b 65 79 44 75 70 2d 3e 65 6e 63 20 3d 20   pKeyDup->enc = 
14680 45 4e 43 28 64 62 29 3b 0a 20 20 20 20 20 20 66  ENC(db);.      f
14690 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72 3b  or(i=0; i<nExpr;
146a0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70   i++){.        p
146b0 4b 65 79 44 75 70 2d 3e 61 43 6f 6c 6c 5b 69 5d  KeyDup->aColl[i]
146c0 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f   = multiSelectCo
146d0 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 2c  llSeq(pParse, p,
146e0 20 69 29 3b 0a 20 20 20 20 20 20 20 20 70 4b 65   i);.        pKe
146f0 79 44 75 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72  yDup->aSortOrder
14700 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  [i] = 0;.      }
14710 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 0a 20 20 2f  .    }.  }. .  /
14720 2a 20 53 65 70 61 72 61 74 65 20 74 68 65 20 6c  * Separate the l
14730 65 66 74 20 61 6e 64 20 74 68 65 20 72 69 67 68  eft and the righ
14740 74 20 71 75 65 72 79 20 66 72 6f 6d 20 6f 6e 65  t query from one
14750 20 61 6e 6f 74 68 65 72 0a 20 20 2a 2f 0a 20 20   another.  */.  
14760 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20  p->pPrior = 0;. 
14770 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 4f   sqlite3ResolveO
14780 72 64 65 72 47 72 6f 75 70 42 79 28 70 50 61 72  rderGroupBy(pPar
14790 73 65 2c 20 70 2c 20 70 2d 3e 70 4f 72 64 65 72  se, p, p->pOrder
147a0 42 79 2c 20 22 4f 52 44 45 52 22 29 3b 0a 20 20  By, "ORDER");.  
147b0 69 66 28 20 70 50 72 69 6f 72 2d 3e 70 50 72 69  if( pPrior->pPri
147c0 6f 72 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  or==0 ){.    sql
147d0 69 74 65 33 52 65 73 6f 6c 76 65 4f 72 64 65 72  ite3ResolveOrder
147e0 47 72 6f 75 70 42 79 28 70 50 61 72 73 65 2c 20  GroupBy(pParse, 
147f0 70 50 72 69 6f 72 2c 20 70 50 72 69 6f 72 2d 3e  pPrior, pPrior->
14800 70 4f 72 64 65 72 42 79 2c 20 22 4f 52 44 45 52  pOrderBy, "ORDER
14810 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f  ");.  }..  /* Co
14820 6d 70 75 74 65 20 74 68 65 20 6c 69 6d 69 74 20  mpute the limit 
14830 72 65 67 69 73 74 65 72 73 20 2a 2f 0a 20 20 63  registers */.  c
14840 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73  omputeLimitRegis
14850 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20  ters(pParse, p, 
14860 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 69 66 28  labelEnd);.  if(
14870 20 70 2d 3e 69 4c 69 6d 69 74 20 26 26 20 6f 70   p->iLimit && op
14880 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20  ==TK_ALL ){.    
14890 72 65 67 4c 69 6d 69 74 41 20 3d 20 2b 2b 70 50  regLimitA = ++pP
148a0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
148b0 72 65 67 4c 69 6d 69 74 42 20 3d 20 2b 2b 70 50  regLimitB = ++pP
148c0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
148d0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
148e0 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 70 2d  2(v, OP_Copy, p-
148f0 3e 69 4f 66 66 73 65 74 20 3f 20 70 2d 3e 69 4f  >iOffset ? p->iO
14900 66 66 73 65 74 2b 31 20 3a 20 70 2d 3e 69 4c 69  ffset+1 : p->iLi
14910 6d 69 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  mit,.           
14920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14930 20 20 20 20 20 20 20 72 65 67 4c 69 6d 69 74 41         regLimitA
14940 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
14950 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43  beAddOp2(v, OP_C
14960 6f 70 79 2c 20 72 65 67 4c 69 6d 69 74 41 2c 20  opy, regLimitA, 
14970 72 65 67 4c 69 6d 69 74 42 29 3b 0a 20 20 7d 65  regLimitB);.  }e
14980 6c 73 65 7b 0a 20 20 20 20 72 65 67 4c 69 6d 69  lse{.    regLimi
14990 74 41 20 3d 20 72 65 67 4c 69 6d 69 74 42 20 3d  tA = regLimitB =
149a0 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65   0;.  }.  sqlite
149b0 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
149c0 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 70 2d  p->pLimit);.  p-
149d0 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 73  >pLimit = 0;.  s
149e0 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
149f0 28 64 62 2c 20 70 2d 3e 70 4f 66 66 73 65 74 29  (db, p->pOffset)
14a00 3b 0a 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d  ;.  p->pOffset =
14a10 20 30 3b 0a 0a 20 20 72 65 67 41 64 64 72 41 20   0;..  regAddrA 
14a20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
14a30 3b 0a 20 20 72 65 67 45 6f 66 41 20 3d 20 2b 2b  ;.  regEofA = ++
14a40 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
14a50 72 65 67 41 64 64 72 42 20 3d 20 2b 2b 70 50 61  regAddrB = ++pPa
14a60 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67  rse->nMem;.  reg
14a70 45 6f 66 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d  EofB = ++pParse-
14a80 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 4f 75 74 41  >nMem;.  regOutA
14a90 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
14aa0 6d 3b 0a 20 20 72 65 67 4f 75 74 42 20 3d 20 2b  m;.  regOutB = +
14ab0 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
14ac0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
14ad0 73 74 49 6e 69 74 28 26 64 65 73 74 41 2c 20 53  stInit(&destA, S
14ae0 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65  RT_Coroutine, re
14af0 67 41 64 64 72 41 29 3b 0a 20 20 73 71 6c 69 74  gAddrA);.  sqlit
14b00 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74  e3SelectDestInit
14b10 28 26 64 65 73 74 42 2c 20 53 52 54 5f 43 6f 72  (&destB, SRT_Cor
14b20 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72 42  outine, regAddrB
14b30 29 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 70 61  );..  /* Jump pa
14b40 73 74 20 74 68 65 20 76 61 72 69 6f 75 73 20 73  st the various s
14b50 75 62 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 63  ubroutines and c
14b60 6f 72 6f 75 74 69 6e 65 73 20 74 6f 20 74 68 65  oroutines to the
14b70 20 6d 61 69 6e 0a 20 20 2a 2a 20 6d 65 72 67 65   main.  ** merge
14b80 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20 20 6a 31 20   loop.  */.  j1 
14b90 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
14ba0 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b  Op0(v, OP_Goto);
14bb0 0a 20 20 61 64 64 72 53 65 6c 65 63 74 41 20 3d  .  addrSelectA =
14bc0 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
14bd0 65 6e 74 41 64 64 72 28 76 29 3b 0a 0a 0a 20 20  entAddr(v);...  
14be0 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 63 6f  /* Generate a co
14bf0 72 6f 75 74 69 6e 65 20 74 6f 20 65 76 61 6c 75  routine to evalu
14c00 61 74 65 20 74 68 65 20 53 45 4c 45 43 54 20 73  ate the SELECT s
14c10 74 61 74 65 6d 65 6e 74 20 74 6f 20 74 68 65 0a  tatement to the.
14c20 20 20 2a 2a 20 6c 65 66 74 20 6f 66 20 74 68 65    ** left of the
14c30 20 63 6f 6d 70 6f 75 6e 64 20 6f 70 65 72 61 74   compound operat
14c40 6f 72 20 2d 20 74 68 65 20 22 41 22 20 73 65 6c  or - the "A" sel
14c50 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 56 64 62 65  ect..  */.  Vdbe
14c60 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  NoopComment((v, 
14c70 22 42 65 67 69 6e 20 63 6f 72 6f 75 74 69 6e 65  "Begin coroutine
14c80 20 66 6f 72 20 6c 65 66 74 20 53 45 4c 45 43 54   for left SELECT
14c90 22 29 29 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 69  "));.  pPrior->i
14ca0 4c 69 6d 69 74 20 3d 20 72 65 67 4c 69 6d 69 74  Limit = regLimit
14cb0 41 3b 0a 20 20 65 78 70 6c 61 69 6e 53 65 74 49  A;.  explainSetI
14cc0 6e 74 65 67 65 72 28 69 53 75 62 31 2c 20 70 50  nteger(iSub1, pP
14cd0 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63  arse->iNextSelec
14ce0 74 49 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  tId);.  sqlite3S
14cf0 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50  elect(pParse, pP
14d00 72 69 6f 72 2c 20 26 64 65 73 74 41 29 3b 0a 20  rior, &destA);. 
14d10 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14d20 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
14d30 2c 20 31 2c 20 72 65 67 45 6f 66 41 29 3b 0a 20  , 1, regEofA);. 
14d40 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14d50 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p1(v, OP_Yield, 
14d60 72 65 67 41 64 64 72 41 29 3b 0a 20 20 56 64 62  regAddrA);.  Vdb
14d70 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c  eNoopComment((v,
14d80 20 22 45 6e 64 20 63 6f 72 6f 75 74 69 6e 65 20   "End coroutine 
14d90 66 6f 72 20 6c 65 66 74 20 53 45 4c 45 43 54 22  for left SELECT"
14da0 29 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  ));..  /* Genera
14db0 74 65 20 61 20 63 6f 72 6f 75 74 69 6e 65 20 74  te a coroutine t
14dc0 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65 20 53  o evaluate the S
14dd0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
14de0 6f 6e 20 0a 20 20 2a 2a 20 74 68 65 20 72 69 67  on .  ** the rig
14df0 68 74 20 2d 20 74 68 65 20 22 42 22 20 73 65 6c  ht - the "B" sel
14e00 65 63 74 0a 20 20 2a 2f 0a 20 20 61 64 64 72 53  ect.  */.  addrS
14e10 65 6c 65 63 74 42 20 3d 20 73 71 6c 69 74 65 33  electB = sqlite3
14e20 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
14e30 76 29 3b 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f  v);.  VdbeNoopCo
14e40 6d 6d 65 6e 74 28 28 76 2c 20 22 42 65 67 69 6e  mment((v, "Begin
14e50 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20 72   coroutine for r
14e60 69 67 68 74 20 53 45 4c 45 43 54 22 29 29 3b 0a  ight SELECT"));.
14e70 20 20 73 61 76 65 64 4c 69 6d 69 74 20 3d 20 70    savedLimit = p
14e80 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 73 61 76 65  ->iLimit;.  save
14e90 64 4f 66 66 73 65 74 20 3d 20 70 2d 3e 69 4f 66  dOffset = p->iOf
14ea0 66 73 65 74 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69  fset;.  p->iLimi
14eb0 74 20 3d 20 72 65 67 4c 69 6d 69 74 42 3b 0a 20  t = regLimitB;. 
14ec0 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b   p->iOffset = 0;
14ed0 20 20 0a 20 20 65 78 70 6c 61 69 6e 53 65 74 49    .  explainSetI
14ee0 6e 74 65 67 65 72 28 69 53 75 62 32 2c 20 70 50  nteger(iSub2, pP
14ef0 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63  arse->iNextSelec
14f00 74 49 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  tId);.  sqlite3S
14f10 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c  elect(pParse, p,
14f20 20 26 64 65 73 74 42 29 3b 0a 20 20 70 2d 3e 69   &destB);.  p->i
14f30 4c 69 6d 69 74 20 3d 20 73 61 76 65 64 4c 69 6d  Limit = savedLim
14f40 69 74 3b 0a 20 20 70 2d 3e 69 4f 66 66 73 65 74  it;.  p->iOffset
14f50 20 3d 20 73 61 76 65 64 4f 66 66 73 65 74 3b 0a   = savedOffset;.
14f60 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
14f70 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
14f80 72 2c 20 31 2c 20 72 65 67 45 6f 66 42 29 3b 0a  r, 1, regEofB);.
14f90 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
14fa0 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c  Op1(v, OP_Yield,
14fb0 20 72 65 67 41 64 64 72 42 29 3b 0a 20 20 56 64   regAddrB);.  Vd
14fc0 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76  beNoopComment((v
14fd0 2c 20 22 45 6e 64 20 63 6f 72 6f 75 74 69 6e 65  , "End coroutine
14fe0 20 66 6f 72 20 72 69 67 68 74 20 53 45 4c 45 43   for right SELEC
14ff0 54 22 29 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65  T"));..  /* Gene
15000 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e  rate a subroutin
15010 65 20 74 68 61 74 20 6f 75 74 70 75 74 73 20 74  e that outputs t
15020 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 6f  he current row o
15030 66 20 74 68 65 20 41 0a 20 20 2a 2a 20 73 65 6c  f the A.  ** sel
15040 65 63 74 20 61 73 20 74 68 65 20 6e 65 78 74 20  ect as the next 
15050 6f 75 74 70 75 74 20 72 6f 77 20 6f 66 20 74 68  output row of th
15060 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63  e compound selec
15070 74 2e 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f  t..  */.  VdbeNo
15080 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f  opComment((v, "O
15090 75 74 70 75 74 20 72 6f 75 74 69 6e 65 20 66 6f  utput routine fo
150a0 72 20 41 22 29 29 3b 0a 20 20 61 64 64 72 4f 75  r A"));.  addrOu
150b0 74 41 20 3d 20 67 65 6e 65 72 61 74 65 4f 75 74  tA = generateOut
150c0 70 75 74 53 75 62 72 6f 75 74 69 6e 65 28 70 50  putSubroutine(pP
150d0 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20  arse,.          
150e0 20 20 20 20 20 20 20 70 2c 20 26 64 65 73 74 41         p, &destA
150f0 2c 20 70 44 65 73 74 2c 20 72 65 67 4f 75 74 41  , pDest, regOutA
15100 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
15110 20 20 20 72 65 67 50 72 65 76 2c 20 70 4b 65 79     regPrev, pKey
15120 44 75 70 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f  Dup, P4_KEYINFO_
15130 48 41 4e 44 4f 46 46 2c 20 6c 61 62 65 6c 45 6e  HANDOFF, labelEn
15140 64 29 3b 0a 20 20 0a 20 20 2f 2a 20 47 65 6e 65  d);.  .  /* Gene
15150 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e  rate a subroutin
15160 65 20 74 68 61 74 20 6f 75 74 70 75 74 73 20 74  e that outputs t
15170 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 6f  he current row o
15180 66 20 74 68 65 20 42 0a 20 20 2a 2a 20 73 65 6c  f the B.  ** sel
15190 65 63 74 20 61 73 20 74 68 65 20 6e 65 78 74 20  ect as the next 
151a0 6f 75 74 70 75 74 20 72 6f 77 20 6f 66 20 74 68  output row of th
151b0 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63  e compound selec
151c0 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70  t..  */.  if( op
151d0 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 6f 70 3d 3d  ==TK_ALL || op==
151e0 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20 20 20  TK_UNION ){.    
151f0 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28  VdbeNoopComment(
15200 28 76 2c 20 22 4f 75 74 70 75 74 20 72 6f 75 74  (v, "Output rout
15210 69 6e 65 20 66 6f 72 20 42 22 29 29 3b 0a 20 20  ine for B"));.  
15220 20 20 61 64 64 72 4f 75 74 42 20 3d 20 67 65 6e    addrOutB = gen
15230 65 72 61 74 65 4f 75 74 70 75 74 53 75 62 72 6f  erateOutputSubro
15240 75 74 69 6e 65 28 70 50 61 72 73 65 2c 0a 20 20  utine(pParse,.  
15250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
15260 2c 20 26 64 65 73 74 42 2c 20 70 44 65 73 74 2c  , &destB, pDest,
15270 20 72 65 67 4f 75 74 42 2c 0a 20 20 20 20 20 20   regOutB,.      
15280 20 20 20 20 20 20 20 20 20 20 20 72 65 67 50 72             regPr
15290 65 76 2c 20 70 4b 65 79 44 75 70 2c 20 50 34 5f  ev, pKeyDup, P4_
152a0 4b 45 59 49 4e 46 4f 5f 53 54 41 54 49 43 2c 20  KEYINFO_STATIC, 
152b0 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 7d 0a 0a  labelEnd);.  }..
152c0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20    /* Generate a 
152d0 73 75 62 72 6f 75 74 69 6e 65 20 74 6f 20 72 75  subroutine to ru
152e0 6e 20 77 68 65 6e 20 74 68 65 20 72 65 73 75 6c  n when the resul
152f0 74 73 20 66 72 6f 6d 20 73 65 6c 65 63 74 20 41  ts from select A
15300 0a 20 20 2a 2a 20 61 72 65 20 65 78 68 61 75 73  .  ** are exhaus
15310 74 65 64 20 61 6e 64 20 6f 6e 6c 79 20 64 61 74  ted and only dat
15320 61 20 69 6e 20 73 65 6c 65 63 74 20 42 20 72 65  a in select B re
15330 6d 61 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 56 64  mains..  */.  Vd
15340 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76  beNoopComment((v
15350 2c 20 22 65 6f 66 2d 41 20 73 75 62 72 6f 75 74  , "eof-A subrout
15360 69 6e 65 22 29 29 3b 0a 20 20 69 66 28 20 6f 70  ine"));.  if( op
15370 3d 3d 54 4b 5f 45 58 43 45 50 54 20 7c 7c 20 6f  ==TK_EXCEPT || o
15380 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20  p==TK_INTERSECT 
15390 29 7b 0a 20 20 20 20 61 64 64 72 45 6f 66 41 20  ){.    addrEofA 
153a0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
153b0 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
153c0 30 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20  0, labelEnd);.  
153d0 7d 65 6c 73 65 7b 20 20 0a 20 20 20 20 61 64 64  }else{  .    add
153e0 72 45 6f 66 41 20 3d 20 73 71 6c 69 74 65 33 56  rEofA = sqlite3V
153f0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
15400 49 66 2c 20 72 65 67 45 6f 66 42 2c 20 6c 61 62  If, regEofB, lab
15410 65 6c 45 6e 64 29 3b 0a 20 20 20 20 73 71 6c 69  elEnd);.    sqli
15420 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
15430 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75   OP_Gosub, regOu
15440 74 42 2c 20 61 64 64 72 4f 75 74 42 29 3b 0a 20  tB, addrOutB);. 
15450 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
15460 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64  dOp1(v, OP_Yield
15470 2c 20 72 65 67 41 64 64 72 42 29 3b 0a 20 20 20  , regAddrB);.   
15480 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15490 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
154a0 2c 20 61 64 64 72 45 6f 66 41 29 3b 0a 20 20 20  , addrEofA);.   
154b0 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 2b   p->nSelectRow +
154c0 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63  = pPrior->nSelec
154d0 74 52 6f 77 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  tRow;.  }..  /* 
154e0 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f  Generate a subro
154f0 75 74 69 6e 65 20 74 6f 20 72 75 6e 20 77 68 65  utine to run whe
15500 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 66 72  n the results fr
15510 6f 6d 20 73 65 6c 65 63 74 20 42 0a 20 20 2a 2a  om select B.  **
15520 20 61 72 65 20 65 78 68 61 75 73 74 65 64 20 61   are exhausted a
15530 6e 64 20 6f 6e 6c 79 20 64 61 74 61 20 69 6e 20  nd only data in 
15540 73 65 6c 65 63 74 20 41 20 72 65 6d 61 69 6e 73  select A remains
15550 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d  ..  */.  if( op=
15560 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 29 7b  =TK_INTERSECT ){
15570 0a 20 20 20 20 61 64 64 72 45 6f 66 42 20 3d 20  .    addrEofB = 
15580 61 64 64 72 45 6f 66 41 3b 0a 20 20 20 20 69 66  addrEofA;.    if
15590 28 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20  ( p->nSelectRow 
155a0 3e 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63  > pPrior->nSelec
155b0 74 52 6f 77 20 29 20 70 2d 3e 6e 53 65 6c 65 63  tRow ) p->nSelec
155c0 74 52 6f 77 20 3d 20 70 50 72 69 6f 72 2d 3e 6e  tRow = pPrior->n
155d0 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 7d 65 6c  SelectRow;.  }el
155e0 73 65 7b 20 20 0a 20 20 20 20 56 64 62 65 4e 6f  se{  .    VdbeNo
155f0 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65  opComment((v, "e
15600 6f 66 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 22  of-B subroutine"
15610 29 29 3b 0a 20 20 20 20 61 64 64 72 45 6f 66 42  ));.    addrEofB
15620 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
15630 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20 72  dOp2(v, OP_If, r
15640 65 67 45 6f 66 41 2c 20 6c 61 62 65 6c 45 6e 64  egEofA, labelEnd
15650 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
15660 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
15670 6f 73 75 62 2c 20 72 65 67 4f 75 74 41 2c 20 61  osub, regOutA, a
15680 64 64 72 4f 75 74 41 29 3b 0a 20 20 20 20 73 71  ddrOutA);.    sq
15690 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
156a0 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67  v, OP_Yield, reg
156b0 41 64 64 72 41 29 3b 0a 20 20 20 20 73 71 6c 69  AddrA);.    sqli
156c0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
156d0 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64   OP_Goto, 0, add
156e0 72 45 6f 66 42 29 3b 0a 20 20 7d 0a 0a 20 20 2f  rEofB);.  }..  /
156f0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
15700 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 63 61  to handle the ca
15710 73 65 20 6f 66 20 41 3c 42 0a 20 20 2a 2f 0a 20  se of A<B.  */. 
15720 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74   VdbeNoopComment
15730 28 28 76 2c 20 22 41 2d 6c 74 2d 42 20 73 75 62  ((v, "A-lt-B sub
15740 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 61 64  routine"));.  ad
15750 64 72 41 6c 74 42 20 3d 20 73 71 6c 69 74 65 33  drAltB = sqlite3
15760 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
15770 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 41 2c  _Gosub, regOutA,
15780 20 61 64 64 72 4f 75 74 41 29 3b 0a 20 20 73 71   addrOutA);.  sq
15790 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
157a0 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67  v, OP_Yield, reg
157b0 41 64 64 72 41 29 3b 0a 20 20 73 71 6c 69 74 65  AddrA);.  sqlite
157c0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
157d0 50 5f 49 66 2c 20 72 65 67 45 6f 66 41 2c 20 61  P_If, regEofA, a
157e0 64 64 72 45 6f 66 41 29 3b 0a 20 20 73 71 6c 69  ddrEofA);.  sqli
157f0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
15800 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c 61 62   OP_Goto, 0, lab
15810 65 6c 43 6d 70 72 29 3b 0a 0a 20 20 2f 2a 20 47  elCmpr);..  /* G
15820 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
15830 68 61 6e 64 6c 65 20 74 68 65 20 63 61 73 65 20  handle the case 
15840 6f 66 20 41 3d 3d 42 0a 20 20 2a 2f 0a 20 20 69  of A==B.  */.  i
15850 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b  f( op==TK_ALL ){
15860 0a 20 20 20 20 61 64 64 72 41 65 71 42 20 3d 20  .    addrAeqB = 
15870 61 64 64 72 41 6c 74 42 3b 0a 20 20 7d 65 6c 73  addrAltB;.  }els
15880 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e 54  e if( op==TK_INT
15890 45 52 53 45 43 54 20 29 7b 0a 20 20 20 20 61 64  ERSECT ){.    ad
158a0 64 72 41 65 71 42 20 3d 20 61 64 64 72 41 6c 74  drAeqB = addrAlt
158b0 42 3b 0a 20 20 20 20 61 64 64 72 41 6c 74 42 2b  B;.    addrAltB+
158c0 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  +;.  }else{.    
158d0 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28  VdbeNoopComment(
158e0 28 76 2c 20 22 41 2d 65 71 2d 42 20 73 75 62 72  (v, "A-eq-B subr
158f0 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 20 20 61  outine"));.    a
15900 64 64 72 41 65 71 42 20 3d 0a 20 20 20 20 73 71  ddrAeqB =.    sq
15910 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
15920 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67  v, OP_Yield, reg
15930 41 64 64 72 41 29 3b 0a 20 20 20 20 73 71 6c 69  AddrA);.    sqli
15940 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
15950 20 4f 50 5f 49 66 2c 20 72 65 67 45 6f 66 41 2c   OP_If, regEofA,
15960 20 61 64 64 72 45 6f 66 41 29 3b 0a 20 20 20 20   addrEofA);.    
15970 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15980 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
15990 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 20 20 7d   labelCmpr);.  }
159a0 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
159b0 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c 65 20 74  code to handle t
159c0 68 65 20 63 61 73 65 20 6f 66 20 41 3e 42 0a 20  he case of A>B. 
159d0 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f   */.  VdbeNoopCo
159e0 6d 6d 65 6e 74 28 28 76 2c 20 22 41 2d 67 74 2d  mment((v, "A-gt-
159f0 42 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b  B subroutine"));
15a00 0a 20 20 61 64 64 72 41 67 74 42 20 3d 20 73 71  .  addrAgtB = sq
15a10 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
15a20 41 64 64 72 28 76 29 3b 0a 20 20 69 66 28 20 6f  Addr(v);.  if( o
15a30 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 6f 70 3d  p==TK_ALL || op=
15a40 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20 20  =TK_UNION ){.   
15a50 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15a60 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
15a70 72 65 67 4f 75 74 42 2c 20 61 64 64 72 4f 75 74  regOutB, addrOut
15a80 42 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  B);.  }.  sqlite
15a90 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
15aa0 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72  P_Yield, regAddr
15ab0 42 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  B);.  sqlite3Vdb
15ac0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66  eAddOp2(v, OP_If
15ad0 2c 20 72 65 67 45 6f 66 42 2c 20 61 64 64 72 45  , regEofB, addrE
15ae0 6f 66 42 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ofB);.  sqlite3V
15af0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
15b00 47 6f 74 6f 2c 20 30 2c 20 6c 61 62 65 6c 43 6d  Goto, 0, labelCm
15b10 70 72 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  pr);..  /* This 
15b20 63 6f 64 65 20 72 75 6e 73 20 6f 6e 63 65 20 74  code runs once t
15b30 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 65 76 65  o initialize eve
15b40 72 79 74 68 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20  rything..  */.  
15b50 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
15b60 65 72 65 28 76 2c 20 6a 31 29 3b 0a 20 20 73 71  ere(v, j1);.  sq
15b70 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
15b80 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
15b90 2c 20 72 65 67 45 6f 66 41 29 3b 0a 20 20 73 71  , regEofA);.  sq
15ba0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
15bb0 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
15bc0 2c 20 72 65 67 45 6f 66 42 29 3b 0a 20 20 73 71  , regEofB);.  sq
15bd0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
15be0 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67  v, OP_Gosub, reg
15bf0 41 64 64 72 41 2c 20 61 64 64 72 53 65 6c 65 63  AddrA, addrSelec
15c00 74 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  tA);.  sqlite3Vd
15c10 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
15c20 6f 73 75 62 2c 20 72 65 67 41 64 64 72 42 2c 20  osub, regAddrB, 
15c30 61 64 64 72 53 65 6c 65 63 74 42 29 3b 0a 20 20  addrSelectB);.  
15c40 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15c50 32 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 45  2(v, OP_If, regE
15c60 6f 66 41 2c 20 61 64 64 72 45 6f 66 41 29 3b 0a  ofA, addrEofA);.
15c70 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15c80 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65  Op2(v, OP_If, re
15c90 67 45 6f 66 42 2c 20 61 64 64 72 45 6f 66 42 29  gEofB, addrEofB)
15ca0 3b 0a 0a 20 20 2f 2a 20 49 6d 70 6c 65 6d 65 6e  ;..  /* Implemen
15cb0 74 20 74 68 65 20 6d 61 69 6e 20 6d 65 72 67 65  t the main merge
15cc0 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20 20 73 71 6c   loop.  */.  sql
15cd0 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
15ce0 61 62 65 6c 28 76 2c 20 6c 61 62 65 6c 43 6d 70  abel(v, labelCmp
15cf0 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  r);.  sqlite3Vdb
15d00 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 50 65  eAddOp4(v, OP_Pe
15d10 72 6d 75 74 61 74 69 6f 6e 2c 20 30 2c 20 30 2c  rmutation, 0, 0,
15d20 20 30 2c 20 28 63 68 61 72 2a 29 61 50 65 72 6d   0, (char*)aPerm
15d30 75 74 65 2c 20 50 34 5f 49 4e 54 41 52 52 41 59  ute, P4_INTARRAY
15d40 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
15d50 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6d  AddOp4(v, OP_Com
15d60 70 61 72 65 2c 20 64 65 73 74 41 2e 69 53 64 73  pare, destA.iSds
15d70 74 2c 20 64 65 73 74 42 2e 69 53 64 73 74 2c 20  t, destB.iSdst, 
15d80 6e 4f 72 64 65 72 42 79 2c 0a 20 20 20 20 20 20  nOrderBy,.      
15d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15da0 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 4d 65     (char*)pKeyMe
15db0 72 67 65 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f  rge, P4_KEYINFO_
15dc0 48 41 4e 44 4f 46 46 29 3b 0a 20 20 73 71 6c 69  HANDOFF);.  sqli
15dd0 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
15de0 76 2c 20 4f 50 46 4c 41 47 5f 50 45 52 4d 55 54  v, OPFLAG_PERMUT
15df0 45 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  E);.  sqlite3Vdb
15e00 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75  eAddOp3(v, OP_Ju
15e10 6d 70 2c 20 61 64 64 72 41 6c 74 42 2c 20 61 64  mp, addrAltB, ad
15e20 64 72 41 65 71 42 2c 20 61 64 64 72 41 67 74 42  drAeqB, addrAgtB
15e30 29 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f  );..  /* Jump to
15e40 20 74 68 65 20 74 68 69 73 20 70 6f 69 6e 74 20   the this point 
15e50 69 6e 20 6f 72 64 65 72 20 74 6f 20 74 65 72 6d  in order to term
15e60 69 6e 61 74 65 20 74 68 65 20 71 75 65 72 79 2e  inate the query.
15e70 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  .  */.  sqlite3V
15e80 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
15e90 76 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 0a 20  v, labelEnd);.. 
15ea0 20 2f 2a 20 53 65 74 20 74 68 65 20 6e 75 6d 62   /* Set the numb
15eb0 65 72 20 6f 66 20 6f 75 74 70 75 74 20 63 6f 6c  er of output col
15ec0 75 6d 6e 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20  umns.  */.  if( 
15ed0 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52  pDest->eDest==SR
15ee0 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20  T_Output ){.    
15ef0 53 65 6c 65 63 74 20 2a 70 46 69 72 73 74 20 3d  Select *pFirst =
15f00 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 77 68 69   pPrior;.    whi
15f10 6c 65 28 20 70 46 69 72 73 74 2d 3e 70 50 72 69  le( pFirst->pPri
15f20 6f 72 20 29 20 70 46 69 72 73 74 20 3d 20 70 46  or ) pFirst = pF
15f30 69 72 73 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20  irst->pPrior;.  
15f40 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e    generateColumn
15f50 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 30 2c  Names(pParse, 0,
15f60 20 70 46 69 72 73 74 2d 3e 70 45 4c 69 73 74 29   pFirst->pEList)
15f70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 73  ;.  }..  /* Reas
15f80 73 65 6d 62 6c 79 20 74 68 65 20 63 6f 6d 70 6f  sembly the compo
15f90 75 6e 64 20 71 75 65 72 79 20 73 6f 20 74 68 61  und query so tha
15fa0 74 20 69 74 20 77 69 6c 6c 20 62 65 20 66 72 65  t it will be fre
15fb0 65 64 20 63 6f 72 72 65 63 74 6c 79 0a 20 20 2a  ed correctly.  *
15fc0 2a 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67  * by the calling
15fd0 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 69   function */.  i
15fe0 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a  f( p->pPrior ){.
15ff0 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
16000 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  tDelete(db, p->p
16010 50 72 69 6f 72 29 3b 0a 20 20 7d 0a 20 20 70 2d  Prior);.  }.  p-
16020 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72  >pPrior = pPrior
16030 3b 0a 0a 20 20 2f 2a 2a 2a 20 54 42 44 3a 20 20  ;..  /*** TBD:  
16040 49 6e 73 65 72 74 20 73 75 62 72 6f 75 74 69 6e  Insert subroutin
16050 65 20 63 61 6c 6c 73 20 74 6f 20 63 6c 6f 73 65  e calls to close
16060 20 63 75 72 73 6f 72 73 20 6f 6e 20 69 6e 63 6f   cursors on inco
16070 6d 70 6c 65 74 65 0a 20 20 2a 2a 2a 2a 20 73 75  mplete.  **** su
16080 62 71 75 65 72 69 65 73 20 2a 2a 2a 2a 2f 0a 20  bqueries ****/. 
16090 20 65 78 70 6c 61 69 6e 43 6f 6d 70 6f 73 69 74   explainComposit
160a0 65 28 70 50 61 72 73 65 2c 20 70 2d 3e 6f 70 2c  e(pParse, p->op,
160b0 20 69 53 75 62 31 2c 20 69 53 75 62 32 2c 20 30   iSub1, iSub2, 0
160c0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
160d0 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a  TE_OK;.}.#endif.
160e0 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
160f0 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
16100 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  RY) || !defined(
16110 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
16120 29 0a 2f 2a 20 46 6f 72 77 61 72 64 20 44 65 63  )./* Forward Dec
16130 6c 61 72 61 74 69 6f 6e 73 20 2a 2f 0a 73 74 61  larations */.sta
16140 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 45 78  tic void substEx
16150 70 72 4c 69 73 74 28 73 71 6c 69 74 65 33 2a 2c  prList(sqlite3*,
16160 20 45 78 70 72 4c 69 73 74 2a 2c 20 69 6e 74 2c   ExprList*, int,
16170 20 45 78 70 72 4c 69 73 74 2a 29 3b 0a 73 74 61   ExprList*);.sta
16180 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 53 65  tic void substSe
16190 6c 65 63 74 28 73 71 6c 69 74 65 33 2a 2c 20 53  lect(sqlite3*, S
161a0 65 6c 65 63 74 20 2a 2c 20 69 6e 74 2c 20 45 78  elect *, int, Ex
161b0 70 72 4c 69 73 74 20 2a 29 3b 0a 0a 2f 2a 0a 2a  prList *);../*.*
161c0 2a 20 53 63 61 6e 20 74 68 72 6f 75 67 68 20 74  * Scan through t
161d0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45  he expression pE
161e0 78 70 72 2e 20 20 52 65 70 6c 61 63 65 20 65 76  xpr.  Replace ev
161f0 65 72 79 20 72 65 66 65 72 65 6e 63 65 20 74 6f  ery reference to
16200 0a 2a 2a 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20  .** a column in 
16210 74 61 62 6c 65 20 6e 75 6d 62 65 72 20 69 54 61  table number iTa
16220 62 6c 65 20 77 69 74 68 20 61 20 63 6f 70 79 20  ble with a copy 
16230 6f 66 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74  of the iColumn-t
16240 68 0a 2a 2a 20 65 6e 74 72 79 20 69 6e 20 70 45  h.** entry in pE
16250 4c 69 73 74 2e 20 20 28 42 75 74 20 6c 65 61 76  List.  (But leav
16260 65 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  e references to 
16270 74 68 65 20 52 4f 57 49 44 20 63 6f 6c 75 6d 6e  the ROWID column
16280 20 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 2e 29   .** unchanged.)
16290 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
162a0 69 6e 65 20 69 73 20 70 61 72 74 20 6f 66 20 74  ine is part of t
162b0 68 65 20 66 6c 61 74 74 65 6e 69 6e 67 20 70 72  he flattening pr
162c0 6f 63 65 64 75 72 65 2e 20 20 41 20 73 75 62 71  ocedure.  A subq
162d0 75 65 72 79 0a 2a 2a 20 77 68 6f 73 65 20 72 65  uery.** whose re
162e0 73 75 6c 74 20 73 65 74 20 69 73 20 64 65 66 69  sult set is defi
162f0 6e 65 64 20 62 79 20 70 45 4c 69 73 74 20 61 70  ned by pEList ap
16300 70 65 61 72 73 20 61 73 20 65 6e 74 72 79 20 69  pears as entry i
16310 6e 20 74 68 65 0a 2a 2a 20 46 52 4f 4d 20 63 6c  n the.** FROM cl
16320 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54  ause of a SELECT
16330 20 73 75 63 68 20 74 68 61 74 20 74 68 65 20 56   such that the V
16340 44 42 45 20 63 75 72 73 6f 72 20 61 73 73 69 67  DBE cursor assig
16350 6e 65 64 20 74 6f 20 74 68 61 74 0a 2a 2a 20 46  ned to that.** F
16360 4f 52 4d 20 63 6c 61 75 73 65 20 65 6e 74 72 79  ORM clause entry
16370 20 69 73 20 69 54 61 62 6c 65 2e 20 20 54 68 69   is iTable.  Thi
16380 73 20 72 6f 75 74 69 6e 65 20 6d 61 6b 65 20 74  s routine make t
16390 68 65 20 6e 65 63 65 73 73 61 72 79 20 0a 2a 2a  he necessary .**
163a0 20 63 68 61 6e 67 65 73 20 74 6f 20 70 45 78 70   changes to pExp
163b0 72 20 73 6f 20 74 68 61 74 20 69 74 20 72 65 66  r so that it ref
163c0 65 72 73 20 64 69 72 65 63 74 6c 79 20 74 6f 20  ers directly to 
163d0 74 68 65 20 73 6f 75 72 63 65 20 74 61 62 6c 65  the source table
163e0 0a 2a 2a 20 6f 66 20 74 68 65 20 73 75 62 71 75  .** of the subqu
163f0 65 72 79 20 72 61 74 68 65 72 20 74 68 65 20 72  ery rather the r
16400 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65  esult set of the
16410 20 73 75 62 71 75 65 72 79 2e 0a 2a 2f 0a 73 74   subquery..*/.st
16420 61 74 69 63 20 45 78 70 72 20 2a 73 75 62 73 74  atic Expr *subst
16430 45 78 70 72 28 0a 20 20 73 71 6c 69 74 65 33 20  Expr(.  sqlite3 
16440 2a 64 62 2c 20 20 20 20 20 20 20 20 2f 2a 20 52  *db,        /* R
16450 65 70 6f 72 74 20 6d 61 6c 6c 6f 63 20 65 72 72  eport malloc err
16460 6f 72 73 20 74 6f 20 74 68 69 73 20 63 6f 6e 6e  ors to this conn
16470 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72  ection */.  Expr
16480 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20   *pExpr,        
16490 2f 2a 20 45 78 70 72 20 69 6e 20 77 68 69 63 68  /* Expr in which
164a0 20 73 75 62 73 74 69 74 75 74 69 6f 6e 20 6f 63   substitution oc
164b0 63 75 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54  curs */.  int iT
164c0 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  able,         /*
164d0 20 54 61 62 6c 65 20 74 6f 20 62 65 20 73 75 62   Table to be sub
164e0 73 74 69 74 75 74 65 64 20 2a 2f 0a 20 20 45 78  stituted */.  Ex
164f0 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20  prList *pEList  
16500 20 20 2f 2a 20 53 75 62 73 74 69 74 75 74 65 20    /* Substitute 
16510 65 78 70 72 65 73 73 69 6f 6e 73 20 2a 2f 0a 29  expressions */.)
16520 7b 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30  {.  if( pExpr==0
16530 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
16540 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  f( pExpr->op==TK
16550 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 45 78 70 72  _COLUMN && pExpr
16560 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62 6c 65  ->iTable==iTable
16570 20 29 7b 0a 20 20 20 20 69 66 28 20 70 45 78 70   ){.    if( pExp
16580 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a  r->iColumn<0 ){.
16590 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20        pExpr->op 
165a0 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20 7d  = TK_NULL;.    }
165b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 45 78 70 72  else{.      Expr
165c0 20 2a 70 4e 65 77 3b 0a 20 20 20 20 20 20 61 73   *pNew;.      as
165d0 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20  sert( pEList!=0 
165e0 26 26 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  && pExpr->iColum
165f0 6e 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  n<pEList->nExpr 
16600 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
16610 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3d 3d 30   pExpr->pLeft==0
16620 20 26 26 20 70 45 78 70 72 2d 3e 70 52 69 67 68   && pExpr->pRigh
16630 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4e  t==0 );.      pN
16640 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ew = sqlite3Expr
16650 44 75 70 28 64 62 2c 20 70 45 4c 69 73 74 2d 3e  Dup(db, pEList->
16660 61 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  a[pExpr->iColumn
16670 5d 2e 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20  ].pExpr, 0);.   
16680 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
16690 6c 65 74 65 28 64 62 2c 20 70 45 78 70 72 29 3b  lete(db, pExpr);
166a0 0a 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 70  .      pExpr = p
166b0 4e 65 77 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  New;.    }.  }el
166c0 73 65 7b 0a 20 20 20 20 70 45 78 70 72 2d 3e 70  se{.    pExpr->p
166d0 4c 65 66 74 20 3d 20 73 75 62 73 74 45 78 70 72  Left = substExpr
166e0 28 64 62 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  (db, pExpr->pLef
166f0 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  t, iTable, pELis
16700 74 29 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 70  t);.    pExpr->p
16710 52 69 67 68 74 20 3d 20 73 75 62 73 74 45 78 70  Right = substExp
16720 72 28 64 62 2c 20 70 45 78 70 72 2d 3e 70 52 69  r(db, pExpr->pRi
16730 67 68 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c  ght, iTable, pEL
16740 69 73 74 29 3b 0a 20 20 20 20 69 66 28 20 45 78  ist);.    if( Ex
16750 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
16760 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
16770 74 29 20 29 7b 0a 20 20 20 20 20 20 73 75 62 73  t) ){.      subs
16780 74 53 65 6c 65 63 74 28 64 62 2c 20 70 45 78 70  tSelect(db, pExp
16790 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20 69 54  r->x.pSelect, iT
167a0 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20  able, pEList);. 
167b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
167c0 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 64 62  substExprList(db
167d0 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  , pExpr->x.pList
167e0 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
167f0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
16800 65 74 75 72 6e 20 70 45 78 70 72 3b 0a 7d 0a 73  eturn pExpr;.}.s
16810 74 61 74 69 63 20 76 6f 69 64 20 73 75 62 73 74  tatic void subst
16820 45 78 70 72 4c 69 73 74 28 0a 20 20 73 71 6c 69  ExprList(.  sqli
16830 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
16840 20 2f 2a 20 52 65 70 6f 72 74 20 6d 61 6c 6c 6f   /* Report mallo
16850 63 20 65 72 72 6f 72 73 20 68 65 72 65 20 2a 2f  c errors here */
16860 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
16870 73 74 2c 20 20 20 20 20 2f 2a 20 4c 69 73 74 20  st,     /* List 
16880 74 6f 20 73 63 61 6e 20 61 6e 64 20 69 6e 20 77  to scan and in w
16890 68 69 63 68 20 74 6f 20 6d 61 6b 65 20 73 75 62  hich to make sub
168a0 73 74 69 74 75 74 65 73 20 2a 2f 0a 20 20 69 6e  stitutes */.  in
168b0 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20  t iTable,       
168c0 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62     /* Table to b
168d0 65 20 73 75 62 73 74 69 74 75 74 65 64 20 2a 2f  e substituted */
168e0 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
168f0 69 73 74 20 20 20 20 20 2f 2a 20 53 75 62 73 74  ist     /* Subst
16900 69 74 75 74 65 20 76 61 6c 75 65 73 20 2a 2f 0a  itute values */.
16910 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
16920 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  ( pList==0 ) ret
16930 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  urn;.  for(i=0; 
16940 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  i<pList->nExpr; 
16950 69 2b 2b 29 7b 0a 20 20 20 20 70 4c 69 73 74 2d  i++){.    pList-
16960 3e 61 5b 69 5d 2e 70 45 78 70 72 20 3d 20 73 75  >a[i].pExpr = su
16970 62 73 74 45 78 70 72 28 64 62 2c 20 70 4c 69 73  bstExpr(db, pLis
16980 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 69  t->a[i].pExpr, i
16990 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a  Table, pEList);.
169a0 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69    }.}.static voi
169b0 64 20 73 75 62 73 74 53 65 6c 65 63 74 28 0a 20  d substSelect(. 
169c0 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
169d0 20 20 20 20 20 20 2f 2a 20 52 65 70 6f 72 74 20        /* Report 
169e0 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20 68 65  malloc errors he
169f0 72 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  re */.  Select *
16a00 70 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  p,           /* 
16a10 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
16a20 20 69 6e 20 77 68 69 63 68 20 74 6f 20 6d 61 6b   in which to mak
16a30 65 20 73 75 62 73 74 69 74 75 74 69 6f 6e 73 20  e substitutions 
16a40 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c  */.  int iTable,
16a50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62            /* Tab
16a60 6c 65 20 74 6f 20 62 65 20 72 65 70 6c 61 63 65  le to be replace
16a70 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  d */.  ExprList 
16a80 2a 70 45 4c 69 73 74 20 20 20 20 20 2f 2a 20 53  *pEList     /* S
16a90 75 62 73 74 69 74 75 74 65 20 76 61 6c 75 65 73  ubstitute values
16aa0 20 2a 2f 0a 29 7b 0a 20 20 53 72 63 4c 69 73 74   */.){.  SrcList
16ab0 20 2a 70 53 72 63 3b 0a 20 20 73 74 72 75 63 74   *pSrc;.  struct
16ac0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
16ad0 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Item;.  int i;. 
16ae0 20 69 66 28 20 21 70 20 29 20 72 65 74 75 72 6e   if( !p ) return
16af0 3b 0a 20 20 73 75 62 73 74 45 78 70 72 4c 69 73  ;.  substExprLis
16b00 74 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2c  t(db, p->pEList,
16b10 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
16b20 3b 0a 20 20 73 75 62 73 74 45 78 70 72 4c 69 73  ;.  substExprLis
16b30 74 28 64 62 2c 20 70 2d 3e 70 47 72 6f 75 70 42  t(db, p->pGroupB
16b40 79 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  y, iTable, pELis
16b50 74 29 3b 0a 20 20 73 75 62 73 74 45 78 70 72 4c  t);.  substExprL
16b60 69 73 74 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65  ist(db, p->pOrde
16b70 72 42 79 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c  rBy, iTable, pEL
16b80 69 73 74 29 3b 0a 20 20 70 2d 3e 70 48 61 76 69  ist);.  p->pHavi
16b90 6e 67 20 3d 20 73 75 62 73 74 45 78 70 72 28 64  ng = substExpr(d
16ba0 62 2c 20 70 2d 3e 70 48 61 76 69 6e 67 2c 20 69  b, p->pHaving, i
16bb0 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a  Table, pEList);.
16bc0 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 73 75    p->pWhere = su
16bd0 62 73 74 45 78 70 72 28 64 62 2c 20 70 2d 3e 70  bstExpr(db, p->p
16be0 57 68 65 72 65 2c 20 69 54 61 62 6c 65 2c 20 70  Where, iTable, p
16bf0 45 4c 69 73 74 29 3b 0a 20 20 73 75 62 73 74 53  EList);.  substS
16c00 65 6c 65 63 74 28 64 62 2c 20 70 2d 3e 70 50 72  elect(db, p->pPr
16c10 69 6f 72 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c  ior, iTable, pEL
16c20 69 73 74 29 3b 0a 20 20 70 53 72 63 20 3d 20 70  ist);.  pSrc = p
16c30 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74  ->pSrc;.  assert
16c40 28 20 70 53 72 63 20 29 3b 20 20 2f 2a 20 45 76  ( pSrc );  /* Ev
16c50 65 6e 20 66 6f 72 20 28 53 45 4c 45 43 54 20 31  en for (SELECT 1
16c60 29 20 77 65 20 68 61 76 65 3a 20 70 53 72 63 21  ) we have: pSrc!
16c70 3d 30 20 62 75 74 20 70 53 72 63 2d 3e 6e 53 72  =0 but pSrc->nSr
16c80 63 3d 3d 30 20 2a 2f 0a 20 20 69 66 28 20 41 4c  c==0 */.  if( AL
16c90 57 41 59 53 28 70 53 72 63 29 20 29 7b 0a 20 20  WAYS(pSrc) ){.  
16ca0 20 20 66 6f 72 28 69 3d 70 53 72 63 2d 3e 6e 53    for(i=pSrc->nS
16cb0 72 63 2c 20 70 49 74 65 6d 3d 70 53 72 63 2d 3e  rc, pItem=pSrc->
16cc0 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 49 74  a; i>0; i--, pIt
16cd0 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 73 75 62  em++){.      sub
16ce0 73 74 53 65 6c 65 63 74 28 64 62 2c 20 70 49 74  stSelect(db, pIt
16cf0 65 6d 2d 3e 70 53 65 6c 65 63 74 2c 20 69 54 61  em->pSelect, iTa
16d00 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ble, pEList);.  
16d10 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66    }.  }.}.#endif
16d20 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c   /* !defined(SQL
16d30 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
16d40 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  Y) || !defined(S
16d50 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
16d60 20 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e 65   */..#if !define
16d70 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  d(SQLITE_OMIT_SU
16d80 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69  BQUERY) || !defi
16d90 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
16da0 56 49 45 57 29 0a 2f 2a 0a 2a 2a 20 54 68 69 73  VIEW)./*.** This
16db0 20 72 6f 75 74 69 6e 65 20 61 74 74 65 6d 70 74   routine attempt
16dc0 73 20 74 6f 20 66 6c 61 74 74 65 6e 20 73 75 62  s to flatten sub
16dd0 71 75 65 72 69 65 73 20 61 73 20 61 20 70 65 72  queries as a per
16de0 66 6f 72 6d 61 6e 63 65 20 6f 70 74 69 6d 69 7a  formance optimiz
16df0 61 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72  ation..** This r
16e00 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 31  outine returns 1
16e10 20 69 66 20 69 74 20 6d 61 6b 65 73 20 63 68 61   if it makes cha
16e20 6e 67 65 73 20 61 6e 64 20 30 20 69 66 20 6e 6f  nges and 0 if no
16e30 20 66 6c 61 74 74 65 6e 69 6e 67 20 6f 63 63 75   flattening occu
16e40 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 75 6e 64  rs..**.** To und
16e50 65 72 73 74 61 6e 64 20 74 68 65 20 63 6f 6e 63  erstand the conc
16e60 65 70 74 20 6f 66 20 66 6c 61 74 74 65 6e 69 6e  ept of flattenin
16e70 67 2c 20 63 6f 6e 73 69 64 65 72 20 74 68 65 20  g, consider the 
16e80 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 71 75 65  following.** que
16e90 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45  ry:.**.**     SE
16ea0 4c 45 43 54 20 61 20 46 52 4f 4d 20 28 53 45 4c  LECT a FROM (SEL
16eb0 45 43 54 20 78 2b 79 20 41 53 20 61 20 46 52 4f  ECT x+y AS a FRO
16ec0 4d 20 74 31 20 57 48 45 52 45 20 7a 3c 31 30 30  M t1 WHERE z<100
16ed0 29 20 57 48 45 52 45 20 61 3e 35 0a 2a 2a 0a 2a  ) WHERE a>5.**.*
16ee0 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20 77 61  * The default wa
16ef0 79 20 6f 66 20 69 6d 70 6c 65 6d 65 6e 74 69 6e  y of implementin
16f00 67 20 74 68 69 73 20 71 75 65 72 79 20 69 73 20  g this query is 
16f10 74 6f 20 65 78 65 63 75 74 65 20 74 68 65 0a 2a  to execute the.*
16f20 2a 20 73 75 62 71 75 65 72 79 20 66 69 72 73 74  * subquery first
16f30 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72   and store the r
16f40 65 73 75 6c 74 73 20 69 6e 20 61 20 74 65 6d 70  esults in a temp
16f50 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 74 68 65  orary table, the
16f60 6e 0a 2a 2a 20 72 75 6e 20 74 68 65 20 6f 75 74  n.** run the out
16f70 65 72 20 71 75 65 72 79 20 6f 6e 20 74 68 61 74  er query on that
16f80 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
16f90 2e 20 20 54 68 69 73 20 72 65 71 75 69 72 65 73  .  This requires
16fa0 20 74 77 6f 0a 2a 2a 20 70 61 73 73 65 73 20 6f   two.** passes o
16fb0 76 65 72 20 74 68 65 20 64 61 74 61 2e 20 20 46  ver the data.  F
16fc0 75 72 74 68 65 72 6d 6f 72 65 2c 20 62 65 63 61  urthermore, beca
16fd0 75 73 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72  use the temporar
16fe0 79 20 74 61 62 6c 65 0a 2a 2a 20 68 61 73 20 6e  y table.** has n
16ff0 6f 20 69 6e 64 69 63 65 73 2c 20 74 68 65 20 57  o indices, the W
17000 48 45 52 45 20 63 6c 61 75 73 65 20 6f 6e 20 74  HERE clause on t
17010 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 63  he outer query c
17020 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6f 70 74 69  annot be.** opti
17030 6d 69 7a 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  mized..**.** Thi
17040 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65 6d 70  s routine attemp
17050 74 73 20 74 6f 20 72 65 77 72 69 74 65 20 71 75  ts to rewrite qu
17060 65 72 69 65 73 20 73 75 63 68 20 61 73 20 74 68  eries such as th
17070 65 20 61 62 6f 76 65 20 69 6e 74 6f 0a 2a 2a 20  e above into.** 
17080 61 20 73 69 6e 67 6c 65 20 66 6c 61 74 20 73 65  a single flat se
17090 6c 65 63 74 2c 20 6c 69 6b 65 20 74 68 69 73 3a  lect, like this:
170a0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43  .**.**     SELEC
170b0 54 20 78 2b 79 20 41 53 20 61 20 46 52 4f 4d 20  T x+y AS a FROM 
170c0 74 31 20 57 48 45 52 45 20 7a 3c 31 30 30 20 41  t1 WHERE z<100 A
170d0 4e 44 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65  ND a>5.**.** The
170e0 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20   code generated 
170f0 66 6f 72 20 74 68 69 73 20 73 69 6d 70 69 66 69  for this simpifi
17100 63 61 74 69 6f 6e 20 67 69 76 65 73 20 74 68 65  cation gives the
17110 20 73 61 6d 65 20 72 65 73 75 6c 74 0a 2a 2a 20   same result.** 
17120 62 75 74 20 6f 6e 6c 79 20 68 61 73 20 74 6f 20  but only has to 
17130 73 63 61 6e 20 74 68 65 20 64 61 74 61 20 6f 6e  scan the data on
17140 63 65 2e 20 20 41 6e 64 20 62 65 63 61 75 73 65  ce.  And because
17150 20 69 6e 64 69 63 65 73 20 6d 69 67 68 74 20 0a   indices might .
17160 2a 2a 20 65 78 69 73 74 20 6f 6e 20 74 68 65 20  ** exist on the 
17170 74 61 62 6c 65 20 74 31 2c 20 61 20 63 6f 6d 70  table t1, a comp
17180 6c 65 74 65 20 73 63 61 6e 20 6f 66 20 74 68 65  lete scan of the
17190 20 64 61 74 61 20 6d 69 67 68 74 20 62 65 0a 2a   data might be.*
171a0 2a 20 61 76 6f 69 64 65 64 2e 0a 2a 2a 0a 2a 2a  * avoided..**.**
171b0 20 46 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 6f   Flattening is o
171c0 6e 6c 79 20 61 74 74 65 6d 70 74 65 64 20 69 66  nly attempted if
171d0 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c   all of the foll
171e0 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a  owing are true:.
171f0 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 20 54 68 65  **.**   (1)  The
17200 20 73 75 62 71 75 65 72 79 20 61 6e 64 20 74 68   subquery and th
17210 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f  e outer query do
17220 20 6e 6f 74 20 62 6f 74 68 20 75 73 65 20 61 67   not both use ag
17230 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  gregates..**.** 
17240 20 20 28 32 29 20 20 54 68 65 20 73 75 62 71 75    (2)  The subqu
17250 65 72 79 20 69 73 20 6e 6f 74 20 61 6e 20 61 67  ery is not an ag
17260 67 72 65 67 61 74 65 20 6f 72 20 74 68 65 20 6f  gregate or the o
17270 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f  uter query is no
17280 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20  t a join..**.** 
17290 20 20 28 33 29 20 20 54 68 65 20 73 75 62 71 75    (3)  The subqu
172a0 65 72 79 20 69 73 20 6e 6f 74 20 74 68 65 20 72  ery is not the r
172b0 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20  ight operand of 
172c0 61 20 6c 65 66 74 20 6f 75 74 65 72 20 6a 6f 69  a left outer joi
172d0 6e 0a 2a 2a 20 20 20 20 20 20 20 20 28 4f 72 69  n.**        (Ori
172e0 67 69 6e 61 6c 6c 79 20 74 69 63 6b 65 74 20 23  ginally ticket #
172f0 33 30 36 2e 20 20 53 74 72 65 6e 67 74 68 65 6e  306.  Strengthen
17300 65 64 20 62 79 20 74 69 63 6b 65 74 20 23 33 33  ed by ticket #33
17310 30 30 29 0a 2a 2a 0a 2a 2a 20 20 20 28 34 29 20  00).**.**   (4) 
17320 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73   The subquery is
17330 20 6e 6f 74 20 44 49 53 54 49 4e 43 54 2e 0a 2a   not DISTINCT..*
17340 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 41 74 20 6f  *.**  (**)  At o
17350 6e 65 20 70 6f 69 6e 74 20 72 65 73 74 72 69 63  ne point restric
17360 74 69 6f 6e 73 20 28 34 29 20 61 6e 64 20 28 35  tions (4) and (5
17370 29 20 64 65 66 69 6e 65 64 20 61 20 73 75 62 73  ) defined a subs
17380 65 74 20 6f 66 20 44 49 53 54 49 4e 43 54 0a 2a  et of DISTINCT.*
17390 2a 20 20 20 20 20 20 20 20 73 75 62 2d 71 75 65  *        sub-que
173a0 72 69 65 73 20 74 68 61 74 20 77 65 72 65 20 65  ries that were e
173b0 78 63 6c 75 64 65 64 20 66 72 6f 6d 20 74 68 69  xcluded from thi
173c0 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20  s optimization. 
173d0 52 65 73 74 72 69 63 74 69 6f 6e 20 0a 2a 2a 20  Restriction .** 
173e0 20 20 20 20 20 20 20 28 34 29 20 68 61 73 20 73         (4) has s
173f0 69 6e 63 65 20 62 65 65 6e 20 65 78 70 61 6e 64  ince been expand
17400 65 64 20 74 6f 20 65 78 63 6c 75 64 65 20 61 6c  ed to exclude al
17410 6c 20 44 49 53 54 49 4e 43 54 20 73 75 62 71 75  l DISTINCT subqu
17420 65 72 69 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28  eries..**.**   (
17430 36 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  6)  The subquery
17440 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 61 67   does not use ag
17450 67 72 65 67 61 74 65 73 20 6f 72 20 74 68 65 20  gregates or the 
17460 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e  outer query is n
17470 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 44 49 53  ot.**        DIS
17480 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20 20 20 28  TINCT..**.**   (
17490 37 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  7)  The subquery
174a0 20 68 61 73 20 61 20 46 52 4f 4d 20 63 6c 61 75   has a FROM clau
174b0 73 65 2e 20 20 54 4f 44 4f 3a 20 20 46 6f 72 20  se.  TODO:  For 
174c0 73 75 62 71 75 65 72 69 65 73 20 77 69 74 68 6f  subqueries witho
174d0 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 41 20 46  ut.**        A F
174e0 52 4f 4d 20 63 6c 61 75 73 65 2c 20 63 6f 6e 73  ROM clause, cons
174f0 69 64 65 72 20 61 64 64 69 6e 67 20 61 20 46 52  ider adding a FR
17500 4f 4d 20 63 6c 6f 73 65 20 77 69 74 68 20 74 68  OM close with th
17510 65 20 73 70 65 63 69 61 6c 0a 2a 2a 20 20 20 20  e special.**    
17520 20 20 20 20 74 61 62 6c 65 20 73 71 6c 69 74 65      table sqlite
17530 5f 6f 6e 63 65 20 74 68 61 74 20 63 6f 6e 73 69  _once that consi
17540 73 74 73 20 6f 66 20 61 20 73 69 6e 67 6c 65 20  sts of a single 
17550 72 6f 77 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61  row containing a
17560 0a 2a 2a 20 20 20 20 20 20 20 20 73 69 6e 67 6c  .**        singl
17570 65 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 20 20  e NULL..**.**   
17580 28 38 29 20 20 54 68 65 20 73 75 62 71 75 65 72  (8)  The subquer
17590 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c  y does not use L
175a0 49 4d 49 54 20 6f 72 20 74 68 65 20 6f 75 74 65  IMIT or the oute
175b0 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61  r query is not a
175c0 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28   join..**.**   (
175d0 39 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  9)  The subquery
175e0 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c 49   does not use LI
175f0 4d 49 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72  MIT or the outer
17600 20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20   query does not 
17610 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 61 67  use.**        ag
17620 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  gregates..**.** 
17630 20 28 31 30 29 20 20 54 68 65 20 73 75 62 71 75   (10)  The subqu
17640 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  ery does not use
17650 20 61 67 67 72 65 67 61 74 65 73 20 6f 72 20 74   aggregates or t
17660 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64  he outer query d
17670 6f 65 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20  oes not.**      
17680 20 20 75 73 65 20 4c 49 4d 49 54 2e 0a 2a 2a 0a    use LIMIT..**.
17690 2a 2a 20 20 28 31 31 29 20 20 54 68 65 20 73 75  **  (11)  The su
176a0 62 71 75 65 72 79 20 61 6e 64 20 74 68 65 20 6f  bquery and the o
176b0 75 74 65 72 20 71 75 65 72 79 20 64 6f 20 6e 6f  uter query do no
176c0 74 20 62 6f 74 68 20 68 61 76 65 20 4f 52 44 45  t both have ORDE
176d0 52 20 42 59 20 63 6c 61 75 73 65 73 2e 0a 2a 2a  R BY clauses..**
176e0 0a 2a 2a 20 20 28 2a 2a 29 20 20 4e 6f 74 20 69  .**  (**)  Not i
176f0 6d 70 6c 65 6d 65 6e 74 65 64 2e 20 20 53 75 62  mplemented.  Sub
17700 73 75 6d 65 64 20 69 6e 74 6f 20 72 65 73 74 72  sumed into restr
17710 69 63 74 69 6f 6e 20 28 33 29 2e 20 20 57 61 73  iction (3).  Was
17720 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 20   previously.**  
17730 20 20 20 20 20 20 61 20 73 65 70 61 72 61 74 65        a separate
17740 20 72 65 73 74 72 69 63 74 69 6f 6e 20 64 65 72   restriction der
17750 69 76 69 6e 67 20 66 72 6f 6d 20 74 69 63 6b 65  iving from ticke
17760 74 20 23 33 35 30 2e 0a 2a 2a 0a 2a 2a 20 20 28  t #350..**.**  (
17770 31 33 29 20 20 54 68 65 20 73 75 62 71 75 65 72  13)  The subquer
17780 79 20 61 6e 64 20 6f 75 74 65 72 20 71 75 65 72  y and outer quer
17790 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20 75 73  y do not both us
177a0 65 20 4c 49 4d 49 54 2e 0a 2a 2a 0a 2a 2a 20 20  e LIMIT..**.**  
177b0 28 31 34 29 20 20 54 68 65 20 73 75 62 71 75 65  (14)  The subque
177c0 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  ry does not use 
177d0 4f 46 46 53 45 54 2e 0a 2a 2a 0a 2a 2a 20 20 28  OFFSET..**.**  (
177e0 31 35 29 20 20 54 68 65 20 6f 75 74 65 72 20 71  15)  The outer q
177f0 75 65 72 79 20 69 73 20 6e 6f 74 20 70 61 72 74  uery is not part
17800 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73   of a compound s
17810 65 6c 65 63 74 20 6f 72 20 74 68 65 0a 2a 2a 20  elect or the.** 
17820 20 20 20 20 20 20 20 73 75 62 71 75 65 72 79 20         subquery 
17830 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 61 20  does not have a 
17840 4c 49 4d 49 54 20 63 6c 61 75 73 65 2e 0a 2a 2a  LIMIT clause..**
17850 20 20 20 20 20 20 20 20 28 53 65 65 20 74 69 63          (See tic
17860 6b 65 74 20 23 32 33 33 39 20 61 6e 64 20 74 69  ket #2339 and ti
17870 63 6b 65 74 20 5b 30 32 61 38 65 38 31 64 34 34  cket [02a8e81d44
17880 5d 29 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 36 29 20  ])..**.**  (16) 
17890 20 54 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   The outer query
178a0 20 69 73 20 6e 6f 74 20 61 6e 20 61 67 67 72 65   is not an aggre
178b0 67 61 74 65 20 6f 72 20 74 68 65 20 73 75 62 71  gate or the subq
178c0 75 65 72 79 20 64 6f 65 73 0a 2a 2a 20 20 20 20  uery does.**    
178d0 20 20 20 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20      not contain 
178e0 4f 52 44 45 52 20 42 59 2e 20 20 28 54 69 63 6b  ORDER BY.  (Tick
178f0 65 74 20 23 32 39 34 32 29 20 20 54 68 69 73 20  et #2942)  This 
17900 75 73 65 64 20 74 6f 20 6e 6f 74 20 6d 61 74 74  used to not matt
17910 65 72 0a 2a 2a 20 20 20 20 20 20 20 20 75 6e 74  er.**        unt
17920 69 6c 20 77 65 20 69 6e 74 72 6f 64 75 63 65 64  il we introduced
17930 20 74 68 65 20 67 72 6f 75 70 5f 63 6f 6e 63 61   the group_conca
17940 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20 0a  t() function.  .
17950 2a 2a 0a 2a 2a 20 20 28 31 37 29 20 20 54 68 65  **.**  (17)  The
17960 20 73 75 62 2d 71 75 65 72 79 20 69 73 20 6e 6f   sub-query is no
17970 74 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c  t a compound sel
17980 65 63 74 2c 20 6f 72 20 69 74 20 69 73 20 61 20  ect, or it is a 
17990 55 4e 49 4f 4e 20 41 4c 4c 20 0a 2a 2a 20 20 20  UNION ALL .**   
179a0 20 20 20 20 20 63 6f 6d 70 6f 75 6e 64 20 63 6c       compound cl
179b0 61 75 73 65 20 6d 61 64 65 20 75 70 20 65 6e 74  ause made up ent
179c0 69 72 65 6c 79 20 6f 66 20 6e 6f 6e 2d 61 67 67  irely of non-agg
179d0 72 65 67 61 74 65 20 71 75 65 72 69 65 73 2c 20  regate queries, 
179e0 61 6e 64 20 0a 2a 2a 20 20 20 20 20 20 20 20 74  and .**        t
179f0 68 65 20 70 61 72 65 6e 74 20 71 75 65 72 79 3a  he parent query:
17a00 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  .**.**          
17a10 2a 20 69 73 20 6e 6f 74 20 69 74 73 65 6c 66 20  * is not itself 
17a20 70 61 72 74 20 6f 66 20 61 20 63 6f 6d 70 6f 75  part of a compou
17a30 6e 64 20 73 65 6c 65 63 74 2c 0a 2a 2a 20 20 20  nd select,.**   
17a40 20 20 20 20 20 20 20 2a 20 69 73 20 6e 6f 74 20         * is not 
17a50 61 6e 20 61 67 67 72 65 67 61 74 65 20 6f 72 20  an aggregate or 
17a60 44 49 53 54 49 4e 43 54 20 71 75 65 72 79 2c 20  DISTINCT query, 
17a70 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  and.**          
17a80 2a 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 0a  * is not a join.
17a90 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 54 68 65  **.**        The
17aa0 20 70 61 72 65 6e 74 20 61 6e 64 20 73 75 62 2d   parent and sub-
17ab0 71 75 65 72 79 20 6d 61 79 20 63 6f 6e 74 61 69  query may contai
17ac0 6e 20 57 48 45 52 45 20 63 6c 61 75 73 65 73 2e  n WHERE clauses.
17ad0 20 53 75 62 6a 65 63 74 20 74 6f 0a 2a 2a 20 20   Subject to.**  
17ae0 20 20 20 20 20 20 72 75 6c 65 73 20 28 31 31 29        rules (11)
17af0 2c 20 28 31 33 29 20 61 6e 64 20 28 31 34 29 2c  , (13) and (14),
17b00 20 74 68 65 79 20 6d 61 79 20 61 6c 73 6f 20 63   they may also c
17b10 6f 6e 74 61 69 6e 20 4f 52 44 45 52 20 42 59 2c  ontain ORDER BY,
17b20 0a 2a 2a 20 20 20 20 20 20 20 20 4c 49 4d 49 54  .**        LIMIT
17b30 20 61 6e 64 20 4f 46 46 53 45 54 20 63 6c 61 75   and OFFSET clau
17b40 73 65 73 2e 20 20 54 68 65 20 73 75 62 71 75 65  ses.  The subque
17b50 72 79 20 63 61 6e 6e 6f 74 20 75 73 65 20 61 6e  ry cannot use an
17b60 79 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20 20  y compound.**   
17b70 20 20 20 20 20 6f 70 65 72 61 74 6f 72 20 6f 74       operator ot
17b80 68 65 72 20 74 68 61 6e 20 55 4e 49 4f 4e 20 41  her than UNION A
17b90 4c 4c 20 62 65 63 61 75 73 65 20 61 6c 6c 20 74  LL because all t
17ba0 68 65 20 6f 74 68 65 72 20 63 6f 6d 70 6f 75 6e  he other compoun
17bb0 64 0a 2a 2a 20 20 20 20 20 20 20 20 6f 70 65 72  d.**        oper
17bc0 61 74 6f 72 73 20 68 61 76 65 20 61 6e 20 69 6d  ators have an im
17bd0 70 6c 69 65 64 20 44 49 53 54 49 4e 43 54 20 77  plied DISTINCT w
17be0 68 69 63 68 20 69 73 20 64 69 73 61 6c 6c 6f 77  hich is disallow
17bf0 65 64 20 62 79 0a 2a 2a 20 20 20 20 20 20 20 20  ed by.**        
17c00 72 65 73 74 72 69 63 74 69 6f 6e 20 28 34 29 2e  restriction (4).
17c10 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 41 6c  .**.**        Al
17c20 73 6f 2c 20 65 61 63 68 20 63 6f 6d 70 6f 6e 65  so, each compone
17c30 6e 74 20 6f 66 20 74 68 65 20 73 75 62 2d 71 75  nt of the sub-qu
17c40 65 72 79 20 6d 75 73 74 20 72 65 74 75 72 6e 20  ery must return 
17c50 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 0a  the same number.
17c60 2a 2a 20 20 20 20 20 20 20 20 6f 66 20 72 65 73  **        of res
17c70 75 6c 74 20 63 6f 6c 75 6d 6e 73 2e 20 54 68 69  ult columns. Thi
17c80 73 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61 20  s is actually a 
17c90 72 65 71 75 69 72 65 6d 65 6e 74 20 66 6f 72 20  requirement for 
17ca0 61 6e 79 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20  any compound.** 
17cb0 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 73 74         SELECT st
17cc0 61 74 65 6d 65 6e 74 2c 20 62 75 74 20 61 6c 6c  atement, but all
17cd0 20 74 68 65 20 63 6f 64 65 20 68 65 72 65 20 64   the code here d
17ce0 6f 65 73 20 69 73 20 6d 61 6b 65 20 73 75 72 65  oes is make sure
17cf0 20 74 68 61 74 20 6e 6f 0a 2a 2a 20 20 20 20 20   that no.**     
17d00 20 20 20 73 75 63 68 20 28 69 6c 6c 65 67 61 6c     such (illegal
17d10 29 20 73 75 62 2d 71 75 65 72 79 20 69 73 20 66  ) sub-query is f
17d20 6c 61 74 74 65 6e 65 64 2e 20 54 68 65 20 63 61  lattened. The ca
17d30 6c 6c 65 72 20 77 69 6c 6c 20 64 65 74 65 63 74  ller will detect
17d40 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 73   the.**        s
17d50 79 6e 74 61 78 20 65 72 72 6f 72 20 61 6e 64 20  yntax error and 
17d60 72 65 74 75 72 6e 20 61 20 64 65 74 61 69 6c 65  return a detaile
17d70 64 20 6d 65 73 73 61 67 65 2e 0a 2a 2a 0a 2a 2a  d message..**.**
17d80 20 20 28 31 38 29 20 20 49 66 20 74 68 65 20 73    (18)  If the s
17d90 75 62 2d 71 75 65 72 79 20 69 73 20 61 20 63 6f  ub-query is a co
17da0 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20 74  mpound select, t
17db0 68 65 6e 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66  hen all terms of
17dc0 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 4f   the.**        O
17dd0 52 44 45 52 20 62 79 20 63 6c 61 75 73 65 20 6f  RDER by clause o
17de0 66 20 74 68 65 20 70 61 72 65 6e 74 20 6d 75 73  f the parent mus
17df0 74 20 62 65 20 73 69 6d 70 6c 65 20 72 65 66 65  t be simple refe
17e00 72 65 6e 63 65 73 20 74 6f 20 0a 2a 2a 20 20 20  rences to .**   
17e10 20 20 20 20 20 63 6f 6c 75 6d 6e 73 20 6f 66 20       columns of 
17e20 74 68 65 20 73 75 62 2d 71 75 65 72 79 2e 0a 2a  the sub-query..*
17e30 2a 0a 2a 2a 20 20 28 31 39 29 20 20 54 68 65 20  *.**  (19)  The 
17e40 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f  subquery does no
17e50 74 20 75 73 65 20 4c 49 4d 49 54 20 6f 72 20 74  t use LIMIT or t
17e60 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64  he outer query d
17e70 6f 65 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20  oes not.**      
17e80 20 20 68 61 76 65 20 61 20 57 48 45 52 45 20 63    have a WHERE c
17e90 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 32  lause..**.**  (2
17ea0 30 29 20 20 49 66 20 74 68 65 20 73 75 62 2d 71  0)  If the sub-q
17eb0 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75  uery is a compou
17ec0 6e 64 20 73 65 6c 65 63 74 2c 20 74 68 65 6e 20  nd select, then 
17ed0 69 74 20 6d 75 73 74 20 6e 6f 74 20 75 73 65 0a  it must not use.
17ee0 2a 2a 20 20 20 20 20 20 20 20 61 6e 20 4f 52 44  **        an ORD
17ef0 45 52 20 42 59 20 63 6c 61 75 73 65 2e 20 20 54  ER BY clause.  T
17f00 69 63 6b 65 74 20 23 33 37 37 33 2e 20 20 57 65  icket #3773.  We
17f10 20 63 6f 75 6c 64 20 72 65 6c 61 78 20 74 68 69   could relax thi
17f20 73 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20  s constraint.** 
17f30 20 20 20 20 20 20 20 73 6f 6d 65 77 68 61 74 20         somewhat 
17f40 62 79 20 73 61 79 69 6e 67 20 74 68 61 74 20 74  by saying that t
17f50 68 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  he terms of the 
17f60 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
17f70 6d 75 73 74 0a 2a 2a 20 20 20 20 20 20 20 20 61  must.**        a
17f80 70 70 65 61 72 20 61 73 20 75 6e 6d 6f 64 69 66  ppear as unmodif
17f90 69 65 64 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d  ied result colum
17fa0 6e 73 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20  ns in the outer 
17fb0 71 75 65 72 79 2e 20 20 42 75 74 20 77 65 0a 2a  query.  But we.*
17fc0 2a 20 20 20 20 20 20 20 20 68 61 76 65 20 6f 74  *        have ot
17fd0 68 65 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  her optimization
17fe0 73 20 69 6e 20 6d 69 6e 64 20 74 6f 20 64 65 61  s in mind to dea
17ff0 6c 20 77 69 74 68 20 74 68 61 74 20 63 61 73 65  l with that case
18000 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 31 29 20 20 54  ..**.**  (21)  T
18010 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73  he subquery does
18020 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 20 6f   not use LIMIT o
18030 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  r the outer quer
18040 79 20 69 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20  y is not.**     
18050 20 20 20 44 49 53 54 49 4e 43 54 2e 20 20 28 53     DISTINCT.  (S
18060 65 65 20 74 69 63 6b 65 74 20 5b 37 35 32 65 31  ee ticket [752e1
18070 36 34 36 66 63 5d 29 2e 0a 2a 2a 0a 2a 2a 20 49  646fc])..**.** I
18080 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20  n this routine, 
18090 74 68 65 20 22 70 22 20 70 61 72 61 6d 65 74 65  the "p" paramete
180a0 72 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  r is a pointer t
180b0 6f 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  o the outer quer
180c0 79 2e 0a 2a 2a 20 54 68 65 20 73 75 62 71 75 65  y..** The subque
180d0 72 79 20 69 73 20 70 2d 3e 70 53 72 63 2d 3e 61  ry is p->pSrc->a
180e0 5b 69 46 72 6f 6d 5d 2e 20 20 69 73 41 67 67 20  [iFrom].  isAgg 
180f0 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20 6f  is true if the o
18100 75 74 65 72 20 71 75 65 72 79 0a 2a 2a 20 75 73  uter query.** us
18110 65 73 20 61 67 67 72 65 67 61 74 65 73 20 61 6e  es aggregates an
18120 64 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20  d subqueryIsAgg 
18130 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20 73  is true if the s
18140 75 62 71 75 65 72 79 20 75 73 65 73 20 61 67 67  ubquery uses agg
18150 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 49  regates..**.** I
18160 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20  f flattening is 
18170 6e 6f 74 20 61 74 74 65 6d 70 74 65 64 2c 20 74  not attempted, t
18180 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
18190 20 6e 6f 2d 6f 70 20 61 6e 64 20 72 65 74 75 72   no-op and retur
181a0 6e 73 20 30 2e 0a 2a 2a 20 49 66 20 66 6c 61 74  ns 0..** If flat
181b0 74 65 6e 69 6e 67 20 69 73 20 61 74 74 65 6d 70  tening is attemp
181c0 74 65 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ted this routine
181d0 20 72 65 74 75 72 6e 73 20 31 2e 0a 2a 2a 0a 2a   returns 1..**.*
181e0 2a 20 41 6c 6c 20 6f 66 20 74 68 65 20 65 78 70  * All of the exp
181f0 72 65 73 73 69 6f 6e 20 61 6e 61 6c 79 73 69 73  ression analysis
18200 20 6d 75 73 74 20 6f 63 63 75 72 20 6f 6e 20 62   must occur on b
18210 6f 74 68 20 74 68 65 20 6f 75 74 65 72 20 71 75  oth the outer qu
18220 65 72 79 20 61 6e 64 0a 2a 2a 20 74 68 65 20 73  ery and.** the s
18230 75 62 71 75 65 72 79 20 62 65 66 6f 72 65 20 74  ubquery before t
18240 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73  his routine runs
18250 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
18260 66 6c 61 74 74 65 6e 53 75 62 71 75 65 72 79 28  flattenSubquery(
18270 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
18280 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69  ,       /* Parsi
18290 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
182a0 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20  Select *p,      
182b0 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 65       /* The pare
182c0 6e 74 20 6f 72 20 6f 75 74 65 72 20 53 45 4c 45  nt or outer SELE
182d0 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  CT statement */.
182e0 20 20 69 6e 74 20 69 46 72 6f 6d 2c 20 20 20 20    int iFrom,    
182f0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
18300 69 6e 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 5d 20  in p->pSrc->a[] 
18310 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 73 75 62  of the inner sub
18320 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69  query */.  int i
18330 73 41 67 67 2c 20 20 20 20 20 20 20 20 20 20 20  sAgg,           
18340 2f 2a 20 54 72 75 65 20 69 66 20 6f 75 74 65 72  /* True if outer
18350 20 53 45 4c 45 43 54 20 75 73 65 73 20 61 67 67   SELECT uses agg
18360 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73  regate functions
18370 20 2a 2f 0a 20 20 69 6e 74 20 73 75 62 71 75 65   */.  int subque
18380 72 79 49 73 41 67 67 20 20 20 20 2f 2a 20 54 72  ryIsAgg    /* Tr
18390 75 65 20 69 66 20 74 68 65 20 73 75 62 71 75 65  ue if the subque
183a0 72 79 20 75 73 65 73 20 61 67 67 72 65 67 61 74  ry uses aggregat
183b0 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 29  e functions */.)
183c0 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
183d0 7a 53 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78  zSavedAuthContex
183e0 74 20 3d 20 70 50 61 72 73 65 2d 3e 7a 41 75 74  t = pParse->zAut
183f0 68 43 6f 6e 74 65 78 74 3b 0a 20 20 53 65 6c 65  hContext;.  Sele
18400 63 74 20 2a 70 50 61 72 65 6e 74 3b 0a 20 20 53  ct *pParent;.  S
18410 65 6c 65 63 74 20 2a 70 53 75 62 3b 20 20 20 20  elect *pSub;    
18420 20 20 20 2f 2a 20 54 68 65 20 69 6e 6e 65 72 20     /* The inner 
18430 71 75 65 72 79 20 6f 72 20 22 73 75 62 71 75 65  query or "subque
18440 72 79 22 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ry" */.  Select 
18450 2a 70 53 75 62 31 3b 20 20 20 20 20 20 2f 2a 20  *pSub1;      /* 
18460 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 72  Pointer to the r
18470 69 67 68 74 6d 6f 73 74 20 73 65 6c 65 63 74 20  ightmost select 
18480 69 6e 20 73 75 62 2d 71 75 65 72 79 20 2a 2f 0a  in sub-query */.
18490 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b    SrcList *pSrc;
184a0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f        /* The FRO
184b0 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
184c0 6f 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 20  outer query */. 
184d0 20 53 72 63 4c 69 73 74 20 2a 70 53 75 62 53 72   SrcList *pSubSr
184e0 63 3b 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d  c;   /* The FROM
184f0 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 73   clause of the s
18500 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 45 78 70  ubquery */.  Exp
18510 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b 20 20 20  rList *pList;   
18520 20 2f 2a 20 54 68 65 20 72 65 73 75 6c 74 20 73   /* The result s
18530 65 74 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20  et of the outer 
18540 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69  query */.  int i
18550 50 61 72 65 6e 74 3b 20 20 20 20 20 20 20 20 2f  Parent;        /
18560 2a 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75  * VDBE cursor nu
18570 6d 62 65 72 20 6f 66 20 74 68 65 20 70 53 75 62  mber of the pSub
18580 20 72 65 73 75 6c 74 20 73 65 74 20 74 65 6d 70   result set temp
18590 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
185a0 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
185b0 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
185c0 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72  */.  Expr *pWher
185d0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
185e0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45        /* The WHE
185f0 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73  RE clause */.  s
18600 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
18610 65 6d 20 2a 70 53 75 62 69 74 65 6d 3b 20 20 20  em *pSubitem;   
18620 2f 2a 20 54 68 65 20 73 75 62 71 75 65 72 79 20  /* The subquery 
18630 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
18640 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a   = pParse->db;..
18650 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65    /* Check to se
18660 65 20 69 66 20 66 6c 61 74 74 65 6e 69 6e 67 20  e if flattening 
18670 69 73 20 70 65 72 6d 69 74 74 65 64 2e 20 20 52  is permitted.  R
18680 65 74 75 72 6e 20 30 20 69 66 20 6e 6f 74 2e 0a  eturn 0 if not..
18690 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
186a0 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
186b0 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 3b   p->pPrior==0 );
186c0 20 20 2f 2a 20 55 6e 61 62 6c 65 20 74 6f 20 66    /* Unable to f
186d0 6c 61 74 74 65 6e 20 63 6f 6d 70 6f 75 6e 64 20  latten compound 
186e0 71 75 65 72 69 65 73 20 2a 2f 0a 20 20 69 66 28  queries */.  if(
186f0 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 44 69 73   OptimizationDis
18700 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45  abled(db, SQLITE
18710 5f 51 75 65 72 79 46 6c 61 74 74 65 6e 65 72 29  _QueryFlattener)
18720 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
18730 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20  Src = p->pSrc;. 
18740 20 61 73 73 65 72 74 28 20 70 53 72 63 20 26 26   assert( pSrc &&
18750 20 69 46 72 6f 6d 3e 3d 30 20 26 26 20 69 46 72   iFrom>=0 && iFr
18760 6f 6d 3c 70 53 72 63 2d 3e 6e 53 72 63 20 29 3b  om<pSrc->nSrc );
18770 0a 20 20 70 53 75 62 69 74 65 6d 20 3d 20 26 70  .  pSubitem = &p
18780 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 3b 0a 20  Src->a[iFrom];. 
18790 20 69 50 61 72 65 6e 74 20 3d 20 70 53 75 62 69   iParent = pSubi
187a0 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20  tem->iCursor;.  
187b0 70 53 75 62 20 3d 20 70 53 75 62 69 74 65 6d 2d  pSub = pSubitem-
187c0 3e 70 53 65 6c 65 63 74 3b 0a 20 20 61 73 73 65  >pSelect;.  asse
187d0 72 74 28 20 70 53 75 62 21 3d 30 20 29 3b 0a 20  rt( pSub!=0 );. 
187e0 20 69 66 28 20 69 73 41 67 67 20 26 26 20 73 75   if( isAgg && su
187f0 62 71 75 65 72 79 49 73 41 67 67 20 29 20 72 65  bqueryIsAgg ) re
18800 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
18810 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
18820 69 63 74 69 6f 6e 20 28 31 29 20 20 2a 2f 0a 20  iction (1)  */. 
18830 20 69 66 28 20 73 75 62 71 75 65 72 79 49 73 41   if( subqueryIsA
18840 67 67 20 26 26 20 70 53 72 63 2d 3e 6e 53 72 63  gg && pSrc->nSrc
18850 3e 31 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  >1 ) return 0;  
18860 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
18870 69 63 74 69 6f 6e 20 28 32 29 20 20 2a 2f 0a 20  iction (2)  */. 
18880 20 70 53 75 62 53 72 63 20 3d 20 70 53 75 62 2d   pSubSrc = pSub-
18890 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28  >pSrc;.  assert(
188a0 20 70 53 75 62 53 72 63 20 29 3b 0a 20 20 2f 2a   pSubSrc );.  /*
188b0 20 50 72 69 6f 72 20 74 6f 20 76 65 72 73 69 6f   Prior to versio
188c0 6e 20 33 2e 31 2e 32 2c 20 77 68 65 6e 20 4c 49  n 3.1.2, when LI
188d0 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20 68  MIT and OFFSET h
188e0 61 64 20 74 6f 20 62 65 20 73 69 6d 70 6c 65 20  ad to be simple 
188f0 63 6f 6e 73 74 61 6e 74 73 2c 0a 20 20 2a 2a 20  constants,.  ** 
18900 6e 6f 74 20 61 72 62 69 74 72 61 72 79 20 65 78  not arbitrary ex
18910 70 72 65 73 73 73 69 6f 6e 73 2c 20 77 65 20 61  presssions, we a
18920 6c 6c 6f 77 65 64 20 73 6f 6d 65 20 63 6f 6d 62  llowed some comb
18930 69 6e 69 6e 67 20 6f 66 20 4c 49 4d 49 54 20 61  ining of LIMIT a
18940 6e 64 20 4f 46 46 53 45 54 0a 20 20 2a 2a 20 62  nd OFFSET.  ** b
18950 65 63 61 75 73 65 20 74 68 65 79 20 63 6f 75 6c  ecause they coul
18960 64 20 62 65 20 63 6f 6d 70 75 74 65 64 20 61 74  d be computed at
18970 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2e 20 20   compile-time.  
18980 42 75 74 20 77 68 65 6e 20 4c 49 4d 49 54 20 61  But when LIMIT a
18990 6e 64 20 4f 46 46 53 45 54 0a 20 20 2a 2a 20 62  nd OFFSET.  ** b
189a0 65 63 61 6d 65 20 61 72 62 69 74 72 61 72 79 20  ecame arbitrary 
189b0 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 77 65 20  expressions, we 
189c0 77 65 72 65 20 66 6f 72 63 65 64 20 74 6f 20 61  were forced to a
189d0 64 64 20 72 65 73 74 72 69 63 74 69 6f 6e 73 20  dd restrictions 
189e0 28 31 33 29 0a 20 20 2a 2a 20 61 6e 64 20 28 31  (13).  ** and (1
189f0 34 29 2e 20 2a 2f 0a 20 20 69 66 28 20 70 53 75  4). */.  if( pSu
18a00 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 70 2d 3e  b->pLimit && p->
18a10 70 4c 69 6d 69 74 20 29 20 72 65 74 75 72 6e 20  pLimit ) return 
18a20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
18a30 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
18a40 31 33 29 20 2a 2f 0a 20 20 69 66 28 20 70 53 75  13) */.  if( pSu
18a50 62 2d 3e 70 4f 66 66 73 65 74 20 29 20 72 65 74  b->pOffset ) ret
18a60 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
18a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18a80 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
18a90 31 34 29 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  14) */.  if( p->
18aa0 70 52 69 67 68 74 6d 6f 73 74 20 26 26 20 70 53  pRightmost && pS
18ab0 75 62 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20  ub->pLimit ){.  
18ac0 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20    return 0;     
18ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18af0 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
18b00 63 74 69 6f 6e 20 28 31 35 29 20 2a 2f 0a 20 20  ction (15) */.  
18b10 7d 0a 20 20 69 66 28 20 70 53 75 62 53 72 63 2d  }.  if( pSubSrc-
18b20 3e 6e 53 72 63 3d 3d 30 20 29 20 72 65 74 75 72  >nSrc==0 ) retur
18b30 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
18b40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
18b50 73 74 72 69 63 74 69 6f 6e 20 28 37 29 20 20 2a  striction (7)  *
18b60 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 73 65  /.  if( pSub->se
18b70 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74  lFlags & SF_Dist
18b80 69 6e 63 74 20 29 20 72 65 74 75 72 6e 20 30 3b  inct ) return 0;
18b90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
18ba0 73 74 72 69 63 74 69 6f 6e 20 28 35 29 20 20 2a  striction (5)  *
18bb0 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c  /.  if( pSub->pL
18bc0 69 6d 69 74 20 26 26 20 28 70 53 72 63 2d 3e 6e  imit && (pSrc->n
18bd0 53 72 63 3e 31 20 7c 7c 20 69 73 41 67 67 29 20  Src>1 || isAgg) 
18be0 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30  ){.     return 0
18bf0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73  ;         /* Res
18c00 74 72 69 63 74 69 6f 6e 73 20 28 38 29 28 39 29  trictions (8)(9)
18c10 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 28 70   */.  }.  if( (p
18c20 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
18c30 44 69 73 74 69 6e 63 74 29 21 3d 30 20 26 26 20  Distinct)!=0 && 
18c40 73 75 62 71 75 65 72 79 49 73 41 67 67 20 29 7b  subqueryIsAgg ){
18c50 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20  .     return 0; 
18c60 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
18c70 69 63 74 69 6f 6e 20 28 36 29 20 20 2a 2f 0a 20  iction (6)  */. 
18c80 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72 64   }.  if( p->pOrd
18c90 65 72 42 79 20 26 26 20 70 53 75 62 2d 3e 70 4f  erBy && pSub->pO
18ca0 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 72  rderBy ){.     r
18cb0 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
18cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18ce0 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
18cf0 6e 20 28 31 31 29 20 2a 2f 0a 20 20 7d 0a 20 20  n (11) */.  }.  
18d00 69 66 28 20 69 73 41 67 67 20 26 26 20 70 53 75  if( isAgg && pSu
18d10 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 20 72 65  b->pOrderBy ) re
18d20 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
18d30 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
18d40 63 74 69 6f 6e 20 28 31 36 29 20 2a 2f 0a 20 20  ction (16) */.  
18d50 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74  if( pSub->pLimit
18d60 20 26 26 20 70 2d 3e 70 57 68 65 72 65 20 29 20   && p->pWhere ) 
18d70 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
18d80 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
18d90 63 74 69 6f 6e 20 28 31 39 29 20 2a 2f 0a 20 20  ction (19) */.  
18da0 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74  if( pSub->pLimit
18db0 20 26 26 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73   && (p->selFlags
18dc0 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 29 21   & SF_Distinct)!
18dd0 3d 30 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72  =0 ){.     retur
18de0 6e 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  n 0;         /* 
18df0 52 65 73 74 72 69 63 74 69 6f 6e 20 28 32 31 29  Restriction (21)
18e00 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 42   */.  }..  /* OB
18e10 53 4f 4c 45 54 45 20 43 4f 4d 4d 45 4e 54 20 31  SOLETE COMMENT 1
18e20 3a 0a 20 20 2a 2a 20 52 65 73 74 72 69 63 74 69  :.  ** Restricti
18e30 6f 6e 20 33 3a 20 20 49 66 20 74 68 65 20 73 75  on 3:  If the su
18e40 62 71 75 65 72 79 20 69 73 20 61 20 6a 6f 69 6e  bquery is a join
18e50 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20  , make sure the 
18e60 73 75 62 71 75 65 72 79 20 69 73 20 0a 20 20 2a  subquery is .  *
18e70 2a 20 6e 6f 74 20 75 73 65 64 20 61 73 20 74 68  * not used as th
18e80 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20  e right operand 
18e90 6f 66 20 61 6e 20 6f 75 74 65 72 20 6a 6f 69 6e  of an outer join
18ea0 2e 20 20 45 78 61 6d 70 6c 65 73 20 6f 66 20 77  .  Examples of w
18eb0 68 79 20 74 68 69 73 0a 20 20 2a 2a 20 69 73 20  hy this.  ** is 
18ec0 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a  not allowed:.  *
18ed0 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74  *.  **         t
18ee0 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  1 LEFT OUTER JOI
18ef0 4e 20 28 74 32 20 4a 4f 49 4e 20 74 33 29 0a 20  N (t2 JOIN t3). 
18f00 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20 66   **.  ** If we f
18f10 6c 61 74 74 65 6e 20 74 68 65 20 61 62 6f 76 65  latten the above
18f20 2c 20 77 65 20 77 6f 75 6c 64 20 67 65 74 0a 20  , we would get. 
18f30 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20   **.  **        
18f40 20 28 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20   (t1 LEFT OUTER 
18f50 4a 4f 49 4e 20 74 32 29 20 4a 4f 49 4e 20 74 33  JOIN t2) JOIN t3
18f60 0a 20 20 2a 2a 0a 20 20 2a 2a 20 77 68 69 63 68  .  **.  ** which
18f70 20 69 73 20 6e 6f 74 20 61 74 20 61 6c 6c 20 74   is not at all t
18f80 68 65 20 73 61 6d 65 20 74 68 69 6e 67 2e 0a 20  he same thing.. 
18f90 20 2a 2a 0a 20 20 2a 2a 20 4f 42 53 4f 4c 45 54   **.  ** OBSOLET
18fa0 45 20 43 4f 4d 4d 45 4e 54 20 32 3a 0a 20 20 2a  E COMMENT 2:.  *
18fb0 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 31 32  * Restriction 12
18fc0 3a 20 20 49 66 20 74 68 65 20 73 75 62 71 75 65  :  If the subque
18fd0 72 79 20 69 73 20 74 68 65 20 72 69 67 68 74 20  ry is the right 
18fe0 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 6c 65 66  operand of a lef
18ff0 74 20 6f 75 74 65 72 0a 20 20 2a 2a 20 6a 6f 69  t outer.  ** joi
19000 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65  n, make sure the
19010 20 73 75 62 71 75 65 72 79 20 68 61 73 20 6e 6f   subquery has no
19020 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 20   WHERE clause.. 
19030 20 2a 2a 20 41 6e 20 65 78 61 6d 70 6c 65 73 20   ** An examples 
19040 6f 66 20 77 68 79 20 74 68 69 73 20 69 73 20 6e  of why this is n
19050 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a  ot allowed:.  **
19060 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74 31  .  **         t1
19070 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e   LEFT OUTER JOIN
19080 20 28 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   (SELECT * FROM 
19090 74 32 20 57 48 45 52 45 20 74 32 2e 78 3e 30 29  t2 WHERE t2.x>0)
190a0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 77 65  .  **.  ** If we
190b0 20 66 6c 61 74 74 65 6e 20 74 68 65 20 61 62 6f   flatten the abo
190c0 76 65 2c 20 77 65 20 77 6f 75 6c 64 20 67 65 74  ve, we would get
190d0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
190e0 20 20 20 28 74 31 20 4c 45 46 54 20 4f 55 54 45     (t1 LEFT OUTE
190f0 52 20 4a 4f 49 4e 20 74 32 29 20 57 48 45 52 45  R JOIN t2) WHERE
19100 20 74 32 2e 78 3e 30 0a 20 20 2a 2a 0a 20 20 2a   t2.x>0.  **.  *
19110 2a 20 42 75 74 20 74 68 65 20 74 32 2e 78 3e 30  * But the t2.x>0
19120 20 74 65 73 74 20 77 69 6c 6c 20 61 6c 77 61 79   test will alway
19130 73 20 66 61 69 6c 20 6f 6e 20 61 20 4e 55 4c 4c  s fail on a NULL
19140 20 72 6f 77 20 6f 66 20 74 32 2c 20 77 68 69 63   row of t2, whic
19150 68 0a 20 20 2a 2a 20 65 66 66 65 63 74 69 76 65  h.  ** effective
19160 6c 79 20 63 6f 6e 76 65 72 74 73 20 74 68 65 20  ly converts the 
19170 4f 55 54 45 52 20 4a 4f 49 4e 20 69 6e 74 6f 20  OUTER JOIN into 
19180 61 6e 20 49 4e 4e 45 52 20 4a 4f 49 4e 2e 0a 20  an INNER JOIN.. 
19190 20 2a 2a 0a 20 20 2a 2a 20 54 48 49 53 20 4f 56   **.  ** THIS OV
191a0 45 52 52 49 44 45 53 20 4f 42 53 4f 4c 45 54 45  ERRIDES OBSOLETE
191b0 20 43 4f 4d 4d 45 4e 54 53 20 31 20 41 4e 44 20   COMMENTS 1 AND 
191c0 32 20 41 42 4f 56 45 3a 0a 20 20 2a 2a 20 54 69  2 ABOVE:.  ** Ti
191d0 63 6b 65 74 20 23 33 33 30 30 20 73 68 6f 77 73  cket #3300 shows
191e0 20 74 68 61 74 20 66 6c 61 74 74 65 6e 69 6e 67   that flattening
191f0 20 74 68 65 20 72 69 67 68 74 20 74 65 72 6d 20   the right term 
19200 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 0a 20  of a LEFT JOIN. 
19210 20 2a 2a 20 69 73 20 66 72 61 75 67 68 74 20 77   ** is fraught w
19220 69 74 68 20 64 61 6e 67 65 72 2e 20 20 42 65 73  ith danger.  Bes
19230 74 20 74 6f 20 61 76 6f 69 64 20 74 68 65 20 77  t to avoid the w
19240 68 6f 6c 65 20 74 68 69 6e 67 2e 20 20 49 66 20  hole thing.  If 
19250 74 68 65 0a 20 20 2a 2a 20 73 75 62 71 75 65 72  the.  ** subquer
19260 79 20 69 73 20 74 68 65 20 72 69 67 68 74 20 74  y is the right t
19270 65 72 6d 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f  erm of a LEFT JO
19280 49 4e 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20  IN, then do not 
19290 66 6c 61 74 74 65 6e 2e 0a 20 20 2a 2f 0a 20 20  flatten..  */.  
192a0 69 66 28 20 28 70 53 75 62 69 74 65 6d 2d 3e 6a  if( (pSubitem->j
192b0 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55 54  ointype & JT_OUT
192c0 45 52 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65  ER)!=0 ){.    re
192d0 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  turn 0;.  }..  /
192e0 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 31 37  * Restriction 17
192f0 3a 20 49 66 20 74 68 65 20 73 75 62 2d 71 75 65  : If the sub-que
19300 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64  ry is a compound
19310 20 53 45 4c 45 43 54 2c 20 74 68 65 6e 20 69 74   SELECT, then it
19320 20 6d 75 73 74 0a 20 20 2a 2a 20 75 73 65 20 6f   must.  ** use o
19330 6e 6c 79 20 74 68 65 20 55 4e 49 4f 4e 20 41 4c  nly the UNION AL
19340 4c 20 6f 70 65 72 61 74 6f 72 2e 20 41 6e 64 20  L operator. And 
19350 6e 6f 6e 65 20 6f 66 20 74 68 65 20 73 69 6d 70  none of the simp
19360 6c 65 20 73 65 6c 65 63 74 20 71 75 65 72 69 65  le select querie
19370 73 0a 20 20 2a 2a 20 74 68 61 74 20 6d 61 6b 65  s.  ** that make
19380 20 75 70 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64   up the compound
19390 20 53 45 4c 45 43 54 20 61 72 65 20 61 6c 6c 6f   SELECT are allo
193a0 77 65 64 20 74 6f 20 62 65 20 61 67 67 72 65 67  wed to be aggreg
193b0 61 74 65 20 6f 72 20 64 69 73 74 69 6e 63 74 0a  ate or distinct.
193c0 20 20 2a 2a 20 71 75 65 72 69 65 73 2e 0a 20 20    ** queries..  
193d0 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70  */.  if( pSub->p
193e0 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 69 66 28  Prior ){.    if(
193f0 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20   pSub->pOrderBy 
19400 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
19410 30 3b 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69  0;  /* Restricti
19420 6f 6e 20 32 30 20 2a 2f 0a 20 20 20 20 7d 0a 20  on 20 */.    }. 
19430 20 20 20 69 66 28 20 69 73 41 67 67 20 7c 7c 20     if( isAgg || 
19440 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  (p->selFlags & S
19450 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30 20 7c  F_Distinct)!=0 |
19460 7c 20 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20  | pSrc->nSrc!=1 
19470 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
19480 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  0;.    }.    for
19490 28 70 53 75 62 31 3d 70 53 75 62 3b 20 70 53 75  (pSub1=pSub; pSu
194a0 62 31 3b 20 70 53 75 62 31 3d 70 53 75 62 31 2d  b1; pSub1=pSub1-
194b0 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 20 20  >pPrior){.      
194c0 74 65 73 74 63 61 73 65 28 20 28 70 53 75 62 31  testcase( (pSub1
194d0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46  ->selFlags & (SF
194e0 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67  _Distinct|SF_Agg
194f0 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 44 69 73  regate))==SF_Dis
19500 74 69 6e 63 74 20 29 3b 0a 20 20 20 20 20 20 74  tinct );.      t
19510 65 73 74 63 61 73 65 28 20 28 70 53 75 62 31 2d  estcase( (pSub1-
19520 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f  >selFlags & (SF_
19530 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72  Distinct|SF_Aggr
19540 65 67 61 74 65 29 29 3d 3d 53 46 5f 41 67 67 72  egate))==SF_Aggr
19550 65 67 61 74 65 20 29 3b 0a 20 20 20 20 20 20 61  egate );.      a
19560 73 73 65 72 74 28 20 70 53 75 62 2d 3e 70 53 72  ssert( pSub->pSr
19570 63 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  c!=0 );.      if
19580 28 20 28 70 53 75 62 31 2d 3e 73 65 6c 46 6c 61  ( (pSub1->selFla
19590 67 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63  gs & (SF_Distinc
195a0 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 29  t|SF_Aggregate))
195b0 21 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 28 70  !=0.       || (p
195c0 53 75 62 31 2d 3e 70 50 72 69 6f 72 20 26 26 20  Sub1->pPrior && 
195d0 70 53 75 62 31 2d 3e 6f 70 21 3d 54 4b 5f 41 4c  pSub1->op!=TK_AL
195e0 4c 29 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 53  L) .       || pS
195f0 75 62 31 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3c  ub1->pSrc->nSrc<
19600 31 0a 20 20 20 20 20 20 20 7c 7c 20 70 53 75 62  1.       || pSub
19610 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21  ->pEList->nExpr!
19620 3d 70 53 75 62 31 2d 3e 70 45 4c 69 73 74 2d 3e  =pSub1->pEList->
19630 6e 45 78 70 72 0a 20 20 20 20 20 20 29 7b 0a 20  nExpr.      ){. 
19640 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b         return 0;
19650 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 74  .      }.      t
19660 65 73 74 63 61 73 65 28 20 70 53 75 62 31 2d 3e  estcase( pSub1->
19670 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20 29 3b 0a  pSrc->nSrc>1 );.
19680 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65      }..    /* Re
19690 73 74 72 69 63 74 69 6f 6e 20 31 38 2e 20 2a 2f  striction 18. */
196a0 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 72 64  .    if( p->pOrd
196b0 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 69 6e  erBy ){.      in
196c0 74 20 69 69 3b 0a 20 20 20 20 20 20 66 6f 72 28  t ii;.      for(
196d0 69 69 3d 30 3b 20 69 69 3c 70 2d 3e 70 4f 72 64  ii=0; ii<p->pOrd
196e0 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 69 2b  erBy->nExpr; ii+
196f0 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
19700 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69  p->pOrderBy->a[i
19710 69 5d 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3d 3d  i].iOrderByCol==
19720 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
19730 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
19740 0a 20 20 2f 2a 2a 2a 2a 2a 20 49 66 20 77 65 20  .  /***** If we 
19750 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74  reach this point
19760 2c 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20  , flattening is 
19770 70 65 72 6d 69 74 74 65 64 2e 20 2a 2a 2a 2a 2a  permitted. *****
19780 2f 0a 0a 20 20 2f 2a 20 41 75 74 68 6f 72 69 7a  /..  /* Authoriz
19790 65 20 74 68 65 20 73 75 62 71 75 65 72 79 20 2a  e the subquery *
197a0 2f 0a 20 20 70 50 61 72 73 65 2d 3e 7a 41 75 74  /.  pParse->zAut
197b0 68 43 6f 6e 74 65 78 74 20 3d 20 70 53 75 62 69  hContext = pSubi
197c0 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 54 45  tem->zName;.  TE
197d0 53 54 4f 4e 4c 59 28 69 20 3d 29 20 73 71 6c 69  STONLY(i =) sqli
197e0 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
197f0 72 73 65 2c 20 53 51 4c 49 54 45 5f 53 45 4c 45  rse, SQLITE_SELE
19800 43 54 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  CT, 0, 0, 0);.  
19810 74 65 73 74 63 61 73 65 28 20 69 3d 3d 53 51 4c  testcase( i==SQL
19820 49 54 45 5f 44 45 4e 59 20 29 3b 0a 20 20 70 50  ITE_DENY );.  pP
19830 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65  arse->zAuthConte
19840 78 74 20 3d 20 7a 53 61 76 65 64 41 75 74 68 43  xt = zSavedAuthC
19850 6f 6e 74 65 78 74 3b 0a 0a 20 20 2f 2a 20 49 66  ontext;..  /* If
19860 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 69   the sub-query i
19870 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c  s a compound SEL
19880 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 74  ECT statement, t
19890 68 65 6e 20 28 62 79 20 72 65 73 74 72 69 63 74  hen (by restrict
198a0 69 6f 6e 73 0a 20 20 2a 2a 20 31 37 20 61 6e 64  ions.  ** 17 and
198b0 20 31 38 20 61 62 6f 76 65 29 20 69 74 20 6d 75   18 above) it mu
198c0 73 74 20 62 65 20 61 20 55 4e 49 4f 4e 20 41 4c  st be a UNION AL
198d0 4c 20 61 6e 64 20 74 68 65 20 70 61 72 65 6e 74  L and the parent
198e0 20 71 75 65 72 79 20 6d 75 73 74 20 0a 20 20 2a   query must .  *
198f0 2a 20 62 65 20 6f 66 20 74 68 65 20 66 6f 72 6d  * be of the form
19900 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
19910 53 45 4c 45 43 54 20 3c 65 78 70 72 2d 6c 69 73  SELECT <expr-lis
19920 74 3e 20 46 52 4f 4d 20 28 3c 73 75 62 2d 71 75  t> FROM (<sub-qu
19930 65 72 79 3e 29 20 3c 77 68 65 72 65 2d 63 6c 61  ery>) <where-cla
19940 75 73 65 3e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  use> .  **.  ** 
19950 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61 6e 79 20  followed by any 
19960 4f 52 44 45 52 20 42 59 2c 20 4c 49 4d 49 54 20  ORDER BY, LIMIT 
19970 61 6e 64 2f 6f 72 20 4f 46 46 53 45 54 20 63 6c  and/or OFFSET cl
19980 61 75 73 65 73 2e 20 54 68 69 73 20 62 6c 6f 63  auses. This bloc
19990 6b 0a 20 20 2a 2a 20 63 72 65 61 74 65 73 20 4e  k.  ** creates N
199a0 2d 31 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65  -1 copies of the
199b0 20 70 61 72 65 6e 74 20 71 75 65 72 79 20 77 69   parent query wi
199c0 74 68 6f 75 74 20 61 6e 79 20 4f 52 44 45 52 20  thout any ORDER 
199d0 42 59 2c 20 4c 49 4d 49 54 20 6f 72 20 0a 20 20  BY, LIMIT or .  
199e0 2a 2a 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65  ** OFFSET clause
199f0 73 20 61 6e 64 20 6a 6f 69 6e 73 20 74 68 65 6d  s and joins them
19a00 20 74 6f 20 74 68 65 20 6c 65 66 74 2d 68 61 6e   to the left-han
19a10 64 2d 73 69 64 65 20 6f 66 20 74 68 65 20 6f 72  d-side of the or
19a20 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 75 73 69 6e  iginal.  ** usin
19a30 67 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72  g UNION ALL oper
19a40 61 74 6f 72 73 2e 20 49 6e 20 74 68 69 73 20 63  ators. In this c
19a50 61 73 65 20 4e 20 69 73 20 74 68 65 20 6e 75 6d  ase N is the num
19a60 62 65 72 20 6f 66 20 73 69 6d 70 6c 65 0a 20 20  ber of simple.  
19a70 2a 2a 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d  ** select statem
19a80 65 6e 74 73 20 69 6e 20 74 68 65 20 63 6f 6d 70  ents in the comp
19a90 6f 75 6e 64 20 73 75 62 2d 71 75 65 72 79 2e 0a  ound sub-query..
19aa0 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 61 6d 70 6c    **.  ** Exampl
19ab0 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  e:.  **.  **    
19ac0 20 53 45 4c 45 43 54 20 61 2b 31 20 46 52 4f 4d   SELECT a+1 FROM
19ad0 20 28 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 53   (.  **        S
19ae0 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 61 62  ELECT x FROM tab
19af0 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 55 4e 49  .  **        UNI
19b00 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20  ON ALL.  **     
19b10 20 20 20 53 45 4c 45 43 54 20 79 20 46 52 4f 4d     SELECT y FROM
19b20 20 74 61 62 0a 20 20 2a 2a 20 20 20 20 20 20 20   tab.  **       
19b30 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20   UNION ALL.  ** 
19b40 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 61 62         SELECT ab
19b50 73 28 7a 2a 32 29 20 46 52 4f 4d 20 74 61 62 32  s(z*2) FROM tab2
19b60 0a 20 20 2a 2a 20 20 20 20 20 29 20 57 48 45 52  .  **     ) WHER
19b70 45 20 61 21 3d 35 20 4f 52 44 45 52 20 42 59 20  E a!=5 ORDER BY 
19b80 31 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 72 61 6e  1.  **.  ** Tran
19b90 73 66 6f 72 6d 65 64 20 69 6e 74 6f 3a 0a 20 20  sformed into:.  
19ba0 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45  **.  **     SELE
19bb0 43 54 20 78 2b 31 20 46 52 4f 4d 20 74 61 62 20  CT x+1 FROM tab 
19bc0 57 48 45 52 45 20 78 2b 31 21 3d 35 0a 20 20 2a  WHERE x+1!=5.  *
19bd0 2a 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a  *     UNION ALL.
19be0 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20    **     SELECT 
19bf0 79 2b 31 20 46 52 4f 4d 20 74 61 62 20 57 48 45  y+1 FROM tab WHE
19c00 52 45 20 79 2b 31 21 3d 35 0a 20 20 2a 2a 20 20  RE y+1!=5.  **  
19c10 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a     UNION ALL.  *
19c20 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61 62 73  *     SELECT abs
19c30 28 7a 2a 32 29 2b 31 20 46 52 4f 4d 20 74 61 62  (z*2)+1 FROM tab
19c40 32 20 57 48 45 52 45 20 61 62 73 28 7a 2a 32 29  2 WHERE abs(z*2)
19c50 2b 31 21 3d 35 0a 20 20 2a 2a 20 20 20 20 20 4f  +1!=5.  **     O
19c60 52 44 45 52 20 42 59 20 31 0a 20 20 2a 2a 0a 20  RDER BY 1.  **. 
19c70 20 2a 2a 20 57 65 20 63 61 6c 6c 20 74 68 69 73   ** We call this
19c80 20 74 68 65 20 22 63 6f 6d 70 6f 75 6e 64 2d 73   the "compound-s
19c90 75 62 71 75 65 72 79 20 66 6c 61 74 74 65 6e 69  ubquery flatteni
19ca0 6e 67 22 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ng"..  */.  for(
19cb0 70 53 75 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f  pSub=pSub->pPrio
19cc0 72 3b 20 70 53 75 62 3b 20 70 53 75 62 3d 70 53  r; pSub; pSub=pS
19cd0 75 62 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20  ub->pPrior){.   
19ce0 20 53 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20   Select *pNew;. 
19cf0 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72     ExprList *pOr
19d00 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65  derBy = p->pOrde
19d10 72 42 79 3b 0a 20 20 20 20 45 78 70 72 20 2a 70  rBy;.    Expr *p
19d20 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69  Limit = p->pLimi
19d30 74 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 4f 66  t;.    Expr *pOf
19d40 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65  fset = p->pOffse
19d50 74 3b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70  t;.    Select *p
19d60 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f  Prior = p->pPrio
19d70 72 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65 72  r;.    p->pOrder
19d80 42 79 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70  By = 0;.    p->p
19d90 53 72 63 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e  Src = 0;.    p->
19da0 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20  pPrior = 0;.    
19db0 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  p->pLimit = 0;. 
19dc0 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20     p->pOffset = 
19dd0 30 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71  0;.    pNew = sq
19de0 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64  lite3SelectDup(d
19df0 62 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20 70 2d  b, p, 0);.    p-
19e00 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f 66 66 73  >pOffset = pOffs
19e10 65 74 3b 0a 20 20 20 20 70 2d 3e 70 4c 69 6d 69  et;.    p->pLimi
19e20 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20  t = pLimit;.    
19e30 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f  p->pOrderBy = pO
19e40 72 64 65 72 42 79 3b 0a 20 20 20 20 70 2d 3e 70  rderBy;.    p->p
19e50 53 72 63 20 3d 20 70 53 72 63 3b 0a 20 20 20 20  Src = pSrc;.    
19e60 70 2d 3e 6f 70 20 3d 20 54 4b 5f 41 4c 4c 3b 0a  p->op = TK_ALL;.
19e70 20 20 20 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73      p->pRightmos
19e80 74 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70  t = 0;.    if( p
19e90 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  New==0 ){.      
19ea0 70 4e 65 77 20 3d 20 70 50 72 69 6f 72 3b 0a 20  pNew = pPrior;. 
19eb0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
19ec0 70 4e 65 77 2d 3e 70 50 72 69 6f 72 20 3d 20 70  pNew->pPrior = p
19ed0 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 4e 65  Prior;.      pNe
19ee0 77 2d 3e 70 52 69 67 68 74 6d 6f 73 74 20 3d 20  w->pRightmost = 
19ef0 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e  0;.    }.    p->
19f00 70 50 72 69 6f 72 20 3d 20 70 4e 65 77 3b 0a 20  pPrior = pNew;. 
19f10 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f     if( db->mallo
19f20 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
19f30 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65   1;.  }..  /* Be
19f40 67 69 6e 20 66 6c 61 74 74 65 6e 69 6e 67 20 74  gin flattening t
19f50 68 65 20 69 46 72 6f 6d 2d 74 68 20 65 6e 74 72  he iFrom-th entr
19f60 79 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  y of the FROM cl
19f70 61 75 73 65 20 0a 20 20 2a 2a 20 69 6e 20 74 68  ause .  ** in th
19f80 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20  e outer query.. 
19f90 20 2a 2f 0a 20 20 70 53 75 62 20 3d 20 70 53 75   */.  pSub = pSu
19fa0 62 31 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70  b1 = pSubitem->p
19fb0 53 65 6c 65 63 74 3b 0a 0a 20 20 2f 2a 20 44 65  Select;..  /* De
19fc0 6c 65 74 65 20 74 68 65 20 74 72 61 6e 73 69 65  lete the transie
19fd0 6e 74 20 74 61 62 6c 65 20 73 74 72 75 63 74 75  nt table structu
19fe0 72 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  re associated wi
19ff0 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 75 62 71  th the.  ** subq
1a000 75 65 72 79 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  uery.  */.  sqli
1a010 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 53  te3DbFree(db, pS
1a020 75 62 69 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73  ubitem->zDatabas
1a030 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  e);.  sqlite3DbF
1a040 72 65 65 28 64 62 2c 20 70 53 75 62 69 74 65 6d  ree(db, pSubitem
1a050 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69  ->zName);.  sqli
1a060 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 53  te3DbFree(db, pS
1a070 75 62 69 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b  ubitem->zAlias);
1a080 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a 44 61  .  pSubitem->zDa
1a090 74 61 62 61 73 65 20 3d 20 30 3b 0a 20 20 70 53  tabase = 0;.  pS
1a0a0 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20  ubitem->zName = 
1a0b0 30 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a  0;.  pSubitem->z
1a0c0 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20 70 53 75  Alias = 0;.  pSu
1a0d0 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 3d  bitem->pSelect =
1a0e0 20 30 3b 0a 0a 20 20 2f 2a 20 44 65 66 65 72 20   0;..  /* Defer 
1a0f0 64 65 6c 65 74 69 6e 67 20 74 68 65 20 54 61 62  deleting the Tab
1a100 6c 65 20 6f 62 6a 65 63 74 20 61 73 73 6f 63 69  le object associ
1a110 61 74 65 64 20 77 69 74 68 20 74 68 65 0a 20 20  ated with the.  
1a120 2a 2a 20 73 75 62 71 75 65 72 79 20 75 6e 74 69  ** subquery unti
1a130 6c 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6f  l code generatio
1a140 6e 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 70 6c 65  n is.  ** comple
1a150 74 65 2c 20 73 69 6e 63 65 20 74 68 65 72 65 20  te, since there 
1a160 6d 61 79 20 73 74 69 6c 6c 20 65 78 69 73 74 20  may still exist 
1a170 45 78 70 72 2e 70 54 61 62 20 65 6e 74 72 69 65  Expr.pTab entrie
1a180 73 20 74 68 61 74 0a 20 20 2a 2a 20 72 65 66 65  s that.  ** refe
1a190 72 20 74 6f 20 74 68 65 20 73 75 62 71 75 65 72  r to the subquer
1a1a0 79 20 65 76 65 6e 20 61 66 74 65 72 20 66 6c 61  y even after fla
1a1b0 74 74 65 6e 69 6e 67 2e 20 20 54 69 63 6b 65 74  ttening.  Ticket
1a1c0 20 23 33 33 34 36 2e 0a 20 20 2a 2a 0a 20 20 2a   #3346..  **.  *
1a1d0 2a 20 70 53 75 62 69 74 65 6d 2d 3e 70 54 61 62  * pSubitem->pTab
1a1e0 20 69 73 20 61 6c 77 61 79 73 20 6e 6f 6e 2d 4e   is always non-N
1a1f0 55 4c 4c 20 62 79 20 74 65 73 74 20 72 65 73 74  ULL by test rest
1a200 72 69 63 74 69 6f 6e 73 20 61 6e 64 20 74 65 73  rictions and tes
1a210 74 73 20 61 62 6f 76 65 2e 0a 20 20 2a 2f 0a 20  ts above..  */. 
1a220 20 69 66 28 20 41 4c 57 41 59 53 28 70 53 75 62   if( ALWAYS(pSub
1a230 69 74 65 6d 2d 3e 70 54 61 62 21 3d 30 29 20 29  item->pTab!=0) )
1a240 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  {.    Table *pTa
1a250 62 54 6f 44 65 6c 20 3d 20 70 53 75 62 69 74 65  bToDel = pSubite
1a260 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 66 28  m->pTab;.    if(
1a270 20 70 54 61 62 54 6f 44 65 6c 2d 3e 6e 52 65 66   pTabToDel->nRef
1a280 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 50 61 72  ==1 ){.      Par
1a290 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20  se *pToplevel = 
1a2a0 73 71 6c 69 74 65 33 50 61 72 73 65 54 6f 70 6c  sqlite3ParseTopl
1a2b0 65 76 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20  evel(pParse);.  
1a2c0 20 20 20 20 70 54 61 62 54 6f 44 65 6c 2d 3e 70      pTabToDel->p
1a2d0 4e 65 78 74 5a 6f 6d 62 69 65 20 3d 20 70 54 6f  NextZombie = pTo
1a2e0 70 6c 65 76 65 6c 2d 3e 70 5a 6f 6d 62 69 65 54  plevel->pZombieT
1a2f0 61 62 3b 0a 20 20 20 20 20 20 70 54 6f 70 6c 65  ab;.      pTople
1a300 76 65 6c 2d 3e 70 5a 6f 6d 62 69 65 54 61 62 20  vel->pZombieTab 
1a310 3d 20 70 54 61 62 54 6f 44 65 6c 3b 0a 20 20 20  = pTabToDel;.   
1a320 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 54   }else{.      pT
1a330 61 62 54 6f 44 65 6c 2d 3e 6e 52 65 66 2d 2d 3b  abToDel->nRef--;
1a340 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 75 62 69  .    }.    pSubi
1a350 74 65 6d 2d 3e 70 54 61 62 20 3d 20 30 3b 0a 20  tem->pTab = 0;. 
1a360 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c   }..  /* The fol
1a370 6c 6f 77 69 6e 67 20 6c 6f 6f 70 20 72 75 6e 73  lowing loop runs
1a380 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 74   once for each t
1a390 65 72 6d 20 69 6e 20 61 20 63 6f 6d 70 6f 75 6e  erm in a compoun
1a3a0 64 2d 73 75 62 71 75 65 72 79 0a 20 20 2a 2a 20  d-subquery.  ** 
1a3b0 66 6c 61 74 74 65 6e 69 6e 67 20 28 61 73 20 64  flattening (as d
1a3c0 65 73 63 72 69 62 65 64 20 61 62 6f 76 65 29 2e  escribed above).
1a3d0 20 20 49 66 20 77 65 20 61 72 65 20 64 6f 69 6e    If we are doin
1a3e0 67 20 61 20 64 69 66 66 65 72 65 6e 74 20 6b 69  g a different ki
1a3f0 6e 64 0a 20 20 2a 2a 20 6f 66 20 66 6c 61 74 74  nd.  ** of flatt
1a400 65 6e 69 6e 67 20 2d 20 61 20 66 6c 61 74 74 65  ening - a flatte
1a410 6e 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20  ning other than 
1a420 61 20 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75  a compound-subqu
1a430 65 72 79 20 66 6c 61 74 74 65 6e 69 6e 67 20 2d  ery flattening -
1a440 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68 69 73 20  .  ** then this 
1a450 6c 6f 6f 70 20 6f 6e 6c 79 20 72 75 6e 73 20 6f  loop only runs o
1a460 6e 63 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  nce..  **.  ** T
1a470 68 69 73 20 6c 6f 6f 70 20 6d 6f 76 65 73 20 61  his loop moves a
1a480 6c 6c 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 65  ll of the FROM e
1a490 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 73  lements of the s
1a4a0 75 62 71 75 65 72 79 20 69 6e 74 6f 20 74 68 65  ubquery into the
1a4b0 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63  .  ** the FROM c
1a4c0 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74  lause of the out
1a4d0 65 72 20 71 75 65 72 79 2e 20 20 42 65 66 6f 72  er query.  Befor
1a4e0 65 20 64 6f 69 6e 67 20 74 68 69 73 2c 20 72 65  e doing this, re
1a4f0 6d 65 6d 62 65 72 0a 20 20 2a 2a 20 74 68 65 20  member.  ** the 
1a500 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f  cursor number fo
1a510 72 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 6f  r the original o
1a520 75 74 65 72 20 71 75 65 72 79 20 46 52 4f 4d 20  uter query FROM 
1a530 65 6c 65 6d 65 6e 74 20 69 6e 0a 20 20 2a 2a 20  element in.  ** 
1a540 69 50 61 72 65 6e 74 2e 20 20 54 68 65 20 69 50  iParent.  The iP
1a550 61 72 65 6e 74 20 63 75 72 73 6f 72 20 77 69 6c  arent cursor wil
1a560 6c 20 6e 65 76 65 72 20 62 65 20 75 73 65 64 2e  l never be used.
1a570 20 20 53 75 62 73 65 71 75 65 6e 74 20 63 6f 64    Subsequent cod
1a580 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 73 63 61 6e  e.  ** will scan
1a590 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6c 6f 6f   expressions loo
1a5a0 6b 69 6e 67 20 66 6f 72 20 69 50 61 72 65 6e 74  king for iParent
1a5b0 20 72 65 66 65 72 65 6e 63 65 73 20 61 6e 64 20   references and 
1a5c0 72 65 70 6c 61 63 65 0a 20 20 2a 2a 20 74 68 6f  replace.  ** tho
1a5d0 73 65 20 72 65 66 65 72 65 6e 63 65 73 20 77 69  se references wi
1a5e0 74 68 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74  th expressions t
1a5f0 68 61 74 20 72 65 73 6f 6c 76 65 20 74 6f 20 74  hat resolve to t
1a600 68 65 20 73 75 62 71 75 65 72 79 20 46 52 4f 4d  he subquery FROM
1a610 0a 20 20 2a 2a 20 65 6c 65 6d 65 6e 74 73 20 77  .  ** elements w
1a620 65 20 61 72 65 20 6e 6f 77 20 63 6f 70 79 69 6e  e are now copyin
1a630 67 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  g in..  */.  for
1a640 28 70 50 61 72 65 6e 74 3d 70 3b 20 70 50 61 72  (pParent=p; pPar
1a650 65 6e 74 3b 20 70 50 61 72 65 6e 74 3d 70 50 61  ent; pParent=pPa
1a660 72 65 6e 74 2d 3e 70 50 72 69 6f 72 2c 20 70 53  rent->pPrior, pS
1a670 75 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72 29  ub=pSub->pPrior)
1a680 7b 0a 20 20 20 20 69 6e 74 20 6e 53 75 62 53 72  {.    int nSubSr
1a690 63 3b 0a 20 20 20 20 75 38 20 6a 6f 69 6e 74 79  c;.    u8 jointy
1a6a0 70 65 20 3d 20 30 3b 0a 20 20 20 20 70 53 75 62  pe = 0;.    pSub
1a6b0 53 72 63 20 3d 20 70 53 75 62 2d 3e 70 53 72 63  Src = pSub->pSrc
1a6c0 3b 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c  ;     /* FROM cl
1a6d0 61 75 73 65 20 6f 66 20 73 75 62 71 75 65 72 79  ause of subquery
1a6e0 20 2a 2f 0a 20 20 20 20 6e 53 75 62 53 72 63 20   */.    nSubSrc 
1a6f0 3d 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63 3b  = pSubSrc->nSrc;
1a700 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74    /* Number of t
1a710 65 72 6d 73 20 69 6e 20 73 75 62 71 75 65 72 79  erms in subquery
1a720 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a   FROM clause */.
1a730 20 20 20 20 70 53 72 63 20 3d 20 70 50 61 72 65      pSrc = pPare
1a740 6e 74 2d 3e 70 53 72 63 3b 20 20 20 20 20 2f 2a  nt->pSrc;     /*
1a750 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
1a760 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
1a770 2a 2f 0a 0a 20 20 20 20 69 66 28 20 70 53 72 63  */..    if( pSrc
1a780 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
1a790 28 20 70 50 61 72 65 6e 74 3d 3d 70 20 29 3b 20  ( pParent==p ); 
1a7a0 20 2f 2a 20 46 69 72 73 74 20 74 69 6d 65 20 74   /* First time t
1a7b0 68 72 6f 75 67 68 20 74 68 65 20 6c 6f 6f 70 20  hrough the loop 
1a7c0 2a 2f 0a 20 20 20 20 20 20 6a 6f 69 6e 74 79 70  */.      jointyp
1a7d0 65 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 6a 6f  e = pSubitem->jo
1a7e0 69 6e 74 79 70 65 3b 0a 20 20 20 20 7d 65 6c 73  intype;.    }els
1a7f0 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
1a800 20 70 50 61 72 65 6e 74 21 3d 70 20 29 3b 20 20   pParent!=p );  
1a810 2f 2a 20 32 6e 64 20 61 6e 64 20 73 75 62 73 65  /* 2nd and subse
1a820 71 75 65 6e 74 20 74 69 6d 65 73 20 74 68 72 6f  quent times thro
1a830 75 67 68 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a  ugh the loop */.
1a840 20 20 20 20 20 20 70 53 72 63 20 3d 20 70 50 61        pSrc = pPa
1a850 72 65 6e 74 2d 3e 70 53 72 63 20 3d 20 73 71 6c  rent->pSrc = sql
1a860 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e  ite3SrcListAppen
1a870 64 28 64 62 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  d(db, 0, 0, 0);.
1a880 20 20 20 20 20 20 69 66 28 20 70 53 72 63 3d 3d        if( pSrc==
1a890 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  0 ){.        ass
1a8a0 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ert( db->mallocF
1a8b0 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20  ailed );.       
1a8c0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
1a8d0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68      }..    /* Th
1a8e0 65 20 73 75 62 71 75 65 72 79 20 75 73 65 73 20  e subquery uses 
1a8f0 61 20 73 69 6e 67 6c 65 20 73 6c 6f 74 20 6f 66  a single slot of
1a900 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
1a910 20 6f 66 20 74 68 65 20 6f 75 74 65 72 0a 20 20   of the outer.  
1a920 20 20 2a 2a 20 71 75 65 72 79 2e 20 20 49 66 20    ** query.  If 
1a930 74 68 65 20 73 75 62 71 75 65 72 79 20 68 61 73  the subquery has
1a940 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 65   more than one e
1a950 6c 65 6d 65 6e 74 20 69 6e 20 69 74 73 20 46 52  lement in its FR
1a960 4f 4d 20 63 6c 61 75 73 65 2c 0a 20 20 20 20 2a  OM clause,.    *
1a970 2a 20 74 68 65 6e 20 65 78 70 61 6e 64 20 74 68  * then expand th
1a980 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 74 6f  e outer query to
1a990 20 6d 61 6b 65 20 73 70 61 63 65 20 66 6f 72 20   make space for 
1a9a0 69 74 20 74 6f 20 68 6f 6c 64 20 61 6c 6c 20 65  it to hold all e
1a9b0 6c 65 6d 65 6e 74 73 0a 20 20 20 20 2a 2a 20 6f  lements.    ** o
1a9c0 66 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a  f the subquery..
1a9d0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 78      **.    ** Ex
1a9e0 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20  ample:.    **.  
1a9f0 20 20 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a    **    SELECT *
1aa00 20 46 52 4f 4d 20 74 61 62 41 2c 20 28 53 45 4c   FROM tabA, (SEL
1aa10 45 43 54 20 2a 20 46 52 4f 4d 20 73 75 62 31 2c  ECT * FROM sub1,
1aa20 20 73 75 62 32 29 2c 20 74 61 62 42 3b 0a 20 20   sub2), tabB;.  
1aa30 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
1aa40 6f 75 74 65 72 20 71 75 65 72 79 20 68 61 73 20  outer query has 
1aa50 33 20 73 6c 6f 74 73 20 69 6e 20 69 74 73 20 46  3 slots in its F
1aa60 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 4f 6e 65  ROM clause.  One
1aa70 20 73 6c 6f 74 20 6f 66 20 74 68 65 0a 20 20 20   slot of the.   
1aa80 20 2a 2a 20 6f 75 74 65 72 20 71 75 65 72 79 20   ** outer query 
1aa90 28 74 68 65 20 6d 69 64 64 6c 65 20 73 6c 6f 74  (the middle slot
1aaa0 29 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65  ) is used by the
1aab0 20 73 75 62 71 75 65 72 79 2e 20 20 54 68 65 20   subquery.  The 
1aac0 6e 65 78 74 0a 20 20 20 20 2a 2a 20 62 6c 6f 63  next.    ** bloc
1aad0 6b 20 6f 66 20 63 6f 64 65 20 77 69 6c 6c 20 65  k of code will e
1aae0 78 70 61 6e 64 20 74 68 65 20 6f 75 74 20 71 75  xpand the out qu
1aaf0 65 72 79 20 74 6f 20 34 20 73 6c 6f 74 73 2e 20  ery to 4 slots. 
1ab00 20 54 68 65 20 6d 69 64 64 6c 65 0a 20 20 20 20   The middle.    
1ab10 2a 2a 20 73 6c 6f 74 20 69 73 20 65 78 70 61 6e  ** slot is expan
1ab20 64 65 64 20 74 6f 20 74 77 6f 20 73 6c 6f 74 73  ded to two slots
1ab30 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6d 61 6b   in order to mak
1ab40 65 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 0a  e space for the.
1ab50 20 20 20 20 2a 2a 20 74 77 6f 20 65 6c 65 6d 65      ** two eleme
1ab60 6e 74 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  nts in the FROM 
1ab70 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 73 75  clause of the su
1ab80 62 71 75 65 72 79 2e 0a 20 20 20 20 2a 2f 0a 20  bquery..    */. 
1ab90 20 20 20 69 66 28 20 6e 53 75 62 53 72 63 3e 31     if( nSubSrc>1
1aba0 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 65 6e   ){.      pParen
1abb0 74 2d 3e 70 53 72 63 20 3d 20 70 53 72 63 20 3d  t->pSrc = pSrc =
1abc0 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 45   sqlite3SrcListE
1abd0 6e 6c 61 72 67 65 28 64 62 2c 20 70 53 72 63 2c  nlarge(db, pSrc,
1abe0 20 6e 53 75 62 53 72 63 2d 31 2c 69 46 72 6f 6d   nSubSrc-1,iFrom
1abf0 2b 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64  +1);.      if( d
1ac00 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
1ac10 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  ){.        break
1ac20 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1ac30 0a 20 20 20 20 2f 2a 20 54 72 61 6e 73 66 65 72  .    /* Transfer
1ac40 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
1ac50 20 74 65 72 6d 73 20 66 72 6f 6d 20 74 68 65 20   terms from the 
1ac60 73 75 62 71 75 65 72 79 20 69 6e 74 6f 20 74 68  subquery into th
1ac70 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72 20 71  e.    ** outer q
1ac80 75 65 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  uery..    */.   
1ac90 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 75 62   for(i=0; i<nSub
1aca0 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Src; i++){.     
1acb0 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65   sqlite3IdListDe
1acc0 6c 65 74 65 28 64 62 2c 20 70 53 72 63 2d 3e 61  lete(db, pSrc->a
1acd0 5b 69 2b 69 46 72 6f 6d 5d 2e 70 55 73 69 6e 67  [i+iFrom].pUsing
1ace0 29 3b 0a 20 20 20 20 20 20 70 53 72 63 2d 3e 61  );.      pSrc->a
1acf0 5b 69 2b 69 46 72 6f 6d 5d 20 3d 20 70 53 75 62  [i+iFrom] = pSub
1ad00 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20  Src->a[i];.     
1ad10 20 6d 65 6d 73 65 74 28 26 70 53 75 62 53 72 63   memset(&pSubSrc
1ad20 2d 3e 61 5b 69 5d 2c 20 30 2c 20 73 69 7a 65 6f  ->a[i], 0, sizeo
1ad30 66 28 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 29  f(pSubSrc->a[i])
1ad40 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 72  );.    }.    pSr
1ad50 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 6a 6f 69 6e  c->a[iFrom].join
1ad60 74 79 70 65 20 3d 20 6a 6f 69 6e 74 79 70 65 3b  type = jointype;
1ad70 0a 20 20 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 62  .  .    /* Now b
1ad80 65 67 69 6e 20 73 75 62 73 74 69 74 75 74 69 6e  egin substitutin
1ad90 67 20 73 75 62 71 75 65 72 79 20 72 65 73 75 6c  g subquery resul
1ada0 74 20 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e  t set expression
1adb0 73 20 66 6f 72 20 0a 20 20 20 20 2a 2a 20 72 65  s for .    ** re
1adc0 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
1add0 69 50 61 72 65 6e 74 20 69 6e 20 74 68 65 20 6f  iParent in the o
1ade0 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20 20 20  uter query..    
1adf0 2a 2a 20 0a 20 20 20 20 2a 2a 20 45 78 61 6d 70  ** .    ** Examp
1ae00 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  le:.    **.    *
1ae10 2a 20 20 20 53 45 4c 45 43 54 20 61 2b 35 2c 20  *   SELECT a+5, 
1ae20 62 2a 31 30 20 46 52 4f 4d 20 28 53 45 4c 45 43  b*10 FROM (SELEC
1ae30 54 20 78 2a 33 20 41 53 20 61 2c 20 79 2b 31 30  T x*3 AS a, y+10
1ae40 20 41 53 20 62 20 46 52 4f 4d 20 74 31 29 20 57   AS b FROM t1) W
1ae50 48 45 52 45 20 61 3e 62 3b 0a 20 20 20 20 2a 2a  HERE a>b;.    **
1ae60 20 20 20 5c 20 20 20 20 20 20 20 20 20 20 20 20     \            
1ae70 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f           \______
1ae80 5f 5f 5f 5f 5f 5f 5f 20 73 75 62 71 75 65 72 79  _______ subquery
1ae90 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20   __________/    
1aea0 20 20 20 20 20 20 2f 0a 20 20 20 20 2a 2a 20 20        /.    **  
1aeb0 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f    \_____________
1aec0 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65 72 20 71  ________ outer q
1aed0 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  uery ___________
1aee0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
1aef0 5f 5f 5f 2f 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ___/.    **.    
1af00 2a 2a 20 57 65 20 6c 6f 6f 6b 20 61 74 20 65 76  ** We look at ev
1af10 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20 69  ery expression i
1af20 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  n the outer quer
1af30 79 20 61 6e 64 20 65 76 65 72 79 20 70 6c 61 63  y and every plac
1af40 65 20 77 65 20 73 65 65 0a 20 20 20 20 2a 2a 20  e we see.    ** 
1af50 22 61 22 20 77 65 20 73 75 62 73 74 69 74 75 74  "a" we substitut
1af60 65 20 22 78 2a 33 22 20 61 6e 64 20 65 76 65 72  e "x*3" and ever
1af70 79 20 70 6c 61 63 65 20 77 65 20 73 65 65 20 22  y place we see "
1af80 62 22 20 77 65 20 73 75 62 73 74 69 74 75 74 65  b" we substitute
1af90 20 22 79 2b 31 30 22 2e 0a 20 20 20 20 2a 2f 0a   "y+10"..    */.
1afa0 20 20 20 20 70 4c 69 73 74 20 3d 20 70 50 61 72      pList = pPar
1afb0 65 6e 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20  ent->pEList;.   
1afc0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73   for(i=0; i<pLis
1afd0 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
1afe0 20 20 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d        if( pList-
1aff0 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3d 3d 30 20 29  >a[i].zName==0 )
1b000 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  {.        char *
1b010 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44  zName = sqlite3D
1b020 62 53 74 72 44 75 70 28 64 62 2c 20 70 4c 69 73  bStrDup(db, pLis
1b030 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 29 3b 0a  t->a[i].zSpan);.
1b040 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
1b050 65 71 75 6f 74 65 28 7a 4e 61 6d 65 29 3b 0a 20  equote(zName);. 
1b060 20 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b         pList->a[
1b070 69 5d 2e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65  i].zName = zName
1b080 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1b090 20 20 20 20 73 75 62 73 74 45 78 70 72 4c 69 73      substExprLis
1b0a0 74 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70  t(db, pParent->p
1b0b0 45 4c 69 73 74 2c 20 69 50 61 72 65 6e 74 2c 20  EList, iParent, 
1b0c0 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  pSub->pEList);. 
1b0d0 20 20 20 69 66 28 20 69 73 41 67 67 20 29 7b 0a     if( isAgg ){.
1b0e0 20 20 20 20 20 20 73 75 62 73 74 45 78 70 72 4c        substExprL
1b0f0 69 73 74 28 64 62 2c 20 70 50 61 72 65 6e 74 2d  ist(db, pParent-
1b100 3e 70 47 72 6f 75 70 42 79 2c 20 69 50 61 72 65  >pGroupBy, iPare
1b110 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74  nt, pSub->pEList
1b120 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74  );.      pParent
1b130 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 75 62 73  ->pHaving = subs
1b140 74 45 78 70 72 28 64 62 2c 20 70 50 61 72 65 6e  tExpr(db, pParen
1b150 74 2d 3e 70 48 61 76 69 6e 67 2c 20 69 50 61 72  t->pHaving, iPar
1b160 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73  ent, pSub->pELis
1b170 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  t);.    }.    if
1b180 28 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79  ( pSub->pOrderBy
1b190 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
1b1a0 28 20 70 50 61 72 65 6e 74 2d 3e 70 4f 72 64 65  ( pParent->pOrde
1b1b0 72 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  rBy==0 );.      
1b1c0 70 50 61 72 65 6e 74 2d 3e 70 4f 72 64 65 72 42  pParent->pOrderB
1b1d0 79 20 3d 20 70 53 75 62 2d 3e 70 4f 72 64 65 72  y = pSub->pOrder
1b1e0 42 79 3b 0a 20 20 20 20 20 20 70 53 75 62 2d 3e  By;.      pSub->
1b1f0 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  pOrderBy = 0;.  
1b200 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 72    }else if( pPar
1b210 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b  ent->pOrderBy ){
1b220 0a 20 20 20 20 20 20 73 75 62 73 74 45 78 70 72  .      substExpr
1b230 4c 69 73 74 28 64 62 2c 20 70 50 61 72 65 6e 74  List(db, pParent
1b240 2d 3e 70 4f 72 64 65 72 42 79 2c 20 69 50 61 72  ->pOrderBy, iPar
1b250 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73  ent, pSub->pELis
1b260 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  t);.    }.    if
1b270 28 20 70 53 75 62 2d 3e 70 57 68 65 72 65 20 29  ( pSub->pWhere )
1b280 7b 0a 20 20 20 20 20 20 70 57 68 65 72 65 20 3d  {.      pWhere =
1b290 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
1b2a0 64 62 2c 20 70 53 75 62 2d 3e 70 57 68 65 72 65  db, pSub->pWhere
1b2b0 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , 0);.    }else{
1b2c0 0a 20 20 20 20 20 20 70 57 68 65 72 65 20 3d 20  .      pWhere = 
1b2d0 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  0;.    }.    if(
1b2e0 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20 29   subqueryIsAgg )
1b2f0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
1b300 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67  pParent->pHaving
1b310 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50 61  ==0 );.      pPa
1b320 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 20 3d 20  rent->pHaving = 
1b330 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 3b  pParent->pWhere;
1b340 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e  .      pParent->
1b350 70 57 68 65 72 65 20 3d 20 70 57 68 65 72 65 3b  pWhere = pWhere;
1b360 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e  .      pParent->
1b370 70 48 61 76 69 6e 67 20 3d 20 73 75 62 73 74 45  pHaving = substE
1b380 78 70 72 28 64 62 2c 20 70 50 61 72 65 6e 74 2d  xpr(db, pParent-
1b390 3e 70 48 61 76 69 6e 67 2c 20 69 50 61 72 65 6e  >pHaving, iParen
1b3a0 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29  t, pSub->pEList)
1b3b0 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d  ;.      pParent-
1b3c0 3e 70 48 61 76 69 6e 67 20 3d 20 73 71 6c 69 74  >pHaving = sqlit
1b3d0 65 33 45 78 70 72 41 6e 64 28 64 62 2c 20 70 50  e3ExprAnd(db, pP
1b3e0 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 2c 20  arent->pHaving, 
1b3f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1b400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b410 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 75     sqlite3ExprDu
1b420 70 28 64 62 2c 20 70 53 75 62 2d 3e 70 48 61 76  p(db, pSub->pHav
1b430 69 6e 67 2c 20 30 29 29 3b 0a 20 20 20 20 20 20  ing, 0));.      
1b440 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d  assert( pParent-
1b450 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b 0a  >pGroupBy==0 );.
1b460 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70        pParent->p
1b470 47 72 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65  GroupBy = sqlite
1b480 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c  3ExprListDup(db,
1b490 20 70 53 75 62 2d 3e 70 47 72 6f 75 70 42 79 2c   pSub->pGroupBy,
1b4a0 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   0);.    }else{.
1b4b0 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70        pParent->p
1b4c0 57 68 65 72 65 20 3d 20 73 75 62 73 74 45 78 70  Where = substExp
1b4d0 72 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70  r(db, pParent->p
1b4e0 57 68 65 72 65 2c 20 69 50 61 72 65 6e 74 2c 20  Where, iParent, 
1b4f0 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  pSub->pEList);. 
1b500 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 57       pParent->pW
1b510 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78  here = sqlite3Ex
1b520 70 72 41 6e 64 28 64 62 2c 20 70 50 61 72 65 6e  prAnd(db, pParen
1b530 74 2d 3e 70 57 68 65 72 65 2c 20 70 57 68 65 72  t->pWhere, pWher
1b540 65 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20  e);.    }.  .   
1b550 20 2f 2a 20 54 68 65 20 66 6c 61 74 74 65 6e 65   /* The flattene
1b560 64 20 71 75 65 72 79 20 69 73 20 64 69 73 74 69  d query is disti
1b570 6e 63 74 20 69 66 20 65 69 74 68 65 72 20 74 68  nct if either th
1b580 65 20 69 6e 6e 65 72 20 6f 72 20 74 68 65 0a 20  e inner or the. 
1b590 20 20 20 2a 2a 20 6f 75 74 65 72 20 71 75 65 72     ** outer quer
1b5a0 79 20 69 73 20 64 69 73 74 69 6e 63 74 2e 20 0a  y is distinct. .
1b5b0 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 72 65      */.    pPare
1b5c0 6e 74 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20  nt->selFlags |= 
1b5d0 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26  pSub->selFlags &
1b5e0 20 53 46 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20   SF_Distinct;.  
1b5f0 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 53  .    /*.    ** S
1b600 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 28  ELECT ... FROM (
1b610 53 45 4c 45 43 54 20 2e 2e 2e 20 4c 49 4d 49 54  SELECT ... LIMIT
1b620 20 61 20 4f 46 46 53 45 54 20 62 29 20 4c 49 4d   a OFFSET b) LIM
1b630 49 54 20 78 20 4f 46 46 53 45 54 20 79 3b 0a 20  IT x OFFSET y;. 
1b640 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f 6e 65     **.    ** One
1b650 20 69 73 20 74 65 6d 70 74 65 64 20 74 6f 20 74   is tempted to t
1b660 72 79 20 74 6f 20 61 64 64 20 61 20 61 6e 64 20  ry to add a and 
1b670 62 20 74 6f 20 63 6f 6d 62 69 6e 65 20 74 68 65  b to combine the
1b680 20 6c 69 6d 69 74 73 2e 20 20 42 75 74 20 74 68   limits.  But th
1b690 69 73 0a 20 20 20 20 2a 2a 20 64 6f 65 73 20 6e  is.    ** does n
1b6a0 6f 74 20 77 6f 72 6b 20 69 66 20 65 69 74 68 65  ot work if eithe
1b6b0 72 20 6c 69 6d 69 74 20 69 73 20 6e 65 67 61 74  r limit is negat
1b6c0 69 76 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ive..    */.    
1b6d0 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74  if( pSub->pLimit
1b6e0 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 65 6e   ){.      pParen
1b6f0 74 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 53 75 62  t->pLimit = pSub
1b700 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  ->pLimit;.      
1b710 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 3d 20 30  pSub->pLimit = 0
1b720 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
1b730 2a 20 46 69 6e 69 61 6c 6c 79 2c 20 64 65 6c 65  * Finially, dele
1b740 74 65 20 77 68 61 74 20 69 73 20 6c 65 66 74 20  te what is left 
1b750 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  of the subquery 
1b760 61 6e 64 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20  and return.  ** 
1b770 73 75 63 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20  success..  */.  
1b780 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
1b790 65 74 65 28 64 62 2c 20 70 53 75 62 31 29 3b 0a  ete(db, pSub1);.
1b7a0 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23  .  return 1;.}.#
1b7b0 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
1b7c0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  d(SQLITE_OMIT_SU
1b7d0 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69  BQUERY) || !defi
1b7e0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
1b7f0 56 49 45 57 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  VIEW) */../*.** 
1b800 42 61 73 65 64 20 6f 6e 20 74 68 65 20 63 6f 6e  Based on the con
1b810 74 65 6e 74 73 20 6f 66 20 74 68 65 20 41 67 67  tents of the Agg
1b820 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69  Info structure i
1b830 6e 64 69 63 61 74 65 64 20 62 79 20 74 68 65 20  ndicated by the 
1b840 66 69 72 73 74 0a 2a 2a 20 61 72 67 75 6d 65 6e  first.** argumen
1b850 74 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  t, this function
1b860 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 20 66   checks if the f
1b870 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75  ollowing are tru
1b880 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 74 68  e:.**.**    * th
1b890 65 20 71 75 65 72 79 20 63 6f 6e 74 61 69 6e 73  e query contains
1b8a0 20 6a 75 73 74 20 61 20 73 69 6e 67 6c 65 20 61   just a single a
1b8b0 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
1b8c0 6e 2c 0a 2a 2a 20 20 20 20 2a 20 74 68 65 20 61  n,.**    * the a
1b8d0 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
1b8e0 6e 20 69 73 20 65 69 74 68 65 72 20 6d 69 6e 28  n is either min(
1b8f0 29 20 6f 72 20 6d 61 78 28 29 2c 20 61 6e 64 0a  ) or max(), and.
1b900 2a 2a 20 20 20 20 2a 20 74 68 65 20 61 72 67 75  **    * the argu
1b910 6d 65 6e 74 20 74 6f 20 74 68 65 20 61 67 67 72  ment to the aggr
1b920 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 69  egate function i
1b930 73 20 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65  s a column value
1b940 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6c 6c 20 6f  ..**.** If all o
1b950 66 20 74 68 65 20 61 62 6f 76 65 20 61 72 65 20  f the above are 
1b960 74 72 75 65 2c 20 74 68 65 6e 20 57 48 45 52 45  true, then WHERE
1b970 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 20 6f 72 20  _ORDERBY_MIN or 
1b980 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 41  WHERE_ORDERBY_MA
1b990 58 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64  X.** is returned
1b9a0 20 61 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e   as appropriate.
1b9b0 20 41 6c 73 6f 2c 20 2a 70 70 4d 69 6e 4d 61 78   Also, *ppMinMax
1b9c0 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74   is set to point
1b9d0 20 74 6f 20 74 68 65 20 0a 2a 2a 20 6c 69 73 74   to the .** list
1b9e0 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 70 61   of arguments pa
1b9f0 73 73 65 64 20 74 6f 20 74 68 65 20 61 67 67 72  ssed to the aggr
1ba00 65 67 61 74 65 20 62 65 66 6f 72 65 20 72 65 74  egate before ret
1ba10 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 4f 72  urning..**.** Or
1ba20 2c 20 69 66 20 74 68 65 20 63 6f 6e 64 69 74 69  , if the conditi
1ba30 6f 6e 73 20 61 62 6f 76 65 20 61 72 65 20 6e 6f  ons above are no
1ba40 74 20 6d 65 74 2c 20 2a 70 70 4d 69 6e 4d 61 78  t met, *ppMinMax
1ba50 20 69 73 20 73 65 74 20 74 6f 20 30 20 61 6e 64   is set to 0 and
1ba60 0a 2a 2a 20 57 48 45 52 45 5f 4f 52 44 45 52 42  .** WHERE_ORDERB
1ba70 59 5f 4e 4f 52 4d 41 4c 20 69 73 20 72 65 74 75  Y_NORMAL is retu
1ba80 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
1ba90 75 38 20 6d 69 6e 4d 61 78 51 75 65 72 79 28 41  u8 minMaxQuery(A
1baa0 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f  ggInfo *pAggInfo
1bab0 2c 20 45 78 70 72 4c 69 73 74 20 2a 2a 70 70 4d  , ExprList **ppM
1bac0 69 6e 4d 61 78 29 7b 0a 20 20 69 6e 74 20 65 52  inMax){.  int eR
1bad0 65 74 20 3d 20 57 48 45 52 45 5f 4f 52 44 45 52  et = WHERE_ORDER
1bae0 42 59 5f 4e 4f 52 4d 41 4c 3b 20 20 20 20 20 20  BY_NORMAL;      
1baf0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61      /* Return va
1bb00 6c 75 65 20 2a 2f 0a 0a 20 20 2a 70 70 4d 69 6e  lue */..  *ppMin
1bb10 4d 61 78 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  Max = 0;.  if( p
1bb20 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3d 3d  AggInfo->nFunc==
1bb30 31 20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  1 ){.    Expr *p
1bb40 45 78 70 72 20 3d 20 70 41 67 67 49 6e 66 6f 2d  Expr = pAggInfo-
1bb50 3e 61 46 75 6e 63 5b 30 5d 2e 70 45 78 70 72 3b  >aFunc[0].pExpr;
1bb60 20 2f 2a 20 41 67 67 72 65 67 61 74 65 20 66 75   /* Aggregate fu
1bb70 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 45 78  nction */.    Ex
1bb80 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 3d  prList *pEList =
1bb90 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b   pExpr->x.pList;
1bba0 20 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e        /* Argumen
1bbb0 74 73 20 74 6f 20 61 67 67 20 66 75 6e 63 74 69  ts to agg functi
1bbc0 6f 6e 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72  on */..    asser
1bbd0 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  t( pExpr->op==TK
1bbe0 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 3b  _AGG_FUNCTION );
1bbf0 0a 20 20 20 20 69 66 28 20 70 45 4c 69 73 74 20  .    if( pEList 
1bc00 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  && pEList->nExpr
1bc10 3d 3d 31 20 26 26 20 70 45 4c 69 73 74 2d 3e 61  ==1 && pEList->a
1bc20 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  [0].pExpr->op==T
1bc30 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 7b 0a  K_AGG_COLUMN ){.
1bc40 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
1bc50 20 2a 7a 46 75 6e 63 20 3d 20 70 45 78 70 72 2d   *zFunc = pExpr-
1bc60 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20  >u.zToken;.     
1bc70 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
1bc80 43 6d 70 28 7a 46 75 6e 63 2c 20 22 6d 69 6e 22  Cmp(zFunc, "min"
1bc90 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
1bca0 65 52 65 74 20 3d 20 57 48 45 52 45 5f 4f 52 44  eRet = WHERE_ORD
1bcb0 45 52 42 59 5f 4d 49 4e 3b 0a 20 20 20 20 20 20  ERBY_MIN;.      
1bcc0 20 20 2a 70 70 4d 69 6e 4d 61 78 20 3d 20 70 45    *ppMinMax = pE
1bcd0 4c 69 73 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73  List;.      }els
1bce0 65 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72  e if( sqlite3Str
1bcf0 49 43 6d 70 28 7a 46 75 6e 63 2c 20 22 6d 61 78  ICmp(zFunc, "max
1bd00 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
1bd10 20 65 52 65 74 20 3d 20 57 48 45 52 45 5f 4f 52   eRet = WHERE_OR
1bd20 44 45 52 42 59 5f 4d 41 58 3b 0a 20 20 20 20 20  DERBY_MAX;.     
1bd30 20 20 20 2a 70 70 4d 69 6e 4d 61 78 20 3d 20 70     *ppMinMax = p
1bd40 45 4c 69 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20  EList;.      }. 
1bd50 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65     }.  }..  asse
1bd60 72 74 28 20 2a 70 70 4d 69 6e 4d 61 78 3d 3d 30  rt( *ppMinMax==0
1bd70 20 7c 7c 20 28 2a 70 70 4d 69 6e 4d 61 78 29 2d   || (*ppMinMax)-
1bd80 3e 6e 45 78 70 72 3d 3d 31 20 29 3b 0a 20 20 72  >nExpr==1 );.  r
1bd90 65 74 75 72 6e 20 65 52 65 74 3b 0a 7d 0a 0a 2f  eturn eRet;.}../
1bda0 2a 0a 2a 2a 20 54 68 65 20 73 65 6c 65 63 74 20  *.** The select 
1bdb0 73 74 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64  statement passed
1bdc0 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
1bdd0 67 75 6d 65 6e 74 20 69 73 20 61 6e 20 61 67 67  gument is an agg
1bde0 72 65 67 61 74 65 20 71 75 65 72 79 2e 0a 2a 2a  regate query..**
1bdf0 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 6d   The second argm
1be00 65 6e 74 20 69 73 20 74 68 65 20 61 73 73 6f 63  ent is the assoc
1be10 69 61 74 65 64 20 61 67 67 72 65 67 61 74 65 2d  iated aggregate-
1be20 69 6e 66 6f 20 6f 62 6a 65 63 74 2e 20 54 68 69  info object. Thi
1be30 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 74  s .** function t
1be40 65 73 74 73 20 69 66 20 74 68 65 20 53 45 4c 45  ests if the SELE
1be50 43 54 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72  CT is of the for
1be60 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43  m:.**.**   SELEC
1be70 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
1be80 3c 74 62 6c 3e 0a 2a 2a 0a 2a 2a 20 77 68 65 72  <tbl>.**.** wher
1be90 65 20 74 61 62 6c 65 20 69 73 20 61 20 64 61 74  e table is a dat
1bea0 61 62 61 73 65 20 74 61 62 6c 65 2c 20 6e 6f 74  abase table, not
1beb0 20 61 20 73 75 62 2d 73 65 6c 65 63 74 20 6f 72   a sub-select or
1bec0 20 76 69 65 77 2e 20 49 66 20 74 68 65 20 71 75   view. If the qu
1bed0 65 72 79 0a 2a 2a 20 64 6f 65 73 20 6d 61 74 63  ery.** does matc
1bee0 68 20 74 68 69 73 20 70 61 74 74 65 72 6e 2c 20  h this pattern, 
1bef0 74 68 65 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  then a pointer t
1bf00 6f 20 74 68 65 20 54 61 62 6c 65 20 6f 62 6a 65  o the Table obje
1bf10 63 74 20 72 65 70 72 65 73 65 6e 74 69 6e 67 0a  ct representing.
1bf20 2a 2a 20 3c 74 62 6c 3e 20 69 73 20 72 65 74 75  ** <tbl> is retu
1bf30 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  rned. Otherwise,
1bf40 20 30 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a   0 is returned..
1bf50 2a 2f 0a 73 74 61 74 69 63 20 54 61 62 6c 65 20  */.static Table 
1bf60 2a 69 73 53 69 6d 70 6c 65 43 6f 75 6e 74 28 53  *isSimpleCount(S
1bf70 65 6c 65 63 74 20 2a 70 2c 20 41 67 67 49 6e 66  elect *p, AggInf
1bf80 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20  o *pAggInfo){.  
1bf90 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 45  Table *pTab;.  E
1bfa0 78 70 72 20 2a 70 45 78 70 72 3b 0a 0a 20 20 61  xpr *pExpr;..  a
1bfb0 73 73 65 72 74 28 20 21 70 2d 3e 70 47 72 6f 75  ssert( !p->pGrou
1bfc0 70 42 79 20 29 3b 0a 0a 20 20 69 66 28 20 70 2d  pBy );..  if( p-
1bfd0 3e 70 57 68 65 72 65 20 7c 7c 20 70 2d 3e 70 45  >pWhere || p->pE
1bfe0 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 0a  List->nExpr!=1 .
1bff0 20 20 20 7c 7c 20 70 2d 3e 70 53 72 63 2d 3e 6e     || p->pSrc->n
1c000 53 72 63 21 3d 31 20 7c 7c 20 70 2d 3e 70 53 72  Src!=1 || p->pSr
1c010 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 0a  c->a[0].pSelect.
1c020 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
1c030 30 3b 0a 20 20 7d 0a 20 20 70 54 61 62 20 3d 20  0;.  }.  pTab = 
1c040 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54  p->pSrc->a[0].pT
1c050 61 62 3b 0a 20 20 70 45 78 70 72 20 3d 20 70 2d  ab;.  pExpr = p-
1c060 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  >pEList->a[0].pE
1c070 78 70 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70  xpr;.  assert( p
1c080 54 61 62 20 26 26 20 21 70 54 61 62 2d 3e 70 53  Tab && !pTab->pS
1c090 65 6c 65 63 74 20 26 26 20 70 45 78 70 72 20 29  elect && pExpr )
1c0a0 3b 0a 0a 20 20 69 66 28 20 49 73 56 69 72 74 75  ;..  if( IsVirtu
1c0b0 61 6c 28 70 54 61 62 29 20 29 20 72 65 74 75 72  al(pTab) ) retur
1c0c0 6e 20 30 3b 0a 20 20 69 66 28 20 70 45 78 70 72  n 0;.  if( pExpr
1c0d0 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 46 55 4e  ->op!=TK_AGG_FUN
1c0e0 43 54 49 4f 4e 20 29 20 72 65 74 75 72 6e 20 30  CTION ) return 0
1c0f0 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 41  ;.  if( NEVER(pA
1c100 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3d 3d 30  ggInfo->nFunc==0
1c110 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
1c120 69 66 28 20 28 70 41 67 67 49 6e 66 6f 2d 3e 61  if( (pAggInfo->a
1c130 46 75 6e 63 5b 30 5d 2e 70 46 75 6e 63 2d 3e 66  Func[0].pFunc->f
1c140 6c 61 67 73 26 53 51 4c 49 54 45 5f 46 55 4e 43  lags&SQLITE_FUNC
1c150 5f 43 4f 55 4e 54 29 3d 3d 30 20 29 20 72 65 74  _COUNT)==0 ) ret
1c160 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 45 78  urn 0;.  if( pEx
1c170 70 72 2d 3e 66 6c 61 67 73 26 45 50 5f 44 69 73  pr->flags&EP_Dis
1c180 74 69 6e 63 74 20 29 20 72 65 74 75 72 6e 20 30  tinct ) return 0
1c190 3b 0a 0a 20 20 72 65 74 75 72 6e 20 70 54 61 62  ;..  return pTab
1c1a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  ;.}../*.** If th
1c1b0 65 20 73 6f 75 72 63 65 2d 6c 69 73 74 20 69 74  e source-list it
1c1c0 65 6d 20 70 61 73 73 65 64 20 61 73 20 61 6e 20  em passed as an 
1c1d0 61 72 67 75 6d 65 6e 74 20 77 61 73 20 61 75 67  argument was aug
1c1e0 6d 65 6e 74 65 64 20 77 69 74 68 20 61 6e 0a 2a  mented with an.*
1c1f0 2a 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61  * INDEXED BY cla
1c200 75 73 65 2c 20 74 68 65 6e 20 74 72 79 20 74 6f  use, then try to
1c210 20 6c 6f 63 61 74 65 20 74 68 65 20 73 70 65 63   locate the spec
1c220 69 66 69 65 64 20 69 6e 64 65 78 2e 20 49 66 20  ified index. If 
1c230 74 68 65 72 65 0a 2a 2a 20 77 61 73 20 73 75 63  there.** was suc
1c240 68 20 61 20 63 6c 61 75 73 65 20 61 6e 64 20 74  h a clause and t
1c250 68 65 20 6e 61 6d 65 64 20 69 6e 64 65 78 20 63  he named index c
1c260 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2c 20  annot be found, 
1c270 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54  return .** SQLIT
1c280 45 5f 45 52 52 4f 52 20 61 6e 64 20 6c 65 61 76  E_ERROR and leav
1c290 65 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 70 50  e an error in pP
1c2a0 61 72 73 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  arse. Otherwise,
1c2b0 20 70 6f 70 75 6c 61 74 65 20 0a 2a 2a 20 70 46   populate .** pF
1c2c0 72 6f 6d 2d 3e 70 49 6e 64 65 78 20 61 6e 64 20  rom->pIndex and 
1c2d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1c2e0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1c2f0 49 6e 64 65 78 65 64 42 79 4c 6f 6f 6b 75 70 28  IndexedByLookup(
1c300 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 73  Parse *pParse, s
1c310 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
1c320 65 6d 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 69 66  em *pFrom){.  if
1c330 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 26 26  ( pFrom->pTab &&
1c340 20 70 46 72 6f 6d 2d 3e 7a 49 6e 64 65 78 20 29   pFrom->zIndex )
1c350 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  {.    Table *pTa
1c360 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b  b = pFrom->pTab;
1c370 0a 20 20 20 20 63 68 61 72 20 2a 7a 49 6e 64 65  .    char *zInde
1c380 78 20 3d 20 70 46 72 6f 6d 2d 3e 7a 49 6e 64 65  x = pFrom->zInde
1c390 78 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49  x;.    Index *pI
1c3a0 64 78 3b 0a 20 20 20 20 66 6f 72 28 70 49 64 78  dx;.    for(pIdx
1c3b0 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 0a  =pTab->pIndex; .
1c3c0 20 20 20 20 20 20 20 20 70 49 64 78 20 26 26 20          pIdx && 
1c3d0 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
1c3e0 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 49 6e 64  Idx->zName, zInd
1c3f0 65 78 29 3b 20 0a 20 20 20 20 20 20 20 20 70 49  ex); .        pI
1c400 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 0a 20  dx=pIdx->pNext. 
1c410 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 21 70     );.    if( !p
1c420 49 64 78 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  Idx ){.      sql
1c430 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
1c440 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 69 6e  rse, "no such in
1c450 64 65 78 3a 20 25 73 22 2c 20 7a 49 6e 64 65 78  dex: %s", zIndex
1c460 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61 72  , 0);.      pPar
1c470 73 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61 20  se->checkSchema 
1c480 3d 20 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72  = 1;.      retur
1c490 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
1c4a0 20 20 20 20 7d 0a 20 20 20 20 70 46 72 6f 6d 2d      }.    pFrom-
1c4b0 3e 70 49 6e 64 65 78 20 3d 20 70 49 64 78 3b 0a  >pIndex = pIdx;.
1c4c0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
1c4d0 49 54 45 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20  ITE_OK;.}./*.** 
1c4e0 44 65 74 65 63 74 20 63 6f 6d 70 6f 75 6e 64 20  Detect compound 
1c4f0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
1c500 73 20 74 68 61 74 20 75 73 65 20 61 6e 20 4f 52  s that use an OR
1c510 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 77 69  DER BY clause wi
1c520 74 68 20 0a 2a 2a 20 61 6e 20 61 6c 74 65 72 6e  th .** an altern
1c530 61 74 69 76 65 20 63 6f 6c 6c 61 74 69 6e 67 20  ative collating 
1c540 73 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20  sequence..**.** 
1c550 20 20 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52     SELECT ... FR
1c560 4f 4d 20 74 31 20 45 58 43 45 50 54 20 53 45 4c  OM t1 EXCEPT SEL
1c570 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 32 20  ECT ... FROM t2 
1c580 4f 52 44 45 52 20 42 59 20 2e 2e 20 43 4f 4c 4c  ORDER BY .. COLL
1c590 41 54 45 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 54 68  ATE ....**.** Th
1c5a0 65 73 65 20 61 72 65 20 72 65 77 72 69 74 74 65  ese are rewritte
1c5b0 6e 20 61 73 20 61 20 73 75 62 71 75 65 72 79 3a  n as a subquery:
1c5c0 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54  .**.**    SELECT
1c5d0 20 2a 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20   * FROM (SELECT 
1c5e0 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 45 58 43 45  ... FROM t1 EXCE
1c5f0 50 54 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52  PT SELECT ... FR
1c600 4f 4d 20 74 32 29 0a 2a 2a 20 20 20 20 20 4f 52  OM t2).**     OR
1c610 44 45 52 20 42 59 20 2e 2e 2e 20 43 4f 4c 4c 41  DER BY ... COLLA
1c620 54 45 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  TE ....**.** Thi
1c630 73 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e  s transformation
1c640 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 62 65   is necessary be
1c650 63 61 75 73 65 20 74 68 65 20 6d 75 6c 74 69 53  cause the multiS
1c660 65 6c 65 63 74 4f 72 64 65 72 42 79 28 29 20 72  electOrderBy() r
1c670 6f 75 74 69 6e 65 0a 2a 2a 20 61 62 6f 76 65 20  outine.** above 
1c680 74 68 61 74 20 67 65 6e 65 72 61 74 65 73 20 74  that generates t
1c690 68 65 20 63 6f 64 65 20 66 6f 72 20 61 20 63 6f  he code for a co
1c6a0 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 77 69  mpound SELECT wi
1c6b0 74 68 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  th an ORDER BY c
1c6c0 6c 61 75 73 65 0a 2a 2a 20 75 73 65 73 20 61 20  lause.** uses a 
1c6d0 6d 65 72 67 65 20 61 6c 67 6f 72 69 74 68 6d 20  merge algorithm 
1c6e0 74 68 61 74 20 72 65 71 75 69 72 65 73 20 74 68  that requires th
1c6f0 65 20 73 61 6d 65 20 63 6f 6c 6c 61 74 69 6e 67  e same collating
1c700 20 73 65 71 75 65 6e 63 65 20 6f 6e 20 74 68 65   sequence on the
1c710 0a 2a 2a 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d  .** result colum
1c720 6e 73 20 61 73 20 6f 6e 20 74 68 65 20 4f 52 44  ns as on the ORD
1c730 45 52 20 42 59 20 63 6c 61 75 73 65 2e 20 20 53  ER BY clause.  S
1c740 65 65 20 74 69 63 6b 65 74 0a 2a 2a 20 68 74 74  ee ticket.** htt
1c750 70 3a 2f 2f 77 77 77 2e 73 71 6c 69 74 65 2e 6f  p://www.sqlite.o
1c760 72 67 2f 73 72 63 2f 69 6e 66 6f 2f 36 37 30 39  rg/src/info/6709
1c770 35 37 34 64 32 61 0a 2a 2a 0a 2a 2a 20 54 68 69  574d2a.**.** Thi
1c780 73 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e  s transformation
1c790 20 69 73 20 6f 6e 6c 79 20 6e 65 65 64 65 64 20   is only needed 
1c7a0 66 6f 72 20 45 58 43 45 50 54 2c 20 49 4e 54 45  for EXCEPT, INTE
1c7b0 52 53 45 43 54 2c 20 61 6e 64 20 55 4e 49 4f 4e  RSECT, and UNION
1c7c0 2e 0a 2a 2a 20 54 68 65 20 55 4e 49 4f 4e 20 41  ..** The UNION A
1c7d0 4c 4c 20 6f 70 65 72 61 74 6f 72 20 77 6f 72 6b  LL operator work
1c7e0 73 20 66 69 6e 65 20 77 69 74 68 20 6d 75 6c 74  s fine with mult
1c7f0 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28 29  iSelectOrderBy()
1c800 20 65 76 65 6e 20 77 68 65 6e 0a 2a 2a 20 74 68   even when.** th
1c810 65 72 65 20 61 72 65 20 43 4f 4c 4c 41 54 45 20  ere are COLLATE 
1c820 74 65 72 6d 73 20 69 6e 20 74 68 65 20 4f 52 44  terms in the ORD
1c830 45 52 20 42 59 2e 0a 2a 2f 0a 73 74 61 74 69 63  ER BY..*/.static
1c840 20 69 6e 74 20 63 6f 6e 76 65 72 74 43 6f 6d 70   int convertComp
1c850 6f 75 6e 64 53 65 6c 65 63 74 54 6f 53 75 62 71  oundSelectToSubq
1c860 75 65 72 79 28 57 61 6c 6b 65 72 20 2a 70 57 61  uery(Walker *pWa
1c870 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 29  lker, Select *p)
1c880 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 53 65 6c  {.  int i;.  Sel
1c890 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20 53 65 6c  ect *pNew;.  Sel
1c8a0 65 63 74 20 2a 70 58 3b 0a 20 20 73 71 6c 69 74  ect *pX;.  sqlit
1c8b0 65 33 20 2a 64 62 3b 0a 20 20 73 74 72 75 63 74  e3 *db;.  struct
1c8c0 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
1c8d0 61 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 4e  a;.  SrcList *pN
1c8e0 65 77 53 72 63 3b 0a 20 20 50 61 72 73 65 20 2a  ewSrc;.  Parse *
1c8f0 70 50 61 72 73 65 3b 0a 20 20 54 6f 6b 65 6e 20  pParse;.  Token 
1c900 64 75 6d 6d 79 3b 0a 0a 20 20 69 66 28 20 70 2d  dummy;..  if( p-
1c910 3e 70 50 72 69 6f 72 3d 3d 30 20 29 20 72 65 74  >pPrior==0 ) ret
1c920 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
1c930 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65  ;.  if( p->pOrde
1c940 72 42 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  rBy==0 ) return 
1c950 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20  WRC_Continue;.  
1c960 66 6f 72 28 70 58 3d 70 3b 20 70 58 20 26 26 20  for(pX=p; pX && 
1c970 28 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20  (pX->op==TK_ALL 
1c980 7c 7c 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 53 45  || pX->op==TK_SE
1c990 4c 45 43 54 29 3b 20 70 58 3d 70 58 2d 3e 70 50  LECT); pX=pX->pP
1c9a0 72 69 6f 72 29 7b 7d 0a 20 20 69 66 28 20 70 58  rior){}.  if( pX
1c9b0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43  ==0 ) return WRC
1c9c0 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 61 20 3d  _Continue;.  a =
1c9d0 20 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 61 3b   p->pOrderBy->a;
1c9e0 0a 20 20 66 6f 72 28 69 3d 70 2d 3e 70 4f 72 64  .  for(i=p->pOrd
1c9f0 65 72 42 79 2d 3e 6e 45 78 70 72 2d 31 3b 20 69  erBy->nExpr-1; i
1ca00 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69  >=0; i--){.    i
1ca10 66 28 20 61 5b 69 5d 2e 70 45 78 70 72 2d 3e 66  f( a[i].pExpr->f
1ca20 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74  lags & EP_Collat
1ca30 65 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20  e ) break;.  }. 
1ca40 20 69 66 28 20 69 3c 30 20 29 20 72 65 74 75 72   if( i<0 ) retur
1ca50 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
1ca60 0a 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63  .  /* If we reac
1ca70 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68  h this point, th
1ca80 61 74 20 6d 65 61 6e 73 20 74 68 65 20 74 72 61  at means the tra
1ca90 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 72  nsformation is r
1caa0 65 71 75 69 72 65 64 2e 20 2a 2f 0a 0a 20 20 70  equired. */..  p
1cab0 50 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d  Parse = pWalker-
1cac0 3e 70 50 61 72 73 65 3b 0a 20 20 64 62 20 3d 20  >pParse;.  db = 
1cad0 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 4e  pParse->db;.  pN
1cae0 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ew = sqlite3DbMa
1caf0 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
1cb00 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20  eof(*pNew) );.  
1cb10 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65  if( pNew==0 ) re
1cb20 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
1cb30 20 20 6d 65 6d 73 65 74 28 26 64 75 6d 6d 79 2c    memset(&dummy,
1cb40 20 30 2c 20 73 69 7a 65 6f 66 28 64 75 6d 6d 79   0, sizeof(dummy
1cb50 29 29 3b 0a 20 20 70 4e 65 77 53 72 63 20 3d 20  ));.  pNewSrc = 
1cb60 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70  sqlite3SrcListAp
1cb70 70 65 6e 64 46 72 6f 6d 54 65 72 6d 28 70 50 61  pendFromTerm(pPa
1cb80 72 73 65 2c 30 2c 30 2c 30 2c 26 64 75 6d 6d 79  rse,0,0,0,&dummy
1cb90 2c 70 4e 65 77 2c 30 2c 30 29 3b 0a 20 20 69 66  ,pNew,0,0);.  if
1cba0 28 20 70 4e 65 77 53 72 63 3d 3d 30 20 29 20 72  ( pNewSrc==0 ) r
1cbb0 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
1cbc0 0a 20 20 2a 70 4e 65 77 20 3d 20 2a 70 3b 0a 20  .  *pNew = *p;. 
1cbd0 20 70 2d 3e 70 53 72 63 20 3d 20 70 4e 65 77 53   p->pSrc = pNewS
1cbe0 72 63 3b 0a 20 20 70 2d 3e 70 45 4c 69 73 74 20  rc;.  p->pEList 
1cbf0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
1cc00 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20  tAppend(pParse, 
1cc10 30 2c 20 73 71 6c 69 74 65 33 45 78 70 72 28 64  0, sqlite3Expr(d
1cc20 62 2c 20 54 4b 5f 41 4c 4c 2c 20 30 29 29 3b 0a  b, TK_ALL, 0));.
1cc30 20 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f 53 45 4c    p->op = TK_SEL
1cc40 45 43 54 3b 0a 20 20 70 2d 3e 70 57 68 65 72 65  ECT;.  p->pWhere
1cc50 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 47   = 0;.  pNew->pG
1cc60 72 6f 75 70 42 79 20 3d 20 30 3b 0a 20 20 70 4e  roupBy = 0;.  pN
1cc70 65 77 2d 3e 70 48 61 76 69 6e 67 20 3d 20 30 3b  ew->pHaving = 0;
1cc80 0a 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42  .  pNew->pOrderB
1cc90 79 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 50 72 69  y = 0;.  p->pPri
1cca0 6f 72 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  or = 0;.  pNew->
1ccb0 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 70 4e  pLimit = 0;.  pN
1ccc0 65 77 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b  ew->pOffset = 0;
1ccd0 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f  .  return WRC_Co
1cce0 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ntinue;.}../*.**
1ccf0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
1cd00 20 61 20 57 61 6c 6b 65 72 20 63 61 6c 6c 62 61   a Walker callba
1cd10 63 6b 20 66 6f 72 20 22 65 78 70 61 6e 64 69 6e  ck for "expandin
1cd20 67 22 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  g" a SELECT stat
1cd30 65 6d 65 6e 74 2e 0a 2a 2a 20 22 45 78 70 61 6e  ement..** "Expan
1cd40 64 69 6e 67 22 20 6d 65 61 6e 73 20 74 6f 20 64  ding" means to d
1cd50 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  o the following:
1cd60 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20 4d  .**.**    (1)  M
1cd70 61 6b 65 20 73 75 72 65 20 56 44 42 45 20 63 75  ake sure VDBE cu
1cd80 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 68 61 76  rsor numbers hav
1cd90 65 20 62 65 65 6e 20 61 73 73 69 67 6e 65 64 20  e been assigned 
1cda0 74 6f 20 65 76 65 72 79 0a 2a 2a 20 20 20 20 20  to every.**     
1cdb0 20 20 20 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74      element of t
1cdc0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a  he FROM clause..
1cdd0 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20 46 69  **.**    (2)  Fi
1cde0 6c 6c 20 69 6e 20 74 68 65 20 70 54 61 62 4c 69  ll in the pTabLi
1cdf0 73 74 2d 3e 61 5b 5d 2e 70 54 61 62 20 66 69 65  st->a[].pTab fie
1ce00 6c 64 73 20 69 6e 20 74 68 65 20 53 72 63 4c 69  lds in the SrcLi
1ce10 73 74 20 74 68 61 74 20 0a 2a 2a 20 20 20 20 20  st that .**     
1ce20 20 20 20 20 64 65 66 69 6e 65 73 20 46 52 4f 4d      defines FROM
1ce30 20 63 6c 61 75 73 65 2e 20 20 57 68 65 6e 20 76   clause.  When v
1ce40 69 65 77 73 20 61 70 70 65 61 72 20 69 6e 20 74  iews appear in t
1ce50 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c 0a  he FROM clause,.
1ce60 2a 2a 20 20 20 20 20 20 20 20 20 66 69 6c 6c 20  **         fill 
1ce70 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70 53  pTabList->a[].pS
1ce80 65 6c 65 63 74 20 77 69 74 68 20 61 20 63 6f 70  elect with a cop
1ce90 79 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20  y of the SELECT 
1cea0 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20  statement.**    
1ceb0 20 20 20 20 20 74 68 61 74 20 69 6d 70 6c 65 6d       that implem
1cec0 65 6e 74 73 20 74 68 65 20 76 69 65 77 2e 20 20  ents the view.  
1ced0 41 20 63 6f 70 79 20 69 73 20 6d 61 64 65 20 6f  A copy is made o
1cee0 66 20 74 68 65 20 76 69 65 77 27 73 20 53 45 4c  f the view's SEL
1cef0 45 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 20 73  ECT.**         s
1cf00 74 61 74 65 6d 65 6e 74 20 73 6f 20 74 68 61 74  tatement so that
1cf10 20 77 65 20 63 61 6e 20 66 72 65 65 6c 79 20 6d   we can freely m
1cf20 6f 64 69 66 79 20 6f 72 20 64 65 6c 65 74 65 20  odify or delete 
1cf30 74 68 61 74 20 73 74 61 74 65 6d 65 6e 74 0a 2a  that statement.*
1cf40 2a 20 20 20 20 20 20 20 20 20 77 69 74 68 6f 75  *         withou
1cf50 74 20 77 6f 72 72 79 69 6e 67 20 61 62 6f 75 74  t worrying about
1cf60 20 6d 65 73 73 69 6e 67 20 75 70 20 74 68 65 20   messing up the 
1cf70 70 72 65 73 69 73 74 65 6e 74 20 72 65 70 72 65  presistent repre
1cf80 73 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 20 20 20  sentation.**    
1cf90 20 20 20 20 20 6f 66 20 74 68 65 20 76 69 65 77       of the view
1cfa0 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 33 29 20 20  ..**.**    (3)  
1cfb0 41 64 64 20 74 65 72 6d 73 20 74 6f 20 74 68 65  Add terms to the
1cfc0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f   WHERE clause to
1cfd0 20 61 63 63 6f 6d 6f 64 61 74 65 20 74 68 65 20   accomodate the 
1cfe0 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 0a  NATURAL keyword.
1cff0 2a 2a 20 20 20 20 20 20 20 20 20 6f 6e 20 6a 6f  **         on jo
1d000 69 6e 73 20 61 6e 64 20 74 68 65 20 4f 4e 20 61  ins and the ON a
1d010 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20  nd USING clause 
1d020 6f 66 20 6a 6f 69 6e 73 2e 0a 2a 2a 0a 2a 2a 20  of joins..**.** 
1d030 20 20 20 28 34 29 20 20 53 63 61 6e 20 74 68 65     (4)  Scan the
1d040 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73   list of columns
1d050 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
1d060 65 74 20 28 70 45 4c 69 73 74 29 20 6c 6f 6f 6b  et (pEList) look
1d070 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 66  ing.**         f
1d080 6f 72 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20  or instances of 
1d090 74 68 65 20 22 2a 22 20 6f 70 65 72 61 74 6f 72  the "*" operator
1d0a0 20 6f 72 20 74 68 65 20 54 41 42 4c 45 2e 2a 20   or the TABLE.* 
1d0b0 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 20 20 20 20  operator..**    
1d0c0 20 20 20 20 20 49 66 20 66 6f 75 6e 64 2c 20 65       If found, e
1d0d0 78 70 61 6e 64 20 65 61 63 68 20 22 2a 22 20 74  xpand each "*" t
1d0e0 6f 20 62 65 20 65 76 65 72 79 20 63 6f 6c 75 6d  o be every colum
1d0f0 6e 20 69 6e 20 65 76 65 72 79 20 74 61 62 6c 65  n in every table
1d100 0a 2a 2a 20 20 20 20 20 20 20 20 20 61 6e 64 20  .**         and 
1d110 54 41 42 4c 45 2e 2a 20 74 6f 20 62 65 20 65 76  TABLE.* to be ev
1d120 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 54 41  ery column in TA
1d130 42 4c 45 2e 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69  BLE..**.*/.stati
1d140 63 20 69 6e 74 20 73 65 6c 65 63 74 45 78 70 61  c int selectExpa
1d150 6e 64 65 72 28 57 61 6c 6b 65 72 20 2a 70 57 61  nder(Walker *pWa
1d160 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 29  lker, Select *p)
1d170 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  {.  Parse *pPars
1d180 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61  e = pWalker->pPa
1d190 72 73 65 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c  rse;.  int i, j,
1d1a0 20 6b 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   k;.  SrcList *p
1d1b0 54 61 62 4c 69 73 74 3b 0a 20 20 45 78 70 72 4c  TabList;.  ExprL
1d1c0 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 73  ist *pEList;.  s
1d1d0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
1d1e0 65 6d 20 2a 70 46 72 6f 6d 3b 0a 20 20 73 71 6c  em *pFrom;.  sql
1d1f0 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
1d200 65 2d 3e 64 62 3b 0a 20 20 45 78 70 72 20 2a 70  e->db;.  Expr *p
1d210 45 2c 20 2a 70 52 69 67 68 74 2c 20 2a 70 45 78  E, *pRight, *pEx
1d220 70 72 3b 0a 20 20 75 31 36 20 73 65 6c 46 6c 61  pr;.  u16 selFla
1d230 67 73 20 3d 20 70 2d 3e 73 65 6c 46 6c 61 67 73  gs = p->selFlags
1d240 3b 0a 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73  ;..  p->selFlags
1d250 20 7c 3d 20 53 46 5f 45 78 70 61 6e 64 65 64 3b   |= SF_Expanded;
1d260 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
1d270 63 46 61 69 6c 65 64 20 20 29 7b 0a 20 20 20 20  cFailed  ){.    
1d280 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
1d290 3b 0a 20 20 7d 0a 20 20 69 66 28 20 4e 45 56 45  ;.  }.  if( NEVE
1d2a0 52 28 70 2d 3e 70 53 72 63 3d 3d 30 29 20 7c 7c  R(p->pSrc==0) ||
1d2b0 20 28 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f   (selFlags & SF_
1d2c0 45 78 70 61 6e 64 65 64 29 21 3d 30 20 29 7b 0a  Expanded)!=0 ){.
1d2d0 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50      return WRC_P
1d2e0 72 75 6e 65 3b 0a 20 20 7d 0a 20 20 70 54 61 62  rune;.  }.  pTab
1d2f0 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  List = p->pSrc;.
1d300 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45    pEList = p->pE
1d310 4c 69 73 74 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65  List;..  /* Make
1d320 20 73 75 72 65 20 63 75 72 73 6f 72 20 6e 75 6d   sure cursor num
1d330 62 65 72 73 20 68 61 76 65 20 62 65 65 6e 20 61  bers have been a
1d340 73 73 69 67 6e 65 64 20 74 6f 20 61 6c 6c 20 65  ssigned to all e
1d350 6e 74 72 69 65 73 20 69 6e 0a 20 20 2a 2a 20 74  ntries in.  ** t
1d360 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
1d370 66 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  f the SELECT sta
1d380 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 73  tement..  */.  s
1d390 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73 73  qlite3SrcListAss
1d3a0 69 67 6e 43 75 72 73 6f 72 73 28 70 50 61 72 73  ignCursors(pPars
1d3b0 65 2c 20 70 54 61 62 4c 69 73 74 29 3b 0a 0a 20  e, pTabList);.. 
1d3c0 20 2f 2a 20 4c 6f 6f 6b 20 75 70 20 65 76 65 72   /* Look up ever
1d3d0 79 20 74 61 62 6c 65 20 6e 61 6d 65 64 20 69 6e  y table named in
1d3e0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
1d3f0 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2e 20   of the select. 
1d400 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65 6e 74 72   If.  ** an entr
1d410 79 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  y of the FROM cl
1d420 61 75 73 65 20 69 73 20 61 20 73 75 62 71 75 65  ause is a subque
1d430 72 79 20 69 6e 73 74 65 61 64 20 6f 66 20 61 20  ry instead of a 
1d440 74 61 62 6c 65 20 6f 72 20 76 69 65 77 2c 0a 20  table or view,. 
1d450 20 2a 2a 20 74 68 65 6e 20 63 72 65 61 74 65 20   ** then create 
1d460 61 20 74 72 61 6e 73 69 65 6e 74 20 74 61 62 6c  a transient tabl
1d470 65 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 64  e structure to d
1d480 65 73 63 72 69 62 65 20 74 68 65 20 73 75 62 71  escribe the subq
1d490 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  uery..  */.  for
1d4a0 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62  (i=0, pFrom=pTab
1d4b0 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c  List->a; i<pTabL
1d4c0 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20  ist->nSrc; i++, 
1d4d0 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 54 61  pFrom++){.    Ta
1d4e0 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 69  ble *pTab;.    i
1d4f0 66 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 21 3d  f( pFrom->pTab!=
1d500 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  0 ){.      /* Th
1d510 69 73 20 73 74 61 74 65 6d 65 6e 74 20 68 61 73  is statement has
1d520 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 70 72   already been pr
1d530 65 70 61 72 65 64 2e 20 20 54 68 65 72 65 20 69  epared.  There i
1d540 73 20 6e 6f 20 6e 65 65 64 0a 20 20 20 20 20 20  s no need.      
1d550 2a 2a 20 74 6f 20 67 6f 20 66 75 72 74 68 65 72  ** to go further
1d560 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  . */.      asser
1d570 74 28 20 69 3d 3d 30 20 29 3b 0a 20 20 20 20 20  t( i==0 );.     
1d580 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e   return WRC_Prun
1d590 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  e;.    }.    if(
1d5a0 20 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30   pFrom->zName==0
1d5b0 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   ){.#ifndef SQLI
1d5c0 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
1d5d0 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70  .      Select *p
1d5e0 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65  Sel = pFrom->pSe
1d5f0 6c 65 63 74 3b 0a 20 20 20 20 20 20 2f 2a 20 41  lect;.      /* A
1d600 20 73 75 62 2d 71 75 65 72 79 20 69 6e 20 74 68   sub-query in th
1d610 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
1d620 20 61 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20   a SELECT */.   
1d630 20 20 20 61 73 73 65 72 74 28 20 70 53 65 6c 21     assert( pSel!
1d640 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  =0 );.      asse
1d650 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d  rt( pFrom->pTab=
1d660 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =0 );.      sqli
1d670 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57  te3WalkSelect(pW
1d680 61 6c 6b 65 72 2c 20 70 53 65 6c 29 3b 0a 20 20  alker, pSel);.  
1d690 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20      pFrom->pTab 
1d6a0 3d 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33  = pTab = sqlite3
1d6b0 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
1d6c0 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 29 3b   sizeof(Table));
1d6d0 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62 3d  .      if( pTab=
1d6e0 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f  =0 ) return WRC_
1d6f0 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 70 54 61  Abort;.      pTa
1d700 62 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20  b->nRef = 1;.   
1d710 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d     pTab->zName =
1d720 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
1d730 64 62 2c 20 22 73 71 6c 69 74 65 5f 73 75 62 71  db, "sqlite_subq
1d740 75 65 72 79 5f 25 70 5f 22 2c 20 28 76 6f 69 64  uery_%p_", (void
1d750 2a 29 70 54 61 62 29 3b 0a 20 20 20 20 20 20 77  *)pTab);.      w
1d760 68 69 6c 65 28 20 70 53 65 6c 2d 3e 70 50 72 69  hile( pSel->pPri
1d770 6f 72 20 29 7b 20 70 53 65 6c 20 3d 20 70 53 65  or ){ pSel = pSe
1d780 6c 2d 3e 70 50 72 69 6f 72 3b 20 7d 0a 20 20 20  l->pPrior; }.   
1d790 20 20 20 73 65 6c 65 63 74 43 6f 6c 75 6d 6e 73     selectColumns
1d7a0 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61  FromExprList(pPa
1d7b0 72 73 65 2c 20 70 53 65 6c 2d 3e 70 45 4c 69 73  rse, pSel->pELis
1d7c0 74 2c 20 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20  t, &pTab->nCol, 
1d7d0 26 70 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20 20  &pTab->aCol);.  
1d7e0 20 20 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20      pTab->iPKey 
1d7f0 3d 20 2d 31 3b 0a 20 20 20 20 20 20 70 54 61 62  = -1;.      pTab
1d800 2d 3e 6e 52 6f 77 45 73 74 20 3d 20 31 30 30 30  ->nRowEst = 1000
1d810 30 30 30 3b 0a 20 20 20 20 20 20 70 54 61 62 2d  000;.      pTab-
1d820 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f  >tabFlags |= TF_
1d830 45 70 68 65 6d 65 72 61 6c 3b 0a 23 65 6e 64 69  Ephemeral;.#endi
1d840 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  f.    }else{.   
1d850 20 20 20 2f 2a 20 41 6e 20 6f 72 64 69 6e 61 72     /* An ordinar
1d860 79 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20  y table or view 
1d870 6e 61 6d 65 20 69 6e 20 74 68 65 20 46 52 4f 4d  name in the FROM
1d880 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20   clause */.     
1d890 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e   assert( pFrom->
1d8a0 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20  pTab==0 );.     
1d8b0 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70   pFrom->pTab = p
1d8c0 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63  Tab = sqlite3Loc
1d8d0 61 74 65 54 61 62 6c 65 49 74 65 6d 28 70 50 61  ateTableItem(pPa
1d8e0 72 73 65 2c 20 30 2c 20 70 46 72 6f 6d 29 3b 0a  rse, 0, pFrom);.
1d8f0 20 20 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d        if( pTab==
1d900 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41  0 ) return WRC_A
1d910 62 6f 72 74 3b 0a 20 20 20 20 20 20 69 66 28 20  bort;.      if( 
1d920 70 54 61 62 2d 3e 6e 52 65 66 3d 3d 30 78 66 66  pTab->nRef==0xff
1d930 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ff ){.        sq
1d940 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
1d950 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20  arse, "too many 
1d960 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 5c 22  references to \"
1d970 25 73 5c 22 3a 20 6d 61 78 20 36 35 35 33 35 22  %s\": max 65535"
1d980 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 54 61  ,.           pTa
1d990 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  b->zName);.     
1d9a0 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d     pFrom->pTab =
1d9b0 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   0;.        retu
1d9c0 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
1d9d0 20 20 20 20 7d 0a 20 20 20 20 20 20 70 54 61 62      }.      pTab
1d9e0 2d 3e 6e 52 65 66 2b 2b 3b 0a 23 69 66 20 21 64  ->nRef++;.#if !d
1d9f0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
1da00 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66  IT_VIEW) || !def
1da10 69 6e 65 64 20 28 53 51 4c 49 54 45 5f 4f 4d 49  ined (SQLITE_OMI
1da20 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 0a  T_VIRTUALTABLE).
1da30 20 20 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e        if( pTab->
1da40 70 53 65 6c 65 63 74 20 7c 7c 20 49 73 56 69 72  pSelect || IsVir
1da50 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20  tual(pTab) ){.  
1da60 20 20 20 20 20 20 2f 2a 20 57 65 20 72 65 61 63        /* We reac
1da70 68 20 68 65 72 65 20 69 66 20 74 68 65 20 6e 61  h here if the na
1da80 6d 65 64 20 74 61 62 6c 65 20 69 73 20 61 20 72  med table is a r
1da90 65 61 6c 6c 79 20 61 20 76 69 65 77 20 2a 2f 0a  eally a view */.
1daa0 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
1dab0 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e  te3ViewGetColumn
1dac0 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 54  Names(pParse, pT
1dad0 61 62 29 20 29 20 72 65 74 75 72 6e 20 57 52 43  ab) ) return WRC
1dae0 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 20 20  _Abort;.        
1daf0 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70  assert( pFrom->p
1db00 53 65 6c 65 63 74 3d 3d 30 20 29 3b 0a 20 20 20  Select==0 );.   
1db10 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 53 65 6c       pFrom->pSel
1db20 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  ect = sqlite3Sel
1db30 65 63 74 44 75 70 28 64 62 2c 20 70 54 61 62 2d  ectDup(db, pTab-
1db40 3e 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20  >pSelect, 0);.  
1db50 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c        sqlite3Wal
1db60 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c  kSelect(pWalker,
1db70 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 29   pFrom->pSelect)
1db80 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
1db90 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4c  .    }..    /* L
1dba0 6f 63 61 74 65 20 74 68 65 20 69 6e 64 65 78 20  ocate the index 
1dbb0 6e 61 6d 65 64 20 62 79 20 74 68 65 20 49 4e 44  named by the IND
1dbc0 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 2c 20  EXED BY clause, 
1dbd0 69 66 20 61 6e 79 2e 20 2a 2f 0a 20 20 20 20 69  if any. */.    i
1dbe0 66 28 20 73 71 6c 69 74 65 33 49 6e 64 65 78 65  f( sqlite3Indexe
1dbf0 64 42 79 4c 6f 6f 6b 75 70 28 70 50 61 72 73 65  dByLookup(pParse
1dc00 2c 20 70 46 72 6f 6d 29 20 29 7b 0a 20 20 20 20  , pFrom) ){.    
1dc10 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f    return WRC_Abo
1dc20 72 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  rt;.    }.  }.. 
1dc30 20 2f 2a 20 50 72 6f 63 65 73 73 20 4e 41 54 55   /* Process NATU
1dc40 52 41 4c 20 6b 65 79 77 6f 72 64 73 2c 20 61 6e  RAL keywords, an
1dc50 64 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63  d ON and USING c
1dc60 6c 61 75 73 65 73 20 6f 66 20 6a 6f 69 6e 73 2e  lauses of joins.
1dc70 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  .  */.  if( db->
1dc80 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20  mallocFailed || 
1dc90 73 71 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f 69  sqliteProcessJoi
1dca0 6e 28 70 50 61 72 73 65 2c 20 70 29 20 29 7b 0a  n(pParse, p) ){.
1dcb0 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41      return WRC_A
1dcc0 62 6f 72 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  bort;.  }..  /* 
1dcd0 46 6f 72 20 65 76 65 72 79 20 22 2a 22 20 74 68  For every "*" th
1dce0 61 74 20 6f 63 63 75 72 73 20 69 6e 20 74 68 65  at occurs in the
1dcf0 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2c 20 69 6e   column list, in
1dd00 73 65 72 74 20 74 68 65 20 6e 61 6d 65 73 20 6f  sert the names o
1dd10 66 0a 20 20 2a 2a 20 61 6c 6c 20 63 6f 6c 75 6d  f.  ** all colum
1dd20 6e 73 20 69 6e 20 61 6c 6c 20 74 61 62 6c 65 73  ns in all tables
1dd30 2e 20 20 41 6e 64 20 66 6f 72 20 65 76 65 72 79  .  And for every
1dd40 20 54 41 42 4c 45 2e 2a 20 69 6e 73 65 72 74 20   TABLE.* insert 
1dd50 74 68 65 20 6e 61 6d 65 73 0a 20 20 2a 2a 20 6f  the names.  ** o
1dd60 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e  f all columns in
1dd70 20 54 41 42 4c 45 2e 20 20 54 68 65 20 70 61 72   TABLE.  The par
1dd80 73 65 72 20 69 6e 73 65 72 74 65 64 20 61 20 73  ser inserted a s
1dd90 70 65 63 69 61 6c 20 65 78 70 72 65 73 73 69 6f  pecial expressio
1dda0 6e 0a 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20  n.  ** with the 
1ddb0 54 4b 5f 41 4c 4c 20 6f 70 65 72 61 74 6f 72 20  TK_ALL operator 
1ddc0 66 6f 72 20 65 61 63 68 20 22 2a 22 20 74 68 61  for each "*" tha
1ddd0 74 20 69 74 20 66 6f 75 6e 64 20 69 6e 20 74 68  t it found in th
1dde0 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2e 0a 20  e column list.. 
1ddf0 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   ** The followin
1de00 67 20 63 6f 64 65 20 6a 75 73 74 20 68 61 73 20  g code just has 
1de10 74 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 54 4b  to locate the TK
1de20 5f 41 4c 4c 20 65 78 70 72 65 73 73 69 6f 6e 73  _ALL expressions
1de30 20 61 6e 64 20 65 78 70 61 6e 64 0a 20 20 2a 2a   and expand.  **
1de40 20 65 61 63 68 20 6f 6e 65 20 74 6f 20 74 68 65   each one to the
1de50 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 63 6f 6c   list of all col
1de60 75 6d 6e 73 20 69 6e 20 61 6c 6c 20 74 61 62 6c  umns in all tabl
1de70 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  es..  **.  ** Th
1de80 65 20 66 69 72 73 74 20 6c 6f 6f 70 20 6a 75 73  e first loop jus
1de90 74 20 63 68 65 63 6b 73 20 74 6f 20 73 65 65 20  t checks to see 
1dea0 69 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79  if there are any
1deb0 20 22 2a 22 20 6f 70 65 72 61 74 6f 72 73 0a 20   "*" operators. 
1dec0 20 2a 2a 20 74 68 61 74 20 6e 65 65 64 20 65 78   ** that need ex
1ded0 70 61 6e 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20  panding..  */.  
1dee0 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73  for(k=0; k<pELis
1def0 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a  t->nExpr; k++){.
1df00 20 20 20 20 70 45 20 3d 20 70 45 4c 69 73 74 2d      pE = pEList-
1df10 3e 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[k].pExpr;.   
1df20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f   if( pE->op==TK_
1df30 41 4c 4c 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ALL ) break;.   
1df40 20 61 73 73 65 72 74 28 20 70 45 2d 3e 6f 70 21   assert( pE->op!
1df50 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 45 2d 3e 70  =TK_DOT || pE->p
1df60 52 69 67 68 74 21 3d 30 20 29 3b 0a 20 20 20 20  Right!=0 );.    
1df70 61 73 73 65 72 74 28 20 70 45 2d 3e 6f 70 21 3d  assert( pE->op!=
1df80 54 4b 5f 44 4f 54 20 7c 7c 20 28 70 45 2d 3e 70  TK_DOT || (pE->p
1df90 4c 65 66 74 21 3d 30 20 26 26 20 70 45 2d 3e 70  Left!=0 && pE->p
1dfa0 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 29  Left->op==TK_ID)
1dfb0 20 29 3b 0a 20 20 20 20 69 66 28 20 70 45 2d 3e   );.    if( pE->
1dfc0 6f 70 3d 3d 54 4b 5f 44 4f 54 20 26 26 20 70 45  op==TK_DOT && pE
1dfd0 2d 3e 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b  ->pRight->op==TK
1dfe0 5f 41 4c 4c 20 29 20 62 72 65 61 6b 3b 0a 20 20  _ALL ) break;.  
1dff0 7d 0a 20 20 69 66 28 20 6b 3c 70 45 4c 69 73 74  }.  if( k<pEList
1e000 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 2f  ->nExpr ){.    /
1e010 2a 0a 20 20 20 20 2a 2a 20 49 66 20 77 65 20 67  *.    ** If we g
1e020 65 74 20 68 65 72 65 20 69 74 20 6d 65 61 6e 73  et here it means
1e030 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
1e040 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20  contains one or 
1e050 6d 6f 72 65 20 22 2a 22 0a 20 20 20 20 2a 2a 20  more "*".    ** 
1e060 6f 70 65 72 61 74 6f 72 73 20 74 68 61 74 20 6e  operators that n
1e070 65 65 64 20 74 6f 20 62 65 20 65 78 70 61 6e 64  eed to be expand
1e080 65 64 2e 20 20 4c 6f 6f 70 20 74 68 72 6f 75 67  ed.  Loop throug
1e090 68 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f  h each expressio
1e0a0 6e 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20  n.    ** in the 
1e0b0 72 65 73 75 6c 74 20 73 65 74 20 61 6e 64 20 65  result set and e
1e0c0 78 70 61 6e 64 20 74 68 65 6d 20 6f 6e 65 20 62  xpand them one b
1e0d0 79 20 6f 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  y one..    */.  
1e0e0 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
1e0f0 74 5f 69 74 65 6d 20 2a 61 20 3d 20 70 45 4c 69  t_item *a = pELi
1e100 73 74 2d 3e 61 3b 0a 20 20 20 20 45 78 70 72 4c  st->a;.    ExprL
1e110 69 73 74 20 2a 70 4e 65 77 20 3d 20 30 3b 0a 20  ist *pNew = 0;. 
1e120 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 70     int flags = p
1e130 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73  Parse->db->flags
1e140 3b 0a 20 20 20 20 69 6e 74 20 6c 6f 6e 67 4e 61  ;.    int longNa
1e150 6d 65 73 20 3d 20 28 66 6c 61 67 73 20 26 20 53  mes = (flags & S
1e160 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d  QLITE_FullColNam
1e170 65 73 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20  es)!=0.         
1e180 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
1e190 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
1e1a0 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 29 3d 3d  ShortColNames)==
1e1b0 30 3b 0a 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20  0;..    /* When 
1e1c0 70 72 6f 63 65 73 73 69 6e 67 20 46 52 4f 4d 2d  processing FROM-
1e1d0 63 6c 61 75 73 65 20 73 75 62 71 75 65 72 69 65  clause subquerie
1e1e0 73 2c 20 69 74 20 69 73 20 61 6c 77 61 79 73 20  s, it is always 
1e1f0 74 68 65 20 63 61 73 65 0a 20 20 20 20 2a 2a 20  the case.    ** 
1e200 74 68 61 74 20 66 75 6c 6c 5f 63 6f 6c 75 6d 6e  that full_column
1e210 5f 6e 61 6d 65 73 3d 4f 46 46 20 61 6e 64 20 73  _names=OFF and s
1e220 68 6f 72 74 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65  hort_column_name
1e230 73 3d 4f 4e 2e 20 20 54 68 65 0a 20 20 20 20 2a  s=ON.  The.    *
1e240 2a 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53  * sqlite3ResultS
1e250 65 74 4f 66 53 65 6c 65 63 74 28 29 20 72 6f 75  etOfSelect() rou
1e260 74 69 6e 65 20 6d 61 6b 65 73 20 69 74 20 73 6f  tine makes it so
1e270 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
1e280 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
1e290 53 46 5f 4e 65 73 74 65 64 46 72 6f 6d 29 3d 3d  SF_NestedFrom)==
1e2a0 30 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28  0.          || (
1e2b0 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
1e2c0 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 3d 3d 30  FullColNames)==0
1e2d0 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20   &&.            
1e2e0 20 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54    (flags & SQLIT
1e2f0 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 29  E_ShortColNames)
1e300 21 3d 30 29 20 29 3b 0a 0a 20 20 20 20 66 6f 72  !=0) );..    for
1e310 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e  (k=0; k<pEList->
1e320 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20  nExpr; k++){.   
1e330 20 20 20 70 45 20 3d 20 61 5b 6b 5d 2e 70 45 78     pE = a[k].pEx
1e340 70 72 3b 0a 20 20 20 20 20 20 70 52 69 67 68 74  pr;.      pRight
1e350 20 3d 20 70 45 2d 3e 70 52 69 67 68 74 3b 0a 20   = pE->pRight;. 
1e360 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 2d       assert( pE-
1e370 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70  >op!=TK_DOT || p
1e380 52 69 67 68 74 21 3d 30 20 29 3b 0a 20 20 20 20  Right!=0 );.    
1e390 20 20 69 66 28 20 70 45 2d 3e 6f 70 21 3d 54 4b    if( pE->op!=TK
1e3a0 5f 41 4c 4c 20 26 26 20 28 70 45 2d 3e 6f 70 21  _ALL && (pE->op!
1e3b0 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 52 69 67 68  =TK_DOT || pRigh
1e3c0 74 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29 20 29  t->op!=TK_ALL) )
1e3d0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69  {.        /* Thi
1e3e0 73 20 70 61 72 74 69 63 75 6c 61 72 20 65 78 70  s particular exp
1e3f0 72 65 73 73 69 6f 6e 20 64 6f 65 73 20 6e 6f 74  ression does not
1e400 20 6e 65 65 64 20 74 6f 20 62 65 20 65 78 70 61   need to be expa
1e410 6e 64 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f  nded..        */
1e420 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20  .        pNew = 
1e430 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
1e440 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70 4e  ppend(pParse, pN
1e450 65 77 2c 20 61 5b 6b 5d 2e 70 45 78 70 72 29 3b  ew, a[k].pExpr);
1e460 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65  .        if( pNe
1e470 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  w ){.          p
1e480 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78  New->a[pNew->nEx
1e490 70 72 2d 31 5d 2e 7a 4e 61 6d 65 20 3d 20 61 5b  pr-1].zName = a[
1e4a0 6b 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  k].zName;.      
1e4b0 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77      pNew->a[pNew
1e4c0 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a 53 70 61 6e  ->nExpr-1].zSpan
1e4d0 20 3d 20 61 5b 6b 5d 2e 7a 53 70 61 6e 3b 0a 20   = a[k].zSpan;. 
1e4e0 20 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 7a 4e           a[k].zN
1e4f0 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ame = 0;.       
1e500 20 20 20 61 5b 6b 5d 2e 7a 53 70 61 6e 20 3d 20     a[k].zSpan = 
1e510 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
1e520 20 20 20 20 20 61 5b 6b 5d 2e 70 45 78 70 72 20       a[k].pExpr 
1e530 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 0;.      }else
1e540 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69  {.        /* Thi
1e550 73 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  s expression is 
1e560 61 20 22 2a 22 20 6f 72 20 61 20 22 54 41 42 4c  a "*" or a "TABL
1e570 45 2e 2a 22 20 61 6e 64 20 6e 65 65 64 73 20 74  E.*" and needs t
1e580 6f 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  o be.        ** 
1e590 65 78 70 61 6e 64 65 64 2e 20 2a 2f 0a 20 20 20  expanded. */.   
1e5a0 20 20 20 20 20 69 6e 74 20 74 61 62 6c 65 53 65       int tableSe
1e5b0 65 6e 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20  en = 0;      /* 
1e5c0 53 65 74 20 74 6f 20 31 20 77 68 65 6e 20 54 41  Set to 1 when TA
1e5d0 42 4c 45 20 6d 61 74 63 68 65 73 20 2a 2f 0a 20  BLE matches */. 
1e5e0 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 4e         char *zTN
1e5f0 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  ame = 0;       /
1e600 2a 20 74 65 78 74 20 6f 66 20 6e 61 6d 65 20 6f  * text of name o
1e610 66 20 54 41 42 4c 45 20 2a 2f 0a 20 20 20 20 20  f TABLE */.     
1e620 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54     if( pE->op==T
1e630 4b 5f 44 4f 54 20 29 7b 0a 20 20 20 20 20 20 20  K_DOT ){.       
1e640 20 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e 70     assert( pE->p
1e650 4c 65 66 74 21 3d 30 20 29 3b 0a 20 20 20 20 20  Left!=0 );.     
1e660 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
1e670 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
1e680 2d 3e 70 4c 65 66 74 2c 20 45 50 5f 49 6e 74 56  ->pLeft, EP_IntV
1e690 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20  alue) );.       
1e6a0 20 20 20 7a 54 4e 61 6d 65 20 3d 20 70 45 2d 3e     zTName = pE->
1e6b0 70 4c 65 66 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b  pLeft->u.zToken;
1e6c0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1e6d0 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f     for(i=0, pFro
1e6e0 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69  m=pTabList->a; i
1e6f0 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b  <pTabList->nSrc;
1e700 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a   i++, pFrom++){.
1e710 20 20 20 20 20 20 20 20 20 20 54 61 62 6c 65 20            Table 
1e720 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70  *pTab = pFrom->p
1e730 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20 53  Tab;.          S
1e740 65 6c 65 63 74 20 2a 70 53 75 62 20 3d 20 70 46  elect *pSub = pF
1e750 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20  rom->pSelect;.  
1e760 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54          char *zT
1e770 61 62 4e 61 6d 65 20 3d 20 70 46 72 6f 6d 2d 3e  abName = pFrom->
1e780 7a 41 6c 69 61 73 3b 0a 20 20 20 20 20 20 20 20  zAlias;.        
1e790 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
1e7a0 63 68 65 6d 61 4e 61 6d 65 20 3d 20 30 3b 0a 20  chemaName = 0;. 
1e7b0 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 44 62           int iDb
1e7c0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
1e7d0 7a 54 61 62 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20  zTabName==0 ){. 
1e7e0 20 20 20 20 20 20 20 20 20 20 20 7a 54 61 62 4e             zTabN
1e7f0 61 6d 65 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d  ame = pTab->zNam
1e800 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  e;.          }. 
1e810 20 20 20 20 20 20 20 20 20 69 66 28 20 64 62 2d           if( db-
1e820 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
1e830 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
1e840 20 69 66 28 20 70 53 75 62 3d 3d 30 20 7c 7c 20   if( pSub==0 || 
1e850 28 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20  (pSub->selFlags 
1e860 26 20 53 46 5f 4e 65 73 74 65 64 46 72 6f 6d 29  & SF_NestedFrom)
1e870 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
1e880 20 20 20 70 53 75 62 20 3d 20 30 3b 0a 20 20 20     pSub = 0;.   
1e890 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 4e           if( zTN
1e8a0 61 6d 65 20 26 26 20 73 71 6c 69 74 65 33 53 74  ame && sqlite3St
1e8b0 72 49 43 6d 70 28 7a 54 4e 61 6d 65 2c 20 7a 54  rICmp(zTName, zT
1e8c0 61 62 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20  abName)!=0 ){.  
1e8d0 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
1e8e0 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
1e8f0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
1e900 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
1e910 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70  emaToIndex(db, p
1e920 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  Tab->pSchema);. 
1e930 20 20 20 20 20 20 20 20 20 20 20 7a 53 63 68 65             zSche
1e940 6d 61 4e 61 6d 65 20 3d 20 69 44 62 3e 3d 30 20  maName = iDb>=0 
1e950 3f 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a  ? db->aDb[iDb].z
1e960 4e 61 6d 65 20 3a 20 22 2a 22 3b 0a 20 20 20 20  Name : "*";.    
1e970 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1e980 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61    for(j=0; j<pTa
1e990 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20  b->nCol; j++){. 
1e9a0 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20             char 
1e9b0 2a 7a 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 61  *zName = pTab->a
1e9c0 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  Col[j].zName;.  
1e9d0 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a            char *
1e9e0 7a 43 6f 6c 6e 61 6d 65 3b 20 20 2f 2a 20 54 68  zColname;  /* Th
1e9f0 65 20 63 6f 6d 70 75 74 65 64 20 63 6f 6c 75 6d  e computed colum
1ea00 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20  n name */.      
1ea10 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 6f 46        char *zToF
1ea20 72 65 65 3b 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63  ree;   /* Malloc
1ea30 65 64 20 73 74 72 69 6e 67 20 74 68 61 74 20 6e  ed string that n
1ea40 65 65 64 73 20 74 6f 20 62 65 20 66 72 65 65 64  eeds to be freed
1ea50 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
1ea60 54 6f 6b 65 6e 20 73 43 6f 6c 6e 61 6d 65 3b 20  Token sColname; 
1ea70 20 2f 2a 20 43 6f 6d 70 75 74 65 64 20 63 6f 6c   /* Computed col
1ea80 75 6d 6e 20 6e 61 6d 65 20 61 73 20 61 20 74 6f  umn name as a to
1ea90 6b 65 6e 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20  ken */..        
1eaa0 20 20 20 20 61 73 73 65 72 74 28 20 7a 4e 61 6d      assert( zNam
1eab0 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  e );.           
1eac0 20 69 66 28 20 7a 54 4e 61 6d 65 20 26 26 20 70   if( zTName && p
1ead0 53 75 62 0a 20 20 20 20 20 20 20 20 20 20 20 20  Sub.            
1eae0 20 26 26 20 73 71 6c 69 74 65 33 4d 61 74 63 68   && sqlite3Match
1eaf0 53 70 61 6e 4e 61 6d 65 28 70 53 75 62 2d 3e 70  SpanName(pSub->p
1eb00 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 53 70 61  EList->a[j].zSpa
1eb10 6e 2c 20 30 2c 20 7a 54 4e 61 6d 65 2c 20 30 29  n, 0, zTName, 0)
1eb20 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20  ==0.            
1eb30 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
1eb40 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
1eb50 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
1eb60 20 20 20 20 20 20 2f 2a 20 49 66 20 61 20 63 6f        /* If a co
1eb70 6c 75 6d 6e 20 69 73 20 6d 61 72 6b 65 64 20 61  lumn is marked a
1eb80 73 20 27 68 69 64 64 65 6e 27 20 28 63 75 72 72  s 'hidden' (curr
1eb90 65 6e 74 6c 79 20 6f 6e 6c 79 20 70 6f 73 73 69  ently only possi
1eba0 62 6c 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  ble.            
1ebb0 2a 2a 20 66 6f 72 20 76 69 72 74 75 61 6c 20 74  ** for virtual t
1ebc0 61 62 6c 65 73 29 2c 20 64 6f 20 6e 6f 74 20 69  ables), do not i
1ebd0 6e 63 6c 75 64 65 20 69 74 20 69 6e 20 74 68 65  nclude it in the
1ebe0 20 65 78 70 61 6e 64 65 64 0a 20 20 20 20 20 20   expanded.      
1ebf0 20 20 20 20 20 20 2a 2a 20 72 65 73 75 6c 74 2d        ** result-
1ec00 73 65 74 20 6c 69 73 74 2e 0a 20 20 20 20 20 20  set list..      
1ec10 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
1ec20 20 20 20 20 20 69 66 28 20 49 73 48 69 64 64 65       if( IsHidde
1ec30 6e 43 6f 6c 75 6d 6e 28 26 70 54 61 62 2d 3e 61  nColumn(&pTab->a
1ec40 43 6f 6c 5b 6a 5d 29 20 29 7b 0a 20 20 20 20 20  Col[j]) ){.     
1ec50 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
1ec60 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 29  IsVirtual(pTab))
1ec70 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1ec80 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
1ec90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1eca0 20 20 20 20 74 61 62 6c 65 53 65 65 6e 20 3d 20      tableSeen = 
1ecb0 31 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20  1;..            
1ecc0 69 66 28 20 69 3e 30 20 26 26 20 7a 54 4e 61 6d  if( i>0 && zTNam
1ecd0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
1ece0 20 20 20 20 20 20 69 66 28 20 28 70 46 72 6f 6d        if( (pFrom
1ecf0 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f  ->jointype & JT_
1ed00 4e 41 54 55 52 41 4c 29 21 3d 30 0a 20 20 20 20  NATURAL)!=0.    
1ed10 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 74              && t
1ed20 61 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64  ableAndColumnInd
1ed30 65 78 28 70 54 61 62 4c 69 73 74 2c 20 69 2c 20  ex(pTabList, i, 
1ed40 7a 4e 61 6d 65 2c 20 30 2c 20 30 29 0a 20 20 20  zName, 0, 0).   
1ed50 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20             ){.  
1ed60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ed70 20 49 6e 20 61 20 4e 41 54 55 52 41 4c 20 6a 6f   In a NATURAL jo
1ed80 69 6e 2c 20 6f 6d 69 74 20 74 68 65 20 6a 6f 69  in, omit the joi
1ed90 6e 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20 74  n columns from t
1eda0 68 65 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  he .            
1edb0 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 74 6f 20      ** table to 
1edc0 74 68 65 20 72 69 67 68 74 20 6f 66 20 74 68 65  the right of the
1edd0 20 6a 6f 69 6e 20 2a 2f 0a 20 20 20 20 20 20 20   join */.       
1ede0 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
1edf0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e;.             
1ee00 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
1ee10 20 69 66 28 20 73 71 6c 69 74 65 33 49 64 4c 69   if( sqlite3IdLi
1ee20 73 74 49 6e 64 65 78 28 70 46 72 6f 6d 2d 3e 70  stIndex(pFrom->p
1ee30 55 73 69 6e 67 2c 20 7a 4e 61 6d 65 29 3e 3d 30  Using, zName)>=0
1ee40 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1ee50 20 20 20 20 2f 2a 20 49 6e 20 61 20 6a 6f 69 6e      /* In a join
1ee60 20 77 69 74 68 20 61 20 55 53 49 4e 47 20 63 6c   with a USING cl
1ee70 61 75 73 65 2c 20 6f 6d 69 74 20 63 6f 6c 75 6d  ause, omit colum
1ee80 6e 73 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20  ns in the.      
1ee90 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75 73 69            ** usi
1eea0 6e 67 20 63 6c 61 75 73 65 20 66 72 6f 6d 20 74  ng clause from t
1eeb0 68 65 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20  he table on the 
1eec0 72 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20 20 20  right. */.      
1eed0 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
1eee0 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
1eef0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
1ef00 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 52  }.            pR
1ef10 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78  ight = sqlite3Ex
1ef20 70 72 28 64 62 2c 20 54 4b 5f 49 44 2c 20 7a 4e  pr(db, TK_ID, zN
1ef30 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
1ef40 20 20 7a 43 6f 6c 6e 61 6d 65 20 3d 20 7a 4e 61    zColname = zNa
1ef50 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  me;.            
1ef60 7a 54 6f 46 72 65 65 20 3d 20 30 3b 0a 20 20 20  zToFree = 0;.   
1ef70 20 20 20 20 20 20 20 20 20 69 66 28 20 6c 6f 6e           if( lon
1ef80 67 4e 61 6d 65 73 20 7c 7c 20 70 54 61 62 4c 69  gNames || pTabLi
1ef90 73 74 2d 3e 6e 53 72 63 3e 31 20 29 7b 0a 20 20  st->nSrc>1 ){.  
1efa0 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72              Expr
1efb0 20 2a 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 20   *pLeft;.       
1efc0 20 20 20 20 20 20 20 70 4c 65 66 74 20 3d 20 73         pLeft = s
1efd0 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20 54  qlite3Expr(db, T
1efe0 4b 5f 49 44 2c 20 7a 54 61 62 4e 61 6d 65 29 3b  K_ID, zTabName);
1eff0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
1f000 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45  Expr = sqlite3PE
1f010 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 44  xpr(pParse, TK_D
1f020 4f 54 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68  OT, pLeft, pRigh
1f030 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  t, 0);.         
1f040 20 20 20 20 20 69 66 28 20 7a 53 63 68 65 6d 61       if( zSchema
1f050 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Name ){.        
1f060 20 20 20 20 20 20 20 20 70 4c 65 66 74 20 3d 20          pLeft = 
1f070 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20  sqlite3Expr(db, 
1f080 54 4b 5f 49 44 2c 20 7a 53 63 68 65 6d 61 4e 61  TK_ID, zSchemaNa
1f090 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  me);.           
1f0a0 20 20 20 20 20 70 45 78 70 72 20 3d 20 73 71 6c       pExpr = sql
1f0b0 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
1f0c0 2c 20 54 4b 5f 44 4f 54 2c 20 70 4c 65 66 74 2c  , TK_DOT, pLeft,
1f0d0 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20   pExpr, 0);.    
1f0e0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1f0f0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6c 6f            if( lo
1f100 6e 67 4e 61 6d 65 73 20 29 7b 0a 20 20 20 20 20  ngNames ){.     
1f110 20 20 20 20 20 20 20 20 20 20 20 7a 43 6f 6c 6e             zColn
1f120 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  ame = sqlite3MPr
1f130 69 6e 74 66 28 64 62 2c 20 22 25 73 2e 25 73 22  intf(db, "%s.%s"
1f140 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 7a 4e 61 6d  , zTabName, zNam
1f150 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
1f160 20 20 20 20 7a 54 6f 46 72 65 65 20 3d 20 7a 43      zToFree = zC
1f170 6f 6c 6e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  olname;.        
1f180 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1f190 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1f1a0 20 20 20 20 20 20 20 20 20 70 45 78 70 72 20 3d           pExpr =
1f1b0 20 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20   pRight;.       
1f1c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1f1d0 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65     pNew = sqlite
1f1e0 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
1f1f0 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 70 45  pParse, pNew, pE
1f200 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  xpr);.          
1f210 20 20 73 43 6f 6c 6e 61 6d 65 2e 7a 20 3d 20 7a    sColname.z = z
1f220 43 6f 6c 6e 61 6d 65 3b 0a 20 20 20 20 20 20 20  Colname;.       
1f230 20 20 20 20 20 73 43 6f 6c 6e 61 6d 65 2e 6e 20       sColname.n 
1f240 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
1f250 30 28 7a 43 6f 6c 6e 61 6d 65 29 3b 0a 20 20 20  0(zColname);.   
1f260 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1f270 45 78 70 72 4c 69 73 74 53 65 74 4e 61 6d 65 28  ExprListSetName(
1f280 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 26 73  pParse, pNew, &s
1f290 43 6f 6c 6e 61 6d 65 2c 20 30 29 3b 0a 20 20 20  Colname, 0);.   
1f2a0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65           if( pNe
1f2b0 77 20 26 26 20 28 70 2d 3e 73 65 6c 46 6c 61 67  w && (p->selFlag
1f2c0 73 20 26 20 53 46 5f 4e 65 73 74 65 64 46 72 6f  s & SF_NestedFro
1f2d0 6d 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  m)!=0 ){.       
1f2e0 20 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78         struct Ex
1f2f0 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 58 20  prList_item *pX 
1f300 3d 20 26 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d  = &pNew->a[pNew-
1f310 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20 20 20 20  >nExpr-1];.     
1f320 20 20 20 20 20 20 20 20 20 69 66 28 20 70 53 75           if( pSu
1f330 62 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  b ){.           
1f340 20 20 20 20 20 70 58 2d 3e 7a 53 70 61 6e 20 3d       pX->zSpan =
1f350 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
1f360 28 64 62 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73  (db, pSub->pELis
1f370 74 2d 3e 61 5b 6a 5d 2e 7a 53 70 61 6e 29 3b 0a  t->a[j].zSpan);.
1f380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f390 74 65 73 74 63 61 73 65 28 20 70 58 2d 3e 7a 53  testcase( pX->zS
1f3a0 70 61 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  pan==0 );.      
1f3b0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1f3c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1f3d0 58 2d 3e 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74  X->zSpan = sqlit
1f3e0 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25  e3MPrintf(db, "%
1f3f0 73 2e 25 73 2e 25 73 22 2c 0a 20 20 20 20 20 20  s.%s.%s",.      
1f400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f420 20 20 20 20 20 7a 53 63 68 65 6d 61 4e 61 6d 65       zSchemaName
1f430 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 7a 43 6f 6c  , zTabName, zCol
1f440 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  name);.         
1f450 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
1f460 20 70 58 2d 3e 7a 53 70 61 6e 3d 3d 30 20 29 3b   pX->zSpan==0 );
1f470 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
1f480 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
1f490 58 2d 3e 62 53 70 61 6e 49 73 54 61 62 20 3d 20  X->bSpanIsTab = 
1f4a0 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  1;.            }
1f4b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
1f4c0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
1f4d0 54 6f 46 72 65 65 29 3b 0a 20 20 20 20 20 20 20  ToFree);.       
1f4e0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
1f4f0 20 20 20 20 20 20 20 69 66 28 20 21 74 61 62 6c         if( !tabl
1f500 65 53 65 65 6e 20 29 7b 0a 20 20 20 20 20 20 20  eSeen ){.       
1f510 20 20 20 69 66 28 20 7a 54 4e 61 6d 65 20 29 7b     if( zTName ){
1f520 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
1f530 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
1f540 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 74 61  rse, "no such ta
1f550 62 6c 65 3a 20 25 73 22 2c 20 7a 54 4e 61 6d 65  ble: %s", zTName
1f560 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
1f570 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
1f580 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
1f590 70 50 61 72 73 65 2c 20 22 6e 6f 20 74 61 62 6c  pParse, "no tabl
1f5a0 65 73 20 73 70 65 63 69 66 69 65 64 22 29 3b 0a  es specified");.
1f5b0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1f5c0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1f5d0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45    }.    sqlite3E
1f5e0 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
1f5f0 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 70  , pEList);.    p
1f600 2d 3e 70 45 4c 69 73 74 20 3d 20 70 4e 65 77 3b  ->pEList = pNew;
1f610 0a 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f  .  }.#if SQLITE_
1f620 4d 41 58 5f 43 4f 4c 55 4d 4e 0a 20 20 69 66 28  MAX_COLUMN.  if(
1f630 20 70 2d 3e 70 45 4c 69 73 74 20 26 26 20 70 2d   p->pEList && p-
1f640 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 64  >pEList->nExpr>d
1f650 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45  b->aLimit[SQLITE
1f660 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20 29  _LIMIT_COLUMN] )
1f670 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
1f680 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
1f690 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20  oo many columns 
1f6a0 69 6e 20 72 65 73 75 6c 74 20 73 65 74 22 29 3b  in result set");
1f6b0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65  .  }.#endif.  re
1f6c0 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75  turn WRC_Continu
1f6d0 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4e 6f 2d 6f  e;.}../*.** No-o
1f6e0 70 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 74 68  p routine for th
1f6f0 65 20 70 61 72 73 65 2d 74 72 65 65 20 77 61 6c  e parse-tree wal
1f700 6b 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  ker..**.** When 
1f710 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
1f720 74 68 65 20 57 61 6c 6b 65 72 2e 78 45 78 70 72  the Walker.xExpr
1f730 43 61 6c 6c 62 61 63 6b 20 74 68 65 6e 20 65 78  Callback then ex
1f740 70 72 65 73 73 69 6f 6e 20 74 72 65 65 73 0a 2a  pression trees.*
1f750 2a 20 61 72 65 20 77 61 6c 6b 65 64 20 77 69 74  * are walked wit
1f760 68 6f 75 74 20 61 6e 79 20 61 63 74 69 6f 6e 73  hout any actions
1f770 20 62 65 69 6e 67 20 74 61 6b 65 6e 20 61 74 20   being taken at 
1f780 65 61 63 68 20 6e 6f 64 65 2e 20 20 50 72 65 73  each node.  Pres
1f790 75 6d 61 62 6c 79 2c 0a 2a 2a 20 77 68 65 6e 20  umably,.** when 
1f7a0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
1f7b0 75 73 65 64 20 66 6f 72 20 57 61 6c 6b 65 72 2e  used for Walker.
1f7c0 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 74 68  xExprCallback th
1f7d0 65 6e 20 0a 2a 2a 20 57 61 6c 6b 65 72 2e 78 53  en .** Walker.xS
1f7e0 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 69 73  electCallback is
1f7f0 20 73 65 74 20 74 6f 20 64 6f 20 73 6f 6d 65 74   set to do somet
1f800 68 69 6e 67 20 75 73 65 66 75 6c 20 66 6f 72 20  hing useful for 
1f810 65 76 65 72 79 20 0a 2a 2a 20 73 75 62 71 75 65  every .** subque
1f820 72 79 20 69 6e 20 74 68 65 20 70 61 72 73 65 72  ry in the parser
1f830 20 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   tree..*/.static
1f840 20 69 6e 74 20 65 78 70 72 57 61 6c 6b 4e 6f 6f   int exprWalkNoo
1f850 70 28 57 61 6c 6b 65 72 20 2a 4e 6f 74 55 73 65  p(Walker *NotUse
1f860 64 2c 20 45 78 70 72 20 2a 4e 6f 74 55 73 65 64  d, Expr *NotUsed
1f870 32 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  2){.  UNUSED_PAR
1f880 41 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c  AMETER2(NotUsed,
1f890 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 72 65   NotUsed2);.  re
1f8a0 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75  turn WRC_Continu
1f8b0 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  e;.}../*.** This
1f8c0 20 72 6f 75 74 69 6e 65 20 22 65 78 70 61 6e 64   routine "expand
1f8d0 73 22 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  s" a SELECT stat
1f8e0 65 6d 65 6e 74 20 61 6e 64 20 61 6c 6c 20 6f 66  ement and all of
1f8f0 20 69 74 73 20 73 75 62 71 75 65 72 69 65 73 2e   its subqueries.
1f900 0a 2a 2a 20 46 6f 72 20 61 64 64 69 74 69 6f 6e  .** For addition
1f910 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f  al information o
1f920 6e 20 77 68 61 74 20 69 74 20 6d 65 61 6e 73 20  n what it means 
1f930 74 6f 20 22 65 78 70 61 6e 64 22 20 61 20 53 45  to "expand" a SE
1f940 4c 45 43 54 0a 2a 2a 20 73 74 61 74 65 6d 65 6e  LECT.** statemen
1f950 74 2c 20 73 65 65 20 74 68 65 20 63 6f 6d 6d 65  t, see the comme
1f960 6e 74 20 6f 6e 20 74 68 65 20 73 65 6c 65 63 74  nt on the select
1f970 45 78 70 61 6e 64 20 77 6f 72 6b 65 72 20 63 61  Expand worker ca
1f980 6c 6c 62 61 63 6b 20 61 62 6f 76 65 2e 0a 2a 2a  llback above..**
1f990 0a 2a 2a 20 45 78 70 61 6e 64 69 6e 67 20 61 20  .** Expanding a 
1f9a0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
1f9b0 20 69 73 20 74 68 65 20 66 69 72 73 74 20 73 74   is the first st
1f9c0 65 70 20 69 6e 20 70 72 6f 63 65 73 73 69 6e 67  ep in processing
1f9d0 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61   a.** SELECT sta
1f9e0 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 53 45 4c  tement.  The SEL
1f9f0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 6d 75  ECT statement mu
1fa00 73 74 20 62 65 20 65 78 70 61 6e 64 65 64 20 62  st be expanded b
1fa10 65 66 6f 72 65 0a 2a 2a 20 6e 61 6d 65 20 72 65  efore.** name re
1fa20 73 6f 6c 75 74 69 6f 6e 20 69 73 20 70 65 72 66  solution is perf
1fa30 6f 72 6d 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ormed..**.** If 
1fa40 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20 77 72  anything goes wr
1fa50 6f 6e 67 2c 20 61 6e 20 65 72 72 6f 72 20 6d 65  ong, an error me
1fa60 73 73 61 67 65 20 69 73 20 77 72 69 74 74 65 6e  ssage is written
1fa70 20 69 6e 74 6f 20 70 50 61 72 73 65 2e 0a 2a 2a   into pParse..**
1fa80 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e   The calling fun
1fa90 63 74 69 6f 6e 20 63 61 6e 20 64 65 74 65 63 74  ction can detect
1faa0 20 74 68 65 20 70 72 6f 62 6c 65 6d 20 62 79 20   the problem by 
1fab0 6c 6f 6f 6b 69 6e 67 20 61 74 20 70 50 61 72 73  looking at pPars
1fac0 65 2d 3e 6e 45 72 72 0a 2a 2a 20 61 6e 64 2f 6f  e->nErr.** and/o
1fad0 72 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  r pParse->db->ma
1fae0 6c 6c 6f 63 46 61 69 6c 65 64 2e 0a 2a 2f 0a 73  llocFailed..*/.s
1faf0 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74  tatic void sqlit
1fb00 65 33 53 65 6c 65 63 74 45 78 70 61 6e 64 28 50  e3SelectExpand(P
1fb10 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65  arse *pParse, Se
1fb20 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a  lect *pSelect){.
1fb30 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 6d 65    Walker w;.  me
1fb40 6d 73 65 74 28 26 77 2c 20 30 2c 20 73 69 7a 65  mset(&w, 0, size
1fb50 6f 66 28 77 29 29 3b 0a 20 20 77 2e 78 53 65 6c  of(w));.  w.xSel
1fb60 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 63 6f  ectCallback = co
1fb70 6e 76 65 72 74 43 6f 6d 70 6f 75 6e 64 53 65 6c  nvertCompoundSel
1fb80 65 63 74 54 6f 53 75 62 71 75 65 72 79 3b 0a 20  ectToSubquery;. 
1fb90 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b   w.xExprCallback
1fba0 20 3d 20 65 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b   = exprWalkNoop;
1fbb0 0a 20 20 77 2e 70 50 61 72 73 65 20 3d 20 70 50  .  w.pParse = pP
1fbc0 61 72 73 65 3b 0a 20 20 73 71 6c 69 74 65 33 57  arse;.  sqlite3W
1fbd0 61 6c 6b 53 65 6c 65 63 74 28 26 77 2c 20 70 53  alkSelect(&w, pS
1fbe0 65 6c 65 63 74 29 3b 0a 20 20 77 2e 78 53 65 6c  elect);.  w.xSel
1fbf0 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73 65  ectCallback = se
1fc00 6c 65 63 74 45 78 70 61 6e 64 65 72 3b 0a 20 20  lectExpander;.  
1fc10 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63  sqlite3WalkSelec
1fc20 74 28 26 77 2c 20 70 53 65 6c 65 63 74 29 3b 0a  t(&w, pSelect);.
1fc30 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  }...#ifndef SQLI
1fc40 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
1fc50 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  ./*.** This is a
1fc60 20 57 61 6c 6b 65 72 2e 78 53 65 6c 65 63 74 43   Walker.xSelectC
1fc70 61 6c 6c 62 61 63 6b 20 63 61 6c 6c 62 61 63 6b  allback callback
1fc80 20 66 6f 72 20 74 68 65 20 73 71 6c 69 74 65 33   for the sqlite3
1fc90 53 65 6c 65 63 74 54 79 70 65 49 6e 66 6f 28 29  SelectTypeInfo()
1fca0 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a  .** interface..*
1fcb0 2a 0a 2a 2a 20 46 6f 72 20 65 61 63 68 20 46 52  *.** For each FR
1fcc0 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62 71 75 65  OM-clause subque
1fcd0 72 79 2c 20 61 64 64 20 43 6f 6c 75 6d 6e 2e 7a  ry, add Column.z
1fce0 54 79 70 65 20 61 6e 64 20 43 6f 6c 75 6d 6e 2e  Type and Column.
1fcf0 7a 43 6f 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61  zColl.** informa
1fd00 74 69 6f 6e 20 74 6f 20 74 68 65 20 54 61 62 6c  tion to the Tabl
1fd10 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  e structure that
1fd20 20 72 65 70 72 65 73 65 6e 74 73 20 74 68 65 20   represents the 
1fd30 72 65 73 75 6c 74 20 73 65 74 0a 2a 2a 20 6f 66  result set.** of
1fd40 20 74 68 61 74 20 73 75 62 71 75 65 72 79 2e 0a   that subquery..
1fd50 2a 2a 0a 2a 2a 20 54 68 65 20 54 61 62 6c 65 20  **.** The Table 
1fd60 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 72  structure that r
1fd70 65 70 72 65 73 65 6e 74 73 20 74 68 65 20 72 65  epresents the re
1fd80 73 75 6c 74 20 73 65 74 20 77 61 73 20 63 6f 6e  sult set was con
1fd90 73 74 72 75 63 74 65 64 0a 2a 2a 20 62 79 20 73  structed.** by s
1fda0 65 6c 65 63 74 45 78 70 61 6e 64 65 72 28 29 20  electExpander() 
1fdb0 62 75 74 20 74 68 65 20 74 79 70 65 20 61 6e 64  but the type and
1fdc0 20 63 6f 6c 6c 61 74 69 6f 6e 20 69 6e 66 6f 72   collation infor
1fdd0 6d 61 74 69 6f 6e 20 77 61 73 20 6f 6d 69 74 74  mation was omitt
1fde0 65 64 0a 2a 2a 20 61 74 20 74 68 61 74 20 70 6f  ed.** at that po
1fdf0 69 6e 74 20 62 65 63 61 75 73 65 20 69 64 65 6e  int because iden
1fe00 74 69 66 69 65 72 73 20 68 61 64 20 6e 6f 74 20  tifiers had not 
1fe10 79 65 74 20 62 65 65 6e 20 72 65 73 6f 6c 76 65  yet been resolve
1fe20 64 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74  d.  This.** rout
1fe30 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 61 66  ine is called af
1fe40 74 65 72 20 69 64 65 6e 74 69 66 69 65 72 20 72  ter identifier r
1fe50 65 73 6f 6c 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  esolution..*/.st
1fe60 61 74 69 63 20 69 6e 74 20 73 65 6c 65 63 74 41  atic int selectA
1fe70 64 64 53 75 62 71 75 65 72 79 54 79 70 65 49 6e  ddSubqueryTypeIn
1fe80 66 6f 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b  fo(Walker *pWalk
1fe90 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a  er, Select *p){.
1fea0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b    Parse *pParse;
1feb0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 53 72 63 4c  .  int i;.  SrcL
1fec0 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 0a 20  ist *pTabList;. 
1fed0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
1fee0 69 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a 0a 20 20  item *pFrom;..  
1fef0 61 73 73 65 72 74 28 20 70 2d 3e 73 65 6c 46 6c  assert( p->selFl
1ff00 61 67 73 20 26 20 53 46 5f 52 65 73 6f 6c 76 65  ags & SF_Resolve
1ff10 64 20 29 3b 0a 20 20 69 66 28 20 28 70 2d 3e 73  d );.  if( (p->s
1ff20 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 48 61 73  elFlags & SF_Has
1ff30 54 79 70 65 49 6e 66 6f 29 3d 3d 30 20 29 7b 0a  TypeInfo)==0 ){.
1ff40 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20      p->selFlags 
1ff50 7c 3d 20 53 46 5f 48 61 73 54 79 70 65 49 6e 66  |= SF_HasTypeInf
1ff60 6f 3b 0a 20 20 20 20 70 50 61 72 73 65 20 3d 20  o;.    pParse = 
1ff70 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b  pWalker->pParse;
1ff80 0a 20 20 20 20 70 54 61 62 4c 69 73 74 20 3d 20  .    pTabList = 
1ff90 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20 66 6f 72  p->pSrc;.    for
1ffa0 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62  (i=0, pFrom=pTab
1ffb0 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c  List->a; i<pTabL
1ffc0 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20  ist->nSrc; i++, 
1ffd0 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pFrom++){.      
1ffe0 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 46  Table *pTab = pF
1fff0 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20  rom->pTab;.     
20000 20 69 66 28 20 41 4c 57 41 59 53 28 70 54 61 62   if( ALWAYS(pTab
20010 21 3d 30 29 20 26 26 20 28 70 54 61 62 2d 3e 74  !=0) && (pTab->t
20020 61 62 46 6c 61 67 73 20 26 20 54 46 5f 45 70 68  abFlags & TF_Eph
20030 65 6d 65 72 61 6c 29 21 3d 30 20 29 7b 0a 20 20  emeral)!=0 ){.  
20040 20 20 20 20 20 20 2f 2a 20 41 20 73 75 62 2d 71        /* A sub-q
20050 75 65 72 79 20 69 6e 20 74 68 65 20 46 52 4f 4d  uery in the FROM
20060 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c   clause of a SEL
20070 45 43 54 20 2a 2f 0a 20 20 20 20 20 20 20 20 53  ECT */.        S
20080 65 6c 65 63 74 20 2a 70 53 65 6c 20 3d 20 70 46  elect *pSel = pF
20090 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20  rom->pSelect;.  
200a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53        assert( pS
200b0 65 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 77 68  el );.        wh
200c0 69 6c 65 28 20 70 53 65 6c 2d 3e 70 50 72 69 6f  ile( pSel->pPrio
200d0 72 20 29 20 70 53 65 6c 20 3d 20 70 53 65 6c 2d  r ) pSel = pSel-
200e0 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20  >pPrior;.       
200f0 20 73 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e   selectAddColumn
20100 54 79 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e  TypeAndCollation
20110 28 70 50 61 72 73 65 2c 20 70 54 61 62 2d 3e 6e  (pParse, pTab->n
20120 43 6f 6c 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 2c  Col, pTab->aCol,
20130 20 70 53 65 6c 29 3b 0a 20 20 20 20 20 20 7d 0a   pSel);.      }.
20140 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
20150 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
20160 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  .}.#endif.../*.*
20170 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61  * This routine a
20180 64 64 73 20 64 61 74 61 74 79 70 65 20 61 6e 64  dds datatype and
20190 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
201a0 6e 63 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  nce information 
201b0 74 6f 0a 2a 2a 20 74 68 65 20 54 61 62 6c 65 20  to.** the Table 
201c0 73 74 72 75 63 74 75 72 65 73 20 6f 66 20 61 6c  structures of al
201d0 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75  l FROM-clause su
201e0 62 71 75 65 72 69 65 73 20 69 6e 20 61 0a 2a 2a  bqueries in a.**
201f0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
20200 74 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 69  t..**.** Use thi
20210 73 20 72 6f 75 74 69 6e 65 20 61 66 74 65 72 20  s routine after 
20220 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 2e  name resolution.
20230 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
20240 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41 64 64  sqlite3SelectAdd
20250 54 79 70 65 49 6e 66 6f 28 50 61 72 73 65 20 2a  TypeInfo(Parse *
20260 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a  pParse, Select *
20270 70 53 65 6c 65 63 74 29 7b 0a 23 69 66 6e 64 65  pSelect){.#ifnde
20280 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
20290 42 51 55 45 52 59 0a 20 20 57 61 6c 6b 65 72 20  BQUERY.  Walker 
202a0 77 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c 20  w;.  memset(&w, 
202b0 30 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20  0, sizeof(w));. 
202c0 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61   w.xSelectCallba
202d0 63 6b 20 3d 20 73 65 6c 65 63 74 41 64 64 53 75  ck = selectAddSu
202e0 62 71 75 65 72 79 54 79 70 65 49 6e 66 6f 3b 0a  bqueryTypeInfo;.
202f0 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63    w.xExprCallbac
20300 6b 20 3d 20 65 78 70 72 57 61 6c 6b 4e 6f 6f 70  k = exprWalkNoop
20310 3b 0a 20 20 77 2e 70 50 61 72 73 65 20 3d 20 70  ;.  w.pParse = p
20320 50 61 72 73 65 3b 0a 20 20 77 2e 62 53 65 6c 65  Parse;.  w.bSele
20330 63 74 44 65 70 74 68 46 69 72 73 74 20 3d 20 31  ctDepthFirst = 1
20340 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53  ;.  sqlite3WalkS
20350 65 6c 65 63 74 28 26 77 2c 20 70 53 65 6c 65 63  elect(&w, pSelec
20360 74 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f  t);.#endif.}.../
20370 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
20380 65 20 73 65 74 73 20 75 70 20 61 20 53 45 4c 45  e sets up a SELE
20390 43 54 20 73 74 61 74 65 6d 65 6e 74 20 66 6f 72  CT statement for
203a0 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 54 68   processing.  Th
203b0 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 69  e.** following i
203c0 73 20 61 63 63 6f 6d 70 6c 69 73 68 65 64 3a 0a  s accomplished:.
203d0 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 20 56 44 42  **.**     *  VDB
203e0 45 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 73  E Cursor numbers
203f0 20 61 72 65 20 61 73 73 69 67 6e 65 64 20 74 6f   are assigned to
20400 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65   all FROM-clause
20410 20 74 65 72 6d 73 2e 0a 2a 2a 20 20 20 20 20 2a   terms..**     *
20420 20 20 45 70 68 65 6d 65 72 61 6c 20 54 61 62 6c    Ephemeral Tabl
20430 65 20 6f 62 6a 65 63 74 73 20 61 72 65 20 63 72  e objects are cr
20440 65 61 74 65 64 20 66 6f 72 20 61 6c 6c 20 46 52  eated for all FR
20450 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62 71 75 65  OM-clause subque
20460 72 69 65 73 2e 0a 2a 2a 20 20 20 20 20 2a 20 20  ries..**     *  
20470 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61  ON and USING cla
20480 75 73 65 73 20 61 72 65 20 73 68 69 66 74 65 64  uses are shifted
20490 20 69 6e 74 6f 20 57 48 45 52 45 20 73 74 61 74   into WHERE stat
204a0 65 6d 65 6e 74 73 0a 2a 2a 20 20 20 20 20 2a 20  ements.**     * 
204b0 20 57 69 6c 64 63 61 72 64 73 20 22 2a 22 20 61   Wildcards "*" a
204c0 6e 64 20 22 54 41 42 4c 45 2e 2a 22 20 69 6e 20  nd "TABLE.*" in 
204d0 72 65 73 75 6c 74 20 73 65 74 73 20 61 72 65 20  result sets are 
204e0 65 78 70 61 6e 64 65 64 2e 0a 2a 2a 20 20 20 20  expanded..**    
204f0 20 2a 20 20 49 64 65 6e 74 69 66 69 65 72 73 20   *  Identifiers 
20500 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61 72  in expression ar
20510 65 20 6d 61 74 63 68 65 64 20 74 6f 20 74 61 62  e matched to tab
20520 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  les..**.** This 
20530 72 6f 75 74 69 6e 65 20 61 63 74 73 20 72 65 63  routine acts rec
20540 75 72 73 69 76 65 6c 79 20 6f 6e 20 61 6c 6c 20  ursively on all 
20550 73 75 62 71 75 65 72 69 65 73 20 77 69 74 68 69  subqueries withi
20560 6e 20 74 68 65 20 53 45 4c 45 43 54 2e 0a 2a 2f  n the SELECT..*/
20570 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c  .void sqlite3Sel
20580 65 63 74 50 72 65 70 28 0a 20 20 50 61 72 73 65  ectPrep(.  Parse
20590 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
205a0 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20    /* The parser 
205b0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
205c0 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
205d0 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43      /* The SELEC
205e0 54 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e  T statement bein
205f0 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 4e 61  g coded. */.  Na
20600 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4f 75 74 65  meContext *pOute
20610 72 4e 43 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e  rNC  /* Name con
20620 74 65 78 74 20 66 6f 72 20 63 6f 6e 74 61 69 6e  text for contain
20630 65 72 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  er */.){.  sqlit
20640 65 33 20 2a 64 62 3b 0a 20 20 69 66 28 20 4e 45  e3 *db;.  if( NE
20650 56 45 52 28 70 3d 3d 30 29 20 29 20 72 65 74 75  VER(p==0) ) retu
20660 72 6e 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73  rn;.  db = pPars
20670 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 64 62 2d  e->db;.  if( db-
20680 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
20690 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 2d  return;.  if( p-
206a0 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 48  >selFlags & SF_H
206b0 61 73 54 79 70 65 49 6e 66 6f 20 29 20 72 65 74  asTypeInfo ) ret
206c0 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  urn;.  sqlite3Se
206d0 6c 65 63 74 45 78 70 61 6e 64 28 70 50 61 72 73  lectExpand(pPars
206e0 65 2c 20 70 29 3b 0a 20 20 69 66 28 20 70 50 61  e, p);.  if( pPa
206f0 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d  rse->nErr || db-
20700 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
20710 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65  return;.  sqlite
20720 33 52 65 73 6f 6c 76 65 53 65 6c 65 63 74 4e 61  3ResolveSelectNa
20730 6d 65 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70  mes(pParse, p, p
20740 4f 75 74 65 72 4e 43 29 3b 0a 20 20 69 66 28 20  OuterNC);.  if( 
20750 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
20760 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
20770 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c   ) return;.  sql
20780 69 74 65 33 53 65 6c 65 63 74 41 64 64 54 79 70  ite3SelectAddTyp
20790 65 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 29  eInfo(pParse, p)
207a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 65 74  ;.}../*.** Reset
207b0 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20 61   the aggregate a
207c0 63 63 75 6d 75 6c 61 74 6f 72 2e 0a 2a 2a 0a 2a  ccumulator..**.*
207d0 2a 20 54 68 65 20 61 67 67 72 65 67 61 74 65 20  * The aggregate 
207e0 61 63 63 75 6d 75 6c 61 74 6f 72 20 69 73 20 61  accumulator is a
207f0 20 73 65 74 20 6f 66 20 6d 65 6d 6f 72 79 20 63   set of memory c
20800 65 6c 6c 73 20 74 68 61 74 20 68 6f 6c 64 0a 2a  ells that hold.*
20810 2a 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 72  * intermediate r
20820 65 73 75 6c 74 73 20 77 68 69 6c 65 20 63 61 6c  esults while cal
20830 63 75 6c 61 74 69 6e 67 20 61 6e 20 61 67 67 72  culating an aggr
20840 65 67 61 74 65 2e 20 20 54 68 69 73 0a 2a 2a 20  egate.  This.** 
20850 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65  routine generate
20860 73 20 63 6f 64 65 20 74 68 61 74 20 73 74 6f 72  s code that stor
20870 65 73 20 4e 55 4c 4c 73 20 69 6e 20 61 6c 6c 20  es NULLs in all 
20880 6f 66 20 74 68 6f 73 65 20 6d 65 6d 6f 72 79 0a  of those memory.
20890 2a 2a 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 73 74 61  ** cells..*/.sta
208a0 74 69 63 20 76 6f 69 64 20 72 65 73 65 74 41 63  tic void resetAc
208b0 63 75 6d 75 6c 61 74 6f 72 28 50 61 72 73 65 20  cumulator(Parse 
208c0 2a 70 50 61 72 73 65 2c 20 41 67 67 49 6e 66 6f  *pParse, AggInfo
208d0 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56   *pAggInfo){.  V
208e0 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
208f0 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b  >pVdbe;.  int i;
20900 0a 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66  .  struct AggInf
20910 6f 5f 66 75 6e 63 20 2a 70 46 75 6e 63 3b 0a 20  o_func *pFunc;. 
20920 20 69 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e 6e   if( pAggInfo->n
20930 46 75 6e 63 2b 70 41 67 67 49 6e 66 6f 2d 3e 6e  Func+pAggInfo->n
20940 43 6f 6c 75 6d 6e 3d 3d 30 20 29 7b 0a 20 20 20  Column==0 ){.   
20950 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 66   return;.  }.  f
20960 6f 72 28 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e  or(i=0; i<pAggIn
20970 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b  fo->nColumn; i++
20980 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
20990 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
209a0 75 6c 6c 2c 20 30 2c 20 70 41 67 67 49 6e 66 6f  ull, 0, pAggInfo
209b0 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 4d 65 6d 29 3b  ->aCol[i].iMem);
209c0 0a 20 20 7d 0a 20 20 66 6f 72 28 70 46 75 6e 63  .  }.  for(pFunc
209d0 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63  =pAggInfo->aFunc
209e0 2c 20 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66  , i=0; i<pAggInf
209f0 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70  o->nFunc; i++, p
20a00 46 75 6e 63 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  Func++){.    sql
20a10 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
20a20 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 46  , OP_Null, 0, pF
20a30 75 6e 63 2d 3e 69 4d 65 6d 29 3b 0a 20 20 20 20  unc->iMem);.    
20a40 69 66 28 20 70 46 75 6e 63 2d 3e 69 44 69 73 74  if( pFunc->iDist
20a50 69 6e 63 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20  inct>=0 ){.     
20a60 20 45 78 70 72 20 2a 70 45 20 3d 20 70 46 75 6e   Expr *pE = pFun
20a70 63 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  c->pExpr;.      
20a80 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
20a90 50 72 6f 70 65 72 74 79 28 70 45 2c 20 45 50 5f  Property(pE, EP_
20aa0 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20  xIsSelect) );.  
20ab0 20 20 20 20 69 66 28 20 70 45 2d 3e 78 2e 70 4c      if( pE->x.pL
20ac0 69 73 74 3d 3d 30 20 7c 7c 20 70 45 2d 3e 78 2e  ist==0 || pE->x.
20ad0 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20  pList->nExpr!=1 
20ae0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
20af0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
20b00 65 2c 20 22 44 49 53 54 49 4e 43 54 20 61 67 67  e, "DISTINCT agg
20b10 72 65 67 61 74 65 73 20 6d 75 73 74 20 68 61 76  regates must hav
20b20 65 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 22 0a  e exactly one ".
20b30 20 20 20 20 20 20 20 20 20 20 20 22 61 72 67 75             "argu
20b40 6d 65 6e 74 22 29 3b 0a 20 20 20 20 20 20 20 20  ment");.        
20b50 70 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74  pFunc->iDistinct
20b60 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c   = -1;.      }el
20b70 73 65 7b 0a 20 20 20 20 20 20 20 20 4b 65 79 49  se{.        KeyI
20b80 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20  nfo *pKeyInfo = 
20b90 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c  keyInfoFromExprL
20ba0 69 73 74 28 70 50 61 72 73 65 2c 20 70 45 2d 3e  ist(pParse, pE->
20bb0 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  x.pList);.      
20bc0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
20bd0 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  Op4(v, OP_OpenEp
20be0 68 65 6d 65 72 61 6c 2c 20 70 46 75 6e 63 2d 3e  hemeral, pFunc->
20bf0 69 44 69 73 74 69 6e 63 74 2c 20 30 2c 20 30 2c  iDistinct, 0, 0,
20c00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
20c10 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
20c20 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b  *)pKeyInfo, P4_K
20c30 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b  EYINFO_HANDOFF);
20c40 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
20c50 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f   }.}../*.** Invo
20c60 6b 65 20 74 68 65 20 4f 50 5f 41 67 67 46 69 6e  ke the OP_AggFin
20c70 61 6c 69 7a 65 20 6f 70 63 6f 64 65 20 66 6f 72  alize opcode for
20c80 20 65 76 65 72 79 20 61 67 67 72 65 67 61 74 65   every aggregate
20c90 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20   function.** in 
20ca0 74 68 65 20 41 67 67 49 6e 66 6f 20 73 74 72 75  the AggInfo stru
20cb0 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  cture..*/.static
20cc0 20 76 6f 69 64 20 66 69 6e 61 6c 69 7a 65 41 67   void finalizeAg
20cd0 67 46 75 6e 63 74 69 6f 6e 73 28 50 61 72 73 65  gFunctions(Parse
20ce0 20 2a 70 50 61 72 73 65 2c 20 41 67 67 49 6e 66   *pParse, AggInf
20cf0 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20  o *pAggInfo){.  
20d00 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
20d10 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
20d20 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67 49 6e  ;.  struct AggIn
20d30 66 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a 20 20 66  fo_func *pF;.  f
20d40 6f 72 28 69 3d 30 2c 20 70 46 3d 70 41 67 67 49  or(i=0, pF=pAggI
20d50 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c 70 41  nfo->aFunc; i<pA
20d60 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69  ggInfo->nFunc; i
20d70 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20 20 20 45  ++, pF++){.    E
20d80 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d  xprList *pList =
20d90 20 70 46 2d 3e 70 45 78 70 72 2d 3e 78 2e 70 4c   pF->pExpr->x.pL
20da0 69 73 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ist;.    assert(
20db0 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
20dc0 79 28 70 46 2d 3e 70 45 78 70 72 2c 20 45 50 5f  y(pF->pExpr, EP_
20dd0 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20  xIsSelect) );.  
20de0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
20df0 4f 70 34 28 76 2c 20 4f 50 5f 41 67 67 46 69 6e  Op4(v, OP_AggFin
20e00 61 6c 2c 20 70 46 2d 3e 69 4d 65 6d 2c 20 70 4c  al, pF->iMem, pL
20e10 69 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45 78  ist ? pList->nEx
20e20 70 72 20 3a 20 30 2c 20 30 2c 0a 20 20 20 20 20  pr : 0, 0,.     
20e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20e40 20 28 76 6f 69 64 2a 29 70 46 2d 3e 70 46 75 6e   (void*)pF->pFun
20e50 63 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a  c, P4_FUNCDEF);.
20e60 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70 64    }.}../*.** Upd
20e70 61 74 65 20 74 68 65 20 61 63 63 75 6d 75 6c 61  ate the accumula
20e80 74 6f 72 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73  tor memory cells
20e90 20 66 6f 72 20 61 6e 20 61 67 67 72 65 67 61 74   for an aggregat
20ea0 65 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 74 68  e based on.** th
20eb0 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72  e current cursor
20ec0 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 73 74   position..*/.st
20ed0 61 74 69 63 20 76 6f 69 64 20 75 70 64 61 74 65  atic void update
20ee0 41 63 63 75 6d 75 6c 61 74 6f 72 28 50 61 72 73  Accumulator(Pars
20ef0 65 20 2a 70 50 61 72 73 65 2c 20 41 67 67 49 6e  e *pParse, AggIn
20f00 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20  fo *pAggInfo){. 
20f10 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
20f20 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
20f30 69 3b 0a 20 20 69 6e 74 20 72 65 67 48 69 74 20  i;.  int regHit 
20f40 3d 20 30 3b 0a 20 20 69 6e 74 20 61 64 64 72 48  = 0;.  int addrH
20f50 69 74 54 65 73 74 20 3d 20 30 3b 0a 20 20 73 74  itTest = 0;.  st
20f60 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e  ruct AggInfo_fun
20f70 63 20 2a 70 46 3b 0a 20 20 73 74 72 75 63 74 20  c *pF;.  struct 
20f80 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 3b  AggInfo_col *pC;
20f90 0a 0a 20 20 70 41 67 67 49 6e 66 6f 2d 3e 64 69  ..  pAggInfo->di
20fa0 72 65 63 74 4d 6f 64 65 20 3d 20 31 3b 0a 20 20  rectMode = 1;.  
20fb0 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
20fc0 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20  Clear(pParse);. 
20fd0 20 66 6f 72 28 69 3d 30 2c 20 70 46 3d 70 41 67   for(i=0, pF=pAg
20fe0 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c  gInfo->aFunc; i<
20ff0 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b  pAggInfo->nFunc;
21000 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20 20   i++, pF++){.   
21010 20 69 6e 74 20 6e 41 72 67 3b 0a 20 20 20 20 69   int nArg;.    i
21020 6e 74 20 61 64 64 72 4e 65 78 74 20 3d 20 30 3b  nt addrNext = 0;
21030 0a 20 20 20 20 69 6e 74 20 72 65 67 41 67 67 3b  .    int regAgg;
21040 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70  .    ExprList *p
21050 4c 69 73 74 20 3d 20 70 46 2d 3e 70 45 78 70 72  List = pF->pExpr
21060 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 61  ->x.pList;.    a
21070 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
21080 72 6f 70 65 72 74 79 28 70 46 2d 3e 70 45 78 70  roperty(pF->pExp
21090 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
210a0 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73   );.    if( pLis
210b0 74 20 29 7b 0a 20 20 20 20 20 20 6e 41 72 67 20  t ){.      nArg 
210c0 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a  = pList->nExpr;.
210d0 20 20 20 20 20 20 72 65 67 41 67 67 20 3d 20 73        regAgg = s
210e0 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e  qlite3GetTempRan
210f0 67 65 28 70 50 61 72 73 65 2c 20 6e 41 72 67 29  ge(pParse, nArg)
21100 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
21110 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28  xprCodeExprList(
21120 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2c 20 72  pParse, pList, r
21130 65 67 41 67 67 2c 20 31 29 3b 0a 20 20 20 20 7d  egAgg, 1);.    }
21140 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 41 72 67  else{.      nArg
21150 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 67 41   = 0;.      regA
21160 67 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  gg = 0;.    }.  
21170 20 20 69 66 28 20 70 46 2d 3e 69 44 69 73 74 69    if( pF->iDisti
21180 6e 63 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  nct>=0 ){.      
21190 61 64 64 72 4e 65 78 74 20 3d 20 73 71 6c 69 74  addrNext = sqlit
211a0 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
211b0 76 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  v);.      assert
211c0 28 20 6e 41 72 67 3d 3d 31 20 29 3b 0a 20 20 20  ( nArg==1 );.   
211d0 20 20 20 63 6f 64 65 44 69 73 74 69 6e 63 74 28     codeDistinct(
211e0 70 50 61 72 73 65 2c 20 70 46 2d 3e 69 44 69 73  pParse, pF->iDis
211f0 74 69 6e 63 74 2c 20 61 64 64 72 4e 65 78 74 2c  tinct, addrNext,
21200 20 31 2c 20 72 65 67 41 67 67 29 3b 0a 20 20 20   1, regAgg);.   
21210 20 7d 0a 20 20 20 20 69 66 28 20 70 46 2d 3e 70   }.    if( pF->p
21220 46 75 6e 63 2d 3e 66 6c 61 67 73 20 26 20 53 51  Func->flags & SQ
21230 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f  LITE_FUNC_NEEDCO
21240 4c 4c 20 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c  LL ){.      Coll
21250 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a  Seq *pColl = 0;.
21260 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70        struct Exp
21270 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
21280 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  m;.      int j;.
21290 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c        assert( pL
212a0 69 73 74 21 3d 30 20 29 3b 20 20 2f 2a 20 70 4c  ist!=0 );  /* pL
212b0 69 73 74 21 3d 30 20 69 66 20 70 46 2d 3e 70 46  ist!=0 if pF->pF
212c0 75 6e 63 20 68 61 73 20 4e 45 45 44 43 4f 4c 4c  unc has NEEDCOLL
212d0 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d   */.      for(j=
212e0 30 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e  0, pItem=pList->
212f0 61 3b 20 21 70 43 6f 6c 6c 20 26 26 20 6a 3c 6e  a; !pColl && j<n
21300 41 72 67 3b 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b  Arg; j++, pItem+
21310 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c  +){.        pCol
21320 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
21330 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
21340 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20  Item->pExpr);.  
21350 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
21360 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20  !pColl ){.      
21370 20 20 70 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65    pColl = pParse
21380 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b  ->db->pDfltColl;
21390 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
213a0 66 28 20 72 65 67 48 69 74 3d 3d 30 20 26 26 20  f( regHit==0 && 
213b0 70 41 67 67 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d  pAggInfo->nAccum
213c0 75 6c 61 74 6f 72 20 29 20 72 65 67 48 69 74 20  ulator ) regHit 
213d0 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
213e0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
213f0 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
21400 43 6f 6c 6c 53 65 71 2c 20 72 65 67 48 69 74 2c  CollSeq, regHit,
21410 20 30 2c 20 30 2c 20 28 63 68 61 72 20 2a 29 70   0, 0, (char *)p
21420 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51  Coll, P4_COLLSEQ
21430 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
21440 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
21450 2c 20 4f 50 5f 41 67 67 53 74 65 70 2c 20 30 2c  , OP_AggStep, 0,
21460 20 72 65 67 41 67 67 2c 20 70 46 2d 3e 69 4d 65   regAgg, pF->iMe
21470 6d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  m,.             
21480 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29           (void*)
21490 70 46 2d 3e 70 46 75 6e 63 2c 20 50 34 5f 46 55  pF->pFunc, P4_FU
214a0 4e 43 44 45 46 29 3b 0a 20 20 20 20 73 71 6c 69  NCDEF);.    sqli
214b0 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
214c0 76 2c 20 28 75 38 29 6e 41 72 67 29 3b 0a 20 20  v, (u8)nArg);.  
214d0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
214e0 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  heAffinityChange
214f0 28 70 50 61 72 73 65 2c 20 72 65 67 41 67 67 2c  (pParse, regAgg,
21500 20 6e 41 72 67 29 3b 0a 20 20 20 20 73 71 6c 69   nArg);.    sqli
21510 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61  te3ReleaseTempRa
21520 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 41  nge(pParse, regA
21530 67 67 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20 69  gg, nArg);.    i
21540 66 28 20 61 64 64 72 4e 65 78 74 20 29 7b 0a 20  f( addrNext ){. 
21550 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
21560 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
21570 61 64 64 72 4e 65 78 74 29 3b 0a 20 20 20 20 20  addrNext);.     
21580 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
21590 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a  eClear(pParse);.
215a0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
215b0 42 65 66 6f 72 65 20 70 6f 70 75 6c 61 74 69 6e  Before populatin
215c0 67 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74 6f  g the accumulato
215d0 72 20 72 65 67 69 73 74 65 72 73 2c 20 63 6c 65  r registers, cle
215e0 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61  ar the column ca
215f0 63 68 65 2e 0a 20 20 2a 2a 20 4f 74 68 65 72 77  che..  ** Otherw
21600 69 73 65 2c 20 69 66 20 61 6e 79 20 6f 66 20 74  ise, if any of t
21610 68 65 20 72 65 71 75 69 72 65 64 20 63 6f 6c 75  he required colu
21620 6d 6e 20 76 61 6c 75 65 73 20 61 72 65 20 61 6c  mn values are al
21630 72 65 61 64 79 20 70 72 65 73 65 6e 74 20 0a 20  ready present . 
21640 20 2a 2a 20 69 6e 20 72 65 67 69 73 74 65 72 73   ** in registers
21650 2c 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  , sqlite3ExprCod
21660 65 28 29 20 6d 61 79 20 75 73 65 20 4f 50 5f 53  e() may use OP_S
21670 43 6f 70 79 20 74 6f 20 63 6f 70 79 20 74 68 65  Copy to copy the
21680 20 76 61 6c 75 65 0a 20 20 2a 2a 20 74 6f 20 70   value.  ** to p
21690 43 2d 3e 69 4d 65 6d 2e 20 42 75 74 20 62 79 20  C->iMem. But by 
216a0 74 68 65 20 74 69 6d 65 20 74 68 65 20 76 61 6c  the time the val
216b0 75 65 20 69 73 20 75 73 65 64 2c 20 74 68 65 20  ue is used, the 
216c0 6f 72 69 67 69 6e 61 6c 20 72 65 67 69 73 74 65  original registe
216d0 72 0a 20 20 2a 2a 20 6d 61 79 20 68 61 76 65 20  r.  ** may have 
216e0 62 65 65 6e 20 75 73 65 64 2c 20 69 6e 76 61 6c  been used, inval
216f0 69 64 61 74 69 6e 67 20 74 68 65 20 75 6e 64 65  idating the unde
21700 72 6c 79 69 6e 67 20 62 75 66 66 65 72 20 68 6f  rlying buffer ho
21710 6c 64 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 74  lding the.  ** t
21720 65 78 74 20 6f 72 20 62 6c 6f 62 20 76 61 6c 75  ext or blob valu
21730 65 2e 20 53 65 65 20 74 69 63 6b 65 74 20 5b 38  e. See ticket [8
21740 38 33 30 33 34 64 63 62 35 5d 2e 0a 20 20 2a 2a  83034dcb5]..  **
21750 0a 20 20 2a 2a 20 41 6e 6f 74 68 65 72 20 73 6f  .  ** Another so
21760 6c 75 74 69 6f 6e 20 77 6f 75 6c 64 20 62 65 20  lution would be 
21770 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20 4f 50  to change the OP
21780 5f 53 43 6f 70 79 20 75 73 65 64 20 74 6f 20 63  _SCopy used to c
21790 6f 70 79 20 63 61 63 68 65 64 0a 20 20 2a 2a 20  opy cached.  ** 
217a0 76 61 6c 75 65 73 20 74 6f 20 61 6e 20 4f 50 5f  values to an OP_
217b0 43 6f 70 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  Copy..  */.  if(
217c0 20 72 65 67 48 69 74 20 29 7b 0a 20 20 20 20 61   regHit ){.    a
217d0 64 64 72 48 69 74 54 65 73 74 20 3d 20 73 71 6c  ddrHitTest = sql
217e0 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
217f0 2c 20 4f 50 5f 49 66 2c 20 72 65 67 48 69 74 29  , OP_If, regHit)
21800 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45  ;.  }.  sqlite3E
21810 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50  xprCacheClear(pP
21820 61 72 73 65 29 3b 0a 20 20 66 6f 72 28 69 3d 30  arse);.  for(i=0
21830 2c 20 70 43 3d 70 41 67 67 49 6e 66 6f 2d 3e 61  , pC=pAggInfo->a
21840 43 6f 6c 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d  Col; i<pAggInfo-
21850 3e 6e 41 63 63 75 6d 75 6c 61 74 6f 72 3b 20 69  >nAccumulator; i
21860 2b 2b 2c 20 70 43 2b 2b 29 7b 0a 20 20 20 20 73  ++, pC++){.    s
21870 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
21880 50 61 72 73 65 2c 20 70 43 2d 3e 70 45 78 70 72  Parse, pC->pExpr
21890 2c 20 70 43 2d 3e 69 4d 65 6d 29 3b 0a 20 20 7d  , pC->iMem);.  }
218a0 0a 20 20 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72  .  pAggInfo->dir
218b0 65 63 74 4d 6f 64 65 20 3d 20 30 3b 0a 20 20 73  ectMode = 0;.  s
218c0 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43  qlite3ExprCacheC
218d0 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20  lear(pParse);.  
218e0 69 66 28 20 61 64 64 72 48 69 74 54 65 73 74 20  if( addrHitTest 
218f0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
21900 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
21910 64 72 48 69 74 54 65 73 74 29 3b 0a 20 20 7d 0a  drHitTest);.  }.
21920 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 73  }../*.** Add a s
21930 69 6e 67 6c 65 20 4f 50 5f 45 78 70 6c 61 69 6e  ingle OP_Explain
21940 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20   instruction to 
21950 74 68 65 20 56 44 42 45 20 74 6f 20 65 78 70 6c  the VDBE to expl
21960 61 69 6e 20 61 20 73 69 6d 70 6c 65 0a 2a 2a 20  ain a simple.** 
21970 63 6f 75 6e 74 28 2a 29 20 71 75 65 72 79 20 28  count(*) query (
21980 22 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29  "SELECT count(*)
21990 20 46 52 4f 4d 20 70 54 61 62 22 29 2e 0a 2a 2f   FROM pTab")..*/
219a0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
219b0 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 73 74 61  OMIT_EXPLAIN.sta
219c0 74 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69 6e  tic void explain
219d0 53 69 6d 70 6c 65 43 6f 75 6e 74 28 0a 20 20 50  SimpleCount(.  P
219e0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
219f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21a00 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20  * Parse context 
21a10 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  */.  Table *pTab
21a20 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
21a30 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 62 65       /* Table be
21a40 69 6e 67 20 71 75 65 72 69 65 64 20 2a 2f 0a 20  ing queried */. 
21a50 20 49 6e 64 65 78 20 2a 70 49 64 78 20 20 20 20   Index *pIdx    
21a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a70 20 2f 2a 20 49 6e 64 65 78 20 75 73 65 64 20 74   /* Index used t
21a80 6f 20 6f 70 74 69 6d 69 7a 65 20 73 63 61 6e 2c  o optimize scan,
21a90 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20   or NULL */.){. 
21aa0 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70   if( pParse->exp
21ab0 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 63  lain==2 ){.    c
21ac0 68 61 72 20 2a 7a 45 71 70 20 3d 20 73 71 6c 69  har *zEqp = sqli
21ad0 74 65 33 4d 50 72 69 6e 74 66 28 70 50 61 72 73  te3MPrintf(pPars
21ae0 65 2d 3e 64 62 2c 20 22 53 43 41 4e 20 54 41 42  e->db, "SCAN TAB
21af0 4c 45 20 25 73 25 73 25 73 22 2c 0a 20 20 20 20  LE %s%s%s",.    
21b00 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c      pTab->zName,
21b10 20 0a 20 20 20 20 20 20 20 20 70 49 64 78 20 3f   .        pIdx ?
21b20 20 22 20 55 53 49 4e 47 20 43 4f 56 45 52 49 4e   " USING COVERIN
21b30 47 20 49 4e 44 45 58 20 22 20 3a 20 22 22 2c 0a  G INDEX " : "",.
21b40 20 20 20 20 20 20 20 20 70 49 64 78 20 3f 20 70          pIdx ? p
21b50 49 64 78 2d 3e 7a 4e 61 6d 65 20 3a 20 22 22 0a  Idx->zName : "".
21b60 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74      );.    sqlit
21b70 65 33 56 64 62 65 41 64 64 4f 70 34 28 0a 20 20  e3VdbeAddOp4(.  
21b80 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 70 56        pParse->pV
21b90 64 62 65 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c  dbe, OP_Explain,
21ba0 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74   pParse->iSelect
21bb0 49 64 2c 20 30 2c 20 30 2c 20 7a 45 71 70 2c 20  Id, 0, 0, zEqp, 
21bc0 50 34 5f 44 59 4e 41 4d 49 43 0a 20 20 20 20 29  P4_DYNAMIC.    )
21bd0 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20  ;.  }.}.#else.# 
21be0 64 65 66 69 6e 65 20 65 78 70 6c 61 69 6e 53 69  define explainSi
21bf0 6d 70 6c 65 43 6f 75 6e 74 28 61 2c 62 2c 63 29  mpleCount(a,b,c)
21c00 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47  .#endif../*.** G
21c10 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
21c20 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
21c30 65 6d 65 6e 74 20 67 69 76 65 6e 20 69 6e 20 74  ement given in t
21c40 68 65 20 70 20 61 72 67 75 6d 65 6e 74 2e 20 20  he p argument.  
21c50 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c  .**.** The resul
21c60 74 73 20 61 72 65 20 64 69 73 74 72 69 62 75 74  ts are distribut
21c70 65 64 20 69 6e 20 76 61 72 69 6f 75 73 20 77 61  ed in various wa
21c80 79 73 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20  ys depending on 
21c90 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20  the.** contents 
21ca0 6f 66 20 74 68 65 20 53 65 6c 65 63 74 44 65 73  of the SelectDes
21cb0 74 20 73 74 72 75 63 74 75 72 65 20 70 6f 69 6e  t structure poin
21cc0 74 65 64 20 74 6f 20 62 79 20 61 72 67 75 6d 65  ted to by argume
21cd0 6e 74 20 70 44 65 73 74 0a 2a 2a 20 61 73 20 66  nt pDest.** as f
21ce0 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
21cf0 20 20 70 44 65 73 74 2d 3e 65 44 65 73 74 20 20    pDest->eDest  
21d00 20 20 52 65 73 75 6c 74 0a 2a 2a 20 20 20 20 20    Result.**     
21d10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20  ------------    
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 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20  -----------.**  
21d50 20 20 20 53 52 54 5f 4f 75 74 70 75 74 20 20 20     SRT_Output   
21d60 20 20 20 47 65 6e 65 72 61 74 65 20 61 20 72 6f     Generate a ro
21d70 77 20 6f 66 20 6f 75 74 70 75 74 20 28 75 73 69  w of output (usi
21d80 6e 67 20 74 68 65 20 4f 50 5f 52 65 73 75 6c 74  ng the OP_Result
21d90 52 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  Row.**          
21da0 20 20 20 20 20 20 20 20 20 20 20 6f 70 63 6f 64             opcod
21db0 65 29 20 66 6f 72 20 65 61 63 68 20 72 6f 77 20  e) for each row 
21dc0 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
21dd0 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54  t..**.**     SRT
21de0 5f 4d 65 6d 20 20 20 20 20 20 20 20 20 4f 6e 6c  _Mem         Onl
21df0 79 20 76 61 6c 69 64 20 69 66 20 74 68 65 20 72  y valid if the r
21e00 65 73 75 6c 74 20 69 73 20 61 20 73 69 6e 67 6c  esult is a singl
21e10 65 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 20 20 20 20  e column..**    
21e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21e30 20 53 74 6f 72 65 20 74 68 65 20 66 69 72 73 74   Store the first
21e40 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 66   column of the f
21e50 69 72 73 74 20 72 65 73 75 6c 74 20 72 6f 77 0a  irst result row.
21e60 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
21e70 20 20 20 20 20 20 20 69 6e 20 72 65 67 69 73 74         in regist
21e80 65 72 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72  er pDest->iSDPar
21e90 6d 20 74 68 65 6e 20 61 62 61 6e 64 6f 6e 20 74  m then abandon t
21ea0 68 65 20 72 65 73 74 0a 2a 2a 20 20 20 20 20 20  he rest.**      
21eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
21ec0 66 20 74 68 65 20 71 75 65 72 79 2e 20 20 54 68  f the query.  Th
21ed0 69 73 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 69  is destination i
21ee0 6d 70 6c 69 65 73 20 22 4c 49 4d 49 54 20 31 22  mplies "LIMIT 1"
21ef0 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f  ..**.**     SRT_
21f00 53 65 74 20 20 20 20 20 20 20 20 20 54 68 65 20  Set         The 
21f10 72 65 73 75 6c 74 20 6d 75 73 74 20 62 65 20 61  result must be a
21f20 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 2e 20   single column. 
21f30 20 53 74 6f 72 65 20 65 61 63 68 0a 2a 2a 20 20   Store each.**  
21f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21f50 20 20 20 72 6f 77 20 6f 66 20 72 65 73 75 6c 74     row of result
21f60 20 61 73 20 74 68 65 20 6b 65 79 20 69 6e 20 74   as the key in t
21f70 61 62 6c 65 20 70 44 65 73 74 2d 3e 69 53 44 50  able pDest->iSDP
21f80 61 72 6d 2e 20 0a 2a 2a 20 20 20 20 20 20 20 20  arm. .**        
21f90 20 20 20 20 20 20 20 20 20 20 20 20 20 41 70 70               App
21fa0 6c 79 20 74 68 65 20 61 66 66 69 6e 69 74 79 20  ly the affinity 
21fb0 70 44 65 73 74 2d 3e 61 66 66 53 64 73 74 20 62  pDest->affSdst b
21fc0 65 66 6f 72 65 20 73 74 6f 72 69 6e 67 0a 2a 2a  efore storing.**
21fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21fe0 20 20 20 20 20 72 65 73 75 6c 74 73 2e 20 20 55       results.  U
21ff0 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  sed to implement
22000 20 22 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e   "IN (SELECT ...
22010 29 22 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52  )"..**.**     SR
22020 54 5f 55 6e 69 6f 6e 20 20 20 20 20 20 20 53 74  T_Union       St
22030 6f 72 65 20 72 65 73 75 6c 74 73 20 61 73 20 61  ore results as a
22040 20 6b 65 79 20 69 6e 20 61 20 74 65 6d 70 6f 72   key in a tempor
22050 61 72 79 20 74 61 62 6c 65 20 0a 2a 2a 20 20 20  ary table .**   
22060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22070 20 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20    identified by 
22080 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 2e 0a  pDest->iSDParm..
22090 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 45 78  **.**     SRT_Ex
220a0 63 65 70 74 20 20 20 20 20 20 52 65 6d 6f 76 65  cept      Remove
220b0 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 74 68   results from th
220c0 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  e temporary tabl
220d0 65 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d  e pDest->iSDParm
220e0 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f  ..**.**     SRT_
220f0 54 61 62 6c 65 20 20 20 20 20 20 20 53 74 6f 72  Table       Stor
22100 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74 65 6d  e results in tem
22110 70 6f 72 61 72 79 20 74 61 62 6c 65 20 70 44 65  porary table pDe
22120 73 74 2d 3e 69 53 44 50 61 72 6d 2e 0a 2a 2a 20  st->iSDParm..** 
22130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22140 20 20 20 20 54 68 69 73 20 69 73 20 6c 69 6b 65      This is like
22150 20 53 52 54 5f 45 70 68 65 6d 54 61 62 20 65 78   SRT_EphemTab ex
22160 63 65 70 74 20 74 68 61 74 20 74 68 65 20 74 61  cept that the ta
22170 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ble.**          
22180 20 20 20 20 20 20 20 20 20 20 20 69 73 20 61 73             is as
22190 73 75 6d 65 64 20 74 6f 20 61 6c 72 65 61 64 79  sumed to already
221a0 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a 0a 2a 2a 20   be open..**.** 
221b0 20 20 20 20 53 52 54 5f 45 70 68 65 6d 54 61 62      SRT_EphemTab
221c0 20 20 20 20 43 72 65 61 74 65 20 61 6e 20 74 65      Create an te
221d0 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 70 44  mporary table pD
221e0 65 73 74 2d 3e 69 53 44 50 61 72 6d 20 61 6e 64  est->iSDParm and
221f0 20 73 74 6f 72 65 0a 2a 2a 20 20 20 20 20 20 20   store.**       
22200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68                th
22210 65 20 72 65 73 75 6c 74 20 74 68 65 72 65 2e 20  e result there. 
22220 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65  The cursor is le
22230 66 74 20 6f 70 65 6e 20 61 66 74 65 72 0a 2a 2a  ft open after.**
22240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22250 20 20 20 20 20 72 65 74 75 72 6e 69 6e 67 2e 20       returning. 
22260 20 54 68 69 73 20 69 73 20 6c 69 6b 65 20 53 52   This is like SR
22270 54 5f 54 61 62 6c 65 20 65 78 63 65 70 74 20 74  T_Table except t
22280 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  hat.**          
22290 20 20 20 20 20 20 20 20 20 20 20 74 68 69 73 20             this 
222a0 64 65 73 74 69 6e 61 74 69 6f 6e 20 75 73 65 73  destination uses
222b0 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
222c0 6c 20 74 6f 20 63 72 65 61 74 65 0a 2a 2a 20 20  l to create.**  
222d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
222e0 20 20 20 74 68 65 20 74 61 62 6c 65 20 66 69 72     the table fir
222f0 73 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52  st..**.**     SR
22300 54 5f 43 6f 72 6f 75 74 69 6e 65 20 20 20 47 65  T_Coroutine   Ge
22310 6e 65 72 61 74 65 20 61 20 63 6f 2d 72 6f 75 74  nerate a co-rout
22320 69 6e 65 20 74 68 61 74 20 72 65 74 75 72 6e 73  ine that returns
22330 20 61 20 6e 65 77 20 72 6f 77 20 6f 66 0a 2a 2a   a new row of.**
22340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22350 20 20 20 20 20 72 65 73 75 6c 74 73 20 65 61 63       results eac
22360 68 20 74 69 6d 65 20 69 74 20 69 73 20 69 6e 76  h time it is inv
22370 6f 6b 65 64 2e 20 20 54 68 65 20 65 6e 74 72 79  oked.  The entry
22380 20 70 6f 69 6e 74 0a 2a 2a 20 20 20 20 20 20 20   point.**       
22390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 66                of
223a0 20 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20   the co-routine 
223b0 69 73 20 73 74 6f 72 65 64 20 69 6e 20 72 65 67  is stored in reg
223c0 69 73 74 65 72 20 70 44 65 73 74 2d 3e 69 53 44  ister pDest->iSD
223d0 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  Parm..**.**     
223e0 53 52 54 5f 45 78 69 73 74 73 20 20 20 20 20 20  SRT_Exists      
223f0 53 74 6f 72 65 20 61 20 31 20 69 6e 20 6d 65 6d  Store a 1 in mem
22400 6f 72 79 20 63 65 6c 6c 20 70 44 65 73 74 2d 3e  ory cell pDest->
22410 69 53 44 50 61 72 6d 20 69 66 20 74 68 65 20 72  iSDParm if the r
22420 65 73 75 6c 74 0a 2a 2a 20 20 20 20 20 20 20 20  esult.**        
22430 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74               set
22440 20 69 73 20 6e 6f 74 20 65 6d 70 74 79 2e 0a 2a   is not empty..*
22450 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 44 69 73  *.**     SRT_Dis
22460 63 61 72 64 20 20 20 20 20 54 68 72 6f 77 20 74  card     Throw t
22470 68 65 20 72 65 73 75 6c 74 73 20 61 77 61 79 2e  he results away.
22480 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20 62    This is used b
22490 79 20 53 45 4c 45 43 54 0a 2a 2a 20 20 20 20 20  y SELECT.**     
224a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
224b0 73 74 61 74 65 6d 65 6e 74 73 20 77 69 74 68 69  statements withi
224c0 6e 20 74 72 69 67 67 65 72 73 20 77 68 6f 73 65  n triggers whose
224d0 20 6f 6e 6c 79 20 70 75 72 70 6f 73 65 20 69 73   only purpose is
224e0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
224f0 20 20 20 20 20 20 20 20 74 68 65 20 73 69 64 65          the side
22500 2d 65 66 66 65 63 74 73 20 6f 66 20 66 75 6e 63  -effects of func
22510 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  tions..**.** Thi
22520 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
22530 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
22540 65 72 72 6f 72 73 2e 20 20 49 66 20 61 6e 79 20  errors.  If any 
22550 65 72 72 6f 72 73 20 61 72 65 0a 2a 2a 20 65 6e  errors are.** en
22560 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 65 6e 20  countered, then 
22570 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65  an appropriate e
22580 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20  rror message is 
22590 6c 65 66 74 20 69 6e 0a 2a 2a 20 70 50 61 72 73  left in.** pPars
225a0 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a  e->zErrMsg..**.*
225b0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64  * This routine d
225c0 6f 65 73 20 4e 4f 54 20 66 72 65 65 20 74 68 65  oes NOT free the
225d0 20 53 65 6c 65 63 74 20 73 74 72 75 63 74 75 72   Select structur
225e0 65 20 70 61 73 73 65 64 20 69 6e 2e 20 20 54 68  e passed in.  Th
225f0 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 66 75 6e  e.** calling fun
22600 63 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f 20 64  ction needs to d
22610 6f 20 74 68 61 74 2e 0a 2a 2f 0a 69 6e 74 20 73  o that..*/.int s
22620 71 6c 69 74 65 33 53 65 6c 65 63 74 28 0a 20 20  qlite3Select(.  
22630 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
22640 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
22650 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
22660 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
22670 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
22680 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
22690 20 62 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a 2f   being coded. */
226a0 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70  .  SelectDest *p
226b0 44 65 73 74 20 20 20 20 20 20 2f 2a 20 57 68 61  Dest      /* Wha
226c0 74 20 74 6f 20 64 6f 20 77 69 74 68 20 74 68 65  t to do with the
226d0 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a   query results *
226e0 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  /.){.  int i, j;
226f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22700 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a   Loop counters *
22710 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  /.  WhereInfo *p
22720 57 49 6e 66 6f 3b 20 20 20 20 20 2f 2a 20 52 65  WInfo;     /* Re
22730 74 75 72 6e 20 66 72 6f 6d 20 73 71 6c 69 74 65  turn from sqlite
22740 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 2a 2f  3WhereBegin() */
22750 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20  .  Vdbe *v;     
22760 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
22770 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
22780 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
22790 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41  ion */.  int isA
227a0 67 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  gg;             
227b0 2f 2a 20 54 72 75 65 20 66 6f 72 20 73 65 6c 65  /* True for sele
227c0 63 74 20 6c 69 73 74 73 20 6c 69 6b 65 20 22 63  ct lists like "c
227d0 6f 75 6e 74 28 2a 29 22 20 2a 2f 0a 20 20 45 78  ount(*)" */.  Ex
227e0 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 20  prList *pEList; 
227f0 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
22800 63 6f 6c 75 6d 6e 73 20 74 6f 20 65 78 74 72 61  columns to extra
22810 63 74 2e 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ct. */.  SrcList
22820 20 2a 70 54 61 62 4c 69 73 74 3b 20 20 20 20 20   *pTabList;     
22830 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65  /* List of table
22840 73 20 74 6f 20 73 65 6c 65 63 74 20 66 72 6f 6d  s to select from
22850 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65   */.  Expr *pWhe
22860 72 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  re;          /* 
22870 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
22880 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a  .  May be NULL *
22890 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  /.  ExprList *pO
228a0 72 64 65 72 42 79 3b 20 20 20 20 2f 2a 20 54 68  rderBy;    /* Th
228b0 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
228c0 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20  e.  May be NULL 
228d0 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
228e0 47 72 6f 75 70 42 79 3b 20 20 20 20 2f 2a 20 54  GroupBy;    /* T
228f0 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75  he GROUP BY clau
22900 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c  se.  May be NULL
22910 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 48 61 76   */.  Expr *pHav
22920 69 6e 67 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ing;         /* 
22930 54 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73  The HAVING claus
22940 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20  e.  May be NULL 
22950 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 31 3b  */.  int rc = 1;
22960 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
22970 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20 66  alue to return f
22980 72 6f 6d 20 74 68 69 73 20 66 75 6e 63 74 69 6f  rom this functio
22990 6e 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 53  n */.  int addrS
229a0 6f 72 74 49 6e 64 65 78 3b 20 20 20 20 20 2f 2a  ortIndex;     /*
229b0 20 41 64 64 72 65 73 73 20 6f 66 20 61 6e 20 4f   Address of an O
229c0 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20  P_OpenEphemeral 
229d0 69 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20  instruction */. 
229e0 20 44 69 73 74 69 6e 63 74 43 74 78 20 73 44 69   DistinctCtx sDi
229f0 73 74 69 6e 63 74 3b 20 2f 2a 20 49 6e 66 6f 20  stinct; /* Info 
22a00 6f 6e 20 68 6f 77 20 74 6f 20 63 6f 64 65 20 74  on how to code t
22a10 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77  he DISTINCT keyw
22a20 6f 72 64 20 2a 2f 0a 20 20 41 67 67 49 6e 66 6f  ord */.  AggInfo
22a30 20 73 41 67 67 49 6e 66 6f 3b 20 20 20 20 20 20   sAggInfo;      
22a40 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 75  /* Information u
22a50 73 65 64 20 62 79 20 61 67 67 72 65 67 61 74 65  sed by aggregate
22a60 20 71 75 65 72 69 65 73 20 2a 2f 0a 20 20 69 6e   queries */.  in
22a70 74 20 69 45 6e 64 3b 20 20 20 20 20 20 20 20 20  t iEnd;         
22a80 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
22a90 6f 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  of the end of th
22aa0 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 73 71 6c  e query */.  sql
22ab0 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20  ite3 *db;       
22ac0 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
22ad0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
22ae0 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
22af0 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20  E_OMIT_EXPLAIN. 
22b00 20 69 6e 74 20 69 52 65 73 74 6f 72 65 53 65 6c   int iRestoreSel
22b10 65 63 74 49 64 20 3d 20 70 50 61 72 73 65 2d 3e  ectId = pParse->
22b20 69 53 65 6c 65 63 74 49 64 3b 0a 20 20 70 50 61  iSelectId;.  pPa
22b30 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 20 3d  rse->iSelectId =
22b40 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65   pParse->iNextSe
22b50 6c 65 63 74 49 64 2b 2b 3b 0a 23 65 6e 64 69 66  lectId++;.#endif
22b60 0a 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d  ..  db = pParse-
22b70 3e 64 62 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  >db;.  if( p==0 
22b80 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
22b90 6c 65 64 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e  led || pParse->n
22ba0 45 72 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72  Err ){.    retur
22bb0 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  n 1;.  }.  if( s
22bc0 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
22bd0 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 53  pParse, SQLITE_S
22be0 45 4c 45 43 54 2c 20 30 2c 20 30 2c 20 30 29 20  ELECT, 0, 0, 0) 
22bf0 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 6d 65  ) return 1;.  me
22c00 6d 73 65 74 28 26 73 41 67 67 49 6e 66 6f 2c 20  mset(&sAggInfo, 
22c10 30 2c 20 73 69 7a 65 6f 66 28 73 41 67 67 49 6e  0, sizeof(sAggIn
22c20 66 6f 29 29 3b 0a 0a 20 20 69 66 28 20 49 67 6e  fo));..  if( Ign
22c30 6f 72 61 62 6c 65 4f 72 64 65 72 62 79 28 70 44  orableOrderby(pD
22c40 65 73 74 29 20 29 7b 0a 20 20 20 20 61 73 73 65  est) ){.    asse
22c50 72 74 28 70 44 65 73 74 2d 3e 65 44 65 73 74 3d  rt(pDest->eDest=
22c60 3d 53 52 54 5f 45 78 69 73 74 73 20 7c 7c 20 70  =SRT_Exists || p
22c70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54  Dest->eDest==SRT
22c80 5f 55 6e 69 6f 6e 20 7c 7c 20 0a 20 20 20 20 20  _Union || .     
22c90 20 20 20 20 20 20 70 44 65 73 74 2d 3e 65 44 65        pDest->eDe
22ca0 73 74 3d 3d 53 52 54 5f 45 78 63 65 70 74 20 7c  st==SRT_Except |
22cb0 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d  | pDest->eDest==
22cc0 53 52 54 5f 44 69 73 63 61 72 64 29 3b 0a 20 20  SRT_Discard);.  
22cd0 20 20 2f 2a 20 49 66 20 4f 52 44 45 52 20 42 59    /* If ORDER BY
22ce0 20 6d 61 6b 65 73 20 6e 6f 20 64 69 66 66 65 72   makes no differ
22cf0 65 6e 63 65 20 69 6e 20 74 68 65 20 6f 75 74 70  ence in the outp
22d00 75 74 20 74 68 65 6e 20 6e 65 69 74 68 65 72 20  ut then neither 
22d10 64 6f 65 73 0a 20 20 20 20 2a 2a 20 44 49 53 54  does.    ** DIST
22d20 49 4e 43 54 20 73 6f 20 69 74 20 63 61 6e 20 62  INCT so it can b
22d30 65 20 72 65 6d 6f 76 65 64 20 74 6f 6f 2e 20 2a  e removed too. *
22d40 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  /.    sqlite3Exp
22d50 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
22d60 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20  p->pOrderBy);.  
22d70 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20    p->pOrderBy = 
22d80 30 3b 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61  0;.    p->selFla
22d90 67 73 20 26 3d 20 7e 53 46 5f 44 69 73 74 69 6e  gs &= ~SF_Distin
22da0 63 74 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  ct;.  }.  sqlite
22db0 33 53 65 6c 65 63 74 50 72 65 70 28 70 50 61 72  3SelectPrep(pPar
22dc0 73 65 2c 20 70 2c 20 30 29 3b 0a 20 20 70 4f 72  se, p, 0);.  pOr
22dd0 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65  derBy = p->pOrde
22de0 72 42 79 3b 0a 20 20 70 54 61 62 4c 69 73 74 20  rBy;.  pTabList 
22df0 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 45 4c  = p->pSrc;.  pEL
22e00 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b  ist = p->pEList;
22e10 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
22e20 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  Err || db->mallo
22e30 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67  cFailed ){.    g
22e40 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
22e50 20 20 7d 0a 20 20 69 73 41 67 67 20 3d 20 28 70    }.  isAgg = (p
22e60 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
22e70 41 67 67 72 65 67 61 74 65 29 21 3d 30 3b 0a 20  Aggregate)!=0;. 
22e80 20 61 73 73 65 72 74 28 20 70 45 4c 69 73 74 21   assert( pEList!
22e90 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 42 65 67 69  =0 );..  /* Begi
22ea0 6e 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 64  n generating cod
22eb0 65 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71  e..  */.  v = sq
22ec0 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
22ed0 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30  rse);.  if( v==0
22ee0 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65   ) goto select_e
22ef0 6e 64 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 72 69  nd;..  /* If wri
22f00 74 69 6e 67 20 74 6f 20 6d 65 6d 6f 72 79 20 6f  ting to memory o
22f10 72 20 67 65 6e 65 72 61 74 69 6e 67 20 61 20 73  r generating a s
22f20 65 74 0a 20 20 2a 2a 20 6f 6e 6c 79 20 61 20 73  et.  ** only a s
22f30 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6d 61 79  ingle column may
22f40 20 62 65 20 6f 75 74 70 75 74 2e 0a 20 20 2a 2f   be output..  */
22f50 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
22f60 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
22f70 69 66 28 20 63 68 65 63 6b 46 6f 72 4d 75 6c 74  if( checkForMult
22f80 69 43 6f 6c 75 6d 6e 53 65 6c 65 63 74 45 72 72  iColumnSelectErr
22f90 6f 72 28 70 50 61 72 73 65 2c 20 70 44 65 73 74  or(pParse, pDest
22fa0 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29  , pEList->nExpr)
22fb0 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c   ){.    goto sel
22fc0 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 23 65 6e  ect_end;.  }.#en
22fd0 64 69 66 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  dif..  /* Genera
22fe0 74 65 20 63 6f 64 65 20 66 6f 72 20 61 6c 6c 20  te code for all 
22ff0 73 75 62 2d 71 75 65 72 69 65 73 20 69 6e 20 74  sub-queries in t
23000 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20  he FROM clause. 
23010 20 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64   */.#if !defined
23020 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42  (SQLITE_OMIT_SUB
23030 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e  QUERY) || !defin
23040 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
23050 49 45 57 29 0a 20 20 66 6f 72 28 69 3d 30 3b 20  IEW).  for(i=0; 
23060 21 70 2d 3e 70 50 72 69 6f 72 20 26 26 20 69 3c  !p->pPrior && i<
23070 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20  pTabList->nSrc; 
23080 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74  i++){.    struct
23090 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
230a0 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74  Item = &pTabList
230b0 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 53 65 6c 65  ->a[i];.    Sele
230c0 63 74 44 65 73 74 20 64 65 73 74 3b 0a 20 20 20  ctDest dest;.   
230d0 20 53 65 6c 65 63 74 20 2a 70 53 75 62 20 3d 20   Select *pSub = 
230e0 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a  pItem->pSelect;.
230f0 20 20 20 20 69 6e 74 20 69 73 41 67 67 53 75 62      int isAggSub
23100 3b 0a 0a 20 20 20 20 69 66 28 20 70 53 75 62 3d  ;..    if( pSub=
23110 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a  =0 ) continue;..
23120 20 20 20 20 2f 2a 20 53 6f 6d 65 74 69 6d 65 73      /* Sometimes
23130 20 74 68 65 20 63 6f 64 65 20 66 6f 72 20 61 20   the code for a 
23140 73 75 62 71 75 65 72 79 20 77 69 6c 6c 20 62 65  subquery will be
23150 20 67 65 6e 65 72 61 74 65 64 20 6d 6f 72 65 20   generated more 
23160 74 68 61 6e 0a 20 20 20 20 2a 2a 20 6f 6e 63 65  than.    ** once
23170 2c 20 69 66 20 74 68 65 20 73 75 62 71 75 65 72  , if the subquer
23180 79 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65  y is part of the
23190 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e   WHERE clause in
231a0 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2c 0a 20 20   a LEFT JOIN,.  
231b0 20 20 2a 2a 20 66 6f 72 20 65 78 61 6d 70 6c 65    ** for example
231c0 2e 20 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c  .  In that case,
231d0 20 64 6f 20 6e 6f 74 20 72 65 67 65 6e 65 72 61   do not regenera
231e0 74 65 20 74 68 65 20 63 6f 64 65 20 74 6f 20 6d  te the code to m
231f0 61 6e 69 66 65 73 74 0a 20 20 20 20 2a 2a 20 61  anifest.    ** a
23200 20 76 69 65 77 20 6f 72 20 74 68 65 20 63 6f 2d   view or the co-
23210 72 6f 75 74 69 6e 65 20 74 6f 20 69 6d 70 6c 65  routine to imple
23220 6d 65 6e 74 20 61 20 76 69 65 77 2e 20 20 54 68  ment a view.  Th
23230 65 20 66 69 72 73 74 20 69 6e 73 74 61 6e 63 65  e first instance
23240 0a 20 20 20 20 2a 2a 20 69 73 20 73 75 66 66 69  .    ** is suffi
23250 63 69 65 6e 74 2c 20 74 68 6f 75 67 68 20 74 68  cient, though th
23260 65 20 73 75 62 72 6f 75 74 69 6e 65 20 74 6f 20  e subroutine to 
23270 6d 61 6e 69 66 65 73 74 20 74 68 65 20 76 69 65  manifest the vie
23280 77 20 64 6f 65 73 20 6e 65 65 64 0a 20 20 20 20  w does need.    
23290 2a 2a 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64  ** to be invoked
232a0 20 61 67 61 69 6e 2e 20 2a 2f 0a 20 20 20 20 69   again. */.    i
232b0 66 28 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69  f( pItem->addrFi
232c0 6c 6c 53 75 62 20 29 7b 0a 20 20 20 20 20 20 69  llSub ){.      i
232d0 66 28 20 70 49 74 65 6d 2d 3e 76 69 61 43 6f 72  f( pItem->viaCor
232e0 6f 75 74 69 6e 65 3d 3d 30 20 29 7b 0a 20 20 20  outine==0 ){.   
232f0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
23300 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
23310 75 62 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65  ub, pItem->regRe
23320 74 75 72 6e 2c 20 70 49 74 65 6d 2d 3e 61 64 64  turn, pItem->add
23330 72 46 69 6c 6c 53 75 62 29 3b 0a 20 20 20 20 20  rFillSub);.     
23340 20 7d 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75   }.      continu
23350 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  e;.    }..    /*
23360 20 49 6e 63 72 65 6d 65 6e 74 20 50 61 72 73 65   Increment Parse
23370 2e 6e 48 65 69 67 68 74 20 62 79 20 74 68 65 20  .nHeight by the 
23380 68 65 69 67 68 74 20 6f 66 20 74 68 65 20 6c 61  height of the la
23390 72 67 65 73 74 20 65 78 70 72 65 73 73 69 6f 6e  rgest expression
233a0 0a 20 20 20 20 2a 2a 20 74 72 65 65 20 72 65 66  .    ** tree ref
233b0 65 72 72 65 64 20 74 6f 20 62 79 20 74 68 69 73  erred to by this
233c0 2c 20 74 68 65 20 70 61 72 65 6e 74 20 73 65 6c  , the parent sel
233d0 65 63 74 2e 20 54 68 65 20 63 68 69 6c 64 20 73  ect. The child s
233e0 65 6c 65 63 74 0a 20 20 20 20 2a 2a 20 6d 61 79  elect.    ** may
233f0 20 63 6f 6e 74 61 69 6e 20 65 78 70 72 65 73 73   contain express
23400 69 6f 6e 20 74 72 65 65 73 20 6f 66 20 61 74 20  ion trees of at 
23410 6d 6f 73 74 0a 20 20 20 20 2a 2a 20 28 53 51 4c  most.    ** (SQL
23420 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50  ITE_MAX_EXPR_DEP
23430 54 48 2d 50 61 72 73 65 2e 6e 48 65 69 67 68 74  TH-Parse.nHeight
23440 29 20 68 65 69 67 68 74 2e 20 54 68 69 73 20 69  ) height. This i
23450 73 20 61 20 62 69 74 0a 20 20 20 20 2a 2a 20 6d  s a bit.    ** m
23460 6f 72 65 20 63 6f 6e 73 65 72 76 61 74 69 76 65  ore conservative
23470 20 74 68 61 6e 20 6e 65 63 65 73 73 61 72 79 2c   than necessary,
23480 20 62 75 74 20 6d 75 63 68 20 65 61 73 69 65 72   but much easier
23490 20 74 68 61 6e 20 65 6e 66 6f 72 63 69 6e 67 0a   than enforcing.
234a0 20 20 20 20 2a 2a 20 61 6e 20 65 78 61 63 74 20      ** an exact 
234b0 6c 69 6d 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  limit..    */.  
234c0 20 20 70 50 61 72 73 65 2d 3e 6e 48 65 69 67 68    pParse->nHeigh
234d0 74 20 2b 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  t += sqlite3Sele
234e0 63 74 45 78 70 72 48 65 69 67 68 74 28 70 29 3b  ctExprHeight(p);
234f0 0a 0a 20 20 20 20 69 73 41 67 67 53 75 62 20 3d  ..    isAggSub =
23500 20 28 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73   (pSub->selFlags
23510 20 26 20 53 46 5f 41 67 67 72 65 67 61 74 65 29   & SF_Aggregate)
23520 21 3d 30 3b 0a 20 20 20 20 69 66 28 20 66 6c 61  !=0;.    if( fla
23530 74 74 65 6e 53 75 62 71 75 65 72 79 28 70 50 61  ttenSubquery(pPa
23540 72 73 65 2c 20 70 2c 20 69 2c 20 69 73 41 67 67  rse, p, i, isAgg
23550 2c 20 69 73 41 67 67 53 75 62 29 20 29 7b 0a 20  , isAggSub) ){. 
23560 20 20 20 20 20 2f 2a 20 54 68 69 73 20 73 75 62       /* This sub
23570 71 75 65 72 79 20 63 61 6e 20 62 65 20 61 62 73  query can be abs
23580 6f 72 62 65 64 20 69 6e 74 6f 20 69 74 73 20 70  orbed into its p
23590 61 72 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20  arent. */.      
235a0 69 66 28 20 69 73 41 67 67 53 75 62 20 29 7b 0a  if( isAggSub ){.
235b0 20 20 20 20 20 20 20 20 69 73 41 67 67 20 3d 20          isAgg = 
235c0 31 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 73 65  1;.        p->se
235d0 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 41 67 67  lFlags |= SF_Agg
235e0 72 65 67 61 74 65 3b 0a 20 20 20 20 20 20 7d 0a  regate;.      }.
235f0 20 20 20 20 20 20 69 20 3d 20 2d 31 3b 0a 20 20        i = -1;.  
23600 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54 61 62    }else if( pTab
23610 4c 69 73 74 2d 3e 6e 53 72 63 3d 3d 31 20 26 26  List->nSrc==1 &&
23620 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
23630 53 46 5f 4d 61 74 65 72 69 61 6c 69 7a 65 29 3d  SF_Materialize)=
23640 3d 30 0a 20 20 20 20 20 20 26 26 20 4f 70 74 69  =0.      && Opti
23650 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28  mizationEnabled(
23660 64 62 2c 20 53 51 4c 49 54 45 5f 53 75 62 71 43  db, SQLITE_SubqC
23670 6f 72 6f 75 74 69 6e 65 29 0a 20 20 20 20 29 7b  oroutine).    ){
23680 0a 20 20 20 20 20 20 2f 2a 20 49 6d 70 6c 65 6d  .      /* Implem
23690 65 6e 74 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65  ent a co-routine
236a0 20 74 68 61 74 20 77 69 6c 6c 20 72 65 74 75 72   that will retur
236b0 6e 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f  n a single row o
236c0 66 20 74 68 65 20 72 65 73 75 6c 74 0a 20 20 20  f the result.   
236d0 20 20 20 2a 2a 20 73 65 74 20 6f 6e 20 65 61 63     ** set on eac
236e0 68 20 69 6e 76 6f 63 61 74 69 6f 6e 2e 0a 20 20  h invocation..  
236f0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74      */.      int
23700 20 61 64 64 72 54 6f 70 3b 0a 20 20 20 20 20 20   addrTop;.      
23710 69 6e 74 20 61 64 64 72 45 6f 66 3b 0a 20 20 20  int addrEof;.   
23720 20 20 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74     pItem->regRet
23730 75 72 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  urn = ++pParse->
23740 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 61 64 64 72  nMem;.      addr
23750 45 6f 66 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  Eof = ++pParse->
23760 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 2f 2a 20 42  nMem;.      /* B
23770 65 66 6f 72 65 20 63 6f 64 69 6e 67 20 74 68 65  efore coding the
23780 20 4f 50 5f 47 6f 74 6f 20 74 6f 20 6a 75 6d 70   OP_Goto to jump
23790 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66   to the start of
237a0 20 74 68 65 20 6d 61 69 6e 20 72 6f 75 74 69 6e   the main routin
237b0 65 2c 0a 20 20 20 20 20 20 2a 2a 20 65 6e 73 75  e,.      ** ensu
237c0 72 65 20 74 68 61 74 20 74 68 65 20 6a 75 6d 70  re that the jump
237d0 20 74 6f 20 74 68 65 20 76 65 72 69 66 79 2d 73   to the verify-s
237e0 63 68 65 6d 61 20 72 6f 75 74 69 6e 65 20 68 61  chema routine ha
237f0 73 20 61 6c 72 65 61 64 79 0a 20 20 20 20 20 20  s already.      
23800 2a 2a 20 62 65 65 6e 20 63 6f 64 65 64 2e 20 4f  ** been coded. O
23810 74 68 65 72 77 69 73 65 2c 20 74 68 65 20 76 65  therwise, the ve
23820 72 69 66 79 2d 73 63 68 65 6d 61 20 77 6f 75 6c  rify-schema woul
23830 64 20 6c 69 6b 65 6c 79 20 62 65 20 63 6f 64 65  d likely be code
23840 64 20 61 73 20 0a 20 20 20 20 20 20 2a 2a 20 70  d as .      ** p
23850 61 72 74 20 6f 66 20 74 68 65 20 63 6f 2d 72 6f  art of the co-ro
23860 75 74 69 6e 65 2e 20 49 66 20 74 68 65 20 6d 61  utine. If the ma
23870 69 6e 20 72 6f 75 74 69 6e 65 20 74 68 65 6e 20  in routine then 
23880 61 63 63 65 73 73 65 64 20 74 68 65 20 0a 20 20  accessed the .  
23890 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
238a0 62 65 66 6f 72 65 20 69 6e 76 6f 6b 69 6e 67 20  before invoking 
238b0 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20 66  the co-routine f
238c0 6f 72 20 74 68 65 20 66 69 72 73 74 20 74 69 6d  or the first tim
238d0 65 20 28 66 6f 72 20 0a 20 20 20 20 20 20 2a 2a  e (for .      **
238e0 20 65 78 61 6d 70 6c 65 20 74 6f 20 69 6e 69 74   example to init
238f0 69 61 6c 69 7a 65 20 61 20 4c 49 4d 49 54 20 72  ialize a LIMIT r
23900 65 67 69 73 74 65 72 20 66 72 6f 6d 20 61 20 73  egister from a s
23910 75 62 2d 73 65 6c 65 63 74 29 2c 20 69 74 20 77  ub-select), it w
23920 6f 75 6c 64 20 0a 20 20 20 20 20 20 2a 2a 20 62  ould .      ** b
23930 65 20 64 6f 69 6e 67 20 73 6f 20 77 69 74 68 6f  e doing so witho
23940 75 74 20 68 61 76 69 6e 67 20 76 65 72 69 66 69  ut having verifi
23950 65 64 20 74 68 65 20 73 63 68 65 6d 61 20 76 65  ed the schema ve
23960 72 73 69 6f 6e 20 61 6e 64 20 6f 62 74 61 69 6e  rsion and obtain
23970 65 64 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  ed .      ** the
23980 20 72 65 71 75 69 72 65 64 20 64 62 20 6c 6f 63   required db loc
23990 6b 73 2e 20 53 65 65 20 74 69 63 6b 65 74 20 64  ks. See ticket d
239a0 36 62 33 36 62 65 33 38 2e 20 20 2a 2f 0a 20 20  6b36be38.  */.  
239b0 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56      sqlite3CodeV
239c0 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72  erifySchema(pPar
239d0 73 65 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 73  se, -1);.      s
239e0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
239f0 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20  (v, OP_Goto);.  
23a00 20 20 20 20 61 64 64 72 54 6f 70 20 3d 20 73 71      addrTop = sq
23a10 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
23a20 76 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f  v, OP_OpenPseudo
23a30 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  , pItem->iCursor
23a40 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
23a50 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
23a60 31 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  1);.      VdbeCo
23a70 6d 6d 65 6e 74 28 28 76 2c 20 22 63 6f 72 6f 75  mment((v, "corou
23a80 74 69 6e 65 20 66 6f 72 20 25 73 22 2c 20 70 49  tine for %s", pI
23a90 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65  tem->pTab->zName
23aa0 29 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d  ));.      pItem-
23ab0 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 3d 20 61  >addrFillSub = a
23ac0 64 64 72 54 6f 70 3b 0a 20 20 20 20 20 20 73 71  ddrTop;.      sq
23ad0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
23ae0 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
23af0 2c 20 61 64 64 72 45 6f 66 29 3b 0a 20 20 20 20  , addrEof);.    
23b00 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
23b10 6e 67 65 50 35 28 76 2c 20 31 29 3b 0a 20 20 20  ngeP5(v, 1);.   
23b20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
23b30 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20  DestInit(&dest, 
23b40 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 70  SRT_Coroutine, p
23b50 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 29  Item->regReturn)
23b60 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53  ;.      explainS
23b70 65 74 49 6e 74 65 67 65 72 28 70 49 74 65 6d 2d  etInteger(pItem-
23b80 3e 69 53 65 6c 65 63 74 49 64 2c 20 28 75 38 29  >iSelectId, (u8)
23b90 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c  pParse->iNextSel
23ba0 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 73 71  ectId);.      sq
23bb0 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
23bc0 73 65 2c 20 70 53 75 62 2c 20 26 64 65 73 74 29  se, pSub, &dest)
23bd0 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70  ;.      pItem->p
23be0 54 61 62 2d 3e 6e 52 6f 77 45 73 74 20 3d 20 28  Tab->nRowEst = (
23bf0 75 6e 73 69 67 6e 65 64 29 70 53 75 62 2d 3e 6e  unsigned)pSub->n
23c00 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20 20  SelectRow;.     
23c10 20 70 49 74 65 6d 2d 3e 76 69 61 43 6f 72 6f 75   pItem->viaCorou
23c20 74 69 6e 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  tine = 1;.      
23c30 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
23c40 65 50 32 28 76 2c 20 61 64 64 72 54 6f 70 2c 20  eP2(v, addrTop, 
23c50 64 65 73 74 2e 69 53 64 73 74 29 3b 0a 20 20 20  dest.iSdst);.   
23c60 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
23c70 61 6e 67 65 50 33 28 76 2c 20 61 64 64 72 54 6f  angeP3(v, addrTo
23c80 70 2c 20 64 65 73 74 2e 6e 53 64 73 74 29 3b 0a  p, dest.nSdst);.
23c90 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
23ca0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
23cb0 74 65 67 65 72 2c 20 31 2c 20 61 64 64 72 45 6f  teger, 1, addrEo
23cc0 66 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  f);.      sqlite
23cd0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
23ce0 50 5f 59 69 65 6c 64 2c 20 70 49 74 65 6d 2d 3e  P_Yield, pItem->
23cf0 72 65 67 52 65 74 75 72 6e 29 3b 0a 20 20 20 20  regReturn);.    
23d00 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
23d10 2c 20 22 65 6e 64 20 25 73 22 2c 20 70 49 74 65  , "end %s", pIte
23d20 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29  m->pTab->zName))
23d30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
23d40 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
23d50 64 64 72 54 6f 70 2d 31 29 3b 0a 20 20 20 20 20  ddrTop-1);.     
23d60 20 73 71 6c 69 74 65 33 43 6c 65 61 72 54 65 6d   sqlite3ClearTem
23d70 70 52 65 67 43 61 63 68 65 28 70 50 61 72 73 65  pRegCache(pParse
23d80 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
23d90 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
23da0 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61  a subroutine tha
23db0 74 20 77 69 6c 6c 20 66 69 6c 6c 20 61 6e 20 65  t will fill an e
23dc0 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 77  phemeral table w
23dd0 69 74 68 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  ith.      ** the
23de0 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 69 73   content of this
23df0 20 73 75 62 71 75 65 72 79 2e 20 20 70 49 74 65   subquery.  pIte
23e00 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 77  m->addrFillSub w
23e10 69 6c 6c 20 70 6f 69 6e 74 0a 20 20 20 20 20 20  ill point.      
23e20 2a 2a 20 74 6f 20 74 68 65 20 61 64 64 72 65 73  ** to the addres
23e30 73 20 6f 66 20 74 68 65 20 67 65 6e 65 72 61 74  s of the generat
23e40 65 64 20 73 75 62 72 6f 75 74 69 6e 65 2e 20 20  ed subroutine.  
23e50 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e  pItem->regReturn
23e60 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 61 20 72  .      ** is a r
23e70 65 67 69 73 74 65 72 20 61 6c 6c 6f 63 61 74 65  egister allocate
23e80 64 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 73 75  d to hold the su
23e90 62 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 20  broutine return 
23ea0 61 64 64 72 65 73 73 0a 20 20 20 20 20 20 2a 2f  address.      */
23eb0 0a 20 20 20 20 20 20 69 6e 74 20 74 6f 70 41 64  .      int topAd
23ec0 64 72 3b 0a 20 20 20 20 20 20 69 6e 74 20 6f 6e  dr;.      int on
23ed0 63 65 41 64 64 72 20 3d 20 30 3b 0a 20 20 20 20  ceAddr = 0;.    
23ee0 20 20 69 6e 74 20 72 65 74 41 64 64 72 3b 0a 20    int retAddr;. 
23ef0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74       assert( pIt
23f00 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 3d  em->addrFillSub=
23f10 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 49 74 65  =0 );.      pIte
23f20 6d 2d 3e 72 65 67 52 65 74 75 72 6e 20 3d 20 2b  m->regReturn = +
23f30 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
23f40 20 20 20 20 20 74 6f 70 41 64 64 72 20 3d 20 73       topAddr = s
23f50 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
23f60 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
23f70 30 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74  0, pItem->regRet
23f80 75 72 6e 29 3b 0a 20 20 20 20 20 20 70 49 74 65  urn);.      pIte
23f90 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 3d  m->addrFillSub =
23fa0 20 74 6f 70 41 64 64 72 2b 31 3b 0a 20 20 20 20   topAddr+1;.    
23fb0 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e    VdbeNoopCommen
23fc0 74 28 28 76 2c 20 22 6d 61 74 65 72 69 61 6c 69  t((v, "materiali
23fd0 7a 65 20 25 73 22 2c 20 70 49 74 65 6d 2d 3e 70  ze %s", pItem->p
23fe0 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20  Tab->zName));.  
23ff0 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 69      if( pItem->i
24000 73 43 6f 72 72 65 6c 61 74 65 64 3d 3d 30 20 29  sCorrelated==0 )
24010 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  {.        /* If 
24020 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  the subquery is 
24030 6e 6f 74 20 63 6f 72 72 65 6c 61 74 65 64 20 61  not correlated a
24040 6e 64 20 69 66 20 77 65 20 61 72 65 20 6e 6f 74  nd if we are not
24050 20 69 6e 73 69 64 65 20 6f 66 0a 20 20 20 20 20   inside of.     
24060 20 20 20 2a 2a 20 61 20 74 72 69 67 67 65 72 2c     ** a trigger,
24070 20 74 68 65 6e 20 77 65 20 6f 6e 6c 79 20 6e 65   then we only ne
24080 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68  ed to compute th
24090 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 73  e value of the s
240a0 75 62 71 75 65 72 79 0a 20 20 20 20 20 20 20 20  ubquery.        
240b0 2a 2a 20 6f 6e 63 65 2e 20 2a 2f 0a 20 20 20 20  ** once. */.    
240c0 20 20 20 20 6f 6e 63 65 41 64 64 72 20 3d 20 73      onceAddr = s
240d0 71 6c 69 74 65 33 43 6f 64 65 4f 6e 63 65 28 70  qlite3CodeOnce(p
240e0 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 7d 0a  Parse);.      }.
240f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
24100 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73  ectDestInit(&des
24110 74 2c 20 53 52 54 5f 45 70 68 65 6d 54 61 62 2c  t, SRT_EphemTab,
24120 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29   pItem->iCursor)
24130 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53  ;.      explainS
24140 65 74 49 6e 74 65 67 65 72 28 70 49 74 65 6d 2d  etInteger(pItem-
24150 3e 69 53 65 6c 65 63 74 49 64 2c 20 28 75 38 29  >iSelectId, (u8)
24160 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c  pParse->iNextSel
24170 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 73 71  ectId);.      sq
24180 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
24190 73 65 2c 20 70 53 75 62 2c 20 26 64 65 73 74 29  se, pSub, &dest)
241a0 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70  ;.      pItem->p
241b0 54 61 62 2d 3e 6e 52 6f 77 45 73 74 20 3d 20 28  Tab->nRowEst = (
241c0 75 6e 73 69 67 6e 65 64 29 70 53 75 62 2d 3e 6e  unsigned)pSub->n
241d0 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20 20  SelectRow;.     
241e0 20 69 66 28 20 6f 6e 63 65 41 64 64 72 20 29 20   if( onceAddr ) 
241f0 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
24200 65 72 65 28 76 2c 20 6f 6e 63 65 41 64 64 72 29  ere(v, onceAddr)
24210 3b 0a 20 20 20 20 20 20 72 65 74 41 64 64 72 20  ;.      retAddr 
24220 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
24230 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e  Op1(v, OP_Return
24240 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75  , pItem->regRetu
24250 72 6e 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  rn);.      VdbeC
24260 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6e 64 20  omment((v, "end 
24270 25 73 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62  %s", pItem->pTab
24280 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20  ->zName));.     
24290 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
242a0 67 65 50 31 28 76 2c 20 74 6f 70 41 64 64 72 2c  geP1(v, topAddr,
242b0 20 72 65 74 41 64 64 72 29 3b 0a 20 20 20 20 20   retAddr);.     
242c0 20 73 71 6c 69 74 65 33 43 6c 65 61 72 54 65 6d   sqlite3ClearTem
242d0 70 52 65 67 43 61 63 68 65 28 70 50 61 72 73 65  pRegCache(pParse
242e0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
242f0 20 2f 2a 70 50 61 72 73 65 2d 3e 6e 45 72 72 20   /*pParse->nErr 
24300 7c 7c 2a 2f 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ||*/ db->mallocF
24310 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 67  ailed ){.      g
24320 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
24330 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65      }.    pParse
24340 2d 3e 6e 48 65 69 67 68 74 20 2d 3d 20 73 71 6c  ->nHeight -= sql
24350 69 74 65 33 53 65 6c 65 63 74 45 78 70 72 48 65  ite3SelectExprHe
24360 69 67 68 74 28 70 29 3b 0a 20 20 20 20 70 54 61  ight(p);.    pTa
24370 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b  bList = p->pSrc;
24380 0a 20 20 20 20 69 66 28 20 21 49 67 6e 6f 72 61  .    if( !Ignora
24390 62 6c 65 4f 72 64 65 72 62 79 28 70 44 65 73 74  bleOrderby(pDest
243a0 29 20 29 7b 0a 20 20 20 20 20 20 70 4f 72 64 65  ) ){.      pOrde
243b0 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42  rBy = p->pOrderB
243c0 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  y;.    }.  }.  p
243d0 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73  EList = p->pELis
243e0 74 3b 0a 23 65 6e 64 69 66 0a 20 20 70 57 68 65  t;.#endif.  pWhe
243f0 72 65 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a  re = p->pWhere;.
24400 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e    pGroupBy = p->
24410 70 47 72 6f 75 70 42 79 3b 0a 20 20 70 48 61 76  pGroupBy;.  pHav
24420 69 6e 67 20 3d 20 70 2d 3e 70 48 61 76 69 6e 67  ing = p->pHaving
24430 3b 0a 20 20 73 44 69 73 74 69 6e 63 74 2e 69 73  ;.  sDistinct.is
24440 54 6e 63 74 20 3d 20 28 70 2d 3e 73 65 6c 46 6c  Tnct = (p->selFl
24450 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63  ags & SF_Distinc
24460 74 29 21 3d 30 3b 0a 0a 23 69 66 6e 64 65 66 20  t)!=0;..#ifndef 
24470 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50  SQLITE_OMIT_COMP
24480 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 20 20 2f 2a  OUND_SELECT.  /*
24490 20 49 66 20 74 68 65 72 65 20 69 73 20 61 72 65   If there is are
244a0 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20 71   a sequence of q
244b0 75 65 72 69 65 73 2c 20 64 6f 20 74 68 65 20 65  ueries, do the e
244c0 61 72 6c 69 65 72 20 6f 6e 65 73 20 66 69 72 73  arlier ones firs
244d0 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  t..  */.  if( p-
244e0 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 69  >pPrior ){.    i
244f0 66 28 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74  f( p->pRightmost
24500 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 53 65 6c  ==0 ){.      Sel
24510 65 63 74 20 2a 70 4c 6f 6f 70 2c 20 2a 70 52 69  ect *pLoop, *pRi
24520 67 68 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  ght = 0;.      i
24530 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20  nt cnt = 0;.    
24540 20 20 69 6e 74 20 6d 78 53 65 6c 65 63 74 3b 0a    int mxSelect;.
24550 20 20 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d        for(pLoop=
24560 70 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d  p; pLoop; pLoop=
24570 70 4c 6f 6f 70 2d 3e 70 50 72 69 6f 72 2c 20 63  pLoop->pPrior, c
24580 6e 74 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70  nt++){.        p
24590 4c 6f 6f 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74  Loop->pRightmost
245a0 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 70 4c   = p;.        pL
245b0 6f 6f 70 2d 3e 70 4e 65 78 74 20 3d 20 70 52 69  oop->pNext = pRi
245c0 67 68 74 3b 0a 20 20 20 20 20 20 20 20 70 52 69  ght;.        pRi
245d0 67 68 74 20 3d 20 70 4c 6f 6f 70 3b 0a 20 20 20  ght = pLoop;.   
245e0 20 20 20 7d 0a 20 20 20 20 20 20 6d 78 53 65 6c     }.      mxSel
245f0 65 63 74 20 3d 20 64 62 2d 3e 61 4c 69 6d 69 74  ect = db->aLimit
24600 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f  [SQLITE_LIMIT_CO
24610 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 5d 3b 0a  MPOUND_SELECT];.
24620 20 20 20 20 20 20 69 66 28 20 6d 78 53 65 6c 65        if( mxSele
24630 63 74 20 26 26 20 63 6e 74 3e 6d 78 53 65 6c 65  ct && cnt>mxSele
24640 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ct ){.        sq
24650 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
24660 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20  arse, "too many 
24670 74 65 72 6d 73 20 69 6e 20 63 6f 6d 70 6f 75 6e  terms in compoun
24680 64 20 53 45 4c 45 43 54 22 29 3b 0a 20 20 20 20  d SELECT");.    
24690 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
246a0 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  end;.      }.   
246b0 20 7d 0a 20 20 20 20 72 63 20 3d 20 6d 75 6c 74   }.    rc = mult
246c0 69 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  iSelect(pParse, 
246d0 70 2c 20 70 44 65 73 74 29 3b 0a 20 20 20 20 65  p, pDest);.    e
246e0 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72  xplainSetInteger
246f0 28 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74  (pParse->iSelect
24700 49 64 2c 20 69 52 65 73 74 6f 72 65 53 65 6c 65  Id, iRestoreSele
24710 63 74 49 64 29 3b 0a 20 20 20 20 72 65 74 75 72  ctId);.    retur
24720 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  n rc;.  }.#endif
24730 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
24740 69 73 20 62 6f 74 68 20 61 20 47 52 4f 55 50 20  is both a GROUP 
24750 42 59 20 61 6e 64 20 61 6e 20 4f 52 44 45 52 20  BY and an ORDER 
24760 42 59 20 63 6c 61 75 73 65 20 61 6e 64 20 74 68  BY clause and th
24770 65 79 20 61 72 65 0a 20 20 2a 2a 20 69 64 65 6e  ey are.  ** iden
24780 74 69 63 61 6c 2c 20 74 68 65 6e 20 64 69 73 61  tical, then disa
24790 62 6c 65 20 74 68 65 20 4f 52 44 45 52 20 42 59  ble the ORDER BY
247a0 20 63 6c 61 75 73 65 20 73 69 6e 63 65 20 74 68   clause since th
247b0 65 20 47 52 4f 55 50 20 42 59 0a 20 20 2a 2a 20  e GROUP BY.  ** 
247c0 77 69 6c 6c 20 63 61 75 73 65 20 65 6c 65 6d 65  will cause eleme
247d0 6e 74 73 20 74 6f 20 63 6f 6d 65 20 6f 75 74 20  nts to come out 
247e0 69 6e 20 74 68 65 20 63 6f 72 72 65 63 74 20 6f  in the correct o
247f0 72 64 65 72 2e 20 20 54 68 69 73 20 69 73 0a 20  rder.  This is. 
24800 20 2a 2a 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74   ** an optimizat
24810 69 6f 6e 20 2d 20 74 68 65 20 63 6f 72 72 65 63  ion - the correc
24820 74 20 61 6e 73 77 65 72 20 73 68 6f 75 6c 64 20  t answer should 
24830 72 65 73 75 6c 74 20 72 65 67 61 72 64 6c 65 73  result regardles
24840 73 2e 0a 20 20 2a 2a 20 55 73 65 20 74 68 65 20  s..  ** Use the 
24850 53 51 4c 49 54 45 5f 47 72 6f 75 70 42 79 4f 72  SQLITE_GroupByOr
24860 64 65 72 20 66 6c 61 67 20 77 69 74 68 20 53 51  der flag with SQ
24870 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50  LITE_TESTCTRL_OP
24880 54 49 4d 49 5a 45 52 0a 20 20 2a 2a 20 74 6f 20  TIMIZER.  ** to 
24890 64 69 73 61 62 6c 65 20 74 68 69 73 20 6f 70 74  disable this opt
248a0 69 6d 69 7a 61 74 69 6f 6e 20 66 6f 72 20 74 65  imization for te
248b0 73 74 69 6e 67 20 70 75 72 70 6f 73 65 73 2e 0a  sting purposes..
248c0 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74    */.  if( sqlit
248d0 65 33 45 78 70 72 4c 69 73 74 43 6f 6d 70 61 72  e3ExprListCompar
248e0 65 28 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 70  e(p->pGroupBy, p
248f0 4f 72 64 65 72 42 79 29 3d 3d 30 0a 20 20 20 20  OrderBy)==0.    
24900 20 20 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61       && Optimiza
24910 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20  tionEnabled(db, 
24920 53 51 4c 49 54 45 5f 47 72 6f 75 70 42 79 4f 72  SQLITE_GroupByOr
24930 64 65 72 29 20 29 7b 0a 20 20 20 20 70 4f 72 64  der) ){.    pOrd
24940 65 72 42 79 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  erBy = 0;.  }.. 
24950 20 2f 2a 20 49 66 20 74 68 65 20 71 75 65 72 79   /* If the query
24960 20 69 73 20 44 49 53 54 49 4e 43 54 20 77 69 74   is DISTINCT wit
24970 68 20 61 6e 20 4f 52 44 45 52 20 42 59 20 62 75  h an ORDER BY bu
24980 74 20 69 73 20 6e 6f 74 20 61 6e 20 61 67 67 72  t is not an aggr
24990 65 67 61 74 65 2c 20 61 6e 64 20 0a 20 20 2a 2a  egate, and .  **
249a0 20 69 66 20 74 68 65 20 73 65 6c 65 63 74 2d 6c   if the select-l
249b0 69 73 74 20 69 73 20 74 68 65 20 73 61 6d 65 20  ist is the same 
249c0 61 73 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  as the ORDER BY 
249d0 6c 69 73 74 2c 20 74 68 65 6e 20 74 68 69 73 20  list, then this 
249e0 71 75 65 72 79 0a 20 20 2a 2a 20 63 61 6e 20 62  query.  ** can b
249f0 65 20 72 65 77 72 69 74 74 65 6e 20 61 73 20 61  e rewritten as a
24a00 20 47 52 4f 55 50 20 42 59 2e 20 49 6e 20 6f 74   GROUP BY. In ot
24a10 68 65 72 20 77 6f 72 64 73 2c 20 74 68 69 73 3a  her words, this:
24a20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53  .  **.  **     S
24a30 45 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20 78  ELECT DISTINCT x
24a40 79 7a 20 46 52 4f 4d 20 2e 2e 2e 20 4f 52 44 45  yz FROM ... ORDE
24a50 52 20 42 59 20 78 79 7a 0a 20 20 2a 2a 0a 20 20  R BY xyz.  **.  
24a60 2a 2a 20 69 73 20 74 72 61 6e 73 66 6f 72 6d 65  ** is transforme
24a70 64 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  d to:.  **.  ** 
24a80 20 20 20 20 53 45 4c 45 43 54 20 78 79 7a 20 46      SELECT xyz F
24a90 52 4f 4d 20 2e 2e 2e 20 47 52 4f 55 50 20 42 59  ROM ... GROUP BY
24aa0 20 78 79 7a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54   xyz.  **.  ** T
24ab0 68 65 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20 69  he second form i
24ac0 73 20 70 72 65 66 65 72 72 65 64 20 61 73 20 61  s preferred as a
24ad0 20 73 69 6e 67 6c 65 20 69 6e 64 65 78 20 28 6f   single index (o
24ae0 72 20 74 65 6d 70 2d 74 61 62 6c 65 29 20 6d 61  r temp-table) ma
24af0 79 20 62 65 20 0a 20 20 2a 2a 20 75 73 65 64 20  y be .  ** used 
24b00 66 6f 72 20 62 6f 74 68 20 74 68 65 20 4f 52 44  for both the ORD
24b10 45 52 20 42 59 20 61 6e 64 20 44 49 53 54 49 4e  ER BY and DISTIN
24b20 43 54 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 41  CT processing. A
24b30 73 20 6f 72 69 67 69 6e 61 6c 6c 79 20 0a 20 20  s originally .  
24b40 2a 2a 20 77 72 69 74 74 65 6e 20 74 68 65 20 71  ** written the q
24b50 75 65 72 79 20 6d 75 73 74 20 75 73 65 20 61 20  uery must use a 
24b60 74 65 6d 70 2d 74 61 62 6c 65 20 66 6f 72 20 61  temp-table for a
24b70 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 66 20 74  t least one of t
24b80 68 65 20 4f 52 44 45 52 20 0a 20 20 2a 2a 20 42  he ORDER .  ** B
24b90 59 20 61 6e 64 20 44 49 53 54 49 4e 43 54 2c 20  Y and DISTINCT, 
24ba0 61 6e 64 20 61 6e 20 69 6e 64 65 78 20 6f 72 20  and an index or 
24bb0 73 65 70 61 72 61 74 65 20 74 65 6d 70 2d 74 61  separate temp-ta
24bc0 62 6c 65 20 66 6f 72 20 74 68 65 20 6f 74 68 65  ble for the othe
24bd0 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70  r..  */.  if( (p
24be0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46  ->selFlags & (SF
24bf0 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67  _Distinct|SF_Agg
24c00 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 44 69 73  regate))==SF_Dis
24c10 74 69 6e 63 74 20 0a 20 20 20 26 26 20 73 71 6c  tinct .   && sql
24c20 69 74 65 33 45 78 70 72 4c 69 73 74 43 6f 6d 70  ite3ExprListComp
24c30 61 72 65 28 70 4f 72 64 65 72 42 79 2c 20 70 2d  are(pOrderBy, p-
24c40 3e 70 45 4c 69 73 74 29 3d 3d 30 0a 20 20 29 7b  >pEList)==0.  ){
24c50 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73  .    p->selFlags
24c60 20 26 3d 20 7e 53 46 5f 44 69 73 74 69 6e 63 74   &= ~SF_Distinct
24c70 3b 0a 20 20 20 20 70 2d 3e 70 47 72 6f 75 70 42  ;.    p->pGroupB
24c80 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  y = sqlite3ExprL
24c90 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 45  istDup(db, p->pE
24ca0 4c 69 73 74 2c 20 30 29 3b 0a 20 20 20 20 70 47  List, 0);.    pG
24cb0 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f  roupBy = p->pGro
24cc0 75 70 42 79 3b 0a 20 20 20 20 70 4f 72 64 65 72  upBy;.    pOrder
24cd0 42 79 20 3d 20 30 3b 0a 20 20 20 20 2f 2a 20 4e  By = 0;.    /* N
24ce0 6f 74 69 63 65 20 74 68 61 74 20 65 76 65 6e 20  otice that even 
24cf0 74 68 6f 75 67 68 74 20 53 46 5f 44 69 73 74 69  thought SF_Disti
24d00 6e 63 74 20 68 61 73 20 62 65 65 6e 20 63 6c 65  nct has been cle
24d10 61 72 65 64 20 66 72 6f 6d 20 70 2d 3e 73 65 6c  ared from p->sel
24d20 46 6c 61 67 73 2c 0a 20 20 20 20 2a 2a 20 74 68  Flags,.    ** th
24d30 65 20 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e  e sDistinct.isTn
24d40 63 74 20 69 73 20 73 74 69 6c 6c 20 73 65 74 2e  ct is still set.
24d50 20 20 48 65 6e 63 65 2c 20 69 73 54 6e 63 74 20    Hence, isTnct 
24d60 72 65 70 72 65 73 65 6e 74 73 20 74 68 65 0a 20  represents the. 
24d70 20 20 20 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 73     ** original s
24d80 65 74 74 69 6e 67 20 6f 66 20 74 68 65 20 53 46  etting of the SF
24d90 5f 44 69 73 74 69 6e 63 74 20 66 6c 61 67 2c 20  _Distinct flag, 
24da0 6e 6f 74 20 74 68 65 20 63 75 72 72 65 6e 74 20  not the current 
24db0 73 65 74 74 69 6e 67 20 2a 2f 0a 20 20 20 20 61  setting */.    a
24dc0 73 73 65 72 74 28 20 73 44 69 73 74 69 6e 63 74  ssert( sDistinct
24dd0 2e 69 73 54 6e 63 74 20 29 3b 0a 20 20 7d 0a 0a  .isTnct );.  }..
24de0 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
24df0 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
24e00 75 73 65 2c 20 74 68 65 6e 20 74 68 69 73 20 73  use, then this s
24e10 6f 72 74 69 6e 67 0a 20 20 2a 2a 20 69 6e 64 65  orting.  ** inde
24e20 78 20 6d 69 67 68 74 20 65 6e 64 20 75 70 20 62  x might end up b
24e30 65 69 6e 67 20 75 6e 75 73 65 64 20 69 66 20 74  eing unused if t
24e40 68 65 20 64 61 74 61 20 63 61 6e 20 62 65 20 0a  he data can be .
24e50 20 20 2a 2a 20 65 78 74 72 61 63 74 65 64 20 69    ** extracted i
24e60 6e 20 70 72 65 2d 73 6f 72 74 65 64 20 6f 72 64  n pre-sorted ord
24e70 65 72 2e 20 20 49 66 20 74 68 61 74 20 69 73 20  er.  If that is 
24e80 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e 20 74  the case, then t
24e90 68 65 0a 20 20 2a 2a 20 4f 50 5f 4f 70 65 6e 45  he.  ** OP_OpenE
24ea0 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 75 63  phemeral instruc
24eb0 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 63 68 61  tion will be cha
24ec0 6e 67 65 64 20 74 6f 20 61 6e 20 4f 50 5f 4e 6f  nged to an OP_No
24ed0 6f 70 20 6f 6e 63 65 0a 20 20 2a 2a 20 77 65 20  op once.  ** we 
24ee0 66 69 67 75 72 65 20 6f 75 74 20 74 68 61 74 20  figure out that 
24ef0 74 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65  the sorting inde
24f00 78 20 69 73 20 6e 6f 74 20 6e 65 65 64 65 64 2e  x is not needed.
24f10 20 20 54 68 65 20 61 64 64 72 53 6f 72 74 49 6e    The addrSortIn
24f20 64 65 78 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c  dex.  ** variabl
24f30 65 20 69 73 20 75 73 65 64 20 74 6f 20 66 61 63  e is used to fac
24f40 69 6c 69 74 61 74 65 20 74 68 61 74 20 63 68 61  ilitate that cha
24f50 6e 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  nge..  */.  if( 
24f60 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
24f70 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
24f80 6f 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 20  o;.    pKeyInfo 
24f90 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70  = keyInfoFromExp
24fa0 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 4f  rList(pParse, pO
24fb0 72 64 65 72 42 79 29 3b 0a 20 20 20 20 70 4f 72  rderBy);.    pOr
24fc0 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 20  derBy->iECursor 
24fd0 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
24fe0 3b 0a 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65  ;.    p->addrOpe
24ff0 6e 45 70 68 6d 5b 32 5d 20 3d 20 61 64 64 72 53  nEphm[2] = addrS
25000 6f 72 74 49 6e 64 65 78 20 3d 0a 20 20 20 20 20  ortIndex =.     
25010 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
25020 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p4(v, OP_OpenEph
25030 65 6d 65 72 61 6c 2c 0a 20 20 20 20 20 20 20 20  emeral,.        
25040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25050 20 20 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43     pOrderBy->iEC
25060 75 72 73 6f 72 2c 20 70 4f 72 64 65 72 42 79 2d  ursor, pOrderBy-
25070 3e 6e 45 78 70 72 2b 32 2c 20 30 2c 0a 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 20 28 63 68 61 72 2a 29 70          (char*)p
250a0 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49  KeyInfo, P4_KEYI
250b0 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20  NFO_HANDOFF);.  
250c0 7d 65 6c 73 65 7b 0a 20 20 20 20 61 64 64 72 53  }else{.    addrS
250d0 6f 72 74 49 6e 64 65 78 20 3d 20 2d 31 3b 0a 20  ortIndex = -1;. 
250e0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
250f0 6f 75 74 70 75 74 20 69 73 20 64 65 73 74 69 6e  output is destin
25100 65 64 20 66 6f 72 20 61 20 74 65 6d 70 6f 72 61  ed for a tempora
25110 72 79 20 74 61 62 6c 65 2c 20 6f 70 65 6e 20 74  ry table, open t
25120 68 61 74 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a  hat table..  */.
25130 20 20 69 66 28 20 70 44 65 73 74 2d 3e 65 44 65    if( pDest->eDe
25140 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61 62  st==SRT_EphemTab
25150 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
25160 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
25170 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70  OpenEphemeral, p
25180 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 70  Dest->iSDParm, p
25190 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20  EList->nExpr);. 
251a0 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65   }..  /* Set the
251b0 20 6c 69 6d 69 74 65 72 2e 0a 20 20 2a 2f 0a 20   limiter..  */. 
251c0 20 69 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56   iEnd = sqlite3V
251d0 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
251e0 0a 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  .  p->nSelectRow
251f0 20 3d 20 4c 41 52 47 45 53 54 5f 49 4e 54 36 34   = LARGEST_INT64
25200 3b 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74  ;.  computeLimit
25210 52 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65  Registers(pParse
25220 2c 20 70 2c 20 69 45 6e 64 29 3b 0a 20 20 69 66  , p, iEnd);.  if
25230 28 20 70 2d 3e 69 4c 69 6d 69 74 3d 3d 30 20 26  ( p->iLimit==0 &
25240 26 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78 3e  & addrSortIndex>
25250 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
25260 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20 61 64  3VdbeGetOp(v, ad
25270 64 72 53 6f 72 74 49 6e 64 65 78 29 2d 3e 6f 70  drSortIndex)->op
25280 63 6f 64 65 20 3d 20 4f 50 5f 53 6f 72 74 65 72  code = OP_Sorter
25290 4f 70 65 6e 3b 0a 20 20 20 20 70 2d 3e 73 65 6c  Open;.    p->sel
252a0 46 6c 61 67 73 20 7c 3d 20 53 46 5f 55 73 65 53  Flags |= SF_UseS
252b0 6f 72 74 65 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  orter;.  }..  /*
252c0 20 4f 70 65 6e 20 61 20 76 69 72 74 75 61 6c 20   Open a virtual 
252d0 69 6e 64 65 78 20 74 6f 20 75 73 65 20 66 6f 72  index to use for
252e0 20 74 68 65 20 64 69 73 74 69 6e 63 74 20 73 65   the distinct se
252f0 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  t..  */.  if( p-
25300 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44  >selFlags & SF_D
25310 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 73  istinct ){.    s
25320 44 69 73 74 69 6e 63 74 2e 74 61 62 54 6e 63 74  Distinct.tabTnct
25330 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
25340 2b 3b 0a 20 20 20 20 73 44 69 73 74 69 6e 63 74  +;.    sDistinct
25350 2e 61 64 64 72 54 6e 63 74 20 3d 20 73 71 6c 69  .addrTnct = sqli
25360 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
25370 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
25380 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  l,.             
25390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
253a0 20 20 20 73 44 69 73 74 69 6e 63 74 2e 74 61 62     sDistinct.tab
253b0 54 6e 63 74 2c 20 30 2c 20 30 2c 0a 20 20 20 20  Tnct, 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 20 28 63 68 61              (cha
253e0 72 2a 29 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78  r*)keyInfoFromEx
253f0 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
25400 2d 3e 70 45 4c 69 73 74 29 2c 0a 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 20 50 34 5f 4b 45             P4_KE
25430 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a  YINFO_HANDOFF);.
25440 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
25450 68 61 6e 67 65 50 35 28 76 2c 20 42 54 52 45 45  hangeP5(v, BTREE
25460 5f 55 4e 4f 52 44 45 52 45 44 29 3b 0a 20 20 20  _UNORDERED);.   
25470 20 73 44 69 73 74 69 6e 63 74 2e 65 54 6e 63 74   sDistinct.eTnct
25480 54 79 70 65 20 3d 20 57 48 45 52 45 5f 44 49 53  Type = WHERE_DIS
25490 54 49 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44 3b  TINCT_UNORDERED;
254a0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 44  .  }else{.    sD
254b0 69 73 74 69 6e 63 74 2e 65 54 6e 63 74 54 79 70  istinct.eTnctTyp
254c0 65 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e  e = WHERE_DISTIN
254d0 43 54 5f 4e 4f 4f 50 3b 0a 20 20 7d 0a 0a 20 20  CT_NOOP;.  }..  
254e0 69 66 28 20 21 69 73 41 67 67 20 26 26 20 70 47  if( !isAgg && pG
254f0 72 6f 75 70 42 79 3d 3d 30 20 29 7b 0a 20 20 20  roupBy==0 ){.   
25500 20 2f 2a 20 4e 6f 20 61 67 67 72 65 67 61 74 65   /* No aggregate
25510 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 20 6e   functions and n
25520 6f 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  o GROUP BY claus
25530 65 20 2a 2f 0a 20 20 20 20 45 78 70 72 4c 69 73  e */.    ExprLis
25540 74 20 2a 70 44 69 73 74 20 3d 20 28 73 44 69 73  t *pDist = (sDis
25550 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 3f 20 70  tinct.isTnct ? p
25560 2d 3e 70 45 4c 69 73 74 20 3a 20 30 29 3b 0a 0a  ->pEList : 0);..
25570 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 74 68 65      /* Begin the
25580 20 64 61 74 61 62 61 73 65 20 73 63 61 6e 2e 20   database scan. 
25590 2a 2f 0a 20 20 20 20 70 57 49 6e 66 6f 20 3d 20  */.    pWInfo = 
255a0 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
255b0 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69  n(pParse, pTabLi
255c0 73 74 2c 20 70 57 68 65 72 65 2c 20 70 4f 72 64  st, pWhere, pOrd
255d0 65 72 42 79 2c 20 70 44 69 73 74 2c 20 30 2c 30  erBy, pDist, 0,0
255e0 29 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66  );.    if( pWInf
255f0 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65  o==0 ) goto sele
25600 63 74 5f 65 6e 64 3b 0a 20 20 20 20 69 66 28 20  ct_end;.    if( 
25610 73 71 6c 69 74 65 33 57 68 65 72 65 4f 75 74 70  sqlite3WhereOutp
25620 75 74 52 6f 77 43 6f 75 6e 74 28 70 57 49 6e 66  utRowCount(pWInf
25630 6f 29 20 3c 20 70 2d 3e 6e 53 65 6c 65 63 74 52  o) < p->nSelectR
25640 6f 77 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e  ow ){.      p->n
25650 53 65 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c 69  SelectRow = sqli
25660 74 65 33 57 68 65 72 65 4f 75 74 70 75 74 52 6f  te3WhereOutputRo
25670 77 43 6f 75 6e 74 28 70 57 49 6e 66 6f 29 3b 0a  wCount(pWInfo);.
25680 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71      }.    if( sq
25690 6c 69 74 65 33 57 68 65 72 65 49 73 44 69 73 74  lite3WhereIsDist
256a0 69 6e 63 74 28 70 57 49 6e 66 6f 29 20 29 7b 0a  inct(pWInfo) ){.
256b0 20 20 20 20 20 20 73 44 69 73 74 69 6e 63 74 2e        sDistinct.
256c0 65 54 6e 63 74 54 79 70 65 20 3d 20 73 71 6c 69  eTnctType = sqli
256d0 74 65 33 57 68 65 72 65 49 73 44 69 73 74 69 6e  te3WhereIsDistin
256e0 63 74 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20  ct(pWInfo);.    
256f0 7d 0a 20 20 20 20 69 66 28 20 70 4f 72 64 65 72  }.    if( pOrder
25700 42 79 20 26 26 20 73 71 6c 69 74 65 33 57 68 65  By && sqlite3Whe
25710 72 65 49 73 4f 72 64 65 72 65 64 28 70 57 49 6e  reIsOrdered(pWIn
25720 66 6f 29 20 29 20 70 4f 72 64 65 72 42 79 20 3d  fo) ) pOrderBy =
25730 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 73   0;..    /* If s
25740 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74 68 61  orting index tha
25750 74 20 77 61 73 20 63 72 65 61 74 65 64 20 62 79  t was created by
25760 20 61 20 70 72 69 6f 72 20 4f 50 5f 4f 70 65 6e   a prior OP_Open
25770 45 70 68 65 6d 65 72 61 6c 20 0a 20 20 20 20 2a  Ephemeral .    *
25780 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 65 6e  * instruction en
25790 64 65 64 20 75 70 20 6e 6f 74 20 62 65 69 6e 67  ded up not being
257a0 20 6e 65 65 64 65 64 2c 20 74 68 65 6e 20 63 68   needed, then ch
257b0 61 6e 67 65 20 74 68 65 20 4f 50 5f 4f 70 65 6e  ange the OP_Open
257c0 45 70 68 65 6d 65 72 61 6c 0a 20 20 20 20 2a 2a  Ephemeral.    **
257d0 20 69 6e 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70   into an OP_Noop
257e0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
257f0 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78 3e 3d   addrSortIndex>=
25800 30 20 26 26 20 70 4f 72 64 65 72 42 79 3d 3d 30  0 && pOrderBy==0
25810 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
25820 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f  3VdbeChangeToNoo
25830 70 28 76 2c 20 61 64 64 72 53 6f 72 74 49 6e 64  p(v, addrSortInd
25840 65 78 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64  ex);.      p->ad
25850 64 72 4f 70 65 6e 45 70 68 6d 5b 32 5d 20 3d 20  drOpenEphm[2] = 
25860 2d 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  -1;.    }..    /
25870 2a 20 55 73 65 20 74 68 65 20 73 74 61 6e 64 61  * Use the standa
25880 72 64 20 69 6e 6e 65 72 20 6c 6f 6f 70 2e 20 2a  rd inner loop. *
25890 2f 0a 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65  /.    selectInne
258a0 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c  rLoop(pParse, p,
258b0 20 70 45 4c 69 73 74 2c 20 30 2c 20 30 2c 20 70   pEList, 0, 0, p
258c0 4f 72 64 65 72 42 79 2c 20 26 73 44 69 73 74 69  OrderBy, &sDisti
258d0 6e 63 74 2c 20 70 44 65 73 74 2c 0a 20 20 20 20  nct, pDest,.    
258e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
258f0 73 71 6c 69 74 65 33 57 68 65 72 65 43 6f 6e 74  sqlite3WhereCont
25900 69 6e 75 65 4c 61 62 65 6c 28 70 57 49 6e 66 6f  inueLabel(pWInfo
25910 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
25920 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68         sqlite3Wh
25930 65 72 65 42 72 65 61 6b 4c 61 62 65 6c 28 70 57  ereBreakLabel(pW
25940 49 6e 66 6f 29 29 3b 0a 0a 20 20 20 20 2f 2a 20  Info));..    /* 
25950 45 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65  End the database
25960 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20   scan loop..    
25970 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 57 68  */.    sqlite3Wh
25980 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a  ereEnd(pWInfo);.
25990 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
259a0 54 68 69 73 20 63 61 73 65 20 77 68 65 6e 20 74  This case when t
259b0 68 65 72 65 20 65 78 69 73 74 20 61 67 67 72 65  here exist aggre
259c0 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 6f  gate functions o
259d0 72 20 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61  r a GROUP BY cla
259e0 75 73 65 0a 20 20 20 20 2a 2a 20 6f 72 20 62 6f  use.    ** or bo
259f0 74 68 20 2a 2f 0a 20 20 20 20 4e 61 6d 65 43 6f  th */.    NameCo
25a00 6e 74 65 78 74 20 73 4e 43 3b 20 20 20 20 2f 2a  ntext sNC;    /*
25a10 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20 66 6f   Name context fo
25a20 72 20 70 72 6f 63 65 73 73 69 6e 67 20 61 67 67  r processing agg
25a30 72 65 67 61 74 65 20 69 6e 66 6f 72 6d 61 74 69  regate informati
25a40 6f 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 41  on */.    int iA
25a50 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  Mem;          /*
25a60 20 46 69 72 73 74 20 4d 65 6d 20 61 64 64 72 65   First Mem addre
25a70 73 73 20 66 6f 72 20 73 74 6f 72 69 6e 67 20 63  ss for storing c
25a80 75 72 72 65 6e 74 20 47 52 4f 55 50 20 42 59 20  urrent GROUP BY 
25a90 2a 2f 0a 20 20 20 20 69 6e 74 20 69 42 4d 65 6d  */.    int iBMem
25aa0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  ;          /* Fi
25ab0 72 73 74 20 4d 65 6d 20 61 64 64 72 65 73 73 20  rst Mem address 
25ac0 66 6f 72 20 70 72 65 76 69 6f 75 73 20 47 52 4f  for previous GRO
25ad0 55 50 20 42 59 20 2a 2f 0a 20 20 20 20 69 6e 74  UP BY */.    int
25ae0 20 69 55 73 65 46 6c 61 67 3b 20 20 20 20 20 20   iUseFlag;      
25af0 20 2f 2a 20 4d 65 6d 20 61 64 64 72 65 73 73 20   /* Mem address 
25b00 68 6f 6c 64 69 6e 67 20 66 6c 61 67 20 69 6e 64  holding flag ind
25b10 69 63 61 74 69 6e 67 20 74 68 61 74 20 61 74 20  icating that at 
25b20 6c 65 61 73 74 0a 20 20 20 20 20 20 20 20 20 20  least.          
25b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
25b40 20 6f 6e 65 20 72 6f 77 20 6f 66 20 74 68 65 20   one row of the 
25b50 69 6e 70 75 74 20 74 6f 20 74 68 65 20 61 67 67  input to the agg
25b60 72 65 67 61 74 6f 72 20 68 61 73 20 62 65 65 6e  regator has been
25b70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
25b80 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63           ** proc
25b90 65 73 73 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74  essed */.    int
25ba0 20 69 41 62 6f 72 74 46 6c 61 67 3b 20 20 20 20   iAbortFlag;    
25bb0 20 2f 2a 20 4d 65 6d 20 61 64 64 72 65 73 73 20   /* Mem address 
25bc0 77 68 69 63 68 20 63 61 75 73 65 73 20 71 75 65  which causes que
25bd0 72 79 20 61 62 6f 72 74 20 69 66 20 70 6f 73 69  ry abort if posi
25be0 74 69 76 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20  tive */.    int 
25bf0 67 72 6f 75 70 42 79 53 6f 72 74 3b 20 20 20 20  groupBySort;    
25c00 2f 2a 20 52 6f 77 73 20 63 6f 6d 65 20 66 72 6f  /* Rows come fro
25c10 6d 20 73 6f 75 72 63 65 20 69 6e 20 47 52 4f 55  m source in GROU
25c20 50 20 42 59 20 6f 72 64 65 72 20 2a 2f 0a 20 20  P BY order */.  
25c30 20 20 69 6e 74 20 61 64 64 72 45 6e 64 3b 20 20    int addrEnd;  
25c40 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20        /* End of 
25c50 70 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 74  processing for t
25c60 68 69 73 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20  his SELECT */.  
25c70 20 20 69 6e 74 20 73 6f 72 74 50 54 61 62 20 3d    int sortPTab =
25c80 20 30 3b 20 20 20 2f 2a 20 50 73 65 75 64 6f 74   0;   /* Pseudot
25c90 61 62 6c 65 20 75 73 65 64 20 74 6f 20 64 65 63  able used to dec
25ca0 6f 64 65 20 73 6f 72 74 69 6e 67 20 72 65 73 75  ode sorting resu
25cb0 6c 74 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73  lts */.    int s
25cc0 6f 72 74 4f 75 74 20 3d 20 30 3b 20 20 20 20 2f  ortOut = 0;    /
25cd0 2a 20 4f 75 74 70 75 74 20 72 65 67 69 73 74 65  * Output registe
25ce0 72 20 66 72 6f 6d 20 74 68 65 20 73 6f 72 74 65  r from the sorte
25cf0 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 65 6d  r */..    /* Rem
25d00 6f 76 65 20 61 6e 79 20 61 6e 64 20 61 6c 6c 20  ove any and all 
25d10 61 6c 69 61 73 65 73 20 62 65 74 77 65 65 6e 20  aliases between 
25d20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 61  the result set a
25d30 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20 47 52  nd the.    ** GR
25d40 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e 0a 20  OUP BY clause.. 
25d50 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 47     */.    if( pG
25d60 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20  roupBy ){.      
25d70 69 6e 74 20 6b 3b 20 20 20 20 20 20 20 20 20 20  int k;          
25d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25d90 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
25da0 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78  .      struct Ex
25db0 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
25dc0 65 6d 3b 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70  em;  /* For loop
25dd0 69 6e 67 20 6f 76 65 72 20 65 78 70 72 65 73 73  ing over express
25de0 69 6f 6e 20 69 6e 20 61 20 6c 69 73 74 20 2a 2f  ion in a list */
25df0 0a 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 70 2d  ..      for(k=p-
25e00 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20  >pEList->nExpr, 
25e10 70 49 74 65 6d 3d 70 2d 3e 70 45 4c 69 73 74 2d  pItem=p->pEList-
25e20 3e 61 3b 20 6b 3e 30 3b 20 6b 2d 2d 2c 20 70 49  >a; k>0; k--, pI
25e30 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  tem++){.        
25e40 70 49 74 65 6d 2d 3e 69 41 6c 69 61 73 20 3d 20  pItem->iAlias = 
25e50 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
25e60 20 66 6f 72 28 6b 3d 70 47 72 6f 75 70 42 79 2d   for(k=pGroupBy-
25e70 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d 70 47  >nExpr, pItem=pG
25e80 72 6f 75 70 42 79 2d 3e 61 3b 20 6b 3e 30 3b 20  roupBy->a; k>0; 
25e90 6b 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  k--, pItem++){. 
25ea0 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 41         pItem->iA
25eb0 6c 69 61 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  lias = 0;.      
25ec0 7d 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e  }.      if( p->n
25ed0 53 65 6c 65 63 74 52 6f 77 3e 31 30 30 20 29 20  SelectRow>100 ) 
25ee0 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20  p->nSelectRow = 
25ef0 31 30 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  100;.    }else{.
25f00 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74        p->nSelect
25f10 52 6f 77 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a  Row = 1;.    }..
25f20 20 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20   .    /* Create 
25f30 61 20 6c 61 62 65 6c 20 74 6f 20 6a 75 6d 70 20  a label to jump 
25f40 74 6f 20 77 68 65 6e 20 77 65 20 77 61 6e 74 20  to when we want 
25f50 74 6f 20 61 62 6f 72 74 20 74 68 65 20 71 75 65  to abort the que
25f60 72 79 20 2a 2f 0a 20 20 20 20 61 64 64 72 45 6e  ry */.    addrEn
25f70 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  d = sqlite3VdbeM
25f80 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20  akeLabel(v);..  
25f90 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 54 4b 5f    /* Convert TK_
25fa0 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73 20 69 6e 74  COLUMN nodes int
25fb0 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20  o TK_AGG_COLUMN 
25fc0 61 6e 64 20 6d 61 6b 65 20 65 6e 74 72 69 65 73  and make entries
25fd0 20 69 6e 0a 20 20 20 20 2a 2a 20 73 41 67 67 49   in.    ** sAggI
25fe0 6e 66 6f 20 66 6f 72 20 61 6c 6c 20 54 4b 5f 41  nfo for all TK_A
25ff0 47 47 5f 46 55 4e 43 54 49 4f 4e 20 6e 6f 64 65  GG_FUNCTION node
26000 73 20 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 73  s in expressions
26010 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 53   of the.    ** S
26020 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
26030 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6d 65 6d 73  .    */.    mems
26040 65 74 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65  et(&sNC, 0, size
26050 6f 66 28 73 4e 43 29 29 3b 0a 20 20 20 20 73 4e  of(sNC));.    sN
26060 43 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73  C.pParse = pPars
26070 65 3b 0a 20 20 20 20 73 4e 43 2e 70 53 72 63 4c  e;.    sNC.pSrcL
26080 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a  ist = pTabList;.
26090 20 20 20 20 73 4e 43 2e 70 41 67 67 49 6e 66 6f      sNC.pAggInfo
260a0 20 3d 20 26 73 41 67 67 49 6e 66 6f 3b 0a 20 20   = &sAggInfo;.  
260b0 20 20 73 41 67 67 49 6e 66 6f 2e 6e 53 6f 72 74    sAggInfo.nSort
260c0 69 6e 67 43 6f 6c 75 6d 6e 20 3d 20 70 47 72 6f  ingColumn = pGro
260d0 75 70 42 79 20 3f 20 70 47 72 6f 75 70 42 79 2d  upBy ? pGroupBy-
260e0 3e 6e 45 78 70 72 2b 31 20 3a 20 30 3b 0a 20 20  >nExpr+1 : 0;.  
260f0 20 20 73 41 67 67 49 6e 66 6f 2e 70 47 72 6f 75    sAggInfo.pGrou
26100 70 42 79 20 3d 20 70 47 72 6f 75 70 42 79 3b 0a  pBy = pGroupBy;.
26110 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41      sqlite3ExprA
26120 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 26 73  nalyzeAggList(&s
26130 4e 43 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20  NC, pEList);.   
26140 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
26150 79 7a 65 41 67 67 4c 69 73 74 28 26 73 4e 43 2c  yzeAggList(&sNC,
26160 20 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20   pOrderBy);.    
26170 69 66 28 20 70 48 61 76 69 6e 67 20 29 7b 0a 20  if( pHaving ){. 
26180 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
26190 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  AnalyzeAggregate
261a0 73 28 26 73 4e 43 2c 20 70 48 61 76 69 6e 67 29  s(&sNC, pHaving)
261b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 41 67 67  ;.    }.    sAgg
261c0 49 6e 66 6f 2e 6e 41 63 63 75 6d 75 6c 61 74 6f  Info.nAccumulato
261d0 72 20 3d 20 73 41 67 67 49 6e 66 6f 2e 6e 43 6f  r = sAggInfo.nCo
261e0 6c 75 6d 6e 3b 0a 20 20 20 20 66 6f 72 28 69 3d  lumn;.    for(i=
261f0 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 46  0; i<sAggInfo.nF
26200 75 6e 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  unc; i++){.     
26210 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
26220 73 50 72 6f 70 65 72 74 79 28 73 41 67 67 49 6e  sProperty(sAggIn
26230 66 6f 2e 61 46 75 6e 63 5b 69 5d 2e 70 45 78 70  fo.aFunc[i].pExp
26240 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
26250 20 29 3b 0a 20 20 20 20 20 20 73 4e 43 2e 6e 63   );.      sNC.nc
26260 46 6c 61 67 73 20 7c 3d 20 4e 43 5f 49 6e 41 67  Flags |= NC_InAg
26270 67 46 75 6e 63 3b 0a 20 20 20 20 20 20 73 71 6c  gFunc;.      sql
26280 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
26290 67 67 4c 69 73 74 28 26 73 4e 43 2c 20 73 41 67  ggList(&sNC, sAg
262a0 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 69 5d 2e 70  gInfo.aFunc[i].p
262b0 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a  Expr->x.pList);.
262c0 20 20 20 20 20 20 73 4e 43 2e 6e 63 46 6c 61 67        sNC.ncFlag
262d0 73 20 26 3d 20 7e 4e 43 5f 49 6e 41 67 67 46 75  s &= ~NC_InAggFu
262e0 6e 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  nc;.    }.    if
262f0 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
26300 65 64 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74  ed ) goto select
26310 5f 65 6e 64 3b 0a 0a 20 20 20 20 2f 2a 20 50 72  _end;..    /* Pr
26320 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 61 67 67  ocessing for agg
26330 72 65 67 61 74 65 73 20 77 69 74 68 20 47 52 4f  regates with GRO
26340 55 50 20 42 59 20 69 73 20 76 65 72 79 20 64 69  UP BY is very di
26350 66 66 65 72 65 6e 74 20 61 6e 64 0a 20 20 20 20  fferent and.    
26360 2a 2a 20 6d 75 63 68 20 6d 6f 72 65 20 63 6f 6d  ** much more com
26370 70 6c 65 78 20 74 68 61 6e 20 61 67 67 72 65 67  plex than aggreg
26380 61 74 65 73 20 77 69 74 68 6f 75 74 20 61 20 47  ates without a G
26390 52 4f 55 50 20 42 59 2e 0a 20 20 20 20 2a 2f 0a  ROUP BY..    */.
263a0 20 20 20 20 69 66 28 20 70 47 72 6f 75 70 42 79      if( pGroupBy
263b0 20 29 7b 0a 20 20 20 20 20 20 4b 65 79 49 6e 66   ){.      KeyInf
263c0 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 20 20 2f 2a  o *pKeyInfo;  /*
263d0 20 4b 65 79 69 6e 67 20 69 6e 66 6f 72 6d 61 74   Keying informat
263e0 69 6f 6e 20 66 6f 72 20 74 68 65 20 67 72 6f 75  ion for the grou
263f0 70 20 62 79 20 63 6c 61 75 73 65 20 2a 2f 0a 20  p by clause */. 
26400 20 20 20 20 20 69 6e 74 20 6a 31 3b 20 20 20 20       int j1;    
26410 20 20 20 20 20 20 20 20 20 2f 2a 20 41 2d 76 73           /* A-vs
26420 2d 42 20 63 6f 6d 70 61 72 69 73 69 6f 6e 20 6a  -B comparision j
26430 75 6d 70 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ump */.      int
26440 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 3b 20   addrOutputRow; 
26450 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 73 75 62   /* Start of sub
26460 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74  routine that out
26470 70 75 74 73 20 61 20 72 65 73 75 6c 74 20 72 6f  puts a result ro
26480 77 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72  w */.      int r
26490 65 67 4f 75 74 70 75 74 52 6f 77 3b 20 20 20 2f  egOutputRow;   /
264a0 2a 20 52 65 74 75 72 6e 20 61 64 64 72 65 73 73  * Return address
264b0 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 6f 75   register for ou
264c0 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65 20  tput subroutine 
264d0 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  */.      int add
264e0 72 53 65 74 41 62 6f 72 74 3b 20 20 20 2f 2a 20  rSetAbort;   /* 
264f0 53 65 74 20 74 68 65 20 61 62 6f 72 74 20 66 6c  Set the abort fl
26500 61 67 20 61 6e 64 20 72 65 74 75 72 6e 20 2a 2f  ag and return */
26510 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 54  .      int addrT
26520 6f 70 4f 66 4c 6f 6f 70 3b 20 20 2f 2a 20 54 6f  opOfLoop;  /* To
26530 70 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 6c  p of the input l
26540 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  oop */.      int
26550 20 61 64 64 72 53 6f 72 74 69 6e 67 49 64 78 3b   addrSortingIdx;
26560 20 2f 2a 20 54 68 65 20 4f 50 5f 4f 70 65 6e 45   /* The OP_OpenE
26570 70 68 65 6d 65 72 61 6c 20 66 6f 72 20 74 68 65  phemeral for the
26580 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 2a   sorting index *
26590 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  /.      int addr
265a0 52 65 73 65 74 3b 20 20 20 20 20 20 2f 2a 20 53  Reset;      /* S
265b0 75 62 72 6f 75 74 69 6e 65 20 66 6f 72 20 72 65  ubroutine for re
265c0 73 65 74 74 69 6e 67 20 74 68 65 20 61 63 63 75  setting the accu
265d0 6d 75 6c 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20  mulator */.     
265e0 20 69 6e 74 20 72 65 67 52 65 73 65 74 3b 20 20   int regReset;  
265f0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 61       /* Return a
26600 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20  ddress register 
26610 66 6f 72 20 72 65 73 65 74 20 73 75 62 72 6f 75  for reset subrou
26620 74 69 6e 65 20 2a 2f 0a 0a 20 20 20 20 20 20 2f  tine */..      /
26630 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20  * If there is a 
26640 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20  GROUP BY clause 
26650 77 65 20 6d 69 67 68 74 20 6e 65 65 64 20 61 20  we might need a 
26660 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74 6f  sorting index to
26670 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70 6c 65 6d  .      ** implem
26680 65 6e 74 20 69 74 2e 20 20 41 6c 6c 6f 63 61 74  ent it.  Allocat
26690 65 20 74 68 61 74 20 73 6f 72 74 69 6e 67 20 69  e that sorting i
266a0 6e 64 65 78 20 6e 6f 77 2e 20 20 49 66 20 69 74  ndex now.  If it
266b0 20 74 75 72 6e 73 20 6f 75 74 0a 20 20 20 20 20   turns out.     
266c0 20 2a 2a 20 74 68 61 74 20 77 65 20 64 6f 20 6e   ** that we do n
266d0 6f 74 20 6e 65 65 64 20 69 74 20 61 66 74 65 72  ot need it after
266e0 20 61 6c 6c 2c 20 74 68 65 20 4f 50 5f 53 6f 72   all, the OP_Sor
266f0 74 65 72 4f 70 65 6e 20 69 6e 73 74 72 75 63 74  terOpen instruct
26700 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 77 69 6c  ion.      ** wil
26710 6c 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20 69  l be converted i
26720 6e 74 6f 20 61 20 4e 6f 6f 70 2e 20 20 0a 20 20  nto a Noop.  .  
26730 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 41 67      */.      sAg
26740 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78  gInfo.sortingIdx
26750 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
26760 2b 3b 0a 20 20 20 20 20 20 70 4b 65 79 49 6e 66  +;.      pKeyInf
26770 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45  o = keyInfoFromE
26780 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
26790 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 20  pGroupBy);.     
267a0 20 61 64 64 72 53 6f 72 74 69 6e 67 49 64 78 20   addrSortingIdx 
267b0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
267c0 4f 70 34 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72  Op4(v, OP_Sorter
267d0 4f 70 65 6e 2c 20 0a 20 20 20 20 20 20 20 20 20  Open, .         
267e0 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e   sAggInfo.sortin
267f0 67 49 64 78 2c 20 73 41 67 67 49 6e 66 6f 2e 6e  gIdx, sAggInfo.n
26800 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 2c 20 0a  SortingColumn, .
26810 20 20 20 20 20 20 20 20 20 20 30 2c 20 28 63 68            0, (ch
26820 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34  ar*)pKeyInfo, P4
26830 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46  _KEYINFO_HANDOFF
26840 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 6e 69  );..      /* Ini
26850 74 69 61 6c 69 7a 65 20 6d 65 6d 6f 72 79 20 6c  tialize memory l
26860 6f 63 61 74 69 6f 6e 73 20 75 73 65 64 20 62 79  ocations used by
26870 20 47 52 4f 55 50 20 42 59 20 61 67 67 72 65 67   GROUP BY aggreg
26880 61 74 65 20 70 72 6f 63 65 73 73 69 6e 67 0a 20  ate processing. 
26890 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 55       */.      iU
268a0 73 65 46 6c 61 67 20 3d 20 2b 2b 70 50 61 72 73  seFlag = ++pPars
268b0 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 69  e->nMem;.      i
268c0 41 62 6f 72 74 46 6c 61 67 20 3d 20 2b 2b 70 50  AbortFlag = ++pP
268d0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
268e0 20 20 72 65 67 4f 75 74 70 75 74 52 6f 77 20 3d    regOutputRow =
268f0 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
26900 0a 20 20 20 20 20 20 61 64 64 72 4f 75 74 70 75  .      addrOutpu
26910 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 56 64  tRow = sqlite3Vd
26920 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
26930 20 20 20 20 20 20 72 65 67 52 65 73 65 74 20 3d        regReset =
26940 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
26950 0a 20 20 20 20 20 20 61 64 64 72 52 65 73 65 74  .      addrReset
26960 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
26970 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
26980 20 20 69 41 4d 65 6d 20 3d 20 70 50 61 72 73 65    iAMem = pParse
26990 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 20 20  ->nMem + 1;.    
269a0 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
269b0 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  = pGroupBy->nExp
269c0 72 3b 0a 20 20 20 20 20 20 69 42 4d 65 6d 20 3d  r;.      iBMem =
269d0 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20   pParse->nMem + 
269e0 31 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  1;.      pParse-
269f0 3e 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f 75 70 42  >nMem += pGroupB
26a00 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20  y->nExpr;.      
26a10 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
26a20 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
26a30 20 30 2c 20 69 41 62 6f 72 74 46 6c 61 67 29 3b   0, iAbortFlag);
26a40 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
26a50 6e 74 28 28 76 2c 20 22 63 6c 65 61 72 20 61 62  nt((v, "clear ab
26a60 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a 20 20 20  ort flag"));.   
26a70 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
26a80 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
26a90 65 72 2c 20 30 2c 20 69 55 73 65 46 6c 61 67 29  er, 0, iUseFlag)
26aa0 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
26ab0 65 6e 74 28 28 76 2c 20 22 69 6e 64 69 63 61 74  ent((v, "indicat
26ac0 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 65 6d  e accumulator em
26ad0 70 74 79 22 29 29 3b 0a 20 20 20 20 20 20 73 71  pty"));.      sq
26ae0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
26af0 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 69  v, OP_Null, 0, i
26b00 41 4d 65 6d 2c 20 69 41 4d 65 6d 2b 70 47 72 6f  AMem, iAMem+pGro
26b10 75 70 42 79 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a  upBy->nExpr-1);.
26b20 0a 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20  .      /* Begin 
26b30 61 20 6c 6f 6f 70 20 74 68 61 74 20 77 69 6c 6c  a loop that will
26b40 20 65 78 74 72 61 63 74 20 61 6c 6c 20 73 6f 75   extract all sou
26b50 72 63 65 20 72 6f 77 73 20 69 6e 20 47 52 4f 55  rce rows in GROU
26b60 50 20 42 59 20 6f 72 64 65 72 2e 0a 20 20 20 20  P BY order..    
26b70 20 20 2a 2a 20 54 68 69 73 20 6d 69 67 68 74 20    ** This might 
26b80 69 6e 76 6f 6c 76 65 20 74 77 6f 20 73 65 70 61  involve two sepa
26b90 72 61 74 65 20 6c 6f 6f 70 73 20 77 69 74 68 20  rate loops with 
26ba0 61 6e 20 4f 50 5f 53 6f 72 74 20 69 6e 20 62 65  an OP_Sort in be
26bb0 74 77 65 65 6e 2c 20 6f 72 0a 20 20 20 20 20 20  tween, or.      
26bc0 2a 2a 20 69 74 20 6d 69 67 68 74 20 62 65 20 61  ** it might be a
26bd0 20 73 69 6e 67 6c 65 20 6c 6f 6f 70 20 74 68 61   single loop tha
26be0 74 20 75 73 65 73 20 61 6e 20 69 6e 64 65 78 20  t uses an index 
26bf0 74 6f 20 65 78 74 72 61 63 74 20 69 6e 66 6f 72  to extract infor
26c00 6d 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20  mation.      ** 
26c10 69 6e 20 74 68 65 20 72 69 67 68 74 20 6f 72 64  in the right ord
26c20 65 72 20 74 6f 20 62 65 67 69 6e 20 77 69 74 68  er to begin with
26c30 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
26c40 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
26c50 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
26c60 72 65 67 52 65 73 65 74 2c 20 61 64 64 72 52 65  regReset, addrRe
26c70 73 65 74 29 3b 0a 20 20 20 20 20 20 70 57 49 6e  set);.      pWIn
26c80 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72  fo = sqlite3Wher
26c90 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70  eBegin(pParse, p
26ca0 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65 2c  TabList, pWhere,
26cb0 20 70 47 72 6f 75 70 42 79 2c 20 30 2c 20 30 2c   pGroupBy, 0, 0,
26cc0 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70   0);.      if( p
26cd0 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20  WInfo==0 ) goto 
26ce0 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
26cf0 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65    if( sqlite3Whe
26d00 72 65 49 73 4f 72 64 65 72 65 64 28 70 57 49 6e  reIsOrdered(pWIn
26d10 66 6f 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  fo) ){.        /
26d20 2a 20 54 68 65 20 6f 70 74 69 6d 69 7a 65 72 20  * The optimizer 
26d30 69 73 20 61 62 6c 65 20 74 6f 20 64 65 6c 69 76  is able to deliv
26d40 65 72 20 72 6f 77 73 20 69 6e 20 67 72 6f 75 70  er rows in group
26d50 20 62 79 20 6f 72 64 65 72 20 73 6f 0a 20 20 20   by order so.   
26d60 20 20 20 20 20 2a 2a 20 77 65 20 64 6f 20 6e 6f       ** we do no
26d70 74 20 68 61 76 65 20 74 6f 20 73 6f 72 74 2e 20  t have to sort. 
26d80 20 54 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65   The OP_OpenEphe
26d90 6d 65 72 61 6c 20 74 61 62 6c 65 20 77 69 6c 6c  meral table will
26da0 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 63   be.        ** c
26db0 61 6e 63 65 6c 6c 65 64 20 6c 61 74 65 72 20 62  ancelled later b
26dc0 65 63 61 75 73 65 20 77 65 20 73 74 69 6c 6c 20  ecause we still 
26dd0 6e 65 65 64 20 74 6f 20 75 73 65 20 74 68 65 20  need to use the 
26de0 70 4b 65 79 49 6e 66 6f 0a 20 20 20 20 20 20 20  pKeyInfo.       
26df0 20 2a 2f 0a 20 20 20 20 20 20 20 20 67 72 6f 75   */.        grou
26e00 70 42 79 53 6f 72 74 20 3d 20 30 3b 0a 20 20 20  pBySort = 0;.   
26e10 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
26e20 20 20 2f 2a 20 52 6f 77 73 20 61 72 65 20 63 6f    /* Rows are co
26e30 6d 69 6e 67 20 6f 75 74 20 69 6e 20 75 6e 64 65  ming out in unde
26e40 74 65 72 6d 69 6e 65 64 20 6f 72 64 65 72 2e 20  termined order. 
26e50 20 57 65 20 68 61 76 65 20 74 6f 20 70 75 73 68   We have to push
26e60 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 61 63 68  .        ** each
26e70 20 72 6f 77 20 69 6e 74 6f 20 61 20 73 6f 72 74   row into a sort
26e80 69 6e 67 20 69 6e 64 65 78 2c 20 74 65 72 6d 69  ing index, termi
26e90 6e 61 74 65 20 74 68 65 20 66 69 72 73 74 20 6c  nate the first l
26ea0 6f 6f 70 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20  oop,.        ** 
26eb0 74 68 65 6e 20 6c 6f 6f 70 20 6f 76 65 72 20 74  then loop over t
26ec0 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78  he sorting index
26ed0 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 74   in order to get
26ee0 20 74 68 65 20 6f 75 74 70 75 74 0a 20 20 20 20   the output.    
26ef0 20 20 20 20 2a 2a 20 69 6e 20 73 6f 72 74 65 64      ** in sorted
26f00 20 6f 72 64 65 72 0a 20 20 20 20 20 20 20 20 2a   order.        *
26f10 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 65  /.        int re
26f20 67 42 61 73 65 3b 0a 20 20 20 20 20 20 20 20 69  gBase;.        i
26f30 6e 74 20 72 65 67 52 65 63 6f 72 64 3b 0a 20 20  nt regRecord;.  
26f40 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a        int nCol;.
26f50 20 20 20 20 20 20 20 20 69 6e 74 20 6e 47 72 6f          int nGro
26f60 75 70 42 79 3b 0a 0a 20 20 20 20 20 20 20 20 65  upBy;..        e
26f70 78 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65 28  xplainTempTable(
26f80 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20  pParse, .       
26f90 20 20 20 20 20 28 73 44 69 73 74 69 6e 63 74 2e       (sDistinct.
26fa0 69 73 54 6e 63 74 20 26 26 20 28 70 2d 3e 73 65  isTnct && (p->se
26fb0 6c 46 6c 61 67 73 26 53 46 5f 44 69 73 74 69 6e  lFlags&SF_Distin
26fc0 63 74 29 3d 3d 30 29 20 3f 0a 20 20 20 20 20 20  ct)==0) ?.      
26fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 44                "D
26fe0 49 53 54 49 4e 43 54 22 20 3a 20 22 47 52 4f 55  ISTINCT" : "GROU
26ff0 50 20 42 59 22 29 3b 0a 0a 20 20 20 20 20 20 20  P BY");..       
27000 20 67 72 6f 75 70 42 79 53 6f 72 74 20 3d 20 31   groupBySort = 1
27010 3b 0a 20 20 20 20 20 20 20 20 6e 47 72 6f 75 70  ;.        nGroup
27020 42 79 20 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e  By = pGroupBy->n
27030 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 6e 43  Expr;.        nC
27040 6f 6c 20 3d 20 6e 47 72 6f 75 70 42 79 20 2b 20  ol = nGroupBy + 
27050 31 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 6e  1;.        j = n
27060 47 72 6f 75 70 42 79 2b 31 3b 0a 20 20 20 20 20  GroupBy+1;.     
27070 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41     for(i=0; i<sA
27080 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20  ggInfo.nColumn; 
27090 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
270a0 69 66 28 20 73 41 67 67 49 6e 66 6f 2e 61 43 6f  if( sAggInfo.aCo
270b0 6c 5b 69 5d 2e 69 53 6f 72 74 65 72 43 6f 6c 75  l[i].iSorterColu
270c0 6d 6e 3e 3d 6a 20 29 7b 0a 20 20 20 20 20 20 20  mn>=j ){.       
270d0 20 20 20 20 20 6e 43 6f 6c 2b 2b 3b 0a 20 20 20       nCol++;.   
270e0 20 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20           j++;.  
270f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
27100 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 67 42    }.        regB
27110 61 73 65 20 3d 20 73 71 6c 69 74 65 33 47 65 74  ase = sqlite3Get
27120 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
27130 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20  , nCol);.       
27140 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
27150 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a  eClear(pParse);.
27160 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
27170 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28  xprCodeExprList(
27180 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79  pParse, pGroupBy
27190 2c 20 72 65 67 42 61 73 65 2c 20 30 29 3b 0a 20  , regBase, 0);. 
271a0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
271b0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
271c0 65 71 75 65 6e 63 65 2c 20 73 41 67 67 49 6e 66  equence, sAggInf
271d0 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 72 65 67  o.sortingIdx,reg
271e0 42 61 73 65 2b 6e 47 72 6f 75 70 42 79 29 3b 0a  Base+nGroupBy);.
271f0 20 20 20 20 20 20 20 20 6a 20 3d 20 6e 47 72 6f          j = nGro
27200 75 70 42 79 2b 31 3b 0a 20 20 20 20 20 20 20 20  upBy+1;.        
27210 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67 67 49  for(i=0; i<sAggI
27220 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b  nfo.nColumn; i++
27230 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 72  ){.          str
27240 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20  uct AggInfo_col 
27250 2a 70 43 6f 6c 20 3d 20 26 73 41 67 67 49 6e 66  *pCol = &sAggInf
27260 6f 2e 61 43 6f 6c 5b 69 5d 3b 0a 20 20 20 20 20  o.aCol[i];.     
27270 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69       if( pCol->i
27280 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3e 3d 6a 20  SorterColumn>=j 
27290 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
272a0 6e 74 20 72 31 20 3d 20 6a 20 2b 20 72 65 67 42  nt r1 = j + regB
272b0 61 73 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ase;.           
272c0 20 69 6e 74 20 72 32 3b 0a 0a 20 20 20 20 20 20   int r2;..      
272d0 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74        r2 = sqlit
272e0 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c  e3ExprCodeGetCol
272f0 75 6d 6e 28 70 50 61 72 73 65 2c 20 0a 20 20 20  umn(pParse, .   
27300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27310 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
27320 2d 3e 70 54 61 62 2c 20 70 43 6f 6c 2d 3e 69 43  ->pTab, pCol->iC
27330 6f 6c 75 6d 6e 2c 20 70 43 6f 6c 2d 3e 69 54 61  olumn, pCol->iTa
27340 62 6c 65 2c 20 72 31 2c 20 30 29 3b 0a 20 20 20  ble, r1, 0);.   
27350 20 20 20 20 20 20 20 20 20 69 66 28 20 72 31 21           if( r1!
27360 3d 72 32 20 29 7b 0a 20 20 20 20 20 20 20 20 20  =r2 ){.         
27370 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
27380 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f  AddOp2(v, OP_SCo
27390 70 79 2c 20 72 32 2c 20 72 31 29 3b 0a 20 20 20  py, r2, r1);.   
273a0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
273b0 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20         j++;.    
273c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
273d0 7d 0a 20 20 20 20 20 20 20 20 72 65 67 52 65 63  }.        regRec
273e0 6f 72 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74  ord = sqlite3Get
273f0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
27400 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
27410 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
27420 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67  _MakeRecord, reg
27430 42 61 73 65 2c 20 6e 43 6f 6c 2c 20 72 65 67 52  Base, nCol, regR
27440 65 63 6f 72 64 29 3b 0a 20 20 20 20 20 20 20 20  ecord);.        
27450 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
27460 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 49 6e  2(v, OP_SorterIn
27470 73 65 72 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73  sert, sAggInfo.s
27480 6f 72 74 69 6e 67 49 64 78 2c 20 72 65 67 52 65  ortingIdx, regRe
27490 63 6f 72 64 29 3b 0a 20 20 20 20 20 20 20 20 73  cord);.        s
274a0 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
274b0 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
274c0 52 65 63 6f 72 64 29 3b 0a 20 20 20 20 20 20 20  Record);.       
274d0 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
274e0 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
274f0 20 72 65 67 42 61 73 65 2c 20 6e 43 6f 6c 29 3b   regBase, nCol);
27500 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
27510 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29  WhereEnd(pWInfo)
27520 3b 0a 20 20 20 20 20 20 20 20 73 41 67 67 49 6e  ;.        sAggIn
27530 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 50 54 61  fo.sortingIdxPTa
27540 62 20 3d 20 73 6f 72 74 50 54 61 62 20 3d 20 70  b = sortPTab = p
27550 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
27560 20 20 20 20 20 20 20 73 6f 72 74 4f 75 74 20 3d         sortOut =
27570 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
27580 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
27590 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
275a0 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp3(v, OP_Open
275b0 50 73 65 75 64 6f 2c 20 73 6f 72 74 50 54 61 62  Pseudo, sortPTab
275c0 2c 20 73 6f 72 74 4f 75 74 2c 20 6e 43 6f 6c 29  , sortOut, nCol)
275d0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
275e0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
275f0 50 5f 53 6f 72 74 65 72 53 6f 72 74 2c 20 73 41  P_SorterSort, sA
27600 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64  ggInfo.sortingId
27610 78 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20 20 20  x, addrEnd);.   
27620 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
27630 28 28 76 2c 20 22 47 52 4f 55 50 20 42 59 20 73  ((v, "GROUP BY s
27640 6f 72 74 22 29 29 3b 0a 20 20 20 20 20 20 20 20  ort"));.        
27650 73 41 67 67 49 6e 66 6f 2e 75 73 65 53 6f 72 74  sAggInfo.useSort
27660 69 6e 67 49 64 78 20 3d 20 31 3b 0a 20 20 20 20  ingIdx = 1;.    
27670 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
27680 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65  acheClear(pParse
27690 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
276a0 20 20 2f 2a 20 45 76 61 6c 75 61 74 65 20 74 68    /* Evaluate th
276b0 65 20 63 75 72 72 65 6e 74 20 47 52 4f 55 50 20  e current GROUP 
276c0 42 59 20 74 65 72 6d 73 20 61 6e 64 20 73 74 6f  BY terms and sto
276d0 72 65 20 69 6e 20 62 30 2c 20 62 31 2c 20 62 32  re in b0, b1, b2
276e0 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 28 62 30  ....      ** (b0
276f0 20 69 73 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74   is memory locat
27700 69 6f 6e 20 69 42 4d 65 6d 2b 30 2c 20 62 31 20  ion iBMem+0, b1 
27710 69 73 20 69 42 4d 65 6d 2b 31 2c 20 61 6e 64 20  is iBMem+1, and 
27720 73 6f 20 66 6f 72 74 68 29 0a 20 20 20 20 20 20  so forth).      
27730 2a 2a 20 54 68 65 6e 20 63 6f 6d 70 61 72 65 20  ** Then compare 
27740 74 68 65 20 63 75 72 72 65 6e 74 20 47 52 4f 55  the current GROU
27750 50 20 42 59 20 74 65 72 6d 73 20 61 67 61 69 6e  P BY terms again
27760 73 74 20 74 68 65 20 47 52 4f 55 50 20 42 59 20  st the GROUP BY 
27770 74 65 72 6d 73 0a 20 20 20 20 20 20 2a 2a 20 66  terms.      ** f
27780 72 6f 6d 20 74 68 65 20 70 72 65 76 69 6f 75 73  rom the previous
27790 20 72 6f 77 20 63 75 72 72 65 6e 74 6c 79 20 73   row currently s
277a0 74 6f 72 65 64 20 69 6e 20 61 30 2c 20 61 31 2c  tored in a0, a1,
277b0 20 61 32 2e 2e 2e 0a 20 20 20 20 20 20 2a 2f 0a   a2....      */.
277c0 20 20 20 20 20 20 61 64 64 72 54 6f 70 4f 66 4c        addrTopOfL
277d0 6f 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  oop = sqlite3Vdb
277e0 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
277f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
27800 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61  prCacheClear(pPa
27810 72 73 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  rse);.      if( 
27820 67 72 6f 75 70 42 79 53 6f 72 74 20 29 7b 0a 20  groupBySort ){. 
27830 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
27840 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
27850 6f 72 74 65 72 44 61 74 61 2c 20 73 41 67 67 49  orterData, sAggI
27860 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20  nfo.sortingIdx, 
27870 73 6f 72 74 4f 75 74 29 3b 0a 20 20 20 20 20 20  sortOut);.      
27880 7d 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  }.      for(j=0;
27890 20 6a 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78   j<pGroupBy->nEx
278a0 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; j++){.      
278b0 20 20 69 66 28 20 67 72 6f 75 70 42 79 53 6f 72    if( groupBySor
278c0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  t ){.          s
278d0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
278e0 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73  (v, OP_Column, s
278f0 6f 72 74 50 54 61 62 2c 20 6a 2c 20 69 42 4d 65  ortPTab, j, iBMe
27900 6d 2b 6a 29 3b 0a 20 20 20 20 20 20 20 20 20 20  m+j);.          
27910 69 66 28 20 6a 3d 3d 30 20 29 20 73 71 6c 69 74  if( j==0 ) sqlit
27920 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
27930 2c 20 4f 50 46 4c 41 47 5f 43 4c 45 41 52 43 41  , OPFLAG_CLEARCA
27940 43 48 45 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  CHE);.        }e
27950 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73  lse{.          s
27960 41 67 67 49 6e 66 6f 2e 64 69 72 65 63 74 4d 6f  AggInfo.directMo
27970 64 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  de = 1;.        
27980 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
27990 65 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70  e(pParse, pGroup
279a0 42 79 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72 2c 20  By->a[j].pExpr, 
279b0 69 42 4d 65 6d 2b 6a 29 3b 0a 20 20 20 20 20 20  iBMem+j);.      
279c0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
279d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
279e0 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72  Op4(v, OP_Compar
279f0 65 2c 20 69 41 4d 65 6d 2c 20 69 42 4d 65 6d 2c  e, iAMem, iBMem,
27a00 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72   pGroupBy->nExpr
27a10 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
27a20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
27a30 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f  r*)pKeyInfo, P4_
27a40 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20  KEYINFO);.      
27a50 6a 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  j1 = sqlite3Vdbe
27a60 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
27a70 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
27a80 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75  eAddOp3(v, OP_Ju
27a90 6d 70 2c 20 6a 31 2b 31 2c 20 30 2c 20 6a 31 2b  mp, j1+1, 0, j1+
27aa0 31 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65  1);..      /* Ge
27ab0 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
27ac0 20 72 75 6e 73 20 77 68 65 6e 65 76 65 72 20 74   runs whenever t
27ad0 68 65 20 47 52 4f 55 50 20 42 59 20 63 68 61 6e  he GROUP BY chan
27ae0 67 65 73 2e 0a 20 20 20 20 20 20 2a 2a 20 43 68  ges..      ** Ch
27af0 61 6e 67 65 73 20 69 6e 20 74 68 65 20 47 52 4f  anges in the GRO
27b00 55 50 20 42 59 20 61 72 65 20 64 65 74 65 63 74  UP BY are detect
27b10 65 64 20 62 79 20 74 68 65 20 70 72 65 76 69 6f  ed by the previo
27b20 75 73 20 63 6f 64 65 0a 20 20 20 20 20 20 2a 2a  us code.      **
27b30 20 62 6c 6f 63 6b 2e 20 20 49 66 20 74 68 65 72   block.  If ther
27b40 65 20 77 65 72 65 20 6e 6f 20 63 68 61 6e 67 65  e were no change
27b50 73 2c 20 74 68 69 73 20 62 6c 6f 63 6b 20 69 73  s, this block is
27b60 20 73 6b 69 70 70 65 64 2e 0a 20 20 20 20 20 20   skipped..      
27b70 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73  **.      ** This
27b80 20 63 6f 64 65 20 63 6f 70 69 65 73 20 63 75 72   code copies cur
27b90 72 65 6e 74 20 67 72 6f 75 70 20 62 79 20 74 65  rent group by te
27ba0 72 6d 73 20 69 6e 20 62 30 2c 62 31 2c 62 32 2c  rms in b0,b1,b2,
27bb0 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65  ....      ** ove
27bc0 72 20 74 6f 20 61 30 2c 61 31 2c 61 32 2e 20 20  r to a0,a1,a2.  
27bd0 49 74 20 74 68 65 6e 20 63 61 6c 6c 73 20 74 68  It then calls th
27be0 65 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74  e output subrout
27bf0 69 6e 65 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64  ine.      ** and
27c00 20 72 65 73 65 74 73 20 74 68 65 20 61 67 67 72   resets the aggr
27c10 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f  egate accumulato
27c20 72 20 72 65 67 69 73 74 65 72 73 20 69 6e 20 70  r registers in p
27c30 72 65 70 61 72 61 74 69 6f 6e 0a 20 20 20 20 20  reparation.     
27c40 20 2a 2a 20 66 6f 72 20 74 68 65 20 6e 65 78 74   ** for the next
27c50 20 47 52 4f 55 50 20 42 59 20 62 61 74 63 68 2e   GROUP BY batch.
27c60 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
27c70 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d  sqlite3ExprCodeM
27c80 6f 76 65 28 70 50 61 72 73 65 2c 20 69 42 4d 65  ove(pParse, iBMe
27c90 6d 2c 20 69 41 4d 65 6d 2c 20 70 47 72 6f 75 70  m, iAMem, pGroup
27ca0 42 79 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20  By->nExpr);.    
27cb0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
27cc0 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
27cd0 20 72 65 67 4f 75 74 70 75 74 52 6f 77 2c 20 61   regOutputRow, a
27ce0 64 64 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20  ddrOutputRow);. 
27cf0 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
27d00 28 28 76 2c 20 22 6f 75 74 70 75 74 20 6f 6e 65  ((v, "output one
27d10 20 72 6f 77 22 29 29 3b 0a 20 20 20 20 20 20 73   row"));.      s
27d20 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
27d30 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69 41  (v, OP_IfPos, iA
27d40 62 6f 72 74 46 6c 61 67 2c 20 61 64 64 72 45 6e  bortFlag, addrEn
27d50 64 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  d);.      VdbeCo
27d60 6d 6d 65 6e 74 28 28 76 2c 20 22 63 68 65 63 6b  mment((v, "check
27d70 20 61 62 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a   abort flag"));.
27d80 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
27d90 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
27da0 73 75 62 2c 20 72 65 67 52 65 73 65 74 2c 20 61  sub, regReset, a
27db0 64 64 72 52 65 73 65 74 29 3b 0a 20 20 20 20 20  ddrReset);.     
27dc0 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
27dd0 20 22 72 65 73 65 74 20 61 63 63 75 6d 75 6c 61   "reset accumula
27de0 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f  tor"));..      /
27df0 2a 20 55 70 64 61 74 65 20 74 68 65 20 61 67 67  * Update the agg
27e00 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74  regate accumulat
27e10 6f 72 73 20 62 61 73 65 64 20 6f 6e 20 74 68 65  ors based on the
27e20 20 63 6f 6e 74 65 6e 74 20 6f 66 0a 20 20 20 20   content of.    
27e30 20 20 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74    ** the current
27e40 20 72 6f 77 0a 20 20 20 20 20 20 2a 2f 0a 20 20   row.      */.  
27e50 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
27e60 75 6d 70 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a  umpHere(v, j1);.
27e70 20 20 20 20 20 20 75 70 64 61 74 65 41 63 63 75        updateAccu
27e80 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20  mulator(pParse, 
27e90 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20  &sAggInfo);.    
27ea0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
27eb0 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
27ec0 72 2c 20 31 2c 20 69 55 73 65 46 6c 61 67 29 3b  r, 1, iUseFlag);
27ed0 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
27ee0 6e 74 28 28 76 2c 20 22 69 6e 64 69 63 61 74 65  nt((v, "indicate
27ef0 20 64 61 74 61 20 69 6e 20 61 63 63 75 6d 75 6c   data in accumul
27f00 61 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20 20  ator"));..      
27f10 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 6c 6f  /* End of the lo
27f20 6f 70 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  op.      */.    
27f30 20 20 69 66 28 20 67 72 6f 75 70 42 79 53 6f 72    if( groupBySor
27f40 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
27f50 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
27f60 2c 20 4f 50 5f 53 6f 72 74 65 72 4e 65 78 74 2c  , OP_SorterNext,
27f70 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e   sAggInfo.sortin
27f80 67 49 64 78 2c 20 61 64 64 72 54 6f 70 4f 66 4c  gIdx, addrTopOfL
27f90 6f 6f 70 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  oop);.      }els
27fa0 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
27fb0 65 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66  e3WhereEnd(pWInf
27fc0 6f 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  o);.        sqli
27fd0 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e  te3VdbeChangeToN
27fe0 6f 6f 70 28 76 2c 20 61 64 64 72 53 6f 72 74 69  oop(v, addrSorti
27ff0 6e 67 49 64 78 29 3b 0a 20 20 20 20 20 20 7d 0a  ngIdx);.      }.
28000 0a 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74  .      /* Output
28010 20 74 68 65 20 66 69 6e 61 6c 20 72 6f 77 20 6f   the final row o
28020 66 20 72 65 73 75 6c 74 0a 20 20 20 20 20 20 2a  f result.      *
28030 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  /.      sqlite3V
28040 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
28050 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 70 75 74  Gosub, regOutput
28060 52 6f 77 2c 20 61 64 64 72 4f 75 74 70 75 74 52  Row, addrOutputR
28070 6f 77 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  ow);.      VdbeC
28080 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6f 75 74 70  omment((v, "outp
28090 75 74 20 66 69 6e 61 6c 20 72 6f 77 22 29 29 3b  ut final row"));
280a0 0a 0a 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20  ..      /* Jump 
280b0 6f 76 65 72 20 74 68 65 20 73 75 62 72 6f 75 74  over the subrout
280c0 69 6e 65 73 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ines.      */.  
280d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
280e0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
280f0 2c 20 30 2c 20 61 64 64 72 45 6e 64 29 3b 0a 0a  , 0, addrEnd);..
28100 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
28110 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74  e a subroutine t
28120 68 61 74 20 6f 75 74 70 75 74 73 20 61 20 73 69  hat outputs a si
28130 6e 67 6c 65 20 72 6f 77 20 6f 66 20 74 68 65 20  ngle row of the 
28140 72 65 73 75 6c 74 0a 20 20 20 20 20 20 2a 2a 20  result.      ** 
28150 73 65 74 2e 20 20 54 68 69 73 20 73 75 62 72 6f  set.  This subro
28160 75 74 69 6e 65 20 66 69 72 73 74 20 6c 6f 6f 6b  utine first look
28170 73 20 61 74 20 74 68 65 20 69 55 73 65 46 6c 61  s at the iUseFla
28180 67 2e 20 20 49 66 20 69 55 73 65 46 6c 61 67 0a  g.  If iUseFlag.
28190 20 20 20 20 20 20 2a 2a 20 69 73 20 6c 65 73 73        ** is less
281a0 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
281b0 6f 20 7a 65 72 6f 2c 20 74 68 65 20 73 75 62 72  o zero, the subr
281c0 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
281d0 70 2e 20 20 49 66 0a 20 20 20 20 20 20 2a 2a 20  p.  If.      ** 
281e0 74 68 65 20 70 72 6f 63 65 73 73 69 6e 67 20 63  the processing c
281f0 61 6c 6c 73 20 66 6f 72 20 74 68 65 20 71 75 65  alls for the que
28200 72 79 20 74 6f 20 61 62 6f 72 74 2c 20 74 68 69  ry to abort, thi
28210 73 20 73 75 62 72 6f 75 74 69 6e 65 0a 20 20 20  s subroutine.   
28220 20 20 20 2a 2a 20 69 6e 63 72 65 6d 65 6e 74 73     ** increments
28230 20 74 68 65 20 69 41 62 6f 72 74 46 6c 61 67 20   the iAbortFlag 
28240 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20  memory location 
28250 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
28260 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 6f 72 64   in.      ** ord
28270 65 72 20 74 6f 20 73 69 67 6e 61 6c 20 74 68 65  er to signal the
28280 20 63 61 6c 6c 65 72 20 74 6f 20 61 62 6f 72 74   caller to abort
28290 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
282a0 20 61 64 64 72 53 65 74 41 62 6f 72 74 20 3d 20   addrSetAbort = 
282b0 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
282c0 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20  ntAddr(v);.     
282d0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
282e0 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
282f0 2c 20 31 2c 20 69 41 62 6f 72 74 46 6c 61 67 29  , 1, iAbortFlag)
28300 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
28310 65 6e 74 28 28 76 2c 20 22 73 65 74 20 61 62 6f  ent((v, "set abo
28320 72 74 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20  rt flag"));.    
28330 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
28340 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e  Op1(v, OP_Return
28350 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77 29 3b  , regOutputRow);
28360 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
28370 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
28380 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 29  , addrOutputRow)
28390 3b 0a 20 20 20 20 20 20 61 64 64 72 4f 75 74 70  ;.      addrOutp
283a0 75 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 56  utRow = sqlite3V
283b0 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
283c0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
283d0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
283e0 5f 49 66 50 6f 73 2c 20 69 55 73 65 46 6c 61 67  _IfPos, iUseFlag
283f0 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 2b  , addrOutputRow+
28400 32 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  2);.      VdbeCo
28410 6d 6d 65 6e 74 28 28 76 2c 20 22 47 72 6f 75 70  mment((v, "Group
28420 62 79 20 72 65 73 75 6c 74 20 67 65 6e 65 72 61  by result genera
28430 74 6f 72 20 65 6e 74 72 79 20 70 6f 69 6e 74 22  tor entry point"
28440 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
28450 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
28460 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 4f 75 74  P_Return, regOut
28470 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 66  putRow);.      f
28480 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63 74 69  inalizeAggFuncti
28490 6f 6e 73 28 70 50 61 72 73 65 2c 20 26 73 41 67  ons(pParse, &sAg
284a0 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73 71  gInfo);.      sq
284b0 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
284c0 28 70 50 61 72 73 65 2c 20 70 48 61 76 69 6e 67  (pParse, pHaving
284d0 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 2b  , addrOutputRow+
284e0 31 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  1, SQLITE_JUMPIF
284f0 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 65 6c  NULL);.      sel
28500 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61  ectInnerLoop(pPa
28510 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73  rse, p, p->pELis
28520 74 2c 20 30 2c 20 30 2c 20 70 4f 72 64 65 72 42  t, 0, 0, pOrderB
28530 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  y,.             
28540 20 20 20 20 20 20 20 20 20 26 73 44 69 73 74 69           &sDisti
28550 6e 63 74 2c 20 70 44 65 73 74 2c 0a 20 20 20 20  nct, pDest,.    
28560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28570 20 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 2b    addrOutputRow+
28580 31 2c 20 61 64 64 72 53 65 74 41 62 6f 72 74 29  1, addrSetAbort)
28590 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
285a0 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
285b0 52 65 74 75 72 6e 2c 20 72 65 67 4f 75 74 70 75  Return, regOutpu
285c0 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 56 64 62  tRow);.      Vdb
285d0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6e  eComment((v, "en
285e0 64 20 67 72 6f 75 70 62 79 20 72 65 73 75 6c 74  d groupby result
285f0 20 67 65 6e 65 72 61 74 6f 72 22 29 29 3b 0a 0a   generator"));..
28600 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
28610 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74  e a subroutine t
28620 68 61 74 20 77 69 6c 6c 20 72 65 73 65 74 20 74  hat will reset t
28630 68 65 20 67 72 6f 75 70 2d 62 79 20 61 63 63 75  he group-by accu
28640 6d 75 6c 61 74 6f 72 0a 20 20 20 20 20 20 2a 2f  mulator.      */
28650 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
28660 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
28670 2c 20 61 64 64 72 52 65 73 65 74 29 3b 0a 20 20  , addrReset);.  
28680 20 20 20 20 72 65 73 65 74 41 63 63 75 6d 75 6c      resetAccumul
28690 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41  ator(pParse, &sA
286a0 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73  ggInfo);.      s
286b0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
286c0 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72  (v, OP_Return, r
286d0 65 67 52 65 73 65 74 29 3b 0a 20 20 20 20 20 0a  egReset);.     .
286e0 20 20 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20 70      } /* endif p
286f0 47 72 6f 75 70 42 79 2e 20 20 42 65 67 69 6e 20  GroupBy.  Begin 
28700 61 67 67 72 65 67 61 74 65 20 71 75 65 72 69 65  aggregate querie
28710 73 20 77 69 74 68 6f 75 74 20 47 52 4f 55 50 20  s without GROUP 
28720 42 59 3a 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20  BY: */.    else 
28730 7b 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74  {.      ExprList
28740 20 2a 70 44 65 6c 20 3d 20 30 3b 0a 23 69 66 6e   *pDel = 0;.#ifn
28750 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
28760 42 54 52 45 45 43 4f 55 4e 54 0a 20 20 20 20 20  BTREECOUNT.     
28770 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
28780 20 20 20 20 69 66 28 20 28 70 54 61 62 20 3d 20      if( (pTab = 
28790 69 73 53 69 6d 70 6c 65 43 6f 75 6e 74 28 70 2c  isSimpleCount(p,
287a0 20 26 73 41 67 67 49 6e 66 6f 29 29 21 3d 30 20   &sAggInfo))!=0 
287b0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66  ){.        /* If
287c0 20 69 73 53 69 6d 70 6c 65 43 6f 75 6e 74 28 29   isSimpleCount()
287d0 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74   returns a point
287e0 65 72 20 74 6f 20 61 20 54 61 62 6c 65 20 73 74  er to a Table st
287f0 72 75 63 74 75 72 65 2c 20 74 68 65 6e 0a 20 20  ructure, then.  
28800 20 20 20 20 20 20 2a 2a 20 74 68 65 20 53 51 4c        ** the SQL
28810 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 6f 66   statement is of
28820 20 74 68 65 20 66 6f 72 6d 3a 0a 20 20 20 20 20   the form:.     
28830 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
28840 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28     SELECT count(
28850 2a 29 20 46 52 4f 4d 20 3c 74 62 6c 3e 0a 20 20  *) FROM <tbl>.  
28860 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
28870 20 2a 2a 20 77 68 65 72 65 20 74 68 65 20 54 61   ** where the Ta
28880 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 72 65  ble structure re
28890 74 75 72 6e 65 64 20 72 65 70 72 65 73 65 6e 74  turned represent
288a0 73 20 74 61 62 6c 65 20 3c 74 62 6c 3e 2e 0a 20  s table <tbl>.. 
288b0 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
288c0 20 20 2a 2a 20 54 68 69 73 20 73 74 61 74 65 6d    ** This statem
288d0 65 6e 74 20 69 73 20 73 6f 20 63 6f 6d 6d 6f 6e  ent is so common
288e0 20 74 68 61 74 20 69 74 20 69 73 20 6f 70 74 69   that it is opti
288f0 6d 69 7a 65 64 20 73 70 65 63 69 61 6c 6c 79 2e  mized specially.
28900 20 54 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   The.        ** 
28910 4f 50 5f 43 6f 75 6e 74 20 69 6e 73 74 72 75 63  OP_Count instruc
28920 74 69 6f 6e 20 69 73 20 65 78 65 63 75 74 65 64  tion is executed
28930 20 65 69 74 68 65 72 20 6f 6e 20 74 68 65 20 69   either on the i
28940 6e 74 6b 65 79 20 74 61 62 6c 65 20 74 68 61 74  ntkey table that
28950 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74  .        ** cont
28960 61 69 6e 73 20 74 68 65 20 64 61 74 61 20 66 6f  ains the data fo
28970 72 20 74 61 62 6c 65 20 3c 74 62 6c 3e 20 6f 72  r table <tbl> or
28980 20 6f 6e 20 6f 6e 65 20 6f 66 20 69 74 73 20 69   on one of its i
28990 6e 64 65 78 65 73 2e 20 49 74 0a 20 20 20 20 20  ndexes. It.     
289a0 20 20 20 2a 2a 20 69 73 20 62 65 74 74 65 72 20     ** is better 
289b0 74 6f 20 65 78 65 63 75 74 65 20 74 68 65 20 6f  to execute the o
289c0 70 20 6f 6e 20 61 6e 20 69 6e 64 65 78 2c 20 61  p on an index, a
289d0 73 20 69 6e 64 65 78 65 73 20 61 72 65 20 61 6c  s indexes are al
289e0 6d 6f 73 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  most.        ** 
289f0 61 6c 77 61 79 73 20 73 70 72 65 61 64 20 61 63  always spread ac
28a00 72 6f 73 73 20 6c 65 73 73 20 70 61 67 65 73 20  ross less pages 
28a10 74 68 61 6e 20 74 68 65 69 72 20 63 6f 72 72 65  than their corre
28a20 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 73 2e  sponding tables.
28a30 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
28a40 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 44      const int iD
28a50 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
28a60 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d  aToIndex(pParse-
28a70 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65  >db, pTab->pSche
28a80 6d 61 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e  ma);.        con
28a90 73 74 20 69 6e 74 20 69 43 73 72 20 3d 20 70 50  st int iCsr = pP
28aa0 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20  arse->nTab++;   
28ab0 20 20 2f 2a 20 43 75 72 73 6f 72 20 74 6f 20 73    /* Cursor to s
28ac0 63 61 6e 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20  can b-tree */.  
28ad0 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64        Index *pId
28ae0 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
28af0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74             /* It
28b00 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20  erator variable 
28b10 2a 2f 0a 20 20 20 20 20 20 20 20 4b 65 79 49 6e  */.        KeyIn
28b20 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 30  fo *pKeyInfo = 0
28b30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
28b40 2f 2a 20 4b 65 79 69 6e 66 6f 20 66 6f 72 20 73  /* Keyinfo for s
28b50 63 61 6e 6e 65 64 20 69 6e 64 65 78 20 2a 2f 0a  canned index */.
28b60 20 20 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70          Index *p
28b70 42 65 73 74 20 3d 20 30 3b 20 20 20 20 20 20 20  Best = 0;       
28b80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28b90 42 65 73 74 20 69 6e 64 65 78 20 66 6f 75 6e 64  Best index found
28ba0 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 20 20 20   so far */.     
28bb0 20 20 20 69 6e 74 20 69 52 6f 6f 74 20 3d 20 70     int iRoot = p
28bc0 54 61 62 2d 3e 74 6e 75 6d 3b 20 20 20 20 20 20  Tab->tnum;      
28bd0 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20          /* Root 
28be0 70 61 67 65 20 6f 66 20 73 63 61 6e 6e 65 64 20  page of scanned 
28bf0 62 2d 74 72 65 65 20 2a 2f 0a 0a 20 20 20 20 20  b-tree */..     
28c00 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65     sqlite3CodeVe
28c10 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73  rifySchema(pPars
28c20 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 20  e, iDb);.       
28c30 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63   sqlite3TableLoc
28c40 6b 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70  k(pParse, iDb, p
28c50 54 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 54  Tab->tnum, 0, pT
28c60 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20 20  ab->zName);..   
28c70 20 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66       /* Search f
28c80 6f 72 20 74 68 65 20 69 6e 64 65 78 20 74 68 61  or the index tha
28c90 74 20 68 61 73 20 74 68 65 20 6c 65 61 73 74 20  t has the least 
28ca0 61 6d 6f 75 6e 74 20 6f 66 20 63 6f 6c 75 6d 6e  amount of column
28cb0 73 2e 20 49 66 0a 20 20 20 20 20 20 20 20 2a 2a  s. If.        **
28cc0 20 74 68 65 72 65 20 69 73 20 73 75 63 68 20 61   there is such a
28cd0 6e 20 69 6e 64 65 78 2c 20 61 6e 64 20 69 74 20  n index, and it 
28ce0 68 61 73 20 6c 65 73 73 20 63 6f 6c 75 6d 6e 73  has less columns
28cf0 20 74 68 61 6e 20 74 68 65 20 74 61 62 6c 65 0a   than the table.
28d00 20 20 20 20 20 20 20 20 2a 2a 20 64 6f 65 73 2c          ** does,
28d10 20 74 68 65 6e 20 77 65 20 63 61 6e 20 61 73 73   then we can ass
28d20 75 6d 65 20 74 68 61 74 20 69 74 20 63 6f 6e 73  ume that it cons
28d30 75 6d 65 73 20 6c 65 73 73 20 73 70 61 63 65 20  umes less space 
28d40 6f 6e 20 64 69 73 6b 20 61 6e 64 0a 20 20 20 20  on disk and.    
28d50 20 20 20 20 2a 2a 20 77 69 6c 6c 20 74 68 65 72      ** will ther
28d60 65 66 6f 72 65 20 62 65 20 63 68 65 61 70 65 72  efore be cheaper
28d70 20 74 6f 20 73 63 61 6e 20 74 6f 20 64 65 74 65   to scan to dete
28d80 72 6d 69 6e 65 20 74 68 65 20 71 75 65 72 79 20  rmine the query 
28d90 72 65 73 75 6c 74 2e 0a 20 20 20 20 20 20 20 20  result..        
28da0 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  ** In this case 
28db0 73 65 74 20 69 52 6f 6f 74 20 74 6f 20 74 68 65  set iRoot to the
28dc0 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65   root page numbe
28dd0 72 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 62  r of the index b
28de0 2d 74 72 65 65 0a 20 20 20 20 20 20 20 20 2a 2a  -tree.        **
28df0 20 61 6e 64 20 70 4b 65 79 49 6e 66 6f 20 74 6f   and pKeyInfo to
28e00 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72   the KeyInfo str
28e10 75 63 74 75 72 65 20 72 65 71 75 69 72 65 64 20  ucture required 
28e20 74 6f 20 6e 61 76 69 67 61 74 65 20 74 68 65 0a  to navigate the.
28e30 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 64 65 78          ** index
28e40 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
28e50 20 20 20 20 20 2a 2a 20 28 32 30 31 31 2d 30 34       ** (2011-04
28e60 2d 31 35 29 20 44 6f 20 6e 6f 74 20 64 6f 20 61  -15) Do not do a
28e70 20 66 75 6c 6c 20 73 63 61 6e 20 6f 66 20 61 6e   full scan of an
28e80 20 75 6e 6f 72 64 65 72 65 64 20 69 6e 64 65 78   unordered index
28e90 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
28ea0 20 20 20 20 20 2a 2a 20 49 6e 20 70 72 61 63 74       ** In pract
28eb0 69 63 65 20 74 68 65 20 4b 65 79 49 6e 66 6f 20  ice the KeyInfo 
28ec0 73 74 72 75 63 74 75 72 65 20 77 69 6c 6c 20 6e  structure will n
28ed0 6f 74 20 62 65 20 75 73 65 64 2e 20 49 74 20 69  ot be used. It i
28ee0 73 20 6f 6e 6c 79 20 0a 20 20 20 20 20 20 20 20  s only .        
28ef0 2a 2a 20 70 61 73 73 65 64 20 74 6f 20 6b 65 65  ** passed to kee
28f00 70 20 4f 50 5f 4f 70 65 6e 52 65 61 64 20 68 61  p OP_OpenRead ha
28f10 70 70 79 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ppy..        */.
28f20 20 20 20 20 20 20 20 20 66 6f 72 28 70 49 64 78          for(pIdx
28f30 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70  =pTab->pIndex; p
28f40 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  Idx; pIdx=pIdx->
28f50 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20  pNext){.        
28f60 20 20 69 66 28 20 70 49 64 78 2d 3e 62 55 6e 6f    if( pIdx->bUno
28f70 72 64 65 72 65 64 3d 3d 30 20 26 26 20 28 21 70  rdered==0 && (!p
28f80 42 65 73 74 20 7c 7c 20 70 49 64 78 2d 3e 6e 43  Best || pIdx->nC
28f90 6f 6c 75 6d 6e 3c 70 42 65 73 74 2d 3e 6e 43 6f  olumn<pBest->nCo
28fa0 6c 75 6d 6e 29 20 29 7b 0a 20 20 20 20 20 20 20  lumn) ){.       
28fb0 20 20 20 20 20 70 42 65 73 74 20 3d 20 70 49 64       pBest = pId
28fc0 78 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  x;.          }. 
28fd0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
28fe0 20 69 66 28 20 70 42 65 73 74 20 26 26 20 70 42   if( pBest && pB
28ff0 65 73 74 2d 3e 6e 43 6f 6c 75 6d 6e 3c 70 54 61  est->nColumn<pTa
29000 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20  b->nCol ){.     
29010 20 20 20 20 20 69 52 6f 6f 74 20 3d 20 70 42 65       iRoot = pBe
29020 73 74 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20  st->tnum;.      
29030 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73      pKeyInfo = s
29040 71 6c 69 74 65 33 49 6e 64 65 78 4b 65 79 69 6e  qlite3IndexKeyin
29050 66 6f 28 70 50 61 72 73 65 2c 20 70 42 65 73 74  fo(pParse, pBest
29060 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  );.        }..  
29070 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 61 20        /* Open a 
29080 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72  read-only cursor
29090 2c 20 65 78 65 63 75 74 65 20 74 68 65 20 4f 50  , execute the OP
290a0 5f 43 6f 75 6e 74 2c 20 63 6c 6f 73 65 20 74 68  _Count, close th
290b0 65 20 63 75 72 73 6f 72 2e 20 2a 2f 0a 20 20 20  e cursor. */.   
290c0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
290d0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65  AddOp3(v, OP_Ope
290e0 6e 52 65 61 64 2c 20 69 43 73 72 2c 20 69 52 6f  nRead, iCsr, iRo
290f0 6f 74 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20  ot, iDb);.      
29100 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 20 29    if( pKeyInfo )
29110 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
29120 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28  te3VdbeChangeP4(
29130 76 2c 20 2d 31 2c 20 28 63 68 61 72 20 2a 29 70  v, -1, (char *)p
29140 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49  KeyInfo, P4_KEYI
29150 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20  NFO_HANDOFF);.  
29160 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
29170 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
29180 32 28 76 2c 20 4f 50 5f 43 6f 75 6e 74 2c 20 69  2(v, OP_Count, i
29190 43 73 72 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46  Csr, sAggInfo.aF
291a0 75 6e 63 5b 30 5d 2e 69 4d 65 6d 29 3b 0a 20 20  unc[0].iMem);.  
291b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
291c0 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c  eAddOp1(v, OP_Cl
291d0 6f 73 65 2c 20 69 43 73 72 29 3b 0a 20 20 20 20  ose, iCsr);.    
291e0 20 20 20 20 65 78 70 6c 61 69 6e 53 69 6d 70 6c      explainSimpl
291f0 65 43 6f 75 6e 74 28 70 50 61 72 73 65 2c 20 70  eCount(pParse, p
29200 54 61 62 2c 20 70 42 65 73 74 29 3b 0a 20 20 20  Tab, pBest);.   
29210 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20     }else.#endif 
29220 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42  /* SQLITE_OMIT_B
29230 54 52 45 45 43 4f 55 4e 54 20 2a 2f 0a 20 20 20  TREECOUNT */.   
29240 20 20 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20     {.        /* 
29250 43 68 65 63 6b 20 69 66 20 74 68 65 20 71 75 65  Check if the que
29260 72 79 20 69 73 20 6f 66 20 6f 6e 65 20 6f 66 20  ry is of one of 
29270 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f  the following fo
29280 72 6d 73 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a  rms:.        **.
29290 20 20 20 20 20 20 20 20 2a 2a 20 20 20 53 45 4c          **   SEL
292a0 45 43 54 20 6d 69 6e 28 78 29 20 46 52 4f 4d 20  ECT min(x) FROM 
292b0 2e 2e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 20  ....        **  
292c0 20 53 45 4c 45 43 54 20 6d 61 78 28 78 29 20 46   SELECT max(x) F
292d0 52 4f 4d 20 2e 2e 2e 0a 20 20 20 20 20 20 20 20  ROM ....        
292e0 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 66  **.        ** If
292f0 20 69 74 20 69 73 2c 20 74 68 65 6e 20 61 73 6b   it is, then ask
29300 20 74 68 65 20 63 6f 64 65 20 69 6e 20 77 68 65   the code in whe
29310 72 65 2e 63 20 74 6f 20 61 74 74 65 6d 70 74 20  re.c to attempt 
29320 74 6f 20 73 6f 72 74 20 72 65 73 75 6c 74 73 0a  to sort results.
29330 20 20 20 20 20 20 20 20 2a 2a 20 61 73 20 69 66          ** as if
29340 20 74 68 65 72 65 20 77 61 73 20 61 6e 20 22 4f   there was an "O
29350 52 44 45 52 20 4f 4e 20 78 22 20 6f 72 20 22 4f  RDER ON x" or "O
29360 52 44 45 52 20 4f 4e 20 78 20 44 45 53 43 22 20  RDER ON x DESC" 
29370 63 6c 61 75 73 65 2e 20 0a 20 20 20 20 20 20 20  clause. .       
29380 20 2a 2a 20 49 66 20 77 68 65 72 65 2e 63 20 69   ** If where.c i
29390 73 20 61 62 6c 65 20 74 6f 20 70 72 6f 64 75 63  s able to produc
293a0 65 20 72 65 73 75 6c 74 73 20 73 6f 72 74 65 64  e results sorted
293b0 20 69 6e 20 74 68 69 73 20 6f 72 64 65 72 2c 20   in this order, 
293c0 74 68 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  then.        ** 
293d0 61 64 64 20 76 64 62 65 20 63 6f 64 65 20 74 6f  add vdbe code to
293e0 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 74 68   break out of th
293f0 65 20 70 72 6f 63 65 73 73 69 6e 67 20 6c 6f 6f  e processing loo
29400 70 20 61 66 74 65 72 20 74 68 65 20 0a 20 20 20  p after the .   
29410 20 20 20 20 20 2a 2a 20 66 69 72 73 74 20 69 74       ** first it
29420 65 72 61 74 69 6f 6e 20 28 73 69 6e 63 65 20 74  eration (since t
29430 68 65 20 66 69 72 73 74 20 69 74 65 72 61 74 69  he first iterati
29440 6f 6e 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69  on of the loop i
29450 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 67 75  s .        ** gu
29460 61 72 61 6e 74 65 65 64 20 74 6f 20 6f 70 65 72  aranteed to oper
29470 61 74 65 20 6f 6e 20 74 68 65 20 72 6f 77 20 77  ate on the row w
29480 69 74 68 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20  ith the minimum 
29490 6f 72 20 6d 61 78 69 6d 75 6d 20 0a 20 20 20 20  or maximum .    
294a0 20 20 20 20 2a 2a 20 76 61 6c 75 65 20 6f 66 20      ** value of 
294b0 78 2c 20 74 68 65 20 6f 6e 6c 79 20 72 6f 77 20  x, the only row 
294c0 72 65 71 75 69 72 65 64 29 2e 0a 20 20 20 20 20  required)..     
294d0 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
294e0 20 41 20 73 70 65 63 69 61 6c 20 66 6c 61 67 20   A special flag 
294f0 6d 75 73 74 20 62 65 20 70 61 73 73 65 64 20 74  must be passed t
29500 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  o sqlite3WhereBe
29510 67 69 6e 28 29 20 74 6f 20 73 6c 69 67 68 74 6c  gin() to slightl
29520 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 6f 64  y.        ** mod
29530 69 66 79 20 62 65 68 61 76 69 6f 72 20 61 73 20  ify behavior as 
29540 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20 20 20 20  follows:.       
29550 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20   **.        **  
29560 20 2b 20 49 66 20 74 68 65 20 71 75 65 72 79 20   + If the query 
29570 69 73 20 61 20 22 53 45 4c 45 43 54 20 6d 69 6e  is a "SELECT min
29580 28 78 29 22 2c 20 74 68 65 6e 20 74 68 65 20 6c  (x)", then the l
29590 6f 6f 70 20 63 6f 64 65 64 20 62 79 0a 20 20 20  oop coded by.   
295a0 20 20 20 20 20 2a 2a 20 20 20 20 20 77 68 65 72       **     wher
295b0 65 2e 63 20 73 68 6f 75 6c 64 20 6e 6f 74 20 69  e.c should not i
295c0 74 65 72 61 74 65 20 6f 76 65 72 20 61 6e 79 20  terate over any 
295d0 76 61 6c 75 65 73 20 77 69 74 68 20 61 20 4e 55  values with a NU
295e0 4c 4c 20 76 61 6c 75 65 0a 20 20 20 20 20 20 20  LL value.       
295f0 20 2a 2a 20 20 20 20 20 66 6f 72 20 78 2e 0a 20   **     for x.. 
29600 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
29610 20 20 2a 2a 20 20 20 2b 20 54 68 65 20 6f 70 74    **   + The opt
29620 69 6d 69 7a 65 72 20 63 6f 64 65 20 69 6e 20 77  imizer code in w
29630 68 65 72 65 2e 63 20 28 74 68 65 20 74 68 69 6e  here.c (the thin
29640 67 20 74 68 61 74 20 64 65 63 69 64 65 73 20 77  g that decides w
29650 68 69 63 68 0a 20 20 20 20 20 20 20 20 2a 2a 20  hich.        ** 
29660 20 20 20 20 69 6e 64 65 78 20 6f 72 20 69 6e 64      index or ind
29670 69 63 65 73 20 74 6f 20 75 73 65 29 20 73 68 6f  ices to use) sho
29680 75 6c 64 20 70 6c 61 63 65 20 61 20 64 69 66 66  uld place a diff
29690 65 72 65 6e 74 20 70 72 69 6f 72 69 74 79 20 6f  erent priority o
296a0 6e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  n .        **   
296b0 20 20 73 61 74 69 73 66 79 69 6e 67 20 74 68 65    satisfying the
296c0 20 27 4f 52 44 45 52 20 42 59 27 20 63 6c 61 75   'ORDER BY' clau
296d0 73 65 20 74 68 61 6e 20 69 74 20 64 6f 65 73 20  se than it does 
296e0 69 6e 20 6f 74 68 65 72 20 63 61 73 65 73 2e 0a  in other cases..
296f0 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 52          **     R
29700 65 66 65 72 20 74 6f 20 63 6f 64 65 20 61 6e 64  efer to code and
29710 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 77 68 65   comments in whe
29720 72 65 2e 63 20 66 6f 72 20 64 65 74 61 69 6c 73  re.c for details
29730 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
29740 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70       ExprList *p
29750 4d 69 6e 4d 61 78 20 3d 20 30 3b 0a 20 20 20 20  MinMax = 0;.    
29760 20 20 20 20 75 38 20 66 6c 61 67 20 3d 20 57 48      u8 flag = WH
29770 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d  ERE_ORDERBY_NORM
29780 41 4c 3b 0a 20 20 20 20 20 20 20 20 0a 20 20 20  AL;.        .   
29790 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
297a0 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b 0a 20  pGroupBy==0 );. 
297b0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 66         assert( f
297c0 6c 61 67 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  lag==0 );.      
297d0 20 20 69 66 28 20 70 2d 3e 70 48 61 76 69 6e 67    if( p->pHaving
297e0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
297f0 20 66 6c 61 67 20 3d 20 6d 69 6e 4d 61 78 51 75   flag = minMaxQu
29800 65 72 79 28 26 73 41 67 67 49 6e 66 6f 2c 20 26  ery(&sAggInfo, &
29810 70 4d 69 6e 4d 61 78 29 3b 0a 20 20 20 20 20 20  pMinMax);.      
29820 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65    }.        asse
29830 72 74 28 20 66 6c 61 67 3d 3d 30 20 7c 7c 20 28  rt( flag==0 || (
29840 70 4d 69 6e 4d 61 78 21 3d 30 20 26 26 20 70 4d  pMinMax!=0 && pM
29850 69 6e 4d 61 78 2d 3e 6e 45 78 70 72 3d 3d 31 29  inMax->nExpr==1)
29860 20 29 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28   );..        if(
29870 20 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 20   flag ){.       
29880 20 20 20 70 4d 69 6e 4d 61 78 20 3d 20 73 71 6c     pMinMax = sql
29890 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
298a0 64 62 2c 20 70 4d 69 6e 4d 61 78 2c 20 30 29 3b  db, pMinMax, 0);
298b0 0a 20 20 20 20 20 20 20 20 20 20 70 44 65 6c 20  .          pDel 
298c0 3d 20 70 4d 69 6e 4d 61 78 3b 0a 20 20 20 20 20  = pMinMax;.     
298d0 20 20 20 20 20 69 66 28 20 70 4d 69 6e 4d 61 78       if( pMinMax
298e0 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46   && !db->mallocF
298f0 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20  ailed ){.       
29900 20 20 20 20 20 70 4d 69 6e 4d 61 78 2d 3e 61 5b       pMinMax->a[
29910 30 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20 66  0].sortOrder = f
29920 6c 61 67 21 3d 57 48 45 52 45 5f 4f 52 44 45 52  lag!=WHERE_ORDER
29930 42 59 5f 4d 49 4e 20 3f 31 3a 30 3b 0a 20 20 20  BY_MIN ?1:0;.   
29940 20 20 20 20 20 20 20 20 20 70 4d 69 6e 4d 61 78           pMinMax
29950 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70  ->a[0].pExpr->op
29960 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20 20   = TK_COLUMN;.  
29970 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
29980 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 20 20 2f    }.  .        /
29990 2a 20 54 68 69 73 20 63 61 73 65 20 72 75 6e 73  * This case runs
299a0 20 69 66 20 74 68 65 20 61 67 67 72 65 67 61 74   if the aggregat
299b0 65 20 68 61 73 20 6e 6f 20 47 52 4f 55 50 20 42  e has no GROUP B
299c0 59 20 63 6c 61 75 73 65 2e 20 20 54 68 65 0a 20  Y clause.  The. 
299d0 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73         ** proces
299e0 73 69 6e 67 20 69 73 20 6d 75 63 68 20 73 69 6d  sing is much sim
299f0 70 6c 65 72 20 73 69 6e 63 65 20 74 68 65 72 65  pler since there
29a00 20 69 73 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c   is only a singl
29a10 65 20 72 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a  e row.        **
29a20 20 6f 66 20 6f 75 74 70 75 74 2e 0a 20 20 20 20   of output..    
29a30 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72      */.        r
29a40 65 73 65 74 41 63 63 75 6d 75 6c 61 74 6f 72 28  esetAccumulator(
29a50 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66  pParse, &sAggInf
29a60 6f 29 3b 0a 20 20 20 20 20 20 20 20 70 57 49 6e  o);.        pWIn
29a70 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72  fo = sqlite3Wher
29a80 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70  eBegin(pParse, p
29a90 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65 2c  TabList, pWhere,
29aa0 20 70 4d 69 6e 4d 61 78 2c 30 2c 66 6c 61 67 2c   pMinMax,0,flag,
29ab0 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
29ac0 70 57 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20  pWInfo==0 ){.   
29ad0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
29ae0 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
29af0 20 70 44 65 6c 29 3b 0a 20 20 20 20 20 20 20 20   pDel);.        
29b00 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e    goto select_en
29b10 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  d;.        }.   
29b20 20 20 20 20 20 75 70 64 61 74 65 41 63 63 75 6d       updateAccum
29b30 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26  ulator(pParse, &
29b40 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20  sAggInfo);.     
29b50 20 20 20 61 73 73 65 72 74 28 20 70 4d 69 6e 4d     assert( pMinM
29b60 61 78 3d 3d 30 20 7c 7c 20 70 4d 69 6e 4d 61 78  ax==0 || pMinMax
29b70 2d 3e 6e 45 78 70 72 3d 3d 31 20 29 3b 0a 20 20  ->nExpr==1 );.  
29b80 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
29b90 33 57 68 65 72 65 49 73 4f 72 64 65 72 65 64 28  3WhereIsOrdered(
29ba0 70 57 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20 20  pWInfo) ){.     
29bb0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
29bc0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
29bd0 6f 2c 20 30 2c 20 73 71 6c 69 74 65 33 57 68 65  o, 0, sqlite3Whe
29be0 72 65 42 72 65 61 6b 4c 61 62 65 6c 28 70 57 49  reBreakLabel(pWI
29bf0 6e 66 6f 29 29 3b 0a 20 20 20 20 20 20 20 20 20  nfo));.         
29c00 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
29c10 20 22 25 73 28 29 20 62 79 20 69 6e 64 65 78 22   "%s() by index"
29c20 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
29c30 20 20 28 66 6c 61 67 3d 3d 57 48 45 52 45 5f 4f    (flag==WHERE_O
29c40 52 44 45 52 42 59 5f 4d 49 4e 3f 22 6d 69 6e 22  RDERBY_MIN?"min"
29c50 3a 22 6d 61 78 22 29 29 29 3b 0a 20 20 20 20 20  :"max")));.     
29c60 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
29c70 69 74 65 33 57 68 65 72 65 45 6e 64 28 70 57 49  ite3WhereEnd(pWI
29c80 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 66 69  nfo);.        fi
29c90 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63 74 69 6f  nalizeAggFunctio
29ca0 6e 73 28 70 50 61 72 73 65 2c 20 26 73 41 67 67  ns(pParse, &sAgg
29cb0 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  Info);.      }..
29cc0 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d        pOrderBy =
29cd0 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   0;.      sqlite
29ce0 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
29cf0 72 73 65 2c 20 70 48 61 76 69 6e 67 2c 20 61 64  rse, pHaving, ad
29d00 64 72 45 6e 64 2c 20 53 51 4c 49 54 45 5f 4a 55  drEnd, SQLITE_JU
29d10 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  MPIFNULL);.     
29d20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70   selectInnerLoop
29d30 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70  (pParse, p, p->p
29d40 45 4c 69 73 74 2c 20 30 2c 20 30 2c 20 30 2c 20  EList, 0, 0, 0, 
29d50 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  0, .            
29d60 20 20 20 20 20 20 20 20 20 20 70 44 65 73 74 2c            pDest,
29d70 20 61 64 64 72 45 6e 64 2c 20 61 64 64 72 45 6e   addrEnd, addrEn
29d80 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  d);.      sqlite
29d90 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
29da0 64 62 2c 20 70 44 65 6c 29 3b 0a 20 20 20 20 7d  db, pDel);.    }
29db0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
29dc0 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
29dd0 61 64 64 72 45 6e 64 29 3b 0a 20 20 20 20 0a 20  addrEnd);.    . 
29de0 20 7d 20 2f 2a 20 65 6e 64 69 66 20 61 67 67 72   } /* endif aggr
29df0 65 67 61 74 65 20 71 75 65 72 79 20 2a 2f 0a 0a  egate query */..
29e00 20 20 69 66 28 20 73 44 69 73 74 69 6e 63 74 2e    if( sDistinct.
29e10 65 54 6e 63 74 54 79 70 65 3d 3d 57 48 45 52 45  eTnctType==WHERE
29e20 5f 44 49 53 54 49 4e 43 54 5f 55 4e 4f 52 44 45  _DISTINCT_UNORDE
29e30 52 45 44 20 29 7b 0a 20 20 20 20 65 78 70 6c 61  RED ){.    expla
29e40 69 6e 54 65 6d 70 54 61 62 6c 65 28 70 50 61 72  inTempTable(pPar
29e50 73 65 2c 20 22 44 49 53 54 49 4e 43 54 22 29 3b  se, "DISTINCT");
29e60 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
29e70 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20  ere is an ORDER 
29e80 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20  BY clause, then 
29e90 77 65 20 6e 65 65 64 20 74 6f 20 73 6f 72 74 20  we need to sort 
29ea0 74 68 65 20 72 65 73 75 6c 74 73 0a 20 20 2a 2a  the results.  **
29eb0 20 61 6e 64 20 73 65 6e 64 20 74 68 65 6d 20 74   and send them t
29ec0 6f 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 6f  o the callback o
29ed0 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20 2a 2f 0a  ne by one..  */.
29ee0 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29    if( pOrderBy )
29ef0 7b 0a 20 20 20 20 65 78 70 6c 61 69 6e 54 65 6d  {.    explainTem
29f00 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 22  pTable(pParse, "
29f10 4f 52 44 45 52 20 42 59 22 29 3b 0a 20 20 20 20  ORDER BY");.    
29f20 67 65 6e 65 72 61 74 65 53 6f 72 74 54 61 69 6c  generateSortTail
29f30 28 70 50 61 72 73 65 2c 20 70 2c 20 76 2c 20 70  (pParse, p, v, p
29f40 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70 44  EList->nExpr, pD
29f50 65 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  est);.  }..  /* 
29f60 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 73 6b 69  Jump here to ski
29f70 70 20 74 68 69 73 20 71 75 65 72 79 0a 20 20 2a  p this query.  *
29f80 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  /.  sqlite3VdbeR
29f90 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69  esolveLabel(v, i
29fa0 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  End);..  /* The 
29fb0 53 45 4c 45 43 54 20 77 61 73 20 73 75 63 63 65  SELECT was succe
29fc0 73 73 66 75 6c 6c 79 20 63 6f 64 65 64 2e 20 20  ssfully coded.  
29fd0 20 53 65 74 20 74 68 65 20 72 65 74 75 72 6e 20   Set the return 
29fe0 63 6f 64 65 20 74 6f 20 30 0a 20 20 2a 2a 20 74  code to 0.  ** t
29ff0 6f 20 69 6e 64 69 63 61 74 65 20 6e 6f 20 65 72  o indicate no er
2a000 72 6f 72 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  rors..  */.  rc 
2a010 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 74 72  = 0;..  /* Contr
2a020 6f 6c 20 6a 75 6d 70 73 20 74 6f 20 68 65 72 65  ol jumps to here
2a030 20 69 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20   if an error is 
2a040 65 6e 63 6f 75 6e 74 65 72 65 64 20 61 62 6f 76  encountered abov
2a050 65 2c 20 6f 72 20 75 70 6f 6e 0a 20 20 2a 2a 20  e, or upon.  ** 
2a060 73 75 63 63 65 73 73 66 75 6c 20 63 6f 64 69 6e  successful codin
2a070 67 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 2e  g of the SELECT.
2a080 0a 20 20 2a 2f 0a 73 65 6c 65 63 74 5f 65 6e 64  .  */.select_end
2a090 3a 0a 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e  :.  explainSetIn
2a0a0 74 65 67 65 72 28 70 50 61 72 73 65 2d 3e 69 53  teger(pParse->iS
2a0b0 65 6c 65 63 74 49 64 2c 20 69 52 65 73 74 6f 72  electId, iRestor
2a0c0 65 53 65 6c 65 63 74 49 64 29 3b 0a 0a 20 20 2f  eSelectId);..  /
2a0d0 2a 20 49 64 65 6e 74 69 66 79 20 63 6f 6c 75 6d  * Identify colum
2a0e0 6e 20 6e 61 6d 65 73 20 69 66 20 72 65 73 75 6c  n names if resul
2a0f0 74 73 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  ts of the SELECT
2a100 20 61 72 65 20 74 6f 20 62 65 20 6f 75 74 70 75   are to be outpu
2a110 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63  t..  */.  if( rc
2a120 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
2a130 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54  Dest->eDest==SRT
2a140 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20 67  _Output ){.    g
2a150 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d  enerateColumnNam
2a160 65 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c  es(pParse, pTabL
2a170 69 73 74 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ist, pEList);.  
2a180 7d 0a 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  }..  sqlite3DbFr
2a190 65 65 28 64 62 2c 20 73 41 67 67 49 6e 66 6f 2e  ee(db, sAggInfo.
2a1a0 61 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33  aCol);.  sqlite3
2a1b0 44 62 46 72 65 65 28 64 62 2c 20 73 41 67 67 49  DbFree(db, sAggI
2a1c0 6e 66 6f 2e 61 46 75 6e 63 29 3b 0a 20 20 72 65  nfo.aFunc);.  re
2a1d0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 20  turn rc;.}..#if 
2a1e0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
2a1f0 4e 41 42 4c 45 5f 54 52 45 45 5f 45 58 50 4c 41  NABLE_TREE_EXPLA
2a200 49 4e 29 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  IN)./*.** Genera
2a210 74 65 20 61 20 68 75 6d 61 6e 2d 72 65 61 64 61  te a human-reada
2a220 62 6c 65 20 64 65 73 63 72 69 70 74 69 6f 6e 20  ble description 
2a230 6f 66 20 61 20 74 68 65 20 53 65 6c 65 63 74 20  of a the Select 
2a240 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69  object..*/.stati
2a250 63 20 76 6f 69 64 20 65 78 70 6c 61 69 6e 4f 6e  c void explainOn
2a260 65 53 65 6c 65 63 74 28 56 64 62 65 20 2a 70 56  eSelect(Vdbe *pV
2a270 64 62 65 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b  dbe, Select *p){
2a280 0a 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69  .  sqlite3Explai
2a290 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22  nPrintf(pVdbe, "
2a2a0 53 45 4c 45 43 54 20 22 29 3b 0a 20 20 69 66 28  SELECT ");.  if(
2a2b0 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28   p->selFlags & (
2a2c0 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41  SF_Distinct|SF_A
2a2d0 67 67 72 65 67 61 74 65 29 20 29 7b 0a 20 20 20  ggregate) ){.   
2a2e0 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73   if( p->selFlags
2a2f0 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 20 29   & SF_Distinct )
2a300 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
2a310 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64  xplainPrintf(pVd
2a320 62 65 2c 20 22 44 49 53 54 49 4e 43 54 20 22 29  be, "DISTINCT ")
2a330 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2a340 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
2a350 5f 41 67 67 72 65 67 61 74 65 20 29 7b 0a 20 20  _Aggregate ){.  
2a360 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
2a370 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20  inPrintf(pVdbe, 
2a380 22 61 67 67 5f 66 6c 61 67 20 22 29 3b 0a 20 20  "agg_flag ");.  
2a390 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45    }.    sqlite3E
2a3a0 78 70 6c 61 69 6e 4e 4c 28 70 56 64 62 65 29 3b  xplainNL(pVdbe);
2a3b0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c  .    sqlite3Expl
2a3c0 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c  ainPrintf(pVdbe,
2a3d0 20 22 20 20 20 22 29 3b 0a 20 20 7d 0a 20 20 73   "   ");.  }.  s
2a3e0 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70  qlite3ExplainExp
2a3f0 72 4c 69 73 74 28 70 56 64 62 65 2c 20 70 2d 3e  rList(pVdbe, p->
2a400 70 45 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69 74  pEList);.  sqlit
2a410 65 33 45 78 70 6c 61 69 6e 4e 4c 28 70 56 64 62  e3ExplainNL(pVdb
2a420 65 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 53 72  e);.  if( p->pSr
2a430 63 20 26 26 20 70 2d 3e 70 53 72 63 2d 3e 6e 53  c && p->pSrc->nS
2a440 72 63 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  rc ){.    int i;
2a450 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c  .    sqlite3Expl
2a460 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c  ainPrintf(pVdbe,
2a470 20 22 46 52 4f 4d 20 22 29 3b 0a 20 20 20 20 73   "FROM ");.    s
2a480 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 75 73  qlite3ExplainPus
2a490 68 28 70 56 64 62 65 29 3b 0a 20 20 20 20 66 6f  h(pVdbe);.    fo
2a4a0 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 70 53 72 63  r(i=0; i<p->pSrc
2a4b0 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20  ->nSrc; i++){.  
2a4c0 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
2a4d0 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d  st_item *pItem =
2a4e0 20 26 70 2d 3e 70 53 72 63 2d 3e 61 5b 69 5d 3b   &p->pSrc->a[i];
2a4f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
2a500 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62  plainPrintf(pVdb
2a510 65 2c 20 22 7b 25 64 2c 2a 7d 20 3d 20 22 2c 20  e, "{%d,*} = ", 
2a520 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b  pItem->iCursor);
2a530 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d  .      if( pItem
2a540 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ->pSelect ){.   
2a550 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
2a560 61 69 6e 53 65 6c 65 63 74 28 70 56 64 62 65 2c  ainSelect(pVdbe,
2a570 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 29   pItem->pSelect)
2a580 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49  ;.        if( pI
2a590 74 65 6d 2d 3e 70 54 61 62 20 29 7b 0a 20 20 20  tem->pTab ){.   
2a5a0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
2a5b0 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62  plainPrintf(pVdb
2a5c0 65 2c 20 22 20 28 74 61 62 6e 61 6d 65 3d 25 73  e, " (tabname=%s
2a5d0 29 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d  )", pItem->pTab-
2a5e0 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  >zName);.       
2a5f0 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69   }.      }else i
2a600 66 28 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20  f( pItem->zName 
2a610 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
2a620 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28  e3ExplainPrintf(
2a630 70 56 64 62 65 2c 20 22 25 73 22 2c 20 70 49 74  pVdbe, "%s", pIt
2a640 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  em->zName);.    
2a650 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 49    }.      if( pI
2a660 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 29 7b 0a 20  tem->zAlias ){. 
2a670 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
2a680 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62  plainPrintf(pVdb
2a690 65 2c 20 22 20 28 41 53 20 25 73 29 22 2c 20 70  e, " (AS %s)", p
2a6a0 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20  Item->zAlias);. 
2a6b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
2a6c0 20 70 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65   pItem->jointype
2a6d0 20 26 20 4a 54 5f 4c 45 46 54 20 29 7b 0a 20 20   & JT_LEFT ){.  
2a6e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
2a6f0 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65  lainPrintf(pVdbe
2a700 2c 20 22 20 4c 45 46 54 2d 4a 4f 49 4e 22 29 3b  , " LEFT-JOIN");
2a710 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
2a720 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 4e 4c 28  qlite3ExplainNL(
2a730 70 56 64 62 65 29 3b 0a 20 20 20 20 7d 0a 20 20  pVdbe);.    }.  
2a740 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
2a750 50 6f 70 28 70 56 64 62 65 29 3b 0a 20 20 7d 0a  Pop(pVdbe);.  }.
2a760 20 20 69 66 28 20 70 2d 3e 70 57 68 65 72 65 20    if( p->pWhere 
2a770 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  ){.    sqlite3Ex
2a780 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62  plainPrintf(pVdb
2a790 65 2c 20 22 57 48 45 52 45 20 22 29 3b 0a 20 20  e, "WHERE ");.  
2a7a0 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
2a7b0 45 78 70 72 28 70 56 64 62 65 2c 20 70 2d 3e 70  Expr(pVdbe, p->p
2a7c0 57 68 65 72 65 29 3b 0a 20 20 20 20 73 71 6c 69  Where);.    sqli
2a7d0 74 65 33 45 78 70 6c 61 69 6e 4e 4c 28 70 56 64  te3ExplainNL(pVd
2a7e0 62 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  be);.  }.  if( p
2a7f0 2d 3e 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20  ->pGroupBy ){.  
2a800 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
2a810 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22 47  Printf(pVdbe, "G
2a820 52 4f 55 50 42 59 20 22 29 3b 0a 20 20 20 20 73  ROUPBY ");.    s
2a830 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70  qlite3ExplainExp
2a840 72 4c 69 73 74 28 70 56 64 62 65 2c 20 70 2d 3e  rList(pVdbe, p->
2a850 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 73  pGroupBy);.    s
2a860 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 4e 4c 28  qlite3ExplainNL(
2a870 70 56 64 62 65 29 3b 0a 20 20 7d 0a 20 20 69 66  pVdbe);.  }.  if
2a880 28 20 70 2d 3e 70 48 61 76 69 6e 67 20 29 7b 0a  ( p->pHaving ){.
2a890 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
2a8a0 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20  inPrintf(pVdbe, 
2a8b0 22 48 41 56 49 4e 47 20 22 29 3b 0a 20 20 20 20  "HAVING ");.    
2a8c0 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78  sqlite3ExplainEx
2a8d0 70 72 28 70 56 64 62 65 2c 20 70 2d 3e 70 48 61  pr(pVdbe, p->pHa
2a8e0 76 69 6e 67 29 3b 0a 20 20 20 20 73 71 6c 69 74  ving);.    sqlit
2a8f0 65 33 45 78 70 6c 61 69 6e 4e 4c 28 70 56 64 62  e3ExplainNL(pVdb
2a900 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d  e);.  }.  if( p-
2a910 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  >pOrderBy ){.   
2a920 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
2a930 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22 4f 52  rintf(pVdbe, "OR
2a940 44 45 52 42 59 20 22 29 3b 0a 20 20 20 20 73 71  DERBY ");.    sq
2a950 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72  lite3ExplainExpr
2a960 4c 69 73 74 28 70 56 64 62 65 2c 20 70 2d 3e 70  List(pVdbe, p->p
2a970 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 73 71  OrderBy);.    sq
2a980 6c 69 74 65 33 45 78 70 6c 61 69 6e 4e 4c 28 70  lite3ExplainNL(p
2a990 56 64 62 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28  Vdbe);.  }.  if(
2a9a0 20 70 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20   p->pLimit ){.  
2a9b0 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
2a9c0 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22 4c  Printf(pVdbe, "L
2a9d0 49 4d 49 54 20 22 29 3b 0a 20 20 20 20 73 71 6c  IMIT ");.    sql
2a9e0 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72 28  ite3ExplainExpr(
2a9f0 70 56 64 62 65 2c 20 70 2d 3e 70 4c 69 6d 69 74  pVdbe, p->pLimit
2aa00 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
2aa10 70 6c 61 69 6e 4e 4c 28 70 56 64 62 65 29 3b 0a  plainNL(pVdbe);.
2aa20 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4f 66    }.  if( p->pOf
2aa30 66 73 65 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  fset ){.    sqli
2aa40 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
2aa50 28 70 56 64 62 65 2c 20 22 4f 46 46 53 45 54 20  (pVdbe, "OFFSET 
2aa60 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  ");.    sqlite3E
2aa70 78 70 6c 61 69 6e 45 78 70 72 28 70 56 64 62 65  xplainExpr(pVdbe
2aa80 2c 20 70 2d 3e 70 4f 66 66 73 65 74 29 3b 0a 20  , p->pOffset);. 
2aa90 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
2aaa0 6e 4e 4c 28 70 56 64 62 65 29 3b 0a 20 20 7d 0a  nNL(pVdbe);.  }.
2aab0 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  }.void sqlite3Ex
2aac0 70 6c 61 69 6e 53 65 6c 65 63 74 28 56 64 62 65  plainSelect(Vdbe
2aad0 20 2a 70 56 64 62 65 2c 20 53 65 6c 65 63 74 20   *pVdbe, Select 
2aae0 2a 70 29 7b 0a 20 20 69 66 28 20 70 3d 3d 30 20  *p){.  if( p==0 
2aaf0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  ){.    sqlite3Ex
2ab00 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62  plainPrintf(pVdb
2ab10 65 2c 20 22 28 6e 75 6c 6c 2d 73 65 6c 65 63 74  e, "(null-select
2ab20 29 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  )");.    return;
2ab30 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 70 2d  .  }.  while( p-
2ab40 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 70  >pPrior ){.    p
2ab50 2d 3e 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20  ->pPrior->pNext 
2ab60 3d 20 70 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e  = p;.    p = p->
2ab70 70 50 72 69 6f 72 3b 0a 20 20 7d 0a 20 20 73 71  pPrior;.  }.  sq
2ab80 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 75 73 68  lite3ExplainPush
2ab90 28 70 56 64 62 65 29 3b 0a 20 20 77 68 69 6c 65  (pVdbe);.  while
2aba0 28 20 70 20 29 7b 0a 20 20 20 20 65 78 70 6c 61  ( p ){.    expla
2abb0 69 6e 4f 6e 65 53 65 6c 65 63 74 28 70 56 64 62  inOneSelect(pVdb
2abc0 65 2c 20 70 29 3b 0a 20 20 20 20 70 20 3d 20 70  e, p);.    p = p
2abd0 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 69 66 28  ->pNext;.    if(
2abe0 20 70 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20   p==0 ) break;. 
2abf0 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
2ac00 6e 4e 4c 28 70 56 64 62 65 29 3b 0a 20 20 20 20  nNL(pVdbe);.    
2ac10 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
2ac20 69 6e 74 66 28 70 56 64 62 65 2c 20 22 25 73 5c  intf(pVdbe, "%s\
2ac30 6e 22 2c 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65  n", selectOpName
2ac40 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 7d 0a 20 20  (p->op));.  }.  
2ac50 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
2ac60 69 6e 74 66 28 70 56 64 62 65 2c 20 22 45 4e 44  intf(pVdbe, "END
2ac70 22 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  ");.  sqlite3Exp
2ac80 6c 61 69 6e 50 6f 70 28 70 56 64 62 65 29 3b 0a  lainPop(pVdbe);.
2ac90 7d 0a 0a 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65  }../* End of the
2aca0 20 73 74 72 75 63 74 75 72 65 20 64 65 62 75 67   structure debug
2acb0 20 70 72 69 6e 74 69 6e 67 20 63 6f 64 65 0a 2a   printing code.*
2acc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2acd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ace0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2acf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ad00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 23 65  ************/.#e
2ad10 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28  ndif /* defined(
2ad20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 54 52  SQLITE_ENABLE_TR
2ad30 45 45 5f 45 58 50 4c 41 49 4e 29 20 2a 2f 0a     EE_EXPLAIN) */.