/ Hex Artifact Content
Login

Artifact a040df82c4ac90b27114e1c21a05d77cc6dc6f80:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 70 61 72 73 65 72 0a 2a 2a 20 74 6f  the parser.** to
01c0: 20 68 61 6e 64 6c 65 20 53 45 4c 45 43 54 20 73   handle SELECT s
01d0: 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 53 51 4c  tatements in SQL
01e0: 69 74 65 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65  ite..*/.#include
01f0: 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a   "sqliteInt.h"..
0200: 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6c  ./*.** Delete al
0210: 6c 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  l the content of
0220: 20 61 20 53 65 6c 65 63 74 20 73 74 72 75 63 74   a Select struct
0230: 75 72 65 20 62 75 74 20 64 6f 20 6e 6f 74 20 64  ure but do not d
0240: 65 61 6c 6c 6f 63 61 74 65 0a 2a 2a 20 74 68 65  eallocate.** the
0250: 20 73 65 6c 65 63 74 20 73 74 72 75 63 74 75 72   select structur
0260: 65 20 69 74 73 65 6c 66 2e 0a 2a 2f 0a 73 74 61  e itself..*/.sta
0270: 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72 53 65  tic void clearSe
0280: 6c 65 63 74 28 73 71 6c 69 74 65 33 20 2a 64 62  lect(sqlite3 *db
0290: 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  , Select *p){.  
02a0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
02b0: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 45 4c  elete(db, p->pEL
02c0: 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  ist);.  sqlite3S
02d0: 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  rcListDelete(db,
02e0: 20 70 2d 3e 70 53 72 63 29 3b 0a 20 20 73 71 6c   p->pSrc);.  sql
02f0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
0300: 62 2c 20 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20  b, p->pWhere);. 
0310: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
0320: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 47  Delete(db, p->pG
0330: 72 6f 75 70 42 79 29 3b 0a 20 20 73 71 6c 69 74  roupBy);.  sqlit
0340: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
0350: 20 70 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20   p->pHaving);.  
0360: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
0370: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 72  elete(db, p->pOr
0380: 64 65 72 42 79 29 3b 0a 20 20 73 71 6c 69 74 65  derBy);.  sqlite
0390: 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
03a0: 2c 20 70 2d 3e 70 50 72 69 6f 72 29 3b 0a 20 20  , p->pPrior);.  
03b0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
03c0: 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29  e(db, p->pLimit)
03d0: 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  ;.  sqlite3ExprD
03e0: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 66  elete(db, p->pOf
03f0: 66 73 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  fset);.}../*.** 
0400: 49 6e 69 74 69 61 6c 69 7a 65 20 61 20 53 65 6c  Initialize a Sel
0410: 65 63 74 44 65 73 74 20 73 74 72 75 63 74 75 72  ectDest structur
0420: 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
0430: 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74  e3SelectDestInit
0440: 28 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65  (SelectDest *pDe
0450: 73 74 2c 20 69 6e 74 20 65 44 65 73 74 2c 20 69  st, int eDest, i
0460: 6e 74 20 69 50 61 72 6d 29 7b 0a 20 20 70 44 65  nt iParm){.  pDe
0470: 73 74 2d 3e 65 44 65 73 74 20 3d 20 28 75 38 29  st->eDest = (u8)
0480: 65 44 65 73 74 3b 0a 20 20 70 44 65 73 74 2d 3e  eDest;.  pDest->
0490: 69 53 44 50 61 72 6d 20 3d 20 69 50 61 72 6d 3b  iSDParm = iParm;
04a0: 0a 20 20 70 44 65 73 74 2d 3e 61 66 66 53 64 73  .  pDest->affSds
04b0: 74 20 3d 20 30 3b 0a 20 20 70 44 65 73 74 2d 3e  t = 0;.  pDest->
04c0: 69 53 64 73 74 20 3d 20 30 3b 0a 20 20 70 44 65  iSdst = 0;.  pDe
04d0: 73 74 2d 3e 6e 53 64 73 74 20 3d 20 30 3b 0a 7d  st->nSdst = 0;.}
04e0: 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  .../*.** Allocat
04f0: 65 20 61 20 6e 65 77 20 53 65 6c 65 63 74 20 73  e a new Select s
0500: 74 72 75 63 74 75 72 65 20 61 6e 64 20 72 65 74  tructure and ret
0510: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
0520: 20 74 68 61 74 0a 2a 2a 20 73 74 72 75 63 74 75   that.** structu
0530: 72 65 2e 0a 2a 2f 0a 53 65 6c 65 63 74 20 2a 73  re..*/.Select *s
0540: 71 6c 69 74 65 33 53 65 6c 65 63 74 4e 65 77 28  qlite3SelectNew(
0550: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
0560: 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  ,        /* Pars
0570: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
0580: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
0590: 74 2c 20 20 20 20 20 2f 2a 20 77 68 69 63 68 20  t,     /* which 
05a0: 63 6f 6c 75 6d 6e 73 20 74 6f 20 69 6e 63 6c 75  columns to inclu
05b0: 64 65 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  de in the result
05c0: 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
05d0: 53 72 63 2c 20 20 20 20 20 20 20 20 2f 2a 20 74  Src,        /* t
05e0: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2d  he FROM clause -
05f0: 2d 20 77 68 69 63 68 20 74 61 62 6c 65 73 20 74  - which tables t
0600: 6f 20 73 63 61 6e 20 2a 2f 0a 20 20 45 78 70 72  o scan */.  Expr
0610: 20 2a 70 57 68 65 72 65 2c 20 20 20 20 20 20 20   *pWhere,       
0620: 20 20 2f 2a 20 74 68 65 20 57 48 45 52 45 20 63    /* the WHERE c
0630: 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c  lause */.  ExprL
0640: 69 73 74 20 2a 70 47 72 6f 75 70 42 79 2c 20 20  ist *pGroupBy,  
0650: 20 2f 2a 20 74 68 65 20 47 52 4f 55 50 20 42 59   /* the GROUP BY
0660: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70   clause */.  Exp
0670: 72 20 2a 70 48 61 76 69 6e 67 2c 20 20 20 20 20  r *pHaving,     
0680: 20 20 20 2f 2a 20 74 68 65 20 48 41 56 49 4e 47     /* the HAVING
0690: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70   clause */.  Exp
06a0: 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c  rList *pOrderBy,
06b0: 20 20 20 2f 2a 20 74 68 65 20 4f 52 44 45 52 20     /* the ORDER 
06c0: 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 75  BY clause */.  u
06d0: 31 36 20 73 65 6c 46 6c 61 67 73 2c 20 20 20 20  16 selFlags,    
06e0: 20 20 20 20 20 2f 2a 20 46 6c 61 67 20 70 61 72       /* Flag par
06f0: 61 6d 65 74 65 72 73 2c 20 73 75 63 68 20 61 73  ameters, such as
0700: 20 53 46 5f 44 69 73 74 69 6e 63 74 20 2a 2f 0a   SF_Distinct */.
0710: 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20    Expr *pLimit, 
0720: 20 20 20 20 20 20 20 20 2f 2a 20 4c 49 4d 49 54          /* LIMIT
0730: 20 76 61 6c 75 65 2e 20 20 4e 55 4c 4c 20 6d 65   value.  NULL me
0740: 61 6e 73 20 6e 6f 74 20 75 73 65 64 20 2a 2f 0a  ans not used */.
0750: 20 20 45 78 70 72 20 2a 70 4f 66 66 73 65 74 20    Expr *pOffset 
0760: 20 20 20 20 20 20 20 20 2f 2a 20 4f 46 46 53 45          /* OFFSE
0770: 54 20 76 61 6c 75 65 2e 20 20 4e 55 4c 4c 20 6d  T value.  NULL m
0780: 65 61 6e 73 20 6e 6f 20 6f 66 66 73 65 74 20 2a  eans no offset *
0790: 2f 0a 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70  /.){.  Select *p
07a0: 4e 65 77 3b 0a 20 20 53 65 6c 65 63 74 20 73 74  New;.  Select st
07b0: 61 6e 64 69 6e 3b 0a 20 20 73 71 6c 69 74 65 33  andin;.  sqlite3
07c0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
07d0: 62 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  b;.  pNew = sqli
07e0: 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
07f0: 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77  db, sizeof(*pNew
0800: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64  ) );.  assert( d
0810: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
0820: 7c 7c 20 21 70 4f 66 66 73 65 74 20 7c 7c 20 70  || !pOffset || p
0830: 4c 69 6d 69 74 20 29 3b 20 2f 2a 20 4f 46 46 53  Limit ); /* OFFS
0840: 45 54 20 69 6d 70 6c 69 65 73 20 4c 49 4d 49 54  ET implies LIMIT
0850: 20 2a 2f 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d   */.  if( pNew==
0860: 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
0870: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
0880: 64 20 29 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20  d );.    pNew = 
0890: 26 73 74 61 6e 64 69 6e 3b 0a 20 20 20 20 6d 65  &standin;.    me
08a0: 6d 73 65 74 28 70 4e 65 77 2c 20 30 2c 20 73 69  mset(pNew, 0, si
08b0: 7a 65 6f 66 28 2a 70 4e 65 77 29 29 3b 0a 20 20  zeof(*pNew));.  
08c0: 7d 0a 20 20 69 66 28 20 70 45 4c 69 73 74 3d 3d  }.  if( pEList==
08d0: 30 20 29 7b 0a 20 20 20 20 70 45 4c 69 73 74 20  0 ){.    pEList 
08e0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
08f0: 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20  tAppend(pParse, 
0900: 30 2c 20 73 71 6c 69 74 65 33 45 78 70 72 28 64  0, sqlite3Expr(d
0910: 62 2c 54 4b 5f 41 4c 4c 2c 30 29 29 3b 0a 20 20  b,TK_ALL,0));.  
0920: 7d 0a 20 20 70 4e 65 77 2d 3e 70 45 4c 69 73 74  }.  pNew->pEList
0930: 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20 69 66 28   = pEList;.  if(
0940: 20 70 53 72 63 3d 3d 30 20 29 20 70 53 72 63 20   pSrc==0 ) pSrc 
0950: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
0960: 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66  cZero(db, sizeof
0970: 28 2a 70 53 72 63 29 29 3b 0a 20 20 70 4e 65 77  (*pSrc));.  pNew
0980: 2d 3e 70 53 72 63 20 3d 20 70 53 72 63 3b 0a 20  ->pSrc = pSrc;. 
0990: 20 70 4e 65 77 2d 3e 70 57 68 65 72 65 20 3d 20   pNew->pWhere = 
09a0: 70 57 68 65 72 65 3b 0a 20 20 70 4e 65 77 2d 3e  pWhere;.  pNew->
09b0: 70 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f 75  pGroupBy = pGrou
09c0: 70 42 79 3b 0a 20 20 70 4e 65 77 2d 3e 70 48 61  pBy;.  pNew->pHa
09d0: 76 69 6e 67 20 3d 20 70 48 61 76 69 6e 67 3b 0a  ving = pHaving;.
09e0: 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79    pNew->pOrderBy
09f0: 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 70   = pOrderBy;.  p
0a00: 4e 65 77 2d 3e 73 65 6c 46 6c 61 67 73 20 3d 20  New->selFlags = 
0a10: 73 65 6c 46 6c 61 67 73 3b 0a 20 20 70 4e 65 77  selFlags;.  pNew
0a20: 2d 3e 6f 70 20 3d 20 54 4b 5f 53 45 4c 45 43 54  ->op = TK_SELECT
0a30: 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 6d 69 74  ;.  pNew->pLimit
0a40: 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 70 4e 65   = pLimit;.  pNe
0a50: 77 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f 66  w->pOffset = pOf
0a60: 66 73 65 74 3b 0a 20 20 61 73 73 65 72 74 28 20  fset;.  assert( 
0a70: 70 4f 66 66 73 65 74 3d 3d 30 20 7c 7c 20 70 4c  pOffset==0 || pL
0a80: 69 6d 69 74 21 3d 30 20 29 3b 0a 20 20 70 4e 65  imit!=0 );.  pNe
0a90: 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  w->addrOpenEphm[
0aa0: 30 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d  0] = -1;.  pNew-
0ab0: 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d  >addrOpenEphm[1]
0ac0: 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 61   = -1;.  pNew->a
0ad0: 64 64 72 4f 70 65 6e 45 70 68 6d 5b 32 5d 20 3d  ddrOpenEphm[2] =
0ae0: 20 2d 31 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d   -1;.  if( db->m
0af0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 7b 0a  allocFailed ) {.
0b00: 20 20 20 20 63 6c 65 61 72 53 65 6c 65 63 74 28      clearSelect(
0b10: 64 62 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 69  db, pNew);.    i
0b20: 66 28 20 70 4e 65 77 21 3d 26 73 74 61 6e 64 69  f( pNew!=&standi
0b30: 6e 20 29 20 73 71 6c 69 74 65 33 44 62 46 72 65  n ) sqlite3DbFre
0b40: 65 28 64 62 2c 20 70 4e 65 77 29 3b 0a 20 20 20  e(db, pNew);.   
0b50: 20 70 4e 65 77 20 3d 20 30 3b 0a 20 20 7d 65 6c   pNew = 0;.  }el
0b60: 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
0b70: 70 4e 65 77 2d 3e 70 53 72 63 21 3d 30 20 7c 7c  pNew->pSrc!=0 ||
0b80: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20   pParse->nErr>0 
0b90: 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
0ba0: 20 70 4e 65 77 21 3d 26 73 74 61 6e 64 69 6e 20   pNew!=&standin 
0bb0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77  );.  return pNew
0bc0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  ;.}../*.** Delet
0bd0: 65 20 74 68 65 20 67 69 76 65 6e 20 53 65 6c 65  e the given Sele
0be0: 63 74 20 73 74 72 75 63 74 75 72 65 20 61 6e 64  ct structure and
0bf0: 20 61 6c 6c 20 6f 66 20 69 74 73 20 73 75 62 73   all of its subs
0c00: 74 72 75 63 74 75 72 65 73 2e 0a 2a 2f 0a 76 6f  tructures..*/.vo
0c10: 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  id sqlite3Select
0c20: 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a  Delete(sqlite3 *
0c30: 64 62 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a  db, Select *p){.
0c40: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 63    if( p ){.    c
0c50: 6c 65 61 72 53 65 6c 65 63 74 28 64 62 2c 20 70  learSelect(db, p
0c60: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
0c70: 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 20 20 7d  Free(db, p);.  }
0c80: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  .}../*.** Given 
0c90: 31 20 74 6f 20 33 20 69 64 65 6e 74 69 66 69 65  1 to 3 identifie
0ca0: 72 73 20 70 72 65 63 65 64 69 6e 67 20 74 68 65  rs preceding the
0cb0: 20 4a 4f 49 4e 20 6b 65 79 77 6f 72 64 2c 20 64   JOIN keyword, d
0cc0: 65 74 65 72 6d 69 6e 65 20 74 68 65 0a 2a 2a 20  etermine the.** 
0cd0: 74 79 70 65 20 6f 66 20 6a 6f 69 6e 2e 20 20 52  type of join.  R
0ce0: 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72  eturn an integer
0cf0: 20 63 6f 6e 73 74 61 6e 74 20 74 68 61 74 20 65   constant that e
0d00: 78 70 72 65 73 73 65 73 20 74 68 61 74 20 74 79  xpresses that ty
0d10: 70 65 0a 2a 2a 20 69 6e 20 74 65 72 6d 73 20 6f  pe.** in terms o
0d20: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
0d30: 62 69 74 20 76 61 6c 75 65 73 3a 0a 2a 2a 0a 2a  bit values:.**.*
0d40: 2a 20 20 20 20 20 4a 54 5f 49 4e 4e 45 52 0a 2a  *     JT_INNER.*
0d50: 2a 20 20 20 20 20 4a 54 5f 43 52 4f 53 53 0a 2a  *     JT_CROSS.*
0d60: 2a 20 20 20 20 20 4a 54 5f 4f 55 54 45 52 0a 2a  *     JT_OUTER.*
0d70: 2a 20 20 20 20 20 4a 54 5f 4e 41 54 55 52 41 4c  *     JT_NATURAL
0d80: 0a 2a 2a 20 20 20 20 20 4a 54 5f 4c 45 46 54 0a  .**     JT_LEFT.
0d90: 2a 2a 20 20 20 20 20 4a 54 5f 52 49 47 48 54 0a  **     JT_RIGHT.
0da0: 2a 2a 0a 2a 2a 20 41 20 66 75 6c 6c 20 6f 75 74  **.** A full out
0db0: 65 72 20 6a 6f 69 6e 20 69 73 20 74 68 65 20 63  er join is the c
0dc0: 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20 4a 54  ombination of JT
0dd0: 5f 4c 45 46 54 20 61 6e 64 20 4a 54 5f 52 49 47  _LEFT and JT_RIG
0de0: 48 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  HT..**.** If an 
0df0: 69 6c 6c 65 67 61 6c 20 6f 72 20 75 6e 73 75 70  illegal or unsup
0e00: 70 6f 72 74 65 64 20 6a 6f 69 6e 20 74 79 70 65  ported join type
0e10: 20 69 73 20 73 65 65 6e 2c 20 74 68 65 6e 20 73   is seen, then s
0e20: 74 69 6c 6c 20 72 65 74 75 72 6e 0a 2a 2a 20 61  till return.** a
0e30: 20 6a 6f 69 6e 20 74 79 70 65 2c 20 62 75 74 20   join type, but 
0e40: 70 75 74 20 61 6e 20 65 72 72 6f 72 20 69 6e 20  put an error in 
0e50: 74 68 65 20 70 50 61 72 73 65 20 73 74 72 75 63  the pParse struc
0e60: 74 75 72 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ture..*/.int sql
0e70: 69 74 65 33 4a 6f 69 6e 54 79 70 65 28 50 61 72  ite3JoinType(Par
0e80: 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65  se *pParse, Toke
0e90: 6e 20 2a 70 41 2c 20 54 6f 6b 65 6e 20 2a 70 42  n *pA, Token *pB
0ea0: 2c 20 54 6f 6b 65 6e 20 2a 70 43 29 7b 0a 20 20  , Token *pC){.  
0eb0: 69 6e 74 20 6a 6f 69 6e 74 79 70 65 20 3d 20 30  int jointype = 0
0ec0: 3b 0a 20 20 54 6f 6b 65 6e 20 2a 61 70 41 6c 6c  ;.  Token *apAll
0ed0: 5b 33 5d 3b 0a 20 20 54 6f 6b 65 6e 20 2a 70 3b  [3];.  Token *p;
0ee0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
0ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
0f00: 20 20 20 30 31 32 33 34 35 36 37 38 39 20 31 32     0123456789 12
0f10: 33 34 35 36 37 38 39 20 31 32 33 34 35 36 37 38  3456789 12345678
0f20: 39 20 31 32 33 20 2a 2f 0a 20 20 73 74 61 74 69  9 123 */.  stati
0f30: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 4b 65  c const char zKe
0f40: 79 54 65 78 74 5b 5d 20 3d 20 22 6e 61 74 75 72  yText[] = "natur
0f50: 61 6c 65 66 74 6f 75 74 65 72 69 67 68 74 66 75  aleftouterightfu
0f60: 6c 6c 69 6e 6e 65 72 63 72 6f 73 73 22 3b 0a 20  llinnercross";. 
0f70: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74   static const st
0f80: 72 75 63 74 20 7b 0a 20 20 20 20 75 38 20 69 3b  ruct {.    u8 i;
0f90: 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e          /* Begin
0fa0: 6e 69 6e 67 20 6f 66 20 6b 65 79 77 6f 72 64 20  ning of keyword 
0fb0: 74 65 78 74 20 69 6e 20 7a 4b 65 79 54 65 78 74  text in zKeyText
0fc0: 5b 5d 20 2a 2f 0a 20 20 20 20 75 38 20 6e 43 68  [] */.    u8 nCh
0fd0: 61 72 3b 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68  ar;    /* Length
0fe0: 20 6f 66 20 74 68 65 20 6b 65 79 77 6f 72 64 20   of the keyword 
0ff0: 69 6e 20 63 68 61 72 61 63 74 65 72 73 20 2a 2f  in characters */
1000: 0a 20 20 20 20 75 38 20 63 6f 64 65 3b 20 20 20  .    u8 code;   
1010: 20 20 2f 2a 20 4a 6f 69 6e 20 74 79 70 65 20 6d    /* Join type m
1020: 61 73 6b 20 2a 2f 0a 20 20 7d 20 61 4b 65 79 77  ask */.  } aKeyw
1030: 6f 72 64 5b 5d 20 3d 20 7b 0a 20 20 20 20 2f 2a  ord[] = {.    /*
1040: 20 6e 61 74 75 72 61 6c 20 2a 2f 20 7b 20 30 2c   natural */ { 0,
1050: 20 20 37 2c 20 4a 54 5f 4e 41 54 55 52 41 4c 20    7, JT_NATURAL 
1060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
1070: 2c 0a 20 20 20 20 2f 2a 20 6c 65 66 74 20 20 20  ,.    /* left   
1080: 20 2a 2f 20 7b 20 36 2c 20 20 34 2c 20 4a 54 5f   */ { 6,  4, JT_
1090: 4c 45 46 54 7c 4a 54 5f 4f 55 54 45 52 20 20 20  LEFT|JT_OUTER   
10a0: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a         },.    /*
10b0: 20 6f 75 74 65 72 20 20 20 2a 2f 20 7b 20 31 30   outer   */ { 10
10c0: 2c 20 35 2c 20 4a 54 5f 4f 55 54 45 52 20 20 20  , 5, JT_OUTER   
10d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
10e0: 2c 0a 20 20 20 20 2f 2a 20 72 69 67 68 74 20 20  ,.    /* right  
10f0: 20 2a 2f 20 7b 20 31 34 2c 20 35 2c 20 4a 54 5f   */ { 14, 5, JT_
1100: 52 49 47 48 54 7c 4a 54 5f 4f 55 54 45 52 20 20  RIGHT|JT_OUTER  
1110: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a         },.    /*
1120: 20 66 75 6c 6c 20 20 20 20 2a 2f 20 7b 20 31 39   full    */ { 19
1130: 2c 20 34 2c 20 4a 54 5f 4c 45 46 54 7c 4a 54 5f  , 4, JT_LEFT|JT_
1140: 52 49 47 48 54 7c 4a 54 5f 4f 55 54 45 52 20 7d  RIGHT|JT_OUTER }
1150: 2c 0a 20 20 20 20 2f 2a 20 69 6e 6e 65 72 20 20  ,.    /* inner  
1160: 20 2a 2f 20 7b 20 32 33 2c 20 35 2c 20 4a 54 5f   */ { 23, 5, JT_
1170: 49 4e 4e 45 52 20 20 20 20 20 20 20 20 20 20 20  INNER           
1180: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a         },.    /*
1190: 20 63 72 6f 73 73 20 20 20 2a 2f 20 7b 20 32 38   cross   */ { 28
11a0: 2c 20 35 2c 20 4a 54 5f 49 4e 4e 45 52 7c 4a 54  , 5, JT_INNER|JT
11b0: 5f 43 52 4f 53 53 20 20 20 20 20 20 20 20 20 7d  _CROSS         }
11c0: 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 2c 20  ,.  };.  int i, 
11d0: 6a 3b 0a 20 20 61 70 41 6c 6c 5b 30 5d 20 3d 20  j;.  apAll[0] = 
11e0: 70 41 3b 0a 20 20 61 70 41 6c 6c 5b 31 5d 20 3d  pA;.  apAll[1] =
11f0: 20 70 42 3b 0a 20 20 61 70 41 6c 6c 5b 32 5d 20   pB;.  apAll[2] 
1200: 3d 20 70 43 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  = pC;.  for(i=0;
1210: 20 69 3c 33 20 26 26 20 61 70 41 6c 6c 5b 69 5d   i<3 && apAll[i]
1220: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20  ; i++){.    p = 
1230: 61 70 41 6c 6c 5b 69 5d 3b 0a 20 20 20 20 66 6f  apAll[i];.    fo
1240: 72 28 6a 3d 30 3b 20 6a 3c 41 72 72 61 79 53 69  r(j=0; j<ArraySi
1250: 7a 65 28 61 4b 65 79 77 6f 72 64 29 3b 20 6a 2b  ze(aKeyword); j+
1260: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  +){.      if( p-
1270: 3e 6e 3d 3d 61 4b 65 79 77 6f 72 64 5b 6a 5d 2e  >n==aKeyword[j].
1280: 6e 43 68 61 72 20 0a 20 20 20 20 20 20 20 20 20  nChar .         
1290: 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 4e 49   && sqlite3StrNI
12a0: 43 6d 70 28 28 63 68 61 72 2a 29 70 2d 3e 7a 2c  Cmp((char*)p->z,
12b0: 20 26 7a 4b 65 79 54 65 78 74 5b 61 4b 65 79 77   &zKeyText[aKeyw
12c0: 6f 72 64 5b 6a 5d 2e 69 5d 2c 20 70 2d 3e 6e 29  ord[j].i], p->n)
12d0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6a  ==0 ){.        j
12e0: 6f 69 6e 74 79 70 65 20 7c 3d 20 61 4b 65 79 77  ointype |= aKeyw
12f0: 6f 72 64 5b 6a 5d 2e 63 6f 64 65 3b 0a 20 20 20  ord[j].code;.   
1300: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1310: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 74 65    }.    }.    te
1320: 73 74 63 61 73 65 28 20 6a 3d 3d 30 20 7c 7c 20  stcase( j==0 || 
1330: 6a 3d 3d 31 20 7c 7c 20 6a 3d 3d 32 20 7c 7c 20  j==1 || j==2 || 
1340: 6a 3d 3d 33 20 7c 7c 20 6a 3d 3d 34 20 7c 7c 20  j==3 || j==4 || 
1350: 6a 3d 3d 35 20 7c 7c 20 6a 3d 3d 36 20 29 3b 0a  j==5 || j==6 );.
1360: 20 20 20 20 69 66 28 20 6a 3e 3d 41 72 72 61 79      if( j>=Array
1370: 53 69 7a 65 28 61 4b 65 79 77 6f 72 64 29 20 29  Size(aKeyword) )
1380: 7b 0a 20 20 20 20 20 20 6a 6f 69 6e 74 79 70 65  {.      jointype
1390: 20 7c 3d 20 4a 54 5f 45 52 52 4f 52 3b 0a 20 20   |= JT_ERROR;.  
13a0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
13b0: 0a 20 20 7d 0a 20 20 69 66 28 0a 20 20 20 20 20  .  }.  if(.     
13c0: 28 6a 6f 69 6e 74 79 70 65 20 26 20 28 4a 54 5f  (jointype & (JT_
13d0: 49 4e 4e 45 52 7c 4a 54 5f 4f 55 54 45 52 29 29  INNER|JT_OUTER))
13e0: 3d 3d 28 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f 4f  ==(JT_INNER|JT_O
13f0: 55 54 45 52 29 20 7c 7c 0a 20 20 20 20 20 28 6a  UTER) ||.     (j
1400: 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 45 52 52  ointype & JT_ERR
1410: 4f 52 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20  OR)!=0.  ){.    
1420: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 70 20  const char *zSp 
1430: 3d 20 22 20 22 3b 0a 20 20 20 20 61 73 73 65 72  = " ";.    asser
1440: 74 28 20 70 42 21 3d 30 20 29 3b 0a 20 20 20 20  t( pB!=0 );.    
1450: 69 66 28 20 70 43 3d 3d 30 20 29 7b 20 7a 53 70  if( pC==0 ){ zSp
1460: 2b 2b 3b 20 7d 0a 20 20 20 20 73 71 6c 69 74 65  ++; }.    sqlite
1470: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
1480: 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6f 72 20 75 6e  , "unknown or un
1490: 73 75 70 70 6f 72 74 65 64 20 6a 6f 69 6e 20 74  supported join t
14a0: 79 70 65 3a 20 22 0a 20 20 20 20 20 20 20 22 25  ype: ".       "%
14b0: 54 20 25 54 25 73 25 54 22 2c 20 70 41 2c 20 70  T %T%s%T", pA, p
14c0: 42 2c 20 7a 53 70 2c 20 70 43 29 3b 0a 20 20 20  B, zSp, pC);.   
14d0: 20 6a 6f 69 6e 74 79 70 65 20 3d 20 4a 54 5f 49   jointype = JT_I
14e0: 4e 4e 45 52 3b 0a 20 20 7d 65 6c 73 65 20 69 66  NNER;.  }else if
14f0: 28 20 28 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54  ( (jointype & JT
1500: 5f 4f 55 54 45 52 29 21 3d 30 20 0a 20 20 20 20  _OUTER)!=0 .    
1510: 20 20 20 20 20 26 26 20 28 6a 6f 69 6e 74 79 70       && (jointyp
1520: 65 20 26 20 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f  e & (JT_LEFT|JT_
1530: 52 49 47 48 54 29 29 21 3d 4a 54 5f 4c 45 46 54  RIGHT))!=JT_LEFT
1540: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
1550: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
1560: 0a 20 20 20 20 20 20 22 52 49 47 48 54 20 61 6e  .      "RIGHT an
1570: 64 20 46 55 4c 4c 20 4f 55 54 45 52 20 4a 4f 49  d FULL OUTER JOI
1580: 4e 73 20 61 72 65 20 6e 6f 74 20 63 75 72 72 65  Ns are not curre
1590: 6e 74 6c 79 20 73 75 70 70 6f 72 74 65 64 22 29  ntly supported")
15a0: 3b 0a 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d  ;.    jointype =
15b0: 20 4a 54 5f 49 4e 4e 45 52 3b 0a 20 20 7d 0a 20   JT_INNER;.  }. 
15c0: 20 72 65 74 75 72 6e 20 6a 6f 69 6e 74 79 70 65   return jointype
15d0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
15e0: 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61  n the index of a
15f0: 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 20 74 61 62   column in a tab
1600: 6c 65 2e 20 20 52 65 74 75 72 6e 20 2d 31 20 69  le.  Return -1 i
1610: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20  f the column.** 
1620: 69 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64  is not contained
1630: 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a   in the table..*
1640: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 6c  /.static int col
1650: 75 6d 6e 49 6e 64 65 78 28 54 61 62 6c 65 20 2a  umnIndex(Table *
1660: 70 54 61 62 2c 20 63 6f 6e 73 74 20 63 68 61 72  pTab, const char
1670: 20 2a 7a 43 6f 6c 29 7b 0a 20 20 69 6e 74 20 69   *zCol){.  int i
1680: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
1690: 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  Tab->nCol; i++){
16a0: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
16b0: 53 74 72 49 43 6d 70 28 70 54 61 62 2d 3e 61 43  StrICmp(pTab->aC
16c0: 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 43 6f  ol[i].zName, zCo
16d0: 6c 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 69  l)==0 ) return i
16e0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d  ;.  }.  return -
16f0: 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72  1;.}../*.** Sear
1700: 63 68 20 74 68 65 20 66 69 72 73 74 20 4e 20 74  ch the first N t
1710: 61 62 6c 65 73 20 69 6e 20 70 53 72 63 2c 20 66  ables in pSrc, f
1720: 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68  rom left to righ
1730: 74 2c 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61  t, looking for a
1740: 0a 2a 2a 20 74 61 62 6c 65 20 74 68 61 74 20 68  .** table that h
1750: 61 73 20 61 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  as a column name
1760: 64 20 7a 43 6f 6c 2e 20 20 0a 2a 2a 0a 2a 2a 20  d zCol.  .**.** 
1770: 57 68 65 6e 20 66 6f 75 6e 64 2c 20 73 65 74 20  When found, set 
1780: 2a 70 69 54 61 62 20 61 6e 64 20 2a 70 69 43 6f  *piTab and *piCo
1790: 6c 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 69  l to the table i
17a0: 6e 64 65 78 20 61 6e 64 20 63 6f 6c 75 6d 6e 20  ndex and column 
17b0: 69 6e 64 65 78 0a 2a 2a 20 6f 66 20 74 68 65 20  index.** of the 
17c0: 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20  matching column 
17d0: 61 6e 64 20 72 65 74 75 72 6e 20 54 52 55 45 2e  and return TRUE.
17e0: 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 74 20 66 6f  .**.** If not fo
17f0: 75 6e 64 2c 20 72 65 74 75 72 6e 20 46 41 4c 53  und, return FALS
1800: 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  E..*/.static int
1810: 20 74 61 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49   tableAndColumnI
1820: 6e 64 65 78 28 0a 20 20 53 72 63 4c 69 73 74 20  ndex(.  SrcList 
1830: 2a 70 53 72 63 2c 20 20 20 20 20 20 20 2f 2a 20  *pSrc,       /* 
1840: 41 72 72 61 79 20 6f 66 20 74 61 62 6c 65 73 20  Array of tables 
1850: 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 69  to search */.  i
1860: 6e 74 20 4e 2c 20 20 20 20 20 20 20 20 20 20 20  nt N,           
1870: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1880: 20 74 61 62 6c 65 73 20 69 6e 20 70 53 72 63 2d   tables in pSrc-
1890: 3e 61 5b 5d 20 74 6f 20 73 65 61 72 63 68 20 2a  >a[] to search *
18a0: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
18b0: 7a 43 6f 6c 2c 20 20 20 20 2f 2a 20 4e 61 6d 65  zCol,    /* Name
18c0: 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 77   of the column w
18d0: 65 20 61 72 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f  e are looking fo
18e0: 72 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 54 61  r */.  int *piTa
18f0: 62 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  b,          /* W
1900: 72 69 74 65 20 69 6e 64 65 78 20 6f 66 20 70 53  rite index of pS
1910: 72 63 2d 3e 61 5b 5d 20 68 65 72 65 20 2a 2f 0a  rc->a[] here */.
1920: 20 20 69 6e 74 20 2a 70 69 43 6f 6c 20 20 20 20    int *piCol    
1930: 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
1940: 69 6e 64 65 78 20 6f 66 20 70 53 72 63 2d 3e 61  index of pSrc->a
1950: 5b 2a 70 69 54 61 62 5d 2e 70 54 61 62 2d 3e 61  [*piTab].pTab->a
1960: 43 6f 6c 5b 5d 20 68 65 72 65 20 2a 2f 0a 29 7b  Col[] here */.){
1970: 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
1980: 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c          /* For l
1990: 6f 6f 70 69 6e 67 20 6f 76 65 72 20 74 61 62 6c  ooping over tabl
19a0: 65 73 20 69 6e 20 70 53 72 63 20 2a 2f 0a 20 20  es in pSrc */.  
19b0: 69 6e 74 20 69 43 6f 6c 3b 20 20 20 20 20 20 20  int iCol;       
19c0: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
19d0: 20 63 6f 6c 75 6d 6e 20 6d 61 74 63 68 69 6e 67   column matching
19e0: 20 7a 43 6f 6c 20 2a 2f 0a 0a 20 20 61 73 73 65   zCol */..  asse
19f0: 72 74 28 20 28 70 69 54 61 62 3d 3d 30 29 3d 3d  rt( (piTab==0)==
1a00: 28 70 69 43 6f 6c 3d 3d 30 29 20 29 3b 20 20 2f  (piCol==0) );  /
1a10: 2a 20 42 6f 74 68 20 6f 72 20 6e 65 69 74 68 65  * Both or neithe
1a20: 72 20 61 72 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  r are NULL */.  
1a30: 66 6f 72 28 69 3d 30 3b 20 69 3c 4e 3b 20 69 2b  for(i=0; i<N; i+
1a40: 2b 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20 63  +){.    iCol = c
1a50: 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 53 72 63 2d  olumnIndex(pSrc-
1a60: 3e 61 5b 69 5d 2e 70 54 61 62 2c 20 7a 43 6f 6c  >a[i].pTab, zCol
1a70: 29 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3e  );.    if( iCol>
1a80: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
1a90: 70 69 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20  piTab ){.       
1aa0: 20 2a 70 69 54 61 62 20 3d 20 69 3b 0a 20 20 20   *piTab = i;.   
1ab0: 20 20 20 20 20 2a 70 69 43 6f 6c 20 3d 20 69 43       *piCol = iC
1ac0: 6f 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ol;.      }.    
1ad0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
1ae0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
1af0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
1b00: 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
1b10: 20 74 6f 20 61 64 64 20 74 65 72 6d 73 20 69 6d   to add terms im
1b20: 70 6c 69 65 64 20 62 79 20 4a 4f 49 4e 20 73 79  plied by JOIN sy
1b30: 6e 74 61 78 20 74 6f 20 74 68 65 0a 2a 2a 20 57  ntax to the.** W
1b40: 48 45 52 45 20 63 6c 61 75 73 65 20 65 78 70 72  HERE clause expr
1b50: 65 73 73 69 6f 6e 20 6f 66 20 61 20 53 45 4c 45  ession of a SELE
1b60: 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 54 68  CT statement. Th
1b70: 65 20 6e 65 77 20 74 65 72 6d 2c 20 77 68 69 63  e new term, whic
1b80: 68 0a 2a 2a 20 69 73 20 41 4e 44 65 64 20 77 69  h.** is ANDed wi
1b90: 74 68 20 74 68 65 20 65 78 69 73 74 69 6e 67 20  th the existing 
1ba0: 57 48 45 52 45 20 63 6c 61 75 73 65 2c 20 69 73  WHERE clause, is
1bb0: 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a   of the form:.**
1bc0: 0a 2a 2a 20 20 20 20 28 74 61 62 31 2e 63 6f 6c  .**    (tab1.col
1bd0: 31 20 3d 20 74 61 62 32 2e 63 6f 6c 32 29 0a 2a  1 = tab2.col2).*
1be0: 2a 0a 2a 2a 20 77 68 65 72 65 20 74 61 62 31 20  *.** where tab1 
1bf0: 69 73 20 74 68 65 20 69 53 72 63 27 74 68 20 74  is the iSrc'th t
1c00: 61 62 6c 65 20 69 6e 20 53 72 63 4c 69 73 74 20  able in SrcList 
1c10: 70 53 72 63 20 61 6e 64 20 74 61 62 32 20 69 73  pSrc and tab2 is
1c20: 20 74 68 65 20 0a 2a 2a 20 28 69 53 72 63 2b 31   the .** (iSrc+1
1c30: 29 27 74 68 2e 20 43 6f 6c 75 6d 6e 20 63 6f 6c  )'th. Column col
1c40: 31 20 69 73 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c  1 is column iCol
1c50: 4c 65 66 74 20 6f 66 20 74 61 62 31 2c 20 61 6e  Left of tab1, an
1c60: 64 20 63 6f 6c 32 20 69 73 0a 2a 2a 20 63 6f 6c  d col2 is.** col
1c70: 75 6d 6e 20 69 43 6f 6c 52 69 67 68 74 20 6f 66  umn iColRight of
1c80: 20 74 61 62 32 2e 0a 2a 2f 0a 73 74 61 74 69 63   tab2..*/.static
1c90: 20 76 6f 69 64 20 61 64 64 57 68 65 72 65 54 65   void addWhereTe
1ca0: 72 6d 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  rm(.  Parse *pPa
1cb0: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  rse,            
1cc0: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
1cd0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72   context */.  Sr
1ce0: 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20  cList *pSrc,    
1cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d00: 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20   List of tables 
1d10: 69 6e 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a  in FROM clause *
1d20: 2f 0a 20 20 69 6e 74 20 69 4c 65 66 74 2c 20 20  /.  int iLeft,  
1d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d40: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
1d50: 66 69 72 73 74 20 74 61 62 6c 65 20 74 6f 20 6a  first table to j
1d60: 6f 69 6e 20 69 6e 20 70 53 72 63 20 2a 2f 0a 20  oin in pSrc */. 
1d70: 20 69 6e 74 20 69 43 6f 6c 4c 65 66 74 2c 20 20   int iColLeft,  
1d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d90: 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c   /* Index of col
1da0: 75 6d 6e 20 69 6e 20 66 69 72 73 74 20 74 61 62  umn in first tab
1db0: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 69 67  le */.  int iRig
1dc0: 68 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ht,             
1dd0: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
1de0: 20 6f 66 20 73 65 63 6f 6e 64 20 74 61 62 6c 65   of second table
1df0: 20 69 6e 20 70 53 72 63 20 2a 2f 0a 20 20 69 6e   in pSrc */.  in
1e00: 74 20 69 43 6f 6c 52 69 67 68 74 2c 20 20 20 20  t iColRight,    
1e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e20: 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e   Index of column
1e30: 20 69 6e 20 73 65 63 6f 6e 64 20 74 61 62 6c 65   in second table
1e40: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4f 75 74 65   */.  int isOute
1e50: 72 4a 6f 69 6e 2c 20 20 20 20 20 20 20 20 20 20  rJoin,          
1e60: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
1e70: 20 74 68 69 73 20 69 73 20 61 6e 20 4f 55 54 45   this is an OUTE
1e80: 52 20 6a 6f 69 6e 20 2a 2f 0a 20 20 45 78 70 72  R join */.  Expr
1e90: 20 2a 2a 70 70 57 68 65 72 65 20 20 20 20 20 20   **ppWhere      
1ea0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
1eb0: 4e 2f 4f 55 54 3a 20 54 68 65 20 57 48 45 52 45  N/OUT: The WHERE
1ec0: 20 63 6c 61 75 73 65 20 74 6f 20 61 64 64 20 74   clause to add t
1ed0: 6f 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  o */.){.  sqlite
1ee0: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
1ef0: 64 62 3b 0a 20 20 45 78 70 72 20 2a 70 45 31 3b  db;.  Expr *pE1;
1f00: 0a 20 20 45 78 70 72 20 2a 70 45 32 3b 0a 20 20  .  Expr *pE2;.  
1f10: 45 78 70 72 20 2a 70 45 71 3b 0a 0a 20 20 61 73  Expr *pEq;..  as
1f20: 73 65 72 74 28 20 69 4c 65 66 74 3c 69 52 69 67  sert( iLeft<iRig
1f30: 68 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ht );.  assert( 
1f40: 70 53 72 63 2d 3e 6e 53 72 63 3e 69 52 69 67 68  pSrc->nSrc>iRigh
1f50: 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  t );.  assert( p
1f60: 53 72 63 2d 3e 61 5b 69 4c 65 66 74 5d 2e 70 54  Src->a[iLeft].pT
1f70: 61 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ab );.  assert( 
1f80: 70 53 72 63 2d 3e 61 5b 69 52 69 67 68 74 5d 2e  pSrc->a[iRight].
1f90: 70 54 61 62 20 29 3b 0a 0a 20 20 70 45 31 20 3d  pTab );..  pE1 =
1fa0: 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 43 6f   sqlite3CreateCo
1fb0: 6c 75 6d 6e 45 78 70 72 28 64 62 2c 20 70 53 72  lumnExpr(db, pSr
1fc0: 63 2c 20 69 4c 65 66 74 2c 20 69 43 6f 6c 4c 65  c, iLeft, iColLe
1fd0: 66 74 29 3b 0a 20 20 70 45 32 20 3d 20 73 71 6c  ft);.  pE2 = sql
1fe0: 69 74 65 33 43 72 65 61 74 65 43 6f 6c 75 6d 6e  ite3CreateColumn
1ff0: 45 78 70 72 28 64 62 2c 20 70 53 72 63 2c 20 69  Expr(db, pSrc, i
2000: 52 69 67 68 74 2c 20 69 43 6f 6c 52 69 67 68 74  Right, iColRight
2010: 29 3b 0a 0a 20 20 70 45 71 20 3d 20 73 71 6c 69  );..  pEq = sqli
2020: 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
2030: 20 54 4b 5f 45 51 2c 20 70 45 31 2c 20 70 45 32   TK_EQ, pE1, pE2
2040: 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 45 71 20  , 0);.  if( pEq 
2050: 26 26 20 69 73 4f 75 74 65 72 4a 6f 69 6e 20 29  && isOuterJoin )
2060: 7b 0a 20 20 20 20 45 78 70 72 53 65 74 50 72 6f  {.    ExprSetPro
2070: 70 65 72 74 79 28 70 45 71 2c 20 45 50 5f 46 72  perty(pEq, EP_Fr
2080: 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20 61 73 73  omJoin);.    ass
2090: 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
20a0: 70 65 72 74 79 28 70 45 71 2c 20 45 50 5f 54 6f  perty(pEq, EP_To
20b0: 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63  kenOnly|EP_Reduc
20c0: 65 64 29 20 29 3b 0a 20 20 20 20 45 78 70 72 53  ed) );.    ExprS
20d0: 65 74 56 56 41 50 72 6f 70 65 72 74 79 28 70 45  etVVAProperty(pE
20e0: 71 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b  q, EP_NoReduce);
20f0: 0a 20 20 20 20 70 45 71 2d 3e 69 52 69 67 68 74  .    pEq->iRight
2100: 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 28 69 31 36  JoinTable = (i16
2110: 29 70 45 32 2d 3e 69 54 61 62 6c 65 3b 0a 20 20  )pE2->iTable;.  
2120: 7d 0a 20 20 2a 70 70 57 68 65 72 65 20 3d 20 73  }.  *ppWhere = s
2130: 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 64 62  qlite3ExprAnd(db
2140: 2c 20 2a 70 70 57 68 65 72 65 2c 20 70 45 71 29  , *ppWhere, pEq)
2150: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
2160: 68 65 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 70  he EP_FromJoin p
2170: 72 6f 70 65 72 74 79 20 6f 6e 20 61 6c 6c 20 74  roperty on all t
2180: 65 72 6d 73 20 6f 66 20 74 68 65 20 67 69 76 65  erms of the give
2190: 6e 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a  n expression..**
21a0: 20 41 6e 64 20 73 65 74 20 74 68 65 20 45 78 70   And set the Exp
21b0: 72 2e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c  r.iRightJoinTabl
21c0: 65 20 74 6f 20 69 54 61 62 6c 65 20 66 6f 72 20  e to iTable for 
21d0: 65 76 65 72 79 20 74 65 72 6d 20 69 6e 20 74 68  every term in th
21e0: 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 2e  e.** expression.
21f0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 50 5f 46 72  .**.** The EP_Fr
2200: 6f 6d 4a 6f 69 6e 20 70 72 6f 70 65 72 74 79 20  omJoin property 
2210: 69 73 20 75 73 65 64 20 6f 6e 20 74 65 72 6d 73  is used on terms
2220: 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f   of an expressio
2230: 6e 20 74 6f 20 74 65 6c 6c 0a 2a 2a 20 74 68 65  n to tell.** the
2240: 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e   LEFT OUTER JOIN
2250: 20 70 72 6f 63 65 73 73 69 6e 67 20 6c 6f 67 69   processing logi
2260: 63 20 74 68 61 74 20 74 68 69 73 20 74 65 72 6d  c that this term
2270: 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 0a   is part of the.
2280: 2a 2a 20 6a 6f 69 6e 20 72 65 73 74 72 69 63 74  ** join restrict
2290: 69 6f 6e 20 73 70 65 63 69 66 69 65 64 20 69 6e  ion specified in
22a0: 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47   the ON or USING
22b0: 20 63 6c 61 75 73 65 20 61 6e 64 20 6e 6f 74 20   clause and not 
22c0: 61 20 70 61 72 74 0a 2a 2a 20 6f 66 20 74 68 65  a part.** of the
22d0: 20 6d 6f 72 65 20 67 65 6e 65 72 61 6c 20 57 48   more general WH
22e0: 45 52 45 20 63 6c 61 75 73 65 2e 20 20 54 68 65  ERE clause.  The
22f0: 73 65 20 74 65 72 6d 73 20 61 72 65 20 6d 6f 76  se terms are mov
2300: 65 64 20 6f 76 65 72 20 74 6f 20 74 68 65 0a 2a  ed over to the.*
2310: 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 64  * WHERE clause d
2320: 75 72 69 6e 67 20 6a 6f 69 6e 20 70 72 6f 63 65  uring join proce
2330: 73 73 69 6e 67 20 62 75 74 20 77 65 20 6e 65 65  ssing but we nee
2340: 64 20 74 6f 20 72 65 6d 65 6d 62 65 72 20 74 68  d to remember th
2350: 61 74 20 74 68 65 79 0a 2a 2a 20 6f 72 69 67 69  at they.** origi
2360: 6e 61 74 65 64 20 69 6e 20 74 68 65 20 4f 4e 20  nated in the ON 
2370: 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2e  or USING clause.
2380: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 78 70 72 2e  .**.** The Expr.
2390: 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20  iRightJoinTable 
23a0: 74 65 6c 6c 73 20 74 68 65 20 57 48 45 52 45 20  tells the WHERE 
23b0: 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e  clause processin
23c0: 67 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 65 78  g that the.** ex
23d0: 70 72 65 73 73 69 6f 6e 20 64 65 70 65 6e 64 73  pression depends
23e0: 20 6f 6e 20 74 61 62 6c 65 20 69 52 69 67 68 74   on table iRight
23f0: 4a 6f 69 6e 54 61 62 6c 65 20 65 76 65 6e 20 69  JoinTable even i
2400: 66 20 74 68 61 74 20 74 61 62 6c 65 20 69 73 20  f that table is 
2410: 6e 6f 74 0a 2a 2a 20 65 78 70 6c 69 63 69 74 6c  not.** explicitl
2420: 79 20 6d 65 6e 74 69 6f 6e 65 64 20 69 6e 20 74  y mentioned in t
2430: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20  he expression.  
2440: 54 68 61 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  That information
2450: 20 69 73 20 6e 65 65 64 65 64 0a 2a 2a 20 66 6f   is needed.** fo
2460: 72 20 63 61 73 65 73 20 6c 69 6b 65 20 74 68 69  r cases like thi
2470: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45  s:.**.**    SELE
2480: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4c 45 46  CT * FROM t1 LEF
2490: 54 20 4a 4f 49 4e 20 74 32 20 4f 4e 20 74 31 2e  T JOIN t2 ON t1.
24a0: 61 3d 74 32 2e 62 20 41 4e 44 20 74 31 2e 78 3d  a=t2.b AND t1.x=
24b0: 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 77 68 65 72  5.**.** The wher
24c0: 65 20 63 6c 61 75 73 65 20 6e 65 65 64 73 20 74  e clause needs t
24d0: 6f 20 64 65 66 65 72 20 74 68 65 20 68 61 6e 64  o defer the hand
24e0: 6c 69 6e 67 20 6f 66 20 74 68 65 20 74 31 2e 78  ling of the t1.x
24f0: 3d 35 0a 2a 2a 20 74 65 72 6d 20 75 6e 74 69 6c  =5.** term until
2500: 20 61 66 74 65 72 20 74 68 65 20 74 32 20 6c 6f   after the t2 lo
2510: 6f 70 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20  op of the join. 
2520: 20 49 6e 20 74 68 61 74 20 77 61 79 2c 20 61 0a   In that way, a.
2530: 2a 2a 20 4e 55 4c 4c 20 74 32 20 72 6f 77 20 77  ** NULL t2 row w
2540: 69 6c 6c 20 62 65 20 69 6e 73 65 72 74 65 64 20  ill be inserted 
2550: 77 68 65 6e 65 76 65 72 20 74 31 2e 78 21 3d 35  whenever t1.x!=5
2560: 2e 20 20 49 66 20 77 65 20 64 6f 20 6e 6f 74 0a  .  If we do not.
2570: 2a 2a 20 64 65 66 65 72 20 74 68 65 20 68 61 6e  ** defer the han
2580: 64 6c 69 6e 67 20 6f 66 20 74 31 2e 78 3d 35 2c  dling of t1.x=5,
2590: 20 69 74 20 77 69 6c 6c 20 62 65 20 70 72 6f 63   it will be proc
25a0: 65 73 73 65 64 20 69 6d 6d 65 64 69 61 74 65 6c  essed immediatel
25b0: 79 0a 2a 2a 20 61 66 74 65 72 20 74 68 65 20 74  y.** after the t
25c0: 31 20 6c 6f 6f 70 20 61 6e 64 20 72 6f 77 73 20  1 loop and rows 
25d0: 77 69 74 68 20 74 31 2e 78 21 3d 35 20 77 69 6c  with t1.x!=5 wil
25e0: 6c 20 6e 65 76 65 72 20 61 70 70 65 61 72 20 69  l never appear i
25f0: 6e 0a 2a 2a 20 74 68 65 20 6f 75 74 70 75 74 2c  n.** the output,
2600: 20 77 68 69 63 68 20 69 73 20 69 6e 63 6f 72 72   which is incorr
2610: 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ect..*/.static v
2620: 6f 69 64 20 73 65 74 4a 6f 69 6e 45 78 70 72 28  oid setJoinExpr(
2630: 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 69 54 61  Expr *p, int iTa
2640: 62 6c 65 29 7b 0a 20 20 77 68 69 6c 65 28 20 70  ble){.  while( p
2650: 20 29 7b 0a 20 20 20 20 45 78 70 72 53 65 74 50   ){.    ExprSetP
2660: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 46 72  roperty(p, EP_Fr
2670: 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20 61 73 73  omJoin);.    ass
2680: 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
2690: 70 65 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65  perty(p, EP_Toke
26a0: 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64  nOnly|EP_Reduced
26b0: 29 20 29 3b 0a 20 20 20 20 45 78 70 72 53 65 74  ) );.    ExprSet
26c0: 56 56 41 50 72 6f 70 65 72 74 79 28 70 2c 20 45  VVAProperty(p, E
26d0: 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a 20 20 20  P_NoReduce);.   
26e0: 20 70 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61   p->iRightJoinTa
26f0: 62 6c 65 20 3d 20 28 69 31 36 29 69 54 61 62 6c  ble = (i16)iTabl
2700: 65 3b 0a 20 20 20 20 73 65 74 4a 6f 69 6e 45 78  e;.    setJoinEx
2710: 70 72 28 70 2d 3e 70 4c 65 66 74 2c 20 69 54 61  pr(p->pLeft, iTa
2720: 62 6c 65 29 3b 0a 20 20 20 20 70 20 3d 20 70 2d  ble);.    p = p-
2730: 3e 70 52 69 67 68 74 3b 0a 20 20 7d 20 0a 7d 0a  >pRight;.  } .}.
2740: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
2750: 69 6e 65 20 70 72 6f 63 65 73 73 65 73 20 74 68  ine processes th
2760: 65 20 6a 6f 69 6e 20 69 6e 66 6f 72 6d 61 74 69  e join informati
2770: 6f 6e 20 66 6f 72 20 61 20 53 45 4c 45 43 54 20  on for a SELECT 
2780: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4f 4e  statement..** ON
2790: 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73   and USING claus
27a0: 65 73 20 61 72 65 20 63 6f 6e 76 65 72 74 65 64  es are converted
27b0: 20 69 6e 74 6f 20 65 78 74 72 61 20 74 65 72 6d   into extra term
27c0: 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  s of the WHERE c
27d0: 6c 61 75 73 65 2e 0a 2a 2a 20 4e 41 54 55 52 41  lause..** NATURA
27e0: 4c 20 6a 6f 69 6e 73 20 61 6c 73 6f 20 63 72 65  L joins also cre
27f0: 61 74 65 20 65 78 74 72 61 20 57 48 45 52 45 20  ate extra WHERE 
2800: 63 6c 61 75 73 65 20 74 65 72 6d 73 2e 0a 2a 2a  clause terms..**
2810: 0a 2a 2a 20 54 68 65 20 74 65 72 6d 73 20 6f 66  .** The terms of
2820: 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 61   a FROM clause a
2830: 72 65 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20  re contained in 
2840: 74 68 65 20 53 65 6c 65 63 74 2e 70 53 72 63 20  the Select.pSrc 
2850: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 20 54 68  structure..** Th
2860: 65 20 6c 65 66 74 20 6d 6f 73 74 20 74 61 62 6c  e left most tabl
2870: 65 20 69 73 20 74 68 65 20 66 69 72 73 74 20 65  e is the first e
2880: 6e 74 72 79 20 69 6e 20 53 65 6c 65 63 74 2e 70  ntry in Select.p
2890: 53 72 63 2e 20 20 54 68 65 20 72 69 67 68 74 2d  Src.  The right-
28a0: 6d 6f 73 74 0a 2a 2a 20 74 61 62 6c 65 20 69 73  most.** table is
28b0: 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 2e   the last entry.
28c0: 20 20 54 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61    The join opera
28d0: 74 6f 72 20 69 73 20 68 65 6c 64 20 69 6e 20 74  tor is held in t
28e0: 68 65 20 65 6e 74 72 79 20 74 6f 0a 2a 2a 20 74  he entry to.** t
28f0: 68 65 20 6c 65 66 74 2e 20 20 54 68 75 73 20 65  he left.  Thus e
2900: 6e 74 72 79 20 30 20 63 6f 6e 74 61 69 6e 73 20  ntry 0 contains 
2910: 74 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f  the join operato
2920: 72 20 66 6f 72 20 74 68 65 20 6a 6f 69 6e 20 62  r for the join b
2930: 65 74 77 65 65 6e 0a 2a 2a 20 65 6e 74 72 69 65  etween.** entrie
2940: 73 20 30 20 61 6e 64 20 31 2e 20 20 41 6e 79 20  s 0 and 1.  Any 
2950: 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75  ON or USING clau
2960: 73 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ses associated w
2970: 69 74 68 20 74 68 65 20 6a 6f 69 6e 20 61 72 65  ith the join are
2980: 0a 2a 2a 20 61 6c 73 6f 20 61 74 74 61 63 68 65  .** also attache
2990: 64 20 74 6f 20 74 68 65 20 6c 65 66 74 20 65 6e  d to the left en
29a0: 74 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  try..**.** This 
29b0: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
29c0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72  the number of er
29d0: 72 6f 72 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  rors encountered
29e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
29f0: 73 71 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f 69  sqliteProcessJoi
2a00: 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  n(Parse *pParse,
2a10: 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 53   Select *p){.  S
2a20: 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 20 20 20  rcList *pSrc;   
2a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a40: 2a 20 41 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20  * All tables in 
2a50: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
2a60: 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20  */.  int i, j;  
2a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a80: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
2a90: 6e 74 65 72 73 20 2a 2f 0a 20 20 73 74 72 75 63  nters */.  struc
2aa0: 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
2ab0: 70 4c 65 66 74 3b 20 20 20 20 20 2f 2a 20 4c 65  pLeft;     /* Le
2ac0: 66 74 20 74 61 62 6c 65 20 62 65 69 6e 67 20 6a  ft table being j
2ad0: 6f 69 6e 65 64 20 2a 2f 0a 20 20 73 74 72 75 63  oined */.  struc
2ae0: 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
2af0: 70 52 69 67 68 74 3b 20 20 20 20 2f 2a 20 52 69  pRight;    /* Ri
2b00: 67 68 74 20 74 61 62 6c 65 20 62 65 69 6e 67 20  ght table being 
2b10: 6a 6f 69 6e 65 64 20 2a 2f 0a 0a 20 20 70 53 72  joined */..  pSr
2b20: 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70  c = p->pSrc;.  p
2b30: 4c 65 66 74 20 3d 20 26 70 53 72 63 2d 3e 61 5b  Left = &pSrc->a[
2b40: 30 5d 3b 0a 20 20 70 52 69 67 68 74 20 3d 20 26  0];.  pRight = &
2b50: 70 4c 65 66 74 5b 31 5d 3b 0a 20 20 66 6f 72 28  pLeft[1];.  for(
2b60: 69 3d 30 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72  i=0; i<pSrc->nSr
2b70: 63 2d 31 3b 20 69 2b 2b 2c 20 70 52 69 67 68 74  c-1; i++, pRight
2b80: 2b 2b 2c 20 70 4c 65 66 74 2b 2b 29 7b 0a 20 20  ++, pLeft++){.  
2b90: 20 20 54 61 62 6c 65 20 2a 70 4c 65 66 74 54 61    Table *pLeftTa
2ba0: 62 20 3d 20 70 4c 65 66 74 2d 3e 70 54 61 62 3b  b = pLeft->pTab;
2bb0: 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 52 69 67  .    Table *pRig
2bc0: 68 74 54 61 62 20 3d 20 70 52 69 67 68 74 2d 3e  htTab = pRight->
2bd0: 70 54 61 62 3b 0a 20 20 20 20 69 6e 74 20 69 73  pTab;.    int is
2be0: 4f 75 74 65 72 3b 0a 0a 20 20 20 20 69 66 28 20  Outer;..    if( 
2bf0: 4e 45 56 45 52 28 70 4c 65 66 74 54 61 62 3d 3d  NEVER(pLeftTab==
2c00: 30 20 7c 7c 20 70 52 69 67 68 74 54 61 62 3d 3d  0 || pRightTab==
2c10: 30 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  0) ) continue;. 
2c20: 20 20 20 69 73 4f 75 74 65 72 20 3d 20 28 70 52     isOuter = (pR
2c30: 69 67 68 74 2d 3e 6a 6f 69 6e 74 79 70 65 20 26  ight->jointype &
2c40: 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30 3b 0a 0a   JT_OUTER)!=0;..
2c50: 20 20 20 20 2f 2a 20 57 68 65 6e 20 74 68 65 20      /* When the 
2c60: 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 20  NATURAL keyword 
2c70: 69 73 20 70 72 65 73 65 6e 74 2c 20 61 64 64 20  is present, add 
2c80: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
2c90: 6d 73 20 66 6f 72 0a 20 20 20 20 2a 2a 20 65 76  ms for.    ** ev
2ca0: 65 72 79 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20  ery column that 
2cb0: 74 68 65 20 74 77 6f 20 74 61 62 6c 65 73 20 68  the two tables h
2cc0: 61 76 65 20 69 6e 20 63 6f 6d 6d 6f 6e 2e 0a 20  ave in common.. 
2cd0: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52     */.    if( pR
2ce0: 69 67 68 74 2d 3e 6a 6f 69 6e 74 79 70 65 20 26  ight->jointype &
2cf0: 20 4a 54 5f 4e 41 54 55 52 41 4c 20 29 7b 0a 20   JT_NATURAL ){. 
2d00: 20 20 20 20 20 69 66 28 20 70 52 69 67 68 74 2d       if( pRight-
2d10: 3e 70 4f 6e 20 7c 7c 20 70 52 69 67 68 74 2d 3e  >pOn || pRight->
2d20: 70 55 73 69 6e 67 20 29 7b 0a 20 20 20 20 20 20  pUsing ){.      
2d30: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
2d40: 67 28 70 50 61 72 73 65 2c 20 22 61 20 4e 41 54  g(pParse, "a NAT
2d50: 55 52 41 4c 20 6a 6f 69 6e 20 6d 61 79 20 6e 6f  URAL join may no
2d60: 74 20 68 61 76 65 20 22 0a 20 20 20 20 20 20 20  t have ".       
2d70: 20 20 20 20 22 61 6e 20 4f 4e 20 6f 72 20 55 53      "an ON or US
2d80: 49 4e 47 20 63 6c 61 75 73 65 22 2c 20 30 29 3b  ING clause", 0);
2d90: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2da0: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
2db0: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 52 69 67   for(j=0; j<pRig
2dc0: 68 74 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b  htTab->nCol; j++
2dd0: 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
2de0: 2a 7a 4e 61 6d 65 3b 20 20 20 2f 2a 20 4e 61 6d  *zName;   /* Nam
2df0: 65 20 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 74  e of column in t
2e00: 68 65 20 72 69 67 68 74 20 74 61 62 6c 65 20 2a  he right table *
2e10: 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4c  /.        int iL
2e20: 65 66 74 3b 20 20 20 20 20 2f 2a 20 4d 61 74 63  eft;     /* Matc
2e30: 68 69 6e 67 20 6c 65 66 74 20 74 61 62 6c 65 20  hing left table 
2e40: 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  */.        int i
2e50: 4c 65 66 74 43 6f 6c 3b 20 20 2f 2a 20 4d 61 74  LeftCol;  /* Mat
2e60: 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 69 6e 20  ching column in 
2e70: 74 68 65 20 6c 65 66 74 20 74 61 62 6c 65 20 2a  the left table *
2e80: 2f 0a 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65  /..        zName
2e90: 20 3d 20 70 52 69 67 68 74 54 61 62 2d 3e 61 43   = pRightTab->aC
2ea0: 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  ol[j].zName;.   
2eb0: 20 20 20 20 20 69 66 28 20 74 61 62 6c 65 41 6e       if( tableAn
2ec0: 64 43 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 53 72  dColumnIndex(pSr
2ed0: 63 2c 20 69 2b 31 2c 20 7a 4e 61 6d 65 2c 20 26  c, i+1, zName, &
2ee0: 69 4c 65 66 74 2c 20 26 69 4c 65 66 74 43 6f 6c  iLeft, &iLeftCol
2ef0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  ) ){.          a
2f00: 64 64 57 68 65 72 65 54 65 72 6d 28 70 50 61 72  ddWhereTerm(pPar
2f10: 73 65 2c 20 70 53 72 63 2c 20 69 4c 65 66 74 2c  se, pSrc, iLeft,
2f20: 20 69 4c 65 66 74 43 6f 6c 2c 20 69 2b 31 2c 20   iLeftCol, i+1, 
2f30: 6a 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  j,.             
2f40: 20 20 20 20 20 20 20 20 20 20 69 73 4f 75 74 65            isOute
2f50: 72 2c 20 26 70 2d 3e 70 57 68 65 72 65 29 3b 0a  r, &p->pWhere);.
2f60: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2f70: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
2f80: 44 69 73 61 6c 6c 6f 77 20 62 6f 74 68 20 4f 4e  Disallow both ON
2f90: 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73   and USING claus
2fa0: 65 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20 6a  es in the same j
2fb0: 6f 69 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  oin.    */.    i
2fc0: 66 28 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20 26  f( pRight->pOn &
2fd0: 26 20 70 52 69 67 68 74 2d 3e 70 55 73 69 6e 67  & pRight->pUsing
2fe0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2ff0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
3000: 2c 20 22 63 61 6e 6e 6f 74 20 68 61 76 65 20 62  , "cannot have b
3010: 6f 74 68 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47  oth ON and USING
3020: 20 22 0a 20 20 20 20 20 20 20 20 22 63 6c 61 75   ".        "clau
3030: 73 65 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20  ses in the same 
3040: 6a 6f 69 6e 22 29 3b 0a 20 20 20 20 20 20 72 65  join");.      re
3050: 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 0a 20  turn 1;.    }.. 
3060: 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 4f 4e     /* Add the ON
3070: 20 63 6c 61 75 73 65 20 74 6f 20 74 68 65 20 65   clause to the e
3080: 6e 64 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  nd of the WHERE 
3090: 63 6c 61 75 73 65 2c 20 63 6f 6e 6e 65 63 74 65  clause, connecte
30a0: 64 20 62 79 0a 20 20 20 20 2a 2a 20 61 6e 20 41  d by.    ** an A
30b0: 4e 44 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 20  ND operator..   
30c0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 69 67   */.    if( pRig
30d0: 68 74 2d 3e 70 4f 6e 20 29 7b 0a 20 20 20 20 20  ht->pOn ){.     
30e0: 20 69 66 28 20 69 73 4f 75 74 65 72 20 29 20 73   if( isOuter ) s
30f0: 65 74 4a 6f 69 6e 45 78 70 72 28 70 52 69 67 68  etJoinExpr(pRigh
3100: 74 2d 3e 70 4f 6e 2c 20 70 52 69 67 68 74 2d 3e  t->pOn, pRight->
3110: 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20  iCursor);.      
3120: 70 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69  p->pWhere = sqli
3130: 74 65 33 45 78 70 72 41 6e 64 28 70 50 61 72 73  te3ExprAnd(pPars
3140: 65 2d 3e 64 62 2c 20 70 2d 3e 70 57 68 65 72 65  e->db, p->pWhere
3150: 2c 20 70 52 69 67 68 74 2d 3e 70 4f 6e 29 3b 0a  , pRight->pOn);.
3160: 20 20 20 20 20 20 70 52 69 67 68 74 2d 3e 70 4f        pRight->pO
3170: 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20  n = 0;.    }..  
3180: 20 20 2f 2a 20 43 72 65 61 74 65 20 65 78 74 72    /* Create extr
3190: 61 20 74 65 72 6d 73 20 6f 6e 20 74 68 65 20 57  a terms on the W
31a0: 48 45 52 45 20 63 6c 61 75 73 65 20 66 6f 72 20  HERE clause for 
31b0: 65 61 63 68 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  each column name
31c0: 64 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20  d.    ** in the 
31d0: 55 53 49 4e 47 20 63 6c 61 75 73 65 2e 20 20 45  USING clause.  E
31e0: 78 61 6d 70 6c 65 3a 20 49 66 20 74 68 65 20 74  xample: If the t
31f0: 77 6f 20 74 61 62 6c 65 73 20 74 6f 20 62 65 20  wo tables to be 
3200: 6a 6f 69 6e 65 64 20 61 72 65 20 0a 20 20 20 20  joined are .    
3210: 2a 2a 20 41 20 61 6e 64 20 42 20 61 6e 64 20 74  ** A and B and t
3220: 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20  he USING clause 
3230: 6e 61 6d 65 73 20 58 2c 20 59 2c 20 61 6e 64 20  names X, Y, and 
3240: 5a 2c 20 74 68 65 6e 20 61 64 64 20 74 68 69 73  Z, then add this
3250: 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 57  .    ** to the W
3260: 48 45 52 45 20 63 6c 61 75 73 65 3a 20 20 20 20  HERE clause:    
3270: 41 2e 58 3d 42 2e 58 20 41 4e 44 20 41 2e 59 3d  A.X=B.X AND A.Y=
3280: 42 2e 59 20 41 4e 44 20 41 2e 5a 3d 42 2e 5a 0a  B.Y AND A.Z=B.Z.
3290: 20 20 20 20 2a 2a 20 52 65 70 6f 72 74 20 61 6e      ** Report an
32a0: 20 65 72 72 6f 72 20 69 66 20 61 6e 79 20 63 6f   error if any co
32b0: 6c 75 6d 6e 20 6d 65 6e 74 69 6f 6e 65 64 20 69  lumn mentioned i
32c0: 6e 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75  n the USING clau
32d0: 73 65 20 69 73 0a 20 20 20 20 2a 2a 20 6e 6f 74  se is.    ** not
32e0: 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 62 6f   contained in bo
32f0: 74 68 20 74 61 62 6c 65 73 20 74 6f 20 62 65 20  th tables to be 
3300: 6a 6f 69 6e 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  joined..    */. 
3310: 20 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 70     if( pRight->p
3320: 55 73 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 49  Using ){.      I
3330: 64 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70  dList *pList = p
3340: 52 69 67 68 74 2d 3e 70 55 73 69 6e 67 3b 0a 20  Right->pUsing;. 
3350: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
3360: 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 6a 2b 2b 29  pList->nId; j++)
3370: 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  {.        char *
3380: 7a 4e 61 6d 65 3b 20 20 20 20 20 2f 2a 20 4e 61  zName;     /* Na
3390: 6d 65 20 6f 66 20 74 68 65 20 74 65 72 6d 20 69  me of the term i
33a0: 6e 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75  n the USING clau
33b0: 73 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  se */.        in
33c0: 74 20 69 4c 65 66 74 3b 20 20 20 20 20 20 20 2f  t iLeft;       /
33d0: 2a 20 54 61 62 6c 65 20 6f 6e 20 74 68 65 20 6c  * Table on the l
33e0: 65 66 74 20 77 69 74 68 20 6d 61 74 63 68 69 6e  eft with matchin
33f0: 67 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f  g column name */
3400: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4c 65  .        int iLe
3410: 66 74 43 6f 6c 3b 20 20 20 20 2f 2a 20 43 6f 6c  ftCol;    /* Col
3420: 75 6d 6e 20 6e 75 6d 62 65 72 20 6f 66 20 6d 61  umn number of ma
3430: 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 6f 6e  tching column on
3440: 20 74 68 65 20 6c 65 66 74 20 2a 2f 0a 20 20 20   the left */.   
3450: 20 20 20 20 20 69 6e 74 20 69 52 69 67 68 74 43       int iRightC
3460: 6f 6c 3b 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20  ol;   /* Column 
3470: 6e 75 6d 62 65 72 20 6f 66 20 6d 61 74 63 68 69  number of matchi
3480: 6e 67 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74 68 65  ng column on the
3490: 20 72 69 67 68 74 20 2a 2f 0a 0a 20 20 20 20 20   right */..     
34a0: 20 20 20 7a 4e 61 6d 65 20 3d 20 70 4c 69 73 74     zName = pList
34b0: 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  ->a[j].zName;.  
34c0: 20 20 20 20 20 20 69 52 69 67 68 74 43 6f 6c 20        iRightCol 
34d0: 3d 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 52  = columnIndex(pR
34e0: 69 67 68 74 54 61 62 2c 20 7a 4e 61 6d 65 29 3b  ightTab, zName);
34f0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 52 69  .        if( iRi
3500: 67 68 74 43 6f 6c 3c 30 0a 20 20 20 20 20 20 20  ghtCol<0.       
3510: 20 20 7c 7c 20 21 74 61 62 6c 65 41 6e 64 43 6f    || !tableAndCo
3520: 6c 75 6d 6e 49 6e 64 65 78 28 70 53 72 63 2c 20  lumnIndex(pSrc, 
3530: 69 2b 31 2c 20 7a 4e 61 6d 65 2c 20 26 69 4c 65  i+1, zName, &iLe
3540: 66 74 2c 20 26 69 4c 65 66 74 43 6f 6c 29 0a 20  ft, &iLeftCol). 
3550: 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
3560: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
3570: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63 61 6e  Msg(pParse, "can
3580: 6e 6f 74 20 6a 6f 69 6e 20 75 73 69 6e 67 20 63  not join using c
3590: 6f 6c 75 6d 6e 20 25 73 20 2d 20 63 6f 6c 75 6d  olumn %s - colum
35a0: 6e 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  n ".            
35b0: 22 6e 6f 74 20 70 72 65 73 65 6e 74 20 69 6e 20  "not present in 
35c0: 62 6f 74 68 20 74 61 62 6c 65 73 22 2c 20 7a 4e  both tables", zN
35d0: 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
35e0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
35f0: 20 20 7d 0a 20 20 20 20 20 20 20 20 61 64 64 57    }.        addW
3600: 68 65 72 65 54 65 72 6d 28 70 50 61 72 73 65 2c  hereTerm(pParse,
3610: 20 70 53 72 63 2c 20 69 4c 65 66 74 2c 20 69 4c   pSrc, iLeft, iL
3620: 65 66 74 43 6f 6c 2c 20 69 2b 31 2c 20 69 52 69  eftCol, i+1, iRi
3630: 67 68 74 43 6f 6c 2c 0a 20 20 20 20 20 20 20 20  ghtCol,.        
3640: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f               isO
3650: 75 74 65 72 2c 20 26 70 2d 3e 70 57 68 65 72 65  uter, &p->pWhere
3660: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
3670: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
3680: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74  .}../*.** Insert
3690: 20 63 6f 64 65 20 69 6e 74 6f 20 22 76 22 20 74   code into "v" t
36a0: 68 61 74 20 77 69 6c 6c 20 70 75 73 68 20 74 68  hat will push th
36b0: 65 20 72 65 63 6f 72 64 20 6f 6e 20 74 68 65 20  e record on the 
36c0: 74 6f 70 20 6f 66 20 74 68 65 0a 2a 2a 20 73 74  top of the.** st
36d0: 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 73 6f 72  ack into the sor
36e0: 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ter..*/.static v
36f0: 6f 69 64 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74  oid pushOntoSort
3700: 65 72 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  er(.  Parse *pPa
3710: 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  rse,         /* 
3720: 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  Parser context *
3730: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  /.  ExprList *pO
3740: 72 64 65 72 42 79 2c 20 20 20 20 2f 2a 20 54 68  rderBy,    /* Th
3750: 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
3760: 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  e */.  Select *p
3770: 53 65 6c 65 63 74 2c 20 20 20 20 20 20 20 2f 2a  Select,       /*
3780: 20 54 68 65 20 77 68 6f 6c 65 20 53 45 4c 45 43   The whole SELEC
3790: 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  T statement */. 
37a0: 20 69 6e 74 20 72 65 67 44 61 74 61 20 20 20 20   int regData    
37b0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73          /* Regis
37c0: 74 65 72 20 68 6f 6c 64 69 6e 67 20 64 61 74 61  ter holding data
37d0: 20 74 6f 20 62 65 20 73 6f 72 74 65 64 20 2a 2f   to be sorted */
37e0: 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  .){.  Vdbe *v = 
37f0: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
3800: 20 69 6e 74 20 6e 45 78 70 72 20 3d 20 70 4f 72   int nExpr = pOr
3810: 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20  derBy->nExpr;.  
3820: 69 6e 74 20 72 65 67 42 61 73 65 20 3d 20 73 71  int regBase = sq
3830: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67  lite3GetTempRang
3840: 65 28 70 50 61 72 73 65 2c 20 6e 45 78 70 72 2b  e(pParse, nExpr+
3850: 32 29 3b 0a 20 20 69 6e 74 20 72 65 67 52 65 63  2);.  int regRec
3860: 6f 72 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74  ord = sqlite3Get
3870: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
3880: 0a 20 20 69 6e 74 20 6f 70 3b 0a 20 20 73 71 6c  .  int op;.  sql
3890: 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65  ite3ExprCacheCle
38a0: 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71  ar(pParse);.  sq
38b0: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70  lite3ExprCodeExp
38c0: 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 4f  rList(pParse, pO
38d0: 72 64 65 72 42 79 2c 20 72 65 67 42 61 73 65 2c  rderBy, regBase,
38e0: 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64   0);.  sqlite3Vd
38f0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
3900: 65 71 75 65 6e 63 65 2c 20 70 4f 72 64 65 72 42  equence, pOrderB
3910: 79 2d 3e 69 45 43 75 72 73 6f 72 2c 20 72 65 67  y->iECursor, reg
3920: 42 61 73 65 2b 6e 45 78 70 72 29 3b 0a 20 20 73  Base+nExpr);.  s
3930: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f  qlite3ExprCodeMo
3940: 76 65 28 70 50 61 72 73 65 2c 20 72 65 67 44 61  ve(pParse, regDa
3950: 74 61 2c 20 72 65 67 42 61 73 65 2b 6e 45 78 70  ta, regBase+nExp
3960: 72 2b 31 2c 20 31 29 3b 0a 20 20 73 71 6c 69 74  r+1, 1);.  sqlit
3970: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
3980: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72  OP_MakeRecord, r
3990: 65 67 42 61 73 65 2c 20 6e 45 78 70 72 20 2b 20  egBase, nExpr + 
39a0: 32 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20  2, regRecord);. 
39b0: 20 69 66 28 20 70 53 65 6c 65 63 74 2d 3e 73 65   if( pSelect->se
39c0: 6c 46 6c 61 67 73 20 26 20 53 46 5f 55 73 65 53  lFlags & SF_UseS
39d0: 6f 72 74 65 72 20 29 7b 0a 20 20 20 20 6f 70 20  orter ){.    op 
39e0: 3d 20 4f 50 5f 53 6f 72 74 65 72 49 6e 73 65 72  = OP_SorterInser
39f0: 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  t;.  }else{.    
3a00: 6f 70 20 3d 20 4f 50 5f 49 64 78 49 6e 73 65 72  op = OP_IdxInser
3a10: 74 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  t;.  }.  sqlite3
3a20: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 6f 70  VdbeAddOp2(v, op
3a30: 2c 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75  , pOrderBy->iECu
3a40: 72 73 6f 72 2c 20 72 65 67 52 65 63 6f 72 64 29  rsor, regRecord)
3a50: 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  ;.  sqlite3Relea
3a60: 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
3a70: 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20  , regRecord);.  
3a80: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
3a90: 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
3aa0: 72 65 67 42 61 73 65 2c 20 6e 45 78 70 72 2b 32  regBase, nExpr+2
3ab0: 29 3b 0a 20 20 69 66 28 20 70 53 65 6c 65 63 74  );.  if( pSelect
3ac0: 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20  ->iLimit ){.    
3ad0: 69 6e 74 20 61 64 64 72 31 2c 20 61 64 64 72 32  int addr1, addr2
3ae0: 3b 0a 20 20 20 20 69 6e 74 20 69 4c 69 6d 69 74  ;.    int iLimit
3af0: 3b 0a 20 20 20 20 69 66 28 20 70 53 65 6c 65 63  ;.    if( pSelec
3b00: 74 2d 3e 69 4f 66 66 73 65 74 20 29 7b 0a 20 20  t->iOffset ){.  
3b10: 20 20 20 20 69 4c 69 6d 69 74 20 3d 20 70 53 65      iLimit = pSe
3b20: 6c 65 63 74 2d 3e 69 4f 66 66 73 65 74 2b 31 3b  lect->iOffset+1;
3b30: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
3b40: 20 20 69 4c 69 6d 69 74 20 3d 20 70 53 65 6c 65    iLimit = pSele
3b50: 63 74 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 20 20  ct->iLimit;.    
3b60: 7d 0a 20 20 20 20 61 64 64 72 31 20 3d 20 73 71  }.    addr1 = sq
3b70: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
3b80: 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c 20 69 4c  v, OP_IfZero, iL
3b90: 69 6d 69 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  imit);.    sqlit
3ba0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
3bb0: 4f 50 5f 41 64 64 49 6d 6d 2c 20 69 4c 69 6d 69  OP_AddImm, iLimi
3bc0: 74 2c 20 2d 31 29 3b 0a 20 20 20 20 61 64 64 72  t, -1);.    addr
3bd0: 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  2 = sqlite3VdbeA
3be0: 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp0(v, OP_Goto
3bf0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
3c00: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
3c10: 64 72 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  dr1);.    sqlite
3c20: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
3c30: 50 5f 4c 61 73 74 2c 20 70 4f 72 64 65 72 42 79  P_Last, pOrderBy
3c40: 2d 3e 69 45 43 75 72 73 6f 72 29 3b 0a 20 20 20  ->iECursor);.   
3c50: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
3c60: 70 31 28 76 2c 20 4f 50 5f 44 65 6c 65 74 65 2c  p1(v, OP_Delete,
3c70: 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72   pOrderBy->iECur
3c80: 73 6f 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  sor);.    sqlite
3c90: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
3ca0: 20 61 64 64 72 32 29 3b 0a 20 20 7d 0a 7d 0a 0a   addr2);.  }.}..
3cb0: 2f 2a 0a 2a 2a 20 41 64 64 20 63 6f 64 65 20 74  /*.** Add code t
3cc0: 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  o implement the 
3cd0: 4f 46 46 53 45 54 0a 2a 2f 0a 73 74 61 74 69 63  OFFSET.*/.static
3ce0: 20 76 6f 69 64 20 63 6f 64 65 4f 66 66 73 65 74   void codeOffset
3cf0: 28 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20  (.  Vdbe *v,    
3d00: 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
3d10: 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 69 73  e code into this
3d20: 20 56 4d 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20   VM */.  Select 
3d30: 2a 70 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68  *p,        /* Th
3d40: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
3d50: 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a  nt being coded *
3d60: 2f 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75  /.  int iContinu
3d70: 65 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65  e     /* Jump he
3d80: 72 65 20 74 6f 20 73 6b 69 70 20 74 68 65 20 63  re to skip the c
3d90: 75 72 72 65 6e 74 20 72 65 63 6f 72 64 20 2a 2f  urrent record */
3da0: 0a 29 7b 0a 20 20 69 66 28 20 70 2d 3e 69 4f 66  .){.  if( p->iOf
3db0: 66 73 65 74 20 26 26 20 69 43 6f 6e 74 69 6e 75  fset && iContinu
3dc0: 65 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  e!=0 ){.    int 
3dd0: 61 64 64 72 3b 0a 20 20 20 20 73 71 6c 69 74 65  addr;.    sqlite
3de0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
3df0: 50 5f 41 64 64 49 6d 6d 2c 20 70 2d 3e 69 4f 66  P_AddImm, p->iOf
3e00: 66 73 65 74 2c 20 2d 31 29 3b 0a 20 20 20 20 61  fset, -1);.    a
3e10: 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
3e20: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66  eAddOp1(v, OP_If
3e30: 4e 65 67 2c 20 70 2d 3e 69 4f 66 66 73 65 74 29  Neg, p->iOffset)
3e40: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
3e50: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
3e60: 74 6f 2c 20 30 2c 20 69 43 6f 6e 74 69 6e 75 65  to, 0, iContinue
3e70: 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  );.    VdbeComme
3e80: 6e 74 28 28 76 2c 20 22 73 6b 69 70 20 4f 46 46  nt((v, "skip OFF
3e90: 53 45 54 20 72 65 63 6f 72 64 73 22 29 29 3b 0a  SET records"));.
3ea0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
3eb0: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 29  umpHere(v, addr)
3ec0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ;.  }.}../*.** A
3ed0: 64 64 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c  dd code that wil
3ee0: 6c 20 63 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20  l check to make 
3ef0: 73 75 72 65 20 74 68 65 20 4e 20 72 65 67 69 73  sure the N regis
3f00: 74 65 72 73 20 73 74 61 72 74 69 6e 67 20 61 74  ters starting at
3f10: 20 69 4d 65 6d 0a 2a 2a 20 66 6f 72 6d 20 61 20   iMem.** form a 
3f20: 64 69 73 74 69 6e 63 74 20 65 6e 74 72 79 2e 20  distinct entry. 
3f30: 20 69 54 61 62 20 69 73 20 61 20 73 6f 72 74 69   iTab is a sorti
3f40: 6e 67 20 69 6e 64 65 78 20 74 68 61 74 20 68 6f  ng index that ho
3f50: 6c 64 73 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a  lds previously.*
3f60: 2a 20 73 65 65 6e 20 63 6f 6d 62 69 6e 61 74 69  * seen combinati
3f70: 6f 6e 73 20 6f 66 20 74 68 65 20 4e 20 76 61 6c  ons of the N val
3f80: 75 65 73 2e 20 20 41 20 6e 65 77 20 65 6e 74 72  ues.  A new entr
3f90: 79 20 69 73 20 6d 61 64 65 20 69 6e 20 69 54 61  y is made in iTa
3fa0: 62 0a 2a 2a 20 69 66 20 74 68 65 20 63 75 72 72  b.** if the curr
3fb0: 65 6e 74 20 4e 20 76 61 6c 75 65 73 20 61 72 65  ent N values are
3fc0: 20 6e 65 77 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a 75   new..**.** A ju
3fd0: 6d 70 20 74 6f 20 61 64 64 72 52 65 70 65 61 74  mp to addrRepeat
3fe0: 20 69 73 20 6d 61 64 65 20 61 6e 64 20 74 68 65   is made and the
3ff0: 20 4e 2b 31 20 76 61 6c 75 65 73 20 61 72 65 20   N+1 values are 
4000: 70 6f 70 70 65 64 20 66 72 6f 6d 20 74 68 65 0a  popped from the.
4010: 2a 2a 20 73 74 61 63 6b 20 69 66 20 74 68 65 20  ** stack if the 
4020: 74 6f 70 20 4e 20 65 6c 65 6d 65 6e 74 73 20 61  top N elements a
4030: 72 65 20 6e 6f 74 20 64 69 73 74 69 6e 63 74 2e  re not distinct.
4040: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
4050: 63 6f 64 65 44 69 73 74 69 6e 63 74 28 0a 20 20  codeDistinct(.  
4060: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
4070: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e     /* Parsing an
4080: 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e  d code generatin
4090: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69  g context */.  i
40a0: 6e 74 20 69 54 61 62 2c 20 20 20 20 20 20 20 20  nt iTab,        
40b0: 20 20 2f 2a 20 41 20 73 6f 72 74 69 6e 67 20 69    /* A sorting i
40c0: 6e 64 65 78 20 75 73 65 64 20 74 6f 20 74 65 73  ndex used to tes
40d0: 74 20 66 6f 72 20 64 69 73 74 69 6e 63 74 6e 65  t for distinctne
40e0: 73 73 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ss */.  int addr
40f0: 52 65 70 65 61 74 2c 20 20 20 20 2f 2a 20 4a 75  Repeat,    /* Ju
4100: 6d 70 20 74 6f 20 68 65 72 65 20 69 66 20 6e 6f  mp to here if no
4110: 74 20 64 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20  t distinct */.  
4120: 69 6e 74 20 4e 2c 20 20 20 20 20 20 20 20 20 20  int N,          
4130: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
4140: 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 6e  elements */.  in
4150: 74 20 69 4d 65 6d 20 20 20 20 20 20 20 20 20 20  t iMem          
4160: 20 2f 2a 20 46 69 72 73 74 20 65 6c 65 6d 65 6e   /* First elemen
4170: 74 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a  t */.){.  Vdbe *
4180: 76 3b 0a 20 20 69 6e 74 20 72 31 3b 0a 0a 20 20  v;.  int r1;..  
4190: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
41a0: 65 3b 0a 20 20 72 31 20 3d 20 73 71 6c 69 74 65  e;.  r1 = sqlite
41b0: 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
41c0: 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  se);.  sqlite3Vd
41d0: 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f  beAddOp4Int(v, O
41e0: 50 5f 46 6f 75 6e 64 2c 20 69 54 61 62 2c 20 61  P_Found, iTab, a
41f0: 64 64 72 52 65 70 65 61 74 2c 20 69 4d 65 6d 2c  ddrRepeat, iMem,
4200: 20 4e 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64   N);.  sqlite3Vd
4210: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d  beAddOp3(v, OP_M
4220: 61 6b 65 52 65 63 6f 72 64 2c 20 69 4d 65 6d 2c  akeRecord, iMem,
4230: 20 4e 2c 20 72 31 29 3b 0a 20 20 73 71 6c 69 74   N, r1);.  sqlit
4240: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
4250: 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 54  OP_IdxInsert, iT
4260: 61 62 2c 20 72 31 29 3b 0a 20 20 73 71 6c 69 74  ab, r1);.  sqlit
4270: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
4280: 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 7d 0a  (pParse, r1);.}.
4290: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
42a0: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a  OMIT_SUBQUERY./*
42b0: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 6e 20  .** Generate an 
42c0: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 77 68  error message wh
42d0: 65 6e 20 61 20 53 45 4c 45 43 54 20 69 73 20 75  en a SELECT is u
42e0: 73 65 64 20 77 69 74 68 69 6e 20 61 20 73 75 62  sed within a sub
42f0: 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 28 65  expression.** (e
4300: 78 61 6d 70 6c 65 3a 20 20 22 61 20 49 4e 20 28  xample:  "a IN (
4310: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 61  SELECT * FROM ta
4320: 62 6c 65 29 22 29 20 62 75 74 20 69 74 20 68 61  ble)") but it ha
4330: 73 20 6d 6f 72 65 20 74 68 61 6e 20 31 20 72 65  s more than 1 re
4340: 73 75 6c 74 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e 20  sult.** column. 
4350: 20 57 65 20 64 6f 20 74 68 69 73 20 69 6e 20 61   We do this in a
4360: 20 73 75 62 72 6f 75 74 69 6e 65 20 62 65 63 61   subroutine beca
4370: 75 73 65 20 74 68 65 20 65 72 72 6f 72 20 75 73  use the error us
4380: 65 64 20 74 6f 20 6f 63 63 75 72 0a 2a 2a 20 69  ed to occur.** i
4390: 6e 20 6d 75 6c 74 69 70 6c 65 20 70 6c 61 63 65  n multiple place
43a0: 73 2e 20 20 28 54 68 65 20 65 72 72 6f 72 20 6f  s.  (The error o
43b0: 6e 6c 79 20 6f 63 63 75 72 73 20 69 6e 20 6f 6e  nly occurs in on
43c0: 65 20 70 6c 61 63 65 20 6e 6f 77 2c 20 62 75 74  e place now, but
43d0: 20 77 65 0a 2a 2a 20 72 65 74 61 69 6e 20 74 68   we.** retain th
43e0: 65 20 73 75 62 72 6f 75 74 69 6e 65 20 74 6f 20  e subroutine to 
43f0: 6d 69 6e 69 6d 69 7a 65 20 63 6f 64 65 20 64 69  minimize code di
4400: 73 72 75 70 74 69 6f 6e 2e 29 0a 2a 2f 0a 73 74  sruption.).*/.st
4410: 61 74 69 63 20 69 6e 74 20 63 68 65 63 6b 46 6f  atic int checkFo
4420: 72 4d 75 6c 74 69 43 6f 6c 75 6d 6e 53 65 6c 65  rMultiColumnSele
4430: 63 74 45 72 72 6f 72 28 0a 20 20 50 61 72 73 65  ctError(.  Parse
4440: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
4450: 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74  /* Parse context
4460: 2e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  . */.  SelectDes
4470: 74 20 2a 70 44 65 73 74 2c 20 20 20 2f 2a 20 44  t *pDest,   /* D
4480: 65 73 74 69 6e 61 74 69 6f 6e 20 6f 66 20 53 45  estination of SE
4490: 4c 45 43 54 20 72 65 73 75 6c 74 73 20 2a 2f 0a  LECT results */.
44a0: 20 20 69 6e 74 20 6e 45 78 70 72 20 20 20 20 20    int nExpr     
44b0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
44c0: 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d   of result colum
44d0: 6e 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 53  ns returned by S
44e0: 45 4c 45 43 54 20 2a 2f 0a 29 7b 0a 20 20 69 6e  ELECT */.){.  in
44f0: 74 20 65 44 65 73 74 20 3d 20 70 44 65 73 74 2d  t eDest = pDest-
4500: 3e 65 44 65 73 74 3b 0a 20 20 69 66 28 20 6e 45  >eDest;.  if( nE
4510: 78 70 72 3e 31 20 26 26 20 28 65 44 65 73 74 3d  xpr>1 && (eDest=
4520: 3d 53 52 54 5f 4d 65 6d 20 7c 7c 20 65 44 65 73  =SRT_Mem || eDes
4530: 74 3d 3d 53 52 54 5f 53 65 74 29 20 29 7b 0a 20  t==SRT_Set) ){. 
4540: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
4550: 73 67 28 70 50 61 72 73 65 2c 20 22 6f 6e 6c 79  sg(pParse, "only
4560: 20 61 20 73 69 6e 67 6c 65 20 72 65 73 75 6c 74   a single result
4570: 20 61 6c 6c 6f 77 65 64 20 66 6f 72 20 22 0a 20   allowed for ". 
4580: 20 20 20 20 20 20 22 61 20 53 45 4c 45 43 54 20        "a SELECT 
4590: 74 68 61 74 20 69 73 20 70 61 72 74 20 6f 66 20  that is part of 
45a0: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 22 29 3b  an expression");
45b0: 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
45c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
45d0: 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  rn 0;.  }.}.#end
45e0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73  if../*.** An ins
45f0: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
4600: 6c 6f 77 69 6e 67 20 6f 62 6a 65 63 74 20 69 73  lowing object is
4610: 20 75 73 65 64 20 74 6f 20 72 65 63 6f 72 64 20   used to record 
4620: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  information abou
4630: 74 0a 2a 2a 20 68 6f 77 20 74 6f 20 70 72 6f 63  t.** how to proc
4640: 65 73 73 20 74 68 65 20 44 49 53 54 49 4e 43 54  ess the DISTINCT
4650: 20 6b 65 79 77 6f 72 64 2c 20 74 6f 20 73 69 6d   keyword, to sim
4660: 70 6c 69 66 79 20 70 61 73 73 69 6e 67 20 74 68  plify passing th
4670: 61 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a  at information.*
4680: 2a 20 69 6e 74 6f 20 74 68 65 20 73 65 6c 65 63  * into the selec
4690: 74 49 6e 6e 65 72 4c 6f 6f 70 28 29 20 72 6f 75  tInnerLoop() rou
46a0: 74 69 6e 65 2e 0a 2a 2f 0a 74 79 70 65 64 65 66  tine..*/.typedef
46b0: 20 73 74 72 75 63 74 20 44 69 73 74 69 6e 63 74   struct Distinct
46c0: 43 74 78 20 44 69 73 74 69 6e 63 74 43 74 78 3b  Ctx DistinctCtx;
46d0: 0a 73 74 72 75 63 74 20 44 69 73 74 69 6e 63 74  .struct Distinct
46e0: 43 74 78 20 7b 0a 20 20 75 38 20 69 73 54 6e 63  Ctx {.  u8 isTnc
46f0: 74 3b 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20  t;      /* True 
4700: 69 66 20 74 68 65 20 44 49 53 54 49 4e 43 54 20  if the DISTINCT 
4710: 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65 73 65  keyword is prese
4720: 6e 74 20 2a 2f 0a 20 20 75 38 20 65 54 6e 63 74  nt */.  u8 eTnct
4730: 54 79 70 65 3b 20 20 20 2f 2a 20 4f 6e 65 20 6f  Type;   /* One o
4740: 66 20 74 68 65 20 57 48 45 52 45 5f 44 49 53 54  f the WHERE_DIST
4750: 49 4e 43 54 5f 2a 20 6f 70 65 72 61 74 6f 72 73  INCT_* operators
4760: 20 2a 2f 0a 20 20 69 6e 74 20 74 61 62 54 6e 63   */.  int tabTnc
4770: 74 3b 20 20 20 20 2f 2a 20 45 70 68 65 6d 65 72  t;    /* Ephemer
4780: 61 6c 20 74 61 62 6c 65 20 75 73 65 64 20 66 6f  al table used fo
4790: 72 20 44 49 53 54 49 4e 43 54 20 70 72 6f 63 65  r DISTINCT proce
47a0: 73 73 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 61  ssing */.  int a
47b0: 64 64 72 54 6e 63 74 3b 20 20 20 2f 2a 20 41 64  ddrTnct;   /* Ad
47c0: 64 72 65 73 73 20 6f 66 20 4f 50 5f 4f 70 65 6e  dress of OP_Open
47d0: 45 70 68 65 6d 65 72 61 6c 20 6f 70 63 6f 64 65  Ephemeral opcode
47e0: 20 66 6f 72 20 74 61 62 54 6e 63 74 20 2a 2f 0a   for tabTnct */.
47f0: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  };../*.** This r
4800: 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73  outine generates
4810: 20 74 68 65 20 63 6f 64 65 20 66 6f 72 20 74 68   the code for th
4820: 65 20 69 6e 73 69 64 65 20 6f 66 20 74 68 65 20  e inside of the 
4830: 69 6e 6e 65 72 20 6c 6f 6f 70 0a 2a 2a 20 6f 66  inner loop.** of
4840: 20 61 20 53 45 4c 45 43 54 2e 0a 2a 2a 0a 2a 2a   a SELECT..**.**
4850: 20 49 66 20 73 72 63 54 61 62 20 61 6e 64 20 6e   If srcTab and n
4860: 43 6f 6c 75 6d 6e 20 61 72 65 20 62 6f 74 68 20  Column are both 
4870: 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 70  zero, then the p
4880: 45 4c 69 73 74 20 65 78 70 72 65 73 73 69 6f 6e  EList expression
4890: 73 0a 2a 2a 20 61 72 65 20 65 76 61 6c 75 61 74  s.** are evaluat
48a0: 65 64 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67  ed in order to g
48b0: 65 74 20 74 68 65 20 64 61 74 61 20 66 6f 72 20  et the data for 
48c0: 74 68 69 73 20 72 6f 77 2e 20 20 49 66 20 6e 43  this row.  If nC
48d0: 6f 6c 75 6d 6e 3e 30 0a 2a 2a 20 74 68 65 6e 20  olumn>0.** then 
48e0: 64 61 74 61 20 69 73 20 70 75 6c 6c 65 64 20 66  data is pulled f
48f0: 72 6f 6d 20 73 72 63 54 61 62 20 61 6e 64 20 70  rom srcTab and p
4900: 45 4c 69 73 74 20 69 73 20 75 73 65 64 20 6f 6e  EList is used on
4910: 6c 79 20 74 6f 20 67 65 74 20 74 68 65 0a 2a 2a  ly to get the.**
4920: 20 64 61 74 61 74 79 70 65 73 20 66 6f 72 20 65   datatypes for e
4930: 61 63 68 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 73  ach column..*/.s
4940: 74 61 74 69 63 20 76 6f 69 64 20 73 65 6c 65 63  tatic void selec
4950: 74 49 6e 6e 65 72 4c 6f 6f 70 28 0a 20 20 50 61  tInnerLoop(.  Pa
4960: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
4970: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
4980: 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ser context */. 
4990: 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
49a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
49b0: 63 6f 6d 70 6c 65 74 65 20 73 65 6c 65 63 74 20  complete select 
49c0: 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20  statement being 
49d0: 63 6f 64 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c  coded */.  ExprL
49e0: 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20  ist *pEList,    
49f0: 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 76 61     /* List of va
4a00: 6c 75 65 73 20 62 65 69 6e 67 20 65 78 74 72 61  lues being extra
4a10: 63 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 73 72  cted */.  int sr
4a20: 63 54 61 62 2c 20 20 20 20 20 20 20 20 20 20 20  cTab,           
4a30: 20 20 2f 2a 20 50 75 6c 6c 20 64 61 74 61 20 66    /* Pull data f
4a40: 72 6f 6d 20 74 68 69 73 20 74 61 62 6c 65 20 2a  rom this table *
4a50: 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e 2c  /.  int nColumn,
4a60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
4a70: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
4a80: 20 69 6e 20 74 68 65 20 73 6f 75 72 63 65 20 74   in the source t
4a90: 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69  able */.  ExprLi
4aa0: 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20  st *pOrderBy,   
4ab0: 20 20 2f 2a 20 49 66 20 6e 6f 74 20 4e 55 4c 4c    /* If not NULL
4ac0: 2c 20 73 6f 72 74 20 72 65 73 75 6c 74 73 20 75  , sort results u
4ad0: 73 69 6e 67 20 74 68 69 73 20 6b 65 79 20 2a 2f  sing this key */
4ae0: 0a 20 20 44 69 73 74 69 6e 63 74 43 74 78 20 2a  .  DistinctCtx *
4af0: 70 44 69 73 74 69 6e 63 74 2c 20 2f 2a 20 49 66  pDistinct, /* If
4b00: 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 6e 66 6f 20   not NULL, info 
4b10: 6f 6e 20 68 6f 77 20 74 6f 20 70 72 6f 63 65 73  on how to proces
4b20: 73 20 44 49 53 54 49 4e 43 54 20 2a 2f 0a 20 20  s DISTINCT */.  
4b30: 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73  SelectDest *pDes
4b40: 74 2c 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 74  t,      /* How t
4b50: 6f 20 64 69 73 70 6f 73 65 20 6f 66 20 74 68 65  o dispose of the
4b60: 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e   results */.  in
4b70: 74 20 69 43 6f 6e 74 69 6e 75 65 2c 20 20 20 20  t iContinue,    
4b80: 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
4b90: 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77  re to continue w
4ba0: 69 74 68 20 6e 65 78 74 20 72 6f 77 20 2a 2f 0a  ith next row */.
4bb0: 20 20 69 6e 74 20 69 42 72 65 61 6b 20 20 20 20    int iBreak    
4bc0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d            /* Jum
4bd0: 70 20 68 65 72 65 20 74 6f 20 62 72 65 61 6b 20  p here to break 
4be0: 6f 75 74 20 6f 66 20 74 68 65 20 69 6e 6e 65 72  out of the inner
4bf0: 20 6c 6f 6f 70 20 2a 2f 0a 29 7b 0a 20 20 56 64   loop */.){.  Vd
4c00: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
4c10: 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a  pVdbe;.  int i;.
4c20: 20 20 69 6e 74 20 68 61 73 44 69 73 74 69 6e 63    int hasDistinc
4c30: 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75  t;        /* Tru
4c40: 65 20 69 66 20 74 68 65 20 44 49 53 54 49 4e 43  e if the DISTINC
4c50: 54 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65  T keyword is pre
4c60: 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 72 65  sent */.  int re
4c70: 67 52 65 73 75 6c 74 3b 20 20 20 20 20 20 20 20  gResult;        
4c80: 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f        /* Start o
4c90: 66 20 6d 65 6d 6f 72 79 20 68 6f 6c 64 69 6e 67  f memory holding
4ca0: 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20   result set */. 
4cb0: 20 69 6e 74 20 65 44 65 73 74 20 3d 20 70 44 65   int eDest = pDe
4cc0: 73 74 2d 3e 65 44 65 73 74 3b 20 20 20 2f 2a 20  st->eDest;   /* 
4cd0: 48 6f 77 20 74 6f 20 64 69 73 70 6f 73 65 20 6f  How to dispose o
4ce0: 66 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69  f results */.  i
4cf0: 6e 74 20 69 50 61 72 6d 20 3d 20 70 44 65 73 74  nt iParm = pDest
4d00: 2d 3e 69 53 44 50 61 72 6d 3b 20 2f 2a 20 46 69  ->iSDParm; /* Fi
4d10: 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  rst argument to 
4d20: 64 69 73 70 6f 73 61 6c 20 6d 65 74 68 6f 64 20  disposal method 
4d30: 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 73 75 6c 74  */.  int nResult
4d40: 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Col;            
4d50: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65   /* Number of re
4d60: 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a  sult columns */.
4d70: 0a 20 20 61 73 73 65 72 74 28 20 76 20 29 3b 0a  .  assert( v );.
4d80: 20 20 69 66 28 20 4e 45 56 45 52 28 76 3d 3d 30    if( NEVER(v==0
4d90: 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73  ) ) return;.  as
4da0: 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20  sert( pEList!=0 
4db0: 29 3b 0a 20 20 68 61 73 44 69 73 74 69 6e 63 74  );.  hasDistinct
4dc0: 20 3d 20 70 44 69 73 74 69 6e 63 74 20 3f 20 70   = pDistinct ? p
4dd0: 44 69 73 74 69 6e 63 74 2d 3e 65 54 6e 63 74 54  Distinct->eTnctT
4de0: 79 70 65 20 3a 20 57 48 45 52 45 5f 44 49 53 54  ype : WHERE_DIST
4df0: 49 4e 43 54 5f 4e 4f 4f 50 3b 0a 20 20 69 66 28  INCT_NOOP;.  if(
4e00: 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 26 26 20   pOrderBy==0 && 
4e10: 21 68 61 73 44 69 73 74 69 6e 63 74 20 29 7b 0a  !hasDistinct ){.
4e20: 20 20 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76      codeOffset(v
4e30: 2c 20 70 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b  , p, iContinue);
4e40: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 75 6c 6c 20  .  }..  /* Pull 
4e50: 74 68 65 20 72 65 71 75 65 73 74 65 64 20 63 6f  the requested co
4e60: 6c 75 6d 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  lumns..  */.  if
4e70: 28 20 6e 43 6f 6c 75 6d 6e 3e 30 20 29 7b 0a 20  ( nColumn>0 ){. 
4e80: 20 20 20 6e 52 65 73 75 6c 74 43 6f 6c 20 3d 20     nResultCol = 
4e90: 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 7d 65 6c 73 65  nColumn;.  }else
4ea0: 7b 0a 20 20 20 20 6e 52 65 73 75 6c 74 43 6f 6c  {.    nResultCol
4eb0: 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   = pEList->nExpr
4ec0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 65 73  ;.  }.  if( pDes
4ed0: 74 2d 3e 69 53 64 73 74 3d 3d 30 20 29 7b 0a 20  t->iSdst==0 ){. 
4ee0: 20 20 20 70 44 65 73 74 2d 3e 69 53 64 73 74 20     pDest->iSdst 
4ef0: 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31  = pParse->nMem+1
4f00: 3b 0a 20 20 20 20 70 44 65 73 74 2d 3e 6e 53 64  ;.    pDest->nSd
4f10: 73 74 20 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b  st = nResultCol;
4f20: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65  .    pParse->nMe
4f30: 6d 20 2b 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b  m += nResultCol;
4f40: 0a 20 20 7d 65 6c 73 65 7b 20 0a 20 20 20 20 61  .  }else{ .    a
4f50: 73 73 65 72 74 28 20 70 44 65 73 74 2d 3e 6e 53  ssert( pDest->nS
4f60: 64 73 74 3d 3d 6e 52 65 73 75 6c 74 43 6f 6c 20  dst==nResultCol 
4f70: 29 3b 0a 20 20 7d 0a 20 20 72 65 67 52 65 73 75  );.  }.  regResu
4f80: 6c 74 20 3d 20 70 44 65 73 74 2d 3e 69 53 64 73  lt = pDest->iSds
4f90: 74 3b 0a 20 20 69 66 28 20 6e 43 6f 6c 75 6d 6e  t;.  if( nColumn
4fa0: 3e 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  >0 ){.    for(i=
4fb0: 30 3b 20 69 3c 6e 43 6f 6c 75 6d 6e 3b 20 69 2b  0; i<nColumn; i+
4fc0: 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
4fd0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
4fe0: 50 5f 43 6f 6c 75 6d 6e 2c 20 73 72 63 54 61 62  P_Column, srcTab
4ff0: 2c 20 69 2c 20 72 65 67 52 65 73 75 6c 74 2b 69  , i, regResult+i
5000: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
5010: 20 69 66 28 20 65 44 65 73 74 21 3d 53 52 54 5f   if( eDest!=SRT_
5020: 45 78 69 73 74 73 20 29 7b 0a 20 20 20 20 2f 2a  Exists ){.    /*
5030: 20 49 66 20 74 68 65 20 64 65 73 74 69 6e 61 74   If the destinat
5040: 69 6f 6e 20 69 73 20 61 6e 20 45 58 49 53 54 53  ion is an EXISTS
5050: 28 2e 2e 2e 29 20 65 78 70 72 65 73 73 69 6f 6e  (...) expression
5060: 2c 20 74 68 65 20 61 63 74 75 61 6c 0a 20 20 20  , the actual.   
5070: 20 2a 2a 20 76 61 6c 75 65 73 20 72 65 74 75 72   ** values retur
5080: 6e 65 64 20 62 79 20 74 68 65 20 53 45 4c 45 43  ned by the SELEC
5090: 54 20 61 72 65 20 6e 6f 74 20 72 65 71 75 69 72  T are not requir
50a0: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  ed..    */.    s
50b0: 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43  qlite3ExprCacheC
50c0: 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20  lear(pParse);.  
50d0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
50e0: 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  eExprList(pParse
50f0: 2c 20 70 45 4c 69 73 74 2c 20 72 65 67 52 65 73  , pEList, regRes
5100: 75 6c 74 2c 20 65 44 65 73 74 3d 3d 53 52 54 5f  ult, eDest==SRT_
5110: 4f 75 74 70 75 74 29 3b 0a 20 20 7d 0a 20 20 6e  Output);.  }.  n
5120: 43 6f 6c 75 6d 6e 20 3d 20 6e 52 65 73 75 6c 74  Column = nResult
5130: 43 6f 6c 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  Col;..  /* If th
5140: 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f  e DISTINCT keywo
5150: 72 64 20 77 61 73 20 70 72 65 73 65 6e 74 20 6f  rd was present o
5160: 6e 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  n the SELECT sta
5170: 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 61 6e 64 20  tement.  ** and 
5180: 74 68 69 73 20 72 6f 77 20 68 61 73 20 62 65 65  this row has bee
5190: 6e 20 73 65 65 6e 20 62 65 66 6f 72 65 2c 20 74  n seen before, t
51a0: 68 65 6e 20 64 6f 20 6e 6f 74 20 6d 61 6b 65 20  hen do not make 
51b0: 74 68 69 73 20 72 6f 77 0a 20 20 2a 2a 20 70 61  this row.  ** pa
51c0: 72 74 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74  rt of the result
51d0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 68 61 73  ..  */.  if( has
51e0: 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20  Distinct ){.    
51f0: 61 73 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d  assert( pEList!=
5200: 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
5210: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d   pEList->nExpr==
5220: 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 20 20 73  nColumn );.    s
5230: 77 69 74 63 68 28 20 70 44 69 73 74 69 6e 63 74  witch( pDistinct
5240: 2d 3e 65 54 6e 63 74 54 79 70 65 20 29 7b 0a 20  ->eTnctType ){. 
5250: 20 20 20 20 20 63 61 73 65 20 57 48 45 52 45 5f       case WHERE_
5260: 44 49 53 54 49 4e 43 54 5f 4f 52 44 45 52 45 44  DISTINCT_ORDERED
5270: 3a 20 7b 0a 20 20 20 20 20 20 20 20 56 64 62 65  : {.        Vdbe
5280: 4f 70 20 2a 70 4f 70 3b 20 20 20 20 20 20 20 20  Op *pOp;        
5290: 20 20 20 20 2f 2a 20 4e 6f 20 6c 6f 6e 67 65 72      /* No longer
52a0: 20 72 65 71 75 69 72 65 64 20 4f 70 65 6e 45 70   required OpenEp
52b0: 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 2e 20 2a  hemeral instr. *
52c0: 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4a  /.        int iJ
52d0: 75 6d 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  ump;            
52e0: 20 20 2f 2a 20 4a 75 6d 70 20 64 65 73 74 69 6e    /* Jump destin
52f0: 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20  ation */.       
5300: 20 69 6e 74 20 72 65 67 50 72 65 76 3b 20 20 20   int regPrev;   
5310: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 76           /* Prev
5320: 69 6f 75 73 20 72 6f 77 20 63 6f 6e 74 65 6e 74  ious row content
5330: 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20   */..        /* 
5340: 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  Allocate space f
5350: 6f 72 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  or the previous 
5360: 72 6f 77 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  row */.        r
5370: 65 67 50 72 65 76 20 3d 20 70 50 61 72 73 65 2d  egPrev = pParse-
5380: 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 20 20 20  >nMem+1;.       
5390: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
53a0: 20 6e 43 6f 6c 75 6d 6e 3b 0a 0a 20 20 20 20 20   nColumn;..     
53b0: 20 20 20 2f 2a 20 43 68 61 6e 67 65 20 74 68 65     /* Change the
53c0: 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
53d0: 6c 20 63 6f 64 65 64 20 65 61 72 6c 69 65 72 20  l coded earlier 
53e0: 74 6f 20 61 6e 20 4f 50 5f 4e 75 6c 6c 0a 20 20  to an OP_Null.  
53f0: 20 20 20 20 20 20 2a 2a 20 73 65 74 73 20 74 68        ** sets th
5400: 65 20 4d 45 4d 5f 43 6c 65 61 72 65 64 20 62 69  e MEM_Cleared bi
5410: 74 20 6f 6e 20 74 68 65 20 66 69 72 73 74 20 72  t on the first r
5420: 65 67 69 73 74 65 72 20 6f 66 20 74 68 65 0a 20  egister of the. 
5430: 20 20 20 20 20 20 20 2a 2a 20 70 72 65 76 69 6f         ** previo
5440: 75 73 20 76 61 6c 75 65 2e 20 20 54 68 69 73 20  us value.  This 
5450: 77 69 6c 6c 20 63 61 75 73 65 20 74 68 65 20 4f  will cause the O
5460: 50 5f 4e 65 20 62 65 6c 6f 77 20 74 6f 20 61 6c  P_Ne below to al
5470: 77 61 79 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  ways.        ** 
5480: 66 61 69 6c 20 6f 6e 20 74 68 65 20 66 69 72 73  fail on the firs
5490: 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74  t iteration of t
54a0: 68 65 20 6c 6f 6f 70 20 65 76 65 6e 20 69 66 20  he loop even if 
54b0: 74 68 65 20 66 69 72 73 74 0a 20 20 20 20 20 20  the first.      
54c0: 20 20 2a 2a 20 72 6f 77 20 69 73 20 61 6c 6c 20    ** row is all 
54d0: 4e 55 4c 4c 73 2e 0a 20 20 20 20 20 20 20 20 2a  NULLs..        *
54e0: 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  /.        sqlite
54f0: 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f  3VdbeChangeToNoo
5500: 70 28 76 2c 20 70 44 69 73 74 69 6e 63 74 2d 3e  p(v, pDistinct->
5510: 61 64 64 72 54 6e 63 74 29 3b 0a 20 20 20 20 20  addrTnct);.     
5520: 20 20 20 70 4f 70 20 3d 20 73 71 6c 69 74 65 33     pOp = sqlite3
5530: 56 64 62 65 47 65 74 4f 70 28 76 2c 20 70 44 69  VdbeGetOp(v, pDi
5540: 73 74 69 6e 63 74 2d 3e 61 64 64 72 54 6e 63 74  stinct->addrTnct
5550: 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e  );.        pOp->
5560: 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 4e 75 6c 6c  opcode = OP_Null
5570: 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70  ;.        pOp->p
5580: 31 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70  1 = 1;.        p
5590: 4f 70 2d 3e 70 32 20 3d 20 72 65 67 50 72 65 76  Op->p2 = regPrev
55a0: 3b 0a 0a 20 20 20 20 20 20 20 20 69 4a 75 6d 70  ;..        iJump
55b0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
55c0: 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20 6e  rrentAddr(v) + n
55d0: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20  Column;.        
55e0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 75  for(i=0; i<nColu
55f0: 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  mn; i++){.      
5600: 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
5610: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
5620: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
5630: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  pEList->a[i].pEx
5640: 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  pr);.          i
5650: 66 28 20 69 3c 6e 43 6f 6c 75 6d 6e 2d 31 20 29  f( i<nColumn-1 )
5660: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
5670: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
5680: 76 2c 20 4f 50 5f 4e 65 2c 20 72 65 67 52 65 73  v, OP_Ne, regRes
5690: 75 6c 74 2b 69 2c 20 69 4a 75 6d 70 2c 20 72 65  ult+i, iJump, re
56a0: 67 50 72 65 76 2b 69 29 3b 0a 20 20 20 20 20 20  gPrev+i);.      
56b0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
56c0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
56d0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 45  beAddOp3(v, OP_E
56e0: 71 2c 20 72 65 67 52 65 73 75 6c 74 2b 69 2c 20  q, regResult+i, 
56f0: 69 43 6f 6e 74 69 6e 75 65 2c 20 72 65 67 50 72  iContinue, regPr
5700: 65 76 2b 69 29 3b 0a 20 20 20 20 20 20 20 20 20  ev+i);.         
5710: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c   }.          sql
5720: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
5730: 28 76 2c 20 2d 31 2c 20 28 63 6f 6e 73 74 20 63  (v, -1, (const c
5740: 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f  har *)pColl, P4_
5750: 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20 20  COLLSEQ);.      
5760: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
5770: 68 61 6e 67 65 50 35 28 76 2c 20 53 51 4c 49 54  hangeP5(v, SQLIT
5780: 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20  E_NULLEQ);.     
5790: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73     }.        ass
57a0: 65 72 74 28 20 73 71 6c 69 74 65 33 56 64 62 65  ert( sqlite3Vdbe
57b0: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3d 3d  CurrentAddr(v)==
57c0: 69 4a 75 6d 70 20 29 3b 0a 20 20 20 20 20 20 20  iJump );.       
57d0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
57e0: 70 33 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72  p3(v, OP_Copy, r
57f0: 65 67 52 65 73 75 6c 74 2c 20 72 65 67 50 72 65  egResult, regPre
5800: 76 2c 20 6e 43 6f 6c 75 6d 6e 2d 31 29 3b 0a 20  v, nColumn-1);. 
5810: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
5820: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 63 61 73      }..      cas
5830: 65 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  e WHERE_DISTINCT
5840: 5f 55 4e 49 51 55 45 3a 20 7b 0a 20 20 20 20 20  _UNIQUE: {.     
5850: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
5860: 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 70 44  angeToNoop(v, pD
5870: 69 73 74 69 6e 63 74 2d 3e 61 64 64 72 54 6e 63  istinct->addrTnc
5880: 74 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  t);.        brea
5890: 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  k;.      }..    
58a0: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
58b0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 44 69       assert( pDi
58c0: 73 74 69 6e 63 74 2d 3e 65 54 6e 63 74 54 79 70  stinct->eTnctTyp
58d0: 65 3d 3d 57 48 45 52 45 5f 44 49 53 54 49 4e 43  e==WHERE_DISTINC
58e0: 54 5f 55 4e 4f 52 44 45 52 45 44 20 29 3b 0a 20  T_UNORDERED );. 
58f0: 20 20 20 20 20 20 20 63 6f 64 65 44 69 73 74 69         codeDisti
5900: 6e 63 74 28 70 50 61 72 73 65 2c 20 70 44 69 73  nct(pParse, pDis
5910: 74 69 6e 63 74 2d 3e 74 61 62 54 6e 63 74 2c 20  tinct->tabTnct, 
5920: 69 43 6f 6e 74 69 6e 75 65 2c 20 6e 43 6f 6c 75  iContinue, nColu
5930: 6d 6e 2c 20 72 65 67 52 65 73 75 6c 74 29 3b 0a  mn, regResult);.
5940: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
5950: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
5960: 20 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d 30   if( pOrderBy==0
5970: 20 29 7b 0a 20 20 20 20 20 20 63 6f 64 65 4f 66   ){.      codeOf
5980: 66 73 65 74 28 76 2c 20 70 2c 20 69 43 6f 6e 74  fset(v, p, iCont
5990: 69 6e 75 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  inue);.    }.  }
59a0: 0a 0a 20 20 73 77 69 74 63 68 28 20 65 44 65 73  ..  switch( eDes
59b0: 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74  t ){.    /* In t
59c0: 68 69 73 20 6d 6f 64 65 2c 20 77 72 69 74 65 20  his mode, write 
59d0: 65 61 63 68 20 71 75 65 72 79 20 72 65 73 75 6c  each query resul
59e0: 74 20 74 6f 20 74 68 65 20 6b 65 79 20 6f 66 20  t to the key of 
59f0: 74 68 65 20 74 65 6d 70 6f 72 61 72 79 0a 20 20  the temporary.  
5a00: 20 20 2a 2a 20 74 61 62 6c 65 20 69 50 61 72 6d    ** table iParm
5a10: 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66  ..    */.#ifndef
5a20: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d   SQLITE_OMIT_COM
5a30: 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 20 20 20  POUND_SELECT.   
5a40: 20 63 61 73 65 20 53 52 54 5f 55 6e 69 6f 6e 3a   case SRT_Union:
5a50: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31 3b   {.      int r1;
5a60: 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
5a70: 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
5a80: 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  arse);.      sql
5a90: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
5aa0: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
5ab0: 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 43 6f 6c   regResult, nCol
5ac0: 75 6d 6e 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  umn, r1);.      
5ad0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5ae0: 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72  2(v, OP_IdxInser
5af0: 74 2c 20 69 50 61 72 6d 2c 20 72 31 29 3b 0a 20  t, iParm, r1);. 
5b00: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
5b10: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
5b20: 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72  e, r1);.      br
5b30: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
5b40: 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20 72  /* Construct a r
5b50: 65 63 6f 72 64 20 66 72 6f 6d 20 74 68 65 20 71  ecord from the q
5b60: 75 65 72 79 20 72 65 73 75 6c 74 2c 20 62 75 74  uery result, but
5b70: 20 69 6e 73 74 65 61 64 20 6f 66 0a 20 20 20 20   instead of.    
5b80: 2a 2a 20 73 61 76 69 6e 67 20 74 68 61 74 20 72  ** saving that r
5b90: 65 63 6f 72 64 2c 20 75 73 65 20 69 74 20 61 73  ecord, use it as
5ba0: 20 61 20 6b 65 79 20 74 6f 20 64 65 6c 65 74 65   a key to delete
5bb0: 20 65 6c 65 6d 65 6e 74 73 20 66 72 6f 6d 0a 20   elements from. 
5bc0: 20 20 20 2a 2a 20 74 68 65 20 74 65 6d 70 6f 72     ** the tempor
5bd0: 61 72 79 20 74 61 62 6c 65 20 69 50 61 72 6d 2e  ary table iParm.
5be0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
5bf0: 20 53 52 54 5f 45 78 63 65 70 74 3a 20 7b 0a 20   SRT_Except: {. 
5c00: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
5c10: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 64 78  AddOp3(v, OP_Idx
5c20: 44 65 6c 65 74 65 2c 20 69 50 61 72 6d 2c 20 72  Delete, iParm, r
5c30: 65 67 52 65 73 75 6c 74 2c 20 6e 43 6f 6c 75 6d  egResult, nColum
5c40: 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  n);.      break;
5c50: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
5c60: 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20     /* Store the 
5c70: 72 65 73 75 6c 74 20 61 73 20 64 61 74 61 20 75  result as data u
5c80: 73 69 6e 67 20 61 20 75 6e 69 71 75 65 20 6b 65  sing a unique ke
5c90: 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  y..    */.    ca
5ca0: 73 65 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20  se SRT_Table:.  
5cb0: 20 20 63 61 73 65 20 53 52 54 5f 45 70 68 65 6d    case SRT_Ephem
5cc0: 54 61 62 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  Tab: {.      int
5cd0: 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
5ce0: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
5cf0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
5d00: 20 65 44 65 73 74 3d 3d 53 52 54 5f 54 61 62 6c   eDest==SRT_Tabl
5d10: 65 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  e );.      testc
5d20: 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f  ase( eDest==SRT_
5d30: 45 70 68 65 6d 54 61 62 20 29 3b 0a 20 20 20 20  EphemTab );.    
5d40: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
5d50: 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op3(v, OP_MakeRe
5d60: 63 6f 72 64 2c 20 72 65 67 52 65 73 75 6c 74 2c  cord, regResult,
5d70: 20 6e 43 6f 6c 75 6d 6e 2c 20 72 31 29 3b 0a 20   nColumn, r1);. 
5d80: 20 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42       if( pOrderB
5d90: 79 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75 73  y ){.        pus
5da0: 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72  hOntoSorter(pPar
5db0: 73 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 2c  se, pOrderBy, p,
5dc0: 20 72 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73   r1);.      }els
5dd0: 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  e{.        int r
5de0: 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  2 = sqlite3GetTe
5df0: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
5e00: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
5e10: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
5e20: 65 77 52 6f 77 69 64 2c 20 69 50 61 72 6d 2c 20  ewRowid, iParm, 
5e30: 72 32 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  r2);.        sql
5e40: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
5e50: 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 69 50 61  , OP_Insert, iPa
5e60: 72 6d 2c 20 72 31 2c 20 72 32 29 3b 0a 20 20 20  rm, r1, r2);.   
5e70: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
5e80: 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
5e90: 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20  AG_APPEND);.    
5ea0: 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
5eb0: 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
5ec0: 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20  , r2);.      }. 
5ed0: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
5ee0: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
5ef0: 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72  e, r1);.      br
5f00: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e  eak;.    }..#ifn
5f10: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
5f20: 53 55 42 51 55 45 52 59 0a 20 20 20 20 2f 2a 20  SUBQUERY.    /* 
5f30: 49 66 20 77 65 20 61 72 65 20 63 72 65 61 74 69  If we are creati
5f40: 6e 67 20 61 20 73 65 74 20 66 6f 72 20 61 6e 20  ng a set for an 
5f50: 22 65 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54  "expr IN (SELECT
5f60: 20 2e 2e 2e 29 22 20 63 6f 6e 73 74 72 75 63 74   ...)" construct
5f70: 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68  ,.    ** then th
5f80: 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20 61 20  ere should be a 
5f90: 73 69 6e 67 6c 65 20 69 74 65 6d 20 6f 6e 20 74  single item on t
5fa0: 68 65 20 73 74 61 63 6b 2e 20 20 57 72 69 74 65  he stack.  Write
5fb0: 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 74 65   this.    ** ite
5fc0: 6d 20 69 6e 74 6f 20 74 68 65 20 73 65 74 20 74  m into the set t
5fd0: 61 62 6c 65 20 77 69 74 68 20 62 6f 67 75 73 20  able with bogus 
5fe0: 64 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  data..    */.   
5ff0: 20 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b   case SRT_Set: {
6000: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
6010: 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20  Column==1 );.   
6020: 20 20 20 70 44 65 73 74 2d 3e 61 66 66 53 64 73     pDest->affSds
6030: 74 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20  t =.            
6040: 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6d        sqlite3Com
6050: 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 45 4c  pareAffinity(pEL
6060: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c  ist->a[0].pExpr,
6070: 20 70 44 65 73 74 2d 3e 61 66 66 53 64 73 74 29   pDest->affSdst)
6080: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 64  ;.      if( pOrd
6090: 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20  erBy ){.        
60a0: 2f 2a 20 41 74 20 66 69 72 73 74 20 67 6c 61 6e  /* At first glan
60b0: 63 65 20 79 6f 75 20 77 6f 75 6c 64 20 74 68 69  ce you would thi
60c0: 6e 6b 20 77 65 20 63 6f 75 6c 64 20 6f 70 74 69  nk we could opti
60d0: 6d 69 7a 65 20 6f 75 74 20 74 68 65 0a 20 20 20  mize out the.   
60e0: 20 20 20 20 20 2a 2a 20 4f 52 44 45 52 20 42 59       ** ORDER BY
60f0: 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 73 69   in this case si
6100: 6e 63 65 20 74 68 65 20 6f 72 64 65 72 20 6f 66  nce the order of
6110: 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
6120: 73 65 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 64  set.        ** d
6130: 6f 65 73 20 6e 6f 74 20 6d 61 74 74 65 72 2e 20  oes not matter. 
6140: 20 42 75 74 20 74 68 65 72 65 20 6d 69 67 68 74   But there might
6150: 20 62 65 20 61 20 4c 49 4d 49 54 20 63 6c 61 75   be a LIMIT clau
6160: 73 65 2c 20 69 6e 20 77 68 69 63 68 0a 20 20 20  se, in which.   
6170: 20 20 20 20 20 2a 2a 20 63 61 73 65 20 74 68 65       ** case the
6180: 20 6f 72 64 65 72 20 64 6f 65 73 20 6d 61 74 74   order does matt
6190: 65 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 75  er */.        pu
61a0: 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61  shOntoSorter(pPa
61b0: 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 70  rse, pOrderBy, p
61c0: 2c 20 72 65 67 52 65 73 75 6c 74 29 3b 0a 20 20  , regResult);.  
61d0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
61e0: 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69     int r1 = sqli
61f0: 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
6200: 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73  arse);.        s
6210: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
6220: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
6230: 64 2c 20 72 65 67 52 65 73 75 6c 74 2c 31 2c 72  d, regResult,1,r
6240: 31 2c 20 26 70 44 65 73 74 2d 3e 61 66 66 53 64  1, &pDest->affSd
6250: 73 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  st, 1);.        
6260: 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
6270: 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70  AffinityChange(p
6280: 50 61 72 73 65 2c 20 72 65 67 52 65 73 75 6c 74  Parse, regResult
6290: 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 1);.        sq
62a0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
62b0: 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c  v, OP_IdxInsert,
62c0: 20 69 50 61 72 6d 2c 20 72 31 29 3b 0a 20 20 20   iParm, r1);.   
62d0: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
62e0: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
62f0: 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 7d 0a  e, r1);.      }.
6300: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
6310: 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 6e   }..    /* If an
6320: 79 20 72 6f 77 20 65 78 69 73 74 20 69 6e 20 74  y row exist in t
6330: 68 65 20 72 65 73 75 6c 74 20 73 65 74 2c 20 72  he result set, r
6340: 65 63 6f 72 64 20 74 68 61 74 20 66 61 63 74 20  ecord that fact 
6350: 61 6e 64 20 61 62 6f 72 74 2e 0a 20 20 20 20 2a  and abort..    *
6360: 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 45  /.    case SRT_E
6370: 78 69 73 74 73 3a 20 7b 0a 20 20 20 20 20 20 73  xists: {.      s
6380: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
6390: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
63a0: 31 2c 20 69 50 61 72 6d 29 3b 0a 20 20 20 20 20  1, iParm);.     
63b0: 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c   /* The LIMIT cl
63c0: 61 75 73 65 20 77 69 6c 6c 20 74 65 72 6d 69 6e  ause will termin
63d0: 61 74 65 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72  ate the loop for
63e0: 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 62 72 65   us */.      bre
63f0: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
6400: 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20 73  * If this is a s
6410: 63 61 6c 61 72 20 73 65 6c 65 63 74 20 74 68 61  calar select tha
6420: 74 20 69 73 20 70 61 72 74 20 6f 66 20 61 6e 20  t is part of an 
6430: 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e  expression, then
6440: 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65 20 74 68  .    ** store th
6450: 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74 68 65  e results in the
6460: 20 61 70 70 72 6f 70 72 69 61 74 65 20 6d 65 6d   appropriate mem
6470: 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20 62 72 65  ory cell and bre
6480: 61 6b 20 6f 75 74 0a 20 20 20 20 2a 2a 20 6f 66  ak out.    ** of
6490: 20 74 68 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a   the scan loop..
64a0: 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
64b0: 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20  SRT_Mem: {.     
64c0: 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e   assert( nColumn
64d0: 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ==1 );.      if(
64e0: 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20   pOrderBy ){.   
64f0: 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72       pushOntoSor
6500: 74 65 72 28 70 50 61 72 73 65 2c 20 70 4f 72 64  ter(pParse, pOrd
6510: 65 72 42 79 2c 20 70 2c 20 72 65 67 52 65 73 75  erBy, p, regResu
6520: 6c 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  lt);.      }else
6530: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
6540: 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50  3ExprCodeMove(pP
6550: 61 72 73 65 2c 20 72 65 67 52 65 73 75 6c 74 2c  arse, regResult,
6560: 20 69 50 61 72 6d 2c 20 31 29 3b 0a 20 20 20 20   iParm, 1);.    
6570: 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54      /* The LIMIT
6580: 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 6a 75 6d   clause will jum
6590: 70 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f  p out of the loo
65a0: 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20  p for us */.    
65b0: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
65c0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  .    }.#endif /*
65d0: 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f   #ifndef SQLITE_
65e0: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f  OMIT_SUBQUERY */
65f0: 0a 0a 20 20 20 20 2f 2a 20 53 65 6e 64 20 74 68  ..    /* Send th
6600: 65 20 64 61 74 61 20 74 6f 20 74 68 65 20 63 61  e data to the ca
6610: 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20  llback function 
6620: 6f 72 20 74 6f 20 61 20 73 75 62 72 6f 75 74 69  or to a subrouti
6630: 6e 65 2e 20 20 49 6e 20 74 68 65 0a 20 20 20 20  ne.  In the.    
6640: 2a 2a 20 63 61 73 65 20 6f 66 20 61 20 73 75 62  ** case of a sub
6650: 72 6f 75 74 69 6e 65 2c 20 74 68 65 20 73 75 62  routine, the sub
6660: 72 6f 75 74 69 6e 65 20 69 74 73 65 6c 66 20 69  routine itself i
6670: 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
6680: 72 0a 20 20 20 20 2a 2a 20 70 6f 70 70 69 6e 67  r.    ** popping
6690: 20 74 68 65 20 64 61 74 61 20 66 72 6f 6d 20 74   the data from t
66a0: 68 65 20 73 74 61 63 6b 2e 0a 20 20 20 20 2a 2f  he stack..    */
66b0: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 43 6f  .    case SRT_Co
66c0: 72 6f 75 74 69 6e 65 3a 0a 20 20 20 20 63 61 73  routine:.    cas
66d0: 65 20 53 52 54 5f 4f 75 74 70 75 74 3a 20 7b 0a  e SRT_Output: {.
66e0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
66f0: 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75  eDest==SRT_Corou
6700: 74 69 6e 65 20 29 3b 0a 20 20 20 20 20 20 74 65  tine );.      te
6710: 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53  stcase( eDest==S
6720: 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20 20 20  RT_Output );.   
6730: 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20     if( pOrderBy 
6740: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  ){.        int r
6750: 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
6760: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
6770: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
6780: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d  beAddOp3(v, OP_M
6790: 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52 65  akeRecord, regRe
67a0: 73 75 6c 74 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 72  sult, nColumn, r
67b0: 31 29 3b 0a 20 20 20 20 20 20 20 20 70 75 73 68  1);.        push
67c0: 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73  OntoSorter(pPars
67d0: 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 2c 20  e, pOrderBy, p, 
67e0: 72 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  r1);.        sql
67f0: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
6800: 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a  eg(pParse, r1);.
6810: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
6820: 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75  eDest==SRT_Corou
6830: 74 69 6e 65 20 29 7b 0a 20 20 20 20 20 20 20 20  tine ){.        
6840: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6850: 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 70  1(v, OP_Yield, p
6860: 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 29 3b 0a  Dest->iSDParm);.
6870: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
6880: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
6890: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73  AddOp2(v, OP_Res
68a0: 75 6c 74 52 6f 77 2c 20 72 65 67 52 65 73 75 6c  ultRow, regResul
68b0: 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20  t, nColumn);.   
68c0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
68d0: 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61  CacheAffinityCha
68e0: 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 52  nge(pParse, regR
68f0: 65 73 75 6c 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b  esult, nColumn);
6900: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
6910: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66  reak;.    }..#if
6920: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
6930: 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 29 0a 20  _OMIT_TRIGGER). 
6940: 20 20 20 2f 2a 20 44 69 73 63 61 72 64 20 74 68     /* Discard th
6950: 65 20 72 65 73 75 6c 74 73 2e 20 20 54 68 69 73  e results.  This
6960: 20 69 73 20 75 73 65 64 20 66 6f 72 20 53 45 4c   is used for SEL
6970: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 69  ECT statements i
6980: 6e 73 69 64 65 0a 20 20 20 20 2a 2a 20 74 68 65  nside.    ** the
6990: 20 62 6f 64 79 20 6f 66 20 61 20 54 52 49 47 47   body of a TRIGG
69a0: 45 52 2e 20 20 54 68 65 20 70 75 72 70 6f 73 65  ER.  The purpose
69b0: 20 6f 66 20 73 75 63 68 20 73 65 6c 65 63 74 73   of such selects
69c0: 20 69 73 20 74 6f 20 63 61 6c 6c 0a 20 20 20 20   is to call.    
69d0: 2a 2a 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20  ** user-defined 
69e0: 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 68  functions that h
69f0: 61 76 65 20 73 69 64 65 20 65 66 66 65 63 74 73  ave side effects
6a00: 2e 20 20 57 65 20 64 6f 20 6e 6f 74 20 63 61 72  .  We do not car
6a10: 65 0a 20 20 20 20 2a 2a 20 61 62 6f 75 74 20 74  e.    ** about t
6a20: 68 65 20 61 63 74 75 61 6c 20 72 65 73 75 6c 74  he actual result
6a30: 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2e  s of the select.
6a40: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 65 66 61  .    */.    defa
6a50: 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  ult: {.      ass
6a60: 65 72 74 28 20 65 44 65 73 74 3d 3d 53 52 54 5f  ert( eDest==SRT_
6a70: 44 69 73 63 61 72 64 20 29 3b 0a 20 20 20 20 20  Discard );.     
6a80: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
6a90: 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a  ndif.  }..  /* J
6aa0: 75 6d 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  ump to the end o
6ab0: 66 20 74 68 65 20 6c 6f 6f 70 20 69 66 20 74 68  f the loop if th
6ac0: 65 20 4c 49 4d 49 54 20 69 73 20 72 65 61 63 68  e LIMIT is reach
6ad0: 65 64 2e 20 20 45 78 63 65 70 74 2c 20 69 66 0a  ed.  Except, if.
6ae0: 20 20 2a 2a 20 74 68 65 72 65 20 69 73 20 61 20    ** there is a 
6af0: 73 6f 72 74 65 72 2c 20 69 6e 20 77 68 69 63 68  sorter, in which
6b00: 20 63 61 73 65 20 74 68 65 20 73 6f 72 74 65 72   case the sorter
6b10: 20 68 61 73 20 61 6c 72 65 61 64 79 20 6c 69 6d   has already lim
6b20: 69 74 65 64 0a 20 20 2a 2a 20 74 68 65 20 6f 75  ited.  ** the ou
6b30: 74 70 75 74 20 66 6f 72 20 75 73 2e 0a 20 20 2a  tput for us..  *
6b40: 2f 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79  /.  if( pOrderBy
6b50: 3d 3d 30 20 26 26 20 70 2d 3e 69 4c 69 6d 69 74  ==0 && p->iLimit
6b60: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
6b70: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
6b80: 49 66 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69  IfZero, p->iLimi
6b90: 74 2c 20 69 42 72 65 61 6b 2c 20 2d 31 29 3b 0a  t, iBreak, -1);.
6ba0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c    }.}../*.** All
6bb0: 6f 63 61 74 65 20 61 20 4b 65 79 49 6e 66 6f 20  ocate a KeyInfo 
6bc0: 6f 62 6a 65 63 74 20 73 75 66 66 69 63 69 65 6e  object sufficien
6bd0: 74 20 66 6f 72 20 61 6e 20 69 6e 64 65 78 20 6f  t for an index o
6be0: 66 20 4e 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 20  f N key columns 
6bf0: 61 6e 64 0a 2a 2a 20 58 20 65 78 74 72 61 20 63  and.** X extra c
6c00: 6f 6c 75 6d 6e 73 2e 0a 2a 2f 0a 4b 65 79 49 6e  olumns..*/.KeyIn
6c10: 66 6f 20 2a 73 71 6c 69 74 65 33 4b 65 79 49 6e  fo *sqlite3KeyIn
6c20: 66 6f 41 6c 6c 6f 63 28 73 71 6c 69 74 65 33 20  foAlloc(sqlite3 
6c30: 2a 64 62 2c 20 69 6e 74 20 4e 2c 20 69 6e 74 20  *db, int N, int 
6c40: 58 29 7b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70  X){.  KeyInfo *p
6c50: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
6c60: 6f 63 5a 65 72 6f 28 30 2c 20 0a 20 20 20 20 20  ocZero(0, .     
6c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69                si
6c80: 7a 65 6f 66 28 4b 65 79 49 6e 66 6f 29 20 2b 20  zeof(KeyInfo) + 
6c90: 28 4e 2b 58 29 2a 28 73 69 7a 65 6f 66 28 43 6f  (N+X)*(sizeof(Co
6ca0: 6c 6c 53 65 71 2a 29 2b 31 29 29 3b 0a 20 20 69  llSeq*)+1));.  i
6cb0: 66 28 20 70 20 29 7b 0a 20 20 20 20 70 2d 3e 61  f( p ){.    p->a
6cc0: 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38 2a  SortOrder = (u8*
6cd0: 29 26 70 2d 3e 61 43 6f 6c 6c 5b 4e 2b 58 5d 3b  )&p->aColl[N+X];
6ce0: 0a 20 20 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d  .    p->nField =
6cf0: 20 28 75 31 36 29 4e 3b 0a 20 20 20 20 70 2d 3e   (u16)N;.    p->
6d00: 6e 58 46 69 65 6c 64 20 3d 20 28 75 31 36 29 58  nXField = (u16)X
6d10: 3b 0a 20 20 20 20 70 2d 3e 65 6e 63 20 3d 20 45  ;.    p->enc = E
6d20: 4e 43 28 64 62 29 3b 0a 20 20 20 20 70 2d 3e 64  NC(db);.    p->d
6d30: 62 20 3d 20 64 62 3b 0a 20 20 20 20 70 2d 3e 6e  b = db;.    p->n
6d40: 52 65 66 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  Ref = 1;.  }else
6d50: 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63  {.    db->malloc
6d60: 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 7d 0a  Failed = 1;.  }.
6d70: 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
6d80: 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20  *.** Deallocate 
6d90: 61 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74  a KeyInfo object
6da0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
6db0: 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 4b 65 79  KeyInfoUnref(Key
6dc0: 49 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 66 28 20  Info *p){.  if( 
6dd0: 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  p ){.    assert(
6de0: 20 70 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20   p->nRef>0 );.  
6df0: 20 20 70 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20    p->nRef--;.   
6e00: 20 69 66 28 20 70 2d 3e 6e 52 65 66 3d 3d 30 20   if( p->nRef==0 
6e10: 29 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28  ) sqlite3DbFree(
6e20: 30 2c 20 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  0, p);.  }.}../*
6e30: 0a 2a 2a 20 4d 61 6b 65 20 61 20 6e 65 77 20 70  .** Make a new p
6e40: 6f 69 6e 74 65 72 20 74 6f 20 61 20 4b 65 79 49  ointer to a KeyI
6e50: 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a 2f 0a 4b 65  nfo object.*/.Ke
6e60: 79 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33 4b 65  yInfo *sqlite3Ke
6e70: 79 49 6e 66 6f 52 65 66 28 4b 65 79 49 6e 66 6f  yInfoRef(KeyInfo
6e80: 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 29 7b   *p){.  if( p ){
6e90: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
6ea0: 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20 20 70 2d  nRef>0 );.    p-
6eb0: 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 72  >nRef++;.  }.  r
6ec0: 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 23 69 66 64  eturn p;.}..#ifd
6ed0: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
6ee0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
6ef0: 45 20 69 66 20 61 20 4b 65 79 49 6e 66 6f 20 6f  E if a KeyInfo o
6f00: 62 6a 65 63 74 20 63 61 6e 20 62 65 20 63 68 61  bject can be cha
6f10: 6e 67 65 2e 20 20 54 68 65 20 4b 65 79 49 6e 66  nge.  The KeyInf
6f20: 6f 20 6f 62 6a 65 63 74 0a 2a 2a 20 63 61 6e 20  o object.** can 
6f30: 6f 6e 6c 79 20 62 65 20 63 68 61 6e 67 65 64 20  only be changed 
6f40: 69 66 20 74 68 69 73 20 69 73 20 6a 75 73 74 20  if this is just 
6f50: 61 20 73 69 6e 67 6c 65 20 72 65 66 65 72 65 6e  a single referen
6f60: 63 65 20 74 6f 20 74 68 65 20 6f 62 6a 65 63 74  ce to the object
6f70: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
6f80: 74 69 6e 65 20 69 73 20 75 73 65 64 20 6f 6e 6c  tine is used onl
6f90: 79 20 69 6e 73 69 64 65 20 6f 66 20 61 73 73 65  y inside of asse
6fa0: 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 2e  rt() statements.
6fb0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4b  .*/.int sqlite3K
6fc0: 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c  eyInfoIsWriteabl
6fd0: 65 28 4b 65 79 49 6e 66 6f 20 2a 70 29 7b 20 72  e(KeyInfo *p){ r
6fe0: 65 74 75 72 6e 20 70 2d 3e 6e 52 65 66 3d 3d 31  eturn p->nRef==1
6ff0: 3b 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ; }.#endif /* SQ
7000: 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 2f  LITE_DEBUG */../
7010: 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 6e 20 65 78  *.** Given an ex
7020: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2c 20 67  pression list, g
7030: 65 6e 65 72 61 74 65 20 61 20 4b 65 79 49 6e 66  enerate a KeyInf
7040: 6f 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  o structure that
7050: 20 72 65 63 6f 72 64 73 0a 2a 2a 20 74 68 65 20   records.** the 
7060: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
7070: 63 65 20 66 6f 72 20 65 61 63 68 20 65 78 70 72  ce for each expr
7080: 65 73 73 69 6f 6e 20 69 6e 20 74 68 61 74 20 65  ession in that e
7090: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a  xpression list..
70a0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 45 78 70  **.** If the Exp
70b0: 72 4c 69 73 74 20 69 73 20 61 6e 20 4f 52 44 45  rList is an ORDE
70c0: 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20 42 59  R BY or GROUP BY
70d0: 20 63 6c 61 75 73 65 20 74 68 65 6e 20 74 68 65   clause then the
70e0: 20 72 65 73 75 6c 74 69 6e 67 0a 2a 2a 20 4b 65   resulting.** Ke
70f0: 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  yInfo structure 
7100: 69 73 20 61 70 70 72 6f 70 72 69 61 74 65 20 66  is appropriate f
7110: 6f 72 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20  or initializing 
7120: 61 20 76 69 72 74 75 61 6c 20 69 6e 64 65 78 20  a virtual index 
7130: 74 6f 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20  to.** implement 
7140: 74 68 61 74 20 63 6c 61 75 73 65 2e 20 20 49 66  that clause.  If
7150: 20 74 68 65 20 45 78 70 72 4c 69 73 74 20 69 73   the ExprList is
7160: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
7170: 6f 66 20 61 20 53 45 4c 45 43 54 0a 2a 2a 20 74  of a SELECT.** t
7180: 68 65 6e 20 74 68 65 20 4b 65 79 49 6e 66 6f 20  hen the KeyInfo 
7190: 73 74 72 75 63 74 75 72 65 20 69 73 20 61 70 70  structure is app
71a0: 72 6f 70 72 69 61 74 65 20 66 6f 72 20 69 6e 69  ropriate for ini
71b0: 74 69 61 6c 69 7a 69 6e 67 20 61 20 76 69 72 74  tializing a virt
71c0: 75 61 6c 0a 2a 2a 20 69 6e 64 65 78 20 74 6f 20  ual.** index to 
71d0: 69 6d 70 6c 65 6d 65 6e 74 20 61 20 44 49 53 54  implement a DIST
71e0: 49 4e 43 54 20 74 65 73 74 2e 0a 2a 2a 0a 2a 2a  INCT test..**.**
71f0: 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74   Space to hold t
7200: 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63  he KeyInfo struc
7210: 74 75 72 65 20 69 73 20 6f 62 74 61 69 6e 20 66  ture is obtain f
7220: 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 20 20 54 68 65  rom malloc.  The
7230: 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63   calling.** func
7240: 74 69 6f 6e 20 69 73 20 72 65 73 70 6f 6e 73 69  tion is responsi
7250: 62 6c 65 20 66 6f 72 20 73 65 65 69 6e 67 20 74  ble for seeing t
7260: 68 61 74 20 74 68 69 73 20 73 74 72 75 63 74 75  hat this structu
7270: 72 65 20 69 73 20 65 76 65 6e 74 75 61 6c 6c 79  re is eventually
7280: 0a 2a 2a 20 66 72 65 65 64 2e 0a 2a 2f 0a 73 74  .** freed..*/.st
7290: 61 74 69 63 20 4b 65 79 49 6e 66 6f 20 2a 6b 65  atic KeyInfo *ke
72a0: 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73  yInfoFromExprLis
72b0: 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  t(Parse *pParse,
72c0: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
72d0: 29 7b 0a 20 20 69 6e 74 20 6e 45 78 70 72 3b 0a  ){.  int nExpr;.
72e0: 20 20 4b 65 79 49 6e 66 6f 20 2a 70 49 6e 66 6f    KeyInfo *pInfo
72f0: 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c  ;.  struct ExprL
7300: 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
7310: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
7320: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
7330: 6e 74 20 69 3b 0a 0a 20 20 6e 45 78 70 72 20 3d  nt i;..  nExpr =
7340: 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20   pList->nExpr;. 
7350: 20 70 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33   pInfo = sqlite3
7360: 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c  KeyInfoAlloc(db,
7370: 20 6e 45 78 70 72 2c 20 31 29 3b 0a 20 20 69 66   nExpr, 1);.  if
7380: 28 20 70 49 6e 66 6f 20 29 7b 0a 20 20 20 20 61  ( pInfo ){.    a
7390: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 4b 65  ssert( sqlite3Ke
73a0: 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65  yInfoIsWriteable
73b0: 28 70 49 6e 66 6f 29 20 29 3b 0a 20 20 20 20 66  (pInfo) );.    f
73c0: 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70 4c  or(i=0, pItem=pL
73d0: 69 73 74 2d 3e 61 3b 20 69 3c 6e 45 78 70 72 3b  ist->a; i<nExpr;
73e0: 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i++, pItem++){.
73f0: 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
7400: 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 43 6f 6c  Coll;.      pCol
7410: 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
7420: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
7430: 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20  Item->pExpr);.  
7440: 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29      if( !pColl )
7450: 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66   pColl = db->pDf
7460: 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 49  ltColl;.      pI
7470: 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20  nfo->aColl[i] = 
7480: 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 49 6e  pColl;.      pIn
7490: 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69  fo->aSortOrder[i
74a0: 5d 20 3d 20 70 49 74 65 6d 2d 3e 73 6f 72 74 4f  ] = pItem->sortO
74b0: 72 64 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rder;.    }.  }.
74c0: 20 20 72 65 74 75 72 6e 20 70 49 6e 66 6f 3b 0a    return pInfo;.
74d0: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
74e0: 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
74f0: 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 4e 61 6d  SELECT./*.** Nam
7500: 65 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63 74  e of the connect
7510: 69 6f 6e 20 6f 70 65 72 61 74 6f 72 2c 20 75 73  ion operator, us
7520: 65 64 20 66 6f 72 20 65 72 72 6f 72 20 6d 65 73  ed for error mes
7530: 73 61 67 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  sages..*/.static
7540: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 65 6c   const char *sel
7550: 65 63 74 4f 70 4e 61 6d 65 28 69 6e 74 20 69 64  ectOpName(int id
7560: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20  ){.  char *z;.  
7570: 73 77 69 74 63 68 28 20 69 64 20 29 7b 0a 20 20  switch( id ){.  
7580: 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 20    case TK_ALL:  
7590: 20 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 20       z = "UNION 
75a0: 41 4c 4c 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20  ALL";   break;. 
75b0: 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 52     case TK_INTER
75c0: 53 45 43 54 3a 20 7a 20 3d 20 22 49 4e 54 45 52  SECT: z = "INTER
75d0: 53 45 43 54 22 3b 20 20 20 62 72 65 61 6b 3b 0a  SECT";   break;.
75e0: 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43 45      case TK_EXCE
75f0: 50 54 3a 20 20 20 20 7a 20 3d 20 22 45 58 43 45  PT:    z = "EXCE
7600: 50 54 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b  PT";      break;
7610: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 20 20  .    default:   
7620: 20 20 20 20 20 20 20 20 7a 20 3d 20 22 55 4e 49          z = "UNI
7630: 4f 4e 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b  ON";       break
7640: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a  ;.  }.  return z
7650: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
7660: 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
7670: 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 23 69  ND_SELECT */..#i
7680: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
7690: 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20  T_EXPLAIN./*.** 
76a0: 55 6e 6c 65 73 73 20 61 6e 20 22 45 58 50 4c 41  Unless an "EXPLA
76b0: 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 22 20 63  IN QUERY PLAN" c
76c0: 6f 6d 6d 61 6e 64 20 69 73 20 62 65 69 6e 67 20  ommand is being 
76d0: 70 72 6f 63 65 73 73 65 64 2c 20 74 68 69 73 20  processed, this 
76e0: 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 61  function.** is a
76f0: 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73   no-op. Otherwis
7700: 65 2c 20 69 74 20 61 64 64 73 20 61 20 73 69 6e  e, it adds a sin
7710: 67 6c 65 20 72 6f 77 20 6f 66 20 6f 75 74 70 75  gle row of outpu
7720: 74 20 74 6f 20 74 68 65 20 45 51 50 20 72 65 73  t to the EQP res
7730: 75 6c 74 2c 0a 2a 2a 20 77 68 65 72 65 20 74 68  ult,.** where th
7740: 65 20 63 61 70 74 69 6f 6e 20 69 73 20 6f 66 20  e caption is of 
7750: 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20  the form:.**.** 
7760: 20 20 22 55 53 45 20 54 45 4d 50 20 42 2d 54 52    "USE TEMP B-TR
7770: 45 45 20 46 4f 52 20 78 78 78 22 0a 2a 2a 0a 2a  EE FOR xxx".**.*
7780: 2a 20 77 68 65 72 65 20 78 78 78 20 69 73 20 6f  * where xxx is o
7790: 6e 65 20 6f 66 20 22 44 49 53 54 49 4e 43 54 22  ne of "DISTINCT"
77a0: 2c 20 22 4f 52 44 45 52 20 42 59 22 20 6f 72 20  , "ORDER BY" or 
77b0: 22 47 52 4f 55 50 20 42 59 22 2e 20 45 78 61 63  "GROUP BY". Exac
77c0: 74 6c 79 20 77 68 69 63 68 0a 2a 2a 20 69 73 20  tly which.** is 
77d0: 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68  determined by th
77e0: 65 20 7a 55 73 61 67 65 20 61 72 67 75 6d 65 6e  e zUsage argumen
77f0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
7800: 64 20 65 78 70 6c 61 69 6e 54 65 6d 70 54 61 62  d explainTempTab
7810: 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  le(Parse *pParse
7820: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55  , const char *zU
7830: 73 61 67 65 29 7b 0a 20 20 69 66 28 20 70 50 61  sage){.  if( pPa
7840: 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20  rse->explain==2 
7850: 29 7b 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d  ){.    Vdbe *v =
7860: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
7870: 20 20 20 20 63 68 61 72 20 2a 7a 4d 73 67 20 3d      char *zMsg =
7880: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
7890: 70 50 61 72 73 65 2d 3e 64 62 2c 20 22 55 53 45  pParse->db, "USE
78a0: 20 54 45 4d 50 20 42 2d 54 52 45 45 20 46 4f 52   TEMP B-TREE FOR
78b0: 20 25 73 22 2c 20 7a 55 73 61 67 65 29 3b 0a 20   %s", zUsage);. 
78c0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
78d0: 64 4f 70 34 28 76 2c 20 4f 50 5f 45 78 70 6c 61  dOp4(v, OP_Expla
78e0: 69 6e 2c 20 70 50 61 72 73 65 2d 3e 69 53 65 6c  in, pParse->iSel
78f0: 65 63 74 49 64 2c 20 30 2c 20 30 2c 20 7a 4d 73  ectId, 0, 0, zMs
7900: 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a  g, P4_DYNAMIC);.
7910: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73    }.}../*.** Ass
7920: 69 67 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 62  ign expression b
7930: 20 74 6f 20 6c 76 61 6c 75 65 20 61 2e 20 41 20   to lvalue a. A 
7940: 73 65 63 6f 6e 64 2c 20 6e 6f 2d 6f 70 2c 20 76  second, no-op, v
7950: 65 72 73 69 6f 6e 20 6f 66 20 74 68 69 73 20 6d  ersion of this m
7960: 61 63 72 6f 0a 2a 2a 20 69 73 20 70 72 6f 76 69  acro.** is provi
7970: 64 65 64 20 77 68 65 6e 20 53 51 4c 49 54 45 5f  ded when SQLITE_
7980: 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 69 73 20  OMIT_EXPLAIN is 
7990: 64 65 66 69 6e 65 64 2e 20 54 68 69 73 20 61 6c  defined. This al
79a0: 6c 6f 77 73 20 74 68 65 20 63 6f 64 65 0a 2a 2a  lows the code.**
79b0: 20 69 6e 20 73 71 6c 69 74 65 33 53 65 6c 65 63   in sqlite3Selec
79c0: 74 28 29 20 74 6f 20 61 73 73 69 67 6e 20 76 61  t() to assign va
79d0: 6c 75 65 73 20 74 6f 20 73 74 72 75 63 74 75 72  lues to structur
79e0: 65 20 6d 65 6d 62 65 72 20 76 61 72 69 61 62 6c  e member variabl
79f0: 65 73 20 74 68 61 74 0a 2a 2a 20 6f 6e 6c 79 20  es that.** only 
7a00: 65 78 69 73 74 20 69 66 20 53 51 4c 49 54 45 5f  exist if SQLITE_
7a10: 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 69 73 20  OMIT_EXPLAIN is 
7a20: 6e 6f 74 20 64 65 66 69 6e 65 64 20 77 69 74 68  not defined with
7a30: 6f 75 74 20 70 6f 6c 6c 75 74 69 6e 67 20 74 68  out polluting th
7a40: 65 0a 2a 2a 20 63 6f 64 65 20 77 69 74 68 20 23  e.** code with #
7a50: 69 66 6e 64 65 66 20 64 69 72 65 63 74 69 76 65  ifndef directive
7a60: 73 2e 0a 2a 2f 0a 23 20 64 65 66 69 6e 65 20 65  s..*/.# define e
7a70: 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72  xplainSetInteger
7a80: 28 61 2c 20 62 29 20 61 20 3d 20 62 0a 0a 23 65  (a, b) a = b..#e
7a90: 6c 73 65 0a 2f 2a 20 4e 6f 2d 6f 70 20 76 65 72  lse./* No-op ver
7aa0: 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 65 78 70  sions of the exp
7ab0: 6c 61 69 6e 58 58 58 28 29 20 66 75 6e 63 74 69  lainXXX() functi
7ac0: 6f 6e 73 20 61 6e 64 20 6d 61 63 72 6f 73 2e 20  ons and macros. 
7ad0: 2a 2f 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c  */.# define expl
7ae0: 61 69 6e 54 65 6d 70 54 61 62 6c 65 28 79 2c 7a  ainTempTable(y,z
7af0: 29 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61  ).# define expla
7b00: 69 6e 53 65 74 49 6e 74 65 67 65 72 28 79 2c 7a  inSetInteger(y,z
7b10: 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64  ).#endif..#if !d
7b20: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
7b30: 49 54 5f 45 58 50 4c 41 49 4e 29 20 26 26 20 21  IT_EXPLAIN) && !
7b40: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
7b50: 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
7b60: 45 43 54 29 0a 2f 2a 0a 2a 2a 20 55 6e 6c 65 73  ECT)./*.** Unles
7b70: 73 20 61 6e 20 22 45 58 50 4c 41 49 4e 20 51 55  s an "EXPLAIN QU
7b80: 45 52 59 20 50 4c 41 4e 22 20 63 6f 6d 6d 61 6e  ERY PLAN" comman
7b90: 64 20 69 73 20 62 65 69 6e 67 20 70 72 6f 63 65  d is being proce
7ba0: 73 73 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74  ssed, this funct
7bb0: 69 6f 6e 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f  ion.** is a no-o
7bc0: 70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74  p. Otherwise, it
7bd0: 20 61 64 64 73 20 61 20 73 69 6e 67 6c 65 20 72   adds a single r
7be0: 6f 77 20 6f 66 20 6f 75 74 70 75 74 20 74 6f 20  ow of output to 
7bf0: 74 68 65 20 45 51 50 20 72 65 73 75 6c 74 2c 0a  the EQP result,.
7c00: 2a 2a 20 77 68 65 72 65 20 74 68 65 20 63 61 70  ** where the cap
7c10: 74 69 6f 6e 20 69 73 20 6f 66 20 6f 6e 65 20 6f  tion is of one o
7c20: 66 20 74 68 65 20 74 77 6f 20 66 6f 72 6d 73 3a  f the two forms:
7c30: 0a 2a 2a 0a 2a 2a 20 20 20 22 43 4f 4d 50 4f 53  .**.**   "COMPOS
7c40: 49 54 45 20 53 55 42 51 55 45 52 49 45 53 20 69  ITE SUBQUERIES i
7c50: 53 75 62 31 20 61 6e 64 20 69 53 75 62 32 20 28  Sub1 and iSub2 (
7c60: 6f 70 29 22 0a 2a 2a 20 20 20 22 43 4f 4d 50 4f  op)".**   "COMPO
7c70: 53 49 54 45 20 53 55 42 51 55 45 52 49 45 53 20  SITE SUBQUERIES 
7c80: 69 53 75 62 31 20 61 6e 64 20 69 53 75 62 32 20  iSub1 and iSub2 
7c90: 55 53 49 4e 47 20 54 45 4d 50 20 42 2d 54 52 45  USING TEMP B-TRE
7ca0: 45 20 28 6f 70 29 22 0a 2a 2a 0a 2a 2a 20 77 68  E (op)".**.** wh
7cb0: 65 72 65 20 69 53 75 62 31 20 61 6e 64 20 69 53  ere iSub1 and iS
7cc0: 75 62 32 20 61 72 65 20 74 68 65 20 69 6e 74 65  ub2 are the inte
7cd0: 67 65 72 73 20 70 61 73 73 65 64 20 61 73 20 74  gers passed as t
7ce0: 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
7cf0: 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 70 61 72  .** function par
7d00: 61 6d 65 74 65 72 73 2c 20 61 6e 64 20 6f 70 20  ameters, and op 
7d10: 69 73 20 74 68 65 20 74 65 78 74 20 72 65 70 72  is the text repr
7d20: 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  esentation of th
7d30: 65 20 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f  e parameter.** o
7d40: 66 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e  f the same name.
7d50: 20 54 68 65 20 70 61 72 61 6d 65 74 65 72 20 22   The parameter "
7d60: 6f 70 22 20 6d 75 73 74 20 62 65 20 6f 6e 65 20  op" must be one 
7d70: 6f 66 20 54 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f  of TK_UNION, TK_
7d80: 45 58 43 45 50 54 2c 0a 2a 2a 20 54 4b 5f 49 4e  EXCEPT,.** TK_IN
7d90: 54 45 52 53 45 43 54 20 6f 72 20 54 4b 5f 41 4c  TERSECT or TK_AL
7da0: 4c 2e 20 54 68 65 20 66 69 72 73 74 20 66 6f 72  L. The first for
7db0: 6d 20 69 73 20 75 73 65 64 20 69 66 20 61 72 67  m is used if arg
7dc0: 75 6d 65 6e 74 20 62 55 73 65 54 6d 70 20 69 73  ument bUseTmp is
7dd0: 20 0a 2a 2a 20 66 61 6c 73 65 2c 20 6f 72 20 74   .** false, or t
7de0: 68 65 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20 69  he second form i
7df0: 66 20 69 74 20 69 73 20 74 72 75 65 2e 0a 2a 2f  f it is true..*/
7e00: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
7e10: 6c 61 69 6e 43 6f 6d 70 6f 73 69 74 65 28 0a 20  lainComposite(. 
7e20: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
7e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7e40: 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78   /* Parse contex
7e50: 74 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20  t */.  int op,  
7e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7e70: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
7e80: 20 54 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f 45 58   TK_UNION, TK_EX
7e90: 43 45 50 54 20 65 74 63 2e 20 2a 2f 0a 20 20 69  CEPT etc. */.  i
7ea0: 6e 74 20 69 53 75 62 31 2c 20 20 20 20 20 20 20  nt iSub1,       
7eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7ec0: 2a 20 53 75 62 71 75 65 72 79 20 69 64 20 31 20  * Subquery id 1 
7ed0: 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62 32 2c 20  */.  int iSub2, 
7ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ef0: 20 20 20 20 20 2f 2a 20 53 75 62 71 75 65 72 79       /* Subquery
7f00: 20 69 64 20 32 20 2a 2f 0a 20 20 69 6e 74 20 62   id 2 */.  int b
7f10: 55 73 65 54 6d 70 20 20 20 20 20 20 20 20 20 20  UseTmp          
7f20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
7f30: 75 65 20 69 66 20 61 20 74 65 6d 70 20 74 61 62  ue if a temp tab
7f40: 6c 65 20 77 61 73 20 75 73 65 64 20 2a 2f 0a 29  le was used */.)
7f50: 7b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d  {.  assert( op==
7f60: 54 4b 5f 55 4e 49 4f 4e 20 7c 7c 20 6f 70 3d 3d  TK_UNION || op==
7f70: 54 4b 5f 45 58 43 45 50 54 20 7c 7c 20 6f 70 3d  TK_EXCEPT || op=
7f80: 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 7c 7c  =TK_INTERSECT ||
7f90: 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 3b 0a 20   op==TK_ALL );. 
7fa0: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70   if( pParse->exp
7fb0: 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 56  lain==2 ){.    V
7fc0: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
7fd0: 3e 70 56 64 62 65 3b 0a 20 20 20 20 63 68 61 72  >pVdbe;.    char
7fe0: 20 2a 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33   *zMsg = sqlite3
7ff0: 4d 50 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20  MPrintf(.       
8000: 20 70 50 61 72 73 65 2d 3e 64 62 2c 20 22 43 4f   pParse->db, "CO
8010: 4d 50 4f 55 4e 44 20 53 55 42 51 55 45 52 49 45  MPOUND SUBQUERIE
8020: 53 20 25 64 20 41 4e 44 20 25 64 20 25 73 28 25  S %d AND %d %s(%
8030: 73 29 22 2c 20 69 53 75 62 31 2c 20 69 53 75 62  s)", iSub1, iSub
8040: 32 2c 0a 20 20 20 20 20 20 20 20 62 55 73 65 54  2,.        bUseT
8050: 6d 70 3f 22 55 53 49 4e 47 20 54 45 4d 50 20 42  mp?"USING TEMP B
8060: 2d 54 52 45 45 20 22 3a 22 22 2c 20 73 65 6c 65  -TREE ":"", sele
8070: 63 74 4f 70 4e 61 6d 65 28 6f 70 29 0a 20 20 20  ctOpName(op).   
8080: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   );.    sqlite3V
8090: 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
80a0: 45 78 70 6c 61 69 6e 2c 20 70 50 61 72 73 65 2d  Explain, pParse-
80b0: 3e 69 53 65 6c 65 63 74 49 64 2c 20 30 2c 20 30  >iSelectId, 0, 0
80c0: 2c 20 7a 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d  , zMsg, P4_DYNAM
80d0: 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65  IC);.  }.}.#else
80e0: 0a 2f 2a 20 4e 6f 2d 6f 70 20 76 65 72 73 69 6f  ./* No-op versio
80f0: 6e 73 20 6f 66 20 74 68 65 20 65 78 70 6c 61 69  ns of the explai
8100: 6e 58 58 58 28 29 20 66 75 6e 63 74 69 6f 6e 73  nXXX() functions
8110: 20 61 6e 64 20 6d 61 63 72 6f 73 2e 20 2a 2f 0a   and macros. */.
8120: 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69 6e  # define explain
8130: 43 6f 6d 70 6f 73 69 74 65 28 76 2c 77 2c 78 2c  Composite(v,w,x,
8140: 79 2c 7a 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  y,z).#endif../*.
8150: 2a 2a 20 49 66 20 74 68 65 20 69 6e 6e 65 72 20  ** If the inner 
8160: 6c 6f 6f 70 20 77 61 73 20 67 65 6e 65 72 61 74  loop was generat
8170: 65 64 20 75 73 69 6e 67 20 61 20 6e 6f 6e 2d 6e  ed using a non-n
8180: 75 6c 6c 20 70 4f 72 64 65 72 42 79 20 61 72 67  ull pOrderBy arg
8190: 75 6d 65 6e 74 2c 0a 2a 2a 20 74 68 65 6e 20 74  ument,.** then t
81a0: 68 65 20 72 65 73 75 6c 74 73 20 77 65 72 65 20  he results were 
81b0: 70 6c 61 63 65 64 20 69 6e 20 61 20 73 6f 72 74  placed in a sort
81c0: 65 72 2e 20 20 41 66 74 65 72 20 74 68 65 20 6c  er.  After the l
81d0: 6f 6f 70 20 69 73 20 74 65 72 6d 69 6e 61 74 65  oop is terminate
81e0: 64 0a 2a 2a 20 77 65 20 6e 65 65 64 20 74 6f 20  d.** we need to 
81f0: 72 75 6e 20 74 68 65 20 73 6f 72 74 65 72 20 61  run the sorter a
8200: 6e 64 20 6f 75 74 70 75 74 20 74 68 65 20 72 65  nd output the re
8210: 73 75 6c 74 73 2e 20 20 54 68 65 20 66 6f 6c 6c  sults.  The foll
8220: 6f 77 69 6e 67 0a 2a 2a 20 72 6f 75 74 69 6e 65  owing.** routine
8230: 20 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 63   generates the c
8240: 6f 64 65 20 6e 65 65 64 65 64 20 74 6f 20 64 6f  ode needed to do
8250: 20 74 68 61 74 2e 0a 2a 2f 0a 73 74 61 74 69 63   that..*/.static
8260: 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65 53 6f   void generateSo
8270: 72 74 54 61 69 6c 28 0a 20 20 50 61 72 73 65 20  rtTail(.  Parse 
8280: 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50  *pParse,    /* P
8290: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
82a0: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
82b0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c        /* The SEL
82c0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  ECT statement */
82d0: 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20  .  Vdbe *v,     
82e0: 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
82f0: 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 69 73 20   code into this 
8300: 56 44 42 45 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  VDBE */.  int nC
8310: 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 2f 2a 20 4e  olumn,      /* N
8320: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
8330: 20 6f 66 20 64 61 74 61 20 2a 2f 0a 20 20 53 65   of data */.  Se
8340: 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20  lectDest *pDest 
8350: 2f 2a 20 57 72 69 74 65 20 74 68 65 20 73 6f 72  /* Write the sor
8360: 74 65 64 20 72 65 73 75 6c 74 73 20 68 65 72 65  ted results here
8370: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61 64 64   */.){.  int add
8380: 72 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33  rBreak = sqlite3
8390: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
83a0: 3b 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65  ;     /* Jump he
83b0: 72 65 20 74 6f 20 65 78 69 74 20 6c 6f 6f 70 20  re to exit loop 
83c0: 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 43 6f 6e  */.  int addrCon
83d0: 74 69 6e 75 65 20 3d 20 73 71 6c 69 74 65 33 56  tinue = sqlite3V
83e0: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
83f0: 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 66    /* Jump here f
8400: 6f 72 20 6e 65 78 74 20 63 79 63 6c 65 20 2a 2f  or next cycle */
8410: 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 69  .  int addr;.  i
8420: 6e 74 20 69 54 61 62 3b 0a 20 20 69 6e 74 20 70  nt iTab;.  int p
8430: 73 65 75 64 6f 54 61 62 20 3d 20 30 3b 0a 20 20  seudoTab = 0;.  
8440: 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
8450: 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79  By = p->pOrderBy
8460: 3b 0a 0a 20 20 69 6e 74 20 65 44 65 73 74 20 3d  ;..  int eDest =
8470: 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3b 0a 20   pDest->eDest;. 
8480: 20 69 6e 74 20 69 50 61 72 6d 20 3d 20 70 44 65   int iParm = pDe
8490: 73 74 2d 3e 69 53 44 50 61 72 6d 3b 0a 0a 20 20  st->iSDParm;..  
84a0: 69 6e 74 20 72 65 67 52 6f 77 3b 0a 20 20 69 6e  int regRow;.  in
84b0: 74 20 72 65 67 52 6f 77 69 64 3b 0a 0a 20 20 69  t regRowid;..  i
84c0: 54 61 62 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e  Tab = pOrderBy->
84d0: 69 45 43 75 72 73 6f 72 3b 0a 20 20 72 65 67 52  iECursor;.  regR
84e0: 6f 77 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  ow = sqlite3GetT
84f0: 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
8500: 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54    if( eDest==SRT
8510: 5f 4f 75 74 70 75 74 20 7c 7c 20 65 44 65 73 74  _Output || eDest
8520: 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20  ==SRT_Coroutine 
8530: 29 7b 0a 20 20 20 20 70 73 65 75 64 6f 54 61 62  ){.    pseudoTab
8540: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
8550: 2b 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  +;.    sqlite3Vd
8560: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f  beAddOp3(v, OP_O
8570: 70 65 6e 50 73 65 75 64 6f 2c 20 70 73 65 75 64  penPseudo, pseud
8580: 6f 54 61 62 2c 20 72 65 67 52 6f 77 2c 20 6e 43  oTab, regRow, nC
8590: 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 72 65 67 52  olumn);.    regR
85a0: 6f 77 69 64 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  owid = 0;.  }els
85b0: 65 7b 0a 20 20 20 20 72 65 67 52 6f 77 69 64 20  e{.    regRowid 
85c0: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
85d0: 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 7d  Reg(pParse);.  }
85e0: 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61  .  if( p->selFla
85f0: 67 73 20 26 20 53 46 5f 55 73 65 53 6f 72 74 65  gs & SF_UseSorte
8600: 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 65 67  r ){.    int reg
8610: 53 6f 72 74 4f 75 74 20 3d 20 2b 2b 70 50 61 72  SortOut = ++pPar
8620: 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 69 6e  se->nMem;.    in
8630: 74 20 70 74 61 62 32 20 3d 20 70 50 61 72 73 65  t ptab2 = pParse
8640: 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 73 71  ->nTab++;.    sq
8650: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
8660: 76 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f  v, OP_OpenPseudo
8670: 2c 20 70 74 61 62 32 2c 20 72 65 67 53 6f 72 74  , ptab2, regSort
8680: 4f 75 74 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e  Out, pOrderBy->n
8690: 45 78 70 72 2b 32 29 3b 0a 20 20 20 20 61 64 64  Expr+2);.    add
86a0: 72 20 3d 20 31 20 2b 20 73 71 6c 69 74 65 33 56  r = 1 + sqlite3V
86b0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
86c0: 53 6f 72 74 65 72 53 6f 72 74 2c 20 69 54 61 62  SorterSort, iTab
86d0: 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20 20  , addrBreak);.  
86e0: 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20    codeOffset(v, 
86f0: 70 2c 20 61 64 64 72 43 6f 6e 74 69 6e 75 65 29  p, addrContinue)
8700: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
8710: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f  eAddOp2(v, OP_So
8720: 72 74 65 72 44 61 74 61 2c 20 69 54 61 62 2c 20  rterData, iTab, 
8730: 72 65 67 53 6f 72 74 4f 75 74 29 3b 0a 20 20 20  regSortOut);.   
8740: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
8750: 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  p3(v, OP_Column,
8760: 20 70 74 61 62 32 2c 20 70 4f 72 64 65 72 42 79   ptab2, pOrderBy
8770: 2d 3e 6e 45 78 70 72 2b 31 2c 20 72 65 67 52 6f  ->nExpr+1, regRo
8780: 77 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  w);.    sqlite3V
8790: 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f  dbeChangeP5(v, O
87a0: 50 46 4c 41 47 5f 43 4c 45 41 52 43 41 43 48 45  PFLAG_CLEARCACHE
87b0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
87c0: 61 64 64 72 20 3d 20 31 20 2b 20 73 71 6c 69 74  addr = 1 + sqlit
87d0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
87e0: 4f 50 5f 53 6f 72 74 2c 20 69 54 61 62 2c 20 61  OP_Sort, iTab, a
87f0: 64 64 72 42 72 65 61 6b 29 3b 0a 20 20 20 20 63  ddrBreak);.    c
8800: 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2c 20  odeOffset(v, p, 
8810: 61 64 64 72 43 6f 6e 74 69 6e 75 65 29 3b 0a 20  addrContinue);. 
8820: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
8830: 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
8840: 6e 2c 20 69 54 61 62 2c 20 70 4f 72 64 65 72 42  n, iTab, pOrderB
8850: 79 2d 3e 6e 45 78 70 72 2b 31 2c 20 72 65 67 52  y->nExpr+1, regR
8860: 6f 77 29 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63  ow);.  }.  switc
8870: 68 28 20 65 44 65 73 74 20 29 7b 0a 20 20 20 20  h( eDest ){.    
8880: 63 61 73 65 20 53 52 54 5f 54 61 62 6c 65 3a 0a  case SRT_Table:.
8890: 20 20 20 20 63 61 73 65 20 53 52 54 5f 45 70 68      case SRT_Eph
88a0: 65 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20 20 74  emTab: {.      t
88b0: 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d  estcase( eDest==
88c0: 53 52 54 5f 54 61 62 6c 65 20 29 3b 0a 20 20 20  SRT_Table );.   
88d0: 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65     testcase( eDe
88e0: 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61 62  st==SRT_EphemTab
88f0: 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
8900: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
8910: 50 5f 4e 65 77 52 6f 77 69 64 2c 20 69 50 61 72  P_NewRowid, iPar
8920: 6d 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20  m, regRowid);.  
8930: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
8940: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65  ddOp3(v, OP_Inse
8950: 72 74 2c 20 69 50 61 72 6d 2c 20 72 65 67 52 6f  rt, iParm, regRo
8960: 77 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20  w, regRowid);.  
8970: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
8980: 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41  hangeP5(v, OPFLA
8990: 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 20  G_APPEND);.     
89a0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69   break;.    }.#i
89b0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
89c0: 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 63  T_SUBQUERY.    c
89d0: 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20  ase SRT_Set: {. 
89e0: 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f       assert( nCo
89f0: 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20  lumn==1 );.     
8a00: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
8a10: 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p4(v, OP_MakeRec
8a20: 6f 72 64 2c 20 72 65 67 52 6f 77 2c 20 31 2c 20  ord, regRow, 1, 
8a30: 72 65 67 52 6f 77 69 64 2c 0a 20 20 20 20 20 20  regRowid,.      
8a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8a50: 20 20 26 70 44 65 73 74 2d 3e 61 66 66 53 64 73    &pDest->affSds
8a60: 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  t, 1);.      sql
8a70: 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66  ite3ExprCacheAff
8a80: 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72  inityChange(pPar
8a90: 73 65 2c 20 72 65 67 52 6f 77 2c 20 31 29 3b 0a  se, regRow, 1);.
8aa0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
8ab0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64  eAddOp2(v, OP_Id
8ac0: 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20  xInsert, iParm, 
8ad0: 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  regRowid);.     
8ae0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
8af0: 20 20 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20    case SRT_Mem: 
8b00: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
8b10: 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20  nColumn==1 );.  
8b20: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
8b30: 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20  odeMove(pParse, 
8b40: 72 65 67 52 6f 77 2c 20 69 50 61 72 6d 2c 20 31  regRow, iParm, 1
8b50: 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  );.      /* The 
8b60: 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69 6c  LIMIT clause wil
8b70: 6c 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20  l terminate the 
8b80: 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20  loop for us */. 
8b90: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
8ba0: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 65 66  }.#endif.    def
8bb0: 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 69 6e  ault: {.      in
8bc0: 74 20 69 3b 0a 20 20 20 20 20 20 61 73 73 65 72  t i;.      asser
8bd0: 74 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75  t( eDest==SRT_Ou
8be0: 74 70 75 74 20 7c 7c 20 65 44 65 73 74 3d 3d 53  tput || eDest==S
8bf0: 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 3b 20  RT_Coroutine ); 
8c00: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
8c10: 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70   eDest==SRT_Outp
8c20: 75 74 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ut );.      test
8c30: 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54  case( eDest==SRT
8c40: 5f 43 6f 72 6f 75 74 69 6e 65 20 29 3b 0a 20 20  _Coroutine );.  
8c50: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
8c60: 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Column; i++){.  
8c70: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 65        assert( re
8c80: 67 52 6f 77 21 3d 70 44 65 73 74 2d 3e 69 53 64  gRow!=pDest->iSd
8c90: 73 74 2b 69 20 29 3b 0a 20 20 20 20 20 20 20 20  st+i );.        
8ca0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
8cb0: 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  3(v, OP_Column, 
8cc0: 70 73 65 75 64 6f 54 61 62 2c 20 69 2c 20 70 44  pseudoTab, i, pD
8cd0: 65 73 74 2d 3e 69 53 64 73 74 2b 69 29 3b 0a 20  est->iSdst+i);. 
8ce0: 20 20 20 20 20 20 20 69 66 28 20 69 3d 3d 30 20         if( i==0 
8cf0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
8d00: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
8d10: 28 76 2c 20 4f 50 46 4c 41 47 5f 43 4c 45 41 52  (v, OPFLAG_CLEAR
8d20: 43 41 43 48 45 29 3b 0a 20 20 20 20 20 20 20 20  CACHE);.        
8d30: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
8d40: 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f  if( eDest==SRT_O
8d50: 75 74 70 75 74 20 29 7b 0a 20 20 20 20 20 20 20  utput ){.       
8d60: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
8d70: 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52  p2(v, OP_ResultR
8d80: 6f 77 2c 20 70 44 65 73 74 2d 3e 69 53 64 73 74  ow, pDest->iSdst
8d90: 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20  , nColumn);.    
8da0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
8db0: 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e  acheAffinityChan
8dc0: 67 65 28 70 50 61 72 73 65 2c 20 70 44 65 73 74  ge(pParse, pDest
8dd0: 2d 3e 69 53 64 73 74 2c 20 6e 43 6f 6c 75 6d 6e  ->iSdst, nColumn
8de0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
8df0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
8e00: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
8e10: 59 69 65 6c 64 2c 20 70 44 65 73 74 2d 3e 69 53  Yield, pDest->iS
8e20: 44 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 7d 0a  DParm);.      }.
8e30: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
8e40: 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
8e50: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
8e60: 50 61 72 73 65 2c 20 72 65 67 52 6f 77 29 3b 0a  Parse, regRow);.
8e70: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
8e80: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
8e90: 72 65 67 52 6f 77 69 64 29 3b 0a 0a 20 20 2f 2a  regRowid);..  /*
8ea0: 20 54 68 65 20 62 6f 74 74 6f 6d 20 6f 66 20 74   The bottom of t
8eb0: 68 65 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20 20 73  he loop.  */.  s
8ec0: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
8ed0: 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 43 6f  eLabel(v, addrCo
8ee0: 6e 74 69 6e 75 65 29 3b 0a 20 20 69 66 28 20 70  ntinue);.  if( p
8ef0: 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
8f00: 55 73 65 53 6f 72 74 65 72 20 29 7b 0a 20 20 20  UseSorter ){.   
8f10: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
8f20: 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4e  p2(v, OP_SorterN
8f30: 65 78 74 2c 20 69 54 61 62 2c 20 61 64 64 72 29  ext, iTab, addr)
8f40: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
8f50: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
8f60: 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 69 54 61  (v, OP_Next, iTa
8f70: 62 2c 20 61 64 64 72 29 3b 0a 20 20 7d 0a 20 20  b, addr);.  }.  
8f80: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
8f90: 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 42  veLabel(v, addrB
8fa0: 72 65 61 6b 29 3b 0a 20 20 69 66 28 20 65 44 65  reak);.  if( eDe
8fb0: 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 7c  st==SRT_Output |
8fc0: 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72  | eDest==SRT_Cor
8fd0: 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20 73 71  outine ){.    sq
8fe0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
8ff0: 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 70 73 65  v, OP_Close, pse
9000: 75 64 6f 54 61 62 2c 20 30 29 3b 0a 20 20 7d 0a  udoTab, 0);.  }.
9010: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
9020: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73  a pointer to a s
9030: 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67  tring containing
9040: 20 74 68 65 20 27 64 65 63 6c 61 72 61 74 69 6f   the 'declaratio
9050: 6e 20 74 79 70 65 27 20 6f 66 20 74 68 65 0a 2a  n type' of the.*
9060: 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78  * expression pEx
9070: 70 72 2e 20 54 68 65 20 73 74 72 69 6e 67 20 6d  pr. The string m
9080: 61 79 20 62 65 20 74 72 65 61 74 65 64 20 61 73  ay be treated as
9090: 20 73 74 61 74 69 63 20 62 79 20 74 68 65 20 63   static by the c
90a0: 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73  aller..**.** Als
90b0: 6f 20 74 72 79 20 74 6f 20 65 73 74 69 6d 61 74  o try to estimat
90c0: 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  e the size of th
90d0: 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65  e returned value
90e0: 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 61 74   and return that
90f0: 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20 2a 70  .** result in *p
9100: 45 73 74 57 69 64 74 68 2e 0a 2a 2a 0a 2a 2a 20  EstWidth..**.** 
9110: 54 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  The declaration 
9120: 74 79 70 65 20 69 73 20 74 68 65 20 65 78 61 63  type is the exac
9130: 74 20 64 61 74 61 74 79 70 65 20 64 65 66 69 6e  t datatype defin
9140: 69 74 69 6f 6e 20 65 78 74 72 61 63 74 65 64 20  ition extracted 
9150: 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 6f 72 69 67  from the.** orig
9160: 69 6e 61 6c 20 43 52 45 41 54 45 20 54 41 42 4c  inal CREATE TABL
9170: 45 20 73 74 61 74 65 6d 65 6e 74 20 69 66 20 74  E statement if t
9180: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
9190: 20 61 20 63 6f 6c 75 6d 6e 2e 20 54 68 65 0a 2a   a column. The.*
91a0: 2a 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79  * declaration ty
91b0: 70 65 20 66 6f 72 20 61 20 52 4f 57 49 44 20 66  pe for a ROWID f
91c0: 69 65 6c 64 20 69 73 20 49 4e 54 45 47 45 52 2e  ield is INTEGER.
91d0: 20 45 78 61 63 74 6c 79 20 77 68 65 6e 20 61 6e   Exactly when an
91e0: 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69   expression.** i
91f0: 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20 63  s considered a c
9200: 6f 6c 75 6d 6e 20 63 61 6e 20 62 65 20 63 6f 6d  olumn can be com
9210: 70 6c 65 78 20 69 6e 20 74 68 65 20 70 72 65 73  plex in the pres
9220: 65 6e 63 65 20 6f 66 20 73 75 62 71 75 65 72 69  ence of subqueri
9230: 65 73 2e 20 54 68 65 0a 2a 2a 20 72 65 73 75 6c  es. The.** resul
9240: 74 2d 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e  t-set expression
9250: 20 69 6e 20 61 6c 6c 20 6f 66 20 74 68 65 20 66   in all of the f
9260: 6f 6c 6c 6f 77 69 6e 67 20 53 45 4c 45 43 54 20  ollowing SELECT 
9270: 73 74 61 74 65 6d 65 6e 74 73 20 69 73 20 0a 2a  statements is .*
9280: 2a 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20 63  * considered a c
9290: 6f 6c 75 6d 6e 20 62 79 20 74 68 69 73 20 66 75  olumn by this fu
92a0: 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20  nction..**.**   
92b0: 53 45 4c 45 43 54 20 63 6f 6c 20 46 52 4f 4d 20  SELECT col FROM 
92c0: 74 62 6c 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54  tbl;.**   SELECT
92d0: 20 28 53 45 4c 45 43 54 20 63 6f 6c 20 46 52 4f   (SELECT col FRO
92e0: 4d 20 74 62 6c 3b 0a 2a 2a 20 20 20 53 45 4c 45  M tbl;.**   SELE
92f0: 43 54 20 28 53 45 4c 45 43 54 20 63 6f 6c 20 46  CT (SELECT col F
9300: 52 4f 4d 20 74 62 6c 29 3b 0a 2a 2a 20 20 20 53  ROM tbl);.**   S
9310: 45 4c 45 43 54 20 61 62 63 20 46 52 4f 4d 20 28  ELECT abc FROM (
9320: 53 45 4c 45 43 54 20 63 6f 6c 20 41 53 20 61 62  SELECT col AS ab
9330: 63 20 46 52 4f 4d 20 74 62 6c 29 3b 0a 2a 2a 20  c FROM tbl);.** 
9340: 0a 2a 2a 20 54 68 65 20 64 65 63 6c 61 72 61 74  .** The declarat
9350: 69 6f 6e 20 74 79 70 65 20 66 6f 72 20 61 6e 79  ion type for any
9360: 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 74 68 65   expression othe
9370: 72 20 74 68 61 6e 20 61 20 63 6f 6c 75 6d 6e 20  r than a column 
9380: 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54  is NULL..**.** T
9390: 68 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20  his routine has 
93a0: 65 69 74 68 65 72 20 33 20 6f 72 20 36 20 70 61  either 3 or 6 pa
93b0: 72 61 6d 65 74 65 72 73 20 64 65 70 65 6e 64 69  rameters dependi
93c0: 6e 67 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72  ng on whether or
93d0: 20 6e 6f 74 0a 2a 2a 20 74 68 65 20 53 51 4c 49   not.** the SQLI
93e0: 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e  TE_ENABLE_COLUMN
93f0: 5f 4d 45 54 41 44 41 54 41 20 63 6f 6d 70 69 6c  _METADATA compil
9400: 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73  e-time option is
9410: 20 75 73 65 64 2e 0a 2a 2f 0a 23 69 66 64 65 66   used..*/.#ifdef
9420: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
9430: 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 23  OLUMN_METADATA.#
9440: 20 64 65 66 69 6e 65 20 63 6f 6c 75 6d 6e 54 79   define columnTy
9450: 70 65 28 41 2c 42 2c 43 2c 44 2c 45 2c 46 29 20  pe(A,B,C,D,E,F) 
9460: 63 6f 6c 75 6d 6e 54 79 70 65 49 6d 70 6c 28 41  columnTypeImpl(A
9470: 2c 42 2c 43 2c 44 2c 45 2c 46 29 0a 73 74 61 74  ,B,C,D,E,F).stat
9480: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63  ic const char *c
9490: 6f 6c 75 6d 6e 54 79 70 65 49 6d 70 6c 28 0a 20  olumnTypeImpl(. 
94a0: 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e   NameContext *pN
94b0: 43 2c 20 0a 20 20 45 78 70 72 20 2a 70 45 78 70  C, .  Expr *pExp
94c0: 72 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  r,.  const char 
94d0: 2a 2a 70 7a 4f 72 69 67 44 62 2c 0a 20 20 63 6f  **pzOrigDb,.  co
94e0: 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69  nst char **pzOri
94f0: 67 54 61 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68  gTab,.  const ch
9500: 61 72 20 2a 2a 70 7a 4f 72 69 67 43 6f 6c 2c 0a  ar **pzOrigCol,.
9510: 20 20 75 38 20 2a 70 45 73 74 57 69 64 74 68 0a    u8 *pEstWidth.
9520: 29 7b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20  ){.  char const 
9530: 2a 7a 4f 72 69 67 44 62 20 3d 20 30 3b 0a 20 20  *zOrigDb = 0;.  
9540: 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69  char const *zOri
9550: 67 54 61 62 20 3d 20 30 3b 0a 20 20 63 68 61 72  gTab = 0;.  char
9560: 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67 43 6f 6c   const *zOrigCol
9570: 20 3d 20 30 3b 0a 23 65 6c 73 65 20 2f 2a 20 69   = 0;.#else /* i
9580: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
9590: 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f  E_ENABLE_COLUMN_
95a0: 4d 45 54 41 44 41 54 41 29 20 2a 2f 0a 23 20 64  METADATA) */.# d
95b0: 65 66 69 6e 65 20 63 6f 6c 75 6d 6e 54 79 70 65  efine columnType
95c0: 28 41 2c 42 2c 43 2c 44 2c 45 2c 46 29 20 63 6f  (A,B,C,D,E,F) co
95d0: 6c 75 6d 6e 54 79 70 65 49 6d 70 6c 28 41 2c 42  lumnTypeImpl(A,B
95e0: 2c 46 29 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  ,F).static const
95f0: 20 63 68 61 72 20 2a 63 6f 6c 75 6d 6e 54 79 70   char *columnTyp
9600: 65 49 6d 70 6c 28 0a 20 20 4e 61 6d 65 43 6f 6e  eImpl(.  NameCon
9610: 74 65 78 74 20 2a 70 4e 43 2c 20 0a 20 20 45 78  text *pNC, .  Ex
9620: 70 72 20 2a 70 45 78 70 72 2c 0a 20 20 75 38 20  pr *pExpr,.  u8 
9630: 2a 70 45 73 74 57 69 64 74 68 0a 29 7b 0a 23 65  *pEstWidth.){.#e
9640: 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
9650: 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43  (SQLITE_ENABLE_C
9660: 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 29 20  OLUMN_METADATA) 
9670: 2a 2f 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20  */.  char const 
9680: 2a 7a 54 79 70 65 20 3d 20 30 3b 0a 20 20 69 6e  *zType = 0;.  in
9690: 74 20 6a 3b 0a 20 20 75 38 20 65 73 74 57 69 64  t j;.  u8 estWid
96a0: 74 68 20 3d 20 31 3b 0a 0a 20 20 69 66 28 20 4e  th = 1;..  if( N
96b0: 45 56 45 52 28 70 45 78 70 72 3d 3d 30 29 20 7c  EVER(pExpr==0) |
96c0: 7c 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3d  | pNC->pSrcList=
96d0: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
96e0: 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e   switch( pExpr->
96f0: 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
9700: 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20  K_AGG_COLUMN:.  
9710: 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e    case TK_COLUMN
9720: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  : {.      /* The
9730: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61   expression is a
9740: 20 63 6f 6c 75 6d 6e 2e 20 4c 6f 63 61 74 65 20   column. Locate 
9750: 74 68 65 20 74 61 62 6c 65 20 74 68 65 20 63 6f  the table the co
9760: 6c 75 6d 6e 20 69 73 20 62 65 69 6e 67 0a 20 20  lumn is being.  
9770: 20 20 20 20 2a 2a 20 65 78 74 72 61 63 74 65 64      ** extracted
9780: 20 66 72 6f 6d 20 69 6e 20 4e 61 6d 65 43 6f 6e   from in NameCon
9790: 74 65 78 74 2e 70 53 72 63 4c 69 73 74 2e 20 54  text.pSrcList. T
97a0: 68 69 73 20 74 61 62 6c 65 20 6d 61 79 20 62 65  his table may be
97b0: 20 72 65 61 6c 0a 20 20 20 20 20 20 2a 2a 20 64   real.      ** d
97c0: 61 74 61 62 61 73 65 20 74 61 62 6c 65 20 6f 72  atabase table or
97d0: 20 61 20 73 75 62 71 75 65 72 79 2e 0a 20 20 20   a subquery..   
97e0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c     */.      Tabl
97f0: 65 20 2a 70 54 61 62 20 3d 20 30 3b 20 20 20 20  e *pTab = 0;    
9800: 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
9810: 20 73 74 72 75 63 74 75 72 65 20 63 6f 6c 75 6d   structure colum
9820: 6e 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66  n is extracted f
9830: 72 6f 6d 20 2a 2f 0a 20 20 20 20 20 20 53 65 6c  rom */.      Sel
9840: 65 63 74 20 2a 70 53 20 3d 20 30 3b 20 20 20 20  ect *pS = 0;    
9850: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 6c 65           /* Sele
9860: 63 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73  ct the column is
9870: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
9880: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f  */.      int iCo
9890: 6c 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  l = pExpr->iColu
98a0: 6d 6e 3b 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66  mn;  /* Index of
98b0: 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 54 61 62 20   column in pTab 
98c0: 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  */.      testcas
98d0: 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
98e0: 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20  _AGG_COLUMN );. 
98f0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
9900: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  Expr->op==TK_COL
9910: 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 77 68 69  UMN );.      whi
9920: 6c 65 28 20 70 4e 43 20 26 26 20 21 70 54 61 62  le( pNC && !pTab
9930: 20 29 7b 0a 20 20 20 20 20 20 20 20 53 72 63 4c   ){.        SrcL
9940: 69 73 74 20 2a 70 54 61 62 4c 69 73 74 20 3d 20  ist *pTabList = 
9950: 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 20  pNC->pSrcList;. 
9960: 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 6a         for(j=0;j
9970: 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20  <pTabList->nSrc 
9980: 26 26 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a  && pTabList->a[j
9990: 5d 2e 69 43 75 72 73 6f 72 21 3d 70 45 78 70 72  ].iCursor!=pExpr
99a0: 2d 3e 69 54 61 62 6c 65 3b 6a 2b 2b 29 3b 0a 20  ->iTable;j++);. 
99b0: 20 20 20 20 20 20 20 69 66 28 20 6a 3c 70 54 61         if( j<pTa
99c0: 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 7b 0a 20  bList->nSrc ){. 
99d0: 20 20 20 20 20 20 20 20 20 70 54 61 62 20 3d 20           pTab = 
99e0: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70  pTabList->a[j].p
99f0: 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70  Tab;.          p
9a00: 53 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  S = pTabList->a[
9a10: 6a 5d 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20  j].pSelect;.    
9a20: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
9a30: 20 20 20 20 20 70 4e 43 20 3d 20 70 4e 43 2d 3e       pNC = pNC->
9a40: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 7d  pNext;.        }
9a50: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
9a60: 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20  if( pTab==0 ){. 
9a70: 20 20 20 20 20 20 20 2f 2a 20 41 74 20 6f 6e 65         /* At one
9a80: 20 74 69 6d 65 2c 20 63 6f 64 65 20 73 75 63 68   time, code such
9a90: 20 61 73 20 22 53 45 4c 45 43 54 20 6e 65 77 2e   as "SELECT new.
9aa0: 78 22 20 77 69 74 68 69 6e 20 61 20 74 72 69 67  x" within a trig
9ab0: 67 65 72 20 77 6f 75 6c 64 0a 20 20 20 20 20 20  ger would.      
9ac0: 20 20 2a 2a 20 63 61 75 73 65 20 74 68 69 73 20    ** cause this 
9ad0: 63 6f 6e 64 69 74 69 6f 6e 20 74 6f 20 72 75 6e  condition to run
9ae0: 2e 20 20 53 69 6e 63 65 20 74 68 65 6e 2c 20 77  .  Since then, w
9af0: 65 20 68 61 76 65 20 72 65 73 74 72 75 63 74 75  e have restructu
9b00: 72 65 64 20 68 6f 77 0a 20 20 20 20 20 20 20 20  red how.        
9b10: 2a 2a 20 74 72 69 67 67 65 72 20 63 6f 64 65 20  ** trigger code 
9b20: 69 73 20 67 65 6e 65 72 61 74 65 64 20 61 6e 64  is generated and
9b30: 20 73 6f 20 74 68 69 73 20 63 6f 6e 64 69 74 69   so this conditi
9b40: 6f 6e 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20  on is no longer 
9b50: 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 73 73  .        ** poss
9b60: 69 62 6c 65 2e 20 48 6f 77 65 76 65 72 2c 20 69  ible. However, i
9b70: 74 20 63 61 6e 20 73 74 69 6c 6c 20 62 65 20 74  t can still be t
9b80: 72 75 65 20 66 6f 72 20 73 74 61 74 65 6d 65 6e  rue for statemen
9b90: 74 73 20 6c 69 6b 65 0a 20 20 20 20 20 20 20 20  ts like.        
9ba0: 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** the following
9bb0: 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  :.        **.   
9bc0: 20 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45       **   CREATE
9bd0: 20 54 41 42 4c 45 20 74 31 28 63 6f 6c 20 49 4e   TABLE t1(col IN
9be0: 54 45 47 45 52 29 3b 0a 20 20 20 20 20 20 20 20  TEGER);.        
9bf0: 2a 2a 20 20 20 53 45 4c 45 43 54 20 28 53 45 4c  **   SELECT (SEL
9c00: 45 43 54 20 74 31 2e 63 6f 6c 29 20 46 52 4f 4d  ECT t1.col) FROM
9c10: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 20 20   FROM t1;.      
9c20: 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
9c30: 77 68 65 6e 20 63 6f 6c 75 6d 6e 54 79 70 65 28  when columnType(
9c40: 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74  ) is called on t
9c50: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 22 74  he expression "t
9c60: 31 2e 63 6f 6c 22 20 69 6e 20 74 68 65 20 0a 20  1.col" in the . 
9c70: 20 20 20 20 20 20 20 2a 2a 20 73 75 62 2d 73 65         ** sub-se
9c80: 6c 65 63 74 2e 20 49 6e 20 74 68 69 73 20 63 61  lect. In this ca
9c90: 73 65 2c 20 73 65 74 20 74 68 65 20 63 6f 6c 75  se, set the colu
9ca0: 6d 6e 20 74 79 70 65 20 74 6f 20 4e 55 4c 4c 2c  mn type to NULL,
9cb0: 20 65 76 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a   even.        **
9cc0: 20 74 68 6f 75 67 68 20 69 74 20 73 68 6f 75 6c   though it shoul
9cd0: 64 20 72 65 61 6c 6c 79 20 62 65 20 22 49 4e 54  d really be "INT
9ce0: 45 47 45 52 22 2e 0a 20 20 20 20 20 20 20 20 2a  EGER"..        *
9cf0: 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69  *.        ** Thi
9d00: 73 20 69 73 20 6e 6f 74 20 61 20 70 72 6f 62 6c  s is not a probl
9d10: 65 6d 2c 20 61 73 20 74 68 65 20 63 6f 6c 75 6d  em, as the colum
9d20: 6e 20 74 79 70 65 20 6f 66 20 22 74 31 2e 63 6f  n type of "t1.co
9d30: 6c 22 20 69 73 20 6e 65 76 65 72 0a 20 20 20 20  l" is never.    
9d40: 20 20 20 20 2a 2a 20 75 73 65 64 2e 20 57 68 65      ** used. Whe
9d50: 6e 20 63 6f 6c 75 6d 6e 54 79 70 65 28 29 20 69  n columnType() i
9d60: 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20  s called on the 
9d70: 65 78 70 72 65 73 73 69 6f 6e 20 0a 20 20 20 20  expression .    
9d80: 20 20 20 20 2a 2a 20 22 28 53 45 4c 45 43 54 20      ** "(SELECT 
9d90: 74 31 2e 63 6f 6c 29 22 2c 20 74 68 65 20 63 6f  t1.col)", the co
9da0: 72 72 65 63 74 20 74 79 70 65 20 69 73 20 72 65  rrect type is re
9db0: 74 75 72 6e 65 64 20 28 73 65 65 20 74 68 65 20  turned (see the 
9dc0: 54 4b 5f 53 45 4c 45 43 54 0a 20 20 20 20 20 20  TK_SELECT.      
9dd0: 20 20 2a 2a 20 62 72 61 6e 63 68 20 62 65 6c 6f    ** branch belo
9de0: 77 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 62  w.  */.        b
9df0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  reak;.      }.. 
9e00: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61       assert( pTa
9e10: 62 20 26 26 20 70 45 78 70 72 2d 3e 70 54 61 62  b && pExpr->pTab
9e20: 3d 3d 70 54 61 62 20 29 3b 0a 20 20 20 20 20 20  ==pTab );.      
9e30: 69 66 28 20 70 53 20 29 7b 0a 20 20 20 20 20 20  if( pS ){.      
9e40: 20 20 2f 2a 20 54 68 65 20 22 74 61 62 6c 65 22    /* The "table"
9e50: 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61 20 73   is actually a s
9e60: 75 62 2d 73 65 6c 65 63 74 20 6f 72 20 61 20 76  ub-select or a v
9e70: 69 65 77 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  iew in the FROM 
9e80: 63 6c 61 75 73 65 0a 20 20 20 20 20 20 20 20 2a  clause.        *
9e90: 2a 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20  * of the SELECT 
9ea0: 73 74 61 74 65 6d 65 6e 74 2e 20 52 65 74 75 72  statement. Retur
9eb0: 6e 20 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f  n the declaratio
9ec0: 6e 20 74 79 70 65 20 61 6e 64 20 6f 72 69 67 69  n type and origi
9ed0: 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 61 74  n.        ** dat
9ee0: 61 20 66 6f 72 20 74 68 65 20 72 65 73 75 6c 74  a for the result
9ef0: 2d 73 65 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  -set column of t
9f00: 68 65 20 73 75 62 2d 73 65 6c 65 63 74 2e 0a 20  he sub-select.. 
9f10: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
9f20: 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 26 26    if( iCol>=0 &&
9f30: 20 41 4c 57 41 59 53 28 69 43 6f 6c 3c 70 53 2d   ALWAYS(iCol<pS-
9f40: 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 20  >pEList->nExpr) 
9f50: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
9f60: 49 66 20 69 43 6f 6c 20 69 73 20 6c 65 73 73 20  If iCol is less 
9f70: 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20  than zero, then 
9f80: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 72  the expression r
9f90: 65 71 75 65 73 74 73 20 74 68 65 0a 20 20 20 20  equests the.    
9fa0: 20 20 20 20 20 20 2a 2a 20 72 6f 77 69 64 20 6f        ** rowid o
9fb0: 66 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74  f the sub-select
9fc0: 20 6f 72 20 76 69 65 77 2e 20 54 68 69 73 20 65   or view. This e
9fd0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6c 65 67  xpression is leg
9fe0: 61 6c 20 28 73 65 65 20 0a 20 20 20 20 20 20 20  al (see .       
9ff0: 20 20 20 2a 2a 20 74 65 73 74 20 63 61 73 65 20     ** test case 
a000: 6d 69 73 63 32 2e 32 2e 32 29 20 2d 20 69 74 20  misc2.2.2) - it 
a010: 61 6c 77 61 79 73 20 65 76 61 6c 75 61 74 65 73  always evaluates
a020: 20 74 6f 20 4e 55 4c 4c 2e 0a 20 20 20 20 20 20   to NULL..      
a030: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
a040: 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43   NameContext sNC
a050: 3b 0a 20 20 20 20 20 20 20 20 20 20 45 78 70 72  ;.          Expr
a060: 20 2a 70 20 3d 20 70 53 2d 3e 70 45 4c 69 73 74   *p = pS->pEList
a070: 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78 70 72 3b  ->a[iCol].pExpr;
a080: 0a 20 20 20 20 20 20 20 20 20 20 73 4e 43 2e 70  .          sNC.p
a090: 53 72 63 4c 69 73 74 20 3d 20 70 53 2d 3e 70 53  SrcList = pS->pS
a0a0: 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73 4e  rc;.          sN
a0b0: 43 2e 70 4e 65 78 74 20 3d 20 70 4e 43 3b 0a 20  C.pNext = pNC;. 
a0c0: 20 20 20 20 20 20 20 20 20 73 4e 43 2e 70 50 61           sNC.pPa
a0d0: 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73  rse = pNC->pPars
a0e0: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79  e;.          zTy
a0f0: 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28  pe = columnType(
a100: 26 73 4e 43 2c 20 70 2c 26 7a 4f 72 69 67 44 62  &sNC, p,&zOrigDb
a110: 2c 26 7a 4f 72 69 67 54 61 62 2c 26 7a 4f 72 69  ,&zOrigTab,&zOri
a120: 67 43 6f 6c 2c 20 26 65 73 74 57 69 64 74 68 29  gCol, &estWidth)
a130: 3b 20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  ; .        }.   
a140: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 41 4c 57     }else if( ALW
a150: 41 59 53 28 70 54 61 62 2d 3e 70 53 63 68 65 6d  AYS(pTab->pSchem
a160: 61 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  a) ){.        /*
a170: 20 41 20 72 65 61 6c 20 74 61 62 6c 65 20 2a 2f   A real table */
a180: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
a190: 20 21 70 53 20 29 3b 0a 20 20 20 20 20 20 20 20   !pS );.        
a1a0: 69 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f  if( iCol<0 ) iCo
a1b0: 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b  l = pTab->iPKey;
a1c0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
a1d0: 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43   iCol==-1 || (iC
a1e0: 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54  ol>=0 && iCol<pT
a1f0: 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 23 69 66  ab->nCol) );.#if
a200: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
a210: 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54  E_COLUMN_METADAT
a220: 41 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 43  A.        if( iC
a230: 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ol<0 ){.        
a240: 20 20 7a 54 79 70 65 20 3d 20 22 49 4e 54 45 47    zType = "INTEG
a250: 45 52 22 3b 0a 20 20 20 20 20 20 20 20 20 20 7a  ER";.          z
a260: 4f 72 69 67 43 6f 6c 20 3d 20 22 72 6f 77 69 64  OrigCol = "rowid
a270: 22 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  ";.        }else
a280: 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79 70  {.          zTyp
a290: 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  e = pTab->aCol[i
a2a0: 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a 20 20 20 20  Col].zType;.    
a2b0: 20 20 20 20 20 20 7a 4f 72 69 67 43 6f 6c 20 3d        zOrigCol =
a2c0: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
a2d0: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ].zName;.       
a2e0: 20 20 20 65 73 74 57 69 64 74 68 20 3d 20 70 54     estWidth = pT
a2f0: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 73  ab->aCol[iCol].s
a300: 7a 45 73 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  zEst;.        }.
a310: 20 20 20 20 20 20 20 20 7a 4f 72 69 67 54 61 62          zOrigTab
a320: 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a   = pTab->zName;.
a330: 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 43 2d          if( pNC-
a340: 3e 70 50 61 72 73 65 20 29 7b 0a 20 20 20 20 20  >pParse ){.     
a350: 20 20 20 20 20 69 6e 74 20 69 44 62 20 3d 20 73       int iDb = s
a360: 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e  qlite3SchemaToIn
a370: 64 65 78 28 70 4e 43 2d 3e 70 50 61 72 73 65 2d  dex(pNC->pParse-
a380: 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65  >db, pTab->pSche
a390: 6d 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7a  ma);.          z
a3a0: 4f 72 69 67 44 62 20 3d 20 70 4e 43 2d 3e 70 50  OrigDb = pNC->pP
a3b0: 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44  arse->db->aDb[iD
a3c0: 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  b].zName;.      
a3d0: 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 20 20    }.#else.      
a3e0: 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a    if( iCol<0 ){.
a3f0: 20 20 20 20 20 20 20 20 20 20 7a 54 79 70 65 20            zType 
a400: 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a 20 20 20  = "INTEGER";.   
a410: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
a420: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 70 54        zType = pT
a430: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a  ab->aCol[iCol].z
a440: 54 79 70 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Type;.          
a450: 65 73 74 57 69 64 74 68 20 3d 20 70 54 61 62 2d  estWidth = pTab-
a460: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 73 7a 45 73  >aCol[iCol].szEs
a470: 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e  t;.        }.#en
a480: 64 69 66 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  dif.      }.    
a490: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
a4a0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
a4b0: 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20  IT_SUBQUERY.    
a4c0: 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20  case TK_SELECT: 
a4d0: 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65  {.      /* The e
a4e0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 73  xpression is a s
a4f0: 75 62 2d 73 65 6c 65 63 74 2e 20 52 65 74 75 72  ub-select. Retur
a500: 6e 20 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f  n the declaratio
a510: 6e 20 74 79 70 65 20 61 6e 64 0a 20 20 20 20 20  n type and.     
a520: 20 2a 2a 20 6f 72 69 67 69 6e 20 69 6e 66 6f 20   ** origin info 
a530: 66 6f 72 20 74 68 65 20 73 69 6e 67 6c 65 20 63  for the single c
a540: 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 72 65 73  olumn in the res
a550: 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 53  ult set of the S
a560: 45 4c 45 43 54 0a 20 20 20 20 20 20 2a 2a 20 73  ELECT.      ** s
a570: 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20  tatement..      
a580: 2a 2f 0a 20 20 20 20 20 20 4e 61 6d 65 43 6f 6e  */.      NameCon
a590: 74 65 78 74 20 73 4e 43 3b 0a 20 20 20 20 20 20  text sNC;.      
a5a0: 53 65 6c 65 63 74 20 2a 70 53 20 3d 20 70 45 78  Select *pS = pEx
a5b0: 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 3b 0a 20  pr->x.pSelect;. 
a5c0: 20 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70       Expr *p = p
a5d0: 53 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e  S->pEList->a[0].
a5e0: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73  pExpr;.      ass
a5f0: 65 72 74 28 20 45 78 70 72 48 61 73 50 72 6f 70  ert( ExprHasProp
a600: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78  erty(pExpr, EP_x
a610: 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20  IsSelect) );.   
a620: 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20     sNC.pSrcList 
a630: 3d 20 70 53 2d 3e 70 53 72 63 3b 0a 20 20 20 20  = pS->pSrc;.    
a640: 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20 70 4e    sNC.pNext = pN
a650: 43 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70 50 61  C;.      sNC.pPa
a660: 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73  rse = pNC->pPars
a670: 65 3b 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d  e;.      zType =
a680: 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43   columnType(&sNC
a690: 2c 20 70 2c 20 26 7a 4f 72 69 67 44 62 2c 20 26  , p, &zOrigDb, &
a6a0: 7a 4f 72 69 67 54 61 62 2c 20 26 7a 4f 72 69 67  zOrigTab, &zOrig
a6b0: 43 6f 6c 2c 20 26 65 73 74 57 69 64 74 68 29 3b  Col, &estWidth);
a6c0: 20 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20   .      break;. 
a6d0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
a6e0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
a6f0: 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54  NABLE_COLUMN_MET
a700: 41 44 41 54 41 20 20 0a 20 20 69 66 28 20 70 7a  ADATA  .  if( pz
a710: 4f 72 69 67 44 62 20 29 7b 0a 20 20 20 20 61 73  OrigDb ){.    as
a720: 73 65 72 74 28 20 70 7a 4f 72 69 67 54 61 62 20  sert( pzOrigTab 
a730: 26 26 20 70 7a 4f 72 69 67 43 6f 6c 20 29 3b 0a  && pzOrigCol );.
a740: 20 20 20 20 2a 70 7a 4f 72 69 67 44 62 20 3d 20      *pzOrigDb = 
a750: 7a 4f 72 69 67 44 62 3b 0a 20 20 20 20 2a 70 7a  zOrigDb;.    *pz
a760: 4f 72 69 67 54 61 62 20 3d 20 7a 4f 72 69 67 54  OrigTab = zOrigT
a770: 61 62 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67 43  ab;.    *pzOrigC
a780: 6f 6c 20 3d 20 7a 4f 72 69 67 43 6f 6c 3b 0a 20  ol = zOrigCol;. 
a790: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20   }.#endif.  if( 
a7a0: 70 45 73 74 57 69 64 74 68 20 29 20 2a 70 45 73  pEstWidth ) *pEs
a7b0: 74 57 69 64 74 68 20 3d 20 65 73 74 57 69 64 74  tWidth = estWidt
a7c0: 68 3b 0a 20 20 72 65 74 75 72 6e 20 7a 54 79 70  h;.  return zTyp
a7d0: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  e;.}../*.** Gene
a7e0: 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77  rate code that w
a7f0: 69 6c 6c 20 74 65 6c 6c 20 74 68 65 20 56 44 42  ill tell the VDB
a800: 45 20 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f  E the declaratio
a810: 6e 20 74 79 70 65 73 20 6f 66 20 63 6f 6c 75 6d  n types of colum
a820: 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 72 65 73  ns.** in the res
a830: 75 6c 74 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74  ult set..*/.stat
a840: 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65  ic void generate
a850: 43 6f 6c 75 6d 6e 54 79 70 65 73 28 0a 20 20 50  ColumnTypes(.  P
a860: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
a870: 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e     /* Parser con
a880: 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73  text */.  SrcLis
a890: 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 2f 2a  t *pTabList,  /*
a8a0: 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20   List of tables 
a8b0: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
a8c0: 45 4c 69 73 74 20 20 20 20 2f 2a 20 45 78 70 72  EList    /* Expr
a8d0: 65 73 73 69 6f 6e 73 20 64 65 66 69 6e 69 6e 67  essions defining
a8e0: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
a8f0: 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  */.){.#ifndef SQ
a900: 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 43 4c 54 59  LITE_OMIT_DECLTY
a910: 50 45 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  PE.  Vdbe *v = p
a920: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
a930: 69 6e 74 20 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e  int i;.  NameCon
a940: 74 65 78 74 20 73 4e 43 3b 0a 20 20 73 4e 43 2e  text sNC;.  sNC.
a950: 70 53 72 63 4c 69 73 74 20 3d 20 70 54 61 62 4c  pSrcList = pTabL
a960: 69 73 74 3b 0a 20 20 73 4e 43 2e 70 50 61 72 73  ist;.  sNC.pPars
a970: 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 66 6f  e = pParse;.  fo
a980: 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d  r(i=0; i<pEList-
a990: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
a9a0: 20 20 45 78 70 72 20 2a 70 20 3d 20 70 45 4c 69    Expr *p = pELi
a9b0: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  st->a[i].pExpr;.
a9c0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
a9d0: 7a 54 79 70 65 3b 0a 23 69 66 64 65 66 20 53 51  zType;.#ifdef SQ
a9e0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55  LITE_ENABLE_COLU
a9f0: 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20 20 20 20  MN_METADATA.    
aa00: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72 69  const char *zOri
aa10: 67 44 62 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e  gDb = 0;.    con
aa20: 73 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 54 61  st char *zOrigTa
aa30: 62 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74  b = 0;.    const
aa40: 20 63 68 61 72 20 2a 7a 4f 72 69 67 43 6f 6c 20   char *zOrigCol 
aa50: 3d 20 30 3b 0a 20 20 20 20 7a 54 79 70 65 20 3d  = 0;.    zType =
aa60: 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43   columnType(&sNC
aa70: 2c 20 70 2c 20 26 7a 4f 72 69 67 44 62 2c 20 26  , p, &zOrigDb, &
aa80: 7a 4f 72 69 67 54 61 62 2c 20 26 7a 4f 72 69 67  zOrigTab, &zOrig
aa90: 43 6f 6c 2c 20 30 29 3b 0a 0a 20 20 20 20 2f 2a  Col, 0);..    /*
aaa0: 20 54 68 65 20 76 64 62 65 20 6d 75 73 74 20 6d   The vdbe must m
aab0: 61 6b 65 20 69 74 73 20 6f 77 6e 20 63 6f 70 79  ake its own copy
aac0: 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2d 74   of the column-t
aad0: 79 70 65 20 61 6e 64 20 6f 74 68 65 72 20 0a 20  ype and other . 
aae0: 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 73 70 65     ** column spe
aaf0: 63 69 66 69 63 20 73 74 72 69 6e 67 73 2c 20 69  cific strings, i
ab00: 6e 20 63 61 73 65 20 74 68 65 20 73 63 68 65 6d  n case the schem
ab10: 61 20 69 73 20 72 65 73 65 74 20 62 65 66 6f 72  a is reset befor
ab20: 65 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 76 69  e this.    ** vi
ab30: 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 69 73  rtual machine is
ab40: 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f   deleted..    */
ab50: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
ab60: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c  SetColName(v, i,
ab70: 20 43 4f 4c 4e 41 4d 45 5f 44 41 54 41 42 41 53   COLNAME_DATABAS
ab80: 45 2c 20 7a 4f 72 69 67 44 62 2c 20 53 51 4c 49  E, zOrigDb, SQLI
ab90: 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
aba0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
abb0: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
abc0: 4f 4c 4e 41 4d 45 5f 54 41 42 4c 45 2c 20 7a 4f  OLNAME_TABLE, zO
abd0: 72 69 67 54 61 62 2c 20 53 51 4c 49 54 45 5f 54  rigTab, SQLITE_T
abe0: 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73  RANSIENT);.    s
abf0: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
ac00: 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41  Name(v, i, COLNA
ac10: 4d 45 5f 43 4f 4c 55 4d 4e 2c 20 7a 4f 72 69 67  ME_COLUMN, zOrig
ac20: 43 6f 6c 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  Col, SQLITE_TRAN
ac30: 53 49 45 4e 54 29 3b 0a 23 65 6c 73 65 0a 20 20  SIENT);.#else.  
ac40: 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e    zType = column
ac50: 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 30 2c  Type(&sNC, p, 0,
ac60: 20 30 2c 20 30 2c 20 30 29 3b 0a 23 65 6e 64 69   0, 0, 0);.#endi
ac70: 66 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  f.    sqlite3Vdb
ac80: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69  eSetColName(v, i
ac90: 2c 20 43 4f 4c 4e 41 4d 45 5f 44 45 43 4c 54 59  , COLNAME_DECLTY
aca0: 50 45 2c 20 7a 54 79 70 65 2c 20 53 51 4c 49 54  PE, zType, SQLIT
acb0: 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
acc0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  }.#endif /* !def
acd0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
ace0: 5f 44 45 43 4c 54 59 50 45 29 20 2a 2f 0a 7d 0a  _DECLTYPE) */.}.
acf0: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
ad00: 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 74  code that will t
ad10: 65 6c 6c 20 74 68 65 20 56 44 42 45 20 74 68 65  ell the VDBE the
ad20: 20 6e 61 6d 65 73 20 6f 66 20 63 6f 6c 75 6d 6e   names of column
ad30: 73 0a 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75  s.** in the resu
ad40: 6c 74 20 73 65 74 2e 20 20 54 68 69 73 20 69 6e  lt set.  This in
ad50: 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65  formation is use
ad60: 64 20 74 6f 20 70 72 6f 76 69 64 65 20 74 68 65  d to provide the
ad70: 0a 2a 2a 20 61 7a 43 6f 6c 5b 5d 20 76 61 6c 75  .** azCol[] valu
ad80: 65 73 20 69 6e 20 74 68 65 20 63 61 6c 6c 62 61  es in the callba
ad90: 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ck..*/.static vo
ada0: 69 64 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d  id generateColum
adb0: 6e 4e 61 6d 65 73 28 0a 20 20 50 61 72 73 65 20  nNames(.  Parse 
adc0: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a  *pParse,      /*
add0: 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20   Parser context 
ade0: 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  */.  SrcList *pT
adf0: 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74  abList,  /* List
ae00: 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20   of tables */.  
ae10: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
ae20: 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
ae30: 6e 73 20 64 65 66 69 6e 69 6e 67 20 74 68 65 20  ns defining the 
ae40: 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 29 7b  result set */.){
ae50: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
ae60: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
ae70: 74 20 69 2c 20 6a 3b 0a 20 20 73 71 6c 69 74 65  t i, j;.  sqlite
ae80: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
ae90: 64 62 3b 0a 20 20 69 6e 74 20 66 75 6c 6c 4e 61  db;.  int fullNa
aea0: 6d 65 73 2c 20 73 68 6f 72 74 4e 61 6d 65 73 3b  mes, shortNames;
aeb0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
aec0: 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20  _OMIT_EXPLAIN.  
aed0: 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e  /* If this is an
aee0: 20 45 58 50 4c 41 49 4e 2c 20 73 6b 69 70 20 74   EXPLAIN, skip t
aef0: 68 69 73 20 73 74 65 70 20 2a 2f 0a 20 20 69 66  his step */.  if
af00: 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69  ( pParse->explai
af10: 6e 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  n ){.    return;
af20: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69  .  }.#endif..  i
af30: 66 28 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61  f( pParse->colNa
af40: 6d 65 73 53 65 74 20 7c 7c 20 4e 45 56 45 52 28  mesSet || NEVER(
af50: 76 3d 3d 30 29 20 7c 7c 20 64 62 2d 3e 6d 61 6c  v==0) || db->mal
af60: 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75  locFailed ) retu
af70: 72 6e 3b 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f  rn;.  pParse->co
af80: 6c 4e 61 6d 65 73 53 65 74 20 3d 20 31 3b 0a 20  lNamesSet = 1;. 
af90: 20 66 75 6c 6c 4e 61 6d 65 73 20 3d 20 28 64 62   fullNames = (db
afa0: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
afb0: 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d  _FullColNames)!=
afc0: 30 3b 0a 20 20 73 68 6f 72 74 4e 61 6d 65 73 20  0;.  shortNames 
afd0: 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  = (db->flags & S
afe0: 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61  QLITE_ShortColNa
aff0: 6d 65 73 29 21 3d 30 3b 0a 20 20 73 71 6c 69 74  mes)!=0;.  sqlit
b000: 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73  e3VdbeSetNumCols
b010: 28 76 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  (v, pEList->nExp
b020: 72 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  r);.  for(i=0; i
b030: 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  <pEList->nExpr; 
b040: 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  i++){.    Expr *
b050: 70 3b 0a 20 20 20 20 70 20 3d 20 70 45 4c 69 73  p;.    p = pELis
b060: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  t->a[i].pExpr;. 
b070: 20 20 20 69 66 28 20 4e 45 56 45 52 28 70 3d 3d     if( NEVER(p==
b080: 30 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  0) ) continue;. 
b090: 20 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 61     if( pEList->a
b0a0: 5b 69 5d 2e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20  [i].zName ){.   
b0b0: 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d     char *zName =
b0c0: 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e   pEList->a[i].zN
b0d0: 61 6d 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ame;.      sqlit
b0e0: 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
b0f0: 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e  (v, i, COLNAME_N
b100: 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20 53 51 4c 49  AME, zName, SQLI
b110: 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
b120: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 2d     }else if( (p-
b130: 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c  >op==TK_COLUMN |
b140: 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f  | p->op==TK_AGG_
b150: 43 4f 4c 55 4d 4e 29 20 26 26 20 70 54 61 62 4c  COLUMN) && pTabL
b160: 69 73 74 20 29 7b 0a 20 20 20 20 20 20 54 61 62  ist ){.      Tab
b170: 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 20 20  le *pTab;.      
b180: 63 68 61 72 20 2a 7a 43 6f 6c 3b 0a 20 20 20 20  char *zCol;.    
b190: 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e    int iCol = p->
b1a0: 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 66  iColumn;.      f
b1b0: 6f 72 28 6a 3d 30 3b 20 41 4c 57 41 59 53 28 6a  or(j=0; ALWAYS(j
b1c0: 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 29  <pTabList->nSrc)
b1d0: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
b1e0: 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  if( pTabList->a[
b1f0: 6a 5d 2e 69 43 75 72 73 6f 72 3d 3d 70 2d 3e 69  j].iCursor==p->i
b200: 54 61 62 6c 65 20 29 20 62 72 65 61 6b 3b 0a 20  Table ) break;. 
b210: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
b220: 65 72 74 28 20 6a 3c 70 54 61 62 4c 69 73 74 2d  ert( j<pTabList-
b230: 3e 6e 53 72 63 20 29 3b 0a 20 20 20 20 20 20 70  >nSrc );.      p
b240: 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e  Tab = pTabList->
b250: 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20  a[j].pTab;.     
b260: 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43   if( iCol<0 ) iC
b270: 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79  ol = pTab->iPKey
b280: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
b290: 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f  iCol==-1 || (iCo
b2a0: 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61  l>=0 && iCol<pTa
b2b0: 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20 20 20  b->nCol) );.    
b2c0: 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a    if( iCol<0 ){.
b2d0: 20 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 22          zCol = "
b2e0: 72 6f 77 69 64 22 3b 0a 20 20 20 20 20 20 7d 65  rowid";.      }e
b2f0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f  lse{.        zCo
b300: 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  l = pTab->aCol[i
b310: 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  Col].zName;.    
b320: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 73    }.      if( !s
b330: 68 6f 72 74 4e 61 6d 65 73 20 26 26 20 21 66 75  hortNames && !fu
b340: 6c 6c 4e 61 6d 65 73 20 29 7b 0a 20 20 20 20 20  llNames ){.     
b350: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
b360: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
b370: 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 0a 20 20  OLNAME_NAME, .  
b380: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
b390: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 45  3DbStrDup(db, pE
b3a0: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e  List->a[i].zSpan
b3b0: 29 2c 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49  ), SQLITE_DYNAMI
b3c0: 43 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  C);.      }else 
b3d0: 69 66 28 20 66 75 6c 6c 4e 61 6d 65 73 20 29 7b  if( fullNames ){
b3e0: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a  .        char *z
b3f0: 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Name = 0;.      
b400: 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
b410: 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73  3MPrintf(db, "%s
b420: 2e 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  .%s", pTab->zNam
b430: 65 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 20 20  e, zCol);.      
b440: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
b450: 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f  ColName(v, i, CO
b460: 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d  LNAME_NAME, zNam
b470: 65 2c 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49  e, SQLITE_DYNAMI
b480: 43 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  C);.      }else{
b490: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
b4a0: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76  VdbeSetColName(v
b4b0: 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d  , i, COLNAME_NAM
b4c0: 45 2c 20 7a 43 6f 6c 2c 20 53 51 4c 49 54 45 5f  E, zCol, SQLITE_
b4d0: 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20  TRANSIENT);.    
b4e0: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
b4f0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
b500: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c  SetColName(v, i,
b510: 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 0a   COLNAME_NAME, .
b520: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
b530: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 45  3DbStrDup(db, pE
b540: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e  List->a[i].zSpan
b550: 29 2c 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49  ), SQLITE_DYNAMI
b560: 43 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  C);.    }.  }.  
b570: 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 54 79  generateColumnTy
b580: 70 65 73 28 70 50 61 72 73 65 2c 20 70 54 61 62  pes(pParse, pTab
b590: 4c 69 73 74 2c 20 70 45 4c 69 73 74 29 3b 0a 7d  List, pEList);.}
b5a0: 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20  ../*.** Given a 
b5b0: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  an expression li
b5c0: 73 74 20 28 77 68 69 63 68 20 69 73 20 72 65 61  st (which is rea
b5d0: 6c 6c 79 20 74 68 65 20 6c 69 73 74 20 6f 66 20  lly the list of 
b5e0: 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 74  expressions.** t
b5f0: 68 61 74 20 66 6f 72 6d 20 74 68 65 20 72 65 73  hat form the res
b600: 75 6c 74 20 73 65 74 20 6f 66 20 61 20 53 45 4c  ult set of a SEL
b610: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 29 20 63  ECT statement) c
b620: 6f 6d 70 75 74 65 20 61 70 70 72 6f 70 72 69 61  ompute appropria
b630: 74 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6e 61 6d  te.** column nam
b640: 65 73 20 66 6f 72 20 61 20 74 61 62 6c 65 20 74  es for a table t
b650: 68 61 74 20 77 6f 75 6c 64 20 68 6f 6c 64 20 74  hat would hold t
b660: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  he expression li
b670: 73 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 63 6f  st..**.** All co
b680: 6c 75 6d 6e 20 6e 61 6d 65 73 20 77 69 6c 6c 20  lumn names will 
b690: 62 65 20 75 6e 69 71 75 65 2e 0a 2a 2a 0a 2a 2a  be unique..**.**
b6a0: 20 4f 6e 6c 79 20 74 68 65 20 63 6f 6c 75 6d 6e   Only the column
b6b0: 20 6e 61 6d 65 73 20 61 72 65 20 63 6f 6d 70 75   names are compu
b6c0: 74 65 64 2e 20 20 43 6f 6c 75 6d 6e 2e 7a 54 79  ted.  Column.zTy
b6d0: 70 65 2c 20 43 6f 6c 75 6d 6e 2e 7a 43 6f 6c 6c  pe, Column.zColl
b6e0: 2c 0a 2a 2a 20 61 6e 64 20 6f 74 68 65 72 20 66  ,.** and other f
b6f0: 69 65 6c 64 73 20 6f 66 20 43 6f 6c 75 6d 6e 20  ields of Column 
b700: 61 72 65 20 7a 65 72 6f 65 64 2e 0a 2a 2a 0a 2a  are zeroed..**.*
b710: 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
b720: 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20  OK on success.  
b730: 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  If a memory allo
b740: 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 6f 63 63  cation error occ
b750: 75 72 73 2c 0a 2a 2a 20 73 74 6f 72 65 20 4e 55  urs,.** store NU
b760: 4c 4c 20 69 6e 20 2a 70 61 43 6f 6c 20 61 6e 64  LL in *paCol and
b770: 20 30 20 69 6e 20 2a 70 6e 43 6f 6c 20 61 6e 64   0 in *pnCol and
b780: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
b790: 4f 4d 45 4d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  OMEM..*/.static 
b7a0: 69 6e 74 20 73 65 6c 65 63 74 43 6f 6c 75 6d 6e  int selectColumn
b7b0: 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 0a 20  sFromExprList(. 
b7c0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
b7d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
b7e0: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
b7f0: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
b800: 74 2c 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72  t,       /* Expr
b810: 20 6c 69 73 74 20 66 72 6f 6d 20 77 68 69 63 68   list from which
b820: 20 74 6f 20 64 65 72 69 76 65 20 63 6f 6c 75 6d   to derive colum
b830: 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 69 31 36  n names */.  i16
b840: 20 2a 70 6e 43 6f 6c 2c 20 20 20 20 20 20 20 20   *pnCol,        
b850: 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
b860: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  e number of colu
b870: 6d 6e 73 20 68 65 72 65 20 2a 2f 0a 20 20 43 6f  mns here */.  Co
b880: 6c 75 6d 6e 20 2a 2a 70 61 43 6f 6c 20 20 20 20  lumn **paCol    
b890: 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
b8a0: 68 65 20 6e 65 77 20 63 6f 6c 75 6d 6e 20 6c 69  he new column li
b8b0: 73 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  st here */.){.  
b8c0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
b8d0: 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f 2a 20 44  arse->db;   /* D
b8e0: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
b8f0: 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a  on */.  int i, j
b900: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
b910: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
b920: 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 63 6e  ters */.  int cn
b930: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
b940: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 61        /* Index a
b950: 64 64 65 64 20 74 6f 20 6d 61 6b 65 20 74 68 65  dded to make the
b960: 20 6e 61 6d 65 20 75 6e 69 71 75 65 20 2a 2f 0a   name unique */.
b970: 20 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f 6c 2c 20    Column *aCol, 
b980: 2a 70 43 6f 6c 3b 20 20 20 20 20 20 20 20 2f 2a  *pCol;        /*
b990: 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65   For looping ove
b9a0: 72 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  r result columns
b9b0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 20   */.  int nCol; 
b9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b9d0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
b9e0: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65  olumns in the re
b9f0: 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 45 78  sult set */.  Ex
ba00: 70 72 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20  pr *p;          
ba10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70            /* Exp
ba20: 72 65 73 73 69 6f 6e 20 66 6f 72 20 61 20 73 69  ression for a si
ba30: 6e 67 6c 65 20 72 65 73 75 6c 74 20 63 6f 6c 75  ngle result colu
ba40: 6d 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e  mn */.  char *zN
ba50: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
ba60: 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 61      /* Column na
ba70: 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d  me */.  int nNam
ba80: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
ba90: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6e      /* Size of n
baa0: 61 6d 65 20 69 6e 20 7a 4e 61 6d 65 5b 5d 20 2a  ame in zName[] *
bab0: 2f 0a 0a 20 20 69 66 28 20 70 45 4c 69 73 74 20  /..  if( pEList 
bac0: 29 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70 45  ){.    nCol = pE
bad0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  List->nExpr;.   
bae0: 20 61 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 44   aCol = sqlite3D
baf0: 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
bb00: 73 69 7a 65 6f 66 28 61 43 6f 6c 5b 30 5d 29 2a  sizeof(aCol[0])*
bb10: 6e 43 6f 6c 29 3b 0a 20 20 20 20 74 65 73 74 63  nCol);.    testc
bb20: 61 73 65 28 20 61 43 6f 6c 3d 3d 30 20 29 3b 0a  ase( aCol==0 );.
bb30: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 43 6f    }else{.    nCo
bb40: 6c 20 3d 20 30 3b 0a 20 20 20 20 61 43 6f 6c 20  l = 0;.    aCol 
bb50: 3d 20 30 3b 0a 20 20 7d 0a 20 20 2a 70 6e 43 6f  = 0;.  }.  *pnCo
bb60: 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20 2a 70 61 43  l = nCol;.  *paC
bb70: 6f 6c 20 3d 20 61 43 6f 6c 3b 0a 0a 20 20 66 6f  ol = aCol;..  fo
bb80: 72 28 69 3d 30 2c 20 70 43 6f 6c 3d 61 43 6f 6c  r(i=0, pCol=aCol
bb90: 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70  ; i<nCol; i++, p
bba0: 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20 47  Col++){.    /* G
bbb0: 65 74 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74  et an appropriat
bbc0: 65 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 63  e name for the c
bbd0: 6f 6c 75 6d 6e 0a 20 20 20 20 2a 2f 0a 20 20 20  olumn.    */.   
bbe0: 20 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72   p = sqlite3Expr
bbf0: 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 45 4c 69  SkipCollate(pELi
bc00: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b  st->a[i].pExpr);
bc10: 0a 20 20 20 20 69 66 28 20 28 7a 4e 61 6d 65 20  .    if( (zName 
bc20: 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  = pEList->a[i].z
bc30: 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20  Name)!=0 ){.    
bc40: 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c 75    /* If the colu
bc50: 6d 6e 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 22  mn contains an "
bc60: 41 53 20 3c 6e 61 6d 65 3e 22 20 70 68 72 61 73  AS <name>" phras
bc70: 65 2c 20 75 73 65 20 3c 6e 61 6d 65 3e 20 61 73  e, use <name> as
bc80: 20 74 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20   the name */.   
bc90: 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74     zName = sqlit
bca0: 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 7a  e3DbStrDup(db, z
bcb0: 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Name);.    }else
bcc0: 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 43  {.      Expr *pC
bcd0: 6f 6c 45 78 70 72 20 3d 20 70 3b 20 20 2f 2a 20  olExpr = p;  /* 
bce0: 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74  The expression t
bcf0: 68 61 74 20 69 73 20 74 68 65 20 72 65 73 75 6c  hat is the resul
bd00: 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f  t column name */
bd10: 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54  .      Table *pT
bd20: 61 62 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ab;         /* T
bd30: 61 62 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20  able associated 
bd40: 77 69 74 68 20 74 68 69 73 20 65 78 70 72 65 73  with this expres
bd50: 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 77 68  sion */.      wh
bd60: 69 6c 65 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f  ile( pColExpr->o
bd70: 70 3d 3d 54 4b 5f 44 4f 54 20 29 7b 0a 20 20 20  p==TK_DOT ){.   
bd80: 20 20 20 20 20 70 43 6f 6c 45 78 70 72 20 3d 20       pColExpr = 
bd90: 70 43 6f 6c 45 78 70 72 2d 3e 70 52 69 67 68 74  pColExpr->pRight
bda0: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
bdb0: 28 20 70 43 6f 6c 45 78 70 72 21 3d 30 20 29 3b  ( pColExpr!=0 );
bdc0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
bdd0: 66 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f 70 3d  f( pColExpr->op=
bde0: 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 41 4c  =TK_COLUMN && AL
bdf0: 57 41 59 53 28 70 43 6f 6c 45 78 70 72 2d 3e 70  WAYS(pColExpr->p
be00: 54 61 62 21 3d 30 29 20 29 7b 0a 20 20 20 20 20  Tab!=0) ){.     
be10: 20 20 20 2f 2a 20 46 6f 72 20 63 6f 6c 75 6d 6e     /* For column
be20: 73 20 75 73 65 20 74 68 65 20 63 6f 6c 75 6d 6e  s use the column
be30: 20 6e 61 6d 65 20 6e 61 6d 65 20 2a 2f 0a 20 20   name name */.  
be40: 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d        int iCol =
be50: 20 70 43 6f 6c 45 78 70 72 2d 3e 69 43 6f 6c 75   pColExpr->iColu
be60: 6d 6e 3b 0a 20 20 20 20 20 20 20 20 70 54 61 62  mn;.        pTab
be70: 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 70 54 61   = pColExpr->pTa
be80: 62 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  b;.        if( i
be90: 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70  Col<0 ) iCol = p
bea0: 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20  Tab->iPKey;.    
beb0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69      zName = sqli
bec0: 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
bed0: 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %s",.           
bee0: 20 20 20 20 20 20 69 43 6f 6c 3e 3d 30 20 3f 20        iCol>=0 ? 
bef0: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
bf00: 2e 7a 4e 61 6d 65 20 3a 20 22 72 6f 77 69 64 22  .zName : "rowid"
bf10: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
bf20: 66 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f 70 3d  f( pColExpr->op=
bf30: 3d 54 4b 5f 49 44 20 29 7b 0a 20 20 20 20 20 20  =TK_ID ){.      
bf40: 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
bf50: 61 73 50 72 6f 70 65 72 74 79 28 70 43 6f 6c 45  asProperty(pColE
bf60: 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  xpr, EP_IntValue
bf70: 29 20 29 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61  ) );.        zNa
bf80: 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  me = sqlite3MPri
bf90: 6e 74 66 28 64 62 2c 20 22 25 73 22 2c 20 70 43  ntf(db, "%s", pC
bfa0: 6f 6c 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e  olExpr->u.zToken
bfb0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
bfc0: 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20 74          /* Use t
bfd0: 68 65 20 6f 72 69 67 69 6e 61 6c 20 74 65 78 74  he original text
bfe0: 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 65   of the column e
bff0: 78 70 72 65 73 73 69 6f 6e 20 61 73 20 69 74 73  xpression as its
c000: 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20   name */.       
c010: 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
c020: 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 22  MPrintf(db, "%s"
c030: 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  , pEList->a[i].z
c040: 53 70 61 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Span);.      }. 
c050: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64 62 2d     }.    if( db-
c060: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
c070: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
c080: 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b  Free(db, zName);
c090: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
c0a0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65    }..    /* Make
c0b0: 20 73 75 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e   sure the column
c0c0: 20 6e 61 6d 65 20 69 73 20 75 6e 69 71 75 65 2e   name is unique.
c0d0: 20 20 49 66 20 74 68 65 20 6e 61 6d 65 20 69 73    If the name is
c0e0: 20 6e 6f 74 20 75 6e 69 71 75 65 2c 0a 20 20 20   not unique,.   
c0f0: 20 2a 2a 20 61 70 70 65 6e 64 20 61 20 69 6e 74   ** append a int
c100: 65 67 65 72 20 74 6f 20 74 68 65 20 6e 61 6d 65  eger to the name
c110: 20 73 6f 20 74 68 61 74 20 69 74 20 62 65 63 6f   so that it beco
c120: 6d 65 73 20 75 6e 69 71 75 65 2e 0a 20 20 20 20  mes unique..    
c130: 2a 2f 0a 20 20 20 20 6e 4e 61 6d 65 20 3d 20 73  */.    nName = s
c140: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
c150: 4e 61 6d 65 29 3b 0a 20 20 20 20 66 6f 72 28 6a  Name);.    for(j
c160: 3d 63 6e 74 3d 30 3b 20 6a 3c 69 3b 20 6a 2b 2b  =cnt=0; j<i; j++
c170: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  ){.      if( sql
c180: 69 74 65 33 53 74 72 49 43 6d 70 28 61 43 6f 6c  ite3StrICmp(aCol
c190: 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65  [j].zName, zName
c1a0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
c1b0: 63 68 61 72 20 2a 7a 4e 65 77 4e 61 6d 65 3b 0a  char *zNewName;.
c1c0: 20 20 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20          int k;. 
c1d0: 20 20 20 20 20 20 20 66 6f 72 28 6b 3d 6e 4e 61         for(k=nNa
c1e0: 6d 65 2d 31 3b 20 6b 3e 31 20 26 26 20 73 71 6c  me-1; k>1 && sql
c1f0: 69 74 65 33 49 73 64 69 67 69 74 28 7a 4e 61 6d  ite3Isdigit(zNam
c200: 65 5b 6b 5d 29 3b 20 6b 2d 2d 29 7b 7d 0a 20 20  e[k]); k--){}.  
c210: 20 20 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 5b        if( zName[
c220: 6b 5d 3d 3d 27 3a 27 20 29 20 6e 4e 61 6d 65 20  k]==':' ) nName 
c230: 3d 20 6b 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61  = k;.        zNa
c240: 6d 65 5b 6e 4e 61 6d 65 5d 20 3d 20 30 3b 0a 20  me[nName] = 0;. 
c250: 20 20 20 20 20 20 20 7a 4e 65 77 4e 61 6d 65 20         zNewName 
c260: 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
c270: 28 64 62 2c 20 22 25 73 3a 25 64 22 2c 20 7a 4e  (db, "%s:%d", zN
c280: 61 6d 65 2c 20 2b 2b 63 6e 74 29 3b 0a 20 20 20  ame, ++cnt);.   
c290: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
c2a0: 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20  ee(db, zName);. 
c2b0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 7a         zName = z
c2c0: 4e 65 77 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  NewName;.       
c2d0: 20 6a 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20   j = -1;.       
c2e0: 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20   if( zName==0 ) 
c2f0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
c300: 20 20 20 7d 0a 20 20 20 20 70 43 6f 6c 2d 3e 7a     }.    pCol->z
c310: 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20  Name = zName;.  
c320: 7d 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  }.  if( db->mall
c330: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
c340: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 69 3b 20 6a 2b  for(j=0; j<i; j+
c350: 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
c360: 33 44 62 46 72 65 65 28 64 62 2c 20 61 43 6f 6c  3DbFree(db, aCol
c370: 5b 6a 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  [j].zName);.    
c380: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  }.    sqlite3DbF
c390: 72 65 65 28 64 62 2c 20 61 43 6f 6c 29 3b 0a 20  ree(db, aCol);. 
c3a0: 20 20 20 2a 70 61 43 6f 6c 20 3d 20 30 3b 0a 20     *paCol = 0;. 
c3b0: 20 20 20 2a 70 6e 43 6f 6c 20 3d 20 30 3b 0a 20     *pnCol = 0;. 
c3c0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
c3d0: 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 72 65  _NOMEM;.  }.  re
c3e0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
c3f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74 79 70  }../*.** Add typ
c400: 65 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 20  e and collation 
c410: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 61  information to a
c420: 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 62 61 73   column list bas
c430: 65 64 20 6f 6e 0a 2a 2a 20 61 20 53 45 4c 45 43  ed on.** a SELEC
c440: 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20  T statement..** 
c450: 0a 2a 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6c  .** The column l
c460: 69 73 74 20 70 72 65 73 75 6d 61 62 6c 79 20 63  ist presumably c
c470: 61 6d 65 20 66 72 6f 6d 20 73 65 6c 65 63 74 43  ame from selectC
c480: 6f 6c 75 6d 6e 4e 61 6d 65 73 46 72 6f 6d 45 78  olumnNamesFromEx
c490: 70 72 4c 69 73 74 28 29 2e 0a 2a 2a 20 54 68 65  prList()..** The
c4a0: 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 68 61 73   column list has
c4b0: 20 6f 6e 6c 79 20 6e 61 6d 65 73 2c 20 6e 6f 74   only names, not
c4c0: 20 74 79 70 65 73 20 6f 72 20 63 6f 6c 6c 61 74   types or collat
c4d0: 69 6f 6e 73 2e 20 20 54 68 69 73 0a 2a 2a 20 72  ions.  This.** r
c4e0: 6f 75 74 69 6e 65 20 67 6f 65 73 20 74 68 72 6f  outine goes thro
c4f0: 75 67 68 20 61 6e 64 20 61 64 64 73 20 74 68 65  ugh and adds the
c500: 20 74 79 70 65 73 20 61 6e 64 20 63 6f 6c 6c 61   types and colla
c510: 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  tions..**.** Thi
c520: 73 20 72 6f 75 74 69 6e 65 20 72 65 71 75 69 72  s routine requir
c530: 65 73 20 74 68 61 74 20 61 6c 6c 20 69 64 65 6e  es that all iden
c540: 74 69 66 69 65 72 73 20 69 6e 20 74 68 65 20 53  tifiers in the S
c550: 45 4c 45 43 54 0a 2a 2a 20 73 74 61 74 65 6d 65  ELECT.** stateme
c560: 6e 74 20 62 65 20 72 65 73 6f 6c 76 65 64 2e 0a  nt be resolved..
c570: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
c580: 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79  electAddColumnTy
c590: 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 0a  peAndCollation(.
c5a0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
c5b0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
c5c0: 6e 67 20 63 6f 6e 74 65 78 74 73 20 2a 2f 0a 20  ng contexts */. 
c5d0: 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20   Table *pTab,   
c5e0: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 63 6f         /* Add co
c5f0: 6c 75 6d 6e 20 74 79 70 65 20 69 6e 66 6f 72 6d  lumn type inform
c600: 61 74 69 6f 6e 20 74 6f 20 74 68 69 73 20 74 61  ation to this ta
c610: 62 6c 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ble */.  Select 
c620: 2a 70 53 65 6c 65 63 74 20 20 20 20 20 20 20 2f  *pSelect       /
c630: 2a 20 53 45 4c 45 43 54 20 75 73 65 64 20 74 6f  * SELECT used to
c640: 20 64 65 74 65 72 6d 69 6e 65 20 74 79 70 65 73   determine types
c650: 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 73 20   and collations 
c660: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
c670: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
c680: 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20  ;.  NameContext 
c690: 73 4e 43 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70  sNC;.  Column *p
c6a0: 43 6f 6c 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a  Col;.  CollSeq *
c6b0: 70 43 6f 6c 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a  pColl;.  int i;.
c6c0: 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 73 74 72    Expr *p;.  str
c6d0: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
c6e0: 6d 20 2a 61 3b 0a 20 20 75 36 34 20 73 7a 41 6c  m *a;.  u64 szAl
c6f0: 6c 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74  l = 0;..  assert
c700: 28 20 70 53 65 6c 65 63 74 21 3d 30 20 29 3b 0a  ( pSelect!=0 );.
c710: 20 20 61 73 73 65 72 74 28 20 28 70 53 65 6c 65    assert( (pSele
c720: 63 74 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  ct->selFlags & S
c730: 46 5f 52 65 73 6f 6c 76 65 64 29 21 3d 30 20 29  F_Resolved)!=0 )
c740: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62  ;.  assert( pTab
c750: 2d 3e 6e 43 6f 6c 3d 3d 70 53 65 6c 65 63 74 2d  ->nCol==pSelect-
c760: 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 7c  >pEList->nExpr |
c770: 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
c780: 65 64 20 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  ed );.  if( db->
c790: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72  mallocFailed ) r
c7a0: 65 74 75 72 6e 3b 0a 20 20 6d 65 6d 73 65 74 28  eturn;.  memset(
c7b0: 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28  &sNC, 0, sizeof(
c7c0: 73 4e 43 29 29 3b 0a 20 20 73 4e 43 2e 70 53 72  sNC));.  sNC.pSr
c7d0: 63 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d  cList = pSelect-
c7e0: 3e 70 53 72 63 3b 0a 20 20 61 20 3d 20 70 53 65  >pSrc;.  a = pSe
c7f0: 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b  lect->pEList->a;
c800: 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 43 6f 6c  .  for(i=0, pCol
c810: 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b 20 69 3c 70  =pTab->aCol; i<p
c820: 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20  Tab->nCol; i++, 
c830: 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 70 20 3d  pCol++){.    p =
c840: 20 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20   a[i].pExpr;.   
c850: 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 20 3d 20 73   pCol->zType = s
c860: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
c870: 62 2c 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73  b, columnType(&s
c880: 4e 43 2c 20 70 2c 30 2c 30 2c 30 2c 20 26 70 43  NC, p,0,0,0, &pC
c890: 6f 6c 2d 3e 73 7a 45 73 74 29 29 3b 0a 20 20 20  ol->szEst));.   
c8a0: 20 73 7a 41 6c 6c 20 2b 3d 20 70 43 6f 6c 2d 3e   szAll += pCol->
c8b0: 73 7a 45 73 74 3b 0a 20 20 20 20 70 43 6f 6c 2d  szEst;.    pCol-
c8c0: 3e 61 66 66 69 6e 69 74 79 20 3d 20 73 71 6c 69  >affinity = sqli
c8d0: 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28  te3ExprAffinity(
c8e0: 70 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c  p);.    if( pCol
c8f0: 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 30 20 29 20  ->affinity==0 ) 
c900: 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d  pCol->affinity =
c910: 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45   SQLITE_AFF_NONE
c920: 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71  ;.    pColl = sq
c930: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
c940: 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20  (pParse, p);.   
c950: 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20   if( pColl ){.  
c960: 20 20 20 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 20      pCol->zColl 
c970: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
c980: 70 28 64 62 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61  p(db, pColl->zNa
c990: 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  me);.    }.  }. 
c9a0: 20 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 20   pTab->szTabRow 
c9b0: 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  = sqlite3LogEst(
c9c0: 73 7a 41 6c 6c 2a 34 29 3b 0a 7d 0a 0a 2f 2a 0a  szAll*4);.}../*.
c9d0: 2a 2a 20 47 69 76 65 6e 20 61 20 53 45 4c 45 43  ** Given a SELEC
c9e0: 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 67 65 6e  T statement, gen
c9f0: 65 72 61 74 65 20 61 20 54 61 62 6c 65 20 73 74  erate a Table st
ca00: 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65 73  ructure that des
ca10: 63 72 69 62 65 73 0a 2a 2a 20 74 68 65 20 72 65  cribes.** the re
ca20: 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 61 74  sult set of that
ca30: 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 54 61 62 6c   SELECT..*/.Tabl
ca40: 65 20 2a 73 71 6c 69 74 65 33 52 65 73 75 6c 74  e *sqlite3Result
ca50: 53 65 74 4f 66 53 65 6c 65 63 74 28 50 61 72 73  SetOfSelect(Pars
ca60: 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63  e *pParse, Selec
ca70: 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 54  t *pSelect){.  T
ca80: 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 73 71  able *pTab;.  sq
ca90: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
caa0: 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 73 61  se->db;.  int sa
cab0: 76 65 64 46 6c 61 67 73 3b 0a 0a 20 20 73 61 76  vedFlags;..  sav
cac0: 65 64 46 6c 61 67 73 20 3d 20 64 62 2d 3e 66 6c  edFlags = db->fl
cad0: 61 67 73 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73  ags;.  db->flags
cae0: 20 26 3d 20 7e 53 51 4c 49 54 45 5f 46 75 6c 6c   &= ~SQLITE_Full
caf0: 43 6f 6c 4e 61 6d 65 73 3b 0a 20 20 64 62 2d 3e  ColNames;.  db->
cb00: 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
cb10: 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 3b 0a 20  ShortColNames;. 
cb20: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 50 72   sqlite3SelectPr
cb30: 65 70 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65  ep(pParse, pSele
cb40: 63 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 50  ct, 0);.  if( pP
cb50: 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 72 65 74  arse->nErr ) ret
cb60: 75 72 6e 20 30 3b 0a 20 20 77 68 69 6c 65 28 20  urn 0;.  while( 
cb70: 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 20  pSelect->pPrior 
cb80: 29 20 70 53 65 6c 65 63 74 20 3d 20 70 53 65 6c  ) pSelect = pSel
cb90: 65 63 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 64  ect->pPrior;.  d
cba0: 62 2d 3e 66 6c 61 67 73 20 3d 20 73 61 76 65 64  b->flags = saved
cbb0: 46 6c 61 67 73 3b 0a 20 20 70 54 61 62 20 3d 20  Flags;.  pTab = 
cbc0: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
cbd0: 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 54  ero(db, sizeof(T
cbe0: 61 62 6c 65 29 20 29 3b 0a 20 20 69 66 28 20 70  able) );.  if( p
cbf0: 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  Tab==0 ){.    re
cc00: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 2f 2a  turn 0;.  }.  /*
cc10: 20 54 68 65 20 73 71 6c 69 74 65 33 52 65 73 75   The sqlite3Resu
cc20: 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 29 20  ltSetOfSelect() 
cc30: 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 6e 20 63  is only used n c
cc40: 6f 6e 74 65 78 74 73 20 77 68 65 72 65 20 6c 6f  ontexts where lo
cc50: 6f 6b 61 73 69 64 65 0a 20 20 2a 2a 20 69 73 20  okaside.  ** is 
cc60: 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 61 73  disabled */.  as
cc70: 73 65 72 74 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73  sert( db->lookas
cc80: 69 64 65 2e 62 45 6e 61 62 6c 65 64 3d 3d 30 20  ide.bEnabled==0 
cc90: 29 3b 0a 20 20 70 54 61 62 2d 3e 6e 52 65 66 20  );.  pTab->nRef 
cca0: 3d 20 31 3b 0a 20 20 70 54 61 62 2d 3e 7a 4e 61  = 1;.  pTab->zNa
ccb0: 6d 65 20 3d 20 30 3b 0a 20 20 70 54 61 62 2d 3e  me = 0;.  pTab->
ccc0: 6e 52 6f 77 45 73 74 20 3d 20 31 30 34 38 35 37  nRowEst = 104857
ccd0: 36 3b 0a 20 20 73 65 6c 65 63 74 43 6f 6c 75 6d  6;.  selectColum
cce0: 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70  nsFromExprList(p
ccf0: 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2d 3e  Parse, pSelect->
cd00: 70 45 4c 69 73 74 2c 20 26 70 54 61 62 2d 3e 6e  pEList, &pTab->n
cd10: 43 6f 6c 2c 20 26 70 54 61 62 2d 3e 61 43 6f 6c  Col, &pTab->aCol
cd20: 29 3b 0a 20 20 73 65 6c 65 63 74 41 64 64 43 6f  );.  selectAddCo
cd30: 6c 75 6d 6e 54 79 70 65 41 6e 64 43 6f 6c 6c 61  lumnTypeAndColla
cd40: 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 70 54 61  tion(pParse, pTa
cd50: 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 70  b, pSelect);.  p
cd60: 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b  Tab->iPKey = -1;
cd70: 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
cd80: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 73  cFailed ){.    s
cd90: 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c  qlite3DeleteTabl
cda0: 65 28 64 62 2c 20 70 54 61 62 29 3b 0a 20 20 20  e(db, pTab);.   
cdb0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
cdc0: 20 72 65 74 75 72 6e 20 70 54 61 62 3b 0a 7d 0a   return pTab;.}.
cdd0: 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 56 44 42  ./*.** Get a VDB
cde0: 45 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20  E for the given 
cdf0: 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 2e 20  parser context. 
ce00: 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e   Create a new on
ce10: 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a  e if necessary..
ce20: 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
ce30: 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 4e 55  ccurs, return NU
ce40: 4c 4c 20 61 6e 64 20 6c 65 61 76 65 20 61 20 6d  LL and leave a m
ce50: 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65  essage in pParse
ce60: 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73 71 6c 69 74  ..*/.Vdbe *sqlit
ce70: 65 33 47 65 74 56 64 62 65 28 50 61 72 73 65 20  e3GetVdbe(Parse 
ce80: 2a 70 50 61 72 73 65 29 7b 0a 20 20 56 64 62 65  *pParse){.  Vdbe
ce90: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
cea0: 64 62 65 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20  dbe;.  if( v==0 
ceb0: 29 7b 0a 20 20 20 20 76 20 3d 20 70 50 61 72 73  ){.    v = pPars
cec0: 65 2d 3e 70 56 64 62 65 20 3d 20 73 71 6c 69 74  e->pVdbe = sqlit
ced0: 65 33 56 64 62 65 43 72 65 61 74 65 28 70 50 61  e3VdbeCreate(pPa
cee0: 72 73 65 2d 3e 64 62 29 3b 0a 23 69 66 6e 64 65  rse->db);.#ifnde
cef0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  f SQLITE_OMIT_TR
cf00: 41 43 45 0a 20 20 20 20 69 66 28 20 76 20 29 7b  ACE.    if( v ){
cf10: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
cf20: 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 54  beAddOp0(v, OP_T
cf30: 72 61 63 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  race);.    }.#en
cf40: 64 69 66 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  dif.  }.  return
cf50: 20 76 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f   v;.}.../*.** Co
cf60: 6d 70 75 74 65 20 74 68 65 20 69 4c 69 6d 69 74  mpute the iLimit
cf70: 20 61 6e 64 20 69 4f 66 66 73 65 74 20 66 69 65   and iOffset fie
cf80: 6c 64 73 20 6f 66 20 74 68 65 20 53 45 4c 45 43  lds of the SELEC
cf90: 54 20 62 61 73 65 64 20 6f 6e 20 74 68 65 0a 2a  T based on the.*
cfa0: 2a 20 70 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66  * pLimit and pOf
cfb0: 66 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e 73  fset expressions
cfc0: 2e 20 20 70 4c 69 6d 69 74 20 61 6e 64 20 70 4f  .  pLimit and pO
cfd0: 66 66 73 65 74 20 68 6f 6c 64 20 74 68 65 20 65  ffset hold the e
cfe0: 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 74 68  xpressions.** th
cff0: 61 74 20 61 70 70 65 61 72 20 69 6e 20 74 68 65  at appear in the
d000: 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20 73 74   original SQL st
d010: 61 74 65 6d 65 6e 74 20 61 66 74 65 72 20 74 68  atement after th
d020: 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53  e LIMIT and OFFS
d030: 45 54 0a 2a 2a 20 6b 65 79 77 6f 72 64 73 2e 20  ET.** keywords. 
d040: 20 4f 72 20 4e 55 4c 4c 20 69 66 20 74 68 6f 73   Or NULL if thos
d050: 65 20 6b 65 79 77 6f 72 64 73 20 61 72 65 20 6f  e keywords are o
d060: 6d 69 74 74 65 64 2e 20 69 4c 69 6d 69 74 20 61  mitted. iLimit a
d070: 6e 64 20 69 4f 66 66 73 65 74 20 0a 2a 2a 20 61  nd iOffset .** a
d080: 72 65 20 74 68 65 20 69 6e 74 65 67 65 72 20 6d  re the integer m
d090: 65 6d 6f 72 79 20 72 65 67 69 73 74 65 72 20 6e  emory register n
d0a0: 75 6d 62 65 72 73 20 66 6f 72 20 63 6f 75 6e 74  umbers for count
d0b0: 65 72 73 20 75 73 65 64 20 74 6f 20 63 6f 6d 70  ers used to comp
d0c0: 75 74 65 20 0a 2a 2a 20 74 68 65 20 6c 69 6d 69  ute .** the limi
d0d0: 74 20 61 6e 64 20 6f 66 66 73 65 74 2e 20 20 49  t and offset.  I
d0e0: 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6c 69  f there is no li
d0f0: 6d 69 74 20 61 6e 64 2f 6f 72 20 6f 66 66 73 65  mit and/or offse
d100: 74 2c 20 74 68 65 6e 20 0a 2a 2a 20 69 4c 69 6d  t, then .** iLim
d110: 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20 61  it and iOffset a
d120: 72 65 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 0a  re negative..**.
d130: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
d140: 63 68 61 6e 67 65 73 20 74 68 65 20 76 61 6c 75  changes the valu
d150: 65 73 20 6f 66 20 69 4c 69 6d 69 74 20 61 6e 64  es of iLimit and
d160: 20 69 4f 66 66 73 65 74 20 6f 6e 6c 79 20 69 66   iOffset only if
d170: 0a 2a 2a 20 61 20 6c 69 6d 69 74 20 6f 72 20 6f  .** a limit or o
d180: 66 66 73 65 74 20 69 73 20 64 65 66 69 6e 65 64  ffset is defined
d190: 20 62 79 20 70 4c 69 6d 69 74 20 61 6e 64 20 70   by pLimit and p
d1a0: 4f 66 66 73 65 74 2e 20 20 69 4c 69 6d 69 74 20  Offset.  iLimit 
d1b0: 61 6e 64 0a 2a 2a 20 69 4f 66 66 73 65 74 20 73  and.** iOffset s
d1c0: 68 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20  hould have been 
d1d0: 70 72 65 73 65 74 20 74 6f 20 61 70 70 72 6f 70  preset to approp
d1e0: 72 69 61 74 65 20 64 65 66 61 75 6c 74 20 76 61  riate default va
d1f0: 6c 75 65 73 0a 2a 2a 20 28 75 73 75 61 6c 6c 79  lues.** (usually
d200: 20 62 75 74 20 6e 6f 74 20 61 6c 77 61 79 73 20   but not always 
d210: 2d 31 29 20 70 72 69 6f 72 20 74 6f 20 63 61 6c  -1) prior to cal
d220: 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e  ling this routin
d230: 65 2e 0a 2a 2a 20 4f 6e 6c 79 20 69 66 20 70 4c  e..** Only if pL
d240: 69 6d 69 74 21 3d 30 20 6f 72 20 70 4f 66 66 73  imit!=0 or pOffs
d250: 65 74 21 3d 30 20 64 6f 20 74 68 65 20 6c 69 6d  et!=0 do the lim
d260: 69 74 20 72 65 67 69 73 74 65 72 73 20 67 65 74  it registers get
d270: 0a 2a 2a 20 72 65 64 65 66 69 6e 65 64 2e 20 20  .** redefined.  
d280: 54 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70  The UNION ALL op
d290: 65 72 61 74 6f 72 20 75 73 65 73 20 74 68 69 73  erator uses this
d2a0: 20 70 72 6f 70 65 72 74 79 20 74 6f 20 66 6f 72   property to for
d2b0: 63 65 0a 2a 2a 20 74 68 65 20 72 65 75 73 65 20  ce.** the reuse 
d2c0: 6f 66 20 74 68 65 20 73 61 6d 65 20 6c 69 6d 69  of the same limi
d2d0: 74 20 61 6e 64 20 6f 66 66 73 65 74 20 72 65 67  t and offset reg
d2e0: 69 73 74 65 72 73 20 61 63 72 6f 73 73 20 6d 75  isters across mu
d2f0: 6c 74 69 70 6c 65 0a 2a 2a 20 53 45 4c 45 43 54  ltiple.** SELECT
d300: 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a   statements..*/.
d310: 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 6d 70  static void comp
d320: 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72  uteLimitRegister
d330: 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  s(Parse *pParse,
d340: 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20   Select *p, int 
d350: 69 42 72 65 61 6b 29 7b 0a 20 20 56 64 62 65 20  iBreak){.  Vdbe 
d360: 2a 76 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4c  *v = 0;.  int iL
d370: 69 6d 69 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20  imit = 0;.  int 
d380: 69 4f 66 66 73 65 74 3b 0a 20 20 69 6e 74 20 61  iOffset;.  int a
d390: 64 64 72 31 2c 20 6e 3b 0a 20 20 69 66 28 20 70  ddr1, n;.  if( p
d3a0: 2d 3e 69 4c 69 6d 69 74 20 29 20 72 65 74 75 72  ->iLimit ) retur
d3b0: 6e 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 22  n;..  /* .  ** "
d3c0: 4c 49 4d 49 54 20 2d 31 22 20 61 6c 77 61 79 73  LIMIT -1" always
d3d0: 20 73 68 6f 77 73 20 61 6c 6c 20 72 6f 77 73 2e   shows all rows.
d3e0: 20 20 54 68 65 72 65 20 69 73 20 73 6f 6d 65 0a    There is some.
d3f0: 20 20 2a 2a 20 63 6f 6e 74 72 6f 76 65 72 73 79    ** controversy
d400: 20 61 62 6f 75 74 20 77 68 61 74 20 74 68 65 20   about what the 
d410: 63 6f 72 72 65 63 74 20 62 65 68 61 76 69 6f 72  correct behavior
d420: 20 73 68 6f 75 6c 64 20 62 65 2e 0a 20 20 2a 2a   should be..  **
d430: 20 54 68 65 20 63 75 72 72 65 6e 74 20 69 6d 70   The current imp
d440: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 6e 74 65  lementation inte
d450: 72 70 72 65 74 73 20 22 4c 49 4d 49 54 20 30 22  rprets "LIMIT 0"
d460: 20 74 6f 20 6d 65 61 6e 0a 20 20 2a 2a 20 6e 6f   to mean.  ** no
d470: 20 72 6f 77 73 2e 0a 20 20 2a 2f 0a 20 20 73 71   rows..  */.  sq
d480: 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c  lite3ExprCacheCl
d490: 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 61  ear(pParse);.  a
d4a0: 73 73 65 72 74 28 20 70 2d 3e 70 4f 66 66 73 65  ssert( p->pOffse
d4b0: 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70 4c 69 6d 69  t==0 || p->pLimi
d4c0: 74 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d  t!=0 );.  if( p-
d4d0: 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 70  >pLimit ){.    p
d4e0: 2d 3e 69 4c 69 6d 69 74 20 3d 20 69 4c 69 6d 69  ->iLimit = iLimi
d4f0: 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  t = ++pParse->nM
d500: 65 6d 3b 0a 20 20 20 20 76 20 3d 20 73 71 6c 69  em;.    v = sqli
d510: 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
d520: 65 29 3b 0a 20 20 20 20 69 66 28 20 4e 45 56 45  e);.    if( NEVE
d530: 52 28 76 3d 3d 30 29 20 29 20 72 65 74 75 72 6e  R(v==0) ) return
d540: 3b 20 20 2f 2a 20 56 44 42 45 20 73 68 6f 75 6c  ;  /* VDBE shoul
d550: 64 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  d have already b
d560: 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f  een allocated */
d570: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
d580: 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 2d  ExprIsInteger(p-
d590: 3e 70 4c 69 6d 69 74 2c 20 26 6e 29 20 29 7b 0a  >pLimit, &n) ){.
d5a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
d5b0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
d5c0: 74 65 67 65 72 2c 20 6e 2c 20 69 4c 69 6d 69 74  teger, n, iLimit
d5d0: 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
d5e0: 6d 65 6e 74 28 28 76 2c 20 22 4c 49 4d 49 54 20  ment((v, "LIMIT 
d5f0: 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20 20 20  counter"));.    
d600: 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20    if( n==0 ){.  
d610: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
d620: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
d630: 74 6f 2c 20 30 2c 20 69 42 72 65 61 6b 29 3b 0a  to, 0, iBreak);.
d640: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
d650: 6e 3e 3d 30 20 26 26 20 70 2d 3e 6e 53 65 6c 65  n>=0 && p->nSele
d660: 63 74 52 6f 77 3e 28 75 36 34 29 6e 20 29 7b 0a  ctRow>(u64)n ){.
d670: 20 20 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65          p->nSele
d680: 63 74 52 6f 77 20 3d 20 6e 3b 0a 20 20 20 20 20  ctRow = n;.     
d690: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
d6a0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
d6b0: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 2d 3e 70  ode(pParse, p->p
d6c0: 4c 69 6d 69 74 2c 20 69 4c 69 6d 69 74 29 3b 0a  Limit, iLimit);.
d6d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
d6e0: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4d 75  eAddOp1(v, OP_Mu
d6f0: 73 74 42 65 49 6e 74 2c 20 69 4c 69 6d 69 74 29  stBeInt, iLimit)
d700: 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
d710: 65 6e 74 28 28 76 2c 20 22 4c 49 4d 49 54 20 63  ent((v, "LIMIT c
d720: 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20 20 20 20  ounter"));.     
d730: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
d740: 70 32 28 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c  p2(v, OP_IfZero,
d750: 20 69 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b 29   iLimit, iBreak)
d760: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
d770: 70 2d 3e 70 4f 66 66 73 65 74 20 29 7b 0a 20 20  p->pOffset ){.  
d780: 20 20 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d      p->iOffset =
d790: 20 69 4f 66 66 73 65 74 20 3d 20 2b 2b 70 50 61   iOffset = ++pPa
d7a0: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
d7b0: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b   pParse->nMem++;
d7c0: 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61     /* Allocate a
d7d0: 6e 20 65 78 74 72 61 20 72 65 67 69 73 74 65 72  n extra register
d7e0: 20 66 6f 72 20 6c 69 6d 69 74 2b 6f 66 66 73 65   for limit+offse
d7f0: 74 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  t */.      sqlit
d800: 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
d810: 65 2c 20 70 2d 3e 70 4f 66 66 73 65 74 2c 20 69  e, p->pOffset, i
d820: 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 73  Offset);.      s
d830: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
d840: 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74  (v, OP_MustBeInt
d850: 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20  , iOffset);.    
d860: 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
d870: 2c 20 22 4f 46 46 53 45 54 20 63 6f 75 6e 74 65  , "OFFSET counte
d880: 72 22 29 29 3b 0a 20 20 20 20 20 20 61 64 64 72  r"));.      addr
d890: 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 = sqlite3VdbeA
d8a0: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 50 6f  ddOp1(v, OP_IfPo
d8b0: 73 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 20  s, iOffset);.   
d8c0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
d8d0: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
d8e0: 65 72 2c 20 30 2c 20 69 4f 66 66 73 65 74 29 3b  er, 0, iOffset);
d8f0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
d900: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
d910: 64 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  dr1);.      sqli
d920: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
d930: 20 4f 50 5f 41 64 64 2c 20 69 4c 69 6d 69 74 2c   OP_Add, iLimit,
d940: 20 69 4f 66 66 73 65 74 2c 20 69 4f 66 66 73 65   iOffset, iOffse
d950: 74 2b 31 29 3b 0a 20 20 20 20 20 20 56 64 62 65  t+1);.      Vdbe
d960: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c 49 4d  Comment((v, "LIM
d970: 49 54 2b 4f 46 46 53 45 54 22 29 29 3b 0a 20 20  IT+OFFSET"));.  
d980: 20 20 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69      addr1 = sqli
d990: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
d9a0: 20 4f 50 5f 49 66 50 6f 73 2c 20 69 4c 69 6d 69   OP_IfPos, iLimi
d9b0: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
d9c0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
d9d0: 50 5f 49 6e 74 65 67 65 72 2c 20 2d 31 2c 20 69  P_Integer, -1, i
d9e0: 4f 66 66 73 65 74 2b 31 29 3b 0a 20 20 20 20 20  Offset+1);.     
d9f0: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
da00: 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a  Here(v, addr1);.
da10: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66      }.  }.}..#if
da20: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
da30: 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
da40: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
da50: 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 63 6f  e appropriate co
da60: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
da70: 20 66 6f 72 20 74 68 65 20 69 43 6f 6c 2d 74 68   for the iCol-th
da80: 20 63 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a 20 74 68   column of.** th
da90: 65 20 72 65 73 75 6c 74 20 73 65 74 20 66 6f 72  e result set for
daa0: 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 2d 73 65   the compound-se
dab0: 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20 22  lect statement "
dac0: 70 22 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c  p".  Return NULL
dad0: 20 69 66 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d   if.** the colum
dae0: 6e 20 68 61 73 20 6e 6f 20 64 65 66 61 75 6c 74  n has no default
daf0: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
db00: 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  nce..**.** The c
db10: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
db20: 65 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 6f 75  e for the compou
db30: 6e 64 20 73 65 6c 65 63 74 20 69 73 20 74 61 6b  nd select is tak
db40: 65 6e 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 6c  en from the.** l
db50: 65 66 74 2d 6d 6f 73 74 20 74 65 72 6d 20 6f 66  eft-most term of
db60: 20 74 68 65 20 73 65 6c 65 63 74 20 74 68 61 74   the select that
db70: 20 68 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67   has a collating
db80: 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2f 0a 73 74   sequence..*/.st
db90: 61 74 69 63 20 43 6f 6c 6c 53 65 71 20 2a 6d 75  atic CollSeq *mu
dba0: 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71  ltiSelectCollSeq
dbb0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
dbc0: 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 69  Select *p, int i
dbd0: 43 6f 6c 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20  Col){.  CollSeq 
dbe0: 2a 70 52 65 74 3b 0a 20 20 69 66 28 20 70 2d 3e  *pRet;.  if( p->
dbf0: 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 70 52  pPrior ){.    pR
dc00: 65 74 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74  et = multiSelect
dc10: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
dc20: 70 2d 3e 70 50 72 69 6f 72 2c 20 69 43 6f 6c 29  p->pPrior, iCol)
dc30: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
dc40: 52 65 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61  Ret = 0;.  }.  a
dc50: 73 73 65 72 74 28 20 69 43 6f 6c 3e 3d 30 20 29  ssert( iCol>=0 )
dc60: 3b 0a 20 20 69 66 28 20 70 52 65 74 3d 3d 30 20  ;.  if( pRet==0 
dc70: 26 26 20 69 43 6f 6c 3c 70 2d 3e 70 45 4c 69 73  && iCol<p->pELis
dc80: 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  t->nExpr ){.    
dc90: 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33 45 78  pRet = sqlite3Ex
dca0: 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
dcb0: 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69  , p->pEList->a[i
dcc0: 43 6f 6c 5d 2e 70 45 78 70 72 29 3b 0a 20 20 7d  Col].pExpr);.  }
dcd0: 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a  .  return pRet;.
dce0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
dcf0: 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  TE_OMIT_COMPOUND
dd00: 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 2f 2a 20 46  _SELECT */../* F
dd10: 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65  orward reference
dd20: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d   */.static int m
dd30: 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42  ultiSelectOrderB
dd40: 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  y(.  Parse *pPar
dd50: 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61  se,        /* Pa
dd60: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
dd70: 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
dd80: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
dd90: 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45  right-most of SE
dda0: 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f 64 65  LECTs to be code
ddb0: 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  d */.  SelectDes
ddc0: 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a 20  t *pDest     /* 
ddd0: 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20  What to do with 
dde0: 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f  query results */
ddf0: 0a 29 3b 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51  .);...#ifndef SQ
de00: 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
de10: 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20  ND_SELECT./*.** 
de20: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
de30: 63 61 6c 6c 65 64 20 74 6f 20 70 72 6f 63 65 73  called to proces
de40: 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65  s a compound que
de50: 72 79 20 66 6f 72 6d 20 66 72 6f 6d 0a 2a 2a 20  ry form from.** 
de60: 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73 65 70 61  two or more sepa
de70: 72 61 74 65 20 71 75 65 72 69 65 73 20 75 73 69  rate queries usi
de80: 6e 67 20 55 4e 49 4f 4e 2c 20 55 4e 49 4f 4e 20  ng UNION, UNION 
de90: 41 4c 4c 2c 20 45 58 43 45 50 54 2c 20 6f 72 0a  ALL, EXCEPT, or.
dea0: 2a 2a 20 49 4e 54 45 52 53 45 43 54 0a 2a 2a 0a  ** INTERSECT.**.
deb0: 2a 2a 20 22 70 22 20 70 6f 69 6e 74 73 20 74 6f  ** "p" points to
dec0: 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
ded0: 6f 66 20 74 68 65 20 74 77 6f 20 71 75 65 72 69  of the two queri
dee0: 65 73 2e 20 20 74 68 65 20 71 75 65 72 79 20 6f  es.  the query o
def0: 6e 20 74 68 65 0a 2a 2a 20 6c 65 66 74 20 69 73  n the.** left is
df00: 20 70 2d 3e 70 50 72 69 6f 72 2e 20 20 54 68 65   p->pPrior.  The
df10: 20 6c 65 66 74 20 71 75 65 72 79 20 63 6f 75 6c   left query coul
df20: 64 20 61 6c 73 6f 20 62 65 20 61 20 63 6f 6d 70  d also be a comp
df30: 6f 75 6e 64 20 71 75 65 72 79 0a 2a 2a 20 69 6e  ound query.** in
df40: 20 77 68 69 63 68 20 63 61 73 65 20 74 68 69 73   which case this
df50: 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 62 65   routine will be
df60: 20 63 61 6c 6c 65 64 20 72 65 63 75 72 73 69 76   called recursiv
df70: 65 6c 79 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ely. .**.** The 
df80: 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 74  results of the t
df90: 6f 74 61 6c 20 71 75 65 72 79 20 61 72 65 20 74  otal query are t
dfa0: 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74  o be written int
dfb0: 6f 20 61 20 64 65 73 74 69 6e 61 74 69 6f 6e 0a  o a destination.
dfc0: 2a 2a 20 6f 66 20 74 79 70 65 20 65 44 65 73 74  ** of type eDest
dfd0: 20 77 69 74 68 20 70 61 72 61 6d 65 74 65 72 20   with parameter 
dfe0: 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78 61  iParm..**.** Exa
dff0: 6d 70 6c 65 20 31 3a 20 20 43 6f 6e 73 69 64 65  mple 1:  Conside
e000: 72 20 61 20 74 68 72 65 65 2d 77 61 79 20 63 6f  r a three-way co
e010: 6d 70 6f 75 6e 64 20 53 51 4c 20 73 74 61 74 65  mpound SQL state
e020: 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ment..**.**     
e030: 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31  SELECT a FROM t1
e040: 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 62 20   UNION SELECT b 
e050: 46 52 4f 4d 20 74 32 20 55 4e 49 4f 4e 20 53 45  FROM t2 UNION SE
e060: 4c 45 43 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a  LECT c FROM t3.*
e070: 2a 0a 2a 2a 20 54 68 69 73 20 73 74 61 74 65 6d  *.** This statem
e080: 65 6e 74 20 69 73 20 70 61 72 73 65 64 20 75 70  ent is parsed up
e090: 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
e0a0: 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 63 20  **     SELECT c 
e0b0: 46 52 4f 4d 20 74 33 0a 2a 2a 20 20 20 20 20 20  FROM t3.**      
e0c0: 7c 0a 2a 2a 20 20 20 20 20 20 60 2d 2d 2d 2d 2d  |.**      `-----
e0d0: 3e 20 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d  >  SELECT b FROM
e0e0: 20 74 32 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   t2.**          
e0f0: 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
e100: 20 20 20 20 20 20 20 20 20 20 60 2d 2d 2d 2d 2d            `-----
e110: 2d 3e 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f  ->  SELECT a FRO
e120: 4d 20 74 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61  M t1.**.** The a
e130: 72 72 6f 77 73 20 69 6e 20 74 68 65 20 64 69 61  rrows in the dia
e140: 67 72 61 6d 20 61 62 6f 76 65 20 72 65 70 72 65  gram above repre
e150: 73 65 6e 74 20 74 68 65 20 53 65 6c 65 63 74 2e  sent the Select.
e160: 70 50 72 69 6f 72 20 70 6f 69 6e 74 65 72 2e 0a  pPrior pointer..
e170: 2a 2a 20 53 6f 20 69 66 20 74 68 69 73 20 72 6f  ** So if this ro
e180: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
e190: 77 69 74 68 20 70 20 65 71 75 61 6c 20 74 6f 20  with p equal to 
e1a0: 74 68 65 20 74 33 20 71 75 65 72 79 2c 20 74 68  the t3 query, th
e1b0: 65 6e 0a 2a 2a 20 70 50 72 69 6f 72 20 77 69 6c  en.** pPrior wil
e1c0: 6c 20 62 65 20 74 68 65 20 74 32 20 71 75 65 72  l be the t2 quer
e1d0: 79 2e 20 20 70 2d 3e 6f 70 20 77 69 6c 6c 20 62  y.  p->op will b
e1e0: 65 20 54 4b 5f 55 4e 49 4f 4e 20 69 6e 20 74 68  e TK_UNION in th
e1f0: 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e  is case..**.** N
e200: 6f 74 69 63 65 20 74 68 61 74 20 62 65 63 61 75  otice that becau
e210: 73 65 20 6f 66 20 74 68 65 20 77 61 79 20 53 51  se of the way SQ
e220: 4c 69 74 65 20 70 61 72 73 65 73 20 63 6f 6d 70  Lite parses comp
e230: 6f 75 6e 64 20 53 45 4c 45 43 54 73 2c 20 74 68  ound SELECTs, th
e240: 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c 20  e.** individual 
e250: 73 65 6c 65 63 74 73 20 61 6c 77 61 79 73 20 67  selects always g
e260: 72 6f 75 70 20 66 72 6f 6d 20 6c 65 66 74 20 74  roup from left t
e270: 6f 20 72 69 67 68 74 2e 0a 2a 2f 0a 73 74 61 74  o right..*/.stat
e280: 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65  ic int multiSele
e290: 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ct(.  Parse *pPa
e2a0: 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  rse,        /* P
e2b0: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
e2c0: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
e2d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
e2e0: 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53   right-most of S
e2f0: 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f 64  ELECTs to be cod
e300: 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  ed */.  SelectDe
e310: 73 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a  st *pDest     /*
e320: 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68   What to do with
e330: 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a   query results *
e340: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
e350: 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 2f 2a 20  SQLITE_OK;   /* 
e360: 53 75 63 63 65 73 73 20 63 6f 64 65 20 66 72 6f  Success code fro
e370: 6d 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  m a subroutine *
e380: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69  /.  Select *pPri
e390: 6f 72 3b 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f  or;       /* Ano
e3a0: 74 68 65 72 20 53 45 4c 45 43 54 20 69 6d 6d 65  ther SELECT imme
e3b0: 64 69 61 74 65 6c 79 20 74 6f 20 6f 75 72 20 6c  diately to our l
e3c0: 65 66 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  eft */.  Vdbe *v
e3d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
e3e0: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
e3f0: 74 6f 20 74 68 69 73 20 56 44 42 45 20 2a 2f 0a  to this VDBE */.
e400: 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73    SelectDest des
e410: 74 3b 20 20 20 20 20 20 2f 2a 20 41 6c 74 65 72  t;      /* Alter
e420: 6e 61 74 69 76 65 20 64 61 74 61 20 64 65 73 74  native data dest
e430: 69 6e 61 74 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c  ination */.  Sel
e440: 65 63 74 20 2a 70 44 65 6c 65 74 65 20 3d 20 30  ect *pDelete = 0
e450: 3b 20 20 2f 2a 20 43 68 61 69 6e 20 6f 66 20 73  ;  /* Chain of s
e460: 69 6d 70 6c 65 20 73 65 6c 65 63 74 73 20 74 6f  imple selects to
e470: 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20 73 71 6c   delete */.  sql
e480: 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20  ite3 *db;       
e490: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
e4a0: 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 23 69 66  onnection */.#if
e4b0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
e4c0: 5f 45 58 50 4c 41 49 4e 0a 20 20 69 6e 74 20 69  _EXPLAIN.  int i
e4d0: 53 75 62 31 3b 20 20 20 20 20 20 20 20 20 20 20  Sub1;           
e4e0: 20 2f 2a 20 45 51 50 20 69 64 20 6f 66 20 6c 65   /* EQP id of le
e4f0: 66 74 2d 68 61 6e 64 20 71 75 65 72 79 20 2a 2f  ft-hand query */
e500: 0a 20 20 69 6e 74 20 69 53 75 62 32 3b 20 20 20  .  int iSub2;   
e510: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 51 50 20           /* EQP 
e520: 69 64 20 6f 66 20 72 69 67 68 74 2d 68 61 6e 64  id of right-hand
e530: 20 71 75 65 72 79 20 2a 2f 0a 23 65 6e 64 69 66   query */.#endif
e540: 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
e550: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 4f 52 44   there is no ORD
e560: 45 52 20 42 59 20 6f 72 20 4c 49 4d 49 54 20 63  ER BY or LIMIT c
e570: 6c 61 75 73 65 20 6f 6e 20 70 72 69 6f 72 20 53  lause on prior S
e580: 45 4c 45 43 54 73 2e 20 20 4f 6e 6c 79 0a 20 20  ELECTs.  Only.  
e590: 2a 2a 20 74 68 65 20 6c 61 73 74 20 28 72 69 67  ** the last (rig
e5a0: 68 74 2d 6d 6f 73 74 29 20 53 45 4c 45 43 54 20  ht-most) SELECT 
e5b0: 69 6e 20 74 68 65 20 73 65 72 69 65 73 20 6d 61  in the series ma
e5c0: 79 20 68 61 76 65 20 61 6e 20 4f 52 44 45 52 20  y have an ORDER 
e5d0: 42 59 20 6f 72 20 4c 49 4d 49 54 2e 0a 20 20 2a  BY or LIMIT..  *
e5e0: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 20 26 26  /.  assert( p &&
e5f0: 20 70 2d 3e 70 50 72 69 6f 72 20 29 3b 20 20 2f   p->pPrior );  /
e600: 2a 20 43 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  * Calling functi
e610: 6f 6e 20 67 75 61 72 61 6e 74 65 65 73 20 74 68  on guarantees th
e620: 69 73 20 6d 75 63 68 20 2a 2f 0a 20 20 64 62 20  is much */.  db 
e630: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
e640: 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69  pPrior = p->pPri
e650: 6f 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  or;.  assert( pP
e660: 72 69 6f 72 2d 3e 70 52 69 67 68 74 6d 6f 73 74  rior->pRightmost
e670: 21 3d 70 50 72 69 6f 72 20 29 3b 0a 20 20 61 73  !=pPrior );.  as
e680: 73 65 72 74 28 20 70 50 72 69 6f 72 2d 3e 70 52  sert( pPrior->pR
e690: 69 67 68 74 6d 6f 73 74 3d 3d 70 2d 3e 70 52 69  ightmost==p->pRi
e6a0: 67 68 74 6d 6f 73 74 20 29 3b 0a 20 20 64 65 73  ghtmost );.  des
e6b0: 74 20 3d 20 2a 70 44 65 73 74 3b 0a 20 20 69 66  t = *pDest;.  if
e6c0: 28 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72  ( pPrior->pOrder
e6d0: 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  By ){.    sqlite
e6e0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
e6f0: 2c 22 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  ,"ORDER BY claus
e700: 65 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20 61 66  e should come af
e710: 74 65 72 20 25 73 20 6e 6f 74 20 62 65 66 6f 72  ter %s not befor
e720: 65 22 2c 0a 20 20 20 20 20 20 73 65 6c 65 63 74  e",.      select
e730: 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a  OpName(p->op));.
e740: 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
e750: 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
e760: 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 69 66 28  t_end;.  }.  if(
e770: 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20   pPrior->pLimit 
e780: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
e790: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22 4c  rorMsg(pParse,"L
e7a0: 49 4d 49 54 20 63 6c 61 75 73 65 20 73 68 6f 75  IMIT clause shou
e7b0: 6c 64 20 63 6f 6d 65 20 61 66 74 65 72 20 25 73  ld come after %s
e7c0: 20 6e 6f 74 20 62 65 66 6f 72 65 22 2c 0a 20 20   not before",.  
e7d0: 20 20 20 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65      selectOpName
e7e0: 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63  (p->op));.    rc
e7f0: 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d   = 1;.    goto m
e800: 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
e810: 0a 20 20 7d 0a 0a 20 20 76 20 3d 20 73 71 6c 69  .  }..  v = sqli
e820: 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
e830: 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21  e);.  assert( v!
e840: 3d 30 20 29 3b 20 20 2f 2a 20 54 68 65 20 56 44  =0 );  /* The VD
e850: 42 45 20 61 6c 72 65 61 64 79 20 63 72 65 61 74  BE already creat
e860: 65 64 20 62 79 20 63 61 6c 6c 69 6e 67 20 66 75  ed by calling fu
e870: 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20  nction */..  /* 
e880: 43 72 65 61 74 65 20 74 68 65 20 64 65 73 74 69  Create the desti
e890: 6e 61 74 69 6f 6e 20 74 65 6d 70 6f 72 61 72 79  nation temporary
e8a0: 20 74 61 62 6c 65 20 69 66 20 6e 65 63 65 73 73   table if necess
e8b0: 61 72 79 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64  ary.  */.  if( d
e8c0: 65 73 74 2e 65 44 65 73 74 3d 3d 53 52 54 5f 45  est.eDest==SRT_E
e8d0: 70 68 65 6d 54 61 62 20 29 7b 0a 20 20 20 20 61  phemTab ){.    a
e8e0: 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
e8f0: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   );.    sqlite3V
e900: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
e910: 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 64  OpenEphemeral, d
e920: 65 73 74 2e 69 53 44 50 61 72 6d 2c 20 70 2d 3e  est.iSDParm, p->
e930: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a  pEList->nExpr);.
e940: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
e950: 68 61 6e 67 65 50 35 28 76 2c 20 42 54 52 45 45  hangeP5(v, BTREE
e960: 5f 55 4e 4f 52 44 45 52 45 44 29 3b 0a 20 20 20  _UNORDERED);.   
e970: 20 64 65 73 74 2e 65 44 65 73 74 20 3d 20 53 52   dest.eDest = SR
e980: 54 5f 54 61 62 6c 65 3b 0a 20 20 7d 0a 0a 20 20  T_Table;.  }..  
e990: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c  /* Make sure all
e9a0: 20 53 45 4c 45 43 54 73 20 69 6e 20 74 68 65 20   SELECTs in the 
e9b0: 73 74 61 74 65 6d 65 6e 74 20 68 61 76 65 20 74  statement have t
e9c0: 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f  he same number o
e9d0: 66 20 65 6c 65 6d 65 6e 74 73 0a 20 20 2a 2a 20  f elements.  ** 
e9e0: 69 6e 20 74 68 65 69 72 20 72 65 73 75 6c 74 20  in their result 
e9f0: 73 65 74 73 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  sets..  */.  ass
ea00: 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 26  ert( p->pEList &
ea10: 26 20 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74  & pPrior->pEList
ea20: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 45 4c   );.  if( p->pEL
ea30: 69 73 74 2d 3e 6e 45 78 70 72 21 3d 70 50 72 69  ist->nExpr!=pPri
ea40: 6f 72 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  or->pEList->nExp
ea50: 72 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  r ){.    if( p->
ea60: 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 56 61  selFlags & SF_Va
ea70: 6c 75 65 73 20 29 7b 0a 20 20 20 20 20 20 73 71  lues ){.      sq
ea80: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
ea90: 61 72 73 65 2c 20 22 61 6c 6c 20 56 41 4c 55 45  arse, "all VALUE
eaa0: 53 20 6d 75 73 74 20 68 61 76 65 20 74 68 65 20  S must have the 
eab0: 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  same number of t
eac0: 65 72 6d 73 22 29 3b 0a 20 20 20 20 7d 65 6c 73  erms");.    }els
ead0: 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
eae0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
eaf0: 20 22 53 45 4c 45 43 54 73 20 74 6f 20 74 68 65   "SELECTs to the
eb00: 20 6c 65 66 74 20 61 6e 64 20 72 69 67 68 74 20   left and right 
eb10: 6f 66 20 25 73 22 0a 20 20 20 20 20 20 20 20 22  of %s".        "
eb20: 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 68 65   do not have the
eb30: 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20   same number of 
eb40: 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 22 2c  result columns",
eb50: 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d   selectOpName(p-
eb60: 3e 6f 70 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  >op));.    }.   
eb70: 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74   rc = 1;.    got
eb80: 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
eb90: 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f  nd;.  }..  /* Co
eba0: 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 73 20 74  mpound SELECTs t
ebb0: 68 61 74 20 68 61 76 65 20 61 6e 20 4f 52 44 45  hat have an ORDE
ebc0: 52 20 42 59 20 63 6c 61 75 73 65 20 61 72 65 20  R BY clause are 
ebd0: 68 61 6e 64 6c 65 64 20 73 65 70 61 72 61 74 65  handled separate
ebe0: 6c 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ly..  */.  if( p
ebf0: 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ->pOrderBy ){.  
ec00: 20 20 72 65 74 75 72 6e 20 6d 75 6c 74 69 53 65    return multiSe
ec10: 6c 65 63 74 4f 72 64 65 72 42 79 28 70 50 61 72  lectOrderBy(pPar
ec20: 73 65 2c 20 70 2c 20 70 44 65 73 74 29 3b 0a 20  se, p, pDest);. 
ec30: 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74   }..  /* Generat
ec40: 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 6c  e code for the l
ec50: 65 66 74 20 61 6e 64 20 72 69 67 68 74 20 53 45  eft and right SE
ec60: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e  LECT statements.
ec70: 0a 20 20 2a 2f 0a 20 20 73 77 69 74 63 68 28 20  .  */.  switch( 
ec80: 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  p->op ){.    cas
ec90: 65 20 54 4b 5f 41 4c 4c 3a 20 7b 0a 20 20 20 20  e TK_ALL: {.    
eca0: 20 20 69 6e 74 20 61 64 64 72 20 3d 20 30 3b 0a    int addr = 0;.
ecb0: 20 20 20 20 20 20 69 6e 74 20 6e 4c 69 6d 69 74        int nLimit
ecc0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
ecd0: 21 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20  !pPrior->pLimit 
ece0: 29 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72 2d  );.      pPrior-
ecf0: 3e 69 4c 69 6d 69 74 20 3d 20 70 2d 3e 69 4c 69  >iLimit = p->iLi
ed00: 6d 69 74 3b 0a 20 20 20 20 20 20 70 50 72 69 6f  mit;.      pPrio
ed10: 72 2d 3e 69 4f 66 66 73 65 74 20 3d 20 70 2d 3e  r->iOffset = p->
ed20: 69 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70  iOffset;.      p
ed30: 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 3d 20  Prior->pLimit = 
ed40: 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20  p->pLimit;.     
ed50: 20 70 50 72 69 6f 72 2d 3e 70 4f 66 66 73 65 74   pPrior->pOffset
ed60: 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20   = p->pOffset;. 
ed70: 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49       explainSetI
ed80: 6e 74 65 67 65 72 28 69 53 75 62 31 2c 20 70 50  nteger(iSub1, pP
ed90: 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63  arse->iNextSelec
eda0: 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  tId);.      rc =
edb0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
edc0: 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26  Parse, pPrior, &
edd0: 64 65 73 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e  dest);.      p->
ede0: 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20  pLimit = 0;.    
edf0: 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30    p->pOffset = 0
ee00: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
ee10: 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d  {.        goto m
ee20: 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
ee30: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
ee40: 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20  ->pPrior = 0;.  
ee50: 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20      p->iLimit = 
ee60: 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 3b 0a  pPrior->iLimit;.
ee70: 20 20 20 20 20 20 70 2d 3e 69 4f 66 66 73 65 74        p->iOffset
ee80: 20 3d 20 70 50 72 69 6f 72 2d 3e 69 4f 66 66 73   = pPrior->iOffs
ee90: 65 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  et;.      if( p-
eea0: 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20  >iLimit ){.     
eeb0: 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
eec0: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
eed0: 50 5f 49 66 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69  P_IfZero, p->iLi
eee0: 6d 69 74 29 3b 0a 20 20 20 20 20 20 20 20 56 64  mit);.        Vd
eef0: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4a  beComment((v, "J
ef00: 75 6d 70 20 61 68 65 61 64 20 69 66 20 4c 49 4d  ump ahead if LIM
ef10: 49 54 20 72 65 61 63 68 65 64 22 29 29 3b 0a 20  IT reached"));. 
ef20: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 65 78 70       }.      exp
ef30: 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69  lainSetInteger(i
ef40: 53 75 62 32 2c 20 70 50 61 72 73 65 2d 3e 69 4e  Sub2, pParse->iN
ef50: 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20  extSelectId);.  
ef60: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
ef70: 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
ef80: 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20 20  , &dest);.      
ef90: 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51  testcase( rc!=SQ
efa0: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
efb0: 20 70 44 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50   pDelete = p->pP
efc0: 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70  rior;.      p->p
efd0: 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a  Prior = pPrior;.
efe0: 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74        p->nSelect
eff0: 52 6f 77 20 2b 3d 20 70 50 72 69 6f 72 2d 3e 6e  Row += pPrior->n
f000: 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20 20  SelectRow;.     
f010: 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70 4c 69   if( pPrior->pLi
f020: 6d 69 74 0a 20 20 20 20 20 20 20 26 26 20 73 71  mit.       && sq
f030: 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67  lite3ExprIsInteg
f040: 65 72 28 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69  er(pPrior->pLimi
f050: 74 2c 20 26 6e 4c 69 6d 69 74 29 0a 20 20 20 20  t, &nLimit).    
f060: 20 20 20 26 26 20 6e 4c 69 6d 69 74 3e 30 20 26     && nLimit>0 &
f070: 26 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20  & p->nSelectRow 
f080: 3e 20 28 75 36 34 29 6e 4c 69 6d 69 74 20 0a 20  > (u64)nLimit . 
f090: 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
f0a0: 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20  p->nSelectRow = 
f0b0: 6e 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 7d 0a  nLimit;.      }.
f0c0: 20 20 20 20 20 20 69 66 28 20 61 64 64 72 20 29        if( addr )
f0d0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
f0e0: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
f0f0: 20 61 64 64 72 29 3b 0a 20 20 20 20 20 20 7d 0a   addr);.      }.
f100: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
f110: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45   }.    case TK_E
f120: 58 43 45 50 54 3a 0a 20 20 20 20 63 61 73 65 20  XCEPT:.    case 
f130: 54 4b 5f 55 4e 49 4f 4e 3a 20 7b 0a 20 20 20 20  TK_UNION: {.    
f140: 20 20 69 6e 74 20 75 6e 69 6f 6e 54 61 62 3b 20    int unionTab; 
f150: 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d     /* Cursor num
f160: 62 65 72 20 6f 66 20 74 68 65 20 74 65 6d 70 6f  ber of the tempo
f170: 72 61 72 79 20 74 61 62 6c 65 20 68 6f 6c 64 69  rary table holdi
f180: 6e 67 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 20  ng result */.   
f190: 20 20 20 75 38 20 6f 70 20 3d 20 30 3b 20 20 20     u8 op = 0;   
f1a0: 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68      /* One of th
f1b0: 65 20 53 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e  e SRT_ operation
f1c0: 73 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 73 65  s to apply to se
f1d0: 6c 66 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  lf */.      int 
f1e0: 70 72 69 6f 72 4f 70 3b 20 20 20 20 20 2f 2a 20  priorOp;     /* 
f1f0: 54 68 65 20 53 52 54 5f 20 6f 70 65 72 61 74 69  The SRT_ operati
f200: 6f 6e 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 70  on to apply to p
f210: 72 69 6f 72 20 73 65 6c 65 63 74 73 20 2a 2f 0a  rior selects */.
f220: 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 69 6d        Expr *pLim
f230: 69 74 2c 20 2a 70 4f 66 66 73 65 74 3b 20 2f 2a  it, *pOffset; /*
f240: 20 53 61 76 65 64 20 76 61 6c 75 65 73 20 6f 66   Saved values of
f250: 20 70 2d 3e 6e 4c 69 6d 69 74 20 61 6e 64 20 70   p->nLimit and p
f260: 2d 3e 6e 4f 66 66 73 65 74 20 2a 2f 0a 20 20 20  ->nOffset */.   
f270: 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20     int addr;.   
f280: 20 20 20 53 65 6c 65 63 74 44 65 73 74 20 75 6e     SelectDest un
f290: 69 6f 6e 64 65 73 74 3b 0a 0a 20 20 20 20 20 20  iondest;..      
f2a0: 74 65 73 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d  testcase( p->op=
f2b0: 3d 54 4b 5f 45 58 43 45 50 54 20 29 3b 0a 20 20  =TK_EXCEPT );.  
f2c0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 2d      testcase( p-
f2d0: 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b  >op==TK_UNION );
f2e0: 0a 20 20 20 20 20 20 70 72 69 6f 72 4f 70 20 3d  .      priorOp =
f2f0: 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20   SRT_Union;.    
f300: 20 20 69 66 28 20 64 65 73 74 2e 65 44 65 73 74    if( dest.eDest
f310: 3d 3d 70 72 69 6f 72 4f 70 20 26 26 20 41 4c 57  ==priorOp && ALW
f320: 41 59 53 28 21 70 2d 3e 70 4c 69 6d 69 74 20 26  AYS(!p->pLimit &
f330: 26 21 70 2d 3e 70 4f 66 66 73 65 74 29 20 29 7b  &!p->pOffset) ){
f340: 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 63  .        /* We c
f350: 61 6e 20 72 65 75 73 65 20 61 20 74 65 6d 70 6f  an reuse a tempo
f360: 72 61 72 79 20 74 61 62 6c 65 20 67 65 6e 65 72  rary table gener
f370: 61 74 65 64 20 62 79 20 61 20 53 45 4c 45 43 54  ated by a SELECT
f380: 20 74 6f 20 6f 75 72 0a 20 20 20 20 20 20 20 20   to our.        
f390: 2a 2a 20 72 69 67 68 74 2e 0a 20 20 20 20 20 20  ** right..      
f3a0: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73    */.        ass
f3b0: 65 72 74 28 20 70 2d 3e 70 52 69 67 68 74 6d 6f  ert( p->pRightmo
f3c0: 73 74 21 3d 70 20 29 3b 20 20 2f 2a 20 43 61 6e  st!=p );  /* Can
f3d0: 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 66 6f 72   only happen for
f3e0: 20 6c 65 66 74 77 61 72 64 20 65 6c 65 6d 65 6e   leftward elemen
f3f0: 74 73 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ts.             
f400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f410: 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 61 20          ** of a 
f420: 33 2d 77 61 79 20 6f 72 20 6d 6f 72 65 20 63 6f  3-way or more co
f430: 6d 70 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20  mpound */.      
f440: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4c 69    assert( p->pLi
f450: 6d 69 74 3d 3d 30 20 29 3b 20 20 20 20 20 20 2f  mit==0 );      /
f460: 2a 20 4e 6f 74 20 61 6c 6c 6f 77 65 64 20 6f 6e  * Not allowed on
f470: 20 6c 65 66 74 77 61 72 64 20 65 6c 65 6d 65 6e   leftward elemen
f480: 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73  ts */.        as
f490: 73 65 72 74 28 20 70 2d 3e 70 4f 66 66 73 65 74  sert( p->pOffset
f4a0: 3d 3d 30 20 29 3b 20 20 20 20 20 2f 2a 20 4e 6f  ==0 );     /* No
f4b0: 74 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 6c 65 66  t allowed on lef
f4c0: 74 77 61 72 64 20 65 6c 65 6d 65 6e 74 73 20 2a  tward elements *
f4d0: 2f 0a 20 20 20 20 20 20 20 20 75 6e 69 6f 6e 54  /.        unionT
f4e0: 61 62 20 3d 20 64 65 73 74 2e 69 53 44 50 61 72  ab = dest.iSDPar
f4f0: 6d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  m;.      }else{.
f500: 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 77 69          /* We wi
f510: 6c 6c 20 6e 65 65 64 20 74 6f 20 63 72 65 61 74  ll need to creat
f520: 65 20 6f 75 72 20 6f 77 6e 20 74 65 6d 70 6f 72  e our own tempor
f530: 61 72 79 20 74 61 62 6c 65 20 74 6f 20 68 6f 6c  ary table to hol
f540: 64 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  d the.        **
f550: 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 72 65   intermediate re
f560: 73 75 6c 74 73 2e 0a 20 20 20 20 20 20 20 20 2a  sults..        *
f570: 2f 0a 20 20 20 20 20 20 20 20 75 6e 69 6f 6e 54  /.        unionT
f580: 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ab = pParse->nTa
f590: 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 61 73 73  b++;.        ass
f5a0: 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79  ert( p->pOrderBy
f5b0: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61  ==0 );.        a
f5c0: 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
f5d0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70  eAddOp2(v, OP_Op
f5e0: 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 75 6e 69  enEphemeral, uni
f5f0: 6f 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20  onTab, 0);.     
f600: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64     assert( p->ad
f610: 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d  drOpenEphm[0] ==
f620: 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 70   -1 );.        p
f630: 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30  ->addrOpenEphm[0
f640: 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20  ] = addr;.      
f650: 20 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 2d    p->pRightmost-
f660: 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f  >selFlags |= SF_
f670: 55 73 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20  UsesEphemeral;. 
f680: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
f690: 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20  ->pEList );.    
f6a0: 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f    }..      /* Co
f6b0: 64 65 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  de the SELECT st
f6c0: 61 74 65 6d 65 6e 74 73 20 74 6f 20 6f 75 72 20  atements to our 
f6d0: 6c 65 66 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20  left.      */.  
f6e0: 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50 72      assert( !pPr
f6f0: 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 29 3b  ior->pOrderBy );
f700: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65  .      sqlite3Se
f710: 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 75 6e  lectDestInit(&un
f720: 69 6f 6e 64 65 73 74 2c 20 70 72 69 6f 72 4f 70  iondest, priorOp
f730: 2c 20 75 6e 69 6f 6e 54 61 62 29 3b 0a 20 20 20  , unionTab);.   
f740: 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74     explainSetInt
f750: 65 67 65 72 28 69 53 75 62 31 2c 20 70 50 61 72  eger(iSub1, pPar
f760: 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49  se->iNextSelectI
f770: 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  d);.      rc = s
f780: 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
f790: 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 75 6e  rse, pPrior, &un
f7a0: 69 6f 6e 64 65 73 74 29 3b 0a 20 20 20 20 20 20  iondest);.      
f7b0: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
f7c0: 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
f7d0: 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d  ect_end;.      }
f7e0: 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20  ..      /* Code 
f7f0: 74 68 65 20 63 75 72 72 65 6e 74 20 53 45 4c 45  the current SELE
f800: 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 20  CT statement.   
f810: 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
f820: 70 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54  p->op==TK_EXCEPT
f830: 20 29 7b 0a 20 20 20 20 20 20 20 20 6f 70 20 3d   ){.        op =
f840: 20 53 52 54 5f 45 78 63 65 70 74 3b 0a 20 20 20   SRT_Except;.   
f850: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
f860: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 3d    assert( p->op=
f870: 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 20  =TK_UNION );.   
f880: 20 20 20 20 20 6f 70 20 3d 20 53 52 54 5f 55 6e       op = SRT_Un
f890: 69 6f 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ion;.      }.   
f8a0: 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30     p->pPrior = 0
f8b0: 3b 0a 20 20 20 20 20 20 70 4c 69 6d 69 74 20 3d  ;.      pLimit =
f8c0: 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20   p->pLimit;.    
f8d0: 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b    p->pLimit = 0;
f8e0: 0a 20 20 20 20 20 20 70 4f 66 66 73 65 74 20 3d  .      pOffset =
f8f0: 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20   p->pOffset;.   
f900: 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20     p->pOffset = 
f910: 30 3b 0a 20 20 20 20 20 20 75 6e 69 6f 6e 64 65  0;.      unionde
f920: 73 74 2e 65 44 65 73 74 20 3d 20 6f 70 3b 0a 20  st.eDest = op;. 
f930: 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49       explainSetI
f940: 6e 74 65 67 65 72 28 69 53 75 62 32 2c 20 70 50  nteger(iSub2, pP
f950: 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63  arse->iNextSelec
f960: 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  tId);.      rc =
f970: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
f980: 50 61 72 73 65 2c 20 70 2c 20 26 75 6e 69 6f 6e  Parse, p, &union
f990: 64 65 73 74 29 3b 0a 20 20 20 20 20 20 74 65 73  dest);.      tes
f9a0: 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54  tcase( rc!=SQLIT
f9b0: 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 2f 2a  E_OK );.      /*
f9c0: 20 51 75 65 72 79 20 66 6c 61 74 74 65 6e 69 6e   Query flattenin
f9d0: 67 20 69 6e 20 73 71 6c 69 74 65 33 53 65 6c 65  g in sqlite3Sele
f9e0: 63 74 28 29 20 6d 69 67 68 74 20 72 65 66 69 6c  ct() might refil
f9f0: 6c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2e 0a 20  l p->pOrderBy.. 
fa00: 20 20 20 20 20 2a 2a 20 42 65 20 73 75 72 65 20       ** Be sure 
fa10: 74 6f 20 64 65 6c 65 74 65 20 70 2d 3e 70 4f 72  to delete p->pOr
fa20: 64 65 72 42 79 2c 20 74 68 65 72 65 66 6f 72 65  derBy, therefore
fa30: 2c 20 74 6f 20 61 76 6f 69 64 20 61 20 6d 65 6d  , to avoid a mem
fa40: 6f 72 79 20 6c 65 61 6b 2e 20 2a 2f 0a 20 20 20  ory leak. */.   
fa50: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
fa60: 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  stDelete(db, p->
fa70: 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 20  pOrderBy);.     
fa80: 20 70 44 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50   pDelete = p->pP
fa90: 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70  rior;.      p->p
faa0: 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a  Prior = pPrior;.
fab0: 20 20 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42        p->pOrderB
fac0: 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28  y = 0;.      if(
fad0: 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e   p->op==TK_UNION
fae0: 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77   ) p->nSelectRow
faf0: 20 2b 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c   += pPrior->nSel
fb00: 65 63 74 52 6f 77 3b 0a 20 20 20 20 20 20 73 71  ectRow;.      sq
fb10: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
fb20: 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a  db, p->pLimit);.
fb30: 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20        p->pLimit 
fb40: 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  = pLimit;.      
fb50: 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f 66  p->pOffset = pOf
fb60: 66 73 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e 69  fset;.      p->i
fb70: 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20  Limit = 0;.     
fb80: 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b   p->iOffset = 0;
fb90: 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 6e 76 65  ..      /* Conve
fba0: 72 74 20 74 68 65 20 64 61 74 61 20 69 6e 20 74  rt the data in t
fbb0: 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  he temporary tab
fbc0: 6c 65 20 69 6e 74 6f 20 77 68 61 74 65 76 65 72  le into whatever
fbd0: 20 66 6f 72 6d 0a 20 20 20 20 20 20 2a 2a 20 69   form.      ** i
fbe0: 74 20 69 73 20 74 68 61 74 20 77 65 20 63 75 72  t is that we cur
fbf0: 72 65 6e 74 6c 79 20 6e 65 65 64 2e 0a 20 20 20  rently need..   
fc00: 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65     */.      asse
fc10: 72 74 28 20 75 6e 69 6f 6e 54 61 62 3d 3d 64 65  rt( unionTab==de
fc20: 73 74 2e 69 53 44 50 61 72 6d 20 7c 7c 20 64 65  st.iSDParm || de
fc30: 73 74 2e 65 44 65 73 74 21 3d 70 72 69 6f 72 4f  st.eDest!=priorO
fc40: 70 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64  p );.      if( d
fc50: 65 73 74 2e 65 44 65 73 74 21 3d 70 72 69 6f 72  est.eDest!=prior
fc60: 4f 70 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  Op ){.        in
fc70: 74 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c  t iCont, iBreak,
fc80: 20 69 53 74 61 72 74 3b 0a 20 20 20 20 20 20 20   iStart;.       
fc90: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69   assert( p->pELi
fca0: 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  st );.        if
fcb0: 28 20 64 65 73 74 2e 65 44 65 73 74 3d 3d 53 52  ( dest.eDest==SR
fcc0: 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20  T_Output ){.    
fcd0: 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 46        Select *pF
fce0: 69 72 73 74 20 3d 20 70 3b 0a 20 20 20 20 20 20  irst = p;.      
fcf0: 20 20 20 20 77 68 69 6c 65 28 20 70 46 69 72 73      while( pFirs
fd00: 74 2d 3e 70 50 72 69 6f 72 20 29 20 70 46 69 72  t->pPrior ) pFir
fd10: 73 74 20 3d 20 70 46 69 72 73 74 2d 3e 70 50 72  st = pFirst->pPr
fd20: 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 20 20 67  ior;.          g
fd30: 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d  enerateColumnNam
fd40: 65 73 28 70 50 61 72 73 65 2c 20 30 2c 20 70 46  es(pParse, 0, pF
fd50: 69 72 73 74 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  irst->pEList);. 
fd60: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
fd70: 20 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65   iBreak = sqlite
fd80: 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
fd90: 29 3b 0a 20 20 20 20 20 20 20 20 69 43 6f 6e 74  );.        iCont
fda0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
fdb0: 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
fdc0: 20 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74      computeLimit
fdd0: 52 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65  Registers(pParse
fde0: 2c 20 70 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20  , p, iBreak);.  
fdf0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
fe00: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65  eAddOp2(v, OP_Re
fe10: 77 69 6e 64 2c 20 75 6e 69 6f 6e 54 61 62 2c 20  wind, unionTab, 
fe20: 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20  iBreak);.       
fe30: 20 69 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65   iStart = sqlite
fe40: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
fe50: 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73 65 6c  (v);.        sel
fe60: 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61  ectInnerLoop(pPa
fe70: 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73  rse, p, p->pELis
fe80: 74 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 70 2d 3e  t, unionTab, p->
fe90: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 0a 20  pEList->nExpr,. 
fea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
feb0: 20 20 20 20 20 20 20 30 2c 20 30 2c 20 26 64 65         0, 0, &de
fec0: 73 74 2c 20 69 43 6f 6e 74 2c 20 69 42 72 65 61  st, iCont, iBrea
fed0: 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  k);.        sqli
fee0: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
fef0: 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20  bel(v, iCont);. 
ff00: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
ff10: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
ff20: 65 78 74 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69  ext, unionTab, i
ff30: 53 74 61 72 74 29 3b 0a 20 20 20 20 20 20 20 20  Start);.        
ff40: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
ff50: 76 65 4c 61 62 65 6c 28 76 2c 20 69 42 72 65 61  veLabel(v, iBrea
ff60: 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  k);.        sqli
ff70: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
ff80: 20 4f 50 5f 43 6c 6f 73 65 2c 20 75 6e 69 6f 6e   OP_Close, union
ff90: 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  Tab, 0);.      }
ffa0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
ffb0: 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a    }.    default:
ffc0: 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 3d 3d   assert( p->op==
ffd0: 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 29 3b 20  TK_INTERSECT ); 
ffe0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 61 62 31  {.      int tab1
fff0: 2c 20 74 61 62 32 3b 0a 20 20 20 20 20 20 69 6e  , tab2;.      in
10000 74 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c  t iCont, iBreak,
10010 20 69 53 74 61 72 74 3b 0a 20 20 20 20 20 20 45   iStart;.      E
10020 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f  xpr *pLimit, *pO
10030 66 66 73 65 74 3b 0a 20 20 20 20 20 20 69 6e 74  ffset;.      int
10040 20 61 64 64 72 3b 0a 20 20 20 20 20 20 53 65 6c   addr;.      Sel
10050 65 63 74 44 65 73 74 20 69 6e 74 65 72 73 65 63  ectDest intersec
10060 74 64 65 73 74 3b 0a 20 20 20 20 20 20 69 6e 74  tdest;.      int
10070 20 72 31 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49   r1;..      /* I
10080 4e 54 45 52 53 45 43 54 20 69 73 20 64 69 66 66  NTERSECT is diff
10090 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 6f  erent from the o
100a0 74 68 65 72 73 20 73 69 6e 63 65 20 69 74 20 72  thers since it r
100b0 65 71 75 69 72 65 73 0a 20 20 20 20 20 20 2a 2a  equires.      **
100c0 20 74 77 6f 20 74 65 6d 70 6f 72 61 72 79 20 74   two temporary t
100d0 61 62 6c 65 73 2e 20 20 48 65 6e 63 65 20 69 74  ables.  Hence it
100e0 20 68 61 73 20 69 74 73 20 6f 77 6e 20 63 61 73   has its own cas
100f0 65 2e 20 20 42 65 67 69 6e 0a 20 20 20 20 20 20  e.  Begin.      
10100 2a 2a 20 62 79 20 61 6c 6c 6f 63 61 74 69 6e 67  ** by allocating
10110 20 74 68 65 20 74 61 62 6c 65 73 20 77 65 20 77   the tables we w
10120 69 6c 6c 20 6e 65 65 64 2e 0a 20 20 20 20 20 20  ill need..      
10130 2a 2f 0a 20 20 20 20 20 20 74 61 62 31 20 3d 20  */.      tab1 = 
10140 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
10150 20 20 20 20 20 20 74 61 62 32 20 3d 20 70 50 61        tab2 = pPa
10160 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
10170 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f     assert( p->pO
10180 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 0a 20 20  rderBy==0 );..  
10190 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
101a0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
101b0 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
101c0 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20 20 20 20  , tab1, 0);.    
101d0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64    assert( p->add
101e0 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20  rOpenEphm[0] == 
101f0 2d 31 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61  -1 );.      p->a
10200 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d  ddrOpenEphm[0] =
10210 20 61 64 64 72 3b 0a 20 20 20 20 20 20 70 2d 3e   addr;.      p->
10220 70 52 69 67 68 74 6d 6f 73 74 2d 3e 73 65 6c 46  pRightmost->selF
10230 6c 61 67 73 20 7c 3d 20 53 46 5f 55 73 65 73 45  lags |= SF_UsesE
10240 70 68 65 6d 65 72 61 6c 3b 0a 20 20 20 20 20 20  phemeral;.      
10250 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73  assert( p->pELis
10260 74 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43  t );..      /* C
10270 6f 64 65 20 74 68 65 20 53 45 4c 45 43 54 73 20  ode the SELECTs 
10280 74 6f 20 6f 75 72 20 6c 65 66 74 20 69 6e 74 6f  to our left into
10290 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
102a0 20 22 74 61 62 31 22 2e 0a 20 20 20 20 20 20 2a   "tab1"..      *
102b0 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  /.      sqlite3S
102c0 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 69  electDestInit(&i
102d0 6e 74 65 72 73 65 63 74 64 65 73 74 2c 20 53 52  ntersectdest, SR
102e0 54 5f 55 6e 69 6f 6e 2c 20 74 61 62 31 29 3b 0a  T_Union, tab1);.
102f0 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74        explainSet
10300 49 6e 74 65 67 65 72 28 69 53 75 62 31 2c 20 70  Integer(iSub1, p
10310 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65  Parse->iNextSele
10320 63 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20  ctId);.      rc 
10330 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  = sqlite3Select(
10340 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20  pParse, pPrior, 
10350 26 69 6e 74 65 72 73 65 63 74 64 65 73 74 29 3b  &intersectdest);
10360 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
10370 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75  .        goto mu
10380 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
10390 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
103a0 2a 20 43 6f 64 65 20 74 68 65 20 63 75 72 72 65  * Code the curre
103b0 6e 74 20 53 45 4c 45 43 54 20 69 6e 74 6f 20 74  nt SELECT into t
103c0 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 22  emporary table "
103d0 74 61 62 32 22 0a 20 20 20 20 20 20 2a 2f 0a 20  tab2".      */. 
103e0 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69       addr = sqli
103f0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
10400 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
10410 6c 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20 20 20  l, tab2, 0);.   
10420 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64     assert( p->ad
10430 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 3d  drOpenEphm[1] ==
10440 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e   -1 );.      p->
10450 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20  addrOpenEphm[1] 
10460 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20 70 2d  = addr;.      p-
10470 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20  >pPrior = 0;.   
10480 20 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70     pLimit = p->p
10490 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e  Limit;.      p->
104a0 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20  pLimit = 0;.    
104b0 20 20 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70    pOffset = p->p
104c0 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70 2d  Offset;.      p-
104d0 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20  >pOffset = 0;.  
104e0 20 20 20 20 69 6e 74 65 72 73 65 63 74 64 65 73      intersectdes
104f0 74 2e 69 53 44 50 61 72 6d 20 3d 20 74 61 62 32  t.iSDParm = tab2
10500 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53  ;.      explainS
10510 65 74 49 6e 74 65 67 65 72 28 69 53 75 62 32 2c  etInteger(iSub2,
10520 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65   pParse->iNextSe
10530 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 72  lectId);.      r
10540 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  c = sqlite3Selec
10550 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26 69 6e  t(pParse, p, &in
10560 74 65 72 73 65 63 74 64 65 73 74 29 3b 0a 20 20  tersectdest);.  
10570 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
10580 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
10590 20 20 20 20 20 70 44 65 6c 65 74 65 20 3d 20 70       pDelete = p
105a0 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20  ->pPrior;.      
105b0 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69  p->pPrior = pPri
105c0 6f 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  or;.      if( p-
105d0 3e 6e 53 65 6c 65 63 74 52 6f 77 3e 70 50 72 69  >nSelectRow>pPri
105e0 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 29  or->nSelectRow )
105f0 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d   p->nSelectRow =
10600 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74   pPrior->nSelect
10610 52 6f 77 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Row;.      sqlit
10620 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
10630 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20   p->pLimit);.   
10640 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70     p->pLimit = p
10650 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e  Limit;.      p->
10660 70 4f 66 66 73 65 74 20 3d 20 70 4f 66 66 73 65  pOffset = pOffse
10670 74 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e  t;..      /* Gen
10680 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 74 61  erate code to ta
10690 6b 65 20 74 68 65 20 69 6e 74 65 72 73 65 63 74  ke the intersect
106a0 69 6f 6e 20 6f 66 20 74 68 65 20 74 77 6f 20 74  ion of the two t
106b0 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 20 20 2a  emporary.      *
106c0 2a 20 74 61 62 6c 65 73 2e 0a 20 20 20 20 20 20  * tables..      
106d0 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
106e0 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20   p->pEList );.  
106f0 20 20 20 20 69 66 28 20 64 65 73 74 2e 65 44 65      if( dest.eDe
10700 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29  st==SRT_Output )
10710 7b 0a 20 20 20 20 20 20 20 20 53 65 6c 65 63 74  {.        Select
10720 20 2a 70 46 69 72 73 74 20 3d 20 70 3b 0a 20 20   *pFirst = p;.  
10730 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 46 69        while( pFi
10740 72 73 74 2d 3e 70 50 72 69 6f 72 20 29 20 70 46  rst->pPrior ) pF
10750 69 72 73 74 20 3d 20 70 46 69 72 73 74 2d 3e 70  irst = pFirst->p
10760 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 67  Prior;.        g
10770 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d  enerateColumnNam
10780 65 73 28 70 50 61 72 73 65 2c 20 30 2c 20 70 46  es(pParse, 0, pF
10790 69 72 73 74 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  irst->pEList);. 
107a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 42 72       }.      iBr
107b0 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62  eak = sqlite3Vdb
107c0 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
107d0 20 20 20 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c       iCont = sql
107e0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
107f0 6c 28 76 29 3b 0a 20 20 20 20 20 20 63 6f 6d 70  l(v);.      comp
10800 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72  uteLimitRegister
10810 73 28 70 50 61 72 73 65 2c 20 70 2c 20 69 42 72  s(pParse, p, iBr
10820 65 61 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  eak);.      sqli
10830 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
10840 20 4f 50 5f 52 65 77 69 6e 64 2c 20 74 61 62 31   OP_Rewind, tab1
10850 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20  , iBreak);.     
10860 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
10870 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
10880 0a 20 20 20 20 20 20 69 53 74 61 72 74 20 3d 20  .      iStart = 
10890 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
108a0 32 28 76 2c 20 4f 50 5f 52 6f 77 4b 65 79 2c 20  2(v, OP_RowKey, 
108b0 74 61 62 31 2c 20 72 31 29 3b 0a 20 20 20 20 20  tab1, r1);.     
108c0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
108d0 70 34 49 6e 74 28 76 2c 20 4f 50 5f 4e 6f 74 46  p4Int(v, OP_NotF
108e0 6f 75 6e 64 2c 20 74 61 62 32 2c 20 69 43 6f 6e  ound, tab2, iCon
108f0 74 2c 20 72 31 2c 20 30 29 3b 0a 20 20 20 20 20  t, r1, 0);.     
10900 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
10910 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
10920 31 29 3b 0a 20 20 20 20 20 20 73 65 6c 65 63 74  1);.      select
10930 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65  InnerLoop(pParse
10940 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20  , p, p->pEList, 
10950 74 61 62 31 2c 20 70 2d 3e 70 45 4c 69 73 74 2d  tab1, p->pEList-
10960 3e 6e 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20  >nExpr,.        
10970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c                0,
10980 20 30 2c 20 26 64 65 73 74 2c 20 69 43 6f 6e 74   0, &dest, iCont
10990 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20  , iBreak);.     
109a0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
109b0 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e  lveLabel(v, iCon
109c0 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
109d0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
109e0 50 5f 4e 65 78 74 2c 20 74 61 62 31 2c 20 69 53  P_Next, tab1, iS
109f0 74 61 72 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  tart);.      sql
10a00 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
10a10 61 62 65 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b  abel(v, iBreak);
10a20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
10a30 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43  beAddOp2(v, OP_C
10a40 6c 6f 73 65 2c 20 74 61 62 32 2c 20 30 29 3b 0a  lose, tab2, 0);.
10a50 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
10a60 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c  eAddOp2(v, OP_Cl
10a70 6f 73 65 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20  ose, tab1, 0);. 
10a80 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
10a90 7d 0a 20 20 7d 0a 0a 20 20 65 78 70 6c 61 69 6e  }.  }..  explain
10aa0 43 6f 6d 70 6f 73 69 74 65 28 70 50 61 72 73 65  Composite(pParse
10ab0 2c 20 70 2d 3e 6f 70 2c 20 69 53 75 62 31 2c 20  , p->op, iSub1, 
10ac0 69 53 75 62 32 2c 20 70 2d 3e 6f 70 21 3d 54 4b  iSub2, p->op!=TK
10ad0 5f 41 4c 4c 29 3b 0a 0a 20 20 2f 2a 20 43 6f 6d  _ALL);..  /* Com
10ae0 70 75 74 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73  pute collating s
10af0 65 71 75 65 6e 63 65 73 20 75 73 65 64 20 62 79  equences used by
10b00 20 0a 20 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79   .  ** temporary
10b10 20 74 61 62 6c 65 73 20 6e 65 65 64 65 64 20 74   tables needed t
10b20 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  o implement the 
10b30 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e  compound select.
10b40 0a 20 20 2a 2a 20 41 74 74 61 63 68 20 74 68 65  .  ** Attach the
10b50 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75   KeyInfo structu
10b60 72 65 20 74 6f 20 61 6c 6c 20 74 65 6d 70 6f 72  re to all tempor
10b70 61 72 79 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a  ary tables..  **
10b80 0a 20 20 2a 2a 20 54 68 69 73 20 73 65 63 74 69  .  ** This secti
10b90 6f 6e 20 69 73 20 72 75 6e 20 62 79 20 74 68 65  on is run by the
10ba0 20 72 69 67 68 74 2d 6d 6f 73 74 20 53 45 4c 45   right-most SELE
10bb0 43 54 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 6c  CT statement onl
10bc0 79 2e 0a 20 20 2a 2a 20 53 45 4c 45 43 54 20 73  y..  ** SELECT s
10bd0 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 74 68 65  tatements to the
10be0 20 6c 65 66 74 20 61 6c 77 61 79 73 20 73 6b 69   left always ski
10bf0 70 20 74 68 69 73 20 70 61 72 74 2e 20 20 54 68  p this part.  Th
10c00 65 20 72 69 67 68 74 2d 6d 6f 73 74 0a 20 20 2a  e right-most.  *
10c10 2a 20 53 45 4c 45 43 54 20 6d 69 67 68 74 20 61  * SELECT might a
10c20 6c 73 6f 20 73 6b 69 70 20 74 68 69 73 20 70 61  lso skip this pa
10c30 72 74 20 69 66 20 69 74 20 68 61 73 20 6e 6f 20  rt if it has no 
10c40 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
10c50 61 6e 64 0a 20 20 2a 2a 20 6e 6f 20 74 65 6d 70  and.  ** no temp
10c60 20 74 61 62 6c 65 73 20 61 72 65 20 72 65 71 75   tables are requ
10c70 69 72 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ired..  */.  if(
10c80 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53   p->selFlags & S
10c90 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c 20  F_UsesEphemeral 
10ca0 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 20 20 20  ){.    int i;   
10cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10cc0 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
10cd0 6e 74 65 72 20 2a 2f 0a 20 20 20 20 4b 65 79 49  nter */.    KeyI
10ce0 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 20 20  nfo *pKeyInfo;  
10cf0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
10d00 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
10d10 66 6f 72 20 74 68 65 20 72 65 73 75 6c 74 20 73  for the result s
10d20 65 74 20 2a 2f 0a 20 20 20 20 53 65 6c 65 63 74  et */.    Select
10d30 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20   *pLoop;        
10d40 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c          /* For l
10d50 6f 6f 70 69 6e 67 20 74 68 72 6f 75 67 68 20 53  ooping through S
10d60 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73  ELECT statements
10d70 20 2a 2f 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20   */.    CollSeq 
10d80 2a 2a 61 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20  **apColl;       
10d90 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f        /* For loo
10da0 70 69 6e 67 20 74 68 72 6f 75 67 68 20 70 4b 65  ping through pKe
10db0 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 5d 20 2a  yInfo->aColl[] *
10dc0 2f 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 20  /.    int nCol; 
10dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10de0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
10df0 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 72 65 73 75   columns in resu
10e00 6c 74 20 73 65 74 20 2a 2f 0a 0a 20 20 20 20 61  lt set */..    a
10e10 73 73 65 72 74 28 20 70 2d 3e 70 52 69 67 68 74  ssert( p->pRight
10e20 6d 6f 73 74 3d 3d 70 20 29 3b 0a 20 20 20 20 6e  most==p );.    n
10e30 43 6f 6c 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d  Col = p->pEList-
10e40 3e 6e 45 78 70 72 3b 0a 20 20 20 20 70 4b 65 79  >nExpr;.    pKey
10e50 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65  Info = sqlite3Ke
10e60 79 49 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e  yInfoAlloc(db, n
10e70 43 6f 6c 2c 20 31 29 3b 0a 20 20 20 20 69 66 28  Col, 1);.    if(
10e80 20 21 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20   !pKeyInfo ){.  
10e90 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
10ea0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74  NOMEM;.      got
10eb0 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
10ec0 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  nd;.    }.    fo
10ed0 72 28 69 3d 30 2c 20 61 70 43 6f 6c 6c 3d 70 4b  r(i=0, apColl=pK
10ee0 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 3b 20 69  eyInfo->aColl; i
10ef0 3c 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 61 70 43 6f  <nCol; i++, apCo
10f00 6c 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 2a 61 70  ll++){.      *ap
10f10 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69 53 65 6c 65  Coll = multiSele
10f20 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  ctCollSeq(pParse
10f30 2c 20 70 2c 20 69 29 3b 0a 20 20 20 20 20 20 69  , p, i);.      i
10f40 66 28 20 30 3d 3d 2a 61 70 43 6f 6c 6c 20 29 7b  f( 0==*apColl ){
10f50 0a 20 20 20 20 20 20 20 20 2a 61 70 43 6f 6c 6c  .        *apColl
10f60 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c   = db->pDfltColl
10f70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
10f80 0a 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70  .    for(pLoop=p
10f90 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70  ; pLoop; pLoop=p
10fa0 4c 6f 6f 70 2d 3e 70 50 72 69 6f 72 29 7b 0a 20  Loop->pPrior){. 
10fb0 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
10fc0 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  2; i++){.       
10fd0 20 69 6e 74 20 61 64 64 72 20 3d 20 70 4c 6f 6f   int addr = pLoo
10fe0 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
10ff0 69 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  i];.        if( 
11000 61 64 64 72 3c 30 20 29 7b 0a 20 20 20 20 20 20  addr<0 ){.      
11010 20 20 20 20 2f 2a 20 49 66 20 5b 30 5d 20 69 73      /* If [0] is
11020 20 75 6e 75 73 65 64 20 74 68 65 6e 20 5b 31 5d   unused then [1]
11030 20 69 73 20 61 6c 73 6f 20 75 6e 75 73 65 64 2e   is also unused.
11040 20 20 53 6f 20 77 65 20 63 61 6e 0a 20 20 20 20    So we can.    
11050 20 20 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20        ** always 
11060 73 61 66 65 6c 79 20 61 62 6f 72 74 20 61 73 20  safely abort as 
11070 73 6f 6f 6e 20 61 73 20 74 68 65 20 66 69 72 73  soon as the firs
11080 74 20 75 6e 75 73 65 64 20 73 6c 6f 74 20 69 73  t unused slot is
11090 20 66 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20   found */.      
110a0 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 6f      assert( pLoo
110b0 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
110c0 31 5d 3c 30 20 29 3b 0a 20 20 20 20 20 20 20 20  1]<0 );.        
110d0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
110e0 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
110f0 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 76  e3VdbeChangeP2(v
11100 2c 20 61 64 64 72 2c 20 6e 43 6f 6c 29 3b 0a 20  , addr, nCol);. 
11110 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
11120 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 61 64  beChangeP4(v, ad
11130 64 72 2c 20 28 63 68 61 72 2a 29 73 71 6c 69 74  dr, (char*)sqlit
11140 65 33 4b 65 79 49 6e 66 6f 52 65 66 28 70 4b 65  e3KeyInfoRef(pKe
11150 79 49 6e 66 6f 29 2c 0a 20 20 20 20 20 20 20 20  yInfo),.        
11160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11170 20 20 20 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b      P4_KEYINFO);
11180 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e  .        pLoop->
11190 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 69 5d 20  addrOpenEphm[i] 
111a0 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  = -1;.      }.  
111b0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 4b    }.    sqlite3K
111c0 65 79 49 6e 66 6f 55 6e 72 65 66 28 70 4b 65 79  eyInfoUnref(pKey
111d0 49 6e 66 6f 29 3b 0a 20 20 7d 0a 0a 6d 75 6c 74  Info);.  }..mult
111e0 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 20 20  i_select_end:.  
111f0 70 44 65 73 74 2d 3e 69 53 64 73 74 20 3d 20 64  pDest->iSdst = d
11200 65 73 74 2e 69 53 64 73 74 3b 0a 20 20 70 44 65  est.iSdst;.  pDe
11210 73 74 2d 3e 6e 53 64 73 74 20 3d 20 64 65 73 74  st->nSdst = dest
11220 2e 6e 53 64 73 74 3b 0a 20 20 73 71 6c 69 74 65  .nSdst;.  sqlite
11230 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
11240 2c 20 70 44 65 6c 65 74 65 29 3b 0a 20 20 72 65  , pDelete);.  re
11250 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  turn rc;.}.#endi
11260 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
11270 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
11280 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20   */../*.** Code 
11290 61 6e 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75  an output subrou
112a0 74 69 6e 65 20 66 6f 72 20 61 20 63 6f 72 6f 75  tine for a corou
112b0 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  tine implementat
112c0 69 6f 6e 20 6f 66 20 61 0a 2a 2a 20 53 45 4c 45  ion of a.** SELE
112d0 43 54 20 73 74 61 74 6d 65 6e 74 2e 0a 2a 2a 0a  CT statment..**.
112e0 2a 2a 20 54 68 65 20 64 61 74 61 20 74 6f 20 62  ** The data to b
112f0 65 20 6f 75 74 70 75 74 20 69 73 20 63 6f 6e 74  e output is cont
11300 61 69 6e 65 64 20 69 6e 20 70 49 6e 2d 3e 69 53  ained in pIn->iS
11310 64 73 74 2e 20 20 54 68 65 72 65 20 61 72 65 0a  dst.  There are.
11320 2a 2a 20 70 49 6e 2d 3e 6e 53 64 73 74 20 63 6f  ** pIn->nSdst co
11330 6c 75 6d 6e 73 20 74 6f 20 62 65 20 6f 75 74 70  lumns to be outp
11340 75 74 2e 20 20 70 44 65 73 74 20 69 73 20 77 68  ut.  pDest is wh
11350 65 72 65 20 74 68 65 20 6f 75 74 70 75 74 20 73  ere the output s
11360 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 73 65 6e 74  hould.** be sent
11370 2e 0a 2a 2a 0a 2a 2a 20 72 65 67 52 65 74 75 72  ..**.** regRetur
11380 6e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  n is the number 
11390 6f 66 20 74 68 65 20 72 65 67 69 73 74 65 72 20  of the register 
113a0 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 75 62 72  holding the subr
113b0 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e  outine.** return
113c0 20 61 64 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20   address..**.** 
113d0 49 66 20 72 65 67 50 72 65 76 3e 30 20 74 68 65  If regPrev>0 the
113e0 6e 20 69 74 20 69 73 20 74 68 65 20 66 69 72 73  n it is the firs
113f0 74 20 72 65 67 69 73 74 65 72 20 69 6e 20 61 20  t register in a 
11400 76 65 63 74 6f 72 20 74 68 61 74 0a 2a 2a 20 72  vector that.** r
11410 65 63 6f 72 64 73 20 74 68 65 20 70 72 65 76 69  ecords the previ
11420 6f 75 73 20 6f 75 74 70 75 74 2e 20 20 6d 65 6d  ous output.  mem
11430 5b 72 65 67 50 72 65 76 5d 20 69 73 20 61 20 66  [regPrev] is a f
11440 6c 61 67 20 74 68 61 74 20 69 73 20 66 61 6c 73  lag that is fals
11450 65 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 68 61  e.** if there ha
11460 73 20 62 65 65 6e 20 6e 6f 20 70 72 65 76 69 6f  s been no previo
11470 75 73 20 6f 75 74 70 75 74 2e 20 20 49 66 20 72  us output.  If r
11480 65 67 50 72 65 76 3e 30 20 74 68 65 6e 20 63 6f  egPrev>0 then co
11490 64 65 20 69 73 0a 2a 2a 20 67 65 6e 65 72 61 74  de is.** generat
114a0 65 64 20 74 6f 20 73 75 70 70 72 65 73 73 20 64  ed to suppress d
114b0 75 70 6c 69 63 61 74 65 73 2e 20 20 70 4b 65 79  uplicates.  pKey
114c0 49 6e 66 6f 20 69 73 20 75 73 65 64 20 66 6f 72  Info is used for
114d0 20 63 6f 6d 70 61 72 69 6e 67 0a 2a 2a 20 6b 65   comparing.** ke
114e0 79 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ys..**.** If the
114f0 20 4c 49 4d 49 54 20 66 6f 75 6e 64 20 69 6e 20   LIMIT found in 
11500 70 2d 3e 69 4c 69 6d 69 74 20 69 73 20 72 65 61  p->iLimit is rea
11510 63 68 65 64 2c 20 6a 75 6d 70 20 69 6d 6d 65 64  ched, jump immed
11520 69 61 74 65 6c 79 20 74 6f 0a 2a 2a 20 69 42 72  iately to.** iBr
11530 65 61 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  eak..*/.static i
11540 6e 74 20 67 65 6e 65 72 61 74 65 4f 75 74 70 75  nt generateOutpu
11550 74 53 75 62 72 6f 75 74 69 6e 65 28 0a 20 20 50  tSubroutine(.  P
11560 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
11570 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
11580 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  g context */.  S
11590 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
115a0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45         /* The SE
115b0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a  LECT statement *
115c0 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a  /.  SelectDest *
115d0 70 49 6e 2c 20 20 20 20 20 20 20 20 2f 2a 20 43  pIn,        /* C
115e0 6f 72 6f 75 74 69 6e 65 20 73 75 70 70 6c 79 69  oroutine supplyi
115f0 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20 53 65 6c  ng data */.  Sel
11600 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 2c 20  ectDest *pDest, 
11610 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f       /* Where to
11620 20 73 65 6e 64 20 74 68 65 20 64 61 74 61 20 2a   send the data *
11630 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 74 75 72  /.  int regRetur
11640 6e 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  n,          /* T
11650 68 65 20 72 65 74 75 72 6e 20 61 64 64 72 65 73  he return addres
11660 73 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20  s register */.  
11670 69 6e 74 20 72 65 67 50 72 65 76 2c 20 20 20 20  int regPrev,    
11680 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 76 69          /* Previ
11690 6f 75 73 20 72 65 73 75 6c 74 20 72 65 67 69 73  ous result regis
116a0 74 65 72 2e 20 20 4e 6f 20 75 6e 69 71 75 65 6e  ter.  No uniquen
116b0 65 73 73 20 69 66 20 30 20 2a 2f 0a 20 20 4b 65  ess if 0 */.  Ke
116c0 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c  yInfo *pKeyInfo,
116d0 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 63 6f 6d        /* For com
116e0 70 61 72 69 6e 67 20 77 69 74 68 20 70 72 65 76  paring with prev
116f0 69 6f 75 73 20 65 6e 74 72 79 20 2a 2f 0a 20 20  ious entry */.  
11700 69 6e 74 20 69 42 72 65 61 6b 20 20 20 20 20 20  int iBreak      
11710 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
11720 68 65 72 65 20 69 66 20 77 65 20 68 69 74 20 74  here if we hit t
11730 68 65 20 4c 49 4d 49 54 20 2a 2f 0a 29 7b 0a 20  he LIMIT */.){. 
11740 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
11750 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
11760 69 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 69 6e 74  iContinue;.  int
11770 20 61 64 64 72 3b 0a 0a 20 20 61 64 64 72 20 3d   addr;..  addr =
11780 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
11790 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 69 43  entAddr(v);.  iC
117a0 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c 69 74 65  ontinue = sqlite
117b0 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
117c0 29 3b 0a 0a 20 20 2f 2a 20 53 75 70 70 72 65 73  );..  /* Suppres
117d0 73 20 64 75 70 6c 69 63 61 74 65 73 20 66 6f 72  s duplicates for
117e0 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20   UNION, EXCEPT, 
117f0 61 6e 64 20 49 4e 54 45 52 53 45 43 54 20 0a 20  and INTERSECT . 
11800 20 2a 2f 0a 20 20 69 66 28 20 72 65 67 50 72 65   */.  if( regPre
11810 76 20 29 7b 0a 20 20 20 20 69 6e 74 20 6a 31 2c  v ){.    int j1,
11820 20 6a 32 3b 0a 20 20 20 20 6a 31 20 3d 20 73 71   j2;.    j1 = sq
11830 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
11840 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 72 65 67  v, OP_IfNot, reg
11850 50 72 65 76 29 3b 0a 20 20 20 20 6a 32 20 3d 20  Prev);.    j2 = 
11860 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
11870 34 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c  4(v, OP_Compare,
11880 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 72 65 67   pIn->iSdst, reg
11890 50 72 65 76 2b 31 2c 20 70 49 6e 2d 3e 6e 53 64  Prev+1, pIn->nSd
118a0 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  st,.            
118b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
118c0 20 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33    (char*)sqlite3
118d0 4b 65 79 49 6e 66 6f 52 65 66 28 70 4b 65 79 49  KeyInfoRef(pKeyI
118e0 6e 66 6f 29 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  nfo), P4_KEYINFO
118f0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
11900 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a  beAddOp3(v, OP_J
11910 75 6d 70 2c 20 6a 32 2b 32 2c 20 69 43 6f 6e 74  ump, j2+2, iCont
11920 69 6e 75 65 2c 20 6a 32 2b 32 29 3b 0a 20 20 20  inue, j2+2);.   
11930 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
11940 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a 20 20 20  Here(v, j1);.   
11950 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11960 70 33 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 70  p3(v, OP_Copy, p
11970 49 6e 2d 3e 69 53 64 73 74 2c 20 72 65 67 50 72  In->iSdst, regPr
11980 65 76 2b 31 2c 20 70 49 6e 2d 3e 6e 53 64 73 74  ev+1, pIn->nSdst
11990 2d 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  -1);.    sqlite3
119a0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
119b0 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 72 65 67  _Integer, 1, reg
119c0 50 72 65 76 29 3b 0a 20 20 7d 0a 20 20 69 66 28  Prev);.  }.  if(
119d0 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
119e0 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75  locFailed ) retu
119f0 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 53 75 70 70  rn 0;..  /* Supp
11a00 72 65 73 73 20 74 68 65 20 66 69 72 73 74 20 4f  ress the first O
11a10 46 46 53 45 54 20 65 6e 74 72 69 65 73 20 69 66  FFSET entries if
11a20 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 46 46   there is an OFF
11a30 53 45 54 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a  SET clause.  */.
11a40 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20    codeOffset(v, 
11a50 70 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 0a  p, iContinue);..
11a60 20 20 73 77 69 74 63 68 28 20 70 44 65 73 74 2d    switch( pDest-
11a70 3e 65 44 65 73 74 20 29 7b 0a 20 20 20 20 2f 2a  >eDest ){.    /*
11a80 20 53 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   Store the resul
11a90 74 20 61 73 20 64 61 74 61 20 75 73 69 6e 67 20  t as data using 
11aa0 61 20 75 6e 69 71 75 65 20 6b 65 79 2e 0a 20 20  a unique key..  
11ab0 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52    */.    case SR
11ac0 54 5f 54 61 62 6c 65 3a 0a 20 20 20 20 63 61 73  T_Table:.    cas
11ad0 65 20 53 52 54 5f 45 70 68 65 6d 54 61 62 3a 20  e SRT_EphemTab: 
11ae0 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d  {.      int r1 =
11af0 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
11b00 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
11b10 20 20 69 6e 74 20 72 32 20 3d 20 73 71 6c 69 74    int r2 = sqlit
11b20 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
11b30 72 73 65 29 3b 0a 20 20 20 20 20 20 74 65 73 74  rse);.      test
11b40 63 61 73 65 28 20 70 44 65 73 74 2d 3e 65 44 65  case( pDest->eDe
11b50 73 74 3d 3d 53 52 54 5f 54 61 62 6c 65 20 29 3b  st==SRT_Table );
11b60 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
11b70 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53   pDest->eDest==S
11b80 52 54 5f 45 70 68 65 6d 54 61 62 20 29 3b 0a 20  RT_EphemTab );. 
11b90 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
11ba0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b  AddOp3(v, OP_Mak
11bb0 65 52 65 63 6f 72 64 2c 20 70 49 6e 2d 3e 69 53  eRecord, pIn->iS
11bc0 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 2c  dst, pIn->nSdst,
11bd0 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   r1);.      sqli
11be0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
11bf0 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 70 44   OP_NewRowid, pD
11c00 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 72 32  est->iSDParm, r2
11c10 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
11c20 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
11c30 5f 49 6e 73 65 72 74 2c 20 70 44 65 73 74 2d 3e  _Insert, pDest->
11c40 69 53 44 50 61 72 6d 2c 20 72 31 2c 20 72 32 29  iSDParm, r1, r2)
11c50 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
11c60 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f  dbeChangeP5(v, O
11c70 50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20  PFLAG_APPEND);. 
11c80 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
11c90 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
11ca0 65 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 73 71  e, r2);.      sq
11cb0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
11cc0 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
11cd0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
11ce0 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c    }..#ifndef SQL
11cf0 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
11d00 59 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61  Y.    /* If we a
11d10 72 65 20 63 72 65 61 74 69 6e 67 20 61 20 73 65  re creating a se
11d20 74 20 66 6f 72 20 61 6e 20 22 65 78 70 72 20 49  t for an "expr I
11d30 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20  N (SELECT ...)" 
11d40 63 6f 6e 73 74 72 75 63 74 2c 0a 20 20 20 20 2a  construct,.    *
11d50 2a 20 74 68 65 6e 20 74 68 65 72 65 20 73 68 6f  * then there sho
11d60 75 6c 64 20 62 65 20 61 20 73 69 6e 67 6c 65 20  uld be a single 
11d70 69 74 65 6d 20 6f 6e 20 74 68 65 20 73 74 61 63  item on the stac
11d80 6b 2e 20 20 57 72 69 74 65 20 74 68 69 73 0a 20  k.  Write this. 
11d90 20 20 20 2a 2a 20 69 74 65 6d 20 69 6e 74 6f 20     ** item into 
11da0 74 68 65 20 73 65 74 20 74 61 62 6c 65 20 77 69  the set table wi
11db0 74 68 20 62 6f 67 75 73 20 64 61 74 61 2e 0a 20  th bogus data.. 
11dc0 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
11dd0 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20 20  RT_Set: {.      
11de0 69 6e 74 20 72 31 3b 0a 20 20 20 20 20 20 61 73  int r1;.      as
11df0 73 65 72 74 28 20 70 49 6e 2d 3e 6e 53 64 73 74  sert( pIn->nSdst
11e00 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 70 44 65  ==1 );.      pDe
11e10 73 74 2d 3e 61 66 66 53 64 73 74 20 3d 20 0a 20  st->affSdst = . 
11e20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43          sqlite3C
11e30 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 70  ompareAffinity(p
11e40 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  ->pEList->a[0].p
11e50 45 78 70 72 2c 20 70 44 65 73 74 2d 3e 61 66 66  Expr, pDest->aff
11e60 53 64 73 74 29 3b 0a 20 20 20 20 20 20 72 31 20  Sdst);.      r1 
11e70 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
11e80 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
11e90 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
11ea0 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp4(v, OP_MakeR
11eb0 65 63 6f 72 64 2c 20 70 49 6e 2d 3e 69 53 64 73  ecord, pIn->iSds
11ec0 74 2c 20 31 2c 20 72 31 2c 20 26 70 44 65 73 74  t, 1, r1, &pDest
11ed0 2d 3e 61 66 66 53 64 73 74 2c 31 29 3b 0a 20 20  ->affSdst,1);.  
11ee0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
11ef0 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e  acheAffinityChan
11f00 67 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e  ge(pParse, pIn->
11f10 69 53 64 73 74 2c 20 31 29 3b 0a 20 20 20 20 20  iSdst, 1);.     
11f20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11f30 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65  p2(v, OP_IdxInse
11f40 72 74 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61  rt, pDest->iSDPa
11f50 72 6d 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73  rm, r1);.      s
11f60 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
11f70 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
11f80 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
11f90 20 20 20 7d 0a 0a 23 69 66 20 30 20 20 2f 2a 20     }..#if 0  /* 
11fa0 4e 65 76 65 72 20 6f 63 63 75 72 73 20 6f 6e 20  Never occurs on 
11fb0 61 6e 20 4f 52 44 45 52 20 42 59 20 71 75 65 72  an ORDER BY quer
11fc0 79 20 2a 2f 0a 20 20 20 20 2f 2a 20 49 66 20 61  y */.    /* If a
11fd0 6e 79 20 72 6f 77 20 65 78 69 73 74 20 69 6e 20  ny row exist in 
11fe0 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2c 20  the result set, 
11ff0 72 65 63 6f 72 64 20 74 68 61 74 20 66 61 63 74  record that fact
12000 20 61 6e 64 20 61 62 6f 72 74 2e 0a 20 20 20 20   and abort..    
12010 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
12020 45 78 69 73 74 73 3a 20 7b 0a 20 20 20 20 20 20  Exists: {.      
12030 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
12040 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
12050 20 31 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61   1, pDest->iSDPa
12060 72 6d 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68  rm);.      /* Th
12070 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77  e LIMIT clause w
12080 69 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20 74 68  ill terminate th
12090 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f  e loop for us */
120a0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
120b0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
120c0 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20  /* If this is a 
120d0 73 63 61 6c 61 72 20 73 65 6c 65 63 74 20 74 68  scalar select th
120e0 61 74 20 69 73 20 70 61 72 74 20 6f 66 20 61 6e  at is part of an
120f0 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65   expression, the
12100 6e 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65 20 74  n.    ** store t
12110 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74 68  he results in th
12120 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 6d 65  e appropriate me
12130 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20 62 72  mory cell and br
12140 65 61 6b 20 6f 75 74 0a 20 20 20 20 2a 2a 20 6f  eak out.    ** o
12150 66 20 74 68 65 20 73 63 61 6e 20 6c 6f 6f 70 2e  f the scan loop.
12160 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
12170 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20   SRT_Mem: {.    
12180 20 20 61 73 73 65 72 74 28 20 70 49 6e 2d 3e 6e    assert( pIn->n
12190 53 64 73 74 3d 3d 31 20 29 3b 0a 20 20 20 20 20  Sdst==1 );.     
121a0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
121b0 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 70 49 6e  Move(pParse, pIn
121c0 2d 3e 69 53 64 73 74 2c 20 70 44 65 73 74 2d 3e  ->iSdst, pDest->
121d0 69 53 44 50 61 72 6d 2c 20 31 29 3b 0a 20 20 20  iSDParm, 1);.   
121e0 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20     /* The LIMIT 
121f0 63 6c 61 75 73 65 20 77 69 6c 6c 20 6a 75 6d 70  clause will jump
12200 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70   out of the loop
12210 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20   for us */.     
12220 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
12230 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64 65 66 20  ndif /* #ifndef 
12240 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
12250 55 45 52 59 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  UERY */..    /* 
12260 54 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20  The results are 
12270 73 74 6f 72 65 64 20 69 6e 20 61 20 73 65 71 75  stored in a sequ
12280 65 6e 63 65 20 6f 66 20 72 65 67 69 73 74 65 72  ence of register
12290 73 0a 20 20 20 20 2a 2a 20 73 74 61 72 74 69 6e  s.    ** startin
122a0 67 20 61 74 20 70 44 65 73 74 2d 3e 69 53 64 73  g at pDest->iSds
122b0 74 2e 20 20 54 68 65 6e 20 74 68 65 20 63 6f 2d  t.  Then the co-
122c0 72 6f 75 74 69 6e 65 20 79 69 65 6c 64 73 2e 0a  routine yields..
122d0 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
122e0 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 3a 20 7b  SRT_Coroutine: {
122f0 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 73 74  .      if( pDest
12300 2d 3e 69 53 64 73 74 3d 3d 30 20 29 7b 0a 20 20  ->iSdst==0 ){.  
12310 20 20 20 20 20 20 70 44 65 73 74 2d 3e 69 53 64        pDest->iSd
12320 73 74 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  st = sqlite3GetT
12330 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
12340 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20   pIn->nSdst);.  
12350 20 20 20 20 20 20 70 44 65 73 74 2d 3e 6e 53 64        pDest->nSd
12360 73 74 20 3d 20 70 49 6e 2d 3e 6e 53 64 73 74 3b  st = pIn->nSdst;
12370 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
12380 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f  qlite3ExprCodeMo
12390 76 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e  ve(pParse, pIn->
123a0 69 53 64 73 74 2c 20 70 44 65 73 74 2d 3e 69 53  iSdst, pDest->iS
123b0 64 73 74 2c 20 70 44 65 73 74 2d 3e 6e 53 64 73  dst, pDest->nSds
123c0 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
123d0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
123e0 50 5f 59 69 65 6c 64 2c 20 70 44 65 73 74 2d 3e  P_Yield, pDest->
123f0 69 53 44 50 61 72 6d 29 3b 0a 20 20 20 20 20 20  iSDParm);.      
12400 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
12410 20 20 2f 2a 20 49 66 20 6e 6f 6e 65 20 6f 66 20    /* If none of 
12420 74 68 65 20 61 62 6f 76 65 2c 20 74 68 65 6e 20  the above, then 
12430 74 68 65 20 72 65 73 75 6c 74 20 64 65 73 74 69  the result desti
12440 6e 61 74 69 6f 6e 20 6d 75 73 74 20 62 65 0a 20  nation must be. 
12450 20 20 20 2a 2a 20 53 52 54 5f 4f 75 74 70 75 74     ** SRT_Output
12460 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
12470 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 20  is never called 
12480 77 69 74 68 20 61 6e 79 20 6f 74 68 65 72 0a 20  with any other. 
12490 20 20 20 2a 2a 20 64 65 73 74 69 6e 61 74 69 6f     ** destinatio
124a0 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68 65  n other than the
124b0 20 6f 6e 65 73 20 68 61 6e 64 6c 65 64 20 61 62   ones handled ab
124c0 6f 76 65 20 6f 72 20 53 52 54 5f 4f 75 74 70 75  ove or SRT_Outpu
124d0 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  t..    **.    **
124e0 20 46 6f 72 20 53 52 54 5f 4f 75 74 70 75 74 2c   For SRT_Output,
124f0 20 72 65 73 75 6c 74 73 20 61 72 65 20 73 74 6f   results are sto
12500 72 65 64 20 69 6e 20 61 20 73 65 71 75 65 6e 63  red in a sequenc
12510 65 20 6f 66 20 72 65 67 69 73 74 65 72 73 2e 20  e of registers. 
12520 20 0a 20 20 20 20 2a 2a 20 54 68 65 6e 20 74 68   .    ** Then th
12530 65 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 20 6f  e OP_ResultRow o
12540 70 63 6f 64 65 20 69 73 20 75 73 65 64 20 74 6f  pcode is used to
12550 20 63 61 75 73 65 20 73 71 6c 69 74 65 33 5f 73   cause sqlite3_s
12560 74 65 70 28 29 20 74 6f 0a 20 20 20 20 2a 2a 20  tep() to.    ** 
12570 72 65 74 75 72 6e 20 74 68 65 20 6e 65 78 74 20  return the next 
12580 72 6f 77 20 6f 66 20 72 65 73 75 6c 74 2e 0a 20  row of result.. 
12590 20 20 20 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c     */.    defaul
125a0 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  t: {.      asser
125b0 74 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d  t( pDest->eDest=
125c0 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20  =SRT_Output );. 
125d0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
125e0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73  AddOp2(v, OP_Res
125f0 75 6c 74 52 6f 77 2c 20 70 49 6e 2d 3e 69 53 64  ultRow, pIn->iSd
12600 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b  st, pIn->nSdst);
12610 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
12620 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43  prCacheAffinityC
12630 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 70 49  hange(pParse, pI
12640 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e  n->iSdst, pIn->n
12650 53 64 73 74 29 3b 0a 20 20 20 20 20 20 62 72 65  Sdst);.      bre
12660 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ak;.    }.  }.. 
12670 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20   /* Jump to the 
12680 65 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  end of the loop 
12690 69 66 20 74 68 65 20 4c 49 4d 49 54 20 69 73 20  if the LIMIT is 
126a0 72 65 61 63 68 65 64 2e 0a 20 20 2a 2f 0a 20 20  reached..  */.  
126b0 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29 7b  if( p->iLimit ){
126c0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
126d0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 5a  AddOp3(v, OP_IfZ
126e0 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20  ero, p->iLimit, 
126f0 69 42 72 65 61 6b 2c 20 2d 31 29 3b 0a 20 20 7d  iBreak, -1);.  }
12700 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
12710 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20 72  the subroutine r
12720 65 74 75 72 6e 0a 20 20 2a 2f 0a 20 20 73 71 6c  eturn.  */.  sql
12730 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
12740 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 69 6e 75  abel(v, iContinu
12750 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  e);.  sqlite3Vdb
12760 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65  eAddOp1(v, OP_Re
12770 74 75 72 6e 2c 20 72 65 67 52 65 74 75 72 6e 29  turn, regReturn)
12780 3b 0a 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72  ;..  return addr
12790 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 74 65 72  ;.}../*.** Alter
127a0 6e 61 74 69 76 65 20 63 6f 6d 70 6f 75 6e 64 20  native compound 
127b0 73 65 6c 65 63 74 20 63 6f 64 65 20 67 65 6e 65  select code gene
127c0 72 61 74 6f 72 20 66 6f 72 20 63 61 73 65 73 20  rator for cases 
127d0 77 68 65 6e 20 74 68 65 72 65 0a 2a 2a 20 69 73  when there.** is
127e0 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
127f0 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 61 73  use..**.** We as
12800 73 75 6d 65 20 61 20 71 75 65 72 79 20 6f 66 20  sume a query of 
12810 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f  the following fo
12820 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 3c  rm:.**.**      <
12830 73 65 6c 65 63 74 41 3e 20 20 3c 6f 70 65 72 61  selectA>  <opera
12840 74 6f 72 3e 20 20 3c 73 65 6c 65 63 74 42 3e 20  tor>  <selectB> 
12850 20 4f 52 44 45 52 20 42 59 20 3c 6f 72 64 65 72   ORDER BY <order
12860 62 79 6c 69 73 74 3e 0a 2a 2a 0a 2a 2a 20 3c 6f  bylist>.**.** <o
12870 70 65 72 61 74 6f 72 3e 20 69 73 20 6f 6e 65 20  perator> is one 
12880 6f 66 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20 55 4e  of UNION ALL, UN
12890 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20 6f 72 20  ION, EXCEPT, or 
128a0 49 4e 54 45 52 53 45 43 54 2e 20 20 54 68 65 20  INTERSECT.  The 
128b0 69 64 65 61 0a 2a 2a 20 69 73 20 74 6f 20 63 6f  idea.** is to co
128c0 64 65 20 62 6f 74 68 20 3c 73 65 6c 65 63 74 41  de both <selectA
128d0 3e 20 61 6e 64 20 3c 73 65 6c 65 63 74 42 3e 20  > and <selectB> 
128e0 77 69 74 68 20 74 68 65 20 4f 52 44 45 52 20 42  with the ORDER B
128f0 59 20 63 6c 61 75 73 65 20 61 73 0a 2a 2a 20 63  Y clause as.** c
12900 6f 2d 72 6f 75 74 69 6e 65 73 2e 20 20 54 68 65  o-routines.  The
12910 6e 20 72 75 6e 20 74 68 65 20 63 6f 2d 72 6f 75  n run the co-rou
12920 74 69 6e 65 73 20 69 6e 20 70 61 72 61 6c 6c 65  tines in paralle
12930 6c 20 61 6e 64 20 6d 65 72 67 65 20 74 68 65 20  l and merge the 
12940 72 65 73 75 6c 74 73 0a 2a 2a 20 69 6e 74 6f 20  results.** into 
12950 74 68 65 20 6f 75 74 70 75 74 2e 20 20 49 6e 20  the output.  In 
12960 61 64 64 69 74 69 6f 6e 20 74 6f 20 74 68 65 20  addition to the 
12970 74 77 6f 20 63 6f 72 6f 75 74 69 6e 65 73 20 28  two coroutines (
12980 63 61 6c 6c 65 64 20 73 65 6c 65 63 74 41 20 61  called selectA a
12990 6e 64 0a 2a 2a 20 73 65 6c 65 63 74 42 29 20 74  nd.** selectB) t
129a0 68 65 72 65 20 61 72 65 20 37 20 73 75 62 72 6f  here are 7 subro
129b0 75 74 69 6e 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  utines:.**.**   
129c0 20 6f 75 74 41 3a 20 20 20 20 4d 6f 76 65 20 74   outA:    Move t
129d0 68 65 20 6f 75 74 70 75 74 20 6f 66 20 74 68 65  he output of the
129e0 20 73 65 6c 65 63 74 41 20 63 6f 72 6f 75 74 69   selectA corouti
129f0 6e 65 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70  ne into the outp
12a00 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ut.**           
12a10 20 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e    of the compoun
12a20 64 20 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 20  d query..**.**  
12a30 20 20 6f 75 74 42 3a 20 20 20 20 4d 6f 76 65 20    outB:    Move 
12a40 74 68 65 20 6f 75 74 70 75 74 20 6f 66 20 74 68  the output of th
12a50 65 20 73 65 6c 65 63 74 42 20 63 6f 72 6f 75 74  e selectB corout
12a60 69 6e 65 20 69 6e 74 6f 20 74 68 65 20 6f 75 74  ine into the out
12a70 70 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  put.**          
12a80 20 20 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75     of the compou
12a90 6e 64 20 71 75 65 72 79 2e 20 20 28 4f 6e 6c 79  nd query.  (Only
12aa0 20 67 65 6e 65 72 61 74 65 64 20 66 6f 72 20 55   generated for U
12ab0 4e 49 4f 4e 20 61 6e 64 0a 2a 2a 20 20 20 20 20  NION and.**     
12ac0 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c          UNION AL
12ad0 4c 2e 20 20 45 58 43 45 50 54 20 61 6e 64 20 49  L.  EXCEPT and I
12ae0 4e 53 45 52 54 53 45 43 54 20 6e 65 76 65 72 20  NSERTSECT never 
12af0 6f 75 74 70 75 74 20 61 20 72 6f 77 20 74 68 61  output a row tha
12b00 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
12b10 20 61 70 70 65 61 72 73 20 6f 6e 6c 79 20 69 6e   appears only in
12b20 20 42 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 20 41 6c   B.).**.**    Al
12b30 74 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68  tB:    Called wh
12b40 65 6e 20 74 68 65 72 65 20 69 73 20 64 61 74 61  en there is data
12b50 20 66 72 6f 6d 20 62 6f 74 68 20 63 6f 72 6f 75   from both corou
12b60 74 69 6e 65 73 20 61 6e 64 20 41 3c 42 2e 0a 2a  tines and A<B..*
12b70 2a 0a 2a 2a 20 20 20 20 41 65 71 42 3a 20 20 20  *.**    AeqB:   
12b80 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65   Called when the
12b90 72 65 20 69 73 20 64 61 74 61 20 66 72 6f 6d 20  re is data from 
12ba0 62 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65 73 20  both coroutines 
12bb0 61 6e 64 20 41 3d 3d 42 2e 0a 2a 2a 0a 2a 2a 20  and A==B..**.** 
12bc0 20 20 20 41 67 74 42 3a 20 20 20 20 43 61 6c 6c     AgtB:    Call
12bd0 65 64 20 77 68 65 6e 20 74 68 65 72 65 20 69 73  ed when there is
12be0 20 64 61 74 61 20 66 72 6f 6d 20 62 6f 74 68 20   data from both 
12bf0 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 41  coroutines and A
12c00 3e 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 45 6f 66  >B..**.**    Eof
12c10 41 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65  A:    Called whe
12c20 6e 20 64 61 74 61 20 69 73 20 65 78 68 61 75 73  n data is exhaus
12c30 74 65 64 20 66 72 6f 6d 20 73 65 6c 65 63 74 41  ted from selectA
12c40 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 45 6f 66 42 3a  ..**.**    EofB:
12c50 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20      Called when 
12c60 64 61 74 61 20 69 73 20 65 78 68 61 75 73 74 65  data is exhauste
12c70 64 20 66 72 6f 6d 20 73 65 6c 65 63 74 42 2e 0a  d from selectB..
12c80 2a 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d  **.** The implem
12c90 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
12ca0 6c 61 74 74 65 72 20 66 69 76 65 20 73 75 62 72  latter five subr
12cb0 6f 75 74 69 6e 65 73 20 64 65 70 65 6e 64 20 6f  outines depend o
12cc0 6e 20 77 68 69 63 68 20 0a 2a 2a 20 3c 6f 70 65  n which .** <ope
12cd0 72 61 74 6f 72 3e 20 69 73 20 75 73 65 64 3a 0a  rator> is used:.
12ce0 2a 2a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  **.**.**        
12cf0 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 20 20       UNION ALL  
12d00 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 20 20 20         UNION    
12d10 20 20 20 20 20 20 20 20 45 58 43 45 50 54 20 20          EXCEPT  
12d20 20 20 20 20 20 20 20 20 49 4e 54 45 52 53 45 43          INTERSEC
12d30 54 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2d 2d  T.**          --
12d40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d  -----------  ---
12d50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20  --------------  
12d60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20  --------------  
12d70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12d80 2d 0a 2a 2a 20 20 20 41 6c 74 42 3a 20 20 20 6f  -.**   AltB:   o
12d90 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20  utA, nextA      
12da0 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20  outA, nextA     
12db0 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20    outA, nextA   
12dc0 20 20 20 20 20 20 6e 65 78 74 41 0a 2a 2a 0a 2a        nextA.**.*
12dd0 2a 20 20 20 41 65 71 42 3a 20 20 20 6f 75 74 41  *   AeqB:   outA
12de0 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20 20 20  , nextA         
12df0 6e 65 78 74 41 20 20 20 20 20 20 20 20 20 20 20  nextA           
12e00 20 20 6e 65 78 74 41 20 20 20 20 20 20 20 20 20    nextA         
12e10 6f 75 74 41 2c 20 6e 65 78 74 41 0a 2a 2a 0a 2a  outA, nextA.**.*
12e20 2a 20 20 20 41 67 74 42 3a 20 20 20 6f 75 74 42  *   AgtB:   outB
12e30 2c 20 6e 65 78 74 42 20 20 20 20 20 20 6f 75 74  , nextB      out
12e40 42 2c 20 6e 65 78 74 42 20 20 20 20 20 20 20 20  B, nextB        
12e50 20 20 6e 65 78 74 42 20 20 20 20 20 20 20 20 20    nextB         
12e60 20 20 20 6e 65 78 74 42 0a 2a 2a 0a 2a 2a 20 20     nextB.**.**  
12e70 20 45 6f 66 41 3a 20 20 20 6f 75 74 42 2c 20 6e   EofA:   outB, n
12e80 65 78 74 42 20 20 20 20 20 20 6f 75 74 42 2c 20  extB      outB, 
12e90 6e 65 78 74 42 20 20 20 20 20 20 20 20 20 20 68  nextB          h
12ea0 61 6c 74 20 20 20 20 20 20 20 20 20 20 20 20 20  alt             
12eb0 68 61 6c 74 0a 2a 2a 0a 2a 2a 20 20 20 45 6f 66  halt.**.**   Eof
12ec0 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41  B:   outA, nextA
12ed0 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74        outA, next
12ee0 41 20 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65  A       outA, ne
12ef0 78 74 41 20 20 20 20 20 20 20 20 20 68 61 6c 74  xtA         halt
12f00 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 41 6c  .**.** In the Al
12f10 74 42 2c 20 41 65 71 42 2c 20 61 6e 64 20 41 67  tB, AeqB, and Ag
12f20 74 42 20 73 75 62 72 6f 75 74 69 6e 65 73 2c 20  tB subroutines, 
12f30 61 6e 20 45 4f 46 20 6f 6e 20 41 20 66 6f 6c 6c  an EOF on A foll
12f40 6f 77 69 6e 67 20 6e 65 78 74 41 0a 2a 2a 20 63  owing nextA.** c
12f50 61 75 73 65 73 20 61 6e 20 69 6d 6d 65 64 69 61  auses an immedia
12f60 74 65 20 6a 75 6d 70 20 74 6f 20 45 6f 66 41 20  te jump to EofA 
12f70 61 6e 64 20 61 6e 20 45 4f 46 20 6f 6e 20 42 20  and an EOF on B 
12f80 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78 74 42 20  following nextB 
12f90 63 61 75 73 65 73 0a 2a 2a 20 61 6e 20 69 6d 6d  causes.** an imm
12fa0 65 64 69 61 74 65 20 6a 75 6d 70 20 74 6f 20 45  ediate jump to E
12fb0 6f 66 42 2e 20 20 57 69 74 68 69 6e 20 45 6f 66  ofB.  Within Eof
12fc0 41 20 61 6e 64 20 45 6f 66 42 2c 20 61 6e 64 20  A and EofB, and 
12fd0 45 4f 46 20 6f 6e 20 65 6e 74 72 79 20 6f 72 0a  EOF on entry or.
12fe0 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78  ** following nex
12ff0 74 58 20 63 61 75 73 65 73 20 61 20 6a 75 6d 70  tX causes a jump
13000 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74   to the end of t
13010 68 65 20 73 65 6c 65 63 74 20 70 72 6f 63 65 73  he select proces
13020 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 44 75 70 6c  sing..**.** Dupl
13030 69 63 61 74 65 20 72 65 6d 6f 76 61 6c 20 69 6e  icate removal in
13040 20 74 68 65 20 55 4e 49 4f 4e 2c 20 45 58 43 45   the UNION, EXCE
13050 50 54 2c 20 61 6e 64 20 49 4e 54 45 52 53 45 43  PT, and INTERSEC
13060 54 20 63 61 73 65 73 20 69 73 20 68 61 6e 64 6c  T cases is handl
13070 65 64 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65  ed.** within the
13080 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74 69   output subrouti
13090 6e 65 2e 20 20 54 68 65 20 72 65 67 50 72 65 76  ne.  The regPrev
130a0 20 72 65 67 69 73 74 65 72 20 73 65 74 20 68 6f   register set ho
130b0 6c 64 73 20 74 68 65 20 70 72 65 76 69 6f 75 73  lds the previous
130c0 6c 79 0a 2a 2a 20 6f 75 74 70 75 74 20 76 61 6c  ly.** output val
130d0 75 65 2e 20 20 41 20 63 6f 6d 70 61 72 69 73 6f  ue.  A compariso
130e0 6e 20 69 73 20 6d 61 64 65 20 61 67 61 69 6e 73  n is made agains
130f0 74 20 74 68 69 73 20 76 61 6c 75 65 20 61 6e 64  t this value and
13100 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 69   the output.** i
13110 73 20 73 6b 69 70 70 65 64 20 69 66 20 74 68 65  s skipped if the
13120 20 6e 65 78 74 20 72 65 73 75 6c 74 73 20 77 6f   next results wo
13130 75 6c 64 20 62 65 20 74 68 65 20 73 61 6d 65 20  uld be the same 
13140 61 73 20 74 68 65 20 70 72 65 76 69 6f 75 73 2e  as the previous.
13150 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65  .**.** The imple
13160 6d 65 6e 74 61 74 69 6f 6e 20 70 6c 61 6e 20 69  mentation plan i
13170 73 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  s to implement t
13180 68 65 20 74 77 6f 20 63 6f 72 6f 75 74 69 6e 65  he two coroutine
13190 73 20 61 6e 64 20 73 65 76 65 6e 0a 2a 2a 20 73  s and seven.** s
131a0 75 62 72 6f 75 74 69 6e 65 73 20 66 69 72 73 74  ubroutines first
131b0 2c 20 74 68 65 6e 20 70 75 74 20 74 68 65 20 63  , then put the c
131c0 6f 6e 74 72 6f 6c 20 6c 6f 67 69 63 20 61 74 20  ontrol logic at 
131d0 74 68 65 20 62 6f 74 74 6f 6d 2e 20 20 4c 69 6b  the bottom.  Lik
131e0 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  e this:.**.**   
131f0 20 20 20 20 20 20 20 67 6f 74 6f 20 49 6e 69 74         goto Init
13200 0a 2a 2a 20 20 20 20 20 63 6f 41 3a 20 63 6f 72  .**     coA: cor
13210 6f 75 74 69 6e 65 20 66 6f 72 20 6c 65 66 74 20  outine for left 
13220 71 75 65 72 79 20 28 41 29 0a 2a 2a 20 20 20 20  query (A).**    
13230 20 63 6f 42 3a 20 63 6f 72 6f 75 74 69 6e 65 20   coB: coroutine 
13240 66 6f 72 20 72 69 67 68 74 20 71 75 65 72 79 20  for right query 
13250 28 42 29 0a 2a 2a 20 20 20 20 6f 75 74 41 3a 20  (B).**    outA: 
13260 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f 77 20 6f  output one row o
13270 66 20 41 0a 2a 2a 20 20 20 20 6f 75 74 42 3a 20  f A.**    outB: 
13280 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f 77 20 6f  output one row o
13290 66 20 42 20 28 55 4e 49 4f 4e 20 61 6e 64 20 55  f B (UNION and U
132a0 4e 49 4f 4e 20 41 4c 4c 20 6f 6e 6c 79 29 0a 2a  NION ALL only).*
132b0 2a 20 20 20 20 45 6f 66 41 3a 20 2e 2e 2e 0a 2a  *    EofA: ....*
132c0 2a 20 20 20 20 45 6f 66 42 3a 20 2e 2e 2e 0a 2a  *    EofB: ....*
132d0 2a 20 20 20 20 41 6c 74 42 3a 20 2e 2e 2e 0a 2a  *    AltB: ....*
132e0 2a 20 20 20 20 41 65 71 42 3a 20 2e 2e 2e 0a 2a  *    AeqB: ....*
132f0 2a 20 20 20 20 41 67 74 42 3a 20 2e 2e 2e 0a 2a  *    AgtB: ....*
13300 2a 20 20 20 20 49 6e 69 74 3a 20 69 6e 69 74 69  *    Init: initi
13310 61 6c 69 7a 65 20 63 6f 72 6f 75 74 69 6e 65 20  alize coroutine 
13320 72 65 67 69 73 74 65 72 73 0a 2a 2a 20 20 20 20  registers.**    
13330 20 20 20 20 20 20 79 69 65 6c 64 20 63 6f 41 0a        yield coA.
13340 2a 2a 20 20 20 20 20 20 20 20 20 20 69 66 20 65  **          if e
13350 6f 66 28 41 29 20 67 6f 74 6f 20 45 6f 66 41 0a  of(A) goto EofA.
13360 2a 2a 20 20 20 20 20 20 20 20 20 20 79 69 65 6c  **          yiel
13370 64 20 63 6f 42 0a 2a 2a 20 20 20 20 20 20 20 20  d coB.**        
13380 20 20 69 66 20 65 6f 66 28 42 29 20 67 6f 74 6f    if eof(B) goto
13390 20 45 6f 66 42 0a 2a 2a 20 20 20 20 43 6d 70 72   EofB.**    Cmpr
133a0 3a 20 43 6f 6d 70 61 72 65 20 41 2c 20 42 0a 2a  : Compare A, B.*
133b0 2a 20 20 20 20 20 20 20 20 20 20 4a 75 6d 70 20  *          Jump 
133c0 41 6c 74 42 2c 20 41 65 71 42 2c 20 41 67 74 42  AltB, AeqB, AgtB
133d0 0a 2a 2a 20 20 20 20 20 45 6e 64 3a 20 2e 2e 2e  .**     End: ...
133e0 0a 2a 2a 0a 2a 2a 20 57 65 20 63 61 6c 6c 20 41  .**.** We call A
133f0 6c 74 42 2c 20 41 65 71 42 2c 20 41 67 74 42 2c  ltB, AeqB, AgtB,
13400 20 45 6f 66 41 2c 20 61 6e 64 20 45 6f 66 42 20   EofA, and EofB 
13410 22 73 75 62 72 6f 75 74 69 6e 65 73 22 20 62 75  "subroutines" bu
13420 74 20 74 68 65 79 20 61 72 65 20 6e 6f 74 0a 2a  t they are not.*
13430 2a 20 61 63 74 75 61 6c 6c 79 20 63 61 6c 6c 65  * actually calle
13440 64 20 75 73 69 6e 67 20 47 6f 73 75 62 20 61 6e  d using Gosub an
13450 64 20 74 68 65 79 20 64 6f 20 6e 6f 74 20 52 65  d they do not Re
13460 74 75 72 6e 2e 20 20 45 6f 66 41 20 61 6e 64 20  turn.  EofA and 
13470 45 6f 66 42 20 6c 6f 6f 70 0a 2a 2a 20 75 6e 74  EofB loop.** unt
13480 69 6c 20 61 6c 6c 20 64 61 74 61 20 69 73 20 65  il all data is e
13490 78 68 61 75 73 74 65 64 20 74 68 65 6e 20 6a 75  xhausted then ju
134a0 6d 70 20 74 6f 20 74 68 65 20 22 65 6e 64 22 20  mp to the "end" 
134b0 6c 61 62 65 2e 20 20 41 6c 74 42 2c 20 41 65 71  labe.  AltB, Aeq
134c0 42 2c 0a 2a 2a 20 61 6e 64 20 41 67 74 42 20 6a  B,.** and AgtB j
134d0 75 6d 70 20 74 6f 20 65 69 74 68 65 72 20 4c 32  ump to either L2
134e0 20 6f 72 20 74 6f 20 6f 6e 65 20 6f 66 20 45 6f   or to one of Eo
134f0 66 41 20 6f 72 20 45 6f 66 42 2e 0a 2a 2f 0a 23  fA or EofB..*/.#
13500 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
13510 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  IT_COMPOUND_SELE
13520 43 54 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 75  CT.static int mu
13530 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79  ltiSelectOrderBy
13540 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
13550 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72  e,        /* Par
13560 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
13570 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
13580 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
13590 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c  ight-most of SEL
135a0 45 43 54 73 20 74 6f 20 62 65 20 63 6f 64 65 64  ECTs to be coded
135b0 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74   */.  SelectDest
135c0 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a 20 57   *pDest     /* W
135d0 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 71  hat to do with q
135e0 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a  uery results */.
135f0 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20  ){.  int i, j;  
13600 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
13610 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20  op counters */. 
13620 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72 3b   Select *pPrior;
13630 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65         /* Anothe
13640 72 20 53 45 4c 45 43 54 20 69 6d 6d 65 64 69 61  r SELECT immedia
13650 74 65 6c 79 20 74 6f 20 6f 75 72 20 6c 65 66 74  tely to our left
13660 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20   */.  Vdbe *v;  
13670 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47              /* G
13680 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
13690 74 68 69 73 20 56 44 42 45 20 2a 2f 0a 20 20 53  this VDBE */.  S
136a0 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 41 3b  electDest destA;
136b0 20 20 20 20 20 2f 2a 20 44 65 73 74 69 6e 61 74       /* Destinat
136c0 69 6f 6e 20 66 6f 72 20 63 6f 72 6f 75 74 69 6e  ion for coroutin
136d0 65 20 41 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  e A */.  SelectD
136e0 65 73 74 20 64 65 73 74 42 3b 20 20 20 20 20 2f  est destB;     /
136f0 2a 20 44 65 73 74 69 6e 61 74 69 6f 6e 20 66 6f  * Destination fo
13700 72 20 63 6f 72 6f 75 74 69 6e 65 20 42 20 2a 2f  r coroutine B */
13710 0a 20 20 69 6e 74 20 72 65 67 41 64 64 72 41 3b  .  int regAddrA;
13720 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
13730 65 73 73 20 72 65 67 69 73 74 65 72 20 66 6f 72  ess register for
13740 20 73 65 6c 65 63 74 2d 41 20 63 6f 72 6f 75 74   select-A corout
13750 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ine */.  int reg
13760 45 6f 66 41 3b 20 20 20 20 20 20 20 20 20 20 2f  EofA;          /
13770 2a 20 46 6c 61 67 20 74 6f 20 69 6e 64 69 63 61  * Flag to indica
13780 74 65 20 77 68 65 6e 20 73 65 6c 65 63 74 2d 41  te when select-A
13790 20 69 73 20 63 6f 6d 70 6c 65 74 65 20 2a 2f 0a   is complete */.
137a0 20 20 69 6e 74 20 72 65 67 41 64 64 72 42 3b 20    int regAddrB; 
137b0 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
137c0 73 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20  ss register for 
137d0 73 65 6c 65 63 74 2d 42 20 63 6f 72 6f 75 74 69  select-B corouti
137e0 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 45  ne */.  int regE
137f0 6f 66 42 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ofB;          /*
13800 20 46 6c 61 67 20 74 6f 20 69 6e 64 69 63 61 74   Flag to indicat
13810 65 20 77 68 65 6e 20 73 65 6c 65 63 74 2d 42 20  e when select-B 
13820 69 73 20 63 6f 6d 70 6c 65 74 65 20 2a 2f 0a 20  is complete */. 
13830 20 69 6e 74 20 61 64 64 72 53 65 6c 65 63 74 41   int addrSelectA
13840 3b 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73  ;      /* Addres
13850 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d  s of the select-
13860 41 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20  A coroutine */. 
13870 20 69 6e 74 20 61 64 64 72 53 65 6c 65 63 74 42   int addrSelectB
13880 3b 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73  ;      /* Addres
13890 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d  s of the select-
138a0 42 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20  B coroutine */. 
138b0 20 69 6e 74 20 72 65 67 4f 75 74 41 3b 20 20 20   int regOutA;   
138c0 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
138d0 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 74  s register for t
138e0 68 65 20 6f 75 74 70 75 74 2d 41 20 73 75 62 72  he output-A subr
138f0 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
13900 72 65 67 4f 75 74 42 3b 20 20 20 20 20 20 20 20  regOutB;        
13910 20 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67    /* Address reg
13920 69 73 74 65 72 20 66 6f 72 20 74 68 65 20 6f 75  ister for the ou
13930 74 70 75 74 2d 42 20 73 75 62 72 6f 75 74 69 6e  tput-B subroutin
13940 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 4f  e */.  int addrO
13950 75 74 41 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  utA;         /* 
13960 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6f  Address of the o
13970 75 74 70 75 74 2d 41 20 73 75 62 72 6f 75 74 69  utput-A subrouti
13980 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ne */.  int addr
13990 4f 75 74 42 20 3d 20 30 3b 20 20 20 20 20 2f 2a  OutB = 0;     /*
139a0 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
139b0 6f 75 74 70 75 74 2d 42 20 73 75 62 72 6f 75 74  output-B subrout
139c0 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ine */.  int add
139d0 72 45 6f 66 41 3b 20 20 20 20 20 20 20 20 20 2f  rEofA;         /
139e0 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
139f0 20 73 65 6c 65 63 74 2d 41 2d 65 78 68 61 75 73   select-A-exhaus
13a00 74 65 64 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  ted subroutine *
13a10 2f 0a 20 20 69 6e 74 20 61 64 64 72 45 6f 66 42  /.  int addrEofB
13a20 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64  ;         /* Add
13a30 72 65 73 73 20 6f 66 20 74 68 65 20 73 65 6c 65  ress of the sele
13a40 63 74 2d 42 2d 65 78 68 61 75 73 74 65 64 20 73  ct-B-exhausted s
13a50 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  ubroutine */.  i
13a60 6e 74 20 61 64 64 72 41 6c 74 42 3b 20 20 20 20  nt addrAltB;    
13a70 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
13a80 6f 66 20 74 68 65 20 41 3c 42 20 73 75 62 72 6f  of the A<B subro
13a90 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61  utine */.  int a
13aa0 64 64 72 41 65 71 42 3b 20 20 20 20 20 20 20 20  ddrAeqB;        
13ab0 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
13ac0 68 65 20 41 3d 3d 42 20 73 75 62 72 6f 75 74 69  he A==B subrouti
13ad0 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ne */.  int addr
13ae0 41 67 74 42 3b 20 20 20 20 20 20 20 20 20 2f 2a  AgtB;         /*
13af0 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
13b00 41 3e 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  A>B subroutine *
13b10 2f 0a 20 20 69 6e 74 20 72 65 67 4c 69 6d 69 74  /.  int regLimit
13b20 41 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6d  A;        /* Lim
13b30 69 74 20 72 65 67 69 73 74 65 72 20 66 6f 72 20  it register for 
13b40 73 65 6c 65 63 74 2d 41 20 2a 2f 0a 20 20 69 6e  select-A */.  in
13b50 74 20 72 65 67 4c 69 6d 69 74 42 3b 20 20 20 20  t regLimitB;    
13b60 20 20 20 20 2f 2a 20 4c 69 6d 69 74 20 72 65 67      /* Limit reg
13b70 69 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74  ister for select
13b80 2d 41 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 50  -A */.  int regP
13b90 72 65 76 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  rev;          /*
13ba0 20 41 20 72 61 6e 67 65 20 6f 66 20 72 65 67 69   A range of regi
13bb0 73 74 65 72 73 20 74 6f 20 68 6f 6c 64 20 70 72  sters to hold pr
13bc0 65 76 69 6f 75 73 20 6f 75 74 70 75 74 20 2a 2f  evious output */
13bd0 0a 20 20 69 6e 74 20 73 61 76 65 64 4c 69 6d 69  .  int savedLimi
13be0 74 3b 20 20 20 20 20 20 20 2f 2a 20 53 61 76 65  t;       /* Save
13bf0 64 20 76 61 6c 75 65 20 6f 66 20 70 2d 3e 69 4c  d value of p->iL
13c00 69 6d 69 74 20 2a 2f 0a 20 20 69 6e 74 20 73 61  imit */.  int sa
13c10 76 65 64 4f 66 66 73 65 74 3b 20 20 20 20 20 20  vedOffset;      
13c20 2f 2a 20 53 61 76 65 64 20 76 61 6c 75 65 20 6f  /* Saved value o
13c30 66 20 70 2d 3e 69 4f 66 66 73 65 74 20 2a 2f 0a  f p->iOffset */.
13c40 20 20 69 6e 74 20 6c 61 62 65 6c 43 6d 70 72 3b    int labelCmpr;
13c50 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 62 65 6c          /* Label
13c60 20 66 6f 72 20 74 68 65 20 73 74 61 72 74 20 6f   for the start o
13c70 66 20 74 68 65 20 6d 65 72 67 65 20 61 6c 67 6f  f the merge algo
13c80 72 69 74 68 6d 20 2a 2f 0a 20 20 69 6e 74 20 6c  rithm */.  int l
13c90 61 62 65 6c 45 6e 64 3b 20 20 20 20 20 20 20 20  abelEnd;        
13ca0 20 2f 2a 20 4c 61 62 65 6c 20 66 6f 72 20 74 68   /* Label for th
13cb0 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 76 65  e end of the ove
13cc0 72 61 6c 6c 20 53 45 4c 45 43 54 20 73 74 6d 74  rall SELECT stmt
13cd0 20 2a 2f 0a 20 20 69 6e 74 20 6a 31 3b 20 20 20   */.  int j1;   
13ce0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a              /* J
13cf0 75 6d 70 20 69 6e 73 74 72 75 63 74 69 6f 6e 73  ump instructions
13d00 20 74 68 61 74 20 67 65 74 20 72 65 74 61 72 67   that get retarg
13d10 65 74 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  etted */.  int o
13d20 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
13d30 20 2f 2a 20 4f 6e 65 20 6f 66 20 54 4b 5f 41 4c   /* One of TK_AL
13d40 4c 2c 20 54 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f  L, TK_UNION, TK_
13d50 45 58 43 45 50 54 2c 20 54 4b 5f 49 4e 54 45 52  EXCEPT, TK_INTER
13d60 53 45 43 54 20 2a 2f 0a 20 20 4b 65 79 49 6e 66  SECT */.  KeyInf
13d70 6f 20 2a 70 4b 65 79 44 75 70 20 3d 20 30 3b 20  o *pKeyDup = 0; 
13d80 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20 69 6e  /* Comparison in
13d90 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 64 75  formation for du
13da0 70 6c 69 63 61 74 65 20 72 65 6d 6f 76 61 6c 20  plicate removal 
13db0 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  */.  KeyInfo *pK
13dc0 65 79 4d 65 72 67 65 3b 20 20 20 2f 2a 20 43 6f  eyMerge;   /* Co
13dd0 6d 70 61 72 69 73 6f 6e 20 69 6e 66 6f 72 6d 61  mparison informa
13de0 74 69 6f 6e 20 66 6f 72 20 6d 65 72 67 69 6e 67  tion for merging
13df0 20 72 6f 77 73 20 2a 2f 0a 20 20 73 71 6c 69 74   rows */.  sqlit
13e00 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20  e3 *db;         
13e10 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
13e20 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70  nection */.  Exp
13e30 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 3b  rList *pOrderBy;
13e40 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20     /* The ORDER 
13e50 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69  BY clause */.  i
13e60 6e 74 20 6e 4f 72 64 65 72 42 79 3b 20 20 20 20  nt nOrderBy;    
13e70 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
13e80 66 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 4f  f terms in the O
13e90 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a  RDER BY clause *
13ea0 2f 0a 20 20 69 6e 74 20 2a 61 50 65 72 6d 75 74  /.  int *aPermut
13eb0 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 70  e;        /* Map
13ec0 70 69 6e 67 20 66 72 6f 6d 20 4f 52 44 45 52 20  ping from ORDER 
13ed0 42 59 20 74 65 72 6d 73 20 74 6f 20 72 65 73 75  BY terms to resu
13ee0 6c 74 20 73 65 74 20 63 6f 6c 75 6d 6e 73 20 2a  lt set columns *
13ef0 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
13f00 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20  _OMIT_EXPLAIN.  
13f10 69 6e 74 20 69 53 75 62 31 3b 20 20 20 20 20 20  int iSub1;      
13f20 20 20 20 20 20 20 2f 2a 20 45 51 50 20 69 64 20        /* EQP id 
13f30 6f 66 20 6c 65 66 74 2d 68 61 6e 64 20 71 75 65  of left-hand que
13f40 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62  ry */.  int iSub
13f50 32 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  2;            /*
13f60 20 45 51 50 20 69 64 20 6f 66 20 72 69 67 68 74   EQP id of right
13f70 2d 68 61 6e 64 20 71 75 65 72 79 20 2a 2f 0a 23  -hand query */.#
13f80 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
13f90 20 70 2d 3e 70 4f 72 64 65 72 42 79 21 3d 30 20   p->pOrderBy!=0 
13fa0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65  );.  assert( pKe
13fb0 79 44 75 70 3d 3d 30 20 29 3b 20 2f 2a 20 22 4d  yDup==0 ); /* "M
13fc0 61 6e 61 67 65 64 22 20 63 6f 64 65 20 6e 65 65  anaged" code nee
13fd0 64 73 20 74 68 69 73 2e 20 20 54 69 63 6b 65 74  ds this.  Ticket
13fe0 20 23 33 33 38 32 2e 20 2a 2f 0a 20 20 64 62 20   #3382. */.  db 
13ff0 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
14000 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
14010 65 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d  e;.  assert( v!=
14020 30 20 29 3b 20 20 20 20 20 20 20 2f 2a 20 41 6c  0 );       /* Al
14030 72 65 61 64 79 20 74 68 72 6f 77 6e 20 74 68 65  ready thrown the
14040 20 65 72 72 6f 72 20 69 66 20 56 44 42 45 20 61   error if VDBE a
14050 6c 6c 6f 63 20 66 61 69 6c 65 64 20 2a 2f 0a 20  lloc failed */. 
14060 20 6c 61 62 65 6c 45 6e 64 20 3d 20 73 71 6c 69   labelEnd = sqli
14070 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
14080 28 76 29 3b 0a 20 20 6c 61 62 65 6c 43 6d 70 72  (v);.  labelCmpr
14090 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
140a0 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 0a 20 20  keLabel(v);...  
140b0 2f 2a 20 50 61 74 63 68 20 75 70 20 74 68 65 20  /* Patch up the 
140c0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 0a  ORDER BY clause.
140d0 20 20 2a 2f 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f    */.  op = p->o
140e0 70 3b 20 20 0a 20 20 70 50 72 69 6f 72 20 3d 20  p;  .  pPrior = 
140f0 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 61 73 73  p->pPrior;.  ass
14100 65 72 74 28 20 70 50 72 69 6f 72 2d 3e 70 4f 72  ert( pPrior->pOr
14110 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20 70 4f  derBy==0 );.  pO
14120 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64  rderBy = p->pOrd
14130 65 72 42 79 3b 0a 20 20 61 73 73 65 72 74 28 20  erBy;.  assert( 
14140 70 4f 72 64 65 72 42 79 20 29 3b 0a 20 20 6e 4f  pOrderBy );.  nO
14150 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42  rderBy = pOrderB
14160 79 2d 3e 6e 45 78 70 72 3b 0a 0a 20 20 2f 2a 20  y->nExpr;..  /* 
14170 46 6f 72 20 6f 70 65 72 61 74 6f 72 73 20 6f 74  For operators ot
14180 68 65 72 20 74 68 61 6e 20 55 4e 49 4f 4e 20 41  her than UNION A
14190 4c 4c 20 77 65 20 68 61 76 65 20 74 6f 20 6d 61  LL we have to ma
141a0 6b 65 20 73 75 72 65 20 74 68 61 74 0a 20 20 2a  ke sure that.  *
141b0 2a 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  * the ORDER BY c
141c0 6c 61 75 73 65 20 63 6f 76 65 72 73 20 65 76 65  lause covers eve
141d0 72 79 20 74 65 72 6d 20 6f 66 20 74 68 65 20 72  ry term of the r
141e0 65 73 75 6c 74 20 73 65 74 2e 20 20 41 64 64 0a  esult set.  Add.
141f0 20 20 2a 2a 20 74 65 72 6d 73 20 74 6f 20 74 68    ** terms to th
14200 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
14210 65 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e 0a  e as necessary..
14220 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 21 3d 54    */.  if( op!=T
14230 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 66 6f 72  K_ALL ){.    for
14240 28 69 3d 31 3b 20 64 62 2d 3e 6d 61 6c 6c 6f 63  (i=1; db->malloc
14250 46 61 69 6c 65 64 3d 3d 30 20 26 26 20 69 3c 3d  Failed==0 && i<=
14260 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
14270 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74  ; i++){.      st
14280 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
14290 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20  em *pItem;.     
142a0 20 66 6f 72 28 6a 3d 30 2c 20 70 49 74 65 6d 3d   for(j=0, pItem=
142b0 70 4f 72 64 65 72 42 79 2d 3e 61 3b 20 6a 3c 6e  pOrderBy->a; j<n
142c0 4f 72 64 65 72 42 79 3b 20 6a 2b 2b 2c 20 70 49  OrderBy; j++, pI
142d0 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  tem++){.        
142e0 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 69  assert( pItem->i
142f0 4f 72 64 65 72 42 79 43 6f 6c 3e 30 20 29 3b 0a  OrderByCol>0 );.
14300 20 20 20 20 20 20 20 20 69 66 28 20 70 49 74 65          if( pIte
14310 6d 2d 3e 69 4f 72 64 65 72 42 79 43 6f 6c 3d 3d  m->iOrderByCol==
14320 69 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  i ) break;.     
14330 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3d 3d   }.      if( j==
14340 6e 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  nOrderBy ){.    
14350 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 20 3d      Expr *pNew =
14360 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c   sqlite3Expr(db,
14370 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20 30 29 3b   TK_INTEGER, 0);
14380 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65  .        if( pNe
14390 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  w==0 ) return SQ
143a0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
143b0 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20      pNew->flags 
143c0 7c 3d 20 45 50 5f 49 6e 74 56 61 6c 75 65 3b 0a  |= EP_IntValue;.
143d0 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e          pNew->u.
143e0 69 56 61 6c 75 65 20 3d 20 69 3b 0a 20 20 20 20  iValue = i;.    
143f0 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20 73      pOrderBy = s
14400 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
14410 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70 4f 72  pend(pParse, pOr
14420 64 65 72 42 79 2c 20 70 4e 65 77 29 3b 0a 20 20  derBy, pNew);.  
14430 20 20 20 20 20 20 69 66 28 20 70 4f 72 64 65 72        if( pOrder
14440 42 79 20 29 20 70 4f 72 64 65 72 42 79 2d 3e 61  By ) pOrderBy->a
14450 5b 6e 4f 72 64 65 72 42 79 2b 2b 5d 2e 69 4f 72  [nOrderBy++].iOr
14460 64 65 72 42 79 43 6f 6c 20 3d 20 28 75 31 36 29  derByCol = (u16)
14470 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  i;.      }.    }
14480 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75  .  }..  /* Compu
14490 74 65 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  te the compariso
144a0 6e 20 70 65 72 6d 75 74 61 74 69 6f 6e 20 61 6e  n permutation an
144b0 64 20 6b 65 79 69 6e 66 6f 20 74 68 61 74 20 69  d keyinfo that i
144c0 73 20 75 73 65 64 20 77 69 74 68 0a 20 20 2a 2a  s used with.  **
144d0 20 74 68 65 20 70 65 72 6d 75 74 61 74 69 6f 6e   the permutation
144e0 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69   used to determi
144f0 6e 65 20 69 66 20 74 68 65 20 6e 65 78 74 0a 20  ne if the next. 
14500 20 2a 2a 20 72 6f 77 20 6f 66 20 72 65 73 75 6c   ** row of resul
14510 74 73 20 63 6f 6d 65 73 20 66 72 6f 6d 20 73 65  ts comes from se
14520 6c 65 63 74 41 20 6f 72 20 73 65 6c 65 63 74 42  lectA or selectB
14530 2e 20 20 41 6c 73 6f 20 61 64 64 20 65 78 70 6c  .  Also add expl
14540 69 63 69 74 0a 20 20 2a 2a 20 63 6f 6c 6c 61 74  icit.  ** collat
14550 69 6f 6e 73 20 74 6f 20 74 68 65 20 4f 52 44 45  ions to the ORDE
14560 52 20 42 59 20 63 6c 61 75 73 65 20 74 65 72 6d  R BY clause term
14570 73 20 73 6f 20 74 68 61 74 20 77 68 65 6e 20 74  s so that when t
14580 68 65 20 73 75 62 71 75 65 72 69 65 73 0a 20 20  he subqueries.  
14590 2a 2a 20 74 6f 20 74 68 65 20 72 69 67 68 74 20  ** to the right 
145a0 61 6e 64 20 74 68 65 20 6c 65 66 74 20 61 72 65  and the left are
145b0 20 65 76 61 6c 75 61 74 65 64 2c 20 74 68 65 79   evaluated, they
145c0 20 75 73 65 20 74 68 65 20 63 6f 72 72 65 63 74   use the correct
145d0 0a 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 2e  .  ** collation.
145e0 0a 20 20 2a 2f 0a 20 20 61 50 65 72 6d 75 74 65  .  */.  aPermute
145f0 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
14600 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66  ocRaw(db, sizeof
14610 28 69 6e 74 29 2a 6e 4f 72 64 65 72 42 79 29 3b  (int)*nOrderBy);
14620 0a 20 20 69 66 28 20 61 50 65 72 6d 75 74 65 20  .  if( aPermute 
14630 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78  ){.    struct Ex
14640 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
14650 65 6d 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c  em;.    for(i=0,
14660 20 70 49 74 65 6d 3d 70 4f 72 64 65 72 42 79 2d   pItem=pOrderBy-
14670 3e 61 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20  >a; i<nOrderBy; 
14680 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i++, pItem++){. 
14690 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74       assert( pIt
146a0 65 6d 2d 3e 69 4f 72 64 65 72 42 79 43 6f 6c 3e  em->iOrderByCol>
146b0 30 20 20 26 26 20 70 49 74 65 6d 2d 3e 69 4f 72  0  && pItem->iOr
146c0 64 65 72 42 79 43 6f 6c 3c 3d 70 2d 3e 70 45 4c  derByCol<=p->pEL
146d0 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20  ist->nExpr );.  
146e0 20 20 20 20 61 50 65 72 6d 75 74 65 5b 69 5d 20      aPermute[i] 
146f0 3d 20 70 49 74 65 6d 2d 3e 69 4f 72 64 65 72 42  = pItem->iOrderB
14700 79 43 6f 6c 20 2d 20 31 3b 0a 20 20 20 20 7d 0a  yCol - 1;.    }.
14710 20 20 20 20 70 4b 65 79 4d 65 72 67 65 20 3d 20      pKeyMerge = 
14720 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c  sqlite3KeyInfoAl
14730 6c 6f 63 28 64 62 2c 20 6e 4f 72 64 65 72 42 79  loc(db, nOrderBy
14740 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20 70 4b  , 1);.    if( pK
14750 65 79 4d 65 72 67 65 20 29 7b 0a 20 20 20 20 20  eyMerge ){.     
14760 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64   for(i=0; i<nOrd
14770 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  erBy; i++){.    
14780 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
14790 6c 6c 3b 0a 20 20 20 20 20 20 20 20 45 78 70 72  ll;.        Expr
147a0 20 2a 70 54 65 72 6d 20 3d 20 70 4f 72 64 65 72   *pTerm = pOrder
147b0 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  By->a[i].pExpr;.
147c0 20 20 20 20 20 20 20 20 69 66 28 20 70 54 65 72          if( pTer
147d0 6d 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 43 6f  m->flags & EP_Co
147e0 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 20 20 20  llate ){.       
147f0 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
14800 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
14810 61 72 73 65 2c 20 70 54 65 72 6d 29 3b 0a 20 20  arse, pTerm);.  
14820 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
14830 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 6d         pColl = m
14840 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65  ultiSelectCollSe
14850 71 28 70 50 61 72 73 65 2c 20 70 2c 20 61 50 65  q(pParse, p, aPe
14860 72 6d 75 74 65 5b 69 5d 29 3b 0a 20 20 20 20 20  rmute[i]);.     
14870 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 3d 3d       if( pColl==
14880 30 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e  0 ) pColl = db->
14890 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20  pDfltColl;.     
148a0 20 20 20 20 20 70 4f 72 64 65 72 42 79 2d 3e 61       pOrderBy->a
148b0 5b 69 5d 2e 70 45 78 70 72 20 3d 0a 20 20 20 20  [i].pExpr =.    
148c0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
148d0 45 78 70 72 41 64 64 43 6f 6c 6c 61 74 65 53 74  ExprAddCollateSt
148e0 72 69 6e 67 28 70 50 61 72 73 65 2c 20 70 54 65  ring(pParse, pTe
148f0 72 6d 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  rm, pColl->zName
14900 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
14910 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
14920 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69  ite3KeyInfoIsWri
14930 74 65 61 62 6c 65 28 70 4b 65 79 4d 65 72 67 65  teable(pKeyMerge
14940 29 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4b 65  ) );.        pKe
14950 79 4d 65 72 67 65 2d 3e 61 43 6f 6c 6c 5b 69 5d  yMerge->aColl[i]
14960 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20   = pColl;.      
14970 20 20 70 4b 65 79 4d 65 72 67 65 2d 3e 61 53 6f    pKeyMerge->aSo
14980 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 70 4f 72  rtOrder[i] = pOr
14990 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74  derBy->a[i].sort
149a0 4f 72 64 65 72 3b 0a 20 20 20 20 20 20 7d 0a 20  Order;.      }. 
149b0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
149c0 20 20 70 4b 65 79 4d 65 72 67 65 20 3d 20 30 3b    pKeyMerge = 0;
149d0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 74 74  .  }..  /* Reatt
149e0 61 63 68 20 74 68 65 20 4f 52 44 45 52 20 42 59  ach the ORDER BY
149f0 20 63 6c 61 75 73 65 20 74 6f 20 74 68 65 20 71   clause to the q
14a00 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e  uery..  */.  p->
14a10 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65  pOrderBy = pOrde
14a20 72 42 79 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 70  rBy;.  pPrior->p
14a30 4f 72 64 65 72 42 79 20 3d 20 73 71 6c 69 74 65  OrderBy = sqlite
14a40 33 45 78 70 72 4c 69 73 74 44 75 70 28 70 50 61  3ExprListDup(pPa
14a50 72 73 65 2d 3e 64 62 2c 20 70 4f 72 64 65 72 42  rse->db, pOrderB
14a60 79 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c  y, 0);..  /* All
14a70 6f 63 61 74 65 20 61 20 72 61 6e 67 65 20 6f 66  ocate a range of
14a80 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73   temporary regis
14a90 74 65 72 73 20 61 6e 64 20 74 68 65 20 4b 65 79  ters and the Key
14aa0 49 6e 66 6f 20 6e 65 65 64 65 64 0a 20 20 2a 2a  Info needed.  **
14ab0 20 66 6f 72 20 74 68 65 20 6c 6f 67 69 63 20 74   for the logic t
14ac0 68 61 74 20 72 65 6d 6f 76 65 73 20 64 75 70 6c  hat removes dupl
14ad0 69 63 61 74 65 20 72 65 73 75 6c 74 20 72 6f 77  icate result row
14ae0 73 20 77 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20  s when the.  ** 
14af0 6f 70 65 72 61 74 6f 72 20 69 73 20 55 4e 49 4f  operator is UNIO
14b00 4e 2c 20 45 58 43 45 50 54 2c 20 6f 72 20 49 4e  N, EXCEPT, or IN
14b10 54 45 52 53 45 43 54 20 28 62 75 74 20 6e 6f 74  TERSECT (but not
14b20 20 55 4e 49 4f 4e 20 41 4c 4c 29 2e 0a 20 20 2a   UNION ALL)..  *
14b30 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41  /.  if( op==TK_A
14b40 4c 4c 20 29 7b 0a 20 20 20 20 72 65 67 50 72 65  LL ){.    regPre
14b50 76 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  v = 0;.  }else{.
14b60 20 20 20 20 69 6e 74 20 6e 45 78 70 72 20 3d 20      int nExpr = 
14b70 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
14b80 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 4f  ;.    assert( nO
14b90 72 64 65 72 42 79 3e 3d 6e 45 78 70 72 20 7c 7c  rderBy>=nExpr ||
14ba0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
14bb0 64 20 29 3b 0a 20 20 20 20 72 65 67 50 72 65 76  d );.    regPrev
14bc0 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b   = pParse->nMem+
14bd0 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  1;.    pParse->n
14be0 4d 65 6d 20 2b 3d 20 6e 45 78 70 72 2b 31 3b 0a  Mem += nExpr+1;.
14bf0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
14c00 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
14c10 67 65 72 2c 20 30 2c 20 72 65 67 50 72 65 76 29  ger, 0, regPrev)
14c20 3b 0a 20 20 20 20 70 4b 65 79 44 75 70 20 3d 20  ;.    pKeyDup = 
14c30 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c  sqlite3KeyInfoAl
14c40 6c 6f 63 28 64 62 2c 20 6e 45 78 70 72 2c 20 31  loc(db, nExpr, 1
14c50 29 3b 0a 20 20 20 20 69 66 28 20 70 4b 65 79 44  );.    if( pKeyD
14c60 75 70 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  up ){.      asse
14c70 72 74 28 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  rt( sqlite3KeyIn
14c80 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28 70 4b  foIsWriteable(pK
14c90 65 79 44 75 70 29 20 29 3b 0a 20 20 20 20 20 20  eyDup) );.      
14ca0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72  for(i=0; i<nExpr
14cb0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
14cc0 70 4b 65 79 44 75 70 2d 3e 61 43 6f 6c 6c 5b 69  pKeyDup->aColl[i
14cd0 5d 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43  ] = multiSelectC
14ce0 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
14cf0 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 70 4b  , i);.        pK
14d00 65 79 44 75 70 2d 3e 61 53 6f 72 74 4f 72 64 65  eyDup->aSortOrde
14d10 72 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  r[i] = 0;.      
14d20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 0a 20 20  }.    }.  }. .  
14d30 2f 2a 20 53 65 70 61 72 61 74 65 20 74 68 65 20  /* Separate the 
14d40 6c 65 66 74 20 61 6e 64 20 74 68 65 20 72 69 67  left and the rig
14d50 68 74 20 71 75 65 72 79 20 66 72 6f 6d 20 6f 6e  ht query from on
14d60 65 20 61 6e 6f 74 68 65 72 0a 20 20 2a 2f 0a 20  e another.  */. 
14d70 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a   p->pPrior = 0;.
14d80 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65    sqlite3Resolve
14d90 4f 72 64 65 72 47 72 6f 75 70 42 79 28 70 50 61  OrderGroupBy(pPa
14da0 72 73 65 2c 20 70 2c 20 70 2d 3e 70 4f 72 64 65  rse, p, p->pOrde
14db0 72 42 79 2c 20 22 4f 52 44 45 52 22 29 3b 0a 20  rBy, "ORDER");. 
14dc0 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70 50 72   if( pPrior->pPr
14dd0 69 6f 72 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  ior==0 ){.    sq
14de0 6c 69 74 65 33 52 65 73 6f 6c 76 65 4f 72 64 65  lite3ResolveOrde
14df0 72 47 72 6f 75 70 42 79 28 70 50 61 72 73 65 2c  rGroupBy(pParse,
14e00 20 70 50 72 69 6f 72 2c 20 70 50 72 69 6f 72 2d   pPrior, pPrior-
14e10 3e 70 4f 72 64 65 72 42 79 2c 20 22 4f 52 44 45  >pOrderBy, "ORDE
14e20 52 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  R");.  }..  /* C
14e30 6f 6d 70 75 74 65 20 74 68 65 20 6c 69 6d 69 74  ompute the limit
14e40 20 72 65 67 69 73 74 65 72 73 20 2a 2f 0a 20 20   registers */.  
14e50 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69  computeLimitRegi
14e60 73 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c  sters(pParse, p,
14e70 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 69 66   labelEnd);.  if
14e80 28 20 70 2d 3e 69 4c 69 6d 69 74 20 26 26 20 6f  ( p->iLimit && o
14e90 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20  p==TK_ALL ){.   
14ea0 20 72 65 67 4c 69 6d 69 74 41 20 3d 20 2b 2b 70   regLimitA = ++p
14eb0 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
14ec0 20 72 65 67 4c 69 6d 69 74 42 20 3d 20 2b 2b 70   regLimitB = ++p
14ed0 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
14ee0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14ef0 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 70  p2(v, OP_Copy, p
14f00 2d 3e 69 4f 66 66 73 65 74 20 3f 20 70 2d 3e 69  ->iOffset ? p->i
14f10 4f 66 66 73 65 74 2b 31 20 3a 20 70 2d 3e 69 4c  Offset+1 : p->iL
14f20 69 6d 69 74 2c 0a 20 20 20 20 20 20 20 20 20 20  imit,.          
14f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14f40 20 20 20 20 20 20 20 20 72 65 67 4c 69 6d 69 74          regLimit
14f50 41 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  A);.    sqlite3V
14f60 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
14f70 43 6f 70 79 2c 20 72 65 67 4c 69 6d 69 74 41 2c  Copy, regLimitA,
14f80 20 72 65 67 4c 69 6d 69 74 42 29 3b 0a 20 20 7d   regLimitB);.  }
14f90 65 6c 73 65 7b 0a 20 20 20 20 72 65 67 4c 69 6d  else{.    regLim
14fa0 69 74 41 20 3d 20 72 65 67 4c 69 6d 69 74 42 20  itA = regLimitB 
14fb0 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  = 0;.  }.  sqlit
14fc0 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
14fd0 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 70   p->pLimit);.  p
14fe0 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->pLimit = 0;.  
14ff0 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
15000 65 28 64 62 2c 20 70 2d 3e 70 4f 66 66 73 65 74  e(db, p->pOffset
15010 29 3b 0a 20 20 70 2d 3e 70 4f 66 66 73 65 74 20  );.  p->pOffset 
15020 3d 20 30 3b 0a 0a 20 20 72 65 67 41 64 64 72 41  = 0;..  regAddrA
15030 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
15040 6d 3b 0a 20 20 72 65 67 45 6f 66 41 20 3d 20 2b  m;.  regEofA = +
15050 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
15060 20 72 65 67 41 64 64 72 42 20 3d 20 2b 2b 70 50   regAddrB = ++pP
15070 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65  arse->nMem;.  re
15080 67 45 6f 66 42 20 3d 20 2b 2b 70 50 61 72 73 65  gEofB = ++pParse
15090 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 4f 75 74  ->nMem;.  regOut
150a0 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  A = ++pParse->nM
150b0 65 6d 3b 0a 20 20 72 65 67 4f 75 74 42 20 3d 20  em;.  regOutB = 
150c0 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
150d0 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
150e0 65 73 74 49 6e 69 74 28 26 64 65 73 74 41 2c 20  estInit(&destA, 
150f0 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 72  SRT_Coroutine, r
15100 65 67 41 64 64 72 41 29 3b 0a 20 20 73 71 6c 69  egAddrA);.  sqli
15110 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69  te3SelectDestIni
15120 74 28 26 64 65 73 74 42 2c 20 53 52 54 5f 43 6f  t(&destB, SRT_Co
15130 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72  routine, regAddr
15140 42 29 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 70  B);..  /* Jump p
15150 61 73 74 20 74 68 65 20 76 61 72 69 6f 75 73 20  ast the various 
15160 73 75 62 72 6f 75 74 69 6e 65 73 20 61 6e 64 20  subroutines and 
15170 63 6f 72 6f 75 74 69 6e 65 73 20 74 6f 20 74 68  coroutines to th
15180 65 20 6d 61 69 6e 0a 20 20 2a 2a 20 6d 65 72 67  e main.  ** merg
15190 65 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20 20 6a 31  e loop.  */.  j1
151a0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
151b0 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74 6f 29  dOp0(v, OP_Goto)
151c0 3b 0a 20 20 61 64 64 72 53 65 6c 65 63 74 41 20  ;.  addrSelectA 
151d0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
151e0 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 0a 0a 20  rentAddr(v);... 
151f0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 63   /* Generate a c
15200 6f 72 6f 75 74 69 6e 65 20 74 6f 20 65 76 61 6c  oroutine to eval
15210 75 61 74 65 20 74 68 65 20 53 45 4c 45 43 54 20  uate the SELECT 
15220 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 74 68 65  statement to the
15230 0a 20 20 2a 2a 20 6c 65 66 74 20 6f 66 20 74 68  .  ** left of th
15240 65 20 63 6f 6d 70 6f 75 6e 64 20 6f 70 65 72 61  e compound opera
15250 74 6f 72 20 2d 20 74 68 65 20 22 41 22 20 73 65  tor - the "A" se
15260 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 56 64 62  lect..  */.  Vdb
15270 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c  eNoopComment((v,
15280 20 22 42 65 67 69 6e 20 63 6f 72 6f 75 74 69 6e   "Begin coroutin
15290 65 20 66 6f 72 20 6c 65 66 74 20 53 45 4c 45 43  e for left SELEC
152a0 54 22 29 29 3b 0a 20 20 70 50 72 69 6f 72 2d 3e  T"));.  pPrior->
152b0 69 4c 69 6d 69 74 20 3d 20 72 65 67 4c 69 6d 69  iLimit = regLimi
152c0 74 41 3b 0a 20 20 65 78 70 6c 61 69 6e 53 65 74  tA;.  explainSet
152d0 49 6e 74 65 67 65 72 28 69 53 75 62 31 2c 20 70  Integer(iSub1, p
152e0 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65  Parse->iNextSele
152f0 63 74 49 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  ctId);.  sqlite3
15300 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
15310 50 72 69 6f 72 2c 20 26 64 65 73 74 41 29 3b 0a  Prior, &destA);.
15320 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15330 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
15340 72 2c 20 31 2c 20 72 65 67 45 6f 66 41 29 3b 0a  r, 1, regEofA);.
15350 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15360 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c  Op1(v, OP_Yield,
15370 20 72 65 67 41 64 64 72 41 29 3b 0a 20 20 56 64   regAddrA);.  Vd
15380 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76  beNoopComment((v
15390 2c 20 22 45 6e 64 20 63 6f 72 6f 75 74 69 6e 65  , "End coroutine
153a0 20 66 6f 72 20 6c 65 66 74 20 53 45 4c 45 43 54   for left SELECT
153b0 22 29 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  "));..  /* Gener
153c0 61 74 65 20 61 20 63 6f 72 6f 75 74 69 6e 65 20  ate a coroutine 
153d0 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65 20  to evaluate the 
153e0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
153f0 20 6f 6e 20 0a 20 20 2a 2a 20 74 68 65 20 72 69   on .  ** the ri
15400 67 68 74 20 2d 20 74 68 65 20 22 42 22 20 73 65  ght - the "B" se
15410 6c 65 63 74 0a 20 20 2a 2f 0a 20 20 61 64 64 72  lect.  */.  addr
15420 53 65 6c 65 63 74 42 20 3d 20 73 71 6c 69 74 65  SelectB = sqlite
15430 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
15440 28 76 29 3b 0a 20 20 56 64 62 65 4e 6f 6f 70 43  (v);.  VdbeNoopC
15450 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 42 65 67 69  omment((v, "Begi
15460 6e 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20  n coroutine for 
15470 72 69 67 68 74 20 53 45 4c 45 43 54 22 29 29 3b  right SELECT"));
15480 0a 20 20 73 61 76 65 64 4c 69 6d 69 74 20 3d 20  .  savedLimit = 
15490 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 73 61 76  p->iLimit;.  sav
154a0 65 64 4f 66 66 73 65 74 20 3d 20 70 2d 3e 69 4f  edOffset = p->iO
154b0 66 66 73 65 74 3b 0a 20 20 70 2d 3e 69 4c 69 6d  ffset;.  p->iLim
154c0 69 74 20 3d 20 72 65 67 4c 69 6d 69 74 42 3b 0a  it = regLimitB;.
154d0 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30    p->iOffset = 0
154e0 3b 20 20 0a 20 20 65 78 70 6c 61 69 6e 53 65 74  ;  .  explainSet
154f0 49 6e 74 65 67 65 72 28 69 53 75 62 32 2c 20 70  Integer(iSub2, p
15500 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65  Parse->iNextSele
15510 63 74 49 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  ctId);.  sqlite3
15520 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
15530 2c 20 26 64 65 73 74 42 29 3b 0a 20 20 70 2d 3e  , &destB);.  p->
15540 69 4c 69 6d 69 74 20 3d 20 73 61 76 65 64 4c 69  iLimit = savedLi
15550 6d 69 74 3b 0a 20 20 70 2d 3e 69 4f 66 66 73 65  mit;.  p->iOffse
15560 74 20 3d 20 73 61 76 65 64 4f 66 66 73 65 74 3b  t = savedOffset;
15570 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
15580 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
15590 65 72 2c 20 31 2c 20 72 65 67 45 6f 66 42 29 3b  er, 1, regEofB);
155a0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
155b0 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64  dOp1(v, OP_Yield
155c0 2c 20 72 65 67 41 64 64 72 42 29 3b 0a 20 20 56  , regAddrB);.  V
155d0 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28  dbeNoopComment((
155e0 76 2c 20 22 45 6e 64 20 63 6f 72 6f 75 74 69 6e  v, "End coroutin
155f0 65 20 66 6f 72 20 72 69 67 68 74 20 53 45 4c 45  e for right SELE
15600 43 54 22 29 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e  CT"));..  /* Gen
15610 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69  erate a subrouti
15620 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74 73 20  ne that outputs 
15630 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20  the current row 
15640 6f 66 20 74 68 65 20 41 0a 20 20 2a 2a 20 73 65  of the A.  ** se
15650 6c 65 63 74 20 61 73 20 74 68 65 20 6e 65 78 74  lect as the next
15660 20 6f 75 74 70 75 74 20 72 6f 77 20 6f 66 20 74   output row of t
15670 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65  he compound sele
15680 63 74 2e 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e  ct..  */.  VdbeN
15690 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  oopComment((v, "
156a0 4f 75 74 70 75 74 20 72 6f 75 74 69 6e 65 20 66  Output routine f
156b0 6f 72 20 41 22 29 29 3b 0a 20 20 61 64 64 72 4f  or A"));.  addrO
156c0 75 74 41 20 3d 20 67 65 6e 65 72 61 74 65 4f 75  utA = generateOu
156d0 74 70 75 74 53 75 62 72 6f 75 74 69 6e 65 28 70  tputSubroutine(p
156e0 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20  Parse,.         
156f0 20 20 20 20 20 20 20 20 70 2c 20 26 64 65 73 74          p, &dest
15700 41 2c 20 70 44 65 73 74 2c 20 72 65 67 4f 75 74  A, pDest, regOut
15710 41 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  A,.             
15720 20 20 20 20 72 65 67 50 72 65 76 2c 20 70 4b 65      regPrev, pKe
15730 79 44 75 70 2c 20 6c 61 62 65 6c 45 6e 64 29 3b  yDup, labelEnd);
15740 0a 20 20 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  .  .  /* Generat
15750 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74  e a subroutine t
15760 68 61 74 20 6f 75 74 70 75 74 73 20 74 68 65 20  hat outputs the 
15770 63 75 72 72 65 6e 74 20 72 6f 77 20 6f 66 20 74  current row of t
15780 68 65 20 42 0a 20 20 2a 2a 20 73 65 6c 65 63 74  he B.  ** select
15790 20 61 73 20 74 68 65 20 6e 65 78 74 20 6f 75 74   as the next out
157a0 70 75 74 20 72 6f 77 20 6f 66 20 74 68 65 20 63  put row of the c
157b0 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a  ompound select..
157c0 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54    */.  if( op==T
157d0 4b 5f 41 4c 4c 20 7c 7c 20 6f 70 3d 3d 54 4b 5f  K_ALL || op==TK_
157e0 55 4e 49 4f 4e 20 29 7b 0a 20 20 20 20 56 64 62  UNION ){.    Vdb
157f0 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c  eNoopComment((v,
15800 20 22 4f 75 74 70 75 74 20 72 6f 75 74 69 6e 65   "Output routine
15810 20 66 6f 72 20 42 22 29 29 3b 0a 20 20 20 20 61   for B"));.    a
15820 64 64 72 4f 75 74 42 20 3d 20 67 65 6e 65 72 61  ddrOutB = genera
15830 74 65 4f 75 74 70 75 74 53 75 62 72 6f 75 74 69  teOutputSubrouti
15840 6e 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  ne(pParse,.     
15850 20 20 20 20 20 20 20 20 20 20 20 20 70 2c 20 26              p, &
15860 64 65 73 74 42 2c 20 70 44 65 73 74 2c 20 72 65  destB, pDest, re
15870 67 4f 75 74 42 2c 0a 20 20 20 20 20 20 20 20 20  gOutB,.         
15880 20 20 20 20 20 20 20 20 72 65 67 50 72 65 76 2c          regPrev,
15890 20 70 4b 65 79 44 75 70 2c 20 6c 61 62 65 6c 45   pKeyDup, labelE
158a0 6e 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  nd);.  }.  sqlit
158b0 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 70  e3KeyInfoUnref(p
158c0 4b 65 79 44 75 70 29 3b 0a 0a 20 20 2f 2a 20 47  KeyDup);..  /* G
158d0 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75  enerate a subrou
158e0 74 69 6e 65 20 74 6f 20 72 75 6e 20 77 68 65 6e  tine to run when
158f0 20 74 68 65 20 72 65 73 75 6c 74 73 20 66 72 6f   the results fro
15900 6d 20 73 65 6c 65 63 74 20 41 0a 20 20 2a 2a 20  m select A.  ** 
15910 61 72 65 20 65 78 68 61 75 73 74 65 64 20 61 6e  are exhausted an
15920 64 20 6f 6e 6c 79 20 64 61 74 61 20 69 6e 20 73  d only data in s
15930 65 6c 65 63 74 20 42 20 72 65 6d 61 69 6e 73 2e  elect B remains.
15940 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70  .  */.  VdbeNoop
15950 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6f 66  Comment((v, "eof
15960 2d 41 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29  -A subroutine"))
15970 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 45  ;.  if( op==TK_E
15980 58 43 45 50 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f  XCEPT || op==TK_
15990 49 4e 54 45 52 53 45 43 54 20 29 7b 0a 20 20 20  INTERSECT ){.   
159a0 20 61 64 64 72 45 6f 66 41 20 3d 20 73 71 6c 69   addrEofA = sqli
159b0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
159c0 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c 61 62   OP_Goto, 0, lab
159d0 65 6c 45 6e 64 29 3b 0a 20 20 7d 65 6c 73 65 7b  elEnd);.  }else{
159e0 20 20 0a 20 20 20 20 61 64 64 72 45 6f 66 41 20    .    addrEofA 
159f0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
15a00 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65  Op2(v, OP_If, re
15a10 67 45 6f 66 42 2c 20 6c 61 62 65 6c 45 6e 64 29  gEofB, labelEnd)
15a20 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
15a30 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
15a40 73 75 62 2c 20 72 65 67 4f 75 74 42 2c 20 61 64  sub, regOutB, ad
15a50 64 72 4f 75 74 42 29 3b 0a 20 20 20 20 73 71 6c  drOutB);.    sql
15a60 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
15a70 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41  , OP_Yield, regA
15a80 64 64 72 42 29 3b 0a 20 20 20 20 73 71 6c 69 74  ddrB);.    sqlit
15a90 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
15aa0 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72  OP_Goto, 0, addr
15ab0 45 6f 66 41 29 3b 0a 20 20 20 20 70 2d 3e 6e 53  EofA);.    p->nS
15ac0 65 6c 65 63 74 52 6f 77 20 2b 3d 20 70 50 72 69  electRow += pPri
15ad0 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a  or->nSelectRow;.
15ae0 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61    }..  /* Genera
15af0 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  te a subroutine 
15b00 74 6f 20 72 75 6e 20 77 68 65 6e 20 74 68 65 20  to run when the 
15b10 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 73 65 6c  results from sel
15b20 65 63 74 20 42 0a 20 20 2a 2a 20 61 72 65 20 65  ect B.  ** are e
15b30 78 68 61 75 73 74 65 64 20 61 6e 64 20 6f 6e 6c  xhausted and onl
15b40 79 20 64 61 74 61 20 69 6e 20 73 65 6c 65 63 74  y data in select
15b50 20 41 20 72 65 6d 61 69 6e 73 2e 0a 20 20 2a 2f   A remains..  */
15b60 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e  .  if( op==TK_IN
15b70 54 45 52 53 45 43 54 20 29 7b 0a 20 20 20 20 61  TERSECT ){.    a
15b80 64 64 72 45 6f 66 42 20 3d 20 61 64 64 72 45 6f  ddrEofB = addrEo
15b90 66 41 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e  fA;.    if( p->n
15ba0 53 65 6c 65 63 74 52 6f 77 20 3e 20 70 50 72 69  SelectRow > pPri
15bb0 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 29  or->nSelectRow )
15bc0 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d   p->nSelectRow =
15bd0 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74   pPrior->nSelect
15be0 52 6f 77 3b 0a 20 20 7d 65 6c 73 65 7b 20 20 0a  Row;.  }else{  .
15bf0 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d      VdbeNoopComm
15c00 65 6e 74 28 28 76 2c 20 22 65 6f 66 2d 42 20 73  ent((v, "eof-B s
15c10 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20  ubroutine"));.  
15c20 20 20 61 64 64 72 45 6f 66 42 20 3d 20 73 71 6c    addrEofB = sql
15c30 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
15c40 2c 20 4f 50 5f 49 66 2c 20 72 65 67 45 6f 66 41  , OP_If, regEofA
15c50 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 20  , labelEnd);.   
15c60 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15c70 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
15c80 72 65 67 4f 75 74 41 2c 20 61 64 64 72 4f 75 74  regOutA, addrOut
15c90 41 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  A);.    sqlite3V
15ca0 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
15cb0 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41 29  Yield, regAddrA)
15cc0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
15cd0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
15ce0 74 6f 2c 20 30 2c 20 61 64 64 72 45 6f 66 42 29  to, 0, addrEofB)
15cf0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65  ;.  }..  /* Gene
15d00 72 61 74 65 20 63 6f 64 65 20 74 6f 20 68 61 6e  rate code to han
15d10 64 6c 65 20 74 68 65 20 63 61 73 65 20 6f 66 20  dle the case of 
15d20 41 3c 42 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e  A<B.  */.  VdbeN
15d30 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  oopComment((v, "
15d40 41 2d 6c 74 2d 42 20 73 75 62 72 6f 75 74 69 6e  A-lt-B subroutin
15d50 65 22 29 29 3b 0a 20 20 61 64 64 72 41 6c 74 42  e"));.  addrAltB
15d60 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
15d70 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
15d80 2c 20 72 65 67 4f 75 74 41 2c 20 61 64 64 72 4f  , regOutA, addrO
15d90 75 74 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  utA);.  sqlite3V
15da0 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
15db0 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41 29  Yield, regAddrA)
15dc0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
15dd0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20  ddOp2(v, OP_If, 
15de0 72 65 67 45 6f 66 41 2c 20 61 64 64 72 45 6f 66  regEofA, addrEof
15df0 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  A);.  sqlite3Vdb
15e00 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
15e10 74 6f 2c 20 30 2c 20 6c 61 62 65 6c 43 6d 70 72  to, 0, labelCmpr
15e20 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  );..  /* Generat
15e30 65 20 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c 65  e code to handle
15e40 20 74 68 65 20 63 61 73 65 20 6f 66 20 41 3d 3d   the case of A==
15e50 42 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d  B.  */.  if( op=
15e60 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 61  =TK_ALL ){.    a
15e70 64 64 72 41 65 71 42 20 3d 20 61 64 64 72 41 6c  ddrAeqB = addrAl
15e80 74 42 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  tB;.  }else if( 
15e90 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54  op==TK_INTERSECT
15ea0 20 29 7b 0a 20 20 20 20 61 64 64 72 41 65 71 42   ){.    addrAeqB
15eb0 20 3d 20 61 64 64 72 41 6c 74 42 3b 0a 20 20 20   = addrAltB;.   
15ec0 20 61 64 64 72 41 6c 74 42 2b 2b 3b 0a 20 20 7d   addrAltB++;.  }
15ed0 65 6c 73 65 7b 0a 20 20 20 20 56 64 62 65 4e 6f  else{.    VdbeNo
15ee0 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 41  opComment((v, "A
15ef0 2d 65 71 2d 42 20 73 75 62 72 6f 75 74 69 6e 65  -eq-B subroutine
15f00 22 29 29 3b 0a 20 20 20 20 61 64 64 72 41 65 71  "));.    addrAeq
15f10 42 20 3d 0a 20 20 20 20 73 71 6c 69 74 65 33 56  B =.    sqlite3V
15f20 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
15f30 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41 29  Yield, regAddrA)
15f40 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
15f50 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66  eAddOp2(v, OP_If
15f60 2c 20 72 65 67 45 6f 66 41 2c 20 61 64 64 72 45  , regEofA, addrE
15f70 6f 66 41 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ofA);.    sqlite
15f80 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
15f90 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c 61 62 65 6c  P_Goto, 0, label
15fa0 43 6d 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Cmpr);.  }..  /*
15fb0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
15fc0 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 63 61 73  o handle the cas
15fd0 65 20 6f 66 20 41 3e 42 0a 20 20 2a 2f 0a 20 20  e of A>B.  */.  
15fe0 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28  VdbeNoopComment(
15ff0 28 76 2c 20 22 41 2d 67 74 2d 42 20 73 75 62 72  (v, "A-gt-B subr
16000 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 61 64 64  outine"));.  add
16010 72 41 67 74 42 20 3d 20 73 71 6c 69 74 65 33 56  rAgtB = sqlite3V
16020 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
16030 29 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  );.  if( op==TK_
16040 41 4c 4c 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 4e  ALL || op==TK_UN
16050 49 4f 4e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ION ){.    sqlit
16060 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
16070 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74  OP_Gosub, regOut
16080 42 2c 20 61 64 64 72 4f 75 74 42 29 3b 0a 20 20  B, addrOutB);.  
16090 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  }.  sqlite3VdbeA
160a0 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c  ddOp1(v, OP_Yiel
160b0 64 2c 20 72 65 67 41 64 64 72 42 29 3b 0a 20 20  d, regAddrB);.  
160c0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
160d0 32 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 45  2(v, OP_If, regE
160e0 6f 66 42 2c 20 61 64 64 72 45 6f 66 42 29 3b 0a  ofB, addrEofB);.
160f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
16100 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
16110 30 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 0a  0, labelCmpr);..
16120 20 20 2f 2a 20 54 68 69 73 20 63 6f 64 65 20 72    /* This code r
16130 75 6e 73 20 6f 6e 63 65 20 74 6f 20 69 6e 69 74  uns once to init
16140 69 61 6c 69 7a 65 20 65 76 65 72 79 74 68 69 6e  ialize everythin
16150 67 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  g..  */.  sqlite
16160 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
16170 20 6a 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56   j1);.  sqlite3V
16180 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
16190 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67 45  Integer, 0, regE
161a0 6f 66 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ofA);.  sqlite3V
161b0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
161c0 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67 45  Integer, 0, regE
161d0 6f 66 42 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ofB);.  sqlite3V
161e0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
161f0 47 6f 73 75 62 2c 20 72 65 67 41 64 64 72 41 2c  Gosub, regAddrA,
16200 20 61 64 64 72 53 65 6c 65 63 74 41 29 3b 0a 20   addrSelectA);. 
16210 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
16220 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
16230 72 65 67 41 64 64 72 42 2c 20 61 64 64 72 53 65  regAddrB, addrSe
16240 6c 65 63 74 42 29 3b 0a 20 20 73 71 6c 69 74 65  lectB);.  sqlite
16250 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
16260 50 5f 49 66 2c 20 72 65 67 45 6f 66 41 2c 20 61  P_If, regEofA, a
16270 64 64 72 45 6f 66 41 29 3b 0a 20 20 73 71 6c 69  ddrEofA);.  sqli
16280 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
16290 20 4f 50 5f 49 66 2c 20 72 65 67 45 6f 66 42 2c   OP_If, regEofB,
162a0 20 61 64 64 72 45 6f 66 42 29 3b 0a 0a 20 20 2f   addrEofB);..  /
162b0 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  * Implement the 
162c0 6d 61 69 6e 20 6d 65 72 67 65 20 6c 6f 6f 70 0a  main merge loop.
162d0 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64    */.  sqlite3Vd
162e0 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
162f0 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 20 20  , labelCmpr);.  
16300 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
16310 34 28 76 2c 20 4f 50 5f 50 65 72 6d 75 74 61 74  4(v, OP_Permutat
16320 69 6f 6e 2c 20 30 2c 20 30 2c 20 30 2c 20 28 63  ion, 0, 0, 0, (c
16330 68 61 72 2a 29 61 50 65 72 6d 75 74 65 2c 20 50  har*)aPermute, P
16340 34 5f 49 4e 54 41 52 52 41 59 29 3b 0a 20 20 73  4_INTARRAY);.  s
16350 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
16360 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20  (v, OP_Compare, 
16370 64 65 73 74 41 2e 69 53 64 73 74 2c 20 64 65 73  destA.iSdst, des
16380 74 42 2e 69 53 64 73 74 2c 20 6e 4f 72 64 65 72  tB.iSdst, nOrder
16390 42 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  By,.            
163a0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
163b0 61 72 2a 29 70 4b 65 79 4d 65 72 67 65 2c 20 50  ar*)pKeyMerge, P
163c0 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 73 71  4_KEYINFO);.  sq
163d0 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
163e0 35 28 76 2c 20 4f 50 46 4c 41 47 5f 50 45 52 4d  5(v, OPFLAG_PERM
163f0 55 54 45 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  UTE);.  sqlite3V
16400 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
16410 4a 75 6d 70 2c 20 61 64 64 72 41 6c 74 42 2c 20  Jump, addrAltB, 
16420 61 64 64 72 41 65 71 42 2c 20 61 64 64 72 41 67  addrAeqB, addrAg
16430 74 42 29 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20  tB);..  /* Jump 
16440 74 6f 20 74 68 65 20 74 68 69 73 20 70 6f 69 6e  to the this poin
16450 74 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 74 65  t in order to te
16460 72 6d 69 6e 61 74 65 20 74 68 65 20 71 75 65 72  rminate the quer
16470 79 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  y..  */.  sqlite
16480 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
16490 6c 28 76 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a  l(v, labelEnd);.
164a0 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6e 75  .  /* Set the nu
164b0 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20 63  mber of output c
164c0 6f 6c 75 6d 6e 73 0a 20 20 2a 2f 0a 20 20 69 66  olumns.  */.  if
164d0 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d  ( pDest->eDest==
164e0 53 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20  SRT_Output ){.  
164f0 20 20 53 65 6c 65 63 74 20 2a 70 46 69 72 73 74    Select *pFirst
16500 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 77   = pPrior;.    w
16510 68 69 6c 65 28 20 70 46 69 72 73 74 2d 3e 70 50  hile( pFirst->pP
16520 72 69 6f 72 20 29 20 70 46 69 72 73 74 20 3d 20  rior ) pFirst = 
16530 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 3b 0a  pFirst->pPrior;.
16540 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75      generateColu
16550 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20  mnNames(pParse, 
16560 30 2c 20 70 46 69 72 73 74 2d 3e 70 45 4c 69 73  0, pFirst->pELis
16570 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65  t);.  }..  /* Re
16580 61 73 73 65 6d 62 6c 79 20 74 68 65 20 63 6f 6d  assembly the com
16590 70 6f 75 6e 64 20 71 75 65 72 79 20 73 6f 20 74  pound query so t
165a0 68 61 74 20 69 74 20 77 69 6c 6c 20 62 65 20 66  hat it will be f
165b0 72 65 65 64 20 63 6f 72 72 65 63 74 6c 79 0a 20  reed correctly. 
165c0 20 2a 2a 20 62 79 20 74 68 65 20 63 61 6c 6c 69   ** by the calli
165d0 6e 67 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  ng function */. 
165e0 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29   if( p->pPrior )
165f0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c  {.    sqlite3Sel
16600 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  ectDelete(db, p-
16610 3e 70 50 72 69 6f 72 29 3b 0a 20 20 7d 0a 20 20  >pPrior);.  }.  
16620 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69  p->pPrior = pPri
16630 6f 72 3b 0a 0a 20 20 2f 2a 2a 2a 20 54 42 44 3a  or;..  /*** TBD:
16640 20 20 49 6e 73 65 72 74 20 73 75 62 72 6f 75 74    Insert subrout
16650 69 6e 65 20 63 61 6c 6c 73 20 74 6f 20 63 6c 6f  ine calls to clo
16660 73 65 20 63 75 72 73 6f 72 73 20 6f 6e 20 69 6e  se cursors on in
16670 63 6f 6d 70 6c 65 74 65 0a 20 20 2a 2a 2a 2a 20  complete.  **** 
16680 73 75 62 71 75 65 72 69 65 73 20 2a 2a 2a 2a 2f  subqueries ****/
16690 0a 20 20 65 78 70 6c 61 69 6e 43 6f 6d 70 6f 73  .  explainCompos
166a0 69 74 65 28 70 50 61 72 73 65 2c 20 70 2d 3e 6f  ite(pParse, p->o
166b0 70 2c 20 69 53 75 62 31 2c 20 69 53 75 62 32 2c  p, iSub1, iSub2,
166c0 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51   0);.  return SQ
166d0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
166e0 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  f..#if !defined(
166f0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
16700 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65  UERY) || !define
16710 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
16720 45 57 29 0a 2f 2a 20 46 6f 72 77 61 72 64 20 44  EW)./* Forward D
16730 65 63 6c 61 72 61 74 69 6f 6e 73 20 2a 2f 0a 73  eclarations */.s
16740 74 61 74 69 63 20 76 6f 69 64 20 73 75 62 73 74  tatic void subst
16750 45 78 70 72 4c 69 73 74 28 73 71 6c 69 74 65 33  ExprList(sqlite3
16760 2a 2c 20 45 78 70 72 4c 69 73 74 2a 2c 20 69 6e  *, ExprList*, in
16770 74 2c 20 45 78 70 72 4c 69 73 74 2a 29 3b 0a 73  t, ExprList*);.s
16780 74 61 74 69 63 20 76 6f 69 64 20 73 75 62 73 74  tatic void subst
16790 53 65 6c 65 63 74 28 73 71 6c 69 74 65 33 2a 2c  Select(sqlite3*,
167a0 20 53 65 6c 65 63 74 20 2a 2c 20 69 6e 74 2c 20   Select *, int, 
167b0 45 78 70 72 4c 69 73 74 20 2a 29 3b 0a 0a 2f 2a  ExprList *);../*
167c0 0a 2a 2a 20 53 63 61 6e 20 74 68 72 6f 75 67 68  .** Scan through
167d0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
167e0 70 45 78 70 72 2e 20 20 52 65 70 6c 61 63 65 20  pExpr.  Replace 
167f0 65 76 65 72 79 20 72 65 66 65 72 65 6e 63 65 20  every reference 
16800 74 6f 0a 2a 2a 20 61 20 63 6f 6c 75 6d 6e 20 69  to.** a column i
16810 6e 20 74 61 62 6c 65 20 6e 75 6d 62 65 72 20 69  n table number i
16820 54 61 62 6c 65 20 77 69 74 68 20 61 20 63 6f 70  Table with a cop
16830 79 20 6f 66 20 74 68 65 20 69 43 6f 6c 75 6d 6e  y of the iColumn
16840 2d 74 68 0a 2a 2a 20 65 6e 74 72 79 20 69 6e 20  -th.** entry in 
16850 70 45 4c 69 73 74 2e 20 20 28 42 75 74 20 6c 65  pEList.  (But le
16860 61 76 65 20 72 65 66 65 72 65 6e 63 65 73 20 74  ave references t
16870 6f 20 74 68 65 20 52 4f 57 49 44 20 63 6f 6c 75  o the ROWID colu
16880 6d 6e 20 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64  mn .** unchanged
16890 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  .).**.** This ro
168a0 75 74 69 6e 65 20 69 73 20 70 61 72 74 20 6f 66  utine is part of
168b0 20 74 68 65 20 66 6c 61 74 74 65 6e 69 6e 67 20   the flattening 
168c0 70 72 6f 63 65 64 75 72 65 2e 20 20 41 20 73 75  procedure.  A su
168d0 62 71 75 65 72 79 0a 2a 2a 20 77 68 6f 73 65 20  bquery.** whose 
168e0 72 65 73 75 6c 74 20 73 65 74 20 69 73 20 64 65  result set is de
168f0 66 69 6e 65 64 20 62 79 20 70 45 4c 69 73 74 20  fined by pEList 
16900 61 70 70 65 61 72 73 20 61 73 20 65 6e 74 72 79  appears as entry
16910 20 69 6e 20 74 68 65 0a 2a 2a 20 46 52 4f 4d 20   in the.** FROM 
16920 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45  clause of a SELE
16930 43 54 20 73 75 63 68 20 74 68 61 74 20 74 68 65  CT such that the
16940 20 56 44 42 45 20 63 75 72 73 6f 72 20 61 73 73   VDBE cursor ass
16950 69 67 6e 65 64 20 74 6f 20 74 68 61 74 0a 2a 2a  igned to that.**
16960 20 46 4f 52 4d 20 63 6c 61 75 73 65 20 65 6e 74   FORM clause ent
16970 72 79 20 69 73 20 69 54 61 62 6c 65 2e 20 20 54  ry is iTable.  T
16980 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 6b 65  his routine make
16990 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20 0a   the necessary .
169a0 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 70 45  ** changes to pE
169b0 78 70 72 20 73 6f 20 74 68 61 74 20 69 74 20 72  xpr so that it r
169c0 65 66 65 72 73 20 64 69 72 65 63 74 6c 79 20 74  efers directly t
169d0 6f 20 74 68 65 20 73 6f 75 72 63 65 20 74 61 62  o the source tab
169e0 6c 65 0a 2a 2a 20 6f 66 20 74 68 65 20 73 75 62  le.** of the sub
169f0 71 75 65 72 79 20 72 61 74 68 65 72 20 74 68 65  query rather the
16a00 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74   result set of t
16a10 68 65 20 73 75 62 71 75 65 72 79 2e 0a 2a 2f 0a  he subquery..*/.
16a20 73 74 61 74 69 63 20 45 78 70 72 20 2a 73 75 62  static Expr *sub
16a30 73 74 45 78 70 72 28 0a 20 20 73 71 6c 69 74 65  stExpr(.  sqlite
16a40 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 2f 2a  3 *db,        /*
16a50 20 52 65 70 6f 72 74 20 6d 61 6c 6c 6f 63 20 65   Report malloc e
16a60 72 72 6f 72 73 20 74 6f 20 74 68 69 73 20 63 6f  rrors to this co
16a70 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 45 78  nnection */.  Ex
16a80 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20  pr *pExpr,      
16a90 20 20 2f 2a 20 45 78 70 72 20 69 6e 20 77 68 69    /* Expr in whi
16aa0 63 68 20 73 75 62 73 74 69 74 75 74 69 6f 6e 20  ch substitution 
16ab0 6f 63 63 75 72 73 20 2a 2f 0a 20 20 69 6e 74 20  occurs */.  int 
16ac0 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20  iTable,         
16ad0 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20 73  /* Table to be s
16ae0 75 62 73 74 69 74 75 74 65 64 20 2a 2f 0a 20 20  ubstituted */.  
16af0 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
16b00 20 20 20 20 2f 2a 20 53 75 62 73 74 69 74 75 74      /* Substitut
16b10 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 2a 2f  e expressions */
16b20 0a 29 7b 0a 20 20 69 66 28 20 70 45 78 70 72 3d  .){.  if( pExpr=
16b30 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
16b40 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d   if( pExpr->op==
16b50 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 45 78  TK_COLUMN && pEx
16b60 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62  pr->iTable==iTab
16b70 6c 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70 45  le ){.    if( pE
16b80 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29  xpr->iColumn<0 )
16b90 7b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f  {.      pExpr->o
16ba0 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20  p = TK_NULL;.   
16bb0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 45 78   }else{.      Ex
16bc0 70 72 20 2a 70 4e 65 77 3b 0a 20 20 20 20 20 20  pr *pNew;.      
16bd0 61 73 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d  assert( pEList!=
16be0 30 20 26 26 20 70 45 78 70 72 2d 3e 69 43 6f 6c  0 && pExpr->iCol
16bf0 75 6d 6e 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  umn<pEList->nExp
16c00 72 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  r );.      asser
16c10 74 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3d  t( pExpr->pLeft=
16c20 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 70 52 69  =0 && pExpr->pRi
16c30 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ght==0 );.      
16c40 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78  pNew = sqlite3Ex
16c50 70 72 44 75 70 28 64 62 2c 20 70 45 4c 69 73 74  prDup(db, pEList
16c60 2d 3e 61 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75  ->a[pExpr->iColu
16c70 6d 6e 5d 2e 70 45 78 70 72 2c 20 30 29 3b 0a 20  mn].pExpr, 0);. 
16c80 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
16c90 44 65 6c 65 74 65 28 64 62 2c 20 70 45 78 70 72  Delete(db, pExpr
16ca0 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72 20 3d  );.      pExpr =
16cb0 20 70 4e 65 77 3b 0a 20 20 20 20 7d 0a 20 20 7d   pNew;.    }.  }
16cc0 65 6c 73 65 7b 0a 20 20 20 20 70 45 78 70 72 2d  else{.    pExpr-
16cd0 3e 70 4c 65 66 74 20 3d 20 73 75 62 73 74 45 78  >pLeft = substEx
16ce0 70 72 28 64 62 2c 20 70 45 78 70 72 2d 3e 70 4c  pr(db, pExpr->pL
16cf0 65 66 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c  eft, iTable, pEL
16d00 69 73 74 29 3b 0a 20 20 20 20 70 45 78 70 72 2d  ist);.    pExpr-
16d10 3e 70 52 69 67 68 74 20 3d 20 73 75 62 73 74 45  >pRight = substE
16d20 78 70 72 28 64 62 2c 20 70 45 78 70 72 2d 3e 70  xpr(db, pExpr->p
16d30 52 69 67 68 74 2c 20 69 54 61 62 6c 65 2c 20 70  Right, iTable, p
16d40 45 4c 69 73 74 29 3b 0a 20 20 20 20 69 66 28 20  EList);.    if( 
16d50 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
16d60 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
16d70 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20 73 75  ect) ){.      su
16d80 62 73 74 53 65 6c 65 63 74 28 64 62 2c 20 70 45  bstSelect(db, pE
16d90 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20  xpr->x.pSelect, 
16da0 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
16db0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
16dc0 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28    substExprList(
16dd0 64 62 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  db, pExpr->x.pLi
16de0 73 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69  st, iTable, pELi
16df0 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  st);.    }.  }. 
16e00 20 72 65 74 75 72 6e 20 70 45 78 70 72 3b 0a 7d   return pExpr;.}
16e10 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75 62  .static void sub
16e20 73 74 45 78 70 72 4c 69 73 74 28 0a 20 20 73 71  stExprList(.  sq
16e30 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
16e40 20 20 20 2f 2a 20 52 65 70 6f 72 74 20 6d 61 6c     /* Report mal
16e50 6c 6f 63 20 65 72 72 6f 72 73 20 68 65 72 65 20  loc errors here 
16e60 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
16e70 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 4c 69 73  List,     /* Lis
16e80 74 20 74 6f 20 73 63 61 6e 20 61 6e 64 20 69 6e  t to scan and in
16e90 20 77 68 69 63 68 20 74 6f 20 6d 61 6b 65 20 73   which to make s
16ea0 75 62 73 74 69 74 75 74 65 73 20 2a 2f 0a 20 20  ubstitutes */.  
16eb0 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20  int iTable,     
16ec0 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f       /* Table to
16ed0 20 62 65 20 73 75 62 73 74 69 74 75 74 65 64 20   be substituted 
16ee0 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
16ef0 45 4c 69 73 74 20 20 20 20 20 2f 2a 20 53 75 62  EList     /* Sub
16f00 73 74 69 74 75 74 65 20 76 61 6c 75 65 73 20 2a  stitute values *
16f10 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  /.){.  int i;.  
16f20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72  if( pList==0 ) r
16f30 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30  eturn;.  for(i=0
16f40 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ; i<pList->nExpr
16f50 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 4c 69 73  ; i++){.    pLis
16f60 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 20 3d 20  t->a[i].pExpr = 
16f70 73 75 62 73 74 45 78 70 72 28 64 62 2c 20 70 4c  substExpr(db, pL
16f80 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c  ist->a[i].pExpr,
16f90 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
16fa0 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76  ;.  }.}.static v
16fb0 6f 69 64 20 73 75 62 73 74 53 65 6c 65 63 74 28  oid substSelect(
16fc0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
16fd0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 70 6f 72          /* Repor
16fe0 74 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20  t malloc errors 
16ff0 68 65 72 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74  here */.  Select
17000 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 2f   *p,           /
17010 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  * SELECT stateme
17020 6e 74 20 69 6e 20 77 68 69 63 68 20 74 6f 20 6d  nt in which to m
17030 61 6b 65 20 73 75 62 73 74 69 74 75 74 69 6f 6e  ake substitution
17040 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c  s */.  int iTabl
17050 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  e,          /* T
17060 61 62 6c 65 20 74 6f 20 62 65 20 72 65 70 6c 61  able to be repla
17070 63 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ced */.  ExprLis
17080 74 20 2a 70 45 4c 69 73 74 20 20 20 20 20 2f 2a  t *pEList     /*
17090 20 53 75 62 73 74 69 74 75 74 65 20 76 61 6c 75   Substitute valu
170a0 65 73 20 2a 2f 0a 29 7b 0a 20 20 53 72 63 4c 69  es */.){.  SrcLi
170b0 73 74 20 2a 70 53 72 63 3b 0a 20 20 73 74 72 75  st *pSrc;.  stru
170c0 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
170d0 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b  *pItem;.  int i;
170e0 0a 20 20 69 66 28 20 21 70 20 29 20 72 65 74 75  .  if( !p ) retu
170f0 72 6e 3b 0a 20 20 73 75 62 73 74 45 78 70 72 4c  rn;.  substExprL
17100 69 73 74 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73  ist(db, p->pELis
17110 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  t, iTable, pELis
17120 74 29 3b 0a 20 20 73 75 62 73 74 45 78 70 72 4c  t);.  substExprL
17130 69 73 74 28 64 62 2c 20 70 2d 3e 70 47 72 6f 75  ist(db, p->pGrou
17140 70 42 79 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c  pBy, iTable, pEL
17150 69 73 74 29 3b 0a 20 20 73 75 62 73 74 45 78 70  ist);.  substExp
17160 72 4c 69 73 74 28 64 62 2c 20 70 2d 3e 70 4f 72  rList(db, p->pOr
17170 64 65 72 42 79 2c 20 69 54 61 62 6c 65 2c 20 70  derBy, iTable, p
17180 45 4c 69 73 74 29 3b 0a 20 20 70 2d 3e 70 48 61  EList);.  p->pHa
17190 76 69 6e 67 20 3d 20 73 75 62 73 74 45 78 70 72  ving = substExpr
171a0 28 64 62 2c 20 70 2d 3e 70 48 61 76 69 6e 67 2c  (db, p->pHaving,
171b0 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
171c0 3b 0a 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20  ;.  p->pWhere = 
171d0 73 75 62 73 74 45 78 70 72 28 64 62 2c 20 70 2d  substExpr(db, p-
171e0 3e 70 57 68 65 72 65 2c 20 69 54 61 62 6c 65 2c  >pWhere, iTable,
171f0 20 70 45 4c 69 73 74 29 3b 0a 20 20 73 75 62 73   pEList);.  subs
17200 74 53 65 6c 65 63 74 28 64 62 2c 20 70 2d 3e 70  tSelect(db, p->p
17210 50 72 69 6f 72 2c 20 69 54 61 62 6c 65 2c 20 70  Prior, iTable, p
17220 45 4c 69 73 74 29 3b 0a 20 20 70 53 72 63 20 3d  EList);.  pSrc =
17230 20 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65   p->pSrc;.  asse
17240 72 74 28 20 70 53 72 63 20 29 3b 20 20 2f 2a 20  rt( pSrc );  /* 
17250 45 76 65 6e 20 66 6f 72 20 28 53 45 4c 45 43 54  Even for (SELECT
17260 20 31 29 20 77 65 20 68 61 76 65 3a 20 70 53 72   1) we have: pSr
17270 63 21 3d 30 20 62 75 74 20 70 53 72 63 2d 3e 6e  c!=0 but pSrc->n
17280 53 72 63 3d 3d 30 20 2a 2f 0a 20 20 69 66 28 20  Src==0 */.  if( 
17290 41 4c 57 41 59 53 28 70 53 72 63 29 20 29 7b 0a  ALWAYS(pSrc) ){.
172a0 20 20 20 20 66 6f 72 28 69 3d 70 53 72 63 2d 3e      for(i=pSrc->
172b0 6e 53 72 63 2c 20 70 49 74 65 6d 3d 70 53 72 63  nSrc, pItem=pSrc
172c0 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70  ->a; i>0; i--, p
172d0 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 73  Item++){.      s
172e0 75 62 73 74 53 65 6c 65 63 74 28 64 62 2c 20 70  ubstSelect(db, p
172f0 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2c 20 69  Item->pSelect, i
17300 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a  Table, pEList);.
17310 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64      }.  }.}.#end
17320 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53  if /* !defined(S
17330 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
17340 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  ERY) || !defined
17350 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
17360 57 29 20 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69  W) */..#if !defi
17370 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
17380 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65  SUBQUERY) || !de
17390 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
173a0 54 5f 56 49 45 57 29 0a 2f 2a 0a 2a 2a 20 54 68  T_VIEW)./*.** Th
173b0 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65 6d  is routine attem
173c0 70 74 73 20 74 6f 20 66 6c 61 74 74 65 6e 20 73  pts to flatten s
173d0 75 62 71 75 65 72 69 65 73 20 61 73 20 61 20 70  ubqueries as a p
173e0 65 72 66 6f 72 6d 61 6e 63 65 20 6f 70 74 69 6d  erformance optim
173f0 69 7a 61 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73  ization..** This
17400 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
17410 20 31 20 69 66 20 69 74 20 6d 61 6b 65 73 20 63   1 if it makes c
17420 68 61 6e 67 65 73 20 61 6e 64 20 30 20 69 66 20  hanges and 0 if 
17430 6e 6f 20 66 6c 61 74 74 65 6e 69 6e 67 20 6f 63  no flattening oc
17440 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 75  curs..**.** To u
17450 6e 64 65 72 73 74 61 6e 64 20 74 68 65 20 63 6f  nderstand the co
17460 6e 63 65 70 74 20 6f 66 20 66 6c 61 74 74 65 6e  ncept of flatten
17470 69 6e 67 2c 20 63 6f 6e 73 69 64 65 72 20 74 68  ing, consider th
17480 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 71  e following.** q
17490 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  uery:.**.**     
174a0 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 28 53  SELECT a FROM (S
174b0 45 4c 45 43 54 20 78 2b 79 20 41 53 20 61 20 46  ELECT x+y AS a F
174c0 52 4f 4d 20 74 31 20 57 48 45 52 45 20 7a 3c 31  ROM t1 WHERE z<1
174d0 30 30 29 20 57 48 45 52 45 20 61 3e 35 0a 2a 2a  00) WHERE a>5.**
174e0 0a 2a 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20  .** The default 
174f0 77 61 79 20 6f 66 20 69 6d 70 6c 65 6d 65 6e 74  way of implement
17500 69 6e 67 20 74 68 69 73 20 71 75 65 72 79 20 69  ing this query i
17510 73 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 65  s to execute the
17520 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 66 69 72  .** subquery fir
17530 73 74 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65  st and store the
17540 20 72 65 73 75 6c 74 73 20 69 6e 20 61 20 74 65   results in a te
17550 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 74  mporary table, t
17560 68 65 6e 0a 2a 2a 20 72 75 6e 20 74 68 65 20 6f  hen.** run the o
17570 75 74 65 72 20 71 75 65 72 79 20 6f 6e 20 74 68  uter query on th
17580 61 74 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  at temporary tab
17590 6c 65 2e 20 20 54 68 69 73 20 72 65 71 75 69 72  le.  This requir
175a0 65 73 20 74 77 6f 0a 2a 2a 20 70 61 73 73 65 73  es two.** passes
175b0 20 6f 76 65 72 20 74 68 65 20 64 61 74 61 2e 20   over the data. 
175c0 20 46 75 72 74 68 65 72 6d 6f 72 65 2c 20 62 65   Furthermore, be
175d0 63 61 75 73 65 20 74 68 65 20 74 65 6d 70 6f 72  cause the tempor
175e0 61 72 79 20 74 61 62 6c 65 0a 2a 2a 20 68 61 73  ary table.** has
175f0 20 6e 6f 20 69 6e 64 69 63 65 73 2c 20 74 68 65   no indices, the
17600 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f 6e   WHERE clause on
17610 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
17620 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6f 70   cannot be.** op
17630 74 69 6d 69 7a 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  timized..**.** T
17640 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65  his routine atte
17650 6d 70 74 73 20 74 6f 20 72 65 77 72 69 74 65 20  mpts to rewrite 
17660 71 75 65 72 69 65 73 20 73 75 63 68 20 61 73 20  queries such as 
17670 74 68 65 20 61 62 6f 76 65 20 69 6e 74 6f 0a 2a  the above into.*
17680 2a 20 61 20 73 69 6e 67 6c 65 20 66 6c 61 74 20  * a single flat 
17690 73 65 6c 65 63 74 2c 20 6c 69 6b 65 20 74 68 69  select, like thi
176a0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c  s:.**.**     SEL
176b0 45 43 54 20 78 2b 79 20 41 53 20 61 20 46 52 4f  ECT x+y AS a FRO
176c0 4d 20 74 31 20 57 48 45 52 45 20 7a 3c 31 30 30  M t1 WHERE z<100
176d0 20 41 4e 44 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54   AND a>5.**.** T
176e0 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65  he code generate
176f0 64 20 66 6f 72 20 74 68 69 73 20 73 69 6d 70 69  d for this simpi
17700 66 69 63 61 74 69 6f 6e 20 67 69 76 65 73 20 74  fication gives t
17710 68 65 20 73 61 6d 65 20 72 65 73 75 6c 74 0a 2a  he same result.*
17720 2a 20 62 75 74 20 6f 6e 6c 79 20 68 61 73 20 74  * but only has t
17730 6f 20 73 63 61 6e 20 74 68 65 20 64 61 74 61 20  o scan the data 
17740 6f 6e 63 65 2e 20 20 41 6e 64 20 62 65 63 61 75  once.  And becau
17750 73 65 20 69 6e 64 69 63 65 73 20 6d 69 67 68 74  se indices might
17760 20 0a 2a 2a 20 65 78 69 73 74 20 6f 6e 20 74 68   .** exist on th
17770 65 20 74 61 62 6c 65 20 74 31 2c 20 61 20 63 6f  e table t1, a co
17780 6d 70 6c 65 74 65 20 73 63 61 6e 20 6f 66 20 74  mplete scan of t
17790 68 65 20 64 61 74 61 20 6d 69 67 68 74 20 62 65  he data might be
177a0 0a 2a 2a 20 61 76 6f 69 64 65 64 2e 0a 2a 2a 0a  .** avoided..**.
177b0 2a 2a 20 46 6c 61 74 74 65 6e 69 6e 67 20 69 73  ** Flattening is
177c0 20 6f 6e 6c 79 20 61 74 74 65 6d 70 74 65 64 20   only attempted 
177d0 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f  if all of the fo
177e0 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65  llowing are true
177f0 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 20 54  :.**.**   (1)  T
17800 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20  he subquery and 
17810 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
17820 64 6f 20 6e 6f 74 20 62 6f 74 68 20 75 73 65 20  do not both use 
17830 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a  aggregates..**.*
17840 2a 20 20 20 28 32 29 20 20 54 68 65 20 73 75 62  *   (2)  The sub
17850 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 6e 20  query is not an 
17860 61 67 67 72 65 67 61 74 65 20 6f 72 20 74 68 65  aggregate or the
17870 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20   outer query is 
17880 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a  not a join..**.*
17890 2a 20 20 20 28 33 29 20 20 54 68 65 20 73 75 62  *   (3)  The sub
178a0 71 75 65 72 79 20 69 73 20 6e 6f 74 20 74 68 65  query is not the
178b0 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f   right operand o
178c0 66 20 61 20 6c 65 66 74 20 6f 75 74 65 72 20 6a  f a left outer j
178d0 6f 69 6e 0a 2a 2a 20 20 20 20 20 20 20 20 28 4f  oin.**        (O
178e0 72 69 67 69 6e 61 6c 6c 79 20 74 69 63 6b 65 74  riginally ticket
178f0 20 23 33 30 36 2e 20 20 53 74 72 65 6e 67 74 68   #306.  Strength
17900 65 6e 65 64 20 62 79 20 74 69 63 6b 65 74 20 23  ened by ticket #
17910 33 33 30 30 29 0a 2a 2a 0a 2a 2a 20 20 20 28 34  3300).**.**   (4
17920 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
17930 69 73 20 6e 6f 74 20 44 49 53 54 49 4e 43 54 2e  is not DISTINCT.
17940 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 41 74  .**.**  (**)  At
17950 20 6f 6e 65 20 70 6f 69 6e 74 20 72 65 73 74 72   one point restr
17960 69 63 74 69 6f 6e 73 20 28 34 29 20 61 6e 64 20  ictions (4) and 
17970 28 35 29 20 64 65 66 69 6e 65 64 20 61 20 73 75  (5) defined a su
17980 62 73 65 74 20 6f 66 20 44 49 53 54 49 4e 43 54  bset of DISTINCT
17990 0a 2a 2a 20 20 20 20 20 20 20 20 73 75 62 2d 71  .**        sub-q
179a0 75 65 72 69 65 73 20 74 68 61 74 20 77 65 72 65  ueries that were
179b0 20 65 78 63 6c 75 64 65 64 20 66 72 6f 6d 20 74   excluded from t
179c0 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  his optimization
179d0 2e 20 52 65 73 74 72 69 63 74 69 6f 6e 20 0a 2a  . Restriction .*
179e0 2a 20 20 20 20 20 20 20 20 28 34 29 20 68 61 73  *        (4) has
179f0 20 73 69 6e 63 65 20 62 65 65 6e 20 65 78 70 61   since been expa
17a00 6e 64 65 64 20 74 6f 20 65 78 63 6c 75 64 65 20  nded to exclude 
17a10 61 6c 6c 20 44 49 53 54 49 4e 43 54 20 73 75 62  all DISTINCT sub
17a20 71 75 65 72 69 65 73 2e 0a 2a 2a 0a 2a 2a 20 20  queries..**.**  
17a30 20 28 36 29 20 20 54 68 65 20 73 75 62 71 75 65   (6)  The subque
17a40 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  ry does not use 
17a50 61 67 67 72 65 67 61 74 65 73 20 6f 72 20 74 68  aggregates or th
17a60 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73  e outer query is
17a70 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 44   not.**        D
17a80 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20 20  ISTINCT..**.**  
17a90 20 28 37 29 20 20 54 68 65 20 73 75 62 71 75 65   (7)  The subque
17aa0 72 79 20 68 61 73 20 61 20 46 52 4f 4d 20 63 6c  ry has a FROM cl
17ab0 61 75 73 65 2e 20 20 54 4f 44 4f 3a 20 20 46 6f  ause.  TODO:  Fo
17ac0 72 20 73 75 62 71 75 65 72 69 65 73 20 77 69 74  r subqueries wit
17ad0 68 6f 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 41  hout.**        A
17ae0 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c 20 63 6f   FROM clause, co
17af0 6e 73 69 64 65 72 20 61 64 64 69 6e 67 20 61 20  nsider adding a 
17b00 46 52 4f 4d 20 63 6c 6f 73 65 20 77 69 74 68 20  FROM close with 
17b10 74 68 65 20 73 70 65 63 69 61 6c 0a 2a 2a 20 20  the special.**  
17b20 20 20 20 20 20 20 74 61 62 6c 65 20 73 71 6c 69        table sqli
17b30 74 65 5f 6f 6e 63 65 20 74 68 61 74 20 63 6f 6e  te_once that con
17b40 73 69 73 74 73 20 6f 66 20 61 20 73 69 6e 67 6c  sists of a singl
17b50 65 20 72 6f 77 20 63 6f 6e 74 61 69 6e 69 6e 67  e row containing
17b60 20 61 0a 2a 2a 20 20 20 20 20 20 20 20 73 69 6e   a.**        sin
17b70 67 6c 65 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20  gle NULL..**.** 
17b80 20 20 28 38 29 20 20 54 68 65 20 73 75 62 71 75    (8)  The subqu
17b90 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  ery does not use
17ba0 20 4c 49 4d 49 54 20 6f 72 20 74 68 65 20 6f 75   LIMIT or the ou
17bb0 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74  ter query is not
17bc0 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20   a join..**.**  
17bd0 20 28 39 29 20 20 54 68 65 20 73 75 62 71 75 65   (9)  The subque
17be0 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  ry does not use 
17bf0 4c 49 4d 49 54 20 6f 72 20 74 68 65 20 6f 75 74  LIMIT or the out
17c00 65 72 20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f  er query does no
17c10 74 20 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 20  t use.**        
17c20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a  aggregates..**.*
17c30 2a 20 20 28 31 30 29 20 20 54 68 65 20 73 75 62  *  (10)  The sub
17c40 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75  query does not u
17c50 73 65 20 61 67 67 72 65 67 61 74 65 73 20 6f 72  se aggregates or
17c60 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
17c70 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 20 20 20   does not.**    
17c80 20 20 20 20 75 73 65 20 4c 49 4d 49 54 2e 0a 2a      use LIMIT..*
17c90 2a 0a 2a 2a 20 20 28 31 31 29 20 20 54 68 65 20  *.**  (11)  The 
17ca0 73 75 62 71 75 65 72 79 20 61 6e 64 20 74 68 65  subquery and the
17cb0 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 20   outer query do 
17cc0 6e 6f 74 20 62 6f 74 68 20 68 61 76 65 20 4f 52  not both have OR
17cd0 44 45 52 20 42 59 20 63 6c 61 75 73 65 73 2e 0a  DER BY clauses..
17ce0 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 4e 6f 74  **.**  (**)  Not
17cf0 20 69 6d 70 6c 65 6d 65 6e 74 65 64 2e 20 20 53   implemented.  S
17d00 75 62 73 75 6d 65 64 20 69 6e 74 6f 20 72 65 73  ubsumed into res
17d10 74 72 69 63 74 69 6f 6e 20 28 33 29 2e 20 20 57  triction (3).  W
17d20 61 73 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a  as previously.**
17d30 20 20 20 20 20 20 20 20 61 20 73 65 70 61 72 61          a separa
17d40 74 65 20 72 65 73 74 72 69 63 74 69 6f 6e 20 64  te restriction d
17d50 65 72 69 76 69 6e 67 20 66 72 6f 6d 20 74 69 63  eriving from tic
17d60 6b 65 74 20 23 33 35 30 2e 0a 2a 2a 0a 2a 2a 20  ket #350..**.** 
17d70 20 28 31 33 29 20 20 54 68 65 20 73 75 62 71 75   (13)  The subqu
17d80 65 72 79 20 61 6e 64 20 6f 75 74 65 72 20 71 75  ery and outer qu
17d90 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20  ery do not both 
17da0 75 73 65 20 4c 49 4d 49 54 2e 0a 2a 2a 0a 2a 2a  use LIMIT..**.**
17db0 20 20 28 31 34 29 20 20 54 68 65 20 73 75 62 71    (14)  The subq
17dc0 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73  uery does not us
17dd0 65 20 4f 46 46 53 45 54 2e 0a 2a 2a 0a 2a 2a 20  e OFFSET..**.** 
17de0 20 28 31 35 29 20 20 54 68 65 20 6f 75 74 65 72   (15)  The outer
17df0 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20 70 61   query is not pa
17e00 72 74 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64  rt of a compound
17e10 20 73 65 6c 65 63 74 20 6f 72 20 74 68 65 0a 2a   select or the.*
17e20 2a 20 20 20 20 20 20 20 20 73 75 62 71 75 65 72  *        subquer
17e30 79 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20  y does not have 
17e40 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 2e 0a  a LIMIT clause..
17e50 2a 2a 20 20 20 20 20 20 20 20 28 53 65 65 20 74  **        (See t
17e60 69 63 6b 65 74 20 23 32 33 33 39 20 61 6e 64 20  icket #2339 and 
17e70 74 69 63 6b 65 74 20 5b 30 32 61 38 65 38 31 64  ticket [02a8e81d
17e80 34 34 5d 29 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 36  44])..**.**  (16
17e90 29 20 20 54 68 65 20 6f 75 74 65 72 20 71 75 65  )  The outer que
17ea0 72 79 20 69 73 20 6e 6f 74 20 61 6e 20 61 67 67  ry is not an agg
17eb0 72 65 67 61 74 65 20 6f 72 20 74 68 65 20 73 75  regate or the su
17ec0 62 71 75 65 72 79 20 64 6f 65 73 0a 2a 2a 20 20  bquery does.**  
17ed0 20 20 20 20 20 20 6e 6f 74 20 63 6f 6e 74 61 69        not contai
17ee0 6e 20 4f 52 44 45 52 20 42 59 2e 20 20 28 54 69  n ORDER BY.  (Ti
17ef0 63 6b 65 74 20 23 32 39 34 32 29 20 20 54 68 69  cket #2942)  Thi
17f00 73 20 75 73 65 64 20 74 6f 20 6e 6f 74 20 6d 61  s used to not ma
17f10 74 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 20 75  tter.**        u
17f20 6e 74 69 6c 20 77 65 20 69 6e 74 72 6f 64 75 63  ntil we introduc
17f30 65 64 20 74 68 65 20 67 72 6f 75 70 5f 63 6f 6e  ed the group_con
17f40 63 61 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20  cat() function. 
17f50 20 0a 2a 2a 0a 2a 2a 20 20 28 31 37 29 20 20 54   .**.**  (17)  T
17f60 68 65 20 73 75 62 2d 71 75 65 72 79 20 69 73 20  he sub-query is 
17f70 6e 6f 74 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73  not a compound s
17f80 65 6c 65 63 74 2c 20 6f 72 20 69 74 20 69 73 20  elect, or it is 
17f90 61 20 55 4e 49 4f 4e 20 41 4c 4c 20 0a 2a 2a 20  a UNION ALL .** 
17fa0 20 20 20 20 20 20 20 63 6f 6d 70 6f 75 6e 64 20         compound 
17fb0 63 6c 61 75 73 65 20 6d 61 64 65 20 75 70 20 65  clause made up e
17fc0 6e 74 69 72 65 6c 79 20 6f 66 20 6e 6f 6e 2d 61  ntirely of non-a
17fd0 67 67 72 65 67 61 74 65 20 71 75 65 72 69 65 73  ggregate queries
17fe0 2c 20 61 6e 64 20 0a 2a 2a 20 20 20 20 20 20 20  , and .**       
17ff0 20 74 68 65 20 70 61 72 65 6e 74 20 71 75 65 72   the parent quer
18000 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  y:.**.**        
18010 20 20 2a 20 69 73 20 6e 6f 74 20 69 74 73 65 6c    * is not itsel
18020 66 20 70 61 72 74 20 6f 66 20 61 20 63 6f 6d 70  f part of a comp
18030 6f 75 6e 64 20 73 65 6c 65 63 74 2c 0a 2a 2a 20  ound select,.** 
18040 20 20 20 20 20 20 20 20 20 2a 20 69 73 20 6e 6f           * is no
18050 74 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 6f  t an aggregate o
18060 72 20 44 49 53 54 49 4e 43 54 20 71 75 65 72 79  r DISTINCT query
18070 2c 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20  , and.**        
18080 20 20 2a 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69    * is not a joi
18090 6e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 54  n.**.**        T
180a0 68 65 20 70 61 72 65 6e 74 20 61 6e 64 20 73 75  he parent and su
180b0 62 2d 71 75 65 72 79 20 6d 61 79 20 63 6f 6e 74  b-query may cont
180c0 61 69 6e 20 57 48 45 52 45 20 63 6c 61 75 73 65  ain WHERE clause
180d0 73 2e 20 53 75 62 6a 65 63 74 20 74 6f 0a 2a 2a  s. Subject to.**
180e0 20 20 20 20 20 20 20 20 72 75 6c 65 73 20 28 31          rules (1
180f0 31 29 2c 20 28 31 33 29 20 61 6e 64 20 28 31 34  1), (13) and (14
18100 29 2c 20 74 68 65 79 20 6d 61 79 20 61 6c 73 6f  ), they may also
18110 20 63 6f 6e 74 61 69 6e 20 4f 52 44 45 52 20 42   contain ORDER B
18120 59 2c 0a 2a 2a 20 20 20 20 20 20 20 20 4c 49 4d  Y,.**        LIM
18130 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20 63 6c  IT and OFFSET cl
18140 61 75 73 65 73 2e 20 20 54 68 65 20 73 75 62 71  auses.  The subq
18150 75 65 72 79 20 63 61 6e 6e 6f 74 20 75 73 65 20  uery cannot use 
18160 61 6e 79 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20  any compound.** 
18170 20 20 20 20 20 20 20 6f 70 65 72 61 74 6f 72 20         operator 
18180 6f 74 68 65 72 20 74 68 61 6e 20 55 4e 49 4f 4e  other than UNION
18190 20 41 4c 4c 20 62 65 63 61 75 73 65 20 61 6c 6c   ALL because all
181a0 20 74 68 65 20 6f 74 68 65 72 20 63 6f 6d 70 6f   the other compo
181b0 75 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 6f 70  und.**        op
181c0 65 72 61 74 6f 72 73 20 68 61 76 65 20 61 6e 20  erators have an 
181d0 69 6d 70 6c 69 65 64 20 44 49 53 54 49 4e 43 54  implied DISTINCT
181e0 20 77 68 69 63 68 20 69 73 20 64 69 73 61 6c 6c   which is disall
181f0 6f 77 65 64 20 62 79 0a 2a 2a 20 20 20 20 20 20  owed by.**      
18200 20 20 72 65 73 74 72 69 63 74 69 6f 6e 20 28 34    restriction (4
18210 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  )..**.**        
18220 41 6c 73 6f 2c 20 65 61 63 68 20 63 6f 6d 70 6f  Also, each compo
18230 6e 65 6e 74 20 6f 66 20 74 68 65 20 73 75 62 2d  nent of the sub-
18240 71 75 65 72 79 20 6d 75 73 74 20 72 65 74 75 72  query must retur
18250 6e 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65  n the same numbe
18260 72 0a 2a 2a 20 20 20 20 20 20 20 20 6f 66 20 72  r.**        of r
18270 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 2e 20 54  esult columns. T
18280 68 69 73 20 69 73 20 61 63 74 75 61 6c 6c 79 20  his is actually 
18290 61 20 72 65 71 75 69 72 65 6d 65 6e 74 20 66 6f  a requirement fo
182a0 72 20 61 6e 79 20 63 6f 6d 70 6f 75 6e 64 0a 2a  r any compound.*
182b0 2a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20  *        SELECT 
182c0 73 74 61 74 65 6d 65 6e 74 2c 20 62 75 74 20 61  statement, but a
182d0 6c 6c 20 74 68 65 20 63 6f 64 65 20 68 65 72 65  ll the code here
182e0 20 64 6f 65 73 20 69 73 20 6d 61 6b 65 20 73 75   does is make su
182f0 72 65 20 74 68 61 74 20 6e 6f 0a 2a 2a 20 20 20  re that no.**   
18300 20 20 20 20 20 73 75 63 68 20 28 69 6c 6c 65 67       such (illeg
18310 61 6c 29 20 73 75 62 2d 71 75 65 72 79 20 69 73  al) sub-query is
18320 20 66 6c 61 74 74 65 6e 65 64 2e 20 54 68 65 20   flattened. The 
18330 63 61 6c 6c 65 72 20 77 69 6c 6c 20 64 65 74 65  caller will dete
18340 63 74 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  ct the.**       
18350 20 73 79 6e 74 61 78 20 65 72 72 6f 72 20 61 6e   syntax error an
18360 64 20 72 65 74 75 72 6e 20 61 20 64 65 74 61 69  d return a detai
18370 6c 65 64 20 6d 65 73 73 61 67 65 2e 0a 2a 2a 0a  led message..**.
18380 2a 2a 20 20 28 31 38 29 20 20 49 66 20 74 68 65  **  (18)  If the
18390 20 73 75 62 2d 71 75 65 72 79 20 69 73 20 61 20   sub-query is a 
183a0 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c  compound select,
183b0 20 74 68 65 6e 20 61 6c 6c 20 74 65 72 6d 73 20   then all terms 
183c0 6f 66 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  of the.**       
183d0 20 4f 52 44 45 52 20 62 79 20 63 6c 61 75 73 65   ORDER by clause
183e0 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20 6d   of the parent m
183f0 75 73 74 20 62 65 20 73 69 6d 70 6c 65 20 72 65  ust be simple re
18400 66 65 72 65 6e 63 65 73 20 74 6f 20 0a 2a 2a 20  ferences to .** 
18410 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 73 20 6f         columns o
18420 66 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 2e  f the sub-query.
18430 0a 2a 2a 0a 2a 2a 20 20 28 31 39 29 20 20 54 68  .**.**  (19)  Th
18440 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20  e subquery does 
18450 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 20 6f 72  not use LIMIT or
18460 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
18470 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 20 20 20   does not.**    
18480 20 20 20 20 68 61 76 65 20 61 20 57 48 45 52 45      have a WHERE
18490 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20   clause..**.**  
184a0 28 32 30 29 20 20 49 66 20 74 68 65 20 73 75 62  (20)  If the sub
184b0 2d 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70  -query is a comp
184c0 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20 74 68 65  ound select, the
184d0 6e 20 69 74 20 6d 75 73 74 20 6e 6f 74 20 75 73  n it must not us
184e0 65 0a 2a 2a 20 20 20 20 20 20 20 20 61 6e 20 4f  e.**        an O
184f0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 20  RDER BY clause. 
18500 20 54 69 63 6b 65 74 20 23 33 37 37 33 2e 20 20   Ticket #3773.  
18510 57 65 20 63 6f 75 6c 64 20 72 65 6c 61 78 20 74  We could relax t
18520 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a  his constraint.*
18530 2a 20 20 20 20 20 20 20 20 73 6f 6d 65 77 68 61  *        somewha
18540 74 20 62 79 20 73 61 79 69 6e 67 20 74 68 61 74  t by saying that
18550 20 74 68 65 20 74 65 72 6d 73 20 6f 66 20 74 68   the terms of th
18560 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
18570 65 20 6d 75 73 74 0a 2a 2a 20 20 20 20 20 20 20  e must.**       
18580 20 61 70 70 65 61 72 20 61 73 20 75 6e 6d 6f 64   appear as unmod
18590 69 66 69 65 64 20 72 65 73 75 6c 74 20 63 6f 6c  ified result col
185a0 75 6d 6e 73 20 69 6e 20 74 68 65 20 6f 75 74 65  umns in the oute
185b0 72 20 71 75 65 72 79 2e 20 20 42 75 74 20 77 65  r query.  But we
185c0 0a 2a 2a 20 20 20 20 20 20 20 20 68 61 76 65 20  .**        have 
185d0 6f 74 68 65 72 20 6f 70 74 69 6d 69 7a 61 74 69  other optimizati
185e0 6f 6e 73 20 69 6e 20 6d 69 6e 64 20 74 6f 20 64  ons in mind to d
185f0 65 61 6c 20 77 69 74 68 20 74 68 61 74 20 63 61  eal with that ca
18600 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 31 29 20  se..**.**  (21) 
18610 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f   The subquery do
18620 65 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54  es not use LIMIT
18630 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75   or the outer qu
18640 65 72 79 20 69 73 20 6e 6f 74 0a 2a 2a 20 20 20  ery is not.**   
18650 20 20 20 20 20 44 49 53 54 49 4e 43 54 2e 20 20       DISTINCT.  
18660 28 53 65 65 20 74 69 63 6b 65 74 20 5b 37 35 32  (See ticket [752
18670 65 31 36 34 36 66 63 5d 29 2e 0a 2a 2a 0a 2a 2a  e1646fc])..**.**
18680 20 49 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65   In this routine
18690 2c 20 74 68 65 20 22 70 22 20 70 61 72 61 6d 65  , the "p" parame
186a0 74 65 72 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ter is a pointer
186b0 20 74 6f 20 74 68 65 20 6f 75 74 65 72 20 71 75   to the outer qu
186c0 65 72 79 2e 0a 2a 2a 20 54 68 65 20 73 75 62 71  ery..** The subq
186d0 75 65 72 79 20 69 73 20 70 2d 3e 70 53 72 63 2d  uery is p->pSrc-
186e0 3e 61 5b 69 46 72 6f 6d 5d 2e 20 20 69 73 41 67  >a[iFrom].  isAg
186f0 67 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65  g is true if the
18700 20 6f 75 74 65 72 20 71 75 65 72 79 0a 2a 2a 20   outer query.** 
18710 75 73 65 73 20 61 67 67 72 65 67 61 74 65 73 20  uses aggregates 
18720 61 6e 64 20 73 75 62 71 75 65 72 79 49 73 41 67  and subqueryIsAg
18730 67 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65  g is true if the
18740 20 73 75 62 71 75 65 72 79 20 75 73 65 73 20 61   subquery uses a
18750 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a  ggregates..**.**
18760 20 49 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69   If flattening i
18770 73 20 6e 6f 74 20 61 74 74 65 6d 70 74 65 64 2c  s not attempted,
18780 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
18790 20 61 20 6e 6f 2d 6f 70 20 61 6e 64 20 72 65 74   a no-op and ret
187a0 75 72 6e 73 20 30 2e 0a 2a 2a 20 49 66 20 66 6c  urns 0..** If fl
187b0 61 74 74 65 6e 69 6e 67 20 69 73 20 61 74 74 65  attening is atte
187c0 6d 70 74 65 64 20 74 68 69 73 20 72 6f 75 74 69  mpted this routi
187d0 6e 65 20 72 65 74 75 72 6e 73 20 31 2e 0a 2a 2a  ne returns 1..**
187e0 0a 2a 2a 20 41 6c 6c 20 6f 66 20 74 68 65 20 65  .** All of the e
187f0 78 70 72 65 73 73 69 6f 6e 20 61 6e 61 6c 79 73  xpression analys
18800 69 73 20 6d 75 73 74 20 6f 63 63 75 72 20 6f 6e  is must occur on
18810 20 62 6f 74 68 20 74 68 65 20 6f 75 74 65 72 20   both the outer 
18820 71 75 65 72 79 20 61 6e 64 0a 2a 2a 20 74 68 65  query and.** the
18830 20 73 75 62 71 75 65 72 79 20 62 65 66 6f 72 65   subquery before
18840 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75   this routine ru
18850 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ns..*/.static in
18860 74 20 66 6c 61 74 74 65 6e 53 75 62 71 75 65 72  t flattenSubquer
18870 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  y(.  Parse *pPar
18880 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72  se,       /* Par
18890 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
188a0 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
188b0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
188c0 72 65 6e 74 20 6f 72 20 6f 75 74 65 72 20 53 45  rent or outer SE
188d0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a  LECT statement *
188e0 2f 0a 20 20 69 6e 74 20 69 46 72 6f 6d 2c 20 20  /.  int iFrom,  
188f0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
18900 78 20 69 6e 20 70 2d 3e 70 53 72 63 2d 3e 61 5b  x in p->pSrc->a[
18910 5d 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 73  ] of the inner s
18920 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74  ubquery */.  int
18930 20 69 73 41 67 67 2c 20 20 20 20 20 20 20 20 20   isAgg,         
18940 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6f 75 74    /* True if out
18950 65 72 20 53 45 4c 45 43 54 20 75 73 65 73 20 61  er SELECT uses a
18960 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
18970 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 73 75 62 71  ns */.  int subq
18980 75 65 72 79 49 73 41 67 67 20 20 20 20 2f 2a 20  ueryIsAgg    /* 
18990 54 72 75 65 20 69 66 20 74 68 65 20 73 75 62 71  True if the subq
189a0 75 65 72 79 20 75 73 65 73 20 61 67 67 72 65 67  uery uses aggreg
189b0 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f  ate functions */
189c0 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  .){.  const char
189d0 20 2a 7a 53 61 76 65 64 41 75 74 68 43 6f 6e 74   *zSavedAuthCont
189e0 65 78 74 20 3d 20 70 50 61 72 73 65 2d 3e 7a 41  ext = pParse->zA
189f0 75 74 68 43 6f 6e 74 65 78 74 3b 0a 20 20 53 65  uthContext;.  Se
18a00 6c 65 63 74 20 2a 70 50 61 72 65 6e 74 3b 0a 20  lect *pParent;. 
18a10 20 53 65 6c 65 63 74 20 2a 70 53 75 62 3b 20 20   Select *pSub;  
18a20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 6e 65       /* The inne
18a30 72 20 71 75 65 72 79 20 6f 72 20 22 73 75 62 71  r query or "subq
18a40 75 65 72 79 22 20 2a 2f 0a 20 20 53 65 6c 65 63  uery" */.  Selec
18a50 74 20 2a 70 53 75 62 31 3b 20 20 20 20 20 20 2f  t *pSub1;      /
18a60 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  * Pointer to the
18a70 20 72 69 67 68 74 6d 6f 73 74 20 73 65 6c 65 63   rightmost selec
18a80 74 20 69 6e 20 73 75 62 2d 71 75 65 72 79 20 2a  t in sub-query *
18a90 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  /.  SrcList *pSr
18aa0 63 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46  c;      /* The F
18ab0 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ROM clause of th
18ac0 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a 2f  e outer query */
18ad0 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 75 62  .  SrcList *pSub
18ae0 53 72 63 3b 20 20 20 2f 2a 20 54 68 65 20 46 52  Src;   /* The FR
18af0 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
18b00 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 45   subquery */.  E
18b10 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b 20  xprList *pList; 
18b20 20 20 20 2f 2a 20 54 68 65 20 72 65 73 75 6c 74     /* The result
18b30 20 73 65 74 20 6f 66 20 74 68 65 20 6f 75 74 65   set of the oute
18b40 72 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74  r query */.  int
18b50 20 69 50 61 72 65 6e 74 3b 20 20 20 20 20 20 20   iParent;       
18b60 20 2f 2a 20 56 44 42 45 20 63 75 72 73 6f 72 20   /* VDBE cursor 
18b70 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 53  number of the pS
18b80 75 62 20 72 65 73 75 6c 74 20 73 65 74 20 74 65  ub result set te
18b90 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  mp table */.  in
18ba0 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
18bb0 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
18bc0 72 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68  r */.  Expr *pWh
18bd0 65 72 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ere;            
18be0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57          /* The W
18bf0 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
18c00 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
18c10 69 74 65 6d 20 2a 70 53 75 62 69 74 65 6d 3b 20  item *pSubitem; 
18c20 20 20 2f 2a 20 54 68 65 20 73 75 62 71 75 65 72    /* The subquer
18c30 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  y */.  sqlite3 *
18c40 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
18c50 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20  ..  /* Check to 
18c60 73 65 65 20 69 66 20 66 6c 61 74 74 65 6e 69 6e  see if flattenin
18c70 67 20 69 73 20 70 65 72 6d 69 74 74 65 64 2e 20  g is permitted. 
18c80 20 52 65 74 75 72 6e 20 30 20 69 66 20 6e 6f 74   Return 0 if not
18c90 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
18ca0 20 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72   p!=0 );.  asser
18cb0 74 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20  t( p->pPrior==0 
18cc0 29 3b 20 20 2f 2a 20 55 6e 61 62 6c 65 20 74 6f  );  /* Unable to
18cd0 20 66 6c 61 74 74 65 6e 20 63 6f 6d 70 6f 75 6e   flatten compoun
18ce0 64 20 71 75 65 72 69 65 73 20 2a 2f 0a 20 20 69  d queries */.  i
18cf0 66 28 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 44  f( OptimizationD
18d00 69 73 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49  isabled(db, SQLI
18d10 54 45 5f 51 75 65 72 79 46 6c 61 74 74 65 6e 65  TE_QueryFlattene
18d20 72 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  r) ) return 0;. 
18d30 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b   pSrc = p->pSrc;
18d40 0a 20 20 61 73 73 65 72 74 28 20 70 53 72 63 20  .  assert( pSrc 
18d50 26 26 20 69 46 72 6f 6d 3e 3d 30 20 26 26 20 69  && iFrom>=0 && i
18d60 46 72 6f 6d 3c 70 53 72 63 2d 3e 6e 53 72 63 20  From<pSrc->nSrc 
18d70 29 3b 0a 20 20 70 53 75 62 69 74 65 6d 20 3d 20  );.  pSubitem = 
18d80 26 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 3b  &pSrc->a[iFrom];
18d90 0a 20 20 69 50 61 72 65 6e 74 20 3d 20 70 53 75  .  iParent = pSu
18da0 62 69 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a  bitem->iCursor;.
18db0 20 20 70 53 75 62 20 3d 20 70 53 75 62 69 74 65    pSub = pSubite
18dc0 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 61 73  m->pSelect;.  as
18dd0 73 65 72 74 28 20 70 53 75 62 21 3d 30 20 29 3b  sert( pSub!=0 );
18de0 0a 20 20 69 66 28 20 69 73 41 67 67 20 26 26 20  .  if( isAgg && 
18df0 73 75 62 71 75 65 72 79 49 73 41 67 67 20 29 20  subqueryIsAgg ) 
18e00 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
18e10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
18e20 74 72 69 63 74 69 6f 6e 20 28 31 29 20 20 2a 2f  triction (1)  */
18e30 0a 20 20 69 66 28 20 73 75 62 71 75 65 72 79 49  .  if( subqueryI
18e40 73 41 67 67 20 26 26 20 70 53 72 63 2d 3e 6e 53  sAgg && pSrc->nS
18e50 72 63 3e 31 20 29 20 72 65 74 75 72 6e 20 30 3b  rc>1 ) return 0;
18e60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
18e70 74 72 69 63 74 69 6f 6e 20 28 32 29 20 20 2a 2f  triction (2)  */
18e80 0a 20 20 70 53 75 62 53 72 63 20 3d 20 70 53 75  .  pSubSrc = pSu
18e90 62 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72  b->pSrc;.  asser
18ea0 74 28 20 70 53 75 62 53 72 63 20 29 3b 0a 20 20  t( pSubSrc );.  
18eb0 2f 2a 20 50 72 69 6f 72 20 74 6f 20 76 65 72 73  /* Prior to vers
18ec0 69 6f 6e 20 33 2e 31 2e 32 2c 20 77 68 65 6e 20  ion 3.1.2, when 
18ed0 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54  LIMIT and OFFSET
18ee0 20 68 61 64 20 74 6f 20 62 65 20 73 69 6d 70 6c   had to be simpl
18ef0 65 20 63 6f 6e 73 74 61 6e 74 73 2c 0a 20 20 2a  e constants,.  *
18f00 2a 20 6e 6f 74 20 61 72 62 69 74 72 61 72 79 20  * not arbitrary 
18f10 65 78 70 72 65 73 73 73 69 6f 6e 73 2c 20 77 65  expresssions, we
18f20 20 61 6c 6c 6f 77 65 64 20 73 6f 6d 65 20 63 6f   allowed some co
18f30 6d 62 69 6e 69 6e 67 20 6f 66 20 4c 49 4d 49 54  mbining of LIMIT
18f40 20 61 6e 64 20 4f 46 46 53 45 54 0a 20 20 2a 2a   and OFFSET.  **
18f50 20 62 65 63 61 75 73 65 20 74 68 65 79 20 63 6f   because they co
18f60 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64 20  uld be computed 
18f70 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2e  at compile-time.
18f80 20 20 42 75 74 20 77 68 65 6e 20 4c 49 4d 49 54    But when LIMIT
18f90 20 61 6e 64 20 4f 46 46 53 45 54 0a 20 20 2a 2a   and OFFSET.  **
18fa0 20 62 65 63 61 6d 65 20 61 72 62 69 74 72 61 72   became arbitrar
18fb0 79 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 77  y expressions, w
18fc0 65 20 77 65 72 65 20 66 6f 72 63 65 64 20 74 6f  e were forced to
18fd0 20 61 64 64 20 72 65 73 74 72 69 63 74 69 6f 6e   add restriction
18fe0 73 20 28 31 33 29 0a 20 20 2a 2a 20 61 6e 64 20  s (13).  ** and 
18ff0 28 31 34 29 2e 20 2a 2f 0a 20 20 69 66 28 20 70  (14). */.  if( p
19000 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 70  Sub->pLimit && p
19010 2d 3e 70 4c 69 6d 69 74 20 29 20 72 65 74 75 72  ->pLimit ) retur
19020 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
19030 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
19040 20 28 31 33 29 20 2a 2f 0a 20 20 69 66 28 20 70   (13) */.  if( p
19050 53 75 62 2d 3e 70 4f 66 66 73 65 74 20 29 20 72  Sub->pOffset ) r
19060 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
19070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19080 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
19090 20 28 31 34 29 20 2a 2f 0a 20 20 69 66 28 20 70   (14) */.  if( p
190a0 2d 3e 70 52 69 67 68 74 6d 6f 73 74 20 26 26 20  ->pRightmost && 
190b0 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a  pSub->pLimit ){.
190c0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20      return 0;   
190d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
190e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
190f0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
19100 72 69 63 74 69 6f 6e 20 28 31 35 29 20 2a 2f 0a  riction (15) */.
19110 20 20 7d 0a 20 20 69 66 28 20 70 53 75 62 53 72    }.  if( pSubSr
19120 63 2d 3e 6e 53 72 63 3d 3d 30 20 29 20 72 65 74  c->nSrc==0 ) ret
19130 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
19140 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19150 52 65 73 74 72 69 63 74 69 6f 6e 20 28 37 29 20  Restriction (7) 
19160 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e   */.  if( pSub->
19170 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69  selFlags & SF_Di
19180 73 74 69 6e 63 74 20 29 20 72 65 74 75 72 6e 20  stinct ) return 
19190 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0;           /* 
191a0 52 65 73 74 72 69 63 74 69 6f 6e 20 28 35 29 20  Restriction (5) 
191b0 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e   */.  if( pSub->
191c0 70 4c 69 6d 69 74 20 26 26 20 28 70 53 72 63 2d  pLimit && (pSrc-
191d0 3e 6e 53 72 63 3e 31 20 7c 7c 20 69 73 41 67 67  >nSrc>1 || isAgg
191e0 29 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e  ) ){.     return
191f0 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52   0;         /* R
19200 65 73 74 72 69 63 74 69 6f 6e 73 20 28 38 29 28  estrictions (8)(
19210 39 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20  9) */.  }.  if( 
19220 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  (p->selFlags & S
19230 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30 20 26  F_Distinct)!=0 &
19240 26 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20  & subqueryIsAgg 
19250 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30  ){.     return 0
19260 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73  ;         /* Res
19270 74 72 69 63 74 69 6f 6e 20 28 36 29 20 20 2a 2f  triction (6)  */
19280 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4f  .  }.  if( p->pO
19290 72 64 65 72 42 79 20 26 26 20 70 53 75 62 2d 3e  rderBy && pSub->
192a0 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
192b0 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
192c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
192d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
192e0 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
192f0 69 6f 6e 20 28 31 31 29 20 2a 2f 0a 20 20 7d 0a  ion (11) */.  }.
19300 20 20 69 66 28 20 69 73 41 67 67 20 26 26 20 70    if( isAgg && p
19310 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 20  Sub->pOrderBy ) 
19320 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
19330 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
19340 72 69 63 74 69 6f 6e 20 28 31 36 29 20 2a 2f 0a  riction (16) */.
19350 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d    if( pSub->pLim
19360 69 74 20 26 26 20 70 2d 3e 70 57 68 65 72 65 20  it && p->pWhere 
19370 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
19380 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
19390 72 69 63 74 69 6f 6e 20 28 31 39 29 20 2a 2f 0a  riction (19) */.
193a0 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d    if( pSub->pLim
193b0 69 74 20 26 26 20 28 70 2d 3e 73 65 6c 46 6c 61  it && (p->selFla
193c0 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74  gs & SF_Distinct
193d0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 72 65 74  )!=0 ){.     ret
193e0 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 2f  urn 0;         /
193f0 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 32  * Restriction (2
19400 31 29 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20  1) */.  }..  /* 
19410 4f 42 53 4f 4c 45 54 45 20 43 4f 4d 4d 45 4e 54  OBSOLETE COMMENT
19420 20 31 3a 0a 20 20 2a 2a 20 52 65 73 74 72 69 63   1:.  ** Restric
19430 74 69 6f 6e 20 33 3a 20 20 49 66 20 74 68 65 20  tion 3:  If the 
19440 73 75 62 71 75 65 72 79 20 69 73 20 61 20 6a 6f  subquery is a jo
19450 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68  in, make sure th
19460 65 20 73 75 62 71 75 65 72 79 20 69 73 20 0a 20  e subquery is . 
19470 20 2a 2a 20 6e 6f 74 20 75 73 65 64 20 61 73 20   ** not used as 
19480 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e  the right operan
19490 64 20 6f 66 20 61 6e 20 6f 75 74 65 72 20 6a 6f  d of an outer jo
194a0 69 6e 2e 20 20 45 78 61 6d 70 6c 65 73 20 6f 66  in.  Examples of
194b0 20 77 68 79 20 74 68 69 73 0a 20 20 2a 2a 20 69   why this.  ** i
194c0 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a 20  s not allowed:. 
194d0 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20   **.  **        
194e0 20 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a   t1 LEFT OUTER J
194f0 4f 49 4e 20 28 74 32 20 4a 4f 49 4e 20 74 33 29  OIN (t2 JOIN t3)
19500 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 77 65  .  **.  ** If we
19510 20 66 6c 61 74 74 65 6e 20 74 68 65 20 61 62 6f   flatten the abo
19520 76 65 2c 20 77 65 20 77 6f 75 6c 64 20 67 65 74  ve, we would get
19530 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
19540 20 20 20 28 74 31 20 4c 45 46 54 20 4f 55 54 45     (t1 LEFT OUTE
19550 52 20 4a 4f 49 4e 20 74 32 29 20 4a 4f 49 4e 20  R JOIN t2) JOIN 
19560 74 33 0a 20 20 2a 2a 0a 20 20 2a 2a 20 77 68 69  t3.  **.  ** whi
19570 63 68 20 69 73 20 6e 6f 74 20 61 74 20 61 6c 6c  ch is not at all
19580 20 74 68 65 20 73 61 6d 65 20 74 68 69 6e 67 2e   the same thing.
19590 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 42 53 4f 4c  .  **.  ** OBSOL
195a0 45 54 45 20 43 4f 4d 4d 45 4e 54 20 32 3a 0a 20  ETE COMMENT 2:. 
195b0 20 2a 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   ** Restriction 
195c0 31 32 3a 20 20 49 66 20 74 68 65 20 73 75 62 71  12:  If the subq
195d0 75 65 72 79 20 69 73 20 74 68 65 20 72 69 67 68  uery is the righ
195e0 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 6c  t operand of a l
195f0 65 66 74 20 6f 75 74 65 72 0a 20 20 2a 2a 20 6a  eft outer.  ** j
19600 6f 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74  oin, make sure t
19610 68 65 20 73 75 62 71 75 65 72 79 20 68 61 73 20  he subquery has 
19620 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e  no WHERE clause.
19630 0a 20 20 2a 2a 20 41 6e 20 65 78 61 6d 70 6c 65  .  ** An example
19640 73 20 6f 66 20 77 68 79 20 74 68 69 73 20 69 73  s of why this is
19650 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a 20 20   not allowed:.  
19660 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20  **.  **         
19670 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f  t1 LEFT OUTER JO
19680 49 4e 20 28 53 45 4c 45 43 54 20 2a 20 46 52 4f  IN (SELECT * FRO
19690 4d 20 74 32 20 57 48 45 52 45 20 74 32 2e 78 3e  M t2 WHERE t2.x>
196a0 30 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  0).  **.  ** If 
196b0 77 65 20 66 6c 61 74 74 65 6e 20 74 68 65 20 61  we flatten the a
196c0 62 6f 76 65 2c 20 77 65 20 77 6f 75 6c 64 20 67  bove, we would g
196d0 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  et.  **.  **    
196e0 20 20 20 20 20 28 74 31 20 4c 45 46 54 20 4f 55       (t1 LEFT OU
196f0 54 45 52 20 4a 4f 49 4e 20 74 32 29 20 57 48 45  TER JOIN t2) WHE
19700 52 45 20 74 32 2e 78 3e 30 0a 20 20 2a 2a 0a 20  RE t2.x>0.  **. 
19710 20 2a 2a 20 42 75 74 20 74 68 65 20 74 32 2e 78   ** But the t2.x
19720 3e 30 20 74 65 73 74 20 77 69 6c 6c 20 61 6c 77  >0 test will alw
19730 61 79 73 20 66 61 69 6c 20 6f 6e 20 61 20 4e 55  ays fail on a NU
19740 4c 4c 20 72 6f 77 20 6f 66 20 74 32 2c 20 77 68  LL row of t2, wh
19750 69 63 68 0a 20 20 2a 2a 20 65 66 66 65 63 74 69  ich.  ** effecti
19760 76 65 6c 79 20 63 6f 6e 76 65 72 74 73 20 74 68  vely converts th
19770 65 20 4f 55 54 45 52 20 4a 4f 49 4e 20 69 6e 74  e OUTER JOIN int
19780 6f 20 61 6e 20 49 4e 4e 45 52 20 4a 4f 49 4e 2e  o an INNER JOIN.
19790 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 48 49 53 20  .  **.  ** THIS 
197a0 4f 56 45 52 52 49 44 45 53 20 4f 42 53 4f 4c 45  OVERRIDES OBSOLE
197b0 54 45 20 43 4f 4d 4d 45 4e 54 53 20 31 20 41 4e  TE COMMENTS 1 AN
197c0 44 20 32 20 41 42 4f 56 45 3a 0a 20 20 2a 2a 20  D 2 ABOVE:.  ** 
197d0 54 69 63 6b 65 74 20 23 33 33 30 30 20 73 68 6f  Ticket #3300 sho
197e0 77 73 20 74 68 61 74 20 66 6c 61 74 74 65 6e 69  ws that flatteni
197f0 6e 67 20 74 68 65 20 72 69 67 68 74 20 74 65 72  ng the right ter
19800 6d 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e  m of a LEFT JOIN
19810 0a 20 20 2a 2a 20 69 73 20 66 72 61 75 67 68 74  .  ** is fraught
19820 20 77 69 74 68 20 64 61 6e 67 65 72 2e 20 20 42   with danger.  B
19830 65 73 74 20 74 6f 20 61 76 6f 69 64 20 74 68 65  est to avoid the
19840 20 77 68 6f 6c 65 20 74 68 69 6e 67 2e 20 20 49   whole thing.  I
19850 66 20 74 68 65 0a 20 20 2a 2a 20 73 75 62 71 75  f the.  ** subqu
19860 65 72 79 20 69 73 20 74 68 65 20 72 69 67 68 74  ery is the right
19870 20 74 65 72 6d 20 6f 66 20 61 20 4c 45 46 54 20   term of a LEFT 
19880 4a 4f 49 4e 2c 20 74 68 65 6e 20 64 6f 20 6e 6f  JOIN, then do no
19890 74 20 66 6c 61 74 74 65 6e 2e 0a 20 20 2a 2f 0a  t flatten..  */.
198a0 20 20 69 66 28 20 28 70 53 75 62 69 74 65 6d 2d    if( (pSubitem-
198b0 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f  >jointype & JT_O
198c0 55 54 45 52 29 21 3d 30 20 29 7b 0a 20 20 20 20  UTER)!=0 ){.    
198d0 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20  return 0;.  }.. 
198e0 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
198f0 31 37 3a 20 49 66 20 74 68 65 20 73 75 62 2d 71  17: If the sub-q
19900 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75  uery is a compou
19910 6e 64 20 53 45 4c 45 43 54 2c 20 74 68 65 6e 20  nd SELECT, then 
19920 69 74 20 6d 75 73 74 0a 20 20 2a 2a 20 75 73 65  it must.  ** use
19930 20 6f 6e 6c 79 20 74 68 65 20 55 4e 49 4f 4e 20   only the UNION 
19940 41 4c 4c 20 6f 70 65 72 61 74 6f 72 2e 20 41 6e  ALL operator. An
19950 64 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 73 69  d none of the si
19960 6d 70 6c 65 20 73 65 6c 65 63 74 20 71 75 65 72  mple select quer
19970 69 65 73 0a 20 20 2a 2a 20 74 68 61 74 20 6d 61  ies.  ** that ma
19980 6b 65 20 75 70 20 74 68 65 20 63 6f 6d 70 6f 75  ke up the compou
19990 6e 64 20 53 45 4c 45 43 54 20 61 72 65 20 61 6c  nd SELECT are al
199a0 6c 6f 77 65 64 20 74 6f 20 62 65 20 61 67 67 72  lowed to be aggr
199b0 65 67 61 74 65 20 6f 72 20 64 69 73 74 69 6e 63  egate or distinc
199c0 74 0a 20 20 2a 2a 20 71 75 65 72 69 65 73 2e 0a  t.  ** queries..
199d0 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d    */.  if( pSub-
199e0 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 69  >pPrior ){.    i
199f0 66 28 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42  f( pSub->pOrderB
19a00 79 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  y ){.      retur
19a10 6e 20 30 3b 20 20 2f 2a 20 52 65 73 74 72 69 63  n 0;  /* Restric
19a20 74 69 6f 6e 20 32 30 20 2a 2f 0a 20 20 20 20 7d  tion 20 */.    }
19a30 0a 20 20 20 20 69 66 28 20 69 73 41 67 67 20 7c  .    if( isAgg |
19a40 7c 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  | (p->selFlags &
19a50 20 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30   SF_Distinct)!=0
19a60 20 7c 7c 20 70 53 72 63 2d 3e 6e 53 72 63 21 3d   || pSrc->nSrc!=
19a70 31 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  1 ){.      retur
19a80 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  n 0;.    }.    f
19a90 6f 72 28 70 53 75 62 31 3d 70 53 75 62 3b 20 70  or(pSub1=pSub; p
19aa0 53 75 62 31 3b 20 70 53 75 62 31 3d 70 53 75 62  Sub1; pSub1=pSub
19ab0 31 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20  1->pPrior){.    
19ac0 20 20 74 65 73 74 63 61 73 65 28 20 28 70 53 75    testcase( (pSu
19ad0 62 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28  b1->selFlags & (
19ae0 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41  SF_Distinct|SF_A
19af0 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 44  ggregate))==SF_D
19b00 69 73 74 69 6e 63 74 20 29 3b 0a 20 20 20 20 20  istinct );.     
19b10 20 74 65 73 74 63 61 73 65 28 20 28 70 53 75 62   testcase( (pSub
19b20 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53  1->selFlags & (S
19b30 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67  F_Distinct|SF_Ag
19b40 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 41 67  gregate))==SF_Ag
19b50 67 72 65 67 61 74 65 20 29 3b 0a 20 20 20 20 20  gregate );.     
19b60 20 61 73 73 65 72 74 28 20 70 53 75 62 2d 3e 70   assert( pSub->p
19b70 53 72 63 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  Src!=0 );.      
19b80 69 66 28 20 28 70 53 75 62 31 2d 3e 73 65 6c 46  if( (pSub1->selF
19b90 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69  lags & (SF_Disti
19ba0 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65  nct|SF_Aggregate
19bb0 29 29 21 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20  ))!=0.       || 
19bc0 28 70 53 75 62 31 2d 3e 70 50 72 69 6f 72 20 26  (pSub1->pPrior &
19bd0 26 20 70 53 75 62 31 2d 3e 6f 70 21 3d 54 4b 5f  & pSub1->op!=TK_
19be0 41 4c 4c 29 20 0a 20 20 20 20 20 20 20 7c 7c 20  ALL) .       || 
19bf0 70 53 75 62 31 2d 3e 70 53 72 63 2d 3e 6e 53 72  pSub1->pSrc->nSr
19c00 63 3c 31 0a 20 20 20 20 20 20 20 7c 7c 20 70 53  c<1.       || pS
19c10 75 62 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ub->pEList->nExp
19c20 72 21 3d 70 53 75 62 31 2d 3e 70 45 4c 69 73 74  r!=pSub1->pEList
19c30 2d 3e 6e 45 78 70 72 0a 20 20 20 20 20 20 29 7b  ->nExpr.      ){
19c40 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
19c50 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
19c60 20 74 65 73 74 63 61 73 65 28 20 70 53 75 62 31   testcase( pSub1
19c70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20 29  ->pSrc->nSrc>1 )
19c80 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
19c90 52 65 73 74 72 69 63 74 69 6f 6e 20 31 38 2e 20  Restriction 18. 
19ca0 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4f  */.    if( p->pO
19cb0 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
19cc0 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20 66 6f  int ii;.      fo
19cd0 72 28 69 69 3d 30 3b 20 69 69 3c 70 2d 3e 70 4f  r(ii=0; ii<p->pO
19ce0 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69  rderBy->nExpr; i
19cf0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  i++){.        if
19d00 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 61  ( p->pOrderBy->a
19d10 5b 69 69 5d 2e 69 4f 72 64 65 72 42 79 43 6f 6c  [ii].iOrderByCol
19d20 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
19d30 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
19d40 7d 0a 0a 20 20 2f 2a 2a 2a 2a 2a 20 49 66 20 77  }..  /***** If w
19d50 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69  e reach this poi
19d60 6e 74 2c 20 66 6c 61 74 74 65 6e 69 6e 67 20 69  nt, flattening i
19d70 73 20 70 65 72 6d 69 74 74 65 64 2e 20 2a 2a 2a  s permitted. ***
19d80 2a 2a 2f 0a 0a 20 20 2f 2a 20 41 75 74 68 6f 72  **/..  /* Author
19d90 69 7a 65 20 74 68 65 20 73 75 62 71 75 65 72 79  ize the subquery
19da0 20 2a 2f 0a 20 20 70 50 61 72 73 65 2d 3e 7a 41   */.  pParse->zA
19db0 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70 53 75  uthContext = pSu
19dc0 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20 20  bitem->zName;.  
19dd0 54 45 53 54 4f 4e 4c 59 28 69 20 3d 29 20 73 71  TESTONLY(i =) sq
19de0 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
19df0 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 53 45  Parse, SQLITE_SE
19e00 4c 45 43 54 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  LECT, 0, 0, 0);.
19e10 20 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d 53    testcase( i==S
19e20 51 4c 49 54 45 5f 44 45 4e 59 20 29 3b 0a 20 20  QLITE_DENY );.  
19e30 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e  pParse->zAuthCon
19e40 74 65 78 74 20 3d 20 7a 53 61 76 65 64 41 75 74  text = zSavedAut
19e50 68 43 6f 6e 74 65 78 74 3b 0a 0a 20 20 2f 2a 20  hContext;..  /* 
19e60 49 66 20 74 68 65 20 73 75 62 2d 71 75 65 72 79  If the sub-query
19e70 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53   is a compound S
19e80 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c  ELECT statement,
19e90 20 74 68 65 6e 20 28 62 79 20 72 65 73 74 72 69   then (by restri
19ea0 63 74 69 6f 6e 73 0a 20 20 2a 2a 20 31 37 20 61  ctions.  ** 17 a
19eb0 6e 64 20 31 38 20 61 62 6f 76 65 29 20 69 74 20  nd 18 above) it 
19ec0 6d 75 73 74 20 62 65 20 61 20 55 4e 49 4f 4e 20  must be a UNION 
19ed0 41 4c 4c 20 61 6e 64 20 74 68 65 20 70 61 72 65  ALL and the pare
19ee0 6e 74 20 71 75 65 72 79 20 6d 75 73 74 20 0a 20  nt query must . 
19ef0 20 2a 2a 20 62 65 20 6f 66 20 74 68 65 20 66 6f   ** be of the fo
19f00 72 6d 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  rm:.  **.  **   
19f10 20 20 53 45 4c 45 43 54 20 3c 65 78 70 72 2d 6c    SELECT <expr-l
19f20 69 73 74 3e 20 46 52 4f 4d 20 28 3c 73 75 62 2d  ist> FROM (<sub-
19f30 71 75 65 72 79 3e 29 20 3c 77 68 65 72 65 2d 63  query>) <where-c
19f40 6c 61 75 73 65 3e 20 0a 20 20 2a 2a 0a 20 20 2a  lause> .  **.  *
19f50 2a 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61 6e  * followed by an
19f60 79 20 4f 52 44 45 52 20 42 59 2c 20 4c 49 4d 49  y ORDER BY, LIMI
19f70 54 20 61 6e 64 2f 6f 72 20 4f 46 46 53 45 54 20  T and/or OFFSET 
19f80 63 6c 61 75 73 65 73 2e 20 54 68 69 73 20 62 6c  clauses. This bl
19f90 6f 63 6b 0a 20 20 2a 2a 20 63 72 65 61 74 65 73  ock.  ** creates
19fa0 20 4e 2d 31 20 63 6f 70 69 65 73 20 6f 66 20 74   N-1 copies of t
19fb0 68 65 20 70 61 72 65 6e 74 20 71 75 65 72 79 20  he parent query 
19fc0 77 69 74 68 6f 75 74 20 61 6e 79 20 4f 52 44 45  without any ORDE
19fd0 52 20 42 59 2c 20 4c 49 4d 49 54 20 6f 72 20 0a  R BY, LIMIT or .
19fe0 20 20 2a 2a 20 4f 46 46 53 45 54 20 63 6c 61 75    ** OFFSET clau
19ff0 73 65 73 20 61 6e 64 20 6a 6f 69 6e 73 20 74 68  ses and joins th
1a000 65 6d 20 74 6f 20 74 68 65 20 6c 65 66 74 2d 68  em to the left-h
1a010 61 6e 64 2d 73 69 64 65 20 6f 66 20 74 68 65 20  and-side of the 
1a020 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 75 73  original.  ** us
1a030 69 6e 67 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70  ing UNION ALL op
1a040 65 72 61 74 6f 72 73 2e 20 49 6e 20 74 68 69 73  erators. In this
1a050 20 63 61 73 65 20 4e 20 69 73 20 74 68 65 20 6e   case N is the n
1a060 75 6d 62 65 72 20 6f 66 20 73 69 6d 70 6c 65 0a  umber of simple.
1a070 20 20 2a 2a 20 73 65 6c 65 63 74 20 73 74 61 74    ** select stat
1a080 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 63 6f  ements in the co
1a090 6d 70 6f 75 6e 64 20 73 75 62 2d 71 75 65 72 79  mpound sub-query
1a0a0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 61 6d  ..  **.  ** Exam
1a0b0 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ple:.  **.  **  
1a0c0 20 20 20 53 45 4c 45 43 54 20 61 2b 31 20 46 52     SELECT a+1 FR
1a0d0 4f 4d 20 28 0a 20 20 2a 2a 20 20 20 20 20 20 20  OM (.  **       
1a0e0 20 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74   SELECT x FROM t
1a0f0 61 62 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 55  ab.  **        U
1a100 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20  NION ALL.  **   
1a110 20 20 20 20 20 53 45 4c 45 43 54 20 79 20 46 52       SELECT y FR
1a120 4f 4d 20 74 61 62 0a 20 20 2a 2a 20 20 20 20 20  OM tab.  **     
1a130 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a     UNION ALL.  *
1a140 2a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20  *        SELECT 
1a150 61 62 73 28 7a 2a 32 29 20 46 52 4f 4d 20 74 61  abs(z*2) FROM ta
1a160 62 32 0a 20 20 2a 2a 20 20 20 20 20 29 20 57 48  b2.  **     ) WH
1a170 45 52 45 20 61 21 3d 35 20 4f 52 44 45 52 20 42  ERE a!=5 ORDER B
1a180 59 20 31 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 72  Y 1.  **.  ** Tr
1a190 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f 3a 0a  ansformed into:.
1a1a0 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45    **.  **     SE
1a1b0 4c 45 43 54 20 78 2b 31 20 46 52 4f 4d 20 74 61  LECT x+1 FROM ta
1a1c0 62 20 57 48 45 52 45 20 78 2b 31 21 3d 35 0a 20  b WHERE x+1!=5. 
1a1d0 20 2a 2a 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c   **     UNION AL
1a1e0 4c 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43  L.  **     SELEC
1a1f0 54 20 79 2b 31 20 46 52 4f 4d 20 74 61 62 20 57  T y+1 FROM tab W
1a200 48 45 52 45 20 79 2b 31 21 3d 35 0a 20 20 2a 2a  HERE y+1!=5.  **
1a210 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20       UNION ALL. 
1a220 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61   **     SELECT a
1a230 62 73 28 7a 2a 32 29 2b 31 20 46 52 4f 4d 20 74  bs(z*2)+1 FROM t
1a240 61 62 32 20 57 48 45 52 45 20 61 62 73 28 7a 2a  ab2 WHERE abs(z*
1a250 32 29 2b 31 21 3d 35 0a 20 20 2a 2a 20 20 20 20  2)+1!=5.  **    
1a260 20 4f 52 44 45 52 20 42 59 20 31 0a 20 20 2a 2a   ORDER BY 1.  **
1a270 0a 20 20 2a 2a 20 57 65 20 63 61 6c 6c 20 74 68  .  ** We call th
1a280 69 73 20 74 68 65 20 22 63 6f 6d 70 6f 75 6e 64  is the "compound
1a290 2d 73 75 62 71 75 65 72 79 20 66 6c 61 74 74 65  -subquery flatte
1a2a0 6e 69 6e 67 22 2e 0a 20 20 2a 2f 0a 20 20 66 6f  ning"..  */.  fo
1a2b0 72 28 70 53 75 62 3d 70 53 75 62 2d 3e 70 50 72  r(pSub=pSub->pPr
1a2c0 69 6f 72 3b 20 70 53 75 62 3b 20 70 53 75 62 3d  ior; pSub; pSub=
1a2d0 70 53 75 62 2d 3e 70 50 72 69 6f 72 29 7b 0a 20  pSub->pPrior){. 
1a2e0 20 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 77 3b     Select *pNew;
1a2f0 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70  .    ExprList *p
1a300 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72  OrderBy = p->pOr
1a310 64 65 72 42 79 3b 0a 20 20 20 20 45 78 70 72 20  derBy;.    Expr 
1a320 2a 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69  *pLimit = p->pLi
1a330 6d 69 74 3b 0a 20 20 20 20 45 78 70 72 20 2a 70  mit;.    Expr *p
1a340 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66  Offset = p->pOff
1a350 73 65 74 3b 0a 20 20 20 20 53 65 6c 65 63 74 20  set;.    Select 
1a360 2a 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72  *pPrior = p->pPr
1a370 69 6f 72 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64  ior;.    p->pOrd
1a380 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 70 2d  erBy = 0;.    p-
1a390 3e 70 53 72 63 20 3d 20 30 3b 0a 20 20 20 20 70  >pSrc = 0;.    p
1a3a0 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20  ->pPrior = 0;.  
1a3b0 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b    p->pLimit = 0;
1a3c0 0a 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20  .    p->pOffset 
1a3d0 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20  = 0;.    pNew = 
1a3e0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
1a3f0 28 64 62 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20  (db, p, 0);.    
1a400 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f 66  p->pOffset = pOf
1a410 66 73 65 74 3b 0a 20 20 20 20 70 2d 3e 70 4c 69  fset;.    p->pLi
1a420 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20  mit = pLimit;.  
1a430 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20    p->pOrderBy = 
1a440 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 70 2d  pOrderBy;.    p-
1a450 3e 70 53 72 63 20 3d 20 70 53 72 63 3b 0a 20 20  >pSrc = pSrc;.  
1a460 20 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f 41 4c 4c    p->op = TK_ALL
1a470 3b 0a 20 20 20 20 70 2d 3e 70 52 69 67 68 74 6d  ;.    p->pRightm
1a480 6f 73 74 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  ost = 0;.    if(
1a490 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20   pNew==0 ){.    
1a4a0 20 20 70 4e 65 77 20 3d 20 70 50 72 69 6f 72 3b    pNew = pPrior;
1a4b0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1a4c0 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72 20 3d    pNew->pPrior =
1a4d0 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70   pPrior;.      p
1a4e0 4e 65 77 2d 3e 70 52 69 67 68 74 6d 6f 73 74 20  New->pRightmost 
1a4f0 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  = 0;.    }.    p
1a500 2d 3e 70 50 72 69 6f 72 20 3d 20 70 4e 65 77 3b  ->pPrior = pNew;
1a510 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  .    if( db->mal
1a520 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75  locFailed ) retu
1a530 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rn 1;.  }..  /* 
1a540 42 65 67 69 6e 20 66 6c 61 74 74 65 6e 69 6e 67  Begin flattening
1a550 20 74 68 65 20 69 46 72 6f 6d 2d 74 68 20 65 6e   the iFrom-th en
1a560 74 72 79 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  try of the FROM 
1a570 63 6c 61 75 73 65 20 0a 20 20 2a 2a 20 69 6e 20  clause .  ** in 
1a580 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e  the outer query.
1a590 0a 20 20 2a 2f 0a 20 20 70 53 75 62 20 3d 20 70  .  */.  pSub = p
1a5a0 53 75 62 31 20 3d 20 70 53 75 62 69 74 65 6d 2d  Sub1 = pSubitem-
1a5b0 3e 70 53 65 6c 65 63 74 3b 0a 0a 20 20 2f 2a 20  >pSelect;..  /* 
1a5c0 44 65 6c 65 74 65 20 74 68 65 20 74 72 61 6e 73  Delete the trans
1a5d0 69 65 6e 74 20 74 61 62 6c 65 20 73 74 72 75 63  ient table struc
1a5e0 74 75 72 65 20 61 73 73 6f 63 69 61 74 65 64 20  ture associated 
1a5f0 77 69 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 75  with the.  ** su
1a600 62 71 75 65 72 79 0a 20 20 2a 2f 0a 20 20 73 71  bquery.  */.  sq
1a610 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
1a620 70 53 75 62 69 74 65 6d 2d 3e 7a 44 61 74 61 62  pSubitem->zDatab
1a630 61 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  ase);.  sqlite3D
1a640 62 46 72 65 65 28 64 62 2c 20 70 53 75 62 69 74  bFree(db, pSubit
1a650 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 73 71  em->zName);.  sq
1a660 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
1a670 70 53 75 62 69 74 65 6d 2d 3e 7a 41 6c 69 61 73  pSubitem->zAlias
1a680 29 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a  );.  pSubitem->z
1a690 44 61 74 61 62 61 73 65 20 3d 20 30 3b 0a 20 20  Database = 0;.  
1a6a0 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 20  pSubitem->zName 
1a6b0 3d 20 30 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d  = 0;.  pSubitem-
1a6c0 3e 7a 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20 70  >zAlias = 0;.  p
1a6d0 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74  Subitem->pSelect
1a6e0 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 44 65 66 65   = 0;..  /* Defe
1a6f0 72 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20 54  r deleting the T
1a700 61 62 6c 65 20 6f 62 6a 65 63 74 20 61 73 73 6f  able object asso
1a710 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 0a  ciated with the.
1a720 20 20 2a 2a 20 73 75 62 71 75 65 72 79 20 75 6e    ** subquery un
1a730 74 69 6c 20 63 6f 64 65 20 67 65 6e 65 72 61 74  til code generat
1a740 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 70  ion is.  ** comp
1a750 6c 65 74 65 2c 20 73 69 6e 63 65 20 74 68 65 72  lete, since ther
1a760 65 20 6d 61 79 20 73 74 69 6c 6c 20 65 78 69 73  e may still exis
1a770 74 20 45 78 70 72 2e 70 54 61 62 20 65 6e 74 72  t Expr.pTab entr
1a780 69 65 73 20 74 68 61 74 0a 20 20 2a 2a 20 72 65  ies that.  ** re
1a790 66 65 72 20 74 6f 20 74 68 65 20 73 75 62 71 75  fer to the subqu
1a7a0 65 72 79 20 65 76 65 6e 20 61 66 74 65 72 20 66  ery even after f
1a7b0 6c 61 74 74 65 6e 69 6e 67 2e 20 20 54 69 63 6b  lattening.  Tick
1a7c0 65 74 20 23 33 33 34 36 2e 0a 20 20 2a 2a 0a 20  et #3346..  **. 
1a7d0 20 2a 2a 20 70 53 75 62 69 74 65 6d 2d 3e 70 54   ** pSubitem->pT
1a7e0 61 62 20 69 73 20 61 6c 77 61 79 73 20 6e 6f 6e  ab is always non
1a7f0 2d 4e 55 4c 4c 20 62 79 20 74 65 73 74 20 72 65  -NULL by test re
1a800 73 74 72 69 63 74 69 6f 6e 73 20 61 6e 64 20 74  strictions and t
1a810 65 73 74 73 20 61 62 6f 76 65 2e 0a 20 20 2a 2f  ests above..  */
1a820 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 53  .  if( ALWAYS(pS
1a830 75 62 69 74 65 6d 2d 3e 70 54 61 62 21 3d 30 29  ubitem->pTab!=0)
1a840 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70   ){.    Table *p
1a850 54 61 62 54 6f 44 65 6c 20 3d 20 70 53 75 62 69  TabToDel = pSubi
1a860 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69  tem->pTab;.    i
1a870 66 28 20 70 54 61 62 54 6f 44 65 6c 2d 3e 6e 52  f( pTabToDel->nR
1a880 65 66 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 50  ef==1 ){.      P
1a890 61 72 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20  arse *pToplevel 
1a8a0 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65 54 6f  = sqlite3ParseTo
1a8b0 70 6c 65 76 65 6c 28 70 50 61 72 73 65 29 3b 0a  plevel(pParse);.
1a8c0 20 20 20 20 20 20 70 54 61 62 54 6f 44 65 6c 2d        pTabToDel-
1a8d0 3e 70 4e 65 78 74 5a 6f 6d 62 69 65 20 3d 20 70  >pNextZombie = p
1a8e0 54 6f 70 6c 65 76 65 6c 2d 3e 70 5a 6f 6d 62 69  Toplevel->pZombi
1a8f0 65 54 61 62 3b 0a 20 20 20 20 20 20 70 54 6f 70  eTab;.      pTop
1a900 6c 65 76 65 6c 2d 3e 70 5a 6f 6d 62 69 65 54 61  level->pZombieTa
1a910 62 20 3d 20 70 54 61 62 54 6f 44 65 6c 3b 0a 20  b = pTabToDel;. 
1a920 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1a930 70 54 61 62 54 6f 44 65 6c 2d 3e 6e 52 65 66 2d  pTabToDel->nRef-
1a940 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 75  -;.    }.    pSu
1a950 62 69 74 65 6d 2d 3e 70 54 61 62 20 3d 20 30 3b  bitem->pTab = 0;
1a960 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66  .  }..  /* The f
1a970 6f 6c 6c 6f 77 69 6e 67 20 6c 6f 6f 70 20 72 75  ollowing loop ru
1a980 6e 73 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68  ns once for each
1a990 20 74 65 72 6d 20 69 6e 20 61 20 63 6f 6d 70 6f   term in a compo
1a9a0 75 6e 64 2d 73 75 62 71 75 65 72 79 0a 20 20 2a  und-subquery.  *
1a9b0 2a 20 66 6c 61 74 74 65 6e 69 6e 67 20 28 61 73  * flattening (as
1a9c0 20 64 65 73 63 72 69 62 65 64 20 61 62 6f 76 65   described above
1a9d0 29 2e 20 20 49 66 20 77 65 20 61 72 65 20 64 6f  ).  If we are do
1a9e0 69 6e 67 20 61 20 64 69 66 66 65 72 65 6e 74 20  ing a different 
1a9f0 6b 69 6e 64 0a 20 20 2a 2a 20 6f 66 20 66 6c 61  kind.  ** of fla
1aa00 74 74 65 6e 69 6e 67 20 2d 20 61 20 66 6c 61 74  ttening - a flat
1aa10 74 65 6e 69 6e 67 20 6f 74 68 65 72 20 74 68 61  tening other tha
1aa20 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 2d 73 75 62  n a compound-sub
1aa30 71 75 65 72 79 20 66 6c 61 74 74 65 6e 69 6e 67  query flattening
1aa40 20 2d 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68 69   -.  ** then thi
1aa50 73 20 6c 6f 6f 70 20 6f 6e 6c 79 20 72 75 6e 73  s loop only runs
1aa60 20 6f 6e 63 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a   once..  **.  **
1aa70 20 54 68 69 73 20 6c 6f 6f 70 20 6d 6f 76 65 73   This loop moves
1aa80 20 61 6c 6c 20 6f 66 20 74 68 65 20 46 52 4f 4d   all of the FROM
1aa90 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65   elements of the
1aaa0 20 73 75 62 71 75 65 72 79 20 69 6e 74 6f 20 74   subquery into t
1aab0 68 65 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f 4d  he.  ** the FROM
1aac0 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f   clause of the o
1aad0 75 74 65 72 20 71 75 65 72 79 2e 20 20 42 65 66  uter query.  Bef
1aae0 6f 72 65 20 64 6f 69 6e 67 20 74 68 69 73 2c 20  ore doing this, 
1aaf0 72 65 6d 65 6d 62 65 72 0a 20 20 2a 2a 20 74 68  remember.  ** th
1ab00 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  e cursor number 
1ab10 66 6f 72 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  for the original
1ab20 20 6f 75 74 65 72 20 71 75 65 72 79 20 46 52 4f   outer query FRO
1ab30 4d 20 65 6c 65 6d 65 6e 74 20 69 6e 0a 20 20 2a  M element in.  *
1ab40 2a 20 69 50 61 72 65 6e 74 2e 20 20 54 68 65 20  * iParent.  The 
1ab50 69 50 61 72 65 6e 74 20 63 75 72 73 6f 72 20 77  iParent cursor w
1ab60 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 75 73 65  ill never be use
1ab70 64 2e 20 20 53 75 62 73 65 71 75 65 6e 74 20 63  d.  Subsequent c
1ab80 6f 64 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 73 63  ode.  ** will sc
1ab90 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6c  an expressions l
1aba0 6f 6f 6b 69 6e 67 20 66 6f 72 20 69 50 61 72 65  ooking for iPare
1abb0 6e 74 20 72 65 66 65 72 65 6e 63 65 73 20 61 6e  nt references an
1abc0 64 20 72 65 70 6c 61 63 65 0a 20 20 2a 2a 20 74  d replace.  ** t
1abd0 68 6f 73 65 20 72 65 66 65 72 65 6e 63 65 73 20  hose references 
1abe0 77 69 74 68 20 65 78 70 72 65 73 73 69 6f 6e 73  with expressions
1abf0 20 74 68 61 74 20 72 65 73 6f 6c 76 65 20 74 6f   that resolve to
1ac00 20 74 68 65 20 73 75 62 71 75 65 72 79 20 46 52   the subquery FR
1ac10 4f 4d 0a 20 20 2a 2a 20 65 6c 65 6d 65 6e 74 73  OM.  ** elements
1ac20 20 77 65 20 61 72 65 20 6e 6f 77 20 63 6f 70 79   we are now copy
1ac30 69 6e 67 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 66  ing in..  */.  f
1ac40 6f 72 28 70 50 61 72 65 6e 74 3d 70 3b 20 70 50  or(pParent=p; pP
1ac50 61 72 65 6e 74 3b 20 70 50 61 72 65 6e 74 3d 70  arent; pParent=p
1ac60 50 61 72 65 6e 74 2d 3e 70 50 72 69 6f 72 2c 20  Parent->pPrior, 
1ac70 70 53 75 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f  pSub=pSub->pPrio
1ac80 72 29 7b 0a 20 20 20 20 69 6e 74 20 6e 53 75 62  r){.    int nSub
1ac90 53 72 63 3b 0a 20 20 20 20 75 38 20 6a 6f 69 6e  Src;.    u8 join
1aca0 74 79 70 65 20 3d 20 30 3b 0a 20 20 20 20 70 53  type = 0;.    pS
1acb0 75 62 53 72 63 20 3d 20 70 53 75 62 2d 3e 70 53  ubSrc = pSub->pS
1acc0 72 63 3b 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20  rc;     /* FROM 
1acd0 63 6c 61 75 73 65 20 6f 66 20 73 75 62 71 75 65  clause of subque
1ace0 72 79 20 2a 2f 0a 20 20 20 20 6e 53 75 62 53 72  ry */.    nSubSr
1acf0 63 20 3d 20 70 53 75 62 53 72 63 2d 3e 6e 53 72  c = pSubSrc->nSr
1ad00 63 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66  c;  /* Number of
1ad10 20 74 65 72 6d 73 20 69 6e 20 73 75 62 71 75 65   terms in subque
1ad20 72 79 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a  ry FROM clause *
1ad30 2f 0a 20 20 20 20 70 53 72 63 20 3d 20 70 50 61  /.    pSrc = pPa
1ad40 72 65 6e 74 2d 3e 70 53 72 63 3b 20 20 20 20 20  rent->pSrc;     
1ad50 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  /* FROM clause o
1ad60 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  f the outer quer
1ad70 79 20 2a 2f 0a 0a 20 20 20 20 69 66 28 20 70 53  y */..    if( pS
1ad80 72 63 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  rc ){.      asse
1ad90 72 74 28 20 70 50 61 72 65 6e 74 3d 3d 70 20 29  rt( pParent==p )
1ada0 3b 20 20 2f 2a 20 46 69 72 73 74 20 74 69 6d 65  ;  /* First time
1adb0 20 74 68 72 6f 75 67 68 20 74 68 65 20 6c 6f 6f   through the loo
1adc0 70 20 2a 2f 0a 20 20 20 20 20 20 6a 6f 69 6e 74  p */.      joint
1add0 79 70 65 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e  ype = pSubitem->
1ade0 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20 7d 65  jointype;.    }e
1adf0 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
1ae00 74 28 20 70 50 61 72 65 6e 74 21 3d 70 20 29 3b  t( pParent!=p );
1ae10 20 20 2f 2a 20 32 6e 64 20 61 6e 64 20 73 75 62    /* 2nd and sub
1ae20 73 65 71 75 65 6e 74 20 74 69 6d 65 73 20 74 68  sequent times th
1ae30 72 6f 75 67 68 20 74 68 65 20 6c 6f 6f 70 20 2a  rough the loop *
1ae40 2f 0a 20 20 20 20 20 20 70 53 72 63 20 3d 20 70  /.      pSrc = p
1ae50 50 61 72 65 6e 74 2d 3e 70 53 72 63 20 3d 20 73  Parent->pSrc = s
1ae60 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70  qlite3SrcListApp
1ae70 65 6e 64 28 64 62 2c 20 30 2c 20 30 2c 20 30 29  end(db, 0, 0, 0)
1ae80 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 72 63  ;.      if( pSrc
1ae90 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61  ==0 ){.        a
1aea0 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f  ssert( db->mallo
1aeb0 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20  cFailed );.     
1aec0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1aed0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
1aee0 54 68 65 20 73 75 62 71 75 65 72 79 20 75 73 65  The subquery use
1aef0 73 20 61 20 73 69 6e 67 6c 65 20 73 6c 6f 74 20  s a single slot 
1af00 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  of the FROM clau
1af10 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72 0a  se of the outer.
1af20 20 20 20 20 2a 2a 20 71 75 65 72 79 2e 20 20 49      ** query.  I
1af30 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 68  f the subquery h
1af40 61 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  as more than one
1af50 20 65 6c 65 6d 65 6e 74 20 69 6e 20 69 74 73 20   element in its 
1af60 46 52 4f 4d 20 63 6c 61 75 73 65 2c 0a 20 20 20  FROM clause,.   
1af70 20 2a 2a 20 74 68 65 6e 20 65 78 70 61 6e 64 20   ** then expand 
1af80 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
1af90 74 6f 20 6d 61 6b 65 20 73 70 61 63 65 20 66 6f  to make space fo
1afa0 72 20 69 74 20 74 6f 20 68 6f 6c 64 20 61 6c 6c  r it to hold all
1afb0 20 65 6c 65 6d 65 6e 74 73 0a 20 20 20 20 2a 2a   elements.    **
1afc0 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79   of the subquery
1afd0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
1afe0 45 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a  Example:.    **.
1aff0 20 20 20 20 2a 2a 20 20 20 20 53 45 4c 45 43 54      **    SELECT
1b000 20 2a 20 46 52 4f 4d 20 74 61 62 41 2c 20 28 53   * FROM tabA, (S
1b010 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73 75 62  ELECT * FROM sub
1b020 31 2c 20 73 75 62 32 29 2c 20 74 61 62 42 3b 0a  1, sub2), tabB;.
1b030 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
1b040 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 68 61  e outer query ha
1b050 73 20 33 20 73 6c 6f 74 73 20 69 6e 20 69 74 73  s 3 slots in its
1b060 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 4f   FROM clause.  O
1b070 6e 65 20 73 6c 6f 74 20 6f 66 20 74 68 65 0a 20  ne slot of the. 
1b080 20 20 20 2a 2a 20 6f 75 74 65 72 20 71 75 65 72     ** outer quer
1b090 79 20 28 74 68 65 20 6d 69 64 64 6c 65 20 73 6c  y (the middle sl
1b0a0 6f 74 29 20 69 73 20 75 73 65 64 20 62 79 20 74  ot) is used by t
1b0b0 68 65 20 73 75 62 71 75 65 72 79 2e 20 20 54 68  he subquery.  Th
1b0c0 65 20 6e 65 78 74 0a 20 20 20 20 2a 2a 20 62 6c  e next.    ** bl
1b0d0 6f 63 6b 20 6f 66 20 63 6f 64 65 20 77 69 6c 6c  ock of code will
1b0e0 20 65 78 70 61 6e 64 20 74 68 65 20 6f 75 74 20   expand the out 
1b0f0 71 75 65 72 79 20 74 6f 20 34 20 73 6c 6f 74 73  query to 4 slots
1b100 2e 20 20 54 68 65 20 6d 69 64 64 6c 65 0a 20 20  .  The middle.  
1b110 20 20 2a 2a 20 73 6c 6f 74 20 69 73 20 65 78 70    ** slot is exp
1b120 61 6e 64 65 64 20 74 6f 20 74 77 6f 20 73 6c 6f  anded to two slo
1b130 74 73 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6d  ts in order to m
1b140 61 6b 65 20 73 70 61 63 65 20 66 6f 72 20 74 68  ake space for th
1b150 65 0a 20 20 20 20 2a 2a 20 74 77 6f 20 65 6c 65  e.    ** two ele
1b160 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 46 52 4f  ments in the FRO
1b170 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
1b180 73 75 62 71 75 65 72 79 2e 0a 20 20 20 20 2a 2f  subquery..    */
1b190 0a 20 20 20 20 69 66 28 20 6e 53 75 62 53 72 63  .    if( nSubSrc
1b1a0 3e 31 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72  >1 ){.      pPar
1b1b0 65 6e 74 2d 3e 70 53 72 63 20 3d 20 70 53 72 63  ent->pSrc = pSrc
1b1c0 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73   = sqlite3SrcLis
1b1d0 74 45 6e 6c 61 72 67 65 28 64 62 2c 20 70 53 72  tEnlarge(db, pSr
1b1e0 63 2c 20 6e 53 75 62 53 72 63 2d 31 2c 69 46 72  c, nSubSrc-1,iFr
1b1f0 6f 6d 2b 31 29 3b 0a 20 20 20 20 20 20 69 66 28  om+1);.      if(
1b200 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
1b210 64 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65  d ){.        bre
1b220 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
1b230 7d 0a 0a 20 20 20 20 2f 2a 20 54 72 61 6e 73 66  }..    /* Transf
1b240 65 72 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  er the FROM clau
1b250 73 65 20 74 65 72 6d 73 20 66 72 6f 6d 20 74 68  se terms from th
1b260 65 20 73 75 62 71 75 65 72 79 20 69 6e 74 6f 20  e subquery into 
1b270 74 68 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72  the.    ** outer
1b280 20 71 75 65 72 79 2e 0a 20 20 20 20 2a 2f 0a 20   query..    */. 
1b290 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53     for(i=0; i<nS
1b2a0 75 62 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  ubSrc; i++){.   
1b2b0 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74     sqlite3IdList
1b2c0 44 65 6c 65 74 65 28 64 62 2c 20 70 53 72 63 2d  Delete(db, pSrc-
1b2d0 3e 61 5b 69 2b 69 46 72 6f 6d 5d 2e 70 55 73 69  >a[i+iFrom].pUsi
1b2e0 6e 67 29 3b 0a 20 20 20 20 20 20 70 53 72 63 2d  ng);.      pSrc-
1b2f0 3e 61 5b 69 2b 69 46 72 6f 6d 5d 20 3d 20 70 53  >a[i+iFrom] = pS
1b300 75 62 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20  ubSrc->a[i];.   
1b310 20 20 20 6d 65 6d 73 65 74 28 26 70 53 75 62 53     memset(&pSubS
1b320 72 63 2d 3e 61 5b 69 5d 2c 20 30 2c 20 73 69 7a  rc->a[i], 0, siz
1b330 65 6f 66 28 70 53 75 62 53 72 63 2d 3e 61 5b 69  eof(pSubSrc->a[i
1b340 5d 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ]));.    }.    p
1b350 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 6a 6f  Src->a[iFrom].jo
1b360 69 6e 74 79 70 65 20 3d 20 6a 6f 69 6e 74 79 70  intype = jointyp
1b370 65 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 4e 6f 77  e;.  .    /* Now
1b380 20 62 65 67 69 6e 20 73 75 62 73 74 69 74 75 74   begin substitut
1b390 69 6e 67 20 73 75 62 71 75 65 72 79 20 72 65 73  ing subquery res
1b3a0 75 6c 74 20 73 65 74 20 65 78 70 72 65 73 73 69  ult set expressi
1b3b0 6f 6e 73 20 66 6f 72 20 0a 20 20 20 20 2a 2a 20  ons for .    ** 
1b3c0 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
1b3d0 65 20 69 50 61 72 65 6e 74 20 69 6e 20 74 68 65  e iParent in the
1b3e0 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20   outer query..  
1b3f0 20 20 2a 2a 20 0a 20 20 20 20 2a 2a 20 45 78 61    ** .    ** Exa
1b400 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  mple:.    **.   
1b410 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 61 2b 35   **   SELECT a+5
1b420 2c 20 62 2a 31 30 20 46 52 4f 4d 20 28 53 45 4c  , b*10 FROM (SEL
1b430 45 43 54 20 78 2a 33 20 41 53 20 61 2c 20 79 2b  ECT x*3 AS a, y+
1b440 31 30 20 41 53 20 62 20 46 52 4f 4d 20 74 31 29  10 AS b FROM t1)
1b450 20 57 48 45 52 45 20 61 3e 62 3b 0a 20 20 20 20   WHERE a>b;.    
1b460 2a 2a 20 20 20 5c 20 20 20 20 20 20 20 20 20 20  **   \          
1b470 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f             \____
1b480 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 73 75 62 71 75 65  _________ subque
1b490 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20  ry __________/  
1b4a0 20 20 20 20 20 20 20 20 2f 0a 20 20 20 20 2a 2a          /.    **
1b4b0 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f      \___________
1b4c0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65 72  __________ outer
1b4d0 20 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f   query _________
1b4e0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
1b4f0 5f 5f 5f 5f 5f 2f 0a 20 20 20 20 2a 2a 0a 20 20  _____/.    **.  
1b500 20 20 2a 2a 20 57 65 20 6c 6f 6f 6b 20 61 74 20    ** We look at 
1b510 65 76 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e  every expression
1b520 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75   in the outer qu
1b530 65 72 79 20 61 6e 64 20 65 76 65 72 79 20 70 6c  ery and every pl
1b540 61 63 65 20 77 65 20 73 65 65 0a 20 20 20 20 2a  ace we see.    *
1b550 2a 20 22 61 22 20 77 65 20 73 75 62 73 74 69 74  * "a" we substit
1b560 75 74 65 20 22 78 2a 33 22 20 61 6e 64 20 65 76  ute "x*3" and ev
1b570 65 72 79 20 70 6c 61 63 65 20 77 65 20 73 65 65  ery place we see
1b580 20 22 62 22 20 77 65 20 73 75 62 73 74 69 74 75   "b" we substitu
1b590 74 65 20 22 79 2b 31 30 22 2e 0a 20 20 20 20 2a  te "y+10"..    *
1b5a0 2f 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70 50  /.    pList = pP
1b5b0 61 72 65 6e 74 2d 3e 70 45 4c 69 73 74 3b 0a 20  arent->pEList;. 
1b5c0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c     for(i=0; i<pL
1b5d0 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
1b5e0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 69 73  {.      if( pLis
1b5f0 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3d 3d 30  t->a[i].zName==0
1b600 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72   ){.        char
1b610 20 2a 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65   *zName = sqlite
1b620 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4c  3DbStrDup(db, pL
1b630 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 29  ist->a[i].zSpan)
1b640 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
1b650 33 44 65 71 75 6f 74 65 28 7a 4e 61 6d 65 29 3b  3Dequote(zName);
1b660 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74 2d 3e  .        pList->
1b670 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 7a 4e 61  a[i].zName = zNa
1b680 6d 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  me;.      }.    
1b690 7d 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 4c  }.    substExprL
1b6a0 69 73 74 28 64 62 2c 20 70 50 61 72 65 6e 74 2d  ist(db, pParent-
1b6b0 3e 70 45 4c 69 73 74 2c 20 69 50 61 72 65 6e 74  >pEList, iParent
1b6c0 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b  , pSub->pEList);
1b6d0 0a 20 20 20 20 69 66 28 20 69 73 41 67 67 20 29  .    if( isAgg )
1b6e0 7b 0a 20 20 20 20 20 20 73 75 62 73 74 45 78 70  {.      substExp
1b6f0 72 4c 69 73 74 28 64 62 2c 20 70 50 61 72 65 6e  rList(db, pParen
1b700 74 2d 3e 70 47 72 6f 75 70 42 79 2c 20 69 50 61  t->pGroupBy, iPa
1b710 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69  rent, pSub->pELi
1b720 73 74 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65  st);.      pPare
1b730 6e 74 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 75  nt->pHaving = su
1b740 62 73 74 45 78 70 72 28 64 62 2c 20 70 50 61 72  bstExpr(db, pPar
1b750 65 6e 74 2d 3e 70 48 61 76 69 6e 67 2c 20 69 50  ent->pHaving, iP
1b760 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c  arent, pSub->pEL
1b770 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ist);.    }.    
1b780 69 66 28 20 70 53 75 62 2d 3e 70 4f 72 64 65 72  if( pSub->pOrder
1b790 42 79 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  By ){.      asse
1b7a0 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 70 4f 72  rt( pParent->pOr
1b7b0 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20  derBy==0 );.    
1b7c0 20 20 70 50 61 72 65 6e 74 2d 3e 70 4f 72 64 65    pParent->pOrde
1b7d0 72 42 79 20 3d 20 70 53 75 62 2d 3e 70 4f 72 64  rBy = pSub->pOrd
1b7e0 65 72 42 79 3b 0a 20 20 20 20 20 20 70 53 75 62  erBy;.      pSub
1b7f0 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  ->pOrderBy = 0;.
1b800 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50      }else if( pP
1b810 61 72 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79 20  arent->pOrderBy 
1b820 29 7b 0a 20 20 20 20 20 20 73 75 62 73 74 45 78  ){.      substEx
1b830 70 72 4c 69 73 74 28 64 62 2c 20 70 50 61 72 65  prList(db, pPare
1b840 6e 74 2d 3e 70 4f 72 64 65 72 42 79 2c 20 69 50  nt->pOrderBy, iP
1b850 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c  arent, pSub->pEL
1b860 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ist);.    }.    
1b870 69 66 28 20 70 53 75 62 2d 3e 70 57 68 65 72 65  if( pSub->pWhere
1b880 20 29 7b 0a 20 20 20 20 20 20 70 57 68 65 72 65   ){.      pWhere
1b890 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
1b8a0 70 28 64 62 2c 20 70 53 75 62 2d 3e 70 57 68 65  p(db, pSub->pWhe
1b8b0 72 65 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73  re, 0);.    }els
1b8c0 65 7b 0a 20 20 20 20 20 20 70 57 68 65 72 65 20  e{.      pWhere 
1b8d0 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  = 0;.    }.    i
1b8e0 66 28 20 73 75 62 71 75 65 72 79 49 73 41 67 67  f( subqueryIsAgg
1b8f0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
1b900 28 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69  ( pParent->pHavi
1b910 6e 67 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  ng==0 );.      p
1b920 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 20  Parent->pHaving 
1b930 3d 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72  = pParent->pWher
1b940 65 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74  e;.      pParent
1b950 2d 3e 70 57 68 65 72 65 20 3d 20 70 57 68 65 72  ->pWhere = pWher
1b960 65 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74  e;.      pParent
1b970 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 75 62 73  ->pHaving = subs
1b980 74 45 78 70 72 28 64 62 2c 20 70 50 61 72 65 6e  tExpr(db, pParen
1b990 74 2d 3e 70 48 61 76 69 6e 67 2c 20 69 50 61 72  t->pHaving, iPar
1b9a0 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73  ent, pSub->pELis
1b9b0 74 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e  t);.      pParen
1b9c0 74 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 71 6c  t->pHaving = sql
1b9d0 69 74 65 33 45 78 70 72 41 6e 64 28 64 62 2c 20  ite3ExprAnd(db, 
1b9e0 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67  pParent->pHaving
1b9f0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
1ba00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba10 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1ba20 44 75 70 28 64 62 2c 20 70 53 75 62 2d 3e 70 48  Dup(db, pSub->pH
1ba30 61 76 69 6e 67 2c 20 30 29 29 3b 0a 20 20 20 20  aving, 0));.    
1ba40 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e    assert( pParen
1ba50 74 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20 29  t->pGroupBy==0 )
1ba60 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d  ;.      pParent-
1ba70 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71 6c 69  >pGroupBy = sqli
1ba80 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64  te3ExprListDup(d
1ba90 62 2c 20 70 53 75 62 2d 3e 70 47 72 6f 75 70 42  b, pSub->pGroupB
1baa0 79 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65  y, 0);.    }else
1bab0 7b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d  {.      pParent-
1bac0 3e 70 57 68 65 72 65 20 3d 20 73 75 62 73 74 45  >pWhere = substE
1bad0 78 70 72 28 64 62 2c 20 70 50 61 72 65 6e 74 2d  xpr(db, pParent-
1bae0 3e 70 57 68 65 72 65 2c 20 69 50 61 72 65 6e 74  >pWhere, iParent
1baf0 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b  , pSub->pEList);
1bb00 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e  .      pParent->
1bb10 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33  pWhere = sqlite3
1bb20 45 78 70 72 41 6e 64 28 64 62 2c 20 70 50 61 72  ExprAnd(db, pPar
1bb30 65 6e 74 2d 3e 70 57 68 65 72 65 2c 20 70 57 68  ent->pWhere, pWh
1bb40 65 72 65 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20  ere);.    }.  . 
1bb50 20 20 20 2f 2a 20 54 68 65 20 66 6c 61 74 74 65     /* The flatte
1bb60 6e 65 64 20 71 75 65 72 79 20 69 73 20 64 69 73  ned query is dis
1bb70 74 69 6e 63 74 20 69 66 20 65 69 74 68 65 72 20  tinct if either 
1bb80 74 68 65 20 69 6e 6e 65 72 20 6f 72 20 74 68 65  the inner or the
1bb90 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72 20 71 75  .    ** outer qu
1bba0 65 72 79 20 69 73 20 64 69 73 74 69 6e 63 74 2e  ery is distinct.
1bbb0 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61   .    */.    pPa
1bbc0 72 65 6e 74 2d 3e 73 65 6c 46 6c 61 67 73 20 7c  rent->selFlags |
1bbd0 3d 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73  = pSub->selFlags
1bbe0 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 3b 0a   & SF_Distinct;.
1bbf0 20 20 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a    .    /*.    **
1bc00 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d   SELECT ... FROM
1bc10 20 28 53 45 4c 45 43 54 20 2e 2e 2e 20 4c 49 4d   (SELECT ... LIM
1bc20 49 54 20 61 20 4f 46 46 53 45 54 20 62 29 20 4c  IT a OFFSET b) L
1bc30 49 4d 49 54 20 78 20 4f 46 46 53 45 54 20 79 3b  IMIT x OFFSET y;
1bc40 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f  .    **.    ** O
1bc50 6e 65 20 69 73 20 74 65 6d 70 74 65 64 20 74 6f  ne is tempted to
1bc60 20 74 72 79 20 74 6f 20 61 64 64 20 61 20 61 6e   try to add a an
1bc70 64 20 62 20 74 6f 20 63 6f 6d 62 69 6e 65 20 74  d b to combine t
1bc80 68 65 20 6c 69 6d 69 74 73 2e 20 20 42 75 74 20  he limits.  But 
1bc90 74 68 69 73 0a 20 20 20 20 2a 2a 20 64 6f 65 73  this.    ** does
1bca0 20 6e 6f 74 20 77 6f 72 6b 20 69 66 20 65 69 74   not work if eit
1bcb0 68 65 72 20 6c 69 6d 69 74 20 69 73 20 6e 65 67  her limit is neg
1bcc0 61 74 69 76 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  ative..    */.  
1bcd0 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d    if( pSub->pLim
1bce0 69 74 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72  it ){.      pPar
1bcf0 65 6e 74 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 53  ent->pLimit = pS
1bd00 75 62 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20  ub->pLimit;.    
1bd10 20 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 3d    pSub->pLimit =
1bd20 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   0;.    }.  }.. 
1bd30 20 2f 2a 20 46 69 6e 69 61 6c 6c 79 2c 20 64 65   /* Finially, de
1bd40 6c 65 74 65 20 77 68 61 74 20 69 73 20 6c 65 66  lete what is lef
1bd50 74 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72  t of the subquer
1bd60 79 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20 2a  y and return.  *
1bd70 2a 20 73 75 63 63 65 73 73 2e 0a 20 20 2a 2f 0a  * success..  */.
1bd80 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
1bd90 65 6c 65 74 65 28 64 62 2c 20 70 53 75 62 31 29  elete(db, pSub1)
1bda0 3b 0a 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d  ;..  return 1;.}
1bdb0 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69  .#endif /* !defi
1bdc0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
1bdd0 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65  SUBQUERY) || !de
1bde0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
1bdf0 54 5f 56 49 45 57 29 20 2a 2f 0a 0a 2f 2a 0a 2a  T_VIEW) */../*.*
1be00 2a 20 42 61 73 65 64 20 6f 6e 20 74 68 65 20 63  * Based on the c
1be10 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 41  ontents of the A
1be20 67 67 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  ggInfo structure
1be30 20 69 6e 64 69 63 61 74 65 64 20 62 79 20 74 68   indicated by th
1be40 65 20 66 69 72 73 74 0a 2a 2a 20 61 72 67 75 6d  e first.** argum
1be50 65 6e 74 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ent, this functi
1be60 6f 6e 20 63 68 65 63 6b 73 20 69 66 20 74 68 65  on checks if the
1be70 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74   following are t
1be80 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20  rue:.**.**    * 
1be90 74 68 65 20 71 75 65 72 79 20 63 6f 6e 74 61 69  the query contai
1bea0 6e 73 20 6a 75 73 74 20 61 20 73 69 6e 67 6c 65  ns just a single
1beb0 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
1bec0 69 6f 6e 2c 0a 2a 2a 20 20 20 20 2a 20 74 68 65  ion,.**    * the
1bed0 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
1bee0 69 6f 6e 20 69 73 20 65 69 74 68 65 72 20 6d 69  ion is either mi
1bef0 6e 28 29 20 6f 72 20 6d 61 78 28 29 2c 20 61 6e  n() or max(), an
1bf00 64 0a 2a 2a 20 20 20 20 2a 20 74 68 65 20 61 72  d.**    * the ar
1bf10 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 61 67  gument to the ag
1bf20 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
1bf30 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 76 61 6c   is a column val
1bf40 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6c 6c  ue..**.** If all
1bf50 20 6f 66 20 74 68 65 20 61 62 6f 76 65 20 61 72   of the above ar
1bf60 65 20 74 72 75 65 2c 20 74 68 65 6e 20 57 48 45  e true, then WHE
1bf70 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 20 6f  RE_ORDERBY_MIN o
1bf80 72 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  r WHERE_ORDERBY_
1bf90 4d 41 58 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e  MAX.** is return
1bfa0 65 64 20 61 73 20 61 70 70 72 6f 70 72 69 61 74  ed as appropriat
1bfb0 65 2e 20 41 6c 73 6f 2c 20 2a 70 70 4d 69 6e 4d  e. Also, *ppMinM
1bfc0 61 78 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69  ax is set to poi
1bfd0 6e 74 20 74 6f 20 74 68 65 20 0a 2a 2a 20 6c 69  nt to the .** li
1bfe0 73 74 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  st of arguments 
1bff0 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 61 67  passed to the ag
1c000 67 72 65 67 61 74 65 20 62 65 66 6f 72 65 20 72  gregate before r
1c010 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  eturning..**.** 
1c020 4f 72 2c 20 69 66 20 74 68 65 20 63 6f 6e 64 69  Or, if the condi
1c030 74 69 6f 6e 73 20 61 62 6f 76 65 20 61 72 65 20  tions above are 
1c040 6e 6f 74 20 6d 65 74 2c 20 2a 70 70 4d 69 6e 4d  not met, *ppMinM
1c050 61 78 20 69 73 20 73 65 74 20 74 6f 20 30 20 61  ax is set to 0 a
1c060 6e 64 0a 2a 2a 20 57 48 45 52 45 5f 4f 52 44 45  nd.** WHERE_ORDE
1c070 52 42 59 5f 4e 4f 52 4d 41 4c 20 69 73 20 72 65  RBY_NORMAL is re
1c080 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
1c090 63 20 75 38 20 6d 69 6e 4d 61 78 51 75 65 72 79  c u8 minMaxQuery
1c0a0 28 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e  (AggInfo *pAggIn
1c0b0 66 6f 2c 20 45 78 70 72 4c 69 73 74 20 2a 2a 70  fo, ExprList **p
1c0c0 70 4d 69 6e 4d 61 78 29 7b 0a 20 20 69 6e 74 20  pMinMax){.  int 
1c0d0 65 52 65 74 20 3d 20 57 48 45 52 45 5f 4f 52 44  eRet = WHERE_ORD
1c0e0 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b 20 20 20 20  ERBY_NORMAL;    
1c0f0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
1c100 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 2a 70 70 4d  value */..  *ppM
1c110 69 6e 4d 61 78 20 3d 20 30 3b 0a 20 20 69 66 28  inMax = 0;.  if(
1c120 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63   pAggInfo->nFunc
1c130 3d 3d 31 20 29 7b 0a 20 20 20 20 45 78 70 72 20  ==1 ){.    Expr 
1c140 2a 70 45 78 70 72 20 3d 20 70 41 67 67 49 6e 66  *pExpr = pAggInf
1c150 6f 2d 3e 61 46 75 6e 63 5b 30 5d 2e 70 45 78 70  o->aFunc[0].pExp
1c160 72 3b 20 2f 2a 20 41 67 67 72 65 67 61 74 65 20  r; /* Aggregate 
1c170 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  function */.    
1c180 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
1c190 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   = pExpr->x.pLis
1c1a0 74 3b 20 20 20 20 20 20 2f 2a 20 41 72 67 75 6d  t;      /* Argum
1c1b0 65 6e 74 73 20 74 6f 20 61 67 67 20 66 75 6e 63  ents to agg func
1c1c0 74 69 6f 6e 20 2a 2f 0a 0a 20 20 20 20 61 73 73  tion */..    ass
1c1d0 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ert( pExpr->op==
1c1e0 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20  TK_AGG_FUNCTION 
1c1f0 29 3b 0a 20 20 20 20 69 66 28 20 70 45 4c 69 73  );.    if( pELis
1c200 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78  t && pEList->nEx
1c210 70 72 3d 3d 31 20 26 26 20 70 45 4c 69 73 74 2d  pr==1 && pEList-
1c220 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 3d  >a[0].pExpr->op=
1c230 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29  =TK_AGG_COLUMN )
1c240 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  {.      const ch
1c250 61 72 20 2a 7a 46 75 6e 63 20 3d 20 70 45 78 70  ar *zFunc = pExp
1c260 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20  r->u.zToken;.   
1c270 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
1c280 72 49 43 6d 70 28 7a 46 75 6e 63 2c 20 22 6d 69  rICmp(zFunc, "mi
1c290 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  n")==0 ){.      
1c2a0 20 20 65 52 65 74 20 3d 20 57 48 45 52 45 5f 4f    eRet = WHERE_O
1c2b0 52 44 45 52 42 59 5f 4d 49 4e 3b 0a 20 20 20 20  RDERBY_MIN;.    
1c2c0 20 20 20 20 2a 70 70 4d 69 6e 4d 61 78 20 3d 20      *ppMinMax = 
1c2d0 70 45 4c 69 73 74 3b 0a 20 20 20 20 20 20 7d 65  pEList;.      }e
1c2e0 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33 53  lse if( sqlite3S
1c2f0 74 72 49 43 6d 70 28 7a 46 75 6e 63 2c 20 22 6d  trICmp(zFunc, "m
1c300 61 78 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ax")==0 ){.     
1c310 20 20 20 65 52 65 74 20 3d 20 57 48 45 52 45 5f     eRet = WHERE_
1c320 4f 52 44 45 52 42 59 5f 4d 41 58 3b 0a 20 20 20  ORDERBY_MAX;.   
1c330 20 20 20 20 20 2a 70 70 4d 69 6e 4d 61 78 20 3d       *ppMinMax =
1c340 20 70 45 4c 69 73 74 3b 0a 20 20 20 20 20 20 7d   pEList;.      }
1c350 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73  .    }.  }..  as
1c360 73 65 72 74 28 20 2a 70 70 4d 69 6e 4d 61 78 3d  sert( *ppMinMax=
1c370 3d 30 20 7c 7c 20 28 2a 70 70 4d 69 6e 4d 61 78  =0 || (*ppMinMax
1c380 29 2d 3e 6e 45 78 70 72 3d 3d 31 20 29 3b 0a 20  )->nExpr==1 );. 
1c390 20 72 65 74 75 72 6e 20 65 52 65 74 3b 0a 7d 0a   return eRet;.}.
1c3a0 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 6c 65 63  ./*.** The selec
1c3b0 74 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73 73  t statement pass
1c3c0 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
1c3d0 61 72 67 75 6d 65 6e 74 20 69 73 20 61 6e 20 61  argument is an a
1c3e0 67 67 72 65 67 61 74 65 20 71 75 65 72 79 2e 0a  ggregate query..
1c3f0 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72  ** The second ar
1c400 67 6d 65 6e 74 20 69 73 20 74 68 65 20 61 73 73  gment is the ass
1c410 6f 63 69 61 74 65 64 20 61 67 67 72 65 67 61 74  ociated aggregat
1c420 65 2d 69 6e 66 6f 20 6f 62 6a 65 63 74 2e 20 54  e-info object. T
1c430 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  his .** function
1c440 20 74 65 73 74 73 20 69 66 20 74 68 65 20 53 45   tests if the SE
1c450 4c 45 43 54 20 69 73 20 6f 66 20 74 68 65 20 66  LECT is of the f
1c460 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c  orm:.**.**   SEL
1c470 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  ECT count(*) FRO
1c480 4d 20 3c 74 62 6c 3e 0a 2a 2a 0a 2a 2a 20 77 68  M <tbl>.**.** wh
1c490 65 72 65 20 74 61 62 6c 65 20 69 73 20 61 20 64  ere table is a d
1c4a0 61 74 61 62 61 73 65 20 74 61 62 6c 65 2c 20 6e  atabase table, n
1c4b0 6f 74 20 61 20 73 75 62 2d 73 65 6c 65 63 74 20  ot a sub-select 
1c4c0 6f 72 20 76 69 65 77 2e 20 49 66 20 74 68 65 20  or view. If the 
1c4d0 71 75 65 72 79 0a 2a 2a 20 64 6f 65 73 20 6d 61  query.** does ma
1c4e0 74 63 68 20 74 68 69 73 20 70 61 74 74 65 72 6e  tch this pattern
1c4f0 2c 20 74 68 65 6e 20 61 20 70 6f 69 6e 74 65 72  , then a pointer
1c500 20 74 6f 20 74 68 65 20 54 61 62 6c 65 20 6f 62   to the Table ob
1c510 6a 65 63 74 20 72 65 70 72 65 73 65 6e 74 69 6e  ject representin
1c520 67 0a 2a 2a 20 3c 74 62 6c 3e 20 69 73 20 72 65  g.** <tbl> is re
1c530 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73  turned. Otherwis
1c540 65 2c 20 30 20 69 73 20 72 65 74 75 72 6e 65 64  e, 0 is returned
1c550 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 54 61 62 6c  ..*/.static Tabl
1c560 65 20 2a 69 73 53 69 6d 70 6c 65 43 6f 75 6e 74  e *isSimpleCount
1c570 28 53 65 6c 65 63 74 20 2a 70 2c 20 41 67 67 49  (Select *p, AggI
1c580 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a  nfo *pAggInfo){.
1c590 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
1c5a0 20 45 78 70 72 20 2a 70 45 78 70 72 3b 0a 0a 20   Expr *pExpr;.. 
1c5b0 20 61 73 73 65 72 74 28 20 21 70 2d 3e 70 47 72   assert( !p->pGr
1c5c0 6f 75 70 42 79 20 29 3b 0a 0a 20 20 69 66 28 20  oupBy );..  if( 
1c5d0 70 2d 3e 70 57 68 65 72 65 20 7c 7c 20 70 2d 3e  p->pWhere || p->
1c5e0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31  pEList->nExpr!=1
1c5f0 20 0a 20 20 20 7c 7c 20 70 2d 3e 70 53 72 63 2d   .   || p->pSrc-
1c600 3e 6e 53 72 63 21 3d 31 20 7c 7c 20 70 2d 3e 70  >nSrc!=1 || p->p
1c610 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63  Src->a[0].pSelec
1c620 74 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  t.  ){.    retur
1c630 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 54 61 62 20  n 0;.  }.  pTab 
1c640 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e  = p->pSrc->a[0].
1c650 70 54 61 62 3b 0a 20 20 70 45 78 70 72 20 3d 20  pTab;.  pExpr = 
1c660 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e  p->pEList->a[0].
1c670 70 45 78 70 72 3b 0a 20 20 61 73 73 65 72 74 28  pExpr;.  assert(
1c680 20 70 54 61 62 20 26 26 20 21 70 54 61 62 2d 3e   pTab && !pTab->
1c690 70 53 65 6c 65 63 74 20 26 26 20 70 45 78 70 72  pSelect && pExpr
1c6a0 20 29 3b 0a 0a 20 20 69 66 28 20 49 73 56 69 72   );..  if( IsVir
1c6b0 74 75 61 6c 28 70 54 61 62 29 20 29 20 72 65 74  tual(pTab) ) ret
1c6c0 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 45 78  urn 0;.  if( pEx
1c6d0 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 46  pr->op!=TK_AGG_F
1c6e0 55 4e 43 54 49 4f 4e 20 29 20 72 65 74 75 72 6e  UNCTION ) return
1c6f0 20 30 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28   0;.  if( NEVER(
1c700 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3d  pAggInfo->nFunc=
1c710 3d 30 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  =0) ) return 0;.
1c720 20 20 69 66 28 20 28 70 41 67 67 49 6e 66 6f 2d    if( (pAggInfo-
1c730 3e 61 46 75 6e 63 5b 30 5d 2e 70 46 75 6e 63 2d  >aFunc[0].pFunc-
1c740 3e 66 75 6e 63 46 6c 61 67 73 26 53 51 4c 49 54  >funcFlags&SQLIT
1c750 45 5f 46 55 4e 43 5f 43 4f 55 4e 54 29 3d 3d 30  E_FUNC_COUNT)==0
1c760 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
1c770 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 26  f( pExpr->flags&
1c780 45 50 5f 44 69 73 74 69 6e 63 74 20 29 20 72 65  EP_Distinct ) re
1c790 74 75 72 6e 20 30 3b 0a 0a 20 20 72 65 74 75 72  turn 0;..  retur
1c7a0 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pTab;.}../*.**
1c7b0 20 49 66 20 74 68 65 20 73 6f 75 72 63 65 2d 6c   If the source-l
1c7c0 69 73 74 20 69 74 65 6d 20 70 61 73 73 65 64 20  ist item passed 
1c7d0 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 20 77  as an argument w
1c7e0 61 73 20 61 75 67 6d 65 6e 74 65 64 20 77 69 74  as augmented wit
1c7f0 68 20 61 6e 0a 2a 2a 20 49 4e 44 45 58 45 44 20  h an.** INDEXED 
1c800 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20  BY clause, then 
1c810 74 72 79 20 74 6f 20 6c 6f 63 61 74 65 20 74 68  try to locate th
1c820 65 20 73 70 65 63 69 66 69 65 64 20 69 6e 64 65  e specified inde
1c830 78 2e 20 49 66 20 74 68 65 72 65 0a 2a 2a 20 77  x. If there.** w
1c840 61 73 20 73 75 63 68 20 61 20 63 6c 61 75 73 65  as such a clause
1c850 20 61 6e 64 20 74 68 65 20 6e 61 6d 65 64 20 69   and the named i
1c860 6e 64 65 78 20 63 61 6e 6e 6f 74 20 62 65 20 66  ndex cannot be f
1c870 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20 0a 2a 2a  ound, return .**
1c880 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 61 6e   SQLITE_ERROR an
1c890 64 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72  d leave an error
1c8a0 20 69 6e 20 70 50 61 72 73 65 2e 20 4f 74 68 65   in pParse. Othe
1c8b0 72 77 69 73 65 2c 20 70 6f 70 75 6c 61 74 65 20  rwise, populate 
1c8c0 0a 2a 2a 20 70 46 72 6f 6d 2d 3e 70 49 6e 64 65  .** pFrom->pInde
1c8d0 78 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c  x and return SQL
1c8e0 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73  ITE_OK..*/.int s
1c8f0 71 6c 69 74 65 33 49 6e 64 65 78 65 64 42 79 4c  qlite3IndexedByL
1c900 6f 6f 6b 75 70 28 50 61 72 73 65 20 2a 70 50 61  ookup(Parse *pPa
1c910 72 73 65 2c 20 73 74 72 75 63 74 20 53 72 63 4c  rse, struct SrcL
1c920 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 29  ist_item *pFrom)
1c930 7b 0a 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 70  {.  if( pFrom->p
1c940 54 61 62 20 26 26 20 70 46 72 6f 6d 2d 3e 7a 49  Tab && pFrom->zI
1c950 6e 64 65 78 20 29 7b 0a 20 20 20 20 54 61 62 6c  ndex ){.    Tabl
1c960 65 20 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d  e *pTab = pFrom-
1c970 3e 70 54 61 62 3b 0a 20 20 20 20 63 68 61 72 20  >pTab;.    char 
1c980 2a 7a 49 6e 64 65 78 20 3d 20 70 46 72 6f 6d 2d  *zIndex = pFrom-
1c990 3e 7a 49 6e 64 65 78 3b 0a 20 20 20 20 49 6e 64  >zIndex;.    Ind
1c9a0 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 66 6f  ex *pIdx;.    fo
1c9b0 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  r(pIdx=pTab->pIn
1c9c0 64 65 78 3b 20 0a 20 20 20 20 20 20 20 20 70 49  dex; .        pI
1c9d0 64 78 20 26 26 20 73 71 6c 69 74 65 33 53 74 72  dx && sqlite3Str
1c9e0 49 43 6d 70 28 70 49 64 78 2d 3e 7a 4e 61 6d 65  ICmp(pIdx->zName
1c9f0 2c 20 7a 49 6e 64 65 78 29 3b 20 0a 20 20 20 20  , zIndex); .    
1ca00 20 20 20 20 70 49 64 78 3d 70 49 64 78 2d 3e 70      pIdx=pIdx->p
1ca10 4e 65 78 74 0a 20 20 20 20 29 3b 0a 20 20 20 20  Next.    );.    
1ca20 69 66 28 20 21 70 49 64 78 20 29 7b 0a 20 20 20  if( !pIdx ){.   
1ca30 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
1ca40 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73  sg(pParse, "no s
1ca50 75 63 68 20 69 6e 64 65 78 3a 20 25 73 22 2c 20  uch index: %s", 
1ca60 7a 49 6e 64 65 78 2c 20 30 29 3b 0a 20 20 20 20  zIndex, 0);.    
1ca70 20 20 70 50 61 72 73 65 2d 3e 63 68 65 63 6b 53    pParse->checkS
1ca80 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 20 20 20  chema = 1;.     
1ca90 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
1caa0 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
1cab0 70 46 72 6f 6d 2d 3e 70 49 6e 64 65 78 20 3d 20  pFrom->pIndex = 
1cac0 70 49 64 78 3b 0a 20 20 7d 0a 20 20 72 65 74 75  pIdx;.  }.  retu
1cad0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1cae0 2f 2a 0a 2a 2a 20 44 65 74 65 63 74 20 63 6f 6d  /*.** Detect com
1caf0 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 73 74 61  pound SELECT sta
1cb00 74 65 6d 65 6e 74 73 20 74 68 61 74 20 75 73 65  tements that use
1cb10 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
1cb20 75 73 65 20 77 69 74 68 20 0a 2a 2a 20 61 6e 20  use with .** an 
1cb30 61 6c 74 65 72 6e 61 74 69 76 65 20 63 6f 6c 6c  alternative coll
1cb40 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a  ating sequence..
1cb50 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20  **.**    SELECT 
1cb60 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 45 58 43 45  ... FROM t1 EXCE
1cb70 50 54 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52  PT SELECT ... FR
1cb80 4f 4d 20 74 32 20 4f 52 44 45 52 20 42 59 20 2e  OM t2 ORDER BY .
1cb90 2e 20 43 4f 4c 4c 41 54 45 20 2e 2e 2e 0a 2a 2a  . COLLATE ....**
1cba0 0a 2a 2a 20 54 68 65 73 65 20 61 72 65 20 72 65  .** These are re
1cbb0 77 72 69 74 74 65 6e 20 61 73 20 61 20 73 75 62  written as a sub
1cbc0 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  query:.**.**    
1cbd0 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 28 53  SELECT * FROM (S
1cbe0 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74  ELECT ... FROM t
1cbf0 31 20 45 58 43 45 50 54 20 53 45 4c 45 43 54 20  1 EXCEPT SELECT 
1cc00 2e 2e 2e 20 46 52 4f 4d 20 74 32 29 0a 2a 2a 20  ... FROM t2).** 
1cc10 20 20 20 20 4f 52 44 45 52 20 42 59 20 2e 2e 2e      ORDER BY ...
1cc20 20 43 4f 4c 4c 41 54 45 20 2e 2e 2e 0a 2a 2a 0a   COLLATE ....**.
1cc30 2a 2a 20 54 68 69 73 20 74 72 61 6e 73 66 6f 72  ** This transfor
1cc40 6d 61 74 69 6f 6e 20 69 73 20 6e 65 63 65 73 73  mation is necess
1cc50 61 72 79 20 62 65 63 61 75 73 65 20 74 68 65 20  ary because the 
1cc60 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72  multiSelectOrder
1cc70 42 79 28 29 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  By() routine.** 
1cc80 61 62 6f 76 65 20 74 68 61 74 20 67 65 6e 65 72  above that gener
1cc90 61 74 65 73 20 74 68 65 20 63 6f 64 65 20 66 6f  ates the code fo
1cca0 72 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c  r a compound SEL
1ccb0 45 43 54 20 77 69 74 68 20 61 6e 20 4f 52 44 45  ECT with an ORDE
1ccc0 52 20 42 59 20 63 6c 61 75 73 65 0a 2a 2a 20 75  R BY clause.** u
1ccd0 73 65 73 20 61 20 6d 65 72 67 65 20 61 6c 67 6f  ses a merge algo
1cce0 72 69 74 68 6d 20 74 68 61 74 20 72 65 71 75 69  rithm that requi
1ccf0 72 65 73 20 74 68 65 20 73 61 6d 65 20 63 6f 6c  res the same col
1cd00 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
1cd10 6f 6e 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74  on the.** result
1cd20 20 63 6f 6c 75 6d 6e 73 20 61 73 20 6f 6e 20 74   columns as on t
1cd30 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
1cd40 73 65 2e 20 20 53 65 65 20 74 69 63 6b 65 74 0a  se.  See ticket.
1cd50 2a 2a 20 68 74 74 70 3a 2f 2f 77 77 77 2e 73 71  ** http://www.sq
1cd60 6c 69 74 65 2e 6f 72 67 2f 73 72 63 2f 69 6e 66  lite.org/src/inf
1cd70 6f 2f 36 37 30 39 35 37 34 64 32 61 0a 2a 2a 0a  o/6709574d2a.**.
1cd80 2a 2a 20 54 68 69 73 20 74 72 61 6e 73 66 6f 72  ** This transfor
1cd90 6d 61 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 6e  mation is only n
1cda0 65 65 64 65 64 20 66 6f 72 20 45 58 43 45 50 54  eeded for EXCEPT
1cdb0 2c 20 49 4e 54 45 52 53 45 43 54 2c 20 61 6e 64  , INTERSECT, and
1cdc0 20 55 4e 49 4f 4e 2e 0a 2a 2a 20 54 68 65 20 55   UNION..** The U
1cdd0 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f  NION ALL operato
1cde0 72 20 77 6f 72 6b 73 20 66 69 6e 65 20 77 69 74  r works fine wit
1cdf0 68 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64  h multiSelectOrd
1ce00 65 72 42 79 28 29 20 65 76 65 6e 20 77 68 65 6e  erBy() even when
1ce10 0a 2a 2a 20 74 68 65 72 65 20 61 72 65 20 43 4f  .** there are CO
1ce20 4c 4c 41 54 45 20 74 65 72 6d 73 20 69 6e 20 74  LLATE terms in t
1ce30 68 65 20 4f 52 44 45 52 20 42 59 2e 0a 2a 2f 0a  he ORDER BY..*/.
1ce40 73 74 61 74 69 63 20 69 6e 74 20 63 6f 6e 76 65  static int conve
1ce50 72 74 43 6f 6d 70 6f 75 6e 64 53 65 6c 65 63 74  rtCompoundSelect
1ce60 54 6f 53 75 62 71 75 65 72 79 28 57 61 6c 6b 65  ToSubquery(Walke
1ce70 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65  r *pWalker, Sele
1ce80 63 74 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b  ct *p){.  int i;
1ce90 0a 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 77 3b  .  Select *pNew;
1cea0 0a 20 20 53 65 6c 65 63 74 20 2a 70 58 3b 0a 20  .  Select *pX;. 
1ceb0 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
1cec0 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
1ced0 69 74 65 6d 20 2a 61 3b 0a 20 20 53 72 63 4c 69  item *a;.  SrcLi
1cee0 73 74 20 2a 70 4e 65 77 53 72 63 3b 0a 20 20 50  st *pNewSrc;.  P
1cef0 61 72 73 65 20 2a 70 50 61 72 73 65 3b 0a 20 20  arse *pParse;.  
1cf00 54 6f 6b 65 6e 20 64 75 6d 6d 79 3b 0a 0a 20 20  Token dummy;..  
1cf10 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30  if( p->pPrior==0
1cf20 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f   ) return WRC_Co
1cf30 6e 74 69 6e 75 65 3b 0a 20 20 69 66 28 20 70 2d  ntinue;.  if( p-
1cf40 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 20 72  >pOrderBy==0 ) r
1cf50 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
1cf60 75 65 3b 0a 20 20 66 6f 72 28 70 58 3d 70 3b 20  ue;.  for(pX=p; 
1cf70 70 58 20 26 26 20 28 70 58 2d 3e 6f 70 3d 3d 54  pX && (pX->op==T
1cf80 4b 5f 41 4c 4c 20 7c 7c 20 70 58 2d 3e 6f 70 3d  K_ALL || pX->op=
1cf90 3d 54 4b 5f 53 45 4c 45 43 54 29 3b 20 70 58 3d  =TK_SELECT); pX=
1cfa0 70 58 2d 3e 70 50 72 69 6f 72 29 7b 7d 0a 20 20  pX->pPrior){}.  
1cfb0 69 66 28 20 70 58 3d 3d 30 20 29 20 72 65 74 75  if( pX==0 ) retu
1cfc0 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
1cfd0 0a 20 20 61 20 3d 20 70 2d 3e 70 4f 72 64 65 72  .  a = p->pOrder
1cfe0 42 79 2d 3e 61 3b 0a 20 20 66 6f 72 28 69 3d 70  By->a;.  for(i=p
1cff0 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  ->pOrderBy->nExp
1d000 72 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b  r-1; i>=0; i--){
1d010 0a 20 20 20 20 69 66 28 20 61 5b 69 5d 2e 70 45  .    if( a[i].pE
1d020 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  xpr->flags & EP_
1d030 43 6f 6c 6c 61 74 65 20 29 20 62 72 65 61 6b 3b  Collate ) break;
1d040 0a 20 20 7d 0a 20 20 69 66 28 20 69 3c 30 20 29  .  }.  if( i<0 )
1d050 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
1d060 69 6e 75 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 77  inue;..  /* If w
1d070 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69  e reach this poi
1d080 6e 74 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74  nt, that means t
1d090 68 65 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f  he transformatio
1d0a0 6e 20 69 73 20 72 65 71 75 69 72 65 64 2e 20 2a  n is required. *
1d0b0 2f 0a 0a 20 20 70 50 61 72 73 65 20 3d 20 70 57  /..  pParse = pW
1d0c0 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20  alker->pParse;. 
1d0d0 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
1d0e0 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74  ;.  pNew = sqlit
1d0f0 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
1d100 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29  b, sizeof(*pNew)
1d110 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d   );.  if( pNew==
1d120 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41  0 ) return WRC_A
1d130 62 6f 72 74 3b 0a 20 20 6d 65 6d 73 65 74 28 26  bort;.  memset(&
1d140 64 75 6d 6d 79 2c 20 30 2c 20 73 69 7a 65 6f 66  dummy, 0, sizeof
1d150 28 64 75 6d 6d 79 29 29 3b 0a 20 20 70 4e 65 77  (dummy));.  pNew
1d160 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63  Src = sqlite3Src
1d170 4c 69 73 74 41 70 70 65 6e 64 46 72 6f 6d 54 65  ListAppendFromTe
1d180 72 6d 28 70 50 61 72 73 65 2c 30 2c 30 2c 30 2c  rm(pParse,0,0,0,
1d190 26 64 75 6d 6d 79 2c 70 4e 65 77 2c 30 2c 30 29  &dummy,pNew,0,0)
1d1a0 3b 0a 20 20 69 66 28 20 70 4e 65 77 53 72 63 3d  ;.  if( pNewSrc=
1d1b0 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f  =0 ) return WRC_
1d1c0 41 62 6f 72 74 3b 0a 20 20 2a 70 4e 65 77 20 3d  Abort;.  *pNew =
1d1d0 20 2a 70 3b 0a 20 20 70 2d 3e 70 53 72 63 20 3d   *p;.  p->pSrc =
1d1e0 20 70 4e 65 77 53 72 63 3b 0a 20 20 70 2d 3e 70   pNewSrc;.  p->p
1d1f0 45 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45  EList = sqlite3E
1d200 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50  xprListAppend(pP
1d210 61 72 73 65 2c 20 30 2c 20 73 71 6c 69 74 65 33  arse, 0, sqlite3
1d220 45 78 70 72 28 64 62 2c 20 54 4b 5f 41 4c 4c 2c  Expr(db, TK_ALL,
1d230 20 30 29 29 3b 0a 20 20 70 2d 3e 6f 70 20 3d 20   0));.  p->op = 
1d240 54 4b 5f 53 45 4c 45 43 54 3b 0a 20 20 70 2d 3e  TK_SELECT;.  p->
1d250 70 57 68 65 72 65 20 3d 20 30 3b 0a 20 20 70 4e  pWhere = 0;.  pN
1d260 65 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 30  ew->pGroupBy = 0
1d270 3b 0a 20 20 70 4e 65 77 2d 3e 70 48 61 76 69 6e  ;.  pNew->pHavin
1d280 67 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70  g = 0;.  pNew->p
1d290 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 70  OrderBy = 0;.  p
1d2a0 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20  ->pPrior = 0;.  
1d2b0 70 4e 65 77 2d 3e 70 4c 69 6d 69 74 20 3d 20 30  pNew->pLimit = 0
1d2c0 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 66 66 73 65  ;.  pNew->pOffse
1d2d0 74 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  t = 0;.  return 
1d2e0 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a  WRC_Continue;.}.
1d2f0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
1d300 69 6e 65 20 69 73 20 61 20 57 61 6c 6b 65 72 20  ine is a Walker 
1d310 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 22 65 78  callback for "ex
1d320 70 61 6e 64 69 6e 67 22 20 61 20 53 45 4c 45 43  panding" a SELEC
1d330 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20  T statement..** 
1d340 22 45 78 70 61 6e 64 69 6e 67 22 20 6d 65 61 6e  "Expanding" mean
1d350 73 20 74 6f 20 64 6f 20 74 68 65 20 66 6f 6c 6c  s to do the foll
1d360 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  owing:.**.**    
1d370 28 31 29 20 20 4d 61 6b 65 20 73 75 72 65 20 56  (1)  Make sure V
1d380 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  DBE cursor numbe
1d390 72 73 20 68 61 76 65 20 62 65 65 6e 20 61 73 73  rs have been ass
1d3a0 69 67 6e 65 64 20 74 6f 20 65 76 65 72 79 0a 2a  igned to every.*
1d3b0 2a 20 20 20 20 20 20 20 20 20 65 6c 65 6d 65 6e  *         elemen
1d3c0 74 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  t of the FROM cl
1d3d0 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28  ause..**.**    (
1d3e0 32 29 20 20 46 69 6c 6c 20 69 6e 20 74 68 65 20  2)  Fill in the 
1d3f0 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70 54  pTabList->a[].pT
1d400 61 62 20 66 69 65 6c 64 73 20 69 6e 20 74 68 65  ab fields in the
1d410 20 53 72 63 4c 69 73 74 20 74 68 61 74 20 0a 2a   SrcList that .*
1d420 2a 20 20 20 20 20 20 20 20 20 64 65 66 69 6e 65  *         define
1d430 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20  s FROM clause.  
1d440 57 68 65 6e 20 76 69 65 77 73 20 61 70 70 65 61  When views appea
1d450 72 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  r in the FROM cl
1d460 61 75 73 65 2c 0a 2a 2a 20 20 20 20 20 20 20 20  ause,.**        
1d470 20 66 69 6c 6c 20 70 54 61 62 4c 69 73 74 2d 3e   fill pTabList->
1d480 61 5b 5d 2e 70 53 65 6c 65 63 74 20 77 69 74 68  a[].pSelect with
1d490 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 53   a copy of the S
1d4a0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a  ELECT statement.
1d4b0 2a 2a 20 20 20 20 20 20 20 20 20 74 68 61 74 20  **         that 
1d4c0 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 76  implements the v
1d4d0 69 65 77 2e 20 20 41 20 63 6f 70 79 20 69 73 20  iew.  A copy is 
1d4e0 6d 61 64 65 20 6f 66 20 74 68 65 20 76 69 65 77  made of the view
1d4f0 27 73 20 53 45 4c 45 43 54 0a 2a 2a 20 20 20 20  's SELECT.**    
1d500 20 20 20 20 20 73 74 61 74 65 6d 65 6e 74 20 73       statement s
1d510 6f 20 74 68 61 74 20 77 65 20 63 61 6e 20 66 72  o that we can fr
1d520 65 65 6c 79 20 6d 6f 64 69 66 79 20 6f 72 20 64  eely modify or d
1d530 65 6c 65 74 65 20 74 68 61 74 20 73 74 61 74 65  elete that state
1d540 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  ment.**         
1d550 77 69 74 68 6f 75 74 20 77 6f 72 72 79 69 6e 67  without worrying
1d560 20 61 62 6f 75 74 20 6d 65 73 73 69 6e 67 20 75   about messing u
1d570 70 20 74 68 65 20 70 72 65 73 69 73 74 65 6e 74  p the presistent
1d580 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 0a   representation.
1d590 2a 2a 20 20 20 20 20 20 20 20 20 6f 66 20 74 68  **         of th
1d5a0 65 20 76 69 65 77 2e 0a 2a 2a 0a 2a 2a 20 20 20  e view..**.**   
1d5b0 20 28 33 29 20 20 41 64 64 20 74 65 72 6d 73 20   (3)  Add terms 
1d5c0 74 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  to the WHERE cla
1d5d0 75 73 65 20 74 6f 20 61 63 63 6f 6d 6f 64 61 74  use to accomodat
1d5e0 65 20 74 68 65 20 4e 41 54 55 52 41 4c 20 6b 65  e the NATURAL ke
1d5f0 79 77 6f 72 64 0a 2a 2a 20 20 20 20 20 20 20 20  yword.**        
1d600 20 6f 6e 20 6a 6f 69 6e 73 20 61 6e 64 20 74 68   on joins and th
1d610 65 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63  e ON and USING c
1d620 6c 61 75 73 65 20 6f 66 20 6a 6f 69 6e 73 2e 0a  lause of joins..
1d630 2a 2a 0a 2a 2a 20 20 20 20 28 34 29 20 20 53 63  **.**    (4)  Sc
1d640 61 6e 20 74 68 65 20 6c 69 73 74 20 6f 66 20 63  an the list of c
1d650 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65  olumns in the re
1d660 73 75 6c 74 20 73 65 74 20 28 70 45 4c 69 73 74  sult set (pEList
1d670 29 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20 20 20 20  ) looking.**    
1d680 20 20 20 20 20 66 6f 72 20 69 6e 73 74 61 6e 63       for instanc
1d690 65 73 20 6f 66 20 74 68 65 20 22 2a 22 20 6f 70  es of the "*" op
1d6a0 65 72 61 74 6f 72 20 6f 72 20 74 68 65 20 54 41  erator or the TA
1d6b0 42 4c 45 2e 2a 20 6f 70 65 72 61 74 6f 72 2e 0a  BLE.* operator..
1d6c0 2a 2a 20 20 20 20 20 20 20 20 20 49 66 20 66 6f  **         If fo
1d6d0 75 6e 64 2c 20 65 78 70 61 6e 64 20 65 61 63 68  und, expand each
1d6e0 20 22 2a 22 20 74 6f 20 62 65 20 65 76 65 72 79   "*" to be every
1d6f0 20 63 6f 6c 75 6d 6e 20 69 6e 20 65 76 65 72 79   column in every
1d700 20 74 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20   table.**       
1d710 20 20 61 6e 64 20 54 41 42 4c 45 2e 2a 20 74 6f    and TABLE.* to
1d720 20 62 65 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e   be every column
1d730 20 69 6e 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2f   in TABLE..**.*/
1d740 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6c 65  .static int sele
1d750 63 74 45 78 70 61 6e 64 65 72 28 57 61 6c 6b 65  ctExpander(Walke
1d760 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65  r *pWalker, Sele
1d770 63 74 20 2a 70 29 7b 0a 20 20 50 61 72 73 65 20  ct *p){.  Parse 
1d780 2a 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b 65  *pParse = pWalke
1d790 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69 6e 74  r->pParse;.  int
1d7a0 20 69 2c 20 6a 2c 20 6b 3b 0a 20 20 53 72 63 4c   i, j, k;.  SrcL
1d7b0 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 0a 20  ist *pTabList;. 
1d7c0 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
1d7d0 74 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  t;.  struct SrcL
1d7e0 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 3b  ist_item *pFrom;
1d7f0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
1d800 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 45   pParse->db;.  E
1d810 78 70 72 20 2a 70 45 2c 20 2a 70 52 69 67 68 74  xpr *pE, *pRight
1d820 2c 20 2a 70 45 78 70 72 3b 0a 20 20 75 31 36 20  , *pExpr;.  u16 
1d830 73 65 6c 46 6c 61 67 73 20 3d 20 70 2d 3e 73 65  selFlags = p->se
1d840 6c 46 6c 61 67 73 3b 0a 0a 20 20 70 2d 3e 73 65  lFlags;..  p->se
1d850 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 45 78 70  lFlags |= SF_Exp
1d860 61 6e 64 65 64 3b 0a 20 20 69 66 28 20 64 62 2d  anded;.  if( db-
1d870 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 20 29  >mallocFailed  )
1d880 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43  {.    return WRC
1d890 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 20 20 69 66  _Abort;.  }.  if
1d8a0 28 20 4e 45 56 45 52 28 70 2d 3e 70 53 72 63 3d  ( NEVER(p->pSrc=
1d8b0 3d 30 29 20 7c 7c 20 28 73 65 6c 46 6c 61 67 73  =0) || (selFlags
1d8c0 20 26 20 53 46 5f 45 78 70 61 6e 64 65 64 29 21   & SF_Expanded)!
1d8d0 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
1d8e0 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 7d 0a   WRC_Prune;.  }.
1d8f0 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e    pTabList = p->
1d900 70 53 72 63 3b 0a 20 20 70 45 4c 69 73 74 20 3d  pSrc;.  pEList =
1d910 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 0a 20 20 2f   p->pEList;..  /
1d920 2a 20 4d 61 6b 65 20 73 75 72 65 20 63 75 72 73  * Make sure curs
1d930 6f 72 20 6e 75 6d 62 65 72 73 20 68 61 76 65 20  or numbers have 
1d940 62 65 65 6e 20 61 73 73 69 67 6e 65 64 20 74 6f  been assigned to
1d950 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 69 6e 0a   all entries in.
1d960 20 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c    ** the FROM cl
1d970 61 75 73 65 20 6f 66 20 74 68 65 20 53 45 4c 45  ause of the SELE
1d980 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20  CT statement..  
1d990 2a 2f 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c  */.  sqlite3SrcL
1d9a0 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73  istAssignCursors
1d9b0 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73  (pParse, pTabLis
1d9c0 74 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 75  t);..  /* Look u
1d9d0 70 20 65 76 65 72 79 20 74 61 62 6c 65 20 6e 61  p every table na
1d9e0 6d 65 64 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  med in the FROM 
1d9f0 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 73 65  clause of the se
1da00 6c 65 63 74 2e 20 20 49 66 0a 20 20 2a 2a 20 61  lect.  If.  ** a
1da10 6e 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20 46  n entry of the F
1da20 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 61 20  ROM clause is a 
1da30 73 75 62 71 75 65 72 79 20 69 6e 73 74 65 61 64  subquery instead
1da40 20 6f 66 20 61 20 74 61 62 6c 65 20 6f 72 20 76   of a table or v
1da50 69 65 77 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 63  iew,.  ** then c
1da60 72 65 61 74 65 20 61 20 74 72 61 6e 73 69 65 6e  reate a transien
1da70 74 20 74 61 62 6c 65 20 73 74 72 75 63 74 75 72  t table structur
1da80 65 20 74 6f 20 64 65 73 63 72 69 62 65 20 74 68  e to describe th
1da90 65 20 73 75 62 71 75 65 72 79 2e 0a 20 20 2a 2f  e subquery..  */
1daa0 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f  .  for(i=0, pFro
1dab0 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69  m=pTabList->a; i
1dac0 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b  <pTabList->nSrc;
1dad0 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a   i++, pFrom++){.
1dae0 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b      Table *pTab;
1daf0 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e  .    if( pFrom->
1db00 70 54 61 62 21 3d 30 20 29 7b 0a 20 20 20 20 20  pTab!=0 ){.     
1db10 20 2f 2a 20 54 68 69 73 20 73 74 61 74 65 6d 65   /* This stateme
1db20 6e 74 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  nt has already b
1db30 65 65 6e 20 70 72 65 70 61 72 65 64 2e 20 20 54  een prepared.  T
1db40 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 0a  here is no need.
1db50 20 20 20 20 20 20 2a 2a 20 74 6f 20 67 6f 20 66        ** to go f
1db60 75 72 74 68 65 72 2e 20 2a 2f 0a 20 20 20 20 20  urther. */.     
1db70 20 61 73 73 65 72 74 28 20 69 3d 3d 30 20 29 3b   assert( i==0 );
1db80 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52  .      return WR
1db90 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 7d 0a 20  C_Prune;.    }. 
1dba0 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 7a 4e     if( pFrom->zN
1dbb0 61 6d 65 3d 3d 30 20 29 7b 0a 23 69 66 6e 64 65  ame==0 ){.#ifnde
1dbc0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
1dbd0 42 51 55 45 52 59 0a 20 20 20 20 20 20 53 65 6c  BQUERY.      Sel
1dbe0 65 63 74 20 2a 70 53 65 6c 20 3d 20 70 46 72 6f  ect *pSel = pFro
1dbf0 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20  m->pSelect;.    
1dc00 20 20 2f 2a 20 41 20 73 75 62 2d 71 75 65 72 79    /* A sub-query
1dc10 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
1dc20 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20  use of a SELECT 
1dc30 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
1dc40 20 70 53 65 6c 21 3d 30 20 29 3b 0a 20 20 20 20   pSel!=0 );.    
1dc50 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d    assert( pFrom-
1dc60 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20  >pTab==0 );.    
1dc70 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c    sqlite3WalkSel
1dc80 65 63 74 28 70 57 61 6c 6b 65 72 2c 20 70 53 65  ect(pWalker, pSe
1dc90 6c 29 3b 0a 20 20 20 20 20 20 70 46 72 6f 6d 2d  l);.      pFrom-
1dca0 3e 70 54 61 62 20 3d 20 70 54 61 62 20 3d 20 73  >pTab = pTab = s
1dcb0 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
1dcc0 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 54 61  ro(db, sizeof(Ta
1dcd0 62 6c 65 29 29 3b 0a 20 20 20 20 20 20 69 66 28  ble));.      if(
1dce0 20 70 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72   pTab==0 ) retur
1dcf0 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20  n WRC_Abort;.   
1dd00 20 20 20 70 54 61 62 2d 3e 6e 52 65 66 20 3d 20     pTab->nRef = 
1dd10 31 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 7a  1;.      pTab->z
1dd20 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50  Name = sqlite3MP
1dd30 72 69 6e 74 66 28 64 62 2c 20 22 73 71 6c 69 74  rintf(db, "sqlit
1dd40 65 5f 73 71 5f 25 70 22 2c 20 28 76 6f 69 64 2a  e_sq_%p", (void*
1dd50 29 70 54 61 62 29 3b 0a 20 20 20 20 20 20 77 68  )pTab);.      wh
1dd60 69 6c 65 28 20 70 53 65 6c 2d 3e 70 50 72 69 6f  ile( pSel->pPrio
1dd70 72 20 29 7b 20 70 53 65 6c 20 3d 20 70 53 65 6c  r ){ pSel = pSel
1dd80 2d 3e 70 50 72 69 6f 72 3b 20 7d 0a 20 20 20 20  ->pPrior; }.    
1dd90 20 20 73 65 6c 65 63 74 43 6f 6c 75 6d 6e 73 46    selectColumnsF
1dda0 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72  romExprList(pPar
1ddb0 73 65 2c 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74  se, pSel->pEList
1ddc0 2c 20 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 26  , &pTab->nCol, &
1ddd0 70 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20 20 20  pTab->aCol);.   
1dde0 20 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d     pTab->iPKey =
1ddf0 20 2d 31 3b 0a 20 20 20 20 20 20 70 54 61 62 2d   -1;.      pTab-
1de00 3e 6e 52 6f 77 45 73 74 20 3d 20 31 30 34 38 35  >nRowEst = 10485
1de10 37 36 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e  76;.      pTab->
1de20 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 45  tabFlags |= TF_E
1de30 70 68 65 6d 65 72 61 6c 3b 0a 23 65 6e 64 69 66  phemeral;.#endif
1de40 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1de50 20 20 2f 2a 20 41 6e 20 6f 72 64 69 6e 61 72 79    /* An ordinary
1de60 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 6e   table or view n
1de70 61 6d 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ame in the FROM 
1de80 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20  clause */.      
1de90 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70  assert( pFrom->p
1dea0 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  Tab==0 );.      
1deb0 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54  pFrom->pTab = pT
1dec0 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61  ab = sqlite3Loca
1ded0 74 65 54 61 62 6c 65 49 74 65 6d 28 70 50 61 72  teTableItem(pPar
1dee0 73 65 2c 20 30 2c 20 70 46 72 6f 6d 29 3b 0a 20  se, 0, pFrom);. 
1def0 20 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30       if( pTab==0
1df00 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62   ) return WRC_Ab
1df10 6f 72 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ort;.      if( p
1df20 54 61 62 2d 3e 6e 52 65 66 3d 3d 30 78 66 66 66  Tab->nRef==0xfff
1df30 66 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  f ){.        sql
1df40 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
1df50 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 72  rse, "too many r
1df60 65 66 65 72 65 6e 63 65 73 20 74 6f 20 5c 22 25  eferences to \"%
1df70 73 5c 22 3a 20 6d 61 78 20 36 35 35 33 35 22 2c  s\": max 65535",
1df80 0a 20 20 20 20 20 20 20 20 20 20 20 70 54 61 62  .           pTab
1df90 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
1dfa0 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20    pFrom->pTab = 
1dfb0 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  0;.        retur
1dfc0 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20  n WRC_Abort;.   
1dfd0 20 20 20 7d 0a 20 20 20 20 20 20 70 54 61 62 2d     }.      pTab-
1dfe0 3e 6e 52 65 66 2b 2b 3b 0a 23 69 66 20 21 64 65  >nRef++;.#if !de
1dff0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
1e000 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69  T_VIEW) || !defi
1e010 6e 65 64 20 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ned (SQLITE_OMIT
1e020 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 0a 20  _VIRTUALTABLE). 
1e030 20 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 70       if( pTab->p
1e040 53 65 6c 65 63 74 20 7c 7c 20 49 73 56 69 72 74  Select || IsVirt
1e050 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20  ual(pTab) ){.   
1e060 20 20 20 20 20 2f 2a 20 57 65 20 72 65 61 63 68       /* We reach
1e070 20 68 65 72 65 20 69 66 20 74 68 65 20 6e 61 6d   here if the nam
1e080 65 64 20 74 61 62 6c 65 20 69 73 20 61 20 72 65  ed table is a re
1e090 61 6c 6c 79 20 61 20 76 69 65 77 20 2a 2f 0a 20  ally a view */. 
1e0a0 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
1e0b0 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e  e3ViewGetColumnN
1e0c0 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 54 61  ames(pParse, pTa
1e0d0 62 29 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f  b) ) return WRC_
1e0e0 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 20 20 61  Abort;.        a
1e0f0 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 53  ssert( pFrom->pS
1e100 65 6c 65 63 74 3d 3d 30 20 29 3b 0a 20 20 20 20  elect==0 );.    
1e110 20 20 20 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65      pFrom->pSele
1e120 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  ct = sqlite3Sele
1e130 63 74 44 75 70 28 64 62 2c 20 70 54 61 62 2d 3e  ctDup(db, pTab->
1e140 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20  pSelect, 0);.   
1e150 20 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b       sqlite3Walk
1e160 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c 20  Select(pWalker, 
1e170 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 29 3b  pFrom->pSelect);
1e180 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
1e190 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4c 6f      }..    /* Lo
1e1a0 63 61 74 65 20 74 68 65 20 69 6e 64 65 78 20 6e  cate the index n
1e1b0 61 6d 65 64 20 62 79 20 74 68 65 20 49 4e 44 45  amed by the INDE
1e1c0 58 45 44 20 42 59 20 63 6c 61 75 73 65 2c 20 69  XED BY clause, i
1e1d0 66 20 61 6e 79 2e 20 2a 2f 0a 20 20 20 20 69 66  f any. */.    if
1e1e0 28 20 73 71 6c 69 74 65 33 49 6e 64 65 78 65 64  ( sqlite3Indexed
1e1f0 42 79 4c 6f 6f 6b 75 70 28 70 50 61 72 73 65 2c  ByLookup(pParse,
1e200 20 70 46 72 6f 6d 29 20 29 7b 0a 20 20 20 20 20   pFrom) ){.     
1e210 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
1e220 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  t;.    }.  }..  
1e230 2f 2a 20 50 72 6f 63 65 73 73 20 4e 41 54 55 52  /* Process NATUR
1e240 41 4c 20 6b 65 79 77 6f 72 64 73 2c 20 61 6e 64  AL keywords, and
1e250 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c   ON and USING cl
1e260 61 75 73 65 73 20 6f 66 20 6a 6f 69 6e 73 2e 0a  auses of joins..
1e270 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6d    */.  if( db->m
1e280 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 73  allocFailed || s
1e290 71 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f 69 6e  qliteProcessJoin
1e2a0 28 70 50 61 72 73 65 2c 20 70 29 20 29 7b 0a 20  (pParse, p) ){. 
1e2b0 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62     return WRC_Ab
1e2c0 6f 72 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46  ort;.  }..  /* F
1e2d0 6f 72 20 65 76 65 72 79 20 22 2a 22 20 74 68 61  or every "*" tha
1e2e0 74 20 6f 63 63 75 72 73 20 69 6e 20 74 68 65 20  t occurs in the 
1e2f0 63 6f 6c 75 6d 6e 20 6c 69 73 74 2c 20 69 6e 73  column list, ins
1e300 65 72 74 20 74 68 65 20 6e 61 6d 65 73 20 6f 66  ert the names of
1e310 0a 20 20 2a 2a 20 61 6c 6c 20 63 6f 6c 75 6d 6e  .  ** all column
1e320 73 20 69 6e 20 61 6c 6c 20 74 61 62 6c 65 73 2e  s in all tables.
1e330 20 20 41 6e 64 20 66 6f 72 20 65 76 65 72 79 20    And for every 
1e340 54 41 42 4c 45 2e 2a 20 69 6e 73 65 72 74 20 74  TABLE.* insert t
1e350 68 65 20 6e 61 6d 65 73 0a 20 20 2a 2a 20 6f 66  he names.  ** of
1e360 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20   all columns in 
1e370 54 41 42 4c 45 2e 20 20 54 68 65 20 70 61 72 73  TABLE.  The pars
1e380 65 72 20 69 6e 73 65 72 74 65 64 20 61 20 73 70  er inserted a sp
1e390 65 63 69 61 6c 20 65 78 70 72 65 73 73 69 6f 6e  ecial expression
1e3a0 0a 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20 54  .  ** with the T
1e3b0 4b 5f 41 4c 4c 20 6f 70 65 72 61 74 6f 72 20 66  K_ALL operator f
1e3c0 6f 72 20 65 61 63 68 20 22 2a 22 20 74 68 61 74  or each "*" that
1e3d0 20 69 74 20 66 6f 75 6e 64 20 69 6e 20 74 68 65   it found in the
1e3e0 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2e 0a 20 20   column list..  
1e3f0 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
1e400 20 63 6f 64 65 20 6a 75 73 74 20 68 61 73 20 74   code just has t
1e410 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 54 4b 5f  o locate the TK_
1e420 41 4c 4c 20 65 78 70 72 65 73 73 69 6f 6e 73 20  ALL expressions 
1e430 61 6e 64 20 65 78 70 61 6e 64 0a 20 20 2a 2a 20  and expand.  ** 
1e440 65 61 63 68 20 6f 6e 65 20 74 6f 20 74 68 65 20  each one to the 
1e450 6c 69 73 74 20 6f 66 20 61 6c 6c 20 63 6f 6c 75  list of all colu
1e460 6d 6e 73 20 69 6e 20 61 6c 6c 20 74 61 62 6c 65  mns in all table
1e470 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  s..  **.  ** The
1e480 20 66 69 72 73 74 20 6c 6f 6f 70 20 6a 75 73 74   first loop just
1e490 20 63 68 65 63 6b 73 20 74 6f 20 73 65 65 20 69   checks to see i
1e4a0 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20  f there are any 
1e4b0 22 2a 22 20 6f 70 65 72 61 74 6f 72 73 0a 20 20  "*" operators.  
1e4c0 2a 2a 20 74 68 61 74 20 6e 65 65 64 20 65 78 70  ** that need exp
1e4d0 61 6e 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 66  anding..  */.  f
1e4e0 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74  or(k=0; k<pEList
1e4f0 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20  ->nExpr; k++){. 
1e500 20 20 20 70 45 20 3d 20 70 45 4c 69 73 74 2d 3e     pE = pEList->
1e510 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[k].pExpr;.    
1e520 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 41  if( pE->op==TK_A
1e530 4c 4c 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  LL ) break;.    
1e540 61 73 73 65 72 74 28 20 70 45 2d 3e 6f 70 21 3d  assert( pE->op!=
1e550 54 4b 5f 44 4f 54 20 7c 7c 20 70 45 2d 3e 70 52  TK_DOT || pE->pR
1e560 69 67 68 74 21 3d 30 20 29 3b 0a 20 20 20 20 61  ight!=0 );.    a
1e570 73 73 65 72 74 28 20 70 45 2d 3e 6f 70 21 3d 54  ssert( pE->op!=T
1e580 4b 5f 44 4f 54 20 7c 7c 20 28 70 45 2d 3e 70 4c  K_DOT || (pE->pL
1e590 65 66 74 21 3d 30 20 26 26 20 70 45 2d 3e 70 4c  eft!=0 && pE->pL
1e5a0 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 29 20  eft->op==TK_ID) 
1e5b0 29 3b 0a 20 20 20 20 69 66 28 20 70 45 2d 3e 6f  );.    if( pE->o
1e5c0 70 3d 3d 54 4b 5f 44 4f 54 20 26 26 20 70 45 2d  p==TK_DOT && pE-
1e5d0 3e 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f  >pRight->op==TK_
1e5e0 41 4c 4c 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d  ALL ) break;.  }
1e5f0 0a 20 20 69 66 28 20 6b 3c 70 45 4c 69 73 74 2d  .  if( k<pEList-
1e600 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 2f 2a  >nExpr ){.    /*
1e610 0a 20 20 20 20 2a 2a 20 49 66 20 77 65 20 67 65  .    ** If we ge
1e620 74 20 68 65 72 65 20 69 74 20 6d 65 61 6e 73 20  t here it means 
1e630 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 63  the result set c
1e640 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d  ontains one or m
1e650 6f 72 65 20 22 2a 22 0a 20 20 20 20 2a 2a 20 6f  ore "*".    ** o
1e660 70 65 72 61 74 6f 72 73 20 74 68 61 74 20 6e 65  perators that ne
1e670 65 64 20 74 6f 20 62 65 20 65 78 70 61 6e 64 65  ed to be expande
1e680 64 2e 20 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68  d.  Loop through
1e690 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e   each expression
1e6a0 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 72  .    ** in the r
1e6b0 65 73 75 6c 74 20 73 65 74 20 61 6e 64 20 65 78  esult set and ex
1e6c0 70 61 6e 64 20 74 68 65 6d 20 6f 6e 65 20 62 79  pand them one by
1e6d0 20 6f 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20   one..    */.   
1e6e0 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
1e6f0 5f 69 74 65 6d 20 2a 61 20 3d 20 70 45 4c 69 73  _item *a = pELis
1e700 74 2d 3e 61 3b 0a 20 20 20 20 45 78 70 72 4c 69  t->a;.    ExprLi
1e710 73 74 20 2a 70 4e 65 77 20 3d 20 30 3b 0a 20 20  st *pNew = 0;.  
1e720 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 70 50    int flags = pP
1e730 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 3b  arse->db->flags;
1e740 0a 20 20 20 20 69 6e 74 20 6c 6f 6e 67 4e 61 6d  .    int longNam
1e750 65 73 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51  es = (flags & SQ
1e760 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65  LITE_FullColName
1e770 73 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20  s)!=0.          
1e780 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28              && (
1e790 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53  flags & SQLITE_S
1e7a0 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 29 3d 3d 30  hortColNames)==0
1e7b0 3b 0a 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 70  ;..    /* When p
1e7c0 72 6f 63 65 73 73 69 6e 67 20 46 52 4f 4d 2d 63  rocessing FROM-c
1e7d0 6c 61 75 73 65 20 73 75 62 71 75 65 72 69 65 73  lause subqueries
1e7e0 2c 20 69 74 20 69 73 20 61 6c 77 61 79 73 20 74  , it is always t
1e7f0 68 65 20 63 61 73 65 0a 20 20 20 20 2a 2a 20 74  he case.    ** t
1e800 68 61 74 20 66 75 6c 6c 5f 63 6f 6c 75 6d 6e 5f  hat full_column_
1e810 6e 61 6d 65 73 3d 4f 46 46 20 61 6e 64 20 73 68  names=OFF and sh
1e820 6f 72 74 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 73  ort_column_names
1e830 3d 4f 4e 2e 20 20 54 68 65 0a 20 20 20 20 2a 2a  =ON.  The.    **
1e840 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65   sqlite3ResultSe
1e850 74 4f 66 53 65 6c 65 63 74 28 29 20 72 6f 75 74  tOfSelect() rout
1e860 69 6e 65 20 6d 61 6b 65 73 20 69 74 20 73 6f 2e  ine makes it so.
1e870 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
1e880 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  (p->selFlags & S
1e890 46 5f 4e 65 73 74 65 64 46 72 6f 6d 29 3d 3d 30  F_NestedFrom)==0
1e8a0 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 28  .          || ((
1e8b0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  flags & SQLITE_F
1e8c0 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 3d 3d 30 20  ullColNames)==0 
1e8d0 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  &&.             
1e8e0 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
1e8f0 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 29 21  _ShortColNames)!
1e900 3d 30 29 20 29 3b 0a 0a 20 20 20 20 66 6f 72 28  =0) );..    for(
1e910 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e  k=0; k<pEList->n
1e920 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20  Expr; k++){.    
1e930 20 20 70 45 20 3d 20 61 5b 6b 5d 2e 70 45 78 70    pE = a[k].pExp
1e940 72 3b 0a 20 20 20 20 20 20 70 52 69 67 68 74 20  r;.      pRight 
1e950 3d 20 70 45 2d 3e 70 52 69 67 68 74 3b 0a 20 20  = pE->pRight;.  
1e960 20 20 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e      assert( pE->
1e970 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 52  op!=TK_DOT || pR
1e980 69 67 68 74 21 3d 30 20 29 3b 0a 20 20 20 20 20  ight!=0 );.     
1e990 20 69 66 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f   if( pE->op!=TK_
1e9a0 41 4c 4c 20 26 26 20 28 70 45 2d 3e 6f 70 21 3d  ALL && (pE->op!=
1e9b0 54 4b 5f 44 4f 54 20 7c 7c 20 70 52 69 67 68 74  TK_DOT || pRight
1e9c0 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29 20 29 7b  ->op!=TK_ALL) ){
1e9d0 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73  .        /* This
1e9e0 20 70 61 72 74 69 63 75 6c 61 72 20 65 78 70 72   particular expr
1e9f0 65 73 73 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20  ession does not 
1ea00 6e 65 65 64 20 74 6f 20 62 65 20 65 78 70 61 6e  need to be expan
1ea10 64 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ded..        */.
1ea20 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73          pNew = s
1ea30 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
1ea40 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70 4e 65  pend(pParse, pNe
1ea50 77 2c 20 61 5b 6b 5d 2e 70 45 78 70 72 29 3b 0a  w, a[k].pExpr);.
1ea60 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77          if( pNew
1ea70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e   ){.          pN
1ea80 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70  ew->a[pNew->nExp
1ea90 72 2d 31 5d 2e 7a 4e 61 6d 65 20 3d 20 61 5b 6b  r-1].zName = a[k
1eaa0 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ].zName;.       
1eab0 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d     pNew->a[pNew-
1eac0 3e 6e 45 78 70 72 2d 31 5d 2e 7a 53 70 61 6e 20  >nExpr-1].zSpan 
1ead0 3d 20 61 5b 6b 5d 2e 7a 53 70 61 6e 3b 0a 20 20  = a[k].zSpan;.  
1eae0 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 7a 4e 61          a[k].zNa
1eaf0 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  me = 0;.        
1eb00 20 20 61 5b 6b 5d 2e 7a 53 70 61 6e 20 3d 20 30    a[k].zSpan = 0
1eb10 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1eb20 20 20 20 20 61 5b 6b 5d 2e 70 45 78 70 72 20 3d      a[k].pExpr =
1eb30 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   0;.      }else{
1eb40 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73  .        /* This
1eb50 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61   expression is a
1eb60 20 22 2a 22 20 6f 72 20 61 20 22 54 41 42 4c 45   "*" or a "TABLE
1eb70 2e 2a 22 20 61 6e 64 20 6e 65 65 64 73 20 74 6f  .*" and needs to
1eb80 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 65   be.        ** e
1eb90 78 70 61 6e 64 65 64 2e 20 2a 2f 0a 20 20 20 20  xpanded. */.    
1eba0 20 20 20 20 69 6e 74 20 74 61 62 6c 65 53 65 65      int tableSee
1ebb0 6e 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 53  n = 0;      /* S
1ebc0 65 74 20 74 6f 20 31 20 77 68 65 6e 20 54 41 42  et to 1 when TAB
1ebd0 4c 45 20 6d 61 74 63 68 65 73 20 2a 2f 0a 20 20  LE matches */.  
1ebe0 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 4e 61        char *zTNa
1ebf0 6d 65 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  me = 0;       /*
1ec00 20 74 65 78 74 20 6f 66 20 6e 61 6d 65 20 6f 66   text of name of
1ec10 20 54 41 42 4c 45 20 2a 2f 0a 20 20 20 20 20 20   TABLE */.      
1ec20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b    if( pE->op==TK
1ec30 5f 44 4f 54 20 29 7b 0a 20 20 20 20 20 20 20 20  _DOT ){.        
1ec40 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e 70 4c    assert( pE->pL
1ec50 65 66 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  eft!=0 );.      
1ec60 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
1ec70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 2d  rHasProperty(pE-
1ec80 3e 70 4c 65 66 74 2c 20 45 50 5f 49 6e 74 56 61  >pLeft, EP_IntVa
1ec90 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20  lue) );.        
1eca0 20 20 7a 54 4e 61 6d 65 20 3d 20 70 45 2d 3e 70    zTName = pE->p
1ecb0 4c 65 66 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a  Left->u.zToken;.
1ecc0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1ecd0 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d    for(i=0, pFrom
1ece0 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c  =pTabList->a; i<
1ecf0 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20  pTabList->nSrc; 
1ed00 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20  i++, pFrom++){. 
1ed10 20 20 20 20 20 20 20 20 20 54 61 62 6c 65 20 2a           Table *
1ed20 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54  pTab = pFrom->pT
1ed30 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20 53 65  ab;.          Se
1ed40 6c 65 63 74 20 2a 70 53 75 62 20 3d 20 70 46 72  lect *pSub = pFr
1ed50 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20  om->pSelect;.   
1ed60 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 61         char *zTa
1ed70 62 4e 61 6d 65 20 3d 20 70 46 72 6f 6d 2d 3e 7a  bName = pFrom->z
1ed80 41 6c 69 61 73 3b 0a 20 20 20 20 20 20 20 20 20  Alias;.         
1ed90 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 63   const char *zSc
1eda0 68 65 6d 61 4e 61 6d 65 20 3d 20 30 3b 0a 20 20  hemaName = 0;.  
1edb0 20 20 20 20 20 20 20 20 69 6e 74 20 69 44 62 3b          int iDb;
1edc0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a  .          if( z
1edd0 54 61 62 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  TabName==0 ){.  
1ede0 20 20 20 20 20 20 20 20 20 20 7a 54 61 62 4e 61            zTabNa
1edf0 6d 65 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  me = pTab->zName
1ee00 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1ee10 20 20 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e          if( db->
1ee20 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 62  mallocFailed ) b
1ee30 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
1ee40 69 66 28 20 70 53 75 62 3d 3d 30 20 7c 7c 20 28  if( pSub==0 || (
1ee50 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26  pSub->selFlags &
1ee60 20 53 46 5f 4e 65 73 74 65 64 46 72 6f 6d 29 3d   SF_NestedFrom)=
1ee70 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
1ee80 20 20 70 53 75 62 20 3d 20 30 3b 0a 20 20 20 20    pSub = 0;.    
1ee90 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 4e 61          if( zTNa
1eea0 6d 65 20 26 26 20 73 71 6c 69 74 65 33 53 74 72  me && sqlite3Str
1eeb0 49 43 6d 70 28 7a 54 4e 61 6d 65 2c 20 7a 54 61  ICmp(zTName, zTa
1eec0 62 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20  bName)!=0 ){.   
1eed0 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
1eee0 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nue;.           
1eef0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69   }.            i
1ef00 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
1ef10 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54  maToIndex(db, pT
1ef20 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  ab->pSchema);.  
1ef30 20 20 20 20 20 20 20 20 20 20 7a 53 63 68 65 6d            zSchem
1ef40 61 4e 61 6d 65 20 3d 20 69 44 62 3e 3d 30 20 3f  aName = iDb>=0 ?
1ef50 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e   db->aDb[iDb].zN
1ef60 61 6d 65 20 3a 20 22 2a 22 3b 0a 20 20 20 20 20  ame : "*";.     
1ef70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1ef80 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62   for(j=0; j<pTab
1ef90 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20  ->nCol; j++){.  
1efa0 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a            char *
1efb0 7a 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 61 43  zName = pTab->aC
1efc0 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  ol[j].zName;.   
1efd0 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a           char *z
1efe0 43 6f 6c 6e 61 6d 65 3b 20 20 2f 2a 20 54 68 65  Colname;  /* The
1eff0 20 63 6f 6d 70 75 74 65 64 20 63 6f 6c 75 6d 6e   computed column
1f000 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20   name */.       
1f010 20 20 20 20 20 63 68 61 72 20 2a 7a 54 6f 46 72       char *zToFr
1f020 65 65 3b 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 65  ee;   /* Malloce
1f030 64 20 73 74 72 69 6e 67 20 74 68 61 74 20 6e 65  d string that ne
1f040 65 64 73 20 74 6f 20 62 65 20 66 72 65 65 64 20  eds to be freed 
1f050 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 54  */.            T
1f060 6f 6b 65 6e 20 73 43 6f 6c 6e 61 6d 65 3b 20 20  oken sColname;  
1f070 2f 2a 20 43 6f 6d 70 75 74 65 64 20 63 6f 6c 75  /* Computed colu
1f080 6d 6e 20 6e 61 6d 65 20 61 73 20 61 20 74 6f 6b  mn name as a tok
1f090 65 6e 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 20  en */..         
1f0a0 20 20 20 61 73 73 65 72 74 28 20 7a 4e 61 6d 65     assert( zName
1f0b0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
1f0c0 69 66 28 20 7a 54 4e 61 6d 65 20 26 26 20 70 53  if( zTName && pS
1f0d0 75 62 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ub.             
1f0e0 26 26 20 73 71 6c 69 74 65 33 4d 61 74 63 68 53  && sqlite3MatchS
1f0f0 70 61 6e 4e 61 6d 65 28 70 53 75 62 2d 3e 70 45  panName(pSub->pE
1f100 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 53 70 61 6e  List->a[j].zSpan
1f110 2c 20 30 2c 20 7a 54 4e 61 6d 65 2c 20 30 29 3d  , 0, zTName, 0)=
1f120 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 29  =0.            )
1f130 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1f140 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
1f150 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
1f160 20 20 20 20 20 2f 2a 20 49 66 20 61 20 63 6f 6c       /* If a col
1f170 75 6d 6e 20 69 73 20 6d 61 72 6b 65 64 20 61 73  umn is marked as
1f180 20 27 68 69 64 64 65 6e 27 20 28 63 75 72 72 65   'hidden' (curre
1f190 6e 74 6c 79 20 6f 6e 6c 79 20 70 6f 73 73 69 62  ntly only possib
1f1a0 6c 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  le.            *
1f1b0 2a 20 66 6f 72 20 76 69 72 74 75 61 6c 20 74 61  * for virtual ta
1f1c0 62 6c 65 73 29 2c 20 64 6f 20 6e 6f 74 20 69 6e  bles), do not in
1f1d0 63 6c 75 64 65 20 69 74 20 69 6e 20 74 68 65 20  clude it in the 
1f1e0 65 78 70 61 6e 64 65 64 0a 20 20 20 20 20 20 20  expanded.       
1f1f0 20 20 20 20 20 2a 2a 20 72 65 73 75 6c 74 2d 73       ** result-s
1f200 65 74 20 6c 69 73 74 2e 0a 20 20 20 20 20 20 20  et list..       
1f210 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
1f220 20 20 20 20 69 66 28 20 49 73 48 69 64 64 65 6e      if( IsHidden
1f230 43 6f 6c 75 6d 6e 28 26 70 54 61 62 2d 3e 61 43  Column(&pTab->aC
1f240 6f 6c 5b 6a 5d 29 20 29 7b 0a 20 20 20 20 20 20  ol[j]) ){.      
1f250 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 49          assert(I
1f260 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 29 3b  sVirtual(pTab));
1f270 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63  .              c
1f280 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
1f290 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1f2a0 20 20 20 74 61 62 6c 65 53 65 65 6e 20 3d 20 31     tableSeen = 1
1f2b0 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ;..            i
1f2c0 66 28 20 69 3e 30 20 26 26 20 7a 54 4e 61 6d 65  f( i>0 && zTName
1f2d0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
1f2e0 20 20 20 20 20 69 66 28 20 28 70 46 72 6f 6d 2d       if( (pFrom-
1f2f0 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4e  >jointype & JT_N
1f300 41 54 55 52 41 4c 29 21 3d 30 0a 20 20 20 20 20  ATURAL)!=0.     
1f310 20 20 20 20 20 20 20 20 20 20 20 26 26 20 74 61             && ta
1f320 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65  bleAndColumnInde
1f330 78 28 70 54 61 62 4c 69 73 74 2c 20 69 2c 20 7a  x(pTabList, i, z
1f340 4e 61 6d 65 2c 20 30 2c 20 30 29 0a 20 20 20 20  Name, 0, 0).    
1f350 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20            ){.   
1f360 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f370 49 6e 20 61 20 4e 41 54 55 52 41 4c 20 6a 6f 69  In a NATURAL joi
1f380 6e 2c 20 6f 6d 69 74 20 74 68 65 20 6a 6f 69 6e  n, omit the join
1f390 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20 74 68   columns from th
1f3a0 65 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e .             
1f3b0 20 20 20 2a 2a 20 74 61 62 6c 65 20 74 6f 20 74     ** table to t
1f3c0 68 65 20 72 69 67 68 74 20 6f 66 20 74 68 65 20  he right of the 
1f3d0 6a 6f 69 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20  join */.        
1f3e0 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
1f3f0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1f400 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
1f410 69 66 28 20 73 71 6c 69 74 65 33 49 64 4c 69 73  if( sqlite3IdLis
1f420 74 49 6e 64 65 78 28 70 46 72 6f 6d 2d 3e 70 55  tIndex(pFrom->pU
1f430 73 69 6e 67 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20  sing, zName)>=0 
1f440 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
1f450 20 20 20 2f 2a 20 49 6e 20 61 20 6a 6f 69 6e 20     /* In a join 
1f460 77 69 74 68 20 61 20 55 53 49 4e 47 20 63 6c 61  with a USING cla
1f470 75 73 65 2c 20 6f 6d 69 74 20 63 6f 6c 75 6d 6e  use, omit column
1f480 73 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20 20  s in the.       
1f490 20 20 20 20 20 20 20 20 20 2a 2a 20 75 73 69 6e           ** usin
1f4a0 67 20 63 6c 61 75 73 65 20 66 72 6f 6d 20 74 68  g clause from th
1f4b0 65 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 72  e table on the r
1f4c0 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20  ight. */.       
1f4d0 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
1f4e0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e;.             
1f4f0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d   }.            }
1f500 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 52 69  .            pRi
1f510 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ght = sqlite3Exp
1f520 72 28 64 62 2c 20 54 4b 5f 49 44 2c 20 7a 4e 61  r(db, TK_ID, zNa
1f530 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  me);.           
1f540 20 7a 43 6f 6c 6e 61 6d 65 20 3d 20 7a 4e 61 6d   zColname = zNam
1f550 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a  e;.            z
1f560 54 6f 46 72 65 65 20 3d 20 30 3b 0a 20 20 20 20  ToFree = 0;.    
1f570 20 20 20 20 20 20 20 20 69 66 28 20 6c 6f 6e 67          if( long
1f580 4e 61 6d 65 73 20 7c 7c 20 70 54 61 62 4c 69 73  Names || pTabLis
1f590 74 2d 3e 6e 53 72 63 3e 31 20 29 7b 0a 20 20 20  t->nSrc>1 ){.   
1f5a0 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20             Expr 
1f5b0 2a 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 20 20  *pLeft;.        
1f5c0 20 20 20 20 20 20 70 4c 65 66 74 20 3d 20 73 71        pLeft = sq
1f5d0 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b  lite3Expr(db, TK
1f5e0 5f 49 44 2c 20 7a 54 61 62 4e 61 6d 65 29 3b 0a  _ID, zTabName);.
1f5f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
1f600 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78  xpr = sqlite3PEx
1f610 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 44 4f  pr(pParse, TK_DO
1f620 54 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74  T, pLeft, pRight
1f630 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
1f640 20 20 20 20 69 66 28 20 7a 53 63 68 65 6d 61 4e      if( zSchemaN
1f650 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ame ){.         
1f660 20 20 20 20 20 20 20 70 4c 65 66 74 20 3d 20 73         pLeft = s
1f670 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20 54  qlite3Expr(db, T
1f680 4b 5f 49 44 2c 20 7a 53 63 68 65 6d 61 4e 61 6d  K_ID, zSchemaNam
1f690 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
1f6a0 20 20 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69      pExpr = sqli
1f6b0 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
1f6c0 20 54 4b 5f 44 4f 54 2c 20 70 4c 65 66 74 2c 20   TK_DOT, pLeft, 
1f6d0 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20  pExpr, 0);.     
1f6e0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1f6f0 20 20 20 20 20 20 20 20 20 69 66 28 20 6c 6f 6e           if( lon
1f700 67 4e 61 6d 65 73 20 29 7b 0a 20 20 20 20 20 20  gNames ){.      
1f710 20 20 20 20 20 20 20 20 20 20 7a 43 6f 6c 6e 61            zColna
1f720 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  me = sqlite3MPri
1f730 6e 74 66 28 64 62 2c 20 22 25 73 2e 25 73 22 2c  ntf(db, "%s.%s",
1f740 20 7a 54 61 62 4e 61 6d 65 2c 20 7a 4e 61 6d 65   zTabName, zName
1f750 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
1f760 20 20 20 7a 54 6f 46 72 65 65 20 3d 20 7a 43 6f     zToFree = zCo
1f770 6c 6e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20  lname;.         
1f780 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1f790 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1f7a0 20 20 20 20 20 20 20 20 70 45 78 70 72 20 3d 20          pExpr = 
1f7b0 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20  pRight;.        
1f7c0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1f7d0 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
1f7e0 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
1f7f0 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 70 45 78  Parse, pNew, pEx
1f800 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  pr);.           
1f810 20 73 43 6f 6c 6e 61 6d 65 2e 7a 20 3d 20 7a 43   sColname.z = zC
1f820 6f 6c 6e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  olname;.        
1f830 20 20 20 20 73 43 6f 6c 6e 61 6d 65 2e 6e 20 3d      sColname.n =
1f840 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
1f850 28 7a 43 6f 6c 6e 61 6d 65 29 3b 0a 20 20 20 20  (zColname);.    
1f860 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1f870 78 70 72 4c 69 73 74 53 65 74 4e 61 6d 65 28 70  xprListSetName(p
1f880 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 26 73 43  Parse, pNew, &sC
1f890 6f 6c 6e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20  olname, 0);.    
1f8a0 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77          if( pNew
1f8b0 20 26 26 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73   && (p->selFlags
1f8c0 20 26 20 53 46 5f 4e 65 73 74 65 64 46 72 6f 6d   & SF_NestedFrom
1f8d0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
1f8e0 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70        struct Exp
1f8f0 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 58 20 3d  rList_item *pX =
1f900 20 26 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e   &pNew->a[pNew->
1f910 6e 45 78 70 72 2d 31 5d 3b 0a 20 20 20 20 20 20  nExpr-1];.      
1f920 20 20 20 20 20 20 20 20 69 66 28 20 70 53 75 62          if( pSub
1f930 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1f940 20 20 20 20 70 58 2d 3e 7a 53 70 61 6e 20 3d 20      pX->zSpan = 
1f950 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
1f960 64 62 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74  db, pSub->pEList
1f970 2d 3e 61 5b 6a 5d 2e 7a 53 70 61 6e 29 3b 0a 20  ->a[j].zSpan);. 
1f980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
1f990 65 73 74 63 61 73 65 28 20 70 58 2d 3e 7a 53 70  estcase( pX->zSp
1f9a0 61 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  an==0 );.       
1f9b0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
1f9c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 58                pX
1f9d0 2d 3e 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74 65  ->zSpan = sqlite
1f9e0 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73  3MPrintf(db, "%s
1f9f0 2e 25 73 2e 25 73 22 2c 0a 20 20 20 20 20 20 20  .%s.%s",.       
1fa00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fa10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fa20 20 20 20 20 7a 53 63 68 65 6d 61 4e 61 6d 65 2c      zSchemaName,
1fa30 20 7a 54 61 62 4e 61 6d 65 2c 20 7a 43 6f 6c 6e   zTabName, zColn
1fa40 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
1fa50 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1fa60 70 58 2d 3e 7a 53 70 61 6e 3d 3d 30 20 29 3b 0a  pX->zSpan==0 );.
1fa70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
1fa80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 58                pX
1fa90 2d 3e 62 53 70 61 6e 49 73 54 61 62 20 3d 20 31  ->bSpanIsTab = 1
1faa0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
1fab0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
1fac0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 54  te3DbFree(db, zT
1fad0 6f 46 72 65 65 29 3b 0a 20 20 20 20 20 20 20 20  oFree);.        
1fae0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
1faf0 20 20 20 20 20 20 69 66 28 20 21 74 61 62 6c 65        if( !table
1fb00 53 65 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  Seen ){.        
1fb10 20 20 69 66 28 20 7a 54 4e 61 6d 65 20 29 7b 0a    if( zTName ){.
1fb20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
1fb30 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
1fb40 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62  se, "no such tab
1fb50 6c 65 3a 20 25 73 22 2c 20 7a 54 4e 61 6d 65 29  le: %s", zTName)
1fb60 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
1fb70 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  e{.            s
1fb80 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
1fb90 50 61 72 73 65 2c 20 22 6e 6f 20 74 61 62 6c 65  Parse, "no table
1fba0 73 20 73 70 65 63 69 66 69 65 64 22 29 3b 0a 20  s specified");. 
1fbb0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1fbc0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1fbd0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78   }.    sqlite3Ex
1fbe0 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
1fbf0 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 70 2d   pEList);.    p-
1fc00 3e 70 45 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a  >pEList = pNew;.
1fc10 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d    }.#if SQLITE_M
1fc20 41 58 5f 43 4f 4c 55 4d 4e 0a 20 20 69 66 28 20  AX_COLUMN.  if( 
1fc30 70 2d 3e 70 45 4c 69 73 74 20 26 26 20 70 2d 3e  p->pEList && p->
1fc40 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 64 62  pEList->nExpr>db
1fc50 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ->aLimit[SQLITE_
1fc60 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20 29 7b  LIMIT_COLUMN] ){
1fc70 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
1fc80 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f  rMsg(pParse, "to
1fc90 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 69  o many columns i
1fca0 6e 20 72 65 73 75 6c 74 20 73 65 74 22 29 3b 0a  n result set");.
1fcb0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74    }.#endif.  ret
1fcc0 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
1fcd0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4e 6f 2d 6f 70  ;.}../*.** No-op
1fce0 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 74 68 65   routine for the
1fcf0 20 70 61 72 73 65 2d 74 72 65 65 20 77 61 6c 6b   parse-tree walk
1fd00 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74  er..**.** When t
1fd10 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74  his routine is t
1fd20 68 65 20 57 61 6c 6b 65 72 2e 78 45 78 70 72 43  he Walker.xExprC
1fd30 61 6c 6c 62 61 63 6b 20 74 68 65 6e 20 65 78 70  allback then exp
1fd40 72 65 73 73 69 6f 6e 20 74 72 65 65 73 0a 2a 2a  ression trees.**
1fd50 20 61 72 65 20 77 61 6c 6b 65 64 20 77 69 74 68   are walked with
1fd60 6f 75 74 20 61 6e 79 20 61 63 74 69 6f 6e 73 20  out any actions 
1fd70 62 65 69 6e 67 20 74 61 6b 65 6e 20 61 74 20 65  being taken at e
1fd80 61 63 68 20 6e 6f 64 65 2e 20 20 50 72 65 73 75  ach node.  Presu
1fd90 6d 61 62 6c 79 2c 0a 2a 2a 20 77 68 65 6e 20 74  mably,.** when t
1fda0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
1fdb0 73 65 64 20 66 6f 72 20 57 61 6c 6b 65 72 2e 78  sed for Walker.x
1fdc0 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 74 68 65  ExprCallback the
1fdd0 6e 20 0a 2a 2a 20 57 61 6c 6b 65 72 2e 78 53 65  n .** Walker.xSe
1fde0 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 69 73 20  lectCallback is 
1fdf0 73 65 74 20 74 6f 20 64 6f 20 73 6f 6d 65 74 68  set to do someth
1fe00 69 6e 67 20 75 73 65 66 75 6c 20 66 6f 72 20 65  ing useful for e
1fe10 76 65 72 79 20 0a 2a 2a 20 73 75 62 71 75 65 72  very .** subquer
1fe20 79 20 69 6e 20 74 68 65 20 70 61 72 73 65 72 20  y in the parser 
1fe30 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tree..*/.static 
1fe40 69 6e 74 20 65 78 70 72 57 61 6c 6b 4e 6f 6f 70  int exprWalkNoop
1fe50 28 57 61 6c 6b 65 72 20 2a 4e 6f 74 55 73 65 64  (Walker *NotUsed
1fe60 2c 20 45 78 70 72 20 2a 4e 6f 74 55 73 65 64 32  , Expr *NotUsed2
1fe70 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
1fe80 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20  METER2(NotUsed, 
1fe90 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 72 65 74  NotUsed2);.  ret
1fea0 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
1feb0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
1fec0 72 6f 75 74 69 6e 65 20 22 65 78 70 61 6e 64 73  routine "expands
1fed0 22 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  " a SELECT state
1fee0 6d 65 6e 74 20 61 6e 64 20 61 6c 6c 20 6f 66 20  ment and all of 
1fef0 69 74 73 20 73 75 62 71 75 65 72 69 65 73 2e 0a  its subqueries..
1ff00 2a 2a 20 46 6f 72 20 61 64 64 69 74 69 6f 6e 61  ** For additiona
1ff10 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e  l information on
1ff20 20 77 68 61 74 20 69 74 20 6d 65 61 6e 73 20 74   what it means t
1ff30 6f 20 22 65 78 70 61 6e 64 22 20 61 20 53 45 4c  o "expand" a SEL
1ff40 45 43 54 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74  ECT.** statement
1ff50 2c 20 73 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e  , see the commen
1ff60 74 20 6f 6e 20 74 68 65 20 73 65 6c 65 63 74 45  t on the selectE
1ff70 78 70 61 6e 64 20 77 6f 72 6b 65 72 20 63 61 6c  xpand worker cal
1ff80 6c 62 61 63 6b 20 61 62 6f 76 65 2e 0a 2a 2a 0a  lback above..**.
1ff90 2a 2a 20 45 78 70 61 6e 64 69 6e 67 20 61 20 53  ** Expanding a S
1ffa0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
1ffb0 69 73 20 74 68 65 20 66 69 72 73 74 20 73 74 65  is the first ste
1ffc0 70 20 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 20  p in processing 
1ffd0 61 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74  a.** SELECT stat
1ffe0 65 6d 65 6e 74 2e 20 20 54 68 65 20 53 45 4c 45  ement.  The SELE
1fff0 43 54 20 73 74 61 74 65 6d 65 6e 74 20 6d 75 73  CT statement mus
20000 74 20 62 65 20 65 78 70 61 6e 64 65 64 20 62 65  t be expanded be
20010 66 6f 72 65 0a 2a 2a 20 6e 61 6d 65 20 72 65 73  fore.** name res
20020 6f 6c 75 74 69 6f 6e 20 69 73 20 70 65 72 66 6f  olution is perfo
20030 72 6d 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  rmed..**.** If a
20040 6e 79 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  nything goes wro
20050 6e 67 2c 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ng, an error mes
20060 73 61 67 65 20 69 73 20 77 72 69 74 74 65 6e 20  sage is written 
20070 69 6e 74 6f 20 70 50 61 72 73 65 2e 0a 2a 2a 20  into pParse..** 
20080 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63  The calling func
20090 74 69 6f 6e 20 63 61 6e 20 64 65 74 65 63 74 20  tion can detect 
200a0 74 68 65 20 70 72 6f 62 6c 65 6d 20 62 79 20 6c  the problem by l
200b0 6f 6f 6b 69 6e 67 20 61 74 20 70 50 61 72 73 65  ooking at pParse
200c0 2d 3e 6e 45 72 72 0a 2a 2a 20 61 6e 64 2f 6f 72  ->nErr.** and/or
200d0 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
200e0 6c 6f 63 46 61 69 6c 65 64 2e 0a 2a 2f 0a 73 74  locFailed..*/.st
200f0 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65  atic void sqlite
20100 33 53 65 6c 65 63 74 45 78 70 61 6e 64 28 50 61  3SelectExpand(Pa
20110 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c  rse *pParse, Sel
20120 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20  ect *pSelect){. 
20130 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 6d 65 6d   Walker w;.  mem
20140 73 65 74 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f  set(&w, 0, sizeo
20150 66 28 77 29 29 3b 0a 20 20 77 2e 78 45 78 70 72  f(w));.  w.xExpr
20160 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72 57  Callback = exprW
20170 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 70 50 61  alkNoop;.  w.pPa
20180 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20  rse = pParse;.  
20190 69 66 28 20 70 50 61 72 73 65 2d 3e 68 61 73 43  if( pParse->hasC
201a0 6f 6d 70 6f 75 6e 64 20 29 7b 0a 20 20 20 20 77  ompound ){.    w
201b0 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
201c0 20 3d 20 63 6f 6e 76 65 72 74 43 6f 6d 70 6f 75   = convertCompou
201d0 6e 64 53 65 6c 65 63 74 54 6f 53 75 62 71 75 65  ndSelectToSubque
201e0 72 79 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 57  ry;.    sqlite3W
201f0 61 6c 6b 53 65 6c 65 63 74 28 26 77 2c 20 70 53  alkSelect(&w, pS
20200 65 6c 65 63 74 29 3b 0a 20 20 7d 0a 20 20 77 2e  elect);.  }.  w.
20210 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20  xSelectCallback 
20220 3d 20 73 65 6c 65 63 74 45 78 70 61 6e 64 65 72  = selectExpander
20230 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53  ;.  sqlite3WalkS
20240 65 6c 65 63 74 28 26 77 2c 20 70 53 65 6c 65 63  elect(&w, pSelec
20250 74 29 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20  t);.}...#ifndef 
20260 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
20270 55 45 52 59 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  UERY./*.** This 
20280 69 73 20 61 20 57 61 6c 6b 65 72 2e 78 53 65 6c  is a Walker.xSel
20290 65 63 74 43 61 6c 6c 62 61 63 6b 20 63 61 6c 6c  ectCallback call
202a0 62 61 63 6b 20 66 6f 72 20 74 68 65 20 73 71 6c  back for the sql
202b0 69 74 65 33 53 65 6c 65 63 74 54 79 70 65 49 6e  ite3SelectTypeIn
202c0 66 6f 28 29 0a 2a 2a 20 69 6e 74 65 72 66 61 63  fo().** interfac
202d0 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 61 63  e..**.** For eac
202e0 68 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75  h FROM-clause su
202f0 62 71 75 65 72 79 2c 20 61 64 64 20 43 6f 6c 75  bquery, add Colu
20300 6d 6e 2e 7a 54 79 70 65 20 61 6e 64 20 43 6f 6c  mn.zType and Col
20310 75 6d 6e 2e 7a 43 6f 6c 6c 0a 2a 2a 20 69 6e 66  umn.zColl.** inf
20320 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 74 68 65 20  ormation to the 
20330 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  Table structure 
20340 74 68 61 74 20 72 65 70 72 65 73 65 6e 74 73 20  that represents 
20350 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 0a 2a  the result set.*
20360 2a 20 6f 66 20 74 68 61 74 20 73 75 62 71 75 65  * of that subque
20370 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 54 61  ry..**.** The Ta
20380 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 68  ble structure th
20390 61 74 20 72 65 70 72 65 73 65 6e 74 73 20 74 68  at represents th
203a0 65 20 72 65 73 75 6c 74 20 73 65 74 20 77 61 73  e result set was
203b0 20 63 6f 6e 73 74 72 75 63 74 65 64 0a 2a 2a 20   constructed.** 
203c0 62 79 20 73 65 6c 65 63 74 45 78 70 61 6e 64 65  by selectExpande
203d0 72 28 29 20 62 75 74 20 74 68 65 20 74 79 70 65  r() but the type
203e0 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 69   and collation i
203f0 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 61 73 20 6f  nformation was o
20400 6d 69 74 74 65 64 0a 2a 2a 20 61 74 20 74 68 61  mitted.** at tha
20410 74 20 70 6f 69 6e 74 20 62 65 63 61 75 73 65 20  t point because 
20420 69 64 65 6e 74 69 66 69 65 72 73 20 68 61 64 20  identifiers had 
20430 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 72 65 73  not yet been res
20440 6f 6c 76 65 64 2e 20 20 54 68 69 73 0a 2a 2a 20  olved.  This.** 
20450 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
20460 64 20 61 66 74 65 72 20 69 64 65 6e 74 69 66 69  d after identifi
20470 65 72 20 72 65 73 6f 6c 75 74 69 6f 6e 2e 0a 2a  er resolution..*
20480 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6c  /.static int sel
20490 65 63 74 41 64 64 53 75 62 71 75 65 72 79 54 79  ectAddSubqueryTy
204a0 70 65 49 6e 66 6f 28 57 61 6c 6b 65 72 20 2a 70  peInfo(Walker *p
204b0 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a  Walker, Select *
204c0 70 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61  p){.  Parse *pPa
204d0 72 73 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  rse;.  int i;.  
204e0 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
204f0 74 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  t;.  struct SrcL
20500 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 3b  ist_item *pFrom;
20510 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73  ..  assert( p->s
20520 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65 73  elFlags & SF_Res
20530 6f 6c 76 65 64 20 29 3b 0a 20 20 69 66 28 20 28  olved );.  if( (
20540 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
20550 5f 48 61 73 54 79 70 65 49 6e 66 6f 29 3d 3d 30  _HasTypeInfo)==0
20560 20 29 7b 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c   ){.    p->selFl
20570 61 67 73 20 7c 3d 20 53 46 5f 48 61 73 54 79 70  ags |= SF_HasTyp
20580 65 49 6e 66 6f 3b 0a 20 20 20 20 70 50 61 72 73  eInfo;.    pPars
20590 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61  e = pWalker->pPa
205a0 72 73 65 3b 0a 20 20 20 20 70 54 61 62 4c 69 73  rse;.    pTabLis
205b0 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20  t = p->pSrc;.   
205c0 20 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d   for(i=0, pFrom=
205d0 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70  pTabList->a; i<p
205e0 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  TabList->nSrc; i
205f0 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20  ++, pFrom++){.  
20600 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
20610 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20  = pFrom->pTab;. 
20620 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28       if( ALWAYS(
20630 70 54 61 62 21 3d 30 29 20 26 26 20 28 70 54 61  pTab!=0) && (pTa
20640 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46  b->tabFlags & TF
20650 5f 45 70 68 65 6d 65 72 61 6c 29 21 3d 30 20 29  _Ephemeral)!=0 )
20660 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73  {.        /* A s
20670 75 62 2d 71 75 65 72 79 20 69 6e 20 74 68 65 20  ub-query in the 
20680 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61  FROM clause of a
20690 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20 20   SELECT */.     
206a0 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 20     Select *pSel 
206b0 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74  = pFrom->pSelect
206c0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
206d0 28 20 70 53 65 6c 20 29 3b 0a 20 20 20 20 20 20  ( pSel );.      
206e0 20 20 77 68 69 6c 65 28 20 70 53 65 6c 2d 3e 70    while( pSel->p
206f0 50 72 69 6f 72 20 29 20 70 53 65 6c 20 3d 20 70  Prior ) pSel = p
20700 53 65 6c 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20  Sel->pPrior;.   
20710 20 20 20 20 20 73 65 6c 65 63 74 41 64 64 43 6f       selectAddCo
20720 6c 75 6d 6e 54 79 70 65 41 6e 64 43 6f 6c 6c 61  lumnTypeAndColla
20730 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 70 54 61  tion(pParse, pTa
20740 62 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20 20 20  b, pSel);.      
20750 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
20760 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75  turn WRC_Continu
20770 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a  e;.}.#endif.../*
20780 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
20790 20 61 64 64 73 20 64 61 74 61 74 79 70 65 20 61   adds datatype a
207a0 6e 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  nd collating seq
207b0 75 65 6e 63 65 20 69 6e 66 6f 72 6d 61 74 69 6f  uence informatio
207c0 6e 20 74 6f 0a 2a 2a 20 74 68 65 20 54 61 62 6c  n to.** the Tabl
207d0 65 20 73 74 72 75 63 74 75 72 65 73 20 6f 66 20  e structures of 
207e0 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20  all FROM-clause 
207f0 73 75 62 71 75 65 72 69 65 73 20 69 6e 20 61 0a  subqueries in a.
20800 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  ** SELECT statem
20810 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74  ent..**.** Use t
20820 68 69 73 20 72 6f 75 74 69 6e 65 20 61 66 74 65  his routine afte
20830 72 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f  r name resolutio
20840 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
20850 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41  d sqlite3SelectA
20860 64 64 54 79 70 65 49 6e 66 6f 28 50 61 72 73 65  ddTypeInfo(Parse
20870 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74   *pParse, Select
20880 20 2a 70 53 65 6c 65 63 74 29 7b 0a 23 69 66 6e   *pSelect){.#ifn
20890 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
208a0 53 55 42 51 55 45 52 59 0a 20 20 57 61 6c 6b 65  SUBQUERY.  Walke
208b0 72 20 77 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77  r w;.  memset(&w
208c0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b  , 0, sizeof(w));
208d0 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c  .  w.xSelectCall
208e0 62 61 63 6b 20 3d 20 73 65 6c 65 63 74 41 64 64  back = selectAdd
208f0 53 75 62 71 75 65 72 79 54 79 70 65 49 6e 66 6f  SubqueryTypeInfo
20900 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62  ;.  w.xExprCallb
20910 61 63 6b 20 3d 20 65 78 70 72 57 61 6c 6b 4e 6f  ack = exprWalkNo
20920 6f 70 3b 0a 20 20 77 2e 70 50 61 72 73 65 20 3d  op;.  w.pParse =
20930 20 70 50 61 72 73 65 3b 0a 20 20 77 2e 62 53 65   pParse;.  w.bSe
20940 6c 65 63 74 44 65 70 74 68 46 69 72 73 74 20 3d  lectDepthFirst =
20950 20 31 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c   1;.  sqlite3Wal
20960 6b 53 65 6c 65 63 74 28 26 77 2c 20 70 53 65 6c  kSelect(&w, pSel
20970 65 63 74 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  ect);.#endif.}..
20980 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
20990 69 6e 65 20 73 65 74 73 20 75 70 20 61 20 53 45  ine sets up a SE
209a0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 66  LECT statement f
209b0 6f 72 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20  or processing.  
209c0 54 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67  The.** following
209d0 20 69 73 20 61 63 63 6f 6d 70 6c 69 73 68 65 64   is accomplished
209e0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 20 56  :.**.**     *  V
209f0 44 42 45 20 43 75 72 73 6f 72 20 6e 75 6d 62 65  DBE Cursor numbe
20a00 72 73 20 61 72 65 20 61 73 73 69 67 6e 65 64 20  rs are assigned 
20a10 74 6f 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75  to all FROM-clau
20a20 73 65 20 74 65 72 6d 73 2e 0a 2a 2a 20 20 20 20  se terms..**    
20a30 20 2a 20 20 45 70 68 65 6d 65 72 61 6c 20 54 61   *  Ephemeral Ta
20a40 62 6c 65 20 6f 62 6a 65 63 74 73 20 61 72 65 20  ble objects are 
20a50 63 72 65 61 74 65 64 20 66 6f 72 20 61 6c 6c 20  created for all 
20a60 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62 71  FROM-clause subq
20a70 75 65 72 69 65 73 2e 0a 2a 2a 20 20 20 20 20 2a  ueries..**     *
20a80 20 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63    ON and USING c
20a90 6c 61 75 73 65 73 20 61 72 65 20 73 68 69 66 74  lauses are shift
20aa0 65 64 20 69 6e 74 6f 20 57 48 45 52 45 20 73 74  ed into WHERE st
20ab0 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 20 20 20 20  atements.**     
20ac0 2a 20 20 57 69 6c 64 63 61 72 64 73 20 22 2a 22  *  Wildcards "*"
20ad0 20 61 6e 64 20 22 54 41 42 4c 45 2e 2a 22 20 69   and "TABLE.*" i
20ae0 6e 20 72 65 73 75 6c 74 20 73 65 74 73 20 61 72  n result sets ar
20af0 65 20 65 78 70 61 6e 64 65 64 2e 0a 2a 2a 20 20  e expanded..**  
20b00 20 20 20 2a 20 20 49 64 65 6e 74 69 66 69 65 72     *  Identifier
20b10 73 20 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  s in expression 
20b20 61 72 65 20 6d 61 74 63 68 65 64 20 74 6f 20 74  are matched to t
20b30 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ables..**.** Thi
20b40 73 20 72 6f 75 74 69 6e 65 20 61 63 74 73 20 72  s routine acts r
20b50 65 63 75 72 73 69 76 65 6c 79 20 6f 6e 20 61 6c  ecursively on al
20b60 6c 20 73 75 62 71 75 65 72 69 65 73 20 77 69 74  l subqueries wit
20b70 68 69 6e 20 74 68 65 20 53 45 4c 45 43 54 2e 0a  hin the SELECT..
20b80 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53  */.void sqlite3S
20b90 65 6c 65 63 74 50 72 65 70 28 0a 20 20 50 61 72  electPrep(.  Par
20ba0 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
20bb0 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65      /* The parse
20bc0 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  r context */.  S
20bd0 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
20be0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c        /* The SEL
20bf0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 62 65  ECT statement be
20c00 69 6e 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20  ing coded. */.  
20c10 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4f 75  NameContext *pOu
20c20 74 65 72 4e 43 20 20 2f 2a 20 4e 61 6d 65 20 63  terNC  /* Name c
20c30 6f 6e 74 65 78 74 20 66 6f 72 20 63 6f 6e 74 61  ontext for conta
20c40 69 6e 65 72 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  iner */.){.  sql
20c50 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 66 28 20  ite3 *db;.  if( 
20c60 4e 45 56 45 52 28 70 3d 3d 30 29 20 29 20 72 65  NEVER(p==0) ) re
20c70 74 75 72 6e 3b 0a 20 20 64 62 20 3d 20 70 50 61  turn;.  db = pPa
20c80 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 64  rse->db;.  if( d
20c90 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
20ca0 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
20cb0 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
20cc0 5f 48 61 73 54 79 70 65 49 6e 66 6f 20 29 20 72  _HasTypeInfo ) r
20cd0 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33  eturn;.  sqlite3
20ce0 53 65 6c 65 63 74 45 78 70 61 6e 64 28 70 50 61  SelectExpand(pPa
20cf0 72 73 65 2c 20 70 29 3b 0a 20 20 69 66 28 20 70  rse, p);.  if( p
20d00 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64  Parse->nErr || d
20d10 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
20d20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69  ) return;.  sqli
20d30 74 65 33 52 65 73 6f 6c 76 65 53 65 6c 65 63 74  te3ResolveSelect
20d40 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 2c  Names(pParse, p,
20d50 20 70 4f 75 74 65 72 4e 43 29 3b 0a 20 20 69 66   pOuterNC);.  if
20d60 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  ( pParse->nErr |
20d70 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
20d80 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73  ed ) return;.  s
20d90 71 6c 69 74 65 33 53 65 6c 65 63 74 41 64 64 54  qlite3SelectAddT
20da0 79 70 65 49 6e 66 6f 28 70 50 61 72 73 65 2c 20  ypeInfo(pParse, 
20db0 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73  p);.}../*.** Res
20dc0 65 74 20 74 68 65 20 61 67 67 72 65 67 61 74 65  et the aggregate
20dd0 20 61 63 63 75 6d 75 6c 61 74 6f 72 2e 0a 2a 2a   accumulator..**
20de0 0a 2a 2a 20 54 68 65 20 61 67 67 72 65 67 61 74  .** The aggregat
20df0 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 69 73  e accumulator is
20e00 20 61 20 73 65 74 20 6f 66 20 6d 65 6d 6f 72 79   a set of memory
20e10 20 63 65 6c 6c 73 20 74 68 61 74 20 68 6f 6c 64   cells that hold
20e20 0a 2a 2a 20 69 6e 74 65 72 6d 65 64 69 61 74 65  .** intermediate
20e30 20 72 65 73 75 6c 74 73 20 77 68 69 6c 65 20 63   results while c
20e40 61 6c 63 75 6c 61 74 69 6e 67 20 61 6e 20 61 67  alculating an ag
20e50 67 72 65 67 61 74 65 2e 20 20 54 68 69 73 0a 2a  gregate.  This.*
20e60 2a 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61  * routine genera
20e70 74 65 73 20 63 6f 64 65 20 74 68 61 74 20 73 74  tes code that st
20e80 6f 72 65 73 20 4e 55 4c 4c 73 20 69 6e 20 61 6c  ores NULLs in al
20e90 6c 20 6f 66 20 74 68 6f 73 65 20 6d 65 6d 6f 72  l of those memor
20ea0 79 0a 2a 2a 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 73  y.** cells..*/.s
20eb0 74 61 74 69 63 20 76 6f 69 64 20 72 65 73 65 74  tatic void reset
20ec0 41 63 63 75 6d 75 6c 61 74 6f 72 28 50 61 72 73  Accumulator(Pars
20ed0 65 20 2a 70 50 61 72 73 65 2c 20 41 67 67 49 6e  e *pParse, AggIn
20ee0 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20  fo *pAggInfo){. 
20ef0 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
20f00 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
20f10 69 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67 49  i;.  struct AggI
20f20 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 75 6e 63 3b  nfo_func *pFunc;
20f30 0a 20 20 69 66 28 20 70 41 67 67 49 6e 66 6f 2d  .  if( pAggInfo-
20f40 3e 6e 46 75 6e 63 2b 70 41 67 67 49 6e 66 6f 2d  >nFunc+pAggInfo-
20f50 3e 6e 43 6f 6c 75 6d 6e 3d 3d 30 20 29 7b 0a 20  >nColumn==0 ){. 
20f60 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
20f70 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 67 67   for(i=0; i<pAgg
20f80 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69  Info->nColumn; i
20f90 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
20fa0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
20fb0 5f 4e 75 6c 6c 2c 20 30 2c 20 70 41 67 67 49 6e  _Null, 0, pAggIn
20fc0 66 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 4d 65 6d  fo->aCol[i].iMem
20fd0 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 70 46 75  );.  }.  for(pFu
20fe0 6e 63 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75  nc=pAggInfo->aFu
20ff0 6e 63 2c 20 69 3d 30 3b 20 69 3c 70 41 67 67 49  nc, i=0; i<pAggI
21000 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c  nfo->nFunc; i++,
21010 20 70 46 75 6e 63 2b 2b 29 7b 0a 20 20 20 20 73   pFunc++){.    s
21020 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
21030 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
21040 70 46 75 6e 63 2d 3e 69 4d 65 6d 29 3b 0a 20 20  pFunc->iMem);.  
21050 20 20 69 66 28 20 70 46 75 6e 63 2d 3e 69 44 69    if( pFunc->iDi
21060 73 74 69 6e 63 74 3e 3d 30 20 29 7b 0a 20 20 20  stinct>=0 ){.   
21070 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70 46     Expr *pE = pF
21080 75 6e 63 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  unc->pExpr;.    
21090 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
210a0 61 73 50 72 6f 70 65 72 74 79 28 70 45 2c 20 45  asProperty(pE, 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 20 20 69 66 28 20 70 45 2d 3e 78 2e        if( pE->x.
210d0 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 45 2d 3e  pList==0 || pE->
210e0 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d  x.pList->nExpr!=
210f0 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  1 ){.        sql
21100 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
21110 72 73 65 2c 20 22 44 49 53 54 49 4e 43 54 20 61  rse, "DISTINCT a
21120 67 67 72 65 67 61 74 65 73 20 6d 75 73 74 20 68  ggregates must h
21130 61 76 65 20 65 78 61 63 74 6c 79 20 6f 6e 65 20  ave exactly one 
21140 22 0a 20 20 20 20 20 20 20 20 20 20 20 22 61 72  ".           "ar
21150 67 75 6d 65 6e 74 22 29 3b 0a 20 20 20 20 20 20  gument");.      
21160 20 20 70 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e    pFunc->iDistin
21170 63 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d  ct = -1;.      }
21180 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 4b 65  else{.        Ke
21190 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20  yInfo *pKeyInfo 
211a0 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70  = keyInfoFromExp
211b0 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 45  rList(pParse, pE
211c0 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20  ->x.pList);.    
211d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
211e0 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp4(v, OP_Open
211f0 45 70 68 65 6d 65 72 61 6c 2c 20 70 46 75 6e 63  Ephemeral, pFunc
21200 2d 3e 69 44 69 73 74 69 6e 63 74 2c 20 30 2c 20  ->iDistinct, 0, 
21210 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
21220 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
21230 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34  ar*)pKeyInfo, P4
21240 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20  _KEYINFO);.     
21250 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a   }.    }.  }.}..
21260 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65  /*.** Invoke the
21270 20 4f 50 5f 41 67 67 46 69 6e 61 6c 69 7a 65 20   OP_AggFinalize 
21280 6f 70 63 6f 64 65 20 66 6f 72 20 65 76 65 72 79  opcode for every
21290 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
212a0 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 41 67  ion.** in the Ag
212b0 67 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e  gInfo structure.
212c0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
212d0 66 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63 74  finalizeAggFunct
212e0 69 6f 6e 73 28 50 61 72 73 65 20 2a 70 50 61 72  ions(Parse *pPar
212f0 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67  se, AggInfo *pAg
21300 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a  gInfo){.  Vdbe *
21310 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
21320 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  e;.  int i;.  st
21330 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e  ruct AggInfo_fun
21340 63 20 2a 70 46 3b 0a 20 20 66 6f 72 28 69 3d 30  c *pF;.  for(i=0
21350 2c 20 70 46 3d 70 41 67 67 49 6e 66 6f 2d 3e 61  , pF=pAggInfo->a
21360 46 75 6e 63 3b 20 69 3c 70 41 67 67 49 6e 66 6f  Func; i<pAggInfo
21370 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46  ->nFunc; i++, pF
21380 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73  ++){.    ExprLis
21390 74 20 2a 70 4c 69 73 74 20 3d 20 70 46 2d 3e 70  t *pList = pF->p
213a0 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20  Expr->x.pList;. 
213b0 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
213c0 48 61 73 50 72 6f 70 65 72 74 79 28 70 46 2d 3e  HasProperty(pF->
213d0 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
213e0 65 63 74 29 20 29 3b 0a 20 20 20 20 73 71 6c 69  ect) );.    sqli
213f0 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
21400 20 4f 50 5f 41 67 67 46 69 6e 61 6c 2c 20 70 46   OP_AggFinal, pF
21410 2d 3e 69 4d 65 6d 2c 20 70 4c 69 73 74 20 3f 20  ->iMem, pList ? 
21420 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30  pList->nExpr : 0
21430 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
21440 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64             (void
21450 2a 29 70 46 2d 3e 70 46 75 6e 63 2c 20 50 34 5f  *)pF->pFunc, P4_
21460 46 55 4e 43 44 45 46 29 3b 0a 20 20 7d 0a 7d 0a  FUNCDEF);.  }.}.
21470 0a 2f 2a 0a 2a 2a 20 55 70 64 61 74 65 20 74 68  ./*.** Update th
21480 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 6d 65  e accumulator me
21490 6d 6f 72 79 20 63 65 6c 6c 73 20 66 6f 72 20 61  mory cells for a
214a0 6e 20 61 67 67 72 65 67 61 74 65 20 62 61 73 65  n aggregate base
214b0 64 20 6f 6e 0a 2a 2a 20 74 68 65 20 63 75 72 72  d on.** the curr
214c0 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74  ent cursor posit
214d0 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ion..*/.static v
214e0 6f 69 64 20 75 70 64 61 74 65 41 63 63 75 6d 75  oid updateAccumu
214f0 6c 61 74 6f 72 28 50 61 72 73 65 20 2a 70 50 61  lator(Parse *pPa
21500 72 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41  rse, AggInfo *pA
21510 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20  ggInfo){.  Vdbe 
21520 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
21530 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  be;.  int i;.  i
21540 6e 74 20 72 65 67 48 69 74 20 3d 20 30 3b 0a 20  nt regHit = 0;. 
21550 20 69 6e 74 20 61 64 64 72 48 69 74 54 65 73 74   int addrHitTest
21560 20 3d 20 30 3b 0a 20 20 73 74 72 75 63 74 20 41   = 0;.  struct A
21570 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 3b  ggInfo_func *pF;
21580 0a 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66  .  struct AggInf
21590 6f 5f 63 6f 6c 20 2a 70 43 3b 0a 0a 20 20 70 41  o_col *pC;..  pA
215a0 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f  ggInfo->directMo
215b0 64 65 20 3d 20 31 3b 0a 20 20 73 71 6c 69 74 65  de = 1;.  sqlite
215c0 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28  3ExprCacheClear(
215d0 70 50 61 72 73 65 29 3b 0a 20 20 66 6f 72 28 69  pParse);.  for(i
215e0 3d 30 2c 20 70 46 3d 70 41 67 67 49 6e 66 6f 2d  =0, pF=pAggInfo-
215f0 3e 61 46 75 6e 63 3b 20 69 3c 70 41 67 67 49 6e  >aFunc; i<pAggIn
21600 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20  fo->nFunc; i++, 
21610 70 46 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6e  pF++){.    int n
21620 41 72 67 3b 0a 20 20 20 20 69 6e 74 20 61 64 64  Arg;.    int add
21630 72 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 69  rNext = 0;.    i
21640 6e 74 20 72 65 67 41 67 67 3b 0a 20 20 20 20 45  nt regAgg;.    E
21650 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d  xprList *pList =
21660 20 70 46 2d 3e 70 45 78 70 72 2d 3e 78 2e 70 4c   pF->pExpr->x.pL
21670 69 73 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ist;.    assert(
21680 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
21690 79 28 70 46 2d 3e 70 45 78 70 72 2c 20 45 50 5f  y(pF->pExpr, EP_
216a0 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20  xIsSelect) );.  
216b0 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20    if( pList ){. 
216c0 20 20 20 20 20 6e 41 72 67 20 3d 20 70 4c 69 73       nArg = pLis
216d0 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20  t->nExpr;.      
216e0 72 65 67 41 67 67 20 3d 20 73 71 6c 69 74 65 33  regAgg = sqlite3
216f0 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61  GetTempRange(pPa
21700 72 73 65 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20  rse, nArg);.    
21710 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
21720 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  eExprList(pParse
21730 2c 20 70 4c 69 73 74 2c 20 72 65 67 41 67 67 2c  , pList, regAgg,
21740 20 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   1);.    }else{.
21750 20 20 20 20 20 20 6e 41 72 67 20 3d 20 30 3b 0a        nArg = 0;.
21760 20 20 20 20 20 20 72 65 67 41 67 67 20 3d 20 30        regAgg = 0
21770 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
21780 70 46 2d 3e 69 44 69 73 74 69 6e 63 74 3e 3d 30  pF->iDistinct>=0
21790 20 29 7b 0a 20 20 20 20 20 20 61 64 64 72 4e 65   ){.      addrNe
217a0 78 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  xt = sqlite3Vdbe
217b0 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
217c0 20 20 20 20 61 73 73 65 72 74 28 20 6e 41 72 67      assert( nArg
217d0 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 63 6f 64  ==1 );.      cod
217e0 65 44 69 73 74 69 6e 63 74 28 70 50 61 72 73 65  eDistinct(pParse
217f0 2c 20 70 46 2d 3e 69 44 69 73 74 69 6e 63 74 2c  , pF->iDistinct,
21800 20 61 64 64 72 4e 65 78 74 2c 20 31 2c 20 72 65   addrNext, 1, re
21810 67 41 67 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20  gAgg);.    }.   
21820 20 69 66 28 20 70 46 2d 3e 70 46 75 6e 63 2d 3e   if( pF->pFunc->
21830 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49  funcFlags & SQLI
21840 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c  TE_FUNC_NEEDCOLL
21850 20 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65   ){.      CollSe
21860 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20  q *pColl = 0;.  
21870 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
21880 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
21890 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20  .      int j;.  
218a0 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73      assert( pLis
218b0 74 21 3d 30 20 29 3b 20 20 2f 2a 20 70 4c 69 73  t!=0 );  /* pLis
218c0 74 21 3d 30 20 69 66 20 70 46 2d 3e 70 46 75 6e  t!=0 if pF->pFun
218d0 63 20 68 61 73 20 4e 45 45 44 43 4f 4c 4c 20 2a  c has NEEDCOLL *
218e0 2f 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c  /.      for(j=0,
218f0 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b   pItem=pList->a;
21900 20 21 70 43 6f 6c 6c 20 26 26 20 6a 3c 6e 41 72   !pColl && j<nAr
21910 67 3b 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  g; j++, pItem++)
21920 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20  {.        pColl 
21930 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
21940 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 49 74  lSeq(pParse, pIt
21950 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20  em->pExpr);.    
21960 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 70    }.      if( !p
21970 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  Coll ){.        
21980 70 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e  pColl = pParse->
21990 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20  db->pDfltColl;. 
219a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
219b0 20 72 65 67 48 69 74 3d 3d 30 20 26 26 20 70 41   regHit==0 && pA
219c0 67 67 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c  ggInfo->nAccumul
219d0 61 74 6f 72 20 29 20 72 65 67 48 69 74 20 3d 20  ator ) regHit = 
219e0 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
219f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
21a00 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f  eAddOp4(v, OP_Co
21a10 6c 6c 53 65 71 2c 20 72 65 67 48 69 74 2c 20 30  llSeq, regHit, 0
21a20 2c 20 30 2c 20 28 63 68 61 72 20 2a 29 70 43 6f  , 0, (char *)pCo
21a30 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b  ll, P4_COLLSEQ);
21a40 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
21a50 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
21a60 4f 50 5f 41 67 67 53 74 65 70 2c 20 30 2c 20 72  OP_AggStep, 0, r
21a70 65 67 41 67 67 2c 20 70 46 2d 3e 69 4d 65 6d 2c  egAgg, pF->iMem,
21a80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
21a90 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 70 46         (void*)pF
21aa0 2d 3e 70 46 75 6e 63 2c 20 50 34 5f 46 55 4e 43  ->pFunc, P4_FUNC
21ab0 44 45 46 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  DEF);.    sqlite
21ac0 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
21ad0 20 28 75 38 29 6e 41 72 67 29 3b 0a 20 20 20 20   (u8)nArg);.    
21ae0 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
21af0 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70  AffinityChange(p
21b00 50 61 72 73 65 2c 20 72 65 67 41 67 67 2c 20 6e  Parse, regAgg, n
21b10 41 72 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Arg);.    sqlite
21b20 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67  3ReleaseTempRang
21b30 65 28 70 50 61 72 73 65 2c 20 72 65 67 41 67 67  e(pParse, regAgg
21b40 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20 69 66 28  , nArg);.    if(
21b50 20 61 64 64 72 4e 65 78 74 20 29 7b 0a 20 20 20   addrNext ){.   
21b60 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
21b70 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64  solveLabel(v, ad
21b80 64 72 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 73  drNext);.      s
21b90 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43  qlite3ExprCacheC
21ba0 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20  lear(pParse);.  
21bb0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65    }.  }..  /* Be
21bc0 66 6f 72 65 20 70 6f 70 75 6c 61 74 69 6e 67 20  fore populating 
21bd0 74 68 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20  the accumulator 
21be0 72 65 67 69 73 74 65 72 73 2c 20 63 6c 65 61 72  registers, clear
21bf0 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68   the column cach
21c00 65 2e 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69 73  e..  ** Otherwis
21c10 65 2c 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65  e, if any of the
21c20 20 72 65 71 75 69 72 65 64 20 63 6f 6c 75 6d 6e   required column
21c30 20 76 61 6c 75 65 73 20 61 72 65 20 61 6c 72 65   values are alre
21c40 61 64 79 20 70 72 65 73 65 6e 74 20 0a 20 20 2a  ady present .  *
21c50 2a 20 69 6e 20 72 65 67 69 73 74 65 72 73 2c 20  * in registers, 
21c60 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
21c70 29 20 6d 61 79 20 75 73 65 20 4f 50 5f 53 43 6f  ) may use OP_SCo
21c80 70 79 20 74 6f 20 63 6f 70 79 20 74 68 65 20 76  py to copy the v
21c90 61 6c 75 65 0a 20 20 2a 2a 20 74 6f 20 70 43 2d  alue.  ** to pC-
21ca0 3e 69 4d 65 6d 2e 20 42 75 74 20 62 79 20 74 68  >iMem. But by th
21cb0 65 20 74 69 6d 65 20 74 68 65 20 76 61 6c 75 65  e time the value
21cc0 20 69 73 20 75 73 65 64 2c 20 74 68 65 20 6f 72   is used, the or
21cd0 69 67 69 6e 61 6c 20 72 65 67 69 73 74 65 72 0a  iginal register.
21ce0 20 20 2a 2a 20 6d 61 79 20 68 61 76 65 20 62 65    ** may have be
21cf0 65 6e 20 75 73 65 64 2c 20 69 6e 76 61 6c 69 64  en used, invalid
21d00 61 74 69 6e 67 20 74 68 65 20 75 6e 64 65 72 6c  ating the underl
21d10 79 69 6e 67 20 62 75 66 66 65 72 20 68 6f 6c 64  ying buffer hold
21d20 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 74 65 78  ing the.  ** tex
21d30 74 20 6f 72 20 62 6c 6f 62 20 76 61 6c 75 65 2e  t or blob value.
21d40 20 53 65 65 20 74 69 63 6b 65 74 20 5b 38 38 33   See ticket [883
21d50 30 33 34 64 63 62 35 5d 2e 0a 20 20 2a 2a 0a 20  034dcb5]..  **. 
21d60 20 2a 2a 20 41 6e 6f 74 68 65 72 20 73 6f 6c 75   ** Another solu
21d70 74 69 6f 6e 20 77 6f 75 6c 64 20 62 65 20 74 6f  tion would be to
21d80 20 63 68 61 6e 67 65 20 74 68 65 20 4f 50 5f 53   change the OP_S
21d90 43 6f 70 79 20 75 73 65 64 20 74 6f 20 63 6f 70  Copy used to cop
21da0 79 20 63 61 63 68 65 64 0a 20 20 2a 2a 20 76 61  y cached.  ** va
21db0 6c 75 65 73 20 74 6f 20 61 6e 20 4f 50 5f 43 6f  lues to an OP_Co
21dc0 70 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  py..  */.  if( r
21dd0 65 67 48 69 74 20 29 7b 0a 20 20 20 20 61 64 64  egHit ){.    add
21de0 72 48 69 74 54 65 73 74 20 3d 20 73 71 6c 69 74  rHitTest = sqlit
21df0 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
21e00 4f 50 5f 49 66 2c 20 72 65 67 48 69 74 29 3b 0a  OP_If, regHit);.
21e10 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70    }.  sqlite3Exp
21e20 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72  rCacheClear(pPar
21e30 73 65 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20  se);.  for(i=0, 
21e40 70 43 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f  pC=pAggInfo->aCo
21e50 6c 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e  l; i<pAggInfo->n
21e60 41 63 63 75 6d 75 6c 61 74 6f 72 3b 20 69 2b 2b  Accumulator; i++
21e70 2c 20 70 43 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  , pC++){.    sql
21e80 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
21e90 72 73 65 2c 20 70 43 2d 3e 70 45 78 70 72 2c 20  rse, pC->pExpr, 
21ea0 70 43 2d 3e 69 4d 65 6d 29 3b 0a 20 20 7d 0a 20  pC->iMem);.  }. 
21eb0 20 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63   pAggInfo->direc
21ec0 74 4d 6f 64 65 20 3d 20 30 3b 0a 20 20 73 71 6c  tMode = 0;.  sql
21ed0 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65  ite3ExprCacheCle
21ee0 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  ar(pParse);.  if
21ef0 28 20 61 64 64 72 48 69 74 54 65 73 74 20 29 7b  ( addrHitTest ){
21f00 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
21f10 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
21f20 48 69 74 54 65 73 74 29 3b 0a 20 20 7d 0a 7d 0a  HitTest);.  }.}.
21f30 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 73 69 6e  ./*.** Add a sin
21f40 67 6c 65 20 4f 50 5f 45 78 70 6c 61 69 6e 20 69  gle OP_Explain i
21f50 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 74 68  nstruction to th
21f60 65 20 56 44 42 45 20 74 6f 20 65 78 70 6c 61 69  e VDBE to explai
21f70 6e 20 61 20 73 69 6d 70 6c 65 0a 2a 2a 20 63 6f  n a simple.** co
21f80 75 6e 74 28 2a 29 20 71 75 65 72 79 20 28 22 53  unt(*) query ("S
21f90 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
21fa0 52 4f 4d 20 70 54 61 62 22 29 2e 0a 2a 2f 0a 23  ROM pTab")..*/.#
21fb0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
21fc0 49 54 5f 45 58 50 4c 41 49 4e 0a 73 74 61 74 69  IT_EXPLAIN.stati
21fd0 63 20 76 6f 69 64 20 65 78 70 6c 61 69 6e 53 69  c void explainSi
21fe0 6d 70 6c 65 43 6f 75 6e 74 28 0a 20 20 50 61 72  mpleCount(.  Par
21ff0 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
22000 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22010 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f  Parse context */
22020 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20  .  Table *pTab, 
22030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22040 20 20 20 2f 2a 20 54 61 62 6c 65 20 62 65 69 6e     /* Table bein
22050 67 20 71 75 65 72 69 65 64 20 2a 2f 0a 20 20 49  g queried */.  I
22060 6e 64 65 78 20 2a 70 49 64 78 20 20 20 20 20 20  ndex *pIdx      
22070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22080 2a 20 49 6e 64 65 78 20 75 73 65 64 20 74 6f 20  * Index used to 
22090 6f 70 74 69 6d 69 7a 65 20 73 63 61 6e 2c 20 6f  optimize scan, o
220a0 72 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69  r NULL */.){.  i
220b0 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61  f( pParse->expla
220c0 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 63 68 61  in==2 ){.    cha
220d0 72 20 2a 7a 45 71 70 20 3d 20 73 71 6c 69 74 65  r *zEqp = sqlite
220e0 33 4d 50 72 69 6e 74 66 28 70 50 61 72 73 65 2d  3MPrintf(pParse-
220f0 3e 64 62 2c 20 22 53 43 41 4e 20 54 41 42 4c 45  >db, "SCAN TABLE
22100 20 25 73 25 73 25 73 22 2c 0a 20 20 20 20 20 20   %s%s%s",.      
22110 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 0a    pTab->zName, .
22120 20 20 20 20 20 20 20 20 70 49 64 78 20 3f 20 22          pIdx ? "
22130 20 55 53 49 4e 47 20 43 4f 56 45 52 49 4e 47 20   USING COVERING 
22140 49 4e 44 45 58 20 22 20 3a 20 22 22 2c 0a 20 20  INDEX " : "",.  
22150 20 20 20 20 20 20 70 49 64 78 20 3f 20 70 49 64        pIdx ? pId
22160 78 2d 3e 7a 4e 61 6d 65 20 3a 20 22 22 0a 20 20  x->zName : "".  
22170 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33    );.    sqlite3
22180 56 64 62 65 41 64 64 4f 70 34 28 0a 20 20 20 20  VdbeAddOp4(.    
22190 20 20 20 20 70 50 61 72 73 65 2d 3e 70 56 64 62      pParse->pVdb
221a0 65 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 70  e, OP_Explain, p
221b0 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64  Parse->iSelectId
221c0 2c 20 30 2c 20 30 2c 20 7a 45 71 70 2c 20 50 34  , 0, 0, zEqp, P4
221d0 5f 44 59 4e 41 4d 49 43 0a 20 20 20 20 29 3b 0a  _DYNAMIC.    );.
221e0 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65    }.}.#else.# de
221f0 66 69 6e 65 20 65 78 70 6c 61 69 6e 53 69 6d 70  fine explainSimp
22200 6c 65 43 6f 75 6e 74 28 61 2c 62 2c 63 29 0a 23  leCount(a,b,c).#
22210 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  endif../*.** Gen
22220 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74  erate code for t
22230 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
22240 65 6e 74 20 67 69 76 65 6e 20 69 6e 20 74 68 65  ent given in the
22250 20 70 20 61 72 67 75 6d 65 6e 74 2e 20 20 0a 2a   p argument.  .*
22260 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 73  *.** The results
22270 20 61 72 65 20 64 69 73 74 72 69 62 75 74 65 64   are distributed
22280 20 69 6e 20 76 61 72 69 6f 75 73 20 77 61 79 73   in various ways
22290 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68   depending on th
222a0 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66  e.** contents of
222b0 20 74 68 65 20 53 65 6c 65 63 74 44 65 73 74 20   the SelectDest 
222c0 73 74 72 75 63 74 75 72 65 20 70 6f 69 6e 74 65  structure pointe
222d0 64 20 74 6f 20 62 79 20 61 72 67 75 6d 65 6e 74  d to by argument
222e0 20 70 44 65 73 74 0a 2a 2a 20 61 73 20 66 6f 6c   pDest.** as fol
222f0 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  lows:.**.**     
22300 70 44 65 73 74 2d 3e 65 44 65 73 74 20 20 20 20  pDest->eDest    
22310 52 65 73 75 6c 74 0a 2a 2a 20 20 20 20 20 2d 2d  Result.**     --
22320 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 2d 2d  ----------    --
22330 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
22340 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
22350 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20  ---------.**    
22360 20 53 52 54 5f 4f 75 74 70 75 74 20 20 20 20 20   SRT_Output     
22370 20 47 65 6e 65 72 61 74 65 20 61 20 72 6f 77 20   Generate a row 
22380 6f 66 20 6f 75 74 70 75 74 20 28 75 73 69 6e 67  of output (using
22390 20 74 68 65 20 4f 50 5f 52 65 73 75 6c 74 52 6f   the OP_ResultRo
223a0 77 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  w.**            
223b0 20 20 20 20 20 20 20 20 20 6f 70 63 6f 64 65 29           opcode)
223c0 20 66 6f 72 20 65 61 63 68 20 72 6f 77 20 69 6e   for each row in
223d0 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e   the result set.
223e0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 4d  .**.**     SRT_M
223f0 65 6d 20 20 20 20 20 20 20 20 20 4f 6e 6c 79 20  em         Only 
22400 76 61 6c 69 64 20 69 66 20 74 68 65 20 72 65 73  valid if the res
22410 75 6c 74 20 69 73 20 61 20 73 69 6e 67 6c 65 20  ult is a single 
22420 63 6f 6c 75 6d 6e 2e 0a 2a 2a 20 20 20 20 20 20  column..**      
22430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
22440 74 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 63  tore the first c
22450 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 66 69 72  olumn of the fir
22460 73 74 20 72 65 73 75 6c 74 20 72 6f 77 0a 2a 2a  st result row.**
22470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22480 20 20 20 20 20 69 6e 20 72 65 67 69 73 74 65 72       in register
22490 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 20   pDest->iSDParm 
224a0 74 68 65 6e 20 61 62 61 6e 64 6f 6e 20 74 68 65  then abandon the
224b0 20 72 65 73 74 0a 2a 2a 20 20 20 20 20 20 20 20   rest.**        
224c0 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 20               of 
224d0 74 68 65 20 71 75 65 72 79 2e 20 20 54 68 69 73  the query.  This
224e0 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 69 6d 70   destination imp
224f0 6c 69 65 73 20 22 4c 49 4d 49 54 20 31 22 2e 0a  lies "LIMIT 1"..
22500 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 53 65  **.**     SRT_Se
22510 74 20 20 20 20 20 20 20 20 20 54 68 65 20 72 65  t         The re
22520 73 75 6c 74 20 6d 75 73 74 20 62 65 20 61 20 73  sult must be a s
22530 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 2e 20 20 53  ingle column.  S
22540 74 6f 72 65 20 65 61 63 68 0a 2a 2a 20 20 20 20  tore each.**    
22550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22560 20 72 6f 77 20 6f 66 20 72 65 73 75 6c 74 20 61   row of result a
22570 73 20 74 68 65 20 6b 65 79 20 69 6e 20 74 61 62  s the key in tab
22580 6c 65 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72  le pDest->iSDPar
22590 6d 2e 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  m. .**          
225a0 20 20 20 20 20 20 20 20 20 20 20 41 70 70 6c 79             Apply
225b0 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 70 44   the affinity pD
225c0 65 73 74 2d 3e 61 66 66 53 64 73 74 20 62 65 66  est->affSdst bef
225d0 6f 72 65 20 73 74 6f 72 69 6e 67 0a 2a 2a 20 20  ore storing.**  
225e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
225f0 20 20 20 72 65 73 75 6c 74 73 2e 20 20 55 73 65     results.  Use
22600 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 22  d to implement "
22610 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22  IN (SELECT ...)"
22620 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f  ..**.**     SRT_
22630 55 6e 69 6f 6e 20 20 20 20 20 20 20 53 74 6f 72  Union       Stor
22640 65 20 72 65 73 75 6c 74 73 20 61 73 20 61 20 6b  e results as a k
22650 65 79 20 69 6e 20 61 20 74 65 6d 70 6f 72 61 72  ey in a temporar
22660 79 20 74 61 62 6c 65 20 0a 2a 2a 20 20 20 20 20  y table .**     
22670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22680 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 70 44  identified by pD
22690 65 73 74 2d 3e 69 53 44 50 61 72 6d 2e 0a 2a 2a  est->iSDParm..**
226a0 0a 2a 2a 20 20 20 20 20 53 52 54 5f 45 78 63 65  .**     SRT_Exce
226b0 70 74 20 20 20 20 20 20 52 65 6d 6f 76 65 20 72  pt      Remove r
226c0 65 73 75 6c 74 73 20 66 72 6f 6d 20 74 68 65 20  esults from the 
226d0 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
226e0 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 2e 0a  pDest->iSDParm..
226f0 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 54 61  **.**     SRT_Ta
22700 62 6c 65 20 20 20 20 20 20 20 53 74 6f 72 65 20  ble       Store 
22710 72 65 73 75 6c 74 73 20 69 6e 20 74 65 6d 70 6f  results in tempo
22720 72 61 72 79 20 74 61 62 6c 65 20 70 44 65 73 74  rary table pDest
22730 2d 3e 69 53 44 50 61 72 6d 2e 0a 2a 2a 20 20 20  ->iSDParm..**   
22740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22750 20 20 54 68 69 73 20 69 73 20 6c 69 6b 65 20 53    This is like S
22760 52 54 5f 45 70 68 65 6d 54 61 62 20 65 78 63 65  RT_EphemTab exce
22770 70 74 20 74 68 61 74 20 74 68 65 20 74 61 62 6c  pt that the tabl
22780 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
22790 20 20 20 20 20 20 20 20 20 69 73 20 61 73 73 75           is assu
227a0 6d 65 64 20 74 6f 20 61 6c 72 65 61 64 79 20 62  med to already b
227b0 65 20 6f 70 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20  e open..**.**   
227c0 20 20 53 52 54 5f 45 70 68 65 6d 54 61 62 20 20    SRT_EphemTab  
227d0 20 20 43 72 65 61 74 65 20 61 6e 20 74 65 6d 70    Create an temp
227e0 6f 72 61 72 79 20 74 61 62 6c 65 20 70 44 65 73  orary table pDes
227f0 74 2d 3e 69 53 44 50 61 72 6d 20 61 6e 64 20 73  t->iSDParm and s
22800 74 6f 72 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  tore.**         
22810 20 20 20 20 20 20 20 20 20 20 20 20 74 68 65 20              the 
22820 72 65 73 75 6c 74 20 74 68 65 72 65 2e 20 54 68  result there. Th
22830 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74  e cursor is left
22840 20 6f 70 65 6e 20 61 66 74 65 72 0a 2a 2a 20 20   open after.**  
22850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22860 20 20 20 72 65 74 75 72 6e 69 6e 67 2e 20 20 54     returning.  T
22870 68 69 73 20 69 73 20 6c 69 6b 65 20 53 52 54 5f  his is like SRT_
22880 54 61 62 6c 65 20 65 78 63 65 70 74 20 74 68 61  Table except tha
22890 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
228a0 20 20 20 20 20 20 20 20 20 74 68 69 73 20 64 65           this de
228b0 73 74 69 6e 61 74 69 6f 6e 20 75 73 65 73 20 4f  stination uses O
228c0 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20  P_OpenEphemeral 
228d0 74 6f 20 63 72 65 61 74 65 0a 2a 2a 20 20 20 20  to create.**    
228e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
228f0 20 74 68 65 20 74 61 62 6c 65 20 66 69 72 73 74   the table first
22900 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f  ..**.**     SRT_
22910 43 6f 72 6f 75 74 69 6e 65 20 20 20 47 65 6e 65  Coroutine   Gene
22920 72 61 74 65 20 61 20 63 6f 2d 72 6f 75 74 69 6e  rate a co-routin
22930 65 20 74 68 61 74 20 72 65 74 75 72 6e 73 20 61  e that returns a
22940 20 6e 65 77 20 72 6f 77 20 6f 66 0a 2a 2a 20 20   new row of.**  
22950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22960 20 20 20 72 65 73 75 6c 74 73 20 65 61 63 68 20     results each 
22970 74 69 6d 65 20 69 74 20 69 73 20 69 6e 76 6f 6b  time it is invok
22980 65 64 2e 20 20 54 68 65 20 65 6e 74 72 79 20 70  ed.  The entry p
22990 6f 69 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  oint.**         
229a0 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 20 74              of t
229b0 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20 69 73  he co-routine is
229c0 20 73 74 6f 72 65 64 20 69 6e 20 72 65 67 69 73   stored in regis
229d0 74 65 72 20 70 44 65 73 74 2d 3e 69 53 44 50 61  ter pDest->iSDPa
229e0 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52  rm..**.**     SR
229f0 54 5f 45 78 69 73 74 73 20 20 20 20 20 20 53 74  T_Exists      St
22a00 6f 72 65 20 61 20 31 20 69 6e 20 6d 65 6d 6f 72  ore a 1 in memor
22a10 79 20 63 65 6c 6c 20 70 44 65 73 74 2d 3e 69 53  y cell pDest->iS
22a20 44 50 61 72 6d 20 69 66 20 74 68 65 20 72 65 73  DParm if the res
22a30 75 6c 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ult.**          
22a40 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 69             set i
22a50 73 20 6e 6f 74 20 65 6d 70 74 79 2e 0a 2a 2a 0a  s not empty..**.
22a60 2a 2a 20 20 20 20 20 53 52 54 5f 44 69 73 63 61  **     SRT_Disca
22a70 72 64 20 20 20 20 20 54 68 72 6f 77 20 74 68 65  rd     Throw the
22a80 20 72 65 73 75 6c 74 73 20 61 77 61 79 2e 20 20   results away.  
22a90 54 68 69 73 20 69 73 20 75 73 65 64 20 62 79 20  This is used by 
22aa0 53 45 4c 45 43 54 0a 2a 2a 20 20 20 20 20 20 20  SELECT.**       
22ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74                st
22ac0 61 74 65 6d 65 6e 74 73 20 77 69 74 68 69 6e 20  atements within 
22ad0 74 72 69 67 67 65 72 73 20 77 68 6f 73 65 20 6f  triggers whose o
22ae0 6e 6c 79 20 70 75 72 70 6f 73 65 20 69 73 0a 2a  nly purpose is.*
22af0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
22b00 20 20 20 20 20 20 74 68 65 20 73 69 64 65 2d 65        the side-e
22b10 66 66 65 63 74 73 20 6f 66 20 66 75 6e 63 74 69  ffects of functi
22b20 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ons..**.** This 
22b30 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
22b40 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72  the number of er
22b50 72 6f 72 73 2e 20 20 49 66 20 61 6e 79 20 65 72  rors.  If any er
22b60 72 6f 72 73 20 61 72 65 0a 2a 2a 20 65 6e 63 6f  rors are.** enco
22b70 75 6e 74 65 72 65 64 2c 20 74 68 65 6e 20 61 6e  untered, then an
22b80 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72   appropriate err
22b90 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 6c 65  or message is le
22ba0 66 74 20 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2d  ft in.** pParse-
22bb0 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20  >zErrMsg..**.** 
22bc0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65  This routine doe
22bd0 73 20 4e 4f 54 20 66 72 65 65 20 74 68 65 20 53  s NOT free the S
22be0 65 6c 65 63 74 20 73 74 72 75 63 74 75 72 65 20  elect structure 
22bf0 70 61 73 73 65 64 20 69 6e 2e 20 20 54 68 65 0a  passed in.  The.
22c00 2a 2a 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  ** calling funct
22c10 69 6f 6e 20 6e 65 65 64 73 20 74 6f 20 64 6f 20  ion needs to do 
22c20 74 68 61 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  that..*/.int sql
22c30 69 74 65 33 53 65 6c 65 63 74 28 0a 20 20 50 61  ite3Select(.  Pa
22c40 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
22c50 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
22c60 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
22c70 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20  Select *p,      
22c80 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45         /* The SE
22c90 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 62  LECT statement b
22ca0 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20  eing coded. */. 
22cb0 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65   SelectDest *pDe
22cc0 73 74 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20  st      /* What 
22cd0 74 6f 20 64 6f 20 77 69 74 68 20 74 68 65 20 71  to do with the q
22ce0 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a  uery results */.
22cf0 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20  ){.  int i, j;  
22d00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
22d10 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a  oop counters */.
22d20 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
22d30 6e 66 6f 3b 20 20 20 20 20 2f 2a 20 52 65 74 75  nfo;     /* Retu
22d40 72 6e 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 57  rn from sqlite3W
22d50 68 65 72 65 42 65 67 69 6e 28 29 20 2a 2f 0a 20  hereBegin() */. 
22d60 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20   Vdbe *v;       
22d70 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76          /* The v
22d80 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 75  irtual machine u
22d90 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
22da0 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41 67 67  n */.  int isAgg
22db0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
22dc0 20 54 72 75 65 20 66 6f 72 20 73 65 6c 65 63 74   True for select
22dd0 20 6c 69 73 74 73 20 6c 69 6b 65 20 22 63 6f 75   lists like "cou
22de0 6e 74 28 2a 29 22 20 2a 2f 0a 20 20 45 78 70 72  nt(*)" */.  Expr
22df0 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 20 20 20  List *pEList;   
22e00 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 63 6f     /* List of co
22e10 6c 75 6d 6e 73 20 74 6f 20 65 78 74 72 61 63 74  lumns to extract
22e20 2e 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  . */.  SrcList *
22e30 70 54 61 62 4c 69 73 74 3b 20 20 20 20 20 2f 2a  pTabList;     /*
22e40 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20   List of tables 
22e50 74 6f 20 73 65 6c 65 63 74 20 66 72 6f 6d 20 2a  to select from *
22e60 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65  /.  Expr *pWhere
22e70 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ;          /* Th
22e80 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20  e WHERE clause. 
22e90 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a   May be NULL */.
22ea0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
22eb0 65 72 42 79 3b 20 20 20 20 2f 2a 20 54 68 65 20  erBy;    /* The 
22ec0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e  ORDER BY clause.
22ed0 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f    May be NULL */
22ee0 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47 72  .  ExprList *pGr
22ef0 6f 75 70 42 79 3b 20 20 20 20 2f 2a 20 54 68 65  oupBy;    /* The
22f00 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
22f10 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a  .  May be NULL *
22f20 2f 0a 20 20 45 78 70 72 20 2a 70 48 61 76 69 6e  /.  Expr *pHavin
22f30 67 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  g;         /* Th
22f40 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 2e  e HAVING clause.
22f50 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f    May be NULL */
22f60 0a 20 20 69 6e 74 20 72 63 20 3d 20 31 3b 20 20  .  int rc = 1;  
22f70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
22f80 75 65 20 74 6f 20 72 65 74 75 72 6e 20 66 72 6f  ue to return fro
22f90 6d 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  m this function 
22fa0 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 53 6f 72  */.  int addrSor
22fb0 74 49 6e 64 65 78 3b 20 20 20 20 20 2f 2a 20 41  tIndex;     /* A
22fc0 64 64 72 65 73 73 20 6f 66 20 61 6e 20 4f 50 5f  ddress of an OP_
22fd0 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e  OpenEphemeral in
22fe0 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 44  struction */.  D
22ff0 69 73 74 69 6e 63 74 43 74 78 20 73 44 69 73 74  istinctCtx sDist
23000 69 6e 63 74 3b 20 2f 2a 20 49 6e 66 6f 20 6f 6e  inct; /* Info on
23010 20 68 6f 77 20 74 6f 20 63 6f 64 65 20 74 68 65   how to code the
23020 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72   DISTINCT keywor
23030 64 20 2a 2f 0a 20 20 41 67 67 49 6e 66 6f 20 73  d */.  AggInfo s
23040 41 67 67 49 6e 66 6f 3b 20 20 20 20 20 20 2f 2a  AggInfo;      /*
23050 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 75 73 65   Information use
23060 64 20 62 79 20 61 67 67 72 65 67 61 74 65 20 71  d by aggregate q
23070 75 65 72 69 65 73 20 2a 2f 0a 20 20 69 6e 74 20  ueries */.  int 
23080 69 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20  iEnd;           
23090 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
230a0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
230b0 71 75 65 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74  query */.  sqlit
230c0 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20  e3 *db;         
230d0 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
230e0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
230f0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
23100 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 69  OMIT_EXPLAIN.  i
23110 6e 74 20 69 52 65 73 74 6f 72 65 53 65 6c 65 63  nt iRestoreSelec
23120 74 49 64 20 3d 20 70 50 61 72 73 65 2d 3e 69 53  tId = pParse->iS
23130 65 6c 65 63 74 49 64 3b 0a 20 20 70 50 61 72 73  electId;.  pPars
23140 65 2d 3e 69 53 65 6c 65 63 74 49 64 20 3d 20 70  e->iSelectId = p
23150 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65  Parse->iNextSele
23160 63 74 49 64 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a  ctId++;.#endif..
23170 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64    db = pParse->d
23180 62 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c  b;.  if( p==0 ||
23190 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
231a0 64 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72  d || pParse->nEr
231b0 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  r ){.    return 
231c0 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c  1;.  }.  if( sql
231d0 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
231e0 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 53 45 4c  arse, SQLITE_SEL
231f0 45 43 54 2c 20 30 2c 20 30 2c 20 30 29 20 29 20  ECT, 0, 0, 0) ) 
23200 72 65 74 75 72 6e 20 31 3b 0a 20 20 6d 65 6d 73  return 1;.  mems
23210 65 74 28 26 73 41 67 67 49 6e 66 6f 2c 20 30 2c  et(&sAggInfo, 0,
23220 20 73 69 7a 65 6f 66 28 73 41 67 67 49 6e 66 6f   sizeof(sAggInfo
23230 29 29 3b 0a 0a 20 20 69 66 28 20 49 67 6e 6f 72  ));..  if( Ignor
23240 61 62 6c 65 4f 72 64 65 72 62 79 28 70 44 65 73  ableOrderby(pDes
23250 74 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  t) ){.    assert
23260 28 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53  (pDest->eDest==S
23270 52 54 5f 45 78 69 73 74 73 20 7c 7c 20 70 44 65  RT_Exists || pDe
23280 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 55  st->eDest==SRT_U
23290 6e 69 6f 6e 20 7c 7c 20 0a 20 20 20 20 20 20 20  nion || .       
232a0 20 20 20 20 70 44 65 73 74 2d 3e 65 44 65 73 74      pDest->eDest
232b0 3d 3d 53 52 54 5f 45 78 63 65 70 74 20 7c 7c 20  ==SRT_Except || 
232c0 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52  pDest->eDest==SR
232d0 54 5f 44 69 73 63 61 72 64 29 3b 0a 20 20 20 20  T_Discard);.    
232e0 2f 2a 20 49 66 20 4f 52 44 45 52 20 42 59 20 6d  /* If ORDER BY m
232f0 61 6b 65 73 20 6e 6f 20 64 69 66 66 65 72 65 6e  akes no differen
23300 63 65 20 69 6e 20 74 68 65 20 6f 75 74 70 75 74  ce in the output
23310 20 74 68 65 6e 20 6e 65 69 74 68 65 72 20 64 6f   then neither do
23320 65 73 0a 20 20 20 20 2a 2a 20 44 49 53 54 49 4e  es.    ** DISTIN
23330 43 54 20 73 6f 20 69 74 20 63 61 6e 20 62 65 20  CT so it can be 
23340 72 65 6d 6f 76 65 64 20 74 6f 6f 2e 20 2a 2f 0a  removed too. */.
23350 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
23360 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  istDelete(db, p-
23370 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20  >pOrderBy);.    
23380 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b  p->pOrderBy = 0;
23390 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73  .    p->selFlags
233a0 20 26 3d 20 7e 53 46 5f 44 69 73 74 69 6e 63 74   &= ~SF_Distinct
233b0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53  ;.  }.  sqlite3S
233c0 65 6c 65 63 74 50 72 65 70 28 70 50 61 72 73 65  electPrep(pParse
233d0 2c 20 70 2c 20 30 29 3b 0a 20 20 70 4f 72 64 65  , p, 0);.  pOrde
233e0 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42  rBy = p->pOrderB
233f0 79 3b 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20  y;.  pTabList = 
23400 70 2d 3e 70 53 72 63 3b 0a 20 20 70 45 4c 69 73  p->pSrc;.  pELis
23410 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20  t = p->pEList;. 
23420 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
23430 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  r || db->mallocF
23440 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74  ailed ){.    got
23450 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
23460 7d 0a 20 20 69 73 41 67 67 20 3d 20 28 70 2d 3e  }.  isAgg = (p->
23470 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67  selFlags & SF_Ag
23480 67 72 65 67 61 74 65 29 21 3d 30 3b 0a 20 20 61  gregate)!=0;.  a
23490 73 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30  ssert( pEList!=0
234a0 20 29 3b 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20   );..  /* Begin 
234b0 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 64 65 2e  generating code.
234c0 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69  .  */.  v = sqli
234d0 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
234e0 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29  e);.  if( v==0 )
234f0 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
23500 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 72 69 74 69  ;..  /* If writi
23510 6e 67 20 74 6f 20 6d 65 6d 6f 72 79 20 6f 72 20  ng to memory or 
23520 67 65 6e 65 72 61 74 69 6e 67 20 61 20 73 65 74  generating a set
23530 0a 20 20 2a 2a 20 6f 6e 6c 79 20 61 20 73 69 6e  .  ** only a sin
23540 67 6c 65 20 63 6f 6c 75 6d 6e 20 6d 61 79 20 62  gle column may b
23550 65 20 6f 75 74 70 75 74 2e 0a 20 20 2a 2f 0a 23  e output..  */.#
23560 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
23570 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 69 66  IT_SUBQUERY.  if
23580 28 20 63 68 65 63 6b 46 6f 72 4d 75 6c 74 69 43  ( checkForMultiC
23590 6f 6c 75 6d 6e 53 65 6c 65 63 74 45 72 72 6f 72  olumnSelectError
235a0 28 70 50 61 72 73 65 2c 20 70 44 65 73 74 2c 20  (pParse, pDest, 
235b0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 20 29  pEList->nExpr) )
235c0 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63  {.    goto selec
235d0 74 5f 65 6e 64 3b 0a 20 20 7d 0a 23 65 6e 64 69  t_end;.  }.#endi
235e0 66 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  f..  /* Generate
235f0 20 63 6f 64 65 20 66 6f 72 20 61 6c 6c 20 73 75   code for all su
23600 62 2d 71 75 65 72 69 65 73 20 69 6e 20 74 68 65  b-queries in the
23610 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20 2a   FROM clause.  *
23620 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  /.#if !defined(S
23630 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
23640 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  ERY) || !defined
23650 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
23660 57 29 0a 20 20 66 6f 72 28 69 3d 30 3b 20 21 70  W).  for(i=0; !p
23670 2d 3e 70 50 72 69 6f 72 20 26 26 20 69 3c 70 54  ->pPrior && i<pT
23680 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  abList->nSrc; i+
23690 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53  +){.    struct S
236a0 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
236b0 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e  em = &pTabList->
236c0 61 5b 69 5d 3b 0a 20 20 20 20 53 65 6c 65 63 74  a[i];.    Select
236d0 44 65 73 74 20 64 65 73 74 3b 0a 20 20 20 20 53  Dest dest;.    S
236e0 65 6c 65 63 74 20 2a 70 53 75 62 20 3d 20 70 49  elect *pSub = pI
236f0 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20  tem->pSelect;.  
23700 20 20 69 6e 74 20 69 73 41 67 67 53 75 62 3b 0a    int isAggSub;.
23710 0a 20 20 20 20 69 66 28 20 70 53 75 62 3d 3d 30  .    if( pSub==0
23720 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20   ) continue;..  
23730 20 20 2f 2a 20 53 6f 6d 65 74 69 6d 65 73 20 74    /* Sometimes t
23740 68 65 20 63 6f 64 65 20 66 6f 72 20 61 20 73 75  he code for a su
23750 62 71 75 65 72 79 20 77 69 6c 6c 20 62 65 20 67  bquery will be g
23760 65 6e 65 72 61 74 65 64 20 6d 6f 72 65 20 74 68  enerated more th
23770 61 6e 0a 20 20 20 20 2a 2a 20 6f 6e 63 65 2c 20  an.    ** once, 
23780 69 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  if the subquery 
23790 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 57  is part of the W
237a0 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e 20 61  HERE clause in a
237b0 20 4c 45 46 54 20 4a 4f 49 4e 2c 0a 20 20 20 20   LEFT JOIN,.    
237c0 2a 2a 20 66 6f 72 20 65 78 61 6d 70 6c 65 2e 20  ** for example. 
237d0 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 64   In that case, d
237e0 6f 20 6e 6f 74 20 72 65 67 65 6e 65 72 61 74 65  o not regenerate
237f0 20 74 68 65 20 63 6f 64 65 20 74 6f 20 6d 61 6e   the code to man
23800 69 66 65 73 74 0a 20 20 20 20 2a 2a 20 61 20 76  ifest.    ** a v
23810 69 65 77 20 6f 72 20 74 68 65 20 63 6f 2d 72 6f  iew or the co-ro
23820 75 74 69 6e 65 20 74 6f 20 69 6d 70 6c 65 6d 65  utine to impleme
23830 6e 74 20 61 20 76 69 65 77 2e 20 20 54 68 65 20  nt a view.  The 
23840 66 69 72 73 74 20 69 6e 73 74 61 6e 63 65 0a 20  first instance. 
23850 20 20 20 2a 2a 20 69 73 20 73 75 66 66 69 63 69     ** is suffici
23860 65 6e 74 2c 20 74 68 6f 75 67 68 20 74 68 65 20  ent, though the 
23870 73 75 62 72 6f 75 74 69 6e 65 20 74 6f 20 6d 61  subroutine to ma
23880 6e 69 66 65 73 74 20 74 68 65 20 76 69 65 77 20  nifest the view 
23890 64 6f 65 73 20 6e 65 65 64 0a 20 20 20 20 2a 2a  does need.    **
238a0 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20 61   to be invoked a
238b0 67 61 69 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28  gain. */.    if(
238c0 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c   pItem->addrFill
238d0 53 75 62 20 29 7b 0a 20 20 20 20 20 20 69 66 28  Sub ){.      if(
238e0 20 70 49 74 65 6d 2d 3e 76 69 61 43 6f 72 6f 75   pItem->viaCorou
238f0 74 69 6e 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  tine==0 ){.     
23900 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
23910 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
23920 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75  , pItem->regRetu
23930 72 6e 2c 20 70 49 74 65 6d 2d 3e 61 64 64 72 46  rn, pItem->addrF
23940 69 6c 6c 53 75 62 29 3b 0a 20 20 20 20 20 20 7d  illSub);.      }
23950 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b  .      continue;
23960 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
23970 6e 63 72 65 6d 65 6e 74 20 50 61 72 73 65 2e 6e  ncrement Parse.n
23980 48 65 69 67 68 74 20 62 79 20 74 68 65 20 68 65  Height by the he
23990 69 67 68 74 20 6f 66 20 74 68 65 20 6c 61 72 67  ight of the larg
239a0 65 73 74 20 65 78 70 72 65 73 73 69 6f 6e 0a 20  est expression. 
239b0 20 20 20 2a 2a 20 74 72 65 65 20 72 65 66 65 72     ** tree refer
239c0 72 65 64 20 74 6f 20 62 79 20 74 68 69 73 2c 20  red to by this, 
239d0 74 68 65 20 70 61 72 65 6e 74 20 73 65 6c 65 63  the parent selec
239e0 74 2e 20 54 68 65 20 63 68 69 6c 64 20 73 65 6c  t. The child sel
239f0 65 63 74 0a 20 20 20 20 2a 2a 20 6d 61 79 20 63  ect.    ** may c
23a00 6f 6e 74 61 69 6e 20 65 78 70 72 65 73 73 69 6f  ontain expressio
23a10 6e 20 74 72 65 65 73 20 6f 66 20 61 74 20 6d 6f  n trees of at mo
23a20 73 74 0a 20 20 20 20 2a 2a 20 28 53 51 4c 49 54  st.    ** (SQLIT
23a30 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48  E_MAX_EXPR_DEPTH
23a40 2d 50 61 72 73 65 2e 6e 48 65 69 67 68 74 29 20  -Parse.nHeight) 
23a50 68 65 69 67 68 74 2e 20 54 68 69 73 20 69 73 20  height. This is 
23a60 61 20 62 69 74 0a 20 20 20 20 2a 2a 20 6d 6f 72  a bit.    ** mor
23a70 65 20 63 6f 6e 73 65 72 76 61 74 69 76 65 20 74  e conservative t
23a80 68 61 6e 20 6e 65 63 65 73 73 61 72 79 2c 20 62  han necessary, b
23a90 75 74 20 6d 75 63 68 20 65 61 73 69 65 72 20 74  ut much easier t
23aa0 68 61 6e 20 65 6e 66 6f 72 63 69 6e 67 0a 20 20  han enforcing.  
23ab0 20 20 2a 2a 20 61 6e 20 65 78 61 63 74 20 6c 69    ** an exact li
23ac0 6d 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  mit..    */.    
23ad0 70 50 61 72 73 65 2d 3e 6e 48 65 69 67 68 74 20  pParse->nHeight 
23ae0 2b 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  += sqlite3Select
23af0 45 78 70 72 48 65 69 67 68 74 28 70 29 3b 0a 0a  ExprHeight(p);..
23b00 20 20 20 20 69 73 41 67 67 53 75 62 20 3d 20 28      isAggSub = (
23b10 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26  pSub->selFlags &
23b20 20 53 46 5f 41 67 67 72 65 67 61 74 65 29 21 3d   SF_Aggregate)!=
23b30 30 3b 0a 20 20 20 20 69 66 28 20 66 6c 61 74 74  0;.    if( flatt
23b40 65 6e 53 75 62 71 75 65 72 79 28 70 50 61 72 73  enSubquery(pPars
23b50 65 2c 20 70 2c 20 69 2c 20 69 73 41 67 67 2c 20  e, p, i, isAgg, 
23b60 69 73 41 67 67 53 75 62 29 20 29 7b 0a 20 20 20  isAggSub) ){.   
23b70 20 20 20 2f 2a 20 54 68 69 73 20 73 75 62 71 75     /* This subqu
23b80 65 72 79 20 63 61 6e 20 62 65 20 61 62 73 6f 72  ery can be absor
23b90 62 65 64 20 69 6e 74 6f 20 69 74 73 20 70 61 72  bed into its par
23ba0 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66  ent. */.      if
23bb0 28 20 69 73 41 67 67 53 75 62 20 29 7b 0a 20 20  ( isAggSub ){.  
23bc0 20 20 20 20 20 20 69 73 41 67 67 20 3d 20 31 3b        isAgg = 1;
23bd0 0a 20 20 20 20 20 20 20 20 70 2d 3e 73 65 6c 46  .        p->selF
23be0 6c 61 67 73 20 7c 3d 20 53 46 5f 41 67 67 72 65  lags |= SF_Aggre
23bf0 67 61 74 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  gate;.      }.  
23c00 20 20 20 20 69 20 3d 20 2d 31 3b 0a 20 20 20 20      i = -1;.    
23c10 7d 65 6c 73 65 20 69 66 28 20 70 54 61 62 4c 69  }else if( pTabLi
23c20 73 74 2d 3e 6e 53 72 63 3d 3d 31 20 26 26 20 28  st->nSrc==1 && (
23c30 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
23c40 5f 4d 61 74 65 72 69 61 6c 69 7a 65 29 3d 3d 30  _Materialize)==0
23c50 0a 20 20 20 20 20 20 26 26 20 4f 70 74 69 6d 69  .      && Optimi
23c60 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62  zationEnabled(db
23c70 2c 20 53 51 4c 49 54 45 5f 53 75 62 71 43 6f 72  , SQLITE_SubqCor
23c80 6f 75 74 69 6e 65 29 0a 20 20 20 20 29 7b 0a 20  outine).    ){. 
23c90 20 20 20 20 20 2f 2a 20 49 6d 70 6c 65 6d 65 6e       /* Implemen
23ca0 74 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20 74  t a co-routine t
23cb0 68 61 74 20 77 69 6c 6c 20 72 65 74 75 72 6e 20  hat will return 
23cc0 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20  a single row of 
23cd0 74 68 65 20 72 65 73 75 6c 74 0a 20 20 20 20 20  the result.     
23ce0 20 2a 2a 20 73 65 74 20 6f 6e 20 65 61 63 68 20   ** set on each 
23cf0 69 6e 76 6f 63 61 74 69 6f 6e 2e 0a 20 20 20 20  invocation..    
23d00 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61    */.      int a
23d10 64 64 72 54 6f 70 3b 0a 20 20 20 20 20 20 69 6e  ddrTop;.      in
23d20 74 20 61 64 64 72 45 6f 66 3b 0a 20 20 20 20 20  t addrEof;.     
23d30 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72   pItem->regRetur
23d40 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  n = ++pParse->nM
23d50 65 6d 3b 0a 20 20 20 20 20 20 61 64 64 72 45 6f  em;.      addrEo
23d60 66 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  f = ++pParse->nM
23d70 65 6d 3b 0a 20 20 20 20 20 20 2f 2a 20 42 65 66  em;.      /* Bef
23d80 6f 72 65 20 63 6f 64 69 6e 67 20 74 68 65 20 4f  ore coding the O
23d90 50 5f 47 6f 74 6f 20 74 6f 20 6a 75 6d 70 20 74  P_Goto to jump t
23da0 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  o the start of t
23db0 68 65 20 6d 61 69 6e 20 72 6f 75 74 69 6e 65 2c  he main routine,
23dc0 0a 20 20 20 20 20 20 2a 2a 20 65 6e 73 75 72 65  .      ** ensure
23dd0 20 74 68 61 74 20 74 68 65 20 6a 75 6d 70 20 74   that the jump t
23de0 6f 20 74 68 65 20 76 65 72 69 66 79 2d 73 63 68  o the verify-sch
23df0 65 6d 61 20 72 6f 75 74 69 6e 65 20 68 61 73 20  ema routine has 
23e00 61 6c 72 65 61 64 79 0a 20 20 20 20 20 20 2a 2a  already.      **
23e10 20 62 65 65 6e 20 63 6f 64 65 64 2e 20 4f 74 68   been coded. Oth
23e20 65 72 77 69 73 65 2c 20 74 68 65 20 76 65 72 69  erwise, the veri
23e30 66 79 2d 73 63 68 65 6d 61 20 77 6f 75 6c 64 20  fy-schema would 
23e40 6c 69 6b 65 6c 79 20 62 65 20 63 6f 64 65 64 20  likely be coded 
23e50 61 73 20 0a 20 20 20 20 20 20 2a 2a 20 70 61 72  as .      ** par
23e60 74 20 6f 66 20 74 68 65 20 63 6f 2d 72 6f 75 74  t of the co-rout
23e70 69 6e 65 2e 20 49 66 20 74 68 65 20 6d 61 69 6e  ine. If the main
23e80 20 72 6f 75 74 69 6e 65 20 74 68 65 6e 20 61 63   routine then ac
23e90 63 65 73 73 65 64 20 74 68 65 20 0a 20 20 20 20  cessed the .    
23ea0 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 62 65    ** database be
23eb0 66 6f 72 65 20 69 6e 76 6f 6b 69 6e 67 20 74 68  fore invoking th
23ec0 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20 66 6f 72  e co-routine for
23ed0 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   the first time 
23ee0 28 66 6f 72 20 0a 20 20 20 20 20 20 2a 2a 20 65  (for .      ** e
23ef0 78 61 6d 70 6c 65 20 74 6f 20 69 6e 69 74 69 61  xample to initia
23f00 6c 69 7a 65 20 61 20 4c 49 4d 49 54 20 72 65 67  lize a LIMIT reg
23f10 69 73 74 65 72 20 66 72 6f 6d 20 61 20 73 75 62  ister from a sub
23f20 2d 73 65 6c 65 63 74 29 2c 20 69 74 20 77 6f 75  -select), it wou
23f30 6c 64 20 0a 20 20 20 20 20 20 2a 2a 20 62 65 20  ld .      ** be 
23f40 64 6f 69 6e 67 20 73 6f 20 77 69 74 68 6f 75 74  doing so without
23f50 20 68 61 76 69 6e 67 20 76 65 72 69 66 69 65 64   having verified
23f60 20 74 68 65 20 73 63 68 65 6d 61 20 76 65 72 73   the schema vers
23f70 69 6f 6e 20 61 6e 64 20 6f 62 74 61 69 6e 65 64  ion and obtained
23f80 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 72   .      ** the r
23f90 65 71 75 69 72 65 64 20 64 62 20 6c 6f 63 6b 73  equired db locks
23fa0 2e 20 53 65 65 20 74 69 63 6b 65 74 20 64 36 62  . See ticket d6b
23fb0 33 36 62 65 33 38 2e 20 20 2a 2f 0a 20 20 20 20  36be38.  */.    
23fc0 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72    sqlite3CodeVer
23fd0 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65  ifySchema(pParse
23fe0 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  , -1);.      sql
23ff0 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76  ite3VdbeAddOp0(v
24000 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20 20 20  , OP_Goto);.    
24010 20 20 61 64 64 72 54 6f 70 20 3d 20 73 71 6c 69    addrTop = sqli
24020 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
24030 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f 2c 20   OP_OpenPseudo, 
24040 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b  pItem->iCursor);
24050 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
24060 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 31 29  beChangeP5(v, 1)
24070 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
24080 65 6e 74 28 28 76 2c 20 22 63 6f 72 6f 75 74 69  ent((v, "corouti
24090 6e 65 20 66 6f 72 20 25 73 22 2c 20 70 49 74 65  ne for %s", pIte
240a0 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29  m->pTab->zName))
240b0 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 61  ;.      pItem->a
240c0 64 64 72 46 69 6c 6c 53 75 62 20 3d 20 61 64 64  ddrFillSub = add
240d0 72 54 6f 70 3b 0a 20 20 20 20 20 20 73 71 6c 69  rTop;.      sqli
240e0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
240f0 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
24100 61 64 64 72 45 6f 66 29 3b 0a 20 20 20 20 20 20  addrEof);.      
24110 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
24120 65 50 35 28 76 2c 20 31 29 3b 0a 20 20 20 20 20  eP5(v, 1);.     
24130 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
24140 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20 53 52  stInit(&dest, SR
24150 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 70 49 74  T_Coroutine, pIt
24160 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a  em->regReturn);.
24170 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74        explainSet
24180 49 6e 74 65 67 65 72 28 70 49 74 65 6d 2d 3e 69  Integer(pItem->i
24190 53 65 6c 65 63 74 49 64 2c 20 28 75 38 29 70 50  SelectId, (u8)pP
241a0 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63  arse->iNextSelec
241b0 74 49 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  tId);.      sqli
241c0 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
241d0 2c 20 70 53 75 62 2c 20 26 64 65 73 74 29 3b 0a  , pSub, &dest);.
241e0 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 54 61        pItem->pTa
241f0 62 2d 3e 6e 52 6f 77 45 73 74 20 3d 20 28 75 6e  b->nRowEst = (un
24200 73 69 67 6e 65 64 29 70 53 75 62 2d 3e 6e 53 65  signed)pSub->nSe
24210 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20 20 20 70  lectRow;.      p
24220 49 74 65 6d 2d 3e 76 69 61 43 6f 72 6f 75 74 69  Item->viaCorouti
24230 6e 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 73 71  ne = 1;.      sq
24240 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
24250 32 28 76 2c 20 61 64 64 72 54 6f 70 2c 20 64 65  2(v, addrTop, de
24260 73 74 2e 69 53 64 73 74 29 3b 0a 20 20 20 20 20  st.iSdst);.     
24270 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
24280 67 65 50 33 28 76 2c 20 61 64 64 72 54 6f 70 2c  geP3(v, addrTop,
24290 20 64 65 73 74 2e 6e 53 64 73 74 29 3b 0a 20 20   dest.nSdst);.  
242a0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
242b0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
242c0 67 65 72 2c 20 31 2c 20 61 64 64 72 45 6f 66 29  ger, 1, addrEof)
242d0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
242e0 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
242f0 59 69 65 6c 64 2c 20 70 49 74 65 6d 2d 3e 72 65  Yield, pItem->re
24300 67 52 65 74 75 72 6e 29 3b 0a 20 20 20 20 20 20  gReturn);.      
24310 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
24320 22 65 6e 64 20 25 73 22 2c 20 70 49 74 65 6d 2d  "end %s", pItem-
24330 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a  >pTab->zName));.
24340 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
24350 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
24360 72 54 6f 70 2d 31 29 3b 0a 20 20 20 20 20 20 73  rTop-1);.      s
24370 71 6c 69 74 65 33 43 6c 65 61 72 54 65 6d 70 52  qlite3ClearTempR
24380 65 67 43 61 63 68 65 28 70 50 61 72 73 65 29 3b  egCache(pParse);
24390 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
243a0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20    /* Generate a 
243b0 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20  subroutine that 
243c0 77 69 6c 6c 20 66 69 6c 6c 20 61 6e 20 65 70 68  will fill an eph
243d0 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 77 69 74  emeral table wit
243e0 68 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63  h.      ** the c
243f0 6f 6e 74 65 6e 74 20 6f 66 20 74 68 69 73 20 73  ontent of this s
24400 75 62 71 75 65 72 79 2e 20 20 70 49 74 65 6d 2d  ubquery.  pItem-
24410 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 77 69 6c  >addrFillSub wil
24420 6c 20 70 6f 69 6e 74 0a 20 20 20 20 20 20 2a 2a  l point.      **
24430 20 74 6f 20 74 68 65 20 61 64 64 72 65 73 73 20   to the address 
24440 6f 66 20 74 68 65 20 67 65 6e 65 72 61 74 65 64  of the generated
24450 20 73 75 62 72 6f 75 74 69 6e 65 2e 20 20 70 49   subroutine.  pI
24460 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 0a 20  tem->regReturn. 
24470 20 20 20 20 20 2a 2a 20 69 73 20 61 20 72 65 67       ** is a reg
24480 69 73 74 65 72 20 61 6c 6c 6f 63 61 74 65 64 20  ister allocated 
24490 74 6f 20 68 6f 6c 64 20 74 68 65 20 73 75 62 72  to hold the subr
244a0 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 20 61 64  outine return ad
244b0 64 72 65 73 73 0a 20 20 20 20 20 20 2a 2f 0a 20  dress.      */. 
244c0 20 20 20 20 20 69 6e 74 20 74 6f 70 41 64 64 72       int topAddr
244d0 3b 0a 20 20 20 20 20 20 69 6e 74 20 6f 6e 63 65  ;.      int once
244e0 41 64 64 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  Addr = 0;.      
244f0 69 6e 74 20 72 65 74 41 64 64 72 3b 0a 20 20 20  int retAddr;.   
24500 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d     assert( pItem
24510 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 3d 3d 30  ->addrFillSub==0
24520 20 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d   );.      pItem-
24530 3e 72 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70  >regReturn = ++p
24540 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
24550 20 20 20 74 6f 70 41 64 64 72 20 3d 20 73 71 6c     topAddr = sql
24560 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
24570 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
24580 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72   pItem->regRetur
24590 6e 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d  n);.      pItem-
245a0 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 3d 20 74  >addrFillSub = t
245b0 6f 70 41 64 64 72 2b 31 3b 0a 20 20 20 20 20 20  opAddr+1;.      
245c0 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28  VdbeNoopComment(
245d0 28 76 2c 20 22 6d 61 74 65 72 69 61 6c 69 7a 65  (v, "materialize
245e0 20 25 73 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61   %s", pItem->pTa
245f0 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20  b->zName));.    
24600 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 69 73 43    if( pItem->isC
24610 6f 72 72 65 6c 61 74 65 64 3d 3d 30 20 29 7b 0a  orrelated==0 ){.
24620 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
24630 65 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f  e subquery is no
24640 74 20 63 6f 72 72 65 6c 61 74 65 64 20 61 6e 64  t correlated and
24650 20 69 66 20 77 65 20 61 72 65 20 6e 6f 74 20 69   if we are not i
24660 6e 73 69 64 65 20 6f 66 0a 20 20 20 20 20 20 20  nside of.       
24670 20 2a 2a 20 61 20 74 72 69 67 67 65 72 2c 20 74   ** a trigger, t
24680 68 65 6e 20 77 65 20 6f 6e 6c 79 20 6e 65 65 64  hen we only need
24690 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20   to compute the 
246a0 76 61 6c 75 65 20 6f 66 20 74 68 65 20 73 75 62  value of the sub
246b0 71 75 65 72 79 0a 20 20 20 20 20 20 20 20 2a 2a  query.        **
246c0 20 6f 6e 63 65 2e 20 2a 2f 0a 20 20 20 20 20 20   once. */.      
246d0 20 20 6f 6e 63 65 41 64 64 72 20 3d 20 73 71 6c    onceAddr = sql
246e0 69 74 65 33 43 6f 64 65 4f 6e 63 65 28 70 50 61  ite3CodeOnce(pPa
246f0 72 73 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rse);.      }.  
24700 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
24710 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c  tDestInit(&dest,
24720 20 53 52 54 5f 45 70 68 65 6d 54 61 62 2c 20 70   SRT_EphemTab, p
24730 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a  Item->iCursor);.
24740 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74        explainSet
24750 49 6e 74 65 67 65 72 28 70 49 74 65 6d 2d 3e 69  Integer(pItem->i
24760 53 65 6c 65 63 74 49 64 2c 20 28 75 38 29 70 50  SelectId, (u8)pP
24770 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63  arse->iNextSelec
24780 74 49 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  tId);.      sqli
24790 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
247a0 2c 20 70 53 75 62 2c 20 26 64 65 73 74 29 3b 0a  , pSub, &dest);.
247b0 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 54 61        pItem->pTa
247c0 62 2d 3e 6e 52 6f 77 45 73 74 20 3d 20 28 75 6e  b->nRowEst = (un
247d0 73 69 67 6e 65 64 29 70 53 75 62 2d 3e 6e 53 65  signed)pSub->nSe
247e0 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20 20 20 69  lectRow;.      i
247f0 66 28 20 6f 6e 63 65 41 64 64 72 20 29 20 73 71  f( onceAddr ) sq
24800 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
24810 65 28 76 2c 20 6f 6e 63 65 41 64 64 72 29 3b 0a  e(v, onceAddr);.
24820 20 20 20 20 20 20 72 65 74 41 64 64 72 20 3d 20        retAddr = 
24830 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
24840 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20  1(v, OP_Return, 
24850 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e  pItem->regReturn
24860 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
24870 6d 65 6e 74 28 28 76 2c 20 22 65 6e 64 20 25 73  ment((v, "end %s
24880 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e  ", pItem->pTab->
24890 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 73  zName));.      s
248a0 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
248b0 50 31 28 76 2c 20 74 6f 70 41 64 64 72 2c 20 72  P1(v, topAddr, r
248c0 65 74 41 64 64 72 29 3b 0a 20 20 20 20 20 20 73  etAddr);.      s
248d0 71 6c 69 74 65 33 43 6c 65 61 72 54 65 6d 70 52  qlite3ClearTempR
248e0 65 67 43 61 63 68 65 28 70 50 61 72 73 65 29 3b  egCache(pParse);
248f0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 2f  .    }.    if( /
24900 2a 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c  *pParse->nErr ||
24910 2a 2f 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  */ db->mallocFai
24920 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  led ){.      got
24930 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
24940 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e    }.    pParse->
24950 6e 48 65 69 67 68 74 20 2d 3d 20 73 71 6c 69 74  nHeight -= sqlit
24960 65 33 53 65 6c 65 63 74 45 78 70 72 48 65 69 67  e3SelectExprHeig
24970 68 74 28 70 29 3b 0a 20 20 20 20 70 54 61 62 4c  ht(p);.    pTabL
24980 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20  ist = p->pSrc;. 
24990 20 20 20 69 66 28 20 21 49 67 6e 6f 72 61 62 6c     if( !Ignorabl
249a0 65 4f 72 64 65 72 62 79 28 70 44 65 73 74 29 20  eOrderby(pDest) 
249b0 29 7b 0a 20 20 20 20 20 20 70 4f 72 64 65 72 42  ){.      pOrderB
249c0 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b  y = p->pOrderBy;
249d0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 45 4c  .    }.  }.  pEL
249e0 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b  ist = p->pEList;
249f0 0a 23 65 6e 64 69 66 0a 20 20 70 57 68 65 72 65  .#endif.  pWhere
24a00 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20   = p->pWhere;.  
24a10 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47  pGroupBy = p->pG
24a20 72 6f 75 70 42 79 3b 0a 20 20 70 48 61 76 69 6e  roupBy;.  pHavin
24a30 67 20 3d 20 70 2d 3e 70 48 61 76 69 6e 67 3b 0a  g = p->pHaving;.
24a40 20 20 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e    sDistinct.isTn
24a50 63 74 20 3d 20 28 70 2d 3e 73 65 6c 46 6c 61 67  ct = (p->selFlag
24a60 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 29  s & SF_Distinct)
24a70 21 3d 30 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  !=0;..#ifndef SQ
24a80 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
24a90 4e 44 5f 53 45 4c 45 43 54 0a 20 20 2f 2a 20 49  ND_SELECT.  /* I
24aa0 66 20 74 68 65 72 65 20 69 73 20 61 72 65 20 61  f there is are a
24ab0 20 73 65 71 75 65 6e 63 65 20 6f 66 20 71 75 65   sequence of que
24ac0 72 69 65 73 2c 20 64 6f 20 74 68 65 20 65 61 72  ries, do the ear
24ad0 6c 69 65 72 20 6f 6e 65 73 20 66 69 72 73 74 2e  lier ones first.
24ae0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  .  */.  if( p->p
24af0 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 69 66 28  Prior ){.    if(
24b00 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 3d 3d   p->pRightmost==
24b10 30 20 29 7b 0a 20 20 20 20 20 20 53 65 6c 65 63  0 ){.      Selec
24b20 74 20 2a 70 4c 6f 6f 70 2c 20 2a 70 52 69 67 68  t *pLoop, *pRigh
24b30 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74  t = 0;.      int
24b40 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20 20   cnt = 0;.      
24b50 69 6e 74 20 6d 78 53 65 6c 65 63 74 3b 0a 20 20  int mxSelect;.  
24b60 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 3b      for(pLoop=p;
24b70 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c   pLoop; pLoop=pL
24b80 6f 6f 70 2d 3e 70 50 72 69 6f 72 2c 20 63 6e 74  oop->pPrior, cnt
24b90 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 6f  ++){.        pLo
24ba0 6f 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 20 3d  op->pRightmost =
24bb0 20 70 3b 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f   p;.        pLoo
24bc0 70 2d 3e 70 4e 65 78 74 20 3d 20 70 52 69 67 68  p->pNext = pRigh
24bd0 74 3b 0a 20 20 20 20 20 20 20 20 70 52 69 67 68  t;.        pRigh
24be0 74 20 3d 20 70 4c 6f 6f 70 3b 0a 20 20 20 20 20  t = pLoop;.     
24bf0 20 7d 0a 20 20 20 20 20 20 6d 78 53 65 6c 65 63   }.      mxSelec
24c00 74 20 3d 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 53  t = db->aLimit[S
24c10 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4d 50  QLITE_LIMIT_COMP
24c20 4f 55 4e 44 5f 53 45 4c 45 43 54 5d 3b 0a 20 20  OUND_SELECT];.  
24c30 20 20 20 20 69 66 28 20 6d 78 53 65 6c 65 63 74      if( mxSelect
24c40 20 26 26 20 63 6e 74 3e 6d 78 53 65 6c 65 63 74   && cnt>mxSelect
24c50 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
24c60 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
24c70 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 74 65  se, "too many te
24c80 72 6d 73 20 69 6e 20 63 6f 6d 70 6f 75 6e 64 20  rms in compound 
24c90 53 45 4c 45 43 54 22 29 3b 0a 20 20 20 20 20 20  SELECT");.      
24ca0 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e    goto select_en
24cb0 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  d;.      }.    }
24cc0 0a 20 20 20 20 72 63 20 3d 20 6d 75 6c 74 69 53  .    rc = multiS
24cd0 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c  elect(pParse, p,
24ce0 20 70 44 65 73 74 29 3b 0a 20 20 20 20 65 78 70   pDest);.    exp
24cf0 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 70  lainSetInteger(p
24d00 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64  Parse->iSelectId
24d10 2c 20 69 52 65 73 74 6f 72 65 53 65 6c 65 63 74  , iRestoreSelect
24d20 49 64 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  Id);.    return 
24d30 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  rc;.  }.#endif..
24d40 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
24d50 20 62 6f 74 68 20 61 20 47 52 4f 55 50 20 42 59   both a GROUP BY
24d60 20 61 6e 64 20 61 6e 20 4f 52 44 45 52 20 42 59   and an ORDER BY
24d70 20 63 6c 61 75 73 65 20 61 6e 64 20 74 68 65 79   clause and they
24d80 20 61 72 65 0a 20 20 2a 2a 20 69 64 65 6e 74 69   are.  ** identi
24d90 63 61 6c 2c 20 74 68 65 6e 20 64 69 73 61 62 6c  cal, then disabl
24da0 65 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  e the ORDER BY c
24db0 6c 61 75 73 65 20 73 69 6e 63 65 20 74 68 65 20  lause since the 
24dc0 47 52 4f 55 50 20 42 59 0a 20 20 2a 2a 20 77 69  GROUP BY.  ** wi
24dd0 6c 6c 20 63 61 75 73 65 20 65 6c 65 6d 65 6e 74  ll cause element
24de0 73 20 74 6f 20 63 6f 6d 65 20 6f 75 74 20 69 6e  s to come out in
24df0 20 74 68 65 20 63 6f 72 72 65 63 74 20 6f 72 64   the correct ord
24e00 65 72 2e 20 20 54 68 69 73 20 69 73 0a 20 20 2a  er.  This is.  *
24e10 2a 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f  * an optimizatio
24e20 6e 20 2d 20 74 68 65 20 63 6f 72 72 65 63 74 20  n - the correct 
24e30 61 6e 73 77 65 72 20 73 68 6f 75 6c 64 20 72 65  answer should re
24e40 73 75 6c 74 20 72 65 67 61 72 64 6c 65 73 73 2e  sult regardless.
24e50 0a 20 20 2a 2a 20 55 73 65 20 74 68 65 20 53 51  .  ** Use the SQ
24e60 4c 49 54 45 5f 47 72 6f 75 70 42 79 4f 72 64 65  LITE_GroupByOrde
24e70 72 20 66 6c 61 67 20 77 69 74 68 20 53 51 4c 49  r flag with SQLI
24e80 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54 49  TE_TESTCTRL_OPTI
24e90 4d 49 5a 45 52 0a 20 20 2a 2a 20 74 6f 20 64 69  MIZER.  ** to di
24ea0 73 61 62 6c 65 20 74 68 69 73 20 6f 70 74 69 6d  sable this optim
24eb0 69 7a 61 74 69 6f 6e 20 66 6f 72 20 74 65 73 74  ization for test
24ec0 69 6e 67 20 70 75 72 70 6f 73 65 73 2e 0a 20 20  ing purposes..  
24ed0 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  */.  if( sqlite3
24ee0 45 78 70 72 4c 69 73 74 43 6f 6d 70 61 72 65 28  ExprListCompare(
24ef0 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 70 4f 72  p->pGroupBy, pOr
24f00 64 65 72 42 79 2c 20 2d 31 29 3d 3d 30 0a 20 20  derBy, -1)==0.  
24f10 20 20 20 20 20 20 20 26 26 20 4f 70 74 69 6d 69         && Optimi
24f20 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62  zationEnabled(db
24f30 2c 20 53 51 4c 49 54 45 5f 47 72 6f 75 70 42 79  , SQLITE_GroupBy
24f40 4f 72 64 65 72 29 20 29 7b 0a 20 20 20 20 70 4f  Order) ){.    pO
24f50 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 7d 0a  rderBy = 0;.  }.
24f60 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 71 75 65  .  /* If the que
24f70 72 79 20 69 73 20 44 49 53 54 49 4e 43 54 20 77  ry is DISTINCT w
24f80 69 74 68 20 61 6e 20 4f 52 44 45 52 20 42 59 20  ith an ORDER BY 
24f90 62 75 74 20 69 73 20 6e 6f 74 20 61 6e 20 61 67  but is not an ag
24fa0 67 72 65 67 61 74 65 2c 20 61 6e 64 20 0a 20 20  gregate, and .  
24fb0 2a 2a 20 69 66 20 74 68 65 20 73 65 6c 65 63 74  ** if the select
24fc0 2d 6c 69 73 74 20 69 73 20 74 68 65 20 73 61 6d  -list is the sam
24fd0 65 20 61 73 20 74 68 65 20 4f 52 44 45 52 20 42  e as the ORDER B
24fe0 59 20 6c 69 73 74 2c 20 74 68 65 6e 20 74 68 69  Y list, then thi
24ff0 73 20 71 75 65 72 79 0a 20 20 2a 2a 20 63 61 6e  s query.  ** can
25000 20 62 65 20 72 65 77 72 69 74 74 65 6e 20 61 73   be rewritten as
25010 20 61 20 47 52 4f 55 50 20 42 59 2e 20 49 6e 20   a GROUP BY. In 
25020 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68 69  other words, thi
25030 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  s:.  **.  **    
25040 20 53 45 4c 45 43 54 20 44 49 53 54 49 4e 43 54   SELECT DISTINCT
25050 20 78 79 7a 20 46 52 4f 4d 20 2e 2e 2e 20 4f 52   xyz FROM ... OR
25060 44 45 52 20 42 59 20 78 79 7a 0a 20 20 2a 2a 0a  DER BY xyz.  **.
25070 20 20 2a 2a 20 69 73 20 74 72 61 6e 73 66 6f 72    ** is transfor
25080 6d 65 64 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a  med to:.  **.  *
25090 2a 20 20 20 20 20 53 45 4c 45 43 54 20 78 79 7a  *     SELECT xyz
250a0 20 46 52 4f 4d 20 2e 2e 2e 20 47 52 4f 55 50 20   FROM ... GROUP 
250b0 42 59 20 78 79 7a 0a 20 20 2a 2a 0a 20 20 2a 2a  BY xyz.  **.  **
250c0 20 54 68 65 20 73 65 63 6f 6e 64 20 66 6f 72 6d   The second form
250d0 20 69 73 20 70 72 65 66 65 72 72 65 64 20 61 73   is preferred as
250e0 20 61 20 73 69 6e 67 6c 65 20 69 6e 64 65 78 20   a single index 
250f0 28 6f 72 20 74 65 6d 70 2d 74 61 62 6c 65 29 20  (or temp-table) 
25100 6d 61 79 20 62 65 20 0a 20 20 2a 2a 20 75 73 65  may be .  ** use
25110 64 20 66 6f 72 20 62 6f 74 68 20 74 68 65 20 4f  d for both the O
25120 52 44 45 52 20 42 59 20 61 6e 64 20 44 49 53 54  RDER BY and DIST
25130 49 4e 43 54 20 70 72 6f 63 65 73 73 69 6e 67 2e  INCT processing.
25140 20 41 73 20 6f 72 69 67 69 6e 61 6c 6c 79 20 0a   As originally .
25150 20 20 2a 2a 20 77 72 69 74 74 65 6e 20 74 68 65    ** written the
25160 20 71 75 65 72 79 20 6d 75 73 74 20 75 73 65 20   query must use 
25170 61 20 74 65 6d 70 2d 74 61 62 6c 65 20 66 6f 72  a temp-table for
25180 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 66   at least one of
25190 20 74 68 65 20 4f 52 44 45 52 20 0a 20 20 2a 2a   the ORDER .  **
251a0 20 42 59 20 61 6e 64 20 44 49 53 54 49 4e 43 54   BY and DISTINCT
251b0 2c 20 61 6e 64 20 61 6e 20 69 6e 64 65 78 20 6f  , and an index o
251c0 72 20 73 65 70 61 72 61 74 65 20 74 65 6d 70 2d  r separate temp-
251d0 74 61 62 6c 65 20 66 6f 72 20 74 68 65 20 6f 74  table for the ot
251e0 68 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  her..  */.  if( 
251f0 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28  (p->selFlags & (
25200 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41  SF_Distinct|SF_A
25210 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 44  ggregate))==SF_D
25220 69 73 74 69 6e 63 74 20 0a 20 20 20 26 26 20 73  istinct .   && s
25230 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43 6f  qlite3ExprListCo
25240 6d 70 61 72 65 28 70 4f 72 64 65 72 42 79 2c 20  mpare(pOrderBy, 
25250 70 2d 3e 70 45 4c 69 73 74 2c 20 2d 31 29 3d 3d  p->pEList, -1)==
25260 30 0a 20 20 29 7b 0a 20 20 20 20 70 2d 3e 73 65  0.  ){.    p->se
25270 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f 44 69  lFlags &= ~SF_Di
25280 73 74 69 6e 63 74 3b 0a 20 20 20 20 70 2d 3e 70  stinct;.    p->p
25290 47 72 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65  GroupBy = sqlite
252a0 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c  3ExprListDup(db,
252b0 20 70 2d 3e 70 45 4c 69 73 74 2c 20 30 29 3b 0a   p->pEList, 0);.
252c0 20 20 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70      pGroupBy = p
252d0 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20  ->pGroupBy;.    
252e0 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  pOrderBy = 0;.  
252f0 20 20 2f 2a 20 4e 6f 74 69 63 65 20 74 68 61 74    /* Notice that
25300 20 65 76 65 6e 20 74 68 6f 75 67 68 74 20 53 46   even thought SF
25310 5f 44 69 73 74 69 6e 63 74 20 68 61 73 20 62 65  _Distinct has be
25320 65 6e 20 63 6c 65 61 72 65 64 20 66 72 6f 6d 20  en cleared from 
25330 70 2d 3e 73 65 6c 46 6c 61 67 73 2c 0a 20 20 20  p->selFlags,.   
25340 20 2a 2a 20 74 68 65 20 73 44 69 73 74 69 6e 63   ** the sDistinc
25350 74 2e 69 73 54 6e 63 74 20 69 73 20 73 74 69 6c  t.isTnct is stil
25360 6c 20 73 65 74 2e 20 20 48 65 6e 63 65 2c 20 69  l set.  Hence, i
25370 73 54 6e 63 74 20 72 65 70 72 65 73 65 6e 74 73  sTnct represents
25380 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 72 69 67   the.    ** orig
25390 69 6e 61 6c 20 73 65 74 74 69 6e 67 20 6f 66 20  inal setting of 
253a0 74 68 65 20 53 46 5f 44 69 73 74 69 6e 63 74 20  the SF_Distinct 
253b0 66 6c 61 67 2c 20 6e 6f 74 20 74 68 65 20 63 75  flag, not the cu
253c0 72 72 65 6e 74 20 73 65 74 74 69 6e 67 20 2a 2f  rrent setting */
253d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 44 69  .    assert( sDi
253e0 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 29 3b  stinct.isTnct );
253f0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
25400 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20  ere is an ORDER 
25410 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20  BY clause, then 
25420 74 68 69 73 20 73 6f 72 74 69 6e 67 0a 20 20 2a  this sorting.  *
25430 2a 20 69 6e 64 65 78 20 6d 69 67 68 74 20 65 6e  * index might en
25440 64 20 75 70 20 62 65 69 6e 67 20 75 6e 75 73 65  d up being unuse
25450 64 20 69 66 20 74 68 65 20 64 61 74 61 20 63 61  d if the data ca
25460 6e 20 62 65 20 0a 20 20 2a 2a 20 65 78 74 72 61  n be .  ** extra
25470 63 74 65 64 20 69 6e 20 70 72 65 2d 73 6f 72 74  cted in pre-sort
25480 65 64 20 6f 72 64 65 72 2e 20 20 49 66 20 74 68  ed order.  If th
25490 61 74 20 69 73 20 74 68 65 20 63 61 73 65 2c 20  at is the case, 
254a0 74 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 4f 50  then the.  ** OP
254b0 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69  _OpenEphemeral i
254c0 6e 73 74 72 75 63 74 69 6f 6e 20 77 69 6c 6c 20  nstruction will 
254d0 62 65 20 63 68 61 6e 67 65 64 20 74 6f 20 61 6e  be changed to an
254e0 20 4f 50 5f 4e 6f 6f 70 20 6f 6e 63 65 0a 20 20   OP_Noop once.  
254f0 2a 2a 20 77 65 20 66 69 67 75 72 65 20 6f 75 74  ** we figure out
25500 20 74 68 61 74 20 74 68 65 20 73 6f 72 74 69 6e   that the sortin
25510 67 20 69 6e 64 65 78 20 69 73 20 6e 6f 74 20 6e  g index is not n
25520 65 65 64 65 64 2e 20 20 54 68 65 20 61 64 64 72  eeded.  The addr
25530 53 6f 72 74 49 6e 64 65 78 0a 20 20 2a 2a 20 76  SortIndex.  ** v
25540 61 72 69 61 62 6c 65 20 69 73 20 75 73 65 64 20  ariable is used 
25550 74 6f 20 66 61 63 69 6c 69 74 61 74 65 20 74 68  to facilitate th
25560 61 74 20 63 68 61 6e 67 65 2e 0a 20 20 2a 2f 0a  at change..  */.
25570 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29    if( pOrderBy )
25580 7b 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70  {.    KeyInfo *p
25590 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 70 4b 65  KeyInfo;.    pKe
255a0 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46  yInfo = keyInfoF
255b0 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72  romExprList(pPar
255c0 73 65 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a 20  se, pOrderBy);. 
255d0 20 20 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43     pOrderBy->iEC
255e0 75 72 73 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e  ursor = pParse->
255f0 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 70 2d 3e 61  nTab++;.    p->a
25600 64 64 72 4f 70 65 6e 45 70 68 6d 5b 32 5d 20 3d  ddrOpenEphm[2] =
25610 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78 20 3d   addrSortIndex =
25620 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
25630 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f  beAddOp4(v, OP_O
25640 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 0a 20 20  penEphemeral,.  
25650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25660 20 20 20 20 20 20 20 20 20 70 4f 72 64 65 72 42           pOrderB
25670 79 2d 3e 69 45 43 75 72 73 6f 72 2c 20 70 4f 72  y->iECursor, pOr
25680 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b 32 2c 20  derBy->nExpr+2, 
25690 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
256a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
256b0 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50  har*)pKeyInfo, P
256c0 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 7d 65  4_KEYINFO);.  }e
256d0 6c 73 65 7b 0a 20 20 20 20 61 64 64 72 53 6f 72  lse{.    addrSor
256e0 74 49 6e 64 65 78 20 3d 20 2d 31 3b 0a 20 20 7d  tIndex = -1;.  }
256f0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 75  ..  /* If the ou
25700 74 70 75 74 20 69 73 20 64 65 73 74 69 6e 65 64  tput is destined
25710 20 66 6f 72 20 61 20 74 65 6d 70 6f 72 61 72 79   for a temporary
25720 20 74 61 62 6c 65 2c 20 6f 70 65 6e 20 74 68 61   table, open tha
25730 74 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20  t table..  */.  
25740 69 66 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74  if( pDest->eDest
25750 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29  ==SRT_EphemTab )
25760 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
25770 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70  eAddOp2(v, OP_Op
25780 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70 44 65  enEphemeral, pDe
25790 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 70 45 4c  st->iSDParm, pEL
257a0 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 7d  ist->nExpr);.  }
257b0 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6c  ..  /* Set the l
257c0 69 6d 69 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 69  imiter..  */.  i
257d0 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62  End = sqlite3Vdb
257e0 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
257f0 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d   p->nSelectRow =
25800 20 4c 41 52 47 45 53 54 5f 49 4e 54 36 34 3b 0a   LARGEST_INT64;.
25810 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65    computeLimitRe
25820 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c 20  gisters(pParse, 
25830 70 2c 20 69 45 6e 64 29 3b 0a 20 20 69 66 28 20  p, iEnd);.  if( 
25840 70 2d 3e 69 4c 69 6d 69 74 3d 3d 30 20 26 26 20  p->iLimit==0 && 
25850 61 64 64 72 53 6f 72 74 49 6e 64 65 78 3e 3d 30  addrSortIndex>=0
25860 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
25870 64 62 65 47 65 74 4f 70 28 76 2c 20 61 64 64 72  dbeGetOp(v, addr
25880 53 6f 72 74 49 6e 64 65 78 29 2d 3e 6f 70 63 6f  SortIndex)->opco
25890 64 65 20 3d 20 4f 50 5f 53 6f 72 74 65 72 4f 70  de = OP_SorterOp
258a0 65 6e 3b 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c  en;.    p->selFl
258b0 61 67 73 20 7c 3d 20 53 46 5f 55 73 65 53 6f 72  ags |= SF_UseSor
258c0 74 65 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f  ter;.  }..  /* O
258d0 70 65 6e 20 61 20 76 69 72 74 75 61 6c 20 69 6e  pen a virtual in
258e0 64 65 78 20 74 6f 20 75 73 65 20 66 6f 72 20 74  dex to use for t
258f0 68 65 20 64 69 73 74 69 6e 63 74 20 73 65 74 2e  he distinct set.
25900 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73  .  */.  if( p->s
25910 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73  elFlags & SF_Dis
25920 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 73 44 69  tinct ){.    sDi
25930 73 74 69 6e 63 74 2e 74 61 62 54 6e 63 74 20 3d  stinct.tabTnct =
25940 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
25950 0a 20 20 20 20 73 44 69 73 74 69 6e 63 74 2e 61  .    sDistinct.a
25960 64 64 72 54 6e 63 74 20 3d 20 73 71 6c 69 74 65  ddrTnct = sqlite
25970 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
25980 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
25990 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
259a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
259b0 20 73 44 69 73 74 69 6e 63 74 2e 74 61 62 54 6e   sDistinct.tabTn
259c0 63 74 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20  ct, 0, 0,.      
259d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
259e0 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
259f0 29 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72  )keyInfoFromExpr
25a00 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 2d 3e  List(pParse, p->
25a10 70 45 4c 69 73 74 29 2c 0a 20 20 20 20 20 20 20  pEList),.       
25a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25a30 20 20 20 20 20 20 20 20 20 50 34 5f 4b 45 59 49           P4_KEYI
25a40 4e 46 4f 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  NFO);.    sqlite
25a50 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
25a60 20 42 54 52 45 45 5f 55 4e 4f 52 44 45 52 45 44   BTREE_UNORDERED
25a70 29 3b 0a 20 20 20 20 73 44 69 73 74 69 6e 63 74  );.    sDistinct
25a80 2e 65 54 6e 63 74 54 79 70 65 20 3d 20 57 48 45  .eTnctType = WHE
25a90 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 4f 52  RE_DISTINCT_UNOR
25aa0 44 45 52 45 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a  DERED;.  }else{.
25ab0 20 20 20 20 73 44 69 73 74 69 6e 63 74 2e 65 54      sDistinct.eT
25ac0 6e 63 74 54 79 70 65 20 3d 20 57 48 45 52 45 5f  nctType = WHERE_
25ad0 44 49 53 54 49 4e 43 54 5f 4e 4f 4f 50 3b 0a 20  DISTINCT_NOOP;. 
25ae0 20 7d 0a 0a 20 20 69 66 28 20 21 69 73 41 67 67   }..  if( !isAgg
25af0 20 26 26 20 70 47 72 6f 75 70 42 79 3d 3d 30 20   && pGroupBy==0 
25b00 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 61 67 67  ){.    /* No agg
25b10 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73  regate functions
25b20 20 61 6e 64 20 6e 6f 20 47 52 4f 55 50 20 42 59   and no GROUP BY
25b30 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 75   clause */.    u
25b40 31 36 20 77 63 74 72 6c 46 6c 61 67 73 20 3d 20  16 wctrlFlags = 
25b50 28 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63  (sDistinct.isTnc
25b60 74 20 3f 20 57 48 45 52 45 5f 57 41 4e 54 5f 44  t ? WHERE_WANT_D
25b70 49 53 54 49 4e 43 54 20 3a 20 30 29 3b 0a 0a 20  ISTINCT : 0);.. 
25b80 20 20 20 2f 2a 20 42 65 67 69 6e 20 74 68 65 20     /* Begin the 
25b90 64 61 74 61 62 61 73 65 20 73 63 61 6e 2e 20 2a  database scan. *
25ba0 2f 0a 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 73  /.    pWInfo = s
25bb0 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
25bc0 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73  (pParse, pTabLis
25bd0 74 2c 20 70 57 68 65 72 65 2c 20 70 4f 72 64 65  t, pWhere, pOrde
25be0 72 42 79 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 0a  rBy, p->pEList,.
25bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77                 w
25c10 63 74 72 6c 46 6c 61 67 73 2c 20 30 29 3b 0a 20  ctrlFlags, 0);. 
25c20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30     if( pWInfo==0
25c30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65   ) goto select_e
25c40 6e 64 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  nd;.    if( sqli
25c50 74 65 33 57 68 65 72 65 4f 75 74 70 75 74 52 6f  te3WhereOutputRo
25c60 77 43 6f 75 6e 74 28 70 57 49 6e 66 6f 29 20 3c  wCount(pWInfo) <
25c70 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 29   p->nSelectRow )
25c80 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65  {.      p->nSele
25c90 63 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 57  ctRow = sqlite3W
25ca0 68 65 72 65 4f 75 74 70 75 74 52 6f 77 43 6f 75  hereOutputRowCou
25cb0 6e 74 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20  nt(pWInfo);.    
25cc0 7d 0a 20 20 20 20 69 66 28 20 73 44 69 73 74 69  }.    if( sDisti
25cd0 6e 63 74 2e 69 73 54 6e 63 74 20 26 26 20 73 71  nct.isTnct && sq
25ce0 6c 69 74 65 33 57 68 65 72 65 49 73 44 69 73 74  lite3WhereIsDist
25cf0 69 6e 63 74 28 70 57 49 6e 66 6f 29 20 29 7b 0a  inct(pWInfo) ){.
25d00 20 20 20 20 20 20 73 44 69 73 74 69 6e 63 74 2e        sDistinct.
25d10 65 54 6e 63 74 54 79 70 65 20 3d 20 73 71 6c 69  eTnctType = sqli
25d20 74 65 33 57 68 65 72 65 49 73 44 69 73 74 69 6e  te3WhereIsDistin
25d30 63 74 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20  ct(pWInfo);.    
25d40 7d 0a 20 20 20 20 69 66 28 20 70 4f 72 64 65 72  }.    if( pOrder
25d50 42 79 20 26 26 20 73 71 6c 69 74 65 33 57 68 65  By && sqlite3Whe
25d60 72 65 49 73 4f 72 64 65 72 65 64 28 70 57 49 6e  reIsOrdered(pWIn
25d70 66 6f 29 20 29 20 70 4f 72 64 65 72 42 79 20 3d  fo) ) pOrderBy =
25d80 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 73   0;..    /* If s
25d90 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74 68 61  orting index tha
25da0 74 20 77 61 73 20 63 72 65 61 74 65 64 20 62 79  t was created by
25db0 20 61 20 70 72 69 6f 72 20 4f 50 5f 4f 70 65 6e   a prior OP_Open
25dc0 45 70 68 65 6d 65 72 61 6c 20 0a 20 20 20 20 2a  Ephemeral .    *
25dd0 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 65 6e  * instruction en
25de0 64 65 64 20 75 70 20 6e 6f 74 20 62 65 69 6e 67  ded up not being
25df0 20 6e 65 65 64 65 64 2c 20 74 68 65 6e 20 63 68   needed, then ch
25e00 61 6e 67 65 20 74 68 65 20 4f 50 5f 4f 70 65 6e  ange the OP_Open
25e10 45 70 68 65 6d 65 72 61 6c 0a 20 20 20 20 2a 2a  Ephemeral.    **
25e20 20 69 6e 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70   into an OP_Noop
25e30 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
25e40 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78 3e 3d   addrSortIndex>=
25e50 30 20 26 26 20 70 4f 72 64 65 72 42 79 3d 3d 30  0 && pOrderBy==0
25e60 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
25e70 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f  3VdbeChangeToNoo
25e80 70 28 76 2c 20 61 64 64 72 53 6f 72 74 49 6e 64  p(v, addrSortInd
25e90 65 78 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64  ex);.      p->ad
25ea0 64 72 4f 70 65 6e 45 70 68 6d 5b 32 5d 20 3d 20  drOpenEphm[2] = 
25eb0 2d 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  -1;.    }..    /
25ec0 2a 20 55 73 65 20 74 68 65 20 73 74 61 6e 64 61  * Use the standa
25ed0 72 64 20 69 6e 6e 65 72 20 6c 6f 6f 70 2e 20 2a  rd inner loop. *
25ee0 2f 0a 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65  /.    selectInne
25ef0 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c  rLoop(pParse, p,
25f00 20 70 45 4c 69 73 74 2c 20 30 2c 20 30 2c 20 70   pEList, 0, 0, p
25f10 4f 72 64 65 72 42 79 2c 20 26 73 44 69 73 74 69  OrderBy, &sDisti
25f20 6e 63 74 2c 20 70 44 65 73 74 2c 0a 20 20 20 20  nct, pDest,.    
25f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25f40 73 71 6c 69 74 65 33 57 68 65 72 65 43 6f 6e 74  sqlite3WhereCont
25f50 69 6e 75 65 4c 61 62 65 6c 28 70 57 49 6e 66 6f  inueLabel(pWInfo
25f60 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
25f70 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68         sqlite3Wh
25f80 65 72 65 42 72 65 61 6b 4c 61 62 65 6c 28 70 57  ereBreakLabel(pW
25f90 49 6e 66 6f 29 29 3b 0a 0a 20 20 20 20 2f 2a 20  Info));..    /* 
25fa0 45 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65  End the database
25fb0 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20   scan loop..    
25fc0 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 57 68  */.    sqlite3Wh
25fd0 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a  ereEnd(pWInfo);.
25fe0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
25ff0 54 68 69 73 20 63 61 73 65 20 77 68 65 6e 20 74  This case when t
26000 68 65 72 65 20 65 78 69 73 74 20 61 67 67 72 65  here exist aggre
26010 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 6f  gate functions o
26020 72 20 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61  r a GROUP BY cla
26030 75 73 65 0a 20 20 20 20 2a 2a 20 6f 72 20 62 6f  use.    ** or bo
26040 74 68 20 2a 2f 0a 20 20 20 20 4e 61 6d 65 43 6f  th */.    NameCo
26050 6e 74 65 78 74 20 73 4e 43 3b 20 20 20 20 2f 2a  ntext sNC;    /*
26060 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20 66 6f   Name context fo
26070 72 20 70 72 6f 63 65 73 73 69 6e 67 20 61 67 67  r processing agg
26080 72 65 67 61 74 65 20 69 6e 66 6f 72 6d 61 74 69  regate informati
26090 6f 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 41  on */.    int iA
260a0 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  Mem;          /*
260b0 20 46 69 72 73 74 20 4d 65 6d 20 61 64 64 72 65   First Mem addre
260c0 73 73 20 66 6f 72 20 73 74 6f 72 69 6e 67 20 63  ss for storing c
260d0 75 72 72 65 6e 74 20 47 52 4f 55 50 20 42 59 20  urrent GROUP BY 
260e0 2a 2f 0a 20 20 20 20 69 6e 74 20 69 42 4d 65 6d  */.    int iBMem
260f0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  ;          /* Fi
26100 72 73 74 20 4d 65 6d 20 61 64 64 72 65 73 73 20  rst Mem address 
26110 66 6f 72 20 70 72 65 76 69 6f 75 73 20 47 52 4f  for previous GRO
26120 55 50 20 42 59 20 2a 2f 0a 20 20 20 20 69 6e 74  UP BY */.    int
26130 20 69 55 73 65 46 6c 61 67 3b 20 20 20 20 20 20   iUseFlag;      
26140 20 2f 2a 20 4d 65 6d 20 61 64 64 72 65 73 73 20   /* Mem address 
26150 68 6f 6c 64 69 6e 67 20 66 6c 61 67 20 69 6e 64  holding flag ind
26160 69 63 61 74 69 6e 67 20 74 68 61 74 20 61 74 20  icating that at 
26170 6c 65 61 73 74 0a 20 20 20 20 20 20 20 20 20 20  least.          
26180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
26190 20 6f 6e 65 20 72 6f 77 20 6f 66 20 74 68 65 20   one row of the 
261a0 69 6e 70 75 74 20 74 6f 20 74 68 65 20 61 67 67  input to the agg
261b0 72 65 67 61 74 6f 72 20 68 61 73 20 62 65 65 6e  regator has been
261c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
261d0 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63           ** proc
261e0 65 73 73 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74  essed */.    int
261f0 20 69 41 62 6f 72 74 46 6c 61 67 3b 20 20 20 20   iAbortFlag;    
26200 20 2f 2a 20 4d 65 6d 20 61 64 64 72 65 73 73 20   /* Mem address 
26210 77 68 69 63 68 20 63 61 75 73 65 73 20 71 75 65  which causes que
26220 72 79 20 61 62 6f 72 74 20 69 66 20 70 6f 73 69  ry abort if posi
26230 74 69 76 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20  tive */.    int 
26240 67 72 6f 75 70 42 79 53 6f 72 74 3b 20 20 20 20  groupBySort;    
26250 2f 2a 20 52 6f 77 73 20 63 6f 6d 65 20 66 72 6f  /* Rows come fro
26260 6d 20 73 6f 75 72 63 65 20 69 6e 20 47 52 4f 55  m source in GROU
26270 50 20 42 59 20 6f 72 64 65 72 20 2a 2f 0a 20 20  P BY order */.  
26280 20 20 69 6e 74 20 61 64 64 72 45 6e 64 3b 20 20    int addrEnd;  
26290 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20        /* End of 
262a0 70 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 74  processing for t
262b0 68 69 73 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20  his SELECT */.  
262c0 20 20 69 6e 74 20 73 6f 72 74 50 54 61 62 20 3d    int sortPTab =
262d0 20 30 3b 20 20 20 2f 2a 20 50 73 65 75 64 6f 74   0;   /* Pseudot
262e0 61 62 6c 65 20 75 73 65 64 20 74 6f 20 64 65 63  able used to dec
262f0 6f 64 65 20 73 6f 72 74 69 6e 67 20 72 65 73 75  ode sorting resu
26300 6c 74 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73  lts */.    int s
26310 6f 72 74 4f 75 74 20 3d 20 30 3b 20 20 20 20 2f  ortOut = 0;    /
26320 2a 20 4f 75 74 70 75 74 20 72 65 67 69 73 74 65  * Output registe
26330 72 20 66 72 6f 6d 20 74 68 65 20 73 6f 72 74 65  r from the sorte
26340 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 65 6d  r */..    /* Rem
26350 6f 76 65 20 61 6e 79 20 61 6e 64 20 61 6c 6c 20  ove any and all 
26360 61 6c 69 61 73 65 73 20 62 65 74 77 65 65 6e 20  aliases between 
26370 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 61  the result set a
26380 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20 47 52  nd the.    ** GR
26390 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e 0a 20  OUP BY clause.. 
263a0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 47     */.    if( pG
263b0 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20  roupBy ){.      
263c0 69 6e 74 20 6b 3b 20 20 20 20 20 20 20 20 20 20  int k;          
263d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
263e0 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
263f0 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78  .      struct Ex
26400 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
26410 65 6d 3b 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70  em;  /* For loop
26420 69 6e 67 20 6f 76 65 72 20 65 78 70 72 65 73 73  ing over express
26430 69 6f 6e 20 69 6e 20 61 20 6c 69 73 74 20 2a 2f  ion in a list */
26440 0a 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 70 2d  ..      for(k=p-
26450 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20  >pEList->nExpr, 
26460 70 49 74 65 6d 3d 70 2d 3e 70 45 4c 69 73 74 2d  pItem=p->pEList-
26470 3e 61 3b 20 6b 3e 30 3b 20 6b 2d 2d 2c 20 70 49  >a; k>0; k--, pI
26480 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  tem++){.        
26490 70 49 74 65 6d 2d 3e 69 41 6c 69 61 73 20 3d 20  pItem->iAlias = 
264a0 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
264b0 20 66 6f 72 28 6b 3d 70 47 72 6f 75 70 42 79 2d   for(k=pGroupBy-
264c0 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d 70 47  >nExpr, pItem=pG
264d0 72 6f 75 70 42 79 2d 3e 61 3b 20 6b 3e 30 3b 20  roupBy->a; k>0; 
264e0 6b 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  k--, pItem++){. 
264f0 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 41         pItem->iA
26500 6c 69 61 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  lias = 0;.      
26510 7d 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e  }.      if( p->n
26520 53 65 6c 65 63 74 52 6f 77 3e 31 30 30 20 29 20  SelectRow>100 ) 
26530 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20  p->nSelectRow = 
26540 31 30 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  100;.    }else{.
26550 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74        p->nSelect
26560 52 6f 77 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a  Row = 1;.    }..
26570 20 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20   .    /* Create 
26580 61 20 6c 61 62 65 6c 20 74 6f 20 6a 75 6d 70 20  a label to jump 
26590 74 6f 20 77 68 65 6e 20 77 65 20 77 61 6e 74 20  to when we want 
265a0 74 6f 20 61 62 6f 72 74 20 74 68 65 20 71 75 65  to abort the que
265b0 72 79 20 2a 2f 0a 20 20 20 20 61 64 64 72 45 6e  ry */.    addrEn
265c0 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  d = sqlite3VdbeM
265d0 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20  akeLabel(v);..  
265e0 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 54 4b 5f    /* Convert TK_
265f0 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73 20 69 6e 74  COLUMN nodes int
26600 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20  o TK_AGG_COLUMN 
26610 61 6e 64 20 6d 61 6b 65 20 65 6e 74 72 69 65 73  and make entries
26620 20 69 6e 0a 20 20 20 20 2a 2a 20 73 41 67 67 49   in.    ** sAggI
26630 6e 66 6f 20 66 6f 72 20 61 6c 6c 20 54 4b 5f 41  nfo for all TK_A
26640 47 47 5f 46 55 4e 43 54 49 4f 4e 20 6e 6f 64 65  GG_FUNCTION node
26650 73 20 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 73  s in expressions
26660 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 53   of the.    ** S
26670 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
26680 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6d 65 6d 73  .    */.    mems
26690 65 74 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65  et(&sNC, 0, size
266a0 6f 66 28 73 4e 43 29 29 3b 0a 20 20 20 20 73 4e  of(sNC));.    sN
266b0 43 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73  C.pParse = pPars
266c0 65 3b 0a 20 20 20 20 73 4e 43 2e 70 53 72 63 4c  e;.    sNC.pSrcL
266d0 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a  ist = pTabList;.
266e0 20 20 20 20 73 4e 43 2e 70 41 67 67 49 6e 66 6f      sNC.pAggInfo
266f0 20 3d 20 26 73 41 67 67 49 6e 66 6f 3b 0a 20 20   = &sAggInfo;.  
26700 20 20 73 41 67 67 49 6e 66 6f 2e 6e 53 6f 72 74    sAggInfo.nSort
26710 69 6e 67 43 6f 6c 75 6d 6e 20 3d 20 70 47 72 6f  ingColumn = pGro
26720 75 70 42 79 20 3f 20 70 47 72 6f 75 70 42 79 2d  upBy ? pGroupBy-
26730 3e 6e 45 78 70 72 2b 31 20 3a 20 30 3b 0a 20 20  >nExpr+1 : 0;.  
26740 20 20 73 41 67 67 49 6e 66 6f 2e 70 47 72 6f 75    sAggInfo.pGrou
26750 70 42 79 20 3d 20 70 47 72 6f 75 70 42 79 3b 0a  pBy = pGroupBy;.
26760 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41      sqlite3ExprA
26770 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 26 73  nalyzeAggList(&s
26780 4e 43 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20  NC, pEList);.   
26790 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
267a0 79 7a 65 41 67 67 4c 69 73 74 28 26 73 4e 43 2c  yzeAggList(&sNC,
267b0 20 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20   pOrderBy);.    
267c0 69 66 28 20 70 48 61 76 69 6e 67 20 29 7b 0a 20  if( pHaving ){. 
267d0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
267e0 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  AnalyzeAggregate
267f0 73 28 26 73 4e 43 2c 20 70 48 61 76 69 6e 67 29  s(&sNC, pHaving)
26800 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 41 67 67  ;.    }.    sAgg
26810 49 6e 66 6f 2e 6e 41 63 63 75 6d 75 6c 61 74 6f  Info.nAccumulato
26820 72 20 3d 20 73 41 67 67 49 6e 66 6f 2e 6e 43 6f  r = sAggInfo.nCo
26830 6c 75 6d 6e 3b 0a 20 20 20 20 66 6f 72 28 69 3d  lumn;.    for(i=
26840 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 46  0; i<sAggInfo.nF
26850 75 6e 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  unc; i++){.     
26860 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
26870 73 50 72 6f 70 65 72 74 79 28 73 41 67 67 49 6e  sProperty(sAggIn
26880 66 6f 2e 61 46 75 6e 63 5b 69 5d 2e 70 45 78 70  fo.aFunc[i].pExp
26890 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
268a0 20 29 3b 0a 20 20 20 20 20 20 73 4e 43 2e 6e 63   );.      sNC.nc
268b0 46 6c 61 67 73 20 7c 3d 20 4e 43 5f 49 6e 41 67  Flags |= NC_InAg
268c0 67 46 75 6e 63 3b 0a 20 20 20 20 20 20 73 71 6c  gFunc;.      sql
268d0 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
268e0 67 67 4c 69 73 74 28 26 73 4e 43 2c 20 73 41 67  ggList(&sNC, sAg
268f0 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 69 5d 2e 70  gInfo.aFunc[i].p
26900 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a  Expr->x.pList);.
26910 20 20 20 20 20 20 73 4e 43 2e 6e 63 46 6c 61 67        sNC.ncFlag
26920 73 20 26 3d 20 7e 4e 43 5f 49 6e 41 67 67 46 75  s &= ~NC_InAggFu
26930 6e 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  nc;.    }.    if
26940 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
26950 65 64 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74  ed ) goto select
26960 5f 65 6e 64 3b 0a 0a 20 20 20 20 2f 2a 20 50 72  _end;..    /* Pr
26970 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 61 67 67  ocessing for agg
26980 72 65 67 61 74 65 73 20 77 69 74 68 20 47 52 4f  regates with GRO
26990 55 50 20 42 59 20 69 73 20 76 65 72 79 20 64 69  UP BY is very di
269a0 66 66 65 72 65 6e 74 20 61 6e 64 0a 20 20 20 20  fferent and.    
269b0 2a 2a 20 6d 75 63 68 20 6d 6f 72 65 20 63 6f 6d  ** much more com
269c0 70 6c 65 78 20 74 68 61 6e 20 61 67 67 72 65 67  plex than aggreg
269d0 61 74 65 73 20 77 69 74 68 6f 75 74 20 61 20 47  ates without a G
269e0 52 4f 55 50 20 42 59 2e 0a 20 20 20 20 2a 2f 0a  ROUP BY..    */.
269f0 20 20 20 20 69 66 28 20 70 47 72 6f 75 70 42 79      if( pGroupBy
26a00 20 29 7b 0a 20 20 20 20 20 20 4b 65 79 49 6e 66   ){.      KeyInf
26a10 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 20 20 2f 2a  o *pKeyInfo;  /*
26a20 20 4b 65 79 69 6e 67 20 69 6e 66 6f 72 6d 61 74   Keying informat
26a30 69 6f 6e 20 66 6f 72 20 74 68 65 20 67 72 6f 75  ion for the grou
26a40 70 20 62 79 20 63 6c 61 75 73 65 20 2a 2f 0a 20  p by clause */. 
26a50 20 20 20 20 20 69 6e 74 20 6a 31 3b 20 20 20 20       int j1;    
26a60 20 20 20 20 20 20 20 20 20 2f 2a 20 41 2d 76 73           /* A-vs
26a70 2d 42 20 63 6f 6d 70 61 72 69 73 69 6f 6e 20 6a  -B comparision j
26a80 75 6d 70 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ump */.      int
26a90 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 3b 20   addrOutputRow; 
26aa0 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 73 75 62   /* Start of sub
26ab0 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74  routine that out
26ac0 70 75 74 73 20 61 20 72 65 73 75 6c 74 20 72 6f  puts a result ro
26ad0 77 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72  w */.      int r
26ae0 65 67 4f 75 74 70 75 74 52 6f 77 3b 20 20 20 2f  egOutputRow;   /
26af0 2a 20 52 65 74 75 72 6e 20 61 64 64 72 65 73 73  * Return address
26b00 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 6f 75   register for ou
26b10 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65 20  tput subroutine 
26b20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  */.      int add
26b30 72 53 65 74 41 62 6f 72 74 3b 20 20 20 2f 2a 20  rSetAbort;   /* 
26b40 53 65 74 20 74 68 65 20 61 62 6f 72 74 20 66 6c  Set the abort fl
26b50 61 67 20 61 6e 64 20 72 65 74 75 72 6e 20 2a 2f  ag and return */
26b60 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 54  .      int addrT
26b70 6f 70 4f 66 4c 6f 6f 70 3b 20 20 2f 2a 20 54 6f  opOfLoop;  /* To
26b80 70 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 6c  p of the input l
26b90 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  oop */.      int
26ba0 20 61 64 64 72 53 6f 72 74 69 6e 67 49 64 78 3b   addrSortingIdx;
26bb0 20 2f 2a 20 54 68 65 20 4f 50 5f 4f 70 65 6e 45   /* The OP_OpenE
26bc0 70 68 65 6d 65 72 61 6c 20 66 6f 72 20 74 68 65  phemeral for the
26bd0 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 2a   sorting index *
26be0 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  /.      int addr
26bf0 52 65 73 65 74 3b 20 20 20 20 20 20 2f 2a 20 53  Reset;      /* S
26c00 75 62 72 6f 75 74 69 6e 65 20 66 6f 72 20 72 65  ubroutine for re
26c10 73 65 74 74 69 6e 67 20 74 68 65 20 61 63 63 75  setting the accu
26c20 6d 75 6c 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20  mulator */.     
26c30 20 69 6e 74 20 72 65 67 52 65 73 65 74 3b 20 20   int regReset;  
26c40 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 61       /* Return a
26c50 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20  ddress register 
26c60 66 6f 72 20 72 65 73 65 74 20 73 75 62 72 6f 75  for reset subrou
26c70 74 69 6e 65 20 2a 2f 0a 0a 20 20 20 20 20 20 2f  tine */..      /
26c80 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20  * If there is a 
26c90 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20  GROUP BY clause 
26ca0 77 65 20 6d 69 67 68 74 20 6e 65 65 64 20 61 20  we might need a 
26cb0 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74 6f  sorting index to
26cc0 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70 6c 65 6d  .      ** implem
26cd0 65 6e 74 20 69 74 2e 20 20 41 6c 6c 6f 63 61 74  ent it.  Allocat
26ce0 65 20 74 68 61 74 20 73 6f 72 74 69 6e 67 20 69  e that sorting i
26cf0 6e 64 65 78 20 6e 6f 77 2e 20 20 49 66 20 69 74  ndex now.  If it
26d00 20 74 75 72 6e 73 20 6f 75 74 0a 20 20 20 20 20   turns out.     
26d10 20 2a 2a 20 74 68 61 74 20 77 65 20 64 6f 20 6e   ** that we do n
26d20 6f 74 20 6e 65 65 64 20 69 74 20 61 66 74 65 72  ot need it after
26d30 20 61 6c 6c 2c 20 74 68 65 20 4f 50 5f 53 6f 72   all, the OP_Sor
26d40 74 65 72 4f 70 65 6e 20 69 6e 73 74 72 75 63 74  terOpen instruct
26d50 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 77 69 6c  ion.      ** wil
26d60 6c 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20 69  l be converted i
26d70 6e 74 6f 20 61 20 4e 6f 6f 70 2e 20 20 0a 20 20  nto a Noop.  .  
26d80 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 41 67      */.      sAg
26d90 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78  gInfo.sortingIdx
26da0 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
26db0 2b 3b 0a 20 20 20 20 20 20 70 4b 65 79 49 6e 66  +;.      pKeyInf
26dc0 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45  o = keyInfoFromE
26dd0 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
26de0 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 20  pGroupBy);.     
26df0 20 61 64 64 72 53 6f 72 74 69 6e 67 49 64 78 20   addrSortingIdx 
26e00 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
26e10 4f 70 34 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72  Op4(v, OP_Sorter
26e20 4f 70 65 6e 2c 20 0a 20 20 20 20 20 20 20 20 20  Open, .         
26e30 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e   sAggInfo.sortin
26e40 67 49 64 78 2c 20 73 41 67 67 49 6e 66 6f 2e 6e  gIdx, sAggInfo.n
26e50 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 2c 20 0a  SortingColumn, .
26e60 20 20 20 20 20 20 20 20 20 20 30 2c 20 28 63 68            0, (ch
26e70 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34  ar*)pKeyInfo, P4
26e80 5f 4b 45 59 49 4e 46 4f 29 3b 0a 0a 20 20 20 20  _KEYINFO);..    
26e90 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
26ea0 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 73  memory locations
26eb0 20 75 73 65 64 20 62 79 20 47 52 4f 55 50 20 42   used by GROUP B
26ec0 59 20 61 67 67 72 65 67 61 74 65 20 70 72 6f 63  Y aggregate proc
26ed0 65 73 73 69 6e 67 0a 20 20 20 20 20 20 2a 2f 0a  essing.      */.
26ee0 20 20 20 20 20 20 69 55 73 65 46 6c 61 67 20 3d        iUseFlag =
26ef0 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
26f00 0a 20 20 20 20 20 20 69 41 62 6f 72 74 46 6c 61  .      iAbortFla
26f10 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  g = ++pParse->nM
26f20 65 6d 3b 0a 20 20 20 20 20 20 72 65 67 4f 75 74  em;.      regOut
26f30 70 75 74 52 6f 77 20 3d 20 2b 2b 70 50 61 72 73  putRow = ++pPars
26f40 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 61  e->nMem;.      a
26f50 64 64 72 4f 75 74 70 75 74 52 6f 77 20 3d 20 73  ddrOutputRow = s
26f60 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
26f70 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 72 65  bel(v);.      re
26f80 67 52 65 73 65 74 20 3d 20 2b 2b 70 50 61 72 73  gReset = ++pPars
26f90 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 61  e->nMem;.      a
26fa0 64 64 72 52 65 73 65 74 20 3d 20 73 71 6c 69 74  ddrReset = sqlit
26fb0 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
26fc0 76 29 3b 0a 20 20 20 20 20 20 69 41 4d 65 6d 20  v);.      iAMem 
26fd0 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b  = pParse->nMem +
26fe0 20 31 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65   1;.      pParse
26ff0 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f 75 70  ->nMem += pGroup
27000 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20  By->nExpr;.     
27010 20 69 42 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d   iBMem = pParse-
27020 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 20 20 20  >nMem + 1;.     
27030 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
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 73 71 6c 69 74 65 33 56  ;.      sqlite3V
27060 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
27070 49 6e 74 65 67 65 72 2c 20 30 2c 20 69 41 62 6f  Integer, 0, iAbo
27080 72 74 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56  rtFlag);.      V
27090 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
270a0 63 6c 65 61 72 20 61 62 6f 72 74 20 66 6c 61 67  clear abort flag
270b0 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  "));.      sqlit
270c0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
270d0 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 69  OP_Integer, 0, i
270e0 55 73 65 46 6c 61 67 29 3b 0a 20 20 20 20 20 20  UseFlag);.      
270f0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
27100 22 69 6e 64 69 63 61 74 65 20 61 63 63 75 6d 75  "indicate accumu
27110 6c 61 74 6f 72 20 65 6d 70 74 79 22 29 29 3b 0a  lator empty"));.
27120 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
27130 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 75  eAddOp3(v, OP_Nu
27140 6c 6c 2c 20 30 2c 20 69 41 4d 65 6d 2c 20 69 41  ll, 0, iAMem, iA
27150 4d 65 6d 2b 70 47 72 6f 75 70 42 79 2d 3e 6e 45  Mem+pGroupBy->nE
27160 78 70 72 2d 31 29 3b 0a 0a 20 20 20 20 20 20 2f  xpr-1);..      /
27170 2a 20 42 65 67 69 6e 20 61 20 6c 6f 6f 70 20 74  * Begin a loop t
27180 68 61 74 20 77 69 6c 6c 20 65 78 74 72 61 63 74  hat will extract
27190 20 61 6c 6c 20 73 6f 75 72 63 65 20 72 6f 77 73   all source rows
271a0 20 69 6e 20 47 52 4f 55 50 20 42 59 20 6f 72 64   in GROUP BY ord
271b0 65 72 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 69  er..      ** Thi
271c0 73 20 6d 69 67 68 74 20 69 6e 76 6f 6c 76 65 20  s might involve 
271d0 74 77 6f 20 73 65 70 61 72 61 74 65 20 6c 6f 6f  two separate loo
271e0 70 73 20 77 69 74 68 20 61 6e 20 4f 50 5f 53 6f  ps with an OP_So
271f0 72 74 20 69 6e 20 62 65 74 77 65 65 6e 2c 20 6f  rt in between, o
27200 72 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 6d 69  r.      ** it mi
27210 67 68 74 20 62 65 20 61 20 73 69 6e 67 6c 65 20  ght be a single 
27220 6c 6f 6f 70 20 74 68 61 74 20 75 73 65 73 20 61  loop that uses a
27230 6e 20 69 6e 64 65 78 20 74 6f 20 65 78 74 72 61  n index to extra
27240 63 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 20  ct information. 
27250 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 72       ** in the r
27260 69 67 68 74 20 6f 72 64 65 72 20 74 6f 20 62 65  ight order to be
27270 67 69 6e 20 77 69 74 68 2e 0a 20 20 20 20 20 20  gin with..      
27280 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
27290 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
272a0 5f 47 6f 73 75 62 2c 20 72 65 67 52 65 73 65 74  _Gosub, regReset
272b0 2c 20 61 64 64 72 52 65 73 65 74 29 3b 0a 20 20  , addrReset);.  
272c0 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c      pWInfo = sql
272d0 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 70  ite3WhereBegin(p
272e0 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c  Parse, pTabList,
272f0 20 70 57 68 65 72 65 2c 20 70 47 72 6f 75 70 42   pWhere, pGroupB
27300 79 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20  y, 0, .         
27310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27320 20 20 20 20 20 20 20 20 57 48 45 52 45 5f 47 52          WHERE_GR
27330 4f 55 50 42 59 2c 20 30 29 3b 0a 20 20 20 20 20  OUPBY, 0);.     
27340 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29   if( pWInfo==0 )
27350 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
27360 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ;.      if( sqli
27370 74 65 33 57 68 65 72 65 49 73 4f 72 64 65 72 65  te3WhereIsOrdere
27380 64 28 70 57 49 6e 66 6f 29 20 29 7b 0a 20 20 20  d(pWInfo) ){.   
27390 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 74 69       /* The opti
273a0 6d 69 7a 65 72 20 69 73 20 61 62 6c 65 20 74 6f  mizer is able to
273b0 20 64 65 6c 69 76 65 72 20 72 6f 77 73 20 69 6e   deliver rows in
273c0 20 67 72 6f 75 70 20 62 79 20 6f 72 64 65 72 20   group by order 
273d0 73 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 65  so.        ** we
273e0 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f 20   do not have to 
273f0 73 6f 72 74 2e 20 20 54 68 65 20 4f 50 5f 4f 70  sort.  The OP_Op
27400 65 6e 45 70 68 65 6d 65 72 61 6c 20 74 61 62 6c  enEphemeral tabl
27410 65 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 20 20  e will be.      
27420 20 20 2a 2a 20 63 61 6e 63 65 6c 6c 65 64 20 6c    ** cancelled l
27430 61 74 65 72 20 62 65 63 61 75 73 65 20 77 65 20  ater because we 
27440 73 74 69 6c 6c 20 6e 65 65 64 20 74 6f 20 75 73  still need to us
27450 65 20 74 68 65 20 70 4b 65 79 49 6e 66 6f 0a 20  e the pKeyInfo. 
27460 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
27470 20 20 67 72 6f 75 70 42 79 53 6f 72 74 20 3d 20    groupBySort = 
27480 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  0;.      }else{.
27490 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 73 20          /* Rows 
274a0 61 72 65 20 63 6f 6d 69 6e 67 20 6f 75 74 20 69  are coming out i
274b0 6e 20 75 6e 64 65 74 65 72 6d 69 6e 65 64 20 6f  n undetermined o
274c0 72 64 65 72 2e 20 20 57 65 20 68 61 76 65 20 74  rder.  We have t
274d0 6f 20 70 75 73 68 0a 20 20 20 20 20 20 20 20 2a  o push.        *
274e0 2a 20 65 61 63 68 20 72 6f 77 20 69 6e 74 6f 20  * each row into 
274f0 61 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 2c  a sorting index,
27500 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 66   terminate the f
27510 69 72 73 74 20 6c 6f 6f 70 2c 0a 20 20 20 20 20  irst loop,.     
27520 20 20 20 2a 2a 20 74 68 65 6e 20 6c 6f 6f 70 20     ** then loop 
27530 6f 76 65 72 20 74 68 65 20 73 6f 72 74 69 6e 67  over the sorting
27540 20 69 6e 64 65 78 20 69 6e 20 6f 72 64 65 72 20   index in order 
27550 74 6f 20 67 65 74 20 74 68 65 20 6f 75 74 70 75  to get the outpu
27560 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20  t.        ** in 
27570 73 6f 72 74 65 64 20 6f 72 64 65 72 0a 20 20 20  sorted order.   
27580 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
27590 69 6e 74 20 72 65 67 42 61 73 65 3b 0a 20 20 20  int regBase;.   
275a0 20 20 20 20 20 69 6e 74 20 72 65 67 52 65 63 6f       int regReco
275b0 72 64 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  rd;.        int 
275c0 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 69 6e  nCol;.        in
275d0 74 20 6e 47 72 6f 75 70 42 79 3b 0a 0a 20 20 20  t nGroupBy;..   
275e0 20 20 20 20 20 65 78 70 6c 61 69 6e 54 65 6d 70       explainTemp
275f0 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 0a 20  Table(pParse, . 
27600 20 20 20 20 20 20 20 20 20 20 20 28 73 44 69 73             (sDis
27610 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 26 26 20  tinct.isTnct && 
27620 28 70 2d 3e 73 65 6c 46 6c 61 67 73 26 53 46 5f  (p->selFlags&SF_
27630 44 69 73 74 69 6e 63 74 29 3d 3d 30 29 20 3f 0a  Distinct)==0) ?.
27640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27650 20 20 20 20 22 44 49 53 54 49 4e 43 54 22 20 3a      "DISTINCT" :
27660 20 22 47 52 4f 55 50 20 42 59 22 29 3b 0a 0a 20   "GROUP BY");.. 
27670 20 20 20 20 20 20 20 67 72 6f 75 70 42 79 53 6f         groupBySo
27680 72 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  rt = 1;.        
27690 6e 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f 75  nGroupBy = pGrou
276a0 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  pBy->nExpr;.    
276b0 20 20 20 20 6e 43 6f 6c 20 3d 20 6e 47 72 6f 75      nCol = nGrou
276c0 70 42 79 20 2b 20 31 3b 0a 20 20 20 20 20 20 20  pBy + 1;.       
276d0 20 6a 20 3d 20 6e 47 72 6f 75 70 42 79 2b 31 3b   j = nGroupBy+1;
276e0 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
276f0 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 43 6f  ; i<sAggInfo.nCo
27700 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  lumn; i++){.    
27710 20 20 20 20 20 20 69 66 28 20 73 41 67 67 49 6e        if( sAggIn
27720 66 6f 2e 61 43 6f 6c 5b 69 5d 2e 69 53 6f 72 74  fo.aCol[i].iSort
27730 65 72 43 6f 6c 75 6d 6e 3e 3d 6a 20 29 7b 0a 20  erColumn>=j ){. 
27740 20 20 20 20 20 20 20 20 20 20 20 6e 43 6f 6c 2b             nCol+
27750 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a  +;.            j
27760 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ++;.          }.
27770 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
27780 20 20 72 65 67 42 61 73 65 20 3d 20 73 71 6c 69    regBase = sqli
27790 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28  te3GetTempRange(
277a0 70 50 61 72 73 65 2c 20 6e 43 6f 6c 29 3b 0a 20  pParse, nCol);. 
277b0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
277c0 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61  prCacheClear(pPa
277d0 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71  rse);.        sq
277e0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70  lite3ExprCodeExp
277f0 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 47  rList(pParse, pG
27800 72 6f 75 70 42 79 2c 20 72 65 67 42 61 73 65 2c  roupBy, regBase,
27810 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   0);.        sql
27820 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
27830 2c 20 4f 50 5f 53 65 71 75 65 6e 63 65 2c 20 73  , OP_Sequence, s
27840 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49  AggInfo.sortingI
27850 64 78 2c 72 65 67 42 61 73 65 2b 6e 47 72 6f 75  dx,regBase+nGrou
27860 70 42 79 29 3b 0a 20 20 20 20 20 20 20 20 6a 20  pBy);.        j 
27870 3d 20 6e 47 72 6f 75 70 42 79 2b 31 3b 0a 20 20  = nGroupBy+1;.  
27880 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
27890 3c 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d  <sAggInfo.nColum
278a0 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  n; i++){.       
278b0 20 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66     struct AggInf
278c0 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20 3d 20 26 73  o_col *pCol = &s
278d0 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69 5d 3b  AggInfo.aCol[i];
278e0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
278f0 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75  Col->iSorterColu
27900 6d 6e 3e 3d 6a 20 29 7b 0a 20 20 20 20 20 20 20  mn>=j ){.       
27910 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20 6a 20       int r1 = j 
27920 2b 20 72 65 67 42 61 73 65 3b 0a 20 20 20 20 20  + regBase;.     
27930 20 20 20 20 20 20 20 69 6e 74 20 72 32 3b 0a 0a         int r2;..
27940 20 20 20 20 20 20 20 20 20 20 20 20 72 32 20 3d              r2 =
27950 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
27960 47 65 74 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65  GetColumn(pParse
27970 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
27980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27990 20 20 70 43 6f 6c 2d 3e 70 54 61 62 2c 20 70 43    pCol->pTab, pC
279a0 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 70 43 6f  ol->iColumn, pCo
279b0 6c 2d 3e 69 54 61 62 6c 65 2c 20 72 31 2c 20 30  l->iTable, r1, 0
279c0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
279d0 66 28 20 72 31 21 3d 72 32 20 29 7b 0a 20 20 20  f( r1!=r2 ){.   
279e0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
279f0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
27a00 4f 50 5f 53 43 6f 70 79 2c 20 72 32 2c 20 72 31  OP_SCopy, r2, r1
27a10 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
27a20 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a 2b 2b  .            j++
27a30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
27a40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
27a50 72 65 67 52 65 63 6f 72 64 20 3d 20 73 71 6c 69  regRecord = sqli
27a60 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
27a70 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73  arse);.        s
27a80 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
27a90 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
27aa0 64 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f 6c  d, regBase, nCol
27ab0 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20  , regRecord);.  
27ac0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
27ad0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f  eAddOp2(v, OP_So
27ae0 72 74 65 72 49 6e 73 65 72 74 2c 20 73 41 67 67  rterInsert, sAgg
27af0 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c  Info.sortingIdx,
27b00 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 20   regRecord);.   
27b10 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
27b20 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
27b30 65 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20  e, regRecord);. 
27b40 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65         sqlite3Re
27b50 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70  leaseTempRange(p
27b60 50 61 72 73 65 2c 20 72 65 67 42 61 73 65 2c 20  Parse, regBase, 
27b70 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73  nCol);.        s
27b80 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70  qlite3WhereEnd(p
27b90 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  WInfo);.        
27ba0 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67  sAggInfo.sorting
27bb0 49 64 78 50 54 61 62 20 3d 20 73 6f 72 74 50 54  IdxPTab = sortPT
27bc0 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ab = pParse->nTa
27bd0 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 73 6f 72  b++;.        sor
27be0 74 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 47 65  tOut = sqlite3Ge
27bf0 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
27c00 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
27c10 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
27c20 50 5f 4f 70 65 6e 50 73 65 75 64 6f 2c 20 73 6f  P_OpenPseudo, so
27c30 72 74 50 54 61 62 2c 20 73 6f 72 74 4f 75 74 2c  rtPTab, sortOut,
27c40 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20   nCol);.        
27c50 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
27c60 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 53 6f  2(v, OP_SorterSo
27c70 72 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72  rt, sAggInfo.sor
27c80 74 69 6e 67 49 64 78 2c 20 61 64 64 72 45 6e 64  tingIdx, addrEnd
27c90 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
27ca0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 47 52 4f 55  omment((v, "GROU
27cb0 50 20 42 59 20 73 6f 72 74 22 29 29 3b 0a 20 20  P BY sort"));.  
27cc0 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 75        sAggInfo.u
27cd0 73 65 53 6f 72 74 69 6e 67 49 64 78 20 3d 20 31  seSortingIdx = 1
27ce0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
27cf0 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28  3ExprCacheClear(
27d00 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 7d  pParse);.      }
27d10 0a 0a 20 20 20 20 20 20 2f 2a 20 45 76 61 6c 75  ..      /* Evalu
27d20 61 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ate the current 
27d30 47 52 4f 55 50 20 42 59 20 74 65 72 6d 73 20 61  GROUP BY terms a
27d40 6e 64 20 73 74 6f 72 65 20 69 6e 20 62 30 2c 20  nd store in b0, 
27d50 62 31 2c 20 62 32 2e 2e 2e 0a 20 20 20 20 20 20  b1, b2....      
27d60 2a 2a 20 28 62 30 20 69 73 20 6d 65 6d 6f 72 79  ** (b0 is memory
27d70 20 6c 6f 63 61 74 69 6f 6e 20 69 42 4d 65 6d 2b   location iBMem+
27d80 30 2c 20 62 31 20 69 73 20 69 42 4d 65 6d 2b 31  0, b1 is iBMem+1
27d90 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 29 0a  , and so forth).
27da0 20 20 20 20 20 20 2a 2a 20 54 68 65 6e 20 63 6f        ** Then co
27db0 6d 70 61 72 65 20 74 68 65 20 63 75 72 72 65 6e  mpare the curren
27dc0 74 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d 73  t GROUP BY terms
27dd0 20 61 67 61 69 6e 73 74 20 74 68 65 20 47 52 4f   against the GRO
27de0 55 50 20 42 59 20 74 65 72 6d 73 0a 20 20 20 20  UP BY terms.    
27df0 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 70 72    ** from the pr
27e00 65 76 69 6f 75 73 20 72 6f 77 20 63 75 72 72 65  evious row curre
27e10 6e 74 6c 79 20 73 74 6f 72 65 64 20 69 6e 20 61  ntly stored in a
27e20 30 2c 20 61 31 2c 20 61 32 2e 2e 2e 0a 20 20 20  0, a1, a2....   
27e30 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 64 64 72     */.      addr
27e40 54 6f 70 4f 66 4c 6f 6f 70 20 3d 20 73 71 6c 69  TopOfLoop = sqli
27e50 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
27e60 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c  dr(v);.      sql
27e70 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65  ite3ExprCacheCle
27e80 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  ar(pParse);.    
27e90 20 20 69 66 28 20 67 72 6f 75 70 42 79 53 6f 72    if( groupBySor
27ea0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
27eb0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
27ec0 2c 20 4f 50 5f 53 6f 72 74 65 72 44 61 74 61 2c  , OP_SorterData,
27ed0 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e   sAggInfo.sortin
27ee0 67 49 64 78 2c 20 73 6f 72 74 4f 75 74 29 3b 0a  gIdx, sortOut);.
27ef0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f        }.      fo
27f00 72 28 6a 3d 30 3b 20 6a 3c 70 47 72 6f 75 70 42  r(j=0; j<pGroupB
27f10 79 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a  y->nExpr; j++){.
27f20 20 20 20 20 20 20 20 20 69 66 28 20 67 72 6f 75          if( grou
27f30 70 42 79 53 6f 72 74 20 29 7b 0a 20 20 20 20 20  pBySort ){.     
27f40 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
27f50 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
27f60 75 6d 6e 2c 20 73 6f 72 74 50 54 61 62 2c 20 6a  umn, sortPTab, j
27f70 2c 20 69 42 4d 65 6d 2b 6a 29 3b 0a 20 20 20 20  , iBMem+j);.    
27f80 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 30 20 29        if( j==0 )
27f90 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
27fa0 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 43  geP5(v, OPFLAG_C
27fb0 4c 45 41 52 43 41 43 48 45 29 3b 0a 20 20 20 20  LEARCACHE);.    
27fc0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
27fd0 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 64 69       sAggInfo.di
27fe0 72 65 63 74 4d 6f 64 65 20 3d 20 31 3b 0a 20 20  rectMode = 1;.  
27ff0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
28000 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
28010 70 47 72 6f 75 70 42 79 2d 3e 61 5b 6a 5d 2e 70  pGroupBy->a[j].p
28020 45 78 70 72 2c 20 69 42 4d 65 6d 2b 6a 29 3b 0a  Expr, iBMem+j);.
28030 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
28040 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
28050 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
28060 43 6f 6d 70 61 72 65 2c 20 69 41 4d 65 6d 2c 20  Compare, iAMem, 
28070 69 42 4d 65 6d 2c 20 70 47 72 6f 75 70 42 79 2d  iBMem, pGroupBy-
28080 3e 6e 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20  >nExpr,.        
28090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
280a0 20 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33    (char*)sqlite3
280b0 4b 65 79 49 6e 66 6f 52 65 66 28 70 4b 65 79 49  KeyInfoRef(pKeyI
280c0 6e 66 6f 29 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  nfo), P4_KEYINFO
280d0 29 3b 0a 20 20 20 20 20 20 6a 31 20 3d 20 73 71  );.      j1 = sq
280e0 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
280f0 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73  Addr(v);.      s
28100 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
28110 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 6a 31 2b  (v, OP_Jump, j1+
28120 31 2c 20 30 2c 20 6a 31 2b 31 29 3b 0a 0a 20 20  1, 0, j1+1);..  
28130 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
28140 63 6f 64 65 20 74 68 61 74 20 72 75 6e 73 20 77  code that runs w
28150 68 65 6e 65 76 65 72 20 74 68 65 20 47 52 4f 55  henever the GROU
28160 50 20 42 59 20 63 68 61 6e 67 65 73 2e 0a 20 20  P BY changes..  
28170 20 20 20 20 2a 2a 20 43 68 61 6e 67 65 73 20 69      ** Changes i
28180 6e 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 61  n the GROUP BY a
28190 72 65 20 64 65 74 65 63 74 65 64 20 62 79 20 74  re detected by t
281a0 68 65 20 70 72 65 76 69 6f 75 73 20 63 6f 64 65  he previous code
281b0 0a 20 20 20 20 20 20 2a 2a 20 62 6c 6f 63 6b 2e  .      ** block.
281c0 20 20 49 66 20 74 68 65 72 65 20 77 65 72 65 20    If there were 
281d0 6e 6f 20 63 68 61 6e 67 65 73 2c 20 74 68 69 73  no changes, this
281e0 20 62 6c 6f 63 6b 20 69 73 20 73 6b 69 70 70 65   block is skippe
281f0 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  d..      **.    
28200 20 20 2a 2a 20 54 68 69 73 20 63 6f 64 65 20 63    ** This code c
28210 6f 70 69 65 73 20 63 75 72 72 65 6e 74 20 67 72  opies current gr
28220 6f 75 70 20 62 79 20 74 65 72 6d 73 20 69 6e 20  oup by terms in 
28230 62 30 2c 62 31 2c 62 32 2c 2e 2e 2e 0a 20 20 20  b0,b1,b2,....   
28240 20 20 20 2a 2a 20 6f 76 65 72 20 74 6f 20 61 30     ** over to a0
28250 2c 61 31 2c 61 32 2e 20 20 49 74 20 74 68 65 6e  ,a1,a2.  It then
28260 20 63 61 6c 6c 73 20 74 68 65 20 6f 75 74 70 75   calls the outpu
28270 74 20 73 75 62 72 6f 75 74 69 6e 65 0a 20 20 20  t subroutine.   
28280 20 20 20 2a 2a 20 61 6e 64 20 72 65 73 65 74 73     ** and resets
28290 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20 61   the aggregate a
282a0 63 63 75 6d 75 6c 61 74 6f 72 20 72 65 67 69 73  ccumulator regis
282b0 74 65 72 73 20 69 6e 20 70 72 65 70 61 72 61 74  ters in preparat
282c0 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72  ion.      ** for
282d0 20 74 68 65 20 6e 65 78 74 20 47 52 4f 55 50 20   the next GROUP 
282e0 42 59 20 62 61 74 63 68 2e 0a 20 20 20 20 20 20  BY batch..      
282f0 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
28300 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61  ExprCodeMove(pPa
28310 72 73 65 2c 20 69 42 4d 65 6d 2c 20 69 41 4d 65  rse, iBMem, iAMe
28320 6d 2c 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78  m, pGroupBy->nEx
28330 70 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  pr);.      sqlit
28340 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
28350 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74  OP_Gosub, regOut
28360 70 75 74 52 6f 77 2c 20 61 64 64 72 4f 75 74 70  putRow, addrOutp
28370 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 56 64  utRow);.      Vd
28380 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6f  beComment((v, "o
28390 75 74 70 75 74 20 6f 6e 65 20 72 6f 77 22 29 29  utput one row"))
283a0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
283b0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
283c0 49 66 50 6f 73 2c 20 69 41 62 6f 72 74 46 6c 61  IfPos, iAbortFla
283d0 67 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20 20 20  g, addrEnd);.   
283e0 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
283f0 76 2c 20 22 63 68 65 63 6b 20 61 62 6f 72 74 20  v, "check abort 
28400 66 6c 61 67 22 29 29 3b 0a 20 20 20 20 20 20 73  flag"));.      s
28410 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
28420 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65  (v, OP_Gosub, re
28430 67 52 65 73 65 74 2c 20 61 64 64 72 52 65 73 65  gReset, addrRese
28440 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  t);.      VdbeCo
28450 6d 6d 65 6e 74 28 28 76 2c 20 22 72 65 73 65 74  mment((v, "reset
28460 20 61 63 63 75 6d 75 6c 61 74 6f 72 22 29 29 3b   accumulator"));
28470 0a 0a 20 20 20 20 20 20 2f 2a 20 55 70 64 61 74  ..      /* Updat
28480 65 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20  e the aggregate 
28490 61 63 63 75 6d 75 6c 61 74 6f 72 73 20 62 61 73  accumulators bas
284a0 65 64 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65 6e  ed on the conten
284b0 74 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74 68  t of.      ** th
284c0 65 20 63 75 72 72 65 6e 74 20 72 6f 77 0a 20 20  e current row.  
284d0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
284e0 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
284f0 28 76 2c 20 6a 31 29 3b 0a 20 20 20 20 20 20 75  (v, j1);.      u
28500 70 64 61 74 65 41 63 63 75 6d 75 6c 61 74 6f 72  pdateAccumulator
28510 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e  (pParse, &sAggIn
28520 66 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  fo);.      sqlit
28530 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
28540 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 69  OP_Integer, 1, i
28550 55 73 65 46 6c 61 67 29 3b 0a 20 20 20 20 20 20  UseFlag);.      
28560 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
28570 22 69 6e 64 69 63 61 74 65 20 64 61 74 61 20 69  "indicate data i
28580 6e 20 61 63 63 75 6d 75 6c 61 74 6f 72 22 29 29  n accumulator"))
28590 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 45 6e 64 20  ;..      /* End 
285a0 6f 66 20 74 68 65 20 6c 6f 6f 70 0a 20 20 20 20  of the loop.    
285b0 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 67    */.      if( g
285c0 72 6f 75 70 42 79 53 6f 72 74 20 29 7b 0a 20 20  roupBySort ){.  
285d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
285e0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f  eAddOp2(v, OP_So
285f0 72 74 65 72 4e 65 78 74 2c 20 73 41 67 67 49 6e  rterNext, sAggIn
28600 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 61  fo.sortingIdx, a
28610 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 29 3b 0a 20  ddrTopOfLoop);. 
28620 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
28630 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65      sqlite3Where
28640 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20  End(pWInfo);.   
28650 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
28660 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20  ChangeToNoop(v, 
28670 61 64 64 72 53 6f 72 74 69 6e 67 49 64 78 29 3b  addrSortingIdx);
28680 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
28690 2f 2a 20 4f 75 74 70 75 74 20 74 68 65 20 66 69  /* Output the fi
286a0 6e 61 6c 20 72 6f 77 20 6f 66 20 72 65 73 75 6c  nal row of resul
286b0 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  t.      */.     
286c0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
286d0 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
286e0 72 65 67 4f 75 74 70 75 74 52 6f 77 2c 20 61 64  regOutputRow, ad
286f0 64 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20  drOutputRow);.  
28700 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
28710 28 76 2c 20 22 6f 75 74 70 75 74 20 66 69 6e 61  (v, "output fina
28720 6c 20 72 6f 77 22 29 29 3b 0a 0a 20 20 20 20 20  l row"));..     
28730 20 2f 2a 20 4a 75 6d 70 20 6f 76 65 72 20 74 68   /* Jump over th
28740 65 20 73 75 62 72 6f 75 74 69 6e 65 73 0a 20 20  e subroutines.  
28750 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
28760 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
28770 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64  , OP_Goto, 0, ad
28780 64 72 45 6e 64 29 3b 0a 0a 20 20 20 20 20 20 2f  drEnd);..      /
28790 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62  * Generate a sub
287a0 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74  routine that out
287b0 70 75 74 73 20 61 20 73 69 6e 67 6c 65 20 72 6f  puts a single ro
287c0 77 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 0a  w of the result.
287d0 20 20 20 20 20 20 2a 2a 20 73 65 74 2e 20 20 54        ** set.  T
287e0 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65 20 66  his subroutine f
287f0 69 72 73 74 20 6c 6f 6f 6b 73 20 61 74 20 74 68  irst looks at th
28800 65 20 69 55 73 65 46 6c 61 67 2e 20 20 49 66 20  e iUseFlag.  If 
28810 69 55 73 65 46 6c 61 67 0a 20 20 20 20 20 20 2a  iUseFlag.      *
28820 2a 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f  * is less than o
28830 72 20 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f 2c  r equal to zero,
28840 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20   the subroutine 
28850 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 49 66 0a  is a no-op.  If.
28860 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70 72 6f        ** the pro
28870 63 65 73 73 69 6e 67 20 63 61 6c 6c 73 20 66 6f  cessing calls fo
28880 72 20 74 68 65 20 71 75 65 72 79 20 74 6f 20 61  r the query to a
28890 62 6f 72 74 2c 20 74 68 69 73 20 73 75 62 72 6f  bort, this subro
288a0 75 74 69 6e 65 0a 20 20 20 20 20 20 2a 2a 20 69  utine.      ** i
288b0 6e 63 72 65 6d 65 6e 74 73 20 74 68 65 20 69 41  ncrements the iA
288c0 62 6f 72 74 46 6c 61 67 20 6d 65 6d 6f 72 79 20  bortFlag memory 
288d0 6c 6f 63 61 74 69 6f 6e 20 62 65 66 6f 72 65 20  location before 
288e0 72 65 74 75 72 6e 69 6e 67 20 69 6e 0a 20 20 20  returning in.   
288f0 20 20 20 2a 2a 20 6f 72 64 65 72 20 74 6f 20 73     ** order to s
28900 69 67 6e 61 6c 20 74 68 65 20 63 61 6c 6c 65 72  ignal the caller
28910 20 74 6f 20 61 62 6f 72 74 2e 0a 20 20 20 20 20   to abort..     
28920 20 2a 2f 0a 20 20 20 20 20 20 61 64 64 72 53 65   */.      addrSe
28930 74 41 62 6f 72 74 20 3d 20 73 71 6c 69 74 65 33  tAbort = sqlite3
28940 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
28950 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
28960 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
28970 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 69 41  P_Integer, 1, iA
28980 62 6f 72 74 46 6c 61 67 29 3b 0a 20 20 20 20 20  bortFlag);.     
28990 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
289a0 20 22 73 65 74 20 61 62 6f 72 74 20 66 6c 61 67   "set abort flag
289b0 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  "));.      sqlit
289c0 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
289d0 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 4f 75  OP_Return, regOu
289e0 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20  tputRow);.      
289f0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
28a00 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 4f  veLabel(v, addrO
28a10 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20  utputRow);.     
28a20 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 20 3d   addrOutputRow =
28a30 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
28a40 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
28a50 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
28a60 4f 70 32 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c  Op2(v, OP_IfPos,
28a70 20 69 55 73 65 46 6c 61 67 2c 20 61 64 64 72 4f   iUseFlag, addrO
28a80 75 74 70 75 74 52 6f 77 2b 32 29 3b 0a 20 20 20  utputRow+2);.   
28a90 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
28aa0 76 2c 20 22 47 72 6f 75 70 62 79 20 72 65 73 75  v, "Groupby resu
28ab0 6c 74 20 67 65 6e 65 72 61 74 6f 72 20 65 6e 74  lt generator ent
28ac0 72 79 20 70 6f 69 6e 74 22 29 29 3b 0a 20 20 20  ry point"));.   
28ad0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
28ae0 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72  dOp1(v, OP_Retur
28af0 6e 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77 29  n, regOutputRow)
28b00 3b 0a 20 20 20 20 20 20 66 69 6e 61 6c 69 7a 65  ;.      finalize
28b10 41 67 67 46 75 6e 63 74 69 6f 6e 73 28 70 50 61  AggFunctions(pPa
28b20 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b  rse, &sAggInfo);
28b30 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
28b40 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
28b50 2c 20 70 48 61 76 69 6e 67 2c 20 61 64 64 72 4f  , pHaving, addrO
28b60 75 74 70 75 74 52 6f 77 2b 31 2c 20 53 51 4c 49  utputRow+1, SQLI
28b70 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a  TE_JUMPIFNULL);.
28b80 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65        selectInne
28b90 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c  rLoop(pParse, p,
28ba0 20 70 2d 3e 70 45 4c 69 73 74 2c 20 30 2c 20 30   p->pEList, 0, 0
28bb0 2c 20 70 4f 72 64 65 72 42 79 2c 0a 20 20 20 20  , pOrderBy,.    
28bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28bd0 20 20 26 73 44 69 73 74 69 6e 63 74 2c 20 70 44    &sDistinct, pD
28be0 65 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  est,.           
28bf0 20 20 20 20 20 20 20 20 20 20 20 61 64 64 72 4f             addrO
28c00 75 74 70 75 74 52 6f 77 2b 31 2c 20 61 64 64 72  utputRow+1, addr
28c10 53 65 74 41 62 6f 72 74 29 3b 0a 20 20 20 20 20  SetAbort);.     
28c20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
28c30 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c  p1(v, OP_Return,
28c40 20 72 65 67 4f 75 74 70 75 74 52 6f 77 29 3b 0a   regOutputRow);.
28c50 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
28c60 74 28 28 76 2c 20 22 65 6e 64 20 67 72 6f 75 70  t((v, "end group
28c70 62 79 20 72 65 73 75 6c 74 20 67 65 6e 65 72 61  by result genera
28c80 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f  tor"));..      /
28c90 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62  * Generate a sub
28ca0 72 6f 75 74 69 6e 65 20 74 68 61 74 20 77 69 6c  routine that wil
28cb0 6c 20 72 65 73 65 74 20 74 68 65 20 67 72 6f 75  l reset the grou
28cc0 70 2d 62 79 20 61 63 63 75 6d 75 6c 61 74 6f 72  p-by accumulator
28cd0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
28ce0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
28cf0 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 52  veLabel(v, addrR
28d00 65 73 65 74 29 3b 0a 20 20 20 20 20 20 72 65 73  eset);.      res
28d10 65 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50  etAccumulator(pP
28d20 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29  arse, &sAggInfo)
28d30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
28d40 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
28d50 52 65 74 75 72 6e 2c 20 72 65 67 52 65 73 65 74  Return, regReset
28d60 29 3b 0a 20 20 20 20 20 0a 20 20 20 20 7d 20 2f  );.     .    } /
28d70 2a 20 65 6e 64 69 66 20 70 47 72 6f 75 70 42 79  * endif pGroupBy
28d80 2e 20 20 42 65 67 69 6e 20 61 67 67 72 65 67 61  .  Begin aggrega
28d90 74 65 20 71 75 65 72 69 65 73 20 77 69 74 68 6f  te queries witho
28da0 75 74 20 47 52 4f 55 50 20 42 59 3a 20 2a 2f 0a  ut GROUP BY: */.
28db0 20 20 20 20 65 6c 73 65 20 7b 0a 20 20 20 20 20      else {.     
28dc0 20 45 78 70 72 4c 69 73 74 20 2a 70 44 65 6c 20   ExprList *pDel 
28dd0 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  = 0;.#ifndef SQL
28de0 49 54 45 5f 4f 4d 49 54 5f 42 54 52 45 45 43 4f  ITE_OMIT_BTREECO
28df0 55 4e 54 0a 20 20 20 20 20 20 54 61 62 6c 65 20  UNT.      Table 
28e00 2a 70 54 61 62 3b 0a 20 20 20 20 20 20 69 66 28  *pTab;.      if(
28e10 20 28 70 54 61 62 20 3d 20 69 73 53 69 6d 70 6c   (pTab = isSimpl
28e20 65 43 6f 75 6e 74 28 70 2c 20 26 73 41 67 67 49  eCount(p, &sAggI
28e30 6e 66 6f 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  nfo))!=0 ){.    
28e40 20 20 20 20 2f 2a 20 49 66 20 69 73 53 69 6d 70      /* If isSimp
28e50 6c 65 43 6f 75 6e 74 28 29 20 72 65 74 75 72 6e  leCount() return
28e60 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
28e70 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   Table structure
28e80 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 20 20 2a  , then.        *
28e90 2a 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d  * the SQL statem
28ea0 65 6e 74 20 69 73 20 6f 66 20 74 68 65 20 66 6f  ent is of the fo
28eb0 72 6d 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  rm:.        **. 
28ec0 20 20 20 20 20 20 20 2a 2a 20 20 20 53 45 4c 45         **   SELE
28ed0 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  CT count(*) FROM
28ee0 20 3c 74 62 6c 3e 0a 20 20 20 20 20 20 20 20 2a   <tbl>.        *
28ef0 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 68 65  *.        ** whe
28f00 72 65 20 74 68 65 20 54 61 62 6c 65 20 73 74 72  re the Table str
28f10 75 63 74 75 72 65 20 72 65 74 75 72 6e 65 64 20  ucture returned 
28f20 72 65 70 72 65 73 65 6e 74 73 20 74 61 62 6c 65  represents table
28f30 20 3c 74 62 6c 3e 2e 0a 20 20 20 20 20 20 20 20   <tbl>..        
28f40 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68  **.        ** Th
28f50 69 73 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20  is statement is 
28f60 73 6f 20 63 6f 6d 6d 6f 6e 20 74 68 61 74 20 69  so common that i
28f70 74 20 69 73 20 6f 70 74 69 6d 69 7a 65 64 20 73  t is optimized s
28f80 70 65 63 69 61 6c 6c 79 2e 20 54 68 65 0a 20 20  pecially. The.  
28f90 20 20 20 20 20 20 2a 2a 20 4f 50 5f 43 6f 75 6e        ** OP_Coun
28fa0 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73  t instruction is
28fb0 20 65 78 65 63 75 74 65 64 20 65 69 74 68 65 72   executed either
28fc0 20 6f 6e 20 74 68 65 20 69 6e 74 6b 65 79 20 74   on the intkey t
28fd0 61 62 6c 65 20 74 68 61 74 0a 20 20 20 20 20 20  able that.      
28fe0 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68    ** contains th
28ff0 65 20 64 61 74 61 20 66 6f 72 20 74 61 62 6c 65  e data for table
29000 20 3c 74 62 6c 3e 20 6f 72 20 6f 6e 20 6f 6e 65   <tbl> or on one
29010 20 6f 66 20 69 74 73 20 69 6e 64 65 78 65 73 2e   of its indexes.
29020 20 49 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 69   It.        ** i
29030 73 20 62 65 74 74 65 72 20 74 6f 20 65 78 65 63  s better to exec
29040 75 74 65 20 74 68 65 20 6f 70 20 6f 6e 20 61 6e  ute the op on an
29050 20 69 6e 64 65 78 2c 20 61 73 20 69 6e 64 65 78   index, as index
29060 65 73 20 61 72 65 20 61 6c 6d 6f 73 74 0a 20 20  es are almost.  
29070 20 20 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20        ** always 
29080 73 70 72 65 61 64 20 61 63 72 6f 73 73 20 6c 65  spread across le
29090 73 73 20 70 61 67 65 73 20 74 68 61 6e 20 74 68  ss pages than th
290a0 65 69 72 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  eir correspondin
290b0 67 20 74 61 62 6c 65 73 2e 0a 20 20 20 20 20 20  g tables..      
290c0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f 6e    */.        con
290d0 73 74 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c  st int iDb = sql
290e0 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
290f0 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54  x(pParse->db, pT
29100 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  ab->pSchema);.  
29110 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20        const int 
29120 69 43 73 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e  iCsr = pParse->n
29130 54 61 62 2b 2b 3b 20 20 20 20 20 2f 2a 20 43 75  Tab++;     /* Cu
29140 72 73 6f 72 20 74 6f 20 73 63 61 6e 20 62 2d 74  rsor to scan b-t
29150 72 65 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 49  ree */.        I
29160 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20  ndex *pIdx;     
29170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29180 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20      /* Iterator 
29190 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20  variable */.    
291a0 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65      KeyInfo *pKe
291b0 79 49 6e 66 6f 20 3d 20 30 3b 20 20 20 20 20 20  yInfo = 0;      
291c0 20 20 20 20 20 20 20 20 20 2f 2a 20 4b 65 79 69           /* Keyi
291d0 6e 66 6f 20 66 6f 72 20 73 63 61 6e 6e 65 64 20  nfo for scanned 
291e0 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 20  index */.       
291f0 20 49 6e 64 65 78 20 2a 70 42 65 73 74 20 3d 20   Index *pBest = 
29200 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
29210 20 20 20 20 20 20 2f 2a 20 42 65 73 74 20 69 6e        /* Best in
29220 64 65 78 20 66 6f 75 6e 64 20 73 6f 20 66 61 72  dex found so far
29230 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
29240 69 52 6f 6f 74 20 3d 20 70 54 61 62 2d 3e 74 6e  iRoot = pTab->tn
29250 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  um;             
29260 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66   /* Root page of
29270 20 73 63 61 6e 6e 65 64 20 62 2d 74 72 65 65 20   scanned b-tree 
29280 2a 2f 0a 0a 20 20 20 20 20 20 20 20 73 71 6c 69  */..        sqli
29290 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68  te3CodeVerifySch
292a0 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29  ema(pParse, iDb)
292b0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
292c0 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73  3TableLock(pPars
292d0 65 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e  e, iDb, pTab->tn
292e0 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61  um, 0, pTab->zNa
292f0 6d 65 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a  me);..        /*
29300 20 53 65 61 72 63 68 20 66 6f 72 20 74 68 65 20   Search for the 
29310 69 6e 64 65 78 20 74 68 61 74 20 68 61 73 20 74  index that has t
29320 68 65 20 6c 6f 77 65 73 74 20 73 63 61 6e 20 63  he lowest scan c
29330 6f 73 74 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ost..        **.
29340 20 20 20 20 20 20 20 20 2a 2a 20 28 32 30 31 31          ** (2011
29350 2d 30 34 2d 31 35 29 20 44 6f 20 6e 6f 74 20 64  -04-15) Do not d
29360 6f 20 61 20 66 75 6c 6c 20 73 63 61 6e 20 6f 66  o a full scan of
29370 20 61 6e 20 75 6e 6f 72 64 65 72 65 64 20 69 6e   an unordered in
29380 64 65 78 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  dex..        **.
29390 20 20 20 20 20 20 20 20 2a 2a 20 28 32 30 31 33          ** (2013
293a0 2d 31 30 2d 30 33 29 20 44 6f 20 6e 6f 74 20 63  -10-03) Do not c
293b0 6f 75 6e 74 20 74 68 65 20 65 6e 74 69 72 65 73  ount the entires
293c0 20 69 6e 20 61 20 70 61 72 74 69 61 6c 20 69 6e   in a partial in
293d0 64 65 78 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  dex..        **.
293e0 20 20 20 20 20 20 20 20 2a 2a 20 49 6e 20 70 72          ** In pr
293f0 61 63 74 69 63 65 20 74 68 65 20 4b 65 79 49 6e  actice the KeyIn
29400 66 6f 20 73 74 72 75 63 74 75 72 65 20 77 69 6c  fo structure wil
29410 6c 20 6e 6f 74 20 62 65 20 75 73 65 64 2e 20 49  l not be used. I
29420 74 20 69 73 20 6f 6e 6c 79 20 0a 20 20 20 20 20  t is only .     
29430 20 20 20 2a 2a 20 70 61 73 73 65 64 20 74 6f 20     ** passed to 
29440 6b 65 65 70 20 4f 50 5f 4f 70 65 6e 52 65 61 64  keep OP_OpenRead
29450 20 68 61 70 70 79 2e 0a 20 20 20 20 20 20 20 20   happy..        
29460 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f 72 28 70  */.        for(p
29470 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  Idx=pTab->pIndex
29480 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64  ; pIdx; pIdx=pId
29490 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  x->pNext){.     
294a0 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 62       if( pIdx->b
294b0 55 6e 6f 72 64 65 72 65 64 3d 3d 30 0a 20 20 20  Unordered==0.   
294c0 20 20 20 20 20 20 20 20 26 26 20 70 49 64 78 2d          && pIdx-
294d0 3e 73 7a 49 64 78 52 6f 77 3c 70 54 61 62 2d 3e  >szIdxRow<pTab->
294e0 73 7a 54 61 62 52 6f 77 0a 20 20 20 20 20 20 20  szTabRow.       
294f0 20 20 20 20 26 26 20 70 49 64 78 2d 3e 70 50 61      && pIdx->pPa
29500 72 74 49 64 78 57 68 65 72 65 3d 3d 30 0a 20 20  rtIdxWhere==0.  
29510 20 20 20 20 20 20 20 20 20 26 26 20 28 21 70 42           && (!pB
29520 65 73 74 20 7c 7c 20 70 49 64 78 2d 3e 73 7a 49  est || pIdx->szI
29530 64 78 52 6f 77 3c 70 42 65 73 74 2d 3e 73 7a 49  dxRow<pBest->szI
29540 64 78 52 6f 77 29 0a 20 20 20 20 20 20 20 20 20  dxRow).         
29550 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
29560 70 42 65 73 74 20 3d 20 70 49 64 78 3b 0a 20 20  pBest = pIdx;.  
29570 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
29580 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
29590 70 42 65 73 74 20 29 7b 0a 20 20 20 20 20 20 20  pBest ){.       
295a0 20 20 20 69 52 6f 6f 74 20 3d 20 70 42 65 73 74     iRoot = pBest
295b0 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20 20 20  ->tnum;.        
295c0 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c    pKeyInfo = sql
295d0 69 74 65 33 4b 65 79 49 6e 66 6f 4f 66 49 6e 64  ite3KeyInfoOfInd
295e0 65 78 28 70 50 61 72 73 65 2c 20 70 42 65 73 74  ex(pParse, pBest
295f0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  );.        }..  
29600 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 61 20        /* Open a 
29610 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72  read-only cursor
29620 2c 20 65 78 65 63 75 74 65 20 74 68 65 20 4f 50  , execute the OP
29630 5f 43 6f 75 6e 74 2c 20 63 6c 6f 73 65 20 74 68  _Count, close th
29640 65 20 63 75 72 73 6f 72 2e 20 2a 2f 0a 20 20 20  e cursor. */.   
29650 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
29660 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f  AddOp4Int(v, OP_
29670 4f 70 65 6e 52 65 61 64 2c 20 69 43 73 72 2c 20  OpenRead, iCsr, 
29680 69 52 6f 6f 74 2c 20 69 44 62 2c 20 31 29 3b 0a  iRoot, iDb, 1);.
29690 20 20 20 20 20 20 20 20 69 66 28 20 70 4b 65 79          if( pKey
296a0 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 20 20  Info ){.        
296b0 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
296c0 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 28 63 68  ngeP4(v, -1, (ch
296d0 61 72 20 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50  ar *)pKeyInfo, P
296e0 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20  4_KEYINFO);.    
296f0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
29700 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
29710 76 2c 20 4f 50 5f 43 6f 75 6e 74 2c 20 69 43 73  v, OP_Count, iCs
29720 72 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e  r, sAggInfo.aFun
29730 63 5b 30 5d 2e 69 4d 65 6d 29 3b 0a 20 20 20 20  c[0].iMem);.    
29740 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
29750 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73  ddOp1(v, OP_Clos
29760 65 2c 20 69 43 73 72 29 3b 0a 20 20 20 20 20 20  e, iCsr);.      
29770 20 20 65 78 70 6c 61 69 6e 53 69 6d 70 6c 65 43    explainSimpleC
29780 6f 75 6e 74 28 70 50 61 72 73 65 2c 20 70 54 61  ount(pParse, pTa
29790 62 2c 20 70 42 65 73 74 29 3b 0a 20 20 20 20 20  b, pBest);.     
297a0 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a   }else.#endif /*
297b0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 54 52   SQLITE_OMIT_BTR
297c0 45 45 43 4f 55 4e 54 20 2a 2f 0a 20 20 20 20 20  EECOUNT */.     
297d0 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68   {.        /* Ch
297e0 65 63 6b 20 69 66 20 74 68 65 20 71 75 65 72 79  eck if the query
297f0 20 69 73 20 6f 66 20 6f 6e 65 20 6f 66 20 74 68   is of one of th
29800 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d  e following form
29810 73 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  s:.        **.  
29820 20 20 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43        **   SELEC
29830 54 20 6d 69 6e 28 78 29 20 46 52 4f 4d 20 2e 2e  T min(x) FROM ..
29840 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 53  ..        **   S
29850 45 4c 45 43 54 20 6d 61 78 28 78 29 20 46 52 4f  ELECT max(x) FRO
29860 4d 20 2e 2e 2e 0a 20 20 20 20 20 20 20 20 2a 2a  M ....        **
29870 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20 69  .        ** If i
29880 74 20 69 73 2c 20 74 68 65 6e 20 61 73 6b 20 74  t is, then ask t
29890 68 65 20 63 6f 64 65 20 69 6e 20 77 68 65 72 65  he code in where
298a0 2e 63 20 74 6f 20 61 74 74 65 6d 70 74 20 74 6f  .c to attempt to
298b0 20 73 6f 72 74 20 72 65 73 75 6c 74 73 0a 20 20   sort results.  
298c0 20 20 20 20 20 20 2a 2a 20 61 73 20 69 66 20 74        ** as if t
298d0 68 65 72 65 20 77 61 73 20 61 6e 20 22 4f 52 44  here was an "ORD
298e0 45 52 20 4f 4e 20 78 22 20 6f 72 20 22 4f 52 44  ER ON x" or "ORD
298f0 45 52 20 4f 4e 20 78 20 44 45 53 43 22 20 63 6c  ER ON x DESC" cl
29900 61 75 73 65 2e 20 0a 20 20 20 20 20 20 20 20 2a  ause. .        *
29910 2a 20 49 66 20 77 68 65 72 65 2e 63 20 69 73 20  * If where.c is 
29920 61 62 6c 65 20 74 6f 20 70 72 6f 64 75 63 65 20  able to produce 
29930 72 65 73 75 6c 74 73 20 73 6f 72 74 65 64 20 69  results sorted i
29940 6e 20 74 68 69 73 20 6f 72 64 65 72 2c 20 74 68  n this order, th
29950 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 64  en.        ** ad
29960 64 20 76 64 62 65 20 63 6f 64 65 20 74 6f 20 62  d vdbe code to b
29970 72 65 61 6b 20 6f 75 74 20 6f 66 20 74 68 65 20  reak out of the 
29980 70 72 6f 63 65 73 73 69 6e 67 20 6c 6f 6f 70 20  processing loop 
29990 61 66 74 65 72 20 74 68 65 20 0a 20 20 20 20 20  after the .     
299a0 20 20 20 2a 2a 20 66 69 72 73 74 20 69 74 65 72     ** first iter
299b0 61 74 69 6f 6e 20 28 73 69 6e 63 65 20 74 68 65  ation (since the
299c0 20 66 69 72 73 74 20 69 74 65 72 61 74 69 6f 6e   first iteration
299d0 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69 73 20   of the loop is 
299e0 0a 20 20 20 20 20 20 20 20 2a 2a 20 67 75 61 72  .        ** guar
299f0 61 6e 74 65 65 64 20 74 6f 20 6f 70 65 72 61 74  anteed to operat
29a00 65 20 6f 6e 20 74 68 65 20 72 6f 77 20 77 69 74  e on the row wit
29a10 68 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 6f 72  h the minimum or
29a20 20 6d 61 78 69 6d 75 6d 20 0a 20 20 20 20 20 20   maximum .      
29a30 20 20 2a 2a 20 76 61 6c 75 65 20 6f 66 20 78 2c    ** value of x,
29a40 20 74 68 65 20 6f 6e 6c 79 20 72 6f 77 20 72 65   the only row re
29a50 71 75 69 72 65 64 29 2e 0a 20 20 20 20 20 20 20  quired)..       
29a60 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 41   **.        ** A
29a70 20 73 70 65 63 69 61 6c 20 66 6c 61 67 20 6d 75   special flag mu
29a80 73 74 20 62 65 20 70 61 73 73 65 64 20 74 6f 20  st be passed to 
29a90 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
29aa0 6e 28 29 20 74 6f 20 73 6c 69 67 68 74 6c 79 0a  n() to slightly.
29ab0 20 20 20 20 20 20 20 20 2a 2a 20 6d 6f 64 69 66          ** modif
29ac0 79 20 62 65 68 61 76 69 6f 72 20 61 73 20 66 6f  y behavior as fo
29ad0 6c 6c 6f 77 73 3a 0a 20 20 20 20 20 20 20 20 2a  llows:.        *
29ae0 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 2b  *.        **   +
29af0 20 49 66 20 74 68 65 20 71 75 65 72 79 20 69 73   If the query is
29b00 20 61 20 22 53 45 4c 45 43 54 20 6d 69 6e 28 78   a "SELECT min(x
29b10 29 22 2c 20 74 68 65 6e 20 74 68 65 20 6c 6f 6f  )", then the loo
29b20 70 20 63 6f 64 65 64 20 62 79 0a 20 20 20 20 20  p coded by.     
29b30 20 20 20 2a 2a 20 20 20 20 20 77 68 65 72 65 2e     **     where.
29b40 63 20 73 68 6f 75 6c 64 20 6e 6f 74 20 69 74 65  c should not ite
29b50 72 61 74 65 20 6f 76 65 72 20 61 6e 79 20 76 61  rate over any va
29b60 6c 75 65 73 20 77 69 74 68 20 61 20 4e 55 4c 4c  lues with a NULL
29b70 20 76 61 6c 75 65 0a 20 20 20 20 20 20 20 20 2a   value.        *
29b80 2a 20 20 20 20 20 66 6f 72 20 78 2e 0a 20 20 20  *     for x..   
29b90 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
29ba0 2a 2a 20 20 20 2b 20 54 68 65 20 6f 70 74 69 6d  **   + The optim
29bb0 69 7a 65 72 20 63 6f 64 65 20 69 6e 20 77 68 65  izer code in whe
29bc0 72 65 2e 63 20 28 74 68 65 20 74 68 69 6e 67 20  re.c (the thing 
29bd0 74 68 61 74 20 64 65 63 69 64 65 73 20 77 68 69  that decides whi
29be0 63 68 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  ch.        **   
29bf0 20 20 69 6e 64 65 78 20 6f 72 20 69 6e 64 69 63    index or indic
29c00 65 73 20 74 6f 20 75 73 65 29 20 73 68 6f 75 6c  es to use) shoul
29c10 64 20 70 6c 61 63 65 20 61 20 64 69 66 66 65 72  d place a differ
29c20 65 6e 74 20 70 72 69 6f 72 69 74 79 20 6f 6e 20  ent priority on 
29c30 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20  .        **     
29c40 73 61 74 69 73 66 79 69 6e 67 20 74 68 65 20 27  satisfying the '
29c50 4f 52 44 45 52 20 42 59 27 20 63 6c 61 75 73 65  ORDER BY' clause
29c60 20 74 68 61 6e 20 69 74 20 64 6f 65 73 20 69 6e   than it does in
29c70 20 6f 74 68 65 72 20 63 61 73 65 73 2e 0a 20 20   other cases..  
29c80 20 20 20 20 20 20 2a 2a 20 20 20 20 20 52 65 66        **     Ref
29c90 65 72 20 74 6f 20 63 6f 64 65 20 61 6e 64 20 63  er to code and c
29ca0 6f 6d 6d 65 6e 74 73 20 69 6e 20 77 68 65 72 65  omments in where
29cb0 2e 63 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a  .c for details..
29cc0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
29cd0 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4d 69     ExprList *pMi
29ce0 6e 4d 61 78 20 3d 20 30 3b 0a 20 20 20 20 20 20  nMax = 0;.      
29cf0 20 20 75 38 20 66 6c 61 67 20 3d 20 57 48 45 52    u8 flag = WHER
29d00 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c  E_ORDERBY_NORMAL
29d10 3b 0a 20 20 20 20 20 20 20 20 0a 20 20 20 20 20  ;.        .     
29d20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 47     assert( p->pG
29d30 72 6f 75 70 42 79 3d 3d 30 20 29 3b 0a 20 20 20  roupBy==0 );.   
29d40 20 20 20 20 20 61 73 73 65 72 74 28 20 66 6c 61       assert( fla
29d50 67 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  g==0 );.        
29d60 69 66 28 20 70 2d 3e 70 48 61 76 69 6e 67 3d 3d  if( p->pHaving==
29d70 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66  0 ){.          f
29d80 6c 61 67 20 3d 20 6d 69 6e 4d 61 78 51 75 65 72  lag = minMaxQuer
29d90 79 28 26 73 41 67 67 49 6e 66 6f 2c 20 26 70 4d  y(&sAggInfo, &pM
29da0 69 6e 4d 61 78 29 3b 0a 20 20 20 20 20 20 20 20  inMax);.        
29db0 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  }.        assert
29dc0 28 20 66 6c 61 67 3d 3d 30 20 7c 7c 20 28 70 4d  ( flag==0 || (pM
29dd0 69 6e 4d 61 78 21 3d 30 20 26 26 20 70 4d 69 6e  inMax!=0 && pMin
29de0 4d 61 78 2d 3e 6e 45 78 70 72 3d 3d 31 29 20 29  Max->nExpr==1) )
29df0 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 66  ;..        if( f
29e00 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20  lag ){.         
29e10 20 70 4d 69 6e 4d 61 78 20 3d 20 73 71 6c 69 74   pMinMax = sqlit
29e20 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62  e3ExprListDup(db
29e30 2c 20 70 4d 69 6e 4d 61 78 2c 20 30 29 3b 0a 20  , pMinMax, 0);. 
29e40 20 20 20 20 20 20 20 20 20 70 44 65 6c 20 3d 20           pDel = 
29e50 70 4d 69 6e 4d 61 78 3b 0a 20 20 20 20 20 20 20  pMinMax;.       
29e60 20 20 20 69 66 28 20 70 4d 69 6e 4d 61 78 20 26     if( pMinMax &
29e70 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  & !db->mallocFai
29e80 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20  led ){.         
29e90 20 20 20 70 4d 69 6e 4d 61 78 2d 3e 61 5b 30 5d     pMinMax->a[0]
29ea0 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20 66 6c 61  .sortOrder = fla
29eb0 67 21 3d 57 48 45 52 45 5f 4f 52 44 45 52 42 59  g!=WHERE_ORDERBY
29ec0 5f 4d 49 4e 20 3f 31 3a 30 3b 0a 20 20 20 20 20  _MIN ?1:0;.     
29ed0 20 20 20 20 20 20 20 70 4d 69 6e 4d 61 78 2d 3e         pMinMax->
29ee0 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 20 3d  a[0].pExpr->op =
29ef0 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20   TK_COLUMN;.    
29f00 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
29f10 7d 0a 20 20 0a 20 20 20 20 20 20 20 20 2f 2a 20  }.  .        /* 
29f20 54 68 69 73 20 63 61 73 65 20 72 75 6e 73 20 69  This case runs i
29f30 66 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20  f the aggregate 
29f40 68 61 73 20 6e 6f 20 47 52 4f 55 50 20 42 59 20  has no GROUP BY 
29f50 63 6c 61 75 73 65 2e 20 20 54 68 65 0a 20 20 20  clause.  The.   
29f60 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 69       ** processi
29f70 6e 67 20 69 73 20 6d 75 63 68 20 73 69 6d 70 6c  ng is much simpl
29f80 65 72 20 73 69 6e 63 65 20 74 68 65 72 65 20 69  er since there i
29f90 73 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20  s only a single 
29fa0 72 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  row.        ** o
29fb0 66 20 6f 75 74 70 75 74 2e 0a 20 20 20 20 20 20  f output..      
29fc0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 73    */.        res
29fd0 65 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50  etAccumulator(pP
29fe0 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29  arse, &sAggInfo)
29ff0 3b 0a 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f  ;.        pWInfo
2a000 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42   = sqlite3WhereB
2a010 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61  egin(pParse, pTa
2a020 62 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20 70  bList, pWhere, p
2a030 4d 69 6e 4d 61 78 2c 30 2c 66 6c 61 67 2c 30 29  MinMax,0,flag,0)
2a040 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 57  ;.        if( pW
2a050 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Info==0 ){.     
2a060 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
2a070 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
2a080 44 65 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Del);.          
2a090 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
2a0a0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2a0b0 20 20 20 75 70 64 61 74 65 41 63 63 75 6d 75 6c     updateAccumul
2a0c0 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41  ator(pParse, &sA
2a0d0 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20  ggInfo);.       
2a0e0 20 61 73 73 65 72 74 28 20 70 4d 69 6e 4d 61 78   assert( pMinMax
2a0f0 3d 3d 30 20 7c 7c 20 70 4d 69 6e 4d 61 78 2d 3e  ==0 || pMinMax->
2a100 6e 45 78 70 72 3d 3d 31 20 29 3b 0a 20 20 20 20  nExpr==1 );.    
2a110 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57      if( sqlite3W
2a120 68 65 72 65 49 73 4f 72 64 65 72 65 64 28 70 57  hereIsOrdered(pW
2a130 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20 20 20 20  Info) ){.       
2a140 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2a150 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
2a160 20 30 2c 20 73 71 6c 69 74 65 33 57 68 65 72 65   0, sqlite3Where
2a170 42 72 65 61 6b 4c 61 62 65 6c 28 70 57 49 6e 66  BreakLabel(pWInf
2a180 6f 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 56  o));.          V
2a190 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
2a1a0 25 73 28 29 20 62 79 20 69 6e 64 65 78 22 2c 0a  %s() by index",.
2a1b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a1c0 28 66 6c 61 67 3d 3d 57 48 45 52 45 5f 4f 52 44  (flag==WHERE_ORD
2a1d0 45 52 42 59 5f 4d 49 4e 3f 22 6d 69 6e 22 3a 22  ERBY_MIN?"min":"
2a1e0 6d 61 78 22 29 29 29 3b 0a 20 20 20 20 20 20 20  max")));.       
2a1f0 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
2a200 65 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66  e3WhereEnd(pWInf
2a210 6f 29 3b 0a 20 20 20 20 20 20 20 20 66 69 6e 61  o);.        fina
2a220 6c 69 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e 73  lizeAggFunctions
2a230 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e  (pParse, &sAggIn
2a240 66 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  fo);.      }..  
2a250 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20 30      pOrderBy = 0
2a260 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
2a270 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
2a280 65 2c 20 70 48 61 76 69 6e 67 2c 20 61 64 64 72  e, pHaving, addr
2a290 45 6e 64 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50  End, SQLITE_JUMP
2a2a0 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73  IFNULL);.      s
2a2b0 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70  electInnerLoop(p
2a2c0 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c  Parse, p, p->pEL
2a2d0 69 73 74 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  ist, 0, 0, 0, 0,
2a2e0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
2a2f0 20 20 20 20 20 20 20 20 70 44 65 73 74 2c 20 61          pDest, a
2a300 64 64 72 45 6e 64 2c 20 61 64 64 72 45 6e 64 29  ddrEnd, addrEnd)
2a310 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
2a320 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
2a330 2c 20 70 44 65 6c 29 3b 0a 20 20 20 20 7d 0a 20  , pDel);.    }. 
2a340 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
2a350 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64  solveLabel(v, ad
2a360 64 72 45 6e 64 29 3b 0a 20 20 20 20 0a 20 20 7d  drEnd);.    .  }
2a370 20 2f 2a 20 65 6e 64 69 66 20 61 67 67 72 65 67   /* endif aggreg
2a380 61 74 65 20 71 75 65 72 79 20 2a 2f 0a 0a 20 20  ate query */..  
2a390 69 66 28 20 73 44 69 73 74 69 6e 63 74 2e 65 54  if( sDistinct.eT
2a3a0 6e 63 74 54 79 70 65 3d 3d 57 48 45 52 45 5f 44  nctType==WHERE_D
2a3b0 49 53 54 49 4e 43 54 5f 55 4e 4f 52 44 45 52 45  ISTINCT_UNORDERE
2a3c0 44 20 29 7b 0a 20 20 20 20 65 78 70 6c 61 69 6e  D ){.    explain
2a3d0 54 65 6d 70 54 61 62 6c 65 28 70 50 61 72 73 65  TempTable(pParse
2a3e0 2c 20 22 44 49 53 54 49 4e 43 54 22 29 3b 0a 20  , "DISTINCT");. 
2a3f0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72   }..  /* If ther
2a400 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59  e is an ORDER BY
2a410 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 77 65   clause, then we
2a420 20 6e 65 65 64 20 74 6f 20 73 6f 72 74 20 74 68   need to sort th
2a430 65 20 72 65 73 75 6c 74 73 0a 20 20 2a 2a 20 61  e results.  ** a
2a440 6e 64 20 73 65 6e 64 20 74 68 65 6d 20 74 6f 20  nd send them to 
2a450 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 6f 6e 65  the callback one
2a460 20 62 79 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20   by one..  */.  
2a470 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a  if( pOrderBy ){.
2a480 20 20 20 20 65 78 70 6c 61 69 6e 54 65 6d 70 54      explainTempT
2a490 61 62 6c 65 28 70 50 61 72 73 65 2c 20 22 4f 52  able(pParse, "OR
2a4a0 44 45 52 20 42 59 22 29 3b 0a 20 20 20 20 67 65  DER BY");.    ge
2a4b0 6e 65 72 61 74 65 53 6f 72 74 54 61 69 6c 28 70  nerateSortTail(p
2a4c0 50 61 72 73 65 2c 20 70 2c 20 76 2c 20 70 45 4c  Parse, p, v, pEL
2a4d0 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70 44 65 73  ist->nExpr, pDes
2a4e0 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75  t);.  }..  /* Ju
2a4f0 6d 70 20 68 65 72 65 20 74 6f 20 73 6b 69 70 20  mp here to skip 
2a500 74 68 69 73 20 71 75 65 72 79 0a 20 20 2a 2f 0a  this query.  */.
2a510 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
2a520 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 45 6e  olveLabel(v, iEn
2a530 64 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 53 45  d);..  /* The SE
2a540 4c 45 43 54 20 77 61 73 20 73 75 63 63 65 73 73  LECT was success
2a550 66 75 6c 6c 79 20 63 6f 64 65 64 2e 20 20 20 53  fully coded.   S
2a560 65 74 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f  et the return co
2a570 64 65 20 74 6f 20 30 0a 20 20 2a 2a 20 74 6f 20  de to 0.  ** to 
2a580 69 6e 64 69 63 61 74 65 20 6e 6f 20 65 72 72 6f  indicate no erro
2a590 72 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  rs..  */.  rc = 
2a5a0 30 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c  0;..  /* Control
2a5b0 20 6a 75 6d 70 73 20 74 6f 20 68 65 72 65 20 69   jumps to here i
2a5c0 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 65 6e  f an error is en
2a5d0 63 6f 75 6e 74 65 72 65 64 20 61 62 6f 76 65 2c  countered above,
2a5e0 20 6f 72 20 75 70 6f 6e 0a 20 20 2a 2a 20 73 75   or upon.  ** su
2a5f0 63 63 65 73 73 66 75 6c 20 63 6f 64 69 6e 67 20  ccessful coding 
2a600 6f 66 20 74 68 65 20 53 45 4c 45 43 54 2e 0a 20  of the SELECT.. 
2a610 20 2a 2f 0a 73 65 6c 65 63 74 5f 65 6e 64 3a 0a   */.select_end:.
2a620 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65    explainSetInte
2a630 67 65 72 28 70 50 61 72 73 65 2d 3e 69 53 65 6c  ger(pParse->iSel
2a640 65 63 74 49 64 2c 20 69 52 65 73 74 6f 72 65 53  ectId, iRestoreS
2a650 65 6c 65 63 74 49 64 29 3b 0a 0a 20 20 2f 2a 20  electId);..  /* 
2a660 49 64 65 6e 74 69 66 79 20 63 6f 6c 75 6d 6e 20  Identify column 
2a670 6e 61 6d 65 73 20 69 66 20 72 65 73 75 6c 74 73  names if results
2a680 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 61   of the SELECT a
2a690 72 65 20 74 6f 20 62 65 20 6f 75 74 70 75 74 2e  re to be output.
2a6a0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d  .  */.  if( rc==
2a6b0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 44 65  SQLITE_OK && pDe
2a6c0 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 4f  st->eDest==SRT_O
2a6d0 75 74 70 75 74 20 29 7b 0a 20 20 20 20 67 65 6e  utput ){.    gen
2a6e0 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73  erateColumnNames
2a6f0 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73  (pParse, pTabLis
2a700 74 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a  t, pEList);.  }.
2a710 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
2a720 28 64 62 2c 20 73 41 67 67 49 6e 66 6f 2e 61 43  (db, sAggInfo.aC
2a730 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  ol);.  sqlite3Db
2a740 46 72 65 65 28 64 62 2c 20 73 41 67 67 49 6e 66  Free(db, sAggInf
2a750 6f 2e 61 46 75 6e 63 29 3b 0a 20 20 72 65 74 75  o.aFunc);.  retu
2a760 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 20 64 65  rn rc;.}..#if de
2a770 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
2a780 42 4c 45 5f 54 52 45 45 5f 45 58 50 4c 41 49 4e  BLE_TREE_EXPLAIN
2a790 29 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  )./*.** Generate
2a7a0 20 61 20 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c   a human-readabl
2a7b0 65 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66  e description of
2a7c0 20 61 20 74 68 65 20 53 65 6c 65 63 74 20 6f 62   a the Select ob
2a7d0 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ject..*/.static 
2a7e0 76 6f 69 64 20 65 78 70 6c 61 69 6e 4f 6e 65 53  void explainOneS
2a7f0 65 6c 65 63 74 28 56 64 62 65 20 2a 70 56 64 62  elect(Vdbe *pVdb
2a800 65 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20  e, Select *p){. 
2a810 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
2a820 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22 53 45  rintf(pVdbe, "SE
2a830 4c 45 43 54 20 22 29 3b 0a 20 20 69 66 28 20 70  LECT ");.  if( p
2a840 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46  ->selFlags & (SF
2a850 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67  _Distinct|SF_Agg
2a860 72 65 67 61 74 65 29 20 29 7b 0a 20 20 20 20 69  regate) ){.    i
2a870 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  f( p->selFlags &
2a880 20 53 46 5f 44 69 73 74 69 6e 63 74 20 29 7b 0a   SF_Distinct ){.
2a890 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
2a8a0 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65  lainPrintf(pVdbe
2a8b0 2c 20 22 44 49 53 54 49 4e 43 54 20 22 29 3b 0a  , "DISTINCT ");.
2a8c0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d      }.    if( p-
2a8d0 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41  >selFlags & SF_A
2a8e0 67 67 72 65 67 61 74 65 20 29 7b 0a 20 20 20 20  ggregate ){.    
2a8f0 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
2a900 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22 61  Printf(pVdbe, "a
2a910 67 67 5f 66 6c 61 67 20 22 29 3b 0a 20 20 20 20  gg_flag ");.    
2a920 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  }.    sqlite3Exp
2a930 6c 61 69 6e 4e 4c 28 70 56 64 62 65 29 3b 0a 20  lainNL(pVdbe);. 
2a940 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
2a950 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22  nPrintf(pVdbe, "
2a960 20 20 20 22 29 3b 0a 20 20 7d 0a 20 20 73 71 6c     ");.  }.  sql
2a970 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72 4c  ite3ExplainExprL
2a980 69 73 74 28 70 56 64 62 65 2c 20 70 2d 3e 70 45  ist(pVdbe, p->pE
2a990 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  List);.  sqlite3
2a9a0 45 78 70 6c 61 69 6e 4e 4c 28 70 56 64 62 65 29  ExplainNL(pVdbe)
2a9b0 3b 0a 20 20 69 66 28 20 70 2d 3e 70 53 72 63 20  ;.  if( p->pSrc 
2a9c0 26 26 20 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63  && p->pSrc->nSrc
2a9d0 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
2a9e0 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
2a9f0 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22  nPrintf(pVdbe, "
2aa00 46 52 4f 4d 20 22 29 3b 0a 20 20 20 20 73 71 6c  FROM ");.    sql
2aa10 69 74 65 33 45 78 70 6c 61 69 6e 50 75 73 68 28  ite3ExplainPush(
2aa20 70 56 64 62 65 29 3b 0a 20 20 20 20 66 6f 72 28  pVdbe);.    for(
2aa30 69 3d 30 3b 20 69 3c 70 2d 3e 70 53 72 63 2d 3e  i=0; i<p->pSrc->
2aa40 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nSrc; i++){.    
2aa50 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
2aa60 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26  _item *pItem = &
2aa70 70 2d 3e 70 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20  p->pSrc->a[i];. 
2aa80 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
2aa90 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c  ainPrintf(pVdbe,
2aaa0 20 22 7b 25 64 2c 2a 7d 20 3d 20 22 2c 20 70 49   "{%d,*} = ", pI
2aab0 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20  tem->iCursor);. 
2aac0 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
2aad0 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  pSelect ){.     
2aae0 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
2aaf0 6e 53 65 6c 65 63 74 28 70 56 64 62 65 2c 20 70  nSelect(pVdbe, p
2ab00 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a  Item->pSelect);.
2ab10 20 20 20 20 20 20 20 20 69 66 28 20 70 49 74 65          if( pIte
2ab20 6d 2d 3e 70 54 61 62 20 29 7b 0a 20 20 20 20 20  m->pTab ){.     
2ab30 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
2ab40 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c  ainPrintf(pVdbe,
2ab50 20 22 20 28 74 61 62 6e 61 6d 65 3d 25 73 29 22   " (tabname=%s)"
2ab60 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a  , pItem->pTab->z
2ab70 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  Name);.        }
2ab80 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
2ab90 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 29 7b   pItem->zName ){
2aba0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2abb0 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56  ExplainPrintf(pV
2abc0 64 62 65 2c 20 22 25 73 22 2c 20 70 49 74 65 6d  dbe, "%s", pItem
2abd0 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
2abe0 7d 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65  }.      if( pIte
2abf0 6d 2d 3e 7a 41 6c 69 61 73 20 29 7b 0a 20 20 20  m->zAlias ){.   
2ac00 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
2ac10 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c  ainPrintf(pVdbe,
2ac20 20 22 20 28 41 53 20 25 73 29 22 2c 20 70 49 74   " (AS %s)", pIt
2ac30 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20  em->zAlias);.   
2ac40 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
2ac50 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 26  Item->jointype &
2ac60 20 4a 54 5f 4c 45 46 54 20 29 7b 0a 20 20 20 20   JT_LEFT ){.    
2ac70 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
2ac80 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20  inPrintf(pVdbe, 
2ac90 22 20 4c 45 46 54 2d 4a 4f 49 4e 22 29 3b 0a 20  " LEFT-JOIN");. 
2aca0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
2acb0 69 74 65 33 45 78 70 6c 61 69 6e 4e 4c 28 70 56  ite3ExplainNL(pV
2acc0 64 62 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  dbe);.    }.    
2acd0 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 6f  sqlite3ExplainPo
2ace0 70 28 70 56 64 62 65 29 3b 0a 20 20 7d 0a 20 20  p(pVdbe);.  }.  
2acf0 69 66 28 20 70 2d 3e 70 57 68 65 72 65 20 29 7b  if( p->pWhere ){
2ad00 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c  .    sqlite3Expl
2ad10 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c  ainPrintf(pVdbe,
2ad20 20 22 57 48 45 52 45 20 22 29 3b 0a 20 20 20 20   "WHERE ");.    
2ad30 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78  sqlite3ExplainEx
2ad40 70 72 28 70 56 64 62 65 2c 20 70 2d 3e 70 57 68  pr(pVdbe, p->pWh
2ad50 65 72 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ere);.    sqlite
2ad60 33 45 78 70 6c 61 69 6e 4e 4c 28 70 56 64 62 65  3ExplainNL(pVdbe
2ad70 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  );.  }.  if( p->
2ad80 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20  pGroupBy ){.    
2ad90 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
2ada0 69 6e 74 66 28 70 56 64 62 65 2c 20 22 47 52 4f  intf(pVdbe, "GRO
2adb0 55 50 42 59 20 22 29 3b 0a 20 20 20 20 73 71 6c  UPBY ");.    sql
2adc0 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72 4c  ite3ExplainExprL
2add0 69 73 74 28 70 56 64 62 65 2c 20 70 2d 3e 70 47  ist(pVdbe, p->pG
2ade0 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 73 71 6c  roupBy);.    sql
2adf0 69 74 65 33 45 78 70 6c 61 69 6e 4e 4c 28 70 56  ite3ExplainNL(pV
2ae00 64 62 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  dbe);.  }.  if( 
2ae10 70 2d 3e 70 48 61 76 69 6e 67 20 29 7b 0a 20 20  p->pHaving ){.  
2ae20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
2ae30 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22 48  Printf(pVdbe, "H
2ae40 41 56 49 4e 47 20 22 29 3b 0a 20 20 20 20 73 71  AVING ");.    sq
2ae50 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72  lite3ExplainExpr
2ae60 28 70 56 64 62 65 2c 20 70 2d 3e 70 48 61 76 69  (pVdbe, p->pHavi
2ae70 6e 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ng);.    sqlite3
2ae80 45 78 70 6c 61 69 6e 4e 4c 28 70 56 64 62 65 29  ExplainNL(pVdbe)
2ae90 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70  ;.  }.  if( p->p
2aea0 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 73  OrderBy ){.    s
2aeb0 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69  qlite3ExplainPri
2aec0 6e 74 66 28 70 56 64 62 65 2c 20 22 4f 52 44 45  ntf(pVdbe, "ORDE
2aed0 52 42 59 20 22 29 3b 0a 20 20 20 20 73 71 6c 69  RBY ");.    sqli
2aee0 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72 4c 69  te3ExplainExprLi
2aef0 73 74 28 70 56 64 62 65 2c 20 70 2d 3e 70 4f 72  st(pVdbe, p->pOr
2af00 64 65 72 42 79 29 3b 0a 20 20 20 20 73 71 6c 69  derBy);.    sqli
2af10 74 65 33 45 78 70 6c 61 69 6e 4e 4c 28 70 56 64  te3ExplainNL(pVd
2af20 62 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  be);.  }.  if( p
2af30 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20  ->pLimit ){.    
2af40 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
2af50 69 6e 74 66 28 70 56 64 62 65 2c 20 22 4c 49 4d  intf(pVdbe, "LIM
2af60 49 54 20 22 29 3b 0a 20 20 20 20 73 71 6c 69 74  IT ");.    sqlit
2af70 65 33 45 78 70 6c 61 69 6e 45 78 70 72 28 70 56  e3ExplainExpr(pV
2af80 64 62 65 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b  dbe, p->pLimit);
2af90 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c  .    sqlite3Expl
2afa0 61 69 6e 4e 4c 28 70 56 64 62 65 29 3b 0a 20 20  ainNL(pVdbe);.  
2afb0 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4f 66 66 73  }.  if( p->pOffs
2afc0 65 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  et ){.    sqlite
2afd0 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70  3ExplainPrintf(p
2afe0 56 64 62 65 2c 20 22 4f 46 46 53 45 54 20 22 29  Vdbe, "OFFSET ")
2aff0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
2b000 6c 61 69 6e 45 78 70 72 28 70 56 64 62 65 2c 20  lainExpr(pVdbe, 
2b010 70 2d 3e 70 4f 66 66 73 65 74 29 3b 0a 20 20 20  p->pOffset);.   
2b020 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 4e   sqlite3ExplainN
2b030 4c 28 70 56 64 62 65 29 3b 0a 20 20 7d 0a 7d 0a  L(pVdbe);.  }.}.
2b040 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 6c  void sqlite3Expl
2b050 61 69 6e 53 65 6c 65 63 74 28 56 64 62 65 20 2a  ainSelect(Vdbe *
2b060 70 56 64 62 65 2c 20 53 65 6c 65 63 74 20 2a 70  pVdbe, Select *p
2b070 29 7b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b  ){.  if( p==0 ){
2b080 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c  .    sqlite3Expl
2b090 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c  ainPrintf(pVdbe,
2b0a0 20 22 28 6e 75 6c 6c 2d 73 65 6c 65 63 74 29 22   "(null-select)"
2b0b0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
2b0c0 20 7d 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 70   }.  while( p->p
2b0d0 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 70 2d 3e  Prior ){.    p->
2b0e0 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20  pPrior->pNext = 
2b0f0 70 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 50  p;.    p = p->pP
2b100 72 69 6f 72 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  rior;.  }.  sqli
2b110 74 65 33 45 78 70 6c 61 69 6e 50 75 73 68 28 70  te3ExplainPush(p
2b120 56 64 62 65 29 3b 0a 20 20 77 68 69 6c 65 28 20  Vdbe);.  while( 
2b130 70 20 29 7b 0a 20 20 20 20 65 78 70 6c 61 69 6e  p ){.    explain
2b140 4f 6e 65 53 65 6c 65 63 74 28 70 56 64 62 65 2c  OneSelect(pVdbe,
2b150 20 70 29 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e   p);.    p = p->
2b160 70 4e 65 78 74 3b 0a 20 20 20 20 69 66 28 20 70  pNext;.    if( p
2b170 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
2b180 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 4e   sqlite3ExplainN
2b190 4c 28 70 56 64 62 65 29 3b 0a 20 20 20 20 73 71  L(pVdbe);.    sq
2b1a0 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e  lite3ExplainPrin
2b1b0 74 66 28 70 56 64 62 65 2c 20 22 25 73 5c 6e 22  tf(pVdbe, "%s\n"
2b1c0 2c 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70  , selectOpName(p
2b1d0 2d 3e 6f 70 29 29 3b 0a 20 20 7d 0a 20 20 73 71  ->op));.  }.  sq
2b1e0 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e  lite3ExplainPrin
2b1f0 74 66 28 70 56 64 62 65 2c 20 22 45 4e 44 22 29  tf(pVdbe, "END")
2b200 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61  ;.  sqlite3Expla
2b210 69 6e 50 6f 70 28 70 56 64 62 65 29 3b 0a 7d 0a  inPop(pVdbe);.}.
2b220 0a 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 73  ./* End of the s
2b230 74 72 75 63 74 75 72 65 20 64 65 62 75 67 20 70  tructure debug p
2b240 72 69 6e 74 69 6e 67 20 63 6f 64 65 0a 2a 2a 2a  rinting code.***
2b250 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b260 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b270 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b280 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b290 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 23 65 6e 64  **********/.#end
2b2a0 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 53 51  if /* defined(SQ
2b2b0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 54 52 45 45  LITE_ENABLE_TREE
2b2c0 5f 45 58 50 4c 41 49 4e 29 20 2a 2f 0a           _EXPLAIN) */.