/ Hex Artifact Content
Login

Artifact 94a755b3d3788cf171c98064f2fa0ce6350fd6ca:


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 20 69 66 28 20 6e 3e 3d 30 20 26  }else if( n>=0 &
ced0: 26 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3e  & p->nSelectRow>
cee0: 28 75 36 34 29 6e 20 29 7b 0a 20 20 20 20 20 20  (u64)n ){.      
cef0: 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20    p->nSelectRow 
cf00: 3d 20 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = n;.      }.   
cf10: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
cf20: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
cf30: 61 72 73 65 2c 20 70 2d 3e 70 4c 69 6d 69 74 2c  arse, p->pLimit,
cf40: 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20   iLimit);.      
cf50: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
cf60: 31 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e  1(v, OP_MustBeIn
cf70: 74 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20  t, iLimit);.    
cf80: 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
cf90: 2c 20 22 4c 49 4d 49 54 20 63 6f 75 6e 74 65 72  , "LIMIT counter
cfa0: 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  "));.      sqlit
cfb0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
cfc0: 4f 50 5f 49 66 5a 65 72 6f 2c 20 69 4c 69 6d 69  OP_IfZero, iLimi
cfd0: 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20  t, iBreak);.    
cfe0: 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 66  }.    if( p->pOf
cff0: 66 73 65 74 20 29 7b 0a 20 20 20 20 20 20 70 2d  fset ){.      p-
d000: 3e 69 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 73  >iOffset = iOffs
d010: 65 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  et = ++pParse->n
d020: 4d 65 6d 3b 0a 20 20 20 20 20 20 70 50 61 72 73  Mem;.      pPars
d030: 65 2d 3e 6e 4d 65 6d 2b 2b 3b 20 20 20 2f 2a 20  e->nMem++;   /* 
d040: 41 6c 6c 6f 63 61 74 65 20 61 6e 20 65 78 74 72  Allocate an extr
d050: 61 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 6c  a register for l
d060: 69 6d 69 74 2b 6f 66 66 73 65 74 20 2a 2f 0a 20  imit+offset */. 
d070: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
d080: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 2d 3e  Code(pParse, p->
d090: 70 4f 66 66 73 65 74 2c 20 69 4f 66 66 73 65 74  pOffset, iOffset
d0a0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
d0b0: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
d0c0: 5f 4d 75 73 74 42 65 49 6e 74 2c 20 69 4f 66 66  _MustBeInt, iOff
d0d0: 73 65 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65  set);.      Vdbe
d0e0: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 46 46  Comment((v, "OFF
d0f0: 53 45 54 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a  SET counter"));.
d100: 20 20 20 20 20 20 61 64 64 72 31 20 3d 20 73 71        addr1 = sq
d110: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
d120: 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69 4f 66  v, OP_IfPos, iOf
d130: 66 73 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  fset);.      sql
d140: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
d150: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
d160: 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20   iOffset);.     
d170: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
d180: 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a  Here(v, addr1);.
d190: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
d1a0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 41 64  eAddOp3(v, OP_Ad
d1b0: 64 2c 20 69 4c 69 6d 69 74 2c 20 69 4f 66 66 73  d, iLimit, iOffs
d1c0: 65 74 2c 20 69 4f 66 66 73 65 74 2b 31 29 3b 0a  et, iOffset+1);.
d1d0: 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
d1e0: 74 28 28 76 2c 20 22 4c 49 4d 49 54 2b 4f 46 46  t((v, "LIMIT+OFF
d1f0: 53 45 54 22 29 29 3b 0a 20 20 20 20 20 20 61 64  SET"));.      ad
d200: 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62  dr1 = sqlite3Vdb
d210: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66  eAddOp1(v, OP_If
d220: 50 6f 73 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20  Pos, iLimit);.  
d230: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
d240: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
d250: 67 65 72 2c 20 2d 31 2c 20 69 4f 66 66 73 65 74  ger, -1, iOffset
d260: 2b 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  +1);.      sqlit
d270: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
d280: 2c 20 61 64 64 72 31 29 3b 0a 20 20 20 20 7d 0a  , addr1);.    }.
d290: 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53    }.}..#ifndef S
d2a0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f  QLITE_OMIT_COMPO
d2b0: 55 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a  UND_SELECT./*.**
d2c0: 20 52 65 74 75 72 6e 20 74 68 65 20 61 70 70 72   Return the appr
d2d0: 6f 70 72 69 61 74 65 20 63 6f 6c 6c 61 74 69 6e  opriate collatin
d2e0: 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74  g sequence for t
d2f0: 68 65 20 69 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d  he iCol-th colum
d300: 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 72 65 73 75  n of.** the resu
d310: 6c 74 20 73 65 74 20 66 6f 72 20 74 68 65 20 63  lt set for the c
d320: 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65 63 74 20 73  ompound-select s
d330: 74 61 74 65 6d 65 6e 74 20 22 70 22 2e 20 20 52  tatement "p".  R
d340: 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 0a 2a 2a  eturn NULL if.**
d350: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 68 61 73 20   the column has 
d360: 6e 6f 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61  no default colla
d370: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a  ting sequence..*
d380: 2a 0a 2a 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69  *.** The collati
d390: 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20  ng sequence for 
d3a0: 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c  the compound sel
d3b0: 65 63 74 20 69 73 20 74 61 6b 65 6e 20 66 72 6f  ect is taken fro
d3c0: 6d 20 74 68 65 0a 2a 2a 20 6c 65 66 74 2d 6d 6f  m the.** left-mo
d3d0: 73 74 20 74 65 72 6d 20 6f 66 20 74 68 65 20 73  st term of the s
d3e0: 65 6c 65 63 74 20 74 68 61 74 20 68 61 73 20 61  elect that has a
d3f0: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
d400: 6e 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 43  nce..*/.static C
d410: 6f 6c 6c 53 65 71 20 2a 6d 75 6c 74 69 53 65 6c  ollSeq *multiSel
d420: 65 63 74 43 6f 6c 6c 53 65 71 28 50 61 72 73 65  ectCollSeq(Parse
d430: 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74   *pParse, Select
d440: 20 2a 70 2c 20 69 6e 74 20 69 43 6f 6c 29 7b 0a   *p, int iCol){.
d450: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 52 65 74 3b    CollSeq *pRet;
d460: 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72  .  if( p->pPrior
d470: 20 29 7b 0a 20 20 20 20 70 52 65 74 20 3d 20 6d   ){.    pRet = m
d480: 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65  ultiSelectCollSe
d490: 71 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 50 72  q(pParse, p->pPr
d4a0: 69 6f 72 2c 20 69 43 6f 6c 29 3b 0a 20 20 7d 65  ior, iCol);.  }e
d4b0: 6c 73 65 7b 0a 20 20 20 20 70 52 65 74 20 3d 20  lse{.    pRet = 
d4c0: 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  0;.  }.  assert(
d4d0: 20 69 43 6f 6c 3e 3d 30 20 29 3b 0a 20 20 69 66   iCol>=0 );.  if
d4e0: 28 20 70 52 65 74 3d 3d 30 20 26 26 20 69 43 6f  ( pRet==0 && iCo
d4f0: 6c 3c 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  l<p->pEList->nEx
d500: 70 72 20 29 7b 0a 20 20 20 20 70 52 65 74 20 3d  pr ){.    pRet =
d510: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
d520: 53 65 71 28 70 50 61 72 73 65 2c 20 70 2d 3e 70  Seq(pParse, p->p
d530: 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 70  EList->a[iCol].p
d540: 45 78 70 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Expr);.  }.  ret
d550: 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 23 65 6e 64  urn pRet;.}.#end
d560: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
d570: 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
d580: 54 20 2a 2f 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  T */../* Forward
d590: 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74   reference */.st
d5a0: 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65  atic int multiSe
d5b0: 6c 65 63 74 4f 72 64 65 72 42 79 28 0a 20 20 50  lectOrderBy(.  P
d5c0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
d5d0: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
d5e0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
d5f0: 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
d600: 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d     /* The right-
d610: 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43 54 73 20  most of SELECTs 
d620: 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20  to be coded */. 
d630: 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65   SelectDest *pDe
d640: 73 74 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74  st     /* What t
d650: 6f 20 64 6f 20 77 69 74 68 20 71 75 65 72 79 20  o do with query 
d660: 72 65 73 75 6c 74 73 20 2a 2f 0a 29 3b 0a 0a 0a  results */.);...
d670: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
d680: 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
d690: 45 43 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  ECT./*.** This r
d6a0: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
d6b0: 20 74 6f 20 70 72 6f 63 65 73 73 20 61 20 63 6f   to process a co
d6c0: 6d 70 6f 75 6e 64 20 71 75 65 72 79 20 66 6f 72  mpound query for
d6d0: 6d 20 66 72 6f 6d 0a 2a 2a 20 74 77 6f 20 6f 72  m from.** two or
d6e0: 20 6d 6f 72 65 20 73 65 70 61 72 61 74 65 20 71   more separate q
d6f0: 75 65 72 69 65 73 20 75 73 69 6e 67 20 55 4e 49  ueries using UNI
d700: 4f 4e 2c 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20 45  ON, UNION ALL, E
d710: 58 43 45 50 54 2c 20 6f 72 0a 2a 2a 20 49 4e 54  XCEPT, or.** INT
d720: 45 52 53 45 43 54 0a 2a 2a 0a 2a 2a 20 22 70 22  ERSECT.**.** "p"
d730: 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 72   points to the r
d740: 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 74 68 65  ight-most of the
d750: 20 74 77 6f 20 71 75 65 72 69 65 73 2e 20 20 74   two queries.  t
d760: 68 65 20 71 75 65 72 79 20 6f 6e 20 74 68 65 0a  he query on the.
d770: 2a 2a 20 6c 65 66 74 20 69 73 20 70 2d 3e 70 50  ** left is p->pP
d780: 72 69 6f 72 2e 20 20 54 68 65 20 6c 65 66 74 20  rior.  The left 
d790: 71 75 65 72 79 20 63 6f 75 6c 64 20 61 6c 73 6f  query could also
d7a0: 20 62 65 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71   be a compound q
d7b0: 75 65 72 79 0a 2a 2a 20 69 6e 20 77 68 69 63 68  uery.** in which
d7c0: 20 63 61 73 65 20 74 68 69 73 20 72 6f 75 74 69   case this routi
d7d0: 6e 65 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65  ne will be calle
d7e0: 64 20 72 65 63 75 72 73 69 76 65 6c 79 2e 20 0a  d recursively. .
d7f0: 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74  **.** The result
d800: 73 20 6f 66 20 74 68 65 20 74 6f 74 61 6c 20 71  s of the total q
d810: 75 65 72 79 20 61 72 65 20 74 6f 20 62 65 20 77  uery are to be w
d820: 72 69 74 74 65 6e 20 69 6e 74 6f 20 61 20 64 65  ritten into a de
d830: 73 74 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20  stination.** of 
d840: 74 79 70 65 20 65 44 65 73 74 20 77 69 74 68 20  type eDest with 
d850: 70 61 72 61 6d 65 74 65 72 20 69 50 61 72 6d 2e  parameter iParm.
d860: 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 20 31  .**.** Example 1
d870: 3a 20 20 43 6f 6e 73 69 64 65 72 20 61 20 74 68  :  Consider a th
d880: 72 65 65 2d 77 61 79 20 63 6f 6d 70 6f 75 6e 64  ree-way compound
d890: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a   SQL statement..
d8a0: 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  **.**     SELECT
d8b0: 20 61 20 46 52 4f 4d 20 74 31 20 55 4e 49 4f 4e   a FROM t1 UNION
d8c0: 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 74   SELECT b FROM t
d8d0: 32 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 63  2 UNION SELECT c
d8e0: 20 46 52 4f 4d 20 74 33 0a 2a 2a 0a 2a 2a 20 54   FROM t3.**.** T
d8f0: 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 69 73  his statement is
d900: 20 70 61 72 73 65 64 20 75 70 20 61 73 20 66 6f   parsed up as fo
d910: 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  llows:.**.**    
d920: 20 53 45 4c 45 43 54 20 63 20 46 52 4f 4d 20 74   SELECT c FROM t
d930: 33 0a 2a 2a 20 20 20 20 20 20 7c 0a 2a 2a 20 20  3.**      |.**  
d940: 20 20 20 20 60 2d 2d 2d 2d 2d 3e 20 20 53 45 4c      `----->  SEL
d950: 45 43 54 20 62 20 46 52 4f 4d 20 74 32 0a 2a 2a  ECT b FROM t2.**
d960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d970: 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  |.**            
d980: 20 20 20 20 60 2d 2d 2d 2d 2d 2d 3e 20 20 53 45      `------>  SE
d990: 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31 0a 2a  LECT a FROM t1.*
d9a0: 2a 0a 2a 2a 20 54 68 65 20 61 72 72 6f 77 73 20  *.** The arrows 
d9b0: 69 6e 20 74 68 65 20 64 69 61 67 72 61 6d 20 61  in the diagram a
d9c0: 62 6f 76 65 20 72 65 70 72 65 73 65 6e 74 20 74  bove represent t
d9d0: 68 65 20 53 65 6c 65 63 74 2e 70 50 72 69 6f 72  he Select.pPrior
d9e0: 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 20 53 6f 20   pointer..** So 
d9f0: 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  if this routine 
da00: 69 73 20 63 61 6c 6c 65 64 20 77 69 74 68 20 70  is called with p
da10: 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 74 33   equal to the t3
da20: 20 71 75 65 72 79 2c 20 74 68 65 6e 0a 2a 2a 20   query, then.** 
da30: 70 50 72 69 6f 72 20 77 69 6c 6c 20 62 65 20 74  pPrior will be t
da40: 68 65 20 74 32 20 71 75 65 72 79 2e 20 20 70 2d  he t2 query.  p-
da50: 3e 6f 70 20 77 69 6c 6c 20 62 65 20 54 4b 5f 55  >op will be TK_U
da60: 4e 49 4f 4e 20 69 6e 20 74 68 69 73 20 63 61 73  NION in this cas
da70: 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 69 63 65 20  e..**.** Notice 
da80: 74 68 61 74 20 62 65 63 61 75 73 65 20 6f 66 20  that because of 
da90: 74 68 65 20 77 61 79 20 53 51 4c 69 74 65 20 70  the way SQLite p
daa0: 61 72 73 65 73 20 63 6f 6d 70 6f 75 6e 64 20 53  arses compound S
dab0: 45 4c 45 43 54 73 2c 20 74 68 65 0a 2a 2a 20 69  ELECTs, the.** i
dac0: 6e 64 69 76 69 64 75 61 6c 20 73 65 6c 65 63 74  ndividual select
dad0: 73 20 61 6c 77 61 79 73 20 67 72 6f 75 70 20 66  s always group f
dae0: 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68  rom left to righ
daf0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
db00: 20 6d 75 6c 74 69 53 65 6c 65 63 74 28 0a 20 20   multiSelect(.  
db10: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
db20: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
db30: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
db40: 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
db50: 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74      /* The right
db60: 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43 54 73  -most of SELECTs
db70: 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a   to be coded */.
db80: 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44    SelectDest *pD
db90: 65 73 74 20 20 20 20 20 2f 2a 20 57 68 61 74 20  est     /* What 
dba0: 74 6f 20 64 6f 20 77 69 74 68 20 71 75 65 72 79  to do with query
dbb0: 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20   results */.){. 
dbc0: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
dbd0: 5f 4f 4b 3b 20 20 20 2f 2a 20 53 75 63 63 65 73  _OK;   /* Succes
dbe0: 73 20 63 6f 64 65 20 66 72 6f 6d 20 61 20 73 75  s code from a su
dbf0: 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 53 65  broutine */.  Se
dc00: 6c 65 63 74 20 2a 70 50 72 69 6f 72 3b 20 20 20  lect *pPrior;   
dc10: 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20 53      /* Another S
dc20: 45 4c 45 43 54 20 69 6d 6d 65 64 69 61 74 65 6c  ELECT immediatel
dc30: 79 20 74 6f 20 6f 75 72 20 6c 65 66 74 20 2a 2f  y to our left */
dc40: 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20  .  Vdbe *v;     
dc50: 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65           /* Gene
dc60: 72 61 74 65 20 63 6f 64 65 20 74 6f 20 74 68 69  rate code to thi
dc70: 73 20 56 44 42 45 20 2a 2f 0a 20 20 53 65 6c 65  s VDBE */.  Sele
dc80: 63 74 44 65 73 74 20 64 65 73 74 3b 20 20 20 20  ctDest dest;    
dc90: 20 20 2f 2a 20 41 6c 74 65 72 6e 61 74 69 76 65    /* Alternative
dca0: 20 64 61 74 61 20 64 65 73 74 69 6e 61 74 69 6f   data destinatio
dcb0: 6e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  n */.  Select *p
dcc0: 44 65 6c 65 74 65 20 3d 20 30 3b 20 20 2f 2a 20  Delete = 0;  /* 
dcd0: 43 68 61 69 6e 20 6f 66 20 73 69 6d 70 6c 65 20  Chain of simple 
dce0: 73 65 6c 65 63 74 73 20 74 6f 20 64 65 6c 65 74  selects to delet
dcf0: 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  e */.  sqlite3 *
dd00: 64 62 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  db;          /* 
dd10: 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
dd20: 69 6f 6e 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ion */.#ifndef S
dd30: 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
dd40: 49 4e 0a 20 20 69 6e 74 20 69 53 75 62 31 3b 20  IN.  int iSub1; 
dd50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 51             /* EQ
dd60: 50 20 69 64 20 6f 66 20 6c 65 66 74 2d 68 61 6e  P id of left-han
dd70: 64 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74  d query */.  int
dd80: 20 69 53 75 62 32 3b 20 20 20 20 20 20 20 20 20   iSub2;         
dd90: 20 20 20 2f 2a 20 45 51 50 20 69 64 20 6f 66 20     /* EQP id of 
dda0: 72 69 67 68 74 2d 68 61 6e 64 20 71 75 65 72 79  right-hand query
ddb0: 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a   */.#endif..  /*
ddc0: 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 72 65   Make sure there
ddd0: 20 69 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20   is no ORDER BY 
dde0: 6f 72 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20  or LIMIT clause 
ddf0: 6f 6e 20 70 72 69 6f 72 20 53 45 4c 45 43 54 73  on prior SELECTs
de00: 2e 20 20 4f 6e 6c 79 0a 20 20 2a 2a 20 74 68 65  .  Only.  ** the
de10: 20 6c 61 73 74 20 28 72 69 67 68 74 2d 6d 6f 73   last (right-mos
de20: 74 29 20 53 45 4c 45 43 54 20 69 6e 20 74 68 65  t) SELECT in the
de30: 20 73 65 72 69 65 73 20 6d 61 79 20 68 61 76 65   series may have
de40: 20 61 6e 20 4f 52 44 45 52 20 42 59 20 6f 72 20   an ORDER BY or 
de50: 4c 49 4d 49 54 2e 0a 20 20 2a 2f 0a 20 20 61 73  LIMIT..  */.  as
de60: 73 65 72 74 28 20 70 20 26 26 20 70 2d 3e 70 50  sert( p && p->pP
de70: 72 69 6f 72 20 29 3b 20 20 2f 2a 20 43 61 6c 6c  rior );  /* Call
de80: 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 67 75 61  ing function gua
de90: 72 61 6e 74 65 65 73 20 74 68 69 73 20 6d 75 63  rantees this muc
dea0: 68 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61 72  h */.  db = pPar
deb0: 73 65 2d 3e 64 62 3b 0a 20 20 70 50 72 69 6f 72  se->db;.  pPrior
dec0: 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20   = p->pPrior;.  
ded0: 61 73 73 65 72 74 28 20 70 50 72 69 6f 72 2d 3e  assert( pPrior->
dee0: 70 52 69 67 68 74 6d 6f 73 74 21 3d 70 50 72 69  pRightmost!=pPri
def0: 6f 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  or );.  assert( 
df00: 70 50 72 69 6f 72 2d 3e 70 52 69 67 68 74 6d 6f  pPrior->pRightmo
df10: 73 74 3d 3d 70 2d 3e 70 52 69 67 68 74 6d 6f 73  st==p->pRightmos
df20: 74 20 29 3b 0a 20 20 64 65 73 74 20 3d 20 2a 70  t );.  dest = *p
df30: 44 65 73 74 3b 0a 20 20 69 66 28 20 70 50 72 69  Dest;.  if( pPri
df40: 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a  or->pOrderBy ){.
df50: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
df60: 4d 73 67 28 70 50 61 72 73 65 2c 22 4f 52 44 45  Msg(pParse,"ORDE
df70: 52 20 42 59 20 63 6c 61 75 73 65 20 73 68 6f 75  R BY clause shou
df80: 6c 64 20 63 6f 6d 65 20 61 66 74 65 72 20 25 73  ld come after %s
df90: 20 6e 6f 74 20 62 65 66 6f 72 65 22 2c 0a 20 20   not before",.  
dfa0: 20 20 20 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65      selectOpName
dfb0: 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63  (p->op));.    rc
dfc0: 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d   = 1;.    goto m
dfd0: 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
dfe0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 72 69 6f  .  }.  if( pPrio
dff0: 72 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20  r->pLimit ){.   
e000: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
e010: 28 70 50 61 72 73 65 2c 22 4c 49 4d 49 54 20 63  (pParse,"LIMIT c
e020: 6c 61 75 73 65 20 73 68 6f 75 6c 64 20 63 6f 6d  lause should com
e030: 65 20 61 66 74 65 72 20 25 73 20 6e 6f 74 20 62  e after %s not b
e040: 65 66 6f 72 65 22 2c 0a 20 20 20 20 20 20 73 65  efore",.      se
e050: 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70  lectOpName(p->op
e060: 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a  ));.    rc = 1;.
e070: 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
e080: 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a  elect_end;.  }..
e090: 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
e0a0: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
e0b0: 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 20  assert( v!=0 ); 
e0c0: 20 2f 2a 20 54 68 65 20 56 44 42 45 20 61 6c 72   /* The VDBE alr
e0d0: 65 61 64 79 20 63 72 65 61 74 65 64 20 62 79 20  eady created by 
e0e0: 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
e0f0: 20 2a 2f 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65   */..  /* Create
e100: 20 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e   the destination
e110: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
e120: 20 69 66 20 6e 65 63 65 73 73 61 72 79 0a 20 20   if necessary.  
e130: 2a 2f 0a 20 20 69 66 28 20 64 65 73 74 2e 65 44  */.  if( dest.eD
e140: 65 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61  est==SRT_EphemTa
e150: 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  b ){.    assert(
e160: 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20   p->pEList );.  
e170: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
e180: 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  Op2(v, OP_OpenEp
e190: 68 65 6d 65 72 61 6c 2c 20 64 65 73 74 2e 69 53  hemeral, dest.iS
e1a0: 44 50 61 72 6d 2c 20 70 2d 3e 70 45 4c 69 73 74  DParm, p->pEList
e1b0: 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 73 71  ->nExpr);.    sq
e1c0: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
e1d0: 35 28 76 2c 20 42 54 52 45 45 5f 55 4e 4f 52 44  5(v, BTREE_UNORD
e1e0: 45 52 45 44 29 3b 0a 20 20 20 20 64 65 73 74 2e  ERED);.    dest.
e1f0: 65 44 65 73 74 20 3d 20 53 52 54 5f 54 61 62 6c  eDest = SRT_Tabl
e200: 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b  e;.  }..  /* Mak
e210: 65 20 73 75 72 65 20 61 6c 6c 20 53 45 4c 45 43  e sure all SELEC
e220: 54 73 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d  Ts in the statem
e230: 65 6e 74 20 68 61 76 65 20 74 68 65 20 73 61 6d  ent have the sam
e240: 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d  e number of elem
e250: 65 6e 74 73 0a 20 20 2a 2a 20 69 6e 20 74 68 65  ents.  ** in the
e260: 69 72 20 72 65 73 75 6c 74 20 73 65 74 73 2e 0a  ir result sets..
e270: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
e280: 2d 3e 70 45 4c 69 73 74 20 26 26 20 70 50 72 69  ->pEList && pPri
e290: 6f 72 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20  or->pEList );.  
e2a0: 69 66 28 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  if( p->pEList->n
e2b0: 45 78 70 72 21 3d 70 50 72 69 6f 72 2d 3e 70 45  Expr!=pPrior->pE
e2c0: 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  List->nExpr ){. 
e2d0: 20 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61     if( p->selFla
e2e0: 67 73 20 26 20 53 46 5f 56 61 6c 75 65 73 20 29  gs & SF_Values )
e2f0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
e300: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
e310: 22 61 6c 6c 20 56 41 4c 55 45 53 20 6d 75 73 74  "all VALUES must
e320: 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e   have the same n
e330: 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 22 29  umber of terms")
e340: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
e350: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
e360: 73 67 28 70 50 61 72 73 65 2c 20 22 53 45 4c 45  sg(pParse, "SELE
e370: 43 54 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20  CTs to the left 
e380: 61 6e 64 20 72 69 67 68 74 20 6f 66 20 25 73 22  and right of %s"
e390: 0a 20 20 20 20 20 20 20 20 22 20 64 6f 20 6e 6f  .        " do no
e3a0: 74 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20  t have the same 
e3b0: 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74  number of result
e3c0: 20 63 6f 6c 75 6d 6e 73 22 2c 20 73 65 6c 65 63   columns", selec
e3d0: 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b  tOpName(p->op));
e3e0: 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
e3f0: 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74  1;.    goto mult
e400: 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
e410: 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 6f 75 6e 64  }..  /* Compound
e420: 20 53 45 4c 45 43 54 73 20 74 68 61 74 20 68 61   SELECTs that ha
e430: 76 65 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  ve an ORDER BY c
e440: 6c 61 75 73 65 20 61 72 65 20 68 61 6e 64 6c 65  lause are handle
e450: 64 20 73 65 70 61 72 61 74 65 6c 79 2e 0a 20 20  d separately..  
e460: 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72 64  */.  if( p->pOrd
e470: 65 72 42 79 20 29 7b 0a 20 20 20 20 72 65 74 75  erBy ){.    retu
e480: 72 6e 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72  rn multiSelectOr
e490: 64 65 72 42 79 28 70 50 61 72 73 65 2c 20 70 2c  derBy(pParse, p,
e4a0: 20 70 44 65 73 74 29 3b 0a 20 20 7d 0a 0a 20 20   pDest);.  }..  
e4b0: 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
e4c0: 20 66 6f 72 20 74 68 65 20 6c 65 66 74 20 61 6e   for the left an
e4d0: 64 20 72 69 67 68 74 20 53 45 4c 45 43 54 20 73  d right SELECT s
e4e0: 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a  tatements..  */.
e4f0: 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20    switch( p->op 
e500: 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  ){.    case TK_A
e510: 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  LL: {.      int 
e520: 61 64 64 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  addr = 0;.      
e530: 69 6e 74 20 6e 4c 69 6d 69 74 3b 0a 20 20 20 20  int nLimit;.    
e540: 20 20 61 73 73 65 72 74 28 20 21 70 50 72 69 6f    assert( !pPrio
e550: 72 2d 3e 70 4c 69 6d 69 74 20 29 3b 0a 20 20 20  r->pLimit );.   
e560: 20 20 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69     pPrior->iLimi
e570: 74 20 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20  t = p->iLimit;. 
e580: 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 69 4f 66       pPrior->iOf
e590: 66 73 65 74 20 3d 20 70 2d 3e 69 4f 66 66 73 65  fset = p->iOffse
e5a0: 74 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72 2d  t;.      pPrior-
e5b0: 3e 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69  >pLimit = p->pLi
e5c0: 6d 69 74 3b 0a 20 20 20 20 20 20 70 50 72 69 6f  mit;.      pPrio
e5d0: 72 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e  r->pOffset = p->
e5e0: 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 65  pOffset;.      e
e5f0: 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72  xplainSetInteger
e600: 28 69 53 75 62 31 2c 20 70 50 61 72 73 65 2d 3e  (iSub1, pParse->
e610: 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a  iNextSelectId);.
e620: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
e630: 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
e640: 20 70 50 72 69 6f 72 2c 20 26 64 65 73 74 29 3b   pPrior, &dest);
e650: 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74  .      p->pLimit
e660: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 70   = 0;.      p->p
e670: 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20  Offset = 0;.    
e680: 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
e690: 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
e6a0: 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20  elect_end;.     
e6b0: 20 7d 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69   }.      p->pPri
e6c0: 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d  or = 0;.      p-
e6d0: 3e 69 4c 69 6d 69 74 20 3d 20 70 50 72 69 6f 72  >iLimit = pPrior
e6e0: 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  ->iLimit;.      
e6f0: 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 70 50 72  p->iOffset = pPr
e700: 69 6f 72 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20  ior->iOffset;.  
e710: 20 20 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69      if( p->iLimi
e720: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 61 64 64  t ){.        add
e730: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
e740: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 5a 65  ddOp1(v, OP_IfZe
e750: 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 29 3b 0a  ro, p->iLimit);.
e760: 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d          VdbeComm
e770: 65 6e 74 28 28 76 2c 20 22 4a 75 6d 70 20 61 68  ent((v, "Jump ah
e780: 65 61 64 20 69 66 20 4c 49 4d 49 54 20 72 65 61  ead if LIMIT rea
e790: 63 68 65 64 22 29 29 3b 0a 20 20 20 20 20 20 7d  ched"));.      }
e7a0: 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65  .      explainSe
e7b0: 74 49 6e 74 65 67 65 72 28 69 53 75 62 32 2c 20  tInteger(iSub2, 
e7c0: 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c  pParse->iNextSel
e7d0: 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63  ectId);.      rc
e7e0: 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
e7f0: 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64 65 73  (pParse, p, &des
e800: 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  t);.      testca
e810: 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  se( rc!=SQLITE_O
e820: 4b 20 29 3b 0a 20 20 20 20 20 20 70 44 65 6c 65  K );.      pDele
e830: 74 65 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a  te = p->pPrior;.
e840: 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20        p->pPrior 
e850: 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20  = pPrior;.      
e860: 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 2b 3d  p->nSelectRow +=
e870: 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74   pPrior->nSelect
e880: 52 6f 77 3b 0a 20 20 20 20 20 20 69 66 28 20 70  Row;.      if( p
e890: 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 0a 20 20  Prior->pLimit.  
e8a0: 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 45       && sqlite3E
e8b0: 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 50 72  xprIsInteger(pPr
e8c0: 69 6f 72 2d 3e 70 4c 69 6d 69 74 2c 20 26 6e 4c  ior->pLimit, &nL
e8d0: 69 6d 69 74 29 0a 20 20 20 20 20 20 20 26 26 20  imit).       && 
e8e0: 6e 4c 69 6d 69 74 3e 30 20 26 26 20 70 2d 3e 6e  nLimit>0 && p->n
e8f0: 53 65 6c 65 63 74 52 6f 77 20 3e 20 28 75 36 34  SelectRow > (u64
e900: 29 6e 4c 69 6d 69 74 20 0a 20 20 20 20 20 20 29  )nLimit .      )
e910: 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 53 65  {.        p->nSe
e920: 6c 65 63 74 52 6f 77 20 3d 20 6e 4c 69 6d 69 74  lectRow = nLimit
e930: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
e940: 69 66 28 20 61 64 64 72 20 29 7b 0a 20 20 20 20  if( addr ){.    
e950: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
e960: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 29  umpHere(v, addr)
e970: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
e980: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
e990: 20 63 61 73 65 20 54 4b 5f 45 58 43 45 50 54 3a   case TK_EXCEPT:
e9a0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4e 49  .    case TK_UNI
e9b0: 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  ON: {.      int 
e9c0: 75 6e 69 6f 6e 54 61 62 3b 20 20 20 20 2f 2a 20  unionTab;    /* 
e9d0: 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66  Cursor number of
e9e0: 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74   the temporary t
e9f0: 61 62 6c 65 20 68 6f 6c 64 69 6e 67 20 72 65 73  able holding res
ea00: 75 6c 74 20 2a 2f 0a 20 20 20 20 20 20 75 38 20  ult */.      u8 
ea10: 6f 70 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  op = 0;       /*
ea20: 20 4f 6e 65 20 6f 66 20 74 68 65 20 53 52 54 5f   One of the SRT_
ea30: 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f 20 61   operations to a
ea40: 70 70 6c 79 20 74 6f 20 73 65 6c 66 20 2a 2f 0a  pply to self */.
ea50: 20 20 20 20 20 20 69 6e 74 20 70 72 69 6f 72 4f        int priorO
ea60: 70 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 53 52  p;     /* The SR
ea70: 54 5f 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20  T_ operation to 
ea80: 61 70 70 6c 79 20 74 6f 20 70 72 69 6f 72 20 73  apply to prior s
ea90: 65 6c 65 63 74 73 20 2a 2f 0a 20 20 20 20 20 20  elects */.      
eaa0: 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20 2a 70  Expr *pLimit, *p
eab0: 4f 66 66 73 65 74 3b 20 2f 2a 20 53 61 76 65 64  Offset; /* Saved
eac0: 20 76 61 6c 75 65 73 20 6f 66 20 70 2d 3e 6e 4c   values of p->nL
ead0: 69 6d 69 74 20 61 6e 64 20 70 2d 3e 6e 4f 66 66  imit and p->nOff
eae0: 73 65 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  set */.      int
eaf0: 20 61 64 64 72 3b 0a 20 20 20 20 20 20 53 65 6c   addr;.      Sel
eb00: 65 63 74 44 65 73 74 20 75 6e 69 6f 6e 64 65 73  ectDest uniondes
eb10: 74 3b 0a 0a 20 20 20 20 20 20 74 65 73 74 63 61  t;..      testca
eb20: 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 45 58  se( p->op==TK_EX
eb30: 43 45 50 54 20 29 3b 0a 20 20 20 20 20 20 74 65  CEPT );.      te
eb40: 73 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54  stcase( p->op==T
eb50: 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 20 20 20  K_UNION );.     
eb60: 20 70 72 69 6f 72 4f 70 20 3d 20 53 52 54 5f 55   priorOp = SRT_U
eb70: 6e 69 6f 6e 3b 0a 20 20 20 20 20 20 69 66 28 20  nion;.      if( 
eb80: 64 65 73 74 2e 65 44 65 73 74 3d 3d 70 72 69 6f  dest.eDest==prio
eb90: 72 4f 70 20 26 26 20 41 4c 57 41 59 53 28 21 70  rOp && ALWAYS(!p
eba0: 2d 3e 70 4c 69 6d 69 74 20 26 26 21 70 2d 3e 70  ->pLimit &&!p->p
ebb0: 4f 66 66 73 65 74 29 20 29 7b 0a 20 20 20 20 20  Offset) ){.     
ebc0: 20 20 20 2f 2a 20 57 65 20 63 61 6e 20 72 65 75     /* We can reu
ebd0: 73 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74  se a temporary t
ebe0: 61 62 6c 65 20 67 65 6e 65 72 61 74 65 64 20 62  able generated b
ebf0: 79 20 61 20 53 45 4c 45 43 54 20 74 6f 20 6f 75  y a SELECT to ou
ec00: 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 69 67  r.        ** rig
ec10: 68 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ht..        */. 
ec20: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
ec30: 2d 3e 70 52 69 67 68 74 6d 6f 73 74 21 3d 70 20  ->pRightmost!=p 
ec40: 29 3b 20 20 2f 2a 20 43 61 6e 20 6f 6e 6c 79 20  );  /* Can only 
ec50: 68 61 70 70 65 6e 20 66 6f 72 20 6c 65 66 74 77  happen for leftw
ec60: 61 72 64 20 65 6c 65 6d 65 6e 74 73 0a 20 20 20  ard elements.   
ec70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ec80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ec90: 20 20 2a 2a 20 6f 66 20 61 20 33 2d 77 61 79 20    ** of a 3-way 
eca0: 6f 72 20 6d 6f 72 65 20 63 6f 6d 70 6f 75 6e 64  or more compound
ecb0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
ecc0: 72 74 28 20 70 2d 3e 70 4c 69 6d 69 74 3d 3d 30  rt( p->pLimit==0
ecd0: 20 29 3b 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20   );      /* Not 
ece0: 61 6c 6c 6f 77 65 64 20 6f 6e 20 6c 65 66 74 77  allowed on leftw
ecf0: 61 72 64 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a  ard elements */.
ed00: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
ed10: 70 2d 3e 70 4f 66 66 73 65 74 3d 3d 30 20 29 3b  p->pOffset==0 );
ed20: 20 20 20 20 20 2f 2a 20 4e 6f 74 20 61 6c 6c 6f       /* Not allo
ed30: 77 65 64 20 6f 6e 20 6c 65 66 74 77 61 72 64 20  wed on leftward 
ed40: 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20  elements */.    
ed50: 20 20 20 20 75 6e 69 6f 6e 54 61 62 20 3d 20 64      unionTab = d
ed60: 65 73 74 2e 69 53 44 50 61 72 6d 3b 0a 20 20 20  est.iSDParm;.   
ed70: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
ed80: 20 20 2f 2a 20 57 65 20 77 69 6c 6c 20 6e 65 65    /* We will nee
ed90: 64 20 74 6f 20 63 72 65 61 74 65 20 6f 75 72 20  d to create our 
eda0: 6f 77 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61  own temporary ta
edb0: 62 6c 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a  ble to hold the.
edc0: 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 74 65 72          ** inter
edd0: 6d 65 64 69 61 74 65 20 72 65 73 75 6c 74 73 2e  mediate results.
ede0: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
edf0: 20 20 20 20 75 6e 69 6f 6e 54 61 62 20 3d 20 70      unionTab = p
ee00: 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
ee10: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
ee20: 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b  ->pOrderBy==0 );
ee30: 0a 20 20 20 20 20 20 20 20 61 64 64 72 20 3d 20  .        addr = 
ee40: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
ee50: 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65  2(v, OP_OpenEphe
ee60: 6d 65 72 61 6c 2c 20 75 6e 69 6f 6e 54 61 62 2c  meral, unionTab,
ee70: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73   0);.        ass
ee80: 65 72 74 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e  ert( p->addrOpen
ee90: 45 70 68 6d 5b 30 5d 20 3d 3d 20 2d 31 20 29 3b  Ephm[0] == -1 );
eea0: 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 64 64 72  .        p->addr
eeb0: 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 61 64  OpenEphm[0] = ad
eec0: 64 72 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70  dr;.        p->p
eed0: 52 69 67 68 74 6d 6f 73 74 2d 3e 73 65 6c 46 6c  Rightmost->selFl
eee0: 61 67 73 20 7c 3d 20 53 46 5f 55 73 65 73 45 70  ags |= SF_UsesEp
eef0: 68 65 6d 65 72 61 6c 3b 0a 20 20 20 20 20 20 20  hemeral;.       
ef00: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69   assert( p->pELi
ef10: 73 74 20 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  st );.      }.. 
ef20: 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65       /* Code the
ef30: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
ef40: 74 73 20 74 6f 20 6f 75 72 20 6c 65 66 74 0a 20  ts to our left. 
ef50: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73       */.      as
ef60: 73 65 72 74 28 20 21 70 50 72 69 6f 72 2d 3e 70  sert( !pPrior->p
ef70: 4f 72 64 65 72 42 79 20 29 3b 0a 20 20 20 20 20  OrderBy );.     
ef80: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
ef90: 73 74 49 6e 69 74 28 26 75 6e 69 6f 6e 64 65 73  stInit(&uniondes
efa0: 74 2c 20 70 72 69 6f 72 4f 70 2c 20 75 6e 69 6f  t, priorOp, unio
efb0: 6e 54 61 62 29 3b 0a 20 20 20 20 20 20 65 78 70  nTab);.      exp
efc0: 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69  lainSetInteger(i
efd0: 53 75 62 31 2c 20 70 50 61 72 73 65 2d 3e 69 4e  Sub1, pParse->iN
efe0: 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20  extSelectId);.  
eff0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
f000: 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
f010: 50 72 69 6f 72 2c 20 26 75 6e 69 6f 6e 64 65 73  Prior, &uniondes
f020: 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  t);.      if( rc
f030: 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
f040: 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
f050: 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  d;.      }..    
f060: 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 63 75    /* Code the cu
f070: 72 72 65 6e 74 20 53 45 4c 45 43 54 20 73 74 61  rrent SELECT sta
f080: 74 65 6d 65 6e 74 0a 20 20 20 20 20 20 2a 2f 0a  tement.      */.
f090: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d        if( p->op=
f0a0: 3d 54 4b 5f 45 58 43 45 50 54 20 29 7b 0a 20 20  =TK_EXCEPT ){.  
f0b0: 20 20 20 20 20 20 6f 70 20 3d 20 53 52 54 5f 45        op = SRT_E
f0c0: 78 63 65 70 74 3b 0a 20 20 20 20 20 20 7d 65 6c  xcept;.      }el
f0d0: 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  se{.        asse
f0e0: 72 74 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e  rt( p->op==TK_UN
f0f0: 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 6f  ION );.        o
f100: 70 20 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20  p = SRT_Union;. 
f110: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e       }.      p->
f120: 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20  pPrior = 0;.    
f130: 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c    pLimit = p->pL
f140: 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70  imit;.      p->p
f150: 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20  Limit = 0;.     
f160: 20 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f   pOffset = p->pO
f170: 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e  ffset;.      p->
f180: 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20  pOffset = 0;.   
f190: 20 20 20 75 6e 69 6f 6e 64 65 73 74 2e 65 44 65     uniondest.eDe
f1a0: 73 74 20 3d 20 6f 70 3b 0a 20 20 20 20 20 20 65  st = op;.      e
f1b0: 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72  xplainSetInteger
f1c0: 28 69 53 75 62 32 2c 20 70 50 61 72 73 65 2d 3e  (iSub2, pParse->
f1d0: 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a  iNextSelectId);.
f1e0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
f1f0: 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
f200: 20 70 2c 20 26 75 6e 69 6f 6e 64 65 73 74 29 3b   p, &uniondest);
f210: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
f220: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
f230: 3b 0a 20 20 20 20 20 20 2f 2a 20 51 75 65 72 79  ;.      /* Query
f240: 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 6e 20 73   flattening in s
f250: 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29 20 6d  qlite3Select() m
f260: 69 67 68 74 20 72 65 66 69 6c 6c 20 70 2d 3e 70  ight refill p->p
f270: 4f 72 64 65 72 42 79 2e 0a 20 20 20 20 20 20 2a  OrderBy..      *
f280: 2a 20 42 65 20 73 75 72 65 20 74 6f 20 64 65 6c  * Be sure to del
f290: 65 74 65 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c  ete p->pOrderBy,
f2a0: 20 74 68 65 72 65 66 6f 72 65 2c 20 74 6f 20 61   therefore, to a
f2b0: 76 6f 69 64 20 61 20 6d 65 6d 6f 72 79 20 6c 65  void a memory le
f2c0: 61 6b 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  ak. */.      sql
f2d0: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
f2e0: 74 65 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72  te(db, p->pOrder
f2f0: 42 79 29 3b 0a 20 20 20 20 20 20 70 44 65 6c 65  By);.      pDele
f300: 74 65 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a  te = p->pPrior;.
f310: 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20        p->pPrior 
f320: 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20  = pPrior;.      
f330: 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b  p->pOrderBy = 0;
f340: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6f 70  .      if( p->op
f350: 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 20 70 2d 3e  ==TK_UNION ) p->
f360: 6e 53 65 6c 65 63 74 52 6f 77 20 2b 3d 20 70 50  nSelectRow += pP
f370: 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  rior->nSelectRow
f380: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
f390: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  xprDelete(db, p-
f3a0: 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20  >pLimit);.      
f3b0: 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d  p->pLimit = pLim
f3c0: 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66  it;.      p->pOf
f3d0: 66 73 65 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a  fset = pOffset;.
f3e0: 20 20 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20        p->iLimit 
f3f0: 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4f  = 0;.      p->iO
f400: 66 66 73 65 74 20 3d 20 30 3b 0a 0a 20 20 20 20  ffset = 0;..    
f410: 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68 65    /* Convert the
f420: 20 64 61 74 61 20 69 6e 20 74 68 65 20 74 65 6d   data in the tem
f430: 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 6e 74  porary table int
f440: 6f 20 77 68 61 74 65 76 65 72 20 66 6f 72 6d 0a  o whatever form.
f450: 20 20 20 20 20 20 2a 2a 20 69 74 20 69 73 20 74        ** it is t
f460: 68 61 74 20 77 65 20 63 75 72 72 65 6e 74 6c 79  hat we currently
f470: 20 6e 65 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a   need..      */.
f480: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 75 6e        assert( un
f490: 69 6f 6e 54 61 62 3d 3d 64 65 73 74 2e 69 53 44  ionTab==dest.iSD
f4a0: 50 61 72 6d 20 7c 7c 20 64 65 73 74 2e 65 44 65  Parm || dest.eDe
f4b0: 73 74 21 3d 70 72 69 6f 72 4f 70 20 29 3b 0a 20  st!=priorOp );. 
f4c0: 20 20 20 20 20 69 66 28 20 64 65 73 74 2e 65 44       if( dest.eD
f4d0: 65 73 74 21 3d 70 72 69 6f 72 4f 70 20 29 7b 0a  est!=priorOp ){.
f4e0: 20 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6e          int iCon
f4f0: 74 2c 20 69 42 72 65 61 6b 2c 20 69 53 74 61 72  t, iBreak, iStar
f500: 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  t;.        asser
f510: 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a  t( p->pEList );.
f520: 20 20 20 20 20 20 20 20 69 66 28 20 64 65 73 74          if( dest
f530: 2e 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70  .eDest==SRT_Outp
f540: 75 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ut ){.          
f550: 53 65 6c 65 63 74 20 2a 70 46 69 72 73 74 20 3d  Select *pFirst =
f560: 20 70 3b 0a 20 20 20 20 20 20 20 20 20 20 77 68   p;.          wh
f570: 69 6c 65 28 20 70 46 69 72 73 74 2d 3e 70 50 72  ile( pFirst->pPr
f580: 69 6f 72 20 29 20 70 46 69 72 73 74 20 3d 20 70  ior ) pFirst = p
f590: 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 3b 0a 20  First->pPrior;. 
f5a0: 20 20 20 20 20 20 20 20 20 67 65 6e 65 72 61 74           generat
f5b0: 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61  eColumnNames(pPa
f5c0: 72 73 65 2c 20 30 2c 20 70 46 69 72 73 74 2d 3e  rse, 0, pFirst->
f5d0: 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 20  pEList);.       
f5e0: 20 7d 0a 20 20 20 20 20 20 20 20 69 42 72 65 61   }.        iBrea
f5f0: 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  k = sqlite3VdbeM
f600: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
f610: 20 20 20 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c       iCont = sql
f620: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
f630: 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20 63 6f  l(v);.        co
f640: 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74  mputeLimitRegist
f650: 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20 69  ers(pParse, p, i
f660: 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20  Break);.        
f670: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
f680: 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20  2(v, OP_Rewind, 
f690: 75 6e 69 6f 6e 54 61 62 2c 20 69 42 72 65 61 6b  unionTab, iBreak
f6a0: 29 3b 0a 20 20 20 20 20 20 20 20 69 53 74 61 72  );.        iStar
f6b0: 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  t = sqlite3VdbeC
f6c0: 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
f6d0: 20 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e         selectInn
f6e0: 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70  erLoop(pParse, p
f6f0: 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 75 6e 69  , p->pEList, uni
f700: 6f 6e 54 61 62 2c 20 70 2d 3e 70 45 4c 69 73 74  onTab, p->pEList
f710: 2d 3e 6e 45 78 70 72 2c 0a 20 20 20 20 20 20 20  ->nExpr,.       
f720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f730: 20 30 2c 20 30 2c 20 26 64 65 73 74 2c 20 69 43   0, 0, &dest, iC
f740: 6f 6e 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20  ont, iBreak);.  
f750: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
f760: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
f770: 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20 20   iCont);.       
f780: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
f790: 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 75  p2(v, OP_Next, u
f7a0: 6e 69 6f 6e 54 61 62 2c 20 69 53 74 61 72 74 29  nionTab, iStart)
f7b0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
f7c0: 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
f7d0: 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20  l(v, iBreak);.  
f7e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
f7f0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c  eAddOp2(v, OP_Cl
f800: 6f 73 65 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30  ose, unionTab, 0
f810: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
f820: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
f830: 20 20 64 65 66 61 75 6c 74 3a 20 61 73 73 65 72    default: asser
f840: 74 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54  t( p->op==TK_INT
f850: 45 52 53 45 43 54 20 29 3b 20 7b 0a 20 20 20 20  ERSECT ); {.    
f860: 20 20 69 6e 74 20 74 61 62 31 2c 20 74 61 62 32    int tab1, tab2
f870: 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6e  ;.      int iCon
f880: 74 2c 20 69 42 72 65 61 6b 2c 20 69 53 74 61 72  t, iBreak, iStar
f890: 74 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  t;.      Expr *p
f8a0: 4c 69 6d 69 74 2c 20 2a 70 4f 66 66 73 65 74 3b  Limit, *pOffset;
f8b0: 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b  .      int addr;
f8c0: 0a 20 20 20 20 20 20 53 65 6c 65 63 74 44 65 73  .      SelectDes
f8d0: 74 20 69 6e 74 65 72 73 65 63 74 64 65 73 74 3b  t intersectdest;
f8e0: 0a 20 20 20 20 20 20 69 6e 74 20 72 31 3b 0a 0a  .      int r1;..
f8f0: 20 20 20 20 20 20 2f 2a 20 49 4e 54 45 52 53 45        /* INTERSE
f900: 43 54 20 69 73 20 64 69 66 66 65 72 65 6e 74 20  CT is different 
f910: 66 72 6f 6d 20 74 68 65 20 6f 74 68 65 72 73 20  from the others 
f920: 73 69 6e 63 65 20 69 74 20 72 65 71 75 69 72 65  since it require
f930: 73 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f 20 74  s.      ** two t
f940: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 2e  emporary tables.
f950: 20 20 48 65 6e 63 65 20 69 74 20 68 61 73 20 69    Hence it has i
f960: 74 73 20 6f 77 6e 20 63 61 73 65 2e 20 20 42 65  ts own case.  Be
f970: 67 69 6e 0a 20 20 20 20 20 20 2a 2a 20 62 79 20  gin.      ** by 
f980: 61 6c 6c 6f 63 61 74 69 6e 67 20 74 68 65 20 74  allocating the t
f990: 61 62 6c 65 73 20 77 65 20 77 69 6c 6c 20 6e 65  ables we will ne
f9a0: 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ed..      */.   
f9b0: 20 20 20 74 61 62 31 20 3d 20 70 50 61 72 73 65     tab1 = pParse
f9c0: 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20  ->nTab++;.      
f9d0: 74 61 62 32 20 3d 20 70 50 61 72 73 65 2d 3e 6e  tab2 = pParse->n
f9e0: 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 61 73 73  Tab++;.      ass
f9f0: 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79  ert( p->pOrderBy
fa00: 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 20 20 61 64  ==0 );..      ad
fa10: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
fa20: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65  AddOp2(v, OP_Ope
fa30: 6e 45 70 68 65 6d 65 72 61 6c 2c 20 74 61 62 31  nEphemeral, tab1
fa40: 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65  , 0);.      asse
fa50: 72 74 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45  rt( p->addrOpenE
fa60: 70 68 6d 5b 30 5d 20 3d 3d 20 2d 31 20 29 3b 0a  phm[0] == -1 );.
fa70: 20 20 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65        p->addrOpe
fa80: 6e 45 70 68 6d 5b 30 5d 20 3d 20 61 64 64 72 3b  nEphm[0] = addr;
fa90: 0a 20 20 20 20 20 20 70 2d 3e 70 52 69 67 68 74  .      p->pRight
faa0: 6d 6f 73 74 2d 3e 73 65 6c 46 6c 61 67 73 20 7c  most->selFlags |
fab0: 3d 20 53 46 5f 55 73 65 73 45 70 68 65 6d 65 72  = SF_UsesEphemer
fac0: 61 6c 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  al;.      assert
fad0: 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 0a  ( p->pEList );..
fae0: 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68        /* Code th
faf0: 65 20 53 45 4c 45 43 54 73 20 74 6f 20 6f 75 72  e SELECTs to our
fb00: 20 6c 65 66 74 20 69 6e 74 6f 20 74 65 6d 70 6f   left into tempo
fb10: 72 61 72 79 20 74 61 62 6c 65 20 22 74 61 62 31  rary table "tab1
fb20: 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  "..      */.    
fb30: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
fb40: 65 73 74 49 6e 69 74 28 26 69 6e 74 65 72 73 65  estInit(&interse
fb50: 63 74 64 65 73 74 2c 20 53 52 54 5f 55 6e 69 6f  ctdest, SRT_Unio
fb60: 6e 2c 20 74 61 62 31 29 3b 0a 20 20 20 20 20 20  n, tab1);.      
fb70: 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65  explainSetIntege
fb80: 72 28 69 53 75 62 31 2c 20 70 50 61 72 73 65 2d  r(iSub1, pParse-
fb90: 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b  >iNextSelectId);
fba0: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
fbb0: 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
fbc0: 2c 20 70 50 72 69 6f 72 2c 20 26 69 6e 74 65 72  , pPrior, &inter
fbd0: 73 65 63 74 64 65 73 74 29 3b 0a 20 20 20 20 20  sectdest);.     
fbe0: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
fbf0: 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
fc00: 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
fc10: 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65  }..      /* Code
fc20: 20 74 68 65 20 63 75 72 72 65 6e 74 20 53 45 4c   the current SEL
fc30: 45 43 54 20 69 6e 74 6f 20 74 65 6d 70 6f 72 61  ECT into tempora
fc40: 72 79 20 74 61 62 6c 65 20 22 74 61 62 32 22 0a  ry table "tab2".
fc50: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61        */.      a
fc60: 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
fc70: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70  eAddOp2(v, OP_Op
fc80: 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 74 61 62  enEphemeral, tab
fc90: 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 73 73  2, 0);.      ass
fca0: 65 72 74 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e  ert( p->addrOpen
fcb0: 45 70 68 6d 5b 31 5d 20 3d 3d 20 2d 31 20 29 3b  Ephm[1] == -1 );
fcc0: 0a 20 20 20 20 20 20 70 2d 3e 61 64 64 72 4f 70  .      p->addrOp
fcd0: 65 6e 45 70 68 6d 5b 31 5d 20 3d 20 61 64 64 72  enEphm[1] = addr
fce0: 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f  ;.      p->pPrio
fcf0: 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4c 69  r = 0;.      pLi
fd00: 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b  mit = p->pLimit;
fd10: 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74  .      p->pLimit
fd20: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f 66 66   = 0;.      pOff
fd30: 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74  set = p->pOffset
fd40: 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73  ;.      p->pOffs
fd50: 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e  et = 0;.      in
fd60: 74 65 72 73 65 63 74 64 65 73 74 2e 69 53 44 50  tersectdest.iSDP
fd70: 61 72 6d 20 3d 20 74 61 62 32 3b 0a 20 20 20 20  arm = tab2;.    
fd80: 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65    explainSetInte
fd90: 67 65 72 28 69 53 75 62 32 2c 20 70 50 61 72 73  ger(iSub2, pPars
fda0: 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64  e->iNextSelectId
fdb0: 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
fdc0: 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
fdd0: 73 65 2c 20 70 2c 20 26 69 6e 74 65 72 73 65 63  se, p, &intersec
fde0: 74 64 65 73 74 29 3b 0a 20 20 20 20 20 20 74 65  tdest);.      te
fdf0: 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49  stcase( rc!=SQLI
fe00: 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 70  TE_OK );.      p
fe10: 44 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50 72 69  Delete = p->pPri
fe20: 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72  or;.      p->pPr
fe30: 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20  ior = pPrior;.  
fe40: 20 20 20 20 69 66 28 20 70 2d 3e 6e 53 65 6c 65      if( p->nSele
fe50: 63 74 52 6f 77 3e 70 50 72 69 6f 72 2d 3e 6e 53  ctRow>pPrior->nS
fe60: 65 6c 65 63 74 52 6f 77 20 29 20 70 2d 3e 6e 53  electRow ) p->nS
fe70: 65 6c 65 63 74 52 6f 77 20 3d 20 70 50 72 69 6f  electRow = pPrio
fe80: 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20  r->nSelectRow;. 
fe90: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
fea0: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c  Delete(db, p->pL
feb0: 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e  imit);.      p->
fec0: 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b  pLimit = pLimit;
fed0: 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65  .      p->pOffse
fee0: 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a 0a 20 20  t = pOffset;..  
fef0: 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
ff00: 63 6f 64 65 20 74 6f 20 74 61 6b 65 20 74 68 65  code to take the
ff10: 20 69 6e 74 65 72 73 65 63 74 69 6f 6e 20 6f 66   intersection of
ff20: 20 74 68 65 20 74 77 6f 20 74 65 6d 70 6f 72 61   the two tempora
ff30: 72 79 0a 20 20 20 20 20 20 2a 2a 20 74 61 62 6c  ry.      ** tabl
ff40: 65 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  es..      */.   
ff50: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45     assert( p->pE
ff60: 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20 69 66  List );.      if
ff70: 28 20 64 65 73 74 2e 65 44 65 73 74 3d 3d 53 52  ( dest.eDest==SR
ff80: 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20  T_Output ){.    
ff90: 20 20 20 20 53 65 6c 65 63 74 20 2a 70 46 69 72      Select *pFir
ffa0: 73 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20  st = p;.        
ffb0: 77 68 69 6c 65 28 20 70 46 69 72 73 74 2d 3e 70  while( pFirst->p
ffc0: 50 72 69 6f 72 20 29 20 70 46 69 72 73 74 20 3d  Prior ) pFirst =
ffd0: 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 3b   pFirst->pPrior;
ffe0: 0a 20 20 20 20 20 20 20 20 67 65 6e 65 72 61 74  .        generat
fff0: 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61  eColumnNames(pPa
10000 72 73 65 2c 20 30 2c 20 70 46 69 72 73 74 2d 3e  rse, 0, pFirst->
10010 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 7d  pEList);.      }
10020 0a 20 20 20 20 20 20 69 42 72 65 61 6b 20 3d 20  .      iBreak = 
10030 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
10040 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69  abel(v);.      i
10050 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64  Cont = sqlite3Vd
10060 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
10070 20 20 20 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d        computeLim
10080 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72  itRegisters(pPar
10090 73 65 2c 20 70 2c 20 69 42 72 65 61 6b 29 3b 0a  se, p, iBreak);.
100a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
100b0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65  eAddOp2(v, OP_Re
100c0 77 69 6e 64 2c 20 74 61 62 31 2c 20 69 42 72 65  wind, tab1, iBre
100d0 61 6b 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20  ak);.      r1 = 
100e0 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
100f0 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
10100 20 69 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65   iStart = sqlite
10110 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
10120 50 5f 52 6f 77 4b 65 79 2c 20 74 61 62 31 2c 20  P_RowKey, tab1, 
10130 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  r1);.      sqlit
10140 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
10150 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20  v, OP_NotFound, 
10160 74 61 62 32 2c 20 69 43 6f 6e 74 2c 20 72 31 2c  tab2, iCont, r1,
10170 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
10180 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
10190 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20  (pParse, r1);.  
101a0 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c      selectInnerL
101b0 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70  oop(pParse, p, p
101c0 2d 3e 70 45 4c 69 73 74 2c 20 74 61 62 31 2c 20  ->pEList, tab1, 
101d0 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
101e0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
101f0 20 20 20 20 20 20 20 20 30 2c 20 30 2c 20 26 64          0, 0, &d
10200 65 73 74 2c 20 69 43 6f 6e 74 2c 20 69 42 72 65  est, iCont, iBre
10210 61 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ak);.      sqlit
10220 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
10230 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20  el(v, iCont);.  
10240 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
10250 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74  ddOp2(v, OP_Next
10260 2c 20 74 61 62 31 2c 20 69 53 74 61 72 74 29 3b  , tab1, iStart);
10270 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
10280 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
10290 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20  , iBreak);.     
102a0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
102b0 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  p2(v, OP_Close, 
102c0 74 61 62 32 2c 20 30 29 3b 0a 20 20 20 20 20 20  tab2, 0);.      
102d0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
102e0 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74  2(v, OP_Close, t
102f0 61 62 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 62  ab1, 0);.      b
10300 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
10310 0a 20 20 65 78 70 6c 61 69 6e 43 6f 6d 70 6f 73  .  explainCompos
10320 69 74 65 28 70 50 61 72 73 65 2c 20 70 2d 3e 6f  ite(pParse, p->o
10330 70 2c 20 69 53 75 62 31 2c 20 69 53 75 62 32 2c  p, iSub1, iSub2,
10340 20 70 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29 3b   p->op!=TK_ALL);
10350 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 63  ..  /* Compute c
10360 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
10370 65 73 20 75 73 65 64 20 62 79 20 0a 20 20 2a 2a  es used by .  **
10380 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
10390 73 20 6e 65 65 64 65 64 20 74 6f 20 69 6d 70 6c  s needed to impl
103a0 65 6d 65 6e 74 20 74 68 65 20 63 6f 6d 70 6f 75  ement the compou
103b0 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2a 20  nd select..  ** 
103c0 41 74 74 61 63 68 20 74 68 65 20 4b 65 79 49 6e  Attach the KeyIn
103d0 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 6f 20  fo structure to 
103e0 61 6c 6c 20 74 65 6d 70 6f 72 61 72 79 20 74 61  all temporary ta
103f0 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  bles..  **.  ** 
10400 54 68 69 73 20 73 65 63 74 69 6f 6e 20 69 73 20  This section is 
10410 72 75 6e 20 62 79 20 74 68 65 20 72 69 67 68 74  run by the right
10420 2d 6d 6f 73 74 20 53 45 4c 45 43 54 20 73 74 61  -most SELECT sta
10430 74 65 6d 65 6e 74 20 6f 6e 6c 79 2e 0a 20 20 2a  tement only..  *
10440 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  * SELECT stateme
10450 6e 74 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20  nts to the left 
10460 61 6c 77 61 79 73 20 73 6b 69 70 20 74 68 69 73  always skip this
10470 20 70 61 72 74 2e 20 20 54 68 65 20 72 69 67 68   part.  The righ
10480 74 2d 6d 6f 73 74 0a 20 20 2a 2a 20 53 45 4c 45  t-most.  ** SELE
10490 43 54 20 6d 69 67 68 74 20 61 6c 73 6f 20 73 6b  CT might also sk
104a0 69 70 20 74 68 69 73 20 70 61 72 74 20 69 66 20  ip this part if 
104b0 69 74 20 68 61 73 20 6e 6f 20 4f 52 44 45 52 20  it has no ORDER 
104c0 42 59 20 63 6c 61 75 73 65 20 61 6e 64 0a 20 20  BY clause and.  
104d0 2a 2a 20 6e 6f 20 74 65 6d 70 20 74 61 62 6c 65  ** no temp table
104e0 73 20 61 72 65 20 72 65 71 75 69 72 65 64 2e 0a  s are required..
104f0 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65    */.  if( p->se
10500 6c 46 6c 61 67 73 20 26 20 53 46 5f 55 73 65 73  lFlags & SF_Uses
10510 45 70 68 65 6d 65 72 61 6c 20 29 7b 0a 20 20 20  Ephemeral ){.   
10520 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
10530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10540 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
10550 2f 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70  /.    KeyInfo *p
10560 4b 65 79 49 6e 66 6f 3b 20 20 20 20 20 20 20 20  KeyInfo;        
10570 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67      /* Collating
10580 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68   sequence for th
10590 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a  e result set */.
105a0 20 20 20 20 53 65 6c 65 63 74 20 2a 70 4c 6f 6f      Select *pLoo
105b0 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
105c0 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67    /* For looping
105d0 20 74 68 72 6f 75 67 68 20 53 45 4c 45 43 54 20   through SELECT 
105e0 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 20 20  statements */.  
105f0 20 20 43 6f 6c 6c 53 65 71 20 2a 2a 61 70 43 6f    CollSeq **apCo
10600 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
10610 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 74  /* For looping t
10620 68 72 6f 75 67 68 20 70 4b 65 79 49 6e 66 6f 2d  hrough pKeyInfo-
10630 3e 61 43 6f 6c 6c 5b 5d 20 2a 2f 0a 20 20 20 20  >aColl[] */.    
10640 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20  int nCol;       
10650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10660 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   Number of colum
10670 6e 73 20 69 6e 20 72 65 73 75 6c 74 20 73 65 74  ns in result set
10680 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28   */..    assert(
10690 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 3d 3d   p->pRightmost==
106a0 70 20 29 3b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20  p );.    nCol = 
106b0 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
106c0 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d  ;.    pKeyInfo =
106d0 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
106e0 5a 65 72 6f 28 64 62 2c 0a 20 20 20 20 20 20 20  Zero(db,.       
106f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10700 73 69 7a 65 6f 66 28 2a 70 4b 65 79 49 6e 66 6f  sizeof(*pKeyInfo
10710 29 2b 6e 43 6f 6c 2a 28 73 69 7a 65 6f 66 28 43  )+nCol*(sizeof(C
10720 6f 6c 6c 53 65 71 2a 29 20 2b 20 31 29 29 3b 0a  ollSeq*) + 1));.
10730 20 20 20 20 69 66 28 20 21 70 4b 65 79 49 6e 66      if( !pKeyInf
10740 6f 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  o ){.      rc = 
10750 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
10760 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
10770 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d  elect_end;.    }
10780 0a 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e  ..    pKeyInfo->
10790 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20  enc = ENC(db);. 
107a0 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69     pKeyInfo->nFi
107b0 65 6c 64 20 3d 20 28 75 31 36 29 6e 43 6f 6c 3b  eld = (u16)nCol;
107c0 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 61  ..    for(i=0, a
107d0 70 43 6f 6c 6c 3d 70 4b 65 79 49 6e 66 6f 2d 3e  pColl=pKeyInfo->
107e0 61 43 6f 6c 6c 3b 20 69 3c 6e 43 6f 6c 3b 20 69  aColl; i<nCol; i
107f0 2b 2b 2c 20 61 70 43 6f 6c 6c 2b 2b 29 7b 0a 20  ++, apColl++){. 
10800 20 20 20 20 20 2a 61 70 43 6f 6c 6c 20 3d 20 6d       *apColl = m
10810 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65  ultiSelectCollSe
10820 71 28 70 50 61 72 73 65 2c 20 70 2c 20 69 29 3b  q(pParse, p, i);
10830 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 2a 61  .      if( 0==*a
10840 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20  pColl ){.       
10850 20 2a 61 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70   *apColl = db->p
10860 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  DfltColl;.      
10870 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 4b 65 79  }.    }.    pKey
10880 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72  Info->aSortOrder
10890 20 3d 20 28 75 38 2a 29 61 70 43 6f 6c 6c 3b 0a   = (u8*)apColl;.
108a0 0a 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70  .    for(pLoop=p
108b0 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70  ; pLoop; pLoop=p
108c0 4c 6f 6f 70 2d 3e 70 50 72 69 6f 72 29 7b 0a 20  Loop->pPrior){. 
108d0 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
108e0 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  2; i++){.       
108f0 20 69 6e 74 20 61 64 64 72 20 3d 20 70 4c 6f 6f   int addr = pLoo
10900 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
10910 69 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  i];.        if( 
10920 61 64 64 72 3c 30 20 29 7b 0a 20 20 20 20 20 20  addr<0 ){.      
10930 20 20 20 20 2f 2a 20 49 66 20 5b 30 5d 20 69 73      /* If [0] is
10940 20 75 6e 75 73 65 64 20 74 68 65 6e 20 5b 31 5d   unused then [1]
10950 20 69 73 20 61 6c 73 6f 20 75 6e 75 73 65 64 2e   is also unused.
10960 20 20 53 6f 20 77 65 20 63 61 6e 0a 20 20 20 20    So we can.    
10970 20 20 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20        ** always 
10980 73 61 66 65 6c 79 20 61 62 6f 72 74 20 61 73 20  safely abort as 
10990 73 6f 6f 6e 20 61 73 20 74 68 65 20 66 69 72 73  soon as the firs
109a0 74 20 75 6e 75 73 65 64 20 73 6c 6f 74 20 69 73  t unused slot is
109b0 20 66 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20   found */.      
109c0 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 6f      assert( pLoo
109d0 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
109e0 31 5d 3c 30 20 29 3b 0a 20 20 20 20 20 20 20 20  1]<0 );.        
109f0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
10a00 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
10a10 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 76  e3VdbeChangeP2(v
10a20 2c 20 61 64 64 72 2c 20 6e 43 6f 6c 29 3b 0a 20  , addr, nCol);. 
10a30 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
10a40 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 61 64  beChangeP4(v, ad
10a50 64 72 2c 20 28 63 68 61 72 2a 29 70 4b 65 79 49  dr, (char*)pKeyI
10a60 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29  nfo, P4_KEYINFO)
10a70 3b 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d  ;.        pLoop-
10a80 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 69 5d  >addrOpenEphm[i]
10a90 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20   = -1;.      }. 
10aa0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
10ab0 44 62 46 72 65 65 28 64 62 2c 20 70 4b 65 79 49  DbFree(db, pKeyI
10ac0 6e 66 6f 29 3b 0a 20 20 7d 0a 0a 6d 75 6c 74 69  nfo);.  }..multi
10ad0 5f 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 20 20 70  _select_end:.  p
10ae0 44 65 73 74 2d 3e 69 53 64 73 74 20 3d 20 64 65  Dest->iSdst = de
10af0 73 74 2e 69 53 64 73 74 3b 0a 20 20 70 44 65 73  st.iSdst;.  pDes
10b00 74 2d 3e 6e 53 64 73 74 20 3d 20 64 65 73 74 2e  t->nSdst = dest.
10b10 6e 53 64 73 74 3b 0a 20 20 73 71 6c 69 74 65 33  nSdst;.  sqlite3
10b20 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c  SelectDelete(db,
10b30 20 70 44 65 6c 65 74 65 29 3b 0a 20 20 72 65 74   pDelete);.  ret
10b40 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
10b50 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
10b60 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20  COMPOUND_SELECT 
10b70 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61  */../*.** Code a
10b80 6e 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74  n output subrout
10b90 69 6e 65 20 66 6f 72 20 61 20 63 6f 72 6f 75 74  ine for a corout
10ba0 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ine implementati
10bb0 6f 6e 20 6f 66 20 61 0a 2a 2a 20 53 45 4c 45 43  on of a.** SELEC
10bc0 54 20 73 74 61 74 6d 65 6e 74 2e 0a 2a 2a 0a 2a  T statment..**.*
10bd0 2a 20 54 68 65 20 64 61 74 61 20 74 6f 20 62 65  * The data to be
10be0 20 6f 75 74 70 75 74 20 69 73 20 63 6f 6e 74 61   output is conta
10bf0 69 6e 65 64 20 69 6e 20 70 49 6e 2d 3e 69 53 64  ined in pIn->iSd
10c00 73 74 2e 20 20 54 68 65 72 65 20 61 72 65 0a 2a  st.  There are.*
10c10 2a 20 70 49 6e 2d 3e 6e 53 64 73 74 20 63 6f 6c  * pIn->nSdst col
10c20 75 6d 6e 73 20 74 6f 20 62 65 20 6f 75 74 70 75  umns to be outpu
10c30 74 2e 20 20 70 44 65 73 74 20 69 73 20 77 68 65  t.  pDest is whe
10c40 72 65 20 74 68 65 20 6f 75 74 70 75 74 20 73 68  re the output sh
10c50 6f 75 6c 64 0a 2a 2a 20 62 65 20 73 65 6e 74 2e  ould.** be sent.
10c60 0a 2a 2a 0a 2a 2a 20 72 65 67 52 65 74 75 72 6e  .**.** regReturn
10c70 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
10c80 66 20 74 68 65 20 72 65 67 69 73 74 65 72 20 68  f the register h
10c90 6f 6c 64 69 6e 67 20 74 68 65 20 73 75 62 72 6f  olding the subro
10ca0 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 20  utine.** return 
10cb0 61 64 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49  address..**.** I
10cc0 66 20 72 65 67 50 72 65 76 3e 30 20 74 68 65 6e  f regPrev>0 then
10cd0 20 69 74 20 69 73 20 74 68 65 20 66 69 72 73 74   it is the first
10ce0 20 72 65 67 69 73 74 65 72 20 69 6e 20 61 20 76   register in a v
10cf0 65 63 74 6f 72 20 74 68 61 74 0a 2a 2a 20 72 65  ector that.** re
10d00 63 6f 72 64 73 20 74 68 65 20 70 72 65 76 69 6f  cords the previo
10d10 75 73 20 6f 75 74 70 75 74 2e 20 20 6d 65 6d 5b  us output.  mem[
10d20 72 65 67 50 72 65 76 5d 20 69 73 20 61 20 66 6c  regPrev] is a fl
10d30 61 67 20 74 68 61 74 20 69 73 20 66 61 6c 73 65  ag that is false
10d40 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 68 61 73  .** if there has
10d50 20 62 65 65 6e 20 6e 6f 20 70 72 65 76 69 6f 75   been no previou
10d60 73 20 6f 75 74 70 75 74 2e 20 20 49 66 20 72 65  s output.  If re
10d70 67 50 72 65 76 3e 30 20 74 68 65 6e 20 63 6f 64  gPrev>0 then cod
10d80 65 20 69 73 0a 2a 2a 20 67 65 6e 65 72 61 74 65  e is.** generate
10d90 64 20 74 6f 20 73 75 70 70 72 65 73 73 20 64 75  d to suppress du
10da0 70 6c 69 63 61 74 65 73 2e 20 20 70 4b 65 79 49  plicates.  pKeyI
10db0 6e 66 6f 20 69 73 20 75 73 65 64 20 66 6f 72 20  nfo is used for 
10dc0 63 6f 6d 70 61 72 69 6e 67 0a 2a 2a 20 6b 65 79  comparing.** key
10dd0 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  s..**.** If the 
10de0 4c 49 4d 49 54 20 66 6f 75 6e 64 20 69 6e 20 70  LIMIT found in p
10df0 2d 3e 69 4c 69 6d 69 74 20 69 73 20 72 65 61 63  ->iLimit is reac
10e00 68 65 64 2c 20 6a 75 6d 70 20 69 6d 6d 65 64 69  hed, jump immedi
10e10 61 74 65 6c 79 20 74 6f 0a 2a 2a 20 69 42 72 65  ately to.** iBre
10e20 61 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ak..*/.static in
10e30 74 20 67 65 6e 65 72 61 74 65 4f 75 74 70 75 74  t generateOutput
10e40 53 75 62 72 6f 75 74 69 6e 65 28 0a 20 20 50 61  Subroutine(.  Pa
10e50 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
10e60 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
10e70 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
10e80 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
10e90 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c        /* The SEL
10ea0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  ECT statement */
10eb0 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70  .  SelectDest *p
10ec0 49 6e 2c 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  In,        /* Co
10ed0 72 6f 75 74 69 6e 65 20 73 75 70 70 6c 79 69 6e  routine supplyin
10ee0 67 20 64 61 74 61 20 2a 2f 0a 20 20 53 65 6c 65  g data */.  Sele
10ef0 63 74 44 65 73 74 20 2a 70 44 65 73 74 2c 20 20  ctDest *pDest,  
10f00 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20      /* Where to 
10f10 73 65 6e 64 20 74 68 65 20 64 61 74 61 20 2a 2f  send the data */
10f20 0a 20 20 69 6e 74 20 72 65 67 52 65 74 75 72 6e  .  int regReturn
10f30 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ,          /* Th
10f40 65 20 72 65 74 75 72 6e 20 61 64 64 72 65 73 73  e return address
10f50 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 69   register */.  i
10f60 6e 74 20 72 65 67 50 72 65 76 2c 20 20 20 20 20  nt regPrev,     
10f70 20 20 20 20 20 20 20 2f 2a 20 50 72 65 76 69 6f         /* Previo
10f80 75 73 20 72 65 73 75 6c 74 20 72 65 67 69 73 74  us result regist
10f90 65 72 2e 20 20 4e 6f 20 75 6e 69 71 75 65 6e 65  er.  No uniquene
10fa0 73 73 20 69 66 20 30 20 2a 2f 0a 20 20 4b 65 79  ss if 0 */.  Key
10fb0 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20  Info *pKeyInfo, 
10fc0 20 20 20 20 20 2f 2a 20 46 6f 72 20 63 6f 6d 70       /* For comp
10fd0 61 72 69 6e 67 20 77 69 74 68 20 70 72 65 76 69  aring with previ
10fe0 6f 75 73 20 65 6e 74 72 79 20 2a 2f 0a 20 20 69  ous entry */.  i
10ff0 6e 74 20 70 34 74 79 70 65 2c 20 20 20 20 20 20  nt p4type,      
11000 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 34         /* The p4
11010 20 74 79 70 65 20 66 6f 72 20 70 4b 65 79 49 6e   type for pKeyIn
11020 66 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 42 72 65  fo */.  int iBre
11030 61 6b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ak              
11040 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20  /* Jump here if 
11050 77 65 20 68 69 74 20 74 68 65 20 4c 49 4d 49 54  we hit the LIMIT
11060 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76   */.){.  Vdbe *v
11070 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
11080 3b 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75  ;.  int iContinu
11090 65 3b 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 0a  e;.  int addr;..
110a0 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
110b0 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
110c0 76 29 3b 0a 20 20 69 43 6f 6e 74 69 6e 75 65 20  v);.  iContinue 
110d0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
110e0 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 2f 2a  eLabel(v);..  /*
110f0 20 53 75 70 70 72 65 73 73 20 64 75 70 6c 69 63   Suppress duplic
11100 61 74 65 73 20 66 6f 72 20 55 4e 49 4f 4e 2c 20  ates for UNION, 
11110 45 58 43 45 50 54 2c 20 61 6e 64 20 49 4e 54 45  EXCEPT, and INTE
11120 52 53 45 43 54 20 0a 20 20 2a 2f 0a 20 20 69 66  RSECT .  */.  if
11130 28 20 72 65 67 50 72 65 76 20 29 7b 0a 20 20 20  ( regPrev ){.   
11140 20 69 6e 74 20 6a 31 2c 20 6a 32 3b 0a 20 20 20   int j1, j2;.   
11150 20 6a 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62   j1 = sqlite3Vdb
11160 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66  eAddOp1(v, OP_If
11170 4e 6f 74 2c 20 72 65 67 50 72 65 76 29 3b 0a 20  Not, regPrev);. 
11180 20 20 20 6a 32 20 3d 20 73 71 6c 69 74 65 33 56     j2 = sqlite3V
11190 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
111a0 43 6f 6d 70 61 72 65 2c 20 70 49 6e 2d 3e 69 53  Compare, pIn->iS
111b0 64 73 74 2c 20 72 65 67 50 72 65 76 2b 31 2c 20  dst, regPrev+1, 
111c0 70 49 6e 2d 3e 6e 53 64 73 74 2c 0a 20 20 20 20  pIn->nSdst,.    
111d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
111e0 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
111f0 29 70 4b 65 79 49 6e 66 6f 2c 20 70 34 74 79 70  )pKeyInfo, p4typ
11200 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  e);.    sqlite3V
11210 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
11220 4a 75 6d 70 2c 20 6a 32 2b 32 2c 20 69 43 6f 6e  Jump, j2+2, iCon
11230 74 69 6e 75 65 2c 20 6a 32 2b 32 29 3b 0a 20 20  tinue, j2+2);.  
11240 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
11250 70 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a 20 20  pHere(v, j1);.  
11260 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
11270 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20  Op3(v, OP_Copy, 
11280 70 49 6e 2d 3e 69 53 64 73 74 2c 20 72 65 67 50  pIn->iSdst, regP
11290 72 65 76 2b 31 2c 20 70 49 6e 2d 3e 6e 53 64 73  rev+1, pIn->nSds
112a0 74 2d 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  t-1);.    sqlite
112b0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
112c0 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 72 65  P_Integer, 1, re
112d0 67 50 72 65 76 29 3b 0a 20 20 7d 0a 20 20 69 66  gPrev);.  }.  if
112e0 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  ( pParse->db->ma
112f0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74  llocFailed ) ret
11300 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 53 75 70  urn 0;..  /* Sup
11310 70 72 65 73 73 20 74 68 65 20 66 69 72 73 74 20  press the first 
11320 4f 46 46 53 45 54 20 65 6e 74 72 69 65 73 20 69  OFFSET entries i
11330 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 46  f there is an OF
11340 46 53 45 54 20 63 6c 61 75 73 65 0a 20 20 2a 2f  FSET clause.  */
11350 0a 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c  .  codeOffset(v,
11360 20 70 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a   p, iContinue);.
11370 0a 20 20 73 77 69 74 63 68 28 20 70 44 65 73 74  .  switch( pDest
11380 2d 3e 65 44 65 73 74 20 29 7b 0a 20 20 20 20 2f  ->eDest ){.    /
11390 2a 20 53 74 6f 72 65 20 74 68 65 20 72 65 73 75  * Store the resu
113a0 6c 74 20 61 73 20 64 61 74 61 20 75 73 69 6e 67  lt as data using
113b0 20 61 20 75 6e 69 71 75 65 20 6b 65 79 2e 0a 20   a unique key.. 
113c0 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
113d0 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20 20 63 61  RT_Table:.    ca
113e0 73 65 20 53 52 54 5f 45 70 68 65 6d 54 61 62 3a  se SRT_EphemTab:
113f0 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31 20   {.      int r1 
11400 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
11410 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
11420 20 20 20 69 6e 74 20 72 32 20 3d 20 73 71 6c 69     int r2 = sqli
11430 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
11440 61 72 73 65 29 3b 0a 20 20 20 20 20 20 74 65 73  arse);.      tes
11450 74 63 61 73 65 28 20 70 44 65 73 74 2d 3e 65 44  tcase( pDest->eD
11460 65 73 74 3d 3d 53 52 54 5f 54 61 62 6c 65 20 29  est==SRT_Table )
11470 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
11480 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d  ( pDest->eDest==
11490 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29 3b 0a  SRT_EphemTab );.
114a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
114b0 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61  eAddOp3(v, OP_Ma
114c0 6b 65 52 65 63 6f 72 64 2c 20 70 49 6e 2d 3e 69  keRecord, pIn->i
114d0 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74  Sdst, pIn->nSdst
114e0 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  , r1);.      sql
114f0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
11500 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 70  , OP_NewRowid, p
11510 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 72  Dest->iSDParm, r
11520 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  2);.      sqlite
11530 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
11540 50 5f 49 6e 73 65 72 74 2c 20 70 44 65 73 74 2d  P_Insert, pDest-
11550 3e 69 53 44 50 61 72 6d 2c 20 72 31 2c 20 72 32  >iSDParm, r1, r2
11560 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
11570 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
11580 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a  OPFLAG_APPEND);.
11590 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
115a0 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
115b0 73 65 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 73  se, r2);.      s
115c0 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
115d0 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
115e0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
115f0 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51     }..#ifndef SQ
11600 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
11610 52 59 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20  RY.    /* If we 
11620 61 72 65 20 63 72 65 61 74 69 6e 67 20 61 20 73  are creating a s
11630 65 74 20 66 6f 72 20 61 6e 20 22 65 78 70 72 20  et for an "expr 
11640 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22  IN (SELECT ...)"
11650 20 63 6f 6e 73 74 72 75 63 74 2c 0a 20 20 20 20   construct,.    
11660 2a 2a 20 74 68 65 6e 20 74 68 65 72 65 20 73 68  ** then there sh
11670 6f 75 6c 64 20 62 65 20 61 20 73 69 6e 67 6c 65  ould be a single
11680 20 69 74 65 6d 20 6f 6e 20 74 68 65 20 73 74 61   item on the sta
11690 63 6b 2e 20 20 57 72 69 74 65 20 74 68 69 73 0a  ck.  Write this.
116a0 20 20 20 20 2a 2a 20 69 74 65 6d 20 69 6e 74 6f      ** item into
116b0 20 74 68 65 20 73 65 74 20 74 61 62 6c 65 20 77   the set table w
116c0 69 74 68 20 62 6f 67 75 73 20 64 61 74 61 2e 0a  ith bogus data..
116d0 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
116e0 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20  SRT_Set: {.     
116f0 20 69 6e 74 20 72 31 3b 0a 20 20 20 20 20 20 61   int r1;.      a
11700 73 73 65 72 74 28 20 70 49 6e 2d 3e 6e 53 64 73  ssert( pIn->nSds
11710 74 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 70 44  t==1 );.      pD
11720 65 73 74 2d 3e 61 66 66 53 64 73 74 20 3d 20 0a  est->affSdst = .
11730 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
11740 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28  CompareAffinity(
11750 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e  p->pEList->a[0].
11760 70 45 78 70 72 2c 20 70 44 65 73 74 2d 3e 61 66  pExpr, pDest->af
11770 66 53 64 73 74 29 3b 0a 20 20 20 20 20 20 72 31  fSdst);.      r1
11780 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
11790 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
117a0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
117b0 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp4(v, OP_Make
117c0 52 65 63 6f 72 64 2c 20 70 49 6e 2d 3e 69 53 64  Record, pIn->iSd
117d0 73 74 2c 20 31 2c 20 72 31 2c 20 26 70 44 65 73  st, 1, r1, &pDes
117e0 74 2d 3e 61 66 66 53 64 73 74 2c 31 29 3b 0a 20  t->affSdst,1);. 
117f0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
11800 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61  CacheAffinityCha
11810 6e 67 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d  nge(pParse, pIn-
11820 3e 69 53 64 73 74 2c 20 31 29 3b 0a 20 20 20 20  >iSdst, 1);.    
11830 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
11840 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Op2(v, OP_IdxIns
11850 65 72 74 2c 20 70 44 65 73 74 2d 3e 69 53 44 50  ert, pDest->iSDP
11860 61 72 6d 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  arm, r1);.      
11870 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
11880 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31  mpReg(pParse, r1
11890 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
118a0 20 20 20 20 7d 0a 0a 23 69 66 20 30 20 20 2f 2a      }..#if 0  /*
118b0 20 4e 65 76 65 72 20 6f 63 63 75 72 73 20 6f 6e   Never occurs on
118c0 20 61 6e 20 4f 52 44 45 52 20 42 59 20 71 75 65   an ORDER BY que
118d0 72 79 20 2a 2f 0a 20 20 20 20 2f 2a 20 49 66 20  ry */.    /* If 
118e0 61 6e 79 20 72 6f 77 20 65 78 69 73 74 20 69 6e  any row exist in
118f0 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2c   the result set,
11900 20 72 65 63 6f 72 64 20 74 68 61 74 20 66 61 63   record that fac
11910 74 20 61 6e 64 20 61 62 6f 72 74 2e 0a 20 20 20  t and abort..   
11920 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
11930 5f 45 78 69 73 74 73 3a 20 7b 0a 20 20 20 20 20  _Exists: {.     
11940 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11950 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
11960 2c 20 31 2c 20 70 44 65 73 74 2d 3e 69 53 44 50  , 1, pDest->iSDP
11970 61 72 6d 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54  arm);.      /* T
11980 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20  he LIMIT clause 
11990 77 69 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20 74  will terminate t
119a0 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a  he loop for us *
119b0 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  /.      break;. 
119c0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
119d0 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
119e0 20 73 63 61 6c 61 72 20 73 65 6c 65 63 74 20 74   scalar select t
119f0 68 61 74 20 69 73 20 70 61 72 74 20 6f 66 20 61  hat is part of a
11a00 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68  n expression, th
11a10 65 6e 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65 20  en.    ** store 
11a20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74  the results in t
11a30 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 6d  he appropriate m
11a40 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20 62  emory cell and b
11a50 72 65 61 6b 20 6f 75 74 0a 20 20 20 20 2a 2a 20  reak out.    ** 
11a60 6f 66 20 74 68 65 20 73 63 61 6e 20 6c 6f 6f 70  of the scan loop
11a70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
11a80 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20  e SRT_Mem: {.   
11a90 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 2d 3e     assert( pIn->
11aa0 6e 53 64 73 74 3d 3d 31 20 29 3b 0a 20 20 20 20  nSdst==1 );.    
11ab0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
11ac0 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 70 49  eMove(pParse, pI
11ad0 6e 2d 3e 69 53 64 73 74 2c 20 70 44 65 73 74 2d  n->iSdst, pDest-
11ae0 3e 69 53 44 50 61 72 6d 2c 20 31 29 3b 0a 20 20  >iSDParm, 1);.  
11af0 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54      /* The LIMIT
11b00 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 6a 75 6d   clause will jum
11b10 70 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f  p out of the loo
11b20 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20  p for us */.    
11b30 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
11b40 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64 65 66  endif /* #ifndef
11b50 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
11b60 51 55 45 52 59 20 2a 2f 0a 0a 20 20 20 20 2f 2a  QUERY */..    /*
11b70 20 54 68 65 20 72 65 73 75 6c 74 73 20 61 72 65   The results are
11b80 20 73 74 6f 72 65 64 20 69 6e 20 61 20 73 65 71   stored in a seq
11b90 75 65 6e 63 65 20 6f 66 20 72 65 67 69 73 74 65  uence of registe
11ba0 72 73 0a 20 20 20 20 2a 2a 20 73 74 61 72 74 69  rs.    ** starti
11bb0 6e 67 20 61 74 20 70 44 65 73 74 2d 3e 69 53 64  ng at pDest->iSd
11bc0 73 74 2e 20 20 54 68 65 6e 20 74 68 65 20 63 6f  st.  Then the co
11bd0 2d 72 6f 75 74 69 6e 65 20 79 69 65 6c 64 73 2e  -routine yields.
11be0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
11bf0 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 3a 20   SRT_Coroutine: 
11c00 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 73  {.      if( pDes
11c10 74 2d 3e 69 53 64 73 74 3d 3d 30 20 29 7b 0a 20  t->iSdst==0 ){. 
11c20 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e 69 53         pDest->iS
11c30 64 73 74 20 3d 20 73 71 6c 69 74 65 33 47 65 74  dst = sqlite3Get
11c40 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
11c50 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20  , pIn->nSdst);. 
11c60 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e 6e 53         pDest->nS
11c70 64 73 74 20 3d 20 70 49 6e 2d 3e 6e 53 64 73 74  dst = pIn->nSdst
11c80 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
11c90 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d  sqlite3ExprCodeM
11ca0 6f 76 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d  ove(pParse, pIn-
11cb0 3e 69 53 64 73 74 2c 20 70 44 65 73 74 2d 3e 69  >iSdst, pDest->i
11cc0 53 64 73 74 2c 20 70 44 65 73 74 2d 3e 6e 53 64  Sdst, pDest->nSd
11cd0 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  st);.      sqlit
11ce0 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
11cf0 4f 50 5f 59 69 65 6c 64 2c 20 70 44 65 73 74 2d  OP_Yield, pDest-
11d00 3e 69 53 44 50 61 72 6d 29 3b 0a 20 20 20 20 20  >iSDParm);.     
11d10 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
11d20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 65 20 6f 66     /* If none of
11d30 20 74 68 65 20 61 62 6f 76 65 2c 20 74 68 65 6e   the above, then
11d40 20 74 68 65 20 72 65 73 75 6c 74 20 64 65 73 74   the result dest
11d50 69 6e 61 74 69 6f 6e 20 6d 75 73 74 20 62 65 0a  ination must be.
11d60 20 20 20 20 2a 2a 20 53 52 54 5f 4f 75 74 70 75      ** SRT_Outpu
11d70 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  t.  This routine
11d80 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64   is never called
11d90 20 77 69 74 68 20 61 6e 79 20 6f 74 68 65 72 0a   with any other.
11da0 20 20 20 20 2a 2a 20 64 65 73 74 69 6e 61 74 69      ** destinati
11db0 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68  on other than th
11dc0 65 20 6f 6e 65 73 20 68 61 6e 64 6c 65 64 20 61  e ones handled a
11dd0 62 6f 76 65 20 6f 72 20 53 52 54 5f 4f 75 74 70  bove or SRT_Outp
11de0 75 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ut..    **.    *
11df0 2a 20 46 6f 72 20 53 52 54 5f 4f 75 74 70 75 74  * For SRT_Output
11e00 2c 20 72 65 73 75 6c 74 73 20 61 72 65 20 73 74  , results are st
11e10 6f 72 65 64 20 69 6e 20 61 20 73 65 71 75 65 6e  ored in a sequen
11e20 63 65 20 6f 66 20 72 65 67 69 73 74 65 72 73 2e  ce of registers.
11e30 20 20 0a 20 20 20 20 2a 2a 20 54 68 65 6e 20 74    .    ** Then t
11e40 68 65 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 20  he OP_ResultRow 
11e50 6f 70 63 6f 64 65 20 69 73 20 75 73 65 64 20 74  opcode is used t
11e60 6f 20 63 61 75 73 65 20 73 71 6c 69 74 65 33 5f  o cause sqlite3_
11e70 73 74 65 70 28 29 20 74 6f 0a 20 20 20 20 2a 2a  step() to.    **
11e80 20 72 65 74 75 72 6e 20 74 68 65 20 6e 65 78 74   return the next
11e90 20 72 6f 77 20 6f 66 20 72 65 73 75 6c 74 2e 0a   row of result..
11ea0 20 20 20 20 2a 2f 0a 20 20 20 20 64 65 66 61 75      */.    defau
11eb0 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  lt: {.      asse
11ec0 72 74 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74  rt( pDest->eDest
11ed0 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a  ==SRT_Output );.
11ee0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
11ef0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65  eAddOp2(v, OP_Re
11f00 73 75 6c 74 52 6f 77 2c 20 70 49 6e 2d 3e 69 53  sultRow, pIn->iS
11f10 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29  dst, pIn->nSdst)
11f20 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
11f30 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79  xprCacheAffinity
11f40 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 70  Change(pParse, p
11f50 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e  In->iSdst, pIn->
11f60 6e 53 64 73 74 29 3b 0a 20 20 20 20 20 20 62 72  nSdst);.      br
11f70 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  eak;.    }.  }..
11f80 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65    /* Jump to the
11f90 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70   end of the loop
11fa0 20 69 66 20 74 68 65 20 4c 49 4d 49 54 20 69 73   if the LIMIT is
11fb0 20 72 65 61 63 68 65 64 2e 0a 20 20 2a 2f 0a 20   reached..  */. 
11fc0 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29   if( p->iLimit )
11fd0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
11fe0 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66  eAddOp3(v, OP_If
11ff0 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c  Zero, p->iLimit,
12000 20 69 42 72 65 61 6b 2c 20 2d 31 29 3b 0a 20 20   iBreak, -1);.  
12010 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  }..  /* Generate
12020 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20   the subroutine 
12030 72 65 74 75 72 6e 0a 20 20 2a 2f 0a 20 20 73 71  return.  */.  sq
12040 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
12050 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 69 6e  Label(v, iContin
12060 75 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  ue);.  sqlite3Vd
12070 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52  beAddOp1(v, OP_R
12080 65 74 75 72 6e 2c 20 72 65 67 52 65 74 75 72 6e  eturn, regReturn
12090 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 61 64 64  );..  return add
120a0 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 74 65  r;.}../*.** Alte
120b0 72 6e 61 74 69 76 65 20 63 6f 6d 70 6f 75 6e 64  rnative compound
120c0 20 73 65 6c 65 63 74 20 63 6f 64 65 20 67 65 6e   select code gen
120d0 65 72 61 74 6f 72 20 66 6f 72 20 63 61 73 65 73  erator for cases
120e0 20 77 68 65 6e 20 74 68 65 72 65 0a 2a 2a 20 69   when there.** i
120f0 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  s an ORDER BY cl
12100 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 61  ause..**.** We a
12110 73 73 75 6d 65 20 61 20 71 75 65 72 79 20 6f 66  ssume a query of
12120 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66   the following f
12130 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  orm:.**.**      
12140 3c 73 65 6c 65 63 74 41 3e 20 20 3c 6f 70 65 72  <selectA>  <oper
12150 61 74 6f 72 3e 20 20 3c 73 65 6c 65 63 74 42 3e  ator>  <selectB>
12160 20 20 4f 52 44 45 52 20 42 59 20 3c 6f 72 64 65    ORDER BY <orde
12170 72 62 79 6c 69 73 74 3e 0a 2a 2a 0a 2a 2a 20 3c  rbylist>.**.** <
12180 6f 70 65 72 61 74 6f 72 3e 20 69 73 20 6f 6e 65  operator> is one
12190 20 6f 66 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20 55   of UNION ALL, U
121a0 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20 6f 72  NION, EXCEPT, or
121b0 20 49 4e 54 45 52 53 45 43 54 2e 20 20 54 68 65   INTERSECT.  The
121c0 20 69 64 65 61 0a 2a 2a 20 69 73 20 74 6f 20 63   idea.** is to c
121d0 6f 64 65 20 62 6f 74 68 20 3c 73 65 6c 65 63 74  ode both <select
121e0 41 3e 20 61 6e 64 20 3c 73 65 6c 65 63 74 42 3e  A> and <selectB>
121f0 20 77 69 74 68 20 74 68 65 20 4f 52 44 45 52 20   with the ORDER 
12200 42 59 20 63 6c 61 75 73 65 20 61 73 0a 2a 2a 20  BY clause as.** 
12210 63 6f 2d 72 6f 75 74 69 6e 65 73 2e 20 20 54 68  co-routines.  Th
12220 65 6e 20 72 75 6e 20 74 68 65 20 63 6f 2d 72 6f  en run the co-ro
12230 75 74 69 6e 65 73 20 69 6e 20 70 61 72 61 6c 6c  utines in parall
12240 65 6c 20 61 6e 64 20 6d 65 72 67 65 20 74 68 65  el and merge the
12250 20 72 65 73 75 6c 74 73 0a 2a 2a 20 69 6e 74 6f   results.** into
12260 20 74 68 65 20 6f 75 74 70 75 74 2e 20 20 49 6e   the output.  In
12270 20 61 64 64 69 74 69 6f 6e 20 74 6f 20 74 68 65   addition to the
12280 20 74 77 6f 20 63 6f 72 6f 75 74 69 6e 65 73 20   two coroutines 
12290 28 63 61 6c 6c 65 64 20 73 65 6c 65 63 74 41 20  (called selectA 
122a0 61 6e 64 0a 2a 2a 20 73 65 6c 65 63 74 42 29 20  and.** selectB) 
122b0 74 68 65 72 65 20 61 72 65 20 37 20 73 75 62 72  there are 7 subr
122c0 6f 75 74 69 6e 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  outines:.**.**  
122d0 20 20 6f 75 74 41 3a 20 20 20 20 4d 6f 76 65 20    outA:    Move 
122e0 74 68 65 20 6f 75 74 70 75 74 20 6f 66 20 74 68  the output of th
122f0 65 20 73 65 6c 65 63 74 41 20 63 6f 72 6f 75 74  e selectA corout
12300 69 6e 65 20 69 6e 74 6f 20 74 68 65 20 6f 75 74  ine into the out
12310 70 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  put.**          
12320 20 20 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75     of the compou
12330 6e 64 20 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20  nd query..**.** 
12340 20 20 20 6f 75 74 42 3a 20 20 20 20 4d 6f 76 65     outB:    Move
12350 20 74 68 65 20 6f 75 74 70 75 74 20 6f 66 20 74   the output of t
12360 68 65 20 73 65 6c 65 63 74 42 20 63 6f 72 6f 75  he selectB corou
12370 74 69 6e 65 20 69 6e 74 6f 20 74 68 65 20 6f 75  tine into the ou
12380 74 70 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  tput.**         
12390 20 20 20 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f      of the compo
123a0 75 6e 64 20 71 75 65 72 79 2e 20 20 28 4f 6e 6c  und query.  (Onl
123b0 79 20 67 65 6e 65 72 61 74 65 64 20 66 6f 72 20  y generated for 
123c0 55 4e 49 4f 4e 20 61 6e 64 0a 2a 2a 20 20 20 20  UNION and.**    
123d0 20 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 41           UNION A
123e0 4c 4c 2e 20 20 45 58 43 45 50 54 20 61 6e 64 20  LL.  EXCEPT and 
123f0 49 4e 53 45 52 54 53 45 43 54 20 6e 65 76 65 72  INSERTSECT never
12400 20 6f 75 74 70 75 74 20 61 20 72 6f 77 20 74 68   output a row th
12410 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  at.**           
12420 20 20 61 70 70 65 61 72 73 20 6f 6e 6c 79 20 69    appears only i
12430 6e 20 42 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 20 41  n B.).**.**    A
12440 6c 74 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77  ltB:    Called w
12450 68 65 6e 20 74 68 65 72 65 20 69 73 20 64 61 74  hen there is dat
12460 61 20 66 72 6f 6d 20 62 6f 74 68 20 63 6f 72 6f  a from both coro
12470 75 74 69 6e 65 73 20 61 6e 64 20 41 3c 42 2e 0a  utines and A<B..
12480 2a 2a 0a 2a 2a 20 20 20 20 41 65 71 42 3a 20 20  **.**    AeqB:  
12490 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 74 68    Called when th
124a0 65 72 65 20 69 73 20 64 61 74 61 20 66 72 6f 6d  ere is data from
124b0 20 62 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65 73   both coroutines
124c0 20 61 6e 64 20 41 3d 3d 42 2e 0a 2a 2a 0a 2a 2a   and A==B..**.**
124d0 20 20 20 20 41 67 74 42 3a 20 20 20 20 43 61 6c      AgtB:    Cal
124e0 6c 65 64 20 77 68 65 6e 20 74 68 65 72 65 20 69  led when there i
124f0 73 20 64 61 74 61 20 66 72 6f 6d 20 62 6f 74 68  s data from both
12500 20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64 20   coroutines and 
12510 41 3e 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 45 6f  A>B..**.**    Eo
12520 66 41 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68  fA:    Called wh
12530 65 6e 20 64 61 74 61 20 69 73 20 65 78 68 61 75  en data is exhau
12540 73 74 65 64 20 66 72 6f 6d 20 73 65 6c 65 63 74  sted from select
12550 41 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 45 6f 66 42  A..**.**    EofB
12560 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e  :    Called when
12570 20 64 61 74 61 20 69 73 20 65 78 68 61 75 73 74   data is exhaust
12580 65 64 20 66 72 6f 6d 20 73 65 6c 65 63 74 42 2e  ed from selectB.
12590 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65  .**.** The imple
125a0 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
125b0 20 6c 61 74 74 65 72 20 66 69 76 65 20 73 75 62   latter five sub
125c0 72 6f 75 74 69 6e 65 73 20 64 65 70 65 6e 64 20  routines depend 
125d0 6f 6e 20 77 68 69 63 68 20 0a 2a 2a 20 3c 6f 70  on which .** <op
125e0 65 72 61 74 6f 72 3e 20 69 73 20 75 73 65 64 3a  erator> is used:
125f0 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  .**.**.**       
12600 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 20        UNION ALL 
12610 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 20 20          UNION   
12620 20 20 20 20 20 20 20 20 20 45 58 43 45 50 54 20           EXCEPT 
12630 20 20 20 20 20 20 20 20 20 49 4e 54 45 52 53 45           INTERSE
12640 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2d  CT.**          -
12650 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d  ------------  --
12660 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20  --------------- 
12670 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20   -------------- 
12680 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
12690 2d 2d 0a 2a 2a 20 20 20 41 6c 74 42 3a 20 20 20  --.**   AltB:   
126a0 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20  outA, nextA     
126b0 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20   outA, nextA    
126c0 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20     outA, nextA  
126d0 20 20 20 20 20 20 20 6e 65 78 74 41 0a 2a 2a 0a         nextA.**.
126e0 2a 2a 20 20 20 41 65 71 42 3a 20 20 20 6f 75 74  **   AeqB:   out
126f0 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20 20  A, nextA        
12700 20 6e 65 78 74 41 20 20 20 20 20 20 20 20 20 20   nextA          
12710 20 20 20 6e 65 78 74 41 20 20 20 20 20 20 20 20     nextA        
12720 20 6f 75 74 41 2c 20 6e 65 78 74 41 0a 2a 2a 0a   outA, nextA.**.
12730 2a 2a 20 20 20 41 67 74 42 3a 20 20 20 6f 75 74  **   AgtB:   out
12740 42 2c 20 6e 65 78 74 42 20 20 20 20 20 20 6f 75  B, nextB      ou
12750 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20 20 20  tB, nextB       
12760 20 20 20 6e 65 78 74 42 20 20 20 20 20 20 20 20     nextB        
12770 20 20 20 20 6e 65 78 74 42 0a 2a 2a 0a 2a 2a 20      nextB.**.** 
12780 20 20 45 6f 66 41 3a 20 20 20 6f 75 74 42 2c 20    EofA:   outB, 
12790 6e 65 78 74 42 20 20 20 20 20 20 6f 75 74 42 2c  nextB      outB,
127a0 20 6e 65 78 74 42 20 20 20 20 20 20 20 20 20 20   nextB          
127b0 68 61 6c 74 20 20 20 20 20 20 20 20 20 20 20 20  halt            
127c0 20 68 61 6c 74 0a 2a 2a 0a 2a 2a 20 20 20 45 6f   halt.**.**   Eo
127d0 66 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65 78 74  fB:   outA, next
127e0 41 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78  A      outA, nex
127f0 74 41 20 20 20 20 20 20 20 6f 75 74 41 2c 20 6e  tA       outA, n
12800 65 78 74 41 20 20 20 20 20 20 20 20 20 68 61 6c  extA         hal
12810 74 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 41  t.**.** In the A
12820 6c 74 42 2c 20 41 65 71 42 2c 20 61 6e 64 20 41  ltB, AeqB, and A
12830 67 74 42 20 73 75 62 72 6f 75 74 69 6e 65 73 2c  gtB subroutines,
12840 20 61 6e 20 45 4f 46 20 6f 6e 20 41 20 66 6f 6c   an EOF on A fol
12850 6c 6f 77 69 6e 67 20 6e 65 78 74 41 0a 2a 2a 20  lowing nextA.** 
12860 63 61 75 73 65 73 20 61 6e 20 69 6d 6d 65 64 69  causes an immedi
12870 61 74 65 20 6a 75 6d 70 20 74 6f 20 45 6f 66 41  ate jump to EofA
12880 20 61 6e 64 20 61 6e 20 45 4f 46 20 6f 6e 20 42   and an EOF on B
12890 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78 74 42   following nextB
128a0 20 63 61 75 73 65 73 0a 2a 2a 20 61 6e 20 69 6d   causes.** an im
128b0 6d 65 64 69 61 74 65 20 6a 75 6d 70 20 74 6f 20  mediate jump to 
128c0 45 6f 66 42 2e 20 20 57 69 74 68 69 6e 20 45 6f  EofB.  Within Eo
128d0 66 41 20 61 6e 64 20 45 6f 66 42 2c 20 61 6e 64  fA and EofB, and
128e0 20 45 4f 46 20 6f 6e 20 65 6e 74 72 79 20 6f 72   EOF on entry or
128f0 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65  .** following ne
12900 78 74 58 20 63 61 75 73 65 73 20 61 20 6a 75 6d  xtX causes a jum
12910 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  p to the end of 
12920 74 68 65 20 73 65 6c 65 63 74 20 70 72 6f 63 65  the select proce
12930 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 44 75 70  ssing..**.** Dup
12940 6c 69 63 61 74 65 20 72 65 6d 6f 76 61 6c 20 69  licate removal i
12950 6e 20 74 68 65 20 55 4e 49 4f 4e 2c 20 45 58 43  n the UNION, EXC
12960 45 50 54 2c 20 61 6e 64 20 49 4e 54 45 52 53 45  EPT, and INTERSE
12970 43 54 20 63 61 73 65 73 20 69 73 20 68 61 6e 64  CT cases is hand
12980 6c 65 64 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68  led.** within th
12990 65 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74  e output subrout
129a0 69 6e 65 2e 20 20 54 68 65 20 72 65 67 50 72 65  ine.  The regPre
129b0 76 20 72 65 67 69 73 74 65 72 20 73 65 74 20 68  v register set h
129c0 6f 6c 64 73 20 74 68 65 20 70 72 65 76 69 6f 75  olds the previou
129d0 73 6c 79 0a 2a 2a 20 6f 75 74 70 75 74 20 76 61  sly.** output va
129e0 6c 75 65 2e 20 20 41 20 63 6f 6d 70 61 72 69 73  lue.  A comparis
129f0 6f 6e 20 69 73 20 6d 61 64 65 20 61 67 61 69 6e  on is made again
12a00 73 74 20 74 68 69 73 20 76 61 6c 75 65 20 61 6e  st this value an
12a10 64 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20  d the output.** 
12a20 69 73 20 73 6b 69 70 70 65 64 20 69 66 20 74 68  is skipped if th
12a30 65 20 6e 65 78 74 20 72 65 73 75 6c 74 73 20 77  e next results w
12a40 6f 75 6c 64 20 62 65 20 74 68 65 20 73 61 6d 65  ould be the same
12a50 20 61 73 20 74 68 65 20 70 72 65 76 69 6f 75 73   as the previous
12a60 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c  ..**.** The impl
12a70 65 6d 65 6e 74 61 74 69 6f 6e 20 70 6c 61 6e 20  ementation plan 
12a80 69 73 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  is to implement 
12a90 74 68 65 20 74 77 6f 20 63 6f 72 6f 75 74 69 6e  the two coroutin
12aa0 65 73 20 61 6e 64 20 73 65 76 65 6e 0a 2a 2a 20  es and seven.** 
12ab0 73 75 62 72 6f 75 74 69 6e 65 73 20 66 69 72 73  subroutines firs
12ac0 74 2c 20 74 68 65 6e 20 70 75 74 20 74 68 65 20  t, then put the 
12ad0 63 6f 6e 74 72 6f 6c 20 6c 6f 67 69 63 20 61 74  control logic at
12ae0 20 74 68 65 20 62 6f 74 74 6f 6d 2e 20 20 4c 69   the bottom.  Li
12af0 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  ke this:.**.**  
12b00 20 20 20 20 20 20 20 20 67 6f 74 6f 20 49 6e 69          goto Ini
12b10 74 0a 2a 2a 20 20 20 20 20 63 6f 41 3a 20 63 6f  t.**     coA: co
12b20 72 6f 75 74 69 6e 65 20 66 6f 72 20 6c 65 66 74  routine for left
12b30 20 71 75 65 72 79 20 28 41 29 0a 2a 2a 20 20 20   query (A).**   
12b40 20 20 63 6f 42 3a 20 63 6f 72 6f 75 74 69 6e 65    coB: coroutine
12b50 20 66 6f 72 20 72 69 67 68 74 20 71 75 65 72 79   for right query
12b60 20 28 42 29 0a 2a 2a 20 20 20 20 6f 75 74 41 3a   (B).**    outA:
12b70 20 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f 77 20   output one row 
12b80 6f 66 20 41 0a 2a 2a 20 20 20 20 6f 75 74 42 3a  of A.**    outB:
12b90 20 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f 77 20   output one row 
12ba0 6f 66 20 42 20 28 55 4e 49 4f 4e 20 61 6e 64 20  of B (UNION and 
12bb0 55 4e 49 4f 4e 20 41 4c 4c 20 6f 6e 6c 79 29 0a  UNION ALL only).
12bc0 2a 2a 20 20 20 20 45 6f 66 41 3a 20 2e 2e 2e 0a  **    EofA: ....
12bd0 2a 2a 20 20 20 20 45 6f 66 42 3a 20 2e 2e 2e 0a  **    EofB: ....
12be0 2a 2a 20 20 20 20 41 6c 74 42 3a 20 2e 2e 2e 0a  **    AltB: ....
12bf0 2a 2a 20 20 20 20 41 65 71 42 3a 20 2e 2e 2e 0a  **    AeqB: ....
12c00 2a 2a 20 20 20 20 41 67 74 42 3a 20 2e 2e 2e 0a  **    AgtB: ....
12c10 2a 2a 20 20 20 20 49 6e 69 74 3a 20 69 6e 69 74  **    Init: init
12c20 69 61 6c 69 7a 65 20 63 6f 72 6f 75 74 69 6e 65  ialize coroutine
12c30 20 72 65 67 69 73 74 65 72 73 0a 2a 2a 20 20 20   registers.**   
12c40 20 20 20 20 20 20 20 79 69 65 6c 64 20 63 6f 41         yield coA
12c50 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 69 66 20  .**          if 
12c60 65 6f 66 28 41 29 20 67 6f 74 6f 20 45 6f 66 41  eof(A) goto EofA
12c70 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 79 69 65  .**          yie
12c80 6c 64 20 63 6f 42 0a 2a 2a 20 20 20 20 20 20 20  ld coB.**       
12c90 20 20 20 69 66 20 65 6f 66 28 42 29 20 67 6f 74     if eof(B) got
12ca0 6f 20 45 6f 66 42 0a 2a 2a 20 20 20 20 43 6d 70  o EofB.**    Cmp
12cb0 72 3a 20 43 6f 6d 70 61 72 65 20 41 2c 20 42 0a  r: Compare A, B.
12cc0 2a 2a 20 20 20 20 20 20 20 20 20 20 4a 75 6d 70  **          Jump
12cd0 20 41 6c 74 42 2c 20 41 65 71 42 2c 20 41 67 74   AltB, AeqB, Agt
12ce0 42 0a 2a 2a 20 20 20 20 20 45 6e 64 3a 20 2e 2e  B.**     End: ..
12cf0 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 63 61 6c 6c 20  ..**.** We call 
12d00 41 6c 74 42 2c 20 41 65 71 42 2c 20 41 67 74 42  AltB, AeqB, AgtB
12d10 2c 20 45 6f 66 41 2c 20 61 6e 64 20 45 6f 66 42  , EofA, and EofB
12d20 20 22 73 75 62 72 6f 75 74 69 6e 65 73 22 20 62   "subroutines" b
12d30 75 74 20 74 68 65 79 20 61 72 65 20 6e 6f 74 0a  ut they are not.
12d40 2a 2a 20 61 63 74 75 61 6c 6c 79 20 63 61 6c 6c  ** actually call
12d50 65 64 20 75 73 69 6e 67 20 47 6f 73 75 62 20 61  ed using Gosub a
12d60 6e 64 20 74 68 65 79 20 64 6f 20 6e 6f 74 20 52  nd they do not R
12d70 65 74 75 72 6e 2e 20 20 45 6f 66 41 20 61 6e 64  eturn.  EofA and
12d80 20 45 6f 66 42 20 6c 6f 6f 70 0a 2a 2a 20 75 6e   EofB loop.** un
12d90 74 69 6c 20 61 6c 6c 20 64 61 74 61 20 69 73 20  til all data is 
12da0 65 78 68 61 75 73 74 65 64 20 74 68 65 6e 20 6a  exhausted then j
12db0 75 6d 70 20 74 6f 20 74 68 65 20 22 65 6e 64 22  ump to the "end"
12dc0 20 6c 61 62 65 2e 20 20 41 6c 74 42 2c 20 41 65   labe.  AltB, Ae
12dd0 71 42 2c 0a 2a 2a 20 61 6e 64 20 41 67 74 42 20  qB,.** and AgtB 
12de0 6a 75 6d 70 20 74 6f 20 65 69 74 68 65 72 20 4c  jump to either L
12df0 32 20 6f 72 20 74 6f 20 6f 6e 65 20 6f 66 20 45  2 or to one of E
12e00 6f 66 41 20 6f 72 20 45 6f 66 42 2e 0a 2a 2f 0a  ofA or EofB..*/.
12e10 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
12e20 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
12e30 45 43 54 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  ECT.static int m
12e40 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42  ultiSelectOrderB
12e50 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  y(.  Parse *pPar
12e60 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61  se,        /* Pa
12e70 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
12e80 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
12e90 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
12ea0 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45  right-most of SE
12eb0 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f 64 65  LECTs to be code
12ec0 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  d */.  SelectDes
12ed0 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a 20  t *pDest     /* 
12ee0 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20  What to do with 
12ef0 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f  query results */
12f00 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20  .){.  int i, j; 
12f10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
12f20 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a  oop counters */.
12f30 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72    Select *pPrior
12f40 3b 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f 74 68  ;       /* Anoth
12f50 65 72 20 53 45 4c 45 43 54 20 69 6d 6d 65 64 69  er SELECT immedi
12f60 61 74 65 6c 79 20 74 6f 20 6f 75 72 20 6c 65 66  ately to our lef
12f70 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20  t */.  Vdbe *v; 
12f80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12f90 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
12fa0 20 74 68 69 73 20 56 44 42 45 20 2a 2f 0a 20 20   this VDBE */.  
12fb0 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 41  SelectDest destA
12fc0 3b 20 20 20 20 20 2f 2a 20 44 65 73 74 69 6e 61  ;     /* Destina
12fd0 74 69 6f 6e 20 66 6f 72 20 63 6f 72 6f 75 74 69  tion for corouti
12fe0 6e 65 20 41 20 2a 2f 0a 20 20 53 65 6c 65 63 74  ne A */.  Select
12ff0 44 65 73 74 20 64 65 73 74 42 3b 20 20 20 20 20  Dest destB;     
13000 2f 2a 20 44 65 73 74 69 6e 61 74 69 6f 6e 20 66  /* Destination f
13010 6f 72 20 63 6f 72 6f 75 74 69 6e 65 20 42 20 2a  or coroutine B *
13020 2f 0a 20 20 69 6e 74 20 72 65 67 41 64 64 72 41  /.  int regAddrA
13030 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64  ;         /* Add
13040 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66 6f  ress register fo
13050 72 20 73 65 6c 65 63 74 2d 41 20 63 6f 72 6f 75  r select-A corou
13060 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65  tine */.  int re
13070 67 45 6f 66 41 3b 20 20 20 20 20 20 20 20 20 20  gEofA;          
13080 2f 2a 20 46 6c 61 67 20 74 6f 20 69 6e 64 69 63  /* Flag to indic
13090 61 74 65 20 77 68 65 6e 20 73 65 6c 65 63 74 2d  ate when select-
130a0 41 20 69 73 20 63 6f 6d 70 6c 65 74 65 20 2a 2f  A is complete */
130b0 0a 20 20 69 6e 74 20 72 65 67 41 64 64 72 42 3b  .  int regAddrB;
130c0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
130d0 65 73 73 20 72 65 67 69 73 74 65 72 20 66 6f 72  ess register for
130e0 20 73 65 6c 65 63 74 2d 42 20 63 6f 72 6f 75 74   select-B corout
130f0 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ine */.  int reg
13100 45 6f 66 42 3b 20 20 20 20 20 20 20 20 20 20 2f  EofB;          /
13110 2a 20 46 6c 61 67 20 74 6f 20 69 6e 64 69 63 61  * Flag to indica
13120 74 65 20 77 68 65 6e 20 73 65 6c 65 63 74 2d 42  te when select-B
13130 20 69 73 20 63 6f 6d 70 6c 65 74 65 20 2a 2f 0a   is complete */.
13140 20 20 69 6e 74 20 61 64 64 72 53 65 6c 65 63 74    int addrSelect
13150 41 3b 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65  A;      /* Addre
13160 73 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74  ss of the select
13170 2d 41 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a  -A coroutine */.
13180 20 20 69 6e 74 20 61 64 64 72 53 65 6c 65 63 74    int addrSelect
13190 42 3b 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65  B;      /* Addre
131a0 73 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74  ss of the select
131b0 2d 42 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a  -B coroutine */.
131c0 20 20 69 6e 74 20 72 65 67 4f 75 74 41 3b 20 20    int regOutA;  
131d0 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
131e0 73 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20  ss register for 
131f0 74 68 65 20 6f 75 74 70 75 74 2d 41 20 73 75 62  the output-A sub
13200 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
13210 20 72 65 67 4f 75 74 42 3b 20 20 20 20 20 20 20   regOutB;       
13220 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65     /* Address re
13230 67 69 73 74 65 72 20 66 6f 72 20 74 68 65 20 6f  gister for the o
13240 75 74 70 75 74 2d 42 20 73 75 62 72 6f 75 74 69  utput-B subrouti
13250 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ne */.  int addr
13260 4f 75 74 41 3b 20 20 20 20 20 20 20 20 20 2f 2a  OutA;         /*
13270 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
13280 6f 75 74 70 75 74 2d 41 20 73 75 62 72 6f 75 74  output-A subrout
13290 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ine */.  int add
132a0 72 4f 75 74 42 20 3d 20 30 3b 20 20 20 20 20 2f  rOutB = 0;     /
132b0 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
132c0 20 6f 75 74 70 75 74 2d 42 20 73 75 62 72 6f 75   output-B subrou
132d0 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tine */.  int ad
132e0 64 72 45 6f 66 41 3b 20 20 20 20 20 20 20 20 20  drEofA;         
132f0 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
13300 65 20 73 65 6c 65 63 74 2d 41 2d 65 78 68 61 75  e select-A-exhau
13310 73 74 65 64 20 73 75 62 72 6f 75 74 69 6e 65 20  sted subroutine 
13320 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 45 6f 66  */.  int addrEof
13330 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64  B;         /* Ad
13340 64 72 65 73 73 20 6f 66 20 74 68 65 20 73 65 6c  dress of the sel
13350 65 63 74 2d 42 2d 65 78 68 61 75 73 74 65 64 20  ect-B-exhausted 
13360 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
13370 69 6e 74 20 61 64 64 72 41 6c 74 42 3b 20 20 20  int addrAltB;   
13380 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
13390 20 6f 66 20 74 68 65 20 41 3c 42 20 73 75 62 72   of the A<B subr
133a0 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
133b0 61 64 64 72 41 65 71 42 3b 20 20 20 20 20 20 20  addrAeqB;       
133c0 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
133d0 74 68 65 20 41 3d 3d 42 20 73 75 62 72 6f 75 74  the A==B subrout
133e0 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ine */.  int add
133f0 72 41 67 74 42 3b 20 20 20 20 20 20 20 20 20 2f  rAgtB;         /
13400 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
13410 20 41 3e 42 20 73 75 62 72 6f 75 74 69 6e 65 20   A>B subroutine 
13420 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4c 69 6d 69  */.  int regLimi
13430 74 41 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 69  tA;        /* Li
13440 6d 69 74 20 72 65 67 69 73 74 65 72 20 66 6f 72  mit register for
13450 20 73 65 6c 65 63 74 2d 41 20 2a 2f 0a 20 20 69   select-A */.  i
13460 6e 74 20 72 65 67 4c 69 6d 69 74 42 3b 20 20 20  nt regLimitB;   
13470 20 20 20 20 20 2f 2a 20 4c 69 6d 69 74 20 72 65       /* Limit re
13480 67 69 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63  gister for selec
13490 74 2d 41 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  t-A */.  int reg
134a0 50 72 65 76 3b 20 20 20 20 20 20 20 20 20 20 2f  Prev;          /
134b0 2a 20 41 20 72 61 6e 67 65 20 6f 66 20 72 65 67  * A range of reg
134c0 69 73 74 65 72 73 20 74 6f 20 68 6f 6c 64 20 70  isters to hold p
134d0 72 65 76 69 6f 75 73 20 6f 75 74 70 75 74 20 2a  revious output *
134e0 2f 0a 20 20 69 6e 74 20 73 61 76 65 64 4c 69 6d  /.  int savedLim
134f0 69 74 3b 20 20 20 20 20 20 20 2f 2a 20 53 61 76  it;       /* Sav
13500 65 64 20 76 61 6c 75 65 20 6f 66 20 70 2d 3e 69  ed value of p->i
13510 4c 69 6d 69 74 20 2a 2f 0a 20 20 69 6e 74 20 73  Limit */.  int s
13520 61 76 65 64 4f 66 66 73 65 74 3b 20 20 20 20 20  avedOffset;     
13530 20 2f 2a 20 53 61 76 65 64 20 76 61 6c 75 65 20   /* Saved value 
13540 6f 66 20 70 2d 3e 69 4f 66 66 73 65 74 20 2a 2f  of p->iOffset */
13550 0a 20 20 69 6e 74 20 6c 61 62 65 6c 43 6d 70 72  .  int labelCmpr
13560 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 62 65  ;        /* Labe
13570 6c 20 66 6f 72 20 74 68 65 20 73 74 61 72 74 20  l for the start 
13580 6f 66 20 74 68 65 20 6d 65 72 67 65 20 61 6c 67  of the merge alg
13590 6f 72 69 74 68 6d 20 2a 2f 0a 20 20 69 6e 74 20  orithm */.  int 
135a0 6c 61 62 65 6c 45 6e 64 3b 20 20 20 20 20 20 20  labelEnd;       
135b0 20 20 2f 2a 20 4c 61 62 65 6c 20 66 6f 72 20 74    /* Label for t
135c0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 76  he end of the ov
135d0 65 72 61 6c 6c 20 53 45 4c 45 43 54 20 73 74 6d  erall SELECT stm
135e0 74 20 2a 2f 0a 20 20 69 6e 74 20 6a 31 3b 20 20  t */.  int j1;  
135f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13600 4a 75 6d 70 20 69 6e 73 74 72 75 63 74 69 6f 6e  Jump instruction
13610 73 20 74 68 61 74 20 67 65 74 20 72 65 74 61 72  s that get retar
13620 67 65 74 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20  getted */.  int 
13630 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  op;             
13640 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 54 4b 5f 41    /* One of TK_A
13650 4c 4c 2c 20 54 4b 5f 55 4e 49 4f 4e 2c 20 54 4b  LL, TK_UNION, TK
13660 5f 45 58 43 45 50 54 2c 20 54 4b 5f 49 4e 54 45  _EXCEPT, TK_INTE
13670 52 53 45 43 54 20 2a 2f 0a 20 20 4b 65 79 49 6e  RSECT */.  KeyIn
13680 66 6f 20 2a 70 4b 65 79 44 75 70 20 3d 20 30 3b  fo *pKeyDup = 0;
13690 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20 69   /* Comparison i
136a0 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 64  nformation for d
136b0 75 70 6c 69 63 61 74 65 20 72 65 6d 6f 76 61 6c  uplicate removal
136c0 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70   */.  KeyInfo *p
136d0 4b 65 79 4d 65 72 67 65 3b 20 20 20 2f 2a 20 43  KeyMerge;   /* C
136e0 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 66 6f 72 6d  omparison inform
136f0 61 74 69 6f 6e 20 66 6f 72 20 6d 65 72 67 69 6e  ation for mergin
13700 67 20 72 6f 77 73 20 2a 2f 0a 20 20 73 71 6c 69  g rows */.  sqli
13710 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20  te3 *db;        
13720 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f    /* Database co
13730 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 45 78  nnection */.  Ex
13740 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
13750 3b 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52  ;   /* The ORDER
13760 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
13770 69 6e 74 20 6e 4f 72 64 65 72 42 79 3b 20 20 20  int nOrderBy;   
13780 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
13790 6f 66 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20  of terms in the 
137a0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
137b0 2a 2f 0a 20 20 69 6e 74 20 2a 61 50 65 72 6d 75  */.  int *aPermu
137c0 74 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 4d 61  te;        /* Ma
137d0 70 70 69 6e 67 20 66 72 6f 6d 20 4f 52 44 45 52  pping from ORDER
137e0 20 42 59 20 74 65 72 6d 73 20 74 6f 20 72 65 73   BY terms to res
137f0 75 6c 74 20 73 65 74 20 63 6f 6c 75 6d 6e 73 20  ult set columns 
13800 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
13810 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20  E_OMIT_EXPLAIN. 
13820 20 69 6e 74 20 69 53 75 62 31 3b 20 20 20 20 20   int iSub1;     
13830 20 20 20 20 20 20 20 2f 2a 20 45 51 50 20 69 64         /* EQP id
13840 20 6f 66 20 6c 65 66 74 2d 68 61 6e 64 20 71 75   of left-hand qu
13850 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75  ery */.  int iSu
13860 62 32 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  b2;            /
13870 2a 20 45 51 50 20 69 64 20 6f 66 20 72 69 67 68  * EQP id of righ
13880 74 2d 68 61 6e 64 20 71 75 65 72 79 20 2a 2f 0a  t-hand query */.
13890 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
138a0 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 21 3d 30  ( p->pOrderBy!=0
138b0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b   );.  assert( pK
138c0 65 79 44 75 70 3d 3d 30 20 29 3b 20 2f 2a 20 22  eyDup==0 ); /* "
138d0 4d 61 6e 61 67 65 64 22 20 63 6f 64 65 20 6e 65  Managed" code ne
138e0 65 64 73 20 74 68 69 73 2e 20 20 54 69 63 6b 65  eds this.  Ticke
138f0 74 20 23 33 33 38 32 2e 20 2a 2f 0a 20 20 64 62  t #3382. */.  db
13900 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
13910 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64   v = pParse->pVd
13920 62 65 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21  be;.  assert( v!
13930 3d 30 20 29 3b 20 20 20 20 20 20 20 2f 2a 20 41  =0 );       /* A
13940 6c 72 65 61 64 79 20 74 68 72 6f 77 6e 20 74 68  lready thrown th
13950 65 20 65 72 72 6f 72 20 69 66 20 56 44 42 45 20  e error if VDBE 
13960 61 6c 6c 6f 63 20 66 61 69 6c 65 64 20 2a 2f 0a  alloc failed */.
13970 20 20 6c 61 62 65 6c 45 6e 64 20 3d 20 73 71 6c    labelEnd = sql
13980 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
13990 6c 28 76 29 3b 0a 20 20 6c 61 62 65 6c 43 6d 70  l(v);.  labelCmp
139a0 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  r = sqlite3VdbeM
139b0 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 0a 20  akeLabel(v);... 
139c0 20 2f 2a 20 50 61 74 63 68 20 75 70 20 74 68 65   /* Patch up the
139d0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
139e0 0a 20 20 2a 2f 0a 20 20 6f 70 20 3d 20 70 2d 3e  .  */.  op = p->
139f0 6f 70 3b 20 20 0a 20 20 70 50 72 69 6f 72 20 3d  op;  .  pPrior =
13a00 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 61 73   p->pPrior;.  as
13a10 73 65 72 74 28 20 70 50 72 69 6f 72 2d 3e 70 4f  sert( pPrior->pO
13a20 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20 70  rderBy==0 );.  p
13a30 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72  OrderBy = p->pOr
13a40 64 65 72 42 79 3b 0a 20 20 61 73 73 65 72 74 28  derBy;.  assert(
13a50 20 70 4f 72 64 65 72 42 79 20 29 3b 0a 20 20 6e   pOrderBy );.  n
13a60 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72  OrderBy = pOrder
13a70 42 79 2d 3e 6e 45 78 70 72 3b 0a 0a 20 20 2f 2a  By->nExpr;..  /*
13a80 20 46 6f 72 20 6f 70 65 72 61 74 6f 72 73 20 6f   For operators o
13a90 74 68 65 72 20 74 68 61 6e 20 55 4e 49 4f 4e 20  ther than UNION 
13aa0 41 4c 4c 20 77 65 20 68 61 76 65 20 74 6f 20 6d  ALL we have to m
13ab0 61 6b 65 20 73 75 72 65 20 74 68 61 74 0a 20 20  ake sure that.  
13ac0 2a 2a 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  ** the ORDER BY 
13ad0 63 6c 61 75 73 65 20 63 6f 76 65 72 73 20 65 76  clause covers ev
13ae0 65 72 79 20 74 65 72 6d 20 6f 66 20 74 68 65 20  ery term of the 
13af0 72 65 73 75 6c 74 20 73 65 74 2e 20 20 41 64 64  result set.  Add
13b00 0a 20 20 2a 2a 20 74 65 72 6d 73 20 74 6f 20 74  .  ** terms to t
13b10 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
13b20 73 65 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e  se as necessary.
13b30 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 21 3d  .  */.  if( op!=
13b40 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 66 6f  TK_ALL ){.    fo
13b50 72 28 69 3d 31 3b 20 64 62 2d 3e 6d 61 6c 6c 6f  r(i=1; db->mallo
13b60 63 46 61 69 6c 65 64 3d 3d 30 20 26 26 20 69 3c  cFailed==0 && i<
13b70 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  =p->pEList->nExp
13b80 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  r; i++){.      s
13b90 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
13ba0 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20  tem *pItem;.    
13bb0 20 20 66 6f 72 28 6a 3d 30 2c 20 70 49 74 65 6d    for(j=0, pItem
13bc0 3d 70 4f 72 64 65 72 42 79 2d 3e 61 3b 20 6a 3c  =pOrderBy->a; j<
13bd0 6e 4f 72 64 65 72 42 79 3b 20 6a 2b 2b 2c 20 70  nOrderBy; j++, p
13be0 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Item++){.       
13bf0 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e   assert( pItem->
13c00 69 4f 72 64 65 72 42 79 43 6f 6c 3e 30 20 29 3b  iOrderByCol>0 );
13c10 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49 74  .        if( pIt
13c20 65 6d 2d 3e 69 4f 72 64 65 72 42 79 43 6f 6c 3d  em->iOrderByCol=
13c30 3d 69 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =i ) break;.    
13c40 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3d    }.      if( j=
13c50 3d 6e 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  =nOrderBy ){.   
13c60 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 20       Expr *pNew 
13c70 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62  = sqlite3Expr(db
13c80 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20 30 29  , TK_INTEGER, 0)
13c90 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e  ;.        if( pN
13ca0 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  ew==0 ) return S
13cb0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
13cc0 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73       pNew->flags
13cd0 20 7c 3d 20 45 50 5f 49 6e 74 56 61 6c 75 65 3b   |= EP_IntValue;
13ce0 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75  .        pNew->u
13cf0 2e 69 56 61 6c 75 65 20 3d 20 69 3b 0a 20 20 20  .iValue = i;.   
13d00 20 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20       pOrderBy = 
13d10 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
13d20 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70 4f  ppend(pParse, pO
13d30 72 64 65 72 42 79 2c 20 70 4e 65 77 29 3b 0a 20  rderBy, pNew);. 
13d40 20 20 20 20 20 20 20 69 66 28 20 70 4f 72 64 65         if( pOrde
13d50 72 42 79 20 29 20 70 4f 72 64 65 72 42 79 2d 3e  rBy ) pOrderBy->
13d60 61 5b 6e 4f 72 64 65 72 42 79 2b 2b 5d 2e 69 4f  a[nOrderBy++].iO
13d70 72 64 65 72 42 79 43 6f 6c 20 3d 20 28 75 31 36  rderByCol = (u16
13d80 29 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  )i;.      }.    
13d90 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70  }.  }..  /* Comp
13da0 75 74 65 20 74 68 65 20 63 6f 6d 70 61 72 69 73  ute the comparis
13db0 6f 6e 20 70 65 72 6d 75 74 61 74 69 6f 6e 20 61  on permutation a
13dc0 6e 64 20 6b 65 79 69 6e 66 6f 20 74 68 61 74 20  nd keyinfo that 
13dd0 69 73 20 75 73 65 64 20 77 69 74 68 0a 20 20 2a  is used with.  *
13de0 2a 20 74 68 65 20 70 65 72 6d 75 74 61 74 69 6f  * the permutatio
13df0 6e 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d  n used to determ
13e00 69 6e 65 20 69 66 20 74 68 65 20 6e 65 78 74 0a  ine if the next.
13e10 20 20 2a 2a 20 72 6f 77 20 6f 66 20 72 65 73 75    ** row of resu
13e20 6c 74 73 20 63 6f 6d 65 73 20 66 72 6f 6d 20 73  lts comes from s
13e30 65 6c 65 63 74 41 20 6f 72 20 73 65 6c 65 63 74  electA or select
13e40 42 2e 20 20 41 6c 73 6f 20 61 64 64 20 65 78 70  B.  Also add exp
13e50 6c 69 63 69 74 0a 20 20 2a 2a 20 63 6f 6c 6c 61  licit.  ** colla
13e60 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 4f 52 44  tions to the ORD
13e70 45 52 20 42 59 20 63 6c 61 75 73 65 20 74 65 72  ER BY clause ter
13e80 6d 73 20 73 6f 20 74 68 61 74 20 77 68 65 6e 20  ms so that when 
13e90 74 68 65 20 73 75 62 71 75 65 72 69 65 73 0a 20  the subqueries. 
13ea0 20 2a 2a 20 74 6f 20 74 68 65 20 72 69 67 68 74   ** to the right
13eb0 20 61 6e 64 20 74 68 65 20 6c 65 66 74 20 61 72   and the left ar
13ec0 65 20 65 76 61 6c 75 61 74 65 64 2c 20 74 68 65  e evaluated, the
13ed0 79 20 75 73 65 20 74 68 65 20 63 6f 72 72 65 63  y use the correc
13ee0 74 0a 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e  t.  ** collation
13ef0 2e 0a 20 20 2a 2f 0a 20 20 61 50 65 72 6d 75 74  ..  */.  aPermut
13f00 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  e = sqlite3DbMal
13f10 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f  locRaw(db, sizeo
13f20 66 28 69 6e 74 29 2a 6e 4f 72 64 65 72 42 79 29  f(int)*nOrderBy)
13f30 3b 0a 20 20 69 66 28 20 61 50 65 72 6d 75 74 65  ;.  if( aPermute
13f40 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45   ){.    struct E
13f50 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
13f60 74 65 6d 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  tem;.    for(i=0
13f70 2c 20 70 49 74 65 6d 3d 70 4f 72 64 65 72 42 79  , pItem=pOrderBy
13f80 2d 3e 61 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b  ->a; i<nOrderBy;
13f90 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i++, pItem++){.
13fa0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
13fb0 74 65 6d 2d 3e 69 4f 72 64 65 72 42 79 43 6f 6c  tem->iOrderByCol
13fc0 3e 30 20 20 26 26 20 70 49 74 65 6d 2d 3e 69 4f  >0  && pItem->iO
13fd0 72 64 65 72 42 79 43 6f 6c 3c 3d 70 2d 3e 70 45  rderByCol<=p->pE
13fe0 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20  List->nExpr );. 
13ff0 20 20 20 20 20 61 50 65 72 6d 75 74 65 5b 69 5d       aPermute[i]
14000 20 3d 20 70 49 74 65 6d 2d 3e 69 4f 72 64 65 72   = pItem->iOrder
14010 42 79 43 6f 6c 20 2d 20 31 3b 0a 20 20 20 20 7d  ByCol - 1;.    }
14020 0a 20 20 20 20 70 4b 65 79 4d 65 72 67 65 20 3d  .    pKeyMerge =
14030 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
14040 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69  MallocRaw(db, si
14050 7a 65 6f 66 28 2a 70 4b 65 79 4d 65 72 67 65 29  zeof(*pKeyMerge)
14060 2b 6e 4f 72 64 65 72 42 79 2a 28 73 69 7a 65 6f  +nOrderBy*(sizeo
14070 66 28 43 6f 6c 6c 53 65 71 2a 29 2b 31 29 29 3b  f(CollSeq*)+1));
14080 0a 20 20 20 20 69 66 28 20 70 4b 65 79 4d 65 72  .    if( pKeyMer
14090 67 65 20 29 7b 0a 20 20 20 20 20 20 70 4b 65 79  ge ){.      pKey
140a0 4d 65 72 67 65 2d 3e 61 53 6f 72 74 4f 72 64 65  Merge->aSortOrde
140b0 72 20 3d 20 28 75 38 2a 29 26 70 4b 65 79 4d 65  r = (u8*)&pKeyMe
140c0 72 67 65 2d 3e 61 43 6f 6c 6c 5b 6e 4f 72 64 65  rge->aColl[nOrde
140d0 72 42 79 5d 3b 0a 20 20 20 20 20 20 70 4b 65 79  rBy];.      pKey
140e0 4d 65 72 67 65 2d 3e 6e 46 69 65 6c 64 20 3d 20  Merge->nField = 
140f0 28 75 31 36 29 6e 4f 72 64 65 72 42 79 3b 0a 20  (u16)nOrderBy;. 
14100 20 20 20 20 20 70 4b 65 79 4d 65 72 67 65 2d 3e       pKeyMerge->
14110 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20  enc = ENC(db);. 
14120 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
14130 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a  nOrderBy; i++){.
14140 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20          CollSeq 
14150 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20  *pColl;.        
14160 45 78 70 72 20 2a 70 54 65 72 6d 20 3d 20 70 4f  Expr *pTerm = pO
14170 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78  rderBy->a[i].pEx
14180 70 72 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  pr;.        if( 
14190 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26 20 45  pTerm->flags & E
141a0 50 5f 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20  P_Collate ){.   
141b0 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73         pColl = s
141c0 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
141d0 71 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d 29  q(pParse, pTerm)
141e0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
141f0 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 6c  .          pColl
14200 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f   = multiSelectCo
14210 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 2c  llSeq(pParse, p,
14220 20 61 50 65 72 6d 75 74 65 5b 69 5d 29 3b 0a 20   aPermute[i]);. 
14230 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f           if( pCo
14240 6c 6c 3d 3d 30 20 29 20 70 43 6f 6c 6c 20 3d 20  ll==0 ) pColl = 
14250 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20  db->pDfltColl;. 
14260 20 20 20 20 20 20 20 20 20 70 4f 72 64 65 72 42           pOrderB
14270 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 20 3d 0a  y->a[i].pExpr =.
14280 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
14290 69 74 65 33 45 78 70 72 41 64 64 43 6f 6c 6c 61  ite3ExprAddColla
142a0 74 65 53 74 72 69 6e 67 28 70 50 61 72 73 65 2c  teString(pParse,
142b0 20 70 54 65 72 6d 2c 20 70 43 6f 6c 6c 2d 3e 7a   pTerm, pColl->z
142c0 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  Name);.        }
142d0 0a 20 20 20 20 20 20 20 20 70 4b 65 79 4d 65 72  .        pKeyMer
142e0 67 65 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 70  ge->aColl[i] = p
142f0 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70 4b  Coll;.        pK
14300 65 79 4d 65 72 67 65 2d 3e 61 53 6f 72 74 4f 72  eyMerge->aSortOr
14310 64 65 72 5b 69 5d 20 3d 20 70 4f 72 64 65 72 42  der[i] = pOrderB
14320 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65  y->a[i].sortOrde
14330 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  r;.      }.    }
14340 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4b  .  }else{.    pK
14350 65 79 4d 65 72 67 65 20 3d 20 30 3b 0a 20 20 7d  eyMerge = 0;.  }
14360 0a 0a 20 20 2f 2a 20 52 65 61 74 74 61 63 68 20  ..  /* Reattach 
14370 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
14380 75 73 65 20 74 6f 20 74 68 65 20 71 75 65 72 79  use to the query
14390 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 4f 72 64  ..  */.  p->pOrd
143a0 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b  erBy = pOrderBy;
143b0 0a 20 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65  .  pPrior->pOrde
143c0 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  rBy = sqlite3Exp
143d0 72 4c 69 73 74 44 75 70 28 70 50 61 72 73 65 2d  rListDup(pParse-
143e0 3e 64 62 2c 20 70 4f 72 64 65 72 42 79 2c 20 30  >db, pOrderBy, 0
143f0 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  );..  /* Allocat
14400 65 20 61 20 72 61 6e 67 65 20 6f 66 20 74 65 6d  e a range of tem
14410 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 73  porary registers
14420 20 61 6e 64 20 74 68 65 20 4b 65 79 49 6e 66 6f   and the KeyInfo
14430 20 6e 65 65 64 65 64 0a 20 20 2a 2a 20 66 6f 72   needed.  ** for
14440 20 74 68 65 20 6c 6f 67 69 63 20 74 68 61 74 20   the logic that 
14450 72 65 6d 6f 76 65 73 20 64 75 70 6c 69 63 61 74  removes duplicat
14460 65 20 72 65 73 75 6c 74 20 72 6f 77 73 20 77 68  e result rows wh
14470 65 6e 20 74 68 65 0a 20 20 2a 2a 20 6f 70 65 72  en the.  ** oper
14480 61 74 6f 72 20 69 73 20 55 4e 49 4f 4e 2c 20 45  ator is UNION, E
14490 58 43 45 50 54 2c 20 6f 72 20 49 4e 54 45 52 53  XCEPT, or INTERS
144a0 45 43 54 20 28 62 75 74 20 6e 6f 74 20 55 4e 49  ECT (but not UNI
144b0 4f 4e 20 41 4c 4c 29 2e 0a 20 20 2a 2f 0a 20 20  ON ALL)..  */.  
144c0 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29  if( op==TK_ALL )
144d0 7b 0a 20 20 20 20 72 65 67 50 72 65 76 20 3d 20  {.    regPrev = 
144e0 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
144f0 69 6e 74 20 6e 45 78 70 72 20 3d 20 70 2d 3e 70  int nExpr = p->p
14500 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  EList->nExpr;.  
14510 20 20 61 73 73 65 72 74 28 20 6e 4f 72 64 65 72    assert( nOrder
14520 42 79 3e 3d 6e 45 78 70 72 20 7c 7c 20 64 62 2d  By>=nExpr || db-
14530 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
14540 0a 20 20 20 20 72 65 67 50 72 65 76 20 3d 20 70  .    regPrev = p
14550 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20  Parse->nMem+1;. 
14560 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
14570 2b 3d 20 6e 45 78 70 72 2b 31 3b 0a 20 20 20 20  += nExpr+1;.    
14580 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14590 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
145a0 20 30 2c 20 72 65 67 50 72 65 76 29 3b 0a 20 20   0, regPrev);.  
145b0 20 20 70 4b 65 79 44 75 70 20 3d 20 73 71 6c 69    pKeyDup = sqli
145c0 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
145d0 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  db,.            
145e0 20 20 20 20 20 20 73 69 7a 65 6f 66 28 2a 70 4b        sizeof(*pK
145f0 65 79 44 75 70 29 20 2b 20 6e 45 78 70 72 2a 28  eyDup) + nExpr*(
14600 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29  sizeof(CollSeq*)
14610 2b 31 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  +1) );.    if( p
14620 4b 65 79 44 75 70 20 29 7b 0a 20 20 20 20 20 20  KeyDup ){.      
14630 70 4b 65 79 44 75 70 2d 3e 61 53 6f 72 74 4f 72  pKeyDup->aSortOr
14640 64 65 72 20 3d 20 28 75 38 2a 29 26 70 4b 65 79  der = (u8*)&pKey
14650 44 75 70 2d 3e 61 43 6f 6c 6c 5b 6e 45 78 70 72  Dup->aColl[nExpr
14660 5d 3b 0a 20 20 20 20 20 20 70 4b 65 79 44 75 70  ];.      pKeyDup
14670 2d 3e 6e 46 69 65 6c 64 20 3d 20 28 75 31 36 29  ->nField = (u16)
14680 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 70 4b 65  nExpr;.      pKe
14690 79 44 75 70 2d 3e 65 6e 63 20 3d 20 45 4e 43 28  yDup->enc = ENC(
146a0 64 62 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  db);.      for(i
146b0 3d 30 3b 20 69 3c 6e 45 78 70 72 3b 20 69 2b 2b  =0; i<nExpr; i++
146c0 29 7b 0a 20 20 20 20 20 20 20 20 70 4b 65 79 44  ){.        pKeyD
146d0 75 70 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 6d  up->aColl[i] = m
146e0 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65  ultiSelectCollSe
146f0 71 28 70 50 61 72 73 65 2c 20 70 2c 20 69 29 3b  q(pParse, p, i);
14700 0a 20 20 20 20 20 20 20 20 70 4b 65 79 44 75 70  .        pKeyDup
14710 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20  ->aSortOrder[i] 
14720 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
14730 20 7d 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20 53 65   }.  }. .  /* Se
14740 70 61 72 61 74 65 20 74 68 65 20 6c 65 66 74 20  parate the left 
14750 61 6e 64 20 74 68 65 20 72 69 67 68 74 20 71 75  and the right qu
14760 65 72 79 20 66 72 6f 6d 20 6f 6e 65 20 61 6e 6f  ery from one ano
14770 74 68 65 72 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70  ther.  */.  p->p
14780 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 73 71 6c  Prior = 0;.  sql
14790 69 74 65 33 52 65 73 6f 6c 76 65 4f 72 64 65 72  ite3ResolveOrder
147a0 47 72 6f 75 70 42 79 28 70 50 61 72 73 65 2c 20  GroupBy(pParse, 
147b0 70 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20  p, p->pOrderBy, 
147c0 22 4f 52 44 45 52 22 29 3b 0a 20 20 69 66 28 20  "ORDER");.  if( 
147d0 70 50 72 69 6f 72 2d 3e 70 50 72 69 6f 72 3d 3d  pPrior->pPrior==
147e0 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
147f0 52 65 73 6f 6c 76 65 4f 72 64 65 72 47 72 6f 75  ResolveOrderGrou
14800 70 42 79 28 70 50 61 72 73 65 2c 20 70 50 72 69  pBy(pParse, pPri
14810 6f 72 2c 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64  or, pPrior->pOrd
14820 65 72 42 79 2c 20 22 4f 52 44 45 52 22 29 3b 0a  erBy, "ORDER");.
14830 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74    }..  /* Comput
14840 65 20 74 68 65 20 6c 69 6d 69 74 20 72 65 67 69  e the limit regi
14850 73 74 65 72 73 20 2a 2f 0a 20 20 63 6f 6d 70 75  sters */.  compu
14860 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73  teLimitRegisters
14870 28 70 50 61 72 73 65 2c 20 70 2c 20 6c 61 62 65  (pParse, p, labe
14880 6c 45 6e 64 29 3b 0a 20 20 69 66 28 20 70 2d 3e  lEnd);.  if( p->
14890 69 4c 69 6d 69 74 20 26 26 20 6f 70 3d 3d 54 4b  iLimit && op==TK
148a0 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 72 65 67 4c  _ALL ){.    regL
148b0 69 6d 69 74 41 20 3d 20 2b 2b 70 50 61 72 73 65  imitA = ++pParse
148c0 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72 65 67 4c  ->nMem;.    regL
148d0 69 6d 69 74 42 20 3d 20 2b 2b 70 50 61 72 73 65  imitB = ++pParse
148e0 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69  ->nMem;.    sqli
148f0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
14900 20 4f 50 5f 43 6f 70 79 2c 20 70 2d 3e 69 4f 66   OP_Copy, p->iOf
14910 66 73 65 74 20 3f 20 70 2d 3e 69 4f 66 66 73 65  fset ? p->iOffse
14920 74 2b 31 20 3a 20 70 2d 3e 69 4c 69 6d 69 74 2c  t+1 : p->iLimit,
14930 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
14940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14950 20 20 20 72 65 67 4c 69 6d 69 74 41 29 3b 0a 20     regLimitA);. 
14960 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
14970 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c  dOp2(v, OP_Copy,
14980 20 72 65 67 4c 69 6d 69 74 41 2c 20 72 65 67 4c   regLimitA, regL
14990 69 6d 69 74 42 29 3b 0a 20 20 7d 65 6c 73 65 7b  imitB);.  }else{
149a0 0a 20 20 20 20 72 65 67 4c 69 6d 69 74 41 20 3d  .    regLimitA =
149b0 20 72 65 67 4c 69 6d 69 74 42 20 3d 20 30 3b 0a   regLimitB = 0;.
149c0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70    }.  sqlite3Exp
149d0 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  rDelete(db, p->p
149e0 4c 69 6d 69 74 29 3b 0a 20 20 70 2d 3e 70 4c 69  Limit);.  p->pLi
149f0 6d 69 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  mit = 0;.  sqlit
14a00 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
14a10 20 70 2d 3e 70 4f 66 66 73 65 74 29 3b 0a 20 20   p->pOffset);.  
14a20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a  p->pOffset = 0;.
14a30 0a 20 20 72 65 67 41 64 64 72 41 20 3d 20 2b 2b  .  regAddrA = ++
14a40 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
14a50 72 65 67 45 6f 66 41 20 3d 20 2b 2b 70 50 61 72  regEofA = ++pPar
14a60 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 41  se->nMem;.  regA
14a70 64 64 72 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d  ddrB = ++pParse-
14a80 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 45 6f 66 42  >nMem;.  regEofB
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 41 20 3d 20 2b  m;.  regOutA = +
14ab0 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
14ac0 20 72 65 67 4f 75 74 42 20 3d 20 2b 2b 70 50 61   regOutB = ++pPa
14ad0 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71 6c  rse->nMem;.  sql
14ae0 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e  ite3SelectDestIn
14af0 69 74 28 26 64 65 73 74 41 2c 20 53 52 54 5f 43  it(&destA, SRT_C
14b00 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64  oroutine, regAdd
14b10 72 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  rA);.  sqlite3Se
14b20 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65  lectDestInit(&de
14b30 73 74 42 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69  stB, SRT_Corouti
14b40 6e 65 2c 20 72 65 67 41 64 64 72 42 29 3b 0a 0a  ne, regAddrB);..
14b50 20 20 2f 2a 20 4a 75 6d 70 20 70 61 73 74 20 74    /* Jump past t
14b60 68 65 20 76 61 72 69 6f 75 73 20 73 75 62 72 6f  he various subro
14b70 75 74 69 6e 65 73 20 61 6e 64 20 63 6f 72 6f 75  utines and corou
14b80 74 69 6e 65 73 20 74 6f 20 74 68 65 20 6d 61 69  tines to the mai
14b90 6e 0a 20 20 2a 2a 20 6d 65 72 67 65 20 6c 6f 6f  n.  ** merge loo
14ba0 70 0a 20 20 2a 2f 0a 20 20 6a 31 20 3d 20 73 71  p.  */.  j1 = sq
14bb0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
14bc0 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20 61  v, OP_Goto);.  a
14bd0 64 64 72 53 65 6c 65 63 74 41 20 3d 20 73 71 6c  ddrSelectA = sql
14be0 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
14bf0 64 64 72 28 76 29 3b 0a 0a 0a 20 20 2f 2a 20 47  ddr(v);...  /* G
14c00 65 6e 65 72 61 74 65 20 61 20 63 6f 72 6f 75 74  enerate a corout
14c10 69 6e 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20  ine to evaluate 
14c20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
14c30 6d 65 6e 74 20 74 6f 20 74 68 65 0a 20 20 2a 2a  ment to the.  **
14c40 20 6c 65 66 74 20 6f 66 20 74 68 65 20 63 6f 6d   left of the com
14c50 70 6f 75 6e 64 20 6f 70 65 72 61 74 6f 72 20 2d  pound operator -
14c60 20 74 68 65 20 22 41 22 20 73 65 6c 65 63 74 2e   the "A" select.
14c70 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70  .  */.  VdbeNoop
14c80 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 42 65 67  Comment((v, "Beg
14c90 69 6e 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72  in coroutine for
14ca0 20 6c 65 66 74 20 53 45 4c 45 43 54 22 29 29 3b   left SELECT"));
14cb0 0a 20 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69  .  pPrior->iLimi
14cc0 74 20 3d 20 72 65 67 4c 69 6d 69 74 41 3b 0a 20  t = regLimitA;. 
14cd0 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67   explainSetInteg
14ce0 65 72 28 69 53 75 62 31 2c 20 70 50 61 72 73 65  er(iSub1, pParse
14cf0 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29  ->iNextSelectId)
14d00 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ;.  sqlite3Selec
14d10 74 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72  t(pParse, pPrior
14d20 2c 20 26 64 65 73 74 41 29 3b 0a 20 20 73 71 6c  , &destA);.  sql
14d30 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
14d40 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c  , OP_Integer, 1,
14d50 20 72 65 67 45 6f 66 41 29 3b 0a 20 20 73 71 6c   regEofA);.  sql
14d60 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
14d70 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41  , OP_Yield, regA
14d80 64 64 72 41 29 3b 0a 20 20 56 64 62 65 4e 6f 6f  ddrA);.  VdbeNoo
14d90 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 45 6e  pComment((v, "En
14da0 64 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20  d coroutine for 
14db0 6c 65 66 74 20 53 45 4c 45 43 54 22 29 29 3b 0a  left SELECT"));.
14dc0 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61  .  /* Generate a
14dd0 20 63 6f 72 6f 75 74 69 6e 65 20 74 6f 20 65 76   coroutine to ev
14de0 61 6c 75 61 74 65 20 74 68 65 20 53 45 4c 45 43  aluate the SELEC
14df0 54 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 20 0a  T statement on .
14e00 20 20 2a 2a 20 74 68 65 20 72 69 67 68 74 20 2d    ** the right -
14e10 20 74 68 65 20 22 42 22 20 73 65 6c 65 63 74 0a   the "B" select.
14e20 20 20 2a 2f 0a 20 20 61 64 64 72 53 65 6c 65 63    */.  addrSelec
14e30 74 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  tB = sqlite3Vdbe
14e40 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
14e50 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e    VdbeNoopCommen
14e60 74 28 28 76 2c 20 22 42 65 67 69 6e 20 63 6f 72  t((v, "Begin cor
14e70 6f 75 74 69 6e 65 20 66 6f 72 20 72 69 67 68 74  outine for right
14e80 20 53 45 4c 45 43 54 22 29 29 3b 0a 20 20 73 61   SELECT"));.  sa
14e90 76 65 64 4c 69 6d 69 74 20 3d 20 70 2d 3e 69 4c  vedLimit = p->iL
14ea0 69 6d 69 74 3b 0a 20 20 73 61 76 65 64 4f 66 66  imit;.  savedOff
14eb0 73 65 74 20 3d 20 70 2d 3e 69 4f 66 66 73 65 74  set = p->iOffset
14ec0 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20  ;.  p->iLimit = 
14ed0 72 65 67 4c 69 6d 69 74 42 3b 0a 20 20 70 2d 3e  regLimitB;.  p->
14ee0 69 4f 66 66 73 65 74 20 3d 20 30 3b 20 20 0a 20  iOffset = 0;  . 
14ef0 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67   explainSetInteg
14f00 65 72 28 69 53 75 62 32 2c 20 70 50 61 72 73 65  er(iSub2, pParse
14f10 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29  ->iNextSelectId)
14f20 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ;.  sqlite3Selec
14f30 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64 65  t(pParse, p, &de
14f40 73 74 42 29 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69  stB);.  p->iLimi
14f50 74 20 3d 20 73 61 76 65 64 4c 69 6d 69 74 3b 0a  t = savedLimit;.
14f60 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 73    p->iOffset = s
14f70 61 76 65 64 4f 66 66 73 65 74 3b 0a 20 20 73 71  avedOffset;.  sq
14f80 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
14f90 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31  v, OP_Integer, 1
14fa0 2c 20 72 65 67 45 6f 66 42 29 3b 0a 20 20 73 71  , regEofB);.  sq
14fb0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
14fc0 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67  v, OP_Yield, reg
14fd0 41 64 64 72 42 29 3b 0a 20 20 56 64 62 65 4e 6f  AddrB);.  VdbeNo
14fe0 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 45  opComment((v, "E
14ff0 6e 64 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72  nd coroutine for
15000 20 72 69 67 68 74 20 53 45 4c 45 43 54 22 29 29   right SELECT"))
15010 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  ;..  /* Generate
15020 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68   a subroutine th
15030 61 74 20 6f 75 74 70 75 74 73 20 74 68 65 20 63  at outputs the c
15040 75 72 72 65 6e 74 20 72 6f 77 20 6f 66 20 74 68  urrent row of th
15050 65 20 41 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20  e A.  ** select 
15060 61 73 20 74 68 65 20 6e 65 78 74 20 6f 75 74 70  as the next outp
15070 75 74 20 72 6f 77 20 6f 66 20 74 68 65 20 63 6f  ut row of the co
15080 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20  mpound select.. 
15090 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f   */.  VdbeNoopCo
150a0 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 75 74 70 75  mment((v, "Outpu
150b0 74 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 41 22  t routine for A"
150c0 29 29 3b 0a 20 20 61 64 64 72 4f 75 74 41 20 3d  ));.  addrOutA =
150d0 20 67 65 6e 65 72 61 74 65 4f 75 74 70 75 74 53   generateOutputS
150e0 75 62 72 6f 75 74 69 6e 65 28 70 50 61 72 73 65  ubroutine(pParse
150f0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
15100 20 20 20 70 2c 20 26 64 65 73 74 41 2c 20 70 44     p, &destA, pD
15110 65 73 74 2c 20 72 65 67 4f 75 74 41 2c 0a 20 20  est, regOutA,.  
15120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
15130 65 67 50 72 65 76 2c 20 70 4b 65 79 44 75 70 2c  egPrev, pKeyDup,
15140 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44   P4_KEYINFO_HAND
15150 4f 46 46 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a  OFF, labelEnd);.
15160 20 20 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65    .  /* Generate
15170 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68   a subroutine th
15180 61 74 20 6f 75 74 70 75 74 73 20 74 68 65 20 63  at outputs the c
15190 75 72 72 65 6e 74 20 72 6f 77 20 6f 66 20 74 68  urrent row of th
151a0 65 20 42 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20  e B.  ** select 
151b0 61 73 20 74 68 65 20 6e 65 78 74 20 6f 75 74 70  as the next outp
151c0 75 74 20 72 6f 77 20 6f 66 20 74 68 65 20 63 6f  ut row of the co
151d0 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20  mpound select.. 
151e0 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b   */.  if( op==TK
151f0 5f 41 4c 4c 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55  _ALL || op==TK_U
15200 4e 49 4f 4e 20 29 7b 0a 20 20 20 20 56 64 62 65  NION ){.    Vdbe
15210 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  NoopComment((v, 
15220 22 4f 75 74 70 75 74 20 72 6f 75 74 69 6e 65 20  "Output routine 
15230 66 6f 72 20 42 22 29 29 3b 0a 20 20 20 20 61 64  for B"));.    ad
15240 64 72 4f 75 74 42 20 3d 20 67 65 6e 65 72 61 74  drOutB = generat
15250 65 4f 75 74 70 75 74 53 75 62 72 6f 75 74 69 6e  eOutputSubroutin
15260 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  e(pParse,.      
15270 20 20 20 20 20 20 20 20 20 20 20 70 2c 20 26 64             p, &d
15280 65 73 74 42 2c 20 70 44 65 73 74 2c 20 72 65 67  estB, pDest, reg
15290 4f 75 74 42 2c 0a 20 20 20 20 20 20 20 20 20 20  OutB,.          
152a0 20 20 20 20 20 20 20 72 65 67 50 72 65 76 2c 20         regPrev, 
152b0 70 4b 65 79 44 75 70 2c 20 50 34 5f 4b 45 59 49  pKeyDup, P4_KEYI
152c0 4e 46 4f 5f 53 54 41 54 49 43 2c 20 6c 61 62 65  NFO_STATIC, labe
152d0 6c 45 6e 64 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  lEnd);.  }..  /*
152e0 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72   Generate a subr
152f0 6f 75 74 69 6e 65 20 74 6f 20 72 75 6e 20 77 68  outine to run wh
15300 65 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 66  en the results f
15310 72 6f 6d 20 73 65 6c 65 63 74 20 41 0a 20 20 2a  rom select A.  *
15320 2a 20 61 72 65 20 65 78 68 61 75 73 74 65 64 20  * are exhausted 
15330 61 6e 64 20 6f 6e 6c 79 20 64 61 74 61 20 69 6e  and only data in
15340 20 73 65 6c 65 63 74 20 42 20 72 65 6d 61 69 6e   select B remain
15350 73 2e 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f  s..  */.  VdbeNo
15360 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65  opComment((v, "e
15370 6f 66 2d 41 20 73 75 62 72 6f 75 74 69 6e 65 22  of-A subroutine"
15380 29 29 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b  ));.  if( op==TK
15390 5f 45 58 43 45 50 54 20 7c 7c 20 6f 70 3d 3d 54  _EXCEPT || op==T
153a0 4b 5f 49 4e 54 45 52 53 45 43 54 20 29 7b 0a 20  K_INTERSECT ){. 
153b0 20 20 20 61 64 64 72 45 6f 66 41 20 3d 20 73 71     addrEofA = sq
153c0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
153d0 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c  v, OP_Goto, 0, l
153e0 61 62 65 6c 45 6e 64 29 3b 0a 20 20 7d 65 6c 73  abelEnd);.  }els
153f0 65 7b 20 20 0a 20 20 20 20 61 64 64 72 45 6f 66  e{  .    addrEof
15400 41 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  A = sqlite3VdbeA
15410 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20  ddOp2(v, OP_If, 
15420 72 65 67 45 6f 66 42 2c 20 6c 61 62 65 6c 45 6e  regEofB, labelEn
15430 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  d);.    sqlite3V
15440 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
15450 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 42 2c 20  Gosub, regOutB, 
15460 61 64 64 72 4f 75 74 42 29 3b 0a 20 20 20 20 73  addrOutB);.    s
15470 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
15480 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65  (v, OP_Yield, re
15490 67 41 64 64 72 42 29 3b 0a 20 20 20 20 73 71 6c  gAddrB);.    sql
154a0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
154b0 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64  , OP_Goto, 0, ad
154c0 64 72 45 6f 66 41 29 3b 0a 20 20 20 20 70 2d 3e  drEofA);.    p->
154d0 6e 53 65 6c 65 63 74 52 6f 77 20 2b 3d 20 70 50  nSelectRow += pP
154e0 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  rior->nSelectRow
154f0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65  ;.  }..  /* Gene
15500 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e  rate a subroutin
15510 65 20 74 6f 20 72 75 6e 20 77 68 65 6e 20 74 68  e to run when th
15520 65 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 73  e results from s
15530 65 6c 65 63 74 20 42 0a 20 20 2a 2a 20 61 72 65  elect B.  ** are
15540 20 65 78 68 61 75 73 74 65 64 20 61 6e 64 20 6f   exhausted and o
15550 6e 6c 79 20 64 61 74 61 20 69 6e 20 73 65 6c 65  nly data in sele
15560 63 74 20 41 20 72 65 6d 61 69 6e 73 2e 0a 20 20  ct A remains..  
15570 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  */.  if( op==TK_
15580 49 4e 54 45 52 53 45 43 54 20 29 7b 0a 20 20 20  INTERSECT ){.   
15590 20 61 64 64 72 45 6f 66 42 20 3d 20 61 64 64 72   addrEofB = addr
155a0 45 6f 66 41 3b 0a 20 20 20 20 69 66 28 20 70 2d  EofA;.    if( p-
155b0 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3e 20 70 50  >nSelectRow > pP
155c0 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  rior->nSelectRow
155d0 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77   ) p->nSelectRow
155e0 20 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65   = pPrior->nSele
155f0 63 74 52 6f 77 3b 0a 20 20 7d 65 6c 73 65 7b 20  ctRow;.  }else{ 
15600 20 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f   .    VdbeNoopCo
15610 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6f 66 2d 42  mment((v, "eof-B
15620 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a   subroutine"));.
15630 20 20 20 20 61 64 64 72 45 6f 66 42 20 3d 20 73      addrEofB = s
15640 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
15650 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 45 6f  (v, OP_If, regEo
15660 66 41 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20  fA, labelEnd);. 
15670 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
15680 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
15690 2c 20 72 65 67 4f 75 74 41 2c 20 61 64 64 72 4f  , regOutA, addrO
156a0 75 74 41 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  utA);.    sqlite
156b0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
156c0 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72  P_Yield, regAddr
156d0 41 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  A);.    sqlite3V
156e0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
156f0 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 45 6f 66  Goto, 0, addrEof
15700 42 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65  B);.  }..  /* Ge
15710 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 68  nerate code to h
15720 61 6e 64 6c 65 20 74 68 65 20 63 61 73 65 20 6f  andle the case o
15730 66 20 41 3c 42 0a 20 20 2a 2f 0a 20 20 56 64 62  f A<B.  */.  Vdb
15740 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c  eNoopComment((v,
15750 20 22 41 2d 6c 74 2d 42 20 73 75 62 72 6f 75 74   "A-lt-B subrout
15760 69 6e 65 22 29 29 3b 0a 20 20 61 64 64 72 41 6c  ine"));.  addrAl
15770 74 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  tB = sqlite3Vdbe
15780 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
15790 75 62 2c 20 72 65 67 4f 75 74 41 2c 20 61 64 64  ub, regOutA, add
157a0 72 4f 75 74 41 29 3b 0a 20 20 73 71 6c 69 74 65  rOutA);.  sqlite
157b0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
157c0 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72  P_Yield, regAddr
157d0 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  A);.  sqlite3Vdb
157e0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66  eAddOp2(v, OP_If
157f0 2c 20 72 65 67 45 6f 66 41 2c 20 61 64 64 72 45  , regEofA, addrE
15800 6f 66 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ofA);.  sqlite3V
15810 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
15820 47 6f 74 6f 2c 20 30 2c 20 6c 61 62 65 6c 43 6d  Goto, 0, labelCm
15830 70 72 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  pr);..  /* Gener
15840 61 74 65 20 63 6f 64 65 20 74 6f 20 68 61 6e 64  ate code to hand
15850 6c 65 20 74 68 65 20 63 61 73 65 20 6f 66 20 41  le the case of A
15860 3d 3d 42 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f  ==B.  */.  if( o
15870 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20  p==TK_ALL ){.   
15880 20 61 64 64 72 41 65 71 42 20 3d 20 61 64 64 72   addrAeqB = addr
15890 41 6c 74 42 3b 0a 20 20 7d 65 6c 73 65 20 69 66  AltB;.  }else if
158a0 28 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45  ( op==TK_INTERSE
158b0 43 54 20 29 7b 0a 20 20 20 20 61 64 64 72 41 65  CT ){.    addrAe
158c0 71 42 20 3d 20 61 64 64 72 41 6c 74 42 3b 0a 20  qB = addrAltB;. 
158d0 20 20 20 61 64 64 72 41 6c 74 42 2b 2b 3b 0a 20     addrAltB++;. 
158e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 56 64 62 65   }else{.    Vdbe
158f0 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  NoopComment((v, 
15900 22 41 2d 65 71 2d 42 20 73 75 62 72 6f 75 74 69  "A-eq-B subrouti
15910 6e 65 22 29 29 3b 0a 20 20 20 20 61 64 64 72 41  ne"));.    addrA
15920 65 71 42 20 3d 0a 20 20 20 20 73 71 6c 69 74 65  eqB =.    sqlite
15930 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
15940 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72  P_Yield, regAddr
15950 41 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  A);.    sqlite3V
15960 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
15970 49 66 2c 20 72 65 67 45 6f 66 41 2c 20 61 64 64  If, regEofA, add
15980 72 45 6f 66 41 29 3b 0a 20 20 20 20 73 71 6c 69  rEofA);.    sqli
15990 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
159a0 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c 61 62   OP_Goto, 0, lab
159b0 65 6c 43 6d 70 72 29 3b 0a 20 20 7d 0a 0a 20 20  elCmpr);.  }..  
159c0 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
159d0 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 63   to handle the c
159e0 61 73 65 20 6f 66 20 41 3e 42 0a 20 20 2a 2f 0a  ase of A>B.  */.
159f0 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e    VdbeNoopCommen
15a00 74 28 28 76 2c 20 22 41 2d 67 74 2d 42 20 73 75  t((v, "A-gt-B su
15a10 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 61  broutine"));.  a
15a20 64 64 72 41 67 74 42 20 3d 20 73 71 6c 69 74 65  ddrAgtB = sqlite
15a30 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
15a40 28 76 29 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54  (v);.  if( op==T
15a50 4b 5f 41 4c 4c 20 7c 7c 20 6f 70 3d 3d 54 4b 5f  K_ALL || op==TK_
15a60 55 4e 49 4f 4e 20 29 7b 0a 20 20 20 20 73 71 6c  UNION ){.    sql
15a70 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
15a80 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f  , OP_Gosub, regO
15a90 75 74 42 2c 20 61 64 64 72 4f 75 74 42 29 3b 0a  utB, addrOutB);.
15aa0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
15ab0 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69  eAddOp1(v, OP_Yi
15ac0 65 6c 64 2c 20 72 65 67 41 64 64 72 42 29 3b 0a  eld, regAddrB);.
15ad0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15ae0 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65  Op2(v, OP_If, re
15af0 67 45 6f 66 42 2c 20 61 64 64 72 45 6f 66 42 29  gEofB, addrEofB)
15b00 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
15b10 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
15b20 2c 20 30 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b  , 0, labelCmpr);
15b30 0a 0a 20 20 2f 2a 20 54 68 69 73 20 63 6f 64 65  ..  /* This code
15b40 20 72 75 6e 73 20 6f 6e 63 65 20 74 6f 20 69 6e   runs once to in
15b50 69 74 69 61 6c 69 7a 65 20 65 76 65 72 79 74 68  itialize everyth
15b60 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  ing..  */.  sqli
15b70 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
15b80 76 2c 20 6a 31 29 3b 0a 20 20 73 71 6c 69 74 65  v, j1);.  sqlite
15b90 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
15ba0 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65  P_Integer, 0, re
15bb0 67 45 6f 66 41 29 3b 0a 20 20 73 71 6c 69 74 65  gEofA);.  sqlite
15bc0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
15bd0 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65  P_Integer, 0, re
15be0 67 45 6f 66 42 29 3b 0a 20 20 73 71 6c 69 74 65  gEofB);.  sqlite
15bf0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
15c00 50 5f 47 6f 73 75 62 2c 20 72 65 67 41 64 64 72  P_Gosub, regAddr
15c10 41 2c 20 61 64 64 72 53 65 6c 65 63 74 41 29 3b  A, addrSelectA);
15c20 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
15c30 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
15c40 2c 20 72 65 67 41 64 64 72 42 2c 20 61 64 64 72  , regAddrB, addr
15c50 53 65 6c 65 63 74 42 29 3b 0a 20 20 73 71 6c 69  SelectB);.  sqli
15c60 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
15c70 20 4f 50 5f 49 66 2c 20 72 65 67 45 6f 66 41 2c   OP_If, regEofA,
15c80 20 61 64 64 72 45 6f 66 41 29 3b 0a 20 20 73 71   addrEofA);.  sq
15c90 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
15ca0 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 45 6f 66  v, OP_If, regEof
15cb0 42 2c 20 61 64 64 72 45 6f 66 42 29 3b 0a 0a 20  B, addrEofB);.. 
15cc0 20 2f 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 74 68   /* Implement th
15cd0 65 20 6d 61 69 6e 20 6d 65 72 67 65 20 6c 6f 6f  e main merge loo
15ce0 70 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  p.  */.  sqlite3
15cf0 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
15d00 28 76 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a  (v, labelCmpr);.
15d10 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15d20 4f 70 34 28 76 2c 20 4f 50 5f 50 65 72 6d 75 74  Op4(v, OP_Permut
15d30 61 74 69 6f 6e 2c 20 30 2c 20 30 2c 20 30 2c 20  ation, 0, 0, 0, 
15d40 28 63 68 61 72 2a 29 61 50 65 72 6d 75 74 65 2c  (char*)aPermute,
15d50 20 50 34 5f 49 4e 54 41 52 52 41 59 29 3b 0a 20   P4_INTARRAY);. 
15d60 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15d70 70 34 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65  p4(v, OP_Compare
15d80 2c 20 64 65 73 74 41 2e 69 53 64 73 74 2c 20 64  , destA.iSdst, d
15d90 65 73 74 42 2e 69 53 64 73 74 2c 20 6e 4f 72 64  estB.iSdst, nOrd
15da0 65 72 42 79 2c 0a 20 20 20 20 20 20 20 20 20 20  erBy,.          
15db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
15dc0 63 68 61 72 2a 29 70 4b 65 79 4d 65 72 67 65 2c  char*)pKeyMerge,
15dd0 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44   P4_KEYINFO_HAND
15de0 4f 46 46 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  OFF);.  sqlite3V
15df0 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f  dbeChangeP5(v, O
15e00 50 46 4c 41 47 5f 50 45 52 4d 55 54 45 29 3b 0a  PFLAG_PERMUTE);.
15e10 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15e20 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20  Op3(v, OP_Jump, 
15e30 61 64 64 72 41 6c 74 42 2c 20 61 64 64 72 41 65  addrAltB, addrAe
15e40 71 42 2c 20 61 64 64 72 41 67 74 42 29 3b 0a 0a  qB, addrAgtB);..
15e50 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65    /* Jump to the
15e60 20 74 68 69 73 20 70 6f 69 6e 74 20 69 6e 20 6f   this point in o
15e70 72 64 65 72 20 74 6f 20 74 65 72 6d 69 6e 61 74  rder to terminat
15e80 65 20 74 68 65 20 71 75 65 72 79 2e 0a 20 20 2a  e the query..  *
15e90 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  /.  sqlite3VdbeR
15ea0 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c  esolveLabel(v, l
15eb0 61 62 65 6c 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20  abelEnd);..  /* 
15ec0 53 65 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  Set the number o
15ed0 66 20 6f 75 74 70 75 74 20 63 6f 6c 75 6d 6e 73  f output columns
15ee0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 44 65 73  .  */.  if( pDes
15ef0 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75  t->eDest==SRT_Ou
15f00 74 70 75 74 20 29 7b 0a 20 20 20 20 53 65 6c 65  tput ){.    Sele
15f10 63 74 20 2a 70 46 69 72 73 74 20 3d 20 70 50 72  ct *pFirst = pPr
15f20 69 6f 72 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  ior;.    while( 
15f30 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 20 29  pFirst->pPrior )
15f40 20 70 46 69 72 73 74 20 3d 20 70 46 69 72 73 74   pFirst = pFirst
15f50 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 67 65  ->pPrior;.    ge
15f60 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65  nerateColumnName
15f70 73 28 70 50 61 72 73 65 2c 20 30 2c 20 70 46 69  s(pParse, 0, pFi
15f80 72 73 74 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  rst->pEList);.  
15f90 7d 0a 0a 20 20 2f 2a 20 52 65 61 73 73 65 6d 62  }..  /* Reassemb
15fa0 6c 79 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  ly the compound 
15fb0 71 75 65 72 79 20 73 6f 20 74 68 61 74 20 69 74  query so that it
15fc0 20 77 69 6c 6c 20 62 65 20 66 72 65 65 64 20 63   will be freed c
15fd0 6f 72 72 65 63 74 6c 79 0a 20 20 2a 2a 20 62 79  orrectly.  ** by
15fe0 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e   the calling fun
15ff0 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 66 28 20 70  ction */.  if( p
16000 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20  ->pPrior ){.    
16010 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
16020 65 74 65 28 64 62 2c 20 70 2d 3e 70 50 72 69 6f  ete(db, p->pPrio
16030 72 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 50 72  r);.  }.  p->pPr
16040 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 0a 20  ior = pPrior;.. 
16050 20 2f 2a 2a 2a 20 54 42 44 3a 20 20 49 6e 73 65   /*** TBD:  Inse
16060 72 74 20 73 75 62 72 6f 75 74 69 6e 65 20 63 61  rt subroutine ca
16070 6c 6c 73 20 74 6f 20 63 6c 6f 73 65 20 63 75 72  lls to close cur
16080 73 6f 72 73 20 6f 6e 20 69 6e 63 6f 6d 70 6c 65  sors on incomple
16090 74 65 0a 20 20 2a 2a 2a 2a 20 73 75 62 71 75 65  te.  **** subque
160a0 72 69 65 73 20 2a 2a 2a 2a 2f 0a 20 20 65 78 70  ries ****/.  exp
160b0 6c 61 69 6e 43 6f 6d 70 6f 73 69 74 65 28 70 50  lainComposite(pP
160c0 61 72 73 65 2c 20 70 2d 3e 6f 70 2c 20 69 53 75  arse, p->op, iSu
160d0 62 31 2c 20 69 53 75 62 32 2c 20 30 29 3b 0a 20  b1, iSub2, 0);. 
160e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
160f0 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  K;.}.#endif..#if
16100 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
16110 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20  _OMIT_SUBQUERY) 
16120 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
16130 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 2f 2a  TE_OMIT_VIEW)./*
16140 20 46 6f 72 77 61 72 64 20 44 65 63 6c 61 72 61   Forward Declara
16150 74 69 6f 6e 73 20 2a 2f 0a 73 74 61 74 69 63 20  tions */.static 
16160 76 6f 69 64 20 73 75 62 73 74 45 78 70 72 4c 69  void substExprLi
16170 73 74 28 73 71 6c 69 74 65 33 2a 2c 20 45 78 70  st(sqlite3*, Exp
16180 72 4c 69 73 74 2a 2c 20 69 6e 74 2c 20 45 78 70  rList*, int, Exp
16190 72 4c 69 73 74 2a 29 3b 0a 73 74 61 74 69 63 20  rList*);.static 
161a0 76 6f 69 64 20 73 75 62 73 74 53 65 6c 65 63 74  void substSelect
161b0 28 73 71 6c 69 74 65 33 2a 2c 20 53 65 6c 65 63  (sqlite3*, Selec
161c0 74 20 2a 2c 20 69 6e 74 2c 20 45 78 70 72 4c 69  t *, int, ExprLi
161d0 73 74 20 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 53 63  st *);../*.** Sc
161e0 61 6e 20 74 68 72 6f 75 67 68 20 74 68 65 20 65  an through the e
161f0 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e  xpression pExpr.
16200 20 20 52 65 70 6c 61 63 65 20 65 76 65 72 79 20    Replace every 
16210 72 65 66 65 72 65 6e 63 65 20 74 6f 0a 2a 2a 20  reference to.** 
16220 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 61 62 6c  a column in tabl
16230 65 20 6e 75 6d 62 65 72 20 69 54 61 62 6c 65 20  e number iTable 
16240 77 69 74 68 20 61 20 63 6f 70 79 20 6f 66 20 74  with a copy of t
16250 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 0a 2a 2a  he iColumn-th.**
16260 20 65 6e 74 72 79 20 69 6e 20 70 45 4c 69 73 74   entry in pEList
16270 2e 20 20 28 42 75 74 20 6c 65 61 76 65 20 72 65  .  (But leave re
16280 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
16290 52 4f 57 49 44 20 63 6f 6c 75 6d 6e 20 0a 2a 2a  ROWID column .**
162a0 20 75 6e 63 68 61 6e 67 65 64 2e 29 0a 2a 2a 0a   unchanged.).**.
162b0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
162c0 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 66  is part of the f
162d0 6c 61 74 74 65 6e 69 6e 67 20 70 72 6f 63 65 64  lattening proced
162e0 75 72 65 2e 20 20 41 20 73 75 62 71 75 65 72 79  ure.  A subquery
162f0 0a 2a 2a 20 77 68 6f 73 65 20 72 65 73 75 6c 74  .** whose result
16300 20 73 65 74 20 69 73 20 64 65 66 69 6e 65 64 20   set is defined 
16310 62 79 20 70 45 4c 69 73 74 20 61 70 70 65 61 72  by pEList appear
16320 73 20 61 73 20 65 6e 74 72 79 20 69 6e 20 74 68  s as entry in th
16330 65 0a 2a 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65  e.** FROM clause
16340 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73 75 63   of a SELECT suc
16350 68 20 74 68 61 74 20 74 68 65 20 56 44 42 45 20  h that the VDBE 
16360 63 75 72 73 6f 72 20 61 73 73 69 67 6e 65 64 20  cursor assigned 
16370 74 6f 20 74 68 61 74 0a 2a 2a 20 46 4f 52 4d 20  to that.** FORM 
16380 63 6c 61 75 73 65 20 65 6e 74 72 79 20 69 73 20  clause entry is 
16390 69 54 61 62 6c 65 2e 20 20 54 68 69 73 20 72 6f  iTable.  This ro
163a0 75 74 69 6e 65 20 6d 61 6b 65 20 74 68 65 20 6e  utine make the n
163b0 65 63 65 73 73 61 72 79 20 0a 2a 2a 20 63 68 61  ecessary .** cha
163c0 6e 67 65 73 20 74 6f 20 70 45 78 70 72 20 73 6f  nges to pExpr so
163d0 20 74 68 61 74 20 69 74 20 72 65 66 65 72 73 20   that it refers 
163e0 64 69 72 65 63 74 6c 79 20 74 6f 20 74 68 65 20  directly to the 
163f0 73 6f 75 72 63 65 20 74 61 62 6c 65 0a 2a 2a 20  source table.** 
16400 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  of the subquery 
16410 72 61 74 68 65 72 20 74 68 65 20 72 65 73 75 6c  rather the resul
16420 74 20 73 65 74 20 6f 66 20 74 68 65 20 73 75 62  t set of the sub
16430 71 75 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  query..*/.static
16440 20 45 78 70 72 20 2a 73 75 62 73 74 45 78 70 72   Expr *substExpr
16450 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
16460 20 20 20 20 20 20 20 20 2f 2a 20 52 65 70 6f 72          /* Repor
16470 74 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20  t malloc errors 
16480 74 6f 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69  to this connecti
16490 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45  on */.  Expr *pE
164a0 78 70 72 2c 20 20 20 20 20 20 20 20 2f 2a 20 45  xpr,        /* E
164b0 78 70 72 20 69 6e 20 77 68 69 63 68 20 73 75 62  xpr in which sub
164c0 73 74 69 74 75 74 69 6f 6e 20 6f 63 63 75 72 73  stitution occurs
164d0 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65   */.  int iTable
164e0 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62  ,         /* Tab
164f0 6c 65 20 74 6f 20 62 65 20 73 75 62 73 74 69 74  le to be substit
16500 75 74 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69  uted */.  ExprLi
16510 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a  st *pEList    /*
16520 20 53 75 62 73 74 69 74 75 74 65 20 65 78 70 72   Substitute expr
16530 65 73 73 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20  essions */.){.  
16540 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72  if( pExpr==0 ) r
16550 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70  eturn 0;.  if( p
16560 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  Expr->op==TK_COL
16570 55 4d 4e 20 26 26 20 70 45 78 70 72 2d 3e 69 54  UMN && pExpr->iT
16580 61 62 6c 65 3d 3d 69 54 61 62 6c 65 20 29 7b 0a  able==iTable ){.
16590 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69      if( pExpr->i
165a0 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20  Column<0 ){.    
165b0 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b    pExpr->op = TK
165c0 5f 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65  _NULL;.    }else
165d0 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e  {.      Expr *pN
165e0 65 77 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ew;.      assert
165f0 28 20 70 45 4c 69 73 74 21 3d 30 20 26 26 20 70  ( pEList!=0 && p
16600 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 45  Expr->iColumn<pE
16610 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20  List->nExpr );. 
16620 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
16630 70 72 2d 3e 70 4c 65 66 74 3d 3d 30 20 26 26 20  pr->pLeft==0 && 
16640 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30  pExpr->pRight==0
16650 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d   );.      pNew =
16660 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
16670 64 62 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 70 45  db, pEList->a[pE
16680 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 70 45  xpr->iColumn].pE
16690 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  xpr, 0);.      s
166a0 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
166b0 28 64 62 2c 20 70 45 78 70 72 29 3b 0a 20 20 20  (db, pExpr);.   
166c0 20 20 20 70 45 78 70 72 20 3d 20 70 4e 65 77 3b     pExpr = pNew;
166d0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
166e0 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74      pExpr->pLeft
166f0 20 3d 20 73 75 62 73 74 45 78 70 72 28 64 62 2c   = substExpr(db,
16700 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 69   pExpr->pLeft, i
16710 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a  Table, pEList);.
16720 20 20 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68      pExpr->pRigh
16730 74 20 3d 20 73 75 62 73 74 45 78 70 72 28 64 62  t = substExpr(db
16740 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
16750 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
16760 3b 0a 20 20 20 20 69 66 28 20 45 78 70 72 48 61  ;.    if( ExprHa
16770 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
16780 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
16790 7b 0a 20 20 20 20 20 20 73 75 62 73 74 53 65 6c  {.      substSel
167a0 65 63 74 28 64 62 2c 20 70 45 78 70 72 2d 3e 78  ect(db, pExpr->x
167b0 2e 70 53 65 6c 65 63 74 2c 20 69 54 61 62 6c 65  .pSelect, iTable
167c0 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 7d  , pEList);.    }
167d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 75 62 73  else{.      subs
167e0 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70 45  tExprList(db, pE
167f0 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2c 20 69 54  xpr->x.pList, iT
16800 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20  able, pEList);. 
16810 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
16820 6e 20 70 45 78 70 72 3b 0a 7d 0a 73 74 61 74 69  n pExpr;.}.stati
16830 63 20 76 6f 69 64 20 73 75 62 73 74 45 78 70 72  c void substExpr
16840 4c 69 73 74 28 0a 20 20 73 71 6c 69 74 65 33 20  List(.  sqlite3 
16850 2a 64 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  *db,         /* 
16860 52 65 70 6f 72 74 20 6d 61 6c 6c 6f 63 20 65 72  Report malloc er
16870 72 6f 72 73 20 68 65 72 65 20 2a 2f 0a 20 20 45  rors here */.  E
16880 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
16890 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 73      /* List to s
168a0 63 61 6e 20 61 6e 64 20 69 6e 20 77 68 69 63 68  can and in which
168b0 20 74 6f 20 6d 61 6b 65 20 73 75 62 73 74 69 74   to make substit
168c0 75 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54  utes */.  int iT
168d0 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 2f  able,          /
168e0 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20 73 75  * Table to be su
168f0 62 73 74 69 74 75 74 65 64 20 2a 2f 0a 20 20 45  bstituted */.  E
16900 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20  xprList *pEList 
16910 20 20 20 20 2f 2a 20 53 75 62 73 74 69 74 75 74      /* Substitut
16920 65 20 76 61 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20  e values */.){. 
16930 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c   int i;.  if( pL
16940 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ist==0 ) return;
16950 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c  .  for(i=0; i<pL
16960 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
16970 7b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 69  {.    pList->a[i
16980 5d 2e 70 45 78 70 72 20 3d 20 73 75 62 73 74 45  ].pExpr = substE
16990 78 70 72 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61  xpr(db, pList->a
169a0 5b 69 5d 2e 70 45 78 70 72 2c 20 69 54 61 62 6c  [i].pExpr, iTabl
169b0 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a  e, pEList);.  }.
169c0 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75  }.static void su
169d0 62 73 74 53 65 6c 65 63 74 28 0a 20 20 73 71 6c  bstSelect(.  sql
169e0 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
169f0 20 20 2f 2a 20 52 65 70 6f 72 74 20 6d 61 6c 6c    /* Report mall
16a00 6f 63 20 65 72 72 6f 72 73 20 68 65 72 65 20 2a  oc errors here *
16a10 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
16a20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 45 4c 45           /* SELE
16a30 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20  CT statement in 
16a40 77 68 69 63 68 20 74 6f 20 6d 61 6b 65 20 73 75  which to make su
16a50 62 73 74 69 74 75 74 69 6f 6e 73 20 2a 2f 0a 20  bstitutions */. 
16a60 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20   int iTable,    
16a70 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74        /* Table t
16a80 6f 20 62 65 20 72 65 70 6c 61 63 65 64 20 2a 2f  o be replaced */
16a90 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
16aa0 69 73 74 20 20 20 20 20 2f 2a 20 53 75 62 73 74  ist     /* Subst
16ab0 69 74 75 74 65 20 76 61 6c 75 65 73 20 2a 2f 0a  itute values */.
16ac0 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  ){.  SrcList *pS
16ad0 72 63 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63  rc;.  struct Src
16ae0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
16af0 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  ;.  int i;.  if(
16b00 20 21 70 20 29 20 72 65 74 75 72 6e 3b 0a 20 20   !p ) return;.  
16b10 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 64 62  substExprList(db
16b20 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 69 54 61  , p->pEList, iTa
16b30 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ble, pEList);.  
16b40 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 64 62  substExprList(db
16b50 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 69  , p->pGroupBy, i
16b60 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a  Table, pEList);.
16b70 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28    substExprList(
16b80 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c  db, p->pOrderBy,
16b90 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
16ba0 3b 0a 20 20 70 2d 3e 70 48 61 76 69 6e 67 20 3d  ;.  p->pHaving =
16bb0 20 73 75 62 73 74 45 78 70 72 28 64 62 2c 20 70   substExpr(db, p
16bc0 2d 3e 70 48 61 76 69 6e 67 2c 20 69 54 61 62 6c  ->pHaving, iTabl
16bd0 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 70 2d  e, pEList);.  p-
16be0 3e 70 57 68 65 72 65 20 3d 20 73 75 62 73 74 45  >pWhere = substE
16bf0 78 70 72 28 64 62 2c 20 70 2d 3e 70 57 68 65 72  xpr(db, p->pWher
16c00 65 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  e, iTable, pELis
16c10 74 29 3b 0a 20 20 73 75 62 73 74 53 65 6c 65 63  t);.  substSelec
16c20 74 28 64 62 2c 20 70 2d 3e 70 50 72 69 6f 72 2c  t(db, p->pPrior,
16c30 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
16c40 3b 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53  ;.  pSrc = p->pS
16c50 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53  rc;.  assert( pS
16c60 72 63 20 29 3b 20 20 2f 2a 20 45 76 65 6e 20 66  rc );  /* Even f
16c70 6f 72 20 28 53 45 4c 45 43 54 20 31 29 20 77 65  or (SELECT 1) we
16c80 20 68 61 76 65 3a 20 70 53 72 63 21 3d 30 20 62   have: pSrc!=0 b
16c90 75 74 20 70 53 72 63 2d 3e 6e 53 72 63 3d 3d 30  ut pSrc->nSrc==0
16ca0 20 2a 2f 0a 20 20 69 66 28 20 41 4c 57 41 59 53   */.  if( ALWAYS
16cb0 28 70 53 72 63 29 20 29 7b 0a 20 20 20 20 66 6f  (pSrc) ){.    fo
16cc0 72 28 69 3d 70 53 72 63 2d 3e 6e 53 72 63 2c 20  r(i=pSrc->nSrc, 
16cd0 70 49 74 65 6d 3d 70 53 72 63 2d 3e 61 3b 20 69  pItem=pSrc->a; i
16ce0 3e 30 3b 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b  >0; i--, pItem++
16cf0 29 7b 0a 20 20 20 20 20 20 73 75 62 73 74 53 65  ){.      substSe
16d00 6c 65 63 74 28 64 62 2c 20 70 49 74 65 6d 2d 3e  lect(db, pItem->
16d10 70 53 65 6c 65 63 74 2c 20 69 54 61 62 6c 65 2c  pSelect, iTable,
16d20 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a   pEList);.    }.
16d30 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20    }.}.#endif /* 
16d40 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
16d50 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c  OMIT_SUBQUERY) |
16d60 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
16d70 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 2a 2f 0a  E_OMIT_VIEW) */.
16d80 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
16d90 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
16da0 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  RY) || !defined(
16db0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
16dc0 29 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  )./*.** This rou
16dd0 74 69 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f  tine attempts to
16de0 20 66 6c 61 74 74 65 6e 20 73 75 62 71 75 65 72   flatten subquer
16df0 69 65 73 20 61 73 20 61 20 70 65 72 66 6f 72 6d  ies as a perform
16e00 61 6e 63 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f  ance optimizatio
16e10 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  n..** This routi
16e20 6e 65 20 72 65 74 75 72 6e 73 20 31 20 69 66 20  ne returns 1 if 
16e30 69 74 20 6d 61 6b 65 73 20 63 68 61 6e 67 65 73  it makes changes
16e40 20 61 6e 64 20 30 20 69 66 20 6e 6f 20 66 6c 61   and 0 if no fla
16e50 74 74 65 6e 69 6e 67 20 6f 63 63 75 72 73 2e 0a  ttening occurs..
16e60 2a 2a 0a 2a 2a 20 54 6f 20 75 6e 64 65 72 73 74  **.** To underst
16e70 61 6e 64 20 74 68 65 20 63 6f 6e 63 65 70 74 20  and the concept 
16e80 6f 66 20 66 6c 61 74 74 65 6e 69 6e 67 2c 20 63  of flattening, c
16e90 6f 6e 73 69 64 65 72 20 74 68 65 20 66 6f 6c 6c  onsider the foll
16ea0 6f 77 69 6e 67 0a 2a 2a 20 71 75 65 72 79 3a 0a  owing.** query:.
16eb0 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  **.**     SELECT
16ec0 20 61 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20   a FROM (SELECT 
16ed0 78 2b 79 20 41 53 20 61 20 46 52 4f 4d 20 74 31  x+y AS a FROM t1
16ee0 20 57 48 45 52 45 20 7a 3c 31 30 30 29 20 57 48   WHERE z<100) WH
16ef0 45 52 45 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68  ERE a>5.**.** Th
16f00 65 20 64 65 66 61 75 6c 74 20 77 61 79 20 6f 66  e default way of
16f10 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68   implementing th
16f20 69 73 20 71 75 65 72 79 20 69 73 20 74 6f 20 65  is query is to e
16f30 78 65 63 75 74 65 20 74 68 65 0a 2a 2a 20 73 75  xecute the.** su
16f40 62 71 75 65 72 79 20 66 69 72 73 74 20 61 6e 64  bquery first and
16f50 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   store the resul
16f60 74 73 20 69 6e 20 61 20 74 65 6d 70 6f 72 61 72  ts in a temporar
16f70 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 0a 2a 2a  y table, then.**
16f80 20 72 75 6e 20 74 68 65 20 6f 75 74 65 72 20 71   run the outer q
16f90 75 65 72 79 20 6f 6e 20 74 68 61 74 20 74 65 6d  uery on that tem
16fa0 70 6f 72 61 72 79 20 74 61 62 6c 65 2e 20 20 54  porary table.  T
16fb0 68 69 73 20 72 65 71 75 69 72 65 73 20 74 77 6f  his requires two
16fc0 0a 2a 2a 20 70 61 73 73 65 73 20 6f 76 65 72 20  .** passes over 
16fd0 74 68 65 20 64 61 74 61 2e 20 20 46 75 72 74 68  the data.  Furth
16fe0 65 72 6d 6f 72 65 2c 20 62 65 63 61 75 73 65 20  ermore, because 
16ff0 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  the temporary ta
17000 62 6c 65 0a 2a 2a 20 68 61 73 20 6e 6f 20 69 6e  ble.** has no in
17010 64 69 63 65 73 2c 20 74 68 65 20 57 48 45 52 45  dices, the WHERE
17020 20 63 6c 61 75 73 65 20 6f 6e 20 74 68 65 20 6f   clause on the o
17030 75 74 65 72 20 71 75 65 72 79 20 63 61 6e 6e 6f  uter query canno
17040 74 20 62 65 0a 2a 2a 20 6f 70 74 69 6d 69 7a 65  t be.** optimize
17050 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  d..**.** This ro
17060 75 74 69 6e 65 20 61 74 74 65 6d 70 74 73 20 74  utine attempts t
17070 6f 20 72 65 77 72 69 74 65 20 71 75 65 72 69 65  o rewrite querie
17080 73 20 73 75 63 68 20 61 73 20 74 68 65 20 61 62  s such as the ab
17090 6f 76 65 20 69 6e 74 6f 0a 2a 2a 20 61 20 73 69  ove into.** a si
170a0 6e 67 6c 65 20 66 6c 61 74 20 73 65 6c 65 63 74  ngle flat select
170b0 2c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a  , like this:.**.
170c0 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 78 2b  **     SELECT x+
170d0 79 20 41 53 20 61 20 46 52 4f 4d 20 74 31 20 57  y AS a FROM t1 W
170e0 48 45 52 45 20 7a 3c 31 30 30 20 41 4e 44 20 61  HERE z<100 AND a
170f0 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64  >5.**.** The cod
17100 65 20 67 65 6e 65 72 61 74 65 64 20 66 6f 72 20  e generated for 
17110 74 68 69 73 20 73 69 6d 70 69 66 69 63 61 74 69  this simpificati
17120 6f 6e 20 67 69 76 65 73 20 74 68 65 20 73 61 6d  on gives the sam
17130 65 20 72 65 73 75 6c 74 0a 2a 2a 20 62 75 74 20  e result.** but 
17140 6f 6e 6c 79 20 68 61 73 20 74 6f 20 73 63 61 6e  only has to scan
17150 20 74 68 65 20 64 61 74 61 20 6f 6e 63 65 2e 20   the data once. 
17160 20 41 6e 64 20 62 65 63 61 75 73 65 20 69 6e 64   And because ind
17170 69 63 65 73 20 6d 69 67 68 74 20 0a 2a 2a 20 65  ices might .** e
17180 78 69 73 74 20 6f 6e 20 74 68 65 20 74 61 62 6c  xist on the tabl
17190 65 20 74 31 2c 20 61 20 63 6f 6d 70 6c 65 74 65  e t1, a complete
171a0 20 73 63 61 6e 20 6f 66 20 74 68 65 20 64 61 74   scan of the dat
171b0 61 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61 76  a might be.** av
171c0 6f 69 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6c 61  oided..**.** Fla
171d0 74 74 65 6e 69 6e 67 20 69 73 20 6f 6e 6c 79 20  ttening is only 
171e0 61 74 74 65 6d 70 74 65 64 20 69 66 20 61 6c 6c  attempted if all
171f0 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
17200 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a  g are true:.**.*
17210 2a 20 20 20 28 31 29 20 20 54 68 65 20 73 75 62  *   (1)  The sub
17220 71 75 65 72 79 20 61 6e 64 20 74 68 65 20 6f 75  query and the ou
17230 74 65 72 20 71 75 65 72 79 20 64 6f 20 6e 6f 74  ter query do not
17240 20 62 6f 74 68 20 75 73 65 20 61 67 67 72 65 67   both use aggreg
17250 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 32  ates..**.**   (2
17260 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
17270 69 73 20 6e 6f 74 20 61 6e 20 61 67 67 72 65 67  is not an aggreg
17280 61 74 65 20 6f 72 20 74 68 65 20 6f 75 74 65 72  ate or the outer
17290 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20   query is not a 
172a0 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 33  join..**.**   (3
172b0 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
172c0 69 73 20 6e 6f 74 20 74 68 65 20 72 69 67 68 74  is not the right
172d0 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 6c 65   operand of a le
172e0 66 74 20 6f 75 74 65 72 20 6a 6f 69 6e 0a 2a 2a  ft outer join.**
172f0 20 20 20 20 20 20 20 20 28 4f 72 69 67 69 6e 61          (Origina
17300 6c 6c 79 20 74 69 63 6b 65 74 20 23 33 30 36 2e  lly ticket #306.
17310 20 20 53 74 72 65 6e 67 74 68 65 6e 65 64 20 62    Strengthened b
17320 79 20 74 69 63 6b 65 74 20 23 33 33 30 30 29 0a  y ticket #3300).
17330 2a 2a 0a 2a 2a 20 20 20 28 34 29 20 20 54 68 65  **.**   (4)  The
17340 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74   subquery is not
17350 20 44 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a   DISTINCT..**.**
17360 20 20 28 2a 2a 29 20 20 41 74 20 6f 6e 65 20 70    (**)  At one p
17370 6f 69 6e 74 20 72 65 73 74 72 69 63 74 69 6f 6e  oint restriction
17380 73 20 28 34 29 20 61 6e 64 20 28 35 29 20 64 65  s (4) and (5) de
17390 66 69 6e 65 64 20 61 20 73 75 62 73 65 74 20 6f  fined a subset o
173a0 66 20 44 49 53 54 49 4e 43 54 0a 2a 2a 20 20 20  f DISTINCT.**   
173b0 20 20 20 20 20 73 75 62 2d 71 75 65 72 69 65 73       sub-queries
173c0 20 74 68 61 74 20 77 65 72 65 20 65 78 63 6c 75   that were exclu
173d0 64 65 64 20 66 72 6f 6d 20 74 68 69 73 20 6f 70  ded from this op
173e0 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 52 65 73 74  timization. Rest
173f0 72 69 63 74 69 6f 6e 20 0a 2a 2a 20 20 20 20 20  riction .**     
17400 20 20 20 28 34 29 20 68 61 73 20 73 69 6e 63 65     (4) has since
17410 20 62 65 65 6e 20 65 78 70 61 6e 64 65 64 20 74   been expanded t
17420 6f 20 65 78 63 6c 75 64 65 20 61 6c 6c 20 44 49  o exclude all DI
17430 53 54 49 4e 43 54 20 73 75 62 71 75 65 72 69 65  STINCT subquerie
17440 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 36 29 20 20  s..**.**   (6)  
17450 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65  The subquery doe
17460 73 20 6e 6f 74 20 75 73 65 20 61 67 67 72 65 67  s not use aggreg
17470 61 74 65 73 20 6f 72 20 74 68 65 20 6f 75 74 65  ates or the oute
17480 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 0a 2a  r query is not.*
17490 2a 20 20 20 20 20 20 20 20 44 49 53 54 49 4e 43  *        DISTINC
174a0 54 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 37 29 20 20  T..**.**   (7)  
174b0 54 68 65 20 73 75 62 71 75 65 72 79 20 68 61 73  The subquery has
174c0 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20   a FROM clause. 
174d0 20 54 4f 44 4f 3a 20 20 46 6f 72 20 73 75 62 71   TODO:  For subq
174e0 75 65 72 69 65 73 20 77 69 74 68 6f 75 74 0a 2a  ueries without.*
174f0 2a 20 20 20 20 20 20 20 20 41 20 46 52 4f 4d 20  *        A FROM 
17500 63 6c 61 75 73 65 2c 20 63 6f 6e 73 69 64 65 72  clause, consider
17510 20 61 64 64 69 6e 67 20 61 20 46 52 4f 4d 20 63   adding a FROM c
17520 6c 6f 73 65 20 77 69 74 68 20 74 68 65 20 73 70  lose with the sp
17530 65 63 69 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20  ecial.**        
17540 74 61 62 6c 65 20 73 71 6c 69 74 65 5f 6f 6e 63  table sqlite_onc
17550 65 20 74 68 61 74 20 63 6f 6e 73 69 73 74 73 20  e that consists 
17560 6f 66 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20  of a single row 
17570 63 6f 6e 74 61 69 6e 69 6e 67 20 61 0a 2a 2a 20  containing a.** 
17580 20 20 20 20 20 20 20 73 69 6e 67 6c 65 20 4e 55         single NU
17590 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 38 29 20  LL..**.**   (8) 
175a0 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f   The subquery do
175b0 65 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54  es not use LIMIT
175c0 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75   or the outer qu
175d0 65 72 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69  ery is not a joi
175e0 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 39 29 20 20  n..**.**   (9)  
175f0 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65  The subquery doe
17600 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 20  s not use LIMIT 
17610 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  or the outer que
17620 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 0a  ry does not use.
17630 2a 2a 20 20 20 20 20 20 20 20 61 67 67 72 65 67  **        aggreg
17640 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 30  ates..**.**  (10
17650 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
17660 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 61 67 67  does not use agg
17670 72 65 67 61 74 65 73 20 6f 72 20 74 68 65 20 6f  regates or the o
17680 75 74 65 72 20 71 75 65 72 79 20 64 6f 65 73 20  uter query does 
17690 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 75 73  not.**        us
176a0 65 20 4c 49 4d 49 54 2e 0a 2a 2a 0a 2a 2a 20 20  e LIMIT..**.**  
176b0 28 31 31 29 20 20 54 68 65 20 73 75 62 71 75 65  (11)  The subque
176c0 72 79 20 61 6e 64 20 74 68 65 20 6f 75 74 65 72  ry and the outer
176d0 20 71 75 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f   query do not bo
176e0 74 68 20 68 61 76 65 20 4f 52 44 45 52 20 42 59  th have ORDER BY
176f0 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20   clauses..**.** 
17700 20 28 2a 2a 29 20 20 4e 6f 74 20 69 6d 70 6c 65   (**)  Not imple
17710 6d 65 6e 74 65 64 2e 20 20 53 75 62 73 75 6d 65  mented.  Subsume
17720 64 20 69 6e 74 6f 20 72 65 73 74 72 69 63 74 69  d into restricti
17730 6f 6e 20 28 33 29 2e 20 20 57 61 73 20 70 72 65  on (3).  Was pre
17740 76 69 6f 75 73 6c 79 0a 2a 2a 20 20 20 20 20 20  viously.**      
17750 20 20 61 20 73 65 70 61 72 61 74 65 20 72 65 73    a separate res
17760 74 72 69 63 74 69 6f 6e 20 64 65 72 69 76 69 6e  triction derivin
17770 67 20 66 72 6f 6d 20 74 69 63 6b 65 74 20 23 33  g from ticket #3
17780 35 30 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 33 29 20  50..**.**  (13) 
17790 20 54 68 65 20 73 75 62 71 75 65 72 79 20 61 6e   The subquery an
177a0 64 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f  d outer query do
177b0 20 6e 6f 74 20 62 6f 74 68 20 75 73 65 20 4c 49   not both use LI
177c0 4d 49 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 34 29  MIT..**.**  (14)
177d0 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64    The subquery d
177e0 6f 65 73 20 6e 6f 74 20 75 73 65 20 4f 46 46 53  oes not use OFFS
177f0 45 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 35 29 20  ET..**.**  (15) 
17800 20 54 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   The outer query
17810 20 69 73 20 6e 6f 74 20 70 61 72 74 20 6f 66 20   is not part of 
17820 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63  a compound selec
17830 74 20 6f 72 20 74 68 65 0a 2a 2a 20 20 20 20 20  t or the.**     
17840 20 20 20 73 75 62 71 75 65 72 79 20 64 6f 65 73     subquery does
17850 20 6e 6f 74 20 68 61 76 65 20 61 20 4c 49 4d 49   not have a LIMI
17860 54 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 20 20 20  T clause..**    
17870 20 20 20 20 28 53 65 65 20 74 69 63 6b 65 74 20      (See ticket 
17880 23 32 33 33 39 20 61 6e 64 20 74 69 63 6b 65 74  #2339 and ticket
17890 20 5b 30 32 61 38 65 38 31 64 34 34 5d 29 2e 0a   [02a8e81d44])..
178a0 2a 2a 0a 2a 2a 20 20 28 31 36 29 20 20 54 68 65  **.**  (16)  The
178b0 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20   outer query is 
178c0 6e 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74 65  not an aggregate
178d0 20 6f 72 20 74 68 65 20 73 75 62 71 75 65 72 79   or the subquery
178e0 20 64 6f 65 73 0a 2a 2a 20 20 20 20 20 20 20 20   does.**        
178f0 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 4f 52 44 45  not contain ORDE
17900 52 20 42 59 2e 20 20 28 54 69 63 6b 65 74 20 23  R BY.  (Ticket #
17910 32 39 34 32 29 20 20 54 68 69 73 20 75 73 65 64  2942)  This used
17920 20 74 6f 20 6e 6f 74 20 6d 61 74 74 65 72 0a 2a   to not matter.*
17930 2a 20 20 20 20 20 20 20 20 75 6e 74 69 6c 20 77  *        until w
17940 65 20 69 6e 74 72 6f 64 75 63 65 64 20 74 68 65  e introduced the
17950 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28 29 20   group_concat() 
17960 66 75 6e 63 74 69 6f 6e 2e 20 20 0a 2a 2a 0a 2a  function.  .**.*
17970 2a 20 20 28 31 37 29 20 20 54 68 65 20 73 75 62  *  (17)  The sub
17980 2d 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20  -query is not a 
17990 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c  compound select,
179a0 20 6f 72 20 69 74 20 69 73 20 61 20 55 4e 49 4f   or it is a UNIO
179b0 4e 20 41 4c 4c 20 0a 2a 2a 20 20 20 20 20 20 20  N ALL .**       
179c0 20 63 6f 6d 70 6f 75 6e 64 20 63 6c 61 75 73 65   compound clause
179d0 20 6d 61 64 65 20 75 70 20 65 6e 74 69 72 65 6c   made up entirel
179e0 79 20 6f 66 20 6e 6f 6e 2d 61 67 67 72 65 67 61  y of non-aggrega
179f0 74 65 20 71 75 65 72 69 65 73 2c 20 61 6e 64 20  te queries, and 
17a00 0a 2a 2a 20 20 20 20 20 20 20 20 74 68 65 20 70  .**        the p
17a10 61 72 65 6e 74 20 71 75 65 72 79 3a 0a 2a 2a 0a  arent query:.**.
17a20 2a 2a 20 20 20 20 20 20 20 20 20 20 2a 20 69 73  **          * is
17a30 20 6e 6f 74 20 69 74 73 65 6c 66 20 70 61 72 74   not itself part
17a40 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73   of a compound s
17a50 65 6c 65 63 74 2c 0a 2a 2a 20 20 20 20 20 20 20  elect,.**       
17a60 20 20 20 2a 20 69 73 20 6e 6f 74 20 61 6e 20 61     * is not an a
17a70 67 67 72 65 67 61 74 65 20 6f 72 20 44 49 53 54  ggregate or DIST
17a80 49 4e 43 54 20 71 75 65 72 79 2c 20 61 6e 64 0a  INCT query, and.
17a90 2a 2a 20 20 20 20 20 20 20 20 20 20 2a 20 69 73  **          * is
17aa0 20 6e 6f 74 20 61 20 6a 6f 69 6e 0a 2a 2a 0a 2a   not a join.**.*
17ab0 2a 20 20 20 20 20 20 20 20 54 68 65 20 70 61 72  *        The par
17ac0 65 6e 74 20 61 6e 64 20 73 75 62 2d 71 75 65 72  ent and sub-quer
17ad0 79 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 57 48  y may contain WH
17ae0 45 52 45 20 63 6c 61 75 73 65 73 2e 20 53 75 62  ERE clauses. Sub
17af0 6a 65 63 74 20 74 6f 0a 2a 2a 20 20 20 20 20 20  ject to.**      
17b00 20 20 72 75 6c 65 73 20 28 31 31 29 2c 20 28 31    rules (11), (1
17b10 33 29 20 61 6e 64 20 28 31 34 29 2c 20 74 68 65  3) and (14), the
17b20 79 20 6d 61 79 20 61 6c 73 6f 20 63 6f 6e 74 61  y may also conta
17b30 69 6e 20 4f 52 44 45 52 20 42 59 2c 0a 2a 2a 20  in ORDER BY,.** 
17b40 20 20 20 20 20 20 20 4c 49 4d 49 54 20 61 6e 64         LIMIT and
17b50 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73 2e   OFFSET clauses.
17b60 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 63    The subquery c
17b70 61 6e 6e 6f 74 20 75 73 65 20 61 6e 79 20 63 6f  annot use any co
17b80 6d 70 6f 75 6e 64 0a 2a 2a 20 20 20 20 20 20 20  mpound.**       
17b90 20 6f 70 65 72 61 74 6f 72 20 6f 74 68 65 72 20   operator other 
17ba0 74 68 61 6e 20 55 4e 49 4f 4e 20 41 4c 4c 20 62  than UNION ALL b
17bb0 65 63 61 75 73 65 20 61 6c 6c 20 74 68 65 20 6f  ecause all the o
17bc0 74 68 65 72 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a  ther compound.**
17bd0 20 20 20 20 20 20 20 20 6f 70 65 72 61 74 6f 72          operator
17be0 73 20 68 61 76 65 20 61 6e 20 69 6d 70 6c 69 65  s have an implie
17bf0 64 20 44 49 53 54 49 4e 43 54 20 77 68 69 63 68  d DISTINCT which
17c00 20 69 73 20 64 69 73 61 6c 6c 6f 77 65 64 20 62   is disallowed b
17c10 79 0a 2a 2a 20 20 20 20 20 20 20 20 72 65 73 74  y.**        rest
17c20 72 69 63 74 69 6f 6e 20 28 34 29 2e 0a 2a 2a 0a  riction (4)..**.
17c30 2a 2a 20 20 20 20 20 20 20 20 41 6c 73 6f 2c 20  **        Also, 
17c40 65 61 63 68 20 63 6f 6d 70 6f 6e 65 6e 74 20 6f  each component o
17c50 66 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20  f the sub-query 
17c60 6d 75 73 74 20 72 65 74 75 72 6e 20 74 68 65 20  must return the 
17c70 73 61 6d 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 20  same number.**  
17c80 20 20 20 20 20 20 6f 66 20 72 65 73 75 6c 74 20        of result 
17c90 63 6f 6c 75 6d 6e 73 2e 20 54 68 69 73 20 69 73  columns. This is
17ca0 20 61 63 74 75 61 6c 6c 79 20 61 20 72 65 71 75   actually a requ
17cb0 69 72 65 6d 65 6e 74 20 66 6f 72 20 61 6e 79 20  irement for any 
17cc0 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20 20 20 20  compound.**     
17cd0 20 20 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d     SELECT statem
17ce0 65 6e 74 2c 20 62 75 74 20 61 6c 6c 20 74 68 65  ent, but all the
17cf0 20 63 6f 64 65 20 68 65 72 65 20 64 6f 65 73 20   code here does 
17d00 69 73 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  is make sure tha
17d10 74 20 6e 6f 0a 2a 2a 20 20 20 20 20 20 20 20 73  t no.**        s
17d20 75 63 68 20 28 69 6c 6c 65 67 61 6c 29 20 73 75  uch (illegal) su
17d30 62 2d 71 75 65 72 79 20 69 73 20 66 6c 61 74 74  b-query is flatt
17d40 65 6e 65 64 2e 20 54 68 65 20 63 61 6c 6c 65 72  ened. The caller
17d50 20 77 69 6c 6c 20 64 65 74 65 63 74 20 74 68 65   will detect the
17d60 0a 2a 2a 20 20 20 20 20 20 20 20 73 79 6e 74 61  .**        synta
17d70 78 20 65 72 72 6f 72 20 61 6e 64 20 72 65 74 75  x error and retu
17d80 72 6e 20 61 20 64 65 74 61 69 6c 65 64 20 6d 65  rn a detailed me
17d90 73 73 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 31  ssage..**.**  (1
17da0 38 29 20 20 49 66 20 74 68 65 20 73 75 62 2d 71  8)  If the sub-q
17db0 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75  uery is a compou
17dc0 6e 64 20 73 65 6c 65 63 74 2c 20 74 68 65 6e 20  nd select, then 
17dd0 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65  all terms of the
17de0 0a 2a 2a 20 20 20 20 20 20 20 20 4f 52 44 45 52  .**        ORDER
17df0 20 62 79 20 63 6c 61 75 73 65 20 6f 66 20 74 68   by clause of th
17e00 65 20 70 61 72 65 6e 74 20 6d 75 73 74 20 62 65  e parent must be
17e10 20 73 69 6d 70 6c 65 20 72 65 66 65 72 65 6e 63   simple referenc
17e20 65 73 20 74 6f 20 0a 2a 2a 20 20 20 20 20 20 20  es to .**       
17e30 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20   columns of the 
17e40 73 75 62 2d 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a  sub-query..**.**
17e50 20 20 28 31 39 29 20 20 54 68 65 20 73 75 62 71    (19)  The subq
17e60 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73  uery does not us
17e70 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65 20 6f  e LIMIT or the o
17e80 75 74 65 72 20 71 75 65 72 79 20 64 6f 65 73 20  uter query does 
17e90 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 68 61  not.**        ha
17ea0 76 65 20 61 20 57 48 45 52 45 20 63 6c 61 75 73  ve a WHERE claus
17eb0 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 30 29 20 20  e..**.**  (20)  
17ec0 49 66 20 74 68 65 20 73 75 62 2d 71 75 65 72 79  If the sub-query
17ed0 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73   is a compound s
17ee0 65 6c 65 63 74 2c 20 74 68 65 6e 20 69 74 20 6d  elect, then it m
17ef0 75 73 74 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 20  ust not use.**  
17f00 20 20 20 20 20 20 61 6e 20 4f 52 44 45 52 20 42        an ORDER B
17f10 59 20 63 6c 61 75 73 65 2e 20 20 54 69 63 6b 65  Y clause.  Ticke
17f20 74 20 23 33 37 37 33 2e 20 20 57 65 20 63 6f 75  t #3773.  We cou
17f30 6c 64 20 72 65 6c 61 78 20 74 68 69 73 20 63 6f  ld relax this co
17f40 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 20 20 20 20  nstraint.**     
17f50 20 20 20 73 6f 6d 65 77 68 61 74 20 62 79 20 73     somewhat by s
17f60 61 79 69 6e 67 20 74 68 61 74 20 74 68 65 20 74  aying that the t
17f70 65 72 6d 73 20 6f 66 20 74 68 65 20 4f 52 44 45  erms of the ORDE
17f80 52 20 42 59 20 63 6c 61 75 73 65 20 6d 75 73 74  R BY clause must
17f90 0a 2a 2a 20 20 20 20 20 20 20 20 61 70 70 65 61  .**        appea
17fa0 72 20 61 73 20 75 6e 6d 6f 64 69 66 69 65 64 20  r as unmodified 
17fb0 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 69  result columns i
17fc0 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  n the outer quer
17fd0 79 2e 20 20 42 75 74 20 77 65 0a 2a 2a 20 20 20  y.  But we.**   
17fe0 20 20 20 20 20 68 61 76 65 20 6f 74 68 65 72 20       have other 
17ff0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 69 6e  optimizations in
18000 20 6d 69 6e 64 20 74 6f 20 64 65 61 6c 20 77 69   mind to deal wi
18010 74 68 20 74 68 61 74 20 63 61 73 65 2e 0a 2a 2a  th that case..**
18020 0a 2a 2a 20 20 28 32 31 29 20 20 54 68 65 20 73  .**  (21)  The s
18030 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  ubquery does not
18040 20 75 73 65 20 4c 49 4d 49 54 20 6f 72 20 74 68   use LIMIT or th
18050 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73  e outer query is
18060 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 44   not.**        D
18070 49 53 54 49 4e 43 54 2e 20 20 28 53 65 65 20 74  ISTINCT.  (See t
18080 69 63 6b 65 74 20 5b 37 35 32 65 31 36 34 36 66  icket [752e1646f
18090 63 5d 29 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68  c])..**.** In th
180a0 69 73 20 72 6f 75 74 69 6e 65 2c 20 74 68 65 20  is routine, the 
180b0 22 70 22 20 70 61 72 61 6d 65 74 65 72 20 69 73  "p" parameter is
180c0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
180d0 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 2a  e outer query..*
180e0 2a 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69  * The subquery i
180f0 73 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 69 46 72  s p->pSrc->a[iFr
18100 6f 6d 5d 2e 20 20 69 73 41 67 67 20 69 73 20 74  om].  isAgg is t
18110 72 75 65 20 69 66 20 74 68 65 20 6f 75 74 65 72  rue if the outer
18120 20 71 75 65 72 79 0a 2a 2a 20 75 73 65 73 20 61   query.** uses a
18130 67 67 72 65 67 61 74 65 73 20 61 6e 64 20 73 75  ggregates and su
18140 62 71 75 65 72 79 49 73 41 67 67 20 69 73 20 74  bqueryIsAgg is t
18150 72 75 65 20 69 66 20 74 68 65 20 73 75 62 71 75  rue if the subqu
18160 65 72 79 20 75 73 65 73 20 61 67 67 72 65 67 61  ery uses aggrega
18170 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 66 6c  tes..**.** If fl
18180 61 74 74 65 6e 69 6e 67 20 69 73 20 6e 6f 74 20  attening is not 
18190 61 74 74 65 6d 70 74 65 64 2c 20 74 68 69 73 20  attempted, this 
181a0 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
181b0 6f 70 20 61 6e 64 20 72 65 74 75 72 6e 73 20 30  op and returns 0
181c0 2e 0a 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e 69  ..** If flatteni
181d0 6e 67 20 69 73 20 61 74 74 65 6d 70 74 65 64 20  ng is attempted 
181e0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
181f0 75 72 6e 73 20 31 2e 0a 2a 2a 0a 2a 2a 20 41 6c  urns 1..**.** Al
18200 6c 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  l of the express
18210 69 6f 6e 20 61 6e 61 6c 79 73 69 73 20 6d 75 73  ion analysis mus
18220 74 20 6f 63 63 75 72 20 6f 6e 20 62 6f 74 68 20  t occur on both 
18230 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
18240 61 6e 64 0a 2a 2a 20 74 68 65 20 73 75 62 71 75  and.** the subqu
18250 65 72 79 20 62 65 66 6f 72 65 20 74 68 69 73 20  ery before this 
18260 72 6f 75 74 69 6e 65 20 72 75 6e 73 2e 0a 2a 2f  routine runs..*/
18270 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c 61 74  .static int flat
18280 74 65 6e 53 75 62 71 75 65 72 79 28 0a 20 20 50  tenSubquery(.  P
18290 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
182a0 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
182b0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
182c0 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
182d0 20 2f 2a 20 54 68 65 20 70 61 72 65 6e 74 20 6f   /* The parent o
182e0 72 20 6f 75 74 65 72 20 53 45 4c 45 43 54 20 73  r outer SELECT s
182f0 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e  tatement */.  in
18300 74 20 69 46 72 6f 6d 2c 20 20 20 20 20 20 20 20  t iFrom,        
18310 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70     /* Index in p
18320 2d 3e 70 53 72 63 2d 3e 61 5b 5d 20 6f 66 20 74  ->pSrc->a[] of t
18330 68 65 20 69 6e 6e 65 72 20 73 75 62 71 75 65 72  he inner subquer
18340 79 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41 67 67  y */.  int isAgg
18350 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ,           /* T
18360 72 75 65 20 69 66 20 6f 75 74 65 72 20 53 45 4c  rue if outer SEL
18370 45 43 54 20 75 73 65 73 20 61 67 67 72 65 67 61  ECT uses aggrega
18380 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a  te functions */.
18390 20 20 69 6e 74 20 73 75 62 71 75 65 72 79 49 73    int subqueryIs
183a0 41 67 67 20 20 20 20 2f 2a 20 54 72 75 65 20 69  Agg    /* True i
183b0 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 75  f the subquery u
183c0 73 65 73 20 61 67 67 72 65 67 61 74 65 20 66 75  ses aggregate fu
183d0 6e 63 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20  nctions */.){.  
183e0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 61 76  const char *zSav
183f0 65 64 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20  edAuthContext = 
18400 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e  pParse->zAuthCon
18410 74 65 78 74 3b 0a 20 20 53 65 6c 65 63 74 20 2a  text;.  Select *
18420 70 50 61 72 65 6e 74 3b 0a 20 20 53 65 6c 65 63  pParent;.  Selec
18430 74 20 2a 70 53 75 62 3b 20 20 20 20 20 20 20 2f  t *pSub;       /
18440 2a 20 54 68 65 20 69 6e 6e 65 72 20 71 75 65 72  * The inner quer
18450 79 20 6f 72 20 22 73 75 62 71 75 65 72 79 22 20  y or "subquery" 
18460 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75  */.  Select *pSu
18470 62 31 3b 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e  b1;      /* Poin
18480 74 65 72 20 74 6f 20 74 68 65 20 72 69 67 68 74  ter to the right
18490 6d 6f 73 74 20 73 65 6c 65 63 74 20 69 6e 20 73  most select in s
184a0 75 62 2d 71 75 65 72 79 20 2a 2f 0a 20 20 53 72  ub-query */.  Sr
184b0 63 4c 69 73 74 20 2a 70 53 72 63 3b 20 20 20 20  cList *pSrc;    
184c0 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c    /* The FROM cl
184d0 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65  ause of the oute
184e0 72 20 71 75 65 72 79 20 2a 2f 0a 20 20 53 72 63  r query */.  Src
184f0 4c 69 73 74 20 2a 70 53 75 62 53 72 63 3b 20 20  List *pSubSrc;  
18500 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61   /* The FROM cla
18510 75 73 65 20 6f 66 20 74 68 65 20 73 75 62 71 75  use of the subqu
18520 65 72 79 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ery */.  ExprLis
18530 74 20 2a 70 4c 69 73 74 3b 20 20 20 20 2f 2a 20  t *pList;    /* 
18540 54 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f  The result set o
18550 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  f the outer quer
18560 79 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 65  y */.  int iPare
18570 6e 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 56 44  nt;        /* VD
18580 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  BE cursor number
18590 20 6f 66 20 74 68 65 20 70 53 75 62 20 72 65 73   of the pSub res
185a0 75 6c 74 20 73 65 74 20 74 65 6d 70 20 74 61 62  ult set temp tab
185b0 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  le */.  int i;  
185c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
185d0 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
185e0 20 45 78 70 72 20 2a 70 57 68 65 72 65 3b 20 20   Expr *pWhere;  
185f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18600 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63    /* The WHERE c
18610 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63  lause */.  struc
18620 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
18630 70 53 75 62 69 74 65 6d 3b 20 20 20 2f 2a 20 54  pSubitem;   /* T
18640 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20  he subquery */. 
18650 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
18660 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a  Parse->db;..  /*
18670 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
18680 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 70   flattening is p
18690 65 72 6d 69 74 74 65 64 2e 20 20 52 65 74 75 72  ermitted.  Retur
186a0 6e 20 30 20 69 66 20 6e 6f 74 2e 0a 20 20 2a 2f  n 0 if not..  */
186b0 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20  .  assert( p!=0 
186c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
186d0 70 50 72 69 6f 72 3d 3d 30 20 29 3b 20 20 2f 2a  pPrior==0 );  /*
186e0 20 55 6e 61 62 6c 65 20 74 6f 20 66 6c 61 74 74   Unable to flatt
186f0 65 6e 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72  en compound quer
18700 69 65 73 20 2a 2f 0a 20 20 69 66 28 20 4f 70 74  ies */.  if( Opt
18710 69 6d 69 7a 61 74 69 6f 6e 44 69 73 61 62 6c 65  imizationDisable
18720 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 51 75 65  d(db, SQLITE_Que
18730 72 79 46 6c 61 74 74 65 6e 65 72 29 20 29 20 72  ryFlattener) ) r
18740 65 74 75 72 6e 20 30 3b 0a 20 20 70 53 72 63 20  eturn 0;.  pSrc 
18750 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73  = p->pSrc;.  ass
18760 65 72 74 28 20 70 53 72 63 20 26 26 20 69 46 72  ert( pSrc && iFr
18770 6f 6d 3e 3d 30 20 26 26 20 69 46 72 6f 6d 3c 70  om>=0 && iFrom<p
18780 53 72 63 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 70  Src->nSrc );.  p
18790 53 75 62 69 74 65 6d 20 3d 20 26 70 53 72 63 2d  Subitem = &pSrc-
187a0 3e 61 5b 69 46 72 6f 6d 5d 3b 0a 20 20 69 50 61  >a[iFrom];.  iPa
187b0 72 65 6e 74 20 3d 20 70 53 75 62 69 74 65 6d 2d  rent = pSubitem-
187c0 3e 69 43 75 72 73 6f 72 3b 0a 20 20 70 53 75 62  >iCursor;.  pSub
187d0 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70 53 65   = pSubitem->pSe
187e0 6c 65 63 74 3b 0a 20 20 61 73 73 65 72 74 28 20  lect;.  assert( 
187f0 70 53 75 62 21 3d 30 20 29 3b 0a 20 20 69 66 28  pSub!=0 );.  if(
18800 20 69 73 41 67 67 20 26 26 20 73 75 62 71 75 65   isAgg && subque
18810 72 79 49 73 41 67 67 20 29 20 72 65 74 75 72 6e  ryIsAgg ) return
18820 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
18830 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
18840 6f 6e 20 28 31 29 20 20 2a 2f 0a 20 20 69 66 28  on (1)  */.  if(
18850 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20 26   subqueryIsAgg &
18860 26 20 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20 29  & pSrc->nSrc>1 )
18870 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
18880 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
18890 6f 6e 20 28 32 29 20 20 2a 2f 0a 20 20 70 53 75  on (2)  */.  pSu
188a0 62 53 72 63 20 3d 20 70 53 75 62 2d 3e 70 53 72  bSrc = pSub->pSr
188b0 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 75  c;.  assert( pSu
188c0 62 53 72 63 20 29 3b 0a 20 20 2f 2a 20 50 72 69  bSrc );.  /* Pri
188d0 6f 72 20 74 6f 20 76 65 72 73 69 6f 6e 20 33 2e  or to version 3.
188e0 31 2e 32 2c 20 77 68 65 6e 20 4c 49 4d 49 54 20  1.2, when LIMIT 
188f0 61 6e 64 20 4f 46 46 53 45 54 20 68 61 64 20 74  and OFFSET had t
18900 6f 20 62 65 20 73 69 6d 70 6c 65 20 63 6f 6e 73  o be simple cons
18910 74 61 6e 74 73 2c 0a 20 20 2a 2a 20 6e 6f 74 20  tants,.  ** not 
18920 61 72 62 69 74 72 61 72 79 20 65 78 70 72 65 73  arbitrary expres
18930 73 73 69 6f 6e 73 2c 20 77 65 20 61 6c 6c 6f 77  ssions, we allow
18940 65 64 20 73 6f 6d 65 20 63 6f 6d 62 69 6e 69 6e  ed some combinin
18950 67 20 6f 66 20 4c 49 4d 49 54 20 61 6e 64 20 4f  g of LIMIT and O
18960 46 46 53 45 54 0a 20 20 2a 2a 20 62 65 63 61 75  FFSET.  ** becau
18970 73 65 20 74 68 65 79 20 63 6f 75 6c 64 20 62 65  se they could be
18980 20 63 6f 6d 70 75 74 65 64 20 61 74 20 63 6f 6d   computed at com
18990 70 69 6c 65 2d 74 69 6d 65 2e 20 20 42 75 74 20  pile-time.  But 
189a0 77 68 65 6e 20 4c 49 4d 49 54 20 61 6e 64 20 4f  when LIMIT and O
189b0 46 46 53 45 54 0a 20 20 2a 2a 20 62 65 63 61 6d  FFSET.  ** becam
189c0 65 20 61 72 62 69 74 72 61 72 79 20 65 78 70 72  e arbitrary expr
189d0 65 73 73 69 6f 6e 73 2c 20 77 65 20 77 65 72 65  essions, we were
189e0 20 66 6f 72 63 65 64 20 74 6f 20 61 64 64 20 72   forced to add r
189f0 65 73 74 72 69 63 74 69 6f 6e 73 20 28 31 33 29  estrictions (13)
18a00 0a 20 20 2a 2a 20 61 6e 64 20 28 31 34 29 2e 20  .  ** and (14). 
18a10 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70  */.  if( pSub->p
18a20 4c 69 6d 69 74 20 26 26 20 70 2d 3e 70 4c 69 6d  Limit && p->pLim
18a30 69 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  it ) return 0;  
18a40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
18a50 65 73 74 72 69 63 74 69 6f 6e 20 28 31 33 29 20  estriction (13) 
18a60 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70  */.  if( pSub->p
18a70 4f 66 66 73 65 74 20 29 20 72 65 74 75 72 6e 20  Offset ) return 
18a80 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
18a90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
18aa0 65 73 74 72 69 63 74 69 6f 6e 20 28 31 34 29 20  estriction (14) 
18ab0 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 52 69 67  */.  if( p->pRig
18ac0 68 74 6d 6f 73 74 20 26 26 20 70 53 75 62 2d 3e  htmost && pSub->
18ad0 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 72 65  pLimit ){.    re
18ae0 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
18af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18b10 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
18b20 6e 20 28 31 35 29 20 2a 2f 0a 20 20 7d 0a 20 20  n (15) */.  }.  
18b30 69 66 28 20 70 53 75 62 53 72 63 2d 3e 6e 53 72  if( pSubSrc->nSr
18b40 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  c==0 ) return 0;
18b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18b60 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
18b70 63 74 69 6f 6e 20 28 37 29 20 20 2a 2f 0a 20 20  ction (7)  */.  
18b80 69 66 28 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61  if( pSub->selFla
18b90 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74  gs & SF_Distinct
18ba0 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
18bb0 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
18bc0 63 74 69 6f 6e 20 28 35 29 20 20 2a 2f 0a 20 20  ction (5)  */.  
18bd0 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74  if( pSub->pLimit
18be0 20 26 26 20 28 70 53 72 63 2d 3e 6e 53 72 63 3e   && (pSrc->nSrc>
18bf0 31 20 7c 7c 20 69 73 41 67 67 29 20 29 7b 0a 20  1 || isAgg) ){. 
18c00 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20      return 0;   
18c10 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
18c20 74 69 6f 6e 73 20 28 38 29 28 39 29 20 2a 2f 0a  tions (8)(9) */.
18c30 20 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e 73 65    }.  if( (p->se
18c40 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74  lFlags & SF_Dist
18c50 69 6e 63 74 29 21 3d 30 20 26 26 20 73 75 62 71  inct)!=0 && subq
18c60 75 65 72 79 49 73 41 67 67 20 29 7b 0a 20 20 20  ueryIsAgg ){.   
18c70 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20    return 0;     
18c80 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
18c90 6f 6e 20 28 36 29 20 20 2a 2f 0a 20 20 7d 0a 20  on (6)  */.  }. 
18ca0 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79   if( p->pOrderBy
18cb0 20 26 26 20 70 53 75 62 2d 3e 70 4f 72 64 65 72   && pSub->pOrder
18cc0 42 79 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72  By ){.     retur
18cd0 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
18ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
18d00 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31  * Restriction (1
18d10 31 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20  1) */.  }.  if( 
18d20 69 73 41 67 67 20 26 26 20 70 53 75 62 2d 3e 70  isAgg && pSub->p
18d30 4f 72 64 65 72 42 79 20 29 20 72 65 74 75 72 6e  OrderBy ) return
18d40 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
18d50 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
18d60 6e 20 28 31 36 29 20 2a 2f 0a 20 20 69 66 28 20  n (16) */.  if( 
18d70 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20  pSub->pLimit && 
18d80 70 2d 3e 70 57 68 65 72 65 20 29 20 72 65 74 75  p->pWhere ) retu
18d90 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
18da0 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
18db0 6e 20 28 31 39 29 20 2a 2f 0a 20 20 69 66 28 20  n (19) */.  if( 
18dc0 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20  pSub->pLimit && 
18dd0 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  (p->selFlags & S
18de0 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30 20 29  F_Distinct)!=0 )
18df0 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  {.     return 0;
18e00 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
18e10 72 69 63 74 69 6f 6e 20 28 32 31 29 20 2a 2f 0a  riction (21) */.
18e20 20 20 7d 0a 0a 20 20 2f 2a 20 4f 42 53 4f 4c 45    }..  /* OBSOLE
18e30 54 45 20 43 4f 4d 4d 45 4e 54 20 31 3a 0a 20 20  TE COMMENT 1:.  
18e40 2a 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 33  ** Restriction 3
18e50 3a 20 20 49 66 20 74 68 65 20 73 75 62 71 75 65  :  If the subque
18e60 72 79 20 69 73 20 61 20 6a 6f 69 6e 2c 20 6d 61  ry is a join, ma
18e70 6b 65 20 73 75 72 65 20 74 68 65 20 73 75 62 71  ke sure the subq
18e80 75 65 72 79 20 69 73 20 0a 20 20 2a 2a 20 6e 6f  uery is .  ** no
18e90 74 20 75 73 65 64 20 61 73 20 74 68 65 20 72 69  t used as the ri
18ea0 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61  ght operand of a
18eb0 6e 20 6f 75 74 65 72 20 6a 6f 69 6e 2e 20 20 45  n outer join.  E
18ec0 78 61 6d 70 6c 65 73 20 6f 66 20 77 68 79 20 74  xamples of why t
18ed0 68 69 73 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20  his.  ** is not 
18ee0 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20 20  allowed:.  **.  
18ef0 2a 2a 20 20 20 20 20 20 20 20 20 74 31 20 4c 45  **         t1 LE
18f00 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 28 74  FT OUTER JOIN (t
18f10 32 20 4a 4f 49 4e 20 74 33 29 0a 20 20 2a 2a 0a  2 JOIN t3).  **.
18f20 20 20 2a 2a 20 49 66 20 77 65 20 66 6c 61 74 74    ** If we flatt
18f30 65 6e 20 74 68 65 20 61 62 6f 76 65 2c 20 77 65  en the above, we
18f40 20 77 6f 75 6c 64 20 67 65 74 0a 20 20 2a 2a 0a   would get.  **.
18f50 20 20 2a 2a 20 20 20 20 20 20 20 20 20 28 74 31    **         (t1
18f60 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e   LEFT OUTER JOIN
18f70 20 74 32 29 20 4a 4f 49 4e 20 74 33 0a 20 20 2a   t2) JOIN t3.  *
18f80 2a 0a 20 20 2a 2a 20 77 68 69 63 68 20 69 73 20  *.  ** which is 
18f90 6e 6f 74 20 61 74 20 61 6c 6c 20 74 68 65 20 73  not at all the s
18fa0 61 6d 65 20 74 68 69 6e 67 2e 0a 20 20 2a 2a 0a  ame thing..  **.
18fb0 20 20 2a 2a 20 4f 42 53 4f 4c 45 54 45 20 43 4f    ** OBSOLETE CO
18fc0 4d 4d 45 4e 54 20 32 3a 0a 20 20 2a 2a 20 52 65  MMENT 2:.  ** Re
18fd0 73 74 72 69 63 74 69 6f 6e 20 31 32 3a 20 20 49  striction 12:  I
18fe0 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69  f the subquery i
18ff0 73 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72  s the right oper
19000 61 6e 64 20 6f 66 20 61 20 6c 65 66 74 20 6f 75  and of a left ou
19010 74 65 72 0a 20 20 2a 2a 20 6a 6f 69 6e 2c 20 6d  ter.  ** join, m
19020 61 6b 65 20 73 75 72 65 20 74 68 65 20 73 75 62  ake sure the sub
19030 71 75 65 72 79 20 68 61 73 20 6e 6f 20 57 48 45  query has no WHE
19040 52 45 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 20  RE clause..  ** 
19050 41 6e 20 65 78 61 6d 70 6c 65 73 20 6f 66 20 77  An examples of w
19060 68 79 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61  hy this is not a
19070 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a  llowed:.  **.  *
19080 2a 20 20 20 20 20 20 20 20 20 74 31 20 4c 45 46  *         t1 LEF
19090 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 28 53 45  T OUTER JOIN (SE
190a0 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 20 57  LECT * FROM t2 W
190b0 48 45 52 45 20 74 32 2e 78 3e 30 29 0a 20 20 2a  HERE t2.x>0).  *
190c0 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20 66 6c 61  *.  ** If we fla
190d0 74 74 65 6e 20 74 68 65 20 61 62 6f 76 65 2c 20  tten the above, 
190e0 77 65 20 77 6f 75 6c 64 20 67 65 74 0a 20 20 2a  we would get.  *
190f0 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 28  *.  **         (
19100 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f  t1 LEFT OUTER JO
19110 49 4e 20 74 32 29 20 57 48 45 52 45 20 74 32 2e  IN t2) WHERE t2.
19120 78 3e 30 0a 20 20 2a 2a 0a 20 20 2a 2a 20 42 75  x>0.  **.  ** Bu
19130 74 20 74 68 65 20 74 32 2e 78 3e 30 20 74 65 73  t the t2.x>0 tes
19140 74 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 66 61  t will always fa
19150 69 6c 20 6f 6e 20 61 20 4e 55 4c 4c 20 72 6f 77  il on a NULL row
19160 20 6f 66 20 74 32 2c 20 77 68 69 63 68 0a 20 20   of t2, which.  
19170 2a 2a 20 65 66 66 65 63 74 69 76 65 6c 79 20 63  ** effectively c
19180 6f 6e 76 65 72 74 73 20 74 68 65 20 4f 55 54 45  onverts the OUTE
19190 52 20 4a 4f 49 4e 20 69 6e 74 6f 20 61 6e 20 49  R JOIN into an I
191a0 4e 4e 45 52 20 4a 4f 49 4e 2e 0a 20 20 2a 2a 0a  NNER JOIN..  **.
191b0 20 20 2a 2a 20 54 48 49 53 20 4f 56 45 52 52 49    ** THIS OVERRI
191c0 44 45 53 20 4f 42 53 4f 4c 45 54 45 20 43 4f 4d  DES OBSOLETE COM
191d0 4d 45 4e 54 53 20 31 20 41 4e 44 20 32 20 41 42  MENTS 1 AND 2 AB
191e0 4f 56 45 3a 0a 20 20 2a 2a 20 54 69 63 6b 65 74  OVE:.  ** Ticket
191f0 20 23 33 33 30 30 20 73 68 6f 77 73 20 74 68 61   #3300 shows tha
19200 74 20 66 6c 61 74 74 65 6e 69 6e 67 20 74 68 65  t flattening the
19210 20 72 69 67 68 74 20 74 65 72 6d 20 6f 66 20 61   right term of a
19220 20 4c 45 46 54 20 4a 4f 49 4e 0a 20 20 2a 2a 20   LEFT JOIN.  ** 
19230 69 73 20 66 72 61 75 67 68 74 20 77 69 74 68 20  is fraught with 
19240 64 61 6e 67 65 72 2e 20 20 42 65 73 74 20 74 6f  danger.  Best to
19250 20 61 76 6f 69 64 20 74 68 65 20 77 68 6f 6c 65   avoid the whole
19260 20 74 68 69 6e 67 2e 20 20 49 66 20 74 68 65 0a   thing.  If the.
19270 20 20 2a 2a 20 73 75 62 71 75 65 72 79 20 69 73    ** subquery is
19280 20 74 68 65 20 72 69 67 68 74 20 74 65 72 6d 20   the right term 
19290 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2c 20  of a LEFT JOIN, 
192a0 74 68 65 6e 20 64 6f 20 6e 6f 74 20 66 6c 61 74  then do not flat
192b0 74 65 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ten..  */.  if( 
192c0 28 70 53 75 62 69 74 65 6d 2d 3e 6a 6f 69 6e 74  (pSubitem->joint
192d0 79 70 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21  ype & JT_OUTER)!
192e0 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
192f0 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65   0;.  }..  /* Re
19300 73 74 72 69 63 74 69 6f 6e 20 31 37 3a 20 49 66  striction 17: If
19310 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 69   the sub-query i
19320 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c  s a compound SEL
19330 45 43 54 2c 20 74 68 65 6e 20 69 74 20 6d 75 73  ECT, then it mus
19340 74 0a 20 20 2a 2a 20 75 73 65 20 6f 6e 6c 79 20  t.  ** use only 
19350 74 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70  the UNION ALL op
19360 65 72 61 74 6f 72 2e 20 41 6e 64 20 6e 6f 6e 65  erator. And none
19370 20 6f 66 20 74 68 65 20 73 69 6d 70 6c 65 20 73   of the simple s
19380 65 6c 65 63 74 20 71 75 65 72 69 65 73 0a 20 20  elect queries.  
19390 2a 2a 20 74 68 61 74 20 6d 61 6b 65 20 75 70 20  ** that make up 
193a0 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c  the compound SEL
193b0 45 43 54 20 61 72 65 20 61 6c 6c 6f 77 65 64 20  ECT are allowed 
193c0 74 6f 20 62 65 20 61 67 67 72 65 67 61 74 65 20  to be aggregate 
193d0 6f 72 20 64 69 73 74 69 6e 63 74 0a 20 20 2a 2a  or distinct.  **
193e0 20 71 75 65 72 69 65 73 2e 0a 20 20 2a 2f 0a 20   queries..  */. 
193f0 20 69 66 28 20 70 53 75 62 2d 3e 70 50 72 69 6f   if( pSub->pPrio
19400 72 20 29 7b 0a 20 20 20 20 69 66 28 20 70 53 75  r ){.    if( pSu
19410 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  b->pOrderBy ){. 
19420 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20       return 0;  
19430 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 32  /* Restriction 2
19440 30 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 69  0 */.    }.    i
19450 66 28 20 69 73 41 67 67 20 7c 7c 20 28 70 2d 3e  f( isAgg || (p->
19460 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69  selFlags & SF_Di
19470 73 74 69 6e 63 74 29 21 3d 30 20 7c 7c 20 70 53  stinct)!=0 || pS
19480 72 63 2d 3e 6e 53 72 63 21 3d 31 20 29 7b 0a 20  rc->nSrc!=1 ){. 
19490 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
194a0 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 70 53 75     }.    for(pSu
194b0 62 31 3d 70 53 75 62 3b 20 70 53 75 62 31 3b 20  b1=pSub; pSub1; 
194c0 70 53 75 62 31 3d 70 53 75 62 31 2d 3e 70 50 72  pSub1=pSub1->pPr
194d0 69 6f 72 29 7b 0a 20 20 20 20 20 20 74 65 73 74  ior){.      test
194e0 63 61 73 65 28 20 28 70 53 75 62 31 2d 3e 73 65  case( (pSub1->se
194f0 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73  lFlags & (SF_Dis
19500 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61  tinct|SF_Aggrega
19510 74 65 29 29 3d 3d 53 46 5f 44 69 73 74 69 6e 63  te))==SF_Distinc
19520 74 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  t );.      testc
19530 61 73 65 28 20 28 70 53 75 62 31 2d 3e 73 65 6c  ase( (pSub1->sel
19540 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74  Flags & (SF_Dist
19550 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74  inct|SF_Aggregat
19560 65 29 29 3d 3d 53 46 5f 41 67 67 72 65 67 61 74  e))==SF_Aggregat
19570 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  e );.      asser
19580 74 28 20 70 53 75 62 2d 3e 70 53 72 63 21 3d 30  t( pSub->pSrc!=0
19590 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70   );.      if( (p
195a0 53 75 62 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26  Sub1->selFlags &
195b0 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46   (SF_Distinct|SF
195c0 5f 41 67 67 72 65 67 61 74 65 29 29 21 3d 30 0a  _Aggregate))!=0.
195d0 20 20 20 20 20 20 20 7c 7c 20 28 70 53 75 62 31         || (pSub1
195e0 2d 3e 70 50 72 69 6f 72 20 26 26 20 70 53 75 62  ->pPrior && pSub
195f0 31 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29 20 0a  1->op!=TK_ALL) .
19600 20 20 20 20 20 20 20 7c 7c 20 70 53 75 62 31 2d         || pSub1-
19610 3e 70 53 72 63 2d 3e 6e 53 72 63 3c 31 0a 20 20  >pSrc->nSrc<1.  
19620 20 20 20 20 20 7c 7c 20 70 53 75 62 2d 3e 70 45       || pSub->pE
19630 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 70 53 75  List->nExpr!=pSu
19640 62 31 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  b1->pEList->nExp
19650 72 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  r.      ){.     
19660 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
19670 20 20 20 7d 0a 20 20 20 20 20 20 74 65 73 74 63     }.      testc
19680 61 73 65 28 20 70 53 75 62 31 2d 3e 70 53 72 63  ase( pSub1->pSrc
19690 2d 3e 6e 53 72 63 3e 31 20 29 3b 0a 20 20 20 20  ->nSrc>1 );.    
196a0 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 73 74 72 69  }..    /* Restri
196b0 63 74 69 6f 6e 20 31 38 2e 20 2a 2f 0a 20 20 20  ction 18. */.   
196c0 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79   if( p->pOrderBy
196d0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 69   ){.      int ii
196e0 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30  ;.      for(ii=0
196f0 3b 20 69 69 3c 70 2d 3e 70 4f 72 64 65 72 42 79  ; ii<p->pOrderBy
19700 2d 3e 6e 45 78 70 72 3b 20 69 69 2b 2b 29 7b 0a  ->nExpr; ii++){.
19710 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70          if( p->p
19720 4f 72 64 65 72 42 79 2d 3e 61 5b 69 69 5d 2e 69  OrderBy->a[ii].i
19730 4f 72 64 65 72 42 79 43 6f 6c 3d 3d 30 20 29 20  OrderByCol==0 ) 
19740 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
19750 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
19760 2a 2a 2a 2a 2a 20 49 66 20 77 65 20 72 65 61 63  ***** If we reac
19770 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 66 6c  h this point, fl
19780 61 74 74 65 6e 69 6e 67 20 69 73 20 70 65 72 6d  attening is perm
19790 69 74 74 65 64 2e 20 2a 2a 2a 2a 2a 2f 0a 0a 20  itted. *****/.. 
197a0 20 2f 2a 20 41 75 74 68 6f 72 69 7a 65 20 74 68   /* Authorize th
197b0 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20  e subquery */.  
197c0 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e  pParse->zAuthCon
197d0 74 65 78 74 20 3d 20 70 53 75 62 69 74 65 6d 2d  text = pSubitem-
197e0 3e 7a 4e 61 6d 65 3b 0a 20 20 54 45 53 54 4f 4e  >zName;.  TESTON
197f0 4c 59 28 69 20 3d 29 20 73 71 6c 69 74 65 33 41  LY(i =) sqlite3A
19800 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
19810 20 53 51 4c 49 54 45 5f 53 45 4c 45 43 54 2c 20   SQLITE_SELECT, 
19820 30 2c 20 30 2c 20 30 29 3b 0a 20 20 74 65 73 74  0, 0, 0);.  test
19830 63 61 73 65 28 20 69 3d 3d 53 51 4c 49 54 45 5f  case( i==SQLITE_
19840 44 45 4e 59 20 29 3b 0a 20 20 70 50 61 72 73 65  DENY );.  pParse
19850 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 20 3d  ->zAuthContext =
19860 20 7a 53 61 76 65 64 41 75 74 68 43 6f 6e 74 65   zSavedAuthConte
19870 78 74 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  xt;..  /* If the
19880 20 73 75 62 2d 71 75 65 72 79 20 69 73 20 61 20   sub-query is a 
19890 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20  compound SELECT 
198a0 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20  statement, then 
198b0 28 62 79 20 72 65 73 74 72 69 63 74 69 6f 6e 73  (by restrictions
198c0 0a 20 20 2a 2a 20 31 37 20 61 6e 64 20 31 38 20  .  ** 17 and 18 
198d0 61 62 6f 76 65 29 20 69 74 20 6d 75 73 74 20 62  above) it must b
198e0 65 20 61 20 55 4e 49 4f 4e 20 41 4c 4c 20 61 6e  e a UNION ALL an
198f0 64 20 74 68 65 20 70 61 72 65 6e 74 20 71 75 65  d the parent que
19900 72 79 20 6d 75 73 74 20 0a 20 20 2a 2a 20 62 65  ry must .  ** be
19910 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 20 20   of the form:.  
19920 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45  **.  **     SELE
19930 43 54 20 3c 65 78 70 72 2d 6c 69 73 74 3e 20 46  CT <expr-list> F
19940 52 4f 4d 20 28 3c 73 75 62 2d 71 75 65 72 79 3e  ROM (<sub-query>
19950 29 20 3c 77 68 65 72 65 2d 63 6c 61 75 73 65 3e  ) <where-clause>
19960 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 66 6f 6c 6c   .  **.  ** foll
19970 6f 77 65 64 20 62 79 20 61 6e 79 20 4f 52 44 45  owed by any ORDE
19980 52 20 42 59 2c 20 4c 49 4d 49 54 20 61 6e 64 2f  R BY, LIMIT and/
19990 6f 72 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65  or OFFSET clause
199a0 73 2e 20 54 68 69 73 20 62 6c 6f 63 6b 0a 20 20  s. This block.  
199b0 2a 2a 20 63 72 65 61 74 65 73 20 4e 2d 31 20 63  ** creates N-1 c
199c0 6f 70 69 65 73 20 6f 66 20 74 68 65 20 70 61 72  opies of the par
199d0 65 6e 74 20 71 75 65 72 79 20 77 69 74 68 6f 75  ent query withou
199e0 74 20 61 6e 79 20 4f 52 44 45 52 20 42 59 2c 20  t any ORDER BY, 
199f0 4c 49 4d 49 54 20 6f 72 20 0a 20 20 2a 2a 20 4f  LIMIT or .  ** O
19a00 46 46 53 45 54 20 63 6c 61 75 73 65 73 20 61 6e  FFSET clauses an
19a10 64 20 6a 6f 69 6e 73 20 74 68 65 6d 20 74 6f 20  d joins them to 
19a20 74 68 65 20 6c 65 66 74 2d 68 61 6e 64 2d 73 69  the left-hand-si
19a30 64 65 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e  de of the origin
19a40 61 6c 0a 20 20 2a 2a 20 75 73 69 6e 67 20 55 4e  al.  ** using UN
19a50 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72  ION ALL operator
19a60 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  s. In this case 
19a70 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  N is the number 
19a80 6f 66 20 73 69 6d 70 6c 65 0a 20 20 2a 2a 20 73  of simple.  ** s
19a90 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 73  elect statements
19aa0 20 69 6e 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64   in the compound
19ab0 20 73 75 62 2d 71 75 65 72 79 2e 0a 20 20 2a 2a   sub-query..  **
19ac0 0a 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20  .  ** Example:. 
19ad0 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c   **.  **     SEL
19ae0 45 43 54 20 61 2b 31 20 46 52 4f 4d 20 28 0a 20  ECT a+1 FROM (. 
19af0 20 2a 2a 20 20 20 20 20 20 20 20 53 45 4c 45 43   **        SELEC
19b00 54 20 78 20 46 52 4f 4d 20 74 61 62 0a 20 20 2a  T x FROM tab.  *
19b10 2a 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 41  *        UNION A
19b20 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 53  LL.  **        S
19b30 45 4c 45 43 54 20 79 20 46 52 4f 4d 20 74 61 62  ELECT y FROM tab
19b40 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 55 4e 49  .  **        UNI
19b50 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20  ON ALL.  **     
19b60 20 20 20 53 45 4c 45 43 54 20 61 62 73 28 7a 2a     SELECT abs(z*
19b70 32 29 20 46 52 4f 4d 20 74 61 62 32 0a 20 20 2a  2) FROM tab2.  *
19b80 2a 20 20 20 20 20 29 20 57 48 45 52 45 20 61 21  *     ) WHERE a!
19b90 3d 35 20 4f 52 44 45 52 20 42 59 20 31 0a 20 20  =5 ORDER BY 1.  
19ba0 2a 2a 0a 20 20 2a 2a 20 54 72 61 6e 73 66 6f 72  **.  ** Transfor
19bb0 6d 65 64 20 69 6e 74 6f 3a 0a 20 20 2a 2a 0a 20  med into:.  **. 
19bc0 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 78   **     SELECT x
19bd0 2b 31 20 46 52 4f 4d 20 74 61 62 20 57 48 45 52  +1 FROM tab WHER
19be0 45 20 78 2b 31 21 3d 35 0a 20 20 2a 2a 20 20 20  E x+1!=5.  **   
19bf0 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a    UNION ALL.  **
19c00 20 20 20 20 20 53 45 4c 45 43 54 20 79 2b 31 20       SELECT y+1 
19c10 46 52 4f 4d 20 74 61 62 20 57 48 45 52 45 20 79  FROM tab WHERE y
19c20 2b 31 21 3d 35 0a 20 20 2a 2a 20 20 20 20 20 55  +1!=5.  **     U
19c30 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20  NION ALL.  **   
19c40 20 20 53 45 4c 45 43 54 20 61 62 73 28 7a 2a 32    SELECT abs(z*2
19c50 29 2b 31 20 46 52 4f 4d 20 74 61 62 32 20 57 48  )+1 FROM tab2 WH
19c60 45 52 45 20 61 62 73 28 7a 2a 32 29 2b 31 21 3d  ERE abs(z*2)+1!=
19c70 35 0a 20 20 2a 2a 20 20 20 20 20 4f 52 44 45 52  5.  **     ORDER
19c80 20 42 59 20 31 0a 20 20 2a 2a 0a 20 20 2a 2a 20   BY 1.  **.  ** 
19c90 57 65 20 63 61 6c 6c 20 74 68 69 73 20 74 68 65  We call this the
19ca0 20 22 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75   "compound-subqu
19cb0 65 72 79 20 66 6c 61 74 74 65 6e 69 6e 67 22 2e  ery flattening".
19cc0 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 53 75 62  .  */.  for(pSub
19cd0 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72 3b 20 70  =pSub->pPrior; p
19ce0 53 75 62 3b 20 70 53 75 62 3d 70 53 75 62 2d 3e  Sub; pSub=pSub->
19cf0 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 53 65 6c  pPrior){.    Sel
19d00 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20 20 20 45  ect *pNew;.    E
19d10 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
19d20 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b  y = p->pOrderBy;
19d30 0a 20 20 20 20 45 78 70 72 20 2a 70 4c 69 6d 69  .    Expr *pLimi
19d40 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20  t = p->pLimit;. 
19d50 20 20 20 45 78 70 72 20 2a 70 4f 66 66 73 65 74     Expr *pOffset
19d60 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20   = p->pOffset;. 
19d70 20 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f     Select *pPrio
19d80 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20  r = p->pPrior;. 
19d90 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d     p->pOrderBy =
19da0 20 30 3b 0a 20 20 20 20 70 2d 3e 70 53 72 63 20   0;.    p->pSrc 
19db0 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 50 72 69  = 0;.    p->pPri
19dc0 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70  or = 0;.    p->p
19dd0 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 70  Limit = 0;.    p
19de0 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20  ->pOffset = 0;. 
19df0 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65     pNew = sqlite
19e00 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70  3SelectDup(db, p
19e10 2c 20 30 29 3b 0a 20 20 20 20 70 2d 3e 70 4f 66  , 0);.    p->pOf
19e20 66 73 65 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a  fset = pOffset;.
19e30 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20      p->pLimit = 
19e40 70 4c 69 6d 69 74 3b 0a 20 20 20 20 70 2d 3e 70  pLimit;.    p->p
19e50 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72  OrderBy = pOrder
19e60 42 79 3b 0a 20 20 20 20 70 2d 3e 70 53 72 63 20  By;.    p->pSrc 
19e70 3d 20 70 53 72 63 3b 0a 20 20 20 20 70 2d 3e 6f  = pSrc;.    p->o
19e80 70 20 3d 20 54 4b 5f 41 4c 4c 3b 0a 20 20 20 20  p = TK_ALL;.    
19e90 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 20 3d 20  p->pRightmost = 
19ea0 30 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d  0;.    if( pNew=
19eb0 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77  =0 ){.      pNew
19ec0 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 7d   = pPrior;.    }
19ed0 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4e 65 77  else{.      pNew
19ee0 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f  ->pPrior = pPrio
19ef0 72 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70  r;.      pNew->p
19f00 52 69 67 68 74 6d 6f 73 74 20 3d 20 30 3b 0a 20  Rightmost = 0;. 
19f10 20 20 20 7d 0a 20 20 20 20 70 2d 3e 70 50 72 69     }.    p->pPri
19f20 6f 72 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 69  or = pNew;.    i
19f30 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
19f40 6c 65 64 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  led ) return 1;.
19f50 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20    }..  /* Begin 
19f60 66 6c 61 74 74 65 6e 69 6e 67 20 74 68 65 20 69  flattening the i
19f70 46 72 6f 6d 2d 74 68 20 65 6e 74 72 79 20 6f 66  From-th entry of
19f80 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
19f90 20 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 6f 75   .  ** in the ou
19fa0 74 65 72 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a  ter query..  */.
19fb0 20 20 70 53 75 62 20 3d 20 70 53 75 62 31 20 3d    pSub = pSub1 =
19fc0 20 70 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65   pSubitem->pSele
19fd0 63 74 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65  ct;..  /* Delete
19fe0 20 74 68 65 20 74 72 61 6e 73 69 65 6e 74 20 74   the transient t
19ff0 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 61  able structure a
1a000 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
1a010 68 65 0a 20 20 2a 2a 20 73 75 62 71 75 65 72 79  he.  ** subquery
1a020 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 44  .  */.  sqlite3D
1a030 62 46 72 65 65 28 64 62 2c 20 70 53 75 62 69 74  bFree(db, pSubit
1a040 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a  em->zDatabase);.
1a050 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
1a060 64 62 2c 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e  db, pSubitem->zN
1a070 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  ame);.  sqlite3D
1a080 62 46 72 65 65 28 64 62 2c 20 70 53 75 62 69 74  bFree(db, pSubit
1a090 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 70  em->zAlias);.  p
1a0a0 53 75 62 69 74 65 6d 2d 3e 7a 44 61 74 61 62 61  Subitem->zDataba
1a0b0 73 65 20 3d 20 30 3b 0a 20 20 70 53 75 62 69 74  se = 0;.  pSubit
1a0c0 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20  em->zName = 0;. 
1a0d0 20 70 53 75 62 69 74 65 6d 2d 3e 7a 41 6c 69 61   pSubitem->zAlia
1a0e0 73 20 3d 20 30 3b 0a 20 20 70 53 75 62 69 74 65  s = 0;.  pSubite
1a0f0 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 30 3b 0a  m->pSelect = 0;.
1a100 0a 20 20 2f 2a 20 44 65 66 65 72 20 64 65 6c 65  .  /* Defer dele
1a110 74 69 6e 67 20 74 68 65 20 54 61 62 6c 65 20 6f  ting the Table o
1a120 62 6a 65 63 74 20 61 73 73 6f 63 69 61 74 65 64  bject associated
1a130 20 77 69 74 68 20 74 68 65 0a 20 20 2a 2a 20 73   with the.  ** s
1a140 75 62 71 75 65 72 79 20 75 6e 74 69 6c 20 63 6f  ubquery until co
1a150 64 65 20 67 65 6e 65 72 61 74 69 6f 6e 20 69 73  de generation is
1a160 0a 20 20 2a 2a 20 63 6f 6d 70 6c 65 74 65 2c 20  .  ** complete, 
1a170 73 69 6e 63 65 20 74 68 65 72 65 20 6d 61 79 20  since there may 
1a180 73 74 69 6c 6c 20 65 78 69 73 74 20 45 78 70 72  still exist Expr
1a190 2e 70 54 61 62 20 65 6e 74 72 69 65 73 20 74 68  .pTab entries th
1a1a0 61 74 0a 20 20 2a 2a 20 72 65 66 65 72 20 74 6f  at.  ** refer to
1a1b0 20 74 68 65 20 73 75 62 71 75 65 72 79 20 65 76   the subquery ev
1a1c0 65 6e 20 61 66 74 65 72 20 66 6c 61 74 74 65 6e  en after flatten
1a1d0 69 6e 67 2e 20 20 54 69 63 6b 65 74 20 23 33 33  ing.  Ticket #33
1a1e0 34 36 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 70 53  46..  **.  ** pS
1a1f0 75 62 69 74 65 6d 2d 3e 70 54 61 62 20 69 73 20  ubitem->pTab is 
1a200 61 6c 77 61 79 73 20 6e 6f 6e 2d 4e 55 4c 4c 20  always non-NULL 
1a210 62 79 20 74 65 73 74 20 72 65 73 74 72 69 63 74  by test restrict
1a220 69 6f 6e 73 20 61 6e 64 20 74 65 73 74 73 20 61  ions and tests a
1a230 62 6f 76 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  bove..  */.  if(
1a240 20 41 4c 57 41 59 53 28 70 53 75 62 69 74 65 6d   ALWAYS(pSubitem
1a250 2d 3e 70 54 61 62 21 3d 30 29 20 29 7b 0a 20 20  ->pTab!=0) ){.  
1a260 20 20 54 61 62 6c 65 20 2a 70 54 61 62 54 6f 44    Table *pTabToD
1a270 65 6c 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70  el = pSubitem->p
1a280 54 61 62 3b 0a 20 20 20 20 69 66 28 20 70 54 61  Tab;.    if( pTa
1a290 62 54 6f 44 65 6c 2d 3e 6e 52 65 66 3d 3d 31 20  bToDel->nRef==1 
1a2a0 29 7b 0a 20 20 20 20 20 20 50 61 72 73 65 20 2a  ){.      Parse *
1a2b0 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69  pToplevel = sqli
1a2c0 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65 6c  te3ParseToplevel
1a2d0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
1a2e0 70 54 61 62 54 6f 44 65 6c 2d 3e 70 4e 65 78 74  pTabToDel->pNext
1a2f0 5a 6f 6d 62 69 65 20 3d 20 70 54 6f 70 6c 65 76  Zombie = pToplev
1a300 65 6c 2d 3e 70 5a 6f 6d 62 69 65 54 61 62 3b 0a  el->pZombieTab;.
1a310 20 20 20 20 20 20 70 54 6f 70 6c 65 76 65 6c 2d        pToplevel-
1a320 3e 70 5a 6f 6d 62 69 65 54 61 62 20 3d 20 70 54  >pZombieTab = pT
1a330 61 62 54 6f 44 65 6c 3b 0a 20 20 20 20 7d 65 6c  abToDel;.    }el
1a340 73 65 7b 0a 20 20 20 20 20 20 70 54 61 62 54 6f  se{.      pTabTo
1a350 44 65 6c 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20  Del->nRef--;.   
1a360 20 7d 0a 20 20 20 20 70 53 75 62 69 74 65 6d 2d   }.    pSubitem-
1a370 3e 70 54 61 62 20 3d 20 30 3b 0a 20 20 7d 0a 0a  >pTab = 0;.  }..
1a380 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    /* The followi
1a390 6e 67 20 6c 6f 6f 70 20 72 75 6e 73 20 6f 6e 63  ng loop runs onc
1a3a0 65 20 66 6f 72 20 65 61 63 68 20 74 65 72 6d 20  e for each term 
1a3b0 69 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 2d 73 75  in a compound-su
1a3c0 62 71 75 65 72 79 0a 20 20 2a 2a 20 66 6c 61 74  bquery.  ** flat
1a3d0 74 65 6e 69 6e 67 20 28 61 73 20 64 65 73 63 72  tening (as descr
1a3e0 69 62 65 64 20 61 62 6f 76 65 29 2e 20 20 49 66  ibed above).  If
1a3f0 20 77 65 20 61 72 65 20 64 6f 69 6e 67 20 61 20   we are doing a 
1a400 64 69 66 66 65 72 65 6e 74 20 6b 69 6e 64 0a 20  different kind. 
1a410 20 2a 2a 20 6f 66 20 66 6c 61 74 74 65 6e 69 6e   ** of flattenin
1a420 67 20 2d 20 61 20 66 6c 61 74 74 65 6e 69 6e 67  g - a flattening
1a430 20 6f 74 68 65 72 20 74 68 61 6e 20 61 20 63 6f   other than a co
1a440 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65 72 79 20  mpound-subquery 
1a450 66 6c 61 74 74 65 6e 69 6e 67 20 2d 0a 20 20 2a  flattening -.  *
1a460 2a 20 74 68 65 6e 20 74 68 69 73 20 6c 6f 6f 70  * then this loop
1a470 20 6f 6e 6c 79 20 72 75 6e 73 20 6f 6e 63 65 2e   only runs once.
1a480 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20  .  **.  ** This 
1a490 6c 6f 6f 70 20 6d 6f 76 65 73 20 61 6c 6c 20 6f  loop moves all o
1a4a0 66 20 74 68 65 20 46 52 4f 4d 20 65 6c 65 6d 65  f the FROM eleme
1a4b0 6e 74 73 20 6f 66 20 74 68 65 20 73 75 62 71 75  nts of the subqu
1a4c0 65 72 79 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a  ery into the.  *
1a4d0 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * the FROM claus
1a4e0 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71  e of the outer q
1a4f0 75 65 72 79 2e 20 20 42 65 66 6f 72 65 20 64 6f  uery.  Before do
1a500 69 6e 67 20 74 68 69 73 2c 20 72 65 6d 65 6d 62  ing this, rememb
1a510 65 72 0a 20 20 2a 2a 20 74 68 65 20 63 75 72 73  er.  ** the curs
1a520 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  or number for th
1a530 65 20 6f 72 69 67 69 6e 61 6c 20 6f 75 74 65 72  e original outer
1a540 20 71 75 65 72 79 20 46 52 4f 4d 20 65 6c 65 6d   query FROM elem
1a550 65 6e 74 20 69 6e 0a 20 20 2a 2a 20 69 50 61 72  ent in.  ** iPar
1a560 65 6e 74 2e 20 20 54 68 65 20 69 50 61 72 65 6e  ent.  The iParen
1a570 74 20 63 75 72 73 6f 72 20 77 69 6c 6c 20 6e 65  t cursor will ne
1a580 76 65 72 20 62 65 20 75 73 65 64 2e 20 20 53 75  ver be used.  Su
1a590 62 73 65 71 75 65 6e 74 20 63 6f 64 65 0a 20 20  bsequent code.  
1a5a0 2a 2a 20 77 69 6c 6c 20 73 63 61 6e 20 65 78 70  ** will scan exp
1a5b0 72 65 73 73 69 6f 6e 73 20 6c 6f 6f 6b 69 6e 67  ressions looking
1a5c0 20 66 6f 72 20 69 50 61 72 65 6e 74 20 72 65 66   for iParent ref
1a5d0 65 72 65 6e 63 65 73 20 61 6e 64 20 72 65 70 6c  erences and repl
1a5e0 61 63 65 0a 20 20 2a 2a 20 74 68 6f 73 65 20 72  ace.  ** those r
1a5f0 65 66 65 72 65 6e 63 65 73 20 77 69 74 68 20 65  eferences with e
1a600 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20  xpressions that 
1a610 72 65 73 6f 6c 76 65 20 74 6f 20 74 68 65 20 73  resolve to the s
1a620 75 62 71 75 65 72 79 20 46 52 4f 4d 0a 20 20 2a  ubquery FROM.  *
1a630 2a 20 65 6c 65 6d 65 6e 74 73 20 77 65 20 61 72  * elements we ar
1a640 65 20 6e 6f 77 20 63 6f 70 79 69 6e 67 20 69 6e  e now copying in
1a650 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 50 61  ..  */.  for(pPa
1a660 72 65 6e 74 3d 70 3b 20 70 50 61 72 65 6e 74 3b  rent=p; pParent;
1a670 20 70 50 61 72 65 6e 74 3d 70 50 61 72 65 6e 74   pParent=pParent
1a680 2d 3e 70 50 72 69 6f 72 2c 20 70 53 75 62 3d 70  ->pPrior, pSub=p
1a690 53 75 62 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20  Sub->pPrior){.  
1a6a0 20 20 69 6e 74 20 6e 53 75 62 53 72 63 3b 0a 20    int nSubSrc;. 
1a6b0 20 20 20 75 38 20 6a 6f 69 6e 74 79 70 65 20 3d     u8 jointype =
1a6c0 20 30 3b 0a 20 20 20 20 70 53 75 62 53 72 63 20   0;.    pSubSrc 
1a6d0 3d 20 70 53 75 62 2d 3e 70 53 72 63 3b 20 20 20  = pSub->pSrc;   
1a6e0 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65    /* FROM clause
1a6f0 20 6f 66 20 73 75 62 71 75 65 72 79 20 2a 2f 0a   of subquery */.
1a700 20 20 20 20 6e 53 75 62 53 72 63 20 3d 20 70 53      nSubSrc = pS
1a710 75 62 53 72 63 2d 3e 6e 53 72 63 3b 20 20 2f 2a  ubSrc->nSrc;  /*
1a720 20 4e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73   Number of terms
1a730 20 69 6e 20 73 75 62 71 75 65 72 79 20 46 52 4f   in subquery FRO
1a740 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20  M clause */.    
1a750 70 53 72 63 20 3d 20 70 50 61 72 65 6e 74 2d 3e  pSrc = pParent->
1a760 70 53 72 63 3b 20 20 20 20 20 2f 2a 20 46 52 4f  pSrc;     /* FRO
1a770 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
1a780 6f 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 0a  outer query */..
1a790 20 20 20 20 69 66 28 20 70 53 72 63 20 29 7b 0a      if( pSrc ){.
1a7a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
1a7b0 61 72 65 6e 74 3d 3d 70 20 29 3b 20 20 2f 2a 20  arent==p );  /* 
1a7c0 46 69 72 73 74 20 74 69 6d 65 20 74 68 72 6f 75  First time throu
1a7d0 67 68 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20  gh the loop */. 
1a7e0 20 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d 20       jointype = 
1a7f0 70 53 75 62 69 74 65 6d 2d 3e 6a 6f 69 6e 74 79  pSubitem->jointy
1a800 70 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  pe;.    }else{. 
1a810 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
1a820 72 65 6e 74 21 3d 70 20 29 3b 20 20 2f 2a 20 32  rent!=p );  /* 2
1a830 6e 64 20 61 6e 64 20 73 75 62 73 65 71 75 65 6e  nd and subsequen
1a840 74 20 74 69 6d 65 73 20 74 68 72 6f 75 67 68 20  t times through 
1a850 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20  the loop */.    
1a860 20 20 70 53 72 63 20 3d 20 70 50 61 72 65 6e 74    pSrc = pParent
1a870 2d 3e 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33  ->pSrc = sqlite3
1a880 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 64 62  SrcListAppend(db
1a890 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
1a8a0 20 20 69 66 28 20 70 53 72 63 3d 3d 30 20 29 7b    if( pSrc==0 ){
1a8b0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1a8c0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
1a8d0 64 20 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  d );.        bre
1a8e0 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
1a8f0 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 73 75  }..    /* The su
1a900 62 71 75 65 72 79 20 75 73 65 73 20 61 20 73 69  bquery uses a si
1a910 6e 67 6c 65 20 73 6c 6f 74 20 6f 66 20 74 68 65  ngle slot of the
1a920 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
1a930 74 68 65 20 6f 75 74 65 72 0a 20 20 20 20 2a 2a  the outer.    **
1a940 20 71 75 65 72 79 2e 20 20 49 66 20 74 68 65 20   query.  If the 
1a950 73 75 62 71 75 65 72 79 20 68 61 73 20 6d 6f 72  subquery has mor
1a960 65 20 74 68 61 6e 20 6f 6e 65 20 65 6c 65 6d 65  e than one eleme
1a970 6e 74 20 69 6e 20 69 74 73 20 46 52 4f 4d 20 63  nt in its FROM c
1a980 6c 61 75 73 65 2c 0a 20 20 20 20 2a 2a 20 74 68  lause,.    ** th
1a990 65 6e 20 65 78 70 61 6e 64 20 74 68 65 20 6f 75  en expand the ou
1a9a0 74 65 72 20 71 75 65 72 79 20 74 6f 20 6d 61 6b  ter query to mak
1a9b0 65 20 73 70 61 63 65 20 66 6f 72 20 69 74 20 74  e space for it t
1a9c0 6f 20 68 6f 6c 64 20 61 6c 6c 20 65 6c 65 6d 65  o hold all eleme
1a9d0 6e 74 73 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68  nts.    ** of th
1a9e0 65 20 73 75 62 71 75 65 72 79 2e 0a 20 20 20 20  e subquery..    
1a9f0 2a 2a 0a 20 20 20 20 2a 2a 20 45 78 61 6d 70 6c  **.    ** Exampl
1aa00 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e:.    **.    **
1aa10 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
1aa20 4d 20 74 61 62 41 2c 20 28 53 45 4c 45 43 54 20  M tabA, (SELECT 
1aa30 2a 20 46 52 4f 4d 20 73 75 62 31 2c 20 73 75 62  * FROM sub1, sub
1aa40 32 29 2c 20 74 61 62 42 3b 0a 20 20 20 20 2a 2a  2), tabB;.    **
1aa50 0a 20 20 20 20 2a 2a 20 54 68 65 20 6f 75 74 65  .    ** The oute
1aa60 72 20 71 75 65 72 79 20 68 61 73 20 33 20 73 6c  r query has 3 sl
1aa70 6f 74 73 20 69 6e 20 69 74 73 20 46 52 4f 4d 20  ots in its FROM 
1aa80 63 6c 61 75 73 65 2e 20 20 4f 6e 65 20 73 6c 6f  clause.  One slo
1aa90 74 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  t of the.    ** 
1aaa0 6f 75 74 65 72 20 71 75 65 72 79 20 28 74 68 65  outer query (the
1aab0 20 6d 69 64 64 6c 65 20 73 6c 6f 74 29 20 69 73   middle slot) is
1aac0 20 75 73 65 64 20 62 79 20 74 68 65 20 73 75 62   used by the sub
1aad0 71 75 65 72 79 2e 20 20 54 68 65 20 6e 65 78 74  query.  The next
1aae0 0a 20 20 20 20 2a 2a 20 62 6c 6f 63 6b 20 6f 66  .    ** block of
1aaf0 20 63 6f 64 65 20 77 69 6c 6c 20 65 78 70 61 6e   code will expan
1ab00 64 20 74 68 65 20 6f 75 74 20 71 75 65 72 79 20  d the out query 
1ab10 74 6f 20 34 20 73 6c 6f 74 73 2e 20 20 54 68 65  to 4 slots.  The
1ab20 20 6d 69 64 64 6c 65 0a 20 20 20 20 2a 2a 20 73   middle.    ** s
1ab30 6c 6f 74 20 69 73 20 65 78 70 61 6e 64 65 64 20  lot is expanded 
1ab40 74 6f 20 74 77 6f 20 73 6c 6f 74 73 20 69 6e 20  to two slots in 
1ab50 6f 72 64 65 72 20 74 6f 20 6d 61 6b 65 20 73 70  order to make sp
1ab60 61 63 65 20 66 6f 72 20 74 68 65 0a 20 20 20 20  ace for the.    
1ab70 2a 2a 20 74 77 6f 20 65 6c 65 6d 65 6e 74 73 20  ** two elements 
1ab80 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
1ab90 73 65 20 6f 66 20 74 68 65 20 73 75 62 71 75 65  se of the subque
1aba0 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ry..    */.    i
1abb0 66 28 20 6e 53 75 62 53 72 63 3e 31 20 29 7b 0a  f( nSubSrc>1 ){.
1abc0 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70        pParent->p
1abd0 53 72 63 20 3d 20 70 53 72 63 20 3d 20 73 71 6c  Src = pSrc = sql
1abe0 69 74 65 33 53 72 63 4c 69 73 74 45 6e 6c 61 72  ite3SrcListEnlar
1abf0 67 65 28 64 62 2c 20 70 53 72 63 2c 20 6e 53 75  ge(db, pSrc, nSu
1ac00 62 53 72 63 2d 31 2c 69 46 72 6f 6d 2b 31 29 3b  bSrc-1,iFrom+1);
1ac10 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6d  .      if( db->m
1ac20 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
1ac30 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1ac40 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
1ac50 20 2f 2a 20 54 72 61 6e 73 66 65 72 20 74 68 65   /* Transfer the
1ac60 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72   FROM clause ter
1ac70 6d 73 20 66 72 6f 6d 20 74 68 65 20 73 75 62 71  ms from the subq
1ac80 75 65 72 79 20 69 6e 74 6f 20 74 68 65 0a 20 20  uery into the.  
1ac90 20 20 2a 2a 20 6f 75 74 65 72 20 71 75 65 72 79    ** outer query
1aca0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
1acb0 28 69 3d 30 3b 20 69 3c 6e 53 75 62 53 72 63 3b  (i=0; i<nSubSrc;
1acc0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c   i++){.      sql
1acd0 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65  ite3IdListDelete
1ace0 28 64 62 2c 20 70 53 72 63 2d 3e 61 5b 69 2b 69  (db, pSrc->a[i+i
1acf0 46 72 6f 6d 5d 2e 70 55 73 69 6e 67 29 3b 0a 20  From].pUsing);. 
1ad00 20 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 2b 69       pSrc->a[i+i
1ad10 46 72 6f 6d 5d 20 3d 20 70 53 75 62 53 72 63 2d  From] = pSubSrc-
1ad20 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 6d 65 6d  >a[i];.      mem
1ad30 73 65 74 28 26 70 53 75 62 53 72 63 2d 3e 61 5b  set(&pSubSrc->a[
1ad40 69 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 53  i], 0, sizeof(pS
1ad50 75 62 53 72 63 2d 3e 61 5b 69 5d 29 29 3b 0a 20  ubSrc->a[i]));. 
1ad60 20 20 20 7d 0a 20 20 20 20 70 53 72 63 2d 3e 61     }.    pSrc->a
1ad70 5b 69 46 72 6f 6d 5d 2e 6a 6f 69 6e 74 79 70 65  [iFrom].jointype
1ad80 20 3d 20 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 0a   = jointype;.  .
1ad90 20 20 20 20 2f 2a 20 4e 6f 77 20 62 65 67 69 6e      /* Now begin
1ada0 20 73 75 62 73 74 69 74 75 74 69 6e 67 20 73 75   substituting su
1adb0 62 71 75 65 72 79 20 72 65 73 75 6c 74 20 73 65  bquery result se
1adc0 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 66 6f  t expressions fo
1add0 72 20 0a 20 20 20 20 2a 2a 20 72 65 66 65 72 65  r .    ** refere
1ade0 6e 63 65 73 20 74 6f 20 74 68 65 20 69 50 61 72  nces to the iPar
1adf0 65 6e 74 20 69 6e 20 74 68 65 20 6f 75 74 65 72  ent in the outer
1ae00 20 71 75 65 72 79 2e 0a 20 20 20 20 2a 2a 20 0a   query..    ** .
1ae10 20 20 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a      ** Example:.
1ae20 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
1ae30 53 45 4c 45 43 54 20 61 2b 35 2c 20 62 2a 31 30  SELECT a+5, b*10
1ae40 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 78 2a   FROM (SELECT x*
1ae50 33 20 41 53 20 61 2c 20 79 2b 31 30 20 41 53 20  3 AS a, y+10 AS 
1ae60 62 20 46 52 4f 4d 20 74 31 29 20 57 48 45 52 45  b FROM t1) WHERE
1ae70 20 61 3e 62 3b 0a 20 20 20 20 2a 2a 20 20 20 5c   a>b;.    **   \
1ae80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ae90 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f       \__________
1aea0 5f 5f 5f 20 73 75 62 71 75 65 72 79 20 5f 5f 5f  ___ subquery ___
1aeb0 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20 20 20  _______/        
1aec0 20 20 2f 0a 20 20 20 20 2a 2a 20 20 20 20 5c 5f    /.    **    \_
1aed0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
1aee0 5f 5f 5f 5f 20 6f 75 74 65 72 20 71 75 65 72 79  ____ outer query
1aef0 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f   _______________
1af00 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f  _______________/
1af10 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 57  .    **.    ** W
1af20 65 20 6c 6f 6f 6b 20 61 74 20 65 76 65 72 79 20  e look at every 
1af30 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68  expression in th
1af40 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 61 6e  e outer query an
1af50 64 20 65 76 65 72 79 20 70 6c 61 63 65 20 77 65  d every place we
1af60 20 73 65 65 0a 20 20 20 20 2a 2a 20 22 61 22 20   see.    ** "a" 
1af70 77 65 20 73 75 62 73 74 69 74 75 74 65 20 22 78  we substitute "x
1af80 2a 33 22 20 61 6e 64 20 65 76 65 72 79 20 70 6c  *3" and every pl
1af90 61 63 65 20 77 65 20 73 65 65 20 22 62 22 20 77  ace we see "b" w
1afa0 65 20 73 75 62 73 74 69 74 75 74 65 20 22 79 2b  e substitute "y+
1afb0 31 30 22 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  10"..    */.    
1afc0 70 4c 69 73 74 20 3d 20 70 50 61 72 65 6e 74 2d  pList = pParent-
1afd0 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20 66 6f 72  >pEList;.    for
1afe0 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  (i=0; i<pList->n
1aff0 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
1b000 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 61 5b 69    if( pList->a[i
1b010 5d 2e 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  ].zName==0 ){.  
1b020 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d        char *zNam
1b030 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  e = sqlite3DbStr
1b040 44 75 70 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61  Dup(db, pList->a
1b050 5b 69 5d 2e 7a 53 70 61 6e 29 3b 0a 20 20 20 20  [i].zSpan);.    
1b060 20 20 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f      sqlite3Dequo
1b070 74 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  te(zName);.     
1b080 20 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a     pList->a[i].z
1b090 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20  Name = zName;.  
1b0a0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1b0b0 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 64 62  substExprList(db
1b0c0 2c 20 70 50 61 72 65 6e 74 2d 3e 70 45 4c 69 73  , pParent->pELis
1b0d0 74 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62  t, iParent, pSub
1b0e0 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 69  ->pEList);.    i
1b0f0 66 28 20 69 73 41 67 67 20 29 7b 0a 20 20 20 20  f( isAgg ){.    
1b100 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28    substExprList(
1b110 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 47 72  db, pParent->pGr
1b120 6f 75 70 42 79 2c 20 69 50 61 72 65 6e 74 2c 20  oupBy, iParent, 
1b130 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  pSub->pEList);. 
1b140 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 48       pParent->pH
1b150 61 76 69 6e 67 20 3d 20 73 75 62 73 74 45 78 70  aving = substExp
1b160 72 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70  r(db, pParent->p
1b170 48 61 76 69 6e 67 2c 20 69 50 61 72 65 6e 74 2c  Having, iParent,
1b180 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a   pSub->pEList);.
1b190 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 53      }.    if( pS
1b1a0 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a  ub->pOrderBy ){.
1b1b0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
1b1c0 61 72 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79 3d  arent->pOrderBy=
1b1d0 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50 61 72  =0 );.      pPar
1b1e0 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20  ent->pOrderBy = 
1b1f0 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 3b 0a  pSub->pOrderBy;.
1b200 20 20 20 20 20 20 70 53 75 62 2d 3e 70 4f 72 64        pSub->pOrd
1b210 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 7d 65  erBy = 0;.    }e
1b220 6c 73 65 20 69 66 28 20 70 50 61 72 65 6e 74 2d  lse if( pParent-
1b230 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  >pOrderBy ){.   
1b240 20 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74     substExprList
1b250 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 4f  (db, pParent->pO
1b260 72 64 65 72 42 79 2c 20 69 50 61 72 65 6e 74 2c  rderBy, iParent,
1b270 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a   pSub->pEList);.
1b280 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 53      }.    if( pS
1b290 75 62 2d 3e 70 57 68 65 72 65 20 29 7b 0a 20 20  ub->pWhere ){.  
1b2a0 20 20 20 20 70 57 68 65 72 65 20 3d 20 73 71 6c      pWhere = sql
1b2b0 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
1b2c0 70 53 75 62 2d 3e 70 57 68 65 72 65 2c 20 30 29  pSub->pWhere, 0)
1b2d0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1b2e0 20 20 20 70 57 68 65 72 65 20 3d 20 30 3b 0a 20     pWhere = 0;. 
1b2f0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 75 62     }.    if( sub
1b300 71 75 65 72 79 49 73 41 67 67 20 29 7b 0a 20 20  queryIsAgg ){.  
1b310 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
1b320 65 6e 74 2d 3e 70 48 61 76 69 6e 67 3d 3d 30 20  ent->pHaving==0 
1b330 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74  );.      pParent
1b340 2d 3e 70 48 61 76 69 6e 67 20 3d 20 70 50 61 72  ->pHaving = pPar
1b350 65 6e 74 2d 3e 70 57 68 65 72 65 3b 0a 20 20 20  ent->pWhere;.   
1b360 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65     pParent->pWhe
1b370 72 65 20 3d 20 70 57 68 65 72 65 3b 0a 20 20 20  re = pWhere;.   
1b380 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76     pParent->pHav
1b390 69 6e 67 20 3d 20 73 75 62 73 74 45 78 70 72 28  ing = substExpr(
1b3a0 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 48 61  db, pParent->pHa
1b3b0 76 69 6e 67 2c 20 69 50 61 72 65 6e 74 2c 20 70  ving, iParent, p
1b3c0 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  Sub->pEList);.  
1b3d0 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 48 61      pParent->pHa
1b3e0 76 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 45 78  ving = sqlite3Ex
1b3f0 70 72 41 6e 64 28 64 62 2c 20 70 50 61 72 65 6e  prAnd(db, pParen
1b400 74 2d 3e 70 48 61 76 69 6e 67 2c 20 0a 20 20 20  t->pHaving, .   
1b410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
1b430 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
1b440 2c 20 70 53 75 62 2d 3e 70 48 61 76 69 6e 67 2c  , pSub->pHaving,
1b450 20 30 29 29 3b 0a 20 20 20 20 20 20 61 73 73 65   0));.      asse
1b460 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 70 47 72  rt( pParent->pGr
1b470 6f 75 70 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20  oupBy==0 );.    
1b480 20 20 70 50 61 72 65 6e 74 2d 3e 70 47 72 6f 75    pParent->pGrou
1b490 70 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  pBy = sqlite3Exp
1b4a0 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 53 75  rListDup(db, pSu
1b4b0 62 2d 3e 70 47 72 6f 75 70 42 79 2c 20 30 29 3b  b->pGroupBy, 0);
1b4c0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1b4d0 20 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72    pParent->pWher
1b4e0 65 20 3d 20 73 75 62 73 74 45 78 70 72 28 64 62  e = substExpr(db
1b4f0 2c 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72  , pParent->pWher
1b500 65 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62  e, iParent, pSub
1b510 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20  ->pEList);.     
1b520 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65   pParent->pWhere
1b530 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e   = sqlite3ExprAn
1b540 64 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70  d(db, pParent->p
1b550 57 68 65 72 65 2c 20 70 57 68 65 72 65 29 3b 0a  Where, pWhere);.
1b560 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
1b570 54 68 65 20 66 6c 61 74 74 65 6e 65 64 20 71 75  The flattened qu
1b580 65 72 79 20 69 73 20 64 69 73 74 69 6e 63 74 20  ery is distinct 
1b590 69 66 20 65 69 74 68 65 72 20 74 68 65 20 69 6e  if either the in
1b5a0 6e 65 72 20 6f 72 20 74 68 65 0a 20 20 20 20 2a  ner or the.    *
1b5b0 2a 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73  * outer query is
1b5c0 20 64 69 73 74 69 6e 63 74 2e 20 0a 20 20 20 20   distinct. .    
1b5d0 2a 2f 0a 20 20 20 20 70 50 61 72 65 6e 74 2d 3e  */.    pParent->
1b5e0 73 65 6c 46 6c 61 67 73 20 7c 3d 20 70 53 75 62  selFlags |= pSub
1b5f0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
1b600 44 69 73 74 69 6e 63 74 3b 0a 20 20 0a 20 20 20  Distinct;.  .   
1b610 20 2f 2a 0a 20 20 20 20 2a 2a 20 53 45 4c 45 43   /*.    ** SELEC
1b620 54 20 2e 2e 2e 20 46 52 4f 4d 20 28 53 45 4c 45  T ... FROM (SELE
1b630 43 54 20 2e 2e 2e 20 4c 49 4d 49 54 20 61 20 4f  CT ... LIMIT a O
1b640 46 46 53 45 54 20 62 29 20 4c 49 4d 49 54 20 78  FFSET b) LIMIT x
1b650 20 4f 46 46 53 45 54 20 79 3b 0a 20 20 20 20 2a   OFFSET y;.    *
1b660 2a 0a 20 20 20 20 2a 2a 20 4f 6e 65 20 69 73 20  *.    ** One is 
1b670 74 65 6d 70 74 65 64 20 74 6f 20 74 72 79 20 74  tempted to try t
1b680 6f 20 61 64 64 20 61 20 61 6e 64 20 62 20 74 6f  o add a and b to
1b690 20 63 6f 6d 62 69 6e 65 20 74 68 65 20 6c 69 6d   combine the lim
1b6a0 69 74 73 2e 20 20 42 75 74 20 74 68 69 73 0a 20  its.  But this. 
1b6b0 20 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 77     ** does not w
1b6c0 6f 72 6b 20 69 66 20 65 69 74 68 65 72 20 6c 69  ork if either li
1b6d0 6d 69 74 20 69 73 20 6e 65 67 61 74 69 76 65 2e  mit is negative.
1b6e0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1b6f0 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a  pSub->pLimit ){.
1b700 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70        pParent->p
1b710 4c 69 6d 69 74 20 3d 20 70 53 75 62 2d 3e 70 4c  Limit = pSub->pL
1b720 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 53 75 62  imit;.      pSub
1b730 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->pLimit = 0;.  
1b740 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69    }.  }..  /* Fi
1b750 6e 69 61 6c 6c 79 2c 20 64 65 6c 65 74 65 20 77  nially, delete w
1b760 68 61 74 20 69 73 20 6c 65 66 74 20 6f 66 20 74  hat is left of t
1b770 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20  he subquery and 
1b780 72 65 74 75 72 6e 0a 20 20 2a 2a 20 73 75 63 63  return.  ** succ
1b790 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  ess..  */.  sqli
1b7a0 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
1b7b0 64 62 2c 20 70 53 75 62 31 29 3b 0a 0a 20 20 72  db, pSub1);..  r
1b7c0 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69  eturn 1;.}.#endi
1b7d0 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51  f /* !defined(SQ
1b7e0 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
1b7f0 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  RY) || !defined(
1b800 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
1b810 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 42 61 73 65  ) */../*.** Base
1b820 64 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74  d on the content
1b830 73 20 6f 66 20 74 68 65 20 41 67 67 49 6e 66 6f  s of the AggInfo
1b840 20 73 74 72 75 63 74 75 72 65 20 69 6e 64 69 63   structure indic
1b850 61 74 65 64 20 62 79 20 74 68 65 20 66 69 72 73  ated by the firs
1b860 74 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2c 20 74  t.** argument, t
1b870 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 68 65  his function che
1b880 63 6b 73 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f  cks if the follo
1b890 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a  wing are true:.*
1b8a0 2a 0a 2a 2a 20 20 20 20 2a 20 74 68 65 20 71 75  *.**    * the qu
1b8b0 65 72 79 20 63 6f 6e 74 61 69 6e 73 20 6a 75 73  ery contains jus
1b8c0 74 20 61 20 73 69 6e 67 6c 65 20 61 67 67 72 65  t a single aggre
1b8d0 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 2c 0a 2a  gate function,.*
1b8e0 2a 20 20 20 20 2a 20 74 68 65 20 61 67 67 72 65  *    * the aggre
1b8f0 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 69 73  gate function is
1b900 20 65 69 74 68 65 72 20 6d 69 6e 28 29 20 6f 72   either min() or
1b910 20 6d 61 78 28 29 2c 20 61 6e 64 0a 2a 2a 20 20   max(), and.**  
1b920 20 20 2a 20 74 68 65 20 61 72 67 75 6d 65 6e 74    * the argument
1b930 20 74 6f 20 74 68 65 20 61 67 67 72 65 67 61 74   to the aggregat
1b940 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  e function is a 
1b950 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2e 0a 2a 2a  column value..**
1b960 0a 2a 2a 20 49 66 20 61 6c 6c 20 6f 66 20 74 68  .** If all of th
1b970 65 20 61 62 6f 76 65 20 61 72 65 20 74 72 75 65  e above are true
1b980 2c 20 74 68 65 6e 20 57 48 45 52 45 5f 4f 52 44  , then WHERE_ORD
1b990 45 52 42 59 5f 4d 49 4e 20 6f 72 20 57 48 45 52  ERBY_MIN or WHER
1b9a0 45 5f 4f 52 44 45 52 42 59 5f 4d 41 58 0a 2a 2a  E_ORDERBY_MAX.**
1b9b0 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 73 20   is returned as 
1b9c0 61 70 70 72 6f 70 72 69 61 74 65 2e 20 41 6c 73  appropriate. Als
1b9d0 6f 2c 20 2a 70 70 4d 69 6e 4d 61 78 20 69 73 20  o, *ppMinMax is 
1b9e0 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  set to point to 
1b9f0 74 68 65 20 0a 2a 2a 20 6c 69 73 74 20 6f 66 20  the .** list of 
1ba00 61 72 67 75 6d 65 6e 74 73 20 70 61 73 73 65 64  arguments passed
1ba10 20 74 6f 20 74 68 65 20 61 67 67 72 65 67 61 74   to the aggregat
1ba20 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  e before returni
1ba30 6e 67 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66  ng..**.** Or, if
1ba40 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20   the conditions 
1ba50 61 62 6f 76 65 20 61 72 65 20 6e 6f 74 20 6d 65  above are not me
1ba60 74 2c 20 2a 70 70 4d 69 6e 4d 61 78 20 69 73 20  t, *ppMinMax is 
1ba70 73 65 74 20 74 6f 20 30 20 61 6e 64 0a 2a 2a 20  set to 0 and.** 
1ba80 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f  WHERE_ORDERBY_NO
1ba90 52 4d 41 4c 20 69 73 20 72 65 74 75 72 6e 65 64  RMAL is returned
1baa0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38 20 6d  ..*/.static u8 m
1bab0 69 6e 4d 61 78 51 75 65 72 79 28 41 67 67 49 6e  inMaxQuery(AggIn
1bac0 66 6f 20 2a 70 41 67 67 49 6e 66 6f 2c 20 45 78  fo *pAggInfo, Ex
1bad0 70 72 4c 69 73 74 20 2a 2a 70 70 4d 69 6e 4d 61  prList **ppMinMa
1bae0 78 29 7b 0a 20 20 69 6e 74 20 65 52 65 74 20 3d  x){.  int eRet =
1baf0 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e   WHERE_ORDERBY_N
1bb00 4f 52 4d 41 4c 3b 20 20 20 20 20 20 20 20 20 20  ORMAL;          
1bb10 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65 20  /* Return value 
1bb20 2a 2f 0a 0a 20 20 2a 70 70 4d 69 6e 4d 61 78 20  */..  *ppMinMax 
1bb30 3d 20 30 3b 0a 20 20 69 66 28 20 70 41 67 67 49  = 0;.  if( pAggI
1bb40 6e 66 6f 2d 3e 6e 46 75 6e 63 3d 3d 31 20 29 7b  nfo->nFunc==1 ){
1bb50 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72  .    Expr *pExpr
1bb60 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75   = pAggInfo->aFu
1bb70 6e 63 5b 30 5d 2e 70 45 78 70 72 3b 20 2f 2a 20  nc[0].pExpr; /* 
1bb80 41 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  Aggregate functi
1bb90 6f 6e 20 2a 2f 0a 20 20 20 20 45 78 70 72 4c 69  on */.    ExprLi
1bba0 73 74 20 2a 70 45 4c 69 73 74 20 3d 20 70 45 78  st *pEList = pEx
1bbb0 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 20 20 20 20  pr->x.pList;    
1bbc0 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 73 20 74    /* Arguments t
1bbd0 6f 20 61 67 67 20 66 75 6e 63 74 69 6f 6e 20 2a  o agg function *
1bbe0 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  /..    assert( p
1bbf0 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47  Expr->op==TK_AGG
1bc00 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 20  _FUNCTION );.   
1bc10 20 69 66 28 20 70 45 4c 69 73 74 20 26 26 20 70   if( pEList && p
1bc20 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 31 20  EList->nExpr==1 
1bc30 26 26 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e  && pEList->a[0].
1bc40 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47  pExpr->op==TK_AG
1bc50 47 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20  G_COLUMN ){.    
1bc60 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
1bc70 75 6e 63 20 3d 20 70 45 78 70 72 2d 3e 75 2e 7a  unc = pExpr->u.z
1bc80 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 69 66 28  Token;.      if(
1bc90 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
1bca0 7a 46 75 6e 63 2c 20 22 6d 69 6e 22 29 3d 3d 30  zFunc, "min")==0
1bcb0 20 29 7b 0a 20 20 20 20 20 20 20 20 65 52 65 74   ){.        eRet
1bcc0 20 3d 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59   = WHERE_ORDERBY
1bcd0 5f 4d 49 4e 3b 0a 20 20 20 20 20 20 20 20 2a 70  _MIN;.        *p
1bce0 70 4d 69 6e 4d 61 78 20 3d 20 70 45 4c 69 73 74  pMinMax = pEList
1bcf0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
1bd00 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
1bd10 28 7a 46 75 6e 63 2c 20 22 6d 61 78 22 29 3d 3d  (zFunc, "max")==
1bd20 30 20 29 7b 0a 20 20 20 20 20 20 20 20 65 52 65  0 ){.        eRe
1bd30 74 20 3d 20 57 48 45 52 45 5f 4f 52 44 45 52 42  t = WHERE_ORDERB
1bd40 59 5f 4d 41 58 3b 0a 20 20 20 20 20 20 20 20 2a  Y_MAX;.        *
1bd50 70 70 4d 69 6e 4d 61 78 20 3d 20 70 45 4c 69 73  ppMinMax = pELis
1bd60 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
1bd70 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
1bd80 2a 70 70 4d 69 6e 4d 61 78 3d 3d 30 20 7c 7c 20  *ppMinMax==0 || 
1bd90 28 2a 70 70 4d 69 6e 4d 61 78 29 2d 3e 6e 45 78  (*ppMinMax)->nEx
1bda0 70 72 3d 3d 31 20 29 3b 0a 20 20 72 65 74 75 72  pr==1 );.  retur
1bdb0 6e 20 65 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n eRet;.}../*.**
1bdc0 20 54 68 65 20 73 65 6c 65 63 74 20 73 74 61 74   The select stat
1bdd0 65 6d 65 6e 74 20 70 61 73 73 65 64 20 61 73 20  ement passed as 
1bde0 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
1bdf0 6e 74 20 69 73 20 61 6e 20 61 67 67 72 65 67 61  nt is an aggrega
1be00 74 65 20 71 75 65 72 79 2e 0a 2a 2a 20 54 68 65  te query..** The
1be10 20 73 65 63 6f 6e 64 20 61 72 67 6d 65 6e 74 20   second argment 
1be20 69 73 20 74 68 65 20 61 73 73 6f 63 69 61 74 65  is the associate
1be30 64 20 61 67 67 72 65 67 61 74 65 2d 69 6e 66 6f  d aggregate-info
1be40 20 6f 62 6a 65 63 74 2e 20 54 68 69 73 20 0a 2a   object. This .*
1be50 2a 20 66 75 6e 63 74 69 6f 6e 20 74 65 73 74 73  * function tests
1be60 20 69 66 20 74 68 65 20 53 45 4c 45 43 54 20 69   if the SELECT i
1be70 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a  s of the form:.*
1be80 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 63 6f  *.**   SELECT co
1be90 75 6e 74 28 2a 29 20 46 52 4f 4d 20 3c 74 62 6c  unt(*) FROM <tbl
1bea0 3e 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 74 61  >.**.** where ta
1beb0 62 6c 65 20 69 73 20 61 20 64 61 74 61 62 61 73  ble is a databas
1bec0 65 20 74 61 62 6c 65 2c 20 6e 6f 74 20 61 20 73  e table, not a s
1bed0 75 62 2d 73 65 6c 65 63 74 20 6f 72 20 76 69 65  ub-select or vie
1bee0 77 2e 20 49 66 20 74 68 65 20 71 75 65 72 79 0a  w. If the query.
1bef0 2a 2a 20 64 6f 65 73 20 6d 61 74 63 68 20 74 68  ** does match th
1bf00 69 73 20 70 61 74 74 65 72 6e 2c 20 74 68 65 6e  is pattern, then
1bf10 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
1bf20 65 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 20 72  e Table object r
1bf30 65 70 72 65 73 65 6e 74 69 6e 67 0a 2a 2a 20 3c  epresenting.** <
1bf40 74 62 6c 3e 20 69 73 20 72 65 74 75 72 6e 65 64  tbl> is returned
1bf50 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 30 20 69  . Otherwise, 0 i
1bf60 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
1bf70 74 61 74 69 63 20 54 61 62 6c 65 20 2a 69 73 53  tatic Table *isS
1bf80 69 6d 70 6c 65 43 6f 75 6e 74 28 53 65 6c 65 63  impleCount(Selec
1bf90 74 20 2a 70 2c 20 41 67 67 49 6e 66 6f 20 2a 70  t *p, AggInfo *p
1bfa0 41 67 67 49 6e 66 6f 29 7b 0a 20 20 54 61 62 6c  AggInfo){.  Tabl
1bfb0 65 20 2a 70 54 61 62 3b 0a 20 20 45 78 70 72 20  e *pTab;.  Expr 
1bfc0 2a 70 45 78 70 72 3b 0a 0a 20 20 61 73 73 65 72  *pExpr;..  asser
1bfd0 74 28 20 21 70 2d 3e 70 47 72 6f 75 70 42 79 20  t( !p->pGroupBy 
1bfe0 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 70 57 68  );..  if( p->pWh
1bff0 65 72 65 20 7c 7c 20 70 2d 3e 70 45 4c 69 73 74  ere || p->pEList
1c000 2d 3e 6e 45 78 70 72 21 3d 31 20 0a 20 20 20 7c  ->nExpr!=1 .   |
1c010 7c 20 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 21  | p->pSrc->nSrc!
1c020 3d 31 20 7c 7c 20 70 2d 3e 70 53 72 63 2d 3e 61  =1 || p->pSrc->a
1c030 5b 30 5d 2e 70 53 65 6c 65 63 74 0a 20 20 29 7b  [0].pSelect.  ){
1c040 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
1c050 20 7d 0a 20 20 70 54 61 62 20 3d 20 70 2d 3e 70   }.  pTab = p->p
1c060 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a  Src->a[0].pTab;.
1c070 20 20 70 45 78 70 72 20 3d 20 70 2d 3e 70 45 4c    pExpr = p->pEL
1c080 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b  ist->a[0].pExpr;
1c090 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62 20  .  assert( pTab 
1c0a0 26 26 20 21 70 54 61 62 2d 3e 70 53 65 6c 65 63  && !pTab->pSelec
1c0b0 74 20 26 26 20 70 45 78 70 72 20 29 3b 0a 0a 20  t && pExpr );.. 
1c0c0 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70   if( IsVirtual(p
1c0d0 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 30 3b  Tab) ) return 0;
1c0e0 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  .  if( pExpr->op
1c0f0 21 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f  !=TK_AGG_FUNCTIO
1c100 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  N ) return 0;.  
1c110 69 66 28 20 4e 45 56 45 52 28 70 41 67 67 49 6e  if( NEVER(pAggIn
1c120 66 6f 2d 3e 6e 46 75 6e 63 3d 3d 30 29 20 29 20  fo->nFunc==0) ) 
1c130 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
1c140 28 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63  (pAggInfo->aFunc
1c150 5b 30 5d 2e 70 46 75 6e 63 2d 3e 66 6c 61 67 73  [0].pFunc->flags
1c160 26 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 55  &SQLITE_FUNC_COU
1c170 4e 54 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  NT)==0 ) return 
1c180 30 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  0;.  if( pExpr->
1c190 66 6c 61 67 73 26 45 50 5f 44 69 73 74 69 6e 63  flags&EP_Distinc
1c1a0 74 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20  t ) return 0;.. 
1c1b0 20 72 65 74 75 72 6e 20 70 54 61 62 3b 0a 7d 0a   return pTab;.}.
1c1c0 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 6f  ./*.** If the so
1c1d0 75 72 63 65 2d 6c 69 73 74 20 69 74 65 6d 20 70  urce-list item p
1c1e0 61 73 73 65 64 20 61 73 20 61 6e 20 61 72 67 75  assed as an argu
1c1f0 6d 65 6e 74 20 77 61 73 20 61 75 67 6d 65 6e 74  ment was augment
1c200 65 64 20 77 69 74 68 20 61 6e 0a 2a 2a 20 49 4e  ed with an.** IN
1c210 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 2c  DEXED BY clause,
1c220 20 74 68 65 6e 20 74 72 79 20 74 6f 20 6c 6f 63   then try to loc
1c230 61 74 65 20 74 68 65 20 73 70 65 63 69 66 69 65  ate the specifie
1c240 64 20 69 6e 64 65 78 2e 20 49 66 20 74 68 65 72  d index. If ther
1c250 65 0a 2a 2a 20 77 61 73 20 73 75 63 68 20 61 20  e.** was such a 
1c260 63 6c 61 75 73 65 20 61 6e 64 20 74 68 65 20 6e  clause and the n
1c270 61 6d 65 64 20 69 6e 64 65 78 20 63 61 6e 6e 6f  amed index canno
1c280 74 20 62 65 20 66 6f 75 6e 64 2c 20 72 65 74 75  t be found, retu
1c290 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 52  rn .** SQLITE_ER
1c2a0 52 4f 52 20 61 6e 64 20 6c 65 61 76 65 20 61 6e  ROR and leave an
1c2b0 20 65 72 72 6f 72 20 69 6e 20 70 50 61 72 73 65   error in pParse
1c2c0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 70 6f 70  . Otherwise, pop
1c2d0 75 6c 61 74 65 20 0a 2a 2a 20 70 46 72 6f 6d 2d  ulate .** pFrom-
1c2e0 3e 70 49 6e 64 65 78 20 61 6e 64 20 72 65 74 75  >pIndex and retu
1c2f0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f  rn SQLITE_OK..*/
1c300 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 6e 64 65  .int sqlite3Inde
1c310 78 65 64 42 79 4c 6f 6f 6b 75 70 28 50 61 72 73  xedByLookup(Pars
1c320 65 20 2a 70 50 61 72 73 65 2c 20 73 74 72 75 63  e *pParse, struc
1c330 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
1c340 70 46 72 6f 6d 29 7b 0a 20 20 69 66 28 20 70 46  pFrom){.  if( pF
1c350 72 6f 6d 2d 3e 70 54 61 62 20 26 26 20 70 46 72  rom->pTab && pFr
1c360 6f 6d 2d 3e 7a 49 6e 64 65 78 20 29 7b 0a 20 20  om->zIndex ){.  
1c370 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
1c380 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20 20  pFrom->pTab;.   
1c390 20 63 68 61 72 20 2a 7a 49 6e 64 65 78 20 3d 20   char *zIndex = 
1c3a0 70 46 72 6f 6d 2d 3e 7a 49 6e 64 65 78 3b 0a 20  pFrom->zIndex;. 
1c3b0 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a     Index *pIdx;.
1c3c0 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61      for(pIdx=pTa
1c3d0 62 2d 3e 70 49 6e 64 65 78 3b 20 0a 20 20 20 20  b->pIndex; .    
1c3e0 20 20 20 20 70 49 64 78 20 26 26 20 73 71 6c 69      pIdx && sqli
1c3f0 74 65 33 53 74 72 49 43 6d 70 28 70 49 64 78 2d  te3StrICmp(pIdx-
1c400 3e 7a 4e 61 6d 65 2c 20 7a 49 6e 64 65 78 29 3b  >zName, zIndex);
1c410 20 0a 20 20 20 20 20 20 20 20 70 49 64 78 3d 70   .        pIdx=p
1c420 49 64 78 2d 3e 70 4e 65 78 74 0a 20 20 20 20 29  Idx->pNext.    )
1c430 3b 0a 20 20 20 20 69 66 28 20 21 70 49 64 78 20  ;.    if( !pIdx 
1c440 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1c450 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
1c460 20 22 6e 6f 20 73 75 63 68 20 69 6e 64 65 78 3a   "no such index:
1c470 20 25 73 22 2c 20 7a 49 6e 64 65 78 2c 20 30 29   %s", zIndex, 0)
1c480 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
1c490 63 68 65 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b  checkSchema = 1;
1c4a0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1c4b0 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
1c4c0 7d 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 70 49 6e  }.    pFrom->pIn
1c4d0 64 65 78 20 3d 20 70 49 64 78 3b 0a 20 20 7d 0a  dex = pIdx;.  }.
1c4e0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1c4f0 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 44 65 74 65  OK;.}./*.** Dete
1c500 63 74 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45  ct compound SELE
1c510 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68  CT statements th
1c520 61 74 20 75 73 65 20 61 6e 20 4f 52 44 45 52 20  at use an ORDER 
1c530 42 59 20 63 6c 61 75 73 65 20 77 69 74 68 20 0a  BY clause with .
1c540 2a 2a 20 61 6e 20 61 6c 74 65 72 6e 61 74 69 76  ** an alternativ
1c550 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
1c560 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 53  ence..**.**    S
1c570 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74  ELECT ... FROM t
1c580 31 20 45 58 43 45 50 54 20 53 45 4c 45 43 54 20  1 EXCEPT SELECT 
1c590 2e 2e 2e 20 46 52 4f 4d 20 74 32 20 4f 52 44 45  ... FROM t2 ORDE
1c5a0 52 20 42 59 20 2e 2e 20 43 4f 4c 4c 41 54 45 20  R BY .. COLLATE 
1c5b0 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20  ....**.** These 
1c5c0 61 72 65 20 72 65 77 72 69 74 74 65 6e 20 61 73  are rewritten as
1c5d0 20 61 20 73 75 62 71 75 65 72 79 3a 0a 2a 2a 0a   a subquery:.**.
1c5e0 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  **    SELECT * F
1c5f0 52 4f 4d 20 28 53 45 4c 45 43 54 20 2e 2e 2e 20  ROM (SELECT ... 
1c600 46 52 4f 4d 20 74 31 20 45 58 43 45 50 54 20 53  FROM t1 EXCEPT S
1c610 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74  ELECT ... FROM t
1c620 32 29 0a 2a 2a 20 20 20 20 20 4f 52 44 45 52 20  2).**     ORDER 
1c630 42 59 20 2e 2e 2e 20 43 4f 4c 4c 41 54 45 20 2e  BY ... COLLATE .
1c640 2e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 74 72  ...**.** This tr
1c650 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20  ansformation is 
1c660 6e 65 63 65 73 73 61 72 79 20 62 65 63 61 75 73  necessary becaus
1c670 65 20 74 68 65 20 6d 75 6c 74 69 53 65 6c 65 63  e the multiSelec
1c680 74 4f 72 64 65 72 42 79 28 29 20 72 6f 75 74 69  tOrderBy() routi
1c690 6e 65 0a 2a 2a 20 61 62 6f 76 65 20 74 68 61 74  ne.** above that
1c6a0 20 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 63   generates the c
1c6b0 6f 64 65 20 66 6f 72 20 61 20 63 6f 6d 70 6f 75  ode for a compou
1c6c0 6e 64 20 53 45 4c 45 43 54 20 77 69 74 68 20 61  nd SELECT with a
1c6d0 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
1c6e0 65 0a 2a 2a 20 75 73 65 73 20 61 20 6d 65 72 67  e.** uses a merg
1c6f0 65 20 61 6c 67 6f 72 69 74 68 6d 20 74 68 61 74  e algorithm that
1c700 20 72 65 71 75 69 72 65 73 20 74 68 65 20 73 61   requires the sa
1c710 6d 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  me collating seq
1c720 75 65 6e 63 65 20 6f 6e 20 74 68 65 0a 2a 2a 20  uence on the.** 
1c730 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 61  result columns a
1c740 73 20 6f 6e 20 74 68 65 20 4f 52 44 45 52 20 42  s on the ORDER B
1c750 59 20 63 6c 61 75 73 65 2e 20 20 53 65 65 20 74  Y clause.  See t
1c760 69 63 6b 65 74 0a 2a 2a 20 68 74 74 70 3a 2f 2f  icket.** http://
1c770 77 77 77 2e 73 71 6c 69 74 65 2e 6f 72 67 2f 73  www.sqlite.org/s
1c780 72 63 2f 69 6e 66 6f 2f 36 37 30 39 35 37 34 64  rc/info/6709574d
1c790 32 61 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 74 72  2a.**.** This tr
1c7a0 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20  ansformation is 
1c7b0 6f 6e 6c 79 20 6e 65 65 64 65 64 20 66 6f 72 20  only needed for 
1c7c0 45 58 43 45 50 54 2c 20 49 4e 54 45 52 53 45 43  EXCEPT, INTERSEC
1c7d0 54 2c 20 61 6e 64 20 55 4e 49 4f 4e 2e 0a 2a 2a  T, and UNION..**
1c7e0 20 54 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f   The UNION ALL o
1c7f0 70 65 72 61 74 6f 72 20 77 6f 72 6b 73 20 66 69  perator works fi
1c800 6e 65 20 77 69 74 68 20 6d 75 6c 74 69 53 65 6c  ne with multiSel
1c810 65 63 74 4f 72 64 65 72 42 79 28 29 20 65 76 65  ectOrderBy() eve
1c820 6e 20 77 68 65 6e 0a 2a 2a 20 74 68 65 72 65 20  n when.** there 
1c830 61 72 65 20 43 4f 4c 4c 41 54 45 20 74 65 72 6d  are COLLATE term
1c840 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42  s in the ORDER B
1c850 59 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  Y..*/.static int
1c860 20 63 6f 6e 76 65 72 74 43 6f 6d 70 6f 75 6e 64   convertCompound
1c870 53 65 6c 65 63 74 54 6f 53 75 62 71 75 65 72 79  SelectToSubquery
1c880 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
1c890 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  , Select *p){.  
1c8a0 69 6e 74 20 69 3b 0a 20 20 53 65 6c 65 63 74 20  int i;.  Select 
1c8b0 2a 70 4e 65 77 3b 0a 20 20 53 65 6c 65 63 74 20  *pNew;.  Select 
1c8c0 2a 70 58 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  *pX;.  sqlite3 *
1c8d0 64 62 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70  db;.  struct Exp
1c8e0 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b 0a 20  rList_item *a;. 
1c8f0 20 53 72 63 4c 69 73 74 20 2a 70 4e 65 77 53 72   SrcList *pNewSr
1c900 63 3b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  c;.  Parse *pPar
1c910 73 65 3b 0a 20 20 54 6f 6b 65 6e 20 64 75 6d 6d  se;.  Token dumm
1c920 79 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 70 50 72  y;..  if( p->pPr
1c930 69 6f 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ior==0 ) return 
1c940 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20  WRC_Continue;.  
1c950 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d  if( p->pOrderBy=
1c960 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f  =0 ) return WRC_
1c970 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 66 6f 72 28  Continue;.  for(
1c980 70 58 3d 70 3b 20 70 58 20 26 26 20 28 70 58 2d  pX=p; pX && (pX-
1c990 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 70  >op==TK_ALL || p
1c9a0 58 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54  X->op==TK_SELECT
1c9b0 29 3b 20 70 58 3d 70 58 2d 3e 70 50 72 69 6f 72  ); pX=pX->pPrior
1c9c0 29 7b 7d 0a 20 20 69 66 28 20 70 58 3d 3d 30 20  ){}.  if( pX==0 
1c9d0 29 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e  ) return WRC_Con
1c9e0 74 69 6e 75 65 3b 0a 20 20 61 20 3d 20 70 2d 3e  tinue;.  a = p->
1c9f0 70 4f 72 64 65 72 42 79 2d 3e 61 3b 0a 20 20 66  pOrderBy->a;.  f
1ca00 6f 72 28 69 3d 70 2d 3e 70 4f 72 64 65 72 42 79  or(i=p->pOrderBy
1ca10 2d 3e 6e 45 78 70 72 2d 31 3b 20 69 3e 3d 30 3b  ->nExpr-1; i>=0;
1ca20 20 69 2d 2d 29 7b 0a 20 20 20 20 69 66 28 20 61   i--){.    if( a
1ca30 5b 69 5d 2e 70 45 78 70 72 2d 3e 66 6c 61 67 73  [i].pExpr->flags
1ca40 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 20 29 20   & EP_Collate ) 
1ca50 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28  break;.  }.  if(
1ca60 20 69 3c 30 20 29 20 72 65 74 75 72 6e 20 57 52   i<0 ) return WR
1ca70 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 2f  C_Continue;..  /
1ca80 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68  * If we reach th
1ca90 69 73 20 70 6f 69 6e 74 2c 20 74 68 61 74 20 6d  is point, that m
1caa0 65 61 6e 73 20 74 68 65 20 74 72 61 6e 73 66 6f  eans the transfo
1cab0 72 6d 61 74 69 6f 6e 20 69 73 20 72 65 71 75 69  rmation is requi
1cac0 72 65 64 2e 20 2a 2f 0a 0a 20 20 70 50 61 72 73  red. */..  pPars
1cad0 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61  e = pWalker->pPa
1cae0 72 73 65 3b 0a 20 20 64 62 20 3d 20 70 50 61 72  rse;.  db = pPar
1caf0 73 65 2d 3e 64 62 3b 0a 20 20 70 4e 65 77 20 3d  se->db;.  pNew =
1cb00 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
1cb10 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
1cb20 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69 66 28 20  *pNew) );.  if( 
1cb30 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e  pNew==0 ) return
1cb40 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 6d 65   WRC_Abort;.  me
1cb50 6d 73 65 74 28 26 64 75 6d 6d 79 2c 20 30 2c 20  mset(&dummy, 0, 
1cb60 73 69 7a 65 6f 66 28 64 75 6d 6d 79 29 29 3b 0a  sizeof(dummy));.
1cb70 20 20 70 4e 65 77 53 72 63 20 3d 20 73 71 6c 69    pNewSrc = sqli
1cb80 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64  te3SrcListAppend
1cb90 46 72 6f 6d 54 65 72 6d 28 70 50 61 72 73 65 2c  FromTerm(pParse,
1cba0 30 2c 30 2c 30 2c 26 64 75 6d 6d 79 2c 70 4e 65  0,0,0,&dummy,pNe
1cbb0 77 2c 30 2c 30 29 3b 0a 20 20 69 66 28 20 70 4e  w,0,0);.  if( pN
1cbc0 65 77 53 72 63 3d 3d 30 20 29 20 72 65 74 75 72  ewSrc==0 ) retur
1cbd0 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 2a  n WRC_Abort;.  *
1cbe0 70 4e 65 77 20 3d 20 2a 70 3b 0a 20 20 70 2d 3e  pNew = *p;.  p->
1cbf0 70 53 72 63 20 3d 20 70 4e 65 77 53 72 63 3b 0a  pSrc = pNewSrc;.
1cc00 20 20 70 2d 3e 70 45 4c 69 73 74 20 3d 20 73 71    p->pEList = sq
1cc10 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
1cc20 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 20 73  end(pParse, 0, s
1cc30 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20 54  qlite3Expr(db, T
1cc40 4b 5f 41 4c 4c 2c 20 30 29 29 3b 0a 20 20 70 2d  K_ALL, 0));.  p-
1cc50 3e 6f 70 20 3d 20 54 4b 5f 53 45 4c 45 43 54 3b  >op = TK_SELECT;
1cc60 0a 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 30  .  p->pWhere = 0
1cc70 3b 0a 20 20 70 4e 65 77 2d 3e 70 47 72 6f 75 70  ;.  pNew->pGroup
1cc80 42 79 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  By = 0;.  pNew->
1cc90 70 48 61 76 69 6e 67 20 3d 20 30 3b 0a 20 20 70  pHaving = 0;.  p
1cca0 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20  New->pOrderBy = 
1ccb0 30 3b 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d  0;.  p->pPrior =
1ccc0 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 6d   0;.  pNew->pLim
1ccd0 69 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  it = 0;.  pNew->
1cce0 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 72  pOffset = 0;.  r
1ccf0 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
1cd00 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ue;.}../*.** Thi
1cd10 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 57  s routine is a W
1cd20 61 6c 6b 65 72 20 63 61 6c 6c 62 61 63 6b 20 66  alker callback f
1cd30 6f 72 20 22 65 78 70 61 6e 64 69 6e 67 22 20 61  or "expanding" a
1cd40 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
1cd50 74 2e 0a 2a 2a 20 22 45 78 70 61 6e 64 69 6e 67  t..** "Expanding
1cd60 22 20 6d 65 61 6e 73 20 74 6f 20 64 6f 20 74 68  " means to do th
1cd70 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
1cd80 2a 2a 20 20 20 20 28 31 29 20 20 4d 61 6b 65 20  **    (1)  Make 
1cd90 73 75 72 65 20 56 44 42 45 20 63 75 72 73 6f 72  sure VDBE cursor
1cda0 20 6e 75 6d 62 65 72 73 20 68 61 76 65 20 62 65   numbers have be
1cdb0 65 6e 20 61 73 73 69 67 6e 65 64 20 74 6f 20 65  en assigned to e
1cdc0 76 65 72 79 0a 2a 2a 20 20 20 20 20 20 20 20 20  very.**         
1cdd0 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 46  element of the F
1cde0 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a  ROM clause..**.*
1cdf0 2a 20 20 20 20 28 32 29 20 20 46 69 6c 6c 20 69  *    (2)  Fill i
1ce00 6e 20 74 68 65 20 70 54 61 62 4c 69 73 74 2d 3e  n the pTabList->
1ce10 61 5b 5d 2e 70 54 61 62 20 66 69 65 6c 64 73 20  a[].pTab fields 
1ce20 69 6e 20 74 68 65 20 53 72 63 4c 69 73 74 20 74  in the SrcList t
1ce30 68 61 74 20 0a 2a 2a 20 20 20 20 20 20 20 20 20  hat .**         
1ce40 64 65 66 69 6e 65 73 20 46 52 4f 4d 20 63 6c 61  defines FROM cla
1ce50 75 73 65 2e 20 20 57 68 65 6e 20 76 69 65 77 73  use.  When views
1ce60 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 46   appear in the F
1ce70 52 4f 4d 20 63 6c 61 75 73 65 2c 0a 2a 2a 20 20  ROM clause,.**  
1ce80 20 20 20 20 20 20 20 66 69 6c 6c 20 70 54 61 62         fill pTab
1ce90 4c 69 73 74 2d 3e 61 5b 5d 2e 70 53 65 6c 65 63  List->a[].pSelec
1cea0 74 20 77 69 74 68 20 61 20 63 6f 70 79 20 6f 66  t with a copy of
1ceb0 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
1cec0 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20  ement.**        
1ced0 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73   that implements
1cee0 20 74 68 65 20 76 69 65 77 2e 20 20 41 20 63 6f   the view.  A co
1cef0 70 79 20 69 73 20 6d 61 64 65 20 6f 66 20 74 68  py is made of th
1cf00 65 20 76 69 65 77 27 73 20 53 45 4c 45 43 54 0a  e view's SELECT.
1cf10 2a 2a 20 20 20 20 20 20 20 20 20 73 74 61 74 65  **         state
1cf20 6d 65 6e 74 20 73 6f 20 74 68 61 74 20 77 65 20  ment so that we 
1cf30 63 61 6e 20 66 72 65 65 6c 79 20 6d 6f 64 69 66  can freely modif
1cf40 79 20 6f 72 20 64 65 6c 65 74 65 20 74 68 61 74  y or delete that
1cf50 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20 20   statement.**   
1cf60 20 20 20 20 20 20 77 69 74 68 6f 75 74 20 77 6f        without wo
1cf70 72 72 79 69 6e 67 20 61 62 6f 75 74 20 6d 65 73  rrying about mes
1cf80 73 69 6e 67 20 75 70 20 74 68 65 20 70 72 65 73  sing up the pres
1cf90 69 73 74 65 6e 74 20 72 65 70 72 65 73 65 6e 74  istent represent
1cfa0 61 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20 20  ation.**        
1cfb0 20 6f 66 20 74 68 65 20 76 69 65 77 2e 0a 2a 2a   of the view..**
1cfc0 0a 2a 2a 20 20 20 20 28 33 29 20 20 41 64 64 20  .**    (3)  Add 
1cfd0 74 65 72 6d 73 20 74 6f 20 74 68 65 20 57 48 45  terms to the WHE
1cfe0 52 45 20 63 6c 61 75 73 65 20 74 6f 20 61 63 63  RE clause to acc
1cff0 6f 6d 6f 64 61 74 65 20 74 68 65 20 4e 41 54 55  omodate the NATU
1d000 52 41 4c 20 6b 65 79 77 6f 72 64 0a 2a 2a 20 20  RAL keyword.**  
1d010 20 20 20 20 20 20 20 6f 6e 20 6a 6f 69 6e 73 20         on joins 
1d020 61 6e 64 20 74 68 65 20 4f 4e 20 61 6e 64 20 55  and the ON and U
1d030 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 6a  SING clause of j
1d040 6f 69 6e 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28  oins..**.**    (
1d050 34 29 20 20 53 63 61 6e 20 74 68 65 20 6c 69 73  4)  Scan the lis
1d060 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  t of columns in 
1d070 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 28  the result set (
1d080 70 45 4c 69 73 74 29 20 6c 6f 6f 6b 69 6e 67 0a  pEList) looking.
1d090 2a 2a 20 20 20 20 20 20 20 20 20 66 6f 72 20 69  **         for i
1d0a0 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68 65 20  nstances of the 
1d0b0 22 2a 22 20 6f 70 65 72 61 74 6f 72 20 6f 72 20  "*" operator or 
1d0c0 74 68 65 20 54 41 42 4c 45 2e 2a 20 6f 70 65 72  the TABLE.* oper
1d0d0 61 74 6f 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20  ator..**        
1d0e0 20 49 66 20 66 6f 75 6e 64 2c 20 65 78 70 61 6e   If found, expan
1d0f0 64 20 65 61 63 68 20 22 2a 22 20 74 6f 20 62 65  d each "*" to be
1d100 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e   every column in
1d110 20 65 76 65 72 79 20 74 61 62 6c 65 0a 2a 2a 20   every table.** 
1d120 20 20 20 20 20 20 20 20 61 6e 64 20 54 41 42 4c          and TABL
1d130 45 2e 2a 20 74 6f 20 62 65 20 65 76 65 72 79 20  E.* to be every 
1d140 63 6f 6c 75 6d 6e 20 69 6e 20 54 41 42 4c 45 2e  column in TABLE.
1d150 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  .**.*/.static in
1d160 74 20 73 65 6c 65 63 74 45 78 70 61 6e 64 65 72  t selectExpander
1d170 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
1d180 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  , Select *p){.  
1d190 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20  Parse *pParse = 
1d1a0 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b  pWalker->pParse;
1d1b0 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 3b 0a  .  int i, j, k;.
1d1c0 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
1d1d0 69 73 74 3b 0a 20 20 45 78 70 72 4c 69 73 74 20  ist;.  ExprList 
1d1e0 2a 70 45 4c 69 73 74 3b 0a 20 20 73 74 72 75 63  *pEList;.  struc
1d1f0 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
1d200 70 46 72 6f 6d 3b 0a 20 20 73 71 6c 69 74 65 33  pFrom;.  sqlite3
1d210 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
1d220 62 3b 0a 20 20 45 78 70 72 20 2a 70 45 2c 20 2a  b;.  Expr *pE, *
1d230 70 52 69 67 68 74 2c 20 2a 70 45 78 70 72 3b 0a  pRight, *pExpr;.
1d240 20 20 75 31 36 20 73 65 6c 46 6c 61 67 73 20 3d    u16 selFlags =
1d250 20 70 2d 3e 73 65 6c 46 6c 61 67 73 3b 0a 0a 20   p->selFlags;.. 
1d260 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20   p->selFlags |= 
1d270 53 46 5f 45 78 70 61 6e 64 65 64 3b 0a 20 20 69  SF_Expanded;.  i
1d280 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
1d290 6c 65 64 20 20 29 7b 0a 20 20 20 20 72 65 74 75  led  ){.    retu
1d2a0 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
1d2b0 7d 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 2d  }.  if( NEVER(p-
1d2c0 3e 70 53 72 63 3d 3d 30 29 20 7c 7c 20 28 73 65  >pSrc==0) || (se
1d2d0 6c 46 6c 61 67 73 20 26 20 53 46 5f 45 78 70 61  lFlags & SF_Expa
1d2e0 6e 64 65 64 29 21 3d 30 20 29 7b 0a 20 20 20 20  nded)!=0 ){.    
1d2f0 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65  return WRC_Prune
1d300 3b 0a 20 20 7d 0a 20 20 70 54 61 62 4c 69 73 74  ;.  }.  pTabList
1d310 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 45   = p->pSrc;.  pE
1d320 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74  List = p->pEList
1d330 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  ;..  /* Make sur
1d340 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73  e cursor numbers
1d350 20 68 61 76 65 20 62 65 65 6e 20 61 73 73 69 67   have been assig
1d360 6e 65 64 20 74 6f 20 61 6c 6c 20 65 6e 74 72 69  ned to all entri
1d370 65 73 20 69 6e 0a 20 20 2a 2a 20 74 68 65 20 46  es in.  ** the F
1d380 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ROM clause of th
1d390 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
1d3a0 6e 74 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  nt..  */.  sqlit
1d3b0 65 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43  e3SrcListAssignC
1d3c0 75 72 73 6f 72 73 28 70 50 61 72 73 65 2c 20 70  ursors(pParse, p
1d3d0 54 61 62 4c 69 73 74 29 3b 0a 0a 20 20 2f 2a 20  TabList);..  /* 
1d3e0 4c 6f 6f 6b 20 75 70 20 65 76 65 72 79 20 74 61  Look up every ta
1d3f0 62 6c 65 20 6e 61 6d 65 64 20 69 6e 20 74 68 65  ble named in the
1d400 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
1d410 74 68 65 20 73 65 6c 65 63 74 2e 20 20 49 66 0a  the select.  If.
1d420 20 20 2a 2a 20 61 6e 20 65 6e 74 72 79 20 6f 66    ** an entry of
1d430 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
1d440 20 69 73 20 61 20 73 75 62 71 75 65 72 79 20 69   is a subquery i
1d450 6e 73 74 65 61 64 20 6f 66 20 61 20 74 61 62 6c  nstead of a tabl
1d460 65 20 6f 72 20 76 69 65 77 2c 0a 20 20 2a 2a 20  e or view,.  ** 
1d470 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 74 72  then create a tr
1d480 61 6e 73 69 65 6e 74 20 74 61 62 6c 65 20 73 74  ansient table st
1d490 72 75 63 74 75 72 65 20 74 6f 20 64 65 73 63 72  ructure to descr
1d4a0 69 62 65 20 74 68 65 20 73 75 62 71 75 65 72 79  ibe the subquery
1d4b0 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ..  */.  for(i=0
1d4c0 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74  , pFrom=pTabList
1d4d0 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d  ->a; i<pTabList-
1d4e0 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f  >nSrc; i++, pFro
1d4f0 6d 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 20  m++){.    Table 
1d500 2a 70 54 61 62 3b 0a 20 20 20 20 69 66 28 20 70  *pTab;.    if( p
1d510 46 72 6f 6d 2d 3e 70 54 61 62 21 3d 30 20 29 7b  From->pTab!=0 ){
1d520 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 73  .      /* This s
1d530 74 61 74 65 6d 65 6e 74 20 68 61 73 20 61 6c 72  tatement has alr
1d540 65 61 64 79 20 62 65 65 6e 20 70 72 65 70 61 72  eady been prepar
1d550 65 64 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f  ed.  There is no
1d560 20 6e 65 65 64 0a 20 20 20 20 20 20 2a 2a 20 74   need.      ** t
1d570 6f 20 67 6f 20 66 75 72 74 68 65 72 2e 20 2a 2f  o go further. */
1d580 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
1d590 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74  ==0 );.      ret
1d5a0 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20  urn WRC_Prune;. 
1d5b0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 46 72     }.    if( pFr
1d5c0 6f 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a  om->zName==0 ){.
1d5d0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1d5e0 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20  MIT_SUBQUERY.   
1d5f0 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 20     Select *pSel 
1d600 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74  = pFrom->pSelect
1d610 3b 0a 20 20 20 20 20 20 2f 2a 20 41 20 73 75 62  ;.      /* A sub
1d620 2d 71 75 65 72 79 20 69 6e 20 74 68 65 20 46 52  -query in the FR
1d630 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53  OM clause of a S
1d640 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20 20 20 61  ELECT */.      a
1d650 73 73 65 72 74 28 20 70 53 65 6c 21 3d 30 20 29  ssert( pSel!=0 )
1d660 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1d670 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29  pFrom->pTab==0 )
1d680 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 57  ;.      sqlite3W
1d690 61 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65  alkSelect(pWalke
1d6a0 72 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20 20 20  r, pSel);.      
1d6b0 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54  pFrom->pTab = pT
1d6c0 61 62 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ab = sqlite3DbMa
1d6d0 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
1d6e0 65 6f 66 28 54 61 62 6c 65 29 29 3b 0a 20 20 20  eof(Table));.   
1d6f0 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29     if( pTab==0 )
1d700 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
1d710 74 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e  t;.      pTab->n
1d720 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 20 20 70  Ref = 1;.      p
1d730 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c  Tab->zName = sql
1d740 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
1d750 22 73 71 6c 69 74 65 5f 73 75 62 71 75 65 72 79  "sqlite_subquery
1d760 5f 25 70 5f 22 2c 20 28 76 6f 69 64 2a 29 70 54  _%p_", (void*)pT
1d770 61 62 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  ab);.      while
1d780 28 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 20 29  ( pSel->pPrior )
1d790 7b 20 70 53 65 6c 20 3d 20 70 53 65 6c 2d 3e 70  { pSel = pSel->p
1d7a0 50 72 69 6f 72 3b 20 7d 0a 20 20 20 20 20 20 73  Prior; }.      s
1d7b0 65 6c 65 63 74 43 6f 6c 75 6d 6e 73 46 72 6f 6d  electColumnsFrom
1d7c0 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
1d7d0 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74 2c 20 26   pSel->pEList, &
1d7e0 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61  pTab->nCol, &pTa
1d7f0 62 2d 3e 61 43 6f 6c 29 3b 0a 20 20 20 20 20 20  b->aCol);.      
1d800 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31  pTab->iPKey = -1
1d810 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 52  ;.      pTab->nR
1d820 6f 77 45 73 74 20 3d 20 31 30 30 30 30 30 30 3b  owEst = 1000000;
1d830 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 74 61 62  .      pTab->tab
1d840 46 6c 61 67 73 20 7c 3d 20 54 46 5f 45 70 68 65  Flags |= TF_Ephe
1d850 6d 65 72 61 6c 3b 0a 23 65 6e 64 69 66 0a 20 20  meral;.#endif.  
1d860 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
1d870 2a 20 41 6e 20 6f 72 64 69 6e 61 72 79 20 74 61  * An ordinary ta
1d880 62 6c 65 20 6f 72 20 76 69 65 77 20 6e 61 6d 65  ble or view name
1d890 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
1d8a0 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  use */.      ass
1d8b0 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62  ert( pFrom->pTab
1d8c0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 46 72  ==0 );.      pFr
1d8d0 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 20  om->pTab = pTab 
1d8e0 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54  = sqlite3LocateT
1d8f0 61 62 6c 65 49 74 65 6d 28 70 50 61 72 73 65 2c  ableItem(pParse,
1d900 20 30 2c 20 70 46 72 6f 6d 29 3b 0a 20 20 20 20   0, pFrom);.    
1d910 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20    if( pTab==0 ) 
1d920 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
1d930 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62  ;.      if( pTab
1d940 2d 3e 6e 52 65 66 3d 3d 30 78 66 66 66 66 20 29  ->nRef==0xffff )
1d950 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1d960 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
1d970 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 72 65 66 65  , "too many refe
1d980 72 65 6e 63 65 73 20 74 6f 20 5c 22 25 73 5c 22  rences to \"%s\"
1d990 3a 20 6d 61 78 20 36 35 35 33 35 22 2c 0a 20 20  : max 65535",.  
1d9a0 20 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a           pTab->z
1d9b0 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 70  Name);.        p
1d9c0 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 30 3b 0a  From->pTab = 0;.
1d9d0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57          return W
1d9e0 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20  RC_Abort;.      
1d9f0 7d 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 52  }.      pTab->nR
1da00 65 66 2b 2b 3b 0a 23 69 66 20 21 64 65 66 69 6e  ef++;.#if !defin
1da10 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
1da20 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  IEW) || !defined
1da30 20 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49   (SQLITE_OMIT_VI
1da40 52 54 55 41 4c 54 41 42 4c 45 29 0a 20 20 20 20  RTUALTABLE).    
1da50 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c    if( pTab->pSel
1da60 65 63 74 20 7c 7c 20 49 73 56 69 72 74 75 61 6c  ect || IsVirtual
1da70 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20  (pTab) ){.      
1da80 20 20 2f 2a 20 57 65 20 72 65 61 63 68 20 68 65    /* We reach he
1da90 72 65 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20  re if the named 
1daa0 74 61 62 6c 65 20 69 73 20 61 20 72 65 61 6c 6c  table is a reall
1dab0 79 20 61 20 76 69 65 77 20 2a 2f 0a 20 20 20 20  y a view */.    
1dac0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 56      if( sqlite3V
1dad0 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65  iewGetColumnName
1dae0 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 29 20  s(pParse, pTab) 
1daf0 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f  ) return WRC_Abo
1db00 72 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  rt;.        asse
1db10 72 74 28 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65  rt( pFrom->pSele
1db20 63 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  ct==0 );.       
1db30 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 20   pFrom->pSelect 
1db40 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  = sqlite3SelectD
1db50 75 70 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 65  up(db, pTab->pSe
1db60 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  lect, 0);.      
1db70 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c    sqlite3WalkSel
1db80 65 63 74 28 70 57 61 6c 6b 65 72 2c 20 70 46 72  ect(pWalker, pFr
1db90 6f 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20  om->pSelect);.  
1dba0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
1dbb0 20 7d 0a 0a 20 20 20 20 2f 2a 20 4c 6f 63 61 74   }..    /* Locat
1dbc0 65 20 74 68 65 20 69 6e 64 65 78 20 6e 61 6d 65  e the index name
1dbd0 64 20 62 79 20 74 68 65 20 49 4e 44 45 58 45 44  d by the INDEXED
1dbe0 20 42 59 20 63 6c 61 75 73 65 2c 20 69 66 20 61   BY clause, if a
1dbf0 6e 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 73  ny. */.    if( s
1dc00 71 6c 69 74 65 33 49 6e 64 65 78 65 64 42 79 4c  qlite3IndexedByL
1dc10 6f 6f 6b 75 70 28 70 50 61 72 73 65 2c 20 70 46  ookup(pParse, pF
1dc20 72 6f 6d 29 20 29 7b 0a 20 20 20 20 20 20 72 65  rom) ){.      re
1dc30 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
1dc40 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
1dc50 50 72 6f 63 65 73 73 20 4e 41 54 55 52 41 4c 20  Process NATURAL 
1dc60 6b 65 79 77 6f 72 64 73 2c 20 61 6e 64 20 4f 4e  keywords, and ON
1dc70 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73   and USING claus
1dc80 65 73 20 6f 66 20 6a 6f 69 6e 73 2e 0a 20 20 2a  es of joins..  *
1dc90 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  /.  if( db->mall
1dca0 6f 63 46 61 69 6c 65 64 20 7c 7c 20 73 71 6c 69  ocFailed || sqli
1dcb0 74 65 50 72 6f 63 65 73 73 4a 6f 69 6e 28 70 50  teProcessJoin(pP
1dcc0 61 72 73 65 2c 20 70 29 20 29 7b 0a 20 20 20 20  arse, p) ){.    
1dcd0 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
1dce0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 6f 72 20  ;.  }..  /* For 
1dcf0 65 76 65 72 79 20 22 2a 22 20 74 68 61 74 20 6f  every "*" that o
1dd00 63 63 75 72 73 20 69 6e 20 74 68 65 20 63 6f 6c  ccurs in the col
1dd10 75 6d 6e 20 6c 69 73 74 2c 20 69 6e 73 65 72 74  umn list, insert
1dd20 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 0a 20 20   the names of.  
1dd30 2a 2a 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69  ** all columns i
1dd40 6e 20 61 6c 6c 20 74 61 62 6c 65 73 2e 20 20 41  n all tables.  A
1dd50 6e 64 20 66 6f 72 20 65 76 65 72 79 20 54 41 42  nd for every TAB
1dd60 4c 45 2e 2a 20 69 6e 73 65 72 74 20 74 68 65 20  LE.* insert the 
1dd70 6e 61 6d 65 73 0a 20 20 2a 2a 20 6f 66 20 61 6c  names.  ** of al
1dd80 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 54 41 42  l columns in TAB
1dd90 4c 45 2e 20 20 54 68 65 20 70 61 72 73 65 72 20  LE.  The parser 
1dda0 69 6e 73 65 72 74 65 64 20 61 20 73 70 65 63 69  inserted a speci
1ddb0 61 6c 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20  al expression.  
1ddc0 2a 2a 20 77 69 74 68 20 74 68 65 20 54 4b 5f 41  ** with the TK_A
1ddd0 4c 4c 20 6f 70 65 72 61 74 6f 72 20 66 6f 72 20  LL operator for 
1dde0 65 61 63 68 20 22 2a 22 20 74 68 61 74 20 69 74  each "*" that it
1ddf0 20 66 6f 75 6e 64 20 69 6e 20 74 68 65 20 63 6f   found in the co
1de00 6c 75 6d 6e 20 6c 69 73 74 2e 0a 20 20 2a 2a 20  lumn list..  ** 
1de10 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f  The following co
1de20 64 65 20 6a 75 73 74 20 68 61 73 20 74 6f 20 6c  de just has to l
1de30 6f 63 61 74 65 20 74 68 65 20 54 4b 5f 41 4c 4c  ocate the TK_ALL
1de40 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 6e 64   expressions and
1de50 20 65 78 70 61 6e 64 0a 20 20 2a 2a 20 65 61 63   expand.  ** eac
1de60 68 20 6f 6e 65 20 74 6f 20 74 68 65 20 6c 69 73  h one to the lis
1de70 74 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73  t of all columns
1de80 20 69 6e 20 61 6c 6c 20 74 61 62 6c 65 73 2e 0a   in all tables..
1de90 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69    **.  ** The fi
1dea0 72 73 74 20 6c 6f 6f 70 20 6a 75 73 74 20 63 68  rst loop just ch
1deb0 65 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20 74  ecks to see if t
1dec0 68 65 72 65 20 61 72 65 20 61 6e 79 20 22 2a 22  here are any "*"
1ded0 20 6f 70 65 72 61 74 6f 72 73 0a 20 20 2a 2a 20   operators.  ** 
1dee0 74 68 61 74 20 6e 65 65 64 20 65 78 70 61 6e 64  that need expand
1def0 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ing..  */.  for(
1df00 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e  k=0; k<pEList->n
1df10 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20  Expr; k++){.    
1df20 70 45 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 6b  pE = pEList->a[k
1df30 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28  ].pExpr;.    if(
1df40 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20   pE->op==TK_ALL 
1df50 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 61 73 73  ) break;.    ass
1df60 65 72 74 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f  ert( pE->op!=TK_
1df70 44 4f 54 20 7c 7c 20 70 45 2d 3e 70 52 69 67 68  DOT || pE->pRigh
1df80 74 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  t!=0 );.    asse
1df90 72 74 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44  rt( pE->op!=TK_D
1dfa0 4f 54 20 7c 7c 20 28 70 45 2d 3e 70 4c 65 66 74  OT || (pE->pLeft
1dfb0 21 3d 30 20 26 26 20 70 45 2d 3e 70 4c 65 66 74  !=0 && pE->pLeft
1dfc0 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 29 20 29 3b 0a  ->op==TK_ID) );.
1dfd0 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d      if( pE->op==
1dfe0 54 4b 5f 44 4f 54 20 26 26 20 70 45 2d 3e 70 52  TK_DOT && pE->pR
1dff0 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c  ight->op==TK_ALL
1e000 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20   ) break;.  }.  
1e010 69 66 28 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45  if( k<pEList->nE
1e020 78 70 72 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20  xpr ){.    /*.  
1e030 20 20 2a 2a 20 49 66 20 77 65 20 67 65 74 20 68    ** If we get h
1e040 65 72 65 20 69 74 20 6d 65 61 6e 73 20 74 68 65  ere it means the
1e050 20 72 65 73 75 6c 74 20 73 65 74 20 63 6f 6e 74   result set cont
1e060 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  ains one or more
1e070 20 22 2a 22 0a 20 20 20 20 2a 2a 20 6f 70 65 72   "*".    ** oper
1e080 61 74 6f 72 73 20 74 68 61 74 20 6e 65 65 64 20  ators that need 
1e090 74 6f 20 62 65 20 65 78 70 61 6e 64 65 64 2e 20  to be expanded. 
1e0a0 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 65 61   Loop through ea
1e0b0 63 68 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20  ch expression.  
1e0c0 20 20 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75    ** in the resu
1e0d0 6c 74 20 73 65 74 20 61 6e 64 20 65 78 70 61 6e  lt set and expan
1e0e0 64 20 74 68 65 6d 20 6f 6e 65 20 62 79 20 6f 6e  d them one by on
1e0f0 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 74  e..    */.    st
1e100 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
1e110 65 6d 20 2a 61 20 3d 20 70 45 4c 69 73 74 2d 3e  em *a = pEList->
1e120 61 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20  a;.    ExprList 
1e130 2a 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 69  *pNew = 0;.    i
1e140 6e 74 20 66 6c 61 67 73 20 3d 20 70 50 61 72 73  nt flags = pPars
1e150 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 3b 0a 20 20  e->db->flags;.  
1e160 20 20 69 6e 74 20 6c 6f 6e 67 4e 61 6d 65 73 20    int longNames 
1e170 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  = (flags & SQLIT
1e180 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21  E_FullColNames)!
1e190 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  =0.             
1e1a0 20 20 20 20 20 20 20 20 20 26 26 20 28 66 6c 61           && (fla
1e1b0 67 73 20 26 20 53 51 4c 49 54 45 5f 53 68 6f 72  gs & SQLITE_Shor
1e1c0 74 43 6f 6c 4e 61 6d 65 73 29 3d 3d 30 3b 0a 0a  tColNames)==0;..
1e1d0 20 20 20 20 2f 2a 20 57 68 65 6e 20 70 72 6f 63      /* When proc
1e1e0 65 73 73 69 6e 67 20 46 52 4f 4d 2d 63 6c 61 75  essing FROM-clau
1e1f0 73 65 20 73 75 62 71 75 65 72 69 65 73 2c 20 69  se subqueries, i
1e200 74 20 69 73 20 61 6c 77 61 79 73 20 74 68 65 20  t is always the 
1e210 63 61 73 65 0a 20 20 20 20 2a 2a 20 74 68 61 74  case.    ** that
1e220 20 66 75 6c 6c 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d   full_column_nam
1e230 65 73 3d 4f 46 46 20 61 6e 64 20 73 68 6f 72 74  es=OFF and short
1e240 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 73 3d 4f 4e  _column_names=ON
1e250 2e 20 20 54 68 65 0a 20 20 20 20 2a 2a 20 73 71  .  The.    ** sq
1e260 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66  lite3ResultSetOf
1e270 53 65 6c 65 63 74 28 29 20 72 6f 75 74 69 6e 65  Select() routine
1e280 20 6d 61 6b 65 73 20 69 74 20 73 6f 2e 20 2a 2f   makes it so. */
1e290 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 2d  .    assert( (p-
1e2a0 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 4e  >selFlags & SF_N
1e2b0 65 73 74 65 64 46 72 6f 6d 29 3d 3d 30 0a 20 20  estedFrom)==0.  
1e2c0 20 20 20 20 20 20 20 20 7c 7c 20 28 28 66 6c 61          || ((fla
1e2d0 67 73 20 26 20 53 51 4c 49 54 45 5f 46 75 6c 6c  gs & SQLITE_Full
1e2e0 43 6f 6c 4e 61 6d 65 73 29 3d 3d 30 20 26 26 0a  ColNames)==0 &&.
1e2f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 66                (f
1e300 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 68  lags & SQLITE_Sh
1e310 6f 72 74 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 29  ortColNames)!=0)
1e320 20 29 3b 0a 0a 20 20 20 20 66 6f 72 28 6b 3d 30   );..    for(k=0
1e330 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ; k<pEList->nExp
1e340 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 70  r; k++){.      p
1e350 45 20 3d 20 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a  E = a[k].pExpr;.
1e360 20 20 20 20 20 20 70 52 69 67 68 74 20 3d 20 70        pRight = p
1e370 45 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20  E->pRight;.     
1e380 20 61 73 73 65 72 74 28 20 70 45 2d 3e 6f 70 21   assert( pE->op!
1e390 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 52 69 67 68  =TK_DOT || pRigh
1e3a0 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  t!=0 );.      if
1e3b0 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c  ( pE->op!=TK_ALL
1e3c0 20 26 26 20 28 70 45 2d 3e 6f 70 21 3d 54 4b 5f   && (pE->op!=TK_
1e3d0 44 4f 54 20 7c 7c 20 70 52 69 67 68 74 2d 3e 6f  DOT || pRight->o
1e3e0 70 21 3d 54 4b 5f 41 4c 4c 29 20 29 7b 0a 20 20  p!=TK_ALL) ){.  
1e3f0 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 70 61        /* This pa
1e400 72 74 69 63 75 6c 61 72 20 65 78 70 72 65 73 73  rticular express
1e410 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65  ion does not nee
1e420 64 20 74 6f 20 62 65 20 65 78 70 61 6e 64 65 64  d to be expanded
1e430 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
1e440 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69       pNew = sqli
1e450 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
1e460 64 28 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20  d(pParse, pNew, 
1e470 61 5b 6b 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[k].pExpr);.   
1e480 20 20 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b       if( pNew ){
1e490 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d  .          pNew-
1e4a0 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31  >a[pNew->nExpr-1
1e4b0 5d 2e 7a 4e 61 6d 65 20 3d 20 61 5b 6b 5d 2e 7a  ].zName = a[k].z
1e4c0 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Name;.          
1e4d0 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45  pNew->a[pNew->nE
1e4e0 78 70 72 2d 31 5d 2e 7a 53 70 61 6e 20 3d 20 61  xpr-1].zSpan = a
1e4f0 5b 6b 5d 2e 7a 53 70 61 6e 3b 0a 20 20 20 20 20  [k].zSpan;.     
1e500 20 20 20 20 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 20       a[k].zName 
1e510 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 61  = 0;.          a
1e520 5b 6b 5d 2e 7a 53 70 61 6e 20 3d 20 30 3b 0a 20  [k].zSpan = 0;. 
1e530 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1e540 20 61 5b 6b 5d 2e 70 45 78 70 72 20 3d 20 30 3b   a[k].pExpr = 0;
1e550 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1e560 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 65 78        /* This ex
1e570 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 22 2a  pression is a "*
1e580 22 20 6f 72 20 61 20 22 54 41 42 4c 45 2e 2a 22  " or a "TABLE.*"
1e590 20 61 6e 64 20 6e 65 65 64 73 20 74 6f 20 62 65   and needs to be
1e5a0 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70 61  .        ** expa
1e5b0 6e 64 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20  nded. */.       
1e5c0 20 69 6e 74 20 74 61 62 6c 65 53 65 65 6e 20 3d   int tableSeen =
1e5d0 20 30 3b 20 20 20 20 20 20 2f 2a 20 53 65 74 20   0;      /* Set 
1e5e0 74 6f 20 31 20 77 68 65 6e 20 54 41 42 4c 45 20  to 1 when TABLE 
1e5f0 6d 61 74 63 68 65 73 20 2a 2f 0a 20 20 20 20 20  matches */.     
1e600 20 20 20 63 68 61 72 20 2a 7a 54 4e 61 6d 65 20     char *zTName 
1e610 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 74 65  = 0;       /* te
1e620 78 74 20 6f 66 20 6e 61 6d 65 20 6f 66 20 54 41  xt of name of TA
1e630 42 4c 45 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  BLE */.        i
1e640 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f  f( pE->op==TK_DO
1e650 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  T ){.          a
1e660 73 73 65 72 74 28 20 70 45 2d 3e 70 4c 65 66 74  ssert( pE->pLeft
1e670 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  !=0 );.         
1e680 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
1e690 73 50 72 6f 70 65 72 74 79 28 70 45 2d 3e 70 4c  sProperty(pE->pL
1e6a0 65 66 74 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  eft, EP_IntValue
1e6b0 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7a  ) );.          z
1e6c0 54 4e 61 6d 65 20 3d 20 70 45 2d 3e 70 4c 65 66  TName = pE->pLef
1e6d0 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20  t->u.zToken;.   
1e6e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66       }.        f
1e6f0 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54  or(i=0, pFrom=pT
1e700 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61  abList->a; i<pTa
1e710 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  bList->nSrc; i++
1e720 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20  , pFrom++){.    
1e730 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61        Table *pTa
1e740 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b  b = pFrom->pTab;
1e750 0a 20 20 20 20 20 20 20 20 20 20 53 65 6c 65 63  .          Selec
1e760 74 20 2a 70 53 75 62 20 3d 20 70 46 72 6f 6d 2d  t *pSub = pFrom-
1e770 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20  >pSelect;.      
1e780 20 20 20 20 63 68 61 72 20 2a 7a 54 61 62 4e 61      char *zTabNa
1e790 6d 65 20 3d 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69  me = pFrom->zAli
1e7a0 61 73 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f  as;.          co
1e7b0 6e 73 74 20 63 68 61 72 20 2a 7a 53 63 68 65 6d  nst char *zSchem
1e7c0 61 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20  aName = 0;.     
1e7d0 20 20 20 20 20 69 6e 74 20 69 44 62 3b 0a 20 20       int iDb;.  
1e7e0 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 61 62          if( zTab
1e7f0 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Name==0 ){.     
1e800 20 20 20 20 20 20 20 7a 54 61 62 4e 61 6d 65 20         zTabName 
1e810 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20  = pTab->zName;. 
1e820 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1e830 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c       if( db->mal
1e840 6c 6f 63 46 61 69 6c 65 64 20 29 20 62 72 65 61  locFailed ) brea
1e850 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  k;.          if(
1e860 20 70 53 75 62 3d 3d 30 20 7c 7c 20 28 70 53 75   pSub==0 || (pSu
1e870 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  b->selFlags & SF
1e880 5f 4e 65 73 74 65 64 46 72 6f 6d 29 3d 3d 30 20  _NestedFrom)==0 
1e890 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
1e8a0 53 75 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Sub = 0;.       
1e8b0 20 20 20 20 20 69 66 28 20 7a 54 4e 61 6d 65 20       if( zTName 
1e8c0 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  && sqlite3StrICm
1e8d0 70 28 7a 54 4e 61 6d 65 2c 20 7a 54 61 62 4e 61  p(zTName, zTabNa
1e8e0 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)!=0 ){.      
1e8f0 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
1e900 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
1e910 20 20 20 20 20 20 20 20 20 20 20 20 69 44 62 20              iDb 
1e920 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
1e930 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d  oIndex(db, pTab-
1e940 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20  >pSchema);.     
1e950 20 20 20 20 20 20 20 7a 53 63 68 65 6d 61 4e 61         zSchemaNa
1e960 6d 65 20 3d 20 69 44 62 3e 3d 30 20 3f 20 64 62  me = iDb>=0 ? db
1e970 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65  ->aDb[iDb].zName
1e980 20 3a 20 22 2a 22 3b 0a 20 20 20 20 20 20 20 20   : "*";.        
1e990 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 66 6f    }.          fo
1e9a0 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e  r(j=0; j<pTab->n
1e9b0 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  Col; j++){.     
1e9c0 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61         char *zNa
1e9d0 6d 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  me = pTab->aCol[
1e9e0 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  j].zName;.      
1e9f0 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c        char *zCol
1ea00 6e 61 6d 65 3b 20 20 2f 2a 20 54 68 65 20 63 6f  name;  /* The co
1ea10 6d 70 75 74 65 64 20 63 6f 6c 75 6d 6e 20 6e 61  mputed column na
1ea20 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  me */.          
1ea30 20 20 63 68 61 72 20 2a 7a 54 6f 46 72 65 65 3b    char *zToFree;
1ea40 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 65 64 20 73     /* Malloced s
1ea50 74 72 69 6e 67 20 74 68 61 74 20 6e 65 65 64 73  tring that needs
1ea60 20 74 6f 20 62 65 20 66 72 65 65 64 20 2a 2f 0a   to be freed */.
1ea70 20 20 20 20 20 20 20 20 20 20 20 20 54 6f 6b 65              Toke
1ea80 6e 20 73 43 6f 6c 6e 61 6d 65 3b 20 20 2f 2a 20  n sColname;  /* 
1ea90 43 6f 6d 70 75 74 65 64 20 63 6f 6c 75 6d 6e 20  Computed column 
1eaa0 6e 61 6d 65 20 61 73 20 61 20 74 6f 6b 65 6e 20  name as a token 
1eab0 2a 2f 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20  */..            
1eac0 61 73 73 65 72 74 28 20 7a 4e 61 6d 65 20 29 3b  assert( zName );
1ead0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
1eae0 20 7a 54 4e 61 6d 65 20 26 26 20 70 53 75 62 0a   zTName && pSub.
1eaf0 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
1eb00 73 71 6c 69 74 65 33 4d 61 74 63 68 53 70 61 6e  sqlite3MatchSpan
1eb10 4e 61 6d 65 28 70 53 75 62 2d 3e 70 45 4c 69 73  Name(pSub->pELis
1eb20 74 2d 3e 61 5b 6a 5d 2e 7a 53 70 61 6e 2c 20 30  t->a[j].zSpan, 0
1eb30 2c 20 7a 54 4e 61 6d 65 2c 20 30 29 3d 3d 30 0a  , zTName, 0)==0.
1eb40 20 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20              ){. 
1eb50 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
1eb60 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
1eb70 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20     }..          
1eb80 20 20 2f 2a 20 49 66 20 61 20 63 6f 6c 75 6d 6e    /* If a column
1eb90 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 27 68   is marked as 'h
1eba0 69 64 64 65 6e 27 20 28 63 75 72 72 65 6e 74 6c  idden' (currentl
1ebb0 79 20 6f 6e 6c 79 20 70 6f 73 73 69 62 6c 65 0a  y only possible.
1ebc0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66              ** f
1ebd0 6f 72 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  or virtual table
1ebe0 73 29 2c 20 64 6f 20 6e 6f 74 20 69 6e 63 6c 75  s), do not inclu
1ebf0 64 65 20 69 74 20 69 6e 20 74 68 65 20 65 78 70  de it in the exp
1ec00 61 6e 64 65 64 0a 20 20 20 20 20 20 20 20 20 20  anded.          
1ec10 20 20 2a 2a 20 72 65 73 75 6c 74 2d 73 65 74 20    ** result-set 
1ec20 6c 69 73 74 2e 0a 20 20 20 20 20 20 20 20 20 20  list..          
1ec30 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20    */.           
1ec40 20 69 66 28 20 49 73 48 69 64 64 65 6e 43 6f 6c   if( IsHiddenCol
1ec50 75 6d 6e 28 26 70 54 61 62 2d 3e 61 43 6f 6c 5b  umn(&pTab->aCol[
1ec60 6a 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  j]) ){.         
1ec70 20 20 20 20 20 61 73 73 65 72 74 28 49 73 56 69       assert(IsVi
1ec80 72 74 75 61 6c 28 70 54 61 62 29 29 3b 0a 20 20  rtual(pTab));.  
1ec90 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
1eca0 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
1ecb0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
1ecc0 74 61 62 6c 65 53 65 65 6e 20 3d 20 31 3b 0a 0a  tableSeen = 1;..
1ecd0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
1ece0 69 3e 30 20 26 26 20 7a 54 4e 61 6d 65 3d 3d 30  i>0 && zTName==0
1ecf0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1ed00 20 20 69 66 28 20 28 70 46 72 6f 6d 2d 3e 6a 6f    if( (pFrom->jo
1ed10 69 6e 74 79 70 65 20 26 20 4a 54 5f 4e 41 54 55  intype & JT_NATU
1ed20 52 41 4c 29 21 3d 30 0a 20 20 20 20 20 20 20 20  RAL)!=0.        
1ed30 20 20 20 20 20 20 20 20 26 26 20 74 61 62 6c 65          && table
1ed40 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65 78 28 70  AndColumnIndex(p
1ed50 54 61 62 4c 69 73 74 2c 20 69 2c 20 7a 4e 61 6d  TabList, i, zNam
1ed60 65 2c 20 30 2c 20 30 29 0a 20 20 20 20 20 20 20  e, 0, 0).       
1ed70 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
1ed80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20            /* In 
1ed90 61 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 2c 20  a NATURAL join, 
1eda0 6f 6d 69 74 20 74 68 65 20 6a 6f 69 6e 20 63 6f  omit the join co
1edb0 6c 75 6d 6e 73 20 66 72 6f 6d 20 74 68 65 20 0a  lumns from the .
1edc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1edd0 2a 2a 20 74 61 62 6c 65 20 74 6f 20 74 68 65 20  ** table to the 
1ede0 72 69 67 68 74 20 6f 66 20 74 68 65 20 6a 6f 69  right of the joi
1edf0 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  n */.           
1ee00 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
1ee10 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
1ee20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
1ee30 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 49 6e   sqlite3IdListIn
1ee40 64 65 78 28 70 46 72 6f 6d 2d 3e 70 55 73 69 6e  dex(pFrom->pUsin
1ee50 67 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a  g, zName)>=0 ){.
1ee60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ee70 2f 2a 20 49 6e 20 61 20 6a 6f 69 6e 20 77 69 74  /* In a join wit
1ee80 68 20 61 20 55 53 49 4e 47 20 63 6c 61 75 73 65  h a USING clause
1ee90 2c 20 6f 6d 69 74 20 63 6f 6c 75 6d 6e 73 20 69  , omit columns i
1eea0 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20  n the.          
1eeb0 20 20 20 20 20 20 2a 2a 20 75 73 69 6e 67 20 63        ** using c
1eec0 6c 61 75 73 65 20 66 72 6f 6d 20 74 68 65 20 74  lause from the t
1eed0 61 62 6c 65 20 6f 6e 20 74 68 65 20 72 69 67 68  able on the righ
1eee0 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  t. */.          
1eef0 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
1ef00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
1ef10 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
1ef20 20 20 20 20 20 20 20 20 20 20 70 52 69 67 68 74            pRight
1ef30 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 64   = sqlite3Expr(d
1ef40 62 2c 20 54 4b 5f 49 44 2c 20 7a 4e 61 6d 65 29  b, TK_ID, zName)
1ef50 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 43  ;.            zC
1ef60 6f 6c 6e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a  olname = zName;.
1ef70 20 20 20 20 20 20 20 20 20 20 20 20 7a 54 6f 46              zToF
1ef80 72 65 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ree = 0;.       
1ef90 20 20 20 20 20 69 66 28 20 6c 6f 6e 67 4e 61 6d       if( longNam
1efa0 65 73 20 7c 7c 20 70 54 61 62 4c 69 73 74 2d 3e  es || pTabList->
1efb0 6e 53 72 63 3e 31 20 29 7b 0a 20 20 20 20 20 20  nSrc>1 ){.      
1efc0 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c          Expr *pL
1efd0 65 66 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20  eft;.           
1efe0 20 20 20 70 4c 65 66 74 20 3d 20 73 71 6c 69 74     pLeft = sqlit
1eff0 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 49 44  e3Expr(db, TK_ID
1f000 2c 20 7a 54 61 62 4e 61 6d 65 29 3b 0a 20 20 20  , zTabName);.   
1f010 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
1f020 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
1f030 70 50 61 72 73 65 2c 20 54 4b 5f 44 4f 54 2c 20  pParse, TK_DOT, 
1f040 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20 30  pLeft, pRight, 0
1f050 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
1f060 20 69 66 28 20 7a 53 63 68 65 6d 61 4e 61 6d 65   if( zSchemaName
1f070 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1f080 20 20 20 20 70 4c 65 66 74 20 3d 20 73 71 6c 69      pLeft = sqli
1f090 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 49  te3Expr(db, TK_I
1f0a0 44 2c 20 7a 53 63 68 65 6d 61 4e 61 6d 65 29 3b  D, zSchemaName);
1f0b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1f0c0 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33   pExpr = sqlite3
1f0d0 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
1f0e0 5f 44 4f 54 2c 20 70 4c 65 66 74 2c 20 70 45 78  _DOT, pLeft, pEx
1f0f0 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  pr, 0);.        
1f100 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1f110 20 20 20 20 20 20 69 66 28 20 6c 6f 6e 67 4e 61        if( longNa
1f120 6d 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20  mes ){.         
1f130 20 20 20 20 20 20 20 7a 43 6f 6c 6e 61 6d 65 20         zColname 
1f140 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
1f150 28 64 62 2c 20 22 25 73 2e 25 73 22 2c 20 7a 54  (db, "%s.%s", zT
1f160 61 62 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3b 0a  abName, zName);.
1f170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f180 7a 54 6f 46 72 65 65 20 3d 20 7a 43 6f 6c 6e 61  zToFree = zColna
1f190 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  me;.            
1f1a0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
1f1b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
1f1c0 20 20 20 20 20 70 45 78 70 72 20 3d 20 70 52 69       pExpr = pRi
1f1d0 67 68 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ght;.           
1f1e0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70   }.            p
1f1f0 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70  New = sqlite3Exp
1f200 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72  rListAppend(pPar
1f210 73 65 2c 20 70 4e 65 77 2c 20 70 45 78 70 72 29  se, pNew, pExpr)
1f220 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 43  ;.            sC
1f230 6f 6c 6e 61 6d 65 2e 7a 20 3d 20 7a 43 6f 6c 6e  olname.z = zColn
1f240 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ame;.           
1f250 20 73 43 6f 6c 6e 61 6d 65 2e 6e 20 3d 20 73 71   sColname.n = sq
1f260 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 43  lite3Strlen30(zC
1f270 6f 6c 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  olname);.       
1f280 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1f290 4c 69 73 74 53 65 74 4e 61 6d 65 28 70 50 61 72  ListSetName(pPar
1f2a0 73 65 2c 20 70 4e 65 77 2c 20 26 73 43 6f 6c 6e  se, pNew, &sColn
1f2b0 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ame, 0);.       
1f2c0 20 20 20 20 20 69 66 28 20 70 4e 65 77 20 26 26       if( pNew &&
1f2d0 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
1f2e0 53 46 5f 4e 65 73 74 65 64 46 72 6f 6d 29 21 3d  SF_NestedFrom)!=
1f2f0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
1f300 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
1f310 73 74 5f 69 74 65 6d 20 2a 70 58 20 3d 20 26 70  st_item *pX = &p
1f320 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78  New->a[pNew->nEx
1f330 70 72 2d 31 5d 3b 0a 20 20 20 20 20 20 20 20 20  pr-1];.         
1f340 20 20 20 20 20 69 66 28 20 70 53 75 62 20 29 7b       if( pSub ){
1f350 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1f360 20 70 58 2d 3e 7a 53 70 61 6e 20 3d 20 73 71 6c   pX->zSpan = sql
1f370 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
1f380 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 2d 3e 61   pSub->pEList->a
1f390 5b 6a 5d 2e 7a 53 70 61 6e 29 3b 0a 20 20 20 20  [j].zSpan);.    
1f3a0 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
1f3b0 63 61 73 65 28 20 70 58 2d 3e 7a 53 70 61 6e 3d  case( pX->zSpan=
1f3c0 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =0 );.          
1f3d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1f3e0 20 20 20 20 20 20 20 20 20 20 20 70 58 2d 3e 7a             pX->z
1f3f0 53 70 61 6e 20 3d 20 73 71 6c 69 74 65 33 4d 50  Span = sqlite3MP
1f400 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2e 25 73  rintf(db, "%s.%s
1f410 2e 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20  .%s",.          
1f420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f440 20 7a 53 63 68 65 6d 61 4e 61 6d 65 2c 20 7a 54   zSchemaName, zT
1f450 61 62 4e 61 6d 65 2c 20 7a 43 6f 6c 6e 61 6d 65  abName, zColname
1f460 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
1f470 20 20 20 74 65 73 74 63 61 73 65 28 20 70 58 2d     testcase( pX-
1f480 3e 7a 53 70 61 6e 3d 3d 30 20 29 3b 0a 20 20 20  >zSpan==0 );.   
1f490 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
1f4a0 20 20 20 20 20 20 20 20 20 20 20 70 58 2d 3e 62             pX->b
1f4b0 53 70 61 6e 49 73 54 61 62 20 3d 20 31 3b 0a 20  SpanIsTab = 1;. 
1f4c0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
1f4d0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1f4e0 44 62 46 72 65 65 28 64 62 2c 20 7a 54 6f 46 72  DbFree(db, zToFr
1f4f0 65 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ee);.          }
1f500 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1f510 20 20 20 69 66 28 20 21 74 61 62 6c 65 53 65 65     if( !tableSee
1f520 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  n ){.          i
1f530 66 28 20 7a 54 4e 61 6d 65 20 29 7b 0a 20 20 20  f( zTName ){.   
1f540 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1f550 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
1f560 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 3a   "no such table:
1f570 20 25 73 22 2c 20 7a 54 4e 61 6d 65 29 3b 0a 20   %s", zTName);. 
1f580 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
1f590 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
1f5a0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
1f5b0 73 65 2c 20 22 6e 6f 20 74 61 62 6c 65 73 20 73  se, "no tables s
1f5c0 70 65 63 69 66 69 65 64 22 29 3b 0a 20 20 20 20  pecified");.    
1f5d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1f5e0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
1f5f0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
1f600 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 45  istDelete(db, pE
1f610 4c 69 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70 45  List);.    p->pE
1f620 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20 7d  List = pNew;.  }
1f630 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
1f640 43 4f 4c 55 4d 4e 0a 20 20 69 66 28 20 70 2d 3e  COLUMN.  if( p->
1f650 70 45 4c 69 73 74 20 26 26 20 70 2d 3e 70 45 4c  pEList && p->pEL
1f660 69 73 74 2d 3e 6e 45 78 70 72 3e 64 62 2d 3e 61  ist->nExpr>db->a
1f670 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
1f680 49 54 5f 43 4f 4c 55 4d 4e 5d 20 29 7b 0a 20 20  IT_COLUMN] ){.  
1f690 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
1f6a0 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d  g(pParse, "too m
1f6b0 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 72  any columns in r
1f6c0 65 73 75 6c 74 20 73 65 74 22 29 3b 0a 20 20 7d  esult set");.  }
1f6d0 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
1f6e0 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d   WRC_Continue;.}
1f6f0 0a 0a 2f 2a 0a 2a 2a 20 4e 6f 2d 6f 70 20 72 6f  ../*.** No-op ro
1f700 75 74 69 6e 65 20 66 6f 72 20 74 68 65 20 70 61  utine for the pa
1f710 72 73 65 2d 74 72 65 65 20 77 61 6c 6b 65 72 2e  rse-tree walker.
1f720 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73  .**.** When this
1f730 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65 20   routine is the 
1f740 57 61 6c 6b 65 72 2e 78 45 78 70 72 43 61 6c 6c  Walker.xExprCall
1f750 62 61 63 6b 20 74 68 65 6e 20 65 78 70 72 65 73  back then expres
1f760 73 69 6f 6e 20 74 72 65 65 73 0a 2a 2a 20 61 72  sion trees.** ar
1f770 65 20 77 61 6c 6b 65 64 20 77 69 74 68 6f 75 74  e walked without
1f780 20 61 6e 79 20 61 63 74 69 6f 6e 73 20 62 65 69   any actions bei
1f790 6e 67 20 74 61 6b 65 6e 20 61 74 20 65 61 63 68  ng taken at each
1f7a0 20 6e 6f 64 65 2e 20 20 50 72 65 73 75 6d 61 62   node.  Presumab
1f7b0 6c 79 2c 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73  ly,.** when this
1f7c0 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
1f7d0 20 66 6f 72 20 57 61 6c 6b 65 72 2e 78 45 78 70   for Walker.xExp
1f7e0 72 43 61 6c 6c 62 61 63 6b 20 74 68 65 6e 20 0a  rCallback then .
1f7f0 2a 2a 20 57 61 6c 6b 65 72 2e 78 53 65 6c 65 63  ** Walker.xSelec
1f800 74 43 61 6c 6c 62 61 63 6b 20 69 73 20 73 65 74  tCallback is set
1f810 20 74 6f 20 64 6f 20 73 6f 6d 65 74 68 69 6e 67   to do something
1f820 20 75 73 65 66 75 6c 20 66 6f 72 20 65 76 65 72   useful for ever
1f830 79 20 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 69  y .** subquery i
1f840 6e 20 74 68 65 20 70 61 72 73 65 72 20 74 72 65  n the parser tre
1f850 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1f860 20 65 78 70 72 57 61 6c 6b 4e 6f 6f 70 28 57 61   exprWalkNoop(Wa
1f870 6c 6b 65 72 20 2a 4e 6f 74 55 73 65 64 2c 20 45  lker *NotUsed, E
1f880 78 70 72 20 2a 4e 6f 74 55 73 65 64 32 29 7b 0a  xpr *NotUsed2){.
1f890 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
1f8a0 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74  ER2(NotUsed, Not
1f8b0 55 73 65 64 32 29 3b 0a 20 20 72 65 74 75 72 6e  Used2);.  return
1f8c0 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d   WRC_Continue;.}
1f8d0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
1f8e0 74 69 6e 65 20 22 65 78 70 61 6e 64 73 22 20 61  tine "expands" a
1f8f0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
1f900 74 20 61 6e 64 20 61 6c 6c 20 6f 66 20 69 74 73  t and all of its
1f910 20 73 75 62 71 75 65 72 69 65 73 2e 0a 2a 2a 20   subqueries..** 
1f920 46 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  For additional i
1f930 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 77 68  nformation on wh
1f940 61 74 20 69 74 20 6d 65 61 6e 73 20 74 6f 20 22  at it means to "
1f950 65 78 70 61 6e 64 22 20 61 20 53 45 4c 45 43 54  expand" a SELECT
1f960 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2c 20 73  .** statement, s
1f970 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 6f  ee the comment o
1f980 6e 20 74 68 65 20 73 65 6c 65 63 74 45 78 70 61  n the selectExpa
1f990 6e 64 20 77 6f 72 6b 65 72 20 63 61 6c 6c 62 61  nd worker callba
1f9a0 63 6b 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20  ck above..**.** 
1f9b0 45 78 70 61 6e 64 69 6e 67 20 61 20 53 45 4c 45  Expanding a SELE
1f9c0 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20  CT statement is 
1f9d0 74 68 65 20 66 69 72 73 74 20 73 74 65 70 20 69  the first step i
1f9e0 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 61 0a 2a  n processing a.*
1f9f0 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  * SELECT stateme
1fa00 6e 74 2e 20 20 54 68 65 20 53 45 4c 45 43 54 20  nt.  The SELECT 
1fa10 73 74 61 74 65 6d 65 6e 74 20 6d 75 73 74 20 62  statement must b
1fa20 65 20 65 78 70 61 6e 64 65 64 20 62 65 66 6f 72  e expanded befor
1fa30 65 0a 2a 2a 20 6e 61 6d 65 20 72 65 73 6f 6c 75  e.** name resolu
1fa40 74 69 6f 6e 20 69 73 20 70 65 72 66 6f 72 6d 65  tion is performe
1fa50 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 74  d..**.** If anyt
1fa60 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2c  hing goes wrong,
1fa70 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
1fa80 65 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74  e is written int
1fa90 6f 20 70 50 61 72 73 65 2e 0a 2a 2a 20 54 68 65  o pParse..** The
1faa0 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   calling functio
1fab0 6e 20 63 61 6e 20 64 65 74 65 63 74 20 74 68 65  n can detect the
1fac0 20 70 72 6f 62 6c 65 6d 20 62 79 20 6c 6f 6f 6b   problem by look
1fad0 69 6e 67 20 61 74 20 70 50 61 72 73 65 2d 3e 6e  ing at pParse->n
1fae0 45 72 72 0a 2a 2a 20 61 6e 64 2f 6f 72 20 70 50  Err.** and/or pP
1faf0 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
1fb00 46 61 69 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  Failed..*/.stati
1fb10 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65  c void sqlite3Se
1fb20 6c 65 63 74 45 78 70 61 6e 64 28 50 61 72 73 65  lectExpand(Parse
1fb30 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74   *pParse, Select
1fb40 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 57 61   *pSelect){.  Wa
1fb50 6c 6b 65 72 20 77 3b 0a 20 20 6d 65 6d 73 65 74  lker w;.  memset
1fb60 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77  (&w, 0, sizeof(w
1fb70 29 29 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43  ));.  w.xSelectC
1fb80 61 6c 6c 62 61 63 6b 20 3d 20 63 6f 6e 76 65 72  allback = conver
1fb90 74 43 6f 6d 70 6f 75 6e 64 53 65 6c 65 63 74 54  tCompoundSelectT
1fba0 6f 53 75 62 71 75 65 72 79 3b 0a 20 20 77 2e 78  oSubquery;.  w.x
1fbb0 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65  ExprCallback = e
1fbc0 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77  xprWalkNoop;.  w
1fbd0 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65  .pParse = pParse
1fbe0 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53  ;.  sqlite3WalkS
1fbf0 65 6c 65 63 74 28 26 77 2c 20 70 53 65 6c 65 63  elect(&w, pSelec
1fc00 74 29 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43  t);.  w.xSelectC
1fc10 61 6c 6c 62 61 63 6b 20 3d 20 73 65 6c 65 63 74  allback = select
1fc20 45 78 70 61 6e 64 65 72 3b 0a 20 20 73 71 6c 69  Expander;.  sqli
1fc30 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 26 77  te3WalkSelect(&w
1fc40 2c 20 70 53 65 6c 65 63 74 29 3b 0a 7d 0a 0a 0a  , pSelect);.}...
1fc50 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1fc60 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a  MIT_SUBQUERY./*.
1fc70 2a 2a 20 54 68 69 73 20 69 73 20 61 20 57 61 6c  ** This is a Wal
1fc80 6b 65 72 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62  ker.xSelectCallb
1fc90 61 63 6b 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72  ack callback for
1fca0 20 74 68 65 20 73 71 6c 69 74 65 33 53 65 6c 65   the sqlite3Sele
1fcb0 63 74 54 79 70 65 49 6e 66 6f 28 29 0a 2a 2a 20  ctTypeInfo().** 
1fcc0 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2a 0a 2a 2a  interface..**.**
1fcd0 20 46 6f 72 20 65 61 63 68 20 46 52 4f 4d 2d 63   For each FROM-c
1fce0 6c 61 75 73 65 20 73 75 62 71 75 65 72 79 2c 20  lause subquery, 
1fcf0 61 64 64 20 43 6f 6c 75 6d 6e 2e 7a 54 79 70 65  add Column.zType
1fd00 20 61 6e 64 20 43 6f 6c 75 6d 6e 2e 7a 43 6f 6c   and Column.zCol
1fd10 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  l.** information
1fd20 20 74 6f 20 74 68 65 20 54 61 62 6c 65 20 73 74   to the Table st
1fd30 72 75 63 74 75 72 65 20 74 68 61 74 20 72 65 70  ructure that rep
1fd40 72 65 73 65 6e 74 73 20 74 68 65 20 72 65 73 75  resents the resu
1fd50 6c 74 20 73 65 74 0a 2a 2a 20 6f 66 20 74 68 61  lt set.** of tha
1fd60 74 20 73 75 62 71 75 65 72 79 2e 0a 2a 2a 0a 2a  t subquery..**.*
1fd70 2a 20 54 68 65 20 54 61 62 6c 65 20 73 74 72 75  * The Table stru
1fd80 63 74 75 72 65 20 74 68 61 74 20 72 65 70 72 65  cture that repre
1fd90 73 65 6e 74 73 20 74 68 65 20 72 65 73 75 6c 74  sents the result
1fda0 20 73 65 74 20 77 61 73 20 63 6f 6e 73 74 72 75   set was constru
1fdb0 63 74 65 64 0a 2a 2a 20 62 79 20 73 65 6c 65 63  cted.** by selec
1fdc0 74 45 78 70 61 6e 64 65 72 28 29 20 62 75 74 20  tExpander() but 
1fdd0 74 68 65 20 74 79 70 65 20 61 6e 64 20 63 6f 6c  the type and col
1fde0 6c 61 74 69 6f 6e 20 69 6e 66 6f 72 6d 61 74 69  lation informati
1fdf0 6f 6e 20 77 61 73 20 6f 6d 69 74 74 65 64 0a 2a  on was omitted.*
1fe00 2a 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74 20  * at that point 
1fe10 62 65 63 61 75 73 65 20 69 64 65 6e 74 69 66 69  because identifi
1fe20 65 72 73 20 68 61 64 20 6e 6f 74 20 79 65 74 20  ers had not yet 
1fe30 62 65 65 6e 20 72 65 73 6f 6c 76 65 64 2e 20 20  been resolved.  
1fe40 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  This.** routine 
1fe50 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20  is called after 
1fe60 69 64 65 6e 74 69 66 69 65 72 20 72 65 73 6f 6c  identifier resol
1fe70 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ution..*/.static
1fe80 20 69 6e 74 20 73 65 6c 65 63 74 41 64 64 53 75   int selectAddSu
1fe90 62 71 75 65 72 79 54 79 70 65 49 6e 66 6f 28 57  bqueryTypeInfo(W
1fea0 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
1feb0 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 50 61  Select *p){.  Pa
1fec0 72 73 65 20 2a 70 50 61 72 73 65 3b 0a 20 20 69  rse *pParse;.  i
1fed0 6e 74 20 69 3b 0a 20 20 53 72 63 4c 69 73 74 20  nt i;.  SrcList 
1fee0 2a 70 54 61 62 4c 69 73 74 3b 0a 20 20 73 74 72  *pTabList;.  str
1fef0 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
1ff00 20 2a 70 46 72 6f 6d 3b 0a 0a 20 20 61 73 73 65   *pFrom;..  asse
1ff10 72 74 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  rt( p->selFlags 
1ff20 26 20 53 46 5f 52 65 73 6f 6c 76 65 64 20 29 3b  & SF_Resolved );
1ff30 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c  .  if( (p->selFl
1ff40 61 67 73 20 26 20 53 46 5f 48 61 73 54 79 70 65  ags & SF_HasType
1ff50 49 6e 66 6f 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Info)==0 ){.    
1ff60 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53  p->selFlags |= S
1ff70 46 5f 48 61 73 54 79 70 65 49 6e 66 6f 3b 0a 20  F_HasTypeInfo;. 
1ff80 20 20 20 70 50 61 72 73 65 20 3d 20 70 57 61 6c     pParse = pWal
1ff90 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20  ker->pParse;.   
1ffa0 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70   pTabList = p->p
1ffb0 53 72 63 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  Src;.    for(i=0
1ffc0 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74  , pFrom=pTabList
1ffd0 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d  ->a; i<pTabList-
1ffe0 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f  >nSrc; i++, pFro
1fff0 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 54 61 62 6c  m++){.      Tabl
20000 65 20 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d  e *pTab = pFrom-
20010 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 69 66 28  >pTab;.      if(
20020 20 41 4c 57 41 59 53 28 70 54 61 62 21 3d 30 29   ALWAYS(pTab!=0)
20030 20 26 26 20 28 70 54 61 62 2d 3e 74 61 62 46 6c   && (pTab->tabFl
20040 61 67 73 20 26 20 54 46 5f 45 70 68 65 6d 65 72  ags & TF_Ephemer
20050 61 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  al)!=0 ){.      
20060 20 20 2f 2a 20 41 20 73 75 62 2d 71 75 65 72 79    /* A sub-query
20070 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
20080 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20  use of a SELECT 
20090 2a 2f 0a 20 20 20 20 20 20 20 20 53 65 6c 65 63  */.        Selec
200a0 74 20 2a 70 53 65 6c 20 3d 20 70 46 72 6f 6d 2d  t *pSel = pFrom-
200b0 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20  >pSelect;.      
200c0 20 20 61 73 73 65 72 74 28 20 70 53 65 6c 20 29    assert( pSel )
200d0 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  ;.        while(
200e0 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 20 29 20   pSel->pPrior ) 
200f0 70 53 65 6c 20 3d 20 70 53 65 6c 2d 3e 70 50 72  pSel = pSel->pPr
20100 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 73 65 6c  ior;.        sel
20110 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65  ectAddColumnType
20120 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 70 50 61  AndCollation(pPa
20130 72 73 65 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c 2c  rse, pTab->nCol,
20140 20 70 54 61 62 2d 3e 61 43 6f 6c 2c 20 70 53 65   pTab->aCol, pSe
20150 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  l);.      }.    
20160 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 57  }.  }.  return W
20170 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 23  RC_Continue;.}.#
20180 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  endif.../*.** Th
20190 69 73 20 72 6f 75 74 69 6e 65 20 61 64 64 73 20  is routine adds 
201a0 64 61 74 61 74 79 70 65 20 61 6e 64 20 63 6f 6c  datatype and col
201b0 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
201c0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 0a 2a  information to.*
201d0 2a 20 74 68 65 20 54 61 62 6c 65 20 73 74 72 75  * the Table stru
201e0 63 74 75 72 65 73 20 6f 66 20 61 6c 6c 20 46 52  ctures of all FR
201f0 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62 71 75 65  OM-clause subque
20200 72 69 65 73 20 69 6e 20 61 0a 2a 2a 20 53 45 4c  ries in a.** SEL
20210 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  ECT statement..*
20220 2a 0a 2a 2a 20 55 73 65 20 74 68 69 73 20 72 6f  *.** Use this ro
20230 75 74 69 6e 65 20 61 66 74 65 72 20 6e 61 6d 65  utine after name
20240 20 72 65 73 6f 6c 75 74 69 6f 6e 2e 0a 2a 2f 0a   resolution..*/.
20250 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69  static void sqli
20260 74 65 33 53 65 6c 65 63 74 41 64 64 54 79 70 65  te3SelectAddType
20270 49 6e 66 6f 28 50 61 72 73 65 20 2a 70 50 61 72  Info(Parse *pPar
20280 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  se, Select *pSel
20290 65 63 74 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  ect){.#ifndef SQ
202a0 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
202b0 52 59 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20  RY.  Walker w;. 
202c0 20 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c 20 73   memset(&w, 0, s
202d0 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20 77 2e 78  izeof(w));.  w.x
202e0 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d  SelectCallback =
202f0 20 73 65 6c 65 63 74 41 64 64 53 75 62 71 75 65   selectAddSubque
20300 72 79 54 79 70 65 49 6e 66 6f 3b 0a 20 20 77 2e  ryTypeInfo;.  w.
20310 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20  xExprCallback = 
20320 65 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20  exprWalkNoop;.  
20330 77 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73  w.pParse = pPars
20340 65 3b 0a 20 20 77 2e 62 53 65 6c 65 63 74 44 65  e;.  w.bSelectDe
20350 70 74 68 46 69 72 73 74 20 3d 20 31 3b 0a 20 20  pthFirst = 1;.  
20360 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63  sqlite3WalkSelec
20370 74 28 26 77 2c 20 70 53 65 6c 65 63 74 29 3b 0a  t(&w, pSelect);.
20380 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  #endif.}.../*.**
20390 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65   This routine se
203a0 74 73 20 75 70 20 61 20 53 45 4c 45 43 54 20 73  ts up a SELECT s
203b0 74 61 74 65 6d 65 6e 74 20 66 6f 72 20 70 72 6f  tatement for pro
203c0 63 65 73 73 69 6e 67 2e 20 20 54 68 65 0a 2a 2a  cessing.  The.**
203d0 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 61 63   following is ac
203e0 63 6f 6d 70 6c 69 73 68 65 64 3a 0a 2a 2a 0a 2a  complished:.**.*
203f0 2a 20 20 20 20 20 2a 20 20 56 44 42 45 20 43 75  *     *  VDBE Cu
20400 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 61 72 65  rsor numbers are
20410 20 61 73 73 69 67 6e 65 64 20 74 6f 20 61 6c 6c   assigned to all
20420 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 74 65 72   FROM-clause ter
20430 6d 73 2e 0a 2a 2a 20 20 20 20 20 2a 20 20 45 70  ms..**     *  Ep
20440 68 65 6d 65 72 61 6c 20 54 61 62 6c 65 20 6f 62  hemeral Table ob
20450 6a 65 63 74 73 20 61 72 65 20 63 72 65 61 74 65  jects are create
20460 64 20 66 6f 72 20 61 6c 6c 20 46 52 4f 4d 2d 63  d for all FROM-c
20470 6c 61 75 73 65 20 73 75 62 71 75 65 72 69 65 73  lause subqueries
20480 2e 0a 2a 2a 20 20 20 20 20 2a 20 20 4f 4e 20 61  ..**     *  ON a
20490 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73  nd USING clauses
204a0 20 61 72 65 20 73 68 69 66 74 65 64 20 69 6e 74   are shifted int
204b0 6f 20 57 48 45 52 45 20 73 74 61 74 65 6d 65 6e  o WHERE statemen
204c0 74 73 0a 2a 2a 20 20 20 20 20 2a 20 20 57 69 6c  ts.**     *  Wil
204d0 64 63 61 72 64 73 20 22 2a 22 20 61 6e 64 20 22  dcards "*" and "
204e0 54 41 42 4c 45 2e 2a 22 20 69 6e 20 72 65 73 75  TABLE.*" in resu
204f0 6c 74 20 73 65 74 73 20 61 72 65 20 65 78 70 61  lt sets are expa
20500 6e 64 65 64 2e 0a 2a 2a 20 20 20 20 20 2a 20 20  nded..**     *  
20510 49 64 65 6e 74 69 66 69 65 72 73 20 69 6e 20 65  Identifiers in e
20520 78 70 72 65 73 73 69 6f 6e 20 61 72 65 20 6d 61  xpression are ma
20530 74 63 68 65 64 20 74 6f 20 74 61 62 6c 65 73 2e  tched to tables.
20540 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
20550 69 6e 65 20 61 63 74 73 20 72 65 63 75 72 73 69  ine acts recursi
20560 76 65 6c 79 20 6f 6e 20 61 6c 6c 20 73 75 62 71  vely on all subq
20570 75 65 72 69 65 73 20 77 69 74 68 69 6e 20 74 68  ueries within th
20580 65 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76 6f 69  e SELECT..*/.voi
20590 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 50  d sqlite3SelectP
205a0 72 65 70 28 0a 20 20 50 61 72 73 65 20 2a 70 50  rep(.  Parse *pP
205b0 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  arse,         /*
205c0 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74   The parser cont
205d0 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
205e0 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
205f0 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74  /* The SELECT st
20600 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f  atement being co
20610 64 65 64 2e 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f  ded. */.  NameCo
20620 6e 74 65 78 74 20 2a 70 4f 75 74 65 72 4e 43 20  ntext *pOuterNC 
20630 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74   /* Name context
20640 20 66 6f 72 20 63 6f 6e 74 61 69 6e 65 72 20 2a   for container *
20650 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
20660 64 62 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28  db;.  if( NEVER(
20670 70 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 3b 0a  p==0) ) return;.
20680 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64    db = pParse->d
20690 62 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  b;.  if( db->mal
206a0 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75  locFailed ) retu
206b0 72 6e 3b 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c  rn;.  if( p->sel
206c0 46 6c 61 67 73 20 26 20 53 46 5f 48 61 73 54 79  Flags & SF_HasTy
206d0 70 65 49 6e 66 6f 20 29 20 72 65 74 75 72 6e 3b  peInfo ) return;
206e0 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
206f0 45 78 70 61 6e 64 28 70 50 61 72 73 65 2c 20 70  Expand(pParse, p
20700 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  );.  if( pParse-
20710 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c  >nErr || db->mal
20720 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75  locFailed ) retu
20730 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 73  rn;.  sqlite3Res
20740 6f 6c 76 65 53 65 6c 65 63 74 4e 61 6d 65 73 28  olveSelectNames(
20750 70 50 61 72 73 65 2c 20 70 2c 20 70 4f 75 74 65  pParse, p, pOute
20760 72 4e 43 29 3b 0a 20 20 69 66 28 20 70 50 61 72  rNC);.  if( pPar
20770 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e  se->nErr || db->
20780 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72  mallocFailed ) r
20790 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33  eturn;.  sqlite3
207a0 53 65 6c 65 63 74 41 64 64 54 79 70 65 49 6e 66  SelectAddTypeInf
207b0 6f 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 7d 0a  o(pParse, p);.}.
207c0 0a 2f 2a 0a 2a 2a 20 52 65 73 65 74 20 74 68 65  ./*.** Reset the
207d0 20 61 67 67 72 65 67 61 74 65 20 61 63 63 75 6d   aggregate accum
207e0 75 6c 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  ulator..**.** Th
207f0 65 20 61 67 67 72 65 67 61 74 65 20 61 63 63 75  e aggregate accu
20800 6d 75 6c 61 74 6f 72 20 69 73 20 61 20 73 65 74  mulator is a set
20810 20 6f 66 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73   of memory cells
20820 20 74 68 61 74 20 68 6f 6c 64 0a 2a 2a 20 69 6e   that hold.** in
20830 74 65 72 6d 65 64 69 61 74 65 20 72 65 73 75 6c  termediate resul
20840 74 73 20 77 68 69 6c 65 20 63 61 6c 63 75 6c 61  ts while calcula
20850 74 69 6e 67 20 61 6e 20 61 67 67 72 65 67 61 74  ting an aggregat
20860 65 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74  e.  This.** rout
20870 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 63 6f  ine generates co
20880 64 65 20 74 68 61 74 20 73 74 6f 72 65 73 20 4e  de that stores N
20890 55 4c 4c 73 20 69 6e 20 61 6c 6c 20 6f 66 20 74  ULLs in all of t
208a0 68 6f 73 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20 63  hose memory.** c
208b0 65 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ells..*/.static 
208c0 76 6f 69 64 20 72 65 73 65 74 41 63 63 75 6d 75  void resetAccumu
208d0 6c 61 74 6f 72 28 50 61 72 73 65 20 2a 70 50 61  lator(Parse *pPa
208e0 72 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41  rse, AggInfo *pA
208f0 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20  ggInfo){.  Vdbe 
20900 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
20910 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  be;.  int i;.  s
20920 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75  truct AggInfo_fu
20930 6e 63 20 2a 70 46 75 6e 63 3b 0a 20 20 69 66 28  nc *pFunc;.  if(
20940 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63   pAggInfo->nFunc
20950 2b 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75  +pAggInfo->nColu
20960 6d 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  mn==0 ){.    ret
20970 75 72 6e 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  urn;.  }.  for(i
20980 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e  =0; i<pAggInfo->
20990 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20  nColumn; i++){. 
209a0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
209b0 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  dOp2(v, OP_Null,
209c0 20 30 2c 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43   0, pAggInfo->aC
209d0 6f 6c 5b 69 5d 2e 69 4d 65 6d 29 3b 0a 20 20 7d  ol[i].iMem);.  }
209e0 0a 20 20 66 6f 72 28 70 46 75 6e 63 3d 70 41 67  .  for(pFunc=pAg
209f0 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 2c 20 69 3d  gInfo->aFunc, i=
20a00 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e  0; i<pAggInfo->n
20a10 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 75 6e 63  Func; i++, pFunc
20a20 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
20a30 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
20a40 5f 4e 75 6c 6c 2c 20 30 2c 20 70 46 75 6e 63 2d  _Null, 0, pFunc-
20a50 3e 69 4d 65 6d 29 3b 0a 20 20 20 20 69 66 28 20  >iMem);.    if( 
20a60 70 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74  pFunc->iDistinct
20a70 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 45 78 70  >=0 ){.      Exp
20a80 72 20 2a 70 45 20 3d 20 70 46 75 6e 63 2d 3e 70  r *pE = pFunc->p
20a90 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65  Expr;.      asse
20aa0 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
20ab0 65 72 74 79 28 70 45 2c 20 45 50 5f 78 49 73 53  erty(pE, EP_xIsS
20ac0 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20  elect) );.      
20ad0 69 66 28 20 70 45 2d 3e 78 2e 70 4c 69 73 74 3d  if( pE->x.pList=
20ae0 3d 30 20 7c 7c 20 70 45 2d 3e 78 2e 70 4c 69 73  =0 || pE->x.pLis
20af0 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29 7b 0a 20  t->nExpr!=1 ){. 
20b00 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
20b10 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
20b20 44 49 53 54 49 4e 43 54 20 61 67 67 72 65 67 61  DISTINCT aggrega
20b30 74 65 73 20 6d 75 73 74 20 68 61 76 65 20 65 78  tes must have ex
20b40 61 63 74 6c 79 20 6f 6e 65 20 22 0a 20 20 20 20  actly one ".    
20b50 20 20 20 20 20 20 20 22 61 72 67 75 6d 65 6e 74         "argument
20b60 22 29 3b 0a 20 20 20 20 20 20 20 20 70 46 75 6e  ");.        pFun
20b70 63 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d 20 2d  c->iDistinct = -
20b80 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  1;.      }else{.
20b90 20 20 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20          KeyInfo 
20ba0 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49  *pKeyInfo = keyI
20bb0 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28  nfoFromExprList(
20bc0 70 50 61 72 73 65 2c 20 70 45 2d 3e 78 2e 70 4c  pParse, pE->x.pL
20bd0 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ist);.        sq
20be0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
20bf0 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
20c00 72 61 6c 2c 20 70 46 75 6e 63 2d 3e 69 44 69 73  ral, pFunc->iDis
20c10 74 69 6e 63 74 2c 20 30 2c 20 30 2c 0a 20 20 20  tinct, 0, 0,.   
20c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20c30 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b         (char*)pK
20c40 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e  eyInfo, P4_KEYIN
20c50 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 20  FO_HANDOFF);.   
20c60 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d     }.    }.  }.}
20c70 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74  ../*.** Invoke t
20c80 68 65 20 4f 50 5f 41 67 67 46 69 6e 61 6c 69 7a  he OP_AggFinaliz
20c90 65 20 6f 70 63 6f 64 65 20 66 6f 72 20 65 76 65  e opcode for eve
20ca0 72 79 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  ry aggregate fun
20cb0 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 65 20  ction.** in the 
20cc0 41 67 67 49 6e 66 6f 20 73 74 72 75 63 74 75 72  AggInfo structur
20cd0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
20ce0 64 20 66 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e  d finalizeAggFun
20cf0 63 74 69 6f 6e 73 28 50 61 72 73 65 20 2a 70 50  ctions(Parse *pP
20d00 61 72 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70  arse, AggInfo *p
20d10 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65  AggInfo){.  Vdbe
20d20 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
20d30 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  dbe;.  int i;.  
20d40 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66  struct AggInfo_f
20d50 75 6e 63 20 2a 70 46 3b 0a 20 20 66 6f 72 28 69  unc *pF;.  for(i
20d60 3d 30 2c 20 70 46 3d 70 41 67 67 49 6e 66 6f 2d  =0, pF=pAggInfo-
20d70 3e 61 46 75 6e 63 3b 20 69 3c 70 41 67 67 49 6e  >aFunc; i<pAggIn
20d80 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20  fo->nFunc; i++, 
20d90 70 46 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 4c  pF++){.    ExprL
20da0 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 46 2d  ist *pList = pF-
20db0 3e 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b  >pExpr->x.pList;
20dc0 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78  .    assert( !Ex
20dd0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 46  prHasProperty(pF
20de0 2d 3e 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  ->pExpr, EP_xIsS
20df0 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 73 71  elect) );.    sq
20e00 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
20e10 76 2c 20 4f 50 5f 41 67 67 46 69 6e 61 6c 2c 20  v, OP_AggFinal, 
20e20 70 46 2d 3e 69 4d 65 6d 2c 20 70 4c 69 73 74 20  pF->iMem, pList 
20e30 3f 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a  ? pList->nExpr :
20e40 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20   0, 0,.         
20e50 20 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f               (vo
20e60 69 64 2a 29 70 46 2d 3e 70 46 75 6e 63 2c 20 50  id*)pF->pFunc, P
20e70 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 7d 0a  4_FUNCDEF);.  }.
20e80 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70 64 61 74 65 20  }../*.** Update 
20e90 74 68 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20  the accumulator 
20ea0 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 66 6f 72  memory cells for
20eb0 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 62 61   an aggregate ba
20ec0 73 65 64 20 6f 6e 0a 2a 2a 20 74 68 65 20 63 75  sed on.** the cu
20ed0 72 72 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73  rrent cursor pos
20ee0 69 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ition..*/.static
20ef0 20 76 6f 69 64 20 75 70 64 61 74 65 41 63 63 75   void updateAccu
20f00 6d 75 6c 61 74 6f 72 28 50 61 72 73 65 20 2a 70  mulator(Parse *p
20f10 50 61 72 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a  Parse, AggInfo *
20f20 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62  pAggInfo){.  Vdb
20f30 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
20f40 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Vdbe;.  int i;. 
20f50 20 69 6e 74 20 72 65 67 48 69 74 20 3d 20 30 3b   int regHit = 0;
20f60 0a 20 20 69 6e 74 20 61 64 64 72 48 69 74 54 65  .  int addrHitTe
20f70 73 74 20 3d 20 30 3b 0a 20 20 73 74 72 75 63 74  st = 0;.  struct
20f80 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70   AggInfo_func *p
20f90 46 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67 49  F;.  struct AggI
20fa0 6e 66 6f 5f 63 6f 6c 20 2a 70 43 3b 0a 0a 20 20  nfo_col *pC;..  
20fb0 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74  pAggInfo->direct
20fc0 4d 6f 64 65 20 3d 20 31 3b 0a 20 20 73 71 6c 69  Mode = 1;.  sqli
20fd0 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61  te3ExprCacheClea
20fe0 72 28 70 50 61 72 73 65 29 3b 0a 20 20 66 6f 72  r(pParse);.  for
20ff0 28 69 3d 30 2c 20 70 46 3d 70 41 67 67 49 6e 66  (i=0, pF=pAggInf
21000 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c 70 41 67 67  o->aFunc; i<pAgg
21010 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b  Info->nFunc; i++
21020 2c 20 70 46 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  , pF++){.    int
21030 20 6e 41 72 67 3b 0a 20 20 20 20 69 6e 74 20 61   nArg;.    int a
21040 64 64 72 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20  ddrNext = 0;.   
21050 20 69 6e 74 20 72 65 67 41 67 67 3b 0a 20 20 20   int regAgg;.   
21060 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
21070 20 3d 20 70 46 2d 3e 70 45 78 70 72 2d 3e 78 2e   = pF->pExpr->x.
21080 70 4c 69 73 74 3b 0a 20 20 20 20 61 73 73 65 72  pList;.    asser
21090 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
210a0 72 74 79 28 70 46 2d 3e 70 45 78 70 72 2c 20 45  rty(pF->pExpr, E
210b0 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a  P_xIsSelect) );.
210c0 20 20 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b      if( pList ){
210d0 0a 20 20 20 20 20 20 6e 41 72 67 20 3d 20 70 4c  .      nArg = pL
210e0 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  ist->nExpr;.    
210f0 20 20 72 65 67 41 67 67 20 3d 20 73 71 6c 69 74    regAgg = sqlit
21100 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70  e3GetTempRange(p
21110 50 61 72 73 65 2c 20 6e 41 72 67 29 3b 0a 20 20  Parse, nArg);.  
21120 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
21130 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50 61 72  odeExprList(pPar
21140 73 65 2c 20 70 4c 69 73 74 2c 20 72 65 67 41 67  se, pList, regAg
21150 67 2c 20 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65  g, 1);.    }else
21160 7b 0a 20 20 20 20 20 20 6e 41 72 67 20 3d 20 30  {.      nArg = 0
21170 3b 0a 20 20 20 20 20 20 72 65 67 41 67 67 20 3d  ;.      regAgg =
21180 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   0;.    }.    if
21190 28 20 70 46 2d 3e 69 44 69 73 74 69 6e 63 74 3e  ( pF->iDistinct>
211a0 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 64 64 72  =0 ){.      addr
211b0 4e 65 78 74 20 3d 20 73 71 6c 69 74 65 33 56 64  Next = sqlite3Vd
211c0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
211d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 41        assert( nA
211e0 72 67 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 63  rg==1 );.      c
211f0 6f 64 65 44 69 73 74 69 6e 63 74 28 70 50 61 72  odeDistinct(pPar
21200 73 65 2c 20 70 46 2d 3e 69 44 69 73 74 69 6e 63  se, pF->iDistinc
21210 74 2c 20 61 64 64 72 4e 65 78 74 2c 20 31 2c 20  t, addrNext, 1, 
21220 72 65 67 41 67 67 29 3b 0a 20 20 20 20 7d 0a 20  regAgg);.    }. 
21230 20 20 20 69 66 28 20 70 46 2d 3e 70 46 75 6e 63     if( pF->pFunc
21240 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
21250 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 20 29  _FUNC_NEEDCOLL )
21260 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20  {.      CollSeq 
21270 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20 20  *pColl = 0;.    
21280 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
21290 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
212a0 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
212b0 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 21    assert( pList!
212c0 3d 30 20 29 3b 20 20 2f 2a 20 70 4c 69 73 74 21  =0 );  /* pList!
212d0 3d 30 20 69 66 20 70 46 2d 3e 70 46 75 6e 63 20  =0 if pF->pFunc 
212e0 68 61 73 20 4e 45 45 44 43 4f 4c 4c 20 2a 2f 0a  has NEEDCOLL */.
212f0 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70        for(j=0, p
21300 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 21  Item=pList->a; !
21310 70 43 6f 6c 6c 20 26 26 20 6a 3c 6e 41 72 67 3b  pColl && j<nArg;
21320 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   j++, pItem++){.
21330 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20          pColl = 
21340 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
21350 65 71 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d  eq(pParse, pItem
21360 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ->pExpr);.      
21370 7d 0a 20 20 20 20 20 20 69 66 28 20 21 70 43 6f  }.      if( !pCo
21380 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  ll ){.        pC
21390 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  oll = pParse->db
213a0 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20  ->pDfltColl;.   
213b0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
213c0 65 67 48 69 74 3d 3d 30 20 26 26 20 70 41 67 67  egHit==0 && pAgg
213d0 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61 74  Info->nAccumulat
213e0 6f 72 20 29 20 72 65 67 48 69 74 20 3d 20 2b 2b  or ) regHit = ++
213f0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
21400 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
21410 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6c 6c  ddOp4(v, OP_Coll
21420 53 65 71 2c 20 72 65 67 48 69 74 2c 20 30 2c 20  Seq, regHit, 0, 
21430 30 2c 20 28 63 68 61 72 20 2a 29 70 43 6f 6c 6c  0, (char *)pColl
21440 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20  , P4_COLLSEQ);. 
21450 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
21460 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
21470 5f 41 67 67 53 74 65 70 2c 20 30 2c 20 72 65 67  _AggStep, 0, reg
21480 41 67 67 2c 20 70 46 2d 3e 69 4d 65 6d 2c 0a 20  Agg, pF->iMem,. 
21490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
214a0 20 20 20 20 20 28 76 6f 69 64 2a 29 70 46 2d 3e       (void*)pF->
214b0 70 46 75 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45  pFunc, P4_FUNCDE
214c0 46 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  F);.    sqlite3V
214d0 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 28  dbeChangeP5(v, (
214e0 75 38 29 6e 41 72 67 29 3b 0a 20 20 20 20 73 71  u8)nArg);.    sq
214f0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66  lite3ExprCacheAf
21500 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61  finityChange(pPa
21510 72 73 65 2c 20 72 65 67 41 67 67 2c 20 6e 41 72  rse, regAgg, nAr
21520 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52  g);.    sqlite3R
21530 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28  eleaseTempRange(
21540 70 50 61 72 73 65 2c 20 72 65 67 41 67 67 2c 20  pParse, regAgg, 
21550 6e 41 72 67 29 3b 0a 20 20 20 20 69 66 28 20 61  nArg);.    if( a
21560 64 64 72 4e 65 78 74 20 29 7b 0a 20 20 20 20 20  ddrNext ){.     
21570 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
21580 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72  lveLabel(v, addr
21590 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  Next);.      sql
215a0 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65  ite3ExprCacheCle
215b0 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  ar(pParse);.    
215c0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 66 6f  }.  }..  /* Befo
215d0 72 65 20 70 6f 70 75 6c 61 74 69 6e 67 20 74 68  re populating th
215e0 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 72 65  e accumulator re
215f0 67 69 73 74 65 72 73 2c 20 63 6c 65 61 72 20 74  gisters, clear t
21600 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e  he column cache.
21610 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  .  ** Otherwise,
21620 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20 72   if any of the r
21630 65 71 75 69 72 65 64 20 63 6f 6c 75 6d 6e 20 76  equired column v
21640 61 6c 75 65 73 20 61 72 65 20 61 6c 72 65 61 64  alues are alread
21650 79 20 70 72 65 73 65 6e 74 20 0a 20 20 2a 2a 20  y present .  ** 
21660 69 6e 20 72 65 67 69 73 74 65 72 73 2c 20 73 71  in registers, sq
21670 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 29 20  lite3ExprCode() 
21680 6d 61 79 20 75 73 65 20 4f 50 5f 53 43 6f 70 79  may use OP_SCopy
21690 20 74 6f 20 63 6f 70 79 20 74 68 65 20 76 61 6c   to copy the val
216a0 75 65 0a 20 20 2a 2a 20 74 6f 20 70 43 2d 3e 69  ue.  ** to pC->i
216b0 4d 65 6d 2e 20 42 75 74 20 62 79 20 74 68 65 20  Mem. But by the 
216c0 74 69 6d 65 20 74 68 65 20 76 61 6c 75 65 20 69  time the value i
216d0 73 20 75 73 65 64 2c 20 74 68 65 20 6f 72 69 67  s used, the orig
216e0 69 6e 61 6c 20 72 65 67 69 73 74 65 72 0a 20 20  inal register.  
216f0 2a 2a 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e  ** may have been
21700 20 75 73 65 64 2c 20 69 6e 76 61 6c 69 64 61 74   used, invalidat
21710 69 6e 67 20 74 68 65 20 75 6e 64 65 72 6c 79 69  ing the underlyi
21720 6e 67 20 62 75 66 66 65 72 20 68 6f 6c 64 69 6e  ng buffer holdin
21730 67 20 74 68 65 0a 20 20 2a 2a 20 74 65 78 74 20  g the.  ** text 
21740 6f 72 20 62 6c 6f 62 20 76 61 6c 75 65 2e 20 53  or blob value. S
21750 65 65 20 74 69 63 6b 65 74 20 5b 38 38 33 30 33  ee ticket [88303
21760 34 64 63 62 35 5d 2e 0a 20 20 2a 2a 0a 20 20 2a  4dcb5]..  **.  *
21770 2a 20 41 6e 6f 74 68 65 72 20 73 6f 6c 75 74 69  * Another soluti
21780 6f 6e 20 77 6f 75 6c 64 20 62 65 20 74 6f 20 63  on would be to c
21790 68 61 6e 67 65 20 74 68 65 20 4f 50 5f 53 43 6f  hange the OP_SCo
217a0 70 79 20 75 73 65 64 20 74 6f 20 63 6f 70 79 20  py used to copy 
217b0 63 61 63 68 65 64 0a 20 20 2a 2a 20 76 61 6c 75  cached.  ** valu
217c0 65 73 20 74 6f 20 61 6e 20 4f 50 5f 43 6f 70 79  es to an OP_Copy
217d0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 65 67  ..  */.  if( reg
217e0 48 69 74 20 29 7b 0a 20 20 20 20 61 64 64 72 48  Hit ){.    addrH
217f0 69 74 54 65 73 74 20 3d 20 73 71 6c 69 74 65 33  itTest = sqlite3
21800 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
21810 5f 49 66 2c 20 72 65 67 48 69 74 29 3b 0a 20 20  _If, regHit);.  
21820 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43  }.  sqlite3ExprC
21830 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65  acheClear(pParse
21840 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 43  );.  for(i=0, pC
21850 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b  =pAggInfo->aCol;
21860 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 41 63   i<pAggInfo->nAc
21870 63 75 6d 75 6c 61 74 6f 72 3b 20 69 2b 2b 2c 20  cumulator; i++, 
21880 70 43 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74  pC++){.    sqlit
21890 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
218a0 65 2c 20 70 43 2d 3e 70 45 78 70 72 2c 20 70 43  e, pC->pExpr, pC
218b0 2d 3e 69 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20 70  ->iMem);.  }.  p
218c0 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d  AggInfo->directM
218d0 6f 64 65 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  ode = 0;.  sqlit
218e0 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72  e3ExprCacheClear
218f0 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
21900 61 64 64 72 48 69 74 54 65 73 74 20 29 7b 0a 20  addrHitTest ){. 
21910 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
21920 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 48 69  mpHere(v, addrHi
21930 74 54 65 73 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  tTest);.  }.}../
21940 2a 0a 2a 2a 20 41 64 64 20 61 20 73 69 6e 67 6c  *.** Add a singl
21950 65 20 4f 50 5f 45 78 70 6c 61 69 6e 20 69 6e 73  e OP_Explain ins
21960 74 72 75 63 74 69 6f 6e 20 74 6f 20 74 68 65 20  truction to the 
21970 56 44 42 45 20 74 6f 20 65 78 70 6c 61 69 6e 20  VDBE to explain 
21980 61 20 73 69 6d 70 6c 65 0a 2a 2a 20 63 6f 75 6e  a simple.** coun
21990 74 28 2a 29 20 71 75 65 72 79 20 28 22 53 45 4c  t(*) query ("SEL
219a0 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  ECT count(*) FRO
219b0 4d 20 70 54 61 62 22 29 2e 0a 2a 2f 0a 23 69 66  M pTab")..*/.#if
219c0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
219d0 5f 45 58 50 4c 41 49 4e 0a 73 74 61 74 69 63 20  _EXPLAIN.static 
219e0 76 6f 69 64 20 65 78 70 6c 61 69 6e 53 69 6d 70  void explainSimp
219f0 6c 65 43 6f 75 6e 74 28 0a 20 20 50 61 72 73 65  leCount(.  Parse
21a00 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
21a10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
21a20 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  rse context */. 
21a30 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20   Table *pTab,   
21a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a50 20 2f 2a 20 54 61 62 6c 65 20 62 65 69 6e 67 20   /* Table being 
21a60 71 75 65 72 69 65 64 20 2a 2f 0a 20 20 49 6e 64  queried */.  Ind
21a70 65 78 20 2a 70 49 64 78 20 20 20 20 20 20 20 20  ex *pIdx        
21a80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21a90 49 6e 64 65 78 20 75 73 65 64 20 74 6f 20 6f 70  Index used to op
21aa0 74 69 6d 69 7a 65 20 73 63 61 6e 2c 20 6f 72 20  timize scan, or 
21ab0 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69 66 28  NULL */.){.  if(
21ac0 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e   pParse->explain
21ad0 3d 3d 32 20 29 7b 0a 20 20 20 20 63 68 61 72 20  ==2 ){.    char 
21ae0 2a 7a 45 71 70 20 3d 20 73 71 6c 69 74 65 33 4d  *zEqp = sqlite3M
21af0 50 72 69 6e 74 66 28 70 50 61 72 73 65 2d 3e 64  Printf(pParse->d
21b00 62 2c 20 22 53 43 41 4e 20 54 41 42 4c 45 20 25  b, "SCAN TABLE %
21b10 73 25 73 25 73 22 2c 0a 20 20 20 20 20 20 20 20  s%s%s",.        
21b20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 0a 20 20  pTab->zName, .  
21b30 20 20 20 20 20 20 70 49 64 78 20 3f 20 22 20 55        pIdx ? " U
21b40 53 49 4e 47 20 43 4f 56 45 52 49 4e 47 20 49 4e  SING COVERING IN
21b50 44 45 58 20 22 20 3a 20 22 22 2c 0a 20 20 20 20  DEX " : "",.    
21b60 20 20 20 20 70 49 64 78 20 3f 20 70 49 64 78 2d      pIdx ? pIdx-
21b70 3e 7a 4e 61 6d 65 20 3a 20 22 22 0a 20 20 20 20  >zName : "".    
21b80 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
21b90 62 65 41 64 64 4f 70 34 28 0a 20 20 20 20 20 20  beAddOp4(.      
21ba0 20 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c    pParse->pVdbe,
21bb0 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 70 50 61   OP_Explain, pPa
21bc0 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20  rse->iSelectId, 
21bd0 30 2c 20 30 2c 20 7a 45 71 70 2c 20 50 34 5f 44  0, 0, zEqp, P4_D
21be0 59 4e 41 4d 49 43 0a 20 20 20 20 29 3b 0a 20 20  YNAMIC.    );.  
21bf0 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  }.}.#else.# defi
21c00 6e 65 20 65 78 70 6c 61 69 6e 53 69 6d 70 6c 65  ne explainSimple
21c10 43 6f 75 6e 74 28 61 2c 62 2c 63 29 0a 23 65 6e  Count(a,b,c).#en
21c20 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  dif../*.** Gener
21c30 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65  ate code for the
21c40 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
21c50 74 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20 70  t given in the p
21c60 20 61 72 67 75 6d 65 6e 74 2e 20 20 0a 2a 2a 0a   argument.  .**.
21c70 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20 61  ** The results a
21c80 72 65 20 64 69 73 74 72 69 62 75 74 65 64 20 69  re distributed i
21c90 6e 20 76 61 72 69 6f 75 73 20 77 61 79 73 20 64  n various ways d
21ca0 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 0a  epending on the.
21cb0 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  ** contents of t
21cc0 68 65 20 53 65 6c 65 63 74 44 65 73 74 20 73 74  he SelectDest st
21cd0 72 75 63 74 75 72 65 20 70 6f 69 6e 74 65 64 20  ructure pointed 
21ce0 74 6f 20 62 79 20 61 72 67 75 6d 65 6e 74 20 70  to by argument p
21cf0 44 65 73 74 0a 2a 2a 20 61 73 20 66 6f 6c 6c 6f  Dest.** as follo
21d00 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 70 44  ws:.**.**     pD
21d10 65 73 74 2d 3e 65 44 65 73 74 20 20 20 20 52 65  est->eDest    Re
21d20 73 75 6c 74 0a 2a 2a 20 20 20 20 20 2d 2d 2d 2d  sult.**     ----
21d30 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 2d 2d 2d 2d  --------    ----
21d40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
21d50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
21d60 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20 53  -------.**     S
21d70 52 54 5f 4f 75 74 70 75 74 20 20 20 20 20 20 47  RT_Output      G
21d80 65 6e 65 72 61 74 65 20 61 20 72 6f 77 20 6f 66  enerate a row of
21d90 20 6f 75 74 70 75 74 20 28 75 73 69 6e 67 20 74   output (using t
21da0 68 65 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 0a  he OP_ResultRow.
21db0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
21dc0 20 20 20 20 20 20 20 6f 70 63 6f 64 65 29 20 66         opcode) f
21dd0 6f 72 20 65 61 63 68 20 72 6f 77 20 69 6e 20 74  or each row in t
21de0 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 0a 2a  he result set..*
21df0 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 4d 65 6d  *.**     SRT_Mem
21e00 20 20 20 20 20 20 20 20 20 4f 6e 6c 79 20 76 61           Only va
21e10 6c 69 64 20 69 66 20 74 68 65 20 72 65 73 75 6c  lid if the resul
21e20 74 20 69 73 20 61 20 73 69 6e 67 6c 65 20 63 6f  t is a single co
21e30 6c 75 6d 6e 2e 0a 2a 2a 20 20 20 20 20 20 20 20  lumn..**        
21e40 20 20 20 20 20 20 20 20 20 20 20 20 20 53 74 6f               Sto
21e50 72 65 20 74 68 65 20 66 69 72 73 74 20 63 6f 6c  re the first col
21e60 75 6d 6e 20 6f 66 20 74 68 65 20 66 69 72 73 74  umn of the first
21e70 20 72 65 73 75 6c 74 20 72 6f 77 0a 2a 2a 20 20   result row.**  
21e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21e90 20 20 20 69 6e 20 72 65 67 69 73 74 65 72 20 70     in register p
21ea0 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 20 74 68  Dest->iSDParm th
21eb0 65 6e 20 61 62 61 6e 64 6f 6e 20 74 68 65 20 72  en abandon the r
21ec0 65 73 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  est.**          
21ed0 20 20 20 20 20 20 20 20 20 20 20 6f 66 20 74 68             of th
21ee0 65 20 71 75 65 72 79 2e 20 20 54 68 69 73 20 64  e query.  This d
21ef0 65 73 74 69 6e 61 74 69 6f 6e 20 69 6d 70 6c 69  estination impli
21f00 65 73 20 22 4c 49 4d 49 54 20 31 22 2e 0a 2a 2a  es "LIMIT 1"..**
21f10 0a 2a 2a 20 20 20 20 20 53 52 54 5f 53 65 74 20  .**     SRT_Set 
21f20 20 20 20 20 20 20 20 20 54 68 65 20 72 65 73 75          The resu
21f30 6c 74 20 6d 75 73 74 20 62 65 20 61 20 73 69 6e  lt must be a sin
21f40 67 6c 65 20 63 6f 6c 75 6d 6e 2e 20 20 53 74 6f  gle column.  Sto
21f50 72 65 20 65 61 63 68 0a 2a 2a 20 20 20 20 20 20  re each.**      
21f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
21f70 6f 77 20 6f 66 20 72 65 73 75 6c 74 20 61 73 20  ow of result as 
21f80 74 68 65 20 6b 65 79 20 69 6e 20 74 61 62 6c 65  the key in table
21f90 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 2e   pDest->iSDParm.
21fa0 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20   .**            
21fb0 20 20 20 20 20 20 20 20 20 41 70 70 6c 79 20 74           Apply t
21fc0 68 65 20 61 66 66 69 6e 69 74 79 20 70 44 65 73  he affinity pDes
21fd0 74 2d 3e 61 66 66 53 64 73 74 20 62 65 66 6f 72  t->affSdst befor
21fe0 65 20 73 74 6f 72 69 6e 67 0a 2a 2a 20 20 20 20  e storing.**    
21ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22000 20 72 65 73 75 6c 74 73 2e 20 20 55 73 65 64 20   results.  Used 
22010 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 22 49 4e  to implement "IN
22020 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 2e 0a   (SELECT ...)"..
22030 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 55 6e  **.**     SRT_Un
22040 69 6f 6e 20 20 20 20 20 20 20 53 74 6f 72 65 20  ion       Store 
22050 72 65 73 75 6c 74 73 20 61 73 20 61 20 6b 65 79  results as a key
22060 20 69 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20   in a temporary 
22070 74 61 62 6c 65 20 0a 2a 2a 20 20 20 20 20 20 20  table .**       
22080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 64                id
22090 65 6e 74 69 66 69 65 64 20 62 79 20 70 44 65 73  entified by pDes
220a0 74 2d 3e 69 53 44 50 61 72 6d 2e 0a 2a 2a 0a 2a  t->iSDParm..**.*
220b0 2a 20 20 20 20 20 53 52 54 5f 45 78 63 65 70 74  *     SRT_Except
220c0 20 20 20 20 20 20 52 65 6d 6f 76 65 20 72 65 73        Remove res
220d0 75 6c 74 73 20 66 72 6f 6d 20 74 68 65 20 74 65  ults from the te
220e0 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 70 44  mporary table pD
220f0 65 73 74 2d 3e 69 53 44 50 61 72 6d 2e 0a 2a 2a  est->iSDParm..**
22100 0a 2a 2a 20 20 20 20 20 53 52 54 5f 54 61 62 6c  .**     SRT_Tabl
22110 65 20 20 20 20 20 20 20 53 74 6f 72 65 20 72 65  e       Store re
22120 73 75 6c 74 73 20 69 6e 20 74 65 6d 70 6f 72 61  sults in tempora
22130 72 79 20 74 61 62 6c 65 20 70 44 65 73 74 2d 3e  ry table pDest->
22140 69 53 44 50 61 72 6d 2e 0a 2a 2a 20 20 20 20 20  iSDParm..**     
22150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22160 54 68 69 73 20 69 73 20 6c 69 6b 65 20 53 52 54  This is like SRT
22170 5f 45 70 68 65 6d 54 61 62 20 65 78 63 65 70 74  _EphemTab except
22180 20 74 68 61 74 20 74 68 65 20 74 61 62 6c 65 0a   that the table.
22190 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
221a0 20 20 20 20 20 20 20 69 73 20 61 73 73 75 6d 65         is assume
221b0 64 20 74 6f 20 61 6c 72 65 61 64 79 20 62 65 20  d to already be 
221c0 6f 70 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  open..**.**     
221d0 53 52 54 5f 45 70 68 65 6d 54 61 62 20 20 20 20  SRT_EphemTab    
221e0 43 72 65 61 74 65 20 61 6e 20 74 65 6d 70 6f 72  Create an tempor
221f0 61 72 79 20 74 61 62 6c 65 20 70 44 65 73 74 2d  ary table pDest-
22200 3e 69 53 44 50 61 72 6d 20 61 6e 64 20 73 74 6f  >iSDParm and sto
22210 72 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  re.**           
22220 20 20 20 20 20 20 20 20 20 20 74 68 65 20 72 65            the re
22230 73 75 6c 74 20 74 68 65 72 65 2e 20 54 68 65 20  sult there. The 
22240 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20 6f  cursor is left o
22250 70 65 6e 20 61 66 74 65 72 0a 2a 2a 20 20 20 20  pen after.**    
22260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22270 20 72 65 74 75 72 6e 69 6e 67 2e 20 20 54 68 69   returning.  Thi
22280 73 20 69 73 20 6c 69 6b 65 20 53 52 54 5f 54 61  s is like SRT_Ta
22290 62 6c 65 20 65 78 63 65 70 74 20 74 68 61 74 0a  ble except that.
222a0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
222b0 20 20 20 20 20 20 20 74 68 69 73 20 64 65 73 74         this dest
222c0 69 6e 61 74 69 6f 6e 20 75 73 65 73 20 4f 50 5f  ination uses OP_
222d0 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 74 6f  OpenEphemeral to
222e0 20 63 72 65 61 74 65 0a 2a 2a 20 20 20 20 20 20   create.**      
222f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
22300 68 65 20 74 61 62 6c 65 20 66 69 72 73 74 2e 0a  he table first..
22310 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 43 6f  **.**     SRT_Co
22320 72 6f 75 74 69 6e 65 20 20 20 47 65 6e 65 72 61  routine   Genera
22330 74 65 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20  te a co-routine 
22340 74 68 61 74 20 72 65 74 75 72 6e 73 20 61 20 6e  that returns a n
22350 65 77 20 72 6f 77 20 6f 66 0a 2a 2a 20 20 20 20  ew row of.**    
22360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22370 20 72 65 73 75 6c 74 73 20 65 61 63 68 20 74 69   results each ti
22380 6d 65 20 69 74 20 69 73 20 69 6e 76 6f 6b 65 64  me it is invoked
22390 2e 20 20 54 68 65 20 65 6e 74 72 79 20 70 6f 69  .  The entry poi
223a0 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  nt.**           
223b0 20 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65            of the
223c0 20 63 6f 2d 72 6f 75 74 69 6e 65 20 69 73 20 73   co-routine is s
223d0 74 6f 72 65 64 20 69 6e 20 72 65 67 69 73 74 65  tored in registe
223e0 72 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d  r pDest->iSDParm
223f0 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f  ..**.**     SRT_
22400 45 78 69 73 74 73 20 20 20 20 20 20 53 74 6f 72  Exists      Stor
22410 65 20 61 20 31 20 69 6e 20 6d 65 6d 6f 72 79 20  e a 1 in memory 
22420 63 65 6c 6c 20 70 44 65 73 74 2d 3e 69 53 44 50  cell pDest->iSDP
22430 61 72 6d 20 69 66 20 74 68 65 20 72 65 73 75 6c  arm if the resul
22440 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
22450 20 20 20 20 20 20 20 20 20 73 65 74 20 69 73 20           set is 
22460 6e 6f 74 20 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a  not empty..**.**
22470 20 20 20 20 20 53 52 54 5f 44 69 73 63 61 72 64       SRT_Discard
22480 20 20 20 20 20 54 68 72 6f 77 20 74 68 65 20 72       Throw the r
22490 65 73 75 6c 74 73 20 61 77 61 79 2e 20 20 54 68  esults away.  Th
224a0 69 73 20 69 73 20 75 73 65 64 20 62 79 20 53 45  is is used by SE
224b0 4c 45 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 20  LECT.**         
224c0 20 20 20 20 20 20 20 20 20 20 20 20 73 74 61 74              stat
224d0 65 6d 65 6e 74 73 20 77 69 74 68 69 6e 20 74 72  ements within tr
224e0 69 67 67 65 72 73 20 77 68 6f 73 65 20 6f 6e 6c  iggers whose onl
224f0 79 20 70 75 72 70 6f 73 65 20 69 73 0a 2a 2a 20  y purpose is.** 
22500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22510 20 20 20 20 74 68 65 20 73 69 64 65 2d 65 66 66      the side-eff
22520 65 63 74 73 20 6f 66 20 66 75 6e 63 74 69 6f 6e  ects of function
22530 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
22540 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68  utine returns th
22550 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f  e number of erro
22560 72 73 2e 20 20 49 66 20 61 6e 79 20 65 72 72 6f  rs.  If any erro
22570 72 73 20 61 72 65 0a 2a 2a 20 65 6e 63 6f 75 6e  rs are.** encoun
22580 74 65 72 65 64 2c 20 74 68 65 6e 20 61 6e 20 61  tered, then an a
22590 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72  ppropriate error
225a0 20 6d 65 73 73 61 67 65 20 69 73 20 6c 65 66 74   message is left
225b0 20 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2d 3e 7a   in.** pParse->z
225c0 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  ErrMsg..**.** Th
225d0 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20  is routine does 
225e0 4e 4f 54 20 66 72 65 65 20 74 68 65 20 53 65 6c  NOT free the Sel
225f0 65 63 74 20 73 74 72 75 63 74 75 72 65 20 70 61  ect structure pa
22600 73 73 65 64 20 69 6e 2e 20 20 54 68 65 0a 2a 2a  ssed in.  The.**
22610 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   calling functio
22620 6e 20 6e 65 65 64 73 20 74 6f 20 64 6f 20 74 68  n needs to do th
22630 61 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  at..*/.int sqlit
22640 65 33 53 65 6c 65 63 74 28 0a 20 20 50 61 72 73  e3Select(.  Pars
22650 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
22660 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72     /* The parser
22670 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
22680 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
22690 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45       /* The SELE
226a0 43 54 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69  CT statement bei
226b0 6e 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 53  ng coded. */.  S
226c0 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74  electDest *pDest
226d0 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f        /* What to
226e0 20 64 6f 20 77 69 74 68 20 74 68 65 20 71 75 65   do with the que
226f0 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b  ry results */.){
22700 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20  .  int i, j;    
22710 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
22720 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20  p counters */.  
22730 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
22740 6f 3b 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e  o;     /* Return
22750 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 57 68 65   from sqlite3Whe
22760 72 65 42 65 67 69 6e 28 29 20 2a 2f 0a 20 20 56  reBegin() */.  V
22770 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20  dbe *v;         
22780 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76 69 72        /* The vir
22790 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 75 6e 64  tual machine und
227a0 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  er construction 
227b0 2a 2f 0a 20 20 69 6e 74 20 69 73 41 67 67 3b 20  */.  int isAgg; 
227c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
227d0 72 75 65 20 66 6f 72 20 73 65 6c 65 63 74 20 6c  rue for select l
227e0 69 73 74 73 20 6c 69 6b 65 20 22 63 6f 75 6e 74  ists like "count
227f0 28 2a 29 22 20 2a 2f 0a 20 20 45 78 70 72 4c 69  (*)" */.  ExprLi
22800 73 74 20 2a 70 45 4c 69 73 74 3b 20 20 20 20 20  st *pEList;     
22810 20 2f 2a 20 4c 69 73 74 20 6f 66 20 63 6f 6c 75   /* List of colu
22820 6d 6e 73 20 74 6f 20 65 78 74 72 61 63 74 2e 20  mns to extract. 
22830 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  */.  SrcList *pT
22840 61 62 4c 69 73 74 3b 20 20 20 20 20 2f 2a 20 4c  abList;     /* L
22850 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 74 6f  ist of tables to
22860 20 73 65 6c 65 63 74 20 66 72 6f 6d 20 2a 2f 0a   select from */.
22870 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 3b 20    Expr *pWhere; 
22880 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
22890 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 4d  WHERE clause.  M
228a0 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ay be NULL */.  
228b0 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
228c0 42 79 3b 20 20 20 20 2f 2a 20 54 68 65 20 4f 52  By;    /* The OR
228d0 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 20 20  DER BY clause.  
228e0 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  May be NULL */. 
228f0 20 45 78 70 72 4c 69 73 74 20 2a 70 47 72 6f 75   ExprList *pGrou
22900 70 42 79 3b 20 20 20 20 2f 2a 20 54 68 65 20 47  pBy;    /* The G
22910 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e 20  ROUP BY clause. 
22920 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a   May be NULL */.
22930 20 20 45 78 70 72 20 2a 70 48 61 76 69 6e 67 3b    Expr *pHaving;
22940 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
22950 48 41 56 49 4e 47 20 63 6c 61 75 73 65 2e 20 20  HAVING clause.  
22960 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  May be NULL */. 
22970 20 69 6e 74 20 72 63 20 3d 20 31 3b 20 20 20 20   int rc = 1;    
22980 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
22990 20 74 6f 20 72 65 74 75 72 6e 20 66 72 6f 6d 20   to return from 
229a0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  this function */
229b0 0a 20 20 69 6e 74 20 61 64 64 72 53 6f 72 74 49  .  int addrSortI
229c0 6e 64 65 78 3b 20 20 20 20 20 2f 2a 20 41 64 64  ndex;     /* Add
229d0 72 65 73 73 20 6f 66 20 61 6e 20 4f 50 5f 4f 70  ress of an OP_Op
229e0 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e 73 74  enEphemeral inst
229f0 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 44 69 73  ruction */.  Dis
22a00 74 69 6e 63 74 43 74 78 20 73 44 69 73 74 69 6e  tinctCtx sDistin
22a10 63 74 3b 20 2f 2a 20 49 6e 66 6f 20 6f 6e 20 68  ct; /* Info on h
22a20 6f 77 20 74 6f 20 63 6f 64 65 20 74 68 65 20 44  ow to code the D
22a30 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20  ISTINCT keyword 
22a40 2a 2f 0a 20 20 41 67 67 49 6e 66 6f 20 73 41 67  */.  AggInfo sAg
22a50 67 49 6e 66 6f 3b 20 20 20 20 20 20 2f 2a 20 49  gInfo;      /* I
22a60 6e 66 6f 72 6d 61 74 69 6f 6e 20 75 73 65 64 20  nformation used 
22a70 62 79 20 61 67 67 72 65 67 61 74 65 20 71 75 65  by aggregate que
22a80 72 69 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 45  ries */.  int iE
22a90 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nd;             
22aa0 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
22ab0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 71 75  he end of the qu
22ac0 65 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ery */.  sqlite3
22ad0 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20   *db;           
22ae0 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
22af0 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a 23  connection */..#
22b00 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
22b10 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 69 6e 74  IT_EXPLAIN.  int
22b20 20 69 52 65 73 74 6f 72 65 53 65 6c 65 63 74 49   iRestoreSelectI
22b30 64 20 3d 20 70 50 61 72 73 65 2d 3e 69 53 65 6c  d = pParse->iSel
22b40 65 63 74 49 64 3b 0a 20 20 70 50 61 72 73 65 2d  ectId;.  pParse-
22b50 3e 69 53 65 6c 65 63 74 49 64 20 3d 20 70 50 61  >iSelectId = pPa
22b60 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74  rse->iNextSelect
22b70 49 64 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  Id++;.#endif..  
22b80 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
22b90 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 64  .  if( p==0 || d
22ba0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
22bb0 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  || pParse->nErr 
22bc0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  ){.    return 1;
22bd0 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74  .  }.  if( sqlit
22be0 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
22bf0 73 65 2c 20 53 51 4c 49 54 45 5f 53 45 4c 45 43  se, SQLITE_SELEC
22c00 54 2c 20 30 2c 20 30 2c 20 30 29 20 29 20 72 65  T, 0, 0, 0) ) re
22c10 74 75 72 6e 20 31 3b 0a 20 20 6d 65 6d 73 65 74  turn 1;.  memset
22c20 28 26 73 41 67 67 49 6e 66 6f 2c 20 30 2c 20 73  (&sAggInfo, 0, s
22c30 69 7a 65 6f 66 28 73 41 67 67 49 6e 66 6f 29 29  izeof(sAggInfo))
22c40 3b 0a 0a 20 20 69 66 28 20 49 67 6e 6f 72 61 62  ;..  if( Ignorab
22c50 6c 65 4f 72 64 65 72 62 79 28 70 44 65 73 74 29  leOrderby(pDest)
22c60 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 70   ){.    assert(p
22c70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54  Dest->eDest==SRT
22c80 5f 45 78 69 73 74 73 20 7c 7c 20 70 44 65 73 74  _Exists || pDest
22c90 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 55 6e 69  ->eDest==SRT_Uni
22ca0 6f 6e 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20  on || .         
22cb0 20 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d    pDest->eDest==
22cc0 53 52 54 5f 45 78 63 65 70 74 20 7c 7c 20 70 44  SRT_Except || pD
22cd0 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
22ce0 44 69 73 63 61 72 64 29 3b 0a 20 20 20 20 2f 2a  Discard);.    /*
22cf0 20 49 66 20 4f 52 44 45 52 20 42 59 20 6d 61 6b   If ORDER BY mak
22d00 65 73 20 6e 6f 20 64 69 66 66 65 72 65 6e 63 65  es no difference
22d10 20 69 6e 20 74 68 65 20 6f 75 74 70 75 74 20 74   in the output t
22d20 68 65 6e 20 6e 65 69 74 68 65 72 20 64 6f 65 73  hen neither does
22d30 0a 20 20 20 20 2a 2a 20 44 49 53 54 49 4e 43 54  .    ** DISTINCT
22d40 20 73 6f 20 69 74 20 63 61 6e 20 62 65 20 72 65   so it can be re
22d50 6d 6f 76 65 64 20 74 6f 6f 2e 20 2a 2f 0a 20 20  moved too. */.  
22d60 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
22d70 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  tDelete(db, p->p
22d80 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 70 2d  OrderBy);.    p-
22d90 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20  >pOrderBy = 0;. 
22da0 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26     p->selFlags &
22db0 3d 20 7e 53 46 5f 44 69 73 74 69 6e 63 74 3b 0a  = ~SF_Distinct;.
22dc0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 65 6c    }.  sqlite3Sel
22dd0 65 63 74 50 72 65 70 28 70 50 61 72 73 65 2c 20  ectPrep(pParse, 
22de0 70 2c 20 30 29 3b 0a 20 20 70 4f 72 64 65 72 42  p, 0);.  pOrderB
22df0 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b  y = p->pOrderBy;
22e00 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d  .  pTabList = p-
22e10 3e 70 53 72 63 3b 0a 20 20 70 45 4c 69 73 74 20  >pSrc;.  pEList 
22e20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 69  = p->pEList;.  i
22e30 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
22e40 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
22e50 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  led ){.    goto 
22e60 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a  select_end;.  }.
22e70 20 20 69 73 41 67 67 20 3d 20 28 70 2d 3e 73 65    isAgg = (p->se
22e80 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67 67 72  lFlags & SF_Aggr
22e90 65 67 61 74 65 29 21 3d 30 3b 0a 20 20 61 73 73  egate)!=0;.  ass
22ea0 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20 29  ert( pEList!=0 )
22eb0 3b 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 67 65  ;..  /* Begin ge
22ec0 6e 65 72 61 74 69 6e 67 20 63 6f 64 65 2e 0a 20  nerating code.. 
22ed0 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65   */.  v = sqlite
22ee0 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
22ef0 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 67  ;.  if( v==0 ) g
22f00 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
22f10 0a 20 20 2f 2a 20 49 66 20 77 72 69 74 69 6e 67  .  /* If writing
22f20 20 74 6f 20 6d 65 6d 6f 72 79 20 6f 72 20 67 65   to memory or ge
22f30 6e 65 72 61 74 69 6e 67 20 61 20 73 65 74 0a 20  nerating a set. 
22f40 20 2a 2a 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c   ** only a singl
22f50 65 20 63 6f 6c 75 6d 6e 20 6d 61 79 20 62 65 20  e column may be 
22f60 6f 75 74 70 75 74 2e 0a 20 20 2a 2f 0a 23 69 66  output..  */.#if
22f70 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
22f80 5f 53 55 42 51 55 45 52 59 0a 20 20 69 66 28 20  _SUBQUERY.  if( 
22f90 63 68 65 63 6b 46 6f 72 4d 75 6c 74 69 43 6f 6c  checkForMultiCol
22fa0 75 6d 6e 53 65 6c 65 63 74 45 72 72 6f 72 28 70  umnSelectError(p
22fb0 50 61 72 73 65 2c 20 70 44 65 73 74 2c 20 70 45  Parse, pDest, pE
22fc0 4c 69 73 74 2d 3e 6e 45 78 70 72 29 20 29 7b 0a  List->nExpr) ){.
22fd0 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
22fe0 65 6e 64 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  end;.  }.#endif.
22ff0 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63  .  /* Generate c
23000 6f 64 65 20 66 6f 72 20 61 6c 6c 20 73 75 62 2d  ode for all sub-
23010 71 75 65 72 69 65 73 20 69 6e 20 74 68 65 20 46  queries in the F
23020 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a  ROM clause.  */.
23030 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
23040 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
23050 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  Y) || !defined(S
23060 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
23070 0a 20 20 66 6f 72 28 69 3d 30 3b 20 21 70 2d 3e  .  for(i=0; !p->
23080 70 50 72 69 6f 72 20 26 26 20 69 3c 70 54 61 62  pPrior && i<pTab
23090 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29  List->nSrc; i++)
230a0 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63  {.    struct Src
230b0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
230c0 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b   = &pTabList->a[
230d0 69 5d 3b 0a 20 20 20 20 53 65 6c 65 63 74 44 65  i];.    SelectDe
230e0 73 74 20 64 65 73 74 3b 0a 20 20 20 20 53 65 6c  st dest;.    Sel
230f0 65 63 74 20 2a 70 53 75 62 20 3d 20 70 49 74 65  ect *pSub = pIte
23100 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20  m->pSelect;.    
23110 69 6e 74 20 69 73 41 67 67 53 75 62 3b 0a 0a 20  int isAggSub;.. 
23120 20 20 20 69 66 28 20 70 53 75 62 3d 3d 30 20 29     if( pSub==0 )
23130 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20   continue;..    
23140 2f 2a 20 53 6f 6d 65 74 69 6d 65 73 20 74 68 65  /* Sometimes the
23150 20 63 6f 64 65 20 66 6f 72 20 61 20 73 75 62 71   code for a subq
23160 75 65 72 79 20 77 69 6c 6c 20 62 65 20 67 65 6e  uery will be gen
23170 65 72 61 74 65 64 20 6d 6f 72 65 20 74 68 61 6e  erated more than
23180 0a 20 20 20 20 2a 2a 20 6f 6e 63 65 2c 20 69 66  .    ** once, if
23190 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73   the subquery is
231a0 20 70 61 72 74 20 6f 66 20 74 68 65 20 57 48 45   part of the WHE
231b0 52 45 20 63 6c 61 75 73 65 20 69 6e 20 61 20 4c  RE clause in a L
231c0 45 46 54 20 4a 4f 49 4e 2c 0a 20 20 20 20 2a 2a  EFT JOIN,.    **
231d0 20 66 6f 72 20 65 78 61 6d 70 6c 65 2e 20 20 49   for example.  I
231e0 6e 20 74 68 61 74 20 63 61 73 65 2c 20 64 6f 20  n that case, do 
231f0 6e 6f 74 20 72 65 67 65 6e 65 72 61 74 65 20 74  not regenerate t
23200 68 65 20 63 6f 64 65 20 74 6f 20 6d 61 6e 69 66  he code to manif
23210 65 73 74 0a 20 20 20 20 2a 2a 20 61 20 76 69 65  est.    ** a vie
23220 77 20 6f 72 20 74 68 65 20 63 6f 2d 72 6f 75 74  w or the co-rout
23230 69 6e 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  ine to implement
23240 20 61 20 76 69 65 77 2e 20 20 54 68 65 20 66 69   a view.  The fi
23250 72 73 74 20 69 6e 73 74 61 6e 63 65 0a 20 20 20  rst instance.   
23260 20 2a 2a 20 69 73 20 73 75 66 66 69 63 69 65 6e   ** is sufficien
23270 74 2c 20 74 68 6f 75 67 68 20 74 68 65 20 73 75  t, though the su
23280 62 72 6f 75 74 69 6e 65 20 74 6f 20 6d 61 6e 69  broutine to mani
23290 66 65 73 74 20 74 68 65 20 76 69 65 77 20 64 6f  fest the view do
232a0 65 73 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20 74  es need.    ** t
232b0 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20 61 67 61  o be invoked aga
232c0 69 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  in. */.    if( p
232d0 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75  Item->addrFillSu
232e0 62 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  b ){.      if( p
232f0 49 74 65 6d 2d 3e 76 69 61 43 6f 72 6f 75 74 69  Item->viaCorouti
23300 6e 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ne==0 ){.       
23310 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
23320 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
23330 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e  pItem->regReturn
23340 2c 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c  , pItem->addrFil
23350 6c 53 75 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20  lSub);.      }. 
23360 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
23370 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e 63     }..    /* Inc
23380 72 65 6d 65 6e 74 20 50 61 72 73 65 2e 6e 48 65  rement Parse.nHe
23390 69 67 68 74 20 62 79 20 74 68 65 20 68 65 69 67  ight by the heig
233a0 68 74 20 6f 66 20 74 68 65 20 6c 61 72 67 65 73  ht of the larges
233b0 74 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 20  t expression.   
233c0 20 2a 2a 20 74 72 65 65 20 72 65 66 65 72 72 65   ** tree referre
233d0 64 20 74 6f 20 62 79 20 74 68 69 73 2c 20 74 68  d to by this, th
233e0 65 20 70 61 72 65 6e 74 20 73 65 6c 65 63 74 2e  e parent select.
233f0 20 54 68 65 20 63 68 69 6c 64 20 73 65 6c 65 63   The child selec
23400 74 0a 20 20 20 20 2a 2a 20 6d 61 79 20 63 6f 6e  t.    ** may con
23410 74 61 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  tain expression 
23420 74 72 65 65 73 20 6f 66 20 61 74 20 6d 6f 73 74  trees of at most
23430 0a 20 20 20 20 2a 2a 20 28 53 51 4c 49 54 45 5f  .    ** (SQLITE_
23440 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48 2d 50  MAX_EXPR_DEPTH-P
23450 61 72 73 65 2e 6e 48 65 69 67 68 74 29 20 68 65  arse.nHeight) he
23460 69 67 68 74 2e 20 54 68 69 73 20 69 73 20 61 20  ight. This is a 
23470 62 69 74 0a 20 20 20 20 2a 2a 20 6d 6f 72 65 20  bit.    ** more 
23480 63 6f 6e 73 65 72 76 61 74 69 76 65 20 74 68 61  conservative tha
23490 6e 20 6e 65 63 65 73 73 61 72 79 2c 20 62 75 74  n necessary, but
234a0 20 6d 75 63 68 20 65 61 73 69 65 72 20 74 68 61   much easier tha
234b0 6e 20 65 6e 66 6f 72 63 69 6e 67 0a 20 20 20 20  n enforcing.    
234c0 2a 2a 20 61 6e 20 65 78 61 63 74 20 6c 69 6d 69  ** an exact limi
234d0 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50  t..    */.    pP
234e0 61 72 73 65 2d 3e 6e 48 65 69 67 68 74 20 2b 3d  arse->nHeight +=
234f0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78   sqlite3SelectEx
23500 70 72 48 65 69 67 68 74 28 70 29 3b 0a 0a 20 20  prHeight(p);..  
23510 20 20 69 73 41 67 67 53 75 62 20 3d 20 28 70 53    isAggSub = (pS
23520 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  ub->selFlags & S
23530 46 5f 41 67 67 72 65 67 61 74 65 29 21 3d 30 3b  F_Aggregate)!=0;
23540 0a 20 20 20 20 69 66 28 20 66 6c 61 74 74 65 6e  .    if( flatten
23550 53 75 62 71 75 65 72 79 28 70 50 61 72 73 65 2c  Subquery(pParse,
23560 20 70 2c 20 69 2c 20 69 73 41 67 67 2c 20 69 73   p, i, isAgg, is
23570 41 67 67 53 75 62 29 20 29 7b 0a 20 20 20 20 20  AggSub) ){.     
23580 20 2f 2a 20 54 68 69 73 20 73 75 62 71 75 65 72   /* This subquer
23590 79 20 63 61 6e 20 62 65 20 61 62 73 6f 72 62 65  y can be absorbe
235a0 64 20 69 6e 74 6f 20 69 74 73 20 70 61 72 65 6e  d into its paren
235b0 74 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  t. */.      if( 
235c0 69 73 41 67 67 53 75 62 20 29 7b 0a 20 20 20 20  isAggSub ){.    
235d0 20 20 20 20 69 73 41 67 67 20 3d 20 31 3b 0a 20      isAgg = 1;. 
235e0 20 20 20 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61         p->selFla
235f0 67 73 20 7c 3d 20 53 46 5f 41 67 67 72 65 67 61  gs |= SF_Aggrega
23600 74 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  te;.      }.    
23610 20 20 69 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 65    i = -1;.    }e
23620 6c 73 65 20 69 66 28 20 70 54 61 62 4c 69 73 74  lse if( pTabList
23630 2d 3e 6e 53 72 63 3d 3d 31 20 26 26 20 28 70 2d  ->nSrc==1 && (p-
23640 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 4d  >selFlags & SF_M
23650 61 74 65 72 69 61 6c 69 7a 65 29 3d 3d 30 0a 20  aterialize)==0. 
23660 20 20 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61       && Optimiza
23670 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20  tionEnabled(db, 
23680 53 51 4c 49 54 45 5f 53 75 62 71 43 6f 72 6f 75  SQLITE_SubqCorou
23690 74 69 6e 65 29 0a 20 20 20 20 29 7b 0a 20 20 20  tine).    ){.   
236a0 20 20 20 2f 2a 20 49 6d 70 6c 65 6d 65 6e 74 20     /* Implement 
236b0 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20 74 68 61  a co-routine tha
236c0 74 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 61 20  t will return a 
236d0 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 74 68  single row of th
236e0 65 20 72 65 73 75 6c 74 0a 20 20 20 20 20 20 2a  e result.      *
236f0 2a 20 73 65 74 20 6f 6e 20 65 61 63 68 20 69 6e  * set on each in
23700 76 6f 63 61 74 69 6f 6e 2e 0a 20 20 20 20 20 20  vocation..      
23710 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  */.      int add
23720 72 54 6f 70 3b 0a 20 20 20 20 20 20 69 6e 74 20  rTop;.      int 
23730 61 64 64 72 45 6f 66 3b 0a 20 20 20 20 20 20 70  addrEof;.      p
23740 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 20  Item->regReturn 
23750 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
23760 3b 0a 20 20 20 20 20 20 61 64 64 72 45 6f 66 20  ;.      addrEof 
23770 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
23780 3b 0a 20 20 20 20 20 20 2f 2a 20 42 65 66 6f 72  ;.      /* Befor
23790 65 20 63 6f 64 69 6e 67 20 74 68 65 20 4f 50 5f  e coding the OP_
237a0 47 6f 74 6f 20 74 6f 20 6a 75 6d 70 20 74 6f 20  Goto to jump to 
237b0 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
237c0 20 6d 61 69 6e 20 72 6f 75 74 69 6e 65 2c 0a 20   main routine,. 
237d0 20 20 20 20 20 2a 2a 20 65 6e 73 75 72 65 20 74       ** ensure t
237e0 68 61 74 20 74 68 65 20 6a 75 6d 70 20 74 6f 20  hat the jump to 
237f0 74 68 65 20 76 65 72 69 66 79 2d 73 63 68 65 6d  the verify-schem
23800 61 20 72 6f 75 74 69 6e 65 20 68 61 73 20 61 6c  a routine has al
23810 72 65 61 64 79 0a 20 20 20 20 20 20 2a 2a 20 62  ready.      ** b
23820 65 65 6e 20 63 6f 64 65 64 2e 20 4f 74 68 65 72  een coded. Other
23830 77 69 73 65 2c 20 74 68 65 20 76 65 72 69 66 79  wise, the verify
23840 2d 73 63 68 65 6d 61 20 77 6f 75 6c 64 20 6c 69  -schema would li
23850 6b 65 6c 79 20 62 65 20 63 6f 64 65 64 20 61 73  kely be coded as
23860 20 0a 20 20 20 20 20 20 2a 2a 20 70 61 72 74 20   .      ** part 
23870 6f 66 20 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e  of the co-routin
23880 65 2e 20 49 66 20 74 68 65 20 6d 61 69 6e 20 72  e. If the main r
23890 6f 75 74 69 6e 65 20 74 68 65 6e 20 61 63 63 65  outine then acce
238a0 73 73 65 64 20 74 68 65 20 0a 20 20 20 20 20 20  ssed the .      
238b0 2a 2a 20 64 61 74 61 62 61 73 65 20 62 65 66 6f  ** database befo
238c0 72 65 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20  re invoking the 
238d0 63 6f 2d 72 6f 75 74 69 6e 65 20 66 6f 72 20 74  co-routine for t
238e0 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 28 66  he first time (f
238f0 6f 72 20 0a 20 20 20 20 20 20 2a 2a 20 65 78 61  or .      ** exa
23900 6d 70 6c 65 20 74 6f 20 69 6e 69 74 69 61 6c 69  mple to initiali
23910 7a 65 20 61 20 4c 49 4d 49 54 20 72 65 67 69 73  ze a LIMIT regis
23920 74 65 72 20 66 72 6f 6d 20 61 20 73 75 62 2d 73  ter from a sub-s
23930 65 6c 65 63 74 29 2c 20 69 74 20 77 6f 75 6c 64  elect), it would
23940 20 0a 20 20 20 20 20 20 2a 2a 20 62 65 20 64 6f   .      ** be do
23950 69 6e 67 20 73 6f 20 77 69 74 68 6f 75 74 20 68  ing so without h
23960 61 76 69 6e 67 20 76 65 72 69 66 69 65 64 20 74  aving verified t
23970 68 65 20 73 63 68 65 6d 61 20 76 65 72 73 69 6f  he schema versio
23980 6e 20 61 6e 64 20 6f 62 74 61 69 6e 65 64 20 0a  n and obtained .
23990 20 20 20 20 20 20 2a 2a 20 74 68 65 20 72 65 71        ** the req
239a0 75 69 72 65 64 20 64 62 20 6c 6f 63 6b 73 2e 20  uired db locks. 
239b0 53 65 65 20 74 69 63 6b 65 74 20 64 36 62 33 36  See ticket d6b36
239c0 62 65 33 38 2e 20 20 2a 2f 0a 20 20 20 20 20 20  be38.  */.      
239d0 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
239e0 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20  ySchema(pParse, 
239f0 2d 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  -1);.      sqlit
23a00 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20  e3VdbeAddOp0(v, 
23a10 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20 20 20 20 20  OP_Goto);.      
23a20 61 64 64 72 54 6f 70 20 3d 20 73 71 6c 69 74 65  addrTop = sqlite
23a30 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
23a40 50 5f 4f 70 65 6e 50 73 65 75 64 6f 2c 20 70 49  P_OpenPseudo, pI
23a50 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20  tem->iCursor);. 
23a60 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
23a70 43 68 61 6e 67 65 50 35 28 76 2c 20 31 29 3b 0a  ChangeP5(v, 1);.
23a80 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
23a90 74 28 28 76 2c 20 22 63 6f 72 6f 75 74 69 6e 65  t((v, "coroutine
23aa0 20 66 6f 72 20 25 73 22 2c 20 70 49 74 65 6d 2d   for %s", pItem-
23ab0 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a  >pTab->zName));.
23ac0 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 61 64 64        pItem->add
23ad0 72 46 69 6c 6c 53 75 62 20 3d 20 61 64 64 72 54  rFillSub = addrT
23ae0 6f 70 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  op;.      sqlite
23af0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
23b00 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 61 64  P_Integer, 0, ad
23b10 64 72 45 6f 66 29 3b 0a 20 20 20 20 20 20 73 71  drEof);.      sq
23b20 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
23b30 35 28 76 2c 20 31 29 3b 0a 20 20 20 20 20 20 73  5(v, 1);.      s
23b40 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74  qlite3SelectDest
23b50 49 6e 69 74 28 26 64 65 73 74 2c 20 53 52 54 5f  Init(&dest, SRT_
23b60 43 6f 72 6f 75 74 69 6e 65 2c 20 70 49 74 65 6d  Coroutine, pItem
23b70 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a 20 20  ->regReturn);.  
23b80 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e      explainSetIn
23b90 74 65 67 65 72 28 70 49 74 65 6d 2d 3e 69 53 65  teger(pItem->iSe
23ba0 6c 65 63 74 49 64 2c 20 28 75 38 29 70 50 61 72  lectId, (u8)pPar
23bb0 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49  se->iNextSelectI
23bc0 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  d);.      sqlite
23bd0 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
23be0 70 53 75 62 2c 20 26 64 65 73 74 29 3b 0a 20 20  pSub, &dest);.  
23bf0 20 20 20 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d      pItem->pTab-
23c00 3e 6e 52 6f 77 45 73 74 20 3d 20 28 75 6e 73 69  >nRowEst = (unsi
23c10 67 6e 65 64 29 70 53 75 62 2d 3e 6e 53 65 6c 65  gned)pSub->nSele
23c20 63 74 52 6f 77 3b 0a 20 20 20 20 20 20 70 49 74  ctRow;.      pIt
23c30 65 6d 2d 3e 76 69 61 43 6f 72 6f 75 74 69 6e 65  em->viaCoroutine
23c40 20 3d 20 31 3b 0a 20 20 20 20 20 20 73 71 6c 69   = 1;.      sqli
23c50 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28  te3VdbeChangeP2(
23c60 76 2c 20 61 64 64 72 54 6f 70 2c 20 64 65 73 74  v, addrTop, dest
23c70 2e 69 53 64 73 74 29 3b 0a 20 20 20 20 20 20 73  .iSdst);.      s
23c80 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
23c90 50 33 28 76 2c 20 61 64 64 72 54 6f 70 2c 20 64  P3(v, addrTop, d
23ca0 65 73 74 2e 6e 53 64 73 74 29 3b 0a 20 20 20 20  est.nSdst);.    
23cb0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
23cc0 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
23cd0 72 2c 20 31 2c 20 61 64 64 72 45 6f 66 29 3b 0a  r, 1, addrEof);.
23ce0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
23cf0 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69  eAddOp1(v, OP_Yi
23d00 65 6c 64 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52  eld, pItem->regR
23d10 65 74 75 72 6e 29 3b 0a 20 20 20 20 20 20 56 64  eturn);.      Vd
23d20 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65  beComment((v, "e
23d30 6e 64 20 25 73 22 2c 20 70 49 74 65 6d 2d 3e 70  nd %s", pItem->p
23d40 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20  Tab->zName));.  
23d50 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
23d60 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 54  umpHere(v, addrT
23d70 6f 70 2d 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  op-1);.      sql
23d80 69 74 65 33 43 6c 65 61 72 54 65 6d 70 52 65 67  ite3ClearTempReg
23d90 43 61 63 68 65 28 70 50 61 72 73 65 29 3b 0a 20  Cache(pParse);. 
23da0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
23db0 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75  /* Generate a su
23dc0 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 77 69  broutine that wi
23dd0 6c 6c 20 66 69 6c 6c 20 61 6e 20 65 70 68 65 6d  ll fill an ephem
23de0 65 72 61 6c 20 74 61 62 6c 65 20 77 69 74 68 0a  eral table with.
23df0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 6f 6e        ** the con
23e00 74 65 6e 74 20 6f 66 20 74 68 69 73 20 73 75 62  tent of this sub
23e10 71 75 65 72 79 2e 20 20 70 49 74 65 6d 2d 3e 61  query.  pItem->a
23e20 64 64 72 46 69 6c 6c 53 75 62 20 77 69 6c 6c 20  ddrFillSub will 
23e30 70 6f 69 6e 74 0a 20 20 20 20 20 20 2a 2a 20 74  point.      ** t
23e40 6f 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66  o the address of
23e50 20 74 68 65 20 67 65 6e 65 72 61 74 65 64 20 73   the generated s
23e60 75 62 72 6f 75 74 69 6e 65 2e 20 20 70 49 74 65  ubroutine.  pIte
23e70 6d 2d 3e 72 65 67 52 65 74 75 72 6e 0a 20 20 20  m->regReturn.   
23e80 20 20 20 2a 2a 20 69 73 20 61 20 72 65 67 69 73     ** is a regis
23e90 74 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 74 6f  ter allocated to
23ea0 20 68 6f 6c 64 20 74 68 65 20 73 75 62 72 6f 75   hold the subrou
23eb0 74 69 6e 65 20 72 65 74 75 72 6e 20 61 64 64 72  tine return addr
23ec0 65 73 73 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ess.      */.   
23ed0 20 20 20 69 6e 74 20 74 6f 70 41 64 64 72 3b 0a     int topAddr;.
23ee0 20 20 20 20 20 20 69 6e 74 20 6f 6e 63 65 41 64        int onceAd
23ef0 64 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e  dr = 0;.      in
23f00 74 20 72 65 74 41 64 64 72 3b 0a 20 20 20 20 20  t retAddr;.     
23f10 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e   assert( pItem->
23f20 61 64 64 72 46 69 6c 6c 53 75 62 3d 3d 30 20 29  addrFillSub==0 )
23f30 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 72  ;.      pItem->r
23f40 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50 61  egReturn = ++pPa
23f50 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
23f60 20 74 6f 70 41 64 64 72 20 3d 20 73 71 6c 69 74   topAddr = sqlit
23f70 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
23f80 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 70  OP_Integer, 0, p
23f90 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 29  Item->regReturn)
23fa0 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 61  ;.      pItem->a
23fb0 64 64 72 46 69 6c 6c 53 75 62 20 3d 20 74 6f 70  ddrFillSub = top
23fc0 41 64 64 72 2b 31 3b 0a 20 20 20 20 20 20 56 64  Addr+1;.      Vd
23fd0 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76  beNoopComment((v
23fe0 2c 20 22 6d 61 74 65 72 69 61 6c 69 7a 65 20 25  , "materialize %
23ff0 73 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d  s", pItem->pTab-
24000 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20  >zName));.      
24010 69 66 28 20 70 49 74 65 6d 2d 3e 69 73 43 6f 72  if( pItem->isCor
24020 72 65 6c 61 74 65 64 3d 3d 30 20 29 7b 0a 20 20  related==0 ){.  
24030 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
24040 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20  subquery is not 
24050 63 6f 72 72 65 6c 61 74 65 64 20 61 6e 64 20 69  correlated and i
24060 66 20 77 65 20 61 72 65 20 6e 6f 74 20 69 6e 73  f we are not ins
24070 69 64 65 20 6f 66 0a 20 20 20 20 20 20 20 20 2a  ide of.        *
24080 2a 20 61 20 74 72 69 67 67 65 72 2c 20 74 68 65  * a trigger, the
24090 6e 20 77 65 20 6f 6e 6c 79 20 6e 65 65 64 20 74  n we only need t
240a0 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20 76 61  o compute the va
240b0 6c 75 65 20 6f 66 20 74 68 65 20 73 75 62 71 75  lue of the subqu
240c0 65 72 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  ery.        ** o
240d0 6e 63 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  nce. */.        
240e0 6f 6e 63 65 41 64 64 72 20 3d 20 73 71 6c 69 74  onceAddr = sqlit
240f0 65 33 43 6f 64 65 4f 6e 63 65 28 70 50 61 72 73  e3CodeOnce(pPars
24100 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
24110 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
24120 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20 53  estInit(&dest, S
24130 52 54 5f 45 70 68 65 6d 54 61 62 2c 20 70 49 74  RT_EphemTab, pIt
24140 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20  em->iCursor);.  
24150 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e      explainSetIn
24160 74 65 67 65 72 28 70 49 74 65 6d 2d 3e 69 53 65  teger(pItem->iSe
24170 6c 65 63 74 49 64 2c 20 28 75 38 29 70 50 61 72  lectId, (u8)pPar
24180 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49  se->iNextSelectI
24190 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  d);.      sqlite
241a0 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
241b0 70 53 75 62 2c 20 26 64 65 73 74 29 3b 0a 20 20  pSub, &dest);.  
241c0 20 20 20 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d      pItem->pTab-
241d0 3e 6e 52 6f 77 45 73 74 20 3d 20 28 75 6e 73 69  >nRowEst = (unsi
241e0 67 6e 65 64 29 70 53 75 62 2d 3e 6e 53 65 6c 65  gned)pSub->nSele
241f0 63 74 52 6f 77 3b 0a 20 20 20 20 20 20 69 66 28  ctRow;.      if(
24200 20 6f 6e 63 65 41 64 64 72 20 29 20 73 71 6c 69   onceAddr ) sqli
24210 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
24220 76 2c 20 6f 6e 63 65 41 64 64 72 29 3b 0a 20 20  v, onceAddr);.  
24230 20 20 20 20 72 65 74 41 64 64 72 20 3d 20 73 71      retAddr = sq
24240 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
24250 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 70 49  v, OP_Return, pI
24260 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b  tem->regReturn);
24270 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
24280 6e 74 28 28 76 2c 20 22 65 6e 64 20 25 73 22 2c  nt((v, "end %s",
24290 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e   pItem->pTab->zN
242a0 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  ame));.      sql
242b0 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 31  ite3VdbeChangeP1
242c0 28 76 2c 20 74 6f 70 41 64 64 72 2c 20 72 65 74  (v, topAddr, ret
242d0 41 64 64 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  Addr);.      sql
242e0 69 74 65 33 43 6c 65 61 72 54 65 6d 70 52 65 67  ite3ClearTempReg
242f0 43 61 63 68 65 28 70 50 61 72 73 65 29 3b 0a 20  Cache(pParse);. 
24300 20 20 20 7d 0a 20 20 20 20 69 66 28 20 2f 2a 70     }.    if( /*p
24310 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 2a 2f  Parse->nErr ||*/
24320 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
24330 64 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  d ){.      goto 
24340 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
24350 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 48  }.    pParse->nH
24360 65 69 67 68 74 20 2d 3d 20 73 71 6c 69 74 65 33  eight -= sqlite3
24370 53 65 6c 65 63 74 45 78 70 72 48 65 69 67 68 74  SelectExprHeight
24380 28 70 29 3b 0a 20 20 20 20 70 54 61 62 4c 69 73  (p);.    pTabLis
24390 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20  t = p->pSrc;.   
243a0 20 69 66 28 20 21 49 67 6e 6f 72 61 62 6c 65 4f   if( !IgnorableO
243b0 72 64 65 72 62 79 28 70 44 65 73 74 29 20 29 7b  rderby(pDest) ){
243c0 0a 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 20  .      pOrderBy 
243d0 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20  = p->pOrderBy;. 
243e0 20 20 20 7d 0a 20 20 7d 0a 20 20 70 45 4c 69 73     }.  }.  pELis
243f0 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 23  t = p->pEList;.#
24400 65 6e 64 69 66 0a 20 20 70 57 68 65 72 65 20 3d  endif.  pWhere =
24410 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20 70 47   p->pWhere;.  pG
24420 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f  roupBy = p->pGro
24430 75 70 42 79 3b 0a 20 20 70 48 61 76 69 6e 67 20  upBy;.  pHaving 
24440 3d 20 70 2d 3e 70 48 61 76 69 6e 67 3b 0a 20 20  = p->pHaving;.  
24450 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74  sDistinct.isTnct
24460 20 3d 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20   = (p->selFlags 
24470 26 20 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d  & SF_Distinct)!=
24480 30 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  0;..#ifndef SQLI
24490 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  TE_OMIT_COMPOUND
244a0 5f 53 45 4c 45 43 54 0a 20 20 2f 2a 20 49 66 20  _SELECT.  /* If 
244b0 74 68 65 72 65 20 69 73 20 61 72 65 20 61 20 73  there is are a s
244c0 65 71 75 65 6e 63 65 20 6f 66 20 71 75 65 72 69  equence of queri
244d0 65 73 2c 20 64 6f 20 74 68 65 20 65 61 72 6c 69  es, do the earli
244e0 65 72 20 6f 6e 65 73 20 66 69 72 73 74 2e 0a 20  er ones first.. 
244f0 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72   */.  if( p->pPr
24500 69 6f 72 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ior ){.    if( p
24510 2d 3e 70 52 69 67 68 74 6d 6f 73 74 3d 3d 30 20  ->pRightmost==0 
24520 29 7b 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20  ){.      Select 
24530 2a 70 4c 6f 6f 70 2c 20 2a 70 52 69 67 68 74 20  *pLoop, *pRight 
24540 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 63  = 0;.      int c
24550 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e  nt = 0;.      in
24560 74 20 6d 78 53 65 6c 65 63 74 3b 0a 20 20 20 20  t mxSelect;.    
24570 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 3b 20 70    for(pLoop=p; p
24580 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f  Loop; pLoop=pLoo
24590 70 2d 3e 70 50 72 69 6f 72 2c 20 63 6e 74 2b 2b  p->pPrior, cnt++
245a0 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70  ){.        pLoop
245b0 2d 3e 70 52 69 67 68 74 6d 6f 73 74 20 3d 20 70  ->pRightmost = p
245c0 3b 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d  ;.        pLoop-
245d0 3e 70 4e 65 78 74 20 3d 20 70 52 69 67 68 74 3b  >pNext = pRight;
245e0 0a 20 20 20 20 20 20 20 20 70 52 69 67 68 74 20  .        pRight 
245f0 3d 20 70 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 7d  = pLoop;.      }
24600 0a 20 20 20 20 20 20 6d 78 53 65 6c 65 63 74 20  .      mxSelect 
24610 3d 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c  = db->aLimit[SQL
24620 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4d 50 4f 55  ITE_LIMIT_COMPOU
24630 4e 44 5f 53 45 4c 45 43 54 5d 3b 0a 20 20 20 20  ND_SELECT];.    
24640 20 20 69 66 28 20 6d 78 53 65 6c 65 63 74 20 26    if( mxSelect &
24650 26 20 63 6e 74 3e 6d 78 53 65 6c 65 63 74 20 29  & cnt>mxSelect )
24660 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
24670 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
24680 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 74 65 72 6d  , "too many term
24690 73 20 69 6e 20 63 6f 6d 70 6f 75 6e 64 20 53 45  s in compound SE
246a0 4c 45 43 54 22 29 3b 0a 20 20 20 20 20 20 20 20  LECT");.        
246b0 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
246c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
246d0 20 20 20 72 63 20 3d 20 6d 75 6c 74 69 53 65 6c     rc = multiSel
246e0 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 70  ect(pParse, p, p
246f0 44 65 73 74 29 3b 0a 20 20 20 20 65 78 70 6c 61  Dest);.    expla
24700 69 6e 53 65 74 49 6e 74 65 67 65 72 28 70 50 61  inSetInteger(pPa
24710 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20  rse->iSelectId, 
24720 69 52 65 73 74 6f 72 65 53 65 6c 65 63 74 49 64  iRestoreSelectId
24730 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  );.    return rc
24740 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
24750 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 62  /* If there is b
24760 6f 74 68 20 61 20 47 52 4f 55 50 20 42 59 20 61  oth a GROUP BY a
24770 6e 64 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  nd an ORDER BY c
24780 6c 61 75 73 65 20 61 6e 64 20 74 68 65 79 20 61  lause and they a
24790 72 65 0a 20 20 2a 2a 20 69 64 65 6e 74 69 63 61  re.  ** identica
247a0 6c 2c 20 74 68 65 6e 20 64 69 73 61 62 6c 65 20  l, then disable 
247b0 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
247c0 75 73 65 20 73 69 6e 63 65 20 74 68 65 20 47 52  use since the GR
247d0 4f 55 50 20 42 59 0a 20 20 2a 2a 20 77 69 6c 6c  OUP BY.  ** will
247e0 20 63 61 75 73 65 20 65 6c 65 6d 65 6e 74 73 20   cause elements 
247f0 74 6f 20 63 6f 6d 65 20 6f 75 74 20 69 6e 20 74  to come out in t
24800 68 65 20 63 6f 72 72 65 63 74 20 6f 72 64 65 72  he correct order
24810 2e 20 20 54 68 69 73 20 69 73 0a 20 20 2a 2a 20  .  This is.  ** 
24820 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  an optimization 
24830 2d 20 74 68 65 20 63 6f 72 72 65 63 74 20 61 6e  - the correct an
24840 73 77 65 72 20 73 68 6f 75 6c 64 20 72 65 73 75  swer should resu
24850 6c 74 20 72 65 67 61 72 64 6c 65 73 73 2e 0a 20  lt regardless.. 
24860 20 2a 2a 20 55 73 65 20 74 68 65 20 53 51 4c 49   ** Use the SQLI
24870 54 45 5f 47 72 6f 75 70 42 79 4f 72 64 65 72 20  TE_GroupByOrder 
24880 66 6c 61 67 20 77 69 74 68 20 53 51 4c 49 54 45  flag with SQLITE
24890 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49  _TESTCTRL_OPTIMI
248a0 5a 45 52 0a 20 20 2a 2a 20 74 6f 20 64 69 73 61  ZER.  ** to disa
248b0 62 6c 65 20 74 68 69 73 20 6f 70 74 69 6d 69 7a  ble this optimiz
248c0 61 74 69 6f 6e 20 66 6f 72 20 74 65 73 74 69 6e  ation for testin
248d0 67 20 70 75 72 70 6f 73 65 73 2e 0a 20 20 2a 2f  g purposes..  */
248e0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78  .  if( sqlite3Ex
248f0 70 72 4c 69 73 74 43 6f 6d 70 61 72 65 28 70 2d  prListCompare(p-
24900 3e 70 47 72 6f 75 70 42 79 2c 20 70 4f 72 64 65  >pGroupBy, pOrde
24910 72 42 79 29 3d 3d 30 0a 20 20 20 20 20 20 20 20  rBy)==0.        
24920 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e   && Optimization
24930 45 6e 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49  Enabled(db, SQLI
24940 54 45 5f 47 72 6f 75 70 42 79 4f 72 64 65 72 29  TE_GroupByOrder)
24950 20 29 7b 0a 20 20 20 20 70 4f 72 64 65 72 42 79   ){.    pOrderBy
24960 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 0;.  }..  /* 
24970 49 66 20 74 68 65 20 71 75 65 72 79 20 69 73 20  If the query is 
24980 44 49 53 54 49 4e 43 54 20 77 69 74 68 20 61 6e  DISTINCT with an
24990 20 4f 52 44 45 52 20 42 59 20 62 75 74 20 69 73   ORDER BY but is
249a0 20 6e 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74   not an aggregat
249b0 65 2c 20 61 6e 64 20 0a 20 20 2a 2a 20 69 66 20  e, and .  ** if 
249c0 74 68 65 20 73 65 6c 65 63 74 2d 6c 69 73 74 20  the select-list 
249d0 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 74  is the same as t
249e0 68 65 20 4f 52 44 45 52 20 42 59 20 6c 69 73 74  he ORDER BY list
249f0 2c 20 74 68 65 6e 20 74 68 69 73 20 71 75 65 72  , then this quer
24a00 79 0a 20 20 2a 2a 20 63 61 6e 20 62 65 20 72 65  y.  ** can be re
24a10 77 72 69 74 74 65 6e 20 61 73 20 61 20 47 52 4f  written as a GRO
24a20 55 50 20 42 59 2e 20 49 6e 20 6f 74 68 65 72 20  UP BY. In other 
24a30 77 6f 72 64 73 2c 20 74 68 69 73 3a 0a 20 20 2a  words, this:.  *
24a40 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43  *.  **     SELEC
24a50 54 20 44 49 53 54 49 4e 43 54 20 78 79 7a 20 46  T DISTINCT xyz F
24a60 52 4f 4d 20 2e 2e 2e 20 4f 52 44 45 52 20 42 59  ROM ... ORDER BY
24a70 20 78 79 7a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 69   xyz.  **.  ** i
24a80 73 20 74 72 61 6e 73 66 6f 72 6d 65 64 20 74 6f  s transformed to
24a90 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
24aa0 53 45 4c 45 43 54 20 78 79 7a 20 46 52 4f 4d 20  SELECT xyz FROM 
24ab0 2e 2e 2e 20 47 52 4f 55 50 20 42 59 20 78 79 7a  ... GROUP BY xyz
24ac0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 73  .  **.  ** The s
24ad0 65 63 6f 6e 64 20 66 6f 72 6d 20 69 73 20 70 72  econd form is pr
24ae0 65 66 65 72 72 65 64 20 61 73 20 61 20 73 69 6e  eferred as a sin
24af0 67 6c 65 20 69 6e 64 65 78 20 28 6f 72 20 74 65  gle index (or te
24b00 6d 70 2d 74 61 62 6c 65 29 20 6d 61 79 20 62 65  mp-table) may be
24b10 20 0a 20 20 2a 2a 20 75 73 65 64 20 66 6f 72 20   .  ** used for 
24b20 62 6f 74 68 20 74 68 65 20 4f 52 44 45 52 20 42  both the ORDER B
24b30 59 20 61 6e 64 20 44 49 53 54 49 4e 43 54 20 70  Y and DISTINCT p
24b40 72 6f 63 65 73 73 69 6e 67 2e 20 41 73 20 6f 72  rocessing. As or
24b50 69 67 69 6e 61 6c 6c 79 20 0a 20 20 2a 2a 20 77  iginally .  ** w
24b60 72 69 74 74 65 6e 20 74 68 65 20 71 75 65 72 79  ritten the query
24b70 20 6d 75 73 74 20 75 73 65 20 61 20 74 65 6d 70   must use a temp
24b80 2d 74 61 62 6c 65 20 66 6f 72 20 61 74 20 6c 65  -table for at le
24b90 61 73 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 4f  ast one of the O
24ba0 52 44 45 52 20 0a 20 20 2a 2a 20 42 59 20 61 6e  RDER .  ** BY an
24bb0 64 20 44 49 53 54 49 4e 43 54 2c 20 61 6e 64 20  d DISTINCT, and 
24bc0 61 6e 20 69 6e 64 65 78 20 6f 72 20 73 65 70 61  an index or sepa
24bd0 72 61 74 65 20 74 65 6d 70 2d 74 61 62 6c 65 20  rate temp-table 
24be0 66 6f 72 20 74 68 65 20 6f 74 68 65 72 2e 0a 20  for the other.. 
24bf0 20 2a 2f 0a 20 20 69 66 28 20 28 70 2d 3e 73 65   */.  if( (p->se
24c00 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73  lFlags & (SF_Dis
24c10 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61  tinct|SF_Aggrega
24c20 74 65 29 29 3d 3d 53 46 5f 44 69 73 74 69 6e 63  te))==SF_Distinc
24c30 74 20 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33  t .   && sqlite3
24c40 45 78 70 72 4c 69 73 74 43 6f 6d 70 61 72 65 28  ExprListCompare(
24c50 70 4f 72 64 65 72 42 79 2c 20 70 2d 3e 70 45 4c  pOrderBy, p->pEL
24c60 69 73 74 29 3d 3d 30 0a 20 20 29 7b 0a 20 20 20  ist)==0.  ){.   
24c70 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20   p->selFlags &= 
24c80 7e 53 46 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20  ~SF_Distinct;.  
24c90 20 20 70 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20    p->pGroupBy = 
24ca0 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
24cb0 75 70 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74  up(db, p->pEList
24cc0 2c 20 30 29 3b 0a 20 20 20 20 70 47 72 6f 75 70  , 0);.    pGroup
24cd0 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79  By = p->pGroupBy
24ce0 3b 0a 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d  ;.    pOrderBy =
24cf0 20 30 3b 0a 20 20 20 20 2f 2a 20 4e 6f 74 69 63   0;.    /* Notic
24d00 65 20 74 68 61 74 20 65 76 65 6e 20 74 68 6f 75  e that even thou
24d10 67 68 74 20 53 46 5f 44 69 73 74 69 6e 63 74 20  ght SF_Distinct 
24d20 68 61 73 20 62 65 65 6e 20 63 6c 65 61 72 65 64  has been cleared
24d30 20 66 72 6f 6d 20 70 2d 3e 73 65 6c 46 6c 61 67   from p->selFlag
24d40 73 2c 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 44  s,.    ** the sD
24d50 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 69  istinct.isTnct i
24d60 73 20 73 74 69 6c 6c 20 73 65 74 2e 20 20 48 65  s still set.  He
24d70 6e 63 65 2c 20 69 73 54 6e 63 74 20 72 65 70 72  nce, isTnct repr
24d80 65 73 65 6e 74 73 20 74 68 65 0a 20 20 20 20 2a  esents the.    *
24d90 2a 20 6f 72 69 67 69 6e 61 6c 20 73 65 74 74 69  * original setti
24da0 6e 67 20 6f 66 20 74 68 65 20 53 46 5f 44 69 73  ng of the SF_Dis
24db0 74 69 6e 63 74 20 66 6c 61 67 2c 20 6e 6f 74 20  tinct flag, not 
24dc0 74 68 65 20 63 75 72 72 65 6e 74 20 73 65 74 74  the current sett
24dd0 69 6e 67 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ing */.    asser
24de0 74 28 20 73 44 69 73 74 69 6e 63 74 2e 69 73 54  t( sDistinct.isT
24df0 6e 63 74 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  nct );.  }..  /*
24e00 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 20   If there is an 
24e10 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c  ORDER BY clause,
24e20 20 74 68 65 6e 20 74 68 69 73 20 73 6f 72 74 69   then this sorti
24e30 6e 67 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6d 69  ng.  ** index mi
24e40 67 68 74 20 65 6e 64 20 75 70 20 62 65 69 6e 67  ght end up being
24e50 20 75 6e 75 73 65 64 20 69 66 20 74 68 65 20 64   unused if the d
24e60 61 74 61 20 63 61 6e 20 62 65 20 0a 20 20 2a 2a  ata can be .  **
24e70 20 65 78 74 72 61 63 74 65 64 20 69 6e 20 70 72   extracted in pr
24e80 65 2d 73 6f 72 74 65 64 20 6f 72 64 65 72 2e 20  e-sorted order. 
24e90 20 49 66 20 74 68 61 74 20 69 73 20 74 68 65 20   If that is the 
24ea0 63 61 73 65 2c 20 74 68 65 6e 20 74 68 65 0a 20  case, then the. 
24eb0 20 2a 2a 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d   ** OP_OpenEphem
24ec0 65 72 61 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e  eral instruction
24ed0 20 77 69 6c 6c 20 62 65 20 63 68 61 6e 67 65 64   will be changed
24ee0 20 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 20 6f   to an OP_Noop o
24ef0 6e 63 65 0a 20 20 2a 2a 20 77 65 20 66 69 67 75  nce.  ** we figu
24f00 72 65 20 6f 75 74 20 74 68 61 74 20 74 68 65 20  re out that the 
24f10 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 69 73  sorting index is
24f20 20 6e 6f 74 20 6e 65 65 64 65 64 2e 20 20 54 68   not needed.  Th
24f30 65 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78 0a  e addrSortIndex.
24f40 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 20 69 73    ** variable is
24f50 20 75 73 65 64 20 74 6f 20 66 61 63 69 6c 69 74   used to facilit
24f60 61 74 65 20 74 68 61 74 20 63 68 61 6e 67 65 2e  ate that change.
24f70 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64  .  */.  if( pOrd
24f80 65 72 42 79 20 29 7b 0a 20 20 20 20 4b 65 79 49  erBy ){.    KeyI
24f90 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20  nfo *pKeyInfo;. 
24fa0 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65     pKeyInfo = ke
24fb0 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73  yInfoFromExprLis
24fc0 74 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72  t(pParse, pOrder
24fd0 42 79 29 3b 0a 20 20 20 20 70 4f 72 64 65 72 42  By);.    pOrderB
24fe0 79 2d 3e 69 45 43 75 72 73 6f 72 20 3d 20 70 50  y->iECursor = pP
24ff0 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
25000 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68    p->addrOpenEph
25010 6d 5b 32 5d 20 3d 20 61 64 64 72 53 6f 72 74 49  m[2] = addrSortI
25020 6e 64 65 78 20 3d 0a 20 20 20 20 20 20 73 71 6c  ndex =.      sql
25030 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
25040 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
25050 61 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  al,.            
25060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
25070 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f  OrderBy->iECurso
25080 72 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  r, pOrderBy->nEx
25090 70 72 2b 32 2c 20 30 2c 0a 20 20 20 20 20 20 20  pr+2, 0,.       
250a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
250b0 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49      (char*)pKeyI
250c0 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f  nfo, P4_KEYINFO_
250d0 48 41 4e 44 4f 46 46 29 3b 0a 20 20 7d 65 6c 73  HANDOFF);.  }els
250e0 65 7b 0a 20 20 20 20 61 64 64 72 53 6f 72 74 49  e{.    addrSortI
250f0 6e 64 65 78 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a  ndex = -1;.  }..
25100 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 75 74 70    /* If the outp
25110 75 74 20 69 73 20 64 65 73 74 69 6e 65 64 20 66  ut is destined f
25120 6f 72 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74  or a temporary t
25130 61 62 6c 65 2c 20 6f 70 65 6e 20 74 68 61 74 20  able, open that 
25140 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  table..  */.  if
25150 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d  ( pDest->eDest==
25160 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29 7b 0a  SRT_EphemTab ){.
25170 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
25180 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp2(v, OP_Open
25190 45 70 68 65 6d 65 72 61 6c 2c 20 70 44 65 73 74  Ephemeral, pDest
251a0 2d 3e 69 53 44 50 61 72 6d 2c 20 70 45 4c 69 73  ->iSDParm, pELis
251b0 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 7d 0a 0a  t->nExpr);.  }..
251c0 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6c 69 6d    /* Set the lim
251d0 69 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 45 6e  iter..  */.  iEn
251e0 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  d = sqlite3VdbeM
251f0 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 70  akeLabel(v);.  p
25200 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 4c  ->nSelectRow = L
25210 41 52 47 45 53 54 5f 49 4e 54 36 34 3b 0a 20 20  ARGEST_INT64;.  
25220 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69  computeLimitRegi
25230 73 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c  sters(pParse, p,
25240 20 69 45 6e 64 29 3b 0a 20 20 69 66 28 20 70 2d   iEnd);.  if( p-
25250 3e 69 4c 69 6d 69 74 3d 3d 30 20 26 26 20 61 64  >iLimit==0 && ad
25260 64 72 53 6f 72 74 49 6e 64 65 78 3e 3d 30 20 29  drSortIndex>=0 )
25270 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
25280 65 47 65 74 4f 70 28 76 2c 20 61 64 64 72 53 6f  eGetOp(v, addrSo
25290 72 74 49 6e 64 65 78 29 2d 3e 6f 70 63 6f 64 65  rtIndex)->opcode
252a0 20 3d 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e   = OP_SorterOpen
252b0 3b 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67  ;.    p->selFlag
252c0 73 20 7c 3d 20 53 46 5f 55 73 65 53 6f 72 74 65  s |= SF_UseSorte
252d0 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65  r;.  }..  /* Ope
252e0 6e 20 61 20 76 69 72 74 75 61 6c 20 69 6e 64 65  n a virtual inde
252f0 78 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68 65  x to use for the
25300 20 64 69 73 74 69 6e 63 74 20 73 65 74 2e 0a 20   distinct set.. 
25310 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c   */.  if( p->sel
25320 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69  Flags & SF_Disti
25330 6e 63 74 20 29 7b 0a 20 20 20 20 73 44 69 73 74  nct ){.    sDist
25340 69 6e 63 74 2e 74 61 62 54 6e 63 74 20 3d 20 70  inct.tabTnct = p
25350 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
25360 20 20 20 73 44 69 73 74 69 6e 63 74 2e 61 64 64     sDistinct.add
25370 72 54 6e 63 74 20 3d 20 73 71 6c 69 74 65 33 56  rTnct = sqlite3V
25380 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
25390 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 0a 20  OpenEphemeral,. 
253a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
253b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
253c0 44 69 73 74 69 6e 63 74 2e 74 61 62 54 6e 63 74  Distinct.tabTnct
253d0 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  , 0, 0,.        
253e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
253f0 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 6b          (char*)k
25400 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69  eyInfoFromExprLi
25410 73 74 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 45  st(pParse, p->pE
25420 4c 69 73 74 29 2c 0a 20 20 20 20 20 20 20 20 20  List),.         
25430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25440 20 20 20 20 20 20 20 50 34 5f 4b 45 59 49 4e 46         P4_KEYINF
25450 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 20 20  O_HANDOFF);.    
25460 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
25470 65 50 35 28 76 2c 20 42 54 52 45 45 5f 55 4e 4f  eP5(v, BTREE_UNO
25480 52 44 45 52 45 44 29 3b 0a 20 20 20 20 73 44 69  RDERED);.    sDi
25490 73 74 69 6e 63 74 2e 65 54 6e 63 74 54 79 70 65  stinct.eTnctType
254a0 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43   = WHERE_DISTINC
254b0 54 5f 55 4e 4f 52 44 45 52 45 44 3b 0a 20 20 7d  T_UNORDERED;.  }
254c0 65 6c 73 65 7b 0a 20 20 20 20 73 44 69 73 74 69  else{.    sDisti
254d0 6e 63 74 2e 65 54 6e 63 74 54 79 70 65 20 3d 20  nct.eTnctType = 
254e0 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4e  WHERE_DISTINCT_N
254f0 4f 4f 50 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  OOP;.  }..  if( 
25500 21 69 73 41 67 67 20 26 26 20 70 47 72 6f 75 70  !isAgg && pGroup
25510 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  By==0 ){.    /* 
25520 4e 6f 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  No aggregate fun
25530 63 74 69 6f 6e 73 20 61 6e 64 20 6e 6f 20 47 52  ctions and no GR
25540 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  OUP BY clause */
25550 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70  .    ExprList *p
25560 44 69 73 74 20 3d 20 28 73 44 69 73 74 69 6e 63  Dist = (sDistinc
25570 74 2e 69 73 54 6e 63 74 20 3f 20 70 2d 3e 70 45  t.isTnct ? p->pE
25580 4c 69 73 74 20 3a 20 30 29 3b 0a 0a 20 20 20 20  List : 0);..    
25590 2f 2a 20 42 65 67 69 6e 20 74 68 65 20 64 61 74  /* Begin the dat
255a0 61 62 61 73 65 20 73 63 61 6e 2e 20 2a 2f 0a 20  abase scan. */. 
255b0 20 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69     pWInfo = sqli
255c0 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 70 50  te3WhereBegin(pP
255d0 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20  arse, pTabList, 
255e0 70 57 68 65 72 65 2c 20 70 4f 72 64 65 72 42 79  pWhere, pOrderBy
255f0 2c 20 70 44 69 73 74 2c 20 30 2c 30 29 3b 0a 20  , pDist, 0,0);. 
25600 20 20 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30     if( pWInfo==0
25610 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65   ) goto select_e
25620 6e 64 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  nd;.    if( sqli
25630 74 65 33 57 68 65 72 65 4f 75 74 70 75 74 52 6f  te3WhereOutputRo
25640 77 43 6f 75 6e 74 28 70 57 49 6e 66 6f 29 20 3c  wCount(pWInfo) <
25650 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 29   p->nSelectRow )
25660 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65  {.      p->nSele
25670 63 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 57  ctRow = sqlite3W
25680 68 65 72 65 4f 75 74 70 75 74 52 6f 77 43 6f 75  hereOutputRowCou
25690 6e 74 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20  nt(pWInfo);.    
256a0 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  }.    if( sqlite
256b0 33 57 68 65 72 65 49 73 44 69 73 74 69 6e 63 74  3WhereIsDistinct
256c0 28 70 57 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20  (pWInfo) ){.    
256d0 20 20 73 44 69 73 74 69 6e 63 74 2e 65 54 6e 63    sDistinct.eTnc
256e0 74 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33 57  tType = sqlite3W
256f0 68 65 72 65 49 73 44 69 73 74 69 6e 63 74 28 70  hereIsDistinct(p
25700 57 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 0a 20 20  WInfo);.    }.  
25710 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 26    if( pOrderBy &
25720 26 20 73 71 6c 69 74 65 33 57 68 65 72 65 49 73  & sqlite3WhereIs
25730 4f 72 64 65 72 65 64 28 70 57 49 6e 66 6f 29 20  Ordered(pWInfo) 
25740 29 20 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  ) pOrderBy = 0;.
25750 0a 20 20 20 20 2f 2a 20 49 66 20 73 6f 72 74 69  .    /* If sorti
25760 6e 67 20 69 6e 64 65 78 20 74 68 61 74 20 77 61  ng index that wa
25770 73 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70  s created by a p
25780 72 69 6f 72 20 4f 50 5f 4f 70 65 6e 45 70 68 65  rior OP_OpenEphe
25790 6d 65 72 61 6c 20 0a 20 20 20 20 2a 2a 20 69 6e  meral .    ** in
257a0 73 74 72 75 63 74 69 6f 6e 20 65 6e 64 65 64 20  struction ended 
257b0 75 70 20 6e 6f 74 20 62 65 69 6e 67 20 6e 65 65  up not being nee
257c0 64 65 64 2c 20 74 68 65 6e 20 63 68 61 6e 67 65  ded, then change
257d0 20 74 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65   the OP_OpenEphe
257e0 6d 65 72 61 6c 0a 20 20 20 20 2a 2a 20 69 6e 74  meral.    ** int
257f0 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 2e 0a 20 20  o an OP_Noop..  
25800 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 61 64 64    */.    if( add
25810 72 53 6f 72 74 49 6e 64 65 78 3e 3d 30 20 26 26  rSortIndex>=0 &&
25820 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a   pOrderBy==0 ){.
25830 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
25840 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c  eChangeToNoop(v,
25850 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78 29 3b   addrSortIndex);
25860 0a 20 20 20 20 20 20 70 2d 3e 61 64 64 72 4f 70  .      p->addrOp
25870 65 6e 45 70 68 6d 5b 32 5d 20 3d 20 2d 31 3b 0a  enEphm[2] = -1;.
25880 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 73      }..    /* Us
25890 65 20 74 68 65 20 73 74 61 6e 64 61 72 64 20 69  e the standard i
258a0 6e 6e 65 72 20 6c 6f 6f 70 2e 20 2a 2f 0a 20 20  nner loop. */.  
258b0 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f    selectInnerLoo
258c0 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 45 4c  p(pParse, p, pEL
258d0 69 73 74 2c 20 30 2c 20 30 2c 20 70 4f 72 64 65  ist, 0, 0, pOrde
258e0 72 42 79 2c 20 26 73 44 69 73 74 69 6e 63 74 2c  rBy, &sDistinct,
258f0 20 70 44 65 73 74 2c 0a 20 20 20 20 20 20 20 20   pDest,.        
25900 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
25910 74 65 33 57 68 65 72 65 43 6f 6e 74 69 6e 75 65  te3WhereContinue
25920 4c 61 62 65 6c 28 70 57 49 6e 66 6f 29 2c 0a 20  Label(pWInfo),. 
25930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25940 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 42     sqlite3WhereB
25950 72 65 61 6b 4c 61 62 65 6c 28 70 57 49 6e 66 6f  reakLabel(pWInfo
25960 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 6e 64 20  ));..    /* End 
25970 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63 61  the database sca
25980 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20  n loop..    */. 
25990 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45     sqlite3WhereE
259a0 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 7d 65  nd(pWInfo);.  }e
259b0 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  lse{.    /* This
259c0 20 63 61 73 65 20 77 68 65 6e 20 74 68 65 72 65   case when there
259d0 20 65 78 69 73 74 20 61 67 67 72 65 67 61 74 65   exist aggregate
259e0 20 66 75 6e 63 74 69 6f 6e 73 20 6f 72 20 61 20   functions or a 
259f0 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 0a  GROUP BY clause.
25a00 20 20 20 20 2a 2a 20 6f 72 20 62 6f 74 68 20 2a      ** or both *
25a10 2f 0a 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78  /.    NameContex
25a20 74 20 73 4e 43 3b 20 20 20 20 2f 2a 20 4e 61 6d  t sNC;    /* Nam
25a30 65 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 70 72  e context for pr
25a40 6f 63 65 73 73 69 6e 67 20 61 67 67 72 65 67 61  ocessing aggrega
25a50 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a  te information *
25a60 2f 0a 20 20 20 20 69 6e 74 20 69 41 4d 65 6d 3b  /.    int iAMem;
25a70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
25a80 73 74 20 4d 65 6d 20 61 64 64 72 65 73 73 20 66  st Mem address f
25a90 6f 72 20 73 74 6f 72 69 6e 67 20 63 75 72 72 65  or storing curre
25aa0 6e 74 20 47 52 4f 55 50 20 42 59 20 2a 2f 0a 20  nt GROUP BY */. 
25ab0 20 20 20 69 6e 74 20 69 42 4d 65 6d 3b 20 20 20     int iBMem;   
25ac0 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
25ad0 4d 65 6d 20 61 64 64 72 65 73 73 20 66 6f 72 20  Mem address for 
25ae0 70 72 65 76 69 6f 75 73 20 47 52 4f 55 50 20 42  previous GROUP B
25af0 59 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 55 73  Y */.    int iUs
25b00 65 46 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a 20  eFlag;       /* 
25b10 4d 65 6d 20 61 64 64 72 65 73 73 20 68 6f 6c 64  Mem address hold
25b20 69 6e 67 20 66 6c 61 67 20 69 6e 64 69 63 61 74  ing flag indicat
25b30 69 6e 67 20 74 68 61 74 20 61 74 20 6c 65 61 73  ing that at leas
25b40 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t.              
25b50 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 65            ** one
25b60 20 72 6f 77 20 6f 66 20 74 68 65 20 69 6e 70 75   row of the inpu
25b70 74 20 74 6f 20 74 68 65 20 61 67 67 72 65 67 61  t to the aggrega
25b80 74 6f 72 20 68 61 73 20 62 65 65 6e 0a 20 20 20  tor has been.   
25b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25ba0 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 65       ** processe
25bb0 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 41 62  d */.    int iAb
25bc0 6f 72 74 46 6c 61 67 3b 20 20 20 20 20 2f 2a 20  ortFlag;     /* 
25bd0 4d 65 6d 20 61 64 64 72 65 73 73 20 77 68 69 63  Mem address whic
25be0 68 20 63 61 75 73 65 73 20 71 75 65 72 79 20 61  h causes query a
25bf0 62 6f 72 74 20 69 66 20 70 6f 73 69 74 69 76 65  bort if positive
25c00 20 2a 2f 0a 20 20 20 20 69 6e 74 20 67 72 6f 75   */.    int grou
25c10 70 42 79 53 6f 72 74 3b 20 20 20 20 2f 2a 20 52  pBySort;    /* R
25c20 6f 77 73 20 63 6f 6d 65 20 66 72 6f 6d 20 73 6f  ows come from so
25c30 75 72 63 65 20 69 6e 20 47 52 4f 55 50 20 42 59  urce in GROUP BY
25c40 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20 69 6e   order */.    in
25c50 74 20 61 64 64 72 45 6e 64 3b 20 20 20 20 20 20  t addrEnd;      
25c60 20 20 2f 2a 20 45 6e 64 20 6f 66 20 70 72 6f 63    /* End of proc
25c70 65 73 73 69 6e 67 20 66 6f 72 20 74 68 69 73 20  essing for this 
25c80 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20 69 6e  SELECT */.    in
25c90 74 20 73 6f 72 74 50 54 61 62 20 3d 20 30 3b 20  t sortPTab = 0; 
25ca0 20 20 2f 2a 20 50 73 65 75 64 6f 74 61 62 6c 65    /* Pseudotable
25cb0 20 75 73 65 64 20 74 6f 20 64 65 63 6f 64 65 20   used to decode 
25cc0 73 6f 72 74 69 6e 67 20 72 65 73 75 6c 74 73 20  sorting results 
25cd0 2a 2f 0a 20 20 20 20 69 6e 74 20 73 6f 72 74 4f  */.    int sortO
25ce0 75 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4f 75  ut = 0;    /* Ou
25cf0 74 70 75 74 20 72 65 67 69 73 74 65 72 20 66 72  tput register fr
25d00 6f 6d 20 74 68 65 20 73 6f 72 74 65 72 20 2a 2f  om the sorter */
25d10 0a 0a 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20  ..    /* Remove 
25d20 61 6e 79 20 61 6e 64 20 61 6c 6c 20 61 6c 69 61  any and all alia
25d30 73 65 73 20 62 65 74 77 65 65 6e 20 74 68 65 20  ses between the 
25d40 72 65 73 75 6c 74 20 73 65 74 20 61 6e 64 20 74  result set and t
25d50 68 65 0a 20 20 20 20 2a 2a 20 47 52 4f 55 50 20  he.    ** GROUP 
25d60 42 59 20 63 6c 61 75 73 65 2e 0a 20 20 20 20 2a  BY clause..    *
25d70 2f 0a 20 20 20 20 69 66 28 20 70 47 72 6f 75 70  /.    if( pGroup
25d80 42 79 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  By ){.      int 
25d90 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
25da0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
25db0 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20  p counter */.   
25dc0 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
25dd0 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 20  st_item *pItem; 
25de0 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
25df0 6f 76 65 72 20 65 78 70 72 65 73 73 69 6f 6e 20  over expression 
25e00 69 6e 20 61 20 6c 69 73 74 20 2a 2f 0a 0a 20 20  in a list */..  
25e10 20 20 20 20 66 6f 72 28 6b 3d 70 2d 3e 70 45 4c      for(k=p->pEL
25e20 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65  ist->nExpr, pIte
25e30 6d 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b 20  m=p->pEList->a; 
25e40 6b 3e 30 3b 20 6b 2d 2d 2c 20 70 49 74 65 6d 2b  k>0; k--, pItem+
25e50 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 49 74 65  +){.        pIte
25e60 6d 2d 3e 69 41 6c 69 61 73 20 3d 20 30 3b 0a 20  m->iAlias = 0;. 
25e70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72       }.      for
25e80 28 6b 3d 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78  (k=pGroupBy->nEx
25e90 70 72 2c 20 70 49 74 65 6d 3d 70 47 72 6f 75 70  pr, pItem=pGroup
25ea0 42 79 2d 3e 61 3b 20 6b 3e 30 3b 20 6b 2d 2d 2c  By->a; k>0; k--,
25eb0 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
25ec0 20 20 20 70 49 74 65 6d 2d 3e 69 41 6c 69 61 73     pItem->iAlias
25ed0 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
25ee0 20 20 20 20 69 66 28 20 70 2d 3e 6e 53 65 6c 65      if( p->nSele
25ef0 63 74 52 6f 77 3e 31 30 30 20 29 20 70 2d 3e 6e  ctRow>100 ) p->n
25f00 53 65 6c 65 63 74 52 6f 77 20 3d 20 31 30 30 3b  SelectRow = 100;
25f10 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
25f20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20    p->nSelectRow 
25f30 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 0a 20 20  = 1;.    }.. .  
25f40 20 20 2f 2a 20 43 72 65 61 74 65 20 61 20 6c 61    /* Create a la
25f50 62 65 6c 20 74 6f 20 6a 75 6d 70 20 74 6f 20 77  bel to jump to w
25f60 68 65 6e 20 77 65 20 77 61 6e 74 20 74 6f 20 61  hen we want to a
25f70 62 6f 72 74 20 74 68 65 20 71 75 65 72 79 20 2a  bort the query *
25f80 2f 0a 20 20 20 20 61 64 64 72 45 6e 64 20 3d 20  /.    addrEnd = 
25f90 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
25fa0 61 62 65 6c 28 76 29 3b 0a 0a 20 20 20 20 2f 2a  abel(v);..    /*
25fb0 20 43 6f 6e 76 65 72 74 20 54 4b 5f 43 4f 4c 55   Convert TK_COLU
25fc0 4d 4e 20 6e 6f 64 65 73 20 69 6e 74 6f 20 54 4b  MN nodes into TK
25fd0 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 61 6e 64 20  _AGG_COLUMN and 
25fe0 6d 61 6b 65 20 65 6e 74 72 69 65 73 20 69 6e 0a  make entries in.
25ff0 20 20 20 20 2a 2a 20 73 41 67 67 49 6e 66 6f 20      ** sAggInfo 
26000 66 6f 72 20 61 6c 6c 20 54 4b 5f 41 47 47 5f 46  for all TK_AGG_F
26010 55 4e 43 54 49 4f 4e 20 6e 6f 64 65 73 20 69 6e  UNCTION nodes in
26020 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6f 66 20   expressions of 
26030 74 68 65 0a 20 20 20 20 2a 2a 20 53 45 4c 45 43  the.    ** SELEC
26040 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20  T statement..   
26050 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26   */.    memset(&
26060 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73  sNC, 0, sizeof(s
26070 4e 43 29 29 3b 0a 20 20 20 20 73 4e 43 2e 70 50  NC));.    sNC.pP
26080 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20  arse = pParse;. 
26090 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20     sNC.pSrcList 
260a0 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20 20 20 20  = pTabList;.    
260b0 73 4e 43 2e 70 41 67 67 49 6e 66 6f 20 3d 20 26  sNC.pAggInfo = &
260c0 73 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 73 41  sAggInfo;.    sA
260d0 67 67 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67 43  ggInfo.nSortingC
260e0 6f 6c 75 6d 6e 20 3d 20 70 47 72 6f 75 70 42 79  olumn = pGroupBy
260f0 20 3f 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78   ? pGroupBy->nEx
26100 70 72 2b 31 20 3a 20 30 3b 0a 20 20 20 20 73 41  pr+1 : 0;.    sA
26110 67 67 49 6e 66 6f 2e 70 47 72 6f 75 70 42 79 20  ggInfo.pGroupBy 
26120 3d 20 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20  = pGroupBy;.    
26130 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
26140 7a 65 41 67 67 4c 69 73 74 28 26 73 4e 43 2c 20  zeAggList(&sNC, 
26150 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c  pEList);.    sql
26160 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
26170 67 67 4c 69 73 74 28 26 73 4e 43 2c 20 70 4f 72  ggList(&sNC, pOr
26180 64 65 72 42 79 29 3b 0a 20 20 20 20 69 66 28 20  derBy);.    if( 
26190 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20 20  pHaving ){.     
261a0 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
261b0 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 26 73  yzeAggregates(&s
261c0 4e 43 2c 20 70 48 61 76 69 6e 67 29 3b 0a 20 20  NC, pHaving);.  
261d0 20 20 7d 0a 20 20 20 20 73 41 67 67 49 6e 66 6f    }.    sAggInfo
261e0 2e 6e 41 63 63 75 6d 75 6c 61 74 6f 72 20 3d 20  .nAccumulator = 
261f0 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e  sAggInfo.nColumn
26200 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
26210 3c 73 41 67 67 49 6e 66 6f 2e 6e 46 75 6e 63 3b  <sAggInfo.nFunc;
26220 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73   i++){.      ass
26230 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
26240 70 65 72 74 79 28 73 41 67 67 49 6e 66 6f 2e 61  perty(sAggInfo.a
26250 46 75 6e 63 5b 69 5d 2e 70 45 78 70 72 2c 20 45  Func[i].pExpr, E
26260 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a  P_xIsSelect) );.
26270 20 20 20 20 20 20 73 4e 43 2e 6e 63 46 6c 61 67        sNC.ncFlag
26280 73 20 7c 3d 20 4e 43 5f 49 6e 41 67 67 46 75 6e  s |= NC_InAggFun
26290 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  c;.      sqlite3
262a0 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69  ExprAnalyzeAggLi
262b0 73 74 28 26 73 4e 43 2c 20 73 41 67 67 49 6e 66  st(&sNC, sAggInf
262c0 6f 2e 61 46 75 6e 63 5b 69 5d 2e 70 45 78 70 72  o.aFunc[i].pExpr
262d0 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20  ->x.pList);.    
262e0 20 20 73 4e 43 2e 6e 63 46 6c 61 67 73 20 26 3d    sNC.ncFlags &=
262f0 20 7e 4e 43 5f 49 6e 41 67 67 46 75 6e 63 3b 0a   ~NC_InAggFunc;.
26300 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64 62      }.    if( db
26310 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
26320 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
26330 3b 0a 0a 20 20 20 20 2f 2a 20 50 72 6f 63 65 73  ;..    /* Proces
26340 73 69 6e 67 20 66 6f 72 20 61 67 67 72 65 67 61  sing for aggrega
26350 74 65 73 20 77 69 74 68 20 47 52 4f 55 50 20 42  tes with GROUP B
26360 59 20 69 73 20 76 65 72 79 20 64 69 66 66 65 72  Y is very differ
26370 65 6e 74 20 61 6e 64 0a 20 20 20 20 2a 2a 20 6d  ent and.    ** m
26380 75 63 68 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78  uch more complex
26390 20 74 68 61 6e 20 61 67 67 72 65 67 61 74 65 73   than aggregates
263a0 20 77 69 74 68 6f 75 74 20 61 20 47 52 4f 55 50   without a GROUP
263b0 20 42 59 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20   BY..    */.    
263c0 69 66 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a  if( pGroupBy ){.
263d0 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70        KeyInfo *p
263e0 4b 65 79 49 6e 66 6f 3b 20 20 2f 2a 20 4b 65 79  KeyInfo;  /* Key
263f0 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ing information 
26400 66 6f 72 20 74 68 65 20 67 72 6f 75 70 20 62 79  for the group by
26410 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20   clause */.     
26420 20 69 6e 74 20 6a 31 3b 20 20 20 20 20 20 20 20   int j1;        
26430 20 20 20 20 20 2f 2a 20 41 2d 76 73 2d 42 20 63       /* A-vs-B c
26440 6f 6d 70 61 72 69 73 69 6f 6e 20 6a 75 6d 70 20  omparision jump 
26450 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  */.      int add
26460 72 4f 75 74 70 75 74 52 6f 77 3b 20 20 2f 2a 20  rOutputRow;  /* 
26470 53 74 61 72 74 20 6f 66 20 73 75 62 72 6f 75 74  Start of subrout
26480 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74 73  ine that outputs
26490 20 61 20 72 65 73 75 6c 74 20 72 6f 77 20 2a 2f   a result row */
264a0 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67 4f 75  .      int regOu
264b0 74 70 75 74 52 6f 77 3b 20 20 20 2f 2a 20 52 65  tputRow;   /* Re
264c0 74 75 72 6e 20 61 64 64 72 65 73 73 20 72 65 67  turn address reg
264d0 69 73 74 65 72 20 66 6f 72 20 6f 75 74 70 75 74  ister for output
264e0 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
264f0 20 20 20 20 20 69 6e 74 20 61 64 64 72 53 65 74       int addrSet
26500 41 62 6f 72 74 3b 20 20 20 2f 2a 20 53 65 74 20  Abort;   /* Set 
26510 74 68 65 20 61 62 6f 72 74 20 66 6c 61 67 20 61  the abort flag a
26520 6e 64 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 20  nd return */.   
26530 20 20 20 69 6e 74 20 61 64 64 72 54 6f 70 4f 66     int addrTopOf
26540 4c 6f 6f 70 3b 20 20 2f 2a 20 54 6f 70 20 6f 66  Loop;  /* Top of
26550 20 74 68 65 20 69 6e 70 75 74 20 6c 6f 6f 70 20   the input loop 
26560 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  */.      int add
26570 72 53 6f 72 74 69 6e 67 49 64 78 3b 20 2f 2a 20  rSortingIdx; /* 
26580 54 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  The OP_OpenEphem
26590 65 72 61 6c 20 66 6f 72 20 74 68 65 20 73 6f 72  eral for the sor
265a0 74 69 6e 67 20 69 6e 64 65 78 20 2a 2f 0a 20 20  ting index */.  
265b0 20 20 20 20 69 6e 74 20 61 64 64 72 52 65 73 65      int addrRese
265c0 74 3b 20 20 20 20 20 20 2f 2a 20 53 75 62 72 6f  t;      /* Subro
265d0 75 74 69 6e 65 20 66 6f 72 20 72 65 73 65 74 74  utine for resett
265e0 69 6e 67 20 74 68 65 20 61 63 63 75 6d 75 6c 61  ing the accumula
265f0 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  tor */.      int
26600 20 72 65 67 52 65 73 65 74 3b 20 20 20 20 20 20   regReset;      
26610 20 2f 2a 20 52 65 74 75 72 6e 20 61 64 64 72 65   /* Return addre
26620 73 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20  ss register for 
26630 72 65 73 65 74 20 73 75 62 72 6f 75 74 69 6e 65  reset subroutine
26640 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66   */..      /* If
26650 20 74 68 65 72 65 20 69 73 20 61 20 47 52 4f 55   there is a GROU
26660 50 20 42 59 20 63 6c 61 75 73 65 20 77 65 20 6d  P BY clause we m
26670 69 67 68 74 20 6e 65 65 64 20 61 20 73 6f 72 74  ight need a sort
26680 69 6e 67 20 69 6e 64 65 78 20 74 6f 0a 20 20 20  ing index to.   
26690 20 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20     ** implement 
266a0 69 74 2e 20 20 41 6c 6c 6f 63 61 74 65 20 74 68  it.  Allocate th
266b0 61 74 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78  at sorting index
266c0 20 6e 6f 77 2e 20 20 49 66 20 69 74 20 74 75 72   now.  If it tur
266d0 6e 73 20 6f 75 74 0a 20 20 20 20 20 20 2a 2a 20  ns out.      ** 
266e0 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 6e  that we do not n
266f0 65 65 64 20 69 74 20 61 66 74 65 72 20 61 6c 6c  eed it after all
26700 2c 20 74 68 65 20 4f 50 5f 53 6f 72 74 65 72 4f  , the OP_SorterO
26710 70 65 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a  pen instruction.
26720 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65        ** will be
26730 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20   converted into 
26740 61 20 4e 6f 6f 70 2e 20 20 0a 20 20 20 20 20 20  a Noop.  .      
26750 2a 2f 0a 20 20 20 20 20 20 73 41 67 67 49 6e 66  */.      sAggInf
26760 6f 2e 73 6f 72 74 69 6e 67 49 64 78 20 3d 20 70  o.sortingIdx = p
26770 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
26780 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20       pKeyInfo = 
26790 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c  keyInfoFromExprL
267a0 69 73 74 28 70 50 61 72 73 65 2c 20 70 47 72 6f  ist(pParse, pGro
267b0 75 70 42 79 29 3b 0a 20 20 20 20 20 20 61 64 64  upBy);.      add
267c0 72 53 6f 72 74 69 6e 67 49 64 78 20 3d 20 73 71  rSortingIdx = sq
267d0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
267e0 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e  v, OP_SorterOpen
267f0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 73 41 67  , .          sAg
26800 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78  gInfo.sortingIdx
26810 2c 20 73 41 67 67 49 6e 66 6f 2e 6e 53 6f 72 74  , sAggInfo.nSort
26820 69 6e 67 43 6f 6c 75 6d 6e 2c 20 0a 20 20 20 20  ingColumn, .    
26830 20 20 20 20 20 20 30 2c 20 28 63 68 61 72 2a 29        0, (char*)
26840 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59  pKeyInfo, P4_KEY
26850 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 0a  INFO_HANDOFF);..
26860 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c        /* Initial
26870 69 7a 65 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74  ize memory locat
26880 69 6f 6e 73 20 75 73 65 64 20 62 79 20 47 52 4f  ions used by GRO
26890 55 50 20 42 59 20 61 67 67 72 65 67 61 74 65 20  UP BY aggregate 
268a0 70 72 6f 63 65 73 73 69 6e 67 0a 20 20 20 20 20  processing.     
268b0 20 2a 2f 0a 20 20 20 20 20 20 69 55 73 65 46 6c   */.      iUseFl
268c0 61 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  ag = ++pParse->n
268d0 4d 65 6d 3b 0a 20 20 20 20 20 20 69 41 62 6f 72  Mem;.      iAbor
268e0 74 46 6c 61 67 20 3d 20 2b 2b 70 50 61 72 73 65  tFlag = ++pParse
268f0 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 72 65  ->nMem;.      re
26900 67 4f 75 74 70 75 74 52 6f 77 20 3d 20 2b 2b 70  gOutputRow = ++p
26910 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
26920 20 20 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77     addrOutputRow
26930 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
26940 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
26950 20 20 72 65 67 52 65 73 65 74 20 3d 20 2b 2b 70    regReset = ++p
26960 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
26970 20 20 20 61 64 64 72 52 65 73 65 74 20 3d 20 73     addrReset = s
26980 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
26990 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 41  bel(v);.      iA
269a0 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  Mem = pParse->nM
269b0 65 6d 20 2b 20 31 3b 0a 20 20 20 20 20 20 70 50  em + 1;.      pP
269c0 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 47  arse->nMem += pG
269d0 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20  roupBy->nExpr;. 
269e0 20 20 20 20 20 69 42 4d 65 6d 20 3d 20 70 50 61       iBMem = pPa
269f0 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20  rse->nMem + 1;. 
26a00 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65       pParse->nMe
26a10 6d 20 2b 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e  m += pGroupBy->n
26a20 45 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69  Expr;.      sqli
26a30 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
26a40 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
26a50 69 41 62 6f 72 74 46 6c 61 67 29 3b 0a 20 20 20  iAbortFlag);.   
26a60 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
26a70 76 2c 20 22 63 6c 65 61 72 20 61 62 6f 72 74 20  v, "clear abort 
26a80 66 6c 61 67 22 29 29 3b 0a 20 20 20 20 20 20 73  flag"));.      s
26a90 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
26aa0 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
26ab0 30 2c 20 69 55 73 65 46 6c 61 67 29 3b 0a 20 20  0, iUseFlag);.  
26ac0 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
26ad0 28 76 2c 20 22 69 6e 64 69 63 61 74 65 20 61 63  (v, "indicate ac
26ae0 63 75 6d 75 6c 61 74 6f 72 20 65 6d 70 74 79 22  cumulator empty"
26af0 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
26b00 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
26b10 50 5f 4e 75 6c 6c 2c 20 30 2c 20 69 41 4d 65 6d  P_Null, 0, iAMem
26b20 2c 20 69 41 4d 65 6d 2b 70 47 72 6f 75 70 42 79  , iAMem+pGroupBy
26b30 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a 0a 20 20 20  ->nExpr-1);..   
26b40 20 20 20 2f 2a 20 42 65 67 69 6e 20 61 20 6c 6f     /* Begin a lo
26b50 6f 70 20 74 68 61 74 20 77 69 6c 6c 20 65 78 74  op that will ext
26b60 72 61 63 74 20 61 6c 6c 20 73 6f 75 72 63 65 20  ract all source 
26b70 72 6f 77 73 20 69 6e 20 47 52 4f 55 50 20 42 59  rows in GROUP BY
26b80 20 6f 72 64 65 72 2e 0a 20 20 20 20 20 20 2a 2a   order..      **
26b90 20 54 68 69 73 20 6d 69 67 68 74 20 69 6e 76 6f   This might invo
26ba0 6c 76 65 20 74 77 6f 20 73 65 70 61 72 61 74 65  lve two separate
26bb0 20 6c 6f 6f 70 73 20 77 69 74 68 20 61 6e 20 4f   loops with an O
26bc0 50 5f 53 6f 72 74 20 69 6e 20 62 65 74 77 65 65  P_Sort in betwee
26bd0 6e 2c 20 6f 72 0a 20 20 20 20 20 20 2a 2a 20 69  n, or.      ** i
26be0 74 20 6d 69 67 68 74 20 62 65 20 61 20 73 69 6e  t might be a sin
26bf0 67 6c 65 20 6c 6f 6f 70 20 74 68 61 74 20 75 73  gle loop that us
26c00 65 73 20 61 6e 20 69 6e 64 65 78 20 74 6f 20 65  es an index to e
26c10 78 74 72 61 63 74 20 69 6e 66 6f 72 6d 61 74 69  xtract informati
26c20 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 74  on.      ** in t
26c30 68 65 20 72 69 67 68 74 20 6f 72 64 65 72 20 74  he right order t
26c40 6f 20 62 65 67 69 6e 20 77 69 74 68 2e 0a 20 20  o begin with..  
26c50 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
26c60 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
26c70 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 52  , OP_Gosub, regR
26c80 65 73 65 74 2c 20 61 64 64 72 52 65 73 65 74 29  eset, addrReset)
26c90 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 20 3d  ;.      pWInfo =
26ca0 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
26cb0 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c  in(pParse, pTabL
26cc0 69 73 74 2c 20 70 57 68 65 72 65 2c 20 70 47 72  ist, pWhere, pGr
26cd0 6f 75 70 42 79 2c 20 30 2c 20 30 2c 20 30 29 3b  oupBy, 0, 0, 0);
26ce0 0a 20 20 20 20 20 20 69 66 28 20 70 57 49 6e 66  .      if( pWInf
26cf0 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65  o==0 ) goto sele
26d00 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 69 66  ct_end;.      if
26d10 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 49 73  ( sqlite3WhereIs
26d20 4f 72 64 65 72 65 64 28 70 57 49 6e 66 6f 29 20  Ordered(pWInfo) 
26d30 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
26d40 65 20 6f 70 74 69 6d 69 7a 65 72 20 69 73 20 61  e optimizer is a
26d50 62 6c 65 20 74 6f 20 64 65 6c 69 76 65 72 20 72  ble to deliver r
26d60 6f 77 73 20 69 6e 20 67 72 6f 75 70 20 62 79 20  ows in group by 
26d70 6f 72 64 65 72 20 73 6f 0a 20 20 20 20 20 20 20  order so.       
26d80 20 2a 2a 20 77 65 20 64 6f 20 6e 6f 74 20 68 61   ** we do not ha
26d90 76 65 20 74 6f 20 73 6f 72 74 2e 20 20 54 68 65  ve to sort.  The
26da0 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
26db0 6c 20 74 61 62 6c 65 20 77 69 6c 6c 20 62 65 0a  l table will be.
26dc0 20 20 20 20 20 20 20 20 2a 2a 20 63 61 6e 63 65          ** cance
26dd0 6c 6c 65 64 20 6c 61 74 65 72 20 62 65 63 61 75  lled later becau
26de0 73 65 20 77 65 20 73 74 69 6c 6c 20 6e 65 65 64  se we still need
26df0 20 74 6f 20 75 73 65 20 74 68 65 20 70 4b 65 79   to use the pKey
26e00 49 6e 66 6f 0a 20 20 20 20 20 20 20 20 2a 2f 0a  Info.        */.
26e10 20 20 20 20 20 20 20 20 67 72 6f 75 70 42 79 53          groupByS
26e20 6f 72 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ort = 0;.      }
26e30 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
26e40 20 52 6f 77 73 20 61 72 65 20 63 6f 6d 69 6e 67   Rows are coming
26e50 20 6f 75 74 20 69 6e 20 75 6e 64 65 74 65 72 6d   out in undeterm
26e60 69 6e 65 64 20 6f 72 64 65 72 2e 20 20 57 65 20  ined order.  We 
26e70 68 61 76 65 20 74 6f 20 70 75 73 68 0a 20 20 20  have to push.   
26e80 20 20 20 20 20 2a 2a 20 65 61 63 68 20 72 6f 77       ** each row
26e90 20 69 6e 74 6f 20 61 20 73 6f 72 74 69 6e 67 20   into a sorting 
26ea0 69 6e 64 65 78 2c 20 74 65 72 6d 69 6e 61 74 65  index, terminate
26eb0 20 74 68 65 20 66 69 72 73 74 20 6c 6f 6f 70 2c   the first loop,
26ec0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e  .        ** then
26ed0 20 6c 6f 6f 70 20 6f 76 65 72 20 74 68 65 20 73   loop over the s
26ee0 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 69 6e 20  orting index in 
26ef0 6f 72 64 65 72 20 74 6f 20 67 65 74 20 74 68 65  order to get the
26f00 20 6f 75 74 70 75 74 0a 20 20 20 20 20 20 20 20   output.        
26f10 2a 2a 20 69 6e 20 73 6f 72 74 65 64 20 6f 72 64  ** in sorted ord
26f20 65 72 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  er.        */.  
26f30 20 20 20 20 20 20 69 6e 74 20 72 65 67 42 61 73        int regBas
26f40 65 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  e;.        int r
26f50 65 67 52 65 63 6f 72 64 3b 0a 20 20 20 20 20 20  egRecord;.      
26f60 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 20 20    int nCol;.    
26f70 20 20 20 20 69 6e 74 20 6e 47 72 6f 75 70 42 79      int nGroupBy
26f80 3b 0a 0a 20 20 20 20 20 20 20 20 65 78 70 6c 61  ;..        expla
26f90 69 6e 54 65 6d 70 54 61 62 6c 65 28 70 50 61 72  inTempTable(pPar
26fa0 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  se, .           
26fb0 20 28 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e   (sDistinct.isTn
26fc0 63 74 20 26 26 20 28 70 2d 3e 73 65 6c 46 6c 61  ct && (p->selFla
26fd0 67 73 26 53 46 5f 44 69 73 74 69 6e 63 74 29 3d  gs&SF_Distinct)=
26fe0 3d 30 29 20 3f 0a 20 20 20 20 20 20 20 20 20 20  =0) ?.          
26ff0 20 20 20 20 20 20 20 20 20 20 22 44 49 53 54 49            "DISTI
27000 4e 43 54 22 20 3a 20 22 47 52 4f 55 50 20 42 59  NCT" : "GROUP BY
27010 22 29 3b 0a 0a 20 20 20 20 20 20 20 20 67 72 6f  ");..        gro
27020 75 70 42 79 53 6f 72 74 20 3d 20 31 3b 0a 20 20  upBySort = 1;.  
27030 20 20 20 20 20 20 6e 47 72 6f 75 70 42 79 20 3d        nGroupBy =
27040 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72   pGroupBy->nExpr
27050 3b 0a 20 20 20 20 20 20 20 20 6e 43 6f 6c 20 3d  ;.        nCol =
27060 20 6e 47 72 6f 75 70 42 79 20 2b 20 31 3b 0a 20   nGroupBy + 1;. 
27070 20 20 20 20 20 20 20 6a 20 3d 20 6e 47 72 6f 75         j = nGrou
27080 70 42 79 2b 31 3b 0a 20 20 20 20 20 20 20 20 66  pBy+1;.        f
27090 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e  or(i=0; i<sAggIn
270a0 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29  fo.nColumn; i++)
270b0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
270c0 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69 5d  sAggInfo.aCol[i]
270d0 2e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3e 3d  .iSorterColumn>=
270e0 6a 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  j ){.           
270f0 20 6e 43 6f 6c 2b 2b 3b 0a 20 20 20 20 20 20 20   nCol++;.       
27100 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20       j++;.      
27110 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
27120 20 20 20 20 20 20 20 20 72 65 67 42 61 73 65 20          regBase 
27130 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
27140 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 43  Range(pParse, nC
27150 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ol);.        sql
27160 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65  ite3ExprCacheCle
27170 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  ar(pParse);.    
27180 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
27190 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50 61 72  odeExprList(pPar
271a0 73 65 2c 20 70 47 72 6f 75 70 42 79 2c 20 72 65  se, pGroupBy, re
271b0 67 42 61 73 65 2c 20 30 29 3b 0a 20 20 20 20 20  gBase, 0);.     
271c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
271d0 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65 71 75 65  dOp2(v, OP_Seque
271e0 6e 63 65 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f  nce, sAggInfo.so
271f0 72 74 69 6e 67 49 64 78 2c 72 65 67 42 61 73 65  rtingIdx,regBase
27200 2b 6e 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20  +nGroupBy);.    
27210 20 20 20 20 6a 20 3d 20 6e 47 72 6f 75 70 42 79      j = nGroupBy
27220 2b 31 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  +1;.        for(
27230 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e  i=0; i<sAggInfo.
27240 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20  nColumn; i++){. 
27250 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20           struct 
27260 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f  AggInfo_col *pCo
27270 6c 20 3d 20 26 73 41 67 67 49 6e 66 6f 2e 61 43  l = &sAggInfo.aC
27280 6f 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20  ol[i];.         
27290 20 69 66 28 20 70 43 6f 6c 2d 3e 69 53 6f 72 74   if( pCol->iSort
272a0 65 72 43 6f 6c 75 6d 6e 3e 3d 6a 20 29 7b 0a 20  erColumn>=j ){. 
272b0 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 72             int r
272c0 31 20 3d 20 6a 20 2b 20 72 65 67 42 61 73 65 3b  1 = j + regBase;
272d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
272e0 20 72 32 3b 0a 0a 20 20 20 20 20 20 20 20 20 20   r2;..          
272f0 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78    r2 = sqlite3Ex
27300 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28  prCodeGetColumn(
27310 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20  pParse, .       
27320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27330 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 54          pCol->pT
27340 61 62 2c 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d  ab, pCol->iColum
27350 6e 2c 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 2c  n, pCol->iTable,
27360 20 72 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20   r1, 0);.       
27370 20 20 20 20 20 69 66 28 20 72 31 21 3d 72 32 20       if( r1!=r2 
27380 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
27390 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
273a0 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20  p2(v, OP_SCopy, 
273b0 72 32 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20  r2, r1);.       
273c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
273d0 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 20 20     j++;.        
273e0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
273f0 20 20 20 20 20 20 72 65 67 52 65 63 6f 72 64 20        regRecord 
27400 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
27410 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
27420 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
27430 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b  AddOp3(v, OP_Mak
27440 65 52 65 63 6f 72 64 2c 20 72 65 67 42 61 73 65  eRecord, regBase
27450 2c 20 6e 43 6f 6c 2c 20 72 65 67 52 65 63 6f 72  , nCol, regRecor
27460 64 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  d);.        sqli
27470 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
27480 20 4f 50 5f 53 6f 72 74 65 72 49 6e 73 65 72 74   OP_SorterInsert
27490 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69  , sAggInfo.sorti
274a0 6e 67 49 64 78 2c 20 72 65 67 52 65 63 6f 72 64  ngIdx, regRecord
274b0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
274c0 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
274d0 28 70 50 61 72 73 65 2c 20 72 65 67 52 65 63 6f  (pParse, regReco
274e0 72 64 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  rd);.        sql
274f0 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
27500 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67  ange(pParse, reg
27510 42 61 73 65 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20  Base, nCol);.   
27520 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72       sqlite3Wher
27530 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20  eEnd(pWInfo);.  
27540 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 73        sAggInfo.s
27550 6f 72 74 69 6e 67 49 64 78 50 54 61 62 20 3d 20  ortingIdxPTab = 
27560 73 6f 72 74 50 54 61 62 20 3d 20 70 50 61 72 73  sortPTab = pPars
27570 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20  e->nTab++;.     
27580 20 20 20 73 6f 72 74 4f 75 74 20 3d 20 73 71 6c     sortOut = sql
27590 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
275a0 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
275b0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
275c0 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75  3(v, OP_OpenPseu
275d0 64 6f 2c 20 73 6f 72 74 50 54 61 62 2c 20 73 6f  do, sortPTab, so
275e0 72 74 4f 75 74 2c 20 6e 43 6f 6c 29 3b 0a 20 20  rtOut, nCol);.  
275f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
27600 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f  eAddOp2(v, OP_So
27610 72 74 65 72 53 6f 72 74 2c 20 73 41 67 67 49 6e  rterSort, sAggIn
27620 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 61  fo.sortingIdx, a
27630 64 64 72 45 6e 64 29 3b 0a 20 20 20 20 20 20 20  ddrEnd);.       
27640 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
27650 20 22 47 52 4f 55 50 20 42 59 20 73 6f 72 74 22   "GROUP BY sort"
27660 29 29 3b 0a 20 20 20 20 20 20 20 20 73 41 67 67  ));.        sAgg
27670 49 6e 66 6f 2e 75 73 65 53 6f 72 74 69 6e 67 49  Info.useSortingI
27680 64 78 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  dx = 1;.        
27690 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
276a0 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20  Clear(pParse);. 
276b0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
276c0 20 45 76 61 6c 75 61 74 65 20 74 68 65 20 63 75   Evaluate the cu
276d0 72 72 65 6e 74 20 47 52 4f 55 50 20 42 59 20 74  rrent GROUP BY t
276e0 65 72 6d 73 20 61 6e 64 20 73 74 6f 72 65 20 69  erms and store i
276f0 6e 20 62 30 2c 20 62 31 2c 20 62 32 2e 2e 2e 0a  n b0, b1, b2....
27700 20 20 20 20 20 20 2a 2a 20 28 62 30 20 69 73 20        ** (b0 is 
27710 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20  memory location 
27720 69 42 4d 65 6d 2b 30 2c 20 62 31 20 69 73 20 69  iBMem+0, b1 is i
27730 42 4d 65 6d 2b 31 2c 20 61 6e 64 20 73 6f 20 66  BMem+1, and so f
27740 6f 72 74 68 29 0a 20 20 20 20 20 20 2a 2a 20 54  orth).      ** T
27750 68 65 6e 20 63 6f 6d 70 61 72 65 20 74 68 65 20  hen compare the 
27760 63 75 72 72 65 6e 74 20 47 52 4f 55 50 20 42 59  current GROUP BY
27770 20 74 65 72 6d 73 20 61 67 61 69 6e 73 74 20 74   terms against t
27780 68 65 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d  he GROUP BY term
27790 73 0a 20 20 20 20 20 20 2a 2a 20 66 72 6f 6d 20  s.      ** from 
277a0 74 68 65 20 70 72 65 76 69 6f 75 73 20 72 6f 77  the previous row
277b0 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72 65   currently store
277c0 64 20 69 6e 20 61 30 2c 20 61 31 2c 20 61 32 2e  d in a0, a1, a2.
277d0 2e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  ...      */.    
277e0 20 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 20    addrTopOfLoop 
277f0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
27800 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
27810 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
27820 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29  cheClear(pParse)
27830 3b 0a 20 20 20 20 20 20 69 66 28 20 67 72 6f 75  ;.      if( grou
27840 70 42 79 53 6f 72 74 20 29 7b 0a 20 20 20 20 20  pBySort ){.     
27850 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
27860 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65  dOp2(v, OP_Sorte
27870 72 44 61 74 61 2c 20 73 41 67 67 49 6e 66 6f 2e  rData, sAggInfo.
27880 73 6f 72 74 69 6e 67 49 64 78 2c 20 73 6f 72 74  sortingIdx, sort
27890 4f 75 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Out);.      }.  
278a0 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
278b0 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20  GroupBy->nExpr; 
278c0 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  j++){.        if
278d0 28 20 67 72 6f 75 70 42 79 53 6f 72 74 20 29 7b  ( groupBySort ){
278e0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
278f0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
27900 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73 6f 72 74 50  OP_Column, sortP
27910 54 61 62 2c 20 6a 2c 20 69 42 4d 65 6d 2b 6a 29  Tab, j, iBMem+j)
27920 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
27930 6a 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 56 64  j==0 ) sqlite3Vd
27940 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50  beChangeP5(v, OP
27950 46 4c 41 47 5f 43 4c 45 41 52 43 41 43 48 45 29  FLAG_CLEARCACHE)
27960 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
27970 0a 20 20 20 20 20 20 20 20 20 20 73 41 67 67 49  .          sAggI
27980 6e 66 6f 2e 64 69 72 65 63 74 4d 6f 64 65 20 3d  nfo.directMode =
27990 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71   1;.          sq
279a0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
279b0 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79 2d 3e  arse, pGroupBy->
279c0 61 5b 6a 5d 2e 70 45 78 70 72 2c 20 69 42 4d 65  a[j].pExpr, iBMe
279d0 6d 2b 6a 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  m+j);.        }.
279e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
279f0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
27a00 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 69  v, OP_Compare, i
27a10 41 4d 65 6d 2c 20 69 42 4d 65 6d 2c 20 70 47 72  AMem, iBMem, pGr
27a20 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2c 0a 20 20  oupBy->nExpr,.  
27a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27a40 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70          (char*)p
27a50 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49  KeyInfo, P4_KEYI
27a60 4e 46 4f 29 3b 0a 20 20 20 20 20 20 6a 31 20 3d  NFO);.      j1 =
27a70 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
27a80 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
27a90 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
27aa0 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20  Op3(v, OP_Jump, 
27ab0 6a 31 2b 31 2c 20 30 2c 20 6a 31 2b 31 29 3b 0a  j1+1, 0, j1+1);.
27ac0 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61  .      /* Genera
27ad0 74 65 20 63 6f 64 65 20 74 68 61 74 20 72 75 6e  te code that run
27ae0 73 20 77 68 65 6e 65 76 65 72 20 74 68 65 20 47  s whenever the G
27af0 52 4f 55 50 20 42 59 20 63 68 61 6e 67 65 73 2e  ROUP BY changes.
27b00 0a 20 20 20 20 20 20 2a 2a 20 43 68 61 6e 67 65  .      ** Change
27b10 73 20 69 6e 20 74 68 65 20 47 52 4f 55 50 20 42  s in the GROUP B
27b20 59 20 61 72 65 20 64 65 74 65 63 74 65 64 20 62  Y are detected b
27b30 79 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 63  y the previous c
27b40 6f 64 65 0a 20 20 20 20 20 20 2a 2a 20 62 6c 6f  ode.      ** blo
27b50 63 6b 2e 20 20 49 66 20 74 68 65 72 65 20 77 65  ck.  If there we
27b60 72 65 20 6e 6f 20 63 68 61 6e 67 65 73 2c 20 74  re no changes, t
27b70 68 69 73 20 62 6c 6f 63 6b 20 69 73 20 73 6b 69  his block is ski
27b80 70 70 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  pped..      **. 
27b90 20 20 20 20 20 2a 2a 20 54 68 69 73 20 63 6f 64       ** This cod
27ba0 65 20 63 6f 70 69 65 73 20 63 75 72 72 65 6e 74  e copies current
27bb0 20 67 72 6f 75 70 20 62 79 20 74 65 72 6d 73 20   group by terms 
27bc0 69 6e 20 62 30 2c 62 31 2c 62 32 2c 2e 2e 2e 0a  in b0,b1,b2,....
27bd0 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 20 74 6f        ** over to
27be0 20 61 30 2c 61 31 2c 61 32 2e 20 20 49 74 20 74   a0,a1,a2.  It t
27bf0 68 65 6e 20 63 61 6c 6c 73 20 74 68 65 20 6f 75  hen calls the ou
27c00 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65 0a  tput subroutine.
27c10 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 72 65 73        ** and res
27c20 65 74 73 20 74 68 65 20 61 67 67 72 65 67 61 74  ets the aggregat
27c30 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 72 65  e accumulator re
27c40 67 69 73 74 65 72 73 20 69 6e 20 70 72 65 70 61  gisters in prepa
27c50 72 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20  ration.      ** 
27c60 66 6f 72 20 74 68 65 20 6e 65 78 74 20 47 52 4f  for the next GRO
27c70 55 50 20 42 59 20 62 61 74 63 68 2e 0a 20 20 20  UP BY batch..   
27c80 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69     */.      sqli
27c90 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28  te3ExprCodeMove(
27ca0 70 50 61 72 73 65 2c 20 69 42 4d 65 6d 2c 20 69  pParse, iBMem, i
27cb0 41 4d 65 6d 2c 20 70 47 72 6f 75 70 42 79 2d 3e  AMem, pGroupBy->
27cc0 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20 73 71  nExpr);.      sq
27cd0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
27ce0 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67  v, OP_Gosub, reg
27cf0 4f 75 74 70 75 74 52 6f 77 2c 20 61 64 64 72 4f  OutputRow, addrO
27d00 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20  utputRow);.     
27d10 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
27d20 20 22 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f 77   "output one row
27d30 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  "));.      sqlit
27d40 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
27d50 4f 50 5f 49 66 50 6f 73 2c 20 69 41 62 6f 72 74  OP_IfPos, iAbort
27d60 46 6c 61 67 2c 20 61 64 64 72 45 6e 64 29 3b 0a  Flag, addrEnd);.
27d70 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
27d80 74 28 28 76 2c 20 22 63 68 65 63 6b 20 61 62 6f  t((v, "check abo
27d90 72 74 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20  rt flag"));.    
27da0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
27db0 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
27dc0 20 72 65 67 52 65 73 65 74 2c 20 61 64 64 72 52   regReset, addrR
27dd0 65 73 65 74 29 3b 0a 20 20 20 20 20 20 56 64 62  eset);.      Vdb
27de0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72 65  eComment((v, "re
27df0 73 65 74 20 61 63 63 75 6d 75 6c 61 74 6f 72 22  set accumulator"
27e00 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 55 70  ));..      /* Up
27e10 64 61 74 65 20 74 68 65 20 61 67 67 72 65 67 61  date the aggrega
27e20 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 73 20  te accumulators 
27e30 62 61 73 65 64 20 6f 6e 20 74 68 65 20 63 6f 6e  based on the con
27e40 74 65 6e 74 20 6f 66 0a 20 20 20 20 20 20 2a 2a  tent of.      **
27e50 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77   the current row
27e60 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
27e70 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
27e80 65 72 65 28 76 2c 20 6a 31 29 3b 0a 20 20 20 20  ere(v, j1);.    
27e90 20 20 75 70 64 61 74 65 41 63 63 75 6d 75 6c 61    updateAccumula
27ea0 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41 67  tor(pParse, &sAg
27eb0 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73 71  gInfo);.      sq
27ec0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
27ed0 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31  v, OP_Integer, 1
27ee0 2c 20 69 55 73 65 46 6c 61 67 29 3b 0a 20 20 20  , iUseFlag);.   
27ef0 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
27f00 76 2c 20 22 69 6e 64 69 63 61 74 65 20 64 61 74  v, "indicate dat
27f10 61 20 69 6e 20 61 63 63 75 6d 75 6c 61 74 6f 72  a in accumulator
27f20 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 45  "));..      /* E
27f30 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70 0a 20  nd of the loop. 
27f40 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
27f50 28 20 67 72 6f 75 70 42 79 53 6f 72 74 20 29 7b  ( groupBySort ){
27f60 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
27f70 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
27f80 5f 53 6f 72 74 65 72 4e 65 78 74 2c 20 73 41 67  _SorterNext, sAg
27f90 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78  gInfo.sortingIdx
27fa0 2c 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 29  , addrTopOfLoop)
27fb0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
27fc0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68         sqlite3Wh
27fd0 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a  ereEnd(pWInfo);.
27fe0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
27ff0 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28  dbeChangeToNoop(
28000 76 2c 20 61 64 64 72 53 6f 72 74 69 6e 67 49 64  v, addrSortingId
28010 78 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  x);.      }..   
28020 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 74 68 65     /* Output the
28030 20 66 69 6e 61 6c 20 72 6f 77 20 6f 66 20 72 65   final row of re
28040 73 75 6c 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20  sult.      */.  
28050 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
28060 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75  ddOp2(v, OP_Gosu
28070 62 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77 2c  b, regOutputRow,
28080 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 29 3b   addrOutputRow);
28090 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
280a0 6e 74 28 28 76 2c 20 22 6f 75 74 70 75 74 20 66  nt((v, "output f
280b0 69 6e 61 6c 20 72 6f 77 22 29 29 3b 0a 0a 20 20  inal row"));..  
280c0 20 20 20 20 2f 2a 20 4a 75 6d 70 20 6f 76 65 72      /* Jump over
280d0 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 73   the subroutines
280e0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
280f0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
28100 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
28110 20 61 64 64 72 45 6e 64 29 3b 0a 0a 20 20 20 20   addrEnd);..    
28120 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20    /* Generate a 
28130 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20  subroutine that 
28140 6f 75 74 70 75 74 73 20 61 20 73 69 6e 67 6c 65  outputs a single
28150 20 72 6f 77 20 6f 66 20 74 68 65 20 72 65 73 75   row of the resu
28160 6c 74 0a 20 20 20 20 20 20 2a 2a 20 73 65 74 2e  lt.      ** set.
28170 20 20 54 68 69 73 20 73 75 62 72 6f 75 74 69 6e    This subroutin
28180 65 20 66 69 72 73 74 20 6c 6f 6f 6b 73 20 61 74  e first looks at
28190 20 74 68 65 20 69 55 73 65 46 6c 61 67 2e 20 20   the iUseFlag.  
281a0 49 66 20 69 55 73 65 46 6c 61 67 0a 20 20 20 20  If iUseFlag.    
281b0 20 20 2a 2a 20 69 73 20 6c 65 73 73 20 74 68 61    ** is less tha
281c0 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 65  n or equal to ze
281d0 72 6f 2c 20 74 68 65 20 73 75 62 72 6f 75 74 69  ro, the subrouti
281e0 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20  ne is a no-op.  
281f0 49 66 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  If.      ** the 
28200 70 72 6f 63 65 73 73 69 6e 67 20 63 61 6c 6c 73  processing calls
28210 20 66 6f 72 20 74 68 65 20 71 75 65 72 79 20 74   for the query t
28220 6f 20 61 62 6f 72 74 2c 20 74 68 69 73 20 73 75  o abort, this su
28230 62 72 6f 75 74 69 6e 65 0a 20 20 20 20 20 20 2a  broutine.      *
28240 2a 20 69 6e 63 72 65 6d 65 6e 74 73 20 74 68 65  * increments the
28250 20 69 41 62 6f 72 74 46 6c 61 67 20 6d 65 6d 6f   iAbortFlag memo
28260 72 79 20 6c 6f 63 61 74 69 6f 6e 20 62 65 66 6f  ry location befo
28270 72 65 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 0a  re returning in.
28280 20 20 20 20 20 20 2a 2a 20 6f 72 64 65 72 20 74        ** order t
28290 6f 20 73 69 67 6e 61 6c 20 74 68 65 20 63 61 6c  o signal the cal
282a0 6c 65 72 20 74 6f 20 61 62 6f 72 74 2e 0a 20 20  ler to abort..  
282b0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 64 64      */.      add
282c0 72 53 65 74 41 62 6f 72 74 20 3d 20 73 71 6c 69  rSetAbort = sqli
282d0 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
282e0 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c  dr(v);.      sql
282f0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
28300 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c  , OP_Integer, 1,
28310 20 69 41 62 6f 72 74 46 6c 61 67 29 3b 0a 20 20   iAbortFlag);.  
28320 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
28330 28 76 2c 20 22 73 65 74 20 61 62 6f 72 74 20 66  (v, "set abort f
28340 6c 61 67 22 29 29 3b 0a 20 20 20 20 20 20 73 71  lag"));.      sq
28350 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
28360 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65  v, OP_Return, re
28370 67 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20  gOutputRow);.   
28380 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
28390 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64  solveLabel(v, ad
283a0 64 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20  drOutputRow);.  
283b0 20 20 20 20 61 64 64 72 4f 75 74 70 75 74 52 6f      addrOutputRo
283c0 77 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  w = sqlite3VdbeC
283d0 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
283e0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
283f0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 50  AddOp2(v, OP_IfP
28400 6f 73 2c 20 69 55 73 65 46 6c 61 67 2c 20 61 64  os, iUseFlag, ad
28410 64 72 4f 75 74 70 75 74 52 6f 77 2b 32 29 3b 0a  drOutputRow+2);.
28420 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
28430 74 28 28 76 2c 20 22 47 72 6f 75 70 62 79 20 72  t((v, "Groupby r
28440 65 73 75 6c 74 20 67 65 6e 65 72 61 74 6f 72 20  esult generator 
28450 65 6e 74 72 79 20 70 6f 69 6e 74 22 29 29 3b 0a  entry point"));.
28460 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
28470 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65  eAddOp1(v, OP_Re
28480 74 75 72 6e 2c 20 72 65 67 4f 75 74 70 75 74 52  turn, regOutputR
28490 6f 77 29 3b 0a 20 20 20 20 20 20 66 69 6e 61 6c  ow);.      final
284a0 69 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e 73 28  izeAggFunctions(
284b0 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66  pParse, &sAggInf
284c0 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  o);.      sqlite
284d0 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
284e0 72 73 65 2c 20 70 48 61 76 69 6e 67 2c 20 61 64  rse, pHaving, ad
284f0 64 72 4f 75 74 70 75 74 52 6f 77 2b 31 2c 20 53  drOutputRow+1, S
28500 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
28510 29 3b 0a 20 20 20 20 20 20 73 65 6c 65 63 74 49  );.      selectI
28520 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c  nnerLoop(pParse,
28530 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 30   p, p->pEList, 0
28540 2c 20 30 2c 20 70 4f 72 64 65 72 42 79 2c 0a 20  , 0, pOrderBy,. 
28550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28560 20 20 20 20 20 26 73 44 69 73 74 69 6e 63 74 2c       &sDistinct,
28570 20 70 44 65 73 74 2c 0a 20 20 20 20 20 20 20 20   pDest,.        
28580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 64                ad
28590 64 72 4f 75 74 70 75 74 52 6f 77 2b 31 2c 20 61  drOutputRow+1, a
285a0 64 64 72 53 65 74 41 62 6f 72 74 29 3b 0a 20 20  ddrSetAbort);.  
285b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
285c0 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75  ddOp1(v, OP_Retu
285d0 72 6e 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77  rn, regOutputRow
285e0 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
285f0 6d 65 6e 74 28 28 76 2c 20 22 65 6e 64 20 67 72  ment((v, "end gr
28600 6f 75 70 62 79 20 72 65 73 75 6c 74 20 67 65 6e  oupby result gen
28610 65 72 61 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20  erator"));..    
28620 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20    /* Generate a 
28630 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20  subroutine that 
28640 77 69 6c 6c 20 72 65 73 65 74 20 74 68 65 20 67  will reset the g
28650 72 6f 75 70 2d 62 79 20 61 63 63 75 6d 75 6c 61  roup-by accumula
28660 74 6f 72 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  tor.      */.   
28670 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
28680 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64  solveLabel(v, ad
28690 64 72 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20  drReset);.      
286a0 72 65 73 65 74 41 63 63 75 6d 75 6c 61 74 6f 72  resetAccumulator
286b0 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e  (pParse, &sAggIn
286c0 66 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  fo);.      sqlit
286d0 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
286e0 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 52 65  OP_Return, regRe
286f0 73 65 74 29 3b 0a 20 20 20 20 20 0a 20 20 20 20  set);.     .    
28700 7d 20 2f 2a 20 65 6e 64 69 66 20 70 47 72 6f 75  } /* endif pGrou
28710 70 42 79 2e 20 20 42 65 67 69 6e 20 61 67 67 72  pBy.  Begin aggr
28720 65 67 61 74 65 20 71 75 65 72 69 65 73 20 77 69  egate queries wi
28730 74 68 6f 75 74 20 47 52 4f 55 50 20 42 59 3a 20  thout GROUP BY: 
28740 2a 2f 0a 20 20 20 20 65 6c 73 65 20 7b 0a 20 20  */.    else {.  
28750 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 44      ExprList *pD
28760 65 6c 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20  el = 0;.#ifndef 
28770 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 54 52 45  SQLITE_OMIT_BTRE
28780 45 43 4f 55 4e 54 0a 20 20 20 20 20 20 54 61 62  ECOUNT.      Tab
28790 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 20 20  le *pTab;.      
287a0 69 66 28 20 28 70 54 61 62 20 3d 20 69 73 53 69  if( (pTab = isSi
287b0 6d 70 6c 65 43 6f 75 6e 74 28 70 2c 20 26 73 41  mpleCount(p, &sA
287c0 67 67 49 6e 66 6f 29 29 21 3d 30 20 29 7b 0a 20  ggInfo))!=0 ){. 
287d0 20 20 20 20 20 20 20 2f 2a 20 49 66 20 69 73 53         /* If isS
287e0 69 6d 70 6c 65 43 6f 75 6e 74 28 29 20 72 65 74  impleCount() ret
287f0 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74  urns a pointer t
28800 6f 20 61 20 54 61 62 6c 65 20 73 74 72 75 63 74  o a Table struct
28810 75 72 65 2c 20 74 68 65 6e 0a 20 20 20 20 20 20  ure, then.      
28820 20 20 2a 2a 20 74 68 65 20 53 51 4c 20 73 74 61    ** the SQL sta
28830 74 65 6d 65 6e 74 20 69 73 20 6f 66 20 74 68 65  tement is of the
28840 20 66 6f 72 6d 3a 0a 20 20 20 20 20 20 20 20 2a   form:.        *
28850 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 53  *.        **   S
28860 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
28870 52 4f 4d 20 3c 74 62 6c 3e 0a 20 20 20 20 20 20  ROM <tbl>.      
28880 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
28890 77 68 65 72 65 20 74 68 65 20 54 61 62 6c 65 20  where the Table 
288a0 73 74 72 75 63 74 75 72 65 20 72 65 74 75 72 6e  structure return
288b0 65 64 20 72 65 70 72 65 73 65 6e 74 73 20 74 61  ed represents ta
288c0 62 6c 65 20 3c 74 62 6c 3e 2e 0a 20 20 20 20 20  ble <tbl>..     
288d0 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
288e0 20 54 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20   This statement 
288f0 69 73 20 73 6f 20 63 6f 6d 6d 6f 6e 20 74 68 61  is so common tha
28900 74 20 69 74 20 69 73 20 6f 70 74 69 6d 69 7a 65  t it is optimize
28910 64 20 73 70 65 63 69 61 6c 6c 79 2e 20 54 68 65  d specially. The
28920 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 50 5f 43  .        ** OP_C
28930 6f 75 6e 74 20 69 6e 73 74 72 75 63 74 69 6f 6e  ount instruction
28940 20 69 73 20 65 78 65 63 75 74 65 64 20 65 69 74   is executed eit
28950 68 65 72 20 6f 6e 20 74 68 65 20 69 6e 74 6b 65  her on the intke
28960 79 20 74 61 62 6c 65 20 74 68 61 74 0a 20 20 20  y table that.   
28970 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73       ** contains
28980 20 74 68 65 20 64 61 74 61 20 66 6f 72 20 74 61   the data for ta
28990 62 6c 65 20 3c 74 62 6c 3e 20 6f 72 20 6f 6e 20  ble <tbl> or on 
289a0 6f 6e 65 20 6f 66 20 69 74 73 20 69 6e 64 65 78  one of its index
289b0 65 73 2e 20 49 74 0a 20 20 20 20 20 20 20 20 2a  es. It.        *
289c0 2a 20 69 73 20 62 65 74 74 65 72 20 74 6f 20 65  * is better to e
289d0 78 65 63 75 74 65 20 74 68 65 20 6f 70 20 6f 6e  xecute the op on
289e0 20 61 6e 20 69 6e 64 65 78 2c 20 61 73 20 69 6e   an index, as in
289f0 64 65 78 65 73 20 61 72 65 20 61 6c 6d 6f 73 74  dexes are almost
28a00 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 77 61  .        ** alwa
28a10 79 73 20 73 70 72 65 61 64 20 61 63 72 6f 73 73  ys spread across
28a20 20 6c 65 73 73 20 70 61 67 65 73 20 74 68 61 6e   less pages than
28a30 20 74 68 65 69 72 20 63 6f 72 72 65 73 70 6f 6e   their correspon
28a40 64 69 6e 67 20 74 61 62 6c 65 73 2e 0a 20 20 20  ding tables..   
28a50 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
28a60 63 6f 6e 73 74 20 69 6e 74 20 69 44 62 20 3d 20  const int iDb = 
28a70 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
28a80 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c  ndex(pParse->db,
28a90 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b   pTab->pSchema);
28aa0 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 69  .        const i
28ab0 6e 74 20 69 43 73 72 20 3d 20 70 50 61 72 73 65  nt iCsr = pParse
28ac0 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20 20 20 2f 2a  ->nTab++;     /*
28ad0 20 43 75 72 73 6f 72 20 74 6f 20 73 63 61 6e 20   Cursor to scan 
28ae0 62 2d 74 72 65 65 20 2a 2f 0a 20 20 20 20 20 20  b-tree */.      
28af0 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20    Index *pIdx;  
28b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b10 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74         /* Iterat
28b20 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20  or variable */. 
28b30 20 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a         KeyInfo *
28b40 70 4b 65 79 49 6e 66 6f 20 3d 20 30 3b 20 20 20  pKeyInfo = 0;   
28b50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4b              /* K
28b60 65 79 69 6e 66 6f 20 66 6f 72 20 73 63 61 6e 6e  eyinfo for scann
28b70 65 64 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20  ed index */.    
28b80 20 20 20 20 49 6e 64 65 78 20 2a 70 42 65 73 74      Index *pBest
28b90 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
28ba0 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65 73 74           /* Best
28bb0 20 69 6e 64 65 78 20 66 6f 75 6e 64 20 73 6f 20   index found so 
28bc0 66 61 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  far */.        i
28bd0 6e 74 20 69 52 6f 6f 74 20 3d 20 70 54 61 62 2d  nt iRoot = pTab-
28be0 3e 74 6e 75 6d 3b 20 20 20 20 20 20 20 20 20 20  >tnum;          
28bf0 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65      /* Root page
28c00 20 6f 66 20 73 63 61 6e 6e 65 64 20 62 2d 74 72   of scanned b-tr
28c10 65 65 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 73  ee */..        s
28c20 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79  qlite3CodeVerify
28c30 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69  Schema(pParse, i
28c40 44 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  Db);.        sql
28c50 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50  ite3TableLock(pP
28c60 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d  arse, iDb, pTab-
28c70 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e  >tnum, 0, pTab->
28c80 7a 4e 61 6d 65 29 3b 0a 0a 20 20 20 20 20 20 20  zName);..       
28c90 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 74   /* Search for t
28ca0 68 65 20 69 6e 64 65 78 20 74 68 61 74 20 68 61  he index that ha
28cb0 73 20 74 68 65 20 6c 65 61 73 74 20 61 6d 6f 75  s the least amou
28cc0 6e 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 2e 20 49  nt of columns. I
28cd0 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  f.        ** the
28ce0 72 65 20 69 73 20 73 75 63 68 20 61 6e 20 69 6e  re is such an in
28cf0 64 65 78 2c 20 61 6e 64 20 69 74 20 68 61 73 20  dex, and it has 
28d00 6c 65 73 73 20 63 6f 6c 75 6d 6e 73 20 74 68 61  less columns tha
28d10 6e 20 74 68 65 20 74 61 62 6c 65 0a 20 20 20 20  n the table.    
28d20 20 20 20 20 2a 2a 20 64 6f 65 73 2c 20 74 68 65      ** does, the
28d30 6e 20 77 65 20 63 61 6e 20 61 73 73 75 6d 65 20  n we can assume 
28d40 74 68 61 74 20 69 74 20 63 6f 6e 73 75 6d 65 73  that it consumes
28d50 20 6c 65 73 73 20 73 70 61 63 65 20 6f 6e 20 64   less space on d
28d60 69 73 6b 20 61 6e 64 0a 20 20 20 20 20 20 20 20  isk and.        
28d70 2a 2a 20 77 69 6c 6c 20 74 68 65 72 65 66 6f 72  ** will therefor
28d80 65 20 62 65 20 63 68 65 61 70 65 72 20 74 6f 20  e be cheaper to 
28d90 73 63 61 6e 20 74 6f 20 64 65 74 65 72 6d 69 6e  scan to determin
28da0 65 20 74 68 65 20 71 75 65 72 79 20 72 65 73 75  e the query resu
28db0 6c 74 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 49  lt..        ** I
28dc0 6e 20 74 68 69 73 20 63 61 73 65 20 73 65 74 20  n this case set 
28dd0 69 52 6f 6f 74 20 74 6f 20 74 68 65 20 72 6f 6f  iRoot to the roo
28de0 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  t page number of
28df0 20 74 68 65 20 69 6e 64 65 78 20 62 2d 74 72 65   the index b-tre
28e00 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64  e.        ** and
28e10 20 70 4b 65 79 49 6e 66 6f 20 74 6f 20 74 68 65   pKeyInfo to the
28e20 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75   KeyInfo structu
28e30 72 65 20 72 65 71 75 69 72 65 64 20 74 6f 20 6e  re required to n
28e40 61 76 69 67 61 74 65 20 74 68 65 0a 20 20 20 20  avigate the.    
28e50 20 20 20 20 2a 2a 20 69 6e 64 65 78 2e 0a 20 20      ** index..  
28e60 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
28e70 20 2a 2a 20 28 32 30 31 31 2d 30 34 2d 31 35 29   ** (2011-04-15)
28e80 20 44 6f 20 6e 6f 74 20 64 6f 20 61 20 66 75 6c   Do not do a ful
28e90 6c 20 73 63 61 6e 20 6f 66 20 61 6e 20 75 6e 6f  l scan of an uno
28ea0 72 64 65 72 65 64 20 69 6e 64 65 78 2e 0a 20 20  rdered index..  
28eb0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
28ec0 20 2a 2a 20 49 6e 20 70 72 61 63 74 69 63 65 20   ** In practice 
28ed0 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  the KeyInfo stru
28ee0 63 74 75 72 65 20 77 69 6c 6c 20 6e 6f 74 20 62  cture will not b
28ef0 65 20 75 73 65 64 2e 20 49 74 20 69 73 20 6f 6e  e used. It is on
28f00 6c 79 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  ly .        ** p
28f10 61 73 73 65 64 20 74 6f 20 6b 65 65 70 20 4f 50  assed to keep OP
28f20 5f 4f 70 65 6e 52 65 61 64 20 68 61 70 70 79 2e  _OpenRead happy.
28f30 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
28f40 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61      for(pIdx=pTa
28f50 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b  b->pIndex; pIdx;
28f60 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
28f70 74 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  t){.          if
28f80 28 20 70 49 64 78 2d 3e 62 55 6e 6f 72 64 65 72  ( pIdx->bUnorder
28f90 65 64 3d 3d 30 20 26 26 20 28 21 70 42 65 73 74  ed==0 && (!pBest
28fa0 20 7c 7c 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d   || pIdx->nColum
28fb0 6e 3c 70 42 65 73 74 2d 3e 6e 43 6f 6c 75 6d 6e  n<pBest->nColumn
28fc0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
28fd0 20 70 42 65 73 74 20 3d 20 70 49 64 78 3b 0a 20   pBest = pIdx;. 
28fe0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
28ff0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
29000 20 70 42 65 73 74 20 26 26 20 70 42 65 73 74 2d   pBest && pBest-
29010 3e 6e 43 6f 6c 75 6d 6e 3c 70 54 61 62 2d 3e 6e  >nColumn<pTab->n
29020 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Col ){.         
29030 20 69 52 6f 6f 74 20 3d 20 70 42 65 73 74 2d 3e   iRoot = pBest->
29040 74 6e 75 6d 3b 0a 20 20 20 20 20 20 20 20 20 20  tnum;.          
29050 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74  pKeyInfo = sqlit
29060 65 33 49 6e 64 65 78 4b 65 79 69 6e 66 6f 28 70  e3IndexKeyinfo(p
29070 50 61 72 73 65 2c 20 70 42 65 73 74 29 3b 0a 20  Parse, pBest);. 
29080 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
29090 20 20 2f 2a 20 4f 70 65 6e 20 61 20 72 65 61 64    /* Open a read
290a0 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 2c 20 65 78  -only cursor, ex
290b0 65 63 75 74 65 20 74 68 65 20 4f 50 5f 43 6f 75  ecute the OP_Cou
290c0 6e 74 2c 20 63 6c 6f 73 65 20 74 68 65 20 63 75  nt, close the cu
290d0 72 73 6f 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20  rsor. */.       
290e0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
290f0 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61  p3(v, OP_OpenRea
29100 64 2c 20 69 43 73 72 2c 20 69 52 6f 6f 74 2c 20  d, iCsr, iRoot, 
29110 69 44 62 29 3b 0a 20 20 20 20 20 20 20 20 69 66  iDb);.        if
29120 28 20 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20  ( pKeyInfo ){.  
29130 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
29140 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d  dbeChangeP4(v, -
29150 31 2c 20 28 63 68 61 72 20 2a 29 70 4b 65 79 49  1, (char *)pKeyI
29160 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f  nfo, P4_KEYINFO_
29170 48 41 4e 44 4f 46 46 29 3b 0a 20 20 20 20 20 20  HANDOFF);.      
29180 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
29190 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
291a0 20 4f 50 5f 43 6f 75 6e 74 2c 20 69 43 73 72 2c   OP_Count, iCsr,
291b0 20 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b   sAggInfo.aFunc[
291c0 30 5d 2e 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20  0].iMem);.      
291d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
291e0 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  Op1(v, OP_Close,
291f0 20 69 43 73 72 29 3b 0a 20 20 20 20 20 20 20 20   iCsr);.        
29200 65 78 70 6c 61 69 6e 53 69 6d 70 6c 65 43 6f 75  explainSimpleCou
29210 6e 74 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c  nt(pParse, pTab,
29220 20 70 42 65 73 74 29 3b 0a 20 20 20 20 20 20 7d   pBest);.      }
29230 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53  else.#endif /* S
29240 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 54 52 45 45  QLITE_OMIT_BTREE
29250 43 4f 55 4e 54 20 2a 2f 0a 20 20 20 20 20 20 7b  COUNT */.      {
29260 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63  .        /* Chec
29270 6b 20 69 66 20 74 68 65 20 71 75 65 72 79 20 69  k if the query i
29280 73 20 6f 66 20 6f 6e 65 20 6f 66 20 74 68 65 20  s of one of the 
29290 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d 73 3a  following forms:
292a0 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
292b0 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20      **   SELECT 
292c0 6d 69 6e 28 78 29 20 46 52 4f 4d 20 2e 2e 2e 0a  min(x) FROM ....
292d0 20 20 20 20 20 20 20 20 2a 2a 20 20 20 53 45 4c          **   SEL
292e0 45 43 54 20 6d 61 78 28 78 29 20 46 52 4f 4d 20  ECT max(x) FROM 
292f0 2e 2e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ....        **. 
29300 20 20 20 20 20 20 20 2a 2a 20 49 66 20 69 74 20         ** If it 
29310 69 73 2c 20 74 68 65 6e 20 61 73 6b 20 74 68 65  is, then ask the
29320 20 63 6f 64 65 20 69 6e 20 77 68 65 72 65 2e 63   code in where.c
29330 20 74 6f 20 61 74 74 65 6d 70 74 20 74 6f 20 73   to attempt to s
29340 6f 72 74 20 72 65 73 75 6c 74 73 0a 20 20 20 20  ort results.    
29350 20 20 20 20 2a 2a 20 61 73 20 69 66 20 74 68 65      ** as if the
29360 72 65 20 77 61 73 20 61 6e 20 22 4f 52 44 45 52  re was an "ORDER
29370 20 4f 4e 20 78 22 20 6f 72 20 22 4f 52 44 45 52   ON x" or "ORDER
29380 20 4f 4e 20 78 20 44 45 53 43 22 20 63 6c 61 75   ON x DESC" clau
29390 73 65 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  se. .        ** 
293a0 49 66 20 77 68 65 72 65 2e 63 20 69 73 20 61 62  If where.c is ab
293b0 6c 65 20 74 6f 20 70 72 6f 64 75 63 65 20 72 65  le to produce re
293c0 73 75 6c 74 73 20 73 6f 72 74 65 64 20 69 6e 20  sults sorted in 
293d0 74 68 69 73 20 6f 72 64 65 72 2c 20 74 68 65 6e  this order, then
293e0 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 64 64 20  .        ** add 
293f0 76 64 62 65 20 63 6f 64 65 20 74 6f 20 62 72 65  vdbe code to bre
29400 61 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 70 72  ak out of the pr
29410 6f 63 65 73 73 69 6e 67 20 6c 6f 6f 70 20 61 66  ocessing loop af
29420 74 65 72 20 74 68 65 20 0a 20 20 20 20 20 20 20  ter the .       
29430 20 2a 2a 20 66 69 72 73 74 20 69 74 65 72 61 74   ** first iterat
29440 69 6f 6e 20 28 73 69 6e 63 65 20 74 68 65 20 66  ion (since the f
29450 69 72 73 74 20 69 74 65 72 61 74 69 6f 6e 20 6f  irst iteration o
29460 66 20 74 68 65 20 6c 6f 6f 70 20 69 73 20 0a 20  f the loop is . 
29470 20 20 20 20 20 20 20 2a 2a 20 67 75 61 72 61 6e         ** guaran
29480 74 65 65 64 20 74 6f 20 6f 70 65 72 61 74 65 20  teed to operate 
29490 6f 6e 20 74 68 65 20 72 6f 77 20 77 69 74 68 20  on the row with 
294a0 74 68 65 20 6d 69 6e 69 6d 75 6d 20 6f 72 20 6d  the minimum or m
294b0 61 78 69 6d 75 6d 20 0a 20 20 20 20 20 20 20 20  aximum .        
294c0 2a 2a 20 76 61 6c 75 65 20 6f 66 20 78 2c 20 74  ** value of x, t
294d0 68 65 20 6f 6e 6c 79 20 72 6f 77 20 72 65 71 75  he only row requ
294e0 69 72 65 64 29 2e 0a 20 20 20 20 20 20 20 20 2a  ired)..        *
294f0 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 41 20 73  *.        ** A s
29500 70 65 63 69 61 6c 20 66 6c 61 67 20 6d 75 73 74  pecial flag must
29510 20 62 65 20 70 61 73 73 65 64 20 74 6f 20 73 71   be passed to sq
29520 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
29530 29 20 74 6f 20 73 6c 69 67 68 74 6c 79 0a 20 20  ) to slightly.  
29540 20 20 20 20 20 20 2a 2a 20 6d 6f 64 69 66 79 20        ** modify 
29550 62 65 68 61 76 69 6f 72 20 61 73 20 66 6f 6c 6c  behavior as foll
29560 6f 77 73 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ows:.        **.
29570 20 20 20 20 20 20 20 20 2a 2a 20 20 20 2b 20 49          **   + I
29580 66 20 74 68 65 20 71 75 65 72 79 20 69 73 20 61  f the query is a
29590 20 22 53 45 4c 45 43 54 20 6d 69 6e 28 78 29 22   "SELECT min(x)"
295a0 2c 20 74 68 65 6e 20 74 68 65 20 6c 6f 6f 70 20  , then the loop 
295b0 63 6f 64 65 64 20 62 79 0a 20 20 20 20 20 20 20  coded by.       
295c0 20 2a 2a 20 20 20 20 20 77 68 65 72 65 2e 63 20   **     where.c 
295d0 73 68 6f 75 6c 64 20 6e 6f 74 20 69 74 65 72 61  should not itera
295e0 74 65 20 6f 76 65 72 20 61 6e 79 20 76 61 6c 75  te over any valu
295f0 65 73 20 77 69 74 68 20 61 20 4e 55 4c 4c 20 76  es with a NULL v
29600 61 6c 75 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  alue.        ** 
29610 20 20 20 20 66 6f 72 20 78 2e 0a 20 20 20 20 20      for x..     
29620 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
29630 20 20 20 2b 20 54 68 65 20 6f 70 74 69 6d 69 7a     + The optimiz
29640 65 72 20 63 6f 64 65 20 69 6e 20 77 68 65 72 65  er code in where
29650 2e 63 20 28 74 68 65 20 74 68 69 6e 67 20 74 68  .c (the thing th
29660 61 74 20 64 65 63 69 64 65 73 20 77 68 69 63 68  at decides which
29670 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20  .        **     
29680 69 6e 64 65 78 20 6f 72 20 69 6e 64 69 63 65 73  index or indices
29690 20 74 6f 20 75 73 65 29 20 73 68 6f 75 6c 64 20   to use) should 
296a0 70 6c 61 63 65 20 61 20 64 69 66 66 65 72 65 6e  place a differen
296b0 74 20 70 72 69 6f 72 69 74 79 20 6f 6e 20 0a 20  t priority on . 
296c0 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 73 61         **     sa
296d0 74 69 73 66 79 69 6e 67 20 74 68 65 20 27 4f 52  tisfying the 'OR
296e0 44 45 52 20 42 59 27 20 63 6c 61 75 73 65 20 74  DER BY' clause t
296f0 68 61 6e 20 69 74 20 64 6f 65 73 20 69 6e 20 6f  han it does in o
29700 74 68 65 72 20 63 61 73 65 73 2e 0a 20 20 20 20  ther cases..    
29710 20 20 20 20 2a 2a 20 20 20 20 20 52 65 66 65 72      **     Refer
29720 20 74 6f 20 63 6f 64 65 20 61 6e 64 20 63 6f 6d   to code and com
29730 6d 65 6e 74 73 20 69 6e 20 77 68 65 72 65 2e 63  ments in where.c
29740 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 20 20   for details..  
29750 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
29760 20 45 78 70 72 4c 69 73 74 20 2a 70 4d 69 6e 4d   ExprList *pMinM
29770 61 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ax = 0;.        
29780 75 38 20 66 6c 61 67 20 3d 20 57 48 45 52 45 5f  u8 flag = WHERE_
29790 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b 0a  ORDERBY_NORMAL;.
297a0 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20          .       
297b0 20 61 73 73 65 72 74 28 20 70 2d 3e 70 47 72 6f   assert( p->pGro
297c0 75 70 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20  upBy==0 );.     
297d0 20 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 3d     assert( flag=
297e0 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  =0 );.        if
297f0 28 20 70 2d 3e 70 48 61 76 69 6e 67 3d 3d 30 20  ( p->pHaving==0 
29800 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6c 61  ){.          fla
29810 67 20 3d 20 6d 69 6e 4d 61 78 51 75 65 72 79 28  g = minMaxQuery(
29820 26 73 41 67 67 49 6e 66 6f 2c 20 26 70 4d 69 6e  &sAggInfo, &pMin
29830 4d 61 78 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Max);.        }.
29840 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
29850 66 6c 61 67 3d 3d 30 20 7c 7c 20 28 70 4d 69 6e  flag==0 || (pMin
29860 4d 61 78 21 3d 30 20 26 26 20 70 4d 69 6e 4d 61  Max!=0 && pMinMa
29870 78 2d 3e 6e 45 78 70 72 3d 3d 31 29 20 29 3b 0a  x->nExpr==1) );.
29880 0a 20 20 20 20 20 20 20 20 69 66 28 20 66 6c 61  .        if( fla
29890 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  g ){.          p
298a0 4d 69 6e 4d 61 78 20 3d 20 73 71 6c 69 74 65 33  MinMax = sqlite3
298b0 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20  ExprListDup(db, 
298c0 70 4d 69 6e 4d 61 78 2c 20 30 29 3b 0a 20 20 20  pMinMax, 0);.   
298d0 20 20 20 20 20 20 20 70 44 65 6c 20 3d 20 70 4d         pDel = pM
298e0 69 6e 4d 61 78 3b 0a 20 20 20 20 20 20 20 20 20  inMax;.         
298f0 20 69 66 28 20 70 4d 69 6e 4d 61 78 20 26 26 20   if( pMinMax && 
29900 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
29910 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  d ){.           
29920 20 70 4d 69 6e 4d 61 78 2d 3e 61 5b 30 5d 2e 73   pMinMax->a[0].s
29930 6f 72 74 4f 72 64 65 72 20 3d 20 66 6c 61 67 21  ortOrder = flag!
29940 3d 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d  =WHERE_ORDERBY_M
29950 49 4e 20 3f 31 3a 30 3b 0a 20 20 20 20 20 20 20  IN ?1:0;.       
29960 20 20 20 20 20 70 4d 69 6e 4d 61 78 2d 3e 61 5b       pMinMax->a[
29970 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54  0].pExpr->op = T
29980 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20  K_COLUMN;.      
29990 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
299a0 20 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68    .        /* Th
299b0 69 73 20 63 61 73 65 20 72 75 6e 73 20 69 66 20  is case runs if 
299c0 74 68 65 20 61 67 67 72 65 67 61 74 65 20 68 61  the aggregate ha
299d0 73 20 6e 6f 20 47 52 4f 55 50 20 42 59 20 63 6c  s no GROUP BY cl
299e0 61 75 73 65 2e 20 20 54 68 65 0a 20 20 20 20 20  ause.  The.     
299f0 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67     ** processing
29a00 20 69 73 20 6d 75 63 68 20 73 69 6d 70 6c 65 72   is much simpler
29a10 20 73 69 6e 63 65 20 74 68 65 72 65 20 69 73 20   since there is 
29a20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 72 6f  only a single ro
29a30 77 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20  w.        ** of 
29a40 6f 75 74 70 75 74 2e 0a 20 20 20 20 20 20 20 20  output..        
29a50 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 73 65 74  */.        reset
29a60 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72  Accumulator(pPar
29a70 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a  se, &sAggInfo);.
29a80 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f 20 3d          pWInfo =
29a90 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
29aa0 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c  in(pParse, pTabL
29ab0 69 73 74 2c 20 70 57 68 65 72 65 2c 20 70 4d 69  ist, pWhere, pMi
29ac0 6e 4d 61 78 2c 30 2c 66 6c 61 67 2c 30 29 3b 0a  nMax,0,flag,0);.
29ad0 20 20 20 20 20 20 20 20 69 66 28 20 70 57 49 6e          if( pWIn
29ae0 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  fo==0 ){.       
29af0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
29b00 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 44 65  stDelete(db, pDe
29b10 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  l);.          go
29b20 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
29b30 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
29b40 20 75 70 64 61 74 65 41 63 63 75 6d 75 6c 61 74   updateAccumulat
29b50 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41 67 67  or(pParse, &sAgg
29b60 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 61  Info);.        a
29b70 73 73 65 72 74 28 20 70 4d 69 6e 4d 61 78 3d 3d  ssert( pMinMax==
29b80 30 20 7c 7c 20 70 4d 69 6e 4d 61 78 2d 3e 6e 45  0 || pMinMax->nE
29b90 78 70 72 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  xpr==1 );.      
29ba0 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65    if( sqlite3Whe
29bb0 72 65 49 73 4f 72 64 65 72 65 64 28 70 57 49 6e  reIsOrdered(pWIn
29bc0 66 6f 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  fo) ){.         
29bd0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
29be0 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
29bf0 2c 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 72  , sqlite3WhereBr
29c00 65 61 6b 4c 61 62 65 6c 28 70 57 49 6e 66 6f 29  eakLabel(pWInfo)
29c10 29 3b 0a 20 20 20 20 20 20 20 20 20 20 56 64 62  );.          Vdb
29c20 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73  eComment((v, "%s
29c30 28 29 20 62 79 20 69 6e 64 65 78 22 2c 0a 20 20  () by index",.  
29c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 66                (f
29c50 6c 61 67 3d 3d 57 48 45 52 45 5f 4f 52 44 45 52  lag==WHERE_ORDER
29c60 42 59 5f 4d 49 4e 3f 22 6d 69 6e 22 3a 22 6d 61  BY_MIN?"min":"ma
29c70 78 22 29 29 29 3b 0a 20 20 20 20 20 20 20 20 7d  x")));.        }
29c80 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
29c90 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29  WhereEnd(pWInfo)
29ca0 3b 0a 20 20 20 20 20 20 20 20 66 69 6e 61 6c 69  ;.        finali
29cb0 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e 73 28 70  zeAggFunctions(p
29cc0 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f  Parse, &sAggInfo
29cd0 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
29ce0 20 20 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a    pOrderBy = 0;.
29cf0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
29d00 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
29d10 20 70 48 61 76 69 6e 67 2c 20 61 64 64 72 45 6e   pHaving, addrEn
29d20 64 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  d, SQLITE_JUMPIF
29d30 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 65 6c  NULL);.      sel
29d40 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61  ectInnerLoop(pPa
29d50 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73  rse, p, p->pELis
29d60 74 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 0a  t, 0, 0, 0, 0, .
29d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29d80 20 20 20 20 20 20 70 44 65 73 74 2c 20 61 64 64        pDest, add
29d90 72 45 6e 64 2c 20 61 64 64 72 45 6e 64 29 3b 0a  rEnd, addrEnd);.
29da0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
29db0 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
29dc0 70 44 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20  pDel);.    }.   
29dd0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
29de0 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72  lveLabel(v, addr
29df0 45 6e 64 29 3b 0a 20 20 20 20 0a 20 20 7d 20 2f  End);.    .  } /
29e00 2a 20 65 6e 64 69 66 20 61 67 67 72 65 67 61 74  * endif aggregat
29e10 65 20 71 75 65 72 79 20 2a 2f 0a 0a 20 20 69 66  e query */..  if
29e20 28 20 73 44 69 73 74 69 6e 63 74 2e 65 54 6e 63  ( sDistinct.eTnc
29e30 74 54 79 70 65 3d 3d 57 48 45 52 45 5f 44 49 53  tType==WHERE_DIS
29e40 54 49 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44 20  TINCT_UNORDERED 
29e50 29 7b 0a 20 20 20 20 65 78 70 6c 61 69 6e 54 65  ){.    explainTe
29e60 6d 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  mpTable(pParse, 
29e70 22 44 49 53 54 49 4e 43 54 22 29 3b 0a 20 20 7d  "DISTINCT");.  }
29e80 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
29e90 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  is an ORDER BY c
29ea0 6c 61 75 73 65 2c 20 74 68 65 6e 20 77 65 20 6e  lause, then we n
29eb0 65 65 64 20 74 6f 20 73 6f 72 74 20 74 68 65 20  eed to sort the 
29ec0 72 65 73 75 6c 74 73 0a 20 20 2a 2a 20 61 6e 64  results.  ** and
29ed0 20 73 65 6e 64 20 74 68 65 6d 20 74 6f 20 74 68   send them to th
29ee0 65 20 63 61 6c 6c 62 61 63 6b 20 6f 6e 65 20 62  e callback one b
29ef0 79 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  y one..  */.  if
29f00 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ( pOrderBy ){.  
29f10 20 20 65 78 70 6c 61 69 6e 54 65 6d 70 54 61 62    explainTempTab
29f20 6c 65 28 70 50 61 72 73 65 2c 20 22 4f 52 44 45  le(pParse, "ORDE
29f30 52 20 42 59 22 29 3b 0a 20 20 20 20 67 65 6e 65  R BY");.    gene
29f40 72 61 74 65 53 6f 72 74 54 61 69 6c 28 70 50 61  rateSortTail(pPa
29f50 72 73 65 2c 20 70 2c 20 76 2c 20 70 45 4c 69 73  rse, p, v, pELis
29f60 74 2d 3e 6e 45 78 70 72 2c 20 70 44 65 73 74 29  t->nExpr, pDest)
29f70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70  ;.  }..  /* Jump
29f80 20 68 65 72 65 20 74 6f 20 73 6b 69 70 20 74 68   here to skip th
29f90 69 73 20 71 75 65 72 79 0a 20 20 2a 2f 0a 20 20  is query.  */.  
29fa0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
29fb0 76 65 4c 61 62 65 6c 28 76 2c 20 69 45 6e 64 29  veLabel(v, iEnd)
29fc0 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 53 45 4c 45  ;..  /* The SELE
29fd0 43 54 20 77 61 73 20 73 75 63 63 65 73 73 66 75  CT was successfu
29fe0 6c 6c 79 20 63 6f 64 65 64 2e 20 20 20 53 65 74  lly coded.   Set
29ff0 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65   the return code
2a000 20 74 6f 20 30 0a 20 20 2a 2a 20 74 6f 20 69 6e   to 0.  ** to in
2a010 64 69 63 61 74 65 20 6e 6f 20 65 72 72 6f 72 73  dicate no errors
2a020 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 30 3b  ..  */.  rc = 0;
2a030 0a 0a 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20 6a  ..  /* Control j
2a040 75 6d 70 73 20 74 6f 20 68 65 72 65 20 69 66 20  umps to here if 
2a050 61 6e 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f  an error is enco
2a060 75 6e 74 65 72 65 64 20 61 62 6f 76 65 2c 20 6f  untered above, o
2a070 72 20 75 70 6f 6e 0a 20 20 2a 2a 20 73 75 63 63  r upon.  ** succ
2a080 65 73 73 66 75 6c 20 63 6f 64 69 6e 67 20 6f 66  essful coding of
2a090 20 74 68 65 20 53 45 4c 45 43 54 2e 0a 20 20 2a   the SELECT..  *
2a0a0 2f 0a 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 20 20  /.select_end:.  
2a0b0 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65  explainSetIntege
2a0c0 72 28 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63  r(pParse->iSelec
2a0d0 74 49 64 2c 20 69 52 65 73 74 6f 72 65 53 65 6c  tId, iRestoreSel
2a0e0 65 63 74 49 64 29 3b 0a 0a 20 20 2f 2a 20 49 64  ectId);..  /* Id
2a0f0 65 6e 74 69 66 79 20 63 6f 6c 75 6d 6e 20 6e 61  entify column na
2a100 6d 65 73 20 69 66 20 72 65 73 75 6c 74 73 20 6f  mes if results o
2a110 66 20 74 68 65 20 53 45 4c 45 43 54 20 61 72 65  f the SELECT are
2a120 20 74 6f 20 62 65 20 6f 75 74 70 75 74 2e 0a 20   to be output.. 
2a130 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   */.  if( rc==SQ
2a140 4c 49 54 45 5f 4f 4b 20 26 26 20 70 44 65 73 74  LITE_OK && pDest
2a150 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74  ->eDest==SRT_Out
2a160 70 75 74 20 29 7b 0a 20 20 20 20 67 65 6e 65 72  put ){.    gener
2a170 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70  ateColumnNames(p
2a180 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c  Parse, pTabList,
2a190 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a 20   pEList);.  }.. 
2a1a0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
2a1b0 62 2c 20 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c  b, sAggInfo.aCol
2a1c0 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
2a1d0 65 65 28 64 62 2c 20 73 41 67 67 49 6e 66 6f 2e  ee(db, sAggInfo.
2a1e0 61 46 75 6e 63 29 3b 0a 20 20 72 65 74 75 72 6e  aFunc);.  return
2a1f0 20 72 63 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69   rc;.}..#if defi
2a200 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
2a210 45 5f 54 52 45 45 5f 45 58 50 4c 41 49 4e 29 0a  E_TREE_EXPLAIN).
2a220 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61  /*.** Generate a
2a230 20 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20   human-readable 
2a240 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 61  description of a
2a250 20 74 68 65 20 53 65 6c 65 63 74 20 6f 62 6a 65   the Select obje
2a260 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ct..*/.static vo
2a270 69 64 20 65 78 70 6c 61 69 6e 4f 6e 65 53 65 6c  id explainOneSel
2a280 65 63 74 28 56 64 62 65 20 2a 70 56 64 62 65 2c  ect(Vdbe *pVdbe,
2a290 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 73   Select *p){.  s
2a2a0 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69  qlite3ExplainPri
2a2b0 6e 74 66 28 70 56 64 62 65 2c 20 22 53 45 4c 45  ntf(pVdbe, "SELE
2a2c0 43 54 20 22 29 3b 0a 20 20 69 66 28 20 70 2d 3e  CT ");.  if( p->
2a2d0 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44  selFlags & (SF_D
2a2e0 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65  istinct|SF_Aggre
2a2f0 67 61 74 65 29 20 29 7b 0a 20 20 20 20 69 66 28  gate) ){.    if(
2a300 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53   p->selFlags & S
2a310 46 5f 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20  F_Distinct ){.  
2a320 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
2a330 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20  inPrintf(pVdbe, 
2a340 22 44 49 53 54 49 4e 43 54 20 22 29 3b 0a 20 20  "DISTINCT ");.  
2a350 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 73    }.    if( p->s
2a360 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67 67  elFlags & SF_Agg
2a370 72 65 67 61 74 65 20 29 7b 0a 20 20 20 20 20 20  regate ){.      
2a380 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
2a390 69 6e 74 66 28 70 56 64 62 65 2c 20 22 61 67 67  intf(pVdbe, "agg
2a3a0 5f 66 6c 61 67 20 22 29 3b 0a 20 20 20 20 7d 0a  _flag ");.    }.
2a3b0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
2a3c0 69 6e 4e 4c 28 70 56 64 62 65 29 3b 0a 20 20 20  inNL(pVdbe);.   
2a3d0 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
2a3e0 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22 20 20  rintf(pVdbe, "  
2a3f0 20 22 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74   ");.  }.  sqlit
2a400 65 33 45 78 70 6c 61 69 6e 45 78 70 72 4c 69 73  e3ExplainExprLis
2a410 74 28 70 56 64 62 65 2c 20 70 2d 3e 70 45 4c 69  t(pVdbe, p->pELi
2a420 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  st);.  sqlite3Ex
2a430 70 6c 61 69 6e 4e 4c 28 70 56 64 62 65 29 3b 0a  plainNL(pVdbe);.
2a440 20 20 69 66 28 20 70 2d 3e 70 53 72 63 20 26 26    if( p->pSrc &&
2a450 20 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 20 29   p->pSrc->nSrc )
2a460 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
2a470 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
2a480 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22 46 52  rintf(pVdbe, "FR
2a490 4f 4d 20 22 29 3b 0a 20 20 20 20 73 71 6c 69 74  OM ");.    sqlit
2a4a0 65 33 45 78 70 6c 61 69 6e 50 75 73 68 28 70 56  e3ExplainPush(pV
2a4b0 64 62 65 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  dbe);.    for(i=
2a4c0 30 3b 20 69 3c 70 2d 3e 70 53 72 63 2d 3e 6e 53  0; i<p->pSrc->nS
2a4d0 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rc; i++){.      
2a4e0 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
2a4f0 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 2d  tem *pItem = &p-
2a500 3e 70 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20  >pSrc->a[i];.   
2a510 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
2a520 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22  nPrintf(pVdbe, "
2a530 7b 25 64 2c 2a 7d 20 3d 20 22 2c 20 70 49 74 65  {%d,*} = ", pIte
2a540 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20  m->iCursor);.   
2a550 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 53     if( pItem->pS
2a560 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20  elect ){.       
2a570 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 53   sqlite3ExplainS
2a580 65 6c 65 63 74 28 70 56 64 62 65 2c 20 70 49 74  elect(pVdbe, pIt
2a590 65 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20  em->pSelect);.  
2a5a0 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d        if( pItem-
2a5b0 3e 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20  >pTab ){.       
2a5c0 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
2a5d0 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22  nPrintf(pVdbe, "
2a5e0 20 28 74 61 62 6e 61 6d 65 3d 25 73 29 22 2c 20   (tabname=%s)", 
2a5f0 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61  pItem->pTab->zNa
2a600 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  me);.        }. 
2a610 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
2a620 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 29 7b 0a 20  Item->zName ){. 
2a630 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
2a640 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62  plainPrintf(pVdb
2a650 65 2c 20 22 25 73 22 2c 20 70 49 74 65 6d 2d 3e  e, "%s", pItem->
2a660 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a  zName);.      }.
2a670 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d        if( pItem-
2a680 3e 7a 41 6c 69 61 73 20 29 7b 0a 20 20 20 20 20  >zAlias ){.     
2a690 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
2a6a0 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22  nPrintf(pVdbe, "
2a6b0 20 28 41 53 20 25 73 29 22 2c 20 70 49 74 65 6d   (AS %s)", pItem
2a6c0 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 20  ->zAlias);.     
2a6d0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 49 74   }.      if( pIt
2a6e0 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a  em->jointype & J
2a6f0 54 5f 4c 45 46 54 20 29 7b 0a 20 20 20 20 20 20  T_LEFT ){.      
2a700 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
2a710 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22 20  Printf(pVdbe, " 
2a720 4c 45 46 54 2d 4a 4f 49 4e 22 29 3b 0a 20 20 20  LEFT-JOIN");.   
2a730 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
2a740 65 33 45 78 70 6c 61 69 6e 4e 4c 28 70 56 64 62  e3ExplainNL(pVdb
2a750 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  e);.    }.    sq
2a760 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 6f 70 28  lite3ExplainPop(
2a770 70 56 64 62 65 29 3b 0a 20 20 7d 0a 20 20 69 66  pVdbe);.  }.  if
2a780 28 20 70 2d 3e 70 57 68 65 72 65 20 29 7b 0a 20  ( p->pWhere ){. 
2a790 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
2a7a0 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22  nPrintf(pVdbe, "
2a7b0 57 48 45 52 45 20 22 29 3b 0a 20 20 20 20 73 71  WHERE ");.    sq
2a7c0 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72  lite3ExplainExpr
2a7d0 28 70 56 64 62 65 2c 20 70 2d 3e 70 57 68 65 72  (pVdbe, p->pWher
2a7e0 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  e);.    sqlite3E
2a7f0 78 70 6c 61 69 6e 4e 4c 28 70 56 64 62 65 29 3b  xplainNL(pVdbe);
2a800 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 47  .  }.  if( p->pG
2a810 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 73 71  roupBy ){.    sq
2a820 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e  lite3ExplainPrin
2a830 74 66 28 70 56 64 62 65 2c 20 22 47 52 4f 55 50  tf(pVdbe, "GROUP
2a840 42 59 20 22 29 3b 0a 20 20 20 20 73 71 6c 69 74  BY ");.    sqlit
2a850 65 33 45 78 70 6c 61 69 6e 45 78 70 72 4c 69 73  e3ExplainExprLis
2a860 74 28 70 56 64 62 65 2c 20 70 2d 3e 70 47 72 6f  t(pVdbe, p->pGro
2a870 75 70 42 79 29 3b 0a 20 20 20 20 73 71 6c 69 74  upBy);.    sqlit
2a880 65 33 45 78 70 6c 61 69 6e 4e 4c 28 70 56 64 62  e3ExplainNL(pVdb
2a890 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d  e);.  }.  if( p-
2a8a0 3e 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20  >pHaving ){.    
2a8b0 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
2a8c0 69 6e 74 66 28 70 56 64 62 65 2c 20 22 48 41 56  intf(pVdbe, "HAV
2a8d0 49 4e 47 20 22 29 3b 0a 20 20 20 20 73 71 6c 69  ING ");.    sqli
2a8e0 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72 28 70  te3ExplainExpr(p
2a8f0 56 64 62 65 2c 20 70 2d 3e 70 48 61 76 69 6e 67  Vdbe, p->pHaving
2a900 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
2a910 70 6c 61 69 6e 4e 4c 28 70 56 64 62 65 29 3b 0a  plainNL(pVdbe);.
2a920 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72    }.  if( p->pOr
2a930 64 65 72 42 79 20 29 7b 0a 20 20 20 20 73 71 6c  derBy ){.    sql
2a940 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74  ite3ExplainPrint
2a950 66 28 70 56 64 62 65 2c 20 22 4f 52 44 45 52 42  f(pVdbe, "ORDERB
2a960 59 20 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Y ");.    sqlite
2a970 33 45 78 70 6c 61 69 6e 45 78 70 72 4c 69 73 74  3ExplainExprList
2a980 28 70 56 64 62 65 2c 20 70 2d 3e 70 4f 72 64 65  (pVdbe, p->pOrde
2a990 72 42 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  rBy);.    sqlite
2a9a0 33 45 78 70 6c 61 69 6e 4e 4c 28 70 56 64 62 65  3ExplainNL(pVdbe
2a9b0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  );.  }.  if( p->
2a9c0 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71  pLimit ){.    sq
2a9d0 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e  lite3ExplainPrin
2a9e0 74 66 28 70 56 64 62 65 2c 20 22 4c 49 4d 49 54  tf(pVdbe, "LIMIT
2a9f0 20 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   ");.    sqlite3
2aa00 45 78 70 6c 61 69 6e 45 78 70 72 28 70 56 64 62  ExplainExpr(pVdb
2aa10 65 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20  e, p->pLimit);. 
2aa20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
2aa30 6e 4e 4c 28 70 56 64 62 65 29 3b 0a 20 20 7d 0a  nNL(pVdbe);.  }.
2aa40 20 20 69 66 28 20 70 2d 3e 70 4f 66 66 73 65 74    if( p->pOffset
2aa50 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
2aa60 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64  xplainPrintf(pVd
2aa70 62 65 2c 20 22 4f 46 46 53 45 54 20 22 29 3b 0a  be, "OFFSET ");.
2aa80 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
2aa90 69 6e 45 78 70 72 28 70 56 64 62 65 2c 20 70 2d  inExpr(pVdbe, p-
2aaa0 3e 70 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 73  >pOffset);.    s
2aab0 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 4e 4c 28  qlite3ExplainNL(
2aac0 70 56 64 62 65 29 3b 0a 20 20 7d 0a 7d 0a 76 6f  pVdbe);.  }.}.vo
2aad0 69 64 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69  id sqlite3Explai
2aae0 6e 53 65 6c 65 63 74 28 56 64 62 65 20 2a 70 56  nSelect(Vdbe *pV
2aaf0 64 62 65 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b  dbe, Select *p){
2ab00 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20  .  if( p==0 ){. 
2ab10 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
2ab20 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22  nPrintf(pVdbe, "
2ab30 28 6e 75 6c 6c 2d 73 65 6c 65 63 74 29 22 29 3b  (null-select)");
2ab40 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
2ab50 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 70 50 72  .  while( p->pPr
2ab60 69 6f 72 20 29 7b 0a 20 20 20 20 70 2d 3e 70 50  ior ){.    p->pP
2ab70 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 70 3b  rior->pNext = p;
2ab80 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 50 72 69  .    p = p->pPri
2ab90 6f 72 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  or;.  }.  sqlite
2aba0 33 45 78 70 6c 61 69 6e 50 75 73 68 28 70 56 64  3ExplainPush(pVd
2abb0 62 65 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 20  be);.  while( p 
2abc0 29 7b 0a 20 20 20 20 65 78 70 6c 61 69 6e 4f 6e  ){.    explainOn
2abd0 65 53 65 6c 65 63 74 28 70 56 64 62 65 2c 20 70  eSelect(pVdbe, p
2abe0 29 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e  );.    p = p->pN
2abf0 65 78 74 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d  ext;.    if( p==
2ac00 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 73  0 ) break;.    s
2ac10 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 4e 4c 28  qlite3ExplainNL(
2ac20 70 56 64 62 65 29 3b 0a 20 20 20 20 73 71 6c 69  pVdbe);.    sqli
2ac30 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
2ac40 28 70 56 64 62 65 2c 20 22 25 73 5c 6e 22 2c 20  (pVdbe, "%s\n", 
2ac50 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e  selectOpName(p->
2ac60 6f 70 29 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  op));.  }.  sqli
2ac70 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
2ac80 28 70 56 64 62 65 2c 20 22 45 4e 44 22 29 3b 0a  (pVdbe, "END");.
2ac90 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
2aca0 50 6f 70 28 70 56 64 62 65 29 3b 0a 7d 0a 0a 2f  Pop(pVdbe);.}../
2acb0 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 73 74 72  * End of the str
2acc0 75 63 74 75 72 65 20 64 65 62 75 67 20 70 72 69  ucture debug pri
2acd0 6e 74 69 6e 67 20 63 6f 64 65 0a 2a 2a 2a 2a 2a  nting code.*****
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 2a 2a 2a 2a  ****************
2ad10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ad20 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 23 65 6e 64 69 66  ********/.#endif
2ad30 20 2f 2a 20 64 65 66 69 6e 65 64 28 53 51 4c 49   /* defined(SQLI
2ad40 54 45 5f 45 4e 41 42 4c 45 5f 54 52 45 45 5f 45  TE_ENABLE_TREE_E
2ad50 58 50 4c 41 49 4e 29 20 2a 2f 0a                 XPLAIN) */.