/ Hex Artifact Content
Login

Artifact f64a972fc74cd01dd6e3a6cbfdae4f3b422e202f:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 70 61 72 73 65 72 0a 2a 2a 20 74 6f  the parser.** to
01c0: 20 68 61 6e 64 6c 65 20 53 45 4c 45 43 54 20 73   handle SELECT s
01d0: 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 53 51 4c  tatements in SQL
01e0: 69 74 65 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65  ite..*/.#include
01f0: 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a   "sqliteInt.h"..
0200: 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6c  ./*.** Delete al
0210: 6c 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  l the content of
0220: 20 61 20 53 65 6c 65 63 74 20 73 74 72 75 63 74   a Select struct
0230: 75 72 65 20 62 75 74 20 64 6f 20 6e 6f 74 20 64  ure but do not d
0240: 65 61 6c 6c 6f 63 61 74 65 0a 2a 2a 20 74 68 65  eallocate.** the
0250: 20 73 65 6c 65 63 74 20 73 74 72 75 63 74 75 72   select structur
0260: 65 20 69 74 73 65 6c 66 2e 0a 2a 2f 0a 73 74 61  e itself..*/.sta
0270: 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72 53 65  tic void clearSe
0280: 6c 65 63 74 28 73 71 6c 69 74 65 33 20 2a 64 62  lect(sqlite3 *db
0290: 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  , Select *p){.  
02a0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
02b0: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 45 4c  elete(db, p->pEL
02c0: 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  ist);.  sqlite3S
02d0: 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  rcListDelete(db,
02e0: 20 70 2d 3e 70 53 72 63 29 3b 0a 20 20 73 71 6c   p->pSrc);.  sql
02f0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
0300: 62 2c 20 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20  b, p->pWhere);. 
0310: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
0320: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 47  Delete(db, p->pG
0330: 72 6f 75 70 42 79 29 3b 0a 20 20 73 71 6c 69 74  roupBy);.  sqlit
0340: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
0350: 20 70 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20   p->pHaving);.  
0360: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
0370: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 72  elete(db, p->pOr
0380: 64 65 72 42 79 29 3b 0a 20 20 73 71 6c 69 74 65  derBy);.  sqlite
0390: 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
03a0: 2c 20 70 2d 3e 70 50 72 69 6f 72 29 3b 0a 20 20  , p->pPrior);.  
03b0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
03c0: 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29  e(db, p->pLimit)
03d0: 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  ;.  sqlite3ExprD
03e0: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 66  elete(db, p->pOf
03f0: 66 73 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  fset);.}../*.** 
0400: 49 6e 69 74 69 61 6c 69 7a 65 20 61 20 53 65 6c  Initialize a Sel
0410: 65 63 74 44 65 73 74 20 73 74 72 75 63 74 75 72  ectDest structur
0420: 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
0430: 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74  e3SelectDestInit
0440: 28 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65  (SelectDest *pDe
0450: 73 74 2c 20 69 6e 74 20 65 44 65 73 74 2c 20 69  st, int eDest, i
0460: 6e 74 20 69 50 61 72 6d 29 7b 0a 20 20 70 44 65  nt iParm){.  pDe
0470: 73 74 2d 3e 65 44 65 73 74 20 3d 20 28 75 38 29  st->eDest = (u8)
0480: 65 44 65 73 74 3b 0a 20 20 70 44 65 73 74 2d 3e  eDest;.  pDest->
0490: 69 53 44 50 61 72 6d 20 3d 20 69 50 61 72 6d 3b  iSDParm = iParm;
04a0: 0a 20 20 70 44 65 73 74 2d 3e 61 66 66 53 64 73  .  pDest->affSds
04b0: 74 20 3d 20 30 3b 0a 20 20 70 44 65 73 74 2d 3e  t = 0;.  pDest->
04c0: 69 53 64 73 74 20 3d 20 30 3b 0a 20 20 70 44 65  iSdst = 0;.  pDe
04d0: 73 74 2d 3e 6e 53 64 73 74 20 3d 20 30 3b 0a 7d  st->nSdst = 0;.}
04e0: 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  .../*.** Allocat
04f0: 65 20 61 20 6e 65 77 20 53 65 6c 65 63 74 20 73  e a new Select s
0500: 74 72 75 63 74 75 72 65 20 61 6e 64 20 72 65 74  tructure and ret
0510: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
0520: 20 74 68 61 74 0a 2a 2a 20 73 74 72 75 63 74 75   that.** structu
0530: 72 65 2e 0a 2a 2f 0a 53 65 6c 65 63 74 20 2a 73  re..*/.Select *s
0540: 71 6c 69 74 65 33 53 65 6c 65 63 74 4e 65 77 28  qlite3SelectNew(
0550: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
0560: 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  ,        /* Pars
0570: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
0580: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
0590: 74 2c 20 20 20 20 20 2f 2a 20 77 68 69 63 68 20  t,     /* which 
05a0: 63 6f 6c 75 6d 6e 73 20 74 6f 20 69 6e 63 6c 75  columns to inclu
05b0: 64 65 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  de in the result
05c0: 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
05d0: 53 72 63 2c 20 20 20 20 20 20 20 20 2f 2a 20 74  Src,        /* t
05e0: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2d  he FROM clause -
05f0: 2d 20 77 68 69 63 68 20 74 61 62 6c 65 73 20 74  - which tables t
0600: 6f 20 73 63 61 6e 20 2a 2f 0a 20 20 45 78 70 72  o scan */.  Expr
0610: 20 2a 70 57 68 65 72 65 2c 20 20 20 20 20 20 20   *pWhere,       
0620: 20 20 2f 2a 20 74 68 65 20 57 48 45 52 45 20 63    /* the WHERE c
0630: 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c  lause */.  ExprL
0640: 69 73 74 20 2a 70 47 72 6f 75 70 42 79 2c 20 20  ist *pGroupBy,  
0650: 20 2f 2a 20 74 68 65 20 47 52 4f 55 50 20 42 59   /* the GROUP BY
0660: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70   clause */.  Exp
0670: 72 20 2a 70 48 61 76 69 6e 67 2c 20 20 20 20 20  r *pHaving,     
0680: 20 20 20 2f 2a 20 74 68 65 20 48 41 56 49 4e 47     /* the HAVING
0690: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70   clause */.  Exp
06a0: 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c  rList *pOrderBy,
06b0: 20 20 20 2f 2a 20 74 68 65 20 4f 52 44 45 52 20     /* the ORDER 
06c0: 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 75  BY clause */.  u
06d0: 31 36 20 73 65 6c 46 6c 61 67 73 2c 20 20 20 20  16 selFlags,    
06e0: 20 20 20 20 20 2f 2a 20 46 6c 61 67 20 70 61 72       /* Flag par
06f0: 61 6d 65 74 65 72 73 2c 20 73 75 63 68 20 61 73  ameters, such as
0700: 20 53 46 5f 44 69 73 74 69 6e 63 74 20 2a 2f 0a   SF_Distinct */.
0710: 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20    Expr *pLimit, 
0720: 20 20 20 20 20 20 20 20 2f 2a 20 4c 49 4d 49 54          /* LIMIT
0730: 20 76 61 6c 75 65 2e 20 20 4e 55 4c 4c 20 6d 65   value.  NULL me
0740: 61 6e 73 20 6e 6f 74 20 75 73 65 64 20 2a 2f 0a  ans not used */.
0750: 20 20 45 78 70 72 20 2a 70 4f 66 66 73 65 74 20    Expr *pOffset 
0760: 20 20 20 20 20 20 20 20 2f 2a 20 4f 46 46 53 45          /* OFFSE
0770: 54 20 76 61 6c 75 65 2e 20 20 4e 55 4c 4c 20 6d  T value.  NULL m
0780: 65 61 6e 73 20 6e 6f 20 6f 66 66 73 65 74 20 2a  eans no offset *
0790: 2f 0a 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70  /.){.  Select *p
07a0: 4e 65 77 3b 0a 20 20 53 65 6c 65 63 74 20 73 74  New;.  Select st
07b0: 61 6e 64 69 6e 3b 0a 20 20 73 71 6c 69 74 65 33  andin;.  sqlite3
07c0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
07d0: 62 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  b;.  pNew = sqli
07e0: 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
07f0: 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77  db, sizeof(*pNew
0800: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64  ) );.  assert( d
0810: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
0820: 7c 7c 20 21 70 4f 66 66 73 65 74 20 7c 7c 20 70  || !pOffset || p
0830: 4c 69 6d 69 74 20 29 3b 20 2f 2a 20 4f 46 46 53  Limit ); /* OFFS
0840: 45 54 20 69 6d 70 6c 69 65 73 20 4c 49 4d 49 54  ET implies LIMIT
0850: 20 2a 2f 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d   */.  if( pNew==
0860: 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
0870: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
0880: 64 20 29 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20  d );.    pNew = 
0890: 26 73 74 61 6e 64 69 6e 3b 0a 20 20 20 20 6d 65  &standin;.    me
08a0: 6d 73 65 74 28 70 4e 65 77 2c 20 30 2c 20 73 69  mset(pNew, 0, si
08b0: 7a 65 6f 66 28 2a 70 4e 65 77 29 29 3b 0a 20 20  zeof(*pNew));.  
08c0: 7d 0a 20 20 69 66 28 20 70 45 4c 69 73 74 3d 3d  }.  if( pEList==
08d0: 30 20 29 7b 0a 20 20 20 20 70 45 4c 69 73 74 20  0 ){.    pEList 
08e0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
08f0: 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20  tAppend(pParse, 
0900: 30 2c 20 73 71 6c 69 74 65 33 45 78 70 72 28 64  0, sqlite3Expr(d
0910: 62 2c 54 4b 5f 41 4c 4c 2c 30 29 29 3b 0a 20 20  b,TK_ALL,0));.  
0920: 7d 0a 20 20 70 4e 65 77 2d 3e 70 45 4c 69 73 74  }.  pNew->pEList
0930: 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20 69 66 28   = pEList;.  if(
0940: 20 70 53 72 63 3d 3d 30 20 29 20 70 53 72 63 20   pSrc==0 ) pSrc 
0950: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
0960: 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66  cZero(db, sizeof
0970: 28 2a 70 53 72 63 29 29 3b 0a 20 20 70 4e 65 77  (*pSrc));.  pNew
0980: 2d 3e 70 53 72 63 20 3d 20 70 53 72 63 3b 0a 20  ->pSrc = pSrc;. 
0990: 20 70 4e 65 77 2d 3e 70 57 68 65 72 65 20 3d 20   pNew->pWhere = 
09a0: 70 57 68 65 72 65 3b 0a 20 20 70 4e 65 77 2d 3e  pWhere;.  pNew->
09b0: 70 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f 75  pGroupBy = pGrou
09c0: 70 42 79 3b 0a 20 20 70 4e 65 77 2d 3e 70 48 61  pBy;.  pNew->pHa
09d0: 76 69 6e 67 20 3d 20 70 48 61 76 69 6e 67 3b 0a  ving = pHaving;.
09e0: 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79    pNew->pOrderBy
09f0: 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 70   = pOrderBy;.  p
0a00: 4e 65 77 2d 3e 73 65 6c 46 6c 61 67 73 20 3d 20  New->selFlags = 
0a10: 73 65 6c 46 6c 61 67 73 3b 0a 20 20 70 4e 65 77  selFlags;.  pNew
0a20: 2d 3e 6f 70 20 3d 20 54 4b 5f 53 45 4c 45 43 54  ->op = TK_SELECT
0a30: 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 6d 69 74  ;.  pNew->pLimit
0a40: 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 70 4e 65   = pLimit;.  pNe
0a50: 77 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f 66  w->pOffset = pOf
0a60: 66 73 65 74 3b 0a 20 20 61 73 73 65 72 74 28 20  fset;.  assert( 
0a70: 70 4f 66 66 73 65 74 3d 3d 30 20 7c 7c 20 70 4c  pOffset==0 || pL
0a80: 69 6d 69 74 21 3d 30 20 29 3b 0a 20 20 70 4e 65  imit!=0 );.  pNe
0a90: 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  w->addrOpenEphm[
0aa0: 30 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d  0] = -1;.  pNew-
0ab0: 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d  >addrOpenEphm[1]
0ac0: 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 61   = -1;.  pNew->a
0ad0: 64 64 72 4f 70 65 6e 45 70 68 6d 5b 32 5d 20 3d  ddrOpenEphm[2] =
0ae0: 20 2d 31 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d   -1;.  if( db->m
0af0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 7b 0a  allocFailed ) {.
0b00: 20 20 20 20 63 6c 65 61 72 53 65 6c 65 63 74 28      clearSelect(
0b10: 64 62 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 69  db, pNew);.    i
0b20: 66 28 20 70 4e 65 77 21 3d 26 73 74 61 6e 64 69  f( pNew!=&standi
0b30: 6e 20 29 20 73 71 6c 69 74 65 33 44 62 46 72 65  n ) sqlite3DbFre
0b40: 65 28 64 62 2c 20 70 4e 65 77 29 3b 0a 20 20 20  e(db, pNew);.   
0b50: 20 70 4e 65 77 20 3d 20 30 3b 0a 20 20 7d 65 6c   pNew = 0;.  }el
0b60: 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
0b70: 70 4e 65 77 2d 3e 70 53 72 63 21 3d 30 20 7c 7c  pNew->pSrc!=0 ||
0b80: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20   pParse->nErr>0 
0b90: 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
0ba0: 20 70 4e 65 77 21 3d 26 73 74 61 6e 64 69 6e 20   pNew!=&standin 
0bb0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77  );.  return pNew
0bc0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  ;.}../*.** Delet
0bd0: 65 20 74 68 65 20 67 69 76 65 6e 20 53 65 6c 65  e the given Sele
0be0: 63 74 20 73 74 72 75 63 74 75 72 65 20 61 6e 64  ct structure and
0bf0: 20 61 6c 6c 20 6f 66 20 69 74 73 20 73 75 62 73   all of its subs
0c00: 74 72 75 63 74 75 72 65 73 2e 0a 2a 2f 0a 76 6f  tructures..*/.vo
0c10: 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  id sqlite3Select
0c20: 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a  Delete(sqlite3 *
0c30: 64 62 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a  db, Select *p){.
0c40: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 63    if( p ){.    c
0c50: 6c 65 61 72 53 65 6c 65 63 74 28 64 62 2c 20 70  learSelect(db, p
0c60: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
0c70: 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 20 20 7d  Free(db, p);.  }
0c80: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  .}../*.** Given 
0c90: 31 20 74 6f 20 33 20 69 64 65 6e 74 69 66 69 65  1 to 3 identifie
0ca0: 72 73 20 70 72 65 63 65 64 69 6e 67 20 74 68 65  rs preceding the
0cb0: 20 4a 4f 49 4e 20 6b 65 79 77 6f 72 64 2c 20 64   JOIN keyword, d
0cc0: 65 74 65 72 6d 69 6e 65 20 74 68 65 0a 2a 2a 20  etermine the.** 
0cd0: 74 79 70 65 20 6f 66 20 6a 6f 69 6e 2e 20 20 52  type of join.  R
0ce0: 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72  eturn an integer
0cf0: 20 63 6f 6e 73 74 61 6e 74 20 74 68 61 74 20 65   constant that e
0d00: 78 70 72 65 73 73 65 73 20 74 68 61 74 20 74 79  xpresses that ty
0d10: 70 65 0a 2a 2a 20 69 6e 20 74 65 72 6d 73 20 6f  pe.** in terms o
0d20: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
0d30: 62 69 74 20 76 61 6c 75 65 73 3a 0a 2a 2a 0a 2a  bit values:.**.*
0d40: 2a 20 20 20 20 20 4a 54 5f 49 4e 4e 45 52 0a 2a  *     JT_INNER.*
0d50: 2a 20 20 20 20 20 4a 54 5f 43 52 4f 53 53 0a 2a  *     JT_CROSS.*
0d60: 2a 20 20 20 20 20 4a 54 5f 4f 55 54 45 52 0a 2a  *     JT_OUTER.*
0d70: 2a 20 20 20 20 20 4a 54 5f 4e 41 54 55 52 41 4c  *     JT_NATURAL
0d80: 0a 2a 2a 20 20 20 20 20 4a 54 5f 4c 45 46 54 0a  .**     JT_LEFT.
0d90: 2a 2a 20 20 20 20 20 4a 54 5f 52 49 47 48 54 0a  **     JT_RIGHT.
0da0: 2a 2a 0a 2a 2a 20 41 20 66 75 6c 6c 20 6f 75 74  **.** A full out
0db0: 65 72 20 6a 6f 69 6e 20 69 73 20 74 68 65 20 63  er join is the c
0dc0: 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20 4a 54  ombination of JT
0dd0: 5f 4c 45 46 54 20 61 6e 64 20 4a 54 5f 52 49 47  _LEFT and JT_RIG
0de0: 48 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  HT..**.** If an 
0df0: 69 6c 6c 65 67 61 6c 20 6f 72 20 75 6e 73 75 70  illegal or unsup
0e00: 70 6f 72 74 65 64 20 6a 6f 69 6e 20 74 79 70 65  ported join type
0e10: 20 69 73 20 73 65 65 6e 2c 20 74 68 65 6e 20 73   is seen, then s
0e20: 74 69 6c 6c 20 72 65 74 75 72 6e 0a 2a 2a 20 61  till return.** a
0e30: 20 6a 6f 69 6e 20 74 79 70 65 2c 20 62 75 74 20   join type, but 
0e40: 70 75 74 20 61 6e 20 65 72 72 6f 72 20 69 6e 20  put an error in 
0e50: 74 68 65 20 70 50 61 72 73 65 20 73 74 72 75 63  the pParse struc
0e60: 74 75 72 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ture..*/.int sql
0e70: 69 74 65 33 4a 6f 69 6e 54 79 70 65 28 50 61 72  ite3JoinType(Par
0e80: 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65  se *pParse, Toke
0e90: 6e 20 2a 70 41 2c 20 54 6f 6b 65 6e 20 2a 70 42  n *pA, Token *pB
0ea0: 2c 20 54 6f 6b 65 6e 20 2a 70 43 29 7b 0a 20 20  , Token *pC){.  
0eb0: 69 6e 74 20 6a 6f 69 6e 74 79 70 65 20 3d 20 30  int jointype = 0
0ec0: 3b 0a 20 20 54 6f 6b 65 6e 20 2a 61 70 41 6c 6c  ;.  Token *apAll
0ed0: 5b 33 5d 3b 0a 20 20 54 6f 6b 65 6e 20 2a 70 3b  [3];.  Token *p;
0ee0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
0ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
0f00: 20 20 20 30 31 32 33 34 35 36 37 38 39 20 31 32     0123456789 12
0f10: 33 34 35 36 37 38 39 20 31 32 33 34 35 36 37 38  3456789 12345678
0f20: 39 20 31 32 33 20 2a 2f 0a 20 20 73 74 61 74 69  9 123 */.  stati
0f30: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 4b 65  c const char zKe
0f40: 79 54 65 78 74 5b 5d 20 3d 20 22 6e 61 74 75 72  yText[] = "natur
0f50: 61 6c 65 66 74 6f 75 74 65 72 69 67 68 74 66 75  aleftouterightfu
0f60: 6c 6c 69 6e 6e 65 72 63 72 6f 73 73 22 3b 0a 20  llinnercross";. 
0f70: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74   static const st
0f80: 72 75 63 74 20 7b 0a 20 20 20 20 75 38 20 69 3b  ruct {.    u8 i;
0f90: 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e          /* Begin
0fa0: 6e 69 6e 67 20 6f 66 20 6b 65 79 77 6f 72 64 20  ning of keyword 
0fb0: 74 65 78 74 20 69 6e 20 7a 4b 65 79 54 65 78 74  text in zKeyText
0fc0: 5b 5d 20 2a 2f 0a 20 20 20 20 75 38 20 6e 43 68  [] */.    u8 nCh
0fd0: 61 72 3b 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68  ar;    /* Length
0fe0: 20 6f 66 20 74 68 65 20 6b 65 79 77 6f 72 64 20   of the keyword 
0ff0: 69 6e 20 63 68 61 72 61 63 74 65 72 73 20 2a 2f  in characters */
1000: 0a 20 20 20 20 75 38 20 63 6f 64 65 3b 20 20 20  .    u8 code;   
1010: 20 20 2f 2a 20 4a 6f 69 6e 20 74 79 70 65 20 6d    /* Join type m
1020: 61 73 6b 20 2a 2f 0a 20 20 7d 20 61 4b 65 79 77  ask */.  } aKeyw
1030: 6f 72 64 5b 5d 20 3d 20 7b 0a 20 20 20 20 2f 2a  ord[] = {.    /*
1040: 20 6e 61 74 75 72 61 6c 20 2a 2f 20 7b 20 30 2c   natural */ { 0,
1050: 20 20 37 2c 20 4a 54 5f 4e 41 54 55 52 41 4c 20    7, JT_NATURAL 
1060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
1070: 2c 0a 20 20 20 20 2f 2a 20 6c 65 66 74 20 20 20  ,.    /* left   
1080: 20 2a 2f 20 7b 20 36 2c 20 20 34 2c 20 4a 54 5f   */ { 6,  4, JT_
1090: 4c 45 46 54 7c 4a 54 5f 4f 55 54 45 52 20 20 20  LEFT|JT_OUTER   
10a0: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a         },.    /*
10b0: 20 6f 75 74 65 72 20 20 20 2a 2f 20 7b 20 31 30   outer   */ { 10
10c0: 2c 20 35 2c 20 4a 54 5f 4f 55 54 45 52 20 20 20  , 5, JT_OUTER   
10d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
10e0: 2c 0a 20 20 20 20 2f 2a 20 72 69 67 68 74 20 20  ,.    /* right  
10f0: 20 2a 2f 20 7b 20 31 34 2c 20 35 2c 20 4a 54 5f   */ { 14, 5, JT_
1100: 52 49 47 48 54 7c 4a 54 5f 4f 55 54 45 52 20 20  RIGHT|JT_OUTER  
1110: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a         },.    /*
1120: 20 66 75 6c 6c 20 20 20 20 2a 2f 20 7b 20 31 39   full    */ { 19
1130: 2c 20 34 2c 20 4a 54 5f 4c 45 46 54 7c 4a 54 5f  , 4, JT_LEFT|JT_
1140: 52 49 47 48 54 7c 4a 54 5f 4f 55 54 45 52 20 7d  RIGHT|JT_OUTER }
1150: 2c 0a 20 20 20 20 2f 2a 20 69 6e 6e 65 72 20 20  ,.    /* inner  
1160: 20 2a 2f 20 7b 20 32 33 2c 20 35 2c 20 4a 54 5f   */ { 23, 5, JT_
1170: 49 4e 4e 45 52 20 20 20 20 20 20 20 20 20 20 20  INNER           
1180: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a         },.    /*
1190: 20 63 72 6f 73 73 20 20 20 2a 2f 20 7b 20 32 38   cross   */ { 28
11a0: 2c 20 35 2c 20 4a 54 5f 49 4e 4e 45 52 7c 4a 54  , 5, JT_INNER|JT
11b0: 5f 43 52 4f 53 53 20 20 20 20 20 20 20 20 20 7d  _CROSS         }
11c0: 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 2c 20  ,.  };.  int i, 
11d0: 6a 3b 0a 20 20 61 70 41 6c 6c 5b 30 5d 20 3d 20  j;.  apAll[0] = 
11e0: 70 41 3b 0a 20 20 61 70 41 6c 6c 5b 31 5d 20 3d  pA;.  apAll[1] =
11f0: 20 70 42 3b 0a 20 20 61 70 41 6c 6c 5b 32 5d 20   pB;.  apAll[2] 
1200: 3d 20 70 43 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  = pC;.  for(i=0;
1210: 20 69 3c 33 20 26 26 20 61 70 41 6c 6c 5b 69 5d   i<3 && apAll[i]
1220: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20  ; i++){.    p = 
1230: 61 70 41 6c 6c 5b 69 5d 3b 0a 20 20 20 20 66 6f  apAll[i];.    fo
1240: 72 28 6a 3d 30 3b 20 6a 3c 41 72 72 61 79 53 69  r(j=0; j<ArraySi
1250: 7a 65 28 61 4b 65 79 77 6f 72 64 29 3b 20 6a 2b  ze(aKeyword); j+
1260: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  +){.      if( p-
1270: 3e 6e 3d 3d 61 4b 65 79 77 6f 72 64 5b 6a 5d 2e  >n==aKeyword[j].
1280: 6e 43 68 61 72 20 0a 20 20 20 20 20 20 20 20 20  nChar .         
1290: 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 4e 49   && sqlite3StrNI
12a0: 43 6d 70 28 28 63 68 61 72 2a 29 70 2d 3e 7a 2c  Cmp((char*)p->z,
12b0: 20 26 7a 4b 65 79 54 65 78 74 5b 61 4b 65 79 77   &zKeyText[aKeyw
12c0: 6f 72 64 5b 6a 5d 2e 69 5d 2c 20 70 2d 3e 6e 29  ord[j].i], p->n)
12d0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6a  ==0 ){.        j
12e0: 6f 69 6e 74 79 70 65 20 7c 3d 20 61 4b 65 79 77  ointype |= aKeyw
12f0: 6f 72 64 5b 6a 5d 2e 63 6f 64 65 3b 0a 20 20 20  ord[j].code;.   
1300: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1310: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 74 65    }.    }.    te
1320: 73 74 63 61 73 65 28 20 6a 3d 3d 30 20 7c 7c 20  stcase( j==0 || 
1330: 6a 3d 3d 31 20 7c 7c 20 6a 3d 3d 32 20 7c 7c 20  j==1 || j==2 || 
1340: 6a 3d 3d 33 20 7c 7c 20 6a 3d 3d 34 20 7c 7c 20  j==3 || j==4 || 
1350: 6a 3d 3d 35 20 7c 7c 20 6a 3d 3d 36 20 29 3b 0a  j==5 || j==6 );.
1360: 20 20 20 20 69 66 28 20 6a 3e 3d 41 72 72 61 79      if( j>=Array
1370: 53 69 7a 65 28 61 4b 65 79 77 6f 72 64 29 20 29  Size(aKeyword) )
1380: 7b 0a 20 20 20 20 20 20 6a 6f 69 6e 74 79 70 65  {.      jointype
1390: 20 7c 3d 20 4a 54 5f 45 52 52 4f 52 3b 0a 20 20   |= JT_ERROR;.  
13a0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
13b0: 0a 20 20 7d 0a 20 20 69 66 28 0a 20 20 20 20 20  .  }.  if(.     
13c0: 28 6a 6f 69 6e 74 79 70 65 20 26 20 28 4a 54 5f  (jointype & (JT_
13d0: 49 4e 4e 45 52 7c 4a 54 5f 4f 55 54 45 52 29 29  INNER|JT_OUTER))
13e0: 3d 3d 28 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f 4f  ==(JT_INNER|JT_O
13f0: 55 54 45 52 29 20 7c 7c 0a 20 20 20 20 20 28 6a  UTER) ||.     (j
1400: 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 45 52 52  ointype & JT_ERR
1410: 4f 52 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20  OR)!=0.  ){.    
1420: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 70 20  const char *zSp 
1430: 3d 20 22 20 22 3b 0a 20 20 20 20 61 73 73 65 72  = " ";.    asser
1440: 74 28 20 70 42 21 3d 30 20 29 3b 0a 20 20 20 20  t( pB!=0 );.    
1450: 69 66 28 20 70 43 3d 3d 30 20 29 7b 20 7a 53 70  if( pC==0 ){ zSp
1460: 2b 2b 3b 20 7d 0a 20 20 20 20 73 71 6c 69 74 65  ++; }.    sqlite
1470: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
1480: 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6f 72 20 75 6e  , "unknown or un
1490: 73 75 70 70 6f 72 74 65 64 20 6a 6f 69 6e 20 74  supported join t
14a0: 79 70 65 3a 20 22 0a 20 20 20 20 20 20 20 22 25  ype: ".       "%
14b0: 54 20 25 54 25 73 25 54 22 2c 20 70 41 2c 20 70  T %T%s%T", pA, p
14c0: 42 2c 20 7a 53 70 2c 20 70 43 29 3b 0a 20 20 20  B, zSp, pC);.   
14d0: 20 6a 6f 69 6e 74 79 70 65 20 3d 20 4a 54 5f 49   jointype = JT_I
14e0: 4e 4e 45 52 3b 0a 20 20 7d 65 6c 73 65 20 69 66  NNER;.  }else if
14f0: 28 20 28 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54  ( (jointype & JT
1500: 5f 4f 55 54 45 52 29 21 3d 30 20 0a 20 20 20 20  _OUTER)!=0 .    
1510: 20 20 20 20 20 26 26 20 28 6a 6f 69 6e 74 79 70       && (jointyp
1520: 65 20 26 20 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f  e & (JT_LEFT|JT_
1530: 52 49 47 48 54 29 29 21 3d 4a 54 5f 4c 45 46 54  RIGHT))!=JT_LEFT
1540: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
1550: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
1560: 0a 20 20 20 20 20 20 22 52 49 47 48 54 20 61 6e  .      "RIGHT an
1570: 64 20 46 55 4c 4c 20 4f 55 54 45 52 20 4a 4f 49  d FULL OUTER JOI
1580: 4e 73 20 61 72 65 20 6e 6f 74 20 63 75 72 72 65  Ns are not curre
1590: 6e 74 6c 79 20 73 75 70 70 6f 72 74 65 64 22 29  ntly supported")
15a0: 3b 0a 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d  ;.    jointype =
15b0: 20 4a 54 5f 49 4e 4e 45 52 3b 0a 20 20 7d 0a 20   JT_INNER;.  }. 
15c0: 20 72 65 74 75 72 6e 20 6a 6f 69 6e 74 79 70 65   return jointype
15d0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
15e0: 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61  n the index of a
15f0: 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 20 74 61 62   column in a tab
1600: 6c 65 2e 20 20 52 65 74 75 72 6e 20 2d 31 20 69  le.  Return -1 i
1610: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20  f the column.** 
1620: 69 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64  is not contained
1630: 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a   in the table..*
1640: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 6c  /.static int col
1650: 75 6d 6e 49 6e 64 65 78 28 54 61 62 6c 65 20 2a  umnIndex(Table *
1660: 70 54 61 62 2c 20 63 6f 6e 73 74 20 63 68 61 72  pTab, const char
1670: 20 2a 7a 43 6f 6c 29 7b 0a 20 20 69 6e 74 20 69   *zCol){.  int i
1680: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
1690: 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  Tab->nCol; i++){
16a0: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
16b0: 53 74 72 49 43 6d 70 28 70 54 61 62 2d 3e 61 43  StrICmp(pTab->aC
16c0: 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 43 6f  ol[i].zName, zCo
16d0: 6c 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 69  l)==0 ) return i
16e0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d  ;.  }.  return -
16f0: 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72  1;.}../*.** Sear
1700: 63 68 20 74 68 65 20 66 69 72 73 74 20 4e 20 74  ch the first N t
1710: 61 62 6c 65 73 20 69 6e 20 70 53 72 63 2c 20 66  ables in pSrc, f
1720: 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68  rom left to righ
1730: 74 2c 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61  t, looking for a
1740: 0a 2a 2a 20 74 61 62 6c 65 20 74 68 61 74 20 68  .** table that h
1750: 61 73 20 61 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  as a column name
1760: 64 20 7a 43 6f 6c 2e 20 20 0a 2a 2a 0a 2a 2a 20  d zCol.  .**.** 
1770: 57 68 65 6e 20 66 6f 75 6e 64 2c 20 73 65 74 20  When found, set 
1780: 2a 70 69 54 61 62 20 61 6e 64 20 2a 70 69 43 6f  *piTab and *piCo
1790: 6c 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 69  l to the table i
17a0: 6e 64 65 78 20 61 6e 64 20 63 6f 6c 75 6d 6e 20  ndex and column 
17b0: 69 6e 64 65 78 0a 2a 2a 20 6f 66 20 74 68 65 20  index.** of the 
17c0: 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20  matching column 
17d0: 61 6e 64 20 72 65 74 75 72 6e 20 54 52 55 45 2e  and return TRUE.
17e0: 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 74 20 66 6f  .**.** If not fo
17f0: 75 6e 64 2c 20 72 65 74 75 72 6e 20 46 41 4c 53  und, return FALS
1800: 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  E..*/.static int
1810: 20 74 61 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49   tableAndColumnI
1820: 6e 64 65 78 28 0a 20 20 53 72 63 4c 69 73 74 20  ndex(.  SrcList 
1830: 2a 70 53 72 63 2c 20 20 20 20 20 20 20 2f 2a 20  *pSrc,       /* 
1840: 41 72 72 61 79 20 6f 66 20 74 61 62 6c 65 73 20  Array of tables 
1850: 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 69  to search */.  i
1860: 6e 74 20 4e 2c 20 20 20 20 20 20 20 20 20 20 20  nt N,           
1870: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1880: 20 74 61 62 6c 65 73 20 69 6e 20 70 53 72 63 2d   tables in pSrc-
1890: 3e 61 5b 5d 20 74 6f 20 73 65 61 72 63 68 20 2a  >a[] to search *
18a0: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
18b0: 7a 43 6f 6c 2c 20 20 20 20 2f 2a 20 4e 61 6d 65  zCol,    /* Name
18c0: 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 77   of the column w
18d0: 65 20 61 72 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f  e are looking fo
18e0: 72 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 54 61  r */.  int *piTa
18f0: 62 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  b,          /* W
1900: 72 69 74 65 20 69 6e 64 65 78 20 6f 66 20 70 53  rite index of pS
1910: 72 63 2d 3e 61 5b 5d 20 68 65 72 65 20 2a 2f 0a  rc->a[] here */.
1920: 20 20 69 6e 74 20 2a 70 69 43 6f 6c 20 20 20 20    int *piCol    
1930: 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
1940: 69 6e 64 65 78 20 6f 66 20 70 53 72 63 2d 3e 61  index of pSrc->a
1950: 5b 2a 70 69 54 61 62 5d 2e 70 54 61 62 2d 3e 61  [*piTab].pTab->a
1960: 43 6f 6c 5b 5d 20 68 65 72 65 20 2a 2f 0a 29 7b  Col[] here */.){
1970: 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
1980: 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c          /* For l
1990: 6f 6f 70 69 6e 67 20 6f 76 65 72 20 74 61 62 6c  ooping over tabl
19a0: 65 73 20 69 6e 20 70 53 72 63 20 2a 2f 0a 20 20  es in pSrc */.  
19b0: 69 6e 74 20 69 43 6f 6c 3b 20 20 20 20 20 20 20  int iCol;       
19c0: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
19d0: 20 63 6f 6c 75 6d 6e 20 6d 61 74 63 68 69 6e 67   column matching
19e0: 20 7a 43 6f 6c 20 2a 2f 0a 0a 20 20 61 73 73 65   zCol */..  asse
19f0: 72 74 28 20 28 70 69 54 61 62 3d 3d 30 29 3d 3d  rt( (piTab==0)==
1a00: 28 70 69 43 6f 6c 3d 3d 30 29 20 29 3b 20 20 2f  (piCol==0) );  /
1a10: 2a 20 42 6f 74 68 20 6f 72 20 6e 65 69 74 68 65  * Both or neithe
1a20: 72 20 61 72 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  r are NULL */.  
1a30: 66 6f 72 28 69 3d 30 3b 20 69 3c 4e 3b 20 69 2b  for(i=0; i<N; i+
1a40: 2b 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20 63  +){.    iCol = c
1a50: 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 53 72 63 2d  olumnIndex(pSrc-
1a60: 3e 61 5b 69 5d 2e 70 54 61 62 2c 20 7a 43 6f 6c  >a[i].pTab, zCol
1a70: 29 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3e  );.    if( iCol>
1a80: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
1a90: 70 69 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20  piTab ){.       
1aa0: 20 2a 70 69 54 61 62 20 3d 20 69 3b 0a 20 20 20   *piTab = i;.   
1ab0: 20 20 20 20 20 2a 70 69 43 6f 6c 20 3d 20 69 43       *piCol = iC
1ac0: 6f 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ol;.      }.    
1ad0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
1ae0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
1af0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
1b00: 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
1b10: 20 74 6f 20 61 64 64 20 74 65 72 6d 73 20 69 6d   to add terms im
1b20: 70 6c 69 65 64 20 62 79 20 4a 4f 49 4e 20 73 79  plied by JOIN sy
1b30: 6e 74 61 78 20 74 6f 20 74 68 65 0a 2a 2a 20 57  ntax to the.** W
1b40: 48 45 52 45 20 63 6c 61 75 73 65 20 65 78 70 72  HERE clause expr
1b50: 65 73 73 69 6f 6e 20 6f 66 20 61 20 53 45 4c 45  ession of a SELE
1b60: 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 54 68  CT statement. Th
1b70: 65 20 6e 65 77 20 74 65 72 6d 2c 20 77 68 69 63  e new term, whic
1b80: 68 0a 2a 2a 20 69 73 20 41 4e 44 65 64 20 77 69  h.** is ANDed wi
1b90: 74 68 20 74 68 65 20 65 78 69 73 74 69 6e 67 20  th the existing 
1ba0: 57 48 45 52 45 20 63 6c 61 75 73 65 2c 20 69 73  WHERE clause, is
1bb0: 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a   of the form:.**
1bc0: 0a 2a 2a 20 20 20 20 28 74 61 62 31 2e 63 6f 6c  .**    (tab1.col
1bd0: 31 20 3d 20 74 61 62 32 2e 63 6f 6c 32 29 0a 2a  1 = tab2.col2).*
1be0: 2a 0a 2a 2a 20 77 68 65 72 65 20 74 61 62 31 20  *.** where tab1 
1bf0: 69 73 20 74 68 65 20 69 53 72 63 27 74 68 20 74  is the iSrc'th t
1c00: 61 62 6c 65 20 69 6e 20 53 72 63 4c 69 73 74 20  able in SrcList 
1c10: 70 53 72 63 20 61 6e 64 20 74 61 62 32 20 69 73  pSrc and tab2 is
1c20: 20 74 68 65 20 0a 2a 2a 20 28 69 53 72 63 2b 31   the .** (iSrc+1
1c30: 29 27 74 68 2e 20 43 6f 6c 75 6d 6e 20 63 6f 6c  )'th. Column col
1c40: 31 20 69 73 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c  1 is column iCol
1c50: 4c 65 66 74 20 6f 66 20 74 61 62 31 2c 20 61 6e  Left of tab1, an
1c60: 64 20 63 6f 6c 32 20 69 73 0a 2a 2a 20 63 6f 6c  d col2 is.** col
1c70: 75 6d 6e 20 69 43 6f 6c 52 69 67 68 74 20 6f 66  umn iColRight of
1c80: 20 74 61 62 32 2e 0a 2a 2f 0a 73 74 61 74 69 63   tab2..*/.static
1c90: 20 76 6f 69 64 20 61 64 64 57 68 65 72 65 54 65   void addWhereTe
1ca0: 72 6d 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  rm(.  Parse *pPa
1cb0: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  rse,            
1cc0: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
1cd0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72   context */.  Sr
1ce0: 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20  cList *pSrc,    
1cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d00: 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20   List of tables 
1d10: 69 6e 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a  in FROM clause *
1d20: 2f 0a 20 20 69 6e 74 20 69 4c 65 66 74 2c 20 20  /.  int iLeft,  
1d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d40: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
1d50: 66 69 72 73 74 20 74 61 62 6c 65 20 74 6f 20 6a  first table to j
1d60: 6f 69 6e 20 69 6e 20 70 53 72 63 20 2a 2f 0a 20  oin in pSrc */. 
1d70: 20 69 6e 74 20 69 43 6f 6c 4c 65 66 74 2c 20 20   int iColLeft,  
1d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d90: 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c   /* Index of col
1da0: 75 6d 6e 20 69 6e 20 66 69 72 73 74 20 74 61 62  umn in first tab
1db0: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 69 67  le */.  int iRig
1dc0: 68 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ht,             
1dd0: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
1de0: 20 6f 66 20 73 65 63 6f 6e 64 20 74 61 62 6c 65   of second table
1df0: 20 69 6e 20 70 53 72 63 20 2a 2f 0a 20 20 69 6e   in pSrc */.  in
1e00: 74 20 69 43 6f 6c 52 69 67 68 74 2c 20 20 20 20  t iColRight,    
1e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e20: 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e   Index of column
1e30: 20 69 6e 20 73 65 63 6f 6e 64 20 74 61 62 6c 65   in second table
1e40: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4f 75 74 65   */.  int isOute
1e50: 72 4a 6f 69 6e 2c 20 20 20 20 20 20 20 20 20 20  rJoin,          
1e60: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
1e70: 20 74 68 69 73 20 69 73 20 61 6e 20 4f 55 54 45   this is an OUTE
1e80: 52 20 6a 6f 69 6e 20 2a 2f 0a 20 20 45 78 70 72  R join */.  Expr
1e90: 20 2a 2a 70 70 57 68 65 72 65 20 20 20 20 20 20   **ppWhere      
1ea0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
1eb0: 4e 2f 4f 55 54 3a 20 54 68 65 20 57 48 45 52 45  N/OUT: The WHERE
1ec0: 20 63 6c 61 75 73 65 20 74 6f 20 61 64 64 20 74   clause to add t
1ed0: 6f 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  o */.){.  sqlite
1ee0: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
1ef0: 64 62 3b 0a 20 20 45 78 70 72 20 2a 70 45 31 3b  db;.  Expr *pE1;
1f00: 0a 20 20 45 78 70 72 20 2a 70 45 32 3b 0a 20 20  .  Expr *pE2;.  
1f10: 45 78 70 72 20 2a 70 45 71 3b 0a 0a 20 20 61 73  Expr *pEq;..  as
1f20: 73 65 72 74 28 20 69 4c 65 66 74 3c 69 52 69 67  sert( iLeft<iRig
1f30: 68 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ht );.  assert( 
1f40: 70 53 72 63 2d 3e 6e 53 72 63 3e 69 52 69 67 68  pSrc->nSrc>iRigh
1f50: 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  t );.  assert( p
1f60: 53 72 63 2d 3e 61 5b 69 4c 65 66 74 5d 2e 70 54  Src->a[iLeft].pT
1f70: 61 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ab );.  assert( 
1f80: 70 53 72 63 2d 3e 61 5b 69 52 69 67 68 74 5d 2e  pSrc->a[iRight].
1f90: 70 54 61 62 20 29 3b 0a 0a 20 20 70 45 31 20 3d  pTab );..  pE1 =
1fa0: 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 43 6f   sqlite3CreateCo
1fb0: 6c 75 6d 6e 45 78 70 72 28 64 62 2c 20 70 53 72  lumnExpr(db, pSr
1fc0: 63 2c 20 69 4c 65 66 74 2c 20 69 43 6f 6c 4c 65  c, iLeft, iColLe
1fd0: 66 74 29 3b 0a 20 20 70 45 32 20 3d 20 73 71 6c  ft);.  pE2 = sql
1fe0: 69 74 65 33 43 72 65 61 74 65 43 6f 6c 75 6d 6e  ite3CreateColumn
1ff0: 45 78 70 72 28 64 62 2c 20 70 53 72 63 2c 20 69  Expr(db, pSrc, i
2000: 52 69 67 68 74 2c 20 69 43 6f 6c 52 69 67 68 74  Right, iColRight
2010: 29 3b 0a 0a 20 20 70 45 71 20 3d 20 73 71 6c 69  );..  pEq = sqli
2020: 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
2030: 20 54 4b 5f 45 51 2c 20 70 45 31 2c 20 70 45 32   TK_EQ, pE1, pE2
2040: 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 45 71 20  , 0);.  if( pEq 
2050: 26 26 20 69 73 4f 75 74 65 72 4a 6f 69 6e 20 29  && isOuterJoin )
2060: 7b 0a 20 20 20 20 45 78 70 72 53 65 74 50 72 6f  {.    ExprSetPro
2070: 70 65 72 74 79 28 70 45 71 2c 20 45 50 5f 46 72  perty(pEq, EP_Fr
2080: 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20 61 73 73  omJoin);.    ass
2090: 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
20a0: 70 65 72 74 79 28 70 45 71 2c 20 45 50 5f 54 6f  perty(pEq, EP_To
20b0: 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63  kenOnly|EP_Reduc
20c0: 65 64 29 20 29 3b 0a 20 20 20 20 45 78 70 72 53  ed) );.    ExprS
20d0: 65 74 56 56 41 50 72 6f 70 65 72 74 79 28 70 45  etVVAProperty(pE
20e0: 71 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b  q, EP_NoReduce);
20f0: 0a 20 20 20 20 70 45 71 2d 3e 69 52 69 67 68 74  .    pEq->iRight
2100: 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 28 69 31 36  JoinTable = (i16
2110: 29 70 45 32 2d 3e 69 54 61 62 6c 65 3b 0a 20 20  )pE2->iTable;.  
2120: 7d 0a 20 20 2a 70 70 57 68 65 72 65 20 3d 20 73  }.  *ppWhere = s
2130: 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 64 62  qlite3ExprAnd(db
2140: 2c 20 2a 70 70 57 68 65 72 65 2c 20 70 45 71 29  , *ppWhere, pEq)
2150: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
2160: 68 65 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 70  he EP_FromJoin p
2170: 72 6f 70 65 72 74 79 20 6f 6e 20 61 6c 6c 20 74  roperty on all t
2180: 65 72 6d 73 20 6f 66 20 74 68 65 20 67 69 76 65  erms of the give
2190: 6e 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a  n expression..**
21a0: 20 41 6e 64 20 73 65 74 20 74 68 65 20 45 78 70   And set the Exp
21b0: 72 2e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c  r.iRightJoinTabl
21c0: 65 20 74 6f 20 69 54 61 62 6c 65 20 66 6f 72 20  e to iTable for 
21d0: 65 76 65 72 79 20 74 65 72 6d 20 69 6e 20 74 68  every term in th
21e0: 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 2e  e.** expression.
21f0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 50 5f 46 72  .**.** The EP_Fr
2200: 6f 6d 4a 6f 69 6e 20 70 72 6f 70 65 72 74 79 20  omJoin property 
2210: 69 73 20 75 73 65 64 20 6f 6e 20 74 65 72 6d 73  is used on terms
2220: 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f   of an expressio
2230: 6e 20 74 6f 20 74 65 6c 6c 0a 2a 2a 20 74 68 65  n to tell.** the
2240: 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e   LEFT OUTER JOIN
2250: 20 70 72 6f 63 65 73 73 69 6e 67 20 6c 6f 67 69   processing logi
2260: 63 20 74 68 61 74 20 74 68 69 73 20 74 65 72 6d  c that this term
2270: 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 0a   is part of the.
2280: 2a 2a 20 6a 6f 69 6e 20 72 65 73 74 72 69 63 74  ** join restrict
2290: 69 6f 6e 20 73 70 65 63 69 66 69 65 64 20 69 6e  ion specified in
22a0: 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47   the ON or USING
22b0: 20 63 6c 61 75 73 65 20 61 6e 64 20 6e 6f 74 20   clause and not 
22c0: 61 20 70 61 72 74 0a 2a 2a 20 6f 66 20 74 68 65  a part.** of the
22d0: 20 6d 6f 72 65 20 67 65 6e 65 72 61 6c 20 57 48   more general WH
22e0: 45 52 45 20 63 6c 61 75 73 65 2e 20 20 54 68 65  ERE clause.  The
22f0: 73 65 20 74 65 72 6d 73 20 61 72 65 20 6d 6f 76  se terms are mov
2300: 65 64 20 6f 76 65 72 20 74 6f 20 74 68 65 0a 2a  ed over to the.*
2310: 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 64  * WHERE clause d
2320: 75 72 69 6e 67 20 6a 6f 69 6e 20 70 72 6f 63 65  uring join proce
2330: 73 73 69 6e 67 20 62 75 74 20 77 65 20 6e 65 65  ssing but we nee
2340: 64 20 74 6f 20 72 65 6d 65 6d 62 65 72 20 74 68  d to remember th
2350: 61 74 20 74 68 65 79 0a 2a 2a 20 6f 72 69 67 69  at they.** origi
2360: 6e 61 74 65 64 20 69 6e 20 74 68 65 20 4f 4e 20  nated in the ON 
2370: 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2e  or USING clause.
2380: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 78 70 72 2e  .**.** The Expr.
2390: 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20  iRightJoinTable 
23a0: 74 65 6c 6c 73 20 74 68 65 20 57 48 45 52 45 20  tells the WHERE 
23b0: 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e  clause processin
23c0: 67 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 65 78  g that the.** ex
23d0: 70 72 65 73 73 69 6f 6e 20 64 65 70 65 6e 64 73  pression depends
23e0: 20 6f 6e 20 74 61 62 6c 65 20 69 52 69 67 68 74   on table iRight
23f0: 4a 6f 69 6e 54 61 62 6c 65 20 65 76 65 6e 20 69  JoinTable even i
2400: 66 20 74 68 61 74 20 74 61 62 6c 65 20 69 73 20  f that table is 
2410: 6e 6f 74 0a 2a 2a 20 65 78 70 6c 69 63 69 74 6c  not.** explicitl
2420: 79 20 6d 65 6e 74 69 6f 6e 65 64 20 69 6e 20 74  y mentioned in t
2430: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20  he expression.  
2440: 54 68 61 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  That information
2450: 20 69 73 20 6e 65 65 64 65 64 0a 2a 2a 20 66 6f   is needed.** fo
2460: 72 20 63 61 73 65 73 20 6c 69 6b 65 20 74 68 69  r cases like thi
2470: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45  s:.**.**    SELE
2480: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4c 45 46  CT * FROM t1 LEF
2490: 54 20 4a 4f 49 4e 20 74 32 20 4f 4e 20 74 31 2e  T JOIN t2 ON t1.
24a0: 61 3d 74 32 2e 62 20 41 4e 44 20 74 31 2e 78 3d  a=t2.b AND t1.x=
24b0: 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 77 68 65 72  5.**.** The wher
24c0: 65 20 63 6c 61 75 73 65 20 6e 65 65 64 73 20 74  e clause needs t
24d0: 6f 20 64 65 66 65 72 20 74 68 65 20 68 61 6e 64  o defer the hand
24e0: 6c 69 6e 67 20 6f 66 20 74 68 65 20 74 31 2e 78  ling of the t1.x
24f0: 3d 35 0a 2a 2a 20 74 65 72 6d 20 75 6e 74 69 6c  =5.** term until
2500: 20 61 66 74 65 72 20 74 68 65 20 74 32 20 6c 6f   after the t2 lo
2510: 6f 70 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20  op of the join. 
2520: 20 49 6e 20 74 68 61 74 20 77 61 79 2c 20 61 0a   In that way, a.
2530: 2a 2a 20 4e 55 4c 4c 20 74 32 20 72 6f 77 20 77  ** NULL t2 row w
2540: 69 6c 6c 20 62 65 20 69 6e 73 65 72 74 65 64 20  ill be inserted 
2550: 77 68 65 6e 65 76 65 72 20 74 31 2e 78 21 3d 35  whenever t1.x!=5
2560: 2e 20 20 49 66 20 77 65 20 64 6f 20 6e 6f 74 0a  .  If we do not.
2570: 2a 2a 20 64 65 66 65 72 20 74 68 65 20 68 61 6e  ** defer the han
2580: 64 6c 69 6e 67 20 6f 66 20 74 31 2e 78 3d 35 2c  dling of t1.x=5,
2590: 20 69 74 20 77 69 6c 6c 20 62 65 20 70 72 6f 63   it will be proc
25a0: 65 73 73 65 64 20 69 6d 6d 65 64 69 61 74 65 6c  essed immediatel
25b0: 79 0a 2a 2a 20 61 66 74 65 72 20 74 68 65 20 74  y.** after the t
25c0: 31 20 6c 6f 6f 70 20 61 6e 64 20 72 6f 77 73 20  1 loop and rows 
25d0: 77 69 74 68 20 74 31 2e 78 21 3d 35 20 77 69 6c  with t1.x!=5 wil
25e0: 6c 20 6e 65 76 65 72 20 61 70 70 65 61 72 20 69  l never appear i
25f0: 6e 0a 2a 2a 20 74 68 65 20 6f 75 74 70 75 74 2c  n.** the output,
2600: 20 77 68 69 63 68 20 69 73 20 69 6e 63 6f 72 72   which is incorr
2610: 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ect..*/.static v
2620: 6f 69 64 20 73 65 74 4a 6f 69 6e 45 78 70 72 28  oid setJoinExpr(
2630: 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 69 54 61  Expr *p, int iTa
2640: 62 6c 65 29 7b 0a 20 20 77 68 69 6c 65 28 20 70  ble){.  while( p
2650: 20 29 7b 0a 20 20 20 20 45 78 70 72 53 65 74 50   ){.    ExprSetP
2660: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 46 72  roperty(p, EP_Fr
2670: 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20 61 73 73  omJoin);.    ass
2680: 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
2690: 70 65 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65  perty(p, EP_Toke
26a0: 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64  nOnly|EP_Reduced
26b0: 29 20 29 3b 0a 20 20 20 20 45 78 70 72 53 65 74  ) );.    ExprSet
26c0: 56 56 41 50 72 6f 70 65 72 74 79 28 70 2c 20 45  VVAProperty(p, E
26d0: 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a 20 20 20  P_NoReduce);.   
26e0: 20 70 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61   p->iRightJoinTa
26f0: 62 6c 65 20 3d 20 28 69 31 36 29 69 54 61 62 6c  ble = (i16)iTabl
2700: 65 3b 0a 20 20 20 20 73 65 74 4a 6f 69 6e 45 78  e;.    setJoinEx
2710: 70 72 28 70 2d 3e 70 4c 65 66 74 2c 20 69 54 61  pr(p->pLeft, iTa
2720: 62 6c 65 29 3b 0a 20 20 20 20 70 20 3d 20 70 2d  ble);.    p = p-
2730: 3e 70 52 69 67 68 74 3b 0a 20 20 7d 20 0a 7d 0a  >pRight;.  } .}.
2740: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
2750: 69 6e 65 20 70 72 6f 63 65 73 73 65 73 20 74 68  ine processes th
2760: 65 20 6a 6f 69 6e 20 69 6e 66 6f 72 6d 61 74 69  e join informati
2770: 6f 6e 20 66 6f 72 20 61 20 53 45 4c 45 43 54 20  on for a SELECT 
2780: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4f 4e  statement..** ON
2790: 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73   and USING claus
27a0: 65 73 20 61 72 65 20 63 6f 6e 76 65 72 74 65 64  es are converted
27b0: 20 69 6e 74 6f 20 65 78 74 72 61 20 74 65 72 6d   into extra term
27c0: 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  s of the WHERE c
27d0: 6c 61 75 73 65 2e 0a 2a 2a 20 4e 41 54 55 52 41  lause..** NATURA
27e0: 4c 20 6a 6f 69 6e 73 20 61 6c 73 6f 20 63 72 65  L joins also cre
27f0: 61 74 65 20 65 78 74 72 61 20 57 48 45 52 45 20  ate extra WHERE 
2800: 63 6c 61 75 73 65 20 74 65 72 6d 73 2e 0a 2a 2a  clause terms..**
2810: 0a 2a 2a 20 54 68 65 20 74 65 72 6d 73 20 6f 66  .** The terms of
2820: 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 61   a FROM clause a
2830: 72 65 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20  re contained in 
2840: 74 68 65 20 53 65 6c 65 63 74 2e 70 53 72 63 20  the Select.pSrc 
2850: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 20 54 68  structure..** Th
2860: 65 20 6c 65 66 74 20 6d 6f 73 74 20 74 61 62 6c  e left most tabl
2870: 65 20 69 73 20 74 68 65 20 66 69 72 73 74 20 65  e is the first e
2880: 6e 74 72 79 20 69 6e 20 53 65 6c 65 63 74 2e 70  ntry in Select.p
2890: 53 72 63 2e 20 20 54 68 65 20 72 69 67 68 74 2d  Src.  The right-
28a0: 6d 6f 73 74 0a 2a 2a 20 74 61 62 6c 65 20 69 73  most.** table is
28b0: 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 2e   the last entry.
28c0: 20 20 54 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61    The join opera
28d0: 74 6f 72 20 69 73 20 68 65 6c 64 20 69 6e 20 74  tor is held in t
28e0: 68 65 20 65 6e 74 72 79 20 74 6f 0a 2a 2a 20 74  he entry to.** t
28f0: 68 65 20 6c 65 66 74 2e 20 20 54 68 75 73 20 65  he left.  Thus e
2900: 6e 74 72 79 20 30 20 63 6f 6e 74 61 69 6e 73 20  ntry 0 contains 
2910: 74 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f  the join operato
2920: 72 20 66 6f 72 20 74 68 65 20 6a 6f 69 6e 20 62  r for the join b
2930: 65 74 77 65 65 6e 0a 2a 2a 20 65 6e 74 72 69 65  etween.** entrie
2940: 73 20 30 20 61 6e 64 20 31 2e 20 20 41 6e 79 20  s 0 and 1.  Any 
2950: 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75  ON or USING clau
2960: 73 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ses associated w
2970: 69 74 68 20 74 68 65 20 6a 6f 69 6e 20 61 72 65  ith the join are
2980: 0a 2a 2a 20 61 6c 73 6f 20 61 74 74 61 63 68 65  .** also attache
2990: 64 20 74 6f 20 74 68 65 20 6c 65 66 74 20 65 6e  d to the left en
29a0: 74 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  try..**.** This 
29b0: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
29c0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72  the number of er
29d0: 72 6f 72 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  rors encountered
29e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
29f0: 73 71 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f 69  sqliteProcessJoi
2a00: 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  n(Parse *pParse,
2a10: 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 53   Select *p){.  S
2a20: 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 20 20 20  rcList *pSrc;   
2a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a40: 2a 20 41 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20  * All tables in 
2a50: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
2a60: 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20  */.  int i, j;  
2a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a80: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
2a90: 6e 74 65 72 73 20 2a 2f 0a 20 20 73 74 72 75 63  nters */.  struc
2aa0: 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
2ab0: 70 4c 65 66 74 3b 20 20 20 20 20 2f 2a 20 4c 65  pLeft;     /* Le
2ac0: 66 74 20 74 61 62 6c 65 20 62 65 69 6e 67 20 6a  ft table being j
2ad0: 6f 69 6e 65 64 20 2a 2f 0a 20 20 73 74 72 75 63  oined */.  struc
2ae0: 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
2af0: 70 52 69 67 68 74 3b 20 20 20 20 2f 2a 20 52 69  pRight;    /* Ri
2b00: 67 68 74 20 74 61 62 6c 65 20 62 65 69 6e 67 20  ght table being 
2b10: 6a 6f 69 6e 65 64 20 2a 2f 0a 0a 20 20 70 53 72  joined */..  pSr
2b20: 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70  c = p->pSrc;.  p
2b30: 4c 65 66 74 20 3d 20 26 70 53 72 63 2d 3e 61 5b  Left = &pSrc->a[
2b40: 30 5d 3b 0a 20 20 70 52 69 67 68 74 20 3d 20 26  0];.  pRight = &
2b50: 70 4c 65 66 74 5b 31 5d 3b 0a 20 20 66 6f 72 28  pLeft[1];.  for(
2b60: 69 3d 30 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72  i=0; i<pSrc->nSr
2b70: 63 2d 31 3b 20 69 2b 2b 2c 20 70 52 69 67 68 74  c-1; i++, pRight
2b80: 2b 2b 2c 20 70 4c 65 66 74 2b 2b 29 7b 0a 20 20  ++, pLeft++){.  
2b90: 20 20 54 61 62 6c 65 20 2a 70 4c 65 66 74 54 61    Table *pLeftTa
2ba0: 62 20 3d 20 70 4c 65 66 74 2d 3e 70 54 61 62 3b  b = pLeft->pTab;
2bb0: 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 52 69 67  .    Table *pRig
2bc0: 68 74 54 61 62 20 3d 20 70 52 69 67 68 74 2d 3e  htTab = pRight->
2bd0: 70 54 61 62 3b 0a 20 20 20 20 69 6e 74 20 69 73  pTab;.    int is
2be0: 4f 75 74 65 72 3b 0a 0a 20 20 20 20 69 66 28 20  Outer;..    if( 
2bf0: 4e 45 56 45 52 28 70 4c 65 66 74 54 61 62 3d 3d  NEVER(pLeftTab==
2c00: 30 20 7c 7c 20 70 52 69 67 68 74 54 61 62 3d 3d  0 || pRightTab==
2c10: 30 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  0) ) continue;. 
2c20: 20 20 20 69 73 4f 75 74 65 72 20 3d 20 28 70 52     isOuter = (pR
2c30: 69 67 68 74 2d 3e 6a 6f 69 6e 74 79 70 65 20 26  ight->jointype &
2c40: 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30 3b 0a 0a   JT_OUTER)!=0;..
2c50: 20 20 20 20 2f 2a 20 57 68 65 6e 20 74 68 65 20      /* When the 
2c60: 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 20  NATURAL keyword 
2c70: 69 73 20 70 72 65 73 65 6e 74 2c 20 61 64 64 20  is present, add 
2c80: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
2c90: 6d 73 20 66 6f 72 0a 20 20 20 20 2a 2a 20 65 76  ms for.    ** ev
2ca0: 65 72 79 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20  ery column that 
2cb0: 74 68 65 20 74 77 6f 20 74 61 62 6c 65 73 20 68  the two tables h
2cc0: 61 76 65 20 69 6e 20 63 6f 6d 6d 6f 6e 2e 0a 20  ave in common.. 
2cd0: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52     */.    if( pR
2ce0: 69 67 68 74 2d 3e 6a 6f 69 6e 74 79 70 65 20 26  ight->jointype &
2cf0: 20 4a 54 5f 4e 41 54 55 52 41 4c 20 29 7b 0a 20   JT_NATURAL ){. 
2d00: 20 20 20 20 20 69 66 28 20 70 52 69 67 68 74 2d       if( pRight-
2d10: 3e 70 4f 6e 20 7c 7c 20 70 52 69 67 68 74 2d 3e  >pOn || pRight->
2d20: 70 55 73 69 6e 67 20 29 7b 0a 20 20 20 20 20 20  pUsing ){.      
2d30: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
2d40: 67 28 70 50 61 72 73 65 2c 20 22 61 20 4e 41 54  g(pParse, "a NAT
2d50: 55 52 41 4c 20 6a 6f 69 6e 20 6d 61 79 20 6e 6f  URAL join may no
2d60: 74 20 68 61 76 65 20 22 0a 20 20 20 20 20 20 20  t have ".       
2d70: 20 20 20 20 22 61 6e 20 4f 4e 20 6f 72 20 55 53      "an ON or US
2d80: 49 4e 47 20 63 6c 61 75 73 65 22 2c 20 30 29 3b  ING clause", 0);
2d90: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2da0: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
2db0: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 52 69 67   for(j=0; j<pRig
2dc0: 68 74 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b  htTab->nCol; j++
2dd0: 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
2de0: 2a 7a 4e 61 6d 65 3b 20 20 20 2f 2a 20 4e 61 6d  *zName;   /* Nam
2df0: 65 20 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 74  e of column in t
2e00: 68 65 20 72 69 67 68 74 20 74 61 62 6c 65 20 2a  he right table *
2e10: 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4c  /.        int iL
2e20: 65 66 74 3b 20 20 20 20 20 2f 2a 20 4d 61 74 63  eft;     /* Matc
2e30: 68 69 6e 67 20 6c 65 66 74 20 74 61 62 6c 65 20  hing left table 
2e40: 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  */.        int i
2e50: 4c 65 66 74 43 6f 6c 3b 20 20 2f 2a 20 4d 61 74  LeftCol;  /* Mat
2e60: 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 69 6e 20  ching column in 
2e70: 74 68 65 20 6c 65 66 74 20 74 61 62 6c 65 20 2a  the left table *
2e80: 2f 0a 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65  /..        zName
2e90: 20 3d 20 70 52 69 67 68 74 54 61 62 2d 3e 61 43   = pRightTab->aC
2ea0: 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  ol[j].zName;.   
2eb0: 20 20 20 20 20 69 66 28 20 74 61 62 6c 65 41 6e       if( tableAn
2ec0: 64 43 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 53 72  dColumnIndex(pSr
2ed0: 63 2c 20 69 2b 31 2c 20 7a 4e 61 6d 65 2c 20 26  c, i+1, zName, &
2ee0: 69 4c 65 66 74 2c 20 26 69 4c 65 66 74 43 6f 6c  iLeft, &iLeftCol
2ef0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  ) ){.          a
2f00: 64 64 57 68 65 72 65 54 65 72 6d 28 70 50 61 72  ddWhereTerm(pPar
2f10: 73 65 2c 20 70 53 72 63 2c 20 69 4c 65 66 74 2c  se, pSrc, iLeft,
2f20: 20 69 4c 65 66 74 43 6f 6c 2c 20 69 2b 31 2c 20   iLeftCol, i+1, 
2f30: 6a 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  j,.             
2f40: 20 20 20 20 20 20 20 20 20 20 69 73 4f 75 74 65            isOute
2f50: 72 2c 20 26 70 2d 3e 70 57 68 65 72 65 29 3b 0a  r, &p->pWhere);.
2f60: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2f70: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
2f80: 44 69 73 61 6c 6c 6f 77 20 62 6f 74 68 20 4f 4e  Disallow both ON
2f90: 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73   and USING claus
2fa0: 65 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20 6a  es in the same j
2fb0: 6f 69 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  oin.    */.    i
2fc0: 66 28 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20 26  f( pRight->pOn &
2fd0: 26 20 70 52 69 67 68 74 2d 3e 70 55 73 69 6e 67  & pRight->pUsing
2fe0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2ff0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
3000: 2c 20 22 63 61 6e 6e 6f 74 20 68 61 76 65 20 62  , "cannot have b
3010: 6f 74 68 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47  oth ON and USING
3020: 20 22 0a 20 20 20 20 20 20 20 20 22 63 6c 61 75   ".        "clau
3030: 73 65 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20  ses in the same 
3040: 6a 6f 69 6e 22 29 3b 0a 20 20 20 20 20 20 72 65  join");.      re
3050: 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 0a 20  turn 1;.    }.. 
3060: 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 4f 4e     /* Add the ON
3070: 20 63 6c 61 75 73 65 20 74 6f 20 74 68 65 20 65   clause to the e
3080: 6e 64 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  nd of the WHERE 
3090: 63 6c 61 75 73 65 2c 20 63 6f 6e 6e 65 63 74 65  clause, connecte
30a0: 64 20 62 79 0a 20 20 20 20 2a 2a 20 61 6e 20 41  d by.    ** an A
30b0: 4e 44 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 20  ND operator..   
30c0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 69 67   */.    if( pRig
30d0: 68 74 2d 3e 70 4f 6e 20 29 7b 0a 20 20 20 20 20  ht->pOn ){.     
30e0: 20 69 66 28 20 69 73 4f 75 74 65 72 20 29 20 73   if( isOuter ) s
30f0: 65 74 4a 6f 69 6e 45 78 70 72 28 70 52 69 67 68  etJoinExpr(pRigh
3100: 74 2d 3e 70 4f 6e 2c 20 70 52 69 67 68 74 2d 3e  t->pOn, pRight->
3110: 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20  iCursor);.      
3120: 70 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69  p->pWhere = sqli
3130: 74 65 33 45 78 70 72 41 6e 64 28 70 50 61 72 73  te3ExprAnd(pPars
3140: 65 2d 3e 64 62 2c 20 70 2d 3e 70 57 68 65 72 65  e->db, p->pWhere
3150: 2c 20 70 52 69 67 68 74 2d 3e 70 4f 6e 29 3b 0a  , pRight->pOn);.
3160: 20 20 20 20 20 20 70 52 69 67 68 74 2d 3e 70 4f        pRight->pO
3170: 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20  n = 0;.    }..  
3180: 20 20 2f 2a 20 43 72 65 61 74 65 20 65 78 74 72    /* Create extr
3190: 61 20 74 65 72 6d 73 20 6f 6e 20 74 68 65 20 57  a terms on the W
31a0: 48 45 52 45 20 63 6c 61 75 73 65 20 66 6f 72 20  HERE clause for 
31b0: 65 61 63 68 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  each column name
31c0: 64 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20  d.    ** in the 
31d0: 55 53 49 4e 47 20 63 6c 61 75 73 65 2e 20 20 45  USING clause.  E
31e0: 78 61 6d 70 6c 65 3a 20 49 66 20 74 68 65 20 74  xample: If the t
31f0: 77 6f 20 74 61 62 6c 65 73 20 74 6f 20 62 65 20  wo tables to be 
3200: 6a 6f 69 6e 65 64 20 61 72 65 20 0a 20 20 20 20  joined are .    
3210: 2a 2a 20 41 20 61 6e 64 20 42 20 61 6e 64 20 74  ** A and B and t
3220: 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20  he USING clause 
3230: 6e 61 6d 65 73 20 58 2c 20 59 2c 20 61 6e 64 20  names X, Y, and 
3240: 5a 2c 20 74 68 65 6e 20 61 64 64 20 74 68 69 73  Z, then add this
3250: 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 57  .    ** to the W
3260: 48 45 52 45 20 63 6c 61 75 73 65 3a 20 20 20 20  HERE clause:    
3270: 41 2e 58 3d 42 2e 58 20 41 4e 44 20 41 2e 59 3d  A.X=B.X AND A.Y=
3280: 42 2e 59 20 41 4e 44 20 41 2e 5a 3d 42 2e 5a 0a  B.Y AND A.Z=B.Z.
3290: 20 20 20 20 2a 2a 20 52 65 70 6f 72 74 20 61 6e      ** Report an
32a0: 20 65 72 72 6f 72 20 69 66 20 61 6e 79 20 63 6f   error if any co
32b0: 6c 75 6d 6e 20 6d 65 6e 74 69 6f 6e 65 64 20 69  lumn mentioned i
32c0: 6e 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75  n the USING clau
32d0: 73 65 20 69 73 0a 20 20 20 20 2a 2a 20 6e 6f 74  se is.    ** not
32e0: 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 62 6f   contained in bo
32f0: 74 68 20 74 61 62 6c 65 73 20 74 6f 20 62 65 20  th tables to be 
3300: 6a 6f 69 6e 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  joined..    */. 
3310: 20 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 70     if( pRight->p
3320: 55 73 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 49  Using ){.      I
3330: 64 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70  dList *pList = p
3340: 52 69 67 68 74 2d 3e 70 55 73 69 6e 67 3b 0a 20  Right->pUsing;. 
3350: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
3360: 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 6a 2b 2b 29  pList->nId; j++)
3370: 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  {.        char *
3380: 7a 4e 61 6d 65 3b 20 20 20 20 20 2f 2a 20 4e 61  zName;     /* Na
3390: 6d 65 20 6f 66 20 74 68 65 20 74 65 72 6d 20 69  me of the term i
33a0: 6e 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75  n the USING clau
33b0: 73 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  se */.        in
33c0: 74 20 69 4c 65 66 74 3b 20 20 20 20 20 20 20 2f  t iLeft;       /
33d0: 2a 20 54 61 62 6c 65 20 6f 6e 20 74 68 65 20 6c  * Table on the l
33e0: 65 66 74 20 77 69 74 68 20 6d 61 74 63 68 69 6e  eft with matchin
33f0: 67 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f  g column name */
3400: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4c 65  .        int iLe
3410: 66 74 43 6f 6c 3b 20 20 20 20 2f 2a 20 43 6f 6c  ftCol;    /* Col
3420: 75 6d 6e 20 6e 75 6d 62 65 72 20 6f 66 20 6d 61  umn number of ma
3430: 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 6f 6e  tching column on
3440: 20 74 68 65 20 6c 65 66 74 20 2a 2f 0a 20 20 20   the left */.   
3450: 20 20 20 20 20 69 6e 74 20 69 52 69 67 68 74 43       int iRightC
3460: 6f 6c 3b 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20  ol;   /* Column 
3470: 6e 75 6d 62 65 72 20 6f 66 20 6d 61 74 63 68 69  number of matchi
3480: 6e 67 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74 68 65  ng column on the
3490: 20 72 69 67 68 74 20 2a 2f 0a 0a 20 20 20 20 20   right */..     
34a0: 20 20 20 7a 4e 61 6d 65 20 3d 20 70 4c 69 73 74     zName = pList
34b0: 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  ->a[j].zName;.  
34c0: 20 20 20 20 20 20 69 52 69 67 68 74 43 6f 6c 20        iRightCol 
34d0: 3d 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 52  = columnIndex(pR
34e0: 69 67 68 74 54 61 62 2c 20 7a 4e 61 6d 65 29 3b  ightTab, zName);
34f0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 52 69  .        if( iRi
3500: 67 68 74 43 6f 6c 3c 30 0a 20 20 20 20 20 20 20  ghtCol<0.       
3510: 20 20 7c 7c 20 21 74 61 62 6c 65 41 6e 64 43 6f    || !tableAndCo
3520: 6c 75 6d 6e 49 6e 64 65 78 28 70 53 72 63 2c 20  lumnIndex(pSrc, 
3530: 69 2b 31 2c 20 7a 4e 61 6d 65 2c 20 26 69 4c 65  i+1, zName, &iLe
3540: 66 74 2c 20 26 69 4c 65 66 74 43 6f 6c 29 0a 20  ft, &iLeftCol). 
3550: 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
3560: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
3570: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63 61 6e  Msg(pParse, "can
3580: 6e 6f 74 20 6a 6f 69 6e 20 75 73 69 6e 67 20 63  not join using c
3590: 6f 6c 75 6d 6e 20 25 73 20 2d 20 63 6f 6c 75 6d  olumn %s - colum
35a0: 6e 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  n ".            
35b0: 22 6e 6f 74 20 70 72 65 73 65 6e 74 20 69 6e 20  "not present in 
35c0: 62 6f 74 68 20 74 61 62 6c 65 73 22 2c 20 7a 4e  both tables", zN
35d0: 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
35e0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
35f0: 20 20 7d 0a 20 20 20 20 20 20 20 20 61 64 64 57    }.        addW
3600: 68 65 72 65 54 65 72 6d 28 70 50 61 72 73 65 2c  hereTerm(pParse,
3610: 20 70 53 72 63 2c 20 69 4c 65 66 74 2c 20 69 4c   pSrc, iLeft, iL
3620: 65 66 74 43 6f 6c 2c 20 69 2b 31 2c 20 69 52 69  eftCol, i+1, iRi
3630: 67 68 74 43 6f 6c 2c 0a 20 20 20 20 20 20 20 20  ghtCol,.        
3640: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f               isO
3650: 75 74 65 72 2c 20 26 70 2d 3e 70 57 68 65 72 65  uter, &p->pWhere
3660: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
3670: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
3680: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74  .}../*.** Insert
3690: 20 63 6f 64 65 20 69 6e 74 6f 20 22 76 22 20 74   code into "v" t
36a0: 68 61 74 20 77 69 6c 6c 20 70 75 73 68 20 74 68  hat will push th
36b0: 65 20 72 65 63 6f 72 64 20 6f 6e 20 74 68 65 20  e record on the 
36c0: 74 6f 70 20 6f 66 20 74 68 65 0a 2a 2a 20 73 74  top of the.** st
36d0: 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 73 6f 72  ack into the sor
36e0: 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ter..*/.static v
36f0: 6f 69 64 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74  oid pushOntoSort
3700: 65 72 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  er(.  Parse *pPa
3710: 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  rse,         /* 
3720: 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  Parser context *
3730: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  /.  ExprList *pO
3740: 72 64 65 72 42 79 2c 20 20 20 20 2f 2a 20 54 68  rderBy,    /* Th
3750: 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
3760: 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  e */.  Select *p
3770: 53 65 6c 65 63 74 2c 20 20 20 20 20 20 20 2f 2a  Select,       /*
3780: 20 54 68 65 20 77 68 6f 6c 65 20 53 45 4c 45 43   The whole SELEC
3790: 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  T statement */. 
37a0: 20 69 6e 74 20 72 65 67 44 61 74 61 20 20 20 20   int regData    
37b0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73          /* Regis
37c0: 74 65 72 20 68 6f 6c 64 69 6e 67 20 64 61 74 61  ter holding data
37d0: 20 74 6f 20 62 65 20 73 6f 72 74 65 64 20 2a 2f   to be sorted */
37e0: 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  .){.  Vdbe *v = 
37f0: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
3800: 20 69 6e 74 20 6e 45 78 70 72 20 3d 20 70 4f 72   int nExpr = pOr
3810: 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20  derBy->nExpr;.  
3820: 69 6e 74 20 72 65 67 42 61 73 65 20 3d 20 73 71  int regBase = sq
3830: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67  lite3GetTempRang
3840: 65 28 70 50 61 72 73 65 2c 20 6e 45 78 70 72 2b  e(pParse, nExpr+
3850: 32 29 3b 0a 20 20 69 6e 74 20 72 65 67 52 65 63  2);.  int regRec
3860: 6f 72 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74  ord = sqlite3Get
3870: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
3880: 0a 20 20 69 6e 74 20 6f 70 3b 0a 20 20 73 71 6c  .  int op;.  sql
3890: 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65  ite3ExprCacheCle
38a0: 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71  ar(pParse);.  sq
38b0: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70  lite3ExprCodeExp
38c0: 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 4f  rList(pParse, pO
38d0: 72 64 65 72 42 79 2c 20 72 65 67 42 61 73 65 2c  rderBy, regBase,
38e0: 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64   0);.  sqlite3Vd
38f0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
3900: 65 71 75 65 6e 63 65 2c 20 70 4f 72 64 65 72 42  equence, pOrderB
3910: 79 2d 3e 69 45 43 75 72 73 6f 72 2c 20 72 65 67  y->iECursor, reg
3920: 42 61 73 65 2b 6e 45 78 70 72 29 3b 0a 20 20 73  Base+nExpr);.  s
3930: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f  qlite3ExprCodeMo
3940: 76 65 28 70 50 61 72 73 65 2c 20 72 65 67 44 61  ve(pParse, regDa
3950: 74 61 2c 20 72 65 67 42 61 73 65 2b 6e 45 78 70  ta, regBase+nExp
3960: 72 2b 31 2c 20 31 29 3b 0a 20 20 73 71 6c 69 74  r+1, 1);.  sqlit
3970: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
3980: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72  OP_MakeRecord, r
3990: 65 67 42 61 73 65 2c 20 6e 45 78 70 72 20 2b 20  egBase, nExpr + 
39a0: 32 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20  2, regRecord);. 
39b0: 20 69 66 28 20 70 53 65 6c 65 63 74 2d 3e 73 65   if( pSelect->se
39c0: 6c 46 6c 61 67 73 20 26 20 53 46 5f 55 73 65 53  lFlags & SF_UseS
39d0: 6f 72 74 65 72 20 29 7b 0a 20 20 20 20 6f 70 20  orter ){.    op 
39e0: 3d 20 4f 50 5f 53 6f 72 74 65 72 49 6e 73 65 72  = OP_SorterInser
39f0: 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  t;.  }else{.    
3a00: 6f 70 20 3d 20 4f 50 5f 49 64 78 49 6e 73 65 72  op = OP_IdxInser
3a10: 74 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  t;.  }.  sqlite3
3a20: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 6f 70  VdbeAddOp2(v, op
3a30: 2c 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75  , pOrderBy->iECu
3a40: 72 73 6f 72 2c 20 72 65 67 52 65 63 6f 72 64 29  rsor, regRecord)
3a50: 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  ;.  sqlite3Relea
3a60: 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
3a70: 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20  , regRecord);.  
3a80: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
3a90: 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
3aa0: 72 65 67 42 61 73 65 2c 20 6e 45 78 70 72 2b 32  regBase, nExpr+2
3ab0: 29 3b 0a 20 20 69 66 28 20 70 53 65 6c 65 63 74  );.  if( pSelect
3ac0: 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20  ->iLimit ){.    
3ad0: 69 6e 74 20 61 64 64 72 31 2c 20 61 64 64 72 32  int addr1, addr2
3ae0: 3b 0a 20 20 20 20 69 6e 74 20 69 4c 69 6d 69 74  ;.    int iLimit
3af0: 3b 0a 20 20 20 20 69 66 28 20 70 53 65 6c 65 63  ;.    if( pSelec
3b00: 74 2d 3e 69 4f 66 66 73 65 74 20 29 7b 0a 20 20  t->iOffset ){.  
3b10: 20 20 20 20 69 4c 69 6d 69 74 20 3d 20 70 53 65      iLimit = pSe
3b20: 6c 65 63 74 2d 3e 69 4f 66 66 73 65 74 2b 31 3b  lect->iOffset+1;
3b30: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
3b40: 20 20 69 4c 69 6d 69 74 20 3d 20 70 53 65 6c 65    iLimit = pSele
3b50: 63 74 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 20 20  ct->iLimit;.    
3b60: 7d 0a 20 20 20 20 61 64 64 72 31 20 3d 20 73 71  }.    addr1 = sq
3b70: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
3b80: 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c 20 69 4c  v, OP_IfZero, iL
3b90: 69 6d 69 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  imit);.    sqlit
3ba0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
3bb0: 4f 50 5f 41 64 64 49 6d 6d 2c 20 69 4c 69 6d 69  OP_AddImm, iLimi
3bc0: 74 2c 20 2d 31 29 3b 0a 20 20 20 20 61 64 64 72  t, -1);.    addr
3bd0: 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  2 = sqlite3VdbeA
3be0: 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp0(v, OP_Goto
3bf0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
3c00: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
3c10: 64 72 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  dr1);.    sqlite
3c20: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
3c30: 50 5f 4c 61 73 74 2c 20 70 4f 72 64 65 72 42 79  P_Last, pOrderBy
3c40: 2d 3e 69 45 43 75 72 73 6f 72 29 3b 0a 20 20 20  ->iECursor);.   
3c50: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
3c60: 70 31 28 76 2c 20 4f 50 5f 44 65 6c 65 74 65 2c  p1(v, OP_Delete,
3c70: 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72   pOrderBy->iECur
3c80: 73 6f 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  sor);.    sqlite
3c90: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
3ca0: 20 61 64 64 72 32 29 3b 0a 20 20 7d 0a 7d 0a 0a   addr2);.  }.}..
3cb0: 2f 2a 0a 2a 2a 20 41 64 64 20 63 6f 64 65 20 74  /*.** Add code t
3cc0: 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  o implement the 
3cd0: 4f 46 46 53 45 54 0a 2a 2f 0a 73 74 61 74 69 63  OFFSET.*/.static
3ce0: 20 76 6f 69 64 20 63 6f 64 65 4f 66 66 73 65 74   void codeOffset
3cf0: 28 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20  (.  Vdbe *v,    
3d00: 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
3d10: 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 69 73  e code into this
3d20: 20 56 4d 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20   VM */.  Select 
3d30: 2a 70 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68  *p,        /* Th
3d40: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
3d50: 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a  nt being coded *
3d60: 2f 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75  /.  int iContinu
3d70: 65 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65  e     /* Jump he
3d80: 72 65 20 74 6f 20 73 6b 69 70 20 74 68 65 20 63  re to skip the c
3d90: 75 72 72 65 6e 74 20 72 65 63 6f 72 64 20 2a 2f  urrent record */
3da0: 0a 29 7b 0a 20 20 69 66 28 20 70 2d 3e 69 4f 66  .){.  if( p->iOf
3db0: 66 73 65 74 20 26 26 20 69 43 6f 6e 74 69 6e 75  fset && iContinu
3dc0: 65 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  e!=0 ){.    int 
3dd0: 61 64 64 72 3b 0a 20 20 20 20 73 71 6c 69 74 65  addr;.    sqlite
3de0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
3df0: 50 5f 41 64 64 49 6d 6d 2c 20 70 2d 3e 69 4f 66  P_AddImm, p->iOf
3e00: 66 73 65 74 2c 20 2d 31 29 3b 0a 20 20 20 20 61  fset, -1);.    a
3e10: 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
3e20: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66  eAddOp1(v, OP_If
3e30: 4e 65 67 2c 20 70 2d 3e 69 4f 66 66 73 65 74 29  Neg, p->iOffset)
3e40: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
3e50: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
3e60: 74 6f 2c 20 30 2c 20 69 43 6f 6e 74 69 6e 75 65  to, 0, iContinue
3e70: 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  );.    VdbeComme
3e80: 6e 74 28 28 76 2c 20 22 73 6b 69 70 20 4f 46 46  nt((v, "skip OFF
3e90: 53 45 54 20 72 65 63 6f 72 64 73 22 29 29 3b 0a  SET records"));.
3ea0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
3eb0: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 29  umpHere(v, addr)
3ec0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ;.  }.}../*.** A
3ed0: 64 64 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c  dd code that wil
3ee0: 6c 20 63 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20  l check to make 
3ef0: 73 75 72 65 20 74 68 65 20 4e 20 72 65 67 69 73  sure the N regis
3f00: 74 65 72 73 20 73 74 61 72 74 69 6e 67 20 61 74  ters starting at
3f10: 20 69 4d 65 6d 0a 2a 2a 20 66 6f 72 6d 20 61 20   iMem.** form a 
3f20: 64 69 73 74 69 6e 63 74 20 65 6e 74 72 79 2e 20  distinct entry. 
3f30: 20 69 54 61 62 20 69 73 20 61 20 73 6f 72 74 69   iTab is a sorti
3f40: 6e 67 20 69 6e 64 65 78 20 74 68 61 74 20 68 6f  ng index that ho
3f50: 6c 64 73 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a  lds previously.*
3f60: 2a 20 73 65 65 6e 20 63 6f 6d 62 69 6e 61 74 69  * seen combinati
3f70: 6f 6e 73 20 6f 66 20 74 68 65 20 4e 20 76 61 6c  ons of the N val
3f80: 75 65 73 2e 20 20 41 20 6e 65 77 20 65 6e 74 72  ues.  A new entr
3f90: 79 20 69 73 20 6d 61 64 65 20 69 6e 20 69 54 61  y is made in iTa
3fa0: 62 0a 2a 2a 20 69 66 20 74 68 65 20 63 75 72 72  b.** if the curr
3fb0: 65 6e 74 20 4e 20 76 61 6c 75 65 73 20 61 72 65  ent N values are
3fc0: 20 6e 65 77 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a 75   new..**.** A ju
3fd0: 6d 70 20 74 6f 20 61 64 64 72 52 65 70 65 61 74  mp to addrRepeat
3fe0: 20 69 73 20 6d 61 64 65 20 61 6e 64 20 74 68 65   is made and the
3ff0: 20 4e 2b 31 20 76 61 6c 75 65 73 20 61 72 65 20   N+1 values are 
4000: 70 6f 70 70 65 64 20 66 72 6f 6d 20 74 68 65 0a  popped from the.
4010: 2a 2a 20 73 74 61 63 6b 20 69 66 20 74 68 65 20  ** stack if the 
4020: 74 6f 70 20 4e 20 65 6c 65 6d 65 6e 74 73 20 61  top N elements a
4030: 72 65 20 6e 6f 74 20 64 69 73 74 69 6e 63 74 2e  re not distinct.
4040: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
4050: 63 6f 64 65 44 69 73 74 69 6e 63 74 28 0a 20 20  codeDistinct(.  
4060: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
4070: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e     /* Parsing an
4080: 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e  d code generatin
4090: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69  g context */.  i
40a0: 6e 74 20 69 54 61 62 2c 20 20 20 20 20 20 20 20  nt iTab,        
40b0: 20 20 2f 2a 20 41 20 73 6f 72 74 69 6e 67 20 69    /* A sorting i
40c0: 6e 64 65 78 20 75 73 65 64 20 74 6f 20 74 65 73  ndex used to tes
40d0: 74 20 66 6f 72 20 64 69 73 74 69 6e 63 74 6e 65  t for distinctne
40e0: 73 73 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ss */.  int addr
40f0: 52 65 70 65 61 74 2c 20 20 20 20 2f 2a 20 4a 75  Repeat,    /* Ju
4100: 6d 70 20 74 6f 20 68 65 72 65 20 69 66 20 6e 6f  mp to here if no
4110: 74 20 64 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20  t distinct */.  
4120: 69 6e 74 20 4e 2c 20 20 20 20 20 20 20 20 20 20  int N,          
4130: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
4140: 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 6e  elements */.  in
4150: 74 20 69 4d 65 6d 20 20 20 20 20 20 20 20 20 20  t iMem          
4160: 20 2f 2a 20 46 69 72 73 74 20 65 6c 65 6d 65 6e   /* First elemen
4170: 74 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a  t */.){.  Vdbe *
4180: 76 3b 0a 20 20 69 6e 74 20 72 31 3b 0a 0a 20 20  v;.  int r1;..  
4190: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
41a0: 65 3b 0a 20 20 72 31 20 3d 20 73 71 6c 69 74 65  e;.  r1 = sqlite
41b0: 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
41c0: 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  se);.  sqlite3Vd
41d0: 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f  beAddOp4Int(v, O
41e0: 50 5f 46 6f 75 6e 64 2c 20 69 54 61 62 2c 20 61  P_Found, iTab, a
41f0: 64 64 72 52 65 70 65 61 74 2c 20 69 4d 65 6d 2c  ddrRepeat, iMem,
4200: 20 4e 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64   N);.  sqlite3Vd
4210: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d  beAddOp3(v, OP_M
4220: 61 6b 65 52 65 63 6f 72 64 2c 20 69 4d 65 6d 2c  akeRecord, iMem,
4230: 20 4e 2c 20 72 31 29 3b 0a 20 20 73 71 6c 69 74   N, r1);.  sqlit
4240: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
4250: 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 54  OP_IdxInsert, iT
4260: 61 62 2c 20 72 31 29 3b 0a 20 20 73 71 6c 69 74  ab, r1);.  sqlit
4270: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
4280: 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 7d 0a  (pParse, r1);.}.
4290: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
42a0: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a  OMIT_SUBQUERY./*
42b0: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 6e 20  .** Generate an 
42c0: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 77 68  error message wh
42d0: 65 6e 20 61 20 53 45 4c 45 43 54 20 69 73 20 75  en a SELECT is u
42e0: 73 65 64 20 77 69 74 68 69 6e 20 61 20 73 75 62  sed within a sub
42f0: 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 28 65  expression.** (e
4300: 78 61 6d 70 6c 65 3a 20 20 22 61 20 49 4e 20 28  xample:  "a IN (
4310: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 61  SELECT * FROM ta
4320: 62 6c 65 29 22 29 20 62 75 74 20 69 74 20 68 61  ble)") but it ha
4330: 73 20 6d 6f 72 65 20 74 68 61 6e 20 31 20 72 65  s more than 1 re
4340: 73 75 6c 74 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e 20  sult.** column. 
4350: 20 57 65 20 64 6f 20 74 68 69 73 20 69 6e 20 61   We do this in a
4360: 20 73 75 62 72 6f 75 74 69 6e 65 20 62 65 63 61   subroutine beca
4370: 75 73 65 20 74 68 65 20 65 72 72 6f 72 20 75 73  use the error us
4380: 65 64 20 74 6f 20 6f 63 63 75 72 0a 2a 2a 20 69  ed to occur.** i
4390: 6e 20 6d 75 6c 74 69 70 6c 65 20 70 6c 61 63 65  n multiple place
43a0: 73 2e 20 20 28 54 68 65 20 65 72 72 6f 72 20 6f  s.  (The error o
43b0: 6e 6c 79 20 6f 63 63 75 72 73 20 69 6e 20 6f 6e  nly occurs in on
43c0: 65 20 70 6c 61 63 65 20 6e 6f 77 2c 20 62 75 74  e place now, but
43d0: 20 77 65 0a 2a 2a 20 72 65 74 61 69 6e 20 74 68   we.** retain th
43e0: 65 20 73 75 62 72 6f 75 74 69 6e 65 20 74 6f 20  e subroutine to 
43f0: 6d 69 6e 69 6d 69 7a 65 20 63 6f 64 65 20 64 69  minimize code di
4400: 73 72 75 70 74 69 6f 6e 2e 29 0a 2a 2f 0a 73 74  sruption.).*/.st
4410: 61 74 69 63 20 69 6e 74 20 63 68 65 63 6b 46 6f  atic int checkFo
4420: 72 4d 75 6c 74 69 43 6f 6c 75 6d 6e 53 65 6c 65  rMultiColumnSele
4430: 63 74 45 72 72 6f 72 28 0a 20 20 50 61 72 73 65  ctError(.  Parse
4440: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
4450: 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74  /* Parse context
4460: 2e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  . */.  SelectDes
4470: 74 20 2a 70 44 65 73 74 2c 20 20 20 2f 2a 20 44  t *pDest,   /* D
4480: 65 73 74 69 6e 61 74 69 6f 6e 20 6f 66 20 53 45  estination of SE
4490: 4c 45 43 54 20 72 65 73 75 6c 74 73 20 2a 2f 0a  LECT results */.
44a0: 20 20 69 6e 74 20 6e 45 78 70 72 20 20 20 20 20    int nExpr     
44b0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
44c0: 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d   of result colum
44d0: 6e 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 53  ns returned by S
44e0: 45 4c 45 43 54 20 2a 2f 0a 29 7b 0a 20 20 69 6e  ELECT */.){.  in
44f0: 74 20 65 44 65 73 74 20 3d 20 70 44 65 73 74 2d  t eDest = pDest-
4500: 3e 65 44 65 73 74 3b 0a 20 20 69 66 28 20 6e 45  >eDest;.  if( nE
4510: 78 70 72 3e 31 20 26 26 20 28 65 44 65 73 74 3d  xpr>1 && (eDest=
4520: 3d 53 52 54 5f 4d 65 6d 20 7c 7c 20 65 44 65 73  =SRT_Mem || eDes
4530: 74 3d 3d 53 52 54 5f 53 65 74 29 20 29 7b 0a 20  t==SRT_Set) ){. 
4540: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
4550: 73 67 28 70 50 61 72 73 65 2c 20 22 6f 6e 6c 79  sg(pParse, "only
4560: 20 61 20 73 69 6e 67 6c 65 20 72 65 73 75 6c 74   a single result
4570: 20 61 6c 6c 6f 77 65 64 20 66 6f 72 20 22 0a 20   allowed for ". 
4580: 20 20 20 20 20 20 22 61 20 53 45 4c 45 43 54 20        "a SELECT 
4590: 74 68 61 74 20 69 73 20 70 61 72 74 20 6f 66 20  that is part of 
45a0: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 22 29 3b  an expression");
45b0: 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
45c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
45d0: 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  rn 0;.  }.}.#end
45e0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73  if../*.** An ins
45f0: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
4600: 6c 6f 77 69 6e 67 20 6f 62 6a 65 63 74 20 69 73  lowing object is
4610: 20 75 73 65 64 20 74 6f 20 72 65 63 6f 72 64 20   used to record 
4620: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  information abou
4630: 74 0a 2a 2a 20 68 6f 77 20 74 6f 20 70 72 6f 63  t.** how to proc
4640: 65 73 73 20 74 68 65 20 44 49 53 54 49 4e 43 54  ess the DISTINCT
4650: 20 6b 65 79 77 6f 72 64 2c 20 74 6f 20 73 69 6d   keyword, to sim
4660: 70 6c 69 66 79 20 70 61 73 73 69 6e 67 20 74 68  plify passing th
4670: 61 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a  at information.*
4680: 2a 20 69 6e 74 6f 20 74 68 65 20 73 65 6c 65 63  * into the selec
4690: 74 49 6e 6e 65 72 4c 6f 6f 70 28 29 20 72 6f 75  tInnerLoop() rou
46a0: 74 69 6e 65 2e 0a 2a 2f 0a 74 79 70 65 64 65 66  tine..*/.typedef
46b0: 20 73 74 72 75 63 74 20 44 69 73 74 69 6e 63 74   struct Distinct
46c0: 43 74 78 20 44 69 73 74 69 6e 63 74 43 74 78 3b  Ctx DistinctCtx;
46d0: 0a 73 74 72 75 63 74 20 44 69 73 74 69 6e 63 74  .struct Distinct
46e0: 43 74 78 20 7b 0a 20 20 75 38 20 69 73 54 6e 63  Ctx {.  u8 isTnc
46f0: 74 3b 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20  t;      /* True 
4700: 69 66 20 74 68 65 20 44 49 53 54 49 4e 43 54 20  if the DISTINCT 
4710: 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65 73 65  keyword is prese
4720: 6e 74 20 2a 2f 0a 20 20 75 38 20 65 54 6e 63 74  nt */.  u8 eTnct
4730: 54 79 70 65 3b 20 20 20 2f 2a 20 4f 6e 65 20 6f  Type;   /* One o
4740: 66 20 74 68 65 20 57 48 45 52 45 5f 44 49 53 54  f the WHERE_DIST
4750: 49 4e 43 54 5f 2a 20 6f 70 65 72 61 74 6f 72 73  INCT_* operators
4760: 20 2a 2f 0a 20 20 69 6e 74 20 74 61 62 54 6e 63   */.  int tabTnc
4770: 74 3b 20 20 20 20 2f 2a 20 45 70 68 65 6d 65 72  t;    /* Ephemer
4780: 61 6c 20 74 61 62 6c 65 20 75 73 65 64 20 66 6f  al table used fo
4790: 72 20 44 49 53 54 49 4e 43 54 20 70 72 6f 63 65  r DISTINCT proce
47a0: 73 73 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 61  ssing */.  int a
47b0: 64 64 72 54 6e 63 74 3b 20 20 20 2f 2a 20 41 64  ddrTnct;   /* Ad
47c0: 64 72 65 73 73 20 6f 66 20 4f 50 5f 4f 70 65 6e  dress of OP_Open
47d0: 45 70 68 65 6d 65 72 61 6c 20 6f 70 63 6f 64 65  Ephemeral opcode
47e0: 20 66 6f 72 20 74 61 62 54 6e 63 74 20 2a 2f 0a   for tabTnct */.
47f0: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  };../*.** This r
4800: 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73  outine generates
4810: 20 74 68 65 20 63 6f 64 65 20 66 6f 72 20 74 68   the code for th
4820: 65 20 69 6e 73 69 64 65 20 6f 66 20 74 68 65 20  e inside of the 
4830: 69 6e 6e 65 72 20 6c 6f 6f 70 0a 2a 2a 20 6f 66  inner loop.** of
4840: 20 61 20 53 45 4c 45 43 54 2e 0a 2a 2a 0a 2a 2a   a SELECT..**.**
4850: 20 49 66 20 73 72 63 54 61 62 20 61 6e 64 20 6e   If srcTab and n
4860: 43 6f 6c 75 6d 6e 20 61 72 65 20 62 6f 74 68 20  Column are both 
4870: 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 70  zero, then the p
4880: 45 4c 69 73 74 20 65 78 70 72 65 73 73 69 6f 6e  EList expression
4890: 73 0a 2a 2a 20 61 72 65 20 65 76 61 6c 75 61 74  s.** are evaluat
48a0: 65 64 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67  ed in order to g
48b0: 65 74 20 74 68 65 20 64 61 74 61 20 66 6f 72 20  et the data for 
48c0: 74 68 69 73 20 72 6f 77 2e 20 20 49 66 20 6e 43  this row.  If nC
48d0: 6f 6c 75 6d 6e 3e 30 0a 2a 2a 20 74 68 65 6e 20  olumn>0.** then 
48e0: 64 61 74 61 20 69 73 20 70 75 6c 6c 65 64 20 66  data is pulled f
48f0: 72 6f 6d 20 73 72 63 54 61 62 20 61 6e 64 20 70  rom srcTab and p
4900: 45 4c 69 73 74 20 69 73 20 75 73 65 64 20 6f 6e  EList is used on
4910: 6c 79 20 74 6f 20 67 65 74 20 74 68 65 0a 2a 2a  ly to get the.**
4920: 20 64 61 74 61 74 79 70 65 73 20 66 6f 72 20 65   datatypes for e
4930: 61 63 68 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 73  ach column..*/.s
4940: 74 61 74 69 63 20 76 6f 69 64 20 73 65 6c 65 63  tatic void selec
4950: 74 49 6e 6e 65 72 4c 6f 6f 70 28 0a 20 20 50 61  tInnerLoop(.  Pa
4960: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
4970: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
4980: 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ser context */. 
4990: 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
49a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
49b0: 63 6f 6d 70 6c 65 74 65 20 73 65 6c 65 63 74 20  complete select 
49c0: 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20  statement being 
49d0: 63 6f 64 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c  coded */.  ExprL
49e0: 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20  ist *pEList,    
49f0: 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 76 61     /* List of va
4a00: 6c 75 65 73 20 62 65 69 6e 67 20 65 78 74 72 61  lues being extra
4a10: 63 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 73 72  cted */.  int sr
4a20: 63 54 61 62 2c 20 20 20 20 20 20 20 20 20 20 20  cTab,           
4a30: 20 20 2f 2a 20 50 75 6c 6c 20 64 61 74 61 20 66    /* Pull data f
4a40: 72 6f 6d 20 74 68 69 73 20 74 61 62 6c 65 20 2a  rom this table *
4a50: 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e 2c  /.  int nColumn,
4a60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
4a70: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
4a80: 20 69 6e 20 74 68 65 20 73 6f 75 72 63 65 20 74   in the source t
4a90: 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69  able */.  ExprLi
4aa0: 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20  st *pOrderBy,   
4ab0: 20 20 2f 2a 20 49 66 20 6e 6f 74 20 4e 55 4c 4c    /* If not NULL
4ac0: 2c 20 73 6f 72 74 20 72 65 73 75 6c 74 73 20 75  , sort results u
4ad0: 73 69 6e 67 20 74 68 69 73 20 6b 65 79 20 2a 2f  sing this key */
4ae0: 0a 20 20 44 69 73 74 69 6e 63 74 43 74 78 20 2a  .  DistinctCtx *
4af0: 70 44 69 73 74 69 6e 63 74 2c 20 2f 2a 20 49 66  pDistinct, /* If
4b00: 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 6e 66 6f 20   not NULL, info 
4b10: 6f 6e 20 68 6f 77 20 74 6f 20 70 72 6f 63 65 73  on how to proces
4b20: 73 20 44 49 53 54 49 4e 43 54 20 2a 2f 0a 20 20  s DISTINCT */.  
4b30: 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73  SelectDest *pDes
4b40: 74 2c 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 74  t,      /* How t
4b50: 6f 20 64 69 73 70 6f 73 65 20 6f 66 20 74 68 65  o dispose of the
4b60: 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e   results */.  in
4b70: 74 20 69 43 6f 6e 74 69 6e 75 65 2c 20 20 20 20  t iContinue,    
4b80: 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
4b90: 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77  re to continue w
4ba0: 69 74 68 20 6e 65 78 74 20 72 6f 77 20 2a 2f 0a  ith next row */.
4bb0: 20 20 69 6e 74 20 69 42 72 65 61 6b 20 20 20 20    int iBreak    
4bc0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d            /* Jum
4bd0: 70 20 68 65 72 65 20 74 6f 20 62 72 65 61 6b 20  p here to break 
4be0: 6f 75 74 20 6f 66 20 74 68 65 20 69 6e 6e 65 72  out of the inner
4bf0: 20 6c 6f 6f 70 20 2a 2f 0a 29 7b 0a 20 20 56 64   loop */.){.  Vd
4c00: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
4c10: 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a  pVdbe;.  int i;.
4c20: 20 20 69 6e 74 20 68 61 73 44 69 73 74 69 6e 63    int hasDistinc
4c30: 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75  t;        /* Tru
4c40: 65 20 69 66 20 74 68 65 20 44 49 53 54 49 4e 43  e if the DISTINC
4c50: 54 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65  T keyword is pre
4c60: 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 72 65  sent */.  int re
4c70: 67 52 65 73 75 6c 74 3b 20 20 20 20 20 20 20 20  gResult;        
4c80: 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f        /* Start o
4c90: 66 20 6d 65 6d 6f 72 79 20 68 6f 6c 64 69 6e 67  f memory holding
4ca0: 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20   result set */. 
4cb0: 20 69 6e 74 20 65 44 65 73 74 20 3d 20 70 44 65   int eDest = pDe
4cc0: 73 74 2d 3e 65 44 65 73 74 3b 20 20 20 2f 2a 20  st->eDest;   /* 
4cd0: 48 6f 77 20 74 6f 20 64 69 73 70 6f 73 65 20 6f  How to dispose o
4ce0: 66 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69  f results */.  i
4cf0: 6e 74 20 69 50 61 72 6d 20 3d 20 70 44 65 73 74  nt iParm = pDest
4d00: 2d 3e 69 53 44 50 61 72 6d 3b 20 2f 2a 20 46 69  ->iSDParm; /* Fi
4d10: 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  rst argument to 
4d20: 64 69 73 70 6f 73 61 6c 20 6d 65 74 68 6f 64 20  disposal method 
4d30: 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 73 75 6c 74  */.  int nResult
4d40: 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Col;            
4d50: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65   /* Number of re
4d60: 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a  sult columns */.
4d70: 0a 20 20 61 73 73 65 72 74 28 20 76 20 29 3b 0a  .  assert( v );.
4d80: 20 20 69 66 28 20 4e 45 56 45 52 28 76 3d 3d 30    if( NEVER(v==0
4d90: 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73  ) ) return;.  as
4da0: 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20  sert( pEList!=0 
4db0: 29 3b 0a 20 20 68 61 73 44 69 73 74 69 6e 63 74  );.  hasDistinct
4dc0: 20 3d 20 70 44 69 73 74 69 6e 63 74 20 3f 20 70   = pDistinct ? p
4dd0: 44 69 73 74 69 6e 63 74 2d 3e 65 54 6e 63 74 54  Distinct->eTnctT
4de0: 79 70 65 20 3a 20 57 48 45 52 45 5f 44 49 53 54  ype : WHERE_DIST
4df0: 49 4e 43 54 5f 4e 4f 4f 50 3b 0a 20 20 69 66 28  INCT_NOOP;.  if(
4e00: 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 26 26 20   pOrderBy==0 && 
4e10: 21 68 61 73 44 69 73 74 69 6e 63 74 20 29 7b 0a  !hasDistinct ){.
4e20: 20 20 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76      codeOffset(v
4e30: 2c 20 70 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b  , p, iContinue);
4e40: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 75 6c 6c 20  .  }..  /* Pull 
4e50: 74 68 65 20 72 65 71 75 65 73 74 65 64 20 63 6f  the requested co
4e60: 6c 75 6d 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  lumns..  */.  if
4e70: 28 20 6e 43 6f 6c 75 6d 6e 3e 30 20 29 7b 0a 20  ( nColumn>0 ){. 
4e80: 20 20 20 6e 52 65 73 75 6c 74 43 6f 6c 20 3d 20     nResultCol = 
4e90: 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 7d 65 6c 73 65  nColumn;.  }else
4ea0: 7b 0a 20 20 20 20 6e 52 65 73 75 6c 74 43 6f 6c  {.    nResultCol
4eb0: 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   = pEList->nExpr
4ec0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 65 73  ;.  }.  if( pDes
4ed0: 74 2d 3e 69 53 64 73 74 3d 3d 30 20 29 7b 0a 20  t->iSdst==0 ){. 
4ee0: 20 20 20 70 44 65 73 74 2d 3e 69 53 64 73 74 20     pDest->iSdst 
4ef0: 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31  = pParse->nMem+1
4f00: 3b 0a 20 20 20 20 70 44 65 73 74 2d 3e 6e 53 64  ;.    pDest->nSd
4f10: 73 74 20 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b  st = nResultCol;
4f20: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65  .    pParse->nMe
4f30: 6d 20 2b 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b  m += nResultCol;
4f40: 0a 20 20 7d 65 6c 73 65 7b 20 0a 20 20 20 20 61  .  }else{ .    a
4f50: 73 73 65 72 74 28 20 70 44 65 73 74 2d 3e 6e 53  ssert( pDest->nS
4f60: 64 73 74 3d 3d 6e 52 65 73 75 6c 74 43 6f 6c 20  dst==nResultCol 
4f70: 29 3b 0a 20 20 7d 0a 20 20 72 65 67 52 65 73 75  );.  }.  regResu
4f80: 6c 74 20 3d 20 70 44 65 73 74 2d 3e 69 53 64 73  lt = pDest->iSds
4f90: 74 3b 0a 20 20 69 66 28 20 6e 43 6f 6c 75 6d 6e  t;.  if( nColumn
4fa0: 3e 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  >0 ){.    for(i=
4fb0: 30 3b 20 69 3c 6e 43 6f 6c 75 6d 6e 3b 20 69 2b  0; i<nColumn; i+
4fc0: 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
4fd0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
4fe0: 50 5f 43 6f 6c 75 6d 6e 2c 20 73 72 63 54 61 62  P_Column, srcTab
4ff0: 2c 20 69 2c 20 72 65 67 52 65 73 75 6c 74 2b 69  , i, regResult+i
5000: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
5010: 20 69 66 28 20 65 44 65 73 74 21 3d 53 52 54 5f   if( eDest!=SRT_
5020: 45 78 69 73 74 73 20 29 7b 0a 20 20 20 20 2f 2a  Exists ){.    /*
5030: 20 49 66 20 74 68 65 20 64 65 73 74 69 6e 61 74   If the destinat
5040: 69 6f 6e 20 69 73 20 61 6e 20 45 58 49 53 54 53  ion is an EXISTS
5050: 28 2e 2e 2e 29 20 65 78 70 72 65 73 73 69 6f 6e  (...) expression
5060: 2c 20 74 68 65 20 61 63 74 75 61 6c 0a 20 20 20  , the actual.   
5070: 20 2a 2a 20 76 61 6c 75 65 73 20 72 65 74 75 72   ** values retur
5080: 6e 65 64 20 62 79 20 74 68 65 20 53 45 4c 45 43  ned by the SELEC
5090: 54 20 61 72 65 20 6e 6f 74 20 72 65 71 75 69 72  T are not requir
50a0: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  ed..    */.    s
50b0: 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43  qlite3ExprCacheC
50c0: 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20  lear(pParse);.  
50d0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
50e0: 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  eExprList(pParse
50f0: 2c 20 70 45 4c 69 73 74 2c 20 72 65 67 52 65 73  , pEList, regRes
5100: 75 6c 74 2c 20 65 44 65 73 74 3d 3d 53 52 54 5f  ult, eDest==SRT_
5110: 4f 75 74 70 75 74 29 3b 0a 20 20 7d 0a 20 20 6e  Output);.  }.  n
5120: 43 6f 6c 75 6d 6e 20 3d 20 6e 52 65 73 75 6c 74  Column = nResult
5130: 43 6f 6c 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  Col;..  /* If th
5140: 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f  e DISTINCT keywo
5150: 72 64 20 77 61 73 20 70 72 65 73 65 6e 74 20 6f  rd was present o
5160: 6e 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  n the SELECT sta
5170: 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 61 6e 64 20  tement.  ** and 
5180: 74 68 69 73 20 72 6f 77 20 68 61 73 20 62 65 65  this row has bee
5190: 6e 20 73 65 65 6e 20 62 65 66 6f 72 65 2c 20 74  n seen before, t
51a0: 68 65 6e 20 64 6f 20 6e 6f 74 20 6d 61 6b 65 20  hen do not make 
51b0: 74 68 69 73 20 72 6f 77 0a 20 20 2a 2a 20 70 61  this row.  ** pa
51c0: 72 74 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74  rt of the result
51d0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 68 61 73  ..  */.  if( has
51e0: 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20  Distinct ){.    
51f0: 61 73 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d  assert( pEList!=
5200: 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
5210: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d   pEList->nExpr==
5220: 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 20 20 73  nColumn );.    s
5230: 77 69 74 63 68 28 20 70 44 69 73 74 69 6e 63 74  witch( pDistinct
5240: 2d 3e 65 54 6e 63 74 54 79 70 65 20 29 7b 0a 20  ->eTnctType ){. 
5250: 20 20 20 20 20 63 61 73 65 20 57 48 45 52 45 5f       case WHERE_
5260: 44 49 53 54 49 4e 43 54 5f 4f 52 44 45 52 45 44  DISTINCT_ORDERED
5270: 3a 20 7b 0a 20 20 20 20 20 20 20 20 56 64 62 65  : {.        Vdbe
5280: 4f 70 20 2a 70 4f 70 3b 20 20 20 20 20 20 20 20  Op *pOp;        
5290: 20 20 20 20 2f 2a 20 4e 6f 20 6c 6f 6e 67 65 72      /* No longer
52a0: 20 72 65 71 75 69 72 65 64 20 4f 70 65 6e 45 70   required OpenEp
52b0: 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 2e 20 2a  hemeral instr. *
52c0: 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4a  /.        int iJ
52d0: 75 6d 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  ump;            
52e0: 20 20 2f 2a 20 4a 75 6d 70 20 64 65 73 74 69 6e    /* Jump destin
52f0: 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20  ation */.       
5300: 20 69 6e 74 20 72 65 67 50 72 65 76 3b 20 20 20   int regPrev;   
5310: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 76           /* Prev
5320: 69 6f 75 73 20 72 6f 77 20 63 6f 6e 74 65 6e 74  ious row content
5330: 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20   */..        /* 
5340: 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  Allocate space f
5350: 6f 72 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  or the previous 
5360: 72 6f 77 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  row */.        r
5370: 65 67 50 72 65 76 20 3d 20 70 50 61 72 73 65 2d  egPrev = pParse-
5380: 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 20 20 20  >nMem+1;.       
5390: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
53a0: 20 6e 43 6f 6c 75 6d 6e 3b 0a 0a 20 20 20 20 20   nColumn;..     
53b0: 20 20 20 2f 2a 20 43 68 61 6e 67 65 20 74 68 65     /* Change the
53c0: 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
53d0: 6c 20 63 6f 64 65 64 20 65 61 72 6c 69 65 72 20  l coded earlier 
53e0: 74 6f 20 61 6e 20 4f 50 5f 4e 75 6c 6c 0a 20 20  to an OP_Null.  
53f0: 20 20 20 20 20 20 2a 2a 20 73 65 74 73 20 74 68        ** sets th
5400: 65 20 4d 45 4d 5f 43 6c 65 61 72 65 64 20 62 69  e MEM_Cleared bi
5410: 74 20 6f 6e 20 74 68 65 20 66 69 72 73 74 20 72  t on the first r
5420: 65 67 69 73 74 65 72 20 6f 66 20 74 68 65 0a 20  egister of the. 
5430: 20 20 20 20 20 20 20 2a 2a 20 70 72 65 76 69 6f         ** previo
5440: 75 73 20 76 61 6c 75 65 2e 20 20 54 68 69 73 20  us value.  This 
5450: 77 69 6c 6c 20 63 61 75 73 65 20 74 68 65 20 4f  will cause the O
5460: 50 5f 4e 65 20 62 65 6c 6f 77 20 74 6f 20 61 6c  P_Ne below to al
5470: 77 61 79 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  ways.        ** 
5480: 66 61 69 6c 20 6f 6e 20 74 68 65 20 66 69 72 73  fail on the firs
5490: 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74  t iteration of t
54a0: 68 65 20 6c 6f 6f 70 20 65 76 65 6e 20 69 66 20  he loop even if 
54b0: 74 68 65 20 66 69 72 73 74 0a 20 20 20 20 20 20  the first.      
54c0: 20 20 2a 2a 20 72 6f 77 20 69 73 20 61 6c 6c 20    ** row is all 
54d0: 4e 55 4c 4c 73 2e 0a 20 20 20 20 20 20 20 20 2a  NULLs..        *
54e0: 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  /.        sqlite
54f0: 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f  3VdbeChangeToNoo
5500: 70 28 76 2c 20 70 44 69 73 74 69 6e 63 74 2d 3e  p(v, pDistinct->
5510: 61 64 64 72 54 6e 63 74 29 3b 0a 20 20 20 20 20  addrTnct);.     
5520: 20 20 20 70 4f 70 20 3d 20 73 71 6c 69 74 65 33     pOp = sqlite3
5530: 56 64 62 65 47 65 74 4f 70 28 76 2c 20 70 44 69  VdbeGetOp(v, pDi
5540: 73 74 69 6e 63 74 2d 3e 61 64 64 72 54 6e 63 74  stinct->addrTnct
5550: 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e  );.        pOp->
5560: 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 4e 75 6c 6c  opcode = OP_Null
5570: 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70  ;.        pOp->p
5580: 31 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70  1 = 1;.        p
5590: 4f 70 2d 3e 70 32 20 3d 20 72 65 67 50 72 65 76  Op->p2 = regPrev
55a0: 3b 0a 0a 20 20 20 20 20 20 20 20 69 4a 75 6d 70  ;..        iJump
55b0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
55c0: 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20 6e  rrentAddr(v) + n
55d0: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20  Column;.        
55e0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 75  for(i=0; i<nColu
55f0: 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  mn; i++){.      
5600: 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
5610: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
5620: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
5630: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  pEList->a[i].pEx
5640: 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  pr);.          i
5650: 66 28 20 69 3c 6e 43 6f 6c 75 6d 6e 2d 31 20 29  f( i<nColumn-1 )
5660: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
5670: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
5680: 76 2c 20 4f 50 5f 4e 65 2c 20 72 65 67 52 65 73  v, OP_Ne, regRes
5690: 75 6c 74 2b 69 2c 20 69 4a 75 6d 70 2c 20 72 65  ult+i, iJump, re
56a0: 67 50 72 65 76 2b 69 29 3b 0a 20 20 20 20 20 20  gPrev+i);.      
56b0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
56c0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
56d0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 45  beAddOp3(v, OP_E
56e0: 71 2c 20 72 65 67 52 65 73 75 6c 74 2b 69 2c 20  q, regResult+i, 
56f0: 69 43 6f 6e 74 69 6e 75 65 2c 20 72 65 67 50 72  iContinue, regPr
5700: 65 76 2b 69 29 3b 0a 20 20 20 20 20 20 20 20 20  ev+i);.         
5710: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c   }.          sql
5720: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
5730: 28 76 2c 20 2d 31 2c 20 28 63 6f 6e 73 74 20 63  (v, -1, (const c
5740: 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f  har *)pColl, P4_
5750: 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20 20  COLLSEQ);.      
5760: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
5770: 68 61 6e 67 65 50 35 28 76 2c 20 53 51 4c 49 54  hangeP5(v, SQLIT
5780: 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20  E_NULLEQ);.     
5790: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73     }.        ass
57a0: 65 72 74 28 20 73 71 6c 69 74 65 33 56 64 62 65  ert( sqlite3Vdbe
57b0: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3d 3d  CurrentAddr(v)==
57c0: 69 4a 75 6d 70 20 29 3b 0a 20 20 20 20 20 20 20  iJump );.       
57d0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
57e0: 70 33 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72  p3(v, OP_Copy, r
57f0: 65 67 52 65 73 75 6c 74 2c 20 72 65 67 50 72 65  egResult, regPre
5800: 76 2c 20 6e 43 6f 6c 75 6d 6e 2d 31 29 3b 0a 20  v, nColumn-1);. 
5810: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
5820: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 63 61 73      }..      cas
5830: 65 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  e WHERE_DISTINCT
5840: 5f 55 4e 49 51 55 45 3a 20 7b 0a 20 20 20 20 20  _UNIQUE: {.     
5850: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
5860: 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 70 44  angeToNoop(v, pD
5870: 69 73 74 69 6e 63 74 2d 3e 61 64 64 72 54 6e 63  istinct->addrTnc
5880: 74 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  t);.        brea
5890: 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  k;.      }..    
58a0: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
58b0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 44 69       assert( pDi
58c0: 73 74 69 6e 63 74 2d 3e 65 54 6e 63 74 54 79 70  stinct->eTnctTyp
58d0: 65 3d 3d 57 48 45 52 45 5f 44 49 53 54 49 4e 43  e==WHERE_DISTINC
58e0: 54 5f 55 4e 4f 52 44 45 52 45 44 20 29 3b 0a 20  T_UNORDERED );. 
58f0: 20 20 20 20 20 20 20 63 6f 64 65 44 69 73 74 69         codeDisti
5900: 6e 63 74 28 70 50 61 72 73 65 2c 20 70 44 69 73  nct(pParse, pDis
5910: 74 69 6e 63 74 2d 3e 74 61 62 54 6e 63 74 2c 20  tinct->tabTnct, 
5920: 69 43 6f 6e 74 69 6e 75 65 2c 20 6e 43 6f 6c 75  iContinue, nColu
5930: 6d 6e 2c 20 72 65 67 52 65 73 75 6c 74 29 3b 0a  mn, regResult);.
5940: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
5950: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
5960: 20 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d 30   if( pOrderBy==0
5970: 20 29 7b 0a 20 20 20 20 20 20 63 6f 64 65 4f 66   ){.      codeOf
5980: 66 73 65 74 28 76 2c 20 70 2c 20 69 43 6f 6e 74  fset(v, p, iCont
5990: 69 6e 75 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  inue);.    }.  }
59a0: 0a 0a 20 20 73 77 69 74 63 68 28 20 65 44 65 73  ..  switch( eDes
59b0: 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74  t ){.    /* In t
59c0: 68 69 73 20 6d 6f 64 65 2c 20 77 72 69 74 65 20  his mode, write 
59d0: 65 61 63 68 20 71 75 65 72 79 20 72 65 73 75 6c  each query resul
59e0: 74 20 74 6f 20 74 68 65 20 6b 65 79 20 6f 66 20  t to the key of 
59f0: 74 68 65 20 74 65 6d 70 6f 72 61 72 79 0a 20 20  the temporary.  
5a00: 20 20 2a 2a 20 74 61 62 6c 65 20 69 50 61 72 6d    ** table iParm
5a10: 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66  ..    */.#ifndef
5a20: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d   SQLITE_OMIT_COM
5a30: 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 20 20 20  POUND_SELECT.   
5a40: 20 63 61 73 65 20 53 52 54 5f 55 6e 69 6f 6e 3a   case SRT_Union:
5a50: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31 3b   {.      int r1;
5a60: 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
5a70: 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
5a80: 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  arse);.      sql
5a90: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
5aa0: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
5ab0: 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 43 6f 6c   regResult, nCol
5ac0: 75 6d 6e 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  umn, r1);.      
5ad0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5ae0: 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72  2(v, OP_IdxInser
5af0: 74 2c 20 69 50 61 72 6d 2c 20 72 31 29 3b 0a 20  t, iParm, r1);. 
5b00: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
5b10: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
5b20: 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72  e, r1);.      br
5b30: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
5b40: 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20 72  /* Construct a r
5b50: 65 63 6f 72 64 20 66 72 6f 6d 20 74 68 65 20 71  ecord from the q
5b60: 75 65 72 79 20 72 65 73 75 6c 74 2c 20 62 75 74  uery result, but
5b70: 20 69 6e 73 74 65 61 64 20 6f 66 0a 20 20 20 20   instead of.    
5b80: 2a 2a 20 73 61 76 69 6e 67 20 74 68 61 74 20 72  ** saving that r
5b90: 65 63 6f 72 64 2c 20 75 73 65 20 69 74 20 61 73  ecord, use it as
5ba0: 20 61 20 6b 65 79 20 74 6f 20 64 65 6c 65 74 65   a key to delete
5bb0: 20 65 6c 65 6d 65 6e 74 73 20 66 72 6f 6d 0a 20   elements from. 
5bc0: 20 20 20 2a 2a 20 74 68 65 20 74 65 6d 70 6f 72     ** the tempor
5bd0: 61 72 79 20 74 61 62 6c 65 20 69 50 61 72 6d 2e  ary table iParm.
5be0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
5bf0: 20 53 52 54 5f 45 78 63 65 70 74 3a 20 7b 0a 20   SRT_Except: {. 
5c00: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
5c10: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 64 78  AddOp3(v, OP_Idx
5c20: 44 65 6c 65 74 65 2c 20 69 50 61 72 6d 2c 20 72  Delete, iParm, r
5c30: 65 67 52 65 73 75 6c 74 2c 20 6e 43 6f 6c 75 6d  egResult, nColum
5c40: 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  n);.      break;
5c50: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
5c60: 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20     /* Store the 
5c70: 72 65 73 75 6c 74 20 61 73 20 64 61 74 61 20 75  result as data u
5c80: 73 69 6e 67 20 61 20 75 6e 69 71 75 65 20 6b 65  sing a unique ke
5c90: 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  y..    */.    ca
5ca0: 73 65 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20  se SRT_Table:.  
5cb0: 20 20 63 61 73 65 20 53 52 54 5f 45 70 68 65 6d    case SRT_Ephem
5cc0: 54 61 62 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  Tab: {.      int
5cd0: 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
5ce0: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
5cf0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
5d00: 20 65 44 65 73 74 3d 3d 53 52 54 5f 54 61 62 6c   eDest==SRT_Tabl
5d10: 65 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  e );.      testc
5d20: 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f  ase( eDest==SRT_
5d30: 45 70 68 65 6d 54 61 62 20 29 3b 0a 20 20 20 20  EphemTab );.    
5d40: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
5d50: 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op3(v, OP_MakeRe
5d60: 63 6f 72 64 2c 20 72 65 67 52 65 73 75 6c 74 2c  cord, regResult,
5d70: 20 6e 43 6f 6c 75 6d 6e 2c 20 72 31 29 3b 0a 20   nColumn, r1);. 
5d80: 20 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42       if( pOrderB
5d90: 79 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75 73  y ){.        pus
5da0: 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72  hOntoSorter(pPar
5db0: 73 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 2c  se, pOrderBy, p,
5dc0: 20 72 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73   r1);.      }els
5dd0: 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  e{.        int r
5de0: 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  2 = sqlite3GetTe
5df0: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
5e00: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
5e10: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
5e20: 65 77 52 6f 77 69 64 2c 20 69 50 61 72 6d 2c 20  ewRowid, iParm, 
5e30: 72 32 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  r2);.        sql
5e40: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
5e50: 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 69 50 61  , OP_Insert, iPa
5e60: 72 6d 2c 20 72 31 2c 20 72 32 29 3b 0a 20 20 20  rm, r1, r2);.   
5e70: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
5e80: 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
5e90: 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20  AG_APPEND);.    
5ea0: 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
5eb0: 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
5ec0: 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20  , r2);.      }. 
5ed0: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
5ee0: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
5ef0: 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72  e, r1);.      br
5f00: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e  eak;.    }..#ifn
5f10: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
5f20: 53 55 42 51 55 45 52 59 0a 20 20 20 20 2f 2a 20  SUBQUERY.    /* 
5f30: 49 66 20 77 65 20 61 72 65 20 63 72 65 61 74 69  If we are creati
5f40: 6e 67 20 61 20 73 65 74 20 66 6f 72 20 61 6e 20  ng a set for an 
5f50: 22 65 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54  "expr IN (SELECT
5f60: 20 2e 2e 2e 29 22 20 63 6f 6e 73 74 72 75 63 74   ...)" construct
5f70: 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68  ,.    ** then th
5f80: 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20 61 20  ere should be a 
5f90: 73 69 6e 67 6c 65 20 69 74 65 6d 20 6f 6e 20 74  single item on t
5fa0: 68 65 20 73 74 61 63 6b 2e 20 20 57 72 69 74 65  he stack.  Write
5fb0: 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 74 65   this.    ** ite
5fc0: 6d 20 69 6e 74 6f 20 74 68 65 20 73 65 74 20 74  m into the set t
5fd0: 61 62 6c 65 20 77 69 74 68 20 62 6f 67 75 73 20  able with bogus 
5fe0: 64 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  data..    */.   
5ff0: 20 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b   case SRT_Set: {
6000: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
6010: 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20  Column==1 );.   
6020: 20 20 20 70 44 65 73 74 2d 3e 61 66 66 53 64 73     pDest->affSds
6030: 74 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20  t =.            
6040: 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6d        sqlite3Com
6050: 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 45 4c  pareAffinity(pEL
6060: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c  ist->a[0].pExpr,
6070: 20 70 44 65 73 74 2d 3e 61 66 66 53 64 73 74 29   pDest->affSdst)
6080: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 64  ;.      if( pOrd
6090: 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20  erBy ){.        
60a0: 2f 2a 20 41 74 20 66 69 72 73 74 20 67 6c 61 6e  /* At first glan
60b0: 63 65 20 79 6f 75 20 77 6f 75 6c 64 20 74 68 69  ce you would thi
60c0: 6e 6b 20 77 65 20 63 6f 75 6c 64 20 6f 70 74 69  nk we could opti
60d0: 6d 69 7a 65 20 6f 75 74 20 74 68 65 0a 20 20 20  mize out the.   
60e0: 20 20 20 20 20 2a 2a 20 4f 52 44 45 52 20 42 59       ** ORDER BY
60f0: 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 73 69   in this case si
6100: 6e 63 65 20 74 68 65 20 6f 72 64 65 72 20 6f 66  nce the order of
6110: 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
6120: 73 65 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 64  set.        ** d
6130: 6f 65 73 20 6e 6f 74 20 6d 61 74 74 65 72 2e 20  oes not matter. 
6140: 20 42 75 74 20 74 68 65 72 65 20 6d 69 67 68 74   But there might
6150: 20 62 65 20 61 20 4c 49 4d 49 54 20 63 6c 61 75   be a LIMIT clau
6160: 73 65 2c 20 69 6e 20 77 68 69 63 68 0a 20 20 20  se, in which.   
6170: 20 20 20 20 20 2a 2a 20 63 61 73 65 20 74 68 65       ** case the
6180: 20 6f 72 64 65 72 20 64 6f 65 73 20 6d 61 74 74   order does matt
6190: 65 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 75  er */.        pu
61a0: 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61  shOntoSorter(pPa
61b0: 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 70  rse, pOrderBy, p
61c0: 2c 20 72 65 67 52 65 73 75 6c 74 29 3b 0a 20 20  , regResult);.  
61d0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
61e0: 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69     int r1 = sqli
61f0: 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
6200: 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73  arse);.        s
6210: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
6220: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
6230: 64 2c 20 72 65 67 52 65 73 75 6c 74 2c 31 2c 72  d, regResult,1,r
6240: 31 2c 20 26 70 44 65 73 74 2d 3e 61 66 66 53 64  1, &pDest->affSd
6250: 73 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  st, 1);.        
6260: 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
6270: 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70  AffinityChange(p
6280: 50 61 72 73 65 2c 20 72 65 67 52 65 73 75 6c 74  Parse, regResult
6290: 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 1);.        sq
62a0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
62b0: 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c  v, OP_IdxInsert,
62c0: 20 69 50 61 72 6d 2c 20 72 31 29 3b 0a 20 20 20   iParm, r1);.   
62d0: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
62e0: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
62f0: 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 7d 0a  e, r1);.      }.
6300: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
6310: 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 6e   }..    /* If an
6320: 79 20 72 6f 77 20 65 78 69 73 74 20 69 6e 20 74  y row exist in t
6330: 68 65 20 72 65 73 75 6c 74 20 73 65 74 2c 20 72  he result set, r
6340: 65 63 6f 72 64 20 74 68 61 74 20 66 61 63 74 20  ecord that fact 
6350: 61 6e 64 20 61 62 6f 72 74 2e 0a 20 20 20 20 2a  and abort..    *
6360: 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 45  /.    case SRT_E
6370: 78 69 73 74 73 3a 20 7b 0a 20 20 20 20 20 20 73  xists: {.      s
6380: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
6390: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
63a0: 31 2c 20 69 50 61 72 6d 29 3b 0a 20 20 20 20 20  1, iParm);.     
63b0: 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c   /* The LIMIT cl
63c0: 61 75 73 65 20 77 69 6c 6c 20 74 65 72 6d 69 6e  ause will termin
63d0: 61 74 65 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72  ate the loop for
63e0: 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 62 72 65   us */.      bre
63f0: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
6400: 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20 73  * If this is a s
6410: 63 61 6c 61 72 20 73 65 6c 65 63 74 20 74 68 61  calar select tha
6420: 74 20 69 73 20 70 61 72 74 20 6f 66 20 61 6e 20  t is part of an 
6430: 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e  expression, then
6440: 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65 20 74 68  .    ** store th
6450: 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74 68 65  e results in the
6460: 20 61 70 70 72 6f 70 72 69 61 74 65 20 6d 65 6d   appropriate mem
6470: 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20 62 72 65  ory cell and bre
6480: 61 6b 20 6f 75 74 0a 20 20 20 20 2a 2a 20 6f 66  ak out.    ** of
6490: 20 74 68 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a   the scan loop..
64a0: 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
64b0: 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20  SRT_Mem: {.     
64c0: 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e   assert( nColumn
64d0: 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ==1 );.      if(
64e0: 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20   pOrderBy ){.   
64f0: 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72       pushOntoSor
6500: 74 65 72 28 70 50 61 72 73 65 2c 20 70 4f 72 64  ter(pParse, pOrd
6510: 65 72 42 79 2c 20 70 2c 20 72 65 67 52 65 73 75  erBy, p, regResu
6520: 6c 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  lt);.      }else
6530: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
6540: 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50  3ExprCodeMove(pP
6550: 61 72 73 65 2c 20 72 65 67 52 65 73 75 6c 74 2c  arse, regResult,
6560: 20 69 50 61 72 6d 2c 20 31 29 3b 0a 20 20 20 20   iParm, 1);.    
6570: 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54      /* The LIMIT
6580: 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 6a 75 6d   clause will jum
6590: 70 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f  p out of the loo
65a0: 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20  p for us */.    
65b0: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
65c0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  .    }.#endif /*
65d0: 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f   #ifndef SQLITE_
65e0: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f  OMIT_SUBQUERY */
65f0: 0a 0a 20 20 20 20 2f 2a 20 53 65 6e 64 20 74 68  ..    /* Send th
6600: 65 20 64 61 74 61 20 74 6f 20 74 68 65 20 63 61  e data to the ca
6610: 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20  llback function 
6620: 6f 72 20 74 6f 20 61 20 73 75 62 72 6f 75 74 69  or to a subrouti
6630: 6e 65 2e 20 20 49 6e 20 74 68 65 0a 20 20 20 20  ne.  In the.    
6640: 2a 2a 20 63 61 73 65 20 6f 66 20 61 20 73 75 62  ** case of a sub
6650: 72 6f 75 74 69 6e 65 2c 20 74 68 65 20 73 75 62  routine, the sub
6660: 72 6f 75 74 69 6e 65 20 69 74 73 65 6c 66 20 69  routine itself i
6670: 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
6680: 72 0a 20 20 20 20 2a 2a 20 70 6f 70 70 69 6e 67  r.    ** popping
6690: 20 74 68 65 20 64 61 74 61 20 66 72 6f 6d 20 74   the data from t
66a0: 68 65 20 73 74 61 63 6b 2e 0a 20 20 20 20 2a 2f  he stack..    */
66b0: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 43 6f  .    case SRT_Co
66c0: 72 6f 75 74 69 6e 65 3a 0a 20 20 20 20 63 61 73  routine:.    cas
66d0: 65 20 53 52 54 5f 4f 75 74 70 75 74 3a 20 7b 0a  e SRT_Output: {.
66e0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
66f0: 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75  eDest==SRT_Corou
6700: 74 69 6e 65 20 29 3b 0a 20 20 20 20 20 20 74 65  tine );.      te
6710: 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53  stcase( eDest==S
6720: 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20 20 20  RT_Output );.   
6730: 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20     if( pOrderBy 
6740: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  ){.        int r
6750: 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
6760: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
6770: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
6780: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d  beAddOp3(v, OP_M
6790: 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52 65  akeRecord, regRe
67a0: 73 75 6c 74 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 72  sult, nColumn, r
67b0: 31 29 3b 0a 20 20 20 20 20 20 20 20 70 75 73 68  1);.        push
67c0: 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73  OntoSorter(pPars
67d0: 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 2c 20  e, pOrderBy, p, 
67e0: 72 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  r1);.        sql
67f0: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
6800: 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a  eg(pParse, r1);.
6810: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
6820: 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75  eDest==SRT_Corou
6830: 74 69 6e 65 20 29 7b 0a 20 20 20 20 20 20 20 20  tine ){.        
6840: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6850: 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 70  1(v, OP_Yield, p
6860: 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 29 3b 0a  Dest->iSDParm);.
6870: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
6880: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
6890: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73  AddOp2(v, OP_Res
68a0: 75 6c 74 52 6f 77 2c 20 72 65 67 52 65 73 75 6c  ultRow, regResul
68b0: 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20  t, nColumn);.   
68c0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
68d0: 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61  CacheAffinityCha
68e0: 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 52  nge(pParse, regR
68f0: 65 73 75 6c 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b  esult, nColumn);
6900: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
6910: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66  reak;.    }..#if
6920: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
6930: 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 29 0a 20  _OMIT_TRIGGER). 
6940: 20 20 20 2f 2a 20 44 69 73 63 61 72 64 20 74 68     /* Discard th
6950: 65 20 72 65 73 75 6c 74 73 2e 20 20 54 68 69 73  e results.  This
6960: 20 69 73 20 75 73 65 64 20 66 6f 72 20 53 45 4c   is used for SEL
6970: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 69  ECT statements i
6980: 6e 73 69 64 65 0a 20 20 20 20 2a 2a 20 74 68 65  nside.    ** the
6990: 20 62 6f 64 79 20 6f 66 20 61 20 54 52 49 47 47   body of a TRIGG
69a0: 45 52 2e 20 20 54 68 65 20 70 75 72 70 6f 73 65  ER.  The purpose
69b0: 20 6f 66 20 73 75 63 68 20 73 65 6c 65 63 74 73   of such selects
69c0: 20 69 73 20 74 6f 20 63 61 6c 6c 0a 20 20 20 20   is to call.    
69d0: 2a 2a 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20  ** user-defined 
69e0: 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 68  functions that h
69f0: 61 76 65 20 73 69 64 65 20 65 66 66 65 63 74 73  ave side effects
6a00: 2e 20 20 57 65 20 64 6f 20 6e 6f 74 20 63 61 72  .  We do not car
6a10: 65 0a 20 20 20 20 2a 2a 20 61 62 6f 75 74 20 74  e.    ** about t
6a20: 68 65 20 61 63 74 75 61 6c 20 72 65 73 75 6c 74  he actual result
6a30: 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2e  s of the select.
6a40: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 65 66 61  .    */.    defa
6a50: 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  ult: {.      ass
6a60: 65 72 74 28 20 65 44 65 73 74 3d 3d 53 52 54 5f  ert( eDest==SRT_
6a70: 44 69 73 63 61 72 64 20 29 3b 0a 20 20 20 20 20  Discard );.     
6a80: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
6a90: 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a  ndif.  }..  /* J
6aa0: 75 6d 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  ump to the end o
6ab0: 66 20 74 68 65 20 6c 6f 6f 70 20 69 66 20 74 68  f the loop if th
6ac0: 65 20 4c 49 4d 49 54 20 69 73 20 72 65 61 63 68  e LIMIT is reach
6ad0: 65 64 2e 20 20 45 78 63 65 70 74 2c 20 69 66 0a  ed.  Except, if.
6ae0: 20 20 2a 2a 20 74 68 65 72 65 20 69 73 20 61 20    ** there is a 
6af0: 73 6f 72 74 65 72 2c 20 69 6e 20 77 68 69 63 68  sorter, in which
6b00: 20 63 61 73 65 20 74 68 65 20 73 6f 72 74 65 72   case the sorter
6b10: 20 68 61 73 20 61 6c 72 65 61 64 79 20 6c 69 6d   has already lim
6b20: 69 74 65 64 0a 20 20 2a 2a 20 74 68 65 20 6f 75  ited.  ** the ou
6b30: 74 70 75 74 20 66 6f 72 20 75 73 2e 0a 20 20 2a  tput for us..  *
6b40: 2f 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79  /.  if( pOrderBy
6b50: 3d 3d 30 20 26 26 20 70 2d 3e 69 4c 69 6d 69 74  ==0 && p->iLimit
6b60: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
6b70: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
6b80: 49 66 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69  IfZero, p->iLimi
6b90: 74 2c 20 69 42 72 65 61 6b 2c 20 2d 31 29 3b 0a  t, iBreak, -1);.
6ba0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c    }.}../*.** All
6bb0: 6f 63 61 74 65 20 61 20 4b 65 79 49 6e 66 6f 20  ocate a KeyInfo 
6bc0: 6f 62 6a 65 63 74 20 73 75 66 66 69 63 69 65 6e  object sufficien
6bd0: 74 20 66 6f 72 20 61 6e 20 69 6e 64 65 78 20 6f  t for an index o
6be0: 66 20 4e 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2a 0a  f N columns..**.
6bf0: 2a 2a 20 41 63 74 75 61 6c 6c 79 2c 20 61 6c 77  ** Actually, alw
6c00: 61 79 73 20 61 6c 6c 6f 63 61 74 65 20 6f 6e 65  ays allocate one
6c10: 20 65 78 74 72 61 20 63 6f 6c 75 6d 6e 20 66 6f   extra column fo
6c20: 72 20 74 68 65 20 72 6f 77 69 64 20 61 74 20 74  r the rowid at t
6c30: 68 65 20 65 6e 64 0a 2a 2a 20 6f 66 20 74 68 65  he end.** of the
6c40: 20 69 6e 64 65 78 2e 20 20 53 6f 20 74 68 65 20   index.  So the 
6c50: 4b 65 79 49 6e 66 6f 20 72 65 74 75 72 6e 65 64  KeyInfo returned
6c60: 20 77 69 6c 6c 20 68 61 76 65 20 73 70 61 63 65   will have space
6c70: 20 73 75 66 66 69 63 69 65 6e 74 20 66 6f 72 0a   sufficient for.
6c80: 2a 2a 20 4e 2b 31 20 63 6f 6c 75 6d 6e 73 2e 0a  ** N+1 columns..
6c90: 2a 2f 0a 4b 65 79 49 6e 66 6f 20 2a 73 71 6c 69  */.KeyInfo *sqli
6ca0: 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28  te3KeyInfoAlloc(
6cb0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
6cc0: 20 4e 29 7b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a   N){.  KeyInfo *
6cd0: 70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  p = sqlite3DbMal
6ce0: 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 0a 20 20 20  locZero(db, .   
6cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6d00: 73 69 7a 65 6f 66 28 4b 65 79 49 6e 66 6f 29 20  sizeof(KeyInfo) 
6d10: 2b 20 28 4e 2b 31 29 2a 28 73 69 7a 65 6f 66 28  + (N+1)*(sizeof(
6d20: 43 6f 6c 6c 53 65 71 2a 29 2b 31 29 29 3b 0a 20  CollSeq*)+1));. 
6d30: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 70 2d   if( p ){.    p-
6d40: 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75  >aSortOrder = (u
6d50: 38 2a 29 26 70 2d 3e 61 43 6f 6c 6c 5b 4e 2b 31  8*)&p->aColl[N+1
6d60: 5d 3b 0a 20 20 20 20 70 2d 3e 6e 46 69 65 6c 64  ];.    p->nField
6d70: 20 3d 20 28 75 31 36 29 4e 3b 0a 20 20 20 20 70   = (u16)N;.    p
6d80: 2d 3e 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b  ->enc = ENC(db);
6d90: 0a 20 20 20 20 70 2d 3e 64 62 20 3d 20 64 62 3b  .    p->db = db;
6da0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b  .  }.  return p;
6db0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  .}../*.** Given 
6dc0: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  an expression li
6dd0: 73 74 2c 20 67 65 6e 65 72 61 74 65 20 61 20 4b  st, generate a K
6de0: 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
6df0: 20 74 68 61 74 20 72 65 63 6f 72 64 73 0a 2a 2a   that records.**
6e00: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73   the collating s
6e10: 65 71 75 65 6e 63 65 20 66 6f 72 20 65 61 63 68  equence for each
6e20: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 74   expression in t
6e30: 68 61 74 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  hat expression l
6e40: 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ist..**.** If th
6e50: 65 20 45 78 70 72 4c 69 73 74 20 69 73 20 61 6e  e ExprList is an
6e60: 20 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f   ORDER BY or GRO
6e70: 55 50 20 42 59 20 63 6c 61 75 73 65 20 74 68 65  UP BY clause the
6e80: 6e 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67 0a  n the resulting.
6e90: 2a 2a 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63  ** KeyInfo struc
6ea0: 74 75 72 65 20 69 73 20 61 70 70 72 6f 70 72 69  ture is appropri
6eb0: 61 74 65 20 66 6f 72 20 69 6e 69 74 69 61 6c 69  ate for initiali
6ec0: 7a 69 6e 67 20 61 20 76 69 72 74 75 61 6c 20 69  zing a virtual i
6ed0: 6e 64 65 78 20 74 6f 0a 2a 2a 20 69 6d 70 6c 65  ndex to.** imple
6ee0: 6d 65 6e 74 20 74 68 61 74 20 63 6c 61 75 73 65  ment that clause
6ef0: 2e 20 20 49 66 20 74 68 65 20 45 78 70 72 4c 69  .  If the ExprLi
6f00: 73 74 20 69 73 20 74 68 65 20 72 65 73 75 6c 74  st is the result
6f10: 20 73 65 74 20 6f 66 20 61 20 53 45 4c 45 43 54   set of a SELECT
6f20: 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 4b 65 79  .** then the Key
6f30: 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69  Info structure i
6f40: 73 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f  s appropriate fo
6f50: 72 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 61  r initializing a
6f60: 20 76 69 72 74 75 61 6c 0a 2a 2a 20 69 6e 64 65   virtual.** inde
6f70: 78 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61  x to implement a
6f80: 20 44 49 53 54 49 4e 43 54 20 74 65 73 74 2e 0a   DISTINCT test..
6f90: 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68  **.** Space to h
6fa0: 6f 6c 64 20 74 68 65 20 4b 65 79 49 6e 66 6f 20  old the KeyInfo 
6fb0: 73 74 72 75 63 74 75 72 65 20 69 73 20 6f 62 74  structure is obt
6fc0: 61 69 6e 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e  ain from malloc.
6fd0: 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a    The calling.**
6fe0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 73   function is res
6ff0: 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 73 65 65  ponsible for see
7000: 69 6e 67 20 74 68 61 74 20 74 68 69 73 20 73 74  ing that this st
7010: 72 75 63 74 75 72 65 20 69 73 20 65 76 65 6e 74  ructure is event
7020: 75 61 6c 6c 79 0a 2a 2a 20 66 72 65 65 64 2e 20  ually.** freed. 
7030: 20 41 64 64 20 74 68 65 20 4b 65 79 49 6e 66 6f   Add the KeyInfo
7040: 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 74 68   structure to th
7050: 65 20 50 34 20 66 69 65 6c 64 20 6f 66 20 61 6e  e P4 field of an
7060: 20 6f 70 63 6f 64 65 20 75 73 69 6e 67 0a 2a 2a   opcode using.**
7070: 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44   P4_KEYINFO_HAND
7080: 4f 46 46 20 69 73 20 74 68 65 20 75 73 75 61 6c  OFF is the usual
7090: 20 77 61 79 20 6f 66 20 64 65 61 6c 69 6e 67 20   way of dealing 
70a0: 77 69 74 68 20 74 68 69 73 2e 0a 2a 2f 0a 73 74  with this..*/.st
70b0: 61 74 69 63 20 4b 65 79 49 6e 66 6f 20 2a 6b 65  atic KeyInfo *ke
70c0: 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73  yInfoFromExprLis
70d0: 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  t(Parse *pParse,
70e0: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
70f0: 29 7b 0a 20 20 69 6e 74 20 6e 45 78 70 72 3b 0a  ){.  int nExpr;.
7100: 20 20 4b 65 79 49 6e 66 6f 20 2a 70 49 6e 66 6f    KeyInfo *pInfo
7110: 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c  ;.  struct ExprL
7120: 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
7130: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
7140: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
7150: 6e 74 20 69 3b 0a 0a 20 20 6e 45 78 70 72 20 3d  nt i;..  nExpr =
7160: 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20   pList->nExpr;. 
7170: 20 70 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33   pInfo = sqlite3
7180: 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c  KeyInfoAlloc(db,
7190: 20 6e 45 78 70 72 29 3b 0a 20 20 69 66 28 20 70   nExpr);.  if( p
71a0: 49 6e 66 6f 20 29 7b 0a 20 20 20 20 66 6f 72 28  Info ){.    for(
71b0: 69 3d 30 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74  i=0, pItem=pList
71c0: 2d 3e 61 3b 20 69 3c 6e 45 78 70 72 3b 20 69 2b  ->a; i<nExpr; i+
71d0: 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
71e0: 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
71f0: 6c 3b 0a 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d  l;.      pColl =
7200: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
7210: 53 65 71 28 70 50 61 72 73 65 2c 20 70 49 74 65  Seq(pParse, pIte
7220: 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  m->pExpr);.     
7230: 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 20 70 43   if( !pColl ) pC
7240: 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43  oll = db->pDfltC
7250: 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 49 6e 66 6f  oll;.      pInfo
7260: 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 70 43 6f  ->aColl[i] = pCo
7270: 6c 6c 3b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d  ll;.      pInfo-
7280: 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d  >aSortOrder[i] =
7290: 20 70 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65   pItem->sortOrde
72a0: 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  r;.    }.  }.  r
72b0: 65 74 75 72 6e 20 70 49 6e 66 6f 3b 0a 7d 0a 0a  eturn pInfo;.}..
72c0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
72d0: 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
72e0: 45 43 54 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65 20 6f  ECT./*.** Name o
72f0: 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  f the connection
7300: 20 6f 70 65 72 61 74 6f 72 2c 20 75 73 65 64 20   operator, used 
7310: 66 6f 72 20 65 72 72 6f 72 20 6d 65 73 73 61 67  for error messag
7320: 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  es..*/.static co
7330: 6e 73 74 20 63 68 61 72 20 2a 73 65 6c 65 63 74  nst char *select
7340: 4f 70 4e 61 6d 65 28 69 6e 74 20 69 64 29 7b 0a  OpName(int id){.
7350: 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 73 77 69    char *z;.  swi
7360: 74 63 68 28 20 69 64 20 29 7b 0a 20 20 20 20 63  tch( id ){.    c
7370: 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 20 20 20 20  ase TK_ALL:     
7380: 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 20 41 4c 4c    z = "UNION ALL
7390: 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ";   break;.    
73a0: 63 61 73 65 20 54 4b 5f 49 4e 54 45 52 53 45 43  case TK_INTERSEC
73b0: 54 3a 20 7a 20 3d 20 22 49 4e 54 45 52 53 45 43  T: z = "INTERSEC
73c0: 54 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  T";   break;.   
73d0: 20 63 61 73 65 20 54 4b 5f 45 58 43 45 50 54 3a   case TK_EXCEPT:
73e0: 20 20 20 20 7a 20 3d 20 22 45 58 43 45 50 54 22      z = "EXCEPT"
73f0: 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ;      break;.  
7400: 20 20 64 65 66 61 75 6c 74 3a 20 20 20 20 20 20    default:      
7410: 20 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 22       z = "UNION"
7420: 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;       break;. 
7430: 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d   }.  return z;.}
7440: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
7450: 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
7460: 53 45 4c 45 43 54 20 2a 2f 0a 0a 23 69 66 6e 64  SELECT */..#ifnd
7470: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  ef SQLITE_OMIT_E
7480: 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 55 6e 6c  XPLAIN./*.** Unl
7490: 65 73 73 20 61 6e 20 22 45 58 50 4c 41 49 4e 20  ess an "EXPLAIN 
74a0: 51 55 45 52 59 20 50 4c 41 4e 22 20 63 6f 6d 6d  QUERY PLAN" comm
74b0: 61 6e 64 20 69 73 20 62 65 69 6e 67 20 70 72 6f  and is being pro
74c0: 63 65 73 73 65 64 2c 20 74 68 69 73 20 66 75 6e  cessed, this fun
74d0: 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 61 20 6e 6f  ction.** is a no
74e0: 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  -op. Otherwise, 
74f0: 69 74 20 61 64 64 73 20 61 20 73 69 6e 67 6c 65  it adds a single
7500: 20 72 6f 77 20 6f 66 20 6f 75 74 70 75 74 20 74   row of output t
7510: 6f 20 74 68 65 20 45 51 50 20 72 65 73 75 6c 74  o the EQP result
7520: 2c 0a 2a 2a 20 77 68 65 72 65 20 74 68 65 20 63  ,.** where the c
7530: 61 70 74 69 6f 6e 20 69 73 20 6f 66 20 74 68 65  aption is of the
7540: 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 22   form:.**.**   "
7550: 55 53 45 20 54 45 4d 50 20 42 2d 54 52 45 45 20  USE TEMP B-TREE 
7560: 46 4f 52 20 78 78 78 22 0a 2a 2a 0a 2a 2a 20 77  FOR xxx".**.** w
7570: 68 65 72 65 20 78 78 78 20 69 73 20 6f 6e 65 20  here xxx is one 
7580: 6f 66 20 22 44 49 53 54 49 4e 43 54 22 2c 20 22  of "DISTINCT", "
7590: 4f 52 44 45 52 20 42 59 22 20 6f 72 20 22 47 52  ORDER BY" or "GR
75a0: 4f 55 50 20 42 59 22 2e 20 45 78 61 63 74 6c 79  OUP BY". Exactly
75b0: 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 64 65 74   which.** is det
75c0: 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 7a  ermined by the z
75d0: 55 73 61 67 65 20 61 72 67 75 6d 65 6e 74 2e 0a  Usage argument..
75e0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
75f0: 78 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65 28  xplainTempTable(
7600: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63  Parse *pParse, c
7610: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 73 61 67  onst char *zUsag
7620: 65 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65  e){.  if( pParse
7630: 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a  ->explain==2 ){.
7640: 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50      Vdbe *v = pP
7650: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 20  arse->pVdbe;.   
7660: 20 63 68 61 72 20 2a 7a 4d 73 67 20 3d 20 73 71   char *zMsg = sq
7670: 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 70 50 61  lite3MPrintf(pPa
7680: 72 73 65 2d 3e 64 62 2c 20 22 55 53 45 20 54 45  rse->db, "USE TE
7690: 4d 50 20 42 2d 54 52 45 45 20 46 4f 52 20 25 73  MP B-TREE FOR %s
76a0: 22 2c 20 7a 55 73 61 67 65 29 3b 0a 20 20 20 20  ", zUsage);.    
76b0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
76c0: 34 28 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c  4(v, OP_Explain,
76d0: 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74   pParse->iSelect
76e0: 49 64 2c 20 30 2c 20 30 2c 20 7a 4d 73 67 2c 20  Id, 0, 0, zMsg, 
76f0: 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d  P4_DYNAMIC);.  }
7700: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e  .}../*.** Assign
7710: 20 65 78 70 72 65 73 73 69 6f 6e 20 62 20 74 6f   expression b to
7720: 20 6c 76 61 6c 75 65 20 61 2e 20 41 20 73 65 63   lvalue a. A sec
7730: 6f 6e 64 2c 20 6e 6f 2d 6f 70 2c 20 76 65 72 73  ond, no-op, vers
7740: 69 6f 6e 20 6f 66 20 74 68 69 73 20 6d 61 63 72  ion of this macr
7750: 6f 0a 2a 2a 20 69 73 20 70 72 6f 76 69 64 65 64  o.** is provided
7760: 20 77 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4d 49   when SQLITE_OMI
7770: 54 5f 45 58 50 4c 41 49 4e 20 69 73 20 64 65 66  T_EXPLAIN is def
7780: 69 6e 65 64 2e 20 54 68 69 73 20 61 6c 6c 6f 77  ined. This allow
7790: 73 20 74 68 65 20 63 6f 64 65 0a 2a 2a 20 69 6e  s the code.** in
77a0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29   sqlite3Select()
77b0: 20 74 6f 20 61 73 73 69 67 6e 20 76 61 6c 75 65   to assign value
77c0: 73 20 74 6f 20 73 74 72 75 63 74 75 72 65 20 6d  s to structure m
77d0: 65 6d 62 65 72 20 76 61 72 69 61 62 6c 65 73 20  ember variables 
77e0: 74 68 61 74 0a 2a 2a 20 6f 6e 6c 79 20 65 78 69  that.** only exi
77f0: 73 74 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49  st if SQLITE_OMI
7800: 54 5f 45 58 50 4c 41 49 4e 20 69 73 20 6e 6f 74  T_EXPLAIN is not
7810: 20 64 65 66 69 6e 65 64 20 77 69 74 68 6f 75 74   defined without
7820: 20 70 6f 6c 6c 75 74 69 6e 67 20 74 68 65 0a 2a   polluting the.*
7830: 2a 20 63 6f 64 65 20 77 69 74 68 20 23 69 66 6e  * code with #ifn
7840: 64 65 66 20 64 69 72 65 63 74 69 76 65 73 2e 0a  def directives..
7850: 2a 2f 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c  */.# define expl
7860: 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 61 2c  ainSetInteger(a,
7870: 20 62 29 20 61 20 3d 20 62 0a 0a 23 65 6c 73 65   b) a = b..#else
7880: 0a 2f 2a 20 4e 6f 2d 6f 70 20 76 65 72 73 69 6f  ./* No-op versio
7890: 6e 73 20 6f 66 20 74 68 65 20 65 78 70 6c 61 69  ns of the explai
78a0: 6e 58 58 58 28 29 20 66 75 6e 63 74 69 6f 6e 73  nXXX() functions
78b0: 20 61 6e 64 20 6d 61 63 72 6f 73 2e 20 2a 2f 0a   and macros. */.
78c0: 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69 6e  # define explain
78d0: 54 65 6d 70 54 61 62 6c 65 28 79 2c 7a 29 0a 23  TempTable(y,z).#
78e0: 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69 6e 53   define explainS
78f0: 65 74 49 6e 74 65 67 65 72 28 79 2c 7a 29 0a 23  etInteger(y,z).#
7900: 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69  endif..#if !defi
7910: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
7920: 45 58 50 4c 41 49 4e 29 20 26 26 20 21 64 65 66  EXPLAIN) && !def
7930: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
7940: 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
7950: 29 0a 2f 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 61  )./*.** Unless a
7960: 6e 20 22 45 58 50 4c 41 49 4e 20 51 55 45 52 59  n "EXPLAIN QUERY
7970: 20 50 4c 41 4e 22 20 63 6f 6d 6d 61 6e 64 20 69   PLAN" command i
7980: 73 20 62 65 69 6e 67 20 70 72 6f 63 65 73 73 65  s being processe
7990: 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  d, this function
79a0: 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20  .** is a no-op. 
79b0: 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 61 64  Otherwise, it ad
79c0: 64 73 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20  ds a single row 
79d0: 6f 66 20 6f 75 74 70 75 74 20 74 6f 20 74 68 65  of output to the
79e0: 20 45 51 50 20 72 65 73 75 6c 74 2c 0a 2a 2a 20   EQP result,.** 
79f0: 77 68 65 72 65 20 74 68 65 20 63 61 70 74 69 6f  where the captio
7a00: 6e 20 69 73 20 6f 66 20 6f 6e 65 20 6f 66 20 74  n is of one of t
7a10: 68 65 20 74 77 6f 20 66 6f 72 6d 73 3a 0a 2a 2a  he two forms:.**
7a20: 0a 2a 2a 20 20 20 22 43 4f 4d 50 4f 53 49 54 45  .**   "COMPOSITE
7a30: 20 53 55 42 51 55 45 52 49 45 53 20 69 53 75 62   SUBQUERIES iSub
7a40: 31 20 61 6e 64 20 69 53 75 62 32 20 28 6f 70 29  1 and iSub2 (op)
7a50: 22 0a 2a 2a 20 20 20 22 43 4f 4d 50 4f 53 49 54  ".**   "COMPOSIT
7a60: 45 20 53 55 42 51 55 45 52 49 45 53 20 69 53 75  E SUBQUERIES iSu
7a70: 62 31 20 61 6e 64 20 69 53 75 62 32 20 55 53 49  b1 and iSub2 USI
7a80: 4e 47 20 54 45 4d 50 20 42 2d 54 52 45 45 20 28  NG TEMP B-TREE (
7a90: 6f 70 29 22 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65  op)".**.** where
7aa0: 20 69 53 75 62 31 20 61 6e 64 20 69 53 75 62 32   iSub1 and iSub2
7ab0: 20 61 72 65 20 74 68 65 20 69 6e 74 65 67 65 72   are the integer
7ac0: 73 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  s passed as the 
7ad0: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a  corresponding.**
7ae0: 20 66 75 6e 63 74 69 6f 6e 20 70 61 72 61 6d 65   function parame
7af0: 74 65 72 73 2c 20 61 6e 64 20 6f 70 20 69 73 20  ters, and op is 
7b00: 74 68 65 20 74 65 78 74 20 72 65 70 72 65 73 65  the text represe
7b10: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 70  ntation of the p
7b20: 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 66 20 74  arameter.** of t
7b30: 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20 54 68  he same name. Th
7b40: 65 20 70 61 72 61 6d 65 74 65 72 20 22 6f 70 22  e parameter "op"
7b50: 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66 20   must be one of 
7b60: 54 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f 45 58 43  TK_UNION, TK_EXC
7b70: 45 50 54 2c 0a 2a 2a 20 54 4b 5f 49 4e 54 45 52  EPT,.** TK_INTER
7b80: 53 45 43 54 20 6f 72 20 54 4b 5f 41 4c 4c 2e 20  SECT or TK_ALL. 
7b90: 54 68 65 20 66 69 72 73 74 20 66 6f 72 6d 20 69  The first form i
7ba0: 73 20 75 73 65 64 20 69 66 20 61 72 67 75 6d 65  s used if argume
7bb0: 6e 74 20 62 55 73 65 54 6d 70 20 69 73 20 0a 2a  nt bUseTmp is .*
7bc0: 2a 20 66 61 6c 73 65 2c 20 6f 72 20 74 68 65 20  * false, or the 
7bd0: 73 65 63 6f 6e 64 20 66 6f 72 6d 20 69 66 20 69  second form if i
7be0: 74 20 69 73 20 74 72 75 65 2e 0a 2a 2f 0a 73 74  t is true..*/.st
7bf0: 61 74 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69  atic void explai
7c00: 6e 43 6f 6d 70 6f 73 69 74 65 28 0a 20 20 50 61  nComposite(.  Pa
7c10: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
7c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7c30: 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a   Parse context *
7c40: 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20  /.  int op,     
7c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7c60: 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 54 4b      /* One of TK
7c70: 5f 55 4e 49 4f 4e 2c 20 54 4b 5f 45 58 43 45 50  _UNION, TK_EXCEP
7c80: 54 20 65 74 63 2e 20 2a 2f 0a 20 20 69 6e 74 20  T etc. */.  int 
7c90: 69 53 75 62 31 2c 20 20 20 20 20 20 20 20 20 20  iSub1,          
7ca0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
7cb0: 75 62 71 75 65 72 79 20 69 64 20 31 20 2a 2f 0a  ubquery id 1 */.
7cc0: 20 20 69 6e 74 20 69 53 75 62 32 2c 20 20 20 20    int iSub2,    
7cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ce0: 20 20 2f 2a 20 53 75 62 71 75 65 72 79 20 69 64    /* Subquery id
7cf0: 20 32 20 2a 2f 0a 20 20 69 6e 74 20 62 55 73 65   2 */.  int bUse
7d00: 54 6d 70 20 20 20 20 20 20 20 20 20 20 20 20 20  Tmp             
7d10: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
7d20: 69 66 20 61 20 74 65 6d 70 20 74 61 62 6c 65 20  if a temp table 
7d30: 77 61 73 20 75 73 65 64 20 2a 2f 0a 29 7b 0a 20  was used */.){. 
7d40: 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 54 4b 5f   assert( op==TK_
7d50: 55 4e 49 4f 4e 20 7c 7c 20 6f 70 3d 3d 54 4b 5f  UNION || op==TK_
7d60: 45 58 43 45 50 54 20 7c 7c 20 6f 70 3d 3d 54 4b  EXCEPT || op==TK
7d70: 5f 49 4e 54 45 52 53 45 43 54 20 7c 7c 20 6f 70  _INTERSECT || op
7d80: 3d 3d 54 4b 5f 41 4c 4c 20 29 3b 0a 20 20 69 66  ==TK_ALL );.  if
7d90: 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69  ( pParse->explai
7da0: 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 56 64 62 65  n==2 ){.    Vdbe
7db0: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
7dc0: 64 62 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  dbe;.    char *z
7dd0: 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  Msg = sqlite3MPr
7de0: 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 70 50  intf(.        pP
7df0: 61 72 73 65 2d 3e 64 62 2c 20 22 43 4f 4d 50 4f  arse->db, "COMPO
7e00: 55 4e 44 20 53 55 42 51 55 45 52 49 45 53 20 25  UND SUBQUERIES %
7e10: 64 20 41 4e 44 20 25 64 20 25 73 28 25 73 29 22  d AND %d %s(%s)"
7e20: 2c 20 69 53 75 62 31 2c 20 69 53 75 62 32 2c 0a  , iSub1, iSub2,.
7e30: 20 20 20 20 20 20 20 20 62 55 73 65 54 6d 70 3f          bUseTmp?
7e40: 22 55 53 49 4e 47 20 54 45 4d 50 20 42 2d 54 52  "USING TEMP B-TR
7e50: 45 45 20 22 3a 22 22 2c 20 73 65 6c 65 63 74 4f  EE ":"", selectO
7e60: 70 4e 61 6d 65 28 6f 70 29 0a 20 20 20 20 29 3b  pName(op).    );
7e70: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
7e80: 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45 78 70  AddOp4(v, OP_Exp
7e90: 6c 61 69 6e 2c 20 70 50 61 72 73 65 2d 3e 69 53  lain, pParse->iS
7ea0: 65 6c 65 63 74 49 64 2c 20 30 2c 20 30 2c 20 7a  electId, 0, 0, z
7eb0: 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29  Msg, P4_DYNAMIC)
7ec0: 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 2f 2a  ;.  }.}.#else./*
7ed0: 20 4e 6f 2d 6f 70 20 76 65 72 73 69 6f 6e 73 20   No-op versions 
7ee0: 6f 66 20 74 68 65 20 65 78 70 6c 61 69 6e 58 58  of the explainXX
7ef0: 58 28 29 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e  X() functions an
7f00: 64 20 6d 61 63 72 6f 73 2e 20 2a 2f 0a 23 20 64  d macros. */.# d
7f10: 65 66 69 6e 65 20 65 78 70 6c 61 69 6e 43 6f 6d  efine explainCom
7f20: 70 6f 73 69 74 65 28 76 2c 77 2c 78 2c 79 2c 7a  posite(v,w,x,y,z
7f30: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
7f40: 49 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f  If the inner loo
7f50: 70 20 77 61 73 20 67 65 6e 65 72 61 74 65 64 20  p was generated 
7f60: 75 73 69 6e 67 20 61 20 6e 6f 6e 2d 6e 75 6c 6c  using a non-null
7f70: 20 70 4f 72 64 65 72 42 79 20 61 72 67 75 6d 65   pOrderBy argume
7f80: 6e 74 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20  nt,.** then the 
7f90: 72 65 73 75 6c 74 73 20 77 65 72 65 20 70 6c 61  results were pla
7fa0: 63 65 64 20 69 6e 20 61 20 73 6f 72 74 65 72 2e  ced in a sorter.
7fb0: 20 20 41 66 74 65 72 20 74 68 65 20 6c 6f 6f 70    After the loop
7fc0: 20 69 73 20 74 65 72 6d 69 6e 61 74 65 64 0a 2a   is terminated.*
7fd0: 2a 20 77 65 20 6e 65 65 64 20 74 6f 20 72 75 6e  * we need to run
7fe0: 20 74 68 65 20 73 6f 72 74 65 72 20 61 6e 64 20   the sorter and 
7ff0: 6f 75 74 70 75 74 20 74 68 65 20 72 65 73 75 6c  output the resul
8000: 74 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  ts.  The followi
8010: 6e 67 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67 65  ng.** routine ge
8020: 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f 64 65  nerates the code
8030: 20 6e 65 65 64 65 64 20 74 6f 20 64 6f 20 74 68   needed to do th
8040: 61 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  at..*/.static vo
8050: 69 64 20 67 65 6e 65 72 61 74 65 53 6f 72 74 54  id generateSortT
8060: 61 69 6c 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ail(.  Parse *pP
8070: 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73  arse,    /* Pars
8080: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
8090: 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
80a0: 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54     /* The SELECT
80b0: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
80c0: 56 64 62 65 20 2a 76 2c 20 20 20 20 20 20 20 20  Vdbe *v,        
80d0: 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
80e0: 64 65 20 69 6e 74 6f 20 74 68 69 73 20 56 44 42  de into this VDB
80f0: 45 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 75  E */.  int nColu
8100: 6d 6e 2c 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62  mn,      /* Numb
8110: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 6f 66  er of columns of
8120: 20 64 61 74 61 20 2a 2f 0a 20 20 53 65 6c 65 63   data */.  Selec
8130: 74 44 65 73 74 20 2a 70 44 65 73 74 20 2f 2a 20  tDest *pDest /* 
8140: 57 72 69 74 65 20 74 68 65 20 73 6f 72 74 65 64  Write the sorted
8150: 20 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f   results here */
8160: 0a 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 42 72  .){.  int addrBr
8170: 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62  eak = sqlite3Vdb
8180: 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 20 20  eMakeLabel(v);  
8190: 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
81a0: 74 6f 20 65 78 69 74 20 6c 6f 6f 70 20 2a 2f 0a  to exit loop */.
81b0: 20 20 69 6e 74 20 61 64 64 72 43 6f 6e 74 69 6e    int addrContin
81c0: 75 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ue = sqlite3Vdbe
81d0: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 20 20 2f  MakeLabel(v);  /
81e0: 2a 20 4a 75 6d 70 20 68 65 72 65 20 66 6f 72 20  * Jump here for 
81f0: 6e 65 78 74 20 63 79 63 6c 65 20 2a 2f 0a 20 20  next cycle */.  
8200: 69 6e 74 20 61 64 64 72 3b 0a 20 20 69 6e 74 20  int addr;.  int 
8210: 69 54 61 62 3b 0a 20 20 69 6e 74 20 70 73 65 75  iTab;.  int pseu
8220: 64 6f 54 61 62 20 3d 20 30 3b 0a 20 20 45 78 70  doTab = 0;.  Exp
8230: 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20  rList *pOrderBy 
8240: 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 0a  = p->pOrderBy;..
8250: 20 20 69 6e 74 20 65 44 65 73 74 20 3d 20 70 44    int eDest = pD
8260: 65 73 74 2d 3e 65 44 65 73 74 3b 0a 20 20 69 6e  est->eDest;.  in
8270: 74 20 69 50 61 72 6d 20 3d 20 70 44 65 73 74 2d  t iParm = pDest-
8280: 3e 69 53 44 50 61 72 6d 3b 0a 0a 20 20 69 6e 74  >iSDParm;..  int
8290: 20 72 65 67 52 6f 77 3b 0a 20 20 69 6e 74 20 72   regRow;.  int r
82a0: 65 67 52 6f 77 69 64 3b 0a 0a 20 20 69 54 61 62  egRowid;..  iTab
82b0: 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43   = pOrderBy->iEC
82c0: 75 72 73 6f 72 3b 0a 20 20 72 65 67 52 6f 77 20  ursor;.  regRow 
82d0: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
82e0: 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 69  Reg(pParse);.  i
82f0: 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75  f( eDest==SRT_Ou
8300: 74 70 75 74 20 7c 7c 20 65 44 65 73 74 3d 3d 53  tput || eDest==S
8310: 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a  RT_Coroutine ){.
8320: 20 20 20 20 70 73 65 75 64 6f 54 61 62 20 3d 20      pseudoTab = 
8330: 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
8340: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
8350: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp3(v, OP_Open
8360: 50 73 65 75 64 6f 2c 20 70 73 65 75 64 6f 54 61  Pseudo, pseudoTa
8370: 62 2c 20 72 65 67 52 6f 77 2c 20 6e 43 6f 6c 75  b, regRow, nColu
8380: 6d 6e 29 3b 0a 20 20 20 20 72 65 67 52 6f 77 69  mn);.    regRowi
8390: 64 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  d = 0;.  }else{.
83a0: 20 20 20 20 72 65 67 52 6f 77 69 64 20 3d 20 73      regRowid = s
83b0: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
83c0: 28 70 50 61 72 73 65 29 3b 0a 20 20 7d 0a 20 20  (pParse);.  }.  
83d0: 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  if( p->selFlags 
83e0: 26 20 53 46 5f 55 73 65 53 6f 72 74 65 72 20 29  & SF_UseSorter )
83f0: 7b 0a 20 20 20 20 69 6e 74 20 72 65 67 53 6f 72  {.    int regSor
8400: 74 4f 75 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d  tOut = ++pParse-
8410: 3e 6e 4d 65 6d 3b 0a 20 20 20 20 69 6e 74 20 70  >nMem;.    int p
8420: 74 61 62 32 20 3d 20 70 50 61 72 73 65 2d 3e 6e  tab2 = pParse->n
8430: 54 61 62 2b 2b 3b 0a 20 20 20 20 73 71 6c 69 74  Tab++;.    sqlit
8440: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
8450: 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f 2c 20 70  OP_OpenPseudo, p
8460: 74 61 62 32 2c 20 72 65 67 53 6f 72 74 4f 75 74  tab2, regSortOut
8470: 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  , pOrderBy->nExp
8480: 72 2b 32 29 3b 0a 20 20 20 20 61 64 64 72 20 3d  r+2);.    addr =
8490: 20 31 20 2b 20 73 71 6c 69 74 65 33 56 64 62 65   1 + sqlite3Vdbe
84a0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72  AddOp2(v, OP_Sor
84b0: 74 65 72 53 6f 72 74 2c 20 69 54 61 62 2c 20 61  terSort, iTab, a
84c0: 64 64 72 42 72 65 61 6b 29 3b 0a 20 20 20 20 63  ddrBreak);.    c
84d0: 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2c 20  odeOffset(v, p, 
84e0: 61 64 64 72 43 6f 6e 74 69 6e 75 65 29 3b 0a 20  addrContinue);. 
84f0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
8500: 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65  dOp2(v, OP_Sorte
8510: 72 44 61 74 61 2c 20 69 54 61 62 2c 20 72 65 67  rData, iTab, reg
8520: 53 6f 72 74 4f 75 74 29 3b 0a 20 20 20 20 73 71  SortOut);.    sq
8530: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
8540: 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 74  v, OP_Column, pt
8550: 61 62 32 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e  ab2, pOrderBy->n
8560: 45 78 70 72 2b 31 2c 20 72 65 67 52 6f 77 29 3b  Expr+1, regRow);
8570: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
8580: 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
8590: 41 47 5f 43 4c 45 41 52 43 41 43 48 45 29 3b 0a  AG_CLEARCACHE);.
85a0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 64 64    }else{.    add
85b0: 72 20 3d 20 31 20 2b 20 73 71 6c 69 74 65 33 56  r = 1 + sqlite3V
85c0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
85d0: 53 6f 72 74 2c 20 69 54 61 62 2c 20 61 64 64 72  Sort, iTab, addr
85e0: 42 72 65 61 6b 29 3b 0a 20 20 20 20 63 6f 64 65  Break);.    code
85f0: 4f 66 66 73 65 74 28 76 2c 20 70 2c 20 61 64 64  Offset(v, p, add
8600: 72 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20  rContinue);.    
8610: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
8620: 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  3(v, OP_Column, 
8630: 69 54 61 62 2c 20 70 4f 72 64 65 72 42 79 2d 3e  iTab, pOrderBy->
8640: 6e 45 78 70 72 2b 31 2c 20 72 65 67 52 6f 77 29  nExpr+1, regRow)
8650: 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63 68 28 20  ;.  }.  switch( 
8660: 65 44 65 73 74 20 29 7b 0a 20 20 20 20 63 61 73  eDest ){.    cas
8670: 65 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20  e SRT_Table:.   
8680: 20 63 61 73 65 20 53 52 54 5f 45 70 68 65 6d 54   case SRT_EphemT
8690: 61 62 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74  ab: {.      test
86a0: 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54  case( eDest==SRT
86b0: 5f 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 20 20  _Table );.      
86c0: 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d  testcase( eDest=
86d0: 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29 3b  =SRT_EphemTab );
86e0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
86f0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
8700: 65 77 52 6f 77 69 64 2c 20 69 50 61 72 6d 2c 20  ewRowid, iParm, 
8710: 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  regRowid);.     
8720: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
8730: 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c  p3(v, OP_Insert,
8740: 20 69 50 61 72 6d 2c 20 72 65 67 52 6f 77 2c 20   iParm, regRow, 
8750: 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  regRowid);.     
8760: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
8770: 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41  geP5(v, OPFLAG_A
8780: 50 50 45 4e 44 29 3b 0a 20 20 20 20 20 20 62 72  PPEND);.      br
8790: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  eak;.    }.#ifnd
87a0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
87b0: 55 42 51 55 45 52 59 0a 20 20 20 20 63 61 73 65  UBQUERY.    case
87c0: 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20   SRT_Set: {.    
87d0: 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d    assert( nColum
87e0: 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71  n==1 );.      sq
87f0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
8800: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
8810: 2c 20 72 65 67 52 6f 77 2c 20 31 2c 20 72 65 67  , regRow, 1, reg
8820: 52 6f 77 69 64 2c 0a 20 20 20 20 20 20 20 20 20  Rowid,.         
8830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
8840: 70 44 65 73 74 2d 3e 61 66 66 53 64 73 74 2c 20  pDest->affSdst, 
8850: 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
8860: 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69  3ExprCacheAffini
8870: 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c  tyChange(pParse,
8880: 20 72 65 67 52 6f 77 2c 20 31 29 3b 0a 20 20 20   regRow, 1);.   
8890: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
88a0: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e  dOp2(v, OP_IdxIn
88b0: 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 65 67  sert, iParm, reg
88c0: 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 62 72  Rowid);.      br
88d0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
88e0: 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20  ase SRT_Mem: {. 
88f0: 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f       assert( nCo
8900: 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20  lumn==1 );.     
8910: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
8920: 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 72 65 67  Move(pParse, reg
8930: 52 6f 77 2c 20 69 50 61 72 6d 2c 20 31 29 3b 0a  Row, iParm, 1);.
8940: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d        /* The LIM
8950: 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 74  IT clause will t
8960: 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f  erminate the loo
8970: 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20  p for us */.    
8980: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
8990: 65 6e 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c  endif.    defaul
89a0: 74 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  t: {.      int i
89b0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
89c0: 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75  eDest==SRT_Outpu
89d0: 74 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f  t || eDest==SRT_
89e0: 43 6f 72 6f 75 74 69 6e 65 20 29 3b 20 0a 20 20  Coroutine ); .  
89f0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44      testcase( eD
8a00: 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20  est==SRT_Output 
8a10: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
8a20: 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f  e( eDest==SRT_Co
8a30: 72 6f 75 74 69 6e 65 20 29 3b 0a 20 20 20 20 20  routine );.     
8a40: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c   for(i=0; i<nCol
8a50: 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  umn; i++){.     
8a60: 20 20 20 61 73 73 65 72 74 28 20 72 65 67 52 6f     assert( regRo
8a70: 77 21 3d 70 44 65 73 74 2d 3e 69 53 64 73 74 2b  w!=pDest->iSdst+
8a80: 69 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  i );.        sql
8a90: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
8aa0: 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 73 65  , OP_Column, pse
8ab0: 75 64 6f 54 61 62 2c 20 69 2c 20 70 44 65 73 74  udoTab, i, pDest
8ac0: 2d 3e 69 53 64 73 74 2b 69 29 3b 0a 20 20 20 20  ->iSdst+i);.    
8ad0: 20 20 20 20 69 66 28 20 69 3d 3d 30 20 29 7b 0a      if( i==0 ){.
8ae0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
8af0: 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
8b00: 20 4f 50 46 4c 41 47 5f 43 4c 45 41 52 43 41 43   OPFLAG_CLEARCAC
8b10: 48 45 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  HE);.        }. 
8b20: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
8b30: 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70   eDest==SRT_Outp
8b40: 75 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ut ){.        sq
8b50: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
8b60: 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c  v, OP_ResultRow,
8b70: 20 70 44 65 73 74 2d 3e 69 53 64 73 74 2c 20 6e   pDest->iSdst, n
8b80: 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20  Column);.       
8b90: 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
8ba0: 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  eAffinityChange(
8bb0: 70 50 61 72 73 65 2c 20 70 44 65 73 74 2d 3e 69  pParse, pDest->i
8bc0: 53 64 73 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a  Sdst, nColumn);.
8bd0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
8be0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
8bf0: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65  AddOp1(v, OP_Yie
8c00: 6c 64 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61  ld, pDest->iSDPa
8c10: 72 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rm);.      }.   
8c20: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
8c30: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c    }.  sqlite3Rel
8c40: 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
8c50: 73 65 2c 20 72 65 67 52 6f 77 29 3b 0a 20 20 73  se, regRow);.  s
8c60: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
8c70: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
8c80: 52 6f 77 69 64 29 3b 0a 0a 20 20 2f 2a 20 54 68  Rowid);..  /* Th
8c90: 65 20 62 6f 74 74 6f 6d 20 6f 66 20 74 68 65 20  e bottom of the 
8ca0: 6c 6f 6f 70 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  loop.  */.  sqli
8cb0: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
8cc0: 62 65 6c 28 76 2c 20 61 64 64 72 43 6f 6e 74 69  bel(v, addrConti
8cd0: 6e 75 65 29 3b 0a 20 20 69 66 28 20 70 2d 3e 73  nue);.  if( p->s
8ce0: 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 55 73 65  elFlags & SF_Use
8cf0: 53 6f 72 74 65 72 20 29 7b 0a 20 20 20 20 73 71  Sorter ){.    sq
8d00: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
8d10: 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4e 65 78 74  v, OP_SorterNext
8d20: 2c 20 69 54 61 62 2c 20 61 64 64 72 29 3b 0a 20  , iTab, addr);. 
8d30: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
8d40: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
8d50: 20 4f 50 5f 4e 65 78 74 2c 20 69 54 61 62 2c 20   OP_Next, iTab, 
8d60: 61 64 64 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  addr);.  }.  sql
8d70: 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
8d80: 61 62 65 6c 28 76 2c 20 61 64 64 72 42 72 65 61  abel(v, addrBrea
8d90: 6b 29 3b 0a 20 20 69 66 28 20 65 44 65 73 74 3d  k);.  if( eDest=
8da0: 3d 53 52 54 5f 4f 75 74 70 75 74 20 7c 7c 20 65  =SRT_Output || e
8db0: 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74  Dest==SRT_Corout
8dc0: 69 6e 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ine ){.    sqlit
8dd0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
8de0: 4f 50 5f 43 6c 6f 73 65 2c 20 70 73 65 75 64 6f  OP_Close, pseudo
8df0: 54 61 62 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a  Tab, 0);.  }.}..
8e00: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  /*.** Return a p
8e10: 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74 72 69  ointer to a stri
8e20: 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ng containing th
8e30: 65 20 27 64 65 63 6c 61 72 61 74 69 6f 6e 20 74  e 'declaration t
8e40: 79 70 65 27 20 6f 66 20 74 68 65 0a 2a 2a 20 65  ype' of the.** e
8e50: 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e  xpression pExpr.
8e60: 20 54 68 65 20 73 74 72 69 6e 67 20 6d 61 79 20   The string may 
8e70: 62 65 20 74 72 65 61 74 65 64 20 61 73 20 73 74  be treated as st
8e80: 61 74 69 63 20 62 79 20 74 68 65 20 63 61 6c 6c  atic by the call
8e90: 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65  er..**.** The de
8ea0: 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20 69  claration type i
8eb0: 73 20 74 68 65 20 65 78 61 63 74 20 64 61 74 61  s the exact data
8ec0: 74 79 70 65 20 64 65 66 69 6e 69 74 69 6f 6e 20  type definition 
8ed0: 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74  extracted from t
8ee0: 68 65 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 43  he.** original C
8ef0: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
8f00: 65 6d 65 6e 74 20 69 66 20 74 68 65 20 65 78 70  ement if the exp
8f10: 72 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c  ression is a col
8f20: 75 6d 6e 2e 20 54 68 65 0a 2a 2a 20 64 65 63 6c  umn. The.** decl
8f30: 61 72 61 74 69 6f 6e 20 74 79 70 65 20 66 6f 72  aration type for
8f40: 20 61 20 52 4f 57 49 44 20 66 69 65 6c 64 20 69   a ROWID field i
8f50: 73 20 49 4e 54 45 47 45 52 2e 20 45 78 61 63 74  s INTEGER. Exact
8f60: 6c 79 20 77 68 65 6e 20 61 6e 20 65 78 70 72 65  ly when an expre
8f70: 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6e 73  ssion.** is cons
8f80: 69 64 65 72 65 64 20 61 20 63 6f 6c 75 6d 6e 20  idered a column 
8f90: 63 61 6e 20 62 65 20 63 6f 6d 70 6c 65 78 20 69  can be complex i
8fa0: 6e 20 74 68 65 20 70 72 65 73 65 6e 63 65 20 6f  n the presence o
8fb0: 66 20 73 75 62 71 75 65 72 69 65 73 2e 20 54 68  f subqueries. Th
8fc0: 65 0a 2a 2a 20 72 65 73 75 6c 74 2d 73 65 74 20  e.** result-set 
8fd0: 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 61 6c  expression in al
8fe0: 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  l of the followi
8ff0: 6e 67 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  ng SELECT statem
9000: 65 6e 74 73 20 69 73 20 0a 2a 2a 20 63 6f 6e 73  ents is .** cons
9010: 69 64 65 72 65 64 20 61 20 63 6f 6c 75 6d 6e 20  idered a column 
9020: 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
9030: 2e 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54  ..**.**   SELECT
9040: 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b 0a 2a   col FROM tbl;.*
9050: 2a 20 20 20 53 45 4c 45 43 54 20 28 53 45 4c 45  *   SELECT (SELE
9060: 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b  CT col FROM tbl;
9070: 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 28 53 45  .**   SELECT (SE
9080: 4c 45 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62  LECT col FROM tb
9090: 6c 29 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20  l);.**   SELECT 
90a0: 61 62 63 20 46 52 4f 4d 20 28 53 45 4c 45 43 54  abc FROM (SELECT
90b0: 20 63 6f 6c 20 41 53 20 61 62 63 20 46 52 4f 4d   col AS abc FROM
90c0: 20 74 62 6c 29 3b 0a 2a 2a 20 0a 2a 2a 20 54 68   tbl);.** .** Th
90d0: 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79  e declaration ty
90e0: 70 65 20 66 6f 72 20 61 6e 79 20 65 78 70 72 65  pe for any expre
90f0: 73 73 69 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e  ssion other than
9100: 20 61 20 63 6f 6c 75 6d 6e 20 69 73 20 4e 55 4c   a column is NUL
9110: 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  L..*/.static con
9120: 73 74 20 63 68 61 72 20 2a 63 6f 6c 75 6d 6e 54  st char *columnT
9130: 79 70 65 28 0a 20 20 4e 61 6d 65 43 6f 6e 74 65  ype(.  NameConte
9140: 78 74 20 2a 70 4e 43 2c 20 0a 20 20 45 78 70 72  xt *pNC, .  Expr
9150: 20 2a 70 45 78 70 72 2c 0a 20 20 63 6f 6e 73 74   *pExpr,.  const
9160: 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67 69 6e   char **pzOrigin
9170: 44 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  Db,.  const char
9180: 20 2a 2a 70 7a 4f 72 69 67 69 6e 54 61 62 2c 0a   **pzOriginTab,.
9190: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70    const char **p
91a0: 7a 4f 72 69 67 69 6e 43 6f 6c 0a 29 7b 0a 20 20  zOriginCol.){.  
91b0: 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 54 79 70  char const *zTyp
91c0: 65 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 63 6f  e = 0;.  char co
91d0: 6e 73 74 20 2a 7a 4f 72 69 67 69 6e 44 62 20 3d  nst *zOriginDb =
91e0: 20 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74   0;.  char const
91f0: 20 2a 7a 4f 72 69 67 69 6e 54 61 62 20 3d 20 30   *zOriginTab = 0
9200: 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a  ;.  char const *
9210: 7a 4f 72 69 67 69 6e 43 6f 6c 20 3d 20 30 3b 0a  zOriginCol = 0;.
9220: 20 20 69 6e 74 20 6a 3b 0a 20 20 69 66 28 20 4e    int j;.  if( N
9230: 45 56 45 52 28 70 45 78 70 72 3d 3d 30 29 20 7c  EVER(pExpr==0) |
9240: 7c 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3d  | pNC->pSrcList=
9250: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a  =0 ) return 0;..
9260: 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d    switch( pExpr-
9270: 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20  >op ){.    case 
9280: 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20  TK_AGG_COLUMN:. 
9290: 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d     case TK_COLUM
92a0: 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  N: {.      /* Th
92b0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
92c0: 61 20 63 6f 6c 75 6d 6e 2e 20 4c 6f 63 61 74 65  a column. Locate
92d0: 20 74 68 65 20 74 61 62 6c 65 20 74 68 65 20 63   the table the c
92e0: 6f 6c 75 6d 6e 20 69 73 20 62 65 69 6e 67 0a 20  olumn is being. 
92f0: 20 20 20 20 20 2a 2a 20 65 78 74 72 61 63 74 65       ** extracte
9300: 64 20 66 72 6f 6d 20 69 6e 20 4e 61 6d 65 43 6f  d from in NameCo
9310: 6e 74 65 78 74 2e 70 53 72 63 4c 69 73 74 2e 20  ntext.pSrcList. 
9320: 54 68 69 73 20 74 61 62 6c 65 20 6d 61 79 20 62  This table may b
9330: 65 20 72 65 61 6c 0a 20 20 20 20 20 20 2a 2a 20  e real.      ** 
9340: 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 20 6f  database table o
9350: 72 20 61 20 73 75 62 71 75 65 72 79 2e 0a 20 20  r a subquery..  
9360: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 54 61 62      */.      Tab
9370: 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b 20 20 20  le *pTab = 0;   
9380: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
9390: 65 20 73 74 72 75 63 74 75 72 65 20 63 6f 6c 75  e structure colu
93a0: 6d 6e 20 69 73 20 65 78 74 72 61 63 74 65 64 20  mn is extracted 
93b0: 66 72 6f 6d 20 2a 2f 0a 20 20 20 20 20 20 53 65  from */.      Se
93c0: 6c 65 63 74 20 2a 70 53 20 3d 20 30 3b 20 20 20  lect *pS = 0;   
93d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 6c            /* Sel
93e0: 65 63 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69  ect the column i
93f0: 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  s extracted from
9400: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 43   */.      int iC
9410: 6f 6c 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c  ol = pExpr->iCol
9420: 75 6d 6e 3b 20 20 2f 2a 20 49 6e 64 65 78 20 6f  umn;  /* Index o
9430: 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 54 61 62  f column in pTab
9440: 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61   */.      testca
9450: 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
9460: 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a  K_AGG_COLUMN );.
9470: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
9480: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pExpr->op==TK_CO
9490: 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 77 68  LUMN );.      wh
94a0: 69 6c 65 28 20 70 4e 43 20 26 26 20 21 70 54 61  ile( pNC && !pTa
94b0: 62 20 29 7b 0a 20 20 20 20 20 20 20 20 53 72 63  b ){.        Src
94c0: 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 20 3d  List *pTabList =
94d0: 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a   pNC->pSrcList;.
94e0: 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b          for(j=0;
94f0: 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  j<pTabList->nSrc
9500: 20 26 26 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b   && pTabList->a[
9510: 6a 5d 2e 69 43 75 72 73 6f 72 21 3d 70 45 78 70  j].iCursor!=pExp
9520: 72 2d 3e 69 54 61 62 6c 65 3b 6a 2b 2b 29 3b 0a  r->iTable;j++);.
9530: 20 20 20 20 20 20 20 20 69 66 28 20 6a 3c 70 54          if( j<pT
9540: 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 7b 0a  abList->nSrc ){.
9550: 20 20 20 20 20 20 20 20 20 20 70 54 61 62 20 3d            pTab =
9560: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e   pTabList->a[j].
9570: 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20  pTab;.          
9580: 70 53 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61  pS = pTabList->a
9590: 5b 6a 5d 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20  [j].pSelect;.   
95a0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
95b0: 20 20 20 20 20 20 70 4e 43 20 3d 20 70 4e 43 2d        pNC = pNC-
95c0: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20  >pNext;.        
95d0: 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  }.      }..     
95e0: 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a   if( pTab==0 ){.
95f0: 20 20 20 20 20 20 20 20 2f 2a 20 41 74 20 6f 6e          /* At on
9600: 65 20 74 69 6d 65 2c 20 63 6f 64 65 20 73 75 63  e time, code suc
9610: 68 20 61 73 20 22 53 45 4c 45 43 54 20 6e 65 77  h as "SELECT new
9620: 2e 78 22 20 77 69 74 68 69 6e 20 61 20 74 72 69  .x" within a tri
9630: 67 67 65 72 20 77 6f 75 6c 64 0a 20 20 20 20 20  gger would.     
9640: 20 20 20 2a 2a 20 63 61 75 73 65 20 74 68 69 73     ** cause this
9650: 20 63 6f 6e 64 69 74 69 6f 6e 20 74 6f 20 72 75   condition to ru
9660: 6e 2e 20 20 53 69 6e 63 65 20 74 68 65 6e 2c 20  n.  Since then, 
9670: 77 65 20 68 61 76 65 20 72 65 73 74 72 75 63 74  we have restruct
9680: 75 72 65 64 20 68 6f 77 0a 20 20 20 20 20 20 20  ured how.       
9690: 20 2a 2a 20 74 72 69 67 67 65 72 20 63 6f 64 65   ** trigger code
96a0: 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 61 6e   is generated an
96b0: 64 20 73 6f 20 74 68 69 73 20 63 6f 6e 64 69 74  d so this condit
96c0: 69 6f 6e 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72  ion is no longer
96d0: 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 73   .        ** pos
96e0: 73 69 62 6c 65 2e 20 48 6f 77 65 76 65 72 2c 20  sible. However, 
96f0: 69 74 20 63 61 6e 20 73 74 69 6c 6c 20 62 65 20  it can still be 
9700: 74 72 75 65 20 66 6f 72 20 73 74 61 74 65 6d 65  true for stateme
9710: 6e 74 73 20 6c 69 6b 65 0a 20 20 20 20 20 20 20  nts like.       
9720: 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   ** the followin
9730: 67 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  g:.        **.  
9740: 20 20 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54        **   CREAT
9750: 45 20 54 41 42 4c 45 20 74 31 28 63 6f 6c 20 49  E TABLE t1(col I
9760: 4e 54 45 47 45 52 29 3b 0a 20 20 20 20 20 20 20  NTEGER);.       
9770: 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 28 53 45   **   SELECT (SE
9780: 4c 45 43 54 20 74 31 2e 63 6f 6c 29 20 46 52 4f  LECT t1.col) FRO
9790: 4d 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 20  M FROM t1;.     
97a0: 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
97b0: 20 77 68 65 6e 20 63 6f 6c 75 6d 6e 54 79 70 65   when columnType
97c0: 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20  () is called on 
97d0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 22  the expression "
97e0: 74 31 2e 63 6f 6c 22 20 69 6e 20 74 68 65 20 0a  t1.col" in the .
97f0: 20 20 20 20 20 20 20 20 2a 2a 20 73 75 62 2d 73          ** sub-s
9800: 65 6c 65 63 74 2e 20 49 6e 20 74 68 69 73 20 63  elect. In this c
9810: 61 73 65 2c 20 73 65 74 20 74 68 65 20 63 6f 6c  ase, set the col
9820: 75 6d 6e 20 74 79 70 65 20 74 6f 20 4e 55 4c 4c  umn type to NULL
9830: 2c 20 65 76 65 6e 0a 20 20 20 20 20 20 20 20 2a  , even.        *
9840: 2a 20 74 68 6f 75 67 68 20 69 74 20 73 68 6f 75  * though it shou
9850: 6c 64 20 72 65 61 6c 6c 79 20 62 65 20 22 49 4e  ld really be "IN
9860: 54 45 47 45 52 22 2e 0a 20 20 20 20 20 20 20 20  TEGER"..        
9870: 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68  **.        ** Th
9880: 69 73 20 69 73 20 6e 6f 74 20 61 20 70 72 6f 62  is is not a prob
9890: 6c 65 6d 2c 20 61 73 20 74 68 65 20 63 6f 6c 75  lem, as the colu
98a0: 6d 6e 20 74 79 70 65 20 6f 66 20 22 74 31 2e 63  mn type of "t1.c
98b0: 6f 6c 22 20 69 73 20 6e 65 76 65 72 0a 20 20 20  ol" is never.   
98c0: 20 20 20 20 20 2a 2a 20 75 73 65 64 2e 20 57 68       ** used. Wh
98d0: 65 6e 20 63 6f 6c 75 6d 6e 54 79 70 65 28 29 20  en columnType() 
98e0: 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65  is called on the
98f0: 20 65 78 70 72 65 73 73 69 6f 6e 20 0a 20 20 20   expression .   
9900: 20 20 20 20 20 2a 2a 20 22 28 53 45 4c 45 43 54       ** "(SELECT
9910: 20 74 31 2e 63 6f 6c 29 22 2c 20 74 68 65 20 63   t1.col)", the c
9920: 6f 72 72 65 63 74 20 74 79 70 65 20 69 73 20 72  orrect type is r
9930: 65 74 75 72 6e 65 64 20 28 73 65 65 20 74 68 65  eturned (see the
9940: 20 54 4b 5f 53 45 4c 45 43 54 0a 20 20 20 20 20   TK_SELECT.     
9950: 20 20 20 2a 2a 20 62 72 61 6e 63 68 20 62 65 6c     ** branch bel
9960: 6f 77 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  ow.  */.        
9970: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a  break;.      }..
9980: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
9990: 61 62 20 26 26 20 70 45 78 70 72 2d 3e 70 54 61  ab && pExpr->pTa
99a0: 62 3d 3d 70 54 61 62 20 29 3b 0a 20 20 20 20 20  b==pTab );.     
99b0: 20 69 66 28 20 70 53 20 29 7b 0a 20 20 20 20 20   if( pS ){.     
99c0: 20 20 20 2f 2a 20 54 68 65 20 22 74 61 62 6c 65     /* The "table
99d0: 22 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61 20  " is actually a 
99e0: 73 75 62 2d 73 65 6c 65 63 74 20 6f 72 20 61 20  sub-select or a 
99f0: 76 69 65 77 20 69 6e 20 74 68 65 20 46 52 4f 4d  view in the FROM
9a00: 20 63 6c 61 75 73 65 0a 20 20 20 20 20 20 20 20   clause.        
9a10: 2a 2a 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  ** of the SELECT
9a20: 20 73 74 61 74 65 6d 65 6e 74 2e 20 52 65 74 75   statement. Retu
9a30: 72 6e 20 74 68 65 20 64 65 63 6c 61 72 61 74 69  rn the declarati
9a40: 6f 6e 20 74 79 70 65 20 61 6e 64 20 6f 72 69 67  on type and orig
9a50: 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 61  in.        ** da
9a60: 74 61 20 66 6f 72 20 74 68 65 20 72 65 73 75 6c  ta for the resul
9a70: 74 2d 73 65 74 20 63 6f 6c 75 6d 6e 20 6f 66 20  t-set column of 
9a80: 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74 2e 0a  the sub-select..
9a90: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
9aa0: 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 26     if( iCol>=0 &
9ab0: 26 20 41 4c 57 41 59 53 28 69 43 6f 6c 3c 70 53  & ALWAYS(iCol<pS
9ac0: 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29  ->pEList->nExpr)
9ad0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
9ae0: 20 49 66 20 69 43 6f 6c 20 69 73 20 6c 65 73 73   If iCol is less
9af0: 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e   than zero, then
9b00: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
9b10: 72 65 71 75 65 73 74 73 20 74 68 65 0a 20 20 20  requests the.   
9b20: 20 20 20 20 20 20 20 2a 2a 20 72 6f 77 69 64 20         ** rowid 
9b30: 6f 66 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63  of the sub-selec
9b40: 74 20 6f 72 20 76 69 65 77 2e 20 54 68 69 73 20  t or view. This 
9b50: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6c 65  expression is le
9b60: 67 61 6c 20 28 73 65 65 20 0a 20 20 20 20 20 20  gal (see .      
9b70: 20 20 20 20 2a 2a 20 74 65 73 74 20 63 61 73 65      ** test case
9b80: 20 6d 69 73 63 32 2e 32 2e 32 29 20 2d 20 69 74   misc2.2.2) - it
9b90: 20 61 6c 77 61 79 73 20 65 76 61 6c 75 61 74 65   always evaluate
9ba0: 73 20 74 6f 20 4e 55 4c 4c 2e 0a 20 20 20 20 20  s to NULL..     
9bb0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
9bc0: 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e    NameContext sN
9bd0: 43 3b 0a 20 20 20 20 20 20 20 20 20 20 45 78 70  C;.          Exp
9be0: 72 20 2a 70 20 3d 20 70 53 2d 3e 70 45 4c 69 73  r *p = pS->pELis
9bf0: 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78 70 72  t->a[iCol].pExpr
9c00: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 4e 43 2e  ;.          sNC.
9c10: 70 53 72 63 4c 69 73 74 20 3d 20 70 53 2d 3e 70  pSrcList = pS->p
9c20: 53 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73  Src;.          s
9c30: 4e 43 2e 70 4e 65 78 74 20 3d 20 70 4e 43 3b 0a  NC.pNext = pNC;.
9c40: 20 20 20 20 20 20 20 20 20 20 73 4e 43 2e 70 50            sNC.pP
9c50: 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72  arse = pNC->pPar
9c60: 73 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 54  se;.          zT
9c70: 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65  ype = columnType
9c80: 28 26 73 4e 43 2c 20 70 2c 20 26 7a 4f 72 69 67  (&sNC, p, &zOrig
9c90: 69 6e 44 62 2c 20 26 7a 4f 72 69 67 69 6e 54 61  inDb, &zOriginTa
9ca0: 62 2c 20 26 7a 4f 72 69 67 69 6e 43 6f 6c 29 3b  b, &zOriginCol);
9cb0: 20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20   .        }.    
9cc0: 20 20 7d 65 6c 73 65 20 69 66 28 20 41 4c 57 41    }else if( ALWA
9cd0: 59 53 28 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  YS(pTab->pSchema
9ce0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
9cf0: 41 20 72 65 61 6c 20 74 61 62 6c 65 20 2a 2f 0a  A real table */.
9d00: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
9d10: 21 70 53 20 29 3b 0a 20 20 20 20 20 20 20 20 69  !pS );.        i
9d20: 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c  f( iCol<0 ) iCol
9d30: 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a   = pTab->iPKey;.
9d40: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
9d50: 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f  iCol==-1 || (iCo
9d60: 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61  l>=0 && iCol<pTa
9d70: 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20 20 20  b->nCol) );.    
9d80: 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29      if( iCol<0 )
9d90: 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79 70  {.          zTyp
9da0: 65 20 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a 20  e = "INTEGER";. 
9db0: 20 20 20 20 20 20 20 20 20 7a 4f 72 69 67 69 6e           zOrigin
9dc0: 43 6f 6c 20 3d 20 22 72 6f 77 69 64 22 3b 0a 20  Col = "rowid";. 
9dd0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
9de0: 20 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20          zType = 
9df0: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
9e00: 2e 7a 54 79 70 65 3b 0a 20 20 20 20 20 20 20 20  .zType;.        
9e10: 20 20 7a 4f 72 69 67 69 6e 43 6f 6c 20 3d 20 70    zOriginCol = p
9e20: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
9e30: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 7d  zName;.        }
9e40: 0a 20 20 20 20 20 20 20 20 7a 4f 72 69 67 69 6e  .        zOrigin
9e50: 54 61 62 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d  Tab = pTab->zNam
9e60: 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  e;.        if( p
9e70: 4e 43 2d 3e 70 50 61 72 73 65 20 29 7b 0a 20 20  NC->pParse ){.  
9e80: 20 20 20 20 20 20 20 20 69 6e 74 20 69 44 62 20          int iDb 
9e90: 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
9ea0: 6f 49 6e 64 65 78 28 70 4e 43 2d 3e 70 50 61 72  oIndex(pNC->pPar
9eb0: 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53  se->db, pTab->pS
9ec0: 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 20 20  chema);.        
9ed0: 20 20 7a 4f 72 69 67 69 6e 44 62 20 3d 20 70 4e    zOriginDb = pN
9ee0: 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61  C->pParse->db->a
9ef0: 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20  Db[iDb].zName;. 
9f00: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
9f10: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
9f20: 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
9f30: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
9f40: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c  .    case TK_SEL
9f50: 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  ECT: {.      /* 
9f60: 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  The expression i
9f70: 73 20 61 20 73 75 62 2d 73 65 6c 65 63 74 2e 20  s a sub-select. 
9f80: 52 65 74 75 72 6e 20 74 68 65 20 64 65 63 6c 61  Return the decla
9f90: 72 61 74 69 6f 6e 20 74 79 70 65 20 61 6e 64 0a  ration type and.
9fa0: 20 20 20 20 20 20 2a 2a 20 6f 72 69 67 69 6e 20        ** origin 
9fb0: 69 6e 66 6f 20 66 6f 72 20 74 68 65 20 73 69 6e  info for the sin
9fc0: 67 6c 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68  gle column in th
9fd0: 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20  e result set of 
9fe0: 74 68 65 20 53 45 4c 45 43 54 0a 20 20 20 20 20  the SELECT.     
9ff0: 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20   ** statement.. 
a000: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 4e 61       */.      Na
a010: 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20  meContext sNC;. 
a020: 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 20       Select *pS 
a030: 3d 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65  = pExpr->x.pSele
a040: 63 74 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  ct;.      Expr *
a050: 70 20 3d 20 70 53 2d 3e 70 45 4c 69 73 74 2d 3e  p = pS->pEList->
a060: 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[0].pExpr;.    
a070: 20 20 61 73 73 65 72 74 28 20 45 78 70 72 48 61    assert( ExprHa
a080: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
a090: 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
a0a0: 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70 53 72 63  ;.      sNC.pSrc
a0b0: 4c 69 73 74 20 3d 20 70 53 2d 3e 70 53 72 63 3b  List = pS->pSrc;
a0c0: 0a 20 20 20 20 20 20 73 4e 43 2e 70 4e 65 78 74  .      sNC.pNext
a0d0: 20 3d 20 70 4e 43 3b 0a 20 20 20 20 20 20 73 4e   = pNC;.      sN
a0e0: 43 2e 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e  C.pParse = pNC->
a0f0: 70 50 61 72 73 65 3b 0a 20 20 20 20 20 20 7a 54  pParse;.      zT
a100: 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65  ype = columnType
a110: 28 26 73 4e 43 2c 20 70 2c 20 26 7a 4f 72 69 67  (&sNC, p, &zOrig
a120: 69 6e 44 62 2c 20 26 7a 4f 72 69 67 69 6e 54 61  inDb, &zOriginTa
a130: 62 2c 20 26 7a 4f 72 69 67 69 6e 43 6f 6c 29 3b  b, &zOriginCol);
a140: 20 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20   .      break;. 
a150: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
a160: 20 20 0a 20 20 69 66 28 20 70 7a 4f 72 69 67 69    .  if( pzOrigi
a170: 6e 44 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72  nDb ){.    asser
a180: 74 28 20 70 7a 4f 72 69 67 69 6e 54 61 62 20 26  t( pzOriginTab &
a190: 26 20 70 7a 4f 72 69 67 69 6e 43 6f 6c 20 29 3b  & pzOriginCol );
a1a0: 0a 20 20 20 20 2a 70 7a 4f 72 69 67 69 6e 44 62  .    *pzOriginDb
a1b0: 20 3d 20 7a 4f 72 69 67 69 6e 44 62 3b 0a 20 20   = zOriginDb;.  
a1c0: 20 20 2a 70 7a 4f 72 69 67 69 6e 54 61 62 20 3d    *pzOriginTab =
a1d0: 20 7a 4f 72 69 67 69 6e 54 61 62 3b 0a 20 20 20   zOriginTab;.   
a1e0: 20 2a 70 7a 4f 72 69 67 69 6e 43 6f 6c 20 3d 20   *pzOriginCol = 
a1f0: 7a 4f 72 69 67 69 6e 43 6f 6c 3b 0a 20 20 7d 0a  zOriginCol;.  }.
a200: 20 20 72 65 74 75 72 6e 20 7a 54 79 70 65 3b 0a    return zType;.
a210: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
a220: 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
a230: 20 74 65 6c 6c 20 74 68 65 20 56 44 42 45 20 74   tell the VDBE t
a240: 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74  he declaration t
a250: 79 70 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a  ypes of columns.
a260: 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ** in the result
a270: 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   set..*/.static 
a280: 76 6f 69 64 20 67 65 6e 65 72 61 74 65 43 6f 6c  void generateCol
a290: 75 6d 6e 54 79 70 65 73 28 0a 20 20 50 61 72 73  umnTypes(.  Pars
a2a0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
a2b0: 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78  /* Parser contex
a2c0: 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  t */.  SrcList *
a2d0: 70 54 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69  pTabList,  /* Li
a2e0: 73 74 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a  st of tables */.
a2f0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
a300: 73 74 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73  st    /* Express
a310: 69 6f 6e 73 20 64 65 66 69 6e 69 6e 67 20 74 68  ions defining th
a320: 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a  e result set */.
a330: 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
a340: 45 5f 4f 4d 49 54 5f 44 45 43 4c 54 59 50 45 0a  E_OMIT_DECLTYPE.
a350: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
a360: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
a370: 20 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78   i;.  NameContex
a380: 74 20 73 4e 43 3b 0a 20 20 73 4e 43 2e 70 53 72  t sNC;.  sNC.pSr
a390: 63 4c 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74  cList = pTabList
a3a0: 3b 0a 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d  ;.  sNC.pParse =
a3b0: 20 70 50 61 72 73 65 3b 0a 20 20 66 6f 72 28 69   pParse;.  for(i
a3c0: 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45  =0; i<pEList->nE
a3d0: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45  xpr; i++){.    E
a3e0: 78 70 72 20 2a 70 20 3d 20 70 45 4c 69 73 74 2d  xpr *p = pEList-
a3f0: 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
a400: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79   const char *zTy
a410: 70 65 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  pe;.#ifdef SQLIT
a420: 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f  E_ENABLE_COLUMN_
a430: 4d 45 54 41 44 41 54 41 0a 20 20 20 20 63 6f 6e  METADATA.    con
a440: 73 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 44 62  st char *zOrigDb
a450: 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20   = 0;.    const 
a460: 63 68 61 72 20 2a 7a 4f 72 69 67 54 61 62 20 3d  char *zOrigTab =
a470: 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   0;.    const ch
a480: 61 72 20 2a 7a 4f 72 69 67 43 6f 6c 20 3d 20 30  ar *zOrigCol = 0
a490: 3b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f  ;.    zType = co
a4a0: 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70  lumnType(&sNC, p
a4b0: 2c 20 26 7a 4f 72 69 67 44 62 2c 20 26 7a 4f 72  , &zOrigDb, &zOr
a4c0: 69 67 54 61 62 2c 20 26 7a 4f 72 69 67 43 6f 6c  igTab, &zOrigCol
a4d0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 76  );..    /* The v
a4e0: 64 62 65 20 6d 75 73 74 20 6d 61 6b 65 20 69 74  dbe must make it
a4f0: 73 20 6f 77 6e 20 63 6f 70 79 20 6f 66 20 74 68  s own copy of th
a500: 65 20 63 6f 6c 75 6d 6e 2d 74 79 70 65 20 61 6e  e column-type an
a510: 64 20 6f 74 68 65 72 20 0a 20 20 20 20 2a 2a 20  d other .    ** 
a520: 63 6f 6c 75 6d 6e 20 73 70 65 63 69 66 69 63 20  column specific 
a530: 73 74 72 69 6e 67 73 2c 20 69 6e 20 63 61 73 65  strings, in case
a540: 20 74 68 65 20 73 63 68 65 6d 61 20 69 73 20 72   the schema is r
a550: 65 73 65 74 20 62 65 66 6f 72 65 20 74 68 69 73  eset before this
a560: 0a 20 20 20 20 2a 2a 20 76 69 72 74 75 61 6c 20  .    ** virtual 
a570: 6d 61 63 68 69 6e 65 20 69 73 20 64 65 6c 65 74  machine is delet
a580: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  ed..    */.    s
a590: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
a5a0: 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41  Name(v, i, COLNA
a5b0: 4d 45 5f 44 41 54 41 42 41 53 45 2c 20 7a 4f 72  ME_DATABASE, zOr
a5c0: 69 67 44 62 2c 20 53 51 4c 49 54 45 5f 54 52 41  igDb, SQLITE_TRA
a5d0: 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c  NSIENT);.    sql
a5e0: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
a5f0: 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45  me(v, i, COLNAME
a600: 5f 54 41 42 4c 45 2c 20 7a 4f 72 69 67 54 61 62  _TABLE, zOrigTab
a610: 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
a620: 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  NT);.    sqlite3
a630: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76  VdbeSetColName(v
a640: 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 43 4f 4c  , i, COLNAME_COL
a650: 55 4d 4e 2c 20 7a 4f 72 69 67 43 6f 6c 2c 20 53  UMN, zOrigCol, S
a660: 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
a670: 3b 0a 23 65 6c 73 65 0a 20 20 20 20 7a 54 79 70  ;.#else.    zTyp
a680: 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26  e = columnType(&
a690: 73 4e 43 2c 20 70 2c 20 30 2c 20 30 2c 20 30 29  sNC, p, 0, 0, 0)
a6a0: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71 6c  ;.#endif.    sql
a6b0: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
a6c0: 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45  me(v, i, COLNAME
a6d0: 5f 44 45 43 4c 54 59 50 45 2c 20 7a 54 79 70 65  _DECLTYPE, zType
a6e0: 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
a6f0: 4e 54 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20  NT);.  }.#endif 
a700: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  /* SQLITE_OMIT_D
a710: 45 43 4c 54 59 50 45 20 2a 2f 0a 7d 0a 0a 2f 2a  ECLTYPE */.}../*
a720: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
a730: 65 20 74 68 61 74 20 77 69 6c 6c 20 74 65 6c 6c  e that will tell
a740: 20 74 68 65 20 56 44 42 45 20 74 68 65 20 6e 61   the VDBE the na
a750: 6d 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a  mes of columns.*
a760: 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  * in the result 
a770: 73 65 74 2e 20 20 54 68 69 73 20 69 6e 66 6f 72  set.  This infor
a780: 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  mation is used t
a790: 6f 20 70 72 6f 76 69 64 65 20 74 68 65 0a 2a 2a  o provide the.**
a7a0: 20 61 7a 43 6f 6c 5b 5d 20 76 61 6c 75 65 73 20   azCol[] values 
a7b0: 69 6e 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 2e  in the callback.
a7c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
a7d0: 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61  generateColumnNa
a7e0: 6d 65 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50  mes(.  Parse *pP
a7f0: 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61  arse,      /* Pa
a800: 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
a810: 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
a820: 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66  ist,  /* List of
a830: 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 45 78 70   tables */.  Exp
a840: 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20  rList *pEList   
a850: 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73 20   /* Expressions 
a860: 64 65 66 69 6e 69 6e 67 20 74 68 65 20 72 65 73  defining the res
a870: 75 6c 74 20 73 65 74 20 2a 2f 0a 29 7b 0a 20 20  ult set */.){.  
a880: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
a890: 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
a8a0: 2c 20 6a 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  , j;.  sqlite3 *
a8b0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
a8c0: 0a 20 20 69 6e 74 20 66 75 6c 6c 4e 61 6d 65 73  .  int fullNames
a8d0: 2c 20 73 68 6f 72 74 4e 61 6d 65 73 3b 0a 0a 23  , shortNames;..#
a8e0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
a8f0: 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 2f 2a 20  IT_EXPLAIN.  /* 
a900: 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 45 58  If this is an EX
a910: 50 4c 41 49 4e 2c 20 73 6b 69 70 20 74 68 69 73  PLAIN, skip this
a920: 20 73 74 65 70 20 2a 2f 0a 20 20 69 66 28 20 70   step */.  if( p
a930: 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29  Parse->explain )
a940: 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
a950: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20  }.#endif..  if( 
a960: 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73  pParse->colNames
a970: 53 65 74 20 7c 7c 20 4e 45 56 45 52 28 76 3d 3d  Set || NEVER(v==
a980: 30 29 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  0) || db->malloc
a990: 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b  Failed ) return;
a9a0: 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61  .  pParse->colNa
a9b0: 6d 65 73 53 65 74 20 3d 20 31 3b 0a 20 20 66 75  mesSet = 1;.  fu
a9c0: 6c 6c 4e 61 6d 65 73 20 3d 20 28 64 62 2d 3e 66  llNames = (db->f
a9d0: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 75  lags & SQLITE_Fu
a9e0: 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a  llColNames)!=0;.
a9f0: 20 20 73 68 6f 72 74 4e 61 6d 65 73 20 3d 20 28    shortNames = (
aa00: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
aa10: 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73  TE_ShortColNames
aa20: 29 21 3d 30 3b 0a 20 20 73 71 6c 69 74 65 33 56  )!=0;.  sqlite3V
aa30: 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 76 2c  dbeSetNumCols(v,
aa40: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b   pEList->nExpr);
aa50: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45  .  for(i=0; i<pE
aa60: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
aa70: 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 3b 0a  ){.    Expr *p;.
aa80: 20 20 20 20 70 20 3d 20 70 45 4c 69 73 74 2d 3e      p = pEList->
aa90: 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
aaa0: 69 66 28 20 4e 45 56 45 52 28 70 3d 3d 30 29 20  if( NEVER(p==0) 
aab0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
aac0: 69 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  if( pEList->a[i]
aad0: 2e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  .zName ){.      
aae0: 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 45  char *zName = pE
aaf0: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
ab00: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
ab10: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
ab20: 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45   i, COLNAME_NAME
ab30: 2c 20 7a 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f  , zName, SQLITE_
ab40: 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20  TRANSIENT);.    
ab50: 7d 65 6c 73 65 20 69 66 28 20 28 70 2d 3e 6f 70  }else if( (p->op
ab60: 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70  ==TK_COLUMN || p
ab70: 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c  ->op==TK_AGG_COL
ab80: 55 4d 4e 29 20 26 26 20 70 54 61 62 4c 69 73 74  UMN) && pTabList
ab90: 20 29 7b 0a 20 20 20 20 20 20 54 61 62 6c 65 20   ){.      Table 
aba0: 2a 70 54 61 62 3b 0a 20 20 20 20 20 20 63 68 61  *pTab;.      cha
abb0: 72 20 2a 7a 43 6f 6c 3b 0a 20 20 20 20 20 20 69  r *zCol;.      i
abc0: 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 69 43 6f  nt iCol = p->iCo
abd0: 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 66 6f 72 28  lumn;.      for(
abe0: 6a 3d 30 3b 20 41 4c 57 41 59 53 28 6a 3c 70 54  j=0; ALWAYS(j<pT
abf0: 61 62 4c 69 73 74 2d 3e 6e 53 72 63 29 3b 20 6a  abList->nSrc); j
ac00: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
ac10: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e   pTabList->a[j].
ac20: 69 43 75 72 73 6f 72 3d 3d 70 2d 3e 69 54 61 62  iCursor==p->iTab
ac30: 6c 65 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  le ) break;.    
ac40: 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
ac50: 28 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  ( j<pTabList->nS
ac60: 72 63 20 29 3b 0a 20 20 20 20 20 20 70 54 61 62  rc );.      pTab
ac70: 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a   = pTabList->a[j
ac80: 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 69 66  ].pTab;.      if
ac90: 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20  ( iCol<0 ) iCol 
aca0: 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20  = pTab->iPKey;. 
acb0: 20 20 20 20 20 61 73 73 65 72 74 28 20 69 43 6f       assert( iCo
acc0: 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d  l==-1 || (iCol>=
acd0: 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e  0 && iCol<pTab->
ace0: 6e 43 6f 6c 29 20 29 3b 0a 20 20 20 20 20 20 69  nCol) );.      i
acf0: 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20  f( iCol<0 ){.   
ad00: 20 20 20 20 20 7a 43 6f 6c 20 3d 20 22 72 6f 77       zCol = "row
ad10: 69 64 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  id";.      }else
ad20: 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d  {.        zCol =
ad30: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
ad40: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 7d  ].zName;.      }
ad50: 0a 20 20 20 20 20 20 69 66 28 20 21 73 68 6f 72  .      if( !shor
ad60: 74 4e 61 6d 65 73 20 26 26 20 21 66 75 6c 6c 4e  tNames && !fullN
ad70: 61 6d 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20  ames ){.        
ad80: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
ad90: 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e  lName(v, i, COLN
ada0: 41 4d 45 5f 4e 41 4d 45 2c 20 0a 20 20 20 20 20  AME_NAME, .     
adb0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
adc0: 53 74 72 44 75 70 28 64 62 2c 20 70 45 4c 69 73  StrDup(db, pELis
add0: 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 29 2c 20  t->a[i].zSpan), 
ade0: 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b  SQLITE_DYNAMIC);
adf0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
ae00: 20 66 75 6c 6c 4e 61 6d 65 73 20 29 7b 0a 20 20   fullNames ){.  
ae10: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d        char *zNam
ae20: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7a  e = 0;.        z
ae30: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50  Name = sqlite3MP
ae40: 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2e 25 73  rintf(db, "%s.%s
ae50: 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  ", pTab->zName, 
ae60: 7a 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73  zCol);.        s
ae70: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
ae80: 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41  Name(v, i, COLNA
ae90: 4d 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20  ME_NAME, zName, 
aea0: 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b  SQLITE_DYNAMIC);
aeb0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
aec0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
aed0: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69  eSetColName(v, i
aee0: 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20  , COLNAME_NAME, 
aef0: 7a 43 6f 6c 2c 20 53 51 4c 49 54 45 5f 54 52 41  zCol, SQLITE_TRA
af00: 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 20 20 7d  NSIENT);.      }
af10: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
af20: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
af30: 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f  ColName(v, i, CO
af40: 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 0a 20 20 20  LNAME_NAME, .   
af50: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
af60: 53 74 72 44 75 70 28 64 62 2c 20 70 45 4c 69 73  StrDup(db, pELis
af70: 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 29 2c 20  t->a[i].zSpan), 
af80: 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b  SQLITE_DYNAMIC);
af90: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 67 65 6e  .    }.  }.  gen
afa0: 65 72 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73  erateColumnTypes
afb0: 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73  (pParse, pTabLis
afc0: 74 2c 20 70 45 4c 69 73 74 29 3b 0a 7d 0a 0a 2f  t, pEList);.}../
afd0: 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 61 6e 20  *.** Given a an 
afe0: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20  expression list 
aff0: 28 77 68 69 63 68 20 69 73 20 72 65 61 6c 6c 79  (which is really
b000: 20 74 68 65 20 6c 69 73 74 20 6f 66 20 65 78 70   the list of exp
b010: 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 74 68 61 74  ressions.** that
b020: 20 66 6f 72 6d 20 74 68 65 20 72 65 73 75 6c 74   form the result
b030: 20 73 65 74 20 6f 66 20 61 20 53 45 4c 45 43 54   set of a SELECT
b040: 20 73 74 61 74 65 6d 65 6e 74 29 20 63 6f 6d 70   statement) comp
b050: 75 74 65 20 61 70 70 72 6f 70 72 69 61 74 65 0a  ute appropriate.
b060: 2a 2a 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  ** column names 
b070: 66 6f 72 20 61 20 74 61 62 6c 65 20 74 68 61 74  for a table that
b080: 20 77 6f 75 6c 64 20 68 6f 6c 64 20 74 68 65 20   would hold the 
b090: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e  expression list.
b0a0: 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 63 6f 6c 75 6d  .**.** All colum
b0b0: 6e 20 6e 61 6d 65 73 20 77 69 6c 6c 20 62 65 20  n names will be 
b0c0: 75 6e 69 71 75 65 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  unique..**.** On
b0d0: 6c 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  ly the column na
b0e0: 6d 65 73 20 61 72 65 20 63 6f 6d 70 75 74 65 64  mes are computed
b0f0: 2e 20 20 43 6f 6c 75 6d 6e 2e 7a 54 79 70 65 2c  .  Column.zType,
b100: 20 43 6f 6c 75 6d 6e 2e 7a 43 6f 6c 6c 2c 0a 2a   Column.zColl,.*
b110: 2a 20 61 6e 64 20 6f 74 68 65 72 20 66 69 65 6c  * and other fiel
b120: 64 73 20 6f 66 20 43 6f 6c 75 6d 6e 20 61 72 65  ds of Column are
b130: 20 7a 65 72 6f 65 64 2e 0a 2a 2a 0a 2a 2a 20 52   zeroed..**.** R
b140: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
b150: 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66 20  on success.  If 
b160: 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  a memory allocat
b170: 69 6f 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73  ion error occurs
b180: 2c 0a 2a 2a 20 73 74 6f 72 65 20 4e 55 4c 4c 20  ,.** store NULL 
b190: 69 6e 20 2a 70 61 43 6f 6c 20 61 6e 64 20 30 20  in *paCol and 0 
b1a0: 69 6e 20 2a 70 6e 43 6f 6c 20 61 6e 64 20 72 65  in *pnCol and re
b1b0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
b1c0: 4d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  M..*/.static int
b1d0: 20 73 65 6c 65 63 74 43 6f 6c 75 6d 6e 73 46 72   selectColumnsFr
b1e0: 6f 6d 45 78 70 72 4c 69 73 74 28 0a 20 20 50 61  omExprList(.  Pa
b1f0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
b200: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
b210: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
b220: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20  prList *pEList, 
b230: 20 20 20 20 20 20 2f 2a 20 45 78 70 72 20 6c 69        /* Expr li
b240: 73 74 20 66 72 6f 6d 20 77 68 69 63 68 20 74 6f  st from which to
b250: 20 64 65 72 69 76 65 20 63 6f 6c 75 6d 6e 20 6e   derive column n
b260: 61 6d 65 73 20 2a 2f 0a 20 20 69 31 36 20 2a 70  ames */.  i16 *p
b270: 6e 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20  nCol,           
b280: 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e    /* Write the n
b290: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
b2a0: 20 68 65 72 65 20 2a 2f 0a 20 20 43 6f 6c 75 6d   here */.  Colum
b2b0: 6e 20 2a 2a 70 61 43 6f 6c 20 20 20 20 20 20 20  n **paCol       
b2c0: 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
b2d0: 6e 65 77 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20  new column list 
b2e0: 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  here */.){.  sql
b2f0: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
b300: 65 2d 3e 64 62 3b 20 20 20 2f 2a 20 44 61 74 61  e->db;   /* Data
b310: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
b320: 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20  */.  int i, j;  
b330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b340: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
b350: 73 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 3b 20  s */.  int cnt; 
b360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b370: 20 20 20 2f 2a 20 49 6e 64 65 78 20 61 64 64 65     /* Index adde
b380: 64 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 6e 61  d to make the na
b390: 6d 65 20 75 6e 69 71 75 65 20 2a 2f 0a 20 20 43  me unique */.  C
b3a0: 6f 6c 75 6d 6e 20 2a 61 43 6f 6c 2c 20 2a 70 43  olumn *aCol, *pC
b3b0: 6f 6c 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 6f  ol;        /* Fo
b3c0: 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 72  r looping over r
b3d0: 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f  esult columns */
b3e0: 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20  .  int nCol;    
b3f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
b400: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  * Number of colu
b410: 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c  mns in the resul
b420: 74 20 73 65 74 20 2a 2f 0a 20 20 45 78 70 72 20  t set */.  Expr 
b430: 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *p;             
b440: 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73         /* Expres
b450: 73 69 6f 6e 20 66 6f 72 20 61 20 73 69 6e 67 6c  sion for a singl
b460: 65 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 20  e result column 
b470: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65  */.  char *zName
b480: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
b490: 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65 20   /* Column name 
b4a0: 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 20  */.  int nName; 
b4b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b4c0: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6e 61 6d 65   /* Size of name
b4d0: 20 69 6e 20 7a 4e 61 6d 65 5b 5d 20 2a 2f 0a 0a   in zName[] */..
b4e0: 20 20 69 66 28 20 70 45 4c 69 73 74 20 29 7b 0a    if( pEList ){.
b4f0: 20 20 20 20 6e 43 6f 6c 20 3d 20 70 45 4c 69 73      nCol = pELis
b500: 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 61 43  t->nExpr;.    aC
b510: 6f 6c 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ol = sqlite3DbMa
b520: 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
b530: 65 6f 66 28 61 43 6f 6c 5b 30 5d 29 2a 6e 43 6f  eof(aCol[0])*nCo
b540: 6c 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  l);.    testcase
b550: 28 20 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 7d  ( aCol==0 );.  }
b560: 65 6c 73 65 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d  else{.    nCol =
b570: 20 30 3b 0a 20 20 20 20 61 43 6f 6c 20 3d 20 30   0;.    aCol = 0
b580: 3b 0a 20 20 7d 0a 20 20 2a 70 6e 43 6f 6c 20 3d  ;.  }.  *pnCol =
b590: 20 6e 43 6f 6c 3b 0a 20 20 2a 70 61 43 6f 6c 20   nCol;.  *paCol 
b5a0: 3d 20 61 43 6f 6c 3b 0a 0a 20 20 66 6f 72 28 69  = aCol;..  for(i
b5b0: 3d 30 2c 20 70 43 6f 6c 3d 61 43 6f 6c 3b 20 69  =0, pCol=aCol; i
b5c0: 3c 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c  <nCol; i++, pCol
b5d0: 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20 47 65 74 20  ++){.    /* Get 
b5e0: 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 6e  an appropriate n
b5f0: 61 6d 65 20 66 6f 72 20 74 68 65 20 63 6f 6c 75  ame for the colu
b600: 6d 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 20  mn.    */.    p 
b610: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69  = sqlite3ExprSki
b620: 70 43 6f 6c 6c 61 74 65 28 70 45 4c 69 73 74 2d  pCollate(pEList-
b630: 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[i].pExpr);.  
b640: 20 20 69 66 28 20 28 7a 4e 61 6d 65 20 3d 20 70    if( (zName = p
b650: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  EList->a[i].zNam
b660: 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  e)!=0 ){.      /
b670: 2a 20 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  * If the column 
b680: 63 6f 6e 74 61 69 6e 73 20 61 6e 20 22 41 53 20  contains an "AS 
b690: 3c 6e 61 6d 65 3e 22 20 70 68 72 61 73 65 2c 20  <name>" phrase, 
b6a0: 75 73 65 20 3c 6e 61 6d 65 3e 20 61 73 20 74 68  use <name> as th
b6b0: 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20  e name */.      
b6c0: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44  zName = sqlite3D
b6d0: 62 53 74 72 44 75 70 28 64 62 2c 20 7a 4e 61 6d  bStrDup(db, zNam
b6e0: 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  e);.    }else{. 
b6f0: 20 20 20 20 20 45 78 70 72 20 2a 70 43 6f 6c 45       Expr *pColE
b700: 78 70 72 20 3d 20 70 3b 20 20 2f 2a 20 54 68 65  xpr = p;  /* The
b710: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74   expression that
b720: 20 69 73 20 74 68 65 20 72 65 73 75 6c 74 20 63   is the result c
b730: 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  olumn name */.  
b740: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b      Table *pTab;
b750: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
b760: 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  e associated wit
b770: 68 20 74 68 69 73 20 65 78 70 72 65 73 73 69 6f  h this expressio
b780: 6e 20 2a 2f 0a 20 20 20 20 20 20 77 68 69 6c 65  n */.      while
b790: 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f 70 3d 3d  ( pColExpr->op==
b7a0: 54 4b 5f 44 4f 54 20 29 7b 0a 20 20 20 20 20 20  TK_DOT ){.      
b7b0: 20 20 70 43 6f 6c 45 78 70 72 20 3d 20 70 43 6f    pColExpr = pCo
b7c0: 6c 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20  lExpr->pRight;. 
b7d0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
b7e0: 43 6f 6c 45 78 70 72 21 3d 30 20 29 3b 0a 20 20  ColExpr!=0 );.  
b7f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
b800: 70 43 6f 6c 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  pColExpr->op==TK
b810: 5f 43 4f 4c 55 4d 4e 20 26 26 20 41 4c 57 41 59  _COLUMN && ALWAY
b820: 53 28 70 43 6f 6c 45 78 70 72 2d 3e 70 54 61 62  S(pColExpr->pTab
b830: 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  !=0) ){.        
b840: 2f 2a 20 46 6f 72 20 63 6f 6c 75 6d 6e 73 20 75  /* For columns u
b850: 73 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  se the column na
b860: 6d 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20  me name */.     
b870: 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 43     int iCol = pC
b880: 6f 6c 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b  olExpr->iColumn;
b890: 0a 20 20 20 20 20 20 20 20 70 54 61 62 20 3d 20  .        pTab = 
b8a0: 70 43 6f 6c 45 78 70 72 2d 3e 70 54 61 62 3b 0a  pColExpr->pTab;.
b8b0: 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c          if( iCol
b8c0: 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70 54 61 62  <0 ) iCol = pTab
b8d0: 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 20  ->iPKey;.       
b8e0: 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
b8f0: 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 22  MPrintf(db, "%s"
b900: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
b910: 20 20 20 69 43 6f 6c 3e 3d 30 20 3f 20 70 54 61     iCol>=0 ? pTa
b920: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e  b->aCol[iCol].zN
b930: 61 6d 65 20 3a 20 22 72 6f 77 69 64 22 29 3b 0a  ame : "rowid");.
b940: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
b950: 70 43 6f 6c 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  pColExpr->op==TK
b960: 5f 49 44 20 29 7b 0a 20 20 20 20 20 20 20 20 61  _ID ){.        a
b970: 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
b980: 72 6f 70 65 72 74 79 28 70 43 6f 6c 45 78 70 72  roperty(pColExpr
b990: 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29  , EP_IntValue) )
b9a0: 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  ;.        zName 
b9b0: 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
b9c0: 28 64 62 2c 20 22 25 73 22 2c 20 70 43 6f 6c 45  (db, "%s", pColE
b9d0: 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a  xpr->u.zToken);.
b9e0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
b9f0: 20 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65 20       /* Use the 
ba00: 6f 72 69 67 69 6e 61 6c 20 74 65 78 74 20 6f 66  original text of
ba10: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 65 78 70 72   the column expr
ba20: 65 73 73 69 6f 6e 20 61 73 20 69 74 73 20 6e 61  ession as its na
ba30: 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 7a 4e  me */.        zN
ba40: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  ame = sqlite3MPr
ba50: 69 6e 74 66 28 64 62 2c 20 22 25 73 22 2c 20 70  intf(db, "%s", p
ba60: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61  EList->a[i].zSpa
ba70: 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  n);.      }.    
ba80: 7d 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61  }.    if( db->ma
ba90: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
baa0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
bab0: 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  e(db, zName);.  
bac0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
bad0: 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75  ..    /* Make su
bae0: 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  re the column na
baf0: 6d 65 20 69 73 20 75 6e 69 71 75 65 2e 20 20 49  me is unique.  I
bb00: 66 20 74 68 65 20 6e 61 6d 65 20 69 73 20 6e 6f  f the name is no
bb10: 74 20 75 6e 69 71 75 65 2c 0a 20 20 20 20 2a 2a  t unique,.    **
bb20: 20 61 70 70 65 6e 64 20 61 20 69 6e 74 65 67 65   append a intege
bb30: 72 20 74 6f 20 74 68 65 20 6e 61 6d 65 20 73 6f  r to the name so
bb40: 20 74 68 61 74 20 69 74 20 62 65 63 6f 6d 65 73   that it becomes
bb50: 20 75 6e 69 71 75 65 2e 0a 20 20 20 20 2a 2f 0a   unique..    */.
bb60: 20 20 20 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69      nName = sqli
bb70: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d  te3Strlen30(zNam
bb80: 65 29 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 63 6e  e);.    for(j=cn
bb90: 74 3d 30 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a  t=0; j<i; j++){.
bba0: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
bbb0: 33 53 74 72 49 43 6d 70 28 61 43 6f 6c 5b 6a 5d  3StrICmp(aCol[j]
bbc0: 2e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d  .zName, zName)==
bbd0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  0 ){.        cha
bbe0: 72 20 2a 7a 4e 65 77 4e 61 6d 65 3b 0a 20 20 20  r *zNewName;.   
bbf0: 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20       int k;.    
bc00: 20 20 20 20 66 6f 72 28 6b 3d 6e 4e 61 6d 65 2d      for(k=nName-
bc10: 31 3b 20 6b 3e 31 20 26 26 20 73 71 6c 69 74 65  1; k>1 && sqlite
bc20: 33 49 73 64 69 67 69 74 28 7a 4e 61 6d 65 5b 6b  3Isdigit(zName[k
bc30: 5d 29 3b 20 6b 2d 2d 29 7b 7d 0a 20 20 20 20 20  ]); k--){}.     
bc40: 20 20 20 69 66 28 20 7a 4e 61 6d 65 5b 6b 5d 3d     if( zName[k]=
bc50: 3d 27 3a 27 20 29 20 6e 4e 61 6d 65 20 3d 20 6b  =':' ) nName = k
bc60: 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 5b  ;.        zName[
bc70: 6e 4e 61 6d 65 5d 20 3d 20 30 3b 0a 20 20 20 20  nName] = 0;.    
bc80: 20 20 20 20 7a 4e 65 77 4e 61 6d 65 20 3d 20 73      zNewName = s
bc90: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
bca0: 2c 20 22 25 73 3a 25 64 22 2c 20 7a 4e 61 6d 65  , "%s:%d", zName
bcb0: 2c 20 2b 2b 63 6e 74 29 3b 0a 20 20 20 20 20 20  , ++cnt);.      
bcc0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
bcd0: 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  db, zName);.    
bce0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 7a 4e 65 77      zName = zNew
bcf0: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 6a 20  Name;.        j 
bd00: 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 69 66  = -1;.        if
bd10: 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 62 72 65  ( zName==0 ) bre
bd20: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
bd30: 7d 0a 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d  }.    pCol->zNam
bd40: 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 7d 0a 20  e = zName;.  }. 
bd50: 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
bd60: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 66 6f 72  ailed ){.    for
bd70: 28 6a 3d 30 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 7b  (j=0; j<i; j++){
bd80: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
bd90: 46 72 65 65 28 64 62 2c 20 61 43 6f 6c 5b 6a 5d  Free(db, aCol[j]
bda0: 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20  .zName);.    }. 
bdb0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
bdc0: 28 64 62 2c 20 61 43 6f 6c 29 3b 0a 20 20 20 20  (db, aCol);.    
bdd0: 2a 70 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  *paCol = 0;.    
bde0: 2a 70 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  *pnCol = 0;.    
bdf0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
be00: 4d 45 4d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  MEM;.  }.  retur
be10: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
be20: 2f 2a 0a 2a 2a 20 41 64 64 20 74 79 70 65 20 61  /*.** Add type a
be30: 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 69 6e 66  nd collation inf
be40: 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 61 20 63 6f  ormation to a co
be50: 6c 75 6d 6e 20 6c 69 73 74 20 62 61 73 65 64 20  lumn list based 
be60: 6f 6e 0a 2a 2a 20 61 20 53 45 4c 45 43 54 20 73  on.** a SELECT s
be70: 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 0a 2a 2a  tatement..** .**
be80: 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74   The column list
be90: 20 70 72 65 73 75 6d 61 62 6c 79 20 63 61 6d 65   presumably came
bea0: 20 66 72 6f 6d 20 73 65 6c 65 63 74 43 6f 6c 75   from selectColu
beb0: 6d 6e 4e 61 6d 65 73 46 72 6f 6d 45 78 70 72 4c  mnNamesFromExprL
bec0: 69 73 74 28 29 2e 0a 2a 2a 20 54 68 65 20 63 6f  ist()..** The co
bed0: 6c 75 6d 6e 20 6c 69 73 74 20 68 61 73 20 6f 6e  lumn list has on
bee0: 6c 79 20 6e 61 6d 65 73 2c 20 6e 6f 74 20 74 79  ly names, not ty
bef0: 70 65 73 20 6f 72 20 63 6f 6c 6c 61 74 69 6f 6e  pes or collation
bf00: 73 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74  s.  This.** rout
bf10: 69 6e 65 20 67 6f 65 73 20 74 68 72 6f 75 67 68  ine goes through
bf20: 20 61 6e 64 20 61 64 64 73 20 74 68 65 20 74 79   and adds the ty
bf30: 70 65 73 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f  pes and collatio
bf40: 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ns..**.** This r
bf50: 6f 75 74 69 6e 65 20 72 65 71 75 69 72 65 73 20  outine requires 
bf60: 74 68 61 74 20 61 6c 6c 20 69 64 65 6e 74 69 66  that all identif
bf70: 69 65 72 73 20 69 6e 20 74 68 65 20 53 45 4c 45  iers in the SELE
bf80: 43 54 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20  CT.** statement 
bf90: 62 65 20 72 65 73 6f 6c 76 65 64 2e 0a 2a 2f 0a  be resolved..*/.
bfa0: 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 6c 65  static void sele
bfb0: 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41  ctAddColumnTypeA
bfc0: 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20 50  ndCollation(.  P
bfd0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
bfe0: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
bff0: 63 6f 6e 74 65 78 74 73 20 2a 2f 0a 20 20 69 6e  contexts */.  in
c000: 74 20 6e 43 6f 6c 2c 20 20 20 20 20 20 20 20 20  t nCol,         
c010: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
c020: 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 43 6f   columns */.  Co
c030: 6c 75 6d 6e 20 2a 61 43 6f 6c 2c 20 20 20 20 20  lumn *aCol,     
c040: 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 63      /* List of c
c050: 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 53 65 6c 65  olumns */.  Sele
c060: 63 74 20 2a 70 53 65 6c 65 63 74 20 20 20 20 20  ct *pSelect     
c070: 20 20 2f 2a 20 53 45 4c 45 43 54 20 75 73 65 64    /* SELECT used
c080: 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 79   to determine ty
c090: 70 65 73 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f  pes and collatio
c0a0: 6e 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  ns */.){.  sqlit
c0b0: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
c0c0: 3e 64 62 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65  >db;.  NameConte
c0d0: 78 74 20 73 4e 43 3b 0a 20 20 43 6f 6c 75 6d 6e  xt sNC;.  Column
c0e0: 20 2a 70 43 6f 6c 3b 0a 20 20 43 6f 6c 6c 53 65   *pCol;.  CollSe
c0f0: 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 69 6e 74 20  q *pColl;.  int 
c100: 69 3b 0a 20 20 45 78 70 72 20 2a 70 3b 0a 20 20  i;.  Expr *p;.  
c110: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
c120: 69 74 65 6d 20 2a 61 3b 0a 0a 20 20 61 73 73 65  item *a;..  asse
c130: 72 74 28 20 70 53 65 6c 65 63 74 21 3d 30 20 29  rt( pSelect!=0 )
c140: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 53 65  ;.  assert( (pSe
c150: 6c 65 63 74 2d 3e 73 65 6c 46 6c 61 67 73 20 26  lect->selFlags &
c160: 20 53 46 5f 52 65 73 6f 6c 76 65 64 29 21 3d 30   SF_Resolved)!=0
c170: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 43   );.  assert( nC
c180: 6f 6c 3d 3d 70 53 65 6c 65 63 74 2d 3e 70 45 4c  ol==pSelect->pEL
c190: 69 73 74 2d 3e 6e 45 78 70 72 20 7c 7c 20 64 62  ist->nExpr || db
c1a0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
c1b0: 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
c1c0: 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72  ocFailed ) retur
c1d0: 6e 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 4e 43  n;.  memset(&sNC
c1e0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29  , 0, sizeof(sNC)
c1f0: 29 3b 0a 20 20 73 4e 43 2e 70 53 72 63 4c 69 73  );.  sNC.pSrcLis
c200: 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 53 72  t = pSelect->pSr
c210: 63 3b 0a 20 20 61 20 3d 20 70 53 65 6c 65 63 74  c;.  a = pSelect
c220: 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 66  ->pEList->a;.  f
c230: 6f 72 28 69 3d 30 2c 20 70 43 6f 6c 3d 61 43 6f  or(i=0, pCol=aCo
c240: 6c 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 2c 20  l; i<nCol; i++, 
c250: 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 70 20 3d  pCol++){.    p =
c260: 20 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20   a[i].pExpr;.   
c270: 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 20 3d 20 73   pCol->zType = s
c280: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
c290: 62 2c 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73  b, columnType(&s
c2a0: 4e 43 2c 20 70 2c 20 30 2c 20 30 2c 20 30 29 29  NC, p, 0, 0, 0))
c2b0: 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 61 66 66 69  ;.    pCol->affi
c2c0: 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33 45 78  nity = sqlite3Ex
c2d0: 70 72 41 66 66 69 6e 69 74 79 28 70 29 3b 0a 20  prAffinity(p);. 
c2e0: 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 61 66 66     if( pCol->aff
c2f0: 69 6e 69 74 79 3d 3d 30 20 29 20 70 43 6f 6c 2d  inity==0 ) pCol-
c300: 3e 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c 49  >affinity = SQLI
c310: 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20  TE_AFF_NONE;.   
c320: 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
c330: 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
c340: 73 65 2c 20 70 29 3b 0a 20 20 20 20 69 66 28 20  se, p);.    if( 
c350: 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 70  pColl ){.      p
c360: 43 6f 6c 2d 3e 7a 43 6f 6c 6c 20 3d 20 73 71 6c  Col->zColl = sql
c370: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
c380: 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a   pColl->zName);.
c390: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
c3a0: 2a 2a 20 47 69 76 65 6e 20 61 20 53 45 4c 45 43  ** Given a SELEC
c3b0: 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 67 65 6e  T statement, gen
c3c0: 65 72 61 74 65 20 61 20 54 61 62 6c 65 20 73 74  erate a Table st
c3d0: 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65 73  ructure that des
c3e0: 63 72 69 62 65 73 0a 2a 2a 20 74 68 65 20 72 65  cribes.** the re
c3f0: 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 61 74  sult set of that
c400: 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 54 61 62 6c   SELECT..*/.Tabl
c410: 65 20 2a 73 71 6c 69 74 65 33 52 65 73 75 6c 74  e *sqlite3Result
c420: 53 65 74 4f 66 53 65 6c 65 63 74 28 50 61 72 73  SetOfSelect(Pars
c430: 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63  e *pParse, Selec
c440: 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 54  t *pSelect){.  T
c450: 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 73 71  able *pTab;.  sq
c460: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
c470: 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 73 61  se->db;.  int sa
c480: 76 65 64 46 6c 61 67 73 3b 0a 0a 20 20 73 61 76  vedFlags;..  sav
c490: 65 64 46 6c 61 67 73 20 3d 20 64 62 2d 3e 66 6c  edFlags = db->fl
c4a0: 61 67 73 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73  ags;.  db->flags
c4b0: 20 26 3d 20 7e 53 51 4c 49 54 45 5f 46 75 6c 6c   &= ~SQLITE_Full
c4c0: 43 6f 6c 4e 61 6d 65 73 3b 0a 20 20 64 62 2d 3e  ColNames;.  db->
c4d0: 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
c4e0: 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 3b 0a 20  ShortColNames;. 
c4f0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 50 72   sqlite3SelectPr
c500: 65 70 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65  ep(pParse, pSele
c510: 63 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 50  ct, 0);.  if( pP
c520: 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 72 65 74  arse->nErr ) ret
c530: 75 72 6e 20 30 3b 0a 20 20 77 68 69 6c 65 28 20  urn 0;.  while( 
c540: 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 20  pSelect->pPrior 
c550: 29 20 70 53 65 6c 65 63 74 20 3d 20 70 53 65 6c  ) pSelect = pSel
c560: 65 63 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 64  ect->pPrior;.  d
c570: 62 2d 3e 66 6c 61 67 73 20 3d 20 73 61 76 65 64  b->flags = saved
c580: 46 6c 61 67 73 3b 0a 20 20 70 54 61 62 20 3d 20  Flags;.  pTab = 
c590: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
c5a0: 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 54  ero(db, sizeof(T
c5b0: 61 62 6c 65 29 20 29 3b 0a 20 20 69 66 28 20 70  able) );.  if( p
c5c0: 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  Tab==0 ){.    re
c5d0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 2f 2a  turn 0;.  }.  /*
c5e0: 20 54 68 65 20 73 71 6c 69 74 65 33 52 65 73 75   The sqlite3Resu
c5f0: 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 29 20  ltSetOfSelect() 
c600: 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 6e 20 63  is only used n c
c610: 6f 6e 74 65 78 74 73 20 77 68 65 72 65 20 6c 6f  ontexts where lo
c620: 6f 6b 61 73 69 64 65 0a 20 20 2a 2a 20 69 73 20  okaside.  ** is 
c630: 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 61 73  disabled */.  as
c640: 73 65 72 74 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73  sert( db->lookas
c650: 69 64 65 2e 62 45 6e 61 62 6c 65 64 3d 3d 30 20  ide.bEnabled==0 
c660: 29 3b 0a 20 20 70 54 61 62 2d 3e 6e 52 65 66 20  );.  pTab->nRef 
c670: 3d 20 31 3b 0a 20 20 70 54 61 62 2d 3e 7a 4e 61  = 1;.  pTab->zNa
c680: 6d 65 20 3d 20 30 3b 0a 20 20 70 54 61 62 2d 3e  me = 0;.  pTab->
c690: 6e 52 6f 77 45 73 74 20 3d 20 31 30 30 30 30 30  nRowEst = 100000
c6a0: 30 3b 0a 20 20 73 65 6c 65 63 74 43 6f 6c 75 6d  0;.  selectColum
c6b0: 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70  nsFromExprList(p
c6c0: 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2d 3e  Parse, pSelect->
c6d0: 70 45 4c 69 73 74 2c 20 26 70 54 61 62 2d 3e 6e  pEList, &pTab->n
c6e0: 43 6f 6c 2c 20 26 70 54 61 62 2d 3e 61 43 6f 6c  Col, &pTab->aCol
c6f0: 29 3b 0a 20 20 73 65 6c 65 63 74 41 64 64 43 6f  );.  selectAddCo
c700: 6c 75 6d 6e 54 79 70 65 41 6e 64 43 6f 6c 6c 61  lumnTypeAndColla
c710: 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 70 54 61  tion(pParse, pTa
c720: 62 2d 3e 6e 43 6f 6c 2c 20 70 54 61 62 2d 3e 61  b->nCol, pTab->a
c730: 43 6f 6c 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20  Col, pSelect);. 
c740: 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d   pTab->iPKey = -
c750: 31 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  1;.  if( db->mal
c760: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
c770: 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61   sqlite3DeleteTa
c780: 62 6c 65 28 64 62 2c 20 70 54 61 62 29 3b 0a 20  ble(db, pTab);. 
c790: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
c7a0: 0a 20 20 72 65 74 75 72 6e 20 70 54 61 62 3b 0a  .  return pTab;.
c7b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 56  }../*.** Get a V
c7c0: 44 42 45 20 66 6f 72 20 74 68 65 20 67 69 76 65  DBE for the give
c7d0: 6e 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74  n parser context
c7e0: 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  .  Create a new 
c7f0: 6f 6e 65 20 69 66 20 6e 65 63 65 73 73 61 72 79  one if necessary
c800: 2e 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  ..** If an error
c810: 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20   occurs, return 
c820: 4e 55 4c 4c 20 61 6e 64 20 6c 65 61 76 65 20 61  NULL and leave a
c830: 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72   message in pPar
c840: 73 65 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73 71 6c  se..*/.Vdbe *sql
c850: 69 74 65 33 47 65 74 56 64 62 65 28 50 61 72 73  ite3GetVdbe(Pars
c860: 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 56 64  e *pParse){.  Vd
c870: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
c880: 70 56 64 62 65 3b 0a 20 20 69 66 28 20 76 3d 3d  pVdbe;.  if( v==
c890: 30 20 29 7b 0a 20 20 20 20 76 20 3d 20 70 50 61  0 ){.    v = pPa
c8a0: 72 73 65 2d 3e 70 56 64 62 65 20 3d 20 73 71 6c  rse->pVdbe = sql
c8b0: 69 74 65 33 56 64 62 65 43 72 65 61 74 65 28 70  ite3VdbeCreate(p
c8c0: 50 61 72 73 65 2d 3e 64 62 29 3b 0a 23 69 66 6e  Parse->db);.#ifn
c8d0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
c8e0: 54 52 41 43 45 0a 20 20 20 20 69 66 28 20 76 20  TRACE.    if( v 
c8f0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
c900: 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50  VdbeAddOp0(v, OP
c910: 5f 54 72 61 63 65 29 3b 0a 20 20 20 20 7d 0a 23  _Trace);.    }.#
c920: 65 6e 64 69 66 0a 20 20 7d 0a 20 20 72 65 74 75  endif.  }.  retu
c930: 72 6e 20 76 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  rn v;.}.../*.** 
c940: 43 6f 6d 70 75 74 65 20 74 68 65 20 69 4c 69 6d  Compute the iLim
c950: 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20 66  it and iOffset f
c960: 69 65 6c 64 73 20 6f 66 20 74 68 65 20 53 45 4c  ields of the SEL
c970: 45 43 54 20 62 61 73 65 64 20 6f 6e 20 74 68 65  ECT based on the
c980: 0a 2a 2a 20 70 4c 69 6d 69 74 20 61 6e 64 20 70  .** pLimit and p
c990: 4f 66 66 73 65 74 20 65 78 70 72 65 73 73 69 6f  Offset expressio
c9a0: 6e 73 2e 20 20 70 4c 69 6d 69 74 20 61 6e 64 20  ns.  pLimit and 
c9b0: 70 4f 66 66 73 65 74 20 68 6f 6c 64 20 74 68 65  pOffset hold the
c9c0: 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20   expressions.** 
c9d0: 74 68 61 74 20 61 70 70 65 61 72 20 69 6e 20 74  that appear in t
c9e0: 68 65 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20  he original SQL 
c9f0: 73 74 61 74 65 6d 65 6e 74 20 61 66 74 65 72 20  statement after 
ca00: 74 68 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46  the LIMIT and OF
ca10: 46 53 45 54 0a 2a 2a 20 6b 65 79 77 6f 72 64 73  FSET.** keywords
ca20: 2e 20 20 4f 72 20 4e 55 4c 4c 20 69 66 20 74 68  .  Or NULL if th
ca30: 6f 73 65 20 6b 65 79 77 6f 72 64 73 20 61 72 65  ose keywords are
ca40: 20 6f 6d 69 74 74 65 64 2e 20 69 4c 69 6d 69 74   omitted. iLimit
ca50: 20 61 6e 64 20 69 4f 66 66 73 65 74 20 0a 2a 2a   and iOffset .**
ca60: 20 61 72 65 20 74 68 65 20 69 6e 74 65 67 65 72   are the integer
ca70: 20 6d 65 6d 6f 72 79 20 72 65 67 69 73 74 65 72   memory register
ca80: 20 6e 75 6d 62 65 72 73 20 66 6f 72 20 63 6f 75   numbers for cou
ca90: 6e 74 65 72 73 20 75 73 65 64 20 74 6f 20 63 6f  nters used to co
caa0: 6d 70 75 74 65 20 0a 2a 2a 20 74 68 65 20 6c 69  mpute .** the li
cab0: 6d 69 74 20 61 6e 64 20 6f 66 66 73 65 74 2e 20  mit and offset. 
cac0: 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   If there is no 
cad0: 6c 69 6d 69 74 20 61 6e 64 2f 6f 72 20 6f 66 66  limit and/or off
cae0: 73 65 74 2c 20 74 68 65 6e 20 0a 2a 2a 20 69 4c  set, then .** iL
caf0: 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74  imit and iOffset
cb00: 20 61 72 65 20 6e 65 67 61 74 69 76 65 2e 0a 2a   are negative..*
cb10: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
cb20: 65 20 63 68 61 6e 67 65 73 20 74 68 65 20 76 61  e changes the va
cb30: 6c 75 65 73 20 6f 66 20 69 4c 69 6d 69 74 20 61  lues of iLimit a
cb40: 6e 64 20 69 4f 66 66 73 65 74 20 6f 6e 6c 79 20  nd iOffset only 
cb50: 69 66 0a 2a 2a 20 61 20 6c 69 6d 69 74 20 6f 72  if.** a limit or
cb60: 20 6f 66 66 73 65 74 20 69 73 20 64 65 66 69 6e   offset is defin
cb70: 65 64 20 62 79 20 70 4c 69 6d 69 74 20 61 6e 64  ed by pLimit and
cb80: 20 70 4f 66 66 73 65 74 2e 20 20 69 4c 69 6d 69   pOffset.  iLimi
cb90: 74 20 61 6e 64 0a 2a 2a 20 69 4f 66 66 73 65 74  t and.** iOffset
cba0: 20 73 68 6f 75 6c 64 20 68 61 76 65 20 62 65 65   should have bee
cbb0: 6e 20 70 72 65 73 65 74 20 74 6f 20 61 70 70 72  n preset to appr
cbc0: 6f 70 72 69 61 74 65 20 64 65 66 61 75 6c 74 20  opriate default 
cbd0: 76 61 6c 75 65 73 0a 2a 2a 20 28 75 73 75 61 6c  values.** (usual
cbe0: 6c 79 20 62 75 74 20 6e 6f 74 20 61 6c 77 61 79  ly but not alway
cbf0: 73 20 2d 31 29 20 70 72 69 6f 72 20 74 6f 20 63  s -1) prior to c
cc00: 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74  alling this rout
cc10: 69 6e 65 2e 0a 2a 2a 20 4f 6e 6c 79 20 69 66 20  ine..** Only if 
cc20: 70 4c 69 6d 69 74 21 3d 30 20 6f 72 20 70 4f 66  pLimit!=0 or pOf
cc30: 66 73 65 74 21 3d 30 20 64 6f 20 74 68 65 20 6c  fset!=0 do the l
cc40: 69 6d 69 74 20 72 65 67 69 73 74 65 72 73 20 67  imit registers g
cc50: 65 74 0a 2a 2a 20 72 65 64 65 66 69 6e 65 64 2e  et.** redefined.
cc60: 20 20 54 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20    The UNION ALL 
cc70: 6f 70 65 72 61 74 6f 72 20 75 73 65 73 20 74 68  operator uses th
cc80: 69 73 20 70 72 6f 70 65 72 74 79 20 74 6f 20 66  is property to f
cc90: 6f 72 63 65 0a 2a 2a 20 74 68 65 20 72 65 75 73  orce.** the reus
cca0: 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6c 69  e of the same li
ccb0: 6d 69 74 20 61 6e 64 20 6f 66 66 73 65 74 20 72  mit and offset r
ccc0: 65 67 69 73 74 65 72 73 20 61 63 72 6f 73 73 20  egisters across 
ccd0: 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 53 45 4c 45  multiple.** SELE
cce0: 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a  CT statements..*
ccf0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f  /.static void co
cd00: 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74  mputeLimitRegist
cd10: 65 72 73 28 50 61 72 73 65 20 2a 70 50 61 72 73  ers(Parse *pPars
cd20: 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e  e, Select *p, in
cd30: 74 20 69 42 72 65 61 6b 29 7b 0a 20 20 56 64 62  t iBreak){.  Vdb
cd40: 65 20 2a 76 20 3d 20 30 3b 0a 20 20 69 6e 74 20  e *v = 0;.  int 
cd50: 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 69 6e  iLimit = 0;.  in
cd60: 74 20 69 4f 66 66 73 65 74 3b 0a 20 20 69 6e 74  t iOffset;.  int
cd70: 20 61 64 64 72 31 2c 20 6e 3b 0a 20 20 69 66 28   addr1, n;.  if(
cd80: 20 70 2d 3e 69 4c 69 6d 69 74 20 29 20 72 65 74   p->iLimit ) ret
cd90: 75 72 6e 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a  urn;..  /* .  **
cda0: 20 22 4c 49 4d 49 54 20 2d 31 22 20 61 6c 77 61   "LIMIT -1" alwa
cdb0: 79 73 20 73 68 6f 77 73 20 61 6c 6c 20 72 6f 77  ys shows all row
cdc0: 73 2e 20 20 54 68 65 72 65 20 69 73 20 73 6f 6d  s.  There is som
cdd0: 65 0a 20 20 2a 2a 20 63 6f 6e 74 72 6f 76 65 72  e.  ** controver
cde0: 73 79 20 61 62 6f 75 74 20 77 68 61 74 20 74 68  sy about what th
cdf0: 65 20 63 6f 72 72 65 63 74 20 62 65 68 61 76 69  e correct behavi
ce00: 6f 72 20 73 68 6f 75 6c 64 20 62 65 2e 0a 20 20  or should be..  
ce10: 2a 2a 20 54 68 65 20 63 75 72 72 65 6e 74 20 69  ** The current i
ce20: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 6e  mplementation in
ce30: 74 65 72 70 72 65 74 73 20 22 4c 49 4d 49 54 20  terprets "LIMIT 
ce40: 30 22 20 74 6f 20 6d 65 61 6e 0a 20 20 2a 2a 20  0" to mean.  ** 
ce50: 6e 6f 20 72 6f 77 73 2e 0a 20 20 2a 2f 0a 20 20  no rows..  */.  
ce60: 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
ce70: 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20  Clear(pParse);. 
ce80: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 66 66   assert( p->pOff
ce90: 73 65 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70 4c 69  set==0 || p->pLi
cea0: 6d 69 74 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  mit!=0 );.  if( 
ceb0: 70 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20  p->pLimit ){.   
cec0: 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 69 4c 69   p->iLimit = iLi
ced0: 6d 69 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  mit = ++pParse->
cee0: 6e 4d 65 6d 3b 0a 20 20 20 20 76 20 3d 20 73 71  nMem;.    v = sq
cef0: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
cf00: 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20 4e 45  rse);.    if( NE
cf10: 56 45 52 28 76 3d 3d 30 29 20 29 20 72 65 74 75  VER(v==0) ) retu
cf20: 72 6e 3b 20 20 2f 2a 20 56 44 42 45 20 73 68 6f  rn;  /* VDBE sho
cf30: 75 6c 64 20 68 61 76 65 20 61 6c 72 65 61 64 79  uld have already
cf40: 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20   been allocated 
cf50: 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  */.    if( sqlit
cf60: 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28  e3ExprIsInteger(
cf70: 70 2d 3e 70 4c 69 6d 69 74 2c 20 26 6e 29 20 29  p->pLimit, &n) )
cf80: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
cf90: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
cfa0: 49 6e 74 65 67 65 72 2c 20 6e 2c 20 69 4c 69 6d  Integer, n, iLim
cfb0: 69 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  it);.      VdbeC
cfc0: 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c 49 4d 49  omment((v, "LIMI
cfd0: 54 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20  T counter"));.  
cfe0: 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a      if( n==0 ){.
cff0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
d000: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
d010: 47 6f 74 6f 2c 20 30 2c 20 69 42 72 65 61 6b 29  Goto, 0, iBreak)
d020: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
d030: 28 20 6e 3e 3d 30 20 26 26 20 70 2d 3e 6e 53 65  ( n>=0 && p->nSe
d040: 6c 65 63 74 52 6f 77 3e 28 75 36 34 29 6e 20 29  lectRow>(u64)n )
d050: 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 53 65  {.        p->nSe
d060: 6c 65 63 74 52 6f 77 20 3d 20 6e 3b 0a 20 20 20  lectRow = n;.   
d070: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
d080: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
d090: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 2d  rCode(pParse, p-
d0a0: 3e 70 4c 69 6d 69 74 2c 20 69 4c 69 6d 69 74 29  >pLimit, iLimit)
d0b0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
d0c0: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
d0d0: 4d 75 73 74 42 65 49 6e 74 2c 20 69 4c 69 6d 69  MustBeInt, iLimi
d0e0: 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  t);.      VdbeCo
d0f0: 6d 6d 65 6e 74 28 28 76 2c 20 22 4c 49 4d 49 54  mment((v, "LIMIT
d100: 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20 20   counter"));.   
d110: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
d120: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 5a 65 72  dOp2(v, OP_IfZer
d130: 6f 2c 20 69 4c 69 6d 69 74 2c 20 69 42 72 65 61  o, iLimit, iBrea
d140: 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  k);.    }.    if
d150: 28 20 70 2d 3e 70 4f 66 66 73 65 74 20 29 7b 0a  ( p->pOffset ){.
d160: 20 20 20 20 20 20 70 2d 3e 69 4f 66 66 73 65 74        p->iOffset
d170: 20 3d 20 69 4f 66 66 73 65 74 20 3d 20 2b 2b 70   = iOffset = ++p
d180: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
d190: 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b     pParse->nMem+
d1a0: 2b 3b 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  +;   /* Allocate
d1b0: 20 61 6e 20 65 78 74 72 61 20 72 65 67 69 73 74   an extra regist
d1c0: 65 72 20 66 6f 72 20 6c 69 6d 69 74 2b 6f 66 66  er for limit+off
d1d0: 73 65 74 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  set */.      sql
d1e0: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
d1f0: 72 73 65 2c 20 70 2d 3e 70 4f 66 66 73 65 74 2c  rse, p->pOffset,
d200: 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20   iOffset);.     
d210: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
d220: 70 31 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49  p1(v, OP_MustBeI
d230: 6e 74 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20 20  nt, iOffset);.  
d240: 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
d250: 28 76 2c 20 22 4f 46 46 53 45 54 20 63 6f 75 6e  (v, "OFFSET coun
d260: 74 65 72 22 29 29 3b 0a 20 20 20 20 20 20 61 64  ter"));.      ad
d270: 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62  dr1 = sqlite3Vdb
d280: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66  eAddOp1(v, OP_If
d290: 50 6f 73 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20  Pos, iOffset);. 
d2a0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
d2b0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
d2c0: 65 67 65 72 2c 20 30 2c 20 69 4f 66 66 73 65 74  eger, 0, iOffset
d2d0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
d2e0: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
d2f0: 61 64 64 72 31 29 3b 0a 20 20 20 20 20 20 73 71  addr1);.      sq
d300: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
d310: 76 2c 20 4f 50 5f 41 64 64 2c 20 69 4c 69 6d 69  v, OP_Add, iLimi
d320: 74 2c 20 69 4f 66 66 73 65 74 2c 20 69 4f 66 66  t, iOffset, iOff
d330: 73 65 74 2b 31 29 3b 0a 20 20 20 20 20 20 56 64  set+1);.      Vd
d340: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c  beComment((v, "L
d350: 49 4d 49 54 2b 4f 46 46 53 45 54 22 29 29 3b 0a  IMIT+OFFSET"));.
d360: 20 20 20 20 20 20 61 64 64 72 31 20 3d 20 73 71        addr1 = sq
d370: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
d380: 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69 4c 69  v, OP_IfPos, iLi
d390: 6d 69 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  mit);.      sqli
d3a0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
d3b0: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 2d 31 2c   OP_Integer, -1,
d3c0: 20 69 4f 66 66 73 65 74 2b 31 29 3b 0a 20 20 20   iOffset+1);.   
d3d0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
d3e0: 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29  mpHere(v, addr1)
d3f0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23  ;.    }.  }.}..#
d400: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
d410: 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  IT_COMPOUND_SELE
d420: 43 54 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  CT./*.** Return 
d430: 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
d440: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
d450: 63 65 20 66 6f 72 20 74 68 65 20 69 43 6f 6c 2d  ce for the iCol-
d460: 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a 20  th column of.** 
d470: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 66  the result set f
d480: 6f 72 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 2d  or the compound-
d490: 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74  select statement
d4a0: 20 22 70 22 2e 20 20 52 65 74 75 72 6e 20 4e 55   "p".  Return NU
d4b0: 4c 4c 20 69 66 0a 2a 2a 20 74 68 65 20 63 6f 6c  LL if.** the col
d4c0: 75 6d 6e 20 68 61 73 20 6e 6f 20 64 65 66 61 75  umn has no defau
d4d0: 6c 74 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  lt collating seq
d4e0: 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  uence..**.** The
d4f0: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
d500: 6e 63 65 20 66 6f 72 20 74 68 65 20 63 6f 6d 70  nce for the comp
d510: 6f 75 6e 64 20 73 65 6c 65 63 74 20 69 73 20 74  ound select is t
d520: 61 6b 65 6e 20 66 72 6f 6d 20 74 68 65 0a 2a 2a  aken from the.**
d530: 20 6c 65 66 74 2d 6d 6f 73 74 20 74 65 72 6d 20   left-most term 
d540: 6f 66 20 74 68 65 20 73 65 6c 65 63 74 20 74 68  of the select th
d550: 61 74 20 68 61 73 20 61 20 63 6f 6c 6c 61 74 69  at has a collati
d560: 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2f 0a  ng sequence..*/.
d570: 73 74 61 74 69 63 20 43 6f 6c 6c 53 65 71 20 2a  static CollSeq *
d580: 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53  multiSelectCollS
d590: 65 71 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  eq(Parse *pParse
d5a0: 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74  , Select *p, int
d5b0: 20 69 43 6f 6c 29 7b 0a 20 20 43 6f 6c 6c 53 65   iCol){.  CollSe
d5c0: 71 20 2a 70 52 65 74 3b 0a 20 20 69 66 28 20 70  q *pRet;.  if( p
d5d0: 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20  ->pPrior ){.    
d5e0: 70 52 65 74 20 3d 20 6d 75 6c 74 69 53 65 6c 65  pRet = multiSele
d5f0: 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  ctCollSeq(pParse
d600: 2c 20 70 2d 3e 70 50 72 69 6f 72 2c 20 69 43 6f  , p->pPrior, iCo
d610: 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  l);.  }else{.   
d620: 20 70 52 65 74 20 3d 20 30 3b 0a 20 20 7d 0a 20   pRet = 0;.  }. 
d630: 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3e 3d 30   assert( iCol>=0
d640: 20 29 3b 0a 20 20 69 66 28 20 70 52 65 74 3d 3d   );.  if( pRet==
d650: 30 20 26 26 20 69 43 6f 6c 3c 70 2d 3e 70 45 4c  0 && iCol<p->pEL
d660: 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  ist->nExpr ){.  
d670: 20 20 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33    pRet = sqlite3
d680: 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
d690: 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61  se, p->pEList->a
d6a0: 5b 69 43 6f 6c 5d 2e 70 45 78 70 72 29 3b 0a 20  [iCol].pExpr);. 
d6b0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74   }.  return pRet
d6c0: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
d6d0: 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
d6e0: 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 2f 2a  ND_SELECT */../*
d6f0: 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   Forward referen
d700: 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ce */.static int
d710: 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65   multiSelectOrde
d720: 72 42 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50  rBy(.  Parse *pP
d730: 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  arse,        /* 
d740: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
d750: 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
d760: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
d770: 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20  e right-most of 
d780: 53 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f  SELECTs to be co
d790: 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  ded */.  SelectD
d7a0: 65 73 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f  est *pDest     /
d7b0: 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74  * What to do wit
d7c0: 68 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20  h query results 
d7d0: 2a 2f 0a 29 3b 0a 0a 0a 23 69 66 6e 64 65 66 20  */.);...#ifndef 
d7e0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50  SQLITE_OMIT_COMP
d7f0: 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a  OUND_SELECT./*.*
d800: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
d810: 73 20 63 61 6c 6c 65 64 20 74 6f 20 70 72 6f 63  s called to proc
d820: 65 73 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71  ess a compound q
d830: 75 65 72 79 20 66 6f 72 6d 20 66 72 6f 6d 0a 2a  uery form from.*
d840: 2a 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73 65  * two or more se
d850: 70 61 72 61 74 65 20 71 75 65 72 69 65 73 20 75  parate queries u
d860: 73 69 6e 67 20 55 4e 49 4f 4e 2c 20 55 4e 49 4f  sing UNION, UNIO
d870: 4e 20 41 4c 4c 2c 20 45 58 43 45 50 54 2c 20 6f  N ALL, EXCEPT, o
d880: 72 0a 2a 2a 20 49 4e 54 45 52 53 45 43 54 0a 2a  r.** INTERSECT.*
d890: 2a 0a 2a 2a 20 22 70 22 20 70 6f 69 6e 74 73 20  *.** "p" points 
d8a0: 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  to the right-mos
d8b0: 74 20 6f 66 20 74 68 65 20 74 77 6f 20 71 75 65  t of the two que
d8c0: 72 69 65 73 2e 20 20 74 68 65 20 71 75 65 72 79  ries.  the query
d8d0: 20 6f 6e 20 74 68 65 0a 2a 2a 20 6c 65 66 74 20   on the.** left 
d8e0: 69 73 20 70 2d 3e 70 50 72 69 6f 72 2e 20 20 54  is p->pPrior.  T
d8f0: 68 65 20 6c 65 66 74 20 71 75 65 72 79 20 63 6f  he left query co
d900: 75 6c 64 20 61 6c 73 6f 20 62 65 20 61 20 63 6f  uld also be a co
d910: 6d 70 6f 75 6e 64 20 71 75 65 72 79 0a 2a 2a 20  mpound query.** 
d920: 69 6e 20 77 68 69 63 68 20 63 61 73 65 20 74 68  in which case th
d930: 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
d940: 62 65 20 63 61 6c 6c 65 64 20 72 65 63 75 72 73  be called recurs
d950: 69 76 65 6c 79 2e 20 0a 2a 2a 0a 2a 2a 20 54 68  ively. .**.** Th
d960: 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65  e results of the
d970: 20 74 6f 74 61 6c 20 71 75 65 72 79 20 61 72 65   total query are
d980: 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69   to be written i
d990: 6e 74 6f 20 61 20 64 65 73 74 69 6e 61 74 69 6f  nto a destinatio
d9a0: 6e 0a 2a 2a 20 6f 66 20 74 79 70 65 20 65 44 65  n.** of type eDe
d9b0: 73 74 20 77 69 74 68 20 70 61 72 61 6d 65 74 65  st with paramete
d9c0: 72 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 45  r iParm..**.** E
d9d0: 78 61 6d 70 6c 65 20 31 3a 20 20 43 6f 6e 73 69  xample 1:  Consi
d9e0: 64 65 72 20 61 20 74 68 72 65 65 2d 77 61 79 20  der a three-way 
d9f0: 63 6f 6d 70 6f 75 6e 64 20 53 51 4c 20 73 74 61  compound SQL sta
da00: 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20 20  tement..**.**   
da10: 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20    SELECT a FROM 
da20: 74 31 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20  t1 UNION SELECT 
da30: 62 20 46 52 4f 4d 20 74 32 20 55 4e 49 4f 4e 20  b FROM t2 UNION 
da40: 53 45 4c 45 43 54 20 63 20 46 52 4f 4d 20 74 33  SELECT c FROM t3
da50: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73 74 61 74  .**.** This stat
da60: 65 6d 65 6e 74 20 69 73 20 70 61 72 73 65 64 20  ement is parsed 
da70: 75 70 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  up as follows:.*
da80: 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20  *.**     SELECT 
da90: 63 20 46 52 4f 4d 20 74 33 0a 2a 2a 20 20 20 20  c FROM t3.**    
daa0: 20 20 7c 0a 2a 2a 20 20 20 20 20 20 60 2d 2d 2d    |.**      `---
dab0: 2d 2d 3e 20 20 53 45 4c 45 43 54 20 62 20 46 52  -->  SELECT b FR
dac0: 4f 4d 20 74 32 0a 2a 2a 20 20 20 20 20 20 20 20  OM t2.**        
dad0: 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20          |.**    
dae0: 20 20 20 20 20 20 20 20 20 20 20 20 60 2d 2d 2d              `---
daf0: 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20 61 20 46  --->  SELECT a F
db00: 52 4f 4d 20 74 31 0a 2a 2a 0a 2a 2a 20 54 68 65  ROM t1.**.** The
db10: 20 61 72 72 6f 77 73 20 69 6e 20 74 68 65 20 64   arrows in the d
db20: 69 61 67 72 61 6d 20 61 62 6f 76 65 20 72 65 70  iagram above rep
db30: 72 65 73 65 6e 74 20 74 68 65 20 53 65 6c 65 63  resent the Selec
db40: 74 2e 70 50 72 69 6f 72 20 70 6f 69 6e 74 65 72  t.pPrior pointer
db50: 2e 0a 2a 2a 20 53 6f 20 69 66 20 74 68 69 73 20  ..** So if this 
db60: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
db70: 64 20 77 69 74 68 20 70 20 65 71 75 61 6c 20 74  d with p equal t
db80: 6f 20 74 68 65 20 74 33 20 71 75 65 72 79 2c 20  o the t3 query, 
db90: 74 68 65 6e 0a 2a 2a 20 70 50 72 69 6f 72 20 77  then.** pPrior w
dba0: 69 6c 6c 20 62 65 20 74 68 65 20 74 32 20 71 75  ill be the t2 qu
dbb0: 65 72 79 2e 20 20 70 2d 3e 6f 70 20 77 69 6c 6c  ery.  p->op will
dbc0: 20 62 65 20 54 4b 5f 55 4e 49 4f 4e 20 69 6e 20   be TK_UNION in 
dbd0: 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a  this case..**.**
dbe0: 20 4e 6f 74 69 63 65 20 74 68 61 74 20 62 65 63   Notice that bec
dbf0: 61 75 73 65 20 6f 66 20 74 68 65 20 77 61 79 20  ause of the way 
dc00: 53 51 4c 69 74 65 20 70 61 72 73 65 73 20 63 6f  SQLite parses co
dc10: 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 73 2c 20  mpound SELECTs, 
dc20: 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61  the.** individua
dc30: 6c 20 73 65 6c 65 63 74 73 20 61 6c 77 61 79 73  l selects always
dc40: 20 67 72 6f 75 70 20 66 72 6f 6d 20 6c 65 66 74   group from left
dc50: 20 74 6f 20 72 69 67 68 74 2e 0a 2a 2f 0a 73 74   to right..*/.st
dc60: 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65  atic int multiSe
dc70: 6c 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70  lect(.  Parse *p
dc80: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a  Parse,        /*
dc90: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
dca0: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
dcb0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
dcc0: 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66  he right-most of
dcd0: 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63   SELECTs to be c
dce0: 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74  oded */.  Select
dcf0: 44 65 73 74 20 2a 70 44 65 73 74 20 20 20 20 20  Dest *pDest     
dd00: 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69  /* What to do wi
dd10: 74 68 20 71 75 65 72 79 20 72 65 73 75 6c 74 73  th query results
dd20: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
dd30: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 2f  = SQLITE_OK;   /
dd40: 2a 20 53 75 63 63 65 73 73 20 63 6f 64 65 20 66  * Success code f
dd50: 72 6f 6d 20 61 20 73 75 62 72 6f 75 74 69 6e 65  rom a subroutine
dd60: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 50   */.  Select *pP
dd70: 72 69 6f 72 3b 20 20 20 20 20 20 20 2f 2a 20 41  rior;       /* A
dd80: 6e 6f 74 68 65 72 20 53 45 4c 45 43 54 20 69 6d  nother SELECT im
dd90: 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 6f 75 72  mediately to our
dda0: 20 6c 65 66 74 20 2a 2f 0a 20 20 56 64 62 65 20   left */.  Vdbe 
ddb0: 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *v;             
ddc0: 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
ddd0: 65 20 74 6f 20 74 68 69 73 20 56 44 42 45 20 2a  e to this VDBE *
dde0: 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 64  /.  SelectDest d
ddf0: 65 73 74 3b 20 20 20 20 20 20 2f 2a 20 41 6c 74  est;      /* Alt
de00: 65 72 6e 61 74 69 76 65 20 64 61 74 61 20 64 65  ernative data de
de10: 73 74 69 6e 61 74 69 6f 6e 20 2a 2f 0a 20 20 53  stination */.  S
de20: 65 6c 65 63 74 20 2a 70 44 65 6c 65 74 65 20 3d  elect *pDelete =
de30: 20 30 3b 20 20 2f 2a 20 43 68 61 69 6e 20 6f 66   0;  /* Chain of
de40: 20 73 69 6d 70 6c 65 20 73 65 6c 65 63 74 73 20   simple selects 
de50: 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20 73  to delete */.  s
de60: 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20  qlite3 *db;     
de70: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
de80: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 23   connection */.#
de90: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
dea0: 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 69 6e 74  IT_EXPLAIN.  int
deb0: 20 69 53 75 62 31 3b 20 20 20 20 20 20 20 20 20   iSub1;         
dec0: 20 20 20 2f 2a 20 45 51 50 20 69 64 20 6f 66 20     /* EQP id of 
ded0: 6c 65 66 74 2d 68 61 6e 64 20 71 75 65 72 79 20  left-hand query 
dee0: 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62 32 3b 20  */.  int iSub2; 
def0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 51             /* EQ
df00: 50 20 69 64 20 6f 66 20 72 69 67 68 74 2d 68 61  P id of right-ha
df10: 6e 64 20 71 75 65 72 79 20 2a 2f 0a 23 65 6e 64  nd query */.#end
df20: 69 66 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75  if..  /* Make su
df30: 72 65 20 74 68 65 72 65 20 69 73 20 6e 6f 20 4f  re there is no O
df40: 52 44 45 52 20 42 59 20 6f 72 20 4c 49 4d 49 54  RDER BY or LIMIT
df50: 20 63 6c 61 75 73 65 20 6f 6e 20 70 72 69 6f 72   clause on prior
df60: 20 53 45 4c 45 43 54 73 2e 20 20 4f 6e 6c 79 0a   SELECTs.  Only.
df70: 20 20 2a 2a 20 74 68 65 20 6c 61 73 74 20 28 72    ** the last (r
df80: 69 67 68 74 2d 6d 6f 73 74 29 20 53 45 4c 45 43  ight-most) SELEC
df90: 54 20 69 6e 20 74 68 65 20 73 65 72 69 65 73 20  T in the series 
dfa0: 6d 61 79 20 68 61 76 65 20 61 6e 20 4f 52 44 45  may have an ORDE
dfb0: 52 20 42 59 20 6f 72 20 4c 49 4d 49 54 2e 0a 20  R BY or LIMIT.. 
dfc0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 20   */.  assert( p 
dfd0: 26 26 20 70 2d 3e 70 50 72 69 6f 72 20 29 3b 20  && p->pPrior ); 
dfe0: 20 2f 2a 20 43 61 6c 6c 69 6e 67 20 66 75 6e 63   /* Calling func
dff0: 74 69 6f 6e 20 67 75 61 72 61 6e 74 65 65 73 20  tion guarantees 
e000: 74 68 69 73 20 6d 75 63 68 20 2a 2f 0a 20 20 64  this much */.  d
e010: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
e020: 20 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50    pPrior = p->pP
e030: 72 69 6f 72 3b 0a 20 20 61 73 73 65 72 74 28 20  rior;.  assert( 
e040: 70 50 72 69 6f 72 2d 3e 70 52 69 67 68 74 6d 6f  pPrior->pRightmo
e050: 73 74 21 3d 70 50 72 69 6f 72 20 29 3b 0a 20 20  st!=pPrior );.  
e060: 61 73 73 65 72 74 28 20 70 50 72 69 6f 72 2d 3e  assert( pPrior->
e070: 70 52 69 67 68 74 6d 6f 73 74 3d 3d 70 2d 3e 70  pRightmost==p->p
e080: 52 69 67 68 74 6d 6f 73 74 20 29 3b 0a 20 20 64  Rightmost );.  d
e090: 65 73 74 20 3d 20 2a 70 44 65 73 74 3b 0a 20 20  est = *pDest;.  
e0a0: 69 66 28 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64  if( pPrior->pOrd
e0b0: 65 72 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69  erBy ){.    sqli
e0c0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
e0d0: 73 65 2c 22 4f 52 44 45 52 20 42 59 20 63 6c 61  se,"ORDER BY cla
e0e0: 75 73 65 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20  use should come 
e0f0: 61 66 74 65 72 20 25 73 20 6e 6f 74 20 62 65 66  after %s not bef
e100: 6f 72 65 22 2c 0a 20 20 20 20 20 20 73 65 6c 65  ore",.      sele
e110: 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29  ctOpName(p->op))
e120: 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20  ;.    rc = 1;.  
e130: 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
e140: 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 69  ect_end;.  }.  i
e150: 66 28 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69  f( pPrior->pLimi
e160: 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
e170: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
e180: 22 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 73 68  "LIMIT clause sh
e190: 6f 75 6c 64 20 63 6f 6d 65 20 61 66 74 65 72 20  ould come after 
e1a0: 25 73 20 6e 6f 74 20 62 65 66 6f 72 65 22 2c 0a  %s not before",.
e1b0: 20 20 20 20 20 20 73 65 6c 65 63 74 4f 70 4e 61        selectOpNa
e1c0: 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20  me(p->op));.    
e1d0: 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f  rc = 1;.    goto
e1e0: 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
e1f0: 64 3b 0a 20 20 7d 0a 0a 20 20 76 20 3d 20 73 71  d;.  }..  v = sq
e200: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
e210: 72 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20  rse);.  assert( 
e220: 76 21 3d 30 20 29 3b 20 20 2f 2a 20 54 68 65 20  v!=0 );  /* The 
e230: 56 44 42 45 20 61 6c 72 65 61 64 79 20 63 72 65  VDBE already cre
e240: 61 74 65 64 20 62 79 20 63 61 6c 6c 69 6e 67 20  ated by calling 
e250: 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f  function */..  /
e260: 2a 20 43 72 65 61 74 65 20 74 68 65 20 64 65 73  * Create the des
e270: 74 69 6e 61 74 69 6f 6e 20 74 65 6d 70 6f 72 61  tination tempora
e280: 72 79 20 74 61 62 6c 65 20 69 66 20 6e 65 63 65  ry table if nece
e290: 73 73 61 72 79 0a 20 20 2a 2f 0a 20 20 69 66 28  ssary.  */.  if(
e2a0: 20 64 65 73 74 2e 65 44 65 73 74 3d 3d 53 52 54   dest.eDest==SRT
e2b0: 5f 45 70 68 65 6d 54 61 62 20 29 7b 0a 20 20 20  _EphemTab ){.   
e2c0: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69   assert( p->pELi
e2d0: 73 74 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  st );.    sqlite
e2e0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
e2f0: 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
e300: 20 64 65 73 74 2e 69 53 44 50 61 72 6d 2c 20 70   dest.iSDParm, p
e310: 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29  ->pEList->nExpr)
e320: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
e330: 65 43 68 61 6e 67 65 50 35 28 76 2c 20 42 54 52  eChangeP5(v, BTR
e340: 45 45 5f 55 4e 4f 52 44 45 52 45 44 29 3b 0a 20  EE_UNORDERED);. 
e350: 20 20 20 64 65 73 74 2e 65 44 65 73 74 20 3d 20     dest.eDest = 
e360: 53 52 54 5f 54 61 62 6c 65 3b 0a 20 20 7d 0a 0a  SRT_Table;.  }..
e370: 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 61    /* Make sure a
e380: 6c 6c 20 53 45 4c 45 43 54 73 20 69 6e 20 74 68  ll SELECTs in th
e390: 65 20 73 74 61 74 65 6d 65 6e 74 20 68 61 76 65  e statement have
e3a0: 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72   the same number
e3b0: 20 6f 66 20 65 6c 65 6d 65 6e 74 73 0a 20 20 2a   of elements.  *
e3c0: 2a 20 69 6e 20 74 68 65 69 72 20 72 65 73 75 6c  * in their resul
e3d0: 74 20 73 65 74 73 2e 0a 20 20 2a 2f 0a 20 20 61  t sets..  */.  a
e3e0: 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
e3f0: 20 26 26 20 70 50 72 69 6f 72 2d 3e 70 45 4c 69   && pPrior->pELi
e400: 73 74 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70  st );.  if( p->p
e410: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 70 50  EList->nExpr!=pP
e420: 72 69 6f 72 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  rior->pEList->nE
e430: 78 70 72 20 29 7b 0a 20 20 20 20 69 66 28 20 70  xpr ){.    if( p
e440: 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
e450: 56 61 6c 75 65 73 20 29 7b 0a 20 20 20 20 20 20  Values ){.      
e460: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
e470: 70 50 61 72 73 65 2c 20 22 61 6c 6c 20 56 41 4c  pParse, "all VAL
e480: 55 45 53 20 6d 75 73 74 20 68 61 76 65 20 74 68  UES must have th
e490: 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66  e same number of
e4a0: 20 74 65 72 6d 73 22 29 3b 0a 20 20 20 20 7d 65   terms");.    }e
e4b0: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
e4c0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
e4d0: 65 2c 20 22 53 45 4c 45 43 54 73 20 74 6f 20 74  e, "SELECTs to t
e4e0: 68 65 20 6c 65 66 74 20 61 6e 64 20 72 69 67 68  he left and righ
e4f0: 74 20 6f 66 20 25 73 22 0a 20 20 20 20 20 20 20  t of %s".       
e500: 20 22 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74   " do not have t
e510: 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f  he same number o
e520: 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  f result columns
e530: 22 2c 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28  ", selectOpName(
e540: 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 7d 0a 20  p->op));.    }. 
e550: 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67     rc = 1;.    g
e560: 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
e570: 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  _end;.  }..  /* 
e580: 43 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 73  Compound SELECTs
e590: 20 74 68 61 74 20 68 61 76 65 20 61 6e 20 4f 52   that have an OR
e5a0: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 72  DER BY clause ar
e5b0: 65 20 68 61 6e 64 6c 65 64 20 73 65 70 61 72 61  e handled separa
e5c0: 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  tely..  */.  if(
e5d0: 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a   p->pOrderBy ){.
e5e0: 20 20 20 20 72 65 74 75 72 6e 20 6d 75 6c 74 69      return multi
e5f0: 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28 70 50  SelectOrderBy(pP
e600: 61 72 73 65 2c 20 70 2c 20 70 44 65 73 74 29 3b  arse, p, pDest);
e610: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  .  }..  /* Gener
e620: 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65  ate code for the
e630: 20 6c 65 66 74 20 61 6e 64 20 72 69 67 68 74 20   left and right 
e640: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
e650: 73 2e 0a 20 20 2a 2f 0a 20 20 73 77 69 74 63 68  s..  */.  switch
e660: 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63  ( p->op ){.    c
e670: 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 7b 0a 20 20  ase TK_ALL: {.  
e680: 20 20 20 20 69 6e 74 20 61 64 64 72 20 3d 20 30      int addr = 0
e690: 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4c 69 6d  ;.      int nLim
e6a0: 69 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  it;.      assert
e6b0: 28 20 21 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69  ( !pPrior->pLimi
e6c0: 74 20 29 3b 0a 20 20 20 20 20 20 70 50 72 69 6f  t );.      pPrio
e6d0: 72 2d 3e 69 4c 69 6d 69 74 20 3d 20 70 2d 3e 69  r->iLimit = p->i
e6e0: 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 50 72  Limit;.      pPr
e6f0: 69 6f 72 2d 3e 69 4f 66 66 73 65 74 20 3d 20 70  ior->iOffset = p
e700: 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 20 20 20  ->iOffset;.     
e710: 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20   pPrior->pLimit 
e720: 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20  = p->pLimit;.   
e730: 20 20 20 70 50 72 69 6f 72 2d 3e 70 4f 66 66 73     pPrior->pOffs
e740: 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b  et = p->pOffset;
e750: 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65  .      explainSe
e760: 74 49 6e 74 65 67 65 72 28 69 53 75 62 31 2c 20  tInteger(iSub1, 
e770: 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c  pParse->iNextSel
e780: 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63  ectId);.      rc
e790: 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
e7a0: 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c  (pParse, pPrior,
e7b0: 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20 20 70   &dest);.      p
e7c0: 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->pLimit = 0;.  
e7d0: 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d      p->pOffset =
e7e0: 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63   0;.      if( rc
e7f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
e800: 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
e810: 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  d;.      }.     
e820: 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a   p->pPrior = 0;.
e830: 20 20 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20        p->iLimit 
e840: 3d 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74  = pPrior->iLimit
e850: 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4f 66 66 73  ;.      p->iOffs
e860: 65 74 20 3d 20 70 50 72 69 6f 72 2d 3e 69 4f 66  et = pPrior->iOf
e870: 66 73 65 74 3b 0a 20 20 20 20 20 20 69 66 28 20  fset;.      if( 
e880: 70 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20  p->iLimit ){.   
e890: 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69       addr = sqli
e8a0: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
e8b0: 20 4f 50 5f 49 66 5a 65 72 6f 2c 20 70 2d 3e 69   OP_IfZero, p->i
e8c0: 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 20 20  Limit);.        
e8d0: 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
e8e0: 22 4a 75 6d 70 20 61 68 65 61 64 20 69 66 20 4c  "Jump ahead if L
e8f0: 49 4d 49 54 20 72 65 61 63 68 65 64 22 29 29 3b  IMIT reached"));
e900: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 65  .      }.      e
e910: 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72  xplainSetInteger
e920: 28 69 53 75 62 32 2c 20 70 50 61 72 73 65 2d 3e  (iSub2, pParse->
e930: 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a  iNextSelectId);.
e940: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
e950: 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
e960: 20 70 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20   p, &dest);.    
e970: 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d    testcase( rc!=
e980: 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
e990: 20 20 20 70 44 65 6c 65 74 65 20 3d 20 70 2d 3e     pDelete = p->
e9a0: 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d  pPrior;.      p-
e9b0: 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72  >pPrior = pPrior
e9c0: 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65  ;.      p->nSele
e9d0: 63 74 52 6f 77 20 2b 3d 20 70 50 72 69 6f 72 2d  ctRow += pPrior-
e9e0: 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20  >nSelectRow;.   
e9f0: 20 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70     if( pPrior->p
ea00: 4c 69 6d 69 74 0a 20 20 20 20 20 20 20 26 26 20  Limit.       && 
ea10: 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74  sqlite3ExprIsInt
ea20: 65 67 65 72 28 70 50 72 69 6f 72 2d 3e 70 4c 69  eger(pPrior->pLi
ea30: 6d 69 74 2c 20 26 6e 4c 69 6d 69 74 29 0a 20 20  mit, &nLimit).  
ea40: 20 20 20 20 20 26 26 20 6e 4c 69 6d 69 74 3e 30       && nLimit>0
ea50: 20 26 26 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f   && p->nSelectRo
ea60: 77 20 3e 20 28 75 36 34 29 6e 4c 69 6d 69 74 20  w > (u64)nLimit 
ea70: 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
ea80: 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20    p->nSelectRow 
ea90: 3d 20 6e 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  = nLimit;.      
eaa0: 7d 0a 20 20 20 20 20 20 69 66 28 20 61 64 64 72  }.      if( addr
eab0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
eac0: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
ead0: 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 20 20  v, addr);.      
eae0: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
eaf0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
eb00: 5f 45 58 43 45 50 54 3a 0a 20 20 20 20 63 61 73  _EXCEPT:.    cas
eb10: 65 20 54 4b 5f 55 4e 49 4f 4e 3a 20 7b 0a 20 20  e TK_UNION: {.  
eb20: 20 20 20 20 69 6e 74 20 75 6e 69 6f 6e 54 61 62      int unionTab
eb30: 3b 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e  ;    /* Cursor n
eb40: 75 6d 62 65 72 20 6f 66 20 74 68 65 20 74 65 6d  umber of the tem
eb50: 70 6f 72 61 72 79 20 74 61 62 6c 65 20 68 6f 6c  porary table hol
eb60: 64 69 6e 67 20 72 65 73 75 6c 74 20 2a 2f 0a 20  ding result */. 
eb70: 20 20 20 20 20 75 38 20 6f 70 20 3d 20 30 3b 20       u8 op = 0; 
eb80: 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20        /* One of 
eb90: 74 68 65 20 53 52 54 5f 20 6f 70 65 72 61 74 69  the SRT_ operati
eba0: 6f 6e 73 20 74 6f 20 61 70 70 6c 79 20 74 6f 20  ons to apply to 
ebb0: 73 65 6c 66 20 2a 2f 0a 20 20 20 20 20 20 69 6e  self */.      in
ebc0: 74 20 70 72 69 6f 72 4f 70 3b 20 20 20 20 20 2f  t priorOp;     /
ebd0: 2a 20 54 68 65 20 53 52 54 5f 20 6f 70 65 72 61  * The SRT_ opera
ebe0: 74 69 6f 6e 20 74 6f 20 61 70 70 6c 79 20 74 6f  tion to apply to
ebf0: 20 70 72 69 6f 72 20 73 65 6c 65 63 74 73 20 2a   prior selects *
ec00: 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c  /.      Expr *pL
ec10: 69 6d 69 74 2c 20 2a 70 4f 66 66 73 65 74 3b 20  imit, *pOffset; 
ec20: 2f 2a 20 53 61 76 65 64 20 76 61 6c 75 65 73 20  /* Saved values 
ec30: 6f 66 20 70 2d 3e 6e 4c 69 6d 69 74 20 61 6e 64  of p->nLimit and
ec40: 20 70 2d 3e 6e 4f 66 66 73 65 74 20 2a 2f 0a 20   p->nOffset */. 
ec50: 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20       int addr;. 
ec60: 20 20 20 20 20 53 65 6c 65 63 74 44 65 73 74 20       SelectDest 
ec70: 75 6e 69 6f 6e 64 65 73 74 3b 0a 0a 20 20 20 20  uniondest;..    
ec80: 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e 6f    testcase( p->o
ec90: 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20 29 3b 0a  p==TK_EXCEPT );.
eca0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
ecb0: 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20  p->op==TK_UNION 
ecc0: 29 3b 0a 20 20 20 20 20 20 70 72 69 6f 72 4f 70  );.      priorOp
ecd0: 20 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20   = SRT_Union;.  
ece0: 20 20 20 20 69 66 28 20 64 65 73 74 2e 65 44 65      if( dest.eDe
ecf0: 73 74 3d 3d 70 72 69 6f 72 4f 70 20 26 26 20 41  st==priorOp && A
ed00: 4c 57 41 59 53 28 21 70 2d 3e 70 4c 69 6d 69 74  LWAYS(!p->pLimit
ed10: 20 26 26 21 70 2d 3e 70 4f 66 66 73 65 74 29 20   &&!p->pOffset) 
ed20: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65  ){.        /* We
ed30: 20 63 61 6e 20 72 65 75 73 65 20 61 20 74 65 6d   can reuse a tem
ed40: 70 6f 72 61 72 79 20 74 61 62 6c 65 20 67 65 6e  porary table gen
ed50: 65 72 61 74 65 64 20 62 79 20 61 20 53 45 4c 45  erated by a SELE
ed60: 43 54 20 74 6f 20 6f 75 72 0a 20 20 20 20 20 20  CT to our.      
ed70: 20 20 2a 2a 20 72 69 67 68 74 2e 0a 20 20 20 20    ** right..    
ed80: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61      */.        a
ed90: 73 73 65 72 74 28 20 70 2d 3e 70 52 69 67 68 74  ssert( p->pRight
eda0: 6d 6f 73 74 21 3d 70 20 29 3b 20 20 2f 2a 20 43  most!=p );  /* C
edb0: 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 66  an only happen f
edc0: 6f 72 20 6c 65 66 74 77 61 72 64 20 65 6c 65 6d  or leftward elem
edd0: 65 6e 74 73 0a 20 20 20 20 20 20 20 20 20 20 20  ents.           
ede0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
edf0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20            ** of 
ee00: 61 20 33 2d 77 61 79 20 6f 72 20 6d 6f 72 65 20  a 3-way or more 
ee10: 63 6f 6d 70 6f 75 6e 64 20 2a 2f 0a 20 20 20 20  compound */.    
ee20: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
ee30: 4c 69 6d 69 74 3d 3d 30 20 29 3b 20 20 20 20 20  Limit==0 );     
ee40: 20 2f 2a 20 4e 6f 74 20 61 6c 6c 6f 77 65 64 20   /* Not allowed 
ee50: 6f 6e 20 6c 65 66 74 77 61 72 64 20 65 6c 65 6d  on leftward elem
ee60: 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  ents */.        
ee70: 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 66 66 73  assert( p->pOffs
ee80: 65 74 3d 3d 30 20 29 3b 20 20 20 20 20 2f 2a 20  et==0 );     /* 
ee90: 4e 6f 74 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 6c  Not allowed on l
eea0: 65 66 74 77 61 72 64 20 65 6c 65 6d 65 6e 74 73  eftward elements
eeb0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 6e 69 6f   */.        unio
eec0: 6e 54 61 62 20 3d 20 64 65 73 74 2e 69 53 44 50  nTab = dest.iSDP
eed0: 61 72 6d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  arm;.      }else
eee0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20  {.        /* We 
eef0: 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63 72 65  will need to cre
ef00: 61 74 65 20 6f 75 72 20 6f 77 6e 20 74 65 6d 70  ate our own temp
ef10: 6f 72 61 72 79 20 74 61 62 6c 65 20 74 6f 20 68  orary table to h
ef20: 6f 6c 64 20 74 68 65 0a 20 20 20 20 20 20 20 20  old the.        
ef30: 2a 2a 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  ** intermediate 
ef40: 72 65 73 75 6c 74 73 2e 0a 20 20 20 20 20 20 20  results..       
ef50: 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 6e 69 6f   */.        unio
ef60: 6e 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e  nTab = pParse->n
ef70: 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 61  Tab++;.        a
ef80: 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72  ssert( p->pOrder
ef90: 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  By==0 );.       
efa0: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
efb0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
efc0: 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 75  OpenEphemeral, u
efd0: 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20  nionTab, 0);.   
efe0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
eff0: 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20  addrOpenEphm[0] 
f000: 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 20  == -1 );.       
f010: 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d   p->addrOpenEphm
f020: 5b 30 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20 20  [0] = addr;.    
f030: 20 20 20 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73      p->pRightmos
f040: 74 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53  t->selFlags |= S
f050: 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c 3b  F_UsesEphemeral;
f060: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
f070: 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20   p->pEList );.  
f080: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
f090: 43 6f 64 65 20 74 68 65 20 53 45 4c 45 43 54 20  Code the SELECT 
f0a0: 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 6f 75  statements to ou
f0b0: 72 20 6c 65 66 74 0a 20 20 20 20 20 20 2a 2f 0a  r left.      */.
f0c0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
f0d0: 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20  Prior->pOrderBy 
f0e0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
f0f0: 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26  SelectDestInit(&
f100: 75 6e 69 6f 6e 64 65 73 74 2c 20 70 72 69 6f 72  uniondest, prior
f110: 4f 70 2c 20 75 6e 69 6f 6e 54 61 62 29 3b 0a 20  Op, unionTab);. 
f120: 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49       explainSetI
f130: 6e 74 65 67 65 72 28 69 53 75 62 31 2c 20 70 50  nteger(iSub1, pP
f140: 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63  arse->iNextSelec
f150: 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  tId);.      rc =
f160: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
f170: 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26  Parse, pPrior, &
f180: 75 6e 69 6f 6e 64 65 73 74 29 3b 0a 20 20 20 20  uniondest);.    
f190: 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
f1a0: 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
f1b0: 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20  elect_end;.     
f1c0: 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64   }..      /* Cod
f1d0: 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 53 45  e the current SE
f1e0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 20  LECT statement. 
f1f0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
f200: 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 43 45  ( p->op==TK_EXCE
f210: 50 54 20 29 7b 0a 20 20 20 20 20 20 20 20 6f 70  PT ){.        op
f220: 20 3d 20 53 52 54 5f 45 78 63 65 70 74 3b 0a 20   = SRT_Except;. 
f230: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
f240: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f      assert( p->o
f250: 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20  p==TK_UNION );. 
f260: 20 20 20 20 20 20 20 6f 70 20 3d 20 53 52 54 5f         op = SRT_
f270: 55 6e 69 6f 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  Union;.      }. 
f280: 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d       p->pPrior =
f290: 20 30 3b 0a 20 20 20 20 20 20 70 4c 69 6d 69 74   0;.      pLimit
f2a0: 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20   = p->pLimit;.  
f2b0: 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20      p->pLimit = 
f2c0: 30 3b 0a 20 20 20 20 20 20 70 4f 66 66 73 65 74  0;.      pOffset
f2d0: 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20   = p->pOffset;. 
f2e0: 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20       p->pOffset 
f2f0: 3d 20 30 3b 0a 20 20 20 20 20 20 75 6e 69 6f 6e  = 0;.      union
f300: 64 65 73 74 2e 65 44 65 73 74 20 3d 20 6f 70 3b  dest.eDest = op;
f310: 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65  .      explainSe
f320: 74 49 6e 74 65 67 65 72 28 69 53 75 62 32 2c 20  tInteger(iSub2, 
f330: 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c  pParse->iNextSel
f340: 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63  ectId);.      rc
f350: 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
f360: 28 70 50 61 72 73 65 2c 20 70 2c 20 26 75 6e 69  (pParse, p, &uni
f370: 6f 6e 64 65 73 74 29 3b 0a 20 20 20 20 20 20 74  ondest);.      t
f380: 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c  estcase( rc!=SQL
f390: 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
f3a0: 2f 2a 20 51 75 65 72 79 20 66 6c 61 74 74 65 6e  /* Query flatten
f3b0: 69 6e 67 20 69 6e 20 73 71 6c 69 74 65 33 53 65  ing in sqlite3Se
f3c0: 6c 65 63 74 28 29 20 6d 69 67 68 74 20 72 65 66  lect() might ref
f3d0: 69 6c 6c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2e  ill p->pOrderBy.
f3e0: 0a 20 20 20 20 20 20 2a 2a 20 42 65 20 73 75 72  .      ** Be sur
f3f0: 65 20 74 6f 20 64 65 6c 65 74 65 20 70 2d 3e 70  e to delete p->p
f400: 4f 72 64 65 72 42 79 2c 20 74 68 65 72 65 66 6f  OrderBy, therefo
f410: 72 65 2c 20 74 6f 20 61 76 6f 69 64 20 61 20 6d  re, to avoid a m
f420: 65 6d 6f 72 79 20 6c 65 61 6b 2e 20 2a 2f 0a 20  emory leak. */. 
f430: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
f440: 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
f450: 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20  ->pOrderBy);.   
f460: 20 20 20 70 44 65 6c 65 74 65 20 3d 20 70 2d 3e     pDelete = p->
f470: 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d  pPrior;.      p-
f480: 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72  >pPrior = pPrior
f490: 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 72 64 65  ;.      p->pOrde
f4a0: 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  rBy = 0;.      i
f4b0: 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49  f( p->op==TK_UNI
f4c0: 4f 4e 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74 52  ON ) p->nSelectR
f4d0: 6f 77 20 2b 3d 20 70 50 72 69 6f 72 2d 3e 6e 53  ow += pPrior->nS
f4e0: 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20 20 20  electRow;.      
f4f0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
f500: 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29  e(db, p->pLimit)
f510: 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69  ;.      p->pLimi
f520: 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20  t = pLimit;.    
f530: 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70    p->pOffset = p
f540: 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70 2d  Offset;.      p-
f550: 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20  >iLimit = 0;.   
f560: 20 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20     p->iOffset = 
f570: 30 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 6e  0;..      /* Con
f580: 76 65 72 74 20 74 68 65 20 64 61 74 61 20 69 6e  vert the data in
f590: 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74   the temporary t
f5a0: 61 62 6c 65 20 69 6e 74 6f 20 77 68 61 74 65 76  able into whatev
f5b0: 65 72 20 66 6f 72 6d 0a 20 20 20 20 20 20 2a 2a  er form.      **
f5c0: 20 69 74 20 69 73 20 74 68 61 74 20 77 65 20 63   it is that we c
f5d0: 75 72 72 65 6e 74 6c 79 20 6e 65 65 64 2e 0a 20  urrently need.. 
f5e0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73       */.      as
f5f0: 73 65 72 74 28 20 75 6e 69 6f 6e 54 61 62 3d 3d  sert( unionTab==
f600: 64 65 73 74 2e 69 53 44 50 61 72 6d 20 7c 7c 20  dest.iSDParm || 
f610: 64 65 73 74 2e 65 44 65 73 74 21 3d 70 72 69 6f  dest.eDest!=prio
f620: 72 4f 70 20 29 3b 0a 20 20 20 20 20 20 69 66 28  rOp );.      if(
f630: 20 64 65 73 74 2e 65 44 65 73 74 21 3d 70 72 69   dest.eDest!=pri
f640: 6f 72 4f 70 20 29 7b 0a 20 20 20 20 20 20 20 20  orOp ){.        
f650: 69 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72 65 61  int iCont, iBrea
f660: 6b 2c 20 69 53 74 61 72 74 3b 0a 20 20 20 20 20  k, iStart;.     
f670: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45     assert( p->pE
f680: 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20  List );.        
f690: 69 66 28 20 64 65 73 74 2e 65 44 65 73 74 3d 3d  if( dest.eDest==
f6a0: 53 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20  SRT_Output ){.  
f6b0: 20 20 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a          Select *
f6c0: 70 46 69 72 73 74 20 3d 20 70 3b 0a 20 20 20 20  pFirst = p;.    
f6d0: 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 46 69        while( pFi
f6e0: 72 73 74 2d 3e 70 50 72 69 6f 72 20 29 20 70 46  rst->pPrior ) pF
f6f0: 69 72 73 74 20 3d 20 70 46 69 72 73 74 2d 3e 70  irst = pFirst->p
f700: 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 20  Prior;.         
f710: 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e   generateColumnN
f720: 61 6d 65 73 28 70 50 61 72 73 65 2c 20 30 2c 20  ames(pParse, 0, 
f730: 70 46 69 72 73 74 2d 3e 70 45 4c 69 73 74 29 3b  pFirst->pEList);
f740: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
f750: 20 20 20 69 42 72 65 61 6b 20 3d 20 73 71 6c 69     iBreak = sqli
f760: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
f770: 28 76 29 3b 0a 20 20 20 20 20 20 20 20 69 43 6f  (v);.        iCo
f780: 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  nt = sqlite3Vdbe
f790: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
f7a0: 20 20 20 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d        computeLim
f7b0: 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72  itRegisters(pPar
f7c0: 73 65 2c 20 70 2c 20 69 42 72 65 61 6b 29 3b 0a  se, p, iBreak);.
f7d0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
f7e0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
f7f0: 52 65 77 69 6e 64 2c 20 75 6e 69 6f 6e 54 61 62  Rewind, unionTab
f800: 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20  , iBreak);.     
f810: 20 20 20 69 53 74 61 72 74 20 3d 20 73 71 6c 69     iStart = sqli
f820: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
f830: 64 72 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73  dr(v);.        s
f840: 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70  electInnerLoop(p
f850: 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c  Parse, p, p->pEL
f860: 69 73 74 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 70  ist, unionTab, p
f870: 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c  ->pEList->nExpr,
f880: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
f890: 20 20 20 20 20 20 20 20 20 30 2c 20 30 2c 20 26           0, 0, &
f8a0: 64 65 73 74 2c 20 69 43 6f 6e 74 2c 20 69 42 72  dest, iCont, iBr
f8b0: 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71  eak);.        sq
f8c0: 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
f8d0: 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b  Label(v, iCont);
f8e0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
f8f0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
f900: 5f 4e 65 78 74 2c 20 75 6e 69 6f 6e 54 61 62 2c  _Next, unionTab,
f910: 20 69 53 74 61 72 74 29 3b 0a 20 20 20 20 20 20   iStart);.      
f920: 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
f930: 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 42 72  olveLabel(v, iBr
f940: 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71  eak);.        sq
f950: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
f960: 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 75 6e 69  v, OP_Close, uni
f970: 6f 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20  onTab, 0);.     
f980: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
f990: 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c      }.    defaul
f9a0: 74 3a 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70  t: assert( p->op
f9b0: 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 29  ==TK_INTERSECT )
f9c0: 3b 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 61  ; {.      int ta
f9d0: 62 31 2c 20 74 61 62 32 3b 0a 20 20 20 20 20 20  b1, tab2;.      
f9e0: 69 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72 65 61  int iCont, iBrea
f9f0: 6b 2c 20 69 53 74 61 72 74 3b 0a 20 20 20 20 20  k, iStart;.     
fa00: 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20 2a   Expr *pLimit, *
fa10: 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 69  pOffset;.      i
fa20: 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20 53  nt addr;.      S
fa30: 65 6c 65 63 74 44 65 73 74 20 69 6e 74 65 72 73  electDest inters
fa40: 65 63 74 64 65 73 74 3b 0a 20 20 20 20 20 20 69  ectdest;.      i
fa50: 6e 74 20 72 31 3b 0a 0a 20 20 20 20 20 20 2f 2a  nt r1;..      /*
fa60: 20 49 4e 54 45 52 53 45 43 54 20 69 73 20 64 69   INTERSECT is di
fa70: 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65  fferent from the
fa80: 20 6f 74 68 65 72 73 20 73 69 6e 63 65 20 69 74   others since it
fa90: 20 72 65 71 75 69 72 65 73 0a 20 20 20 20 20 20   requires.      
faa0: 2a 2a 20 74 77 6f 20 74 65 6d 70 6f 72 61 72 79  ** two temporary
fab0: 20 74 61 62 6c 65 73 2e 20 20 48 65 6e 63 65 20   tables.  Hence 
fac0: 69 74 20 68 61 73 20 69 74 73 20 6f 77 6e 20 63  it has its own c
fad0: 61 73 65 2e 20 20 42 65 67 69 6e 0a 20 20 20 20  ase.  Begin.    
fae0: 20 20 2a 2a 20 62 79 20 61 6c 6c 6f 63 61 74 69    ** by allocati
faf0: 6e 67 20 74 68 65 20 74 61 62 6c 65 73 20 77 65  ng the tables we
fb00: 20 77 69 6c 6c 20 6e 65 65 64 2e 0a 20 20 20 20   will need..    
fb10: 20 20 2a 2f 0a 20 20 20 20 20 20 74 61 62 31 20    */.      tab1 
fb20: 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
fb30: 3b 0a 20 20 20 20 20 20 74 61 62 32 20 3d 20 70  ;.      tab2 = p
fb40: 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
fb50: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
fb60: 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 0a  pOrderBy==0 );..
fb70: 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c        addr = sql
fb80: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
fb90: 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
fba0: 61 6c 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20 20  al, tab1, 0);.  
fbb0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61      assert( p->a
fbc0: 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d  ddrOpenEphm[0] =
fbd0: 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 70 2d  = -1 );.      p-
fbe0: 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d  >addrOpenEphm[0]
fbf0: 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20 70   = addr;.      p
fc00: 2d 3e 70 52 69 67 68 74 6d 6f 73 74 2d 3e 73 65  ->pRightmost->se
fc10: 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 55 73 65  lFlags |= SF_Use
fc20: 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20 20 20  sEphemeral;.    
fc30: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c    assert( p->pEL
fc40: 69 73 74 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  ist );..      /*
fc50: 20 43 6f 64 65 20 74 68 65 20 53 45 4c 45 43 54   Code the SELECT
fc60: 73 20 74 6f 20 6f 75 72 20 6c 65 66 74 20 69 6e  s to our left in
fc70: 74 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  to temporary tab
fc80: 6c 65 20 22 74 61 62 31 22 2e 0a 20 20 20 20 20  le "tab1"..     
fc90: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
fca0: 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28  3SelectDestInit(
fcb0: 26 69 6e 74 65 72 73 65 63 74 64 65 73 74 2c 20  &intersectdest, 
fcc0: 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 61 62 31 29  SRT_Union, tab1)
fcd0: 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53  ;.      explainS
fce0: 65 74 49 6e 74 65 67 65 72 28 69 53 75 62 31 2c  etInteger(iSub1,
fcf0: 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65   pParse->iNextSe
fd00: 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 72  lectId);.      r
fd10: 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  c = sqlite3Selec
fd20: 74 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72  t(pParse, pPrior
fd30: 2c 20 26 69 6e 74 65 72 73 65 63 74 64 65 73 74  , &intersectdest
fd40: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
fd50: 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
fd60: 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
fd70: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
fd80: 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 63 75 72   /* Code the cur
fd90: 72 65 6e 74 20 53 45 4c 45 43 54 20 69 6e 74 6f  rent SELECT into
fda0: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
fdb0: 20 22 74 61 62 32 22 0a 20 20 20 20 20 20 2a 2f   "tab2".      */
fdc0: 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71  .      addr = sq
fdd0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
fde0: 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
fdf0: 72 61 6c 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20  ral, tab2, 0);. 
fe00: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
fe10: 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20  addrOpenEphm[1] 
fe20: 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 70  == -1 );.      p
fe30: 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31  ->addrOpenEphm[1
fe40: 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20  ] = addr;.      
fe50: 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20  p->pPrior = 0;. 
fe60: 20 20 20 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d       pLimit = p-
fe70: 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70  >pLimit;.      p
fe80: 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->pLimit = 0;.  
fe90: 20 20 20 20 70 4f 66 66 73 65 74 20 3d 20 70 2d      pOffset = p-
fea0: 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  >pOffset;.      
feb0: 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a  p->pOffset = 0;.
fec0: 20 20 20 20 20 20 69 6e 74 65 72 73 65 63 74 64        intersectd
fed0: 65 73 74 2e 69 53 44 50 61 72 6d 20 3d 20 74 61  est.iSDParm = ta
fee0: 62 32 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69  b2;.      explai
fef0: 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53 75 62  nSetInteger(iSub
ff00: 32 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74  2, pParse->iNext
ff10: 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20  SelectId);.     
ff20: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c   rc = sqlite3Sel
ff30: 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26  ect(pParse, p, &
ff40: 69 6e 74 65 72 73 65 63 74 64 65 73 74 29 3b 0a  intersectdest);.
ff50: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
ff60: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc!=SQLITE_OK );
ff70: 0a 20 20 20 20 20 20 70 44 65 6c 65 74 65 20 3d  .      pDelete =
ff80: 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20   p->pPrior;.    
ff90: 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50    p->pPrior = pP
ffa0: 72 69 6f 72 3b 0a 20 20 20 20 20 20 69 66 28 20  rior;.      if( 
ffb0: 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3e 70 50  p->nSelectRow>pP
ffc0: 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  rior->nSelectRow
ffd0: 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77   ) p->nSelectRow
ffe0: 20 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65   = pPrior->nSele
fff0: 63 74 52 6f 77 3b 0a 20 20 20 20 20 20 73 71 6c  ctRow;.      sql
10000 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
10010 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20  b, p->pLimit);. 
10020 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d       p->pLimit =
10030 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70   pLimit;.      p
10040 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f 66 66  ->pOffset = pOff
10050 73 65 74 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47  set;..      /* G
10060 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
10070 74 61 6b 65 20 74 68 65 20 69 6e 74 65 72 73 65  take the interse
10080 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 74 77 6f  ction of the two
10090 20 74 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 20   temporary.     
100a0 20 2a 2a 20 74 61 62 6c 65 73 2e 0a 20 20 20 20   ** tables..    
100b0 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72    */.      asser
100c0 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a  t( p->pEList );.
100d0 20 20 20 20 20 20 69 66 28 20 64 65 73 74 2e 65        if( dest.e
100e0 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74  Dest==SRT_Output
100f0 20 29 7b 0a 20 20 20 20 20 20 20 20 53 65 6c 65   ){.        Sele
10100 63 74 20 2a 70 46 69 72 73 74 20 3d 20 70 3b 0a  ct *pFirst = p;.
10110 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70          while( p
10120 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 20 29 20  First->pPrior ) 
10130 70 46 69 72 73 74 20 3d 20 70 46 69 72 73 74 2d  pFirst = pFirst-
10140 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20  >pPrior;.       
10150 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e   generateColumnN
10160 61 6d 65 73 28 70 50 61 72 73 65 2c 20 30 2c 20  ames(pParse, 0, 
10170 70 46 69 72 73 74 2d 3e 70 45 4c 69 73 74 29 3b  pFirst->pEList);
10180 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
10190 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56  Break = sqlite3V
101a0 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
101b0 0a 20 20 20 20 20 20 69 43 6f 6e 74 20 3d 20 73  .      iCont = s
101c0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
101d0 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 63 6f  bel(v);.      co
101e0 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74  mputeLimitRegist
101f0 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20 69  ers(pParse, p, i
10200 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 73 71  Break);.      sq
10210 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
10220 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 74 61  v, OP_Rewind, ta
10230 62 31 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20  b1, iBreak);.   
10240 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47     r1 = sqlite3G
10250 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
10260 29 3b 0a 20 20 20 20 20 20 69 53 74 61 72 74 20  );.      iStart 
10270 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
10280 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 4b 65 79  Op2(v, OP_RowKey
10290 2c 20 74 61 62 31 2c 20 72 31 29 3b 0a 20 20 20  , tab1, r1);.   
102a0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
102b0 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 4e 6f  dOp4Int(v, OP_No
102c0 74 46 6f 75 6e 64 2c 20 74 61 62 32 2c 20 69 43  tFound, tab2, iC
102d0 6f 6e 74 2c 20 72 31 2c 20 30 29 3b 0a 20 20 20  ont, r1, 0);.   
102e0 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
102f0 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
10300 20 72 31 29 3b 0a 20 20 20 20 20 20 73 65 6c 65   r1);.      sele
10310 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72  ctInnerLoop(pPar
10320 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74  se, p, p->pEList
10330 2c 20 74 61 62 31 2c 20 70 2d 3e 70 45 4c 69 73  , tab1, p->pELis
10340 74 2d 3e 6e 45 78 70 72 2c 0a 20 20 20 20 20 20  t->nExpr,.      
10350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10360 30 2c 20 30 2c 20 26 64 65 73 74 2c 20 69 43 6f  0, 0, &dest, iCo
10370 6e 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20  nt, iBreak);.   
10380 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
10390 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43  solveLabel(v, iC
103a0 6f 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ont);.      sqli
103b0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
103c0 20 4f 50 5f 4e 65 78 74 2c 20 74 61 62 31 2c 20   OP_Next, tab1, 
103d0 69 53 74 61 72 74 29 3b 0a 20 20 20 20 20 20 73  iStart);.      s
103e0 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
103f0 65 4c 61 62 65 6c 28 76 2c 20 69 42 72 65 61 6b  eLabel(v, iBreak
10400 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
10410 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
10420 5f 43 6c 6f 73 65 2c 20 74 61 62 32 2c 20 30 29  _Close, tab2, 0)
10430 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
10440 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
10450 43 6c 6f 73 65 2c 20 74 61 62 31 2c 20 30 29 3b  Close, tab1, 0);
10460 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
10470 20 20 7d 0a 20 20 7d 0a 0a 20 20 65 78 70 6c 61    }.  }..  expla
10480 69 6e 43 6f 6d 70 6f 73 69 74 65 28 70 50 61 72  inComposite(pPar
10490 73 65 2c 20 70 2d 3e 6f 70 2c 20 69 53 75 62 31  se, p->op, iSub1
104a0 2c 20 69 53 75 62 32 2c 20 70 2d 3e 6f 70 21 3d  , iSub2, p->op!=
104b0 54 4b 5f 41 4c 4c 29 3b 0a 0a 20 20 2f 2a 20 43  TK_ALL);..  /* C
104c0 6f 6d 70 75 74 65 20 63 6f 6c 6c 61 74 69 6e 67  ompute collating
104d0 20 73 65 71 75 65 6e 63 65 73 20 75 73 65 64 20   sequences used 
104e0 62 79 20 0a 20 20 2a 2a 20 74 65 6d 70 6f 72 61  by .  ** tempora
104f0 72 79 20 74 61 62 6c 65 73 20 6e 65 65 64 65 64  ry tables needed
10500 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68   to implement th
10510 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63  e compound selec
10520 74 2e 0a 20 20 2a 2a 20 41 74 74 61 63 68 20 74  t..  ** Attach t
10530 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63  he KeyInfo struc
10540 74 75 72 65 20 74 6f 20 61 6c 6c 20 74 65 6d 70  ture to all temp
10550 6f 72 61 72 79 20 74 61 62 6c 65 73 2e 0a 20 20  orary tables..  
10560 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 73 65 63  **.  ** This sec
10570 74 69 6f 6e 20 69 73 20 72 75 6e 20 62 79 20 74  tion is run by t
10580 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 53 45  he right-most SE
10590 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 6f  LECT statement o
105a0 6e 6c 79 2e 0a 20 20 2a 2a 20 53 45 4c 45 43 54  nly..  ** SELECT
105b0 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 74   statements to t
105c0 68 65 20 6c 65 66 74 20 61 6c 77 61 79 73 20 73  he left always s
105d0 6b 69 70 20 74 68 69 73 20 70 61 72 74 2e 20 20  kip this part.  
105e0 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 0a 20  The right-most. 
105f0 20 2a 2a 20 53 45 4c 45 43 54 20 6d 69 67 68 74   ** SELECT might
10600 20 61 6c 73 6f 20 73 6b 69 70 20 74 68 69 73 20   also skip this 
10610 70 61 72 74 20 69 66 20 69 74 20 68 61 73 20 6e  part if it has n
10620 6f 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  o ORDER BY claus
10630 65 20 61 6e 64 0a 20 20 2a 2a 20 6e 6f 20 74 65  e and.  ** no te
10640 6d 70 20 74 61 62 6c 65 73 20 61 72 65 20 72 65  mp tables are re
10650 71 75 69 72 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  quired..  */.  i
10660 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  f( p->selFlags &
10670 20 53 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61   SF_UsesEphemera
10680 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 20  l ){.    int i; 
10690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
106a0 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
106b0 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 4b 65  ounter */.    Ke
106c0 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b  yInfo *pKeyInfo;
106d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
106e0 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
106f0 65 20 66 6f 72 20 74 68 65 20 72 65 73 75 6c 74  e for the result
10700 20 73 65 74 20 2a 2f 0a 20 20 20 20 53 65 6c 65   set */.    Sele
10710 63 74 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20  ct *pLoop;      
10720 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72            /* For
10730 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75 67 68   looping through
10740 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
10750 74 73 20 2a 2f 0a 20 20 20 20 43 6f 6c 6c 53 65  ts */.    CollSe
10760 71 20 2a 2a 61 70 43 6f 6c 6c 3b 20 20 20 20 20  q **apColl;     
10770 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c          /* For l
10780 6f 6f 70 69 6e 67 20 74 68 72 6f 75 67 68 20 70  ooping through p
10790 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 5d  KeyInfo->aColl[]
107a0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c   */.    int nCol
107b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
107c0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
107d0 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 72 65  of columns in re
107e0 73 75 6c 74 20 73 65 74 20 2a 2f 0a 0a 20 20 20  sult set */..   
107f0 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52 69 67   assert( p->pRig
10800 68 74 6d 6f 73 74 3d 3d 70 20 29 3b 0a 20 20 20  htmost==p );.   
10810 20 6e 43 6f 6c 20 3d 20 70 2d 3e 70 45 4c 69 73   nCol = p->pELis
10820 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 70 4b  t->nExpr;.    pK
10830 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33  eyInfo = sqlite3
10840 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c  KeyInfoAlloc(db,
10850 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 69 66 28 20   nCol);.    if( 
10860 21 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20  !pKeyInfo ){.   
10870 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
10880 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f  OMEM;.      goto
10890 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
108a0 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  d;.    }.    for
108b0 28 69 3d 30 2c 20 61 70 43 6f 6c 6c 3d 70 4b 65  (i=0, apColl=pKe
108c0 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 3b 20 69 3c  yInfo->aColl; i<
108d0 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 61 70 43 6f 6c  nCol; i++, apCol
108e0 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 2a 61 70 43  l++){.      *apC
108f0 6f 6c 6c 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63  oll = multiSelec
10900 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  tCollSeq(pParse,
10910 20 70 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66   p, i);.      if
10920 28 20 30 3d 3d 2a 61 70 43 6f 6c 6c 20 29 7b 0a  ( 0==*apColl ){.
10930 20 20 20 20 20 20 20 20 2a 61 70 43 6f 6c 6c 20          *apColl 
10940 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b  = db->pDfltColl;
10950 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
10960 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 3b      for(pLoop=p;
10970 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c   pLoop; pLoop=pL
10980 6f 6f 70 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20  oop->pPrior){.  
10990 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 32      for(i=0; i<2
109a0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
109b0 69 6e 74 20 61 64 64 72 20 3d 20 70 4c 6f 6f 70  int addr = pLoop
109c0 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 69  ->addrOpenEphm[i
109d0 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  ];.        if( a
109e0 64 64 72 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  ddr<0 ){.       
109f0 20 20 20 2f 2a 20 49 66 20 5b 30 5d 20 69 73 20     /* If [0] is 
10a00 75 6e 75 73 65 64 20 74 68 65 6e 20 5b 31 5d 20  unused then [1] 
10a10 69 73 20 61 6c 73 6f 20 75 6e 75 73 65 64 2e 20  is also unused. 
10a20 20 53 6f 20 77 65 20 63 61 6e 0a 20 20 20 20 20   So we can.     
10a30 20 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 73       ** always s
10a40 61 66 65 6c 79 20 61 62 6f 72 74 20 61 73 20 73  afely abort as s
10a50 6f 6f 6e 20 61 73 20 74 68 65 20 66 69 72 73 74  oon as the first
10a60 20 75 6e 75 73 65 64 20 73 6c 6f 74 20 69 73 20   unused slot is 
10a70 66 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 20  found */.       
10a80 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 6f 70     assert( pLoop
10a90 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31  ->addrOpenEphm[1
10aa0 5d 3c 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ]<0 );.         
10ab0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
10ac0 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
10ad0 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c  3VdbeChangeP2(v,
10ae0 20 61 64 64 72 2c 20 6e 43 6f 6c 29 3b 0a 20 20   addr, nCol);.  
10af0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
10b00 65 43 68 61 6e 67 65 50 34 28 76 2c 20 61 64 64  eChangeP4(v, add
10b10 72 2c 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e  r, (char*)pKeyIn
10b20 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b  fo, P4_KEYINFO);
10b30 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e  .        pLoop->
10b40 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 69 5d 20  addrOpenEphm[i] 
10b50 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  = -1;.      }.  
10b60 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44    }.    sqlite3D
10b70 62 46 72 65 65 28 64 62 2c 20 70 4b 65 79 49 6e  bFree(db, pKeyIn
10b80 66 6f 29 3b 0a 20 20 7d 0a 0a 6d 75 6c 74 69 5f  fo);.  }..multi_
10b90 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 20 20 70 44  select_end:.  pD
10ba0 65 73 74 2d 3e 69 53 64 73 74 20 3d 20 64 65 73  est->iSdst = des
10bb0 74 2e 69 53 64 73 74 3b 0a 20 20 70 44 65 73 74  t.iSdst;.  pDest
10bc0 2d 3e 6e 53 64 73 74 20 3d 20 64 65 73 74 2e 6e  ->nSdst = dest.n
10bd0 53 64 73 74 3b 0a 20 20 73 71 6c 69 74 65 33 53  Sdst;.  sqlite3S
10be0 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20  electDelete(db, 
10bf0 70 44 65 6c 65 74 65 29 3b 0a 20 20 72 65 74 75  pDelete);.  retu
10c00 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20  rn rc;.}.#endif 
10c10 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  /* SQLITE_OMIT_C
10c20 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a  OMPOUND_SELECT *
10c30 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e  /../*.** Code an
10c40 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74 69   output subrouti
10c50 6e 65 20 66 6f 72 20 61 20 63 6f 72 6f 75 74 69  ne for a corouti
10c60 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ne implementatio
10c70 6e 20 6f 66 20 61 0a 2a 2a 20 53 45 4c 45 43 54  n of a.** SELECT
10c80 20 73 74 61 74 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a   statment..**.**
10c90 20 54 68 65 20 64 61 74 61 20 74 6f 20 62 65 20   The data to be 
10ca0 6f 75 74 70 75 74 20 69 73 20 63 6f 6e 74 61 69  output is contai
10cb0 6e 65 64 20 69 6e 20 70 49 6e 2d 3e 69 53 64 73  ned in pIn->iSds
10cc0 74 2e 20 20 54 68 65 72 65 20 61 72 65 0a 2a 2a  t.  There are.**
10cd0 20 70 49 6e 2d 3e 6e 53 64 73 74 20 63 6f 6c 75   pIn->nSdst colu
10ce0 6d 6e 73 20 74 6f 20 62 65 20 6f 75 74 70 75 74  mns to be output
10cf0 2e 20 20 70 44 65 73 74 20 69 73 20 77 68 65 72  .  pDest is wher
10d00 65 20 74 68 65 20 6f 75 74 70 75 74 20 73 68 6f  e the output sho
10d10 75 6c 64 0a 2a 2a 20 62 65 20 73 65 6e 74 2e 0a  uld.** be sent..
10d20 2a 2a 0a 2a 2a 20 72 65 67 52 65 74 75 72 6e 20  **.** regReturn 
10d30 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
10d40 20 74 68 65 20 72 65 67 69 73 74 65 72 20 68 6f   the register ho
10d50 6c 64 69 6e 67 20 74 68 65 20 73 75 62 72 6f 75  lding the subrou
10d60 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 20 61  tine.** return a
10d70 64 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  ddress..**.** If
10d80 20 72 65 67 50 72 65 76 3e 30 20 74 68 65 6e 20   regPrev>0 then 
10d90 69 74 20 69 73 20 74 68 65 20 66 69 72 73 74 20  it is the first 
10da0 72 65 67 69 73 74 65 72 20 69 6e 20 61 20 76 65  register in a ve
10db0 63 74 6f 72 20 74 68 61 74 0a 2a 2a 20 72 65 63  ctor that.** rec
10dc0 6f 72 64 73 20 74 68 65 20 70 72 65 76 69 6f 75  ords the previou
10dd0 73 20 6f 75 74 70 75 74 2e 20 20 6d 65 6d 5b 72  s output.  mem[r
10de0 65 67 50 72 65 76 5d 20 69 73 20 61 20 66 6c 61  egPrev] is a fla
10df0 67 20 74 68 61 74 20 69 73 20 66 61 6c 73 65 0a  g that is false.
10e00 2a 2a 20 69 66 20 74 68 65 72 65 20 68 61 73 20  ** if there has 
10e10 62 65 65 6e 20 6e 6f 20 70 72 65 76 69 6f 75 73  been no previous
10e20 20 6f 75 74 70 75 74 2e 20 20 49 66 20 72 65 67   output.  If reg
10e30 50 72 65 76 3e 30 20 74 68 65 6e 20 63 6f 64 65  Prev>0 then code
10e40 20 69 73 0a 2a 2a 20 67 65 6e 65 72 61 74 65 64   is.** generated
10e50 20 74 6f 20 73 75 70 70 72 65 73 73 20 64 75 70   to suppress dup
10e60 6c 69 63 61 74 65 73 2e 20 20 70 4b 65 79 49 6e  licates.  pKeyIn
10e70 66 6f 20 69 73 20 75 73 65 64 20 66 6f 72 20 63  fo is used for c
10e80 6f 6d 70 61 72 69 6e 67 0a 2a 2a 20 6b 65 79 73  omparing.** keys
10e90 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 4c  ..**.** If the L
10ea0 49 4d 49 54 20 66 6f 75 6e 64 20 69 6e 20 70 2d  IMIT found in p-
10eb0 3e 69 4c 69 6d 69 74 20 69 73 20 72 65 61 63 68  >iLimit is reach
10ec0 65 64 2c 20 6a 75 6d 70 20 69 6d 6d 65 64 69 61  ed, jump immedia
10ed0 74 65 6c 79 20 74 6f 0a 2a 2a 20 69 42 72 65 61  tely to.** iBrea
10ee0 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  k..*/.static int
10ef0 20 67 65 6e 65 72 61 74 65 4f 75 74 70 75 74 53   generateOutputS
10f00 75 62 72 6f 75 74 69 6e 65 28 0a 20 20 50 61 72  ubroutine(.  Par
10f10 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
10f20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
10f30 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
10f40 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
10f50 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45       /* The SELE
10f60 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  CT statement */.
10f70 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 49    SelectDest *pI
10f80 6e 2c 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 72  n,        /* Cor
10f90 6f 75 74 69 6e 65 20 73 75 70 70 6c 79 69 6e 67  outine supplying
10fa0 20 64 61 74 61 20 2a 2f 0a 20 20 53 65 6c 65 63   data */.  Selec
10fb0 74 44 65 73 74 20 2a 70 44 65 73 74 2c 20 20 20  tDest *pDest,   
10fc0 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 73     /* Where to s
10fd0 65 6e 64 20 74 68 65 20 64 61 74 61 20 2a 2f 0a  end the data */.
10fe0 20 20 69 6e 74 20 72 65 67 52 65 74 75 72 6e 2c    int regReturn,
10ff0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
11000 20 72 65 74 75 72 6e 20 61 64 64 72 65 73 73 20   return address 
11010 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e  register */.  in
11020 74 20 72 65 67 50 72 65 76 2c 20 20 20 20 20 20  t regPrev,      
11030 20 20 20 20 20 20 2f 2a 20 50 72 65 76 69 6f 75        /* Previou
11040 73 20 72 65 73 75 6c 74 20 72 65 67 69 73 74 65  s result registe
11050 72 2e 20 20 4e 6f 20 75 6e 69 71 75 65 6e 65 73  r.  No uniquenes
11060 73 20 69 66 20 30 20 2a 2f 0a 20 20 4b 65 79 49  s if 0 */.  KeyI
11070 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20  nfo *pKeyInfo,  
11080 20 20 20 20 2f 2a 20 46 6f 72 20 63 6f 6d 70 61      /* For compa
11090 72 69 6e 67 20 77 69 74 68 20 70 72 65 76 69 6f  ring with previo
110a0 75 73 20 65 6e 74 72 79 20 2a 2f 0a 20 20 69 6e  us entry */.  in
110b0 74 20 70 34 74 79 70 65 2c 20 20 20 20 20 20 20  t p4type,       
110c0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 34 20        /* The p4 
110d0 74 79 70 65 20 66 6f 72 20 70 4b 65 79 49 6e 66  type for pKeyInf
110e0 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 42 72 65 61  o */.  int iBrea
110f0 6b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  k              /
11100 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 77  * Jump here if w
11110 65 20 68 69 74 20 74 68 65 20 4c 49 4d 49 54 20  e hit the LIMIT 
11120 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  */.){.  Vdbe *v 
11130 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
11140 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65  .  int iContinue
11150 3b 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 0a 20  ;.  int addr;.. 
11160 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
11170 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
11180 29 3b 0a 20 20 69 43 6f 6e 74 69 6e 75 65 20 3d  );.  iContinue =
11190 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
111a0 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 2f 2a 20  Label(v);..  /* 
111b0 53 75 70 70 72 65 73 73 20 64 75 70 6c 69 63 61  Suppress duplica
111c0 74 65 73 20 66 6f 72 20 55 4e 49 4f 4e 2c 20 45  tes for UNION, E
111d0 58 43 45 50 54 2c 20 61 6e 64 20 49 4e 54 45 52  XCEPT, and INTER
111e0 53 45 43 54 20 0a 20 20 2a 2f 0a 20 20 69 66 28  SECT .  */.  if(
111f0 20 72 65 67 50 72 65 76 20 29 7b 0a 20 20 20 20   regPrev ){.    
11200 69 6e 74 20 6a 31 2c 20 6a 32 3b 0a 20 20 20 20  int j1, j2;.    
11210 6a 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  j1 = sqlite3Vdbe
11220 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e  AddOp1(v, OP_IfN
11230 6f 74 2c 20 72 65 67 50 72 65 76 29 3b 0a 20 20  ot, regPrev);.  
11240 20 20 6a 32 20 3d 20 73 71 6c 69 74 65 33 56 64    j2 = sqlite3Vd
11250 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43  beAddOp4(v, OP_C
11260 6f 6d 70 61 72 65 2c 20 70 49 6e 2d 3e 69 53 64  ompare, pIn->iSd
11270 73 74 2c 20 72 65 67 50 72 65 76 2b 31 2c 20 70  st, regPrev+1, p
11280 49 6e 2d 3e 6e 53 64 73 74 2c 0a 20 20 20 20 20  In->nSdst,.     
11290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
112a0 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
112b0 70 4b 65 79 49 6e 66 6f 2c 20 70 34 74 79 70 65  pKeyInfo, p4type
112c0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
112d0 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a  beAddOp3(v, OP_J
112e0 75 6d 70 2c 20 6a 32 2b 32 2c 20 69 43 6f 6e 74  ump, j2+2, iCont
112f0 69 6e 75 65 2c 20 6a 32 2b 32 29 3b 0a 20 20 20  inue, j2+2);.   
11300 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
11310 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a 20 20 20  Here(v, j1);.   
11320 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11330 70 33 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 70  p3(v, OP_Copy, p
11340 49 6e 2d 3e 69 53 64 73 74 2c 20 72 65 67 50 72  In->iSdst, regPr
11350 65 76 2b 31 2c 20 70 49 6e 2d 3e 6e 53 64 73 74  ev+1, pIn->nSdst
11360 2d 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  -1);.    sqlite3
11370 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
11380 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 72 65 67  _Integer, 1, reg
11390 50 72 65 76 29 3b 0a 20 20 7d 0a 20 20 69 66 28  Prev);.  }.  if(
113a0 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
113b0 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75  locFailed ) retu
113c0 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 53 75 70 70  rn 0;..  /* Supp
113d0 72 65 73 73 20 74 68 65 20 66 69 72 73 74 20 4f  ress the first O
113e0 46 46 53 45 54 20 65 6e 74 72 69 65 73 20 69 66  FFSET entries if
113f0 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 46 46   there is an OFF
11400 53 45 54 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a  SET clause.  */.
11410 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20    codeOffset(v, 
11420 70 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 0a  p, iContinue);..
11430 20 20 73 77 69 74 63 68 28 20 70 44 65 73 74 2d    switch( pDest-
11440 3e 65 44 65 73 74 20 29 7b 0a 20 20 20 20 2f 2a  >eDest ){.    /*
11450 20 53 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   Store the resul
11460 74 20 61 73 20 64 61 74 61 20 75 73 69 6e 67 20  t as data using 
11470 61 20 75 6e 69 71 75 65 20 6b 65 79 2e 0a 20 20  a unique key..  
11480 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52    */.    case SR
11490 54 5f 54 61 62 6c 65 3a 0a 20 20 20 20 63 61 73  T_Table:.    cas
114a0 65 20 53 52 54 5f 45 70 68 65 6d 54 61 62 3a 20  e SRT_EphemTab: 
114b0 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d  {.      int r1 =
114c0 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
114d0 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
114e0 20 20 69 6e 74 20 72 32 20 3d 20 73 71 6c 69 74    int r2 = sqlit
114f0 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
11500 72 73 65 29 3b 0a 20 20 20 20 20 20 74 65 73 74  rse);.      test
11510 63 61 73 65 28 20 70 44 65 73 74 2d 3e 65 44 65  case( pDest->eDe
11520 73 74 3d 3d 53 52 54 5f 54 61 62 6c 65 20 29 3b  st==SRT_Table );
11530 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
11540 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53   pDest->eDest==S
11550 52 54 5f 45 70 68 65 6d 54 61 62 20 29 3b 0a 20  RT_EphemTab );. 
11560 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
11570 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b  AddOp3(v, OP_Mak
11580 65 52 65 63 6f 72 64 2c 20 70 49 6e 2d 3e 69 53  eRecord, pIn->iS
11590 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 2c  dst, pIn->nSdst,
115a0 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   r1);.      sqli
115b0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
115c0 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 70 44   OP_NewRowid, pD
115d0 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 72 32  est->iSDParm, r2
115e0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
115f0 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
11600 5f 49 6e 73 65 72 74 2c 20 70 44 65 73 74 2d 3e  _Insert, pDest->
11610 69 53 44 50 61 72 6d 2c 20 72 31 2c 20 72 32 29  iSDParm, r1, r2)
11620 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
11630 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f  dbeChangeP5(v, O
11640 50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20  PFLAG_APPEND);. 
11650 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
11660 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
11670 65 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 73 71  e, r2);.      sq
11680 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
11690 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
116a0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
116b0 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c    }..#ifndef SQL
116c0 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
116d0 59 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61  Y.    /* If we a
116e0 72 65 20 63 72 65 61 74 69 6e 67 20 61 20 73 65  re creating a se
116f0 74 20 66 6f 72 20 61 6e 20 22 65 78 70 72 20 49  t for an "expr I
11700 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20  N (SELECT ...)" 
11710 63 6f 6e 73 74 72 75 63 74 2c 0a 20 20 20 20 2a  construct,.    *
11720 2a 20 74 68 65 6e 20 74 68 65 72 65 20 73 68 6f  * then there sho
11730 75 6c 64 20 62 65 20 61 20 73 69 6e 67 6c 65 20  uld be a single 
11740 69 74 65 6d 20 6f 6e 20 74 68 65 20 73 74 61 63  item on the stac
11750 6b 2e 20 20 57 72 69 74 65 20 74 68 69 73 0a 20  k.  Write this. 
11760 20 20 20 2a 2a 20 69 74 65 6d 20 69 6e 74 6f 20     ** item into 
11770 74 68 65 20 73 65 74 20 74 61 62 6c 65 20 77 69  the set table wi
11780 74 68 20 62 6f 67 75 73 20 64 61 74 61 2e 0a 20  th bogus data.. 
11790 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
117a0 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20 20  RT_Set: {.      
117b0 69 6e 74 20 72 31 3b 0a 20 20 20 20 20 20 61 73  int r1;.      as
117c0 73 65 72 74 28 20 70 49 6e 2d 3e 6e 53 64 73 74  sert( pIn->nSdst
117d0 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 70 44 65  ==1 );.      pDe
117e0 73 74 2d 3e 61 66 66 53 64 73 74 20 3d 20 0a 20  st->affSdst = . 
117f0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43          sqlite3C
11800 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 70  ompareAffinity(p
11810 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  ->pEList->a[0].p
11820 45 78 70 72 2c 20 70 44 65 73 74 2d 3e 61 66 66  Expr, pDest->aff
11830 53 64 73 74 29 3b 0a 20 20 20 20 20 20 72 31 20  Sdst);.      r1 
11840 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
11850 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
11860 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
11870 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp4(v, OP_MakeR
11880 65 63 6f 72 64 2c 20 70 49 6e 2d 3e 69 53 64 73  ecord, pIn->iSds
11890 74 2c 20 31 2c 20 72 31 2c 20 26 70 44 65 73 74  t, 1, r1, &pDest
118a0 2d 3e 61 66 66 53 64 73 74 2c 31 29 3b 0a 20 20  ->affSdst,1);.  
118b0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
118c0 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e  acheAffinityChan
118d0 67 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e  ge(pParse, pIn->
118e0 69 53 64 73 74 2c 20 31 29 3b 0a 20 20 20 20 20  iSdst, 1);.     
118f0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11900 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65  p2(v, OP_IdxInse
11910 72 74 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61  rt, pDest->iSDPa
11920 72 6d 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73  rm, r1);.      s
11930 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
11940 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
11950 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
11960 20 20 20 7d 0a 0a 23 69 66 20 30 20 20 2f 2a 20     }..#if 0  /* 
11970 4e 65 76 65 72 20 6f 63 63 75 72 73 20 6f 6e 20  Never occurs on 
11980 61 6e 20 4f 52 44 45 52 20 42 59 20 71 75 65 72  an ORDER BY quer
11990 79 20 2a 2f 0a 20 20 20 20 2f 2a 20 49 66 20 61  y */.    /* If a
119a0 6e 79 20 72 6f 77 20 65 78 69 73 74 20 69 6e 20  ny row exist in 
119b0 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2c 20  the result set, 
119c0 72 65 63 6f 72 64 20 74 68 61 74 20 66 61 63 74  record that fact
119d0 20 61 6e 64 20 61 62 6f 72 74 2e 0a 20 20 20 20   and abort..    
119e0 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
119f0 45 78 69 73 74 73 3a 20 7b 0a 20 20 20 20 20 20  Exists: {.      
11a00 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
11a10 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
11a20 20 31 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61   1, pDest->iSDPa
11a30 72 6d 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68  rm);.      /* Th
11a40 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77  e LIMIT clause w
11a50 69 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20 74 68  ill terminate th
11a60 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f  e loop for us */
11a70 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
11a80 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
11a90 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20  /* If this is a 
11aa0 73 63 61 6c 61 72 20 73 65 6c 65 63 74 20 74 68  scalar select th
11ab0 61 74 20 69 73 20 70 61 72 74 20 6f 66 20 61 6e  at is part of an
11ac0 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65   expression, the
11ad0 6e 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65 20 74  n.    ** store t
11ae0 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74 68  he results in th
11af0 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 6d 65  e appropriate me
11b00 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20 62 72  mory cell and br
11b10 65 61 6b 20 6f 75 74 0a 20 20 20 20 2a 2a 20 6f  eak out.    ** o
11b20 66 20 74 68 65 20 73 63 61 6e 20 6c 6f 6f 70 2e  f the scan loop.
11b30 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
11b40 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20   SRT_Mem: {.    
11b50 20 20 61 73 73 65 72 74 28 20 70 49 6e 2d 3e 6e    assert( pIn->n
11b60 53 64 73 74 3d 3d 31 20 29 3b 0a 20 20 20 20 20  Sdst==1 );.     
11b70 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
11b80 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 70 49 6e  Move(pParse, pIn
11b90 2d 3e 69 53 64 73 74 2c 20 70 44 65 73 74 2d 3e  ->iSdst, pDest->
11ba0 69 53 44 50 61 72 6d 2c 20 31 29 3b 0a 20 20 20  iSDParm, 1);.   
11bb0 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20     /* The LIMIT 
11bc0 63 6c 61 75 73 65 20 77 69 6c 6c 20 6a 75 6d 70  clause will jump
11bd0 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70   out of the loop
11be0 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20   for us */.     
11bf0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
11c00 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64 65 66 20  ndif /* #ifndef 
11c10 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
11c20 55 45 52 59 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  UERY */..    /* 
11c30 54 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20  The results are 
11c40 73 74 6f 72 65 64 20 69 6e 20 61 20 73 65 71 75  stored in a sequ
11c50 65 6e 63 65 20 6f 66 20 72 65 67 69 73 74 65 72  ence of register
11c60 73 0a 20 20 20 20 2a 2a 20 73 74 61 72 74 69 6e  s.    ** startin
11c70 67 20 61 74 20 70 44 65 73 74 2d 3e 69 53 64 73  g at pDest->iSds
11c80 74 2e 20 20 54 68 65 6e 20 74 68 65 20 63 6f 2d  t.  Then the co-
11c90 72 6f 75 74 69 6e 65 20 79 69 65 6c 64 73 2e 0a  routine yields..
11ca0 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
11cb0 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 3a 20 7b  SRT_Coroutine: {
11cc0 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 73 74  .      if( pDest
11cd0 2d 3e 69 53 64 73 74 3d 3d 30 20 29 7b 0a 20 20  ->iSdst==0 ){.  
11ce0 20 20 20 20 20 20 70 44 65 73 74 2d 3e 69 53 64        pDest->iSd
11cf0 73 74 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  st = sqlite3GetT
11d00 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
11d10 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20   pIn->nSdst);.  
11d20 20 20 20 20 20 20 70 44 65 73 74 2d 3e 6e 53 64        pDest->nSd
11d30 73 74 20 3d 20 70 49 6e 2d 3e 6e 53 64 73 74 3b  st = pIn->nSdst;
11d40 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
11d50 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f  qlite3ExprCodeMo
11d60 76 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e  ve(pParse, pIn->
11d70 69 53 64 73 74 2c 20 70 44 65 73 74 2d 3e 69 53  iSdst, pDest->iS
11d80 64 73 74 2c 20 70 44 65 73 74 2d 3e 6e 53 64 73  dst, pDest->nSds
11d90 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
11da0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
11db0 50 5f 59 69 65 6c 64 2c 20 70 44 65 73 74 2d 3e  P_Yield, pDest->
11dc0 69 53 44 50 61 72 6d 29 3b 0a 20 20 20 20 20 20  iSDParm);.      
11dd0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
11de0 20 20 2f 2a 20 49 66 20 6e 6f 6e 65 20 6f 66 20    /* If none of 
11df0 74 68 65 20 61 62 6f 76 65 2c 20 74 68 65 6e 20  the above, then 
11e00 74 68 65 20 72 65 73 75 6c 74 20 64 65 73 74 69  the result desti
11e10 6e 61 74 69 6f 6e 20 6d 75 73 74 20 62 65 0a 20  nation must be. 
11e20 20 20 20 2a 2a 20 53 52 54 5f 4f 75 74 70 75 74     ** SRT_Output
11e30 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
11e40 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 20  is never called 
11e50 77 69 74 68 20 61 6e 79 20 6f 74 68 65 72 0a 20  with any other. 
11e60 20 20 20 2a 2a 20 64 65 73 74 69 6e 61 74 69 6f     ** destinatio
11e70 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68 65  n other than the
11e80 20 6f 6e 65 73 20 68 61 6e 64 6c 65 64 20 61 62   ones handled ab
11e90 6f 76 65 20 6f 72 20 53 52 54 5f 4f 75 74 70 75  ove or SRT_Outpu
11ea0 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  t..    **.    **
11eb0 20 46 6f 72 20 53 52 54 5f 4f 75 74 70 75 74 2c   For SRT_Output,
11ec0 20 72 65 73 75 6c 74 73 20 61 72 65 20 73 74 6f   results are sto
11ed0 72 65 64 20 69 6e 20 61 20 73 65 71 75 65 6e 63  red in a sequenc
11ee0 65 20 6f 66 20 72 65 67 69 73 74 65 72 73 2e 20  e of registers. 
11ef0 20 0a 20 20 20 20 2a 2a 20 54 68 65 6e 20 74 68   .    ** Then th
11f00 65 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 20 6f  e OP_ResultRow o
11f10 70 63 6f 64 65 20 69 73 20 75 73 65 64 20 74 6f  pcode is used to
11f20 20 63 61 75 73 65 20 73 71 6c 69 74 65 33 5f 73   cause sqlite3_s
11f30 74 65 70 28 29 20 74 6f 0a 20 20 20 20 2a 2a 20  tep() to.    ** 
11f40 72 65 74 75 72 6e 20 74 68 65 20 6e 65 78 74 20  return the next 
11f50 72 6f 77 20 6f 66 20 72 65 73 75 6c 74 2e 0a 20  row of result.. 
11f60 20 20 20 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c     */.    defaul
11f70 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  t: {.      asser
11f80 74 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d  t( pDest->eDest=
11f90 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20  =SRT_Output );. 
11fa0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
11fb0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73  AddOp2(v, OP_Res
11fc0 75 6c 74 52 6f 77 2c 20 70 49 6e 2d 3e 69 53 64  ultRow, pIn->iSd
11fd0 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b  st, pIn->nSdst);
11fe0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
11ff0 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43  prCacheAffinityC
12000 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 70 49  hange(pParse, pI
12010 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e  n->iSdst, pIn->n
12020 53 64 73 74 29 3b 0a 20 20 20 20 20 20 62 72 65  Sdst);.      bre
12030 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ak;.    }.  }.. 
12040 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20   /* Jump to the 
12050 65 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  end of the loop 
12060 69 66 20 74 68 65 20 4c 49 4d 49 54 20 69 73 20  if the LIMIT is 
12070 72 65 61 63 68 65 64 2e 0a 20 20 2a 2f 0a 20 20  reached..  */.  
12080 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29 7b  if( p->iLimit ){
12090 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
120a0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 5a  AddOp3(v, OP_IfZ
120b0 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20  ero, p->iLimit, 
120c0 69 42 72 65 61 6b 2c 20 2d 31 29 3b 0a 20 20 7d  iBreak, -1);.  }
120d0 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
120e0 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20 72  the subroutine r
120f0 65 74 75 72 6e 0a 20 20 2a 2f 0a 20 20 73 71 6c  eturn.  */.  sql
12100 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
12110 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 69 6e 75  abel(v, iContinu
12120 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  e);.  sqlite3Vdb
12130 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65  eAddOp1(v, OP_Re
12140 74 75 72 6e 2c 20 72 65 67 52 65 74 75 72 6e 29  turn, regReturn)
12150 3b 0a 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72  ;..  return addr
12160 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 74 65 72  ;.}../*.** Alter
12170 6e 61 74 69 76 65 20 63 6f 6d 70 6f 75 6e 64 20  native compound 
12180 73 65 6c 65 63 74 20 63 6f 64 65 20 67 65 6e 65  select code gene
12190 72 61 74 6f 72 20 66 6f 72 20 63 61 73 65 73 20  rator for cases 
121a0 77 68 65 6e 20 74 68 65 72 65 0a 2a 2a 20 69 73  when there.** is
121b0 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
121c0 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 61 73  use..**.** We as
121d0 73 75 6d 65 20 61 20 71 75 65 72 79 20 6f 66 20  sume a query of 
121e0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f  the following fo
121f0 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 3c  rm:.**.**      <
12200 73 65 6c 65 63 74 41 3e 20 20 3c 6f 70 65 72 61  selectA>  <opera
12210 74 6f 72 3e 20 20 3c 73 65 6c 65 63 74 42 3e 20  tor>  <selectB> 
12220 20 4f 52 44 45 52 20 42 59 20 3c 6f 72 64 65 72   ORDER BY <order
12230 62 79 6c 69 73 74 3e 0a 2a 2a 0a 2a 2a 20 3c 6f  bylist>.**.** <o
12240 70 65 72 61 74 6f 72 3e 20 69 73 20 6f 6e 65 20  perator> is one 
12250 6f 66 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20 55 4e  of UNION ALL, UN
12260 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20 6f 72 20  ION, EXCEPT, or 
12270 49 4e 54 45 52 53 45 43 54 2e 20 20 54 68 65 20  INTERSECT.  The 
12280 69 64 65 61 0a 2a 2a 20 69 73 20 74 6f 20 63 6f  idea.** is to co
12290 64 65 20 62 6f 74 68 20 3c 73 65 6c 65 63 74 41  de both <selectA
122a0 3e 20 61 6e 64 20 3c 73 65 6c 65 63 74 42 3e 20  > and <selectB> 
122b0 77 69 74 68 20 74 68 65 20 4f 52 44 45 52 20 42  with the ORDER B
122c0 59 20 63 6c 61 75 73 65 20 61 73 0a 2a 2a 20 63  Y clause as.** c
122d0 6f 2d 72 6f 75 74 69 6e 65 73 2e 20 20 54 68 65  o-routines.  The
122e0 6e 20 72 75 6e 20 74 68 65 20 63 6f 2d 72 6f 75  n run the co-rou
122f0 74 69 6e 65 73 20 69 6e 20 70 61 72 61 6c 6c 65  tines in paralle
12300 6c 20 61 6e 64 20 6d 65 72 67 65 20 74 68 65 20  l and merge the 
12310 72 65 73 75 6c 74 73 0a 2a 2a 20 69 6e 74 6f 20  results.** into 
12320 74 68 65 20 6f 75 74 70 75 74 2e 20 20 49 6e 20  the output.  In 
12330 61 64 64 69 74 69 6f 6e 20 74 6f 20 74 68 65 20  addition to the 
12340 74 77 6f 20 63 6f 72 6f 75 74 69 6e 65 73 20 28  two coroutines (
12350 63 61 6c 6c 65 64 20 73 65 6c 65 63 74 41 20 61  called selectA a
12360 6e 64 0a 2a 2a 20 73 65 6c 65 63 74 42 29 20 74  nd.** selectB) t
12370 68 65 72 65 20 61 72 65 20 37 20 73 75 62 72 6f  here are 7 subro
12380 75 74 69 6e 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  utines:.**.**   
12390 20 6f 75 74 41 3a 20 20 20 20 4d 6f 76 65 20 74   outA:    Move t
123a0 68 65 20 6f 75 74 70 75 74 20 6f 66 20 74 68 65  he output of the
123b0 20 73 65 6c 65 63 74 41 20 63 6f 72 6f 75 74 69   selectA corouti
123c0 6e 65 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70  ne into the outp
123d0 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ut.**           
123e0 20 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e    of the compoun
123f0 64 20 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 20  d query..**.**  
12400 20 20 6f 75 74 42 3a 20 20 20 20 4d 6f 76 65 20    outB:    Move 
12410 74 68 65 20 6f 75 74 70 75 74 20 6f 66 20 74 68  the output of th
12420 65 20 73 65 6c 65 63 74 42 20 63 6f 72 6f 75 74  e selectB corout
12430 69 6e 65 20 69 6e 74 6f 20 74 68 65 20 6f 75 74  ine into the out
12440 70 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  put.**          
12450 20 20 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75     of the compou
12460 6e 64 20 71 75 65 72 79 2e 20 20 28 4f 6e 6c 79  nd query.  (Only
12470 20 67 65 6e 65 72 61 74 65 64 20 66 6f 72 20 55   generated for U
12480 4e 49 4f 4e 20 61 6e 64 0a 2a 2a 20 20 20 20 20  NION and.**     
12490 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c          UNION AL
124a0 4c 2e 20 20 45 58 43 45 50 54 20 61 6e 64 20 49  L.  EXCEPT and I
124b0 4e 53 45 52 54 53 45 43 54 20 6e 65 76 65 72 20  NSERTSECT never 
124c0 6f 75 74 70 75 74 20 61 20 72 6f 77 20 74 68 61  output a row tha
124d0 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
124e0 20 61 70 70 65 61 72 73 20 6f 6e 6c 79 20 69 6e   appears only in
124f0 20 42 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 20 41 6c   B.).**.**    Al
12500 74 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68  tB:    Called wh
12510 65 6e 20 74 68 65 72 65 20 69 73 20 64 61 74 61  en there is data
12520 20 66 72 6f 6d 20 62 6f 74 68 20 63 6f 72 6f 75   from both corou
12530 74 69 6e 65 73 20 61 6e 64 20 41 3c 42 2e 0a 2a  tines and A<B..*
12540 2a 0a 2a 2a 20 20 20 20 41 65 71 42 3a 20 20 20  *.**    AeqB:   
12550 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65   Called when the
12560 72 65 20 69 73 20 64 61 74 61 20 66 72 6f 6d 20  re is data from 
12570 62 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65 73 20  both coroutines 
12580 61 6e 64 20 41 3d 3d 42 2e 0a 2a 2a 0a 2a 2a 20  and A==B..**.** 
12590 20 20 20 41 67 74 42 3a 20 20 20 20 43 61 6c 6c     AgtB:    Call
125a0 65 64 20 77 68 65 6e 20 74 68 65 72 65 20 69 73  ed when there is
125b0 20 64 61 74 61 20 66 72 6f 6d 20 62 6f 74 68 20   data from both 
125c0 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 41  coroutines and A
125d0 3e 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 45 6f 66  >B..**.**    Eof
125e0 41 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65  A:    Called whe
125f0 6e 20 64 61 74 61 20 69 73 20 65 78 68 61 75 73  n data is exhaus
12600 74 65 64 20 66 72 6f 6d 20 73 65 6c 65 63 74 41  ted from selectA
12610 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 45 6f 66 42 3a  ..**.**    EofB:
12620 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20      Called when 
12630 64 61 74 61 20 69 73 20 65 78 68 61 75 73 74 65  data is exhauste
12640 64 20 66 72 6f 6d 20 73 65 6c 65 63 74 42 2e 0a  d from selectB..
12650 2a 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d  **.** The implem
12660 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
12670 6c 61 74 74 65 72 20 66 69 76 65 20 73 75 62 72  latter five subr
12680 6f 75 74 69 6e 65 73 20 64 65 70 65 6e 64 20 6f  outines depend o
12690 6e 20 77 68 69 63 68 20 0a 2a 2a 20 3c 6f 70 65  n which .** <ope
126a0 72 61 74 6f 72 3e 20 69 73 20 75 73 65 64 3a 0a  rator> is used:.
126b0 2a 2a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  **.**.**        
126c0 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 20 20       UNION ALL  
126d0 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 20 20 20         UNION    
126e0 20 20 20 20 20 20 20 20 45 58 43 45 50 54 20 20          EXCEPT  
126f0 20 20 20 20 20 20 20 20 49 4e 54 45 52 53 45 43          INTERSEC
12700 54 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2d 2d  T.**          --
12710 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d  -----------  ---
12720 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20  --------------  
12730 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20  --------------  
12740 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12750 2d 0a 2a 2a 20 20 20 41 6c 74 42 3a 20 20 20 6f  -.**   AltB:   o
12760 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20  utA, nextA      
12770 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20  outA, nextA     
12780 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20    outA, nextA   
12790 20 20 20 20 20 20 6e 65 78 74 41 0a 2a 2a 0a 2a        nextA.**.*
127a0 2a 20 20 20 41 65 71 42 3a 20 20 20 6f 75 74 41  *   AeqB:   outA
127b0 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20 20 20  , nextA         
127c0 6e 65 78 74 41 20 20 20 20 20 20 20 20 20 20 20  nextA           
127d0 20 20 6e 65 78 74 41 20 20 20 20 20 20 20 20 20    nextA         
127e0 6f 75 74 41 2c 20 6e 65 78 74 41 0a 2a 2a 0a 2a  outA, nextA.**.*
127f0 2a 20 20 20 41 67 74 42 3a 20 20 20 6f 75 74 42  *   AgtB:   outB
12800 2c 20 6e 65 78 74 42 20 20 20 20 20 20 6f 75 74  , nextB      out
12810 42 2c 20 6e 65 78 74 42 20 20 20 20 20 20 20 20  B, nextB        
12820 20 20 6e 65 78 74 42 20 20 20 20 20 20 20 20 20    nextB         
12830 20 20 20 6e 65 78 74 42 0a 2a 2a 0a 2a 2a 20 20     nextB.**.**  
12840 20 45 6f 66 41 3a 20 20 20 6f 75 74 42 2c 20 6e   EofA:   outB, n
12850 65 78 74 42 20 20 20 20 20 20 6f 75 74 42 2c 20  extB      outB, 
12860 6e 65 78 74 42 20 20 20 20 20 20 20 20 20 20 68  nextB          h
12870 61 6c 74 20 20 20 20 20 20 20 20 20 20 20 20 20  alt             
12880 68 61 6c 74 0a 2a 2a 0a 2a 2a 20 20 20 45 6f 66  halt.**.**   Eof
12890 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41  B:   outA, nextA
128a0 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74        outA, next
128b0 41 20 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65  A       outA, ne
128c0 78 74 41 20 20 20 20 20 20 20 20 20 68 61 6c 74  xtA         halt
128d0 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 41 6c  .**.** In the Al
128e0 74 42 2c 20 41 65 71 42 2c 20 61 6e 64 20 41 67  tB, AeqB, and Ag
128f0 74 42 20 73 75 62 72 6f 75 74 69 6e 65 73 2c 20  tB subroutines, 
12900 61 6e 20 45 4f 46 20 6f 6e 20 41 20 66 6f 6c 6c  an EOF on A foll
12910 6f 77 69 6e 67 20 6e 65 78 74 41 0a 2a 2a 20 63  owing nextA.** c
12920 61 75 73 65 73 20 61 6e 20 69 6d 6d 65 64 69 61  auses an immedia
12930 74 65 20 6a 75 6d 70 20 74 6f 20 45 6f 66 41 20  te jump to EofA 
12940 61 6e 64 20 61 6e 20 45 4f 46 20 6f 6e 20 42 20  and an EOF on B 
12950 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78 74 42 20  following nextB 
12960 63 61 75 73 65 73 0a 2a 2a 20 61 6e 20 69 6d 6d  causes.** an imm
12970 65 64 69 61 74 65 20 6a 75 6d 70 20 74 6f 20 45  ediate jump to E
12980 6f 66 42 2e 20 20 57 69 74 68 69 6e 20 45 6f 66  ofB.  Within Eof
12990 41 20 61 6e 64 20 45 6f 66 42 2c 20 61 6e 64 20  A and EofB, and 
129a0 45 4f 46 20 6f 6e 20 65 6e 74 72 79 20 6f 72 0a  EOF on entry or.
129b0 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78  ** following nex
129c0 74 58 20 63 61 75 73 65 73 20 61 20 6a 75 6d 70  tX causes a jump
129d0 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74   to the end of t
129e0 68 65 20 73 65 6c 65 63 74 20 70 72 6f 63 65 73  he select proces
129f0 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 44 75 70 6c  sing..**.** Dupl
12a00 69 63 61 74 65 20 72 65 6d 6f 76 61 6c 20 69 6e  icate removal in
12a10 20 74 68 65 20 55 4e 49 4f 4e 2c 20 45 58 43 45   the UNION, EXCE
12a20 50 54 2c 20 61 6e 64 20 49 4e 54 45 52 53 45 43  PT, and INTERSEC
12a30 54 20 63 61 73 65 73 20 69 73 20 68 61 6e 64 6c  T cases is handl
12a40 65 64 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65  ed.** within the
12a50 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74 69   output subrouti
12a60 6e 65 2e 20 20 54 68 65 20 72 65 67 50 72 65 76  ne.  The regPrev
12a70 20 72 65 67 69 73 74 65 72 20 73 65 74 20 68 6f   register set ho
12a80 6c 64 73 20 74 68 65 20 70 72 65 76 69 6f 75 73  lds the previous
12a90 6c 79 0a 2a 2a 20 6f 75 74 70 75 74 20 76 61 6c  ly.** output val
12aa0 75 65 2e 20 20 41 20 63 6f 6d 70 61 72 69 73 6f  ue.  A compariso
12ab0 6e 20 69 73 20 6d 61 64 65 20 61 67 61 69 6e 73  n is made agains
12ac0 74 20 74 68 69 73 20 76 61 6c 75 65 20 61 6e 64  t this value and
12ad0 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 69   the output.** i
12ae0 73 20 73 6b 69 70 70 65 64 20 69 66 20 74 68 65  s skipped if the
12af0 20 6e 65 78 74 20 72 65 73 75 6c 74 73 20 77 6f   next results wo
12b00 75 6c 64 20 62 65 20 74 68 65 20 73 61 6d 65 20  uld be the same 
12b10 61 73 20 74 68 65 20 70 72 65 76 69 6f 75 73 2e  as the previous.
12b20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65  .**.** The imple
12b30 6d 65 6e 74 61 74 69 6f 6e 20 70 6c 61 6e 20 69  mentation plan i
12b40 73 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  s to implement t
12b50 68 65 20 74 77 6f 20 63 6f 72 6f 75 74 69 6e 65  he two coroutine
12b60 73 20 61 6e 64 20 73 65 76 65 6e 0a 2a 2a 20 73  s and seven.** s
12b70 75 62 72 6f 75 74 69 6e 65 73 20 66 69 72 73 74  ubroutines first
12b80 2c 20 74 68 65 6e 20 70 75 74 20 74 68 65 20 63  , then put the c
12b90 6f 6e 74 72 6f 6c 20 6c 6f 67 69 63 20 61 74 20  ontrol logic at 
12ba0 74 68 65 20 62 6f 74 74 6f 6d 2e 20 20 4c 69 6b  the bottom.  Lik
12bb0 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  e this:.**.**   
12bc0 20 20 20 20 20 20 20 67 6f 74 6f 20 49 6e 69 74         goto Init
12bd0 0a 2a 2a 20 20 20 20 20 63 6f 41 3a 20 63 6f 72  .**     coA: cor
12be0 6f 75 74 69 6e 65 20 66 6f 72 20 6c 65 66 74 20  outine for left 
12bf0 71 75 65 72 79 20 28 41 29 0a 2a 2a 20 20 20 20  query (A).**    
12c00 20 63 6f 42 3a 20 63 6f 72 6f 75 74 69 6e 65 20   coB: coroutine 
12c10 66 6f 72 20 72 69 67 68 74 20 71 75 65 72 79 20  for right query 
12c20 28 42 29 0a 2a 2a 20 20 20 20 6f 75 74 41 3a 20  (B).**    outA: 
12c30 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f 77 20 6f  output one row o
12c40 66 20 41 0a 2a 2a 20 20 20 20 6f 75 74 42 3a 20  f A.**    outB: 
12c50 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f 77 20 6f  output one row o
12c60 66 20 42 20 28 55 4e 49 4f 4e 20 61 6e 64 20 55  f B (UNION and U
12c70 4e 49 4f 4e 20 41 4c 4c 20 6f 6e 6c 79 29 0a 2a  NION ALL only).*
12c80 2a 20 20 20 20 45 6f 66 41 3a 20 2e 2e 2e 0a 2a  *    EofA: ....*
12c90 2a 20 20 20 20 45 6f 66 42 3a 20 2e 2e 2e 0a 2a  *    EofB: ....*
12ca0 2a 20 20 20 20 41 6c 74 42 3a 20 2e 2e 2e 0a 2a  *    AltB: ....*
12cb0 2a 20 20 20 20 41 65 71 42 3a 20 2e 2e 2e 0a 2a  *    AeqB: ....*
12cc0 2a 20 20 20 20 41 67 74 42 3a 20 2e 2e 2e 0a 2a  *    AgtB: ....*
12cd0 2a 20 20 20 20 49 6e 69 74 3a 20 69 6e 69 74 69  *    Init: initi
12ce0 61 6c 69 7a 65 20 63 6f 72 6f 75 74 69 6e 65 20  alize coroutine 
12cf0 72 65 67 69 73 74 65 72 73 0a 2a 2a 20 20 20 20  registers.**    
12d00 20 20 20 20 20 20 79 69 65 6c 64 20 63 6f 41 0a        yield coA.
12d10 2a 2a 20 20 20 20 20 20 20 20 20 20 69 66 20 65  **          if e
12d20 6f 66 28 41 29 20 67 6f 74 6f 20 45 6f 66 41 0a  of(A) goto EofA.
12d30 2a 2a 20 20 20 20 20 20 20 20 20 20 79 69 65 6c  **          yiel
12d40 64 20 63 6f 42 0a 2a 2a 20 20 20 20 20 20 20 20  d coB.**        
12d50 20 20 69 66 20 65 6f 66 28 42 29 20 67 6f 74 6f    if eof(B) goto
12d60 20 45 6f 66 42 0a 2a 2a 20 20 20 20 43 6d 70 72   EofB.**    Cmpr
12d70 3a 20 43 6f 6d 70 61 72 65 20 41 2c 20 42 0a 2a  : Compare A, B.*
12d80 2a 20 20 20 20 20 20 20 20 20 20 4a 75 6d 70 20  *          Jump 
12d90 41 6c 74 42 2c 20 41 65 71 42 2c 20 41 67 74 42  AltB, AeqB, AgtB
12da0 0a 2a 2a 20 20 20 20 20 45 6e 64 3a 20 2e 2e 2e  .**     End: ...
12db0 0a 2a 2a 0a 2a 2a 20 57 65 20 63 61 6c 6c 20 41  .**.** We call A
12dc0 6c 74 42 2c 20 41 65 71 42 2c 20 41 67 74 42 2c  ltB, AeqB, AgtB,
12dd0 20 45 6f 66 41 2c 20 61 6e 64 20 45 6f 66 42 20   EofA, and EofB 
12de0 22 73 75 62 72 6f 75 74 69 6e 65 73 22 20 62 75  "subroutines" bu
12df0 74 20 74 68 65 79 20 61 72 65 20 6e 6f 74 0a 2a  t they are not.*
12e00 2a 20 61 63 74 75 61 6c 6c 79 20 63 61 6c 6c 65  * actually calle
12e10 64 20 75 73 69 6e 67 20 47 6f 73 75 62 20 61 6e  d using Gosub an
12e20 64 20 74 68 65 79 20 64 6f 20 6e 6f 74 20 52 65  d they do not Re
12e30 74 75 72 6e 2e 20 20 45 6f 66 41 20 61 6e 64 20  turn.  EofA and 
12e40 45 6f 66 42 20 6c 6f 6f 70 0a 2a 2a 20 75 6e 74  EofB loop.** unt
12e50 69 6c 20 61 6c 6c 20 64 61 74 61 20 69 73 20 65  il all data is e
12e60 78 68 61 75 73 74 65 64 20 74 68 65 6e 20 6a 75  xhausted then ju
12e70 6d 70 20 74 6f 20 74 68 65 20 22 65 6e 64 22 20  mp to the "end" 
12e80 6c 61 62 65 2e 20 20 41 6c 74 42 2c 20 41 65 71  labe.  AltB, Aeq
12e90 42 2c 0a 2a 2a 20 61 6e 64 20 41 67 74 42 20 6a  B,.** and AgtB j
12ea0 75 6d 70 20 74 6f 20 65 69 74 68 65 72 20 4c 32  ump to either L2
12eb0 20 6f 72 20 74 6f 20 6f 6e 65 20 6f 66 20 45 6f   or to one of Eo
12ec0 66 41 20 6f 72 20 45 6f 66 42 2e 0a 2a 2f 0a 23  fA or EofB..*/.#
12ed0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
12ee0 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  IT_COMPOUND_SELE
12ef0 43 54 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 75  CT.static int mu
12f00 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79  ltiSelectOrderBy
12f10 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
12f20 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72  e,        /* Par
12f30 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
12f40 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
12f50 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
12f60 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c  ight-most of SEL
12f70 45 43 54 73 20 74 6f 20 62 65 20 63 6f 64 65 64  ECTs to be coded
12f80 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74   */.  SelectDest
12f90 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a 20 57   *pDest     /* W
12fa0 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 71  hat to do with q
12fb0 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a  uery results */.
12fc0 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20  ){.  int i, j;  
12fd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
12fe0 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20  op counters */. 
12ff0 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72 3b   Select *pPrior;
13000 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65         /* Anothe
13010 72 20 53 45 4c 45 43 54 20 69 6d 6d 65 64 69 61  r SELECT immedia
13020 74 65 6c 79 20 74 6f 20 6f 75 72 20 6c 65 66 74  tely to our left
13030 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20   */.  Vdbe *v;  
13040 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47              /* G
13050 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
13060 74 68 69 73 20 56 44 42 45 20 2a 2f 0a 20 20 53  this VDBE */.  S
13070 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 41 3b  electDest destA;
13080 20 20 20 20 20 2f 2a 20 44 65 73 74 69 6e 61 74       /* Destinat
13090 69 6f 6e 20 66 6f 72 20 63 6f 72 6f 75 74 69 6e  ion for coroutin
130a0 65 20 41 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  e A */.  SelectD
130b0 65 73 74 20 64 65 73 74 42 3b 20 20 20 20 20 2f  est destB;     /
130c0 2a 20 44 65 73 74 69 6e 61 74 69 6f 6e 20 66 6f  * Destination fo
130d0 72 20 63 6f 72 6f 75 74 69 6e 65 20 42 20 2a 2f  r coroutine B */
130e0 0a 20 20 69 6e 74 20 72 65 67 41 64 64 72 41 3b  .  int regAddrA;
130f0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
13100 65 73 73 20 72 65 67 69 73 74 65 72 20 66 6f 72  ess register for
13110 20 73 65 6c 65 63 74 2d 41 20 63 6f 72 6f 75 74   select-A corout
13120 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ine */.  int reg
13130 45 6f 66 41 3b 20 20 20 20 20 20 20 20 20 20 2f  EofA;          /
13140 2a 20 46 6c 61 67 20 74 6f 20 69 6e 64 69 63 61  * Flag to indica
13150 74 65 20 77 68 65 6e 20 73 65 6c 65 63 74 2d 41  te when select-A
13160 20 69 73 20 63 6f 6d 70 6c 65 74 65 20 2a 2f 0a   is complete */.
13170 20 20 69 6e 74 20 72 65 67 41 64 64 72 42 3b 20    int regAddrB; 
13180 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
13190 73 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20  ss register for 
131a0 73 65 6c 65 63 74 2d 42 20 63 6f 72 6f 75 74 69  select-B corouti
131b0 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 45  ne */.  int regE
131c0 6f 66 42 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ofB;          /*
131d0 20 46 6c 61 67 20 74 6f 20 69 6e 64 69 63 61 74   Flag to indicat
131e0 65 20 77 68 65 6e 20 73 65 6c 65 63 74 2d 42 20  e when select-B 
131f0 69 73 20 63 6f 6d 70 6c 65 74 65 20 2a 2f 0a 20  is complete */. 
13200 20 69 6e 74 20 61 64 64 72 53 65 6c 65 63 74 41   int addrSelectA
13210 3b 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73  ;      /* Addres
13220 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d  s of the select-
13230 41 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20  A coroutine */. 
13240 20 69 6e 74 20 61 64 64 72 53 65 6c 65 63 74 42   int addrSelectB
13250 3b 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73  ;      /* Addres
13260 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d  s of the select-
13270 42 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20  B coroutine */. 
13280 20 69 6e 74 20 72 65 67 4f 75 74 41 3b 20 20 20   int regOutA;   
13290 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
132a0 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 74  s register for t
132b0 68 65 20 6f 75 74 70 75 74 2d 41 20 73 75 62 72  he output-A subr
132c0 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
132d0 72 65 67 4f 75 74 42 3b 20 20 20 20 20 20 20 20  regOutB;        
132e0 20 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67    /* Address reg
132f0 69 73 74 65 72 20 66 6f 72 20 74 68 65 20 6f 75  ister for the ou
13300 74 70 75 74 2d 42 20 73 75 62 72 6f 75 74 69 6e  tput-B subroutin
13310 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 4f  e */.  int addrO
13320 75 74 41 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  utA;         /* 
13330 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6f  Address of the o
13340 75 74 70 75 74 2d 41 20 73 75 62 72 6f 75 74 69  utput-A subrouti
13350 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ne */.  int addr
13360 4f 75 74 42 20 3d 20 30 3b 20 20 20 20 20 2f 2a  OutB = 0;     /*
13370 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
13380 6f 75 74 70 75 74 2d 42 20 73 75 62 72 6f 75 74  output-B subrout
13390 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ine */.  int add
133a0 72 45 6f 66 41 3b 20 20 20 20 20 20 20 20 20 2f  rEofA;         /
133b0 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
133c0 20 73 65 6c 65 63 74 2d 41 2d 65 78 68 61 75 73   select-A-exhaus
133d0 74 65 64 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  ted subroutine *
133e0 2f 0a 20 20 69 6e 74 20 61 64 64 72 45 6f 66 42  /.  int addrEofB
133f0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64  ;         /* Add
13400 72 65 73 73 20 6f 66 20 74 68 65 20 73 65 6c 65  ress of the sele
13410 63 74 2d 42 2d 65 78 68 61 75 73 74 65 64 20 73  ct-B-exhausted s
13420 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  ubroutine */.  i
13430 6e 74 20 61 64 64 72 41 6c 74 42 3b 20 20 20 20  nt addrAltB;    
13440 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
13450 6f 66 20 74 68 65 20 41 3c 42 20 73 75 62 72 6f  of the A<B subro
13460 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61  utine */.  int a
13470 64 64 72 41 65 71 42 3b 20 20 20 20 20 20 20 20  ddrAeqB;        
13480 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
13490 68 65 20 41 3d 3d 42 20 73 75 62 72 6f 75 74 69  he A==B subrouti
134a0 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ne */.  int addr
134b0 41 67 74 42 3b 20 20 20 20 20 20 20 20 20 2f 2a  AgtB;         /*
134c0 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
134d0 41 3e 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  A>B subroutine *
134e0 2f 0a 20 20 69 6e 74 20 72 65 67 4c 69 6d 69 74  /.  int regLimit
134f0 41 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6d  A;        /* Lim
13500 69 74 20 72 65 67 69 73 74 65 72 20 66 6f 72 20  it register for 
13510 73 65 6c 65 63 74 2d 41 20 2a 2f 0a 20 20 69 6e  select-A */.  in
13520 74 20 72 65 67 4c 69 6d 69 74 42 3b 20 20 20 20  t regLimitB;    
13530 20 20 20 20 2f 2a 20 4c 69 6d 69 74 20 72 65 67      /* Limit reg
13540 69 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74  ister for select
13550 2d 41 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 50  -A */.  int regP
13560 72 65 76 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  rev;          /*
13570 20 41 20 72 61 6e 67 65 20 6f 66 20 72 65 67 69   A range of regi
13580 73 74 65 72 73 20 74 6f 20 68 6f 6c 64 20 70 72  sters to hold pr
13590 65 76 69 6f 75 73 20 6f 75 74 70 75 74 20 2a 2f  evious output */
135a0 0a 20 20 69 6e 74 20 73 61 76 65 64 4c 69 6d 69  .  int savedLimi
135b0 74 3b 20 20 20 20 20 20 20 2f 2a 20 53 61 76 65  t;       /* Save
135c0 64 20 76 61 6c 75 65 20 6f 66 20 70 2d 3e 69 4c  d value of p->iL
135d0 69 6d 69 74 20 2a 2f 0a 20 20 69 6e 74 20 73 61  imit */.  int sa
135e0 76 65 64 4f 66 66 73 65 74 3b 20 20 20 20 20 20  vedOffset;      
135f0 2f 2a 20 53 61 76 65 64 20 76 61 6c 75 65 20 6f  /* Saved value o
13600 66 20 70 2d 3e 69 4f 66 66 73 65 74 20 2a 2f 0a  f p->iOffset */.
13610 20 20 69 6e 74 20 6c 61 62 65 6c 43 6d 70 72 3b    int labelCmpr;
13620 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 62 65 6c          /* Label
13630 20 66 6f 72 20 74 68 65 20 73 74 61 72 74 20 6f   for the start o
13640 66 20 74 68 65 20 6d 65 72 67 65 20 61 6c 67 6f  f the merge algo
13650 72 69 74 68 6d 20 2a 2f 0a 20 20 69 6e 74 20 6c  rithm */.  int l
13660 61 62 65 6c 45 6e 64 3b 20 20 20 20 20 20 20 20  abelEnd;        
13670 20 2f 2a 20 4c 61 62 65 6c 20 66 6f 72 20 74 68   /* Label for th
13680 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 76 65  e end of the ove
13690 72 61 6c 6c 20 53 45 4c 45 43 54 20 73 74 6d 74  rall SELECT stmt
136a0 20 2a 2f 0a 20 20 69 6e 74 20 6a 31 3b 20 20 20   */.  int j1;   
136b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a              /* J
136c0 75 6d 70 20 69 6e 73 74 72 75 63 74 69 6f 6e 73  ump instructions
136d0 20 74 68 61 74 20 67 65 74 20 72 65 74 61 72 67   that get retarg
136e0 65 74 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  etted */.  int o
136f0 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
13700 20 2f 2a 20 4f 6e 65 20 6f 66 20 54 4b 5f 41 4c   /* One of TK_AL
13710 4c 2c 20 54 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f  L, TK_UNION, TK_
13720 45 58 43 45 50 54 2c 20 54 4b 5f 49 4e 54 45 52  EXCEPT, TK_INTER
13730 53 45 43 54 20 2a 2f 0a 20 20 4b 65 79 49 6e 66  SECT */.  KeyInf
13740 6f 20 2a 70 4b 65 79 44 75 70 20 3d 20 30 3b 20  o *pKeyDup = 0; 
13750 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20 69 6e  /* Comparison in
13760 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 64 75  formation for du
13770 70 6c 69 63 61 74 65 20 72 65 6d 6f 76 61 6c 20  plicate removal 
13780 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  */.  KeyInfo *pK
13790 65 79 4d 65 72 67 65 3b 20 20 20 2f 2a 20 43 6f  eyMerge;   /* Co
137a0 6d 70 61 72 69 73 6f 6e 20 69 6e 66 6f 72 6d 61  mparison informa
137b0 74 69 6f 6e 20 66 6f 72 20 6d 65 72 67 69 6e 67  tion for merging
137c0 20 72 6f 77 73 20 2a 2f 0a 20 20 73 71 6c 69 74   rows */.  sqlit
137d0 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20  e3 *db;         
137e0 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
137f0 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70  nection */.  Exp
13800 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 3b  rList *pOrderBy;
13810 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20     /* The ORDER 
13820 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69  BY clause */.  i
13830 6e 74 20 6e 4f 72 64 65 72 42 79 3b 20 20 20 20  nt nOrderBy;    
13840 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
13850 66 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 4f  f terms in the O
13860 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a  RDER BY clause *
13870 2f 0a 20 20 69 6e 74 20 2a 61 50 65 72 6d 75 74  /.  int *aPermut
13880 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 70  e;        /* Map
13890 70 69 6e 67 20 66 72 6f 6d 20 4f 52 44 45 52 20  ping from ORDER 
138a0 42 59 20 74 65 72 6d 73 20 74 6f 20 72 65 73 75  BY terms to resu
138b0 6c 74 20 73 65 74 20 63 6f 6c 75 6d 6e 73 20 2a  lt set columns *
138c0 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
138d0 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20  _OMIT_EXPLAIN.  
138e0 69 6e 74 20 69 53 75 62 31 3b 20 20 20 20 20 20  int iSub1;      
138f0 20 20 20 20 20 20 2f 2a 20 45 51 50 20 69 64 20        /* EQP id 
13900 6f 66 20 6c 65 66 74 2d 68 61 6e 64 20 71 75 65  of left-hand que
13910 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62  ry */.  int iSub
13920 32 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  2;            /*
13930 20 45 51 50 20 69 64 20 6f 66 20 72 69 67 68 74   EQP id of right
13940 2d 68 61 6e 64 20 71 75 65 72 79 20 2a 2f 0a 23  -hand query */.#
13950 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
13960 20 70 2d 3e 70 4f 72 64 65 72 42 79 21 3d 30 20   p->pOrderBy!=0 
13970 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65  );.  assert( pKe
13980 79 44 75 70 3d 3d 30 20 29 3b 20 2f 2a 20 22 4d  yDup==0 ); /* "M
13990 61 6e 61 67 65 64 22 20 63 6f 64 65 20 6e 65 65  anaged" code nee
139a0 64 73 20 74 68 69 73 2e 20 20 54 69 63 6b 65 74  ds this.  Ticket
139b0 20 23 33 33 38 32 2e 20 2a 2f 0a 20 20 64 62 20   #3382. */.  db 
139c0 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
139d0 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
139e0 65 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d  e;.  assert( v!=
139f0 30 20 29 3b 20 20 20 20 20 20 20 2f 2a 20 41 6c  0 );       /* Al
13a00 72 65 61 64 79 20 74 68 72 6f 77 6e 20 74 68 65  ready thrown the
13a10 20 65 72 72 6f 72 20 69 66 20 56 44 42 45 20 61   error if VDBE a
13a20 6c 6c 6f 63 20 66 61 69 6c 65 64 20 2a 2f 0a 20  lloc failed */. 
13a30 20 6c 61 62 65 6c 45 6e 64 20 3d 20 73 71 6c 69   labelEnd = sqli
13a40 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
13a50 28 76 29 3b 0a 20 20 6c 61 62 65 6c 43 6d 70 72  (v);.  labelCmpr
13a60 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
13a70 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 0a 20 20  keLabel(v);...  
13a80 2f 2a 20 50 61 74 63 68 20 75 70 20 74 68 65 20  /* Patch up the 
13a90 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 0a  ORDER BY clause.
13aa0 20 20 2a 2f 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f    */.  op = p->o
13ab0 70 3b 20 20 0a 20 20 70 50 72 69 6f 72 20 3d 20  p;  .  pPrior = 
13ac0 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 61 73 73  p->pPrior;.  ass
13ad0 65 72 74 28 20 70 50 72 69 6f 72 2d 3e 70 4f 72  ert( pPrior->pOr
13ae0 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20 70 4f  derBy==0 );.  pO
13af0 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64  rderBy = p->pOrd
13b00 65 72 42 79 3b 0a 20 20 61 73 73 65 72 74 28 20  erBy;.  assert( 
13b10 70 4f 72 64 65 72 42 79 20 29 3b 0a 20 20 6e 4f  pOrderBy );.  nO
13b20 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42  rderBy = pOrderB
13b30 79 2d 3e 6e 45 78 70 72 3b 0a 0a 20 20 2f 2a 20  y->nExpr;..  /* 
13b40 46 6f 72 20 6f 70 65 72 61 74 6f 72 73 20 6f 74  For operators ot
13b50 68 65 72 20 74 68 61 6e 20 55 4e 49 4f 4e 20 41  her than UNION A
13b60 4c 4c 20 77 65 20 68 61 76 65 20 74 6f 20 6d 61  LL we have to ma
13b70 6b 65 20 73 75 72 65 20 74 68 61 74 0a 20 20 2a  ke sure that.  *
13b80 2a 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  * the ORDER BY c
13b90 6c 61 75 73 65 20 63 6f 76 65 72 73 20 65 76 65  lause covers eve
13ba0 72 79 20 74 65 72 6d 20 6f 66 20 74 68 65 20 72  ry term of the r
13bb0 65 73 75 6c 74 20 73 65 74 2e 20 20 41 64 64 0a  esult set.  Add.
13bc0 20 20 2a 2a 20 74 65 72 6d 73 20 74 6f 20 74 68    ** terms to th
13bd0 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
13be0 65 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e 0a  e as necessary..
13bf0 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 21 3d 54    */.  if( op!=T
13c00 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 66 6f 72  K_ALL ){.    for
13c10 28 69 3d 31 3b 20 64 62 2d 3e 6d 61 6c 6c 6f 63  (i=1; db->malloc
13c20 46 61 69 6c 65 64 3d 3d 30 20 26 26 20 69 3c 3d  Failed==0 && i<=
13c30 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
13c40 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74  ; i++){.      st
13c50 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
13c60 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20  em *pItem;.     
13c70 20 66 6f 72 28 6a 3d 30 2c 20 70 49 74 65 6d 3d   for(j=0, pItem=
13c80 70 4f 72 64 65 72 42 79 2d 3e 61 3b 20 6a 3c 6e  pOrderBy->a; j<n
13c90 4f 72 64 65 72 42 79 3b 20 6a 2b 2b 2c 20 70 49  OrderBy; j++, pI
13ca0 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  tem++){.        
13cb0 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 69  assert( pItem->i
13cc0 4f 72 64 65 72 42 79 43 6f 6c 3e 30 20 29 3b 0a  OrderByCol>0 );.
13cd0 20 20 20 20 20 20 20 20 69 66 28 20 70 49 74 65          if( pIte
13ce0 6d 2d 3e 69 4f 72 64 65 72 42 79 43 6f 6c 3d 3d  m->iOrderByCol==
13cf0 69 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  i ) break;.     
13d00 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3d 3d   }.      if( j==
13d10 6e 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  nOrderBy ){.    
13d20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 20 3d      Expr *pNew =
13d30 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c   sqlite3Expr(db,
13d40 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20 30 29 3b   TK_INTEGER, 0);
13d50 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65  .        if( pNe
13d60 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  w==0 ) return SQ
13d70 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
13d80 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20      pNew->flags 
13d90 7c 3d 20 45 50 5f 49 6e 74 56 61 6c 75 65 3b 0a  |= EP_IntValue;.
13da0 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e          pNew->u.
13db0 69 56 61 6c 75 65 20 3d 20 69 3b 0a 20 20 20 20  iValue = i;.    
13dc0 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20 73      pOrderBy = s
13dd0 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
13de0 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70 4f 72  pend(pParse, pOr
13df0 64 65 72 42 79 2c 20 70 4e 65 77 29 3b 0a 20 20  derBy, pNew);.  
13e00 20 20 20 20 20 20 69 66 28 20 70 4f 72 64 65 72        if( pOrder
13e10 42 79 20 29 20 70 4f 72 64 65 72 42 79 2d 3e 61  By ) pOrderBy->a
13e20 5b 6e 4f 72 64 65 72 42 79 2b 2b 5d 2e 69 4f 72  [nOrderBy++].iOr
13e30 64 65 72 42 79 43 6f 6c 20 3d 20 28 75 31 36 29  derByCol = (u16)
13e40 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  i;.      }.    }
13e50 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75  .  }..  /* Compu
13e60 74 65 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  te the compariso
13e70 6e 20 70 65 72 6d 75 74 61 74 69 6f 6e 20 61 6e  n permutation an
13e80 64 20 6b 65 79 69 6e 66 6f 20 74 68 61 74 20 69  d keyinfo that i
13e90 73 20 75 73 65 64 20 77 69 74 68 0a 20 20 2a 2a  s used with.  **
13ea0 20 74 68 65 20 70 65 72 6d 75 74 61 74 69 6f 6e   the permutation
13eb0 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69   used to determi
13ec0 6e 65 20 69 66 20 74 68 65 20 6e 65 78 74 0a 20  ne if the next. 
13ed0 20 2a 2a 20 72 6f 77 20 6f 66 20 72 65 73 75 6c   ** row of resul
13ee0 74 73 20 63 6f 6d 65 73 20 66 72 6f 6d 20 73 65  ts comes from se
13ef0 6c 65 63 74 41 20 6f 72 20 73 65 6c 65 63 74 42  lectA or selectB
13f00 2e 20 20 41 6c 73 6f 20 61 64 64 20 65 78 70 6c  .  Also add expl
13f10 69 63 69 74 0a 20 20 2a 2a 20 63 6f 6c 6c 61 74  icit.  ** collat
13f20 69 6f 6e 73 20 74 6f 20 74 68 65 20 4f 52 44 45  ions to the ORDE
13f30 52 20 42 59 20 63 6c 61 75 73 65 20 74 65 72 6d  R BY clause term
13f40 73 20 73 6f 20 74 68 61 74 20 77 68 65 6e 20 74  s so that when t
13f50 68 65 20 73 75 62 71 75 65 72 69 65 73 0a 20 20  he subqueries.  
13f60 2a 2a 20 74 6f 20 74 68 65 20 72 69 67 68 74 20  ** to the right 
13f70 61 6e 64 20 74 68 65 20 6c 65 66 74 20 61 72 65  and the left are
13f80 20 65 76 61 6c 75 61 74 65 64 2c 20 74 68 65 79   evaluated, they
13f90 20 75 73 65 20 74 68 65 20 63 6f 72 72 65 63 74   use the correct
13fa0 0a 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 2e  .  ** collation.
13fb0 0a 20 20 2a 2f 0a 20 20 61 50 65 72 6d 75 74 65  .  */.  aPermute
13fc0 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
13fd0 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66  ocRaw(db, sizeof
13fe0 28 69 6e 74 29 2a 6e 4f 72 64 65 72 42 79 29 3b  (int)*nOrderBy);
13ff0 0a 20 20 69 66 28 20 61 50 65 72 6d 75 74 65 20  .  if( aPermute 
14000 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78  ){.    struct Ex
14010 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
14020 65 6d 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c  em;.    for(i=0,
14030 20 70 49 74 65 6d 3d 70 4f 72 64 65 72 42 79 2d   pItem=pOrderBy-
14040 3e 61 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20  >a; i<nOrderBy; 
14050 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i++, pItem++){. 
14060 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74       assert( pIt
14070 65 6d 2d 3e 69 4f 72 64 65 72 42 79 43 6f 6c 3e  em->iOrderByCol>
14080 30 20 20 26 26 20 70 49 74 65 6d 2d 3e 69 4f 72  0  && pItem->iOr
14090 64 65 72 42 79 43 6f 6c 3c 3d 70 2d 3e 70 45 4c  derByCol<=p->pEL
140a0 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20  ist->nExpr );.  
140b0 20 20 20 20 61 50 65 72 6d 75 74 65 5b 69 5d 20      aPermute[i] 
140c0 3d 20 70 49 74 65 6d 2d 3e 69 4f 72 64 65 72 42  = pItem->iOrderB
140d0 79 43 6f 6c 20 2d 20 31 3b 0a 20 20 20 20 7d 0a  yCol - 1;.    }.
140e0 20 20 20 20 70 4b 65 79 4d 65 72 67 65 20 3d 20      pKeyMerge = 
140f0 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c  sqlite3KeyInfoAl
14100 6c 6f 63 28 64 62 2c 20 6e 4f 72 64 65 72 42 79  loc(db, nOrderBy
14110 29 3b 0a 20 20 20 20 69 66 28 20 70 4b 65 79 4d  );.    if( pKeyM
14120 65 72 67 65 20 29 7b 0a 20 20 20 20 20 20 66 6f  erge ){.      fo
14130 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42  r(i=0; i<nOrderB
14140 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  y; i++){.       
14150 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
14160 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70  .        Expr *p
14170 54 65 72 6d 20 3d 20 70 4f 72 64 65 72 42 79 2d  Term = pOrderBy-
14180 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
14190 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e       if( pTerm->
141a0 66 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61  flags & EP_Colla
141b0 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  te ){.          
141c0 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
141d0 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
141e0 65 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20 20 20  e, pTerm);.     
141f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
14200 20 20 20 20 70 43 6f 6c 6c 20 3d 20 6d 75 6c 74      pColl = mult
14210 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70  iSelectCollSeq(p
14220 50 61 72 73 65 2c 20 70 2c 20 61 50 65 72 6d 75  Parse, p, aPermu
14230 74 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  te[i]);.        
14240 20 20 69 66 28 20 70 43 6f 6c 6c 3d 3d 30 20 29    if( pColl==0 )
14250 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66   pColl = db->pDf
14260 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20  ltColl;.        
14270 20 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d    pOrderBy->a[i]
14280 2e 70 45 78 70 72 20 3d 0a 20 20 20 20 20 20 20  .pExpr =.       
14290 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
142a0 72 41 64 64 43 6f 6c 6c 61 74 65 53 74 72 69 6e  rAddCollateStrin
142b0 67 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2c  g(pParse, pTerm,
142c0 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a   pColl->zName);.
142d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
142e0 20 20 70 4b 65 79 4d 65 72 67 65 2d 3e 61 43 6f    pKeyMerge->aCo
142f0 6c 6c 5b 69 5d 20 3d 20 70 43 6f 6c 6c 3b 0a 20  ll[i] = pColl;. 
14300 20 20 20 20 20 20 20 70 4b 65 79 4d 65 72 67 65         pKeyMerge
14310 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20  ->aSortOrder[i] 
14320 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  = pOrderBy->a[i]
14330 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20  .sortOrder;.    
14340 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73    }.    }.  }els
14350 65 7b 0a 20 20 20 20 70 4b 65 79 4d 65 72 67 65  e{.    pKeyMerge
14360 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 0;.  }..  /* 
14370 52 65 61 74 74 61 63 68 20 74 68 65 20 4f 52 44  Reattach the ORD
14380 45 52 20 42 59 20 63 6c 61 75 73 65 20 74 6f 20  ER BY clause to 
14390 74 68 65 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a  the query..  */.
143a0 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20    p->pOrderBy = 
143b0 70 4f 72 64 65 72 42 79 3b 0a 20 20 70 50 72 69  pOrderBy;.  pPri
143c0 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 73  or->pOrderBy = s
143d0 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
143e0 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4f  p(pParse->db, pO
143f0 72 64 65 72 42 79 2c 20 30 29 3b 0a 0a 20 20 2f  rderBy, 0);..  /
14400 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 72 61 6e  * Allocate a ran
14410 67 65 20 6f 66 20 74 65 6d 70 6f 72 61 72 79 20  ge of temporary 
14420 72 65 67 69 73 74 65 72 73 20 61 6e 64 20 74 68  registers and th
14430 65 20 4b 65 79 49 6e 66 6f 20 6e 65 65 64 65 64  e KeyInfo needed
14440 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 6c 6f  .  ** for the lo
14450 67 69 63 20 74 68 61 74 20 72 65 6d 6f 76 65 73  gic that removes
14460 20 64 75 70 6c 69 63 61 74 65 20 72 65 73 75 6c   duplicate resul
14470 74 20 72 6f 77 73 20 77 68 65 6e 20 74 68 65 0a  t rows when the.
14480 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72 20 69 73    ** operator is
14490 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20   UNION, EXCEPT, 
144a0 6f 72 20 49 4e 54 45 52 53 45 43 54 20 28 62 75  or INTERSECT (bu
144b0 74 20 6e 6f 74 20 55 4e 49 4f 4e 20 41 4c 4c 29  t not UNION ALL)
144c0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d  ..  */.  if( op=
144d0 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 72  =TK_ALL ){.    r
144e0 65 67 50 72 65 76 20 3d 20 30 3b 0a 20 20 7d 65  egPrev = 0;.  }e
144f0 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 45 78  lse{.    int nEx
14500 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  pr = p->pEList->
14510 6e 45 78 70 72 3b 0a 20 20 20 20 61 73 73 65 72  nExpr;.    asser
14520 74 28 20 6e 4f 72 64 65 72 42 79 3e 3d 6e 45 78  t( nOrderBy>=nEx
14530 70 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  pr || db->malloc
14540 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 72 65  Failed );.    re
14550 67 50 72 65 76 20 3d 20 70 50 61 72 73 65 2d 3e  gPrev = pParse->
14560 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72  nMem+1;.    pPar
14570 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 45 78 70  se->nMem += nExp
14580 72 2b 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  r+1;.    sqlite3
14590 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
145a0 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67  _Integer, 0, reg
145b0 50 72 65 76 29 3b 0a 20 20 20 20 70 4b 65 79 44  Prev);.    pKeyD
145c0 75 70 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49  up = sqlite3KeyI
145d0 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e 45 78  nfoAlloc(db, nEx
145e0 70 72 29 3b 0a 20 20 20 20 69 66 28 20 70 4b 65  pr);.    if( pKe
145f0 79 44 75 70 20 29 7b 0a 20 20 20 20 20 20 66 6f  yDup ){.      fo
14600 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72 3b 20  r(i=0; i<nExpr; 
14610 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 4b  i++){.        pK
14620 65 79 44 75 70 2d 3e 61 43 6f 6c 6c 5b 69 5d 20  eyDup->aColl[i] 
14630 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c  = multiSelectCol
14640 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 2c 20  lSeq(pParse, p, 
14650 69 29 3b 0a 20 20 20 20 20 20 20 20 70 4b 65 79  i);.        pKey
14660 44 75 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  Dup->aSortOrder[
14670 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  i] = 0;.      }.
14680 20 20 20 20 7d 0a 20 20 7d 0a 20 0a 20 20 2f 2a      }.  }. .  /*
14690 20 53 65 70 61 72 61 74 65 20 74 68 65 20 6c 65   Separate the le
146a0 66 74 20 61 6e 64 20 74 68 65 20 72 69 67 68 74  ft and the right
146b0 20 71 75 65 72 79 20 66 72 6f 6d 20 6f 6e 65 20   query from one 
146c0 61 6e 6f 74 68 65 72 0a 20 20 2a 2f 0a 20 20 70  another.  */.  p
146d0 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20  ->pPrior = 0;.  
146e0 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 4f 72  sqlite3ResolveOr
146f0 64 65 72 47 72 6f 75 70 42 79 28 70 50 61 72 73  derGroupBy(pPars
14700 65 2c 20 70 2c 20 70 2d 3e 70 4f 72 64 65 72 42  e, p, p->pOrderB
14710 79 2c 20 22 4f 52 44 45 52 22 29 3b 0a 20 20 69  y, "ORDER");.  i
14720 66 28 20 70 50 72 69 6f 72 2d 3e 70 50 72 69 6f  f( pPrior->pPrio
14730 72 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  r==0 ){.    sqli
14740 74 65 33 52 65 73 6f 6c 76 65 4f 72 64 65 72 47  te3ResolveOrderG
14750 72 6f 75 70 42 79 28 70 50 61 72 73 65 2c 20 70  roupBy(pParse, p
14760 50 72 69 6f 72 2c 20 70 50 72 69 6f 72 2d 3e 70  Prior, pPrior->p
14770 4f 72 64 65 72 42 79 2c 20 22 4f 52 44 45 52 22  OrderBy, "ORDER"
14780 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d  );.  }..  /* Com
14790 70 75 74 65 20 74 68 65 20 6c 69 6d 69 74 20 72  pute the limit r
147a0 65 67 69 73 74 65 72 73 20 2a 2f 0a 20 20 63 6f  egisters */.  co
147b0 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74  mputeLimitRegist
147c0 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20 6c  ers(pParse, p, l
147d0 61 62 65 6c 45 6e 64 29 3b 0a 20 20 69 66 28 20  abelEnd);.  if( 
147e0 70 2d 3e 69 4c 69 6d 69 74 20 26 26 20 6f 70 3d  p->iLimit && op=
147f0 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 72  =TK_ALL ){.    r
14800 65 67 4c 69 6d 69 74 41 20 3d 20 2b 2b 70 50 61  egLimitA = ++pPa
14810 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72  rse->nMem;.    r
14820 65 67 4c 69 6d 69 74 42 20 3d 20 2b 2b 70 50 61  egLimitB = ++pPa
14830 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73  rse->nMem;.    s
14840 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
14850 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 70 2d 3e  (v, OP_Copy, p->
14860 69 4f 66 66 73 65 74 20 3f 20 70 2d 3e 69 4f 66  iOffset ? p->iOf
14870 66 73 65 74 2b 31 20 3a 20 70 2d 3e 69 4c 69 6d  fset+1 : p->iLim
14880 69 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  it,.            
14890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
148a0 20 20 20 20 20 20 72 65 67 4c 69 6d 69 74 41 29        regLimitA)
148b0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
148c0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f  eAddOp2(v, OP_Co
148d0 70 79 2c 20 72 65 67 4c 69 6d 69 74 41 2c 20 72  py, regLimitA, r
148e0 65 67 4c 69 6d 69 74 42 29 3b 0a 20 20 7d 65 6c  egLimitB);.  }el
148f0 73 65 7b 0a 20 20 20 20 72 65 67 4c 69 6d 69 74  se{.    regLimit
14900 41 20 3d 20 72 65 67 4c 69 6d 69 74 42 20 3d 20  A = regLimitB = 
14910 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  0;.  }.  sqlite3
14920 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
14930 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 70 2d 3e  ->pLimit);.  p->
14940 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 73 71  pLimit = 0;.  sq
14950 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
14960 64 62 2c 20 70 2d 3e 70 4f 66 66 73 65 74 29 3b  db, p->pOffset);
14970 0a 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20  .  p->pOffset = 
14980 30 3b 0a 0a 20 20 72 65 67 41 64 64 72 41 20 3d  0;..  regAddrA =
14990 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
149a0 0a 20 20 72 65 67 45 6f 66 41 20 3d 20 2b 2b 70  .  regEofA = ++p
149b0 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72  Parse->nMem;.  r
149c0 65 67 41 64 64 72 42 20 3d 20 2b 2b 70 50 61 72  egAddrB = ++pPar
149d0 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 45  se->nMem;.  regE
149e0 6f 66 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  ofB = ++pParse->
149f0 6e 4d 65 6d 3b 0a 20 20 72 65 67 4f 75 74 41 20  nMem;.  regOutA 
14a00 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
14a10 3b 0a 20 20 72 65 67 4f 75 74 42 20 3d 20 2b 2b  ;.  regOutB = ++
14a20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
14a30 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73  sqlite3SelectDes
14a40 74 49 6e 69 74 28 26 64 65 73 74 41 2c 20 53 52  tInit(&destA, SR
14a50 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67  T_Coroutine, reg
14a60 41 64 64 72 41 29 3b 0a 20 20 73 71 6c 69 74 65  AddrA);.  sqlite
14a70 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28  3SelectDestInit(
14a80 26 64 65 73 74 42 2c 20 53 52 54 5f 43 6f 72 6f  &destB, SRT_Coro
14a90 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72 42 29  utine, regAddrB)
14aa0 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 70 61 73  ;..  /* Jump pas
14ab0 74 20 74 68 65 20 76 61 72 69 6f 75 73 20 73 75  t the various su
14ac0 62 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 63 6f  broutines and co
14ad0 72 6f 75 74 69 6e 65 73 20 74 6f 20 74 68 65 20  routines to the 
14ae0 6d 61 69 6e 0a 20 20 2a 2a 20 6d 65 72 67 65 20  main.  ** merge 
14af0 6c 6f 6f 70 0a 20 20 2a 2f 0a 20 20 6a 31 20 3d  loop.  */.  j1 =
14b00 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14b10 70 30 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a  p0(v, OP_Goto);.
14b20 20 20 61 64 64 72 53 65 6c 65 63 74 41 20 3d 20    addrSelectA = 
14b30 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
14b40 6e 74 41 64 64 72 28 76 29 3b 0a 0a 0a 20 20 2f  ntAddr(v);...  /
14b50 2a 20 47 65 6e 65 72 61 74 65 20 61 20 63 6f 72  * Generate a cor
14b60 6f 75 74 69 6e 65 20 74 6f 20 65 76 61 6c 75 61  outine to evalua
14b70 74 65 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  te the SELECT st
14b80 61 74 65 6d 65 6e 74 20 74 6f 20 74 68 65 0a 20  atement to the. 
14b90 20 2a 2a 20 6c 65 66 74 20 6f 66 20 74 68 65 20   ** left of the 
14ba0 63 6f 6d 70 6f 75 6e 64 20 6f 70 65 72 61 74 6f  compound operato
14bb0 72 20 2d 20 74 68 65 20 22 41 22 20 73 65 6c 65  r - the "A" sele
14bc0 63 74 2e 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e  ct..  */.  VdbeN
14bd0 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  oopComment((v, "
14be0 42 65 67 69 6e 20 63 6f 72 6f 75 74 69 6e 65 20  Begin coroutine 
14bf0 66 6f 72 20 6c 65 66 74 20 53 45 4c 45 43 54 22  for left SELECT"
14c00 29 29 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 69 4c  ));.  pPrior->iL
14c10 69 6d 69 74 20 3d 20 72 65 67 4c 69 6d 69 74 41  imit = regLimitA
14c20 3b 0a 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e  ;.  explainSetIn
14c30 74 65 67 65 72 28 69 53 75 62 31 2c 20 70 50 61  teger(iSub1, pPa
14c40 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74  rse->iNextSelect
14c50 49 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  Id);.  sqlite3Se
14c60 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50 72  lect(pParse, pPr
14c70 69 6f 72 2c 20 26 64 65 73 74 41 29 3b 0a 20 20  ior, &destA);.  
14c80 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14c90 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
14ca0 20 31 2c 20 72 65 67 45 6f 66 41 29 3b 0a 20 20   1, regEofA);.  
14cb0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14cc0 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72  1(v, OP_Yield, r
14cd0 65 67 41 64 64 72 41 29 3b 0a 20 20 56 64 62 65  egAddrA);.  Vdbe
14ce0 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  NoopComment((v, 
14cf0 22 45 6e 64 20 63 6f 72 6f 75 74 69 6e 65 20 66  "End coroutine f
14d00 6f 72 20 6c 65 66 74 20 53 45 4c 45 43 54 22 29  or left SELECT")
14d10 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  );..  /* Generat
14d20 65 20 61 20 63 6f 72 6f 75 74 69 6e 65 20 74 6f  e a coroutine to
14d30 20 65 76 61 6c 75 61 74 65 20 74 68 65 20 53 45   evaluate the SE
14d40 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 6f  LECT statement o
14d50 6e 20 0a 20 20 2a 2a 20 74 68 65 20 72 69 67 68  n .  ** the righ
14d60 74 20 2d 20 74 68 65 20 22 42 22 20 73 65 6c 65  t - the "B" sele
14d70 63 74 0a 20 20 2a 2f 0a 20 20 61 64 64 72 53 65  ct.  */.  addrSe
14d80 6c 65 63 74 42 20 3d 20 73 71 6c 69 74 65 33 56  lectB = sqlite3V
14d90 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
14da0 29 3b 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d  );.  VdbeNoopCom
14db0 6d 65 6e 74 28 28 76 2c 20 22 42 65 67 69 6e 20  ment((v, "Begin 
14dc0 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20 72 69  coroutine for ri
14dd0 67 68 74 20 53 45 4c 45 43 54 22 29 29 3b 0a 20  ght SELECT"));. 
14de0 20 73 61 76 65 64 4c 69 6d 69 74 20 3d 20 70 2d   savedLimit = p-
14df0 3e 69 4c 69 6d 69 74 3b 0a 20 20 73 61 76 65 64  >iLimit;.  saved
14e00 4f 66 66 73 65 74 20 3d 20 70 2d 3e 69 4f 66 66  Offset = p->iOff
14e10 73 65 74 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69 74  set;.  p->iLimit
14e20 20 3d 20 72 65 67 4c 69 6d 69 74 42 3b 0a 20 20   = regLimitB;.  
14e30 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b 20  p->iOffset = 0; 
14e40 20 0a 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e   .  explainSetIn
14e50 74 65 67 65 72 28 69 53 75 62 32 2c 20 70 50 61  teger(iSub2, pPa
14e60 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74  rse->iNextSelect
14e70 49 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  Id);.  sqlite3Se
14e80 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20  lect(pParse, p, 
14e90 26 64 65 73 74 42 29 3b 0a 20 20 70 2d 3e 69 4c  &destB);.  p->iL
14ea0 69 6d 69 74 20 3d 20 73 61 76 65 64 4c 69 6d 69  imit = savedLimi
14eb0 74 3b 0a 20 20 70 2d 3e 69 4f 66 66 73 65 74 20  t;.  p->iOffset 
14ec0 3d 20 73 61 76 65 64 4f 66 66 73 65 74 3b 0a 20  = savedOffset;. 
14ed0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14ee0 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
14ef0 2c 20 31 2c 20 72 65 67 45 6f 66 42 29 3b 0a 20  , 1, regEofB);. 
14f00 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14f10 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p1(v, OP_Yield, 
14f20 72 65 67 41 64 64 72 42 29 3b 0a 20 20 56 64 62  regAddrB);.  Vdb
14f30 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c  eNoopComment((v,
14f40 20 22 45 6e 64 20 63 6f 72 6f 75 74 69 6e 65 20   "End coroutine 
14f50 66 6f 72 20 72 69 67 68 74 20 53 45 4c 45 43 54  for right SELECT
14f60 22 29 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  "));..  /* Gener
14f70 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65  ate a subroutine
14f80 20 74 68 61 74 20 6f 75 74 70 75 74 73 20 74 68   that outputs th
14f90 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 6f 66  e current row of
14fa0 20 74 68 65 20 41 0a 20 20 2a 2a 20 73 65 6c 65   the A.  ** sele
14fb0 63 74 20 61 73 20 74 68 65 20 6e 65 78 74 20 6f  ct as the next o
14fc0 75 74 70 75 74 20 72 6f 77 20 6f 66 20 74 68 65  utput row of the
14fd0 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74   compound select
14fe0 2e 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f  ..  */.  VdbeNoo
14ff0 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 75  pComment((v, "Ou
15000 74 70 75 74 20 72 6f 75 74 69 6e 65 20 66 6f 72  tput routine for
15010 20 41 22 29 29 3b 0a 20 20 61 64 64 72 4f 75 74   A"));.  addrOut
15020 41 20 3d 20 67 65 6e 65 72 61 74 65 4f 75 74 70  A = generateOutp
15030 75 74 53 75 62 72 6f 75 74 69 6e 65 28 70 50 61  utSubroutine(pPa
15040 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rse,.           
15050 20 20 20 20 20 20 70 2c 20 26 64 65 73 74 41 2c        p, &destA,
15060 20 70 44 65 73 74 2c 20 72 65 67 4f 75 74 41 2c   pDest, regOutA,
15070 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
15080 20 20 72 65 67 50 72 65 76 2c 20 70 4b 65 79 44    regPrev, pKeyD
15090 75 70 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48  up, P4_KEYINFO_H
150a0 41 4e 44 4f 46 46 2c 20 6c 61 62 65 6c 45 6e 64  ANDOFF, labelEnd
150b0 29 3b 0a 20 20 0a 20 20 2f 2a 20 47 65 6e 65 72  );.  .  /* Gener
150c0 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65  ate a subroutine
150d0 20 74 68 61 74 20 6f 75 74 70 75 74 73 20 74 68   that outputs th
150e0 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 6f 66  e current row of
150f0 20 74 68 65 20 42 0a 20 20 2a 2a 20 73 65 6c 65   the B.  ** sele
15100 63 74 20 61 73 20 74 68 65 20 6e 65 78 74 20 6f  ct as the next o
15110 75 74 70 75 74 20 72 6f 77 20 6f 66 20 74 68 65  utput row of the
15120 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74   compound select
15130 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d  ..  */.  if( op=
15140 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 6f 70 3d 3d 54  =TK_ALL || op==T
15150 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20 20 20 56  K_UNION ){.    V
15160 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28  dbeNoopComment((
15170 76 2c 20 22 4f 75 74 70 75 74 20 72 6f 75 74 69  v, "Output routi
15180 6e 65 20 66 6f 72 20 42 22 29 29 3b 0a 20 20 20  ne for B"));.   
15190 20 61 64 64 72 4f 75 74 42 20 3d 20 67 65 6e 65   addrOutB = gene
151a0 72 61 74 65 4f 75 74 70 75 74 53 75 62 72 6f 75  rateOutputSubrou
151b0 74 69 6e 65 28 70 50 61 72 73 65 2c 0a 20 20 20  tine(pParse,.   
151c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2c                p,
151d0 20 26 64 65 73 74 42 2c 20 70 44 65 73 74 2c 20   &destB, pDest, 
151e0 72 65 67 4f 75 74 42 2c 0a 20 20 20 20 20 20 20  regOutB,.       
151f0 20 20 20 20 20 20 20 20 20 20 72 65 67 50 72 65            regPre
15200 76 2c 20 70 4b 65 79 44 75 70 2c 20 50 34 5f 4b  v, pKeyDup, P4_K
15210 45 59 49 4e 46 4f 5f 53 54 41 54 49 43 2c 20 6c  EYINFO_STATIC, l
15220 61 62 65 6c 45 6e 64 29 3b 0a 20 20 7d 0a 0a 20  abelEnd);.  }.. 
15230 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73   /* Generate a s
15240 75 62 72 6f 75 74 69 6e 65 20 74 6f 20 72 75 6e  ubroutine to run
15250 20 77 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74   when the result
15260 73 20 66 72 6f 6d 20 73 65 6c 65 63 74 20 41 0a  s from select A.
15270 20 20 2a 2a 20 61 72 65 20 65 78 68 61 75 73 74    ** are exhaust
15280 65 64 20 61 6e 64 20 6f 6e 6c 79 20 64 61 74 61  ed and only data
15290 20 69 6e 20 73 65 6c 65 63 74 20 42 20 72 65 6d   in select B rem
152a0 61 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 56 64 62  ains..  */.  Vdb
152b0 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c  eNoopComment((v,
152c0 20 22 65 6f 66 2d 41 20 73 75 62 72 6f 75 74 69   "eof-A subrouti
152d0 6e 65 22 29 29 3b 0a 20 20 69 66 28 20 6f 70 3d  ne"));.  if( op=
152e0 3d 54 4b 5f 45 58 43 45 50 54 20 7c 7c 20 6f 70  =TK_EXCEPT || op
152f0 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 29  ==TK_INTERSECT )
15300 7b 0a 20 20 20 20 61 64 64 72 45 6f 66 41 20 3d  {.    addrEofA =
15310 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15320 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
15330 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 7d  , labelEnd);.  }
15340 65 6c 73 65 7b 20 20 0a 20 20 20 20 61 64 64 72  else{  .    addr
15350 45 6f 66 41 20 3d 20 73 71 6c 69 74 65 33 56 64  EofA = sqlite3Vd
15360 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
15370 66 2c 20 72 65 67 45 6f 66 42 2c 20 6c 61 62 65  f, regEofB, labe
15380 6c 45 6e 64 29 3b 0a 20 20 20 20 73 71 6c 69 74  lEnd);.    sqlit
15390 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
153a0 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74  OP_Gosub, regOut
153b0 42 2c 20 61 64 64 72 4f 75 74 42 29 3b 0a 20 20  B, addrOutB);.  
153c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
153d0 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c  Op1(v, OP_Yield,
153e0 20 72 65 67 41 64 64 72 42 29 3b 0a 20 20 20 20   regAddrB);.    
153f0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15400 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
15410 20 61 64 64 72 45 6f 66 41 29 3b 0a 20 20 20 20   addrEofA);.    
15420 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 2b 3d  p->nSelectRow +=
15430 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74   pPrior->nSelect
15440 52 6f 77 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47  Row;.  }..  /* G
15450 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75  enerate a subrou
15460 74 69 6e 65 20 74 6f 20 72 75 6e 20 77 68 65 6e  tine to run when
15470 20 74 68 65 20 72 65 73 75 6c 74 73 20 66 72 6f   the results fro
15480 6d 20 73 65 6c 65 63 74 20 42 0a 20 20 2a 2a 20  m select B.  ** 
15490 61 72 65 20 65 78 68 61 75 73 74 65 64 20 61 6e  are exhausted an
154a0 64 20 6f 6e 6c 79 20 64 61 74 61 20 69 6e 20 73  d only data in s
154b0 65 6c 65 63 74 20 41 20 72 65 6d 61 69 6e 73 2e  elect A remains.
154c0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d  .  */.  if( op==
154d0 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 29 7b 0a  TK_INTERSECT ){.
154e0 20 20 20 20 61 64 64 72 45 6f 66 42 20 3d 20 61      addrEofB = a
154f0 64 64 72 45 6f 66 41 3b 0a 20 20 20 20 69 66 28  ddrEofA;.    if(
15500 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3e   p->nSelectRow >
15510 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74   pPrior->nSelect
15520 52 6f 77 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74  Row ) p->nSelect
15530 52 6f 77 20 3d 20 70 50 72 69 6f 72 2d 3e 6e 53  Row = pPrior->nS
15540 65 6c 65 63 74 52 6f 77 3b 0a 20 20 7d 65 6c 73  electRow;.  }els
15550 65 7b 20 20 0a 20 20 20 20 56 64 62 65 4e 6f 6f  e{  .    VdbeNoo
15560 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6f  pComment((v, "eo
15570 66 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 22 29  f-B subroutine")
15580 29 3b 0a 20 20 20 20 61 64 64 72 45 6f 66 42 20  );.    addrEofB 
15590 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
155a0 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65  Op2(v, OP_If, re
155b0 67 45 6f 66 41 2c 20 6c 61 62 65 6c 45 6e 64 29  gEofA, labelEnd)
155c0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
155d0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
155e0 73 75 62 2c 20 72 65 67 4f 75 74 41 2c 20 61 64  sub, regOutA, ad
155f0 64 72 4f 75 74 41 29 3b 0a 20 20 20 20 73 71 6c  drOutA);.    sql
15600 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
15610 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41  , OP_Yield, regA
15620 64 64 72 41 29 3b 0a 20 20 20 20 73 71 6c 69 74  ddrA);.    sqlit
15630 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
15640 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72  OP_Goto, 0, addr
15650 45 6f 66 42 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  EofB);.  }..  /*
15660 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
15670 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 63 61 73  o handle the cas
15680 65 20 6f 66 20 41 3c 42 0a 20 20 2a 2f 0a 20 20  e of A<B.  */.  
15690 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28  VdbeNoopComment(
156a0 28 76 2c 20 22 41 2d 6c 74 2d 42 20 73 75 62 72  (v, "A-lt-B subr
156b0 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 61 64 64  outine"));.  add
156c0 72 41 6c 74 42 20 3d 20 73 71 6c 69 74 65 33 56  rAltB = sqlite3V
156d0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
156e0 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 41 2c 20  Gosub, regOutA, 
156f0 61 64 64 72 4f 75 74 41 29 3b 0a 20 20 73 71 6c  addrOutA);.  sql
15700 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
15710 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41  , OP_Yield, regA
15720 64 64 72 41 29 3b 0a 20 20 73 71 6c 69 74 65 33  ddrA);.  sqlite3
15730 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
15740 5f 49 66 2c 20 72 65 67 45 6f 66 41 2c 20 61 64  _If, regEofA, ad
15750 64 72 45 6f 66 41 29 3b 0a 20 20 73 71 6c 69 74  drEofA);.  sqlit
15760 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
15770 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c 61 62 65  OP_Goto, 0, labe
15780 6c 43 6d 70 72 29 3b 0a 0a 20 20 2f 2a 20 47 65  lCmpr);..  /* Ge
15790 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 68  nerate code to h
157a0 61 6e 64 6c 65 20 74 68 65 20 63 61 73 65 20 6f  andle the case o
157b0 66 20 41 3d 3d 42 0a 20 20 2a 2f 0a 20 20 69 66  f A==B.  */.  if
157c0 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a  ( op==TK_ALL ){.
157d0 20 20 20 20 61 64 64 72 41 65 71 42 20 3d 20 61      addrAeqB = a
157e0 64 64 72 41 6c 74 42 3b 0a 20 20 7d 65 6c 73 65  ddrAltB;.  }else
157f0 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45   if( op==TK_INTE
15800 52 53 45 43 54 20 29 7b 0a 20 20 20 20 61 64 64  RSECT ){.    add
15810 72 41 65 71 42 20 3d 20 61 64 64 72 41 6c 74 42  rAeqB = addrAltB
15820 3b 0a 20 20 20 20 61 64 64 72 41 6c 74 42 2b 2b  ;.    addrAltB++
15830 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 56  ;.  }else{.    V
15840 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28  dbeNoopComment((
15850 76 2c 20 22 41 2d 65 71 2d 42 20 73 75 62 72 6f  v, "A-eq-B subro
15860 75 74 69 6e 65 22 29 29 3b 0a 20 20 20 20 61 64  utine"));.    ad
15870 64 72 41 65 71 42 20 3d 0a 20 20 20 20 73 71 6c  drAeqB =.    sql
15880 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
15890 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41  , OP_Yield, regA
158a0 64 64 72 41 29 3b 0a 20 20 20 20 73 71 6c 69 74  ddrA);.    sqlit
158b0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
158c0 4f 50 5f 49 66 2c 20 72 65 67 45 6f 66 41 2c 20  OP_If, regEofA, 
158d0 61 64 64 72 45 6f 66 41 29 3b 0a 20 20 20 20 73  addrEofA);.    s
158e0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
158f0 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
15900 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 20 20 7d 0a  labelCmpr);.  }.
15910 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63  .  /* Generate c
15920 6f 64 65 20 74 6f 20 68 61 6e 64 6c 65 20 74 68  ode to handle th
15930 65 20 63 61 73 65 20 6f 66 20 41 3e 42 0a 20 20  e case of A>B.  
15940 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d  */.  VdbeNoopCom
15950 6d 65 6e 74 28 28 76 2c 20 22 41 2d 67 74 2d 42  ment((v, "A-gt-B
15960 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a   subroutine"));.
15970 20 20 61 64 64 72 41 67 74 42 20 3d 20 73 71 6c    addrAgtB = sql
15980 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
15990 64 64 72 28 76 29 3b 0a 20 20 69 66 28 20 6f 70  ddr(v);.  if( op
159a0 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 6f 70 3d 3d  ==TK_ALL || op==
159b0 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20 20 20  TK_UNION ){.    
159c0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
159d0 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72  2(v, OP_Gosub, r
159e0 65 67 4f 75 74 42 2c 20 61 64 64 72 4f 75 74 42  egOutB, addrOutB
159f0 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
15a00 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
15a10 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 42  _Yield, regAddrB
15a20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
15a30 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c  AddOp2(v, OP_If,
15a40 20 72 65 67 45 6f 66 42 2c 20 61 64 64 72 45 6f   regEofB, addrEo
15a50 66 42 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  fB);.  sqlite3Vd
15a60 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
15a70 6f 74 6f 2c 20 30 2c 20 6c 61 62 65 6c 43 6d 70  oto, 0, labelCmp
15a80 72 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 63  r);..  /* This c
15a90 6f 64 65 20 72 75 6e 73 20 6f 6e 63 65 20 74 6f  ode runs once to
15aa0 20 69 6e 69 74 69 61 6c 69 7a 65 20 65 76 65 72   initialize ever
15ab0 79 74 68 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 73  ything..  */.  s
15ac0 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
15ad0 72 65 28 76 2c 20 6a 31 29 3b 0a 20 20 73 71 6c  re(v, j1);.  sql
15ae0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
15af0 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
15b00 20 72 65 67 45 6f 66 41 29 3b 0a 20 20 73 71 6c   regEofA);.  sql
15b10 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
15b20 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
15b30 20 72 65 67 45 6f 66 42 29 3b 0a 20 20 73 71 6c   regEofB);.  sql
15b40 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
15b50 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 41  , OP_Gosub, regA
15b60 64 64 72 41 2c 20 61 64 64 72 53 65 6c 65 63 74  ddrA, addrSelect
15b70 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  A);.  sqlite3Vdb
15b80 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
15b90 73 75 62 2c 20 72 65 67 41 64 64 72 42 2c 20 61  sub, regAddrB, a
15ba0 64 64 72 53 65 6c 65 63 74 42 29 3b 0a 20 20 73  ddrSelectB);.  s
15bb0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
15bc0 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 45 6f  (v, OP_If, regEo
15bd0 66 41 2c 20 61 64 64 72 45 6f 66 41 29 3b 0a 20  fA, addrEofA);. 
15be0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15bf0 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67  p2(v, OP_If, reg
15c00 45 6f 66 42 2c 20 61 64 64 72 45 6f 66 42 29 3b  EofB, addrEofB);
15c10 0a 0a 20 20 2f 2a 20 49 6d 70 6c 65 6d 65 6e 74  ..  /* Implement
15c20 20 74 68 65 20 6d 61 69 6e 20 6d 65 72 67 65 20   the main merge 
15c30 6c 6f 6f 70 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  loop.  */.  sqli
15c40 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
15c50 62 65 6c 28 76 2c 20 6c 61 62 65 6c 43 6d 70 72  bel(v, labelCmpr
15c60 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
15c70 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 50 65 72  AddOp4(v, OP_Per
15c80 6d 75 74 61 74 69 6f 6e 2c 20 30 2c 20 30 2c 20  mutation, 0, 0, 
15c90 30 2c 20 28 63 68 61 72 2a 29 61 50 65 72 6d 75  0, (char*)aPermu
15ca0 74 65 2c 20 50 34 5f 49 4e 54 41 52 52 41 59 29  te, P4_INTARRAY)
15cb0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
15cc0 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6d 70  ddOp4(v, OP_Comp
15cd0 61 72 65 2c 20 64 65 73 74 41 2e 69 53 64 73 74  are, destA.iSdst
15ce0 2c 20 64 65 73 74 42 2e 69 53 64 73 74 2c 20 6e  , destB.iSdst, n
15cf0 4f 72 64 65 72 42 79 2c 0a 20 20 20 20 20 20 20  OrderBy,.       
15d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d10 20 20 28 63 68 61 72 2a 29 70 4b 65 79 4d 65 72    (char*)pKeyMer
15d20 67 65 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48  ge, P4_KEYINFO_H
15d30 41 4e 44 4f 46 46 29 3b 0a 20 20 73 71 6c 69 74  ANDOFF);.  sqlit
15d40 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
15d50 2c 20 4f 50 46 4c 41 47 5f 50 45 52 4d 55 54 45  , OPFLAG_PERMUTE
15d60 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
15d70 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d  AddOp3(v, OP_Jum
15d80 70 2c 20 61 64 64 72 41 6c 74 42 2c 20 61 64 64  p, addrAltB, add
15d90 72 41 65 71 42 2c 20 61 64 64 72 41 67 74 42 29  rAeqB, addrAgtB)
15da0 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20  ;..  /* Jump to 
15db0 74 68 65 20 74 68 69 73 20 70 6f 69 6e 74 20 69  the this point i
15dc0 6e 20 6f 72 64 65 72 20 74 6f 20 74 65 72 6d 69  n order to termi
15dd0 6e 61 74 65 20 74 68 65 20 71 75 65 72 79 2e 0a  nate the query..
15de0 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64    */.  sqlite3Vd
15df0 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
15e00 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 0a 20 20  , labelEnd);..  
15e10 2f 2a 20 53 65 74 20 74 68 65 20 6e 75 6d 62 65  /* Set the numbe
15e20 72 20 6f 66 20 6f 75 74 70 75 74 20 63 6f 6c 75  r of output colu
15e30 6d 6e 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  mns.  */.  if( p
15e40 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54  Dest->eDest==SRT
15e50 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20 53  _Output ){.    S
15e60 65 6c 65 63 74 20 2a 70 46 69 72 73 74 20 3d 20  elect *pFirst = 
15e70 70 50 72 69 6f 72 3b 0a 20 20 20 20 77 68 69 6c  pPrior;.    whil
15e80 65 28 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f  e( pFirst->pPrio
15e90 72 20 29 20 70 46 69 72 73 74 20 3d 20 70 46 69  r ) pFirst = pFi
15ea0 72 73 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20  rst->pPrior;.   
15eb0 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e   generateColumnN
15ec0 61 6d 65 73 28 70 50 61 72 73 65 2c 20 30 2c 20  ames(pParse, 0, 
15ed0 70 46 69 72 73 74 2d 3e 70 45 4c 69 73 74 29 3b  pFirst->pEList);
15ee0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 73 73  .  }..  /* Reass
15ef0 65 6d 62 6c 79 20 74 68 65 20 63 6f 6d 70 6f 75  embly the compou
15f00 6e 64 20 71 75 65 72 79 20 73 6f 20 74 68 61 74  nd query so that
15f10 20 69 74 20 77 69 6c 6c 20 62 65 20 66 72 65 65   it will be free
15f20 64 20 63 6f 72 72 65 63 74 6c 79 0a 20 20 2a 2a  d correctly.  **
15f30 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20   by the calling 
15f40 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 66  function */.  if
15f50 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20  ( p->pPrior ){. 
15f60 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
15f70 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 50  Delete(db, p->pP
15f80 72 69 6f 72 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e  rior);.  }.  p->
15f90 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b  pPrior = pPrior;
15fa0 0a 0a 20 20 2f 2a 2a 2a 20 54 42 44 3a 20 20 49  ..  /*** TBD:  I
15fb0 6e 73 65 72 74 20 73 75 62 72 6f 75 74 69 6e 65  nsert subroutine
15fc0 20 63 61 6c 6c 73 20 74 6f 20 63 6c 6f 73 65 20   calls to close 
15fd0 63 75 72 73 6f 72 73 20 6f 6e 20 69 6e 63 6f 6d  cursors on incom
15fe0 70 6c 65 74 65 0a 20 20 2a 2a 2a 2a 20 73 75 62  plete.  **** sub
15ff0 71 75 65 72 69 65 73 20 2a 2a 2a 2a 2f 0a 20 20  queries ****/.  
16000 65 78 70 6c 61 69 6e 43 6f 6d 70 6f 73 69 74 65  explainComposite
16010 28 70 50 61 72 73 65 2c 20 70 2d 3e 6f 70 2c 20  (pParse, p->op, 
16020 69 53 75 62 31 2c 20 69 53 75 62 32 2c 20 30 29  iSub1, iSub2, 0)
16030 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
16040 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  E_OK;.}.#endif..
16050 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
16060 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
16070 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  Y) || !defined(S
16080 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
16090 0a 2f 2a 20 46 6f 72 77 61 72 64 20 44 65 63 6c  ./* Forward Decl
160a0 61 72 61 74 69 6f 6e 73 20 2a 2f 0a 73 74 61 74  arations */.stat
160b0 69 63 20 76 6f 69 64 20 73 75 62 73 74 45 78 70  ic void substExp
160c0 72 4c 69 73 74 28 73 71 6c 69 74 65 33 2a 2c 20  rList(sqlite3*, 
160d0 45 78 70 72 4c 69 73 74 2a 2c 20 69 6e 74 2c 20  ExprList*, int, 
160e0 45 78 70 72 4c 69 73 74 2a 29 3b 0a 73 74 61 74  ExprList*);.stat
160f0 69 63 20 76 6f 69 64 20 73 75 62 73 74 53 65 6c  ic void substSel
16100 65 63 74 28 73 71 6c 69 74 65 33 2a 2c 20 53 65  ect(sqlite3*, Se
16110 6c 65 63 74 20 2a 2c 20 69 6e 74 2c 20 45 78 70  lect *, int, Exp
16120 72 4c 69 73 74 20 2a 29 3b 0a 0a 2f 2a 0a 2a 2a  rList *);../*.**
16130 20 53 63 61 6e 20 74 68 72 6f 75 67 68 20 74 68   Scan through th
16140 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78  e expression pEx
16150 70 72 2e 20 20 52 65 70 6c 61 63 65 20 65 76 65  pr.  Replace eve
16160 72 79 20 72 65 66 65 72 65 6e 63 65 20 74 6f 0a  ry reference to.
16170 2a 2a 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74  ** a column in t
16180 61 62 6c 65 20 6e 75 6d 62 65 72 20 69 54 61 62  able number iTab
16190 6c 65 20 77 69 74 68 20 61 20 63 6f 70 79 20 6f  le with a copy o
161a0 66 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68  f the iColumn-th
161b0 0a 2a 2a 20 65 6e 74 72 79 20 69 6e 20 70 45 4c  .** entry in pEL
161c0 69 73 74 2e 20 20 28 42 75 74 20 6c 65 61 76 65  ist.  (But leave
161d0 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
161e0 68 65 20 52 4f 57 49 44 20 63 6f 6c 75 6d 6e 20  he ROWID column 
161f0 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 2e 29 0a  .** unchanged.).
16200 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
16210 6e 65 20 69 73 20 70 61 72 74 20 6f 66 20 74 68  ne is part of th
16220 65 20 66 6c 61 74 74 65 6e 69 6e 67 20 70 72 6f  e flattening pro
16230 63 65 64 75 72 65 2e 20 20 41 20 73 75 62 71 75  cedure.  A subqu
16240 65 72 79 0a 2a 2a 20 77 68 6f 73 65 20 72 65 73  ery.** whose res
16250 75 6c 74 20 73 65 74 20 69 73 20 64 65 66 69 6e  ult set is defin
16260 65 64 20 62 79 20 70 45 4c 69 73 74 20 61 70 70  ed by pEList app
16270 65 61 72 73 20 61 73 20 65 6e 74 72 79 20 69 6e  ears as entry in
16280 20 74 68 65 0a 2a 2a 20 46 52 4f 4d 20 63 6c 61   the.** FROM cla
16290 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20  use of a SELECT 
162a0 73 75 63 68 20 74 68 61 74 20 74 68 65 20 56 44  such that the VD
162b0 42 45 20 63 75 72 73 6f 72 20 61 73 73 69 67 6e  BE cursor assign
162c0 65 64 20 74 6f 20 74 68 61 74 0a 2a 2a 20 46 4f  ed to that.** FO
162d0 52 4d 20 63 6c 61 75 73 65 20 65 6e 74 72 79 20  RM clause entry 
162e0 69 73 20 69 54 61 62 6c 65 2e 20 20 54 68 69 73  is iTable.  This
162f0 20 72 6f 75 74 69 6e 65 20 6d 61 6b 65 20 74 68   routine make th
16300 65 20 6e 65 63 65 73 73 61 72 79 20 0a 2a 2a 20  e necessary .** 
16310 63 68 61 6e 67 65 73 20 74 6f 20 70 45 78 70 72  changes to pExpr
16320 20 73 6f 20 74 68 61 74 20 69 74 20 72 65 66 65   so that it refe
16330 72 73 20 64 69 72 65 63 74 6c 79 20 74 6f 20 74  rs directly to t
16340 68 65 20 73 6f 75 72 63 65 20 74 61 62 6c 65 0a  he source table.
16350 2a 2a 20 6f 66 20 74 68 65 20 73 75 62 71 75 65  ** of the subque
16360 72 79 20 72 61 74 68 65 72 20 74 68 65 20 72 65  ry rather the re
16370 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20  sult set of the 
16380 73 75 62 71 75 65 72 79 2e 0a 2a 2f 0a 73 74 61  subquery..*/.sta
16390 74 69 63 20 45 78 70 72 20 2a 73 75 62 73 74 45  tic Expr *substE
163a0 78 70 72 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  xpr(.  sqlite3 *
163b0 64 62 2c 20 20 20 20 20 20 20 20 2f 2a 20 52 65  db,        /* Re
163c0 70 6f 72 74 20 6d 61 6c 6c 6f 63 20 65 72 72 6f  port malloc erro
163d0 72 73 20 74 6f 20 74 68 69 73 20 63 6f 6e 6e 65  rs to this conne
163e0 63 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 20  ction */.  Expr 
163f0 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 2f  *pExpr,        /
16400 2a 20 45 78 70 72 20 69 6e 20 77 68 69 63 68 20  * Expr in which 
16410 73 75 62 73 74 69 74 75 74 69 6f 6e 20 6f 63 63  substitution occ
16420 75 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  urs */.  int iTa
16430 62 6c 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ble,         /* 
16440 54 61 62 6c 65 20 74 6f 20 62 65 20 73 75 62 73  Table to be subs
16450 74 69 74 75 74 65 64 20 2a 2f 0a 20 20 45 78 70  tituted */.  Exp
16460 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20  rList *pEList   
16470 20 2f 2a 20 53 75 62 73 74 69 74 75 74 65 20 65   /* Substitute e
16480 78 70 72 65 73 73 69 6f 6e 73 20 2a 2f 0a 29 7b  xpressions */.){
16490 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20  .  if( pExpr==0 
164a0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
164b0 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
164c0 43 4f 4c 55 4d 4e 20 26 26 20 70 45 78 70 72 2d  COLUMN && pExpr-
164d0 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62 6c 65 20  >iTable==iTable 
164e0 29 7b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72  ){.    if( pExpr
164f0 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20  ->iColumn<0 ){. 
16500 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d       pExpr->op =
16510 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65   TK_NULL;.    }e
16520 6c 73 65 7b 0a 20 20 20 20 20 20 45 78 70 72 20  lse{.      Expr 
16530 2a 70 4e 65 77 3b 0a 20 20 20 20 20 20 61 73 73  *pNew;.      ass
16540 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20 26  ert( pEList!=0 &
16550 26 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  & pExpr->iColumn
16560 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  <pEList->nExpr )
16570 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
16580 70 45 78 70 72 2d 3e 70 4c 65 66 74 3d 3d 30 20  pExpr->pLeft==0 
16590 26 26 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  && pExpr->pRight
165a0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4e 65  ==0 );.      pNe
165b0 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  w = sqlite3ExprD
165c0 75 70 28 64 62 2c 20 70 45 4c 69 73 74 2d 3e 61  up(db, pEList->a
165d0 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d  [pExpr->iColumn]
165e0 2e 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20  .pExpr, 0);.    
165f0 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
16600 65 74 65 28 64 62 2c 20 70 45 78 70 72 29 3b 0a  ete(db, pExpr);.
16610 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 70 4e        pExpr = pN
16620 65 77 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  ew;.    }.  }els
16630 65 7b 0a 20 20 20 20 70 45 78 70 72 2d 3e 70 4c  e{.    pExpr->pL
16640 65 66 74 20 3d 20 73 75 62 73 74 45 78 70 72 28  eft = substExpr(
16650 64 62 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  db, pExpr->pLeft
16660 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
16670 29 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 70 52  );.    pExpr->pR
16680 69 67 68 74 20 3d 20 73 75 62 73 74 45 78 70 72  ight = substExpr
16690 28 64 62 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  (db, pExpr->pRig
166a0 68 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69  ht, iTable, pELi
166b0 73 74 29 3b 0a 20 20 20 20 69 66 28 20 45 78 70  st);.    if( Exp
166c0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
166d0 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
166e0 29 20 29 7b 0a 20 20 20 20 20 20 73 75 62 73 74  ) ){.      subst
166f0 53 65 6c 65 63 74 28 64 62 2c 20 70 45 78 70 72  Select(db, pExpr
16700 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20 69 54 61  ->x.pSelect, iTa
16710 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ble, pEList);.  
16720 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
16730 75 62 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c  ubstExprList(db,
16740 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2c   pExpr->x.pList,
16750 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
16760 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
16770 74 75 72 6e 20 70 45 78 70 72 3b 0a 7d 0a 73 74  turn pExpr;.}.st
16780 61 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 45  atic void substE
16790 78 70 72 4c 69 73 74 28 0a 20 20 73 71 6c 69 74  xprList(.  sqlit
167a0 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
167b0 2f 2a 20 52 65 70 6f 72 74 20 6d 61 6c 6c 6f 63  /* Report malloc
167c0 20 65 72 72 6f 72 73 20 68 65 72 65 20 2a 2f 0a   errors here */.
167d0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
167e0 74 2c 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74  t,     /* List t
167f0 6f 20 73 63 61 6e 20 61 6e 64 20 69 6e 20 77 68  o scan and in wh
16800 69 63 68 20 74 6f 20 6d 61 6b 65 20 73 75 62 73  ich to make subs
16810 74 69 74 75 74 65 73 20 2a 2f 0a 20 20 69 6e 74  titutes */.  int
16820 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20   iTable,        
16830 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62 65    /* Table to be
16840 20 73 75 62 73 74 69 74 75 74 65 64 20 2a 2f 0a   substituted */.
16850 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
16860 73 74 20 20 20 20 20 2f 2a 20 53 75 62 73 74 69  st     /* Substi
16870 74 75 74 65 20 76 61 6c 75 65 73 20 2a 2f 0a 29  tute values */.)
16880 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
16890 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
168a0 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  rn;.  for(i=0; i
168b0 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  <pList->nExpr; i
168c0 2b 2b 29 7b 0a 20 20 20 20 70 4c 69 73 74 2d 3e  ++){.    pList->
168d0 61 5b 69 5d 2e 70 45 78 70 72 20 3d 20 73 75 62  a[i].pExpr = sub
168e0 73 74 45 78 70 72 28 64 62 2c 20 70 4c 69 73 74  stExpr(db, pList
168f0 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 69 54  ->a[i].pExpr, iT
16900 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20  able, pEList);. 
16910 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64   }.}.static void
16920 20 73 75 62 73 74 53 65 6c 65 63 74 28 0a 20 20   substSelect(.  
16930 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
16940 20 20 20 20 20 2f 2a 20 52 65 70 6f 72 74 20 6d       /* Report m
16950 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20 68 65 72  alloc errors her
16960 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  e */.  Select *p
16970 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ,           /* S
16980 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
16990 69 6e 20 77 68 69 63 68 20 74 6f 20 6d 61 6b 65  in which to make
169a0 20 73 75 62 73 74 69 74 75 74 69 6f 6e 73 20 2a   substitutions *
169b0 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20  /.  int iTable, 
169c0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
169d0 65 20 74 6f 20 62 65 20 72 65 70 6c 61 63 65 64  e to be replaced
169e0 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
169f0 70 45 4c 69 73 74 20 20 20 20 20 2f 2a 20 53 75  pEList     /* Su
16a00 62 73 74 69 74 75 74 65 20 76 61 6c 75 65 73 20  bstitute values 
16a10 2a 2f 0a 29 7b 0a 20 20 53 72 63 4c 69 73 74 20  */.){.  SrcList 
16a20 2a 70 53 72 63 3b 0a 20 20 73 74 72 75 63 74 20  *pSrc;.  struct 
16a30 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
16a40 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  tem;.  int i;.  
16a50 69 66 28 20 21 70 20 29 20 72 65 74 75 72 6e 3b  if( !p ) return;
16a60 0a 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74  .  substExprList
16a70 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20  (db, p->pEList, 
16a80 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
16a90 0a 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74  .  substExprList
16aa0 28 64 62 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79  (db, p->pGroupBy
16ab0 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
16ac0 29 3b 0a 20 20 73 75 62 73 74 45 78 70 72 4c 69  );.  substExprLi
16ad0 73 74 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72  st(db, p->pOrder
16ae0 42 79 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69  By, iTable, pELi
16af0 73 74 29 3b 0a 20 20 70 2d 3e 70 48 61 76 69 6e  st);.  p->pHavin
16b00 67 20 3d 20 73 75 62 73 74 45 78 70 72 28 64 62  g = substExpr(db
16b10 2c 20 70 2d 3e 70 48 61 76 69 6e 67 2c 20 69 54  , p->pHaving, iT
16b20 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20  able, pEList);. 
16b30 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 73 75 62   p->pWhere = sub
16b40 73 74 45 78 70 72 28 64 62 2c 20 70 2d 3e 70 57  stExpr(db, p->pW
16b50 68 65 72 65 2c 20 69 54 61 62 6c 65 2c 20 70 45  here, iTable, pE
16b60 4c 69 73 74 29 3b 0a 20 20 73 75 62 73 74 53 65  List);.  substSe
16b70 6c 65 63 74 28 64 62 2c 20 70 2d 3e 70 50 72 69  lect(db, p->pPri
16b80 6f 72 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69  or, iTable, pELi
16b90 73 74 29 3b 0a 20 20 70 53 72 63 20 3d 20 70 2d  st);.  pSrc = p-
16ba0 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28  >pSrc;.  assert(
16bb0 20 70 53 72 63 20 29 3b 20 20 2f 2a 20 45 76 65   pSrc );  /* Eve
16bc0 6e 20 66 6f 72 20 28 53 45 4c 45 43 54 20 31 29  n for (SELECT 1)
16bd0 20 77 65 20 68 61 76 65 3a 20 70 53 72 63 21 3d   we have: pSrc!=
16be0 30 20 62 75 74 20 70 53 72 63 2d 3e 6e 53 72 63  0 but pSrc->nSrc
16bf0 3d 3d 30 20 2a 2f 0a 20 20 69 66 28 20 41 4c 57  ==0 */.  if( ALW
16c00 41 59 53 28 70 53 72 63 29 20 29 7b 0a 20 20 20  AYS(pSrc) ){.   
16c10 20 66 6f 72 28 69 3d 70 53 72 63 2d 3e 6e 53 72   for(i=pSrc->nSr
16c20 63 2c 20 70 49 74 65 6d 3d 70 53 72 63 2d 3e 61  c, pItem=pSrc->a
16c30 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 49 74 65  ; i>0; i--, pIte
16c40 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 73 75 62 73  m++){.      subs
16c50 74 53 65 6c 65 63 74 28 64 62 2c 20 70 49 74 65  tSelect(db, pIte
16c60 6d 2d 3e 70 53 65 6c 65 63 74 2c 20 69 54 61 62  m->pSelect, iTab
16c70 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20  le, pEList);.   
16c80 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20   }.  }.}.#endif 
16c90 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
16ca0 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
16cb0 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
16cc0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20  LITE_OMIT_VIEW) 
16cd0 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  */..#if !defined
16ce0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42  (SQLITE_OMIT_SUB
16cf0 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e  QUERY) || !defin
16d00 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
16d10 49 45 57 29 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  IEW)./*.** This 
16d20 72 6f 75 74 69 6e 65 20 61 74 74 65 6d 70 74 73  routine attempts
16d30 20 74 6f 20 66 6c 61 74 74 65 6e 20 73 75 62 71   to flatten subq
16d40 75 65 72 69 65 73 20 61 73 20 61 20 70 65 72 66  ueries as a perf
16d50 6f 72 6d 61 6e 63 65 20 6f 70 74 69 6d 69 7a 61  ormance optimiza
16d60 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f  tion..** This ro
16d70 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 31 20  utine returns 1 
16d80 69 66 20 69 74 20 6d 61 6b 65 73 20 63 68 61 6e  if it makes chan
16d90 67 65 73 20 61 6e 64 20 30 20 69 66 20 6e 6f 20  ges and 0 if no 
16da0 66 6c 61 74 74 65 6e 69 6e 67 20 6f 63 63 75 72  flattening occur
16db0 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 75 6e 64 65  s..**.** To unde
16dc0 72 73 74 61 6e 64 20 74 68 65 20 63 6f 6e 63 65  rstand the conce
16dd0 70 74 20 6f 66 20 66 6c 61 74 74 65 6e 69 6e 67  pt of flattening
16de0 2c 20 63 6f 6e 73 69 64 65 72 20 74 68 65 20 66  , consider the f
16df0 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 71 75 65 72  ollowing.** quer
16e00 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c  y:.**.**     SEL
16e10 45 43 54 20 61 20 46 52 4f 4d 20 28 53 45 4c 45  ECT a FROM (SELE
16e20 43 54 20 78 2b 79 20 41 53 20 61 20 46 52 4f 4d  CT x+y AS a FROM
16e30 20 74 31 20 57 48 45 52 45 20 7a 3c 31 30 30 29   t1 WHERE z<100)
16e40 20 57 48 45 52 45 20 61 3e 35 0a 2a 2a 0a 2a 2a   WHERE a>5.**.**
16e50 20 54 68 65 20 64 65 66 61 75 6c 74 20 77 61 79   The default way
16e60 20 6f 66 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67   of implementing
16e70 20 74 68 69 73 20 71 75 65 72 79 20 69 73 20 74   this query is t
16e80 6f 20 65 78 65 63 75 74 65 20 74 68 65 0a 2a 2a  o execute the.**
16e90 20 73 75 62 71 75 65 72 79 20 66 69 72 73 74 20   subquery first 
16ea0 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72 65  and store the re
16eb0 73 75 6c 74 73 20 69 6e 20 61 20 74 65 6d 70 6f  sults in a tempo
16ec0 72 61 72 79 20 74 61 62 6c 65 2c 20 74 68 65 6e  rary table, then
16ed0 0a 2a 2a 20 72 75 6e 20 74 68 65 20 6f 75 74 65  .** run the oute
16ee0 72 20 71 75 65 72 79 20 6f 6e 20 74 68 61 74 20  r query on that 
16ef0 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2e  temporary table.
16f00 20 20 54 68 69 73 20 72 65 71 75 69 72 65 73 20    This requires 
16f10 74 77 6f 0a 2a 2a 20 70 61 73 73 65 73 20 6f 76  two.** passes ov
16f20 65 72 20 74 68 65 20 64 61 74 61 2e 20 20 46 75  er the data.  Fu
16f30 72 74 68 65 72 6d 6f 72 65 2c 20 62 65 63 61 75  rthermore, becau
16f40 73 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  se the temporary
16f50 20 74 61 62 6c 65 0a 2a 2a 20 68 61 73 20 6e 6f   table.** has no
16f60 20 69 6e 64 69 63 65 73 2c 20 74 68 65 20 57 48   indices, the WH
16f70 45 52 45 20 63 6c 61 75 73 65 20 6f 6e 20 74 68  ERE clause on th
16f80 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 63 61  e outer query ca
16f90 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6f 70 74 69 6d  nnot be.** optim
16fa0 69 7a 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ized..**.** This
16fb0 20 72 6f 75 74 69 6e 65 20 61 74 74 65 6d 70 74   routine attempt
16fc0 73 20 74 6f 20 72 65 77 72 69 74 65 20 71 75 65  s to rewrite que
16fd0 72 69 65 73 20 73 75 63 68 20 61 73 20 74 68 65  ries such as the
16fe0 20 61 62 6f 76 65 20 69 6e 74 6f 0a 2a 2a 20 61   above into.** a
16ff0 20 73 69 6e 67 6c 65 20 66 6c 61 74 20 73 65 6c   single flat sel
17000 65 63 74 2c 20 6c 69 6b 65 20 74 68 69 73 3a 0a  ect, like this:.
17010 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  **.**     SELECT
17020 20 78 2b 79 20 41 53 20 61 20 46 52 4f 4d 20 74   x+y AS a FROM t
17030 31 20 57 48 45 52 45 20 7a 3c 31 30 30 20 41 4e  1 WHERE z<100 AN
17040 44 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20  D a>5.**.** The 
17050 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 66  code generated f
17060 6f 72 20 74 68 69 73 20 73 69 6d 70 69 66 69 63  or this simpific
17070 61 74 69 6f 6e 20 67 69 76 65 73 20 74 68 65 20  ation gives the 
17080 73 61 6d 65 20 72 65 73 75 6c 74 0a 2a 2a 20 62  same result.** b
17090 75 74 20 6f 6e 6c 79 20 68 61 73 20 74 6f 20 73  ut only has to s
170a0 63 61 6e 20 74 68 65 20 64 61 74 61 20 6f 6e 63  can the data onc
170b0 65 2e 20 20 41 6e 64 20 62 65 63 61 75 73 65 20  e.  And because 
170c0 69 6e 64 69 63 65 73 20 6d 69 67 68 74 20 0a 2a  indices might .*
170d0 2a 20 65 78 69 73 74 20 6f 6e 20 74 68 65 20 74  * exist on the t
170e0 61 62 6c 65 20 74 31 2c 20 61 20 63 6f 6d 70 6c  able t1, a compl
170f0 65 74 65 20 73 63 61 6e 20 6f 66 20 74 68 65 20  ete scan of the 
17100 64 61 74 61 20 6d 69 67 68 74 20 62 65 0a 2a 2a  data might be.**
17110 20 61 76 6f 69 64 65 64 2e 0a 2a 2a 0a 2a 2a 20   avoided..**.** 
17120 46 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 6f 6e  Flattening is on
17130 6c 79 20 61 74 74 65 6d 70 74 65 64 20 69 66 20  ly attempted if 
17140 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  all of the follo
17150 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a  wing are true:.*
17160 2a 0a 2a 2a 20 20 20 28 31 29 20 20 54 68 65 20  *.**   (1)  The 
17170 73 75 62 71 75 65 72 79 20 61 6e 64 20 74 68 65  subquery and the
17180 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 20   outer query do 
17190 6e 6f 74 20 62 6f 74 68 20 75 73 65 20 61 67 67  not both use agg
171a0 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20  regates..**.**  
171b0 20 28 32 29 20 20 54 68 65 20 73 75 62 71 75 65   (2)  The subque
171c0 72 79 20 69 73 20 6e 6f 74 20 61 6e 20 61 67 67  ry is not an agg
171d0 72 65 67 61 74 65 20 6f 72 20 74 68 65 20 6f 75  regate or the ou
171e0 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74  ter query is not
171f0 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20   a join..**.**  
17200 20 28 33 29 20 20 54 68 65 20 73 75 62 71 75 65   (3)  The subque
17210 72 79 20 69 73 20 6e 6f 74 20 74 68 65 20 72 69  ry is not the ri
17220 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61  ght operand of a
17230 20 6c 65 66 74 20 6f 75 74 65 72 20 6a 6f 69 6e   left outer join
17240 0a 2a 2a 20 20 20 20 20 20 20 20 28 4f 72 69 67  .**        (Orig
17250 69 6e 61 6c 6c 79 20 74 69 63 6b 65 74 20 23 33  inally ticket #3
17260 30 36 2e 20 20 53 74 72 65 6e 67 74 68 65 6e 65  06.  Strengthene
17270 64 20 62 79 20 74 69 63 6b 65 74 20 23 33 33 30  d by ticket #330
17280 30 29 0a 2a 2a 0a 2a 2a 20 20 20 28 34 29 20 20  0).**.**   (4)  
17290 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  The subquery is 
172a0 6e 6f 74 20 44 49 53 54 49 4e 43 54 2e 0a 2a 2a  not DISTINCT..**
172b0 0a 2a 2a 20 20 28 2a 2a 29 20 20 41 74 20 6f 6e  .**  (**)  At on
172c0 65 20 70 6f 69 6e 74 20 72 65 73 74 72 69 63 74  e point restrict
172d0 69 6f 6e 73 20 28 34 29 20 61 6e 64 20 28 35 29  ions (4) and (5)
172e0 20 64 65 66 69 6e 65 64 20 61 20 73 75 62 73 65   defined a subse
172f0 74 20 6f 66 20 44 49 53 54 49 4e 43 54 0a 2a 2a  t of DISTINCT.**
17300 20 20 20 20 20 20 20 20 73 75 62 2d 71 75 65 72          sub-quer
17310 69 65 73 20 74 68 61 74 20 77 65 72 65 20 65 78  ies that were ex
17320 63 6c 75 64 65 64 20 66 72 6f 6d 20 74 68 69 73  cluded from this
17330 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 52   optimization. R
17340 65 73 74 72 69 63 74 69 6f 6e 20 0a 2a 2a 20 20  estriction .**  
17350 20 20 20 20 20 20 28 34 29 20 68 61 73 20 73 69        (4) has si
17360 6e 63 65 20 62 65 65 6e 20 65 78 70 61 6e 64 65  nce been expande
17370 64 20 74 6f 20 65 78 63 6c 75 64 65 20 61 6c 6c  d to exclude all
17380 20 44 49 53 54 49 4e 43 54 20 73 75 62 71 75 65   DISTINCT subque
17390 72 69 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 36  ries..**.**   (6
173a0 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
173b0 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 61 67 67  does not use agg
173c0 72 65 67 61 74 65 73 20 6f 72 20 74 68 65 20 6f  regates or the o
173d0 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f  uter query is no
173e0 74 0a 2a 2a 20 20 20 20 20 20 20 20 44 49 53 54  t.**        DIST
173f0 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 37  INCT..**.**   (7
17400 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
17410 68 61 73 20 61 20 46 52 4f 4d 20 63 6c 61 75 73  has a FROM claus
17420 65 2e 20 20 54 4f 44 4f 3a 20 20 46 6f 72 20 73  e.  TODO:  For s
17430 75 62 71 75 65 72 69 65 73 20 77 69 74 68 6f 75  ubqueries withou
17440 74 0a 2a 2a 20 20 20 20 20 20 20 20 41 20 46 52  t.**        A FR
17450 4f 4d 20 63 6c 61 75 73 65 2c 20 63 6f 6e 73 69  OM clause, consi
17460 64 65 72 20 61 64 64 69 6e 67 20 61 20 46 52 4f  der adding a FRO
17470 4d 20 63 6c 6f 73 65 20 77 69 74 68 20 74 68 65  M close with the
17480 20 73 70 65 63 69 61 6c 0a 2a 2a 20 20 20 20 20   special.**     
17490 20 20 20 74 61 62 6c 65 20 73 71 6c 69 74 65 5f     table sqlite_
174a0 6f 6e 63 65 20 74 68 61 74 20 63 6f 6e 73 69 73  once that consis
174b0 74 73 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 72  ts of a single r
174c0 6f 77 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 0a  ow containing a.
174d0 2a 2a 20 20 20 20 20 20 20 20 73 69 6e 67 6c 65  **        single
174e0 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 20 20 28   NULL..**.**   (
174f0 38 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  8)  The subquery
17500 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c 49   does not use LI
17510 4d 49 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72  MIT or the outer
17520 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20   query is not a 
17530 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 39  join..**.**   (9
17540 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
17550 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d  does not use LIM
17560 49 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20  IT or the outer 
17570 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75  query does not u
17580 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 61 67 67  se.**        agg
17590 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20  regates..**.**  
175a0 28 31 30 29 20 20 54 68 65 20 73 75 62 71 75 65  (10)  The subque
175b0 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  ry does not use 
175c0 61 67 67 72 65 67 61 74 65 73 20 6f 72 20 74 68  aggregates or th
175d0 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f  e outer query do
175e0 65 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20  es not.**       
175f0 20 75 73 65 20 4c 49 4d 49 54 2e 0a 2a 2a 0a 2a   use LIMIT..**.*
17600 2a 20 20 28 31 31 29 20 20 54 68 65 20 73 75 62  *  (11)  The sub
17610 71 75 65 72 79 20 61 6e 64 20 74 68 65 20 6f 75  query and the ou
17620 74 65 72 20 71 75 65 72 79 20 64 6f 20 6e 6f 74  ter query do not
17630 20 62 6f 74 68 20 68 61 76 65 20 4f 52 44 45 52   both have ORDER
17640 20 42 59 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a   BY clauses..**.
17650 2a 2a 20 20 28 2a 2a 29 20 20 4e 6f 74 20 69 6d  **  (**)  Not im
17660 70 6c 65 6d 65 6e 74 65 64 2e 20 20 53 75 62 73  plemented.  Subs
17670 75 6d 65 64 20 69 6e 74 6f 20 72 65 73 74 72 69  umed into restri
17680 63 74 69 6f 6e 20 28 33 29 2e 20 20 57 61 73 20  ction (3).  Was 
17690 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 20 20  previously.**   
176a0 20 20 20 20 20 61 20 73 65 70 61 72 61 74 65 20       a separate 
176b0 72 65 73 74 72 69 63 74 69 6f 6e 20 64 65 72 69  restriction deri
176c0 76 69 6e 67 20 66 72 6f 6d 20 74 69 63 6b 65 74  ving from ticket
176d0 20 23 33 35 30 2e 0a 2a 2a 0a 2a 2a 20 20 28 31   #350..**.**  (1
176e0 33 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  3)  The subquery
176f0 20 61 6e 64 20 6f 75 74 65 72 20 71 75 65 72 79   and outer query
17700 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20 75 73 65   do not both use
17710 20 4c 49 4d 49 54 2e 0a 2a 2a 0a 2a 2a 20 20 28   LIMIT..**.**  (
17720 31 34 29 20 20 54 68 65 20 73 75 62 71 75 65 72  14)  The subquer
17730 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4f  y does not use O
17740 46 46 53 45 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31  FFSET..**.**  (1
17750 35 29 20 20 54 68 65 20 6f 75 74 65 72 20 71 75  5)  The outer qu
17760 65 72 79 20 69 73 20 6e 6f 74 20 70 61 72 74 20  ery is not part 
17770 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65  of a compound se
17780 6c 65 63 74 20 6f 72 20 74 68 65 0a 2a 2a 20 20  lect or the.**  
17790 20 20 20 20 20 20 73 75 62 71 75 65 72 79 20 64        subquery d
177a0 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 61 20 4c  oes not have a L
177b0 49 4d 49 54 20 63 6c 61 75 73 65 2e 0a 2a 2a 20  IMIT clause..** 
177c0 20 20 20 20 20 20 20 28 53 65 65 20 74 69 63 6b         (See tick
177d0 65 74 20 23 32 33 33 39 20 61 6e 64 20 74 69 63  et #2339 and tic
177e0 6b 65 74 20 5b 30 32 61 38 65 38 31 64 34 34 5d  ket [02a8e81d44]
177f0 29 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 36 29 20 20  )..**.**  (16)  
17800 54 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  The outer query 
17810 69 73 20 6e 6f 74 20 61 6e 20 61 67 67 72 65 67  is not an aggreg
17820 61 74 65 20 6f 72 20 74 68 65 20 73 75 62 71 75  ate or the subqu
17830 65 72 79 20 64 6f 65 73 0a 2a 2a 20 20 20 20 20  ery does.**     
17840 20 20 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 4f     not contain O
17850 52 44 45 52 20 42 59 2e 20 20 28 54 69 63 6b 65  RDER BY.  (Ticke
17860 74 20 23 32 39 34 32 29 20 20 54 68 69 73 20 75  t #2942)  This u
17870 73 65 64 20 74 6f 20 6e 6f 74 20 6d 61 74 74 65  sed to not matte
17880 72 0a 2a 2a 20 20 20 20 20 20 20 20 75 6e 74 69  r.**        unti
17890 6c 20 77 65 20 69 6e 74 72 6f 64 75 63 65 64 20  l we introduced 
178a0 74 68 65 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74  the group_concat
178b0 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20 0a 2a  () function.  .*
178c0 2a 0a 2a 2a 20 20 28 31 37 29 20 20 54 68 65 20  *.**  (17)  The 
178d0 73 75 62 2d 71 75 65 72 79 20 69 73 20 6e 6f 74  sub-query is not
178e0 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65   a compound sele
178f0 63 74 2c 20 6f 72 20 69 74 20 69 73 20 61 20 55  ct, or it is a U
17900 4e 49 4f 4e 20 41 4c 4c 20 0a 2a 2a 20 20 20 20  NION ALL .**    
17910 20 20 20 20 63 6f 6d 70 6f 75 6e 64 20 63 6c 61      compound cla
17920 75 73 65 20 6d 61 64 65 20 75 70 20 65 6e 74 69  use made up enti
17930 72 65 6c 79 20 6f 66 20 6e 6f 6e 2d 61 67 67 72  rely of non-aggr
17940 65 67 61 74 65 20 71 75 65 72 69 65 73 2c 20 61  egate queries, a
17950 6e 64 20 0a 2a 2a 20 20 20 20 20 20 20 20 74 68  nd .**        th
17960 65 20 70 61 72 65 6e 74 20 71 75 65 72 79 3a 0a  e parent query:.
17970 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2a  **.**          *
17980 20 69 73 20 6e 6f 74 20 69 74 73 65 6c 66 20 70   is not itself p
17990 61 72 74 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e  art of a compoun
179a0 64 20 73 65 6c 65 63 74 2c 0a 2a 2a 20 20 20 20  d select,.**    
179b0 20 20 20 20 20 20 2a 20 69 73 20 6e 6f 74 20 61        * is not a
179c0 6e 20 61 67 67 72 65 67 61 74 65 20 6f 72 20 44  n aggregate or D
179d0 49 53 54 49 4e 43 54 20 71 75 65 72 79 2c 20 61  ISTINCT query, a
179e0 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2a  nd.**          *
179f0 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 0a 2a   is not a join.*
17a00 2a 0a 2a 2a 20 20 20 20 20 20 20 20 54 68 65 20  *.**        The 
17a10 70 61 72 65 6e 74 20 61 6e 64 20 73 75 62 2d 71  parent and sub-q
17a20 75 65 72 79 20 6d 61 79 20 63 6f 6e 74 61 69 6e  uery may contain
17a30 20 57 48 45 52 45 20 63 6c 61 75 73 65 73 2e 20   WHERE clauses. 
17a40 53 75 62 6a 65 63 74 20 74 6f 0a 2a 2a 20 20 20  Subject to.**   
17a50 20 20 20 20 20 72 75 6c 65 73 20 28 31 31 29 2c       rules (11),
17a60 20 28 31 33 29 20 61 6e 64 20 28 31 34 29 2c 20   (13) and (14), 
17a70 74 68 65 79 20 6d 61 79 20 61 6c 73 6f 20 63 6f  they may also co
17a80 6e 74 61 69 6e 20 4f 52 44 45 52 20 42 59 2c 0a  ntain ORDER BY,.
17a90 2a 2a 20 20 20 20 20 20 20 20 4c 49 4d 49 54 20  **        LIMIT 
17aa0 61 6e 64 20 4f 46 46 53 45 54 20 63 6c 61 75 73  and OFFSET claus
17ab0 65 73 2e 20 20 54 68 65 20 73 75 62 71 75 65 72  es.  The subquer
17ac0 79 20 63 61 6e 6e 6f 74 20 75 73 65 20 61 6e 79  y cannot use any
17ad0 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20 20 20   compound.**    
17ae0 20 20 20 20 6f 70 65 72 61 74 6f 72 20 6f 74 68      operator oth
17af0 65 72 20 74 68 61 6e 20 55 4e 49 4f 4e 20 41 4c  er than UNION AL
17b00 4c 20 62 65 63 61 75 73 65 20 61 6c 6c 20 74 68  L because all th
17b10 65 20 6f 74 68 65 72 20 63 6f 6d 70 6f 75 6e 64  e other compound
17b20 0a 2a 2a 20 20 20 20 20 20 20 20 6f 70 65 72 61  .**        opera
17b30 74 6f 72 73 20 68 61 76 65 20 61 6e 20 69 6d 70  tors have an imp
17b40 6c 69 65 64 20 44 49 53 54 49 4e 43 54 20 77 68  lied DISTINCT wh
17b50 69 63 68 20 69 73 20 64 69 73 61 6c 6c 6f 77 65  ich is disallowe
17b60 64 20 62 79 0a 2a 2a 20 20 20 20 20 20 20 20 72  d by.**        r
17b70 65 73 74 72 69 63 74 69 6f 6e 20 28 34 29 2e 0a  estriction (4)..
17b80 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 41 6c 73  **.**        Als
17b90 6f 2c 20 65 61 63 68 20 63 6f 6d 70 6f 6e 65 6e  o, each componen
17ba0 74 20 6f 66 20 74 68 65 20 73 75 62 2d 71 75 65  t of the sub-que
17bb0 72 79 20 6d 75 73 74 20 72 65 74 75 72 6e 20 74  ry must return t
17bc0 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 0a 2a  he same number.*
17bd0 2a 20 20 20 20 20 20 20 20 6f 66 20 72 65 73 75  *        of resu
17be0 6c 74 20 63 6f 6c 75 6d 6e 73 2e 20 54 68 69 73  lt columns. This
17bf0 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61 20 72   is actually a r
17c00 65 71 75 69 72 65 6d 65 6e 74 20 66 6f 72 20 61  equirement for a
17c10 6e 79 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20  ny compound.**  
17c20 20 20 20 20 20 20 53 45 4c 45 43 54 20 73 74 61        SELECT sta
17c30 74 65 6d 65 6e 74 2c 20 62 75 74 20 61 6c 6c 20  tement, but all 
17c40 74 68 65 20 63 6f 64 65 20 68 65 72 65 20 64 6f  the code here do
17c50 65 73 20 69 73 20 6d 61 6b 65 20 73 75 72 65 20  es is make sure 
17c60 74 68 61 74 20 6e 6f 0a 2a 2a 20 20 20 20 20 20  that no.**      
17c70 20 20 73 75 63 68 20 28 69 6c 6c 65 67 61 6c 29    such (illegal)
17c80 20 73 75 62 2d 71 75 65 72 79 20 69 73 20 66 6c   sub-query is fl
17c90 61 74 74 65 6e 65 64 2e 20 54 68 65 20 63 61 6c  attened. The cal
17ca0 6c 65 72 20 77 69 6c 6c 20 64 65 74 65 63 74 20  ler will detect 
17cb0 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 73 79  the.**        sy
17cc0 6e 74 61 78 20 65 72 72 6f 72 20 61 6e 64 20 72  ntax error and r
17cd0 65 74 75 72 6e 20 61 20 64 65 74 61 69 6c 65 64  eturn a detailed
17ce0 20 6d 65 73 73 61 67 65 2e 0a 2a 2a 0a 2a 2a 20   message..**.** 
17cf0 20 28 31 38 29 20 20 49 66 20 74 68 65 20 73 75   (18)  If the su
17d00 62 2d 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d  b-query is a com
17d10 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20 74 68  pound select, th
17d20 65 6e 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20  en all terms of 
17d30 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 4f 52  the.**        OR
17d40 44 45 52 20 62 79 20 63 6c 61 75 73 65 20 6f 66  DER by clause of
17d50 20 74 68 65 20 70 61 72 65 6e 74 20 6d 75 73 74   the parent must
17d60 20 62 65 20 73 69 6d 70 6c 65 20 72 65 66 65 72   be simple refer
17d70 65 6e 63 65 73 20 74 6f 20 0a 2a 2a 20 20 20 20  ences to .**    
17d80 20 20 20 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74      columns of t
17d90 68 65 20 73 75 62 2d 71 75 65 72 79 2e 0a 2a 2a  he sub-query..**
17da0 0a 2a 2a 20 20 28 31 39 29 20 20 54 68 65 20 73  .**  (19)  The s
17db0 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  ubquery does not
17dc0 20 75 73 65 20 4c 49 4d 49 54 20 6f 72 20 74 68   use LIMIT or th
17dd0 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f  e outer query do
17de0 65 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20  es not.**       
17df0 20 68 61 76 65 20 61 20 57 48 45 52 45 20 63 6c   have a WHERE cl
17e00 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 30  ause..**.**  (20
17e10 29 20 20 49 66 20 74 68 65 20 73 75 62 2d 71 75  )  If the sub-qu
17e20 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e  ery is a compoun
17e30 64 20 73 65 6c 65 63 74 2c 20 74 68 65 6e 20 69  d select, then i
17e40 74 20 6d 75 73 74 20 6e 6f 74 20 75 73 65 0a 2a  t must not use.*
17e50 2a 20 20 20 20 20 20 20 20 61 6e 20 4f 52 44 45  *        an ORDE
17e60 52 20 42 59 20 63 6c 61 75 73 65 2e 20 20 54 69  R BY clause.  Ti
17e70 63 6b 65 74 20 23 33 37 37 33 2e 20 20 57 65 20  cket #3773.  We 
17e80 63 6f 75 6c 64 20 72 65 6c 61 78 20 74 68 69 73  could relax this
17e90 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 20   constraint.**  
17ea0 20 20 20 20 20 20 73 6f 6d 65 77 68 61 74 20 62        somewhat b
17eb0 79 20 73 61 79 69 6e 67 20 74 68 61 74 20 74 68  y saying that th
17ec0 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 4f  e terms of the O
17ed0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 6d  RDER BY clause m
17ee0 75 73 74 0a 2a 2a 20 20 20 20 20 20 20 20 61 70  ust.**        ap
17ef0 70 65 61 72 20 61 73 20 75 6e 6d 6f 64 69 66 69  pear as unmodifi
17f00 65 64 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  ed result column
17f10 73 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71  s in the outer q
17f20 75 65 72 79 2e 20 20 42 75 74 20 77 65 0a 2a 2a  uery.  But we.**
17f30 20 20 20 20 20 20 20 20 68 61 76 65 20 6f 74 68          have oth
17f40 65 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73  er optimizations
17f50 20 69 6e 20 6d 69 6e 64 20 74 6f 20 64 65 61 6c   in mind to deal
17f60 20 77 69 74 68 20 74 68 61 74 20 63 61 73 65 2e   with that case.
17f70 0a 2a 2a 0a 2a 2a 20 20 28 32 31 29 20 20 54 68  .**.**  (21)  Th
17f80 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20  e subquery does 
17f90 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 20 6f 72  not use LIMIT or
17fa0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
17fb0 20 69 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20   is not.**      
17fc0 20 20 44 49 53 54 49 4e 43 54 2e 20 20 28 53 65    DISTINCT.  (Se
17fd0 65 20 74 69 63 6b 65 74 20 5b 37 35 32 65 31 36  e ticket [752e16
17fe0 34 36 66 63 5d 29 2e 0a 2a 2a 0a 2a 2a 20 49 6e  46fc])..**.** In
17ff0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 74   this routine, t
18000 68 65 20 22 70 22 20 70 61 72 61 6d 65 74 65 72  he "p" parameter
18010 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
18020 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
18030 2e 0a 2a 2a 20 54 68 65 20 73 75 62 71 75 65 72  ..** The subquer
18040 79 20 69 73 20 70 2d 3e 70 53 72 63 2d 3e 61 5b  y is p->pSrc->a[
18050 69 46 72 6f 6d 5d 2e 20 20 69 73 41 67 67 20 69  iFrom].  isAgg i
18060 73 20 74 72 75 65 20 69 66 20 74 68 65 20 6f 75  s true if the ou
18070 74 65 72 20 71 75 65 72 79 0a 2a 2a 20 75 73 65  ter query.** use
18080 73 20 61 67 67 72 65 67 61 74 65 73 20 61 6e 64  s aggregates and
18090 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20 69   subqueryIsAgg i
180a0 73 20 74 72 75 65 20 69 66 20 74 68 65 20 73 75  s true if the su
180b0 62 71 75 65 72 79 20 75 73 65 73 20 61 67 67 72  bquery uses aggr
180c0 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  egates..**.** If
180d0 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 6e   flattening is n
180e0 6f 74 20 61 74 74 65 6d 70 74 65 64 2c 20 74 68  ot attempted, th
180f0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
18100 6e 6f 2d 6f 70 20 61 6e 64 20 72 65 74 75 72 6e  no-op and return
18110 73 20 30 2e 0a 2a 2a 20 49 66 20 66 6c 61 74 74  s 0..** If flatt
18120 65 6e 69 6e 67 20 69 73 20 61 74 74 65 6d 70 74  ening is attempt
18130 65 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ed this routine 
18140 72 65 74 75 72 6e 73 20 31 2e 0a 2a 2a 0a 2a 2a  returns 1..**.**
18150 20 41 6c 6c 20 6f 66 20 74 68 65 20 65 78 70 72   All of the expr
18160 65 73 73 69 6f 6e 20 61 6e 61 6c 79 73 69 73 20  ession analysis 
18170 6d 75 73 74 20 6f 63 63 75 72 20 6f 6e 20 62 6f  must occur on bo
18180 74 68 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  th the outer que
18190 72 79 20 61 6e 64 0a 2a 2a 20 74 68 65 20 73 75  ry and.** the su
181a0 62 71 75 65 72 79 20 62 65 66 6f 72 65 20 74 68  bquery before th
181b0 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 2e  is routine runs.
181c0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
181d0 6c 61 74 74 65 6e 53 75 62 71 75 65 72 79 28 0a  lattenSubquery(.
181e0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
181f0 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
18200 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  g context */.  S
18210 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
18220 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 65 6e      /* The paren
18230 74 20 6f 72 20 6f 75 74 65 72 20 53 45 4c 45 43  t or outer SELEC
18240 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  T statement */. 
18250 20 69 6e 74 20 69 46 72 6f 6d 2c 20 20 20 20 20   int iFrom,     
18260 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69        /* Index i
18270 6e 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 5d 20 6f  n p->pSrc->a[] o
18280 66 20 74 68 65 20 69 6e 6e 65 72 20 73 75 62 71  f the inner subq
18290 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 73  uery */.  int is
182a0 41 67 67 2c 20 20 20 20 20 20 20 20 20 20 20 2f  Agg,           /
182b0 2a 20 54 72 75 65 20 69 66 20 6f 75 74 65 72 20  * True if outer 
182c0 53 45 4c 45 43 54 20 75 73 65 73 20 61 67 67 72  SELECT uses aggr
182d0 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20  egate functions 
182e0 2a 2f 0a 20 20 69 6e 74 20 73 75 62 71 75 65 72  */.  int subquer
182f0 79 49 73 41 67 67 20 20 20 20 2f 2a 20 54 72 75  yIsAgg    /* Tru
18300 65 20 69 66 20 74 68 65 20 73 75 62 71 75 65 72  e if the subquer
18310 79 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65  y uses aggregate
18320 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 29 7b   functions */.){
18330 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
18340 53 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74  SavedAuthContext
18350 20 3d 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68   = pParse->zAuth
18360 43 6f 6e 74 65 78 74 3b 0a 20 20 53 65 6c 65 63  Context;.  Selec
18370 74 20 2a 70 50 61 72 65 6e 74 3b 0a 20 20 53 65  t *pParent;.  Se
18380 6c 65 63 74 20 2a 70 53 75 62 3b 20 20 20 20 20  lect *pSub;     
18390 20 20 2f 2a 20 54 68 65 20 69 6e 6e 65 72 20 71    /* The inner q
183a0 75 65 72 79 20 6f 72 20 22 73 75 62 71 75 65 72  uery or "subquer
183b0 79 22 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  y" */.  Select *
183c0 70 53 75 62 31 3b 20 20 20 20 20 20 2f 2a 20 50  pSub1;      /* P
183d0 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 72 69  ointer to the ri
183e0 67 68 74 6d 6f 73 74 20 73 65 6c 65 63 74 20 69  ghtmost select i
183f0 6e 20 73 75 62 2d 71 75 65 72 79 20 2a 2f 0a 20  n sub-query */. 
18400 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 20   SrcList *pSrc; 
18410 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d       /* The FROM
18420 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f   clause of the o
18430 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 20 20  uter query */.  
18440 53 72 63 4c 69 73 74 20 2a 70 53 75 62 53 72 63  SrcList *pSubSrc
18450 3b 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20  ;   /* The FROM 
18460 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 73 75  clause of the su
18470 62 71 75 65 72 79 20 2a 2f 0a 20 20 45 78 70 72  bquery */.  Expr
18480 4c 69 73 74 20 2a 70 4c 69 73 74 3b 20 20 20 20  List *pList;    
18490 2f 2a 20 54 68 65 20 72 65 73 75 6c 74 20 73 65  /* The result se
184a0 74 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71  t of the outer q
184b0 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 50  uery */.  int iP
184c0 61 72 65 6e 74 3b 20 20 20 20 20 20 20 20 2f 2a  arent;        /*
184d0 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d   VDBE cursor num
184e0 62 65 72 20 6f 66 20 74 68 65 20 70 53 75 62 20  ber of the pSub 
184f0 72 65 73 75 6c 74 20 73 65 74 20 74 65 6d 70 20  result set temp 
18500 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69  table */.  int i
18510 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
18520 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
18530 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65  /.  Expr *pWhere
18540 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
18550 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
18560 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74  E clause */.  st
18570 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
18580 6d 20 2a 70 53 75 62 69 74 65 6d 3b 20 20 20 2f  m *pSubitem;   /
18590 2a 20 54 68 65 20 73 75 62 71 75 65 72 79 20 2a  * The subquery *
185a0 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
185b0 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20  = pParse->db;.. 
185c0 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   /* Check to see
185d0 20 69 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69   if flattening i
185e0 73 20 70 65 72 6d 69 74 74 65 64 2e 20 20 52 65  s permitted.  Re
185f0 74 75 72 6e 20 30 20 69 66 20 6e 6f 74 2e 0a 20  turn 0 if not.. 
18600 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 21   */.  assert( p!
18610 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
18620 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 3b 20  p->pPrior==0 ); 
18630 20 2f 2a 20 55 6e 61 62 6c 65 20 74 6f 20 66 6c   /* Unable to fl
18640 61 74 74 65 6e 20 63 6f 6d 70 6f 75 6e 64 20 71  atten compound q
18650 75 65 72 69 65 73 20 2a 2f 0a 20 20 69 66 28 20  ueries */.  if( 
18660 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 44 69 73 61  OptimizationDisa
18670 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f  bled(db, SQLITE_
18680 51 75 65 72 79 46 6c 61 74 74 65 6e 65 72 29 20  QueryFlattener) 
18690 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 53  ) return 0;.  pS
186a0 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20  rc = p->pSrc;.  
186b0 61 73 73 65 72 74 28 20 70 53 72 63 20 26 26 20  assert( pSrc && 
186c0 69 46 72 6f 6d 3e 3d 30 20 26 26 20 69 46 72 6f  iFrom>=0 && iFro
186d0 6d 3c 70 53 72 63 2d 3e 6e 53 72 63 20 29 3b 0a  m<pSrc->nSrc );.
186e0 20 20 70 53 75 62 69 74 65 6d 20 3d 20 26 70 53    pSubitem = &pS
186f0 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 3b 0a 20 20  rc->a[iFrom];.  
18700 69 50 61 72 65 6e 74 20 3d 20 70 53 75 62 69 74  iParent = pSubit
18710 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 70  em->iCursor;.  p
18720 53 75 62 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e  Sub = pSubitem->
18730 70 53 65 6c 65 63 74 3b 0a 20 20 61 73 73 65 72  pSelect;.  asser
18740 74 28 20 70 53 75 62 21 3d 30 20 29 3b 0a 20 20  t( pSub!=0 );.  
18750 69 66 28 20 69 73 41 67 67 20 26 26 20 73 75 62  if( isAgg && sub
18760 71 75 65 72 79 49 73 41 67 67 20 29 20 72 65 74  queryIsAgg ) ret
18770 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
18780 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
18790 63 74 69 6f 6e 20 28 31 29 20 20 2a 2f 0a 20 20  ction (1)  */.  
187a0 69 66 28 20 73 75 62 71 75 65 72 79 49 73 41 67  if( subqueryIsAg
187b0 67 20 26 26 20 70 53 72 63 2d 3e 6e 53 72 63 3e  g && pSrc->nSrc>
187c0 31 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  1 ) return 0;   
187d0 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
187e0 63 74 69 6f 6e 20 28 32 29 20 20 2a 2f 0a 20 20  ction (2)  */.  
187f0 70 53 75 62 53 72 63 20 3d 20 70 53 75 62 2d 3e  pSubSrc = pSub->
18800 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  pSrc;.  assert( 
18810 70 53 75 62 53 72 63 20 29 3b 0a 20 20 2f 2a 20  pSubSrc );.  /* 
18820 50 72 69 6f 72 20 74 6f 20 76 65 72 73 69 6f 6e  Prior to version
18830 20 33 2e 31 2e 32 2c 20 77 68 65 6e 20 4c 49 4d   3.1.2, when LIM
18840 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20 68 61  IT and OFFSET ha
18850 64 20 74 6f 20 62 65 20 73 69 6d 70 6c 65 20 63  d to be simple c
18860 6f 6e 73 74 61 6e 74 73 2c 0a 20 20 2a 2a 20 6e  onstants,.  ** n
18870 6f 74 20 61 72 62 69 74 72 61 72 79 20 65 78 70  ot arbitrary exp
18880 72 65 73 73 73 69 6f 6e 73 2c 20 77 65 20 61 6c  resssions, we al
18890 6c 6f 77 65 64 20 73 6f 6d 65 20 63 6f 6d 62 69  lowed some combi
188a0 6e 69 6e 67 20 6f 66 20 4c 49 4d 49 54 20 61 6e  ning of LIMIT an
188b0 64 20 4f 46 46 53 45 54 0a 20 20 2a 2a 20 62 65  d OFFSET.  ** be
188c0 63 61 75 73 65 20 74 68 65 79 20 63 6f 75 6c 64  cause they could
188d0 20 62 65 20 63 6f 6d 70 75 74 65 64 20 61 74 20   be computed at 
188e0 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2e 20 20 42  compile-time.  B
188f0 75 74 20 77 68 65 6e 20 4c 49 4d 49 54 20 61 6e  ut when LIMIT an
18900 64 20 4f 46 46 53 45 54 0a 20 20 2a 2a 20 62 65  d OFFSET.  ** be
18910 63 61 6d 65 20 61 72 62 69 74 72 61 72 79 20 65  came arbitrary e
18920 78 70 72 65 73 73 69 6f 6e 73 2c 20 77 65 20 77  xpressions, we w
18930 65 72 65 20 66 6f 72 63 65 64 20 74 6f 20 61 64  ere forced to ad
18940 64 20 72 65 73 74 72 69 63 74 69 6f 6e 73 20 28  d restrictions (
18950 31 33 29 0a 20 20 2a 2a 20 61 6e 64 20 28 31 34  13).  ** and (14
18960 29 2e 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62  ). */.  if( pSub
18970 2d 3e 70 4c 69 6d 69 74 20 26 26 20 70 2d 3e 70  ->pLimit && p->p
18980 4c 69 6d 69 74 20 29 20 72 65 74 75 72 6e 20 30  Limit ) return 0
18990 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
189a0 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31  * Restriction (1
189b0 33 29 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62  3) */.  if( pSub
189c0 2d 3e 70 4f 66 66 73 65 74 20 29 20 72 65 74 75  ->pOffset ) retu
189d0 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
189e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
189f0 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31  * Restriction (1
18a00 34 29 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  4) */.  if( p->p
18a10 52 69 67 68 74 6d 6f 73 74 20 26 26 20 70 53 75  Rightmost && pSu
18a20 62 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20  b->pLimit ){.   
18a30 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
18a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18a60 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
18a70 74 69 6f 6e 20 28 31 35 29 20 2a 2f 0a 20 20 7d  tion (15) */.  }
18a80 0a 20 20 69 66 28 20 70 53 75 62 53 72 63 2d 3e  .  if( pSubSrc->
18a90 6e 53 72 63 3d 3d 30 20 29 20 72 65 74 75 72 6e  nSrc==0 ) return
18aa0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
18ab0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
18ac0 74 72 69 63 74 69 6f 6e 20 28 37 29 20 20 2a 2f  triction (7)  */
18ad0 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 73 65 6c  .  if( pSub->sel
18ae0 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69  Flags & SF_Disti
18af0 6e 63 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20  nct ) return 0; 
18b00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
18b10 74 72 69 63 74 69 6f 6e 20 28 35 29 20 20 2a 2f  triction (5)  */
18b20 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69  .  if( pSub->pLi
18b30 6d 69 74 20 26 26 20 28 70 53 72 63 2d 3e 6e 53  mit && (pSrc->nS
18b40 72 63 3e 31 20 7c 7c 20 69 73 41 67 67 29 20 29  rc>1 || isAgg) )
18b50 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  {.     return 0;
18b60 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
18b70 72 69 63 74 69 6f 6e 73 20 28 38 29 28 39 29 20  rictions (8)(9) 
18b80 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 2d  */.  }.  if( (p-
18b90 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44  >selFlags & SF_D
18ba0 69 73 74 69 6e 63 74 29 21 3d 30 20 26 26 20 73  istinct)!=0 && s
18bb0 75 62 71 75 65 72 79 49 73 41 67 67 20 29 7b 0a  ubqueryIsAgg ){.
18bc0 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20       return 0;  
18bd0 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
18be0 63 74 69 6f 6e 20 28 36 29 20 20 2a 2f 0a 20 20  ction (6)  */.  
18bf0 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65  }.  if( p->pOrde
18c00 72 42 79 20 26 26 20 70 53 75 62 2d 3e 70 4f 72  rBy && pSub->pOr
18c10 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 72 65  derBy ){.     re
18c20 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
18c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18c50 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
18c60 20 28 31 31 29 20 2a 2f 0a 20 20 7d 0a 20 20 69   (11) */.  }.  i
18c70 66 28 20 69 73 41 67 67 20 26 26 20 70 53 75 62  f( isAgg && pSub
18c80 2d 3e 70 4f 72 64 65 72 42 79 20 29 20 72 65 74  ->pOrderBy ) ret
18c90 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
18ca0 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
18cb0 74 69 6f 6e 20 28 31 36 29 20 2a 2f 0a 20 20 69  tion (16) */.  i
18cc0 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20  f( pSub->pLimit 
18cd0 26 26 20 70 2d 3e 70 57 68 65 72 65 20 29 20 72  && p->pWhere ) r
18ce0 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
18cf0 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
18d00 74 69 6f 6e 20 28 31 39 29 20 2a 2f 0a 20 20 69  tion (19) */.  i
18d10 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20  f( pSub->pLimit 
18d20 26 26 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20  && (p->selFlags 
18d30 26 20 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d  & SF_Distinct)!=
18d40 30 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e  0 ){.     return
18d50 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52   0;         /* R
18d60 65 73 74 72 69 63 74 69 6f 6e 20 28 32 31 29 20  estriction (21) 
18d70 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 42 53  */.  }..  /* OBS
18d80 4f 4c 45 54 45 20 43 4f 4d 4d 45 4e 54 20 31 3a  OLETE COMMENT 1:
18d90 0a 20 20 2a 2a 20 52 65 73 74 72 69 63 74 69 6f  .  ** Restrictio
18da0 6e 20 33 3a 20 20 49 66 20 74 68 65 20 73 75 62  n 3:  If the sub
18db0 71 75 65 72 79 20 69 73 20 61 20 6a 6f 69 6e 2c  query is a join,
18dc0 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 73   make sure the s
18dd0 75 62 71 75 65 72 79 20 69 73 20 0a 20 20 2a 2a  ubquery is .  **
18de0 20 6e 6f 74 20 75 73 65 64 20 61 73 20 74 68 65   not used as the
18df0 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f   right operand o
18e00 66 20 61 6e 20 6f 75 74 65 72 20 6a 6f 69 6e 2e  f an outer join.
18e10 20 20 45 78 61 6d 70 6c 65 73 20 6f 66 20 77 68    Examples of wh
18e20 79 20 74 68 69 73 0a 20 20 2a 2a 20 69 73 20 6e  y this.  ** is n
18e30 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a  ot allowed:.  **
18e40 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74 31  .  **         t1
18e50 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e   LEFT OUTER JOIN
18e60 20 28 74 32 20 4a 4f 49 4e 20 74 33 29 0a 20 20   (t2 JOIN t3).  
18e70 2a 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20 66 6c  **.  ** If we fl
18e80 61 74 74 65 6e 20 74 68 65 20 61 62 6f 76 65 2c  atten the above,
18e90 20 77 65 20 77 6f 75 6c 64 20 67 65 74 0a 20 20   we would get.  
18ea0 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20  **.  **         
18eb0 28 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a  (t1 LEFT OUTER J
18ec0 4f 49 4e 20 74 32 29 20 4a 4f 49 4e 20 74 33 0a  OIN t2) JOIN t3.
18ed0 20 20 2a 2a 0a 20 20 2a 2a 20 77 68 69 63 68 20    **.  ** which 
18ee0 69 73 20 6e 6f 74 20 61 74 20 61 6c 6c 20 74 68  is not at all th
18ef0 65 20 73 61 6d 65 20 74 68 69 6e 67 2e 0a 20 20  e same thing..  
18f00 2a 2a 0a 20 20 2a 2a 20 4f 42 53 4f 4c 45 54 45  **.  ** OBSOLETE
18f10 20 43 4f 4d 4d 45 4e 54 20 32 3a 0a 20 20 2a 2a   COMMENT 2:.  **
18f20 20 52 65 73 74 72 69 63 74 69 6f 6e 20 31 32 3a   Restriction 12:
18f30 20 20 49 66 20 74 68 65 20 73 75 62 71 75 65 72    If the subquer
18f40 79 20 69 73 20 74 68 65 20 72 69 67 68 74 20 6f  y is the right o
18f50 70 65 72 61 6e 64 20 6f 66 20 61 20 6c 65 66 74  perand of a left
18f60 20 6f 75 74 65 72 0a 20 20 2a 2a 20 6a 6f 69 6e   outer.  ** join
18f70 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20  , make sure the 
18f80 73 75 62 71 75 65 72 79 20 68 61 73 20 6e 6f 20  subquery has no 
18f90 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 20 20  WHERE clause..  
18fa0 2a 2a 20 41 6e 20 65 78 61 6d 70 6c 65 73 20 6f  ** An examples o
18fb0 66 20 77 68 79 20 74 68 69 73 20 69 73 20 6e 6f  f why this is no
18fc0 74 20 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a  t allowed:.  **.
18fd0 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74 31 20    **         t1 
18fe0 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20  LEFT OUTER JOIN 
18ff0 28 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74  (SELECT * FROM t
19000 32 20 57 48 45 52 45 20 74 32 2e 78 3e 30 29 0a  2 WHERE t2.x>0).
19010 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20    **.  ** If we 
19020 66 6c 61 74 74 65 6e 20 74 68 65 20 61 62 6f 76  flatten the abov
19030 65 2c 20 77 65 20 77 6f 75 6c 64 20 67 65 74 0a  e, we would get.
19040 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20    **.  **       
19050 20 20 28 74 31 20 4c 45 46 54 20 4f 55 54 45 52    (t1 LEFT OUTER
19060 20 4a 4f 49 4e 20 74 32 29 20 57 48 45 52 45 20   JOIN t2) WHERE 
19070 74 32 2e 78 3e 30 0a 20 20 2a 2a 0a 20 20 2a 2a  t2.x>0.  **.  **
19080 20 42 75 74 20 74 68 65 20 74 32 2e 78 3e 30 20   But the t2.x>0 
19090 74 65 73 74 20 77 69 6c 6c 20 61 6c 77 61 79 73  test will always
190a0 20 66 61 69 6c 20 6f 6e 20 61 20 4e 55 4c 4c 20   fail on a NULL 
190b0 72 6f 77 20 6f 66 20 74 32 2c 20 77 68 69 63 68  row of t2, which
190c0 0a 20 20 2a 2a 20 65 66 66 65 63 74 69 76 65 6c  .  ** effectivel
190d0 79 20 63 6f 6e 76 65 72 74 73 20 74 68 65 20 4f  y converts the O
190e0 55 54 45 52 20 4a 4f 49 4e 20 69 6e 74 6f 20 61  UTER JOIN into a
190f0 6e 20 49 4e 4e 45 52 20 4a 4f 49 4e 2e 0a 20 20  n INNER JOIN..  
19100 2a 2a 0a 20 20 2a 2a 20 54 48 49 53 20 4f 56 45  **.  ** THIS OVE
19110 52 52 49 44 45 53 20 4f 42 53 4f 4c 45 54 45 20  RRIDES OBSOLETE 
19120 43 4f 4d 4d 45 4e 54 53 20 31 20 41 4e 44 20 32  COMMENTS 1 AND 2
19130 20 41 42 4f 56 45 3a 0a 20 20 2a 2a 20 54 69 63   ABOVE:.  ** Tic
19140 6b 65 74 20 23 33 33 30 30 20 73 68 6f 77 73 20  ket #3300 shows 
19150 74 68 61 74 20 66 6c 61 74 74 65 6e 69 6e 67 20  that flattening 
19160 74 68 65 20 72 69 67 68 74 20 74 65 72 6d 20 6f  the right term o
19170 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 0a 20 20  f a LEFT JOIN.  
19180 2a 2a 20 69 73 20 66 72 61 75 67 68 74 20 77 69  ** is fraught wi
19190 74 68 20 64 61 6e 67 65 72 2e 20 20 42 65 73 74  th danger.  Best
191a0 20 74 6f 20 61 76 6f 69 64 20 74 68 65 20 77 68   to avoid the wh
191b0 6f 6c 65 20 74 68 69 6e 67 2e 20 20 49 66 20 74  ole thing.  If t
191c0 68 65 0a 20 20 2a 2a 20 73 75 62 71 75 65 72 79  he.  ** subquery
191d0 20 69 73 20 74 68 65 20 72 69 67 68 74 20 74 65   is the right te
191e0 72 6d 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49  rm of a LEFT JOI
191f0 4e 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 66  N, then do not f
19200 6c 61 74 74 65 6e 2e 0a 20 20 2a 2f 0a 20 20 69  latten..  */.  i
19210 66 28 20 28 70 53 75 62 69 74 65 6d 2d 3e 6a 6f  f( (pSubitem->jo
19220 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55 54 45  intype & JT_OUTE
19230 52 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  R)!=0 ){.    ret
19240 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  urn 0;.  }..  /*
19250 20 52 65 73 74 72 69 63 74 69 6f 6e 20 31 37 3a   Restriction 17:
19260 20 49 66 20 74 68 65 20 73 75 62 2d 71 75 65 72   If the sub-quer
19270 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20  y is a compound 
19280 53 45 4c 45 43 54 2c 20 74 68 65 6e 20 69 74 20  SELECT, then it 
19290 6d 75 73 74 0a 20 20 2a 2a 20 75 73 65 20 6f 6e  must.  ** use on
192a0 6c 79 20 74 68 65 20 55 4e 49 4f 4e 20 41 4c 4c  ly the UNION ALL
192b0 20 6f 70 65 72 61 74 6f 72 2e 20 41 6e 64 20 6e   operator. And n
192c0 6f 6e 65 20 6f 66 20 74 68 65 20 73 69 6d 70 6c  one of the simpl
192d0 65 20 73 65 6c 65 63 74 20 71 75 65 72 69 65 73  e select queries
192e0 0a 20 20 2a 2a 20 74 68 61 74 20 6d 61 6b 65 20  .  ** that make 
192f0 75 70 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  up the compound 
19300 53 45 4c 45 43 54 20 61 72 65 20 61 6c 6c 6f 77  SELECT are allow
19310 65 64 20 74 6f 20 62 65 20 61 67 67 72 65 67 61  ed to be aggrega
19320 74 65 20 6f 72 20 64 69 73 74 69 6e 63 74 0a 20  te or distinct. 
19330 20 2a 2a 20 71 75 65 72 69 65 73 2e 0a 20 20 2a   ** queries..  *
19340 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 50  /.  if( pSub->pP
19350 72 69 6f 72 20 29 7b 0a 20 20 20 20 69 66 28 20  rior ){.    if( 
19360 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29  pSub->pOrderBy )
19370 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  {.      return 0
19380 3b 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f  ;  /* Restrictio
19390 6e 20 32 30 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  n 20 */.    }.  
193a0 20 20 69 66 28 20 69 73 41 67 67 20 7c 7c 20 28    if( isAgg || (
193b0 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
193c0 5f 44 69 73 74 69 6e 63 74 29 21 3d 30 20 7c 7c  _Distinct)!=0 ||
193d0 20 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20 29   pSrc->nSrc!=1 )
193e0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  {.      return 0
193f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
19400 70 53 75 62 31 3d 70 53 75 62 3b 20 70 53 75 62  pSub1=pSub; pSub
19410 31 3b 20 70 53 75 62 31 3d 70 53 75 62 31 2d 3e  1; pSub1=pSub1->
19420 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 20 20 74  pPrior){.      t
19430 65 73 74 63 61 73 65 28 20 28 70 53 75 62 31 2d  estcase( (pSub1-
19440 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f  >selFlags & (SF_
19450 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72  Distinct|SF_Aggr
19460 65 67 61 74 65 29 29 3d 3d 53 46 5f 44 69 73 74  egate))==SF_Dist
19470 69 6e 63 74 20 29 3b 0a 20 20 20 20 20 20 74 65  inct );.      te
19480 73 74 63 61 73 65 28 20 28 70 53 75 62 31 2d 3e  stcase( (pSub1->
19490 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44  selFlags & (SF_D
194a0 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65  istinct|SF_Aggre
194b0 67 61 74 65 29 29 3d 3d 53 46 5f 41 67 67 72 65  gate))==SF_Aggre
194c0 67 61 74 65 20 29 3b 0a 20 20 20 20 20 20 61 73  gate );.      as
194d0 73 65 72 74 28 20 70 53 75 62 2d 3e 70 53 72 63  sert( pSub->pSrc
194e0 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  !=0 );.      if(
194f0 20 28 70 53 75 62 31 2d 3e 73 65 6c 46 6c 61 67   (pSub1->selFlag
19500 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74  s & (SF_Distinct
19510 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 29 21  |SF_Aggregate))!
19520 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 53  =0.       || (pS
19530 75 62 31 2d 3e 70 50 72 69 6f 72 20 26 26 20 70  ub1->pPrior && p
19540 53 75 62 31 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c  Sub1->op!=TK_ALL
19550 29 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 53 75  ) .       || pSu
19560 62 31 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3c 31  b1->pSrc->nSrc<1
19570 0a 20 20 20 20 20 20 20 7c 7c 20 70 53 75 62 2d  .       || pSub-
19580 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d  >pEList->nExpr!=
19590 70 53 75 62 31 2d 3e 70 45 4c 69 73 74 2d 3e 6e  pSub1->pEList->n
195a0 45 78 70 72 0a 20 20 20 20 20 20 29 7b 0a 20 20  Expr.      ){.  
195b0 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
195c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 74 65        }.      te
195d0 73 74 63 61 73 65 28 20 70 53 75 62 31 2d 3e 70  stcase( pSub1->p
195e0 53 72 63 2d 3e 6e 53 72 63 3e 31 20 29 3b 0a 20  Src->nSrc>1 );. 
195f0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 73     }..    /* Res
19600 74 72 69 63 74 69 6f 6e 20 31 38 2e 20 2a 2f 0a  triction 18. */.
19610 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65      if( p->pOrde
19620 72 42 79 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  rBy ){.      int
19630 20 69 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69   ii;.      for(i
19640 69 3d 30 3b 20 69 69 3c 70 2d 3e 70 4f 72 64 65  i=0; ii<p->pOrde
19650 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 69 2b 2b  rBy->nExpr; ii++
19660 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
19670 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 69  ->pOrderBy->a[ii
19680 5d 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3d 3d 30  ].iOrderByCol==0
19690 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
196a0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
196b0 20 20 2f 2a 2a 2a 2a 2a 20 49 66 20 77 65 20 72    /***** If we r
196c0 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c  each this point,
196d0 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 70   flattening is p
196e0 65 72 6d 69 74 74 65 64 2e 20 2a 2a 2a 2a 2a 2f  ermitted. *****/
196f0 0a 0a 20 20 2f 2a 20 41 75 74 68 6f 72 69 7a 65  ..  /* Authorize
19700 20 74 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f   the subquery */
19710 0a 20 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68  .  pParse->zAuth
19720 43 6f 6e 74 65 78 74 20 3d 20 70 53 75 62 69 74  Context = pSubit
19730 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 54 45 53  em->zName;.  TES
19740 54 4f 4e 4c 59 28 69 20 3d 29 20 73 71 6c 69 74  TONLY(i =) sqlit
19750 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
19760 73 65 2c 20 53 51 4c 49 54 45 5f 53 45 4c 45 43  se, SQLITE_SELEC
19770 54 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 74  T, 0, 0, 0);.  t
19780 65 73 74 63 61 73 65 28 20 69 3d 3d 53 51 4c 49  estcase( i==SQLI
19790 54 45 5f 44 45 4e 59 20 29 3b 0a 20 20 70 50 61  TE_DENY );.  pPa
197a0 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78  rse->zAuthContex
197b0 74 20 3d 20 7a 53 61 76 65 64 41 75 74 68 43 6f  t = zSavedAuthCo
197c0 6e 74 65 78 74 3b 0a 0a 20 20 2f 2a 20 49 66 20  ntext;..  /* If 
197d0 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 69 73  the sub-query is
197e0 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45   a compound SELE
197f0 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68  CT statement, th
19800 65 6e 20 28 62 79 20 72 65 73 74 72 69 63 74 69  en (by restricti
19810 6f 6e 73 0a 20 20 2a 2a 20 31 37 20 61 6e 64 20  ons.  ** 17 and 
19820 31 38 20 61 62 6f 76 65 29 20 69 74 20 6d 75 73  18 above) it mus
19830 74 20 62 65 20 61 20 55 4e 49 4f 4e 20 41 4c 4c  t be a UNION ALL
19840 20 61 6e 64 20 74 68 65 20 70 61 72 65 6e 74 20   and the parent 
19850 71 75 65 72 79 20 6d 75 73 74 20 0a 20 20 2a 2a  query must .  **
19860 20 62 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a   be of the form:
19870 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53  .  **.  **     S
19880 45 4c 45 43 54 20 3c 65 78 70 72 2d 6c 69 73 74  ELECT <expr-list
19890 3e 20 46 52 4f 4d 20 28 3c 73 75 62 2d 71 75 65  > FROM (<sub-que
198a0 72 79 3e 29 20 3c 77 68 65 72 65 2d 63 6c 61 75  ry>) <where-clau
198b0 73 65 3e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 66  se> .  **.  ** f
198c0 6f 6c 6c 6f 77 65 64 20 62 79 20 61 6e 79 20 4f  ollowed by any O
198d0 52 44 45 52 20 42 59 2c 20 4c 49 4d 49 54 20 61  RDER BY, LIMIT a
198e0 6e 64 2f 6f 72 20 4f 46 46 53 45 54 20 63 6c 61  nd/or OFFSET cla
198f0 75 73 65 73 2e 20 54 68 69 73 20 62 6c 6f 63 6b  uses. This block
19900 0a 20 20 2a 2a 20 63 72 65 61 74 65 73 20 4e 2d  .  ** creates N-
19910 31 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65 20  1 copies of the 
19920 70 61 72 65 6e 74 20 71 75 65 72 79 20 77 69 74  parent query wit
19930 68 6f 75 74 20 61 6e 79 20 4f 52 44 45 52 20 42  hout any ORDER B
19940 59 2c 20 4c 49 4d 49 54 20 6f 72 20 0a 20 20 2a  Y, LIMIT or .  *
19950 2a 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73  * OFFSET clauses
19960 20 61 6e 64 20 6a 6f 69 6e 73 20 74 68 65 6d 20   and joins them 
19970 74 6f 20 74 68 65 20 6c 65 66 74 2d 68 61 6e 64  to the left-hand
19980 2d 73 69 64 65 20 6f 66 20 74 68 65 20 6f 72 69  -side of the ori
19990 67 69 6e 61 6c 0a 20 20 2a 2a 20 75 73 69 6e 67  ginal.  ** using
199a0 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61   UNION ALL opera
199b0 74 6f 72 73 2e 20 49 6e 20 74 68 69 73 20 63 61  tors. In this ca
199c0 73 65 20 4e 20 69 73 20 74 68 65 20 6e 75 6d 62  se N is the numb
199d0 65 72 20 6f 66 20 73 69 6d 70 6c 65 0a 20 20 2a  er of simple.  *
199e0 2a 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65  * select stateme
199f0 6e 74 73 20 69 6e 20 74 68 65 20 63 6f 6d 70 6f  nts in the compo
19a00 75 6e 64 20 73 75 62 2d 71 75 65 72 79 2e 0a 20  und sub-query.. 
19a10 20 2a 2a 0a 20 20 2a 2a 20 45 78 61 6d 70 6c 65   **.  ** Example
19a20 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
19a30 53 45 4c 45 43 54 20 61 2b 31 20 46 52 4f 4d 20  SELECT a+1 FROM 
19a40 28 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 53 45  (.  **        SE
19a50 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 61 62 0a  LECT x FROM tab.
19a60 20 20 2a 2a 20 20 20 20 20 20 20 20 55 4e 49 4f    **        UNIO
19a70 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 20  N ALL.  **      
19a80 20 20 53 45 4c 45 43 54 20 79 20 46 52 4f 4d 20    SELECT y FROM 
19a90 74 61 62 0a 20 20 2a 2a 20 20 20 20 20 20 20 20  tab.  **        
19aa0 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20  UNION ALL.  **  
19ab0 20 20 20 20 20 20 53 45 4c 45 43 54 20 61 62 73        SELECT abs
19ac0 28 7a 2a 32 29 20 46 52 4f 4d 20 74 61 62 32 0a  (z*2) FROM tab2.
19ad0 20 20 2a 2a 20 20 20 20 20 29 20 57 48 45 52 45    **     ) WHERE
19ae0 20 61 21 3d 35 20 4f 52 44 45 52 20 42 59 20 31   a!=5 ORDER BY 1
19af0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 72 61 6e 73  .  **.  ** Trans
19b00 66 6f 72 6d 65 64 20 69 6e 74 6f 3a 0a 20 20 2a  formed into:.  *
19b10 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43  *.  **     SELEC
19b20 54 20 78 2b 31 20 46 52 4f 4d 20 74 61 62 20 57  T x+1 FROM tab W
19b30 48 45 52 45 20 78 2b 31 21 3d 35 0a 20 20 2a 2a  HERE x+1!=5.  **
19b40 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20       UNION ALL. 
19b50 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 79   **     SELECT y
19b60 2b 31 20 46 52 4f 4d 20 74 61 62 20 57 48 45 52  +1 FROM tab WHER
19b70 45 20 79 2b 31 21 3d 35 0a 20 20 2a 2a 20 20 20  E y+1!=5.  **   
19b80 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a    UNION ALL.  **
19b90 20 20 20 20 20 53 45 4c 45 43 54 20 61 62 73 28       SELECT abs(
19ba0 7a 2a 32 29 2b 31 20 46 52 4f 4d 20 74 61 62 32  z*2)+1 FROM tab2
19bb0 20 57 48 45 52 45 20 61 62 73 28 7a 2a 32 29 2b   WHERE abs(z*2)+
19bc0 31 21 3d 35 0a 20 20 2a 2a 20 20 20 20 20 4f 52  1!=5.  **     OR
19bd0 44 45 52 20 42 59 20 31 0a 20 20 2a 2a 0a 20 20  DER BY 1.  **.  
19be0 2a 2a 20 57 65 20 63 61 6c 6c 20 74 68 69 73 20  ** We call this 
19bf0 74 68 65 20 22 63 6f 6d 70 6f 75 6e 64 2d 73 75  the "compound-su
19c00 62 71 75 65 72 79 20 66 6c 61 74 74 65 6e 69 6e  bquery flattenin
19c10 67 22 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70  g"..  */.  for(p
19c20 53 75 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72  Sub=pSub->pPrior
19c30 3b 20 70 53 75 62 3b 20 70 53 75 62 3d 70 53 75  ; pSub; pSub=pSu
19c40 62 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20  b->pPrior){.    
19c50 53 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20  Select *pNew;.  
19c60 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
19c70 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72  erBy = p->pOrder
19c80 42 79 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 4c  By;.    Expr *pL
19c90 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74  imit = p->pLimit
19ca0 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 4f 66 66  ;.    Expr *pOff
19cb0 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74  set = p->pOffset
19cc0 3b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 50  ;.    Select *pP
19cd0 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72  rior = p->pPrior
19ce0 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42  ;.    p->pOrderB
19cf0 79 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 53  y = 0;.    p->pS
19d00 72 63 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70  rc = 0;.    p->p
19d10 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70  Prior = 0;.    p
19d20 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->pLimit = 0;.  
19d30 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30    p->pOffset = 0
19d40 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c  ;.    pNew = sql
19d50 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62  ite3SelectDup(db
19d60 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20 70 2d 3e  , p, 0);.    p->
19d70 70 4f 66 66 73 65 74 20 3d 20 70 4f 66 66 73 65  pOffset = pOffse
19d80 74 3b 0a 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74  t;.    p->pLimit
19d90 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20 70   = pLimit;.    p
19da0 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72  ->pOrderBy = pOr
19db0 64 65 72 42 79 3b 0a 20 20 20 20 70 2d 3e 70 53  derBy;.    p->pS
19dc0 72 63 20 3d 20 70 53 72 63 3b 0a 20 20 20 20 70  rc = pSrc;.    p
19dd0 2d 3e 6f 70 20 3d 20 54 4b 5f 41 4c 4c 3b 0a 20  ->op = TK_ALL;. 
19de0 20 20 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74     p->pRightmost
19df0 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 4e   = 0;.    if( pN
19e00 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  ew==0 ){.      p
19e10 4e 65 77 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20  New = pPrior;.  
19e20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
19e30 4e 65 77 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50  New->pPrior = pP
19e40 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 4e 65 77  rior;.      pNew
19e50 2d 3e 70 52 69 67 68 74 6d 6f 73 74 20 3d 20 30  ->pRightmost = 0
19e60 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 70  ;.    }.    p->p
19e70 50 72 69 6f 72 20 3d 20 70 4e 65 77 3b 0a 20 20  Prior = pNew;.  
19e80 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
19e90 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20  Failed ) return 
19ea0 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67  1;.  }..  /* Beg
19eb0 69 6e 20 66 6c 61 74 74 65 6e 69 6e 67 20 74 68  in flattening th
19ec0 65 20 69 46 72 6f 6d 2d 74 68 20 65 6e 74 72 79  e iFrom-th entry
19ed0 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   of the FROM cla
19ee0 75 73 65 20 0a 20 20 2a 2a 20 69 6e 20 74 68 65  use .  ** in the
19ef0 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20   outer query..  
19f00 2a 2f 0a 20 20 70 53 75 62 20 3d 20 70 53 75 62  */.  pSub = pSub
19f10 31 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70 53  1 = pSubitem->pS
19f20 65 6c 65 63 74 3b 0a 0a 20 20 2f 2a 20 44 65 6c  elect;..  /* Del
19f30 65 74 65 20 74 68 65 20 74 72 61 6e 73 69 65 6e  ete the transien
19f40 74 20 74 61 62 6c 65 20 73 74 72 75 63 74 75 72  t table structur
19f50 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  e associated wit
19f60 68 20 74 68 65 0a 20 20 2a 2a 20 73 75 62 71 75  h the.  ** subqu
19f70 65 72 79 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ery.  */.  sqlit
19f80 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 53 75  e3DbFree(db, pSu
19f90 62 69 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65  bitem->zDatabase
19fa0 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
19fb0 65 65 28 64 62 2c 20 70 53 75 62 69 74 65 6d 2d  ee(db, pSubitem-
19fc0 3e 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74  >zName);.  sqlit
19fd0 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 53 75  e3DbFree(db, pSu
19fe0 62 69 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a  bitem->zAlias);.
19ff0 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a 44 61 74    pSubitem->zDat
1a000 61 62 61 73 65 20 3d 20 30 3b 0a 20 20 70 53 75  abase = 0;.  pSu
1a010 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 30  bitem->zName = 0
1a020 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a 41  ;.  pSubitem->zA
1a030 6c 69 61 73 20 3d 20 30 3b 0a 20 20 70 53 75 62  lias = 0;.  pSub
1a040 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20  item->pSelect = 
1a050 30 3b 0a 0a 20 20 2f 2a 20 44 65 66 65 72 20 64  0;..  /* Defer d
1a060 65 6c 65 74 69 6e 67 20 74 68 65 20 54 61 62 6c  eleting the Tabl
1a070 65 20 6f 62 6a 65 63 74 20 61 73 73 6f 63 69 61  e object associa
1a080 74 65 64 20 77 69 74 68 20 74 68 65 0a 20 20 2a  ted with the.  *
1a090 2a 20 73 75 62 71 75 65 72 79 20 75 6e 74 69 6c  * subquery until
1a0a0 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6f 6e   code generation
1a0b0 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 70 6c 65 74   is.  ** complet
1a0c0 65 2c 20 73 69 6e 63 65 20 74 68 65 72 65 20 6d  e, since there m
1a0d0 61 79 20 73 74 69 6c 6c 20 65 78 69 73 74 20 45  ay still exist E
1a0e0 78 70 72 2e 70 54 61 62 20 65 6e 74 72 69 65 73  xpr.pTab entries
1a0f0 20 74 68 61 74 0a 20 20 2a 2a 20 72 65 66 65 72   that.  ** refer
1a100 20 74 6f 20 74 68 65 20 73 75 62 71 75 65 72 79   to the subquery
1a110 20 65 76 65 6e 20 61 66 74 65 72 20 66 6c 61 74   even after flat
1a120 74 65 6e 69 6e 67 2e 20 20 54 69 63 6b 65 74 20  tening.  Ticket 
1a130 23 33 33 34 36 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  #3346..  **.  **
1a140 20 70 53 75 62 69 74 65 6d 2d 3e 70 54 61 62 20   pSubitem->pTab 
1a150 69 73 20 61 6c 77 61 79 73 20 6e 6f 6e 2d 4e 55  is always non-NU
1a160 4c 4c 20 62 79 20 74 65 73 74 20 72 65 73 74 72  LL by test restr
1a170 69 63 74 69 6f 6e 73 20 61 6e 64 20 74 65 73 74  ictions and test
1a180 73 20 61 62 6f 76 65 2e 0a 20 20 2a 2f 0a 20 20  s above..  */.  
1a190 69 66 28 20 41 4c 57 41 59 53 28 70 53 75 62 69  if( ALWAYS(pSubi
1a1a0 74 65 6d 2d 3e 70 54 61 62 21 3d 30 29 20 29 7b  tem->pTab!=0) ){
1a1b0 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
1a1c0 54 6f 44 65 6c 20 3d 20 70 53 75 62 69 74 65 6d  ToDel = pSubitem
1a1d0 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 66 28 20  ->pTab;.    if( 
1a1e0 70 54 61 62 54 6f 44 65 6c 2d 3e 6e 52 65 66 3d  pTabToDel->nRef=
1a1f0 3d 31 20 29 7b 0a 20 20 20 20 20 20 50 61 72 73  =1 ){.      Pars
1a200 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73  e *pToplevel = s
1a210 71 6c 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65  qlite3ParseTople
1a220 76 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 20  vel(pParse);.   
1a230 20 20 20 70 54 61 62 54 6f 44 65 6c 2d 3e 70 4e     pTabToDel->pN
1a240 65 78 74 5a 6f 6d 62 69 65 20 3d 20 70 54 6f 70  extZombie = pTop
1a250 6c 65 76 65 6c 2d 3e 70 5a 6f 6d 62 69 65 54 61  level->pZombieTa
1a260 62 3b 0a 20 20 20 20 20 20 70 54 6f 70 6c 65 76  b;.      pToplev
1a270 65 6c 2d 3e 70 5a 6f 6d 62 69 65 54 61 62 20 3d  el->pZombieTab =
1a280 20 70 54 61 62 54 6f 44 65 6c 3b 0a 20 20 20 20   pTabToDel;.    
1a290 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 54 61  }else{.      pTa
1a2a0 62 54 6f 44 65 6c 2d 3e 6e 52 65 66 2d 2d 3b 0a  bToDel->nRef--;.
1a2b0 20 20 20 20 7d 0a 20 20 20 20 70 53 75 62 69 74      }.    pSubit
1a2c0 65 6d 2d 3e 70 54 61 62 20 3d 20 30 3b 0a 20 20  em->pTab = 0;.  
1a2d0 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  }..  /* The foll
1a2e0 6f 77 69 6e 67 20 6c 6f 6f 70 20 72 75 6e 73 20  owing loop runs 
1a2f0 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 74 65  once for each te
1a300 72 6d 20 69 6e 20 61 20 63 6f 6d 70 6f 75 6e 64  rm in a compound
1a310 2d 73 75 62 71 75 65 72 79 0a 20 20 2a 2a 20 66  -subquery.  ** f
1a320 6c 61 74 74 65 6e 69 6e 67 20 28 61 73 20 64 65  lattening (as de
1a330 73 63 72 69 62 65 64 20 61 62 6f 76 65 29 2e 20  scribed above). 
1a340 20 49 66 20 77 65 20 61 72 65 20 64 6f 69 6e 67   If we are doing
1a350 20 61 20 64 69 66 66 65 72 65 6e 74 20 6b 69 6e   a different kin
1a360 64 0a 20 20 2a 2a 20 6f 66 20 66 6c 61 74 74 65  d.  ** of flatte
1a370 6e 69 6e 67 20 2d 20 61 20 66 6c 61 74 74 65 6e  ning - a flatten
1a380 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20 61  ing other than a
1a390 20 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65   compound-subque
1a3a0 72 79 20 66 6c 61 74 74 65 6e 69 6e 67 20 2d 0a  ry flattening -.
1a3b0 20 20 2a 2a 20 74 68 65 6e 20 74 68 69 73 20 6c    ** then this l
1a3c0 6f 6f 70 20 6f 6e 6c 79 20 72 75 6e 73 20 6f 6e  oop only runs on
1a3d0 63 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  ce..  **.  ** Th
1a3e0 69 73 20 6c 6f 6f 70 20 6d 6f 76 65 73 20 61 6c  is loop moves al
1a3f0 6c 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 65 6c  l of the FROM el
1a400 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 73 75  ements of the su
1a410 62 71 75 65 72 79 20 69 6e 74 6f 20 74 68 65 0a  bquery into the.
1a420 20 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c    ** the FROM cl
1a430 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65  ause of the oute
1a440 72 20 71 75 65 72 79 2e 20 20 42 65 66 6f 72 65  r query.  Before
1a450 20 64 6f 69 6e 67 20 74 68 69 73 2c 20 72 65 6d   doing this, rem
1a460 65 6d 62 65 72 0a 20 20 2a 2a 20 74 68 65 20 63  ember.  ** the c
1a470 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72  ursor number for
1a480 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 6f 75   the original ou
1a490 74 65 72 20 71 75 65 72 79 20 46 52 4f 4d 20 65  ter query FROM e
1a4a0 6c 65 6d 65 6e 74 20 69 6e 0a 20 20 2a 2a 20 69  lement in.  ** i
1a4b0 50 61 72 65 6e 74 2e 20 20 54 68 65 20 69 50 61  Parent.  The iPa
1a4c0 72 65 6e 74 20 63 75 72 73 6f 72 20 77 69 6c 6c  rent cursor will
1a4d0 20 6e 65 76 65 72 20 62 65 20 75 73 65 64 2e 20   never be used. 
1a4e0 20 53 75 62 73 65 71 75 65 6e 74 20 63 6f 64 65   Subsequent code
1a4f0 0a 20 20 2a 2a 20 77 69 6c 6c 20 73 63 61 6e 20  .  ** will scan 
1a500 65 78 70 72 65 73 73 69 6f 6e 73 20 6c 6f 6f 6b  expressions look
1a510 69 6e 67 20 66 6f 72 20 69 50 61 72 65 6e 74 20  ing for iParent 
1a520 72 65 66 65 72 65 6e 63 65 73 20 61 6e 64 20 72  references and r
1a530 65 70 6c 61 63 65 0a 20 20 2a 2a 20 74 68 6f 73  eplace.  ** thos
1a540 65 20 72 65 66 65 72 65 6e 63 65 73 20 77 69 74  e references wit
1a550 68 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68  h expressions th
1a560 61 74 20 72 65 73 6f 6c 76 65 20 74 6f 20 74 68  at resolve to th
1a570 65 20 73 75 62 71 75 65 72 79 20 46 52 4f 4d 0a  e subquery FROM.
1a580 20 20 2a 2a 20 65 6c 65 6d 65 6e 74 73 20 77 65    ** elements we
1a590 20 61 72 65 20 6e 6f 77 20 63 6f 70 79 69 6e 67   are now copying
1a5a0 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28   in..  */.  for(
1a5b0 70 50 61 72 65 6e 74 3d 70 3b 20 70 50 61 72 65  pParent=p; pPare
1a5c0 6e 74 3b 20 70 50 61 72 65 6e 74 3d 70 50 61 72  nt; pParent=pPar
1a5d0 65 6e 74 2d 3e 70 50 72 69 6f 72 2c 20 70 53 75  ent->pPrior, pSu
1a5e0 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72 29 7b  b=pSub->pPrior){
1a5f0 0a 20 20 20 20 69 6e 74 20 6e 53 75 62 53 72 63  .    int nSubSrc
1a600 3b 0a 20 20 20 20 75 38 20 6a 6f 69 6e 74 79 70  ;.    u8 jointyp
1a610 65 20 3d 20 30 3b 0a 20 20 20 20 70 53 75 62 53  e = 0;.    pSubS
1a620 72 63 20 3d 20 70 53 75 62 2d 3e 70 53 72 63 3b  rc = pSub->pSrc;
1a630 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61       /* FROM cla
1a640 75 73 65 20 6f 66 20 73 75 62 71 75 65 72 79 20  use of subquery 
1a650 2a 2f 0a 20 20 20 20 6e 53 75 62 53 72 63 20 3d  */.    nSubSrc =
1a660 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63 3b 20   pSubSrc->nSrc; 
1a670 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65   /* Number of te
1a680 72 6d 73 20 69 6e 20 73 75 62 71 75 65 72 79 20  rms in subquery 
1a690 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20  FROM clause */. 
1a6a0 20 20 20 70 53 72 63 20 3d 20 70 50 61 72 65 6e     pSrc = pParen
1a6b0 74 2d 3e 70 53 72 63 3b 20 20 20 20 20 2f 2a 20  t->pSrc;     /* 
1a6c0 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74  FROM clause of t
1a6d0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a  he outer query *
1a6e0 2f 0a 0a 20 20 20 20 69 66 28 20 70 53 72 63 20  /..    if( pSrc 
1a6f0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
1a700 20 70 50 61 72 65 6e 74 3d 3d 70 20 29 3b 20 20   pParent==p );  
1a710 2f 2a 20 46 69 72 73 74 20 74 69 6d 65 20 74 68  /* First time th
1a720 72 6f 75 67 68 20 74 68 65 20 6c 6f 6f 70 20 2a  rough the loop *
1a730 2f 0a 20 20 20 20 20 20 6a 6f 69 6e 74 79 70 65  /.      jointype
1a740 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 6a 6f 69   = pSubitem->joi
1a750 6e 74 79 70 65 3b 0a 20 20 20 20 7d 65 6c 73 65  ntype;.    }else
1a760 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
1a770 70 50 61 72 65 6e 74 21 3d 70 20 29 3b 20 20 2f  pParent!=p );  /
1a780 2a 20 32 6e 64 20 61 6e 64 20 73 75 62 73 65 71  * 2nd and subseq
1a790 75 65 6e 74 20 74 69 6d 65 73 20 74 68 72 6f 75  uent times throu
1a7a0 67 68 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20  gh the loop */. 
1a7b0 20 20 20 20 20 70 53 72 63 20 3d 20 70 50 61 72       pSrc = pPar
1a7c0 65 6e 74 2d 3e 70 53 72 63 20 3d 20 73 71 6c 69  ent->pSrc = sqli
1a7d0 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64  te3SrcListAppend
1a7e0 28 64 62 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  (db, 0, 0, 0);. 
1a7f0 20 20 20 20 20 69 66 28 20 70 53 72 63 3d 3d 30       if( pSrc==0
1a800 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
1a810 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  rt( db->mallocFa
1a820 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20 20  iled );.        
1a830 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
1a840 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65     }..    /* The
1a850 20 73 75 62 71 75 65 72 79 20 75 73 65 73 20 61   subquery uses a
1a860 20 73 69 6e 67 6c 65 20 73 6c 6f 74 20 6f 66 20   single slot of 
1a870 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
1a880 6f 66 20 74 68 65 20 6f 75 74 65 72 0a 20 20 20  of the outer.   
1a890 20 2a 2a 20 71 75 65 72 79 2e 20 20 49 66 20 74   ** query.  If t
1a8a0 68 65 20 73 75 62 71 75 65 72 79 20 68 61 73 20  he subquery has 
1a8b0 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 65 6c  more than one el
1a8c0 65 6d 65 6e 74 20 69 6e 20 69 74 73 20 46 52 4f  ement in its FRO
1a8d0 4d 20 63 6c 61 75 73 65 2c 0a 20 20 20 20 2a 2a  M clause,.    **
1a8e0 20 74 68 65 6e 20 65 78 70 61 6e 64 20 74 68 65   then expand the
1a8f0 20 6f 75 74 65 72 20 71 75 65 72 79 20 74 6f 20   outer query to 
1a900 6d 61 6b 65 20 73 70 61 63 65 20 66 6f 72 20 69  make space for i
1a910 74 20 74 6f 20 68 6f 6c 64 20 61 6c 6c 20 65 6c  t to hold all el
1a920 65 6d 65 6e 74 73 0a 20 20 20 20 2a 2a 20 6f 66  ements.    ** of
1a930 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a 20   the subquery.. 
1a940 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 78 61     **.    ** Exa
1a950 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  mple:.    **.   
1a960 20 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20   **    SELECT * 
1a970 46 52 4f 4d 20 74 61 62 41 2c 20 28 53 45 4c 45  FROM tabA, (SELE
1a980 43 54 20 2a 20 46 52 4f 4d 20 73 75 62 31 2c 20  CT * FROM sub1, 
1a990 73 75 62 32 29 2c 20 74 61 62 42 3b 0a 20 20 20  sub2), tabB;.   
1a9a0 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 6f   **.    ** The o
1a9b0 75 74 65 72 20 71 75 65 72 79 20 68 61 73 20 33  uter query has 3
1a9c0 20 73 6c 6f 74 73 20 69 6e 20 69 74 73 20 46 52   slots in its FR
1a9d0 4f 4d 20 63 6c 61 75 73 65 2e 20 20 4f 6e 65 20  OM clause.  One 
1a9e0 73 6c 6f 74 20 6f 66 20 74 68 65 0a 20 20 20 20  slot of the.    
1a9f0 2a 2a 20 6f 75 74 65 72 20 71 75 65 72 79 20 28  ** outer query (
1aa00 74 68 65 20 6d 69 64 64 6c 65 20 73 6c 6f 74 29  the middle slot)
1aa10 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20   is used by the 
1aa20 73 75 62 71 75 65 72 79 2e 20 20 54 68 65 20 6e  subquery.  The n
1aa30 65 78 74 0a 20 20 20 20 2a 2a 20 62 6c 6f 63 6b  ext.    ** block
1aa40 20 6f 66 20 63 6f 64 65 20 77 69 6c 6c 20 65 78   of code will ex
1aa50 70 61 6e 64 20 74 68 65 20 6f 75 74 20 71 75 65  pand the out que
1aa60 72 79 20 74 6f 20 34 20 73 6c 6f 74 73 2e 20 20  ry to 4 slots.  
1aa70 54 68 65 20 6d 69 64 64 6c 65 0a 20 20 20 20 2a  The middle.    *
1aa80 2a 20 73 6c 6f 74 20 69 73 20 65 78 70 61 6e 64  * slot is expand
1aa90 65 64 20 74 6f 20 74 77 6f 20 73 6c 6f 74 73 20  ed to two slots 
1aaa0 69 6e 20 6f 72 64 65 72 20 74 6f 20 6d 61 6b 65  in order to make
1aab0 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 0a 20   space for the. 
1aac0 20 20 20 2a 2a 20 74 77 6f 20 65 6c 65 6d 65 6e     ** two elemen
1aad0 74 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  ts in the FROM c
1aae0 6c 61 75 73 65 20 6f 66 20 74 68 65 20 73 75 62  lause of the sub
1aaf0 71 75 65 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  query..    */.  
1ab00 20 20 69 66 28 20 6e 53 75 62 53 72 63 3e 31 20    if( nSubSrc>1 
1ab10 29 7b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74  ){.      pParent
1ab20 2d 3e 70 53 72 63 20 3d 20 70 53 72 63 20 3d 20  ->pSrc = pSrc = 
1ab30 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 45 6e  sqlite3SrcListEn
1ab40 6c 61 72 67 65 28 64 62 2c 20 70 53 72 63 2c 20  large(db, pSrc, 
1ab50 6e 53 75 62 53 72 63 2d 31 2c 69 46 72 6f 6d 2b  nSubSrc-1,iFrom+
1ab60 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64 62  1);.      if( db
1ab70 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
1ab80 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  {.        break;
1ab90 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
1aba0 20 20 20 20 2f 2a 20 54 72 61 6e 73 66 65 72 20      /* Transfer 
1abb0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
1abc0 74 65 72 6d 73 20 66 72 6f 6d 20 74 68 65 20 73  terms from the s
1abd0 75 62 71 75 65 72 79 20 69 6e 74 6f 20 74 68 65  ubquery into the
1abe0 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72 20 71 75  .    ** outer qu
1abf0 65 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ery..    */.    
1ac00 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 75 62 53  for(i=0; i<nSubS
1ac10 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rc; i++){.      
1ac20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c  sqlite3IdListDel
1ac30 65 74 65 28 64 62 2c 20 70 53 72 63 2d 3e 61 5b  ete(db, pSrc->a[
1ac40 69 2b 69 46 72 6f 6d 5d 2e 70 55 73 69 6e 67 29  i+iFrom].pUsing)
1ac50 3b 0a 20 20 20 20 20 20 70 53 72 63 2d 3e 61 5b  ;.      pSrc->a[
1ac60 69 2b 69 46 72 6f 6d 5d 20 3d 20 70 53 75 62 53  i+iFrom] = pSubS
1ac70 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20  rc->a[i];.      
1ac80 6d 65 6d 73 65 74 28 26 70 53 75 62 53 72 63 2d  memset(&pSubSrc-
1ac90 3e 61 5b 69 5d 2c 20 30 2c 20 73 69 7a 65 6f 66  >a[i], 0, sizeof
1aca0 28 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 29 29  (pSubSrc->a[i]))
1acb0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 72 63  ;.    }.    pSrc
1acc0 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 6a 6f 69 6e 74  ->a[iFrom].joint
1acd0 79 70 65 20 3d 20 6a 6f 69 6e 74 79 70 65 3b 0a  ype = jointype;.
1ace0 20 20 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 62 65    .    /* Now be
1acf0 67 69 6e 20 73 75 62 73 74 69 74 75 74 69 6e 67  gin substituting
1ad00 20 73 75 62 71 75 65 72 79 20 72 65 73 75 6c 74   subquery result
1ad10 20 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e 73   set expressions
1ad20 20 66 6f 72 20 0a 20 20 20 20 2a 2a 20 72 65 66   for .    ** ref
1ad30 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 69  erences to the i
1ad40 50 61 72 65 6e 74 20 69 6e 20 74 68 65 20 6f 75  Parent in the ou
1ad50 74 65 72 20 71 75 65 72 79 2e 0a 20 20 20 20 2a  ter query..    *
1ad60 2a 20 0a 20 20 20 20 2a 2a 20 45 78 61 6d 70 6c  * .    ** Exampl
1ad70 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e:.    **.    **
1ad80 20 20 20 53 45 4c 45 43 54 20 61 2b 35 2c 20 62     SELECT a+5, b
1ad90 2a 31 30 20 46 52 4f 4d 20 28 53 45 4c 45 43 54  *10 FROM (SELECT
1ada0 20 78 2a 33 20 41 53 20 61 2c 20 79 2b 31 30 20   x*3 AS a, y+10 
1adb0 41 53 20 62 20 46 52 4f 4d 20 74 31 29 20 57 48  AS b FROM t1) WH
1adc0 45 52 45 20 61 3e 62 3b 0a 20 20 20 20 2a 2a 20  ERE a>b;.    ** 
1add0 20 20 5c 20 20 20 20 20 20 20 20 20 20 20 20 20    \             
1ade0 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f          \_______
1adf0 5f 5f 5f 5f 5f 5f 20 73 75 62 71 75 65 72 79 20  ______ subquery 
1ae00 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20  __________/     
1ae10 20 20 20 20 20 2f 0a 20 20 20 20 2a 2a 20 20 20       /.    **   
1ae20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f   \______________
1ae30 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65 72 20 71 75  _______ outer qu
1ae40 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ery ____________
1ae50 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
1ae60 5f 5f 2f 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  __/.    **.    *
1ae70 2a 20 57 65 20 6c 6f 6f 6b 20 61 74 20 65 76 65  * We look at eve
1ae80 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e  ry expression in
1ae90 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1aea0 20 61 6e 64 20 65 76 65 72 79 20 70 6c 61 63 65   and every place
1aeb0 20 77 65 20 73 65 65 0a 20 20 20 20 2a 2a 20 22   we see.    ** "
1aec0 61 22 20 77 65 20 73 75 62 73 74 69 74 75 74 65  a" we substitute
1aed0 20 22 78 2a 33 22 20 61 6e 64 20 65 76 65 72 79   "x*3" and every
1aee0 20 70 6c 61 63 65 20 77 65 20 73 65 65 20 22 62   place we see "b
1aef0 22 20 77 65 20 73 75 62 73 74 69 74 75 74 65 20  " we substitute 
1af00 22 79 2b 31 30 22 2e 0a 20 20 20 20 2a 2f 0a 20  "y+10"..    */. 
1af10 20 20 20 70 4c 69 73 74 20 3d 20 70 50 61 72 65     pList = pPare
1af20 6e 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20  nt->pEList;.    
1af30 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74  for(i=0; i<pList
1af40 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
1af50 20 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e       if( pList->
1af60 61 5b 69 5d 2e 7a 4e 61 6d 65 3d 3d 30 20 29 7b  a[i].zName==0 ){
1af70 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a  .        char *z
1af80 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62  Name = sqlite3Db
1af90 53 74 72 44 75 70 28 64 62 2c 20 70 4c 69 73 74  StrDup(db, pList
1afa0 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 29 3b 0a 20  ->a[i].zSpan);. 
1afb0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
1afc0 71 75 6f 74 65 28 7a 4e 61 6d 65 29 3b 0a 20 20  quote(zName);.  
1afd0 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 69        pList->a[i
1afe0 5d 2e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b  ].zName = zName;
1aff0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1b000 20 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74     substExprList
1b010 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 45  (db, pParent->pE
1b020 4c 69 73 74 2c 20 69 50 61 72 65 6e 74 2c 20 70  List, iParent, p
1b030 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  Sub->pEList);.  
1b040 20 20 69 66 28 20 69 73 41 67 67 20 29 7b 0a 20    if( isAgg ){. 
1b050 20 20 20 20 20 73 75 62 73 74 45 78 70 72 4c 69       substExprLi
1b060 73 74 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e  st(db, pParent->
1b070 70 47 72 6f 75 70 42 79 2c 20 69 50 61 72 65 6e  pGroupBy, iParen
1b080 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29  t, pSub->pEList)
1b090 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d  ;.      pParent-
1b0a0 3e 70 48 61 76 69 6e 67 20 3d 20 73 75 62 73 74  >pHaving = subst
1b0b0 45 78 70 72 28 64 62 2c 20 70 50 61 72 65 6e 74  Expr(db, pParent
1b0c0 2d 3e 70 48 61 76 69 6e 67 2c 20 69 50 61 72 65  ->pHaving, iPare
1b0d0 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74  nt, pSub->pEList
1b0e0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
1b0f0 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20   pSub->pOrderBy 
1b100 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
1b110 20 70 50 61 72 65 6e 74 2d 3e 70 4f 72 64 65 72   pParent->pOrder
1b120 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  By==0 );.      p
1b130 50 61 72 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79  Parent->pOrderBy
1b140 20 3d 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42   = pSub->pOrderB
1b150 79 3b 0a 20 20 20 20 20 20 70 53 75 62 2d 3e 70  y;.      pSub->p
1b160 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20  OrderBy = 0;.   
1b170 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 72 65   }else if( pPare
1b180 6e 74 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a  nt->pOrderBy ){.
1b190 20 20 20 20 20 20 73 75 62 73 74 45 78 70 72 4c        substExprL
1b1a0 69 73 74 28 64 62 2c 20 70 50 61 72 65 6e 74 2d  ist(db, pParent-
1b1b0 3e 70 4f 72 64 65 72 42 79 2c 20 69 50 61 72 65  >pOrderBy, iPare
1b1c0 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74  nt, pSub->pEList
1b1d0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
1b1e0 20 70 53 75 62 2d 3e 70 57 68 65 72 65 20 29 7b   pSub->pWhere ){
1b1f0 0a 20 20 20 20 20 20 70 57 68 65 72 65 20 3d 20  .      pWhere = 
1b200 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
1b210 62 2c 20 70 53 75 62 2d 3e 70 57 68 65 72 65 2c  b, pSub->pWhere,
1b220 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   0);.    }else{.
1b230 20 20 20 20 20 20 70 57 68 65 72 65 20 3d 20 30        pWhere = 0
1b240 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1b250 73 75 62 71 75 65 72 79 49 73 41 67 67 20 29 7b  subqueryIsAgg ){
1b260 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1b270 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 3d  Parent->pHaving=
1b280 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50 61 72  =0 );.      pPar
1b290 65 6e 74 2d 3e 70 48 61 76 69 6e 67 20 3d 20 70  ent->pHaving = p
1b2a0 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 3b 0a  Parent->pWhere;.
1b2b0 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70        pParent->p
1b2c0 57 68 65 72 65 20 3d 20 70 57 68 65 72 65 3b 0a  Where = pWhere;.
1b2d0 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70        pParent->p
1b2e0 48 61 76 69 6e 67 20 3d 20 73 75 62 73 74 45 78  Having = substEx
1b2f0 70 72 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e  pr(db, pParent->
1b300 70 48 61 76 69 6e 67 2c 20 69 50 61 72 65 6e 74  pHaving, iParent
1b310 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b  , pSub->pEList);
1b320 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e  .      pParent->
1b330 70 48 61 76 69 6e 67 20 3d 20 73 71 6c 69 74 65  pHaving = sqlite
1b340 33 45 78 70 72 41 6e 64 28 64 62 2c 20 70 50 61  3ExprAnd(db, pPa
1b350 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 2c 20 0a  rent->pHaving, .
1b360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b380 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70    sqlite3ExprDup
1b390 28 64 62 2c 20 70 53 75 62 2d 3e 70 48 61 76 69  (db, pSub->pHavi
1b3a0 6e 67 2c 20 30 29 29 3b 0a 20 20 20 20 20 20 61  ng, 0));.      a
1b3b0 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e  ssert( pParent->
1b3c0 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b 0a 20  pGroupBy==0 );. 
1b3d0 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 47       pParent->pG
1b3e0 72 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65 33  roupBy = sqlite3
1b3f0 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20  ExprListDup(db, 
1b400 70 53 75 62 2d 3e 70 47 72 6f 75 70 42 79 2c 20  pSub->pGroupBy, 
1b410 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  0);.    }else{. 
1b420 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 57       pParent->pW
1b430 68 65 72 65 20 3d 20 73 75 62 73 74 45 78 70 72  here = substExpr
1b440 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 57  (db, pParent->pW
1b450 68 65 72 65 2c 20 69 50 61 72 65 6e 74 2c 20 70  here, iParent, p
1b460 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  Sub->pEList);.  
1b470 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 57 68      pParent->pWh
1b480 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ere = sqlite3Exp
1b490 72 41 6e 64 28 64 62 2c 20 70 50 61 72 65 6e 74  rAnd(db, pParent
1b4a0 2d 3e 70 57 68 65 72 65 2c 20 70 57 68 65 72 65  ->pWhere, pWhere
1b4b0 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  );.    }.  .    
1b4c0 2f 2a 20 54 68 65 20 66 6c 61 74 74 65 6e 65 64  /* The flattened
1b4d0 20 71 75 65 72 79 20 69 73 20 64 69 73 74 69 6e   query is distin
1b4e0 63 74 20 69 66 20 65 69 74 68 65 72 20 74 68 65  ct if either the
1b4f0 20 69 6e 6e 65 72 20 6f 72 20 74 68 65 0a 20 20   inner or the.  
1b500 20 20 2a 2a 20 6f 75 74 65 72 20 71 75 65 72 79    ** outer query
1b510 20 69 73 20 64 69 73 74 69 6e 63 74 2e 20 0a 20   is distinct. . 
1b520 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 72 65 6e     */.    pParen
1b530 74 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 70  t->selFlags |= p
1b540 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  Sub->selFlags & 
1b550 53 46 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20 0a  SF_Distinct;.  .
1b560 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 53 45      /*.    ** SE
1b570 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 28 53  LECT ... FROM (S
1b580 45 4c 45 43 54 20 2e 2e 2e 20 4c 49 4d 49 54 20  ELECT ... LIMIT 
1b590 61 20 4f 46 46 53 45 54 20 62 29 20 4c 49 4d 49  a OFFSET b) LIMI
1b5a0 54 20 78 20 4f 46 46 53 45 54 20 79 3b 0a 20 20  T x OFFSET y;.  
1b5b0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f 6e 65 20    **.    ** One 
1b5c0 69 73 20 74 65 6d 70 74 65 64 20 74 6f 20 74 72  is tempted to tr
1b5d0 79 20 74 6f 20 61 64 64 20 61 20 61 6e 64 20 62  y to add a and b
1b5e0 20 74 6f 20 63 6f 6d 62 69 6e 65 20 74 68 65 20   to combine the 
1b5f0 6c 69 6d 69 74 73 2e 20 20 42 75 74 20 74 68 69  limits.  But thi
1b600 73 0a 20 20 20 20 2a 2a 20 64 6f 65 73 20 6e 6f  s.    ** does no
1b610 74 20 77 6f 72 6b 20 69 66 20 65 69 74 68 65 72  t work if either
1b620 20 6c 69 6d 69 74 20 69 73 20 6e 65 67 61 74 69   limit is negati
1b630 76 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ve..    */.    i
1b640 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20  f( pSub->pLimit 
1b650 29 7b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74  ){.      pParent
1b660 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 53 75 62 2d  ->pLimit = pSub-
1b670 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70  >pLimit;.      p
1b680 53 75 62 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b  Sub->pLimit = 0;
1b690 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
1b6a0 20 46 69 6e 69 61 6c 6c 79 2c 20 64 65 6c 65 74   Finially, delet
1b6b0 65 20 77 68 61 74 20 69 73 20 6c 65 66 74 20 6f  e what is left o
1b6c0 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 61  f the subquery a
1b6d0 6e 64 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 73  nd return.  ** s
1b6e0 75 63 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73  uccess..  */.  s
1b6f0 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
1b700 74 65 28 64 62 2c 20 70 53 75 62 31 29 3b 0a 0a  te(db, pSub1);..
1b710 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65    return 1;.}.#e
1b720 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
1b730 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42  (SQLITE_OMIT_SUB
1b740 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e  QUERY) || !defin
1b750 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
1b760 49 45 57 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 42  IEW) */../*.** B
1b770 61 73 65 64 20 6f 6e 20 74 68 65 20 63 6f 6e 74  ased on the cont
1b780 65 6e 74 73 20 6f 66 20 74 68 65 20 41 67 67 49  ents of the AggI
1b790 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 6e  nfo structure in
1b7a0 64 69 63 61 74 65 64 20 62 79 20 74 68 65 20 66  dicated by the f
1b7b0 69 72 73 74 0a 2a 2a 20 61 72 67 75 6d 65 6e 74  irst.** argument
1b7c0 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
1b7d0 63 68 65 63 6b 73 20 69 66 20 74 68 65 20 66 6f  checks if the fo
1b7e0 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65  llowing are true
1b7f0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 74 68 65  :.**.**    * the
1b800 20 71 75 65 72 79 20 63 6f 6e 74 61 69 6e 73 20   query contains 
1b810 6a 75 73 74 20 61 20 73 69 6e 67 6c 65 20 61 67  just a single ag
1b820 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
1b830 2c 0a 2a 2a 20 20 20 20 2a 20 74 68 65 20 61 67  ,.**    * the ag
1b840 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
1b850 20 69 73 20 65 69 74 68 65 72 20 6d 69 6e 28 29   is either min()
1b860 20 6f 72 20 6d 61 78 28 29 2c 20 61 6e 64 0a 2a   or max(), and.*
1b870 2a 20 20 20 20 2a 20 74 68 65 20 61 72 67 75 6d  *    * the argum
1b880 65 6e 74 20 74 6f 20 74 68 65 20 61 67 67 72 65  ent to the aggre
1b890 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 69 73  gate function is
1b8a0 20 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2e   a column value.
1b8b0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6c 6c 20 6f 66  .**.** If all of
1b8c0 20 74 68 65 20 61 62 6f 76 65 20 61 72 65 20 74   the above are t
1b8d0 72 75 65 2c 20 74 68 65 6e 20 57 48 45 52 45 5f  rue, then WHERE_
1b8e0 4f 52 44 45 52 42 59 5f 4d 49 4e 20 6f 72 20 57  ORDERBY_MIN or W
1b8f0 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 41 58  HERE_ORDERBY_MAX
1b900 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20  .** is returned 
1b910 61 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e 20  as appropriate. 
1b920 41 6c 73 6f 2c 20 2a 70 70 4d 69 6e 4d 61 78 20  Also, *ppMinMax 
1b930 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20  is set to point 
1b940 74 6f 20 74 68 65 20 0a 2a 2a 20 6c 69 73 74 20  to the .** list 
1b950 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 70 61 73  of arguments pas
1b960 73 65 64 20 74 6f 20 74 68 65 20 61 67 67 72 65  sed to the aggre
1b970 67 61 74 65 20 62 65 66 6f 72 65 20 72 65 74 75  gate before retu
1b980 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c  rning..**.** Or,
1b990 20 69 66 20 74 68 65 20 63 6f 6e 64 69 74 69 6f   if the conditio
1b9a0 6e 73 20 61 62 6f 76 65 20 61 72 65 20 6e 6f 74  ns above are not
1b9b0 20 6d 65 74 2c 20 2a 70 70 4d 69 6e 4d 61 78 20   met, *ppMinMax 
1b9c0 69 73 20 73 65 74 20 74 6f 20 30 20 61 6e 64 0a  is set to 0 and.
1b9d0 2a 2a 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59  ** WHERE_ORDERBY
1b9e0 5f 4e 4f 52 4d 41 4c 20 69 73 20 72 65 74 75 72  _NORMAL is retur
1b9f0 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75  ned..*/.static u
1ba00 38 20 6d 69 6e 4d 61 78 51 75 65 72 79 28 41 67  8 minMaxQuery(Ag
1ba10 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 2c  gInfo *pAggInfo,
1ba20 20 45 78 70 72 4c 69 73 74 20 2a 2a 70 70 4d 69   ExprList **ppMi
1ba30 6e 4d 61 78 29 7b 0a 20 20 69 6e 74 20 65 52 65  nMax){.  int eRe
1ba40 74 20 3d 20 57 48 45 52 45 5f 4f 52 44 45 52 42  t = WHERE_ORDERB
1ba50 59 5f 4e 4f 52 4d 41 4c 3b 20 20 20 20 20 20 20  Y_NORMAL;       
1ba60 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c     /* Return val
1ba70 75 65 20 2a 2f 0a 0a 20 20 2a 70 70 4d 69 6e 4d  ue */..  *ppMinM
1ba80 61 78 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 41  ax = 0;.  if( pA
1ba90 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3d 3d 31  ggInfo->nFunc==1
1baa0 20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45   ){.    Expr *pE
1bab0 78 70 72 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e  xpr = pAggInfo->
1bac0 61 46 75 6e 63 5b 30 5d 2e 70 45 78 70 72 3b 20  aFunc[0].pExpr; 
1bad0 2f 2a 20 41 67 67 72 65 67 61 74 65 20 66 75 6e  /* Aggregate fun
1bae0 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 45 78 70  ction */.    Exp
1baf0 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 3d 20  rList *pEList = 
1bb00 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 20  pExpr->x.pList; 
1bb10 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74       /* Argument
1bb20 73 20 74 6f 20 61 67 67 20 66 75 6e 63 74 69 6f  s to agg functio
1bb30 6e 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74  n */..    assert
1bb40 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
1bb50 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a  AGG_FUNCTION );.
1bb60 20 20 20 20 69 66 28 20 70 45 4c 69 73 74 20 26      if( pEList &
1bb70 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d  & pEList->nExpr=
1bb80 3d 31 20 26 26 20 70 45 4c 69 73 74 2d 3e 61 5b  =1 && pEList->a[
1bb90 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  0].pExpr->op==TK
1bba0 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20  _AGG_COLUMN ){. 
1bbb0 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
1bbc0 2a 7a 46 75 6e 63 20 3d 20 70 45 78 70 72 2d 3e  *zFunc = pExpr->
1bbd0 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20  u.zToken;.      
1bbe0 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
1bbf0 6d 70 28 7a 46 75 6e 63 2c 20 22 6d 69 6e 22 29  mp(zFunc, "min")
1bc00 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 65  ==0 ){.        e
1bc10 52 65 74 20 3d 20 57 48 45 52 45 5f 4f 52 44 45  Ret = WHERE_ORDE
1bc20 52 42 59 5f 4d 49 4e 3b 0a 20 20 20 20 20 20 20  RBY_MIN;.       
1bc30 20 2a 70 70 4d 69 6e 4d 61 78 20 3d 20 70 45 4c   *ppMinMax = pEL
1bc40 69 73 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ist;.      }else
1bc50 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
1bc60 43 6d 70 28 7a 46 75 6e 63 2c 20 22 6d 61 78 22  Cmp(zFunc, "max"
1bc70 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
1bc80 65 52 65 74 20 3d 20 57 48 45 52 45 5f 4f 52 44  eRet = WHERE_ORD
1bc90 45 52 42 59 5f 4d 41 58 3b 0a 20 20 20 20 20 20  ERBY_MAX;.      
1bca0 20 20 2a 70 70 4d 69 6e 4d 61 78 20 3d 20 70 45    *ppMinMax = pE
1bcb0 4c 69 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  List;.      }.  
1bcc0 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72    }.  }..  asser
1bcd0 74 28 20 2a 70 70 4d 69 6e 4d 61 78 3d 3d 30 20  t( *ppMinMax==0 
1bce0 7c 7c 20 28 2a 70 70 4d 69 6e 4d 61 78 29 2d 3e  || (*ppMinMax)->
1bcf0 6e 45 78 70 72 3d 3d 31 20 29 3b 0a 20 20 72 65  nExpr==1 );.  re
1bd00 74 75 72 6e 20 65 52 65 74 3b 0a 7d 0a 0a 2f 2a  turn eRet;.}../*
1bd10 0a 2a 2a 20 54 68 65 20 73 65 6c 65 63 74 20 73  .** The select s
1bd20 74 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64 20  tatement passed 
1bd30 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67  as the first arg
1bd40 75 6d 65 6e 74 20 69 73 20 61 6e 20 61 67 67 72  ument is an aggr
1bd50 65 67 61 74 65 20 71 75 65 72 79 2e 0a 2a 2a 20  egate query..** 
1bd60 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 6d 65  The second argme
1bd70 6e 74 20 69 73 20 74 68 65 20 61 73 73 6f 63 69  nt is the associ
1bd80 61 74 65 64 20 61 67 67 72 65 67 61 74 65 2d 69  ated aggregate-i
1bd90 6e 66 6f 20 6f 62 6a 65 63 74 2e 20 54 68 69 73  nfo object. This
1bda0 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 74 65   .** function te
1bdb0 73 74 73 20 69 66 20 74 68 65 20 53 45 4c 45 43  sts if the SELEC
1bdc0 54 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  T is of the form
1bdd0 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54  :.**.**   SELECT
1bde0 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 3c   count(*) FROM <
1bdf0 74 62 6c 3e 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65  tbl>.**.** where
1be00 20 74 61 62 6c 65 20 69 73 20 61 20 64 61 74 61   table is a data
1be10 62 61 73 65 20 74 61 62 6c 65 2c 20 6e 6f 74 20  base table, not 
1be20 61 20 73 75 62 2d 73 65 6c 65 63 74 20 6f 72 20  a sub-select or 
1be30 76 69 65 77 2e 20 49 66 20 74 68 65 20 71 75 65  view. If the que
1be40 72 79 0a 2a 2a 20 64 6f 65 73 20 6d 61 74 63 68  ry.** does match
1be50 20 74 68 69 73 20 70 61 74 74 65 72 6e 2c 20 74   this pattern, t
1be60 68 65 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  hen a pointer to
1be70 20 74 68 65 20 54 61 62 6c 65 20 6f 62 6a 65 63   the Table objec
1be80 74 20 72 65 70 72 65 73 65 6e 74 69 6e 67 0a 2a  t representing.*
1be90 2a 20 3c 74 62 6c 3e 20 69 73 20 72 65 74 75 72  * <tbl> is retur
1bea0 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ned. Otherwise, 
1beb0 30 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  0 is returned..*
1bec0 2f 0a 73 74 61 74 69 63 20 54 61 62 6c 65 20 2a  /.static Table *
1bed0 69 73 53 69 6d 70 6c 65 43 6f 75 6e 74 28 53 65  isSimpleCount(Se
1bee0 6c 65 63 74 20 2a 70 2c 20 41 67 67 49 6e 66 6f  lect *p, AggInfo
1bef0 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 54   *pAggInfo){.  T
1bf00 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 45 78  able *pTab;.  Ex
1bf10 70 72 20 2a 70 45 78 70 72 3b 0a 0a 20 20 61 73  pr *pExpr;..  as
1bf20 73 65 72 74 28 20 21 70 2d 3e 70 47 72 6f 75 70  sert( !p->pGroup
1bf30 42 79 20 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e  By );..  if( p->
1bf40 70 57 68 65 72 65 20 7c 7c 20 70 2d 3e 70 45 4c  pWhere || p->pEL
1bf50 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 0a 20  ist->nExpr!=1 . 
1bf60 20 20 7c 7c 20 70 2d 3e 70 53 72 63 2d 3e 6e 53    || p->pSrc->nS
1bf70 72 63 21 3d 31 20 7c 7c 20 70 2d 3e 70 53 72 63  rc!=1 || p->pSrc
1bf80 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 0a 20  ->a[0].pSelect. 
1bf90 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
1bfa0 3b 0a 20 20 7d 0a 20 20 70 54 61 62 20 3d 20 70  ;.  }.  pTab = p
1bfb0 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61  ->pSrc->a[0].pTa
1bfc0 62 3b 0a 20 20 70 45 78 70 72 20 3d 20 70 2d 3e  b;.  pExpr = p->
1bfd0 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  pEList->a[0].pEx
1bfe0 70 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54  pr;.  assert( pT
1bff0 61 62 20 26 26 20 21 70 54 61 62 2d 3e 70 53 65  ab && !pTab->pSe
1c000 6c 65 63 74 20 26 26 20 70 45 78 70 72 20 29 3b  lect && pExpr );
1c010 0a 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61  ..  if( IsVirtua
1c020 6c 28 70 54 61 62 29 20 29 20 72 65 74 75 72 6e  l(pTab) ) return
1c030 20 30 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d   0;.  if( pExpr-
1c040 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 46 55 4e 43  >op!=TK_AGG_FUNC
1c050 54 49 4f 4e 20 29 20 72 65 74 75 72 6e 20 30 3b  TION ) return 0;
1c060 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 41 67  .  if( NEVER(pAg
1c070 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3d 3d 30 29  gInfo->nFunc==0)
1c080 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
1c090 66 28 20 28 70 41 67 67 49 6e 66 6f 2d 3e 61 46  f( (pAggInfo->aF
1c0a0 75 6e 63 5b 30 5d 2e 70 46 75 6e 63 2d 3e 66 75  unc[0].pFunc->fu
1c0b0 6e 63 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 46  ncFlags&SQLITE_F
1c0c0 55 4e 43 5f 43 4f 55 4e 54 29 3d 3d 30 20 29 20  UNC_COUNT)==0 ) 
1c0d0 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
1c0e0 70 45 78 70 72 2d 3e 66 6c 61 67 73 26 45 50 5f  pExpr->flags&EP_
1c0f0 44 69 73 74 69 6e 63 74 20 29 20 72 65 74 75 72  Distinct ) retur
1c100 6e 20 30 3b 0a 0a 20 20 72 65 74 75 72 6e 20 70  n 0;..  return p
1c110 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  Tab;.}../*.** If
1c120 20 74 68 65 20 73 6f 75 72 63 65 2d 6c 69 73 74   the source-list
1c130 20 69 74 65 6d 20 70 61 73 73 65 64 20 61 73 20   item passed as 
1c140 61 6e 20 61 72 67 75 6d 65 6e 74 20 77 61 73 20  an argument was 
1c150 61 75 67 6d 65 6e 74 65 64 20 77 69 74 68 20 61  augmented with a
1c160 6e 0a 2a 2a 20 49 4e 44 45 58 45 44 20 42 59 20  n.** INDEXED BY 
1c170 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 74 72 79  clause, then try
1c180 20 74 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 73   to locate the s
1c190 70 65 63 69 66 69 65 64 20 69 6e 64 65 78 2e 20  pecified index. 
1c1a0 49 66 20 74 68 65 72 65 0a 2a 2a 20 77 61 73 20  If there.** was 
1c1b0 73 75 63 68 20 61 20 63 6c 61 75 73 65 20 61 6e  such a clause an
1c1c0 64 20 74 68 65 20 6e 61 6d 65 64 20 69 6e 64 65  d the named inde
1c1d0 78 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e  x cannot be foun
1c1e0 64 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51  d, return .** SQ
1c1f0 4c 49 54 45 5f 45 52 52 4f 52 20 61 6e 64 20 6c  LITE_ERROR and l
1c200 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 69 6e  eave an error in
1c210 20 70 50 61 72 73 65 2e 20 4f 74 68 65 72 77 69   pParse. Otherwi
1c220 73 65 2c 20 70 6f 70 75 6c 61 74 65 20 0a 2a 2a  se, populate .**
1c230 20 70 46 72 6f 6d 2d 3e 70 49 6e 64 65 78 20 61   pFrom->pIndex a
1c240 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  nd return SQLITE
1c250 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  _OK..*/.int sqli
1c260 74 65 33 49 6e 64 65 78 65 64 42 79 4c 6f 6f 6b  te3IndexedByLook
1c270 75 70 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  up(Parse *pParse
1c280 2c 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74  , struct SrcList
1c290 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 29 7b 0a 20  _item *pFrom){. 
1c2a0 20 69 66 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62   if( pFrom->pTab
1c2b0 20 26 26 20 70 46 72 6f 6d 2d 3e 7a 49 6e 64 65   && pFrom->zInde
1c2c0 78 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  x ){.    Table *
1c2d0 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54  pTab = pFrom->pT
1c2e0 61 62 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 49  ab;.    char *zI
1c2f0 6e 64 65 78 20 3d 20 70 46 72 6f 6d 2d 3e 7a 49  ndex = pFrom->zI
1c300 6e 64 65 78 3b 0a 20 20 20 20 49 6e 64 65 78 20  ndex;.    Index 
1c310 2a 70 49 64 78 3b 0a 20 20 20 20 66 6f 72 28 70  *pIdx;.    for(p
1c320 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  Idx=pTab->pIndex
1c330 3b 20 0a 20 20 20 20 20 20 20 20 70 49 64 78 20  ; .        pIdx 
1c340 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  && sqlite3StrICm
1c350 70 28 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20 7a  p(pIdx->zName, z
1c360 49 6e 64 65 78 29 3b 20 0a 20 20 20 20 20 20 20  Index); .       
1c370 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
1c380 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28  t.    );.    if(
1c390 20 21 70 49 64 78 20 29 7b 0a 20 20 20 20 20 20   !pIdx ){.      
1c3a0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
1c3b0 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68  pParse, "no such
1c3c0 20 69 6e 64 65 78 3a 20 25 73 22 2c 20 7a 49 6e   index: %s", zIn
1c3d0 64 65 78 2c 20 30 29 3b 0a 20 20 20 20 20 20 70  dex, 0);.      p
1c3e0 50 61 72 73 65 2d 3e 63 68 65 63 6b 53 63 68 65  Parse->checkSche
1c3f0 6d 61 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 65  ma = 1;.      re
1c400 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
1c410 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 46 72  R;.    }.    pFr
1c420 6f 6d 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49 64  om->pIndex = pId
1c430 78 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  x;.  }.  return 
1c440 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a  SQLITE_OK;.}./*.
1c450 2a 2a 20 44 65 74 65 63 74 20 63 6f 6d 70 6f 75  ** Detect compou
1c460 6e 64 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  nd SELECT statem
1c470 65 6e 74 73 20 74 68 61 74 20 75 73 65 20 61 6e  ents that use an
1c480 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
1c490 20 77 69 74 68 20 0a 2a 2a 20 61 6e 20 61 6c 74   with .** an alt
1c4a0 65 72 6e 61 74 69 76 65 20 63 6f 6c 6c 61 74 69  ernative collati
1c4b0 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a  ng sequence..**.
1c4c0 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2e 2e 2e  **    SELECT ...
1c4d0 20 46 52 4f 4d 20 74 31 20 45 58 43 45 50 54 20   FROM t1 EXCEPT 
1c4e0 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20  SELECT ... FROM 
1c4f0 74 32 20 4f 52 44 45 52 20 42 59 20 2e 2e 20 43  t2 ORDER BY .. C
1c500 4f 4c 4c 41 54 45 20 2e 2e 2e 0a 2a 2a 0a 2a 2a  OLLATE ....**.**
1c510 20 54 68 65 73 65 20 61 72 65 20 72 65 77 72 69   These are rewri
1c520 74 74 65 6e 20 61 73 20 61 20 73 75 62 71 75 65  tten as a subque
1c530 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c  ry:.**.**    SEL
1c540 45 43 54 20 2a 20 46 52 4f 4d 20 28 53 45 4c 45  ECT * FROM (SELE
1c550 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 45  CT ... FROM t1 E
1c560 58 43 45 50 54 20 53 45 4c 45 43 54 20 2e 2e 2e  XCEPT SELECT ...
1c570 20 46 52 4f 4d 20 74 32 29 0a 2a 2a 20 20 20 20   FROM t2).**    
1c580 20 4f 52 44 45 52 20 42 59 20 2e 2e 2e 20 43 4f   ORDER BY ... CO
1c590 4c 4c 41 54 45 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20  LLATE ....**.** 
1c5a0 54 68 69 73 20 74 72 61 6e 73 66 6f 72 6d 61 74  This transformat
1c5b0 69 6f 6e 20 69 73 20 6e 65 63 65 73 73 61 72 79  ion is necessary
1c5c0 20 62 65 63 61 75 73 65 20 74 68 65 20 6d 75 6c   because the mul
1c5d0 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28  tiSelectOrderBy(
1c5e0 29 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 62 6f  ) routine.** abo
1c5f0 76 65 20 74 68 61 74 20 67 65 6e 65 72 61 74 65  ve that generate
1c600 73 20 74 68 65 20 63 6f 64 65 20 66 6f 72 20 61  s the code for a
1c610 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   compound SELECT
1c620 20 77 69 74 68 20 61 6e 20 4f 52 44 45 52 20 42   with an ORDER B
1c630 59 20 63 6c 61 75 73 65 0a 2a 2a 20 75 73 65 73  Y clause.** uses
1c640 20 61 20 6d 65 72 67 65 20 61 6c 67 6f 72 69 74   a merge algorit
1c650 68 6d 20 74 68 61 74 20 72 65 71 75 69 72 65 73  hm that requires
1c660 20 74 68 65 20 73 61 6d 65 20 63 6f 6c 6c 61 74   the same collat
1c670 69 6e 67 20 73 65 71 75 65 6e 63 65 20 6f 6e 20  ing sequence on 
1c680 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 20 63 6f  the.** result co
1c690 6c 75 6d 6e 73 20 61 73 20 6f 6e 20 74 68 65 20  lumns as on the 
1c6a0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e  ORDER BY clause.
1c6b0 20 20 53 65 65 20 74 69 63 6b 65 74 0a 2a 2a 20    See ticket.** 
1c6c0 68 74 74 70 3a 2f 2f 77 77 77 2e 73 71 6c 69 74  http://www.sqlit
1c6d0 65 2e 6f 72 67 2f 73 72 63 2f 69 6e 66 6f 2f 36  e.org/src/info/6
1c6e0 37 30 39 35 37 34 64 32 61 0a 2a 2a 0a 2a 2a 20  709574d2a.**.** 
1c6f0 54 68 69 73 20 74 72 61 6e 73 66 6f 72 6d 61 74  This transformat
1c700 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 6e 65 65 64  ion is only need
1c710 65 64 20 66 6f 72 20 45 58 43 45 50 54 2c 20 49  ed for EXCEPT, I
1c720 4e 54 45 52 53 45 43 54 2c 20 61 6e 64 20 55 4e  NTERSECT, and UN
1c730 49 4f 4e 2e 0a 2a 2a 20 54 68 65 20 55 4e 49 4f  ION..** The UNIO
1c740 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72 20 77  N ALL operator w
1c750 6f 72 6b 73 20 66 69 6e 65 20 77 69 74 68 20 6d  orks fine with m
1c760 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42  ultiSelectOrderB
1c770 79 28 29 20 65 76 65 6e 20 77 68 65 6e 0a 2a 2a  y() even when.**
1c780 20 74 68 65 72 65 20 61 72 65 20 43 4f 4c 4c 41   there are COLLA
1c790 54 45 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20  TE terms in the 
1c7a0 4f 52 44 45 52 20 42 59 2e 0a 2a 2f 0a 73 74 61  ORDER BY..*/.sta
1c7b0 74 69 63 20 69 6e 74 20 63 6f 6e 76 65 72 74 43  tic int convertC
1c7c0 6f 6d 70 6f 75 6e 64 53 65 6c 65 63 74 54 6f 53  ompoundSelectToS
1c7d0 75 62 71 75 65 72 79 28 57 61 6c 6b 65 72 20 2a  ubquery(Walker *
1c7e0 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20  pWalker, Select 
1c7f0 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  *p){.  int i;.  
1c800 53 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20  Select *pNew;.  
1c810 53 65 6c 65 63 74 20 2a 70 58 3b 0a 20 20 73 71  Select *pX;.  sq
1c820 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 73 74 72  lite3 *db;.  str
1c830 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
1c840 6d 20 2a 61 3b 0a 20 20 53 72 63 4c 69 73 74 20  m *a;.  SrcList 
1c850 2a 70 4e 65 77 53 72 63 3b 0a 20 20 50 61 72 73  *pNewSrc;.  Pars
1c860 65 20 2a 70 50 61 72 73 65 3b 0a 20 20 54 6f 6b  e *pParse;.  Tok
1c870 65 6e 20 64 75 6d 6d 79 3b 0a 0a 20 20 69 66 28  en dummy;..  if(
1c880 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 20   p->pPrior==0 ) 
1c890 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
1c8a0 6e 75 65 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4f  nue;.  if( p->pO
1c8b0 72 64 65 72 42 79 3d 3d 30 20 29 20 72 65 74 75  rderBy==0 ) retu
1c8c0 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
1c8d0 0a 20 20 66 6f 72 28 70 58 3d 70 3b 20 70 58 20  .  for(pX=p; pX 
1c8e0 26 26 20 28 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 41  && (pX->op==TK_A
1c8f0 4c 4c 20 7c 7c 20 70 58 2d 3e 6f 70 3d 3d 54 4b  LL || pX->op==TK
1c900 5f 53 45 4c 45 43 54 29 3b 20 70 58 3d 70 58 2d  _SELECT); pX=pX-
1c910 3e 70 50 72 69 6f 72 29 7b 7d 0a 20 20 69 66 28  >pPrior){}.  if(
1c920 20 70 58 3d 3d 30 20 29 20 72 65 74 75 72 6e 20   pX==0 ) return 
1c930 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20  WRC_Continue;.  
1c940 61 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 2d  a = p->pOrderBy-
1c950 3e 61 3b 0a 20 20 66 6f 72 28 69 3d 70 2d 3e 70  >a;.  for(i=p->p
1c960 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2d 31  OrderBy->nExpr-1
1c970 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20  ; i>=0; i--){.  
1c980 20 20 69 66 28 20 61 5b 69 5d 2e 70 45 78 70 72    if( a[i].pExpr
1c990 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c  ->flags & EP_Col
1c9a0 6c 61 74 65 20 29 20 62 72 65 61 6b 3b 0a 20 20  late ) break;.  
1c9b0 7d 0a 20 20 69 66 28 20 69 3c 30 20 29 20 72 65  }.  if( i<0 ) re
1c9c0 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75  turn WRC_Continu
1c9d0 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 72  e;..  /* If we r
1c9e0 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c  each this point,
1c9f0 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 65 20   that means the 
1ca00 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 69  transformation i
1ca10 73 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 0a  s required. */..
1ca20 20 20 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b    pParse = pWalk
1ca30 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 64 62  er->pParse;.  db
1ca40 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
1ca50 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44   pNew = sqlite3D
1ca60 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
1ca70 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b  sizeof(*pNew) );
1ca80 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29  .  if( pNew==0 )
1ca90 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
1caa0 74 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 75 6d  t;.  memset(&dum
1cab0 6d 79 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64 75  my, 0, sizeof(du
1cac0 6d 6d 79 29 29 3b 0a 20 20 70 4e 65 77 53 72 63  mmy));.  pNewSrc
1cad0 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73   = sqlite3SrcLis
1cae0 74 41 70 70 65 6e 64 46 72 6f 6d 54 65 72 6d 28  tAppendFromTerm(
1caf0 70 50 61 72 73 65 2c 30 2c 30 2c 30 2c 26 64 75  pParse,0,0,0,&du
1cb00 6d 6d 79 2c 70 4e 65 77 2c 30 2c 30 29 3b 0a 20  mmy,pNew,0,0);. 
1cb10 20 69 66 28 20 70 4e 65 77 53 72 63 3d 3d 30 20   if( pNewSrc==0 
1cb20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f  ) return WRC_Abo
1cb30 72 74 3b 0a 20 20 2a 70 4e 65 77 20 3d 20 2a 70  rt;.  *pNew = *p
1cb40 3b 0a 20 20 70 2d 3e 70 53 72 63 20 3d 20 70 4e  ;.  p->pSrc = pN
1cb50 65 77 53 72 63 3b 0a 20 20 70 2d 3e 70 45 4c 69  ewSrc;.  p->pELi
1cb60 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  st = sqlite3Expr
1cb70 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73  ListAppend(pPars
1cb80 65 2c 20 30 2c 20 73 71 6c 69 74 65 33 45 78 70  e, 0, sqlite3Exp
1cb90 72 28 64 62 2c 20 54 4b 5f 41 4c 4c 2c 20 30 29  r(db, TK_ALL, 0)
1cba0 29 3b 0a 20 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f  );.  p->op = TK_
1cbb0 53 45 4c 45 43 54 3b 0a 20 20 70 2d 3e 70 57 68  SELECT;.  p->pWh
1cbc0 65 72 65 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d  ere = 0;.  pNew-
1cbd0 3e 70 47 72 6f 75 70 42 79 20 3d 20 30 3b 0a 20  >pGroupBy = 0;. 
1cbe0 20 70 4e 65 77 2d 3e 70 48 61 76 69 6e 67 20 3d   pNew->pHaving =
1cbf0 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 72 64   0;.  pNew->pOrd
1cc00 65 72 42 79 20 3d 20 30 3b 0a 20 20 70 2d 3e 70  erBy = 0;.  p->p
1cc10 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 70 4e 65  Prior = 0;.  pNe
1cc20 77 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  w->pLimit = 0;. 
1cc30 20 70 4e 65 77 2d 3e 70 4f 66 66 73 65 74 20 3d   pNew->pOffset =
1cc40 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 57 52 43   0;.  return WRC
1cc50 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a  _Continue;.}../*
1cc60 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1cc70 20 69 73 20 61 20 57 61 6c 6b 65 72 20 63 61 6c   is a Walker cal
1cc80 6c 62 61 63 6b 20 66 6f 72 20 22 65 78 70 61 6e  lback for "expan
1cc90 64 69 6e 67 22 20 61 20 53 45 4c 45 43 54 20 73  ding" a SELECT s
1cca0 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 22 45 78  tatement..** "Ex
1ccb0 70 61 6e 64 69 6e 67 22 20 6d 65 61 6e 73 20 74  panding" means t
1ccc0 6f 20 64 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69  o do the followi
1ccd0 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29  ng:.**.**    (1)
1cce0 20 20 4d 61 6b 65 20 73 75 72 65 20 56 44 42 45    Make sure VDBE
1ccf0 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20   cursor numbers 
1cd00 68 61 76 65 20 62 65 65 6e 20 61 73 73 69 67 6e  have been assign
1cd10 65 64 20 74 6f 20 65 76 65 72 79 0a 2a 2a 20 20  ed to every.**  
1cd20 20 20 20 20 20 20 20 65 6c 65 6d 65 6e 74 20 6f         element o
1cd30 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  f the FROM claus
1cd40 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20  e..**.**    (2) 
1cd50 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70 54 61   Fill in the pTa
1cd60 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70 54 61 62 20  bList->a[].pTab 
1cd70 66 69 65 6c 64 73 20 69 6e 20 74 68 65 20 53 72  fields in the Sr
1cd80 63 4c 69 73 74 20 74 68 61 74 20 0a 2a 2a 20 20  cList that .**  
1cd90 20 20 20 20 20 20 20 64 65 66 69 6e 65 73 20 46         defines F
1cda0 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 57 68 65  ROM clause.  Whe
1cdb0 6e 20 76 69 65 77 73 20 61 70 70 65 61 72 20 69  n views appear i
1cdc0 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
1cdd0 65 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 66 69  e,.**         fi
1cde0 6c 6c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d  ll pTabList->a[]
1cdf0 2e 70 53 65 6c 65 63 74 20 77 69 74 68 20 61 20  .pSelect with a 
1ce00 63 6f 70 79 20 6f 66 20 74 68 65 20 53 45 4c 45  copy of the SELE
1ce10 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20  CT statement.** 
1ce20 20 20 20 20 20 20 20 20 74 68 61 74 20 69 6d 70          that imp
1ce30 6c 65 6d 65 6e 74 73 20 74 68 65 20 76 69 65 77  lements the view
1ce40 2e 20 20 41 20 63 6f 70 79 20 69 73 20 6d 61 64  .  A copy is mad
1ce50 65 20 6f 66 20 74 68 65 20 76 69 65 77 27 73 20  e of the view's 
1ce60 53 45 4c 45 43 54 0a 2a 2a 20 20 20 20 20 20 20  SELECT.**       
1ce70 20 20 73 74 61 74 65 6d 65 6e 74 20 73 6f 20 74    statement so t
1ce80 68 61 74 20 77 65 20 63 61 6e 20 66 72 65 65 6c  hat we can freel
1ce90 79 20 6d 6f 64 69 66 79 20 6f 72 20 64 65 6c 65  y modify or dele
1cea0 74 65 20 74 68 61 74 20 73 74 61 74 65 6d 65 6e  te that statemen
1ceb0 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 77 69 74  t.**         wit
1cec0 68 6f 75 74 20 77 6f 72 72 79 69 6e 67 20 61 62  hout worrying ab
1ced0 6f 75 74 20 6d 65 73 73 69 6e 67 20 75 70 20 74  out messing up t
1cee0 68 65 20 70 72 65 73 69 73 74 65 6e 74 20 72 65  he presistent re
1cef0 70 72 65 73 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20  presentation.** 
1cf00 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 76          of the v
1cf10 69 65 77 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 33  iew..**.**    (3
1cf20 29 20 20 41 64 64 20 74 65 72 6d 73 20 74 6f 20  )  Add terms to 
1cf30 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
1cf40 20 74 6f 20 61 63 63 6f 6d 6f 64 61 74 65 20 74   to accomodate t
1cf50 68 65 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f  he NATURAL keywo
1cf60 72 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f 6e  rd.**         on
1cf70 20 6a 6f 69 6e 73 20 61 6e 64 20 74 68 65 20 4f   joins and the O
1cf80 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75  N and USING clau
1cf90 73 65 20 6f 66 20 6a 6f 69 6e 73 2e 0a 2a 2a 0a  se of joins..**.
1cfa0 2a 2a 20 20 20 20 28 34 29 20 20 53 63 61 6e 20  **    (4)  Scan 
1cfb0 74 68 65 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75  the list of colu
1cfc0 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c  mns in the resul
1cfd0 74 20 73 65 74 20 28 70 45 4c 69 73 74 29 20 6c  t set (pEList) l
1cfe0 6f 6f 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20  ooking.**       
1cff0 20 20 66 6f 72 20 69 6e 73 74 61 6e 63 65 73 20    for instances 
1d000 6f 66 20 74 68 65 20 22 2a 22 20 6f 70 65 72 61  of the "*" opera
1d010 74 6f 72 20 6f 72 20 74 68 65 20 54 41 42 4c 45  tor or the TABLE
1d020 2e 2a 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 20  .* operator..** 
1d030 20 20 20 20 20 20 20 20 49 66 20 66 6f 75 6e 64          If found
1d040 2c 20 65 78 70 61 6e 64 20 65 61 63 68 20 22 2a  , expand each "*
1d050 22 20 74 6f 20 62 65 20 65 76 65 72 79 20 63 6f  " to be every co
1d060 6c 75 6d 6e 20 69 6e 20 65 76 65 72 79 20 74 61  lumn in every ta
1d070 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 61  ble.**         a
1d080 6e 64 20 54 41 42 4c 45 2e 2a 20 74 6f 20 62 65  nd TABLE.* to be
1d090 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e   every column in
1d0a0 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2f 0a 73 74   TABLE..**.*/.st
1d0b0 61 74 69 63 20 69 6e 74 20 73 65 6c 65 63 74 45  atic int selectE
1d0c0 78 70 61 6e 64 65 72 28 57 61 6c 6b 65 72 20 2a  xpander(Walker *
1d0d0 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20  pWalker, Select 
1d0e0 2a 70 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50  *p){.  Parse *pP
1d0f0 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e  arse = pWalker->
1d100 70 50 61 72 73 65 3b 0a 20 20 69 6e 74 20 69 2c  pParse;.  int i,
1d110 20 6a 2c 20 6b 3b 0a 20 20 53 72 63 4c 69 73 74   j, k;.  SrcList
1d120 20 2a 70 54 61 62 4c 69 73 74 3b 0a 20 20 45 78   *pTabList;.  Ex
1d130 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a  prList *pEList;.
1d140 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
1d150 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a 20 20  _item *pFrom;.  
1d160 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
1d170 61 72 73 65 2d 3e 64 62 3b 0a 20 20 45 78 70 72  arse->db;.  Expr
1d180 20 2a 70 45 2c 20 2a 70 52 69 67 68 74 2c 20 2a   *pE, *pRight, *
1d190 70 45 78 70 72 3b 0a 20 20 75 31 36 20 73 65 6c  pExpr;.  u16 sel
1d1a0 46 6c 61 67 73 20 3d 20 70 2d 3e 73 65 6c 46 6c  Flags = p->selFl
1d1b0 61 67 73 3b 0a 0a 20 20 70 2d 3e 73 65 6c 46 6c  ags;..  p->selFl
1d1c0 61 67 73 20 7c 3d 20 53 46 5f 45 78 70 61 6e 64  ags |= SF_Expand
1d1d0 65 64 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  ed;.  if( db->ma
1d1e0 6c 6c 6f 63 46 61 69 6c 65 64 20 20 29 7b 0a 20  llocFailed  ){. 
1d1f0 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62     return WRC_Ab
1d200 6f 72 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 4e  ort;.  }.  if( N
1d210 45 56 45 52 28 70 2d 3e 70 53 72 63 3d 3d 30 29  EVER(p->pSrc==0)
1d220 20 7c 7c 20 28 73 65 6c 46 6c 61 67 73 20 26 20   || (selFlags & 
1d230 53 46 5f 45 78 70 61 6e 64 65 64 29 21 3d 30 20  SF_Expanded)!=0 
1d240 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52  ){.    return WR
1d250 43 5f 50 72 75 6e 65 3b 0a 20 20 7d 0a 20 20 70  C_Prune;.  }.  p
1d260 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72  TabList = p->pSr
1d270 63 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d  c;.  pEList = p-
1d280 3e 70 45 4c 69 73 74 3b 0a 0a 20 20 2f 2a 20 4d  >pEList;..  /* M
1d290 61 6b 65 20 73 75 72 65 20 63 75 72 73 6f 72 20  ake sure cursor 
1d2a0 6e 75 6d 62 65 72 73 20 68 61 76 65 20 62 65 65  numbers have bee
1d2b0 6e 20 61 73 73 69 67 6e 65 64 20 74 6f 20 61 6c  n assigned to al
1d2c0 6c 20 65 6e 74 72 69 65 73 20 69 6e 0a 20 20 2a  l entries in.  *
1d2d0 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * the FROM claus
1d2e0 65 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20  e of the SELECT 
1d2f0 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a  statement..  */.
1d300 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
1d310 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28 70 50  AssignCursors(pP
1d320 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 29 3b  arse, pTabList);
1d330 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 75 70 20 65  ..  /* Look up e
1d340 76 65 72 79 20 74 61 62 6c 65 20 6e 61 6d 65 64  very table named
1d350 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
1d360 75 73 65 20 6f 66 20 74 68 65 20 73 65 6c 65 63  use of the selec
1d370 74 2e 20 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65  t.  If.  ** an e
1d380 6e 74 72 79 20 6f 66 20 74 68 65 20 46 52 4f 4d  ntry of the FROM
1d390 20 63 6c 61 75 73 65 20 69 73 20 61 20 73 75 62   clause is a sub
1d3a0 71 75 65 72 79 20 69 6e 73 74 65 61 64 20 6f 66  query instead of
1d3b0 20 61 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77   a table or view
1d3c0 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 63 72 65 61  ,.  ** then crea
1d3d0 74 65 20 61 20 74 72 61 6e 73 69 65 6e 74 20 74  te a transient t
1d3e0 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 74  able structure t
1d3f0 6f 20 64 65 73 63 72 69 62 65 20 74 68 65 20 73  o describe the s
1d400 75 62 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20  ubquery..  */.  
1d410 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70  for(i=0, pFrom=p
1d420 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54  TabList->a; i<pT
1d430 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  abList->nSrc; i+
1d440 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20  +, pFrom++){.   
1d450 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
1d460 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 70 54 61    if( pFrom->pTa
1d470 62 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  b!=0 ){.      /*
1d480 20 54 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20   This statement 
1d490 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
1d4a0 20 70 72 65 70 61 72 65 64 2e 20 20 54 68 65 72   prepared.  Ther
1d4b0 65 20 69 73 20 6e 6f 20 6e 65 65 64 0a 20 20 20  e is no need.   
1d4c0 20 20 20 2a 2a 20 74 6f 20 67 6f 20 66 75 72 74     ** to go furt
1d4d0 68 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73  her. */.      as
1d4e0 73 65 72 74 28 20 69 3d 3d 30 20 29 3b 0a 20 20  sert( i==0 );.  
1d4f0 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50      return WRC_P
1d500 72 75 6e 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rune;.    }.    
1d510 69 66 28 20 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65  if( pFrom->zName
1d520 3d 3d 30 20 29 7b 0a 23 69 66 6e 64 65 66 20 53  ==0 ){.#ifndef S
1d530 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
1d540 45 52 59 0a 20 20 20 20 20 20 53 65 6c 65 63 74  ERY.      Select
1d550 20 2a 70 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e   *pSel = pFrom->
1d560 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 2f  pSelect;.      /
1d570 2a 20 41 20 73 75 62 2d 71 75 65 72 79 20 69 6e  * A sub-query in
1d580 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
1d590 20 6f 66 20 61 20 53 45 4c 45 43 54 20 2a 2f 0a   of a SELECT */.
1d5a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53        assert( pS
1d5b0 65 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61  el!=0 );.      a
1d5c0 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54  ssert( pFrom->pT
1d5d0 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73  ab==0 );.      s
1d5e0 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74  qlite3WalkSelect
1d5f0 28 70 57 61 6c 6b 65 72 2c 20 70 53 65 6c 29 3b  (pWalker, pSel);
1d600 0a 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54  .      pFrom->pT
1d610 61 62 20 3d 20 70 54 61 62 20 3d 20 73 71 6c 69  ab = pTab = sqli
1d620 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
1d630 64 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65  db, sizeof(Table
1d640 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54  ));.      if( pT
1d650 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57  ab==0 ) return W
1d660 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20  RC_Abort;.      
1d670 70 54 61 62 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a  pTab->nRef = 1;.
1d680 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d        pTab->zNam
1d690 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  e = sqlite3MPrin
1d6a0 74 66 28 64 62 2c 20 22 73 71 6c 69 74 65 5f 73  tf(db, "sqlite_s
1d6b0 75 62 71 75 65 72 79 5f 25 70 5f 22 2c 20 28 76  ubquery_%p_", (v
1d6c0 6f 69 64 2a 29 70 54 61 62 29 3b 0a 20 20 20 20  oid*)pTab);.    
1d6d0 20 20 77 68 69 6c 65 28 20 70 53 65 6c 2d 3e 70    while( pSel->p
1d6e0 50 72 69 6f 72 20 29 7b 20 70 53 65 6c 20 3d 20  Prior ){ pSel = 
1d6f0 70 53 65 6c 2d 3e 70 50 72 69 6f 72 3b 20 7d 0a  pSel->pPrior; }.
1d700 20 20 20 20 20 20 73 65 6c 65 63 74 43 6f 6c 75        selectColu
1d710 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28  mnsFromExprList(
1d720 70 50 61 72 73 65 2c 20 70 53 65 6c 2d 3e 70 45  pParse, pSel->pE
1d730 4c 69 73 74 2c 20 26 70 54 61 62 2d 3e 6e 43 6f  List, &pTab->nCo
1d740 6c 2c 20 26 70 54 61 62 2d 3e 61 43 6f 6c 29 3b  l, &pTab->aCol);
1d750 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 69 50 4b  .      pTab->iPK
1d760 65 79 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 70  ey = -1;.      p
1d770 54 61 62 2d 3e 6e 52 6f 77 45 73 74 20 3d 20 31  Tab->nRowEst = 1
1d780 30 30 30 30 30 30 3b 0a 20 20 20 20 20 20 70 54  000000;.      pT
1d790 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20  ab->tabFlags |= 
1d7a0 54 46 5f 45 70 68 65 6d 65 72 61 6c 3b 0a 23 65  TF_Ephemeral;.#e
1d7b0 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ndif.    }else{.
1d7c0 20 20 20 20 20 20 2f 2a 20 41 6e 20 6f 72 64 69        /* An ordi
1d7d0 6e 61 72 79 20 74 61 62 6c 65 20 6f 72 20 76 69  nary table or vi
1d7e0 65 77 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 46  ew name in the F
1d7f0 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ROM clause */.  
1d800 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f      assert( pFro
1d810 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20  m->pTab==0 );.  
1d820 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20      pFrom->pTab 
1d830 3d 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33  = pTab = sqlite3
1d840 4c 6f 63 61 74 65 54 61 62 6c 65 49 74 65 6d 28  LocateTableItem(
1d850 70 50 61 72 73 65 2c 20 30 2c 20 70 46 72 6f 6d  pParse, 0, pFrom
1d860 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61  );.      if( pTa
1d870 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52  b==0 ) return WR
1d880 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 69  C_Abort;.      i
1d890 66 28 20 70 54 61 62 2d 3e 6e 52 65 66 3d 3d 30  f( pTab->nRef==0
1d8a0 78 66 66 66 66 20 29 7b 0a 20 20 20 20 20 20 20  xffff ){.       
1d8b0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
1d8c0 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61  (pParse, "too ma
1d8d0 6e 79 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  ny references to
1d8e0 20 5c 22 25 73 5c 22 3a 20 6d 61 78 20 36 35 35   \"%s\": max 655
1d8f0 33 35 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  35",.           
1d900 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
1d910 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61        pFrom->pTa
1d920 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72  b = 0;.        r
1d930 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
1d940 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
1d950 54 61 62 2d 3e 6e 52 65 66 2b 2b 3b 0a 23 69 66  Tab->nRef++;.#if
1d960 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
1d970 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21  _OMIT_VIEW) || !
1d980 64 65 66 69 6e 65 64 20 28 53 51 4c 49 54 45 5f  defined (SQLITE_
1d990 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
1d9a0 45 29 0a 20 20 20 20 20 20 69 66 28 20 70 54 61  E).      if( pTa
1d9b0 62 2d 3e 70 53 65 6c 65 63 74 20 7c 7c 20 49 73  b->pSelect || Is
1d9c0 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b  Virtual(pTab) ){
1d9d0 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 72  .        /* We r
1d9e0 65 61 63 68 20 68 65 72 65 20 69 66 20 74 68 65  each here if the
1d9f0 20 6e 61 6d 65 64 20 74 61 62 6c 65 20 69 73 20   named table is 
1da00 61 20 72 65 61 6c 6c 79 20 61 20 76 69 65 77 20  a really a view 
1da10 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  */.        if( s
1da20 71 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c  qlite3ViewGetCol
1da30 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c  umnNames(pParse,
1da40 20 70 54 61 62 29 20 29 20 72 65 74 75 72 6e 20   pTab) ) return 
1da50 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20  WRC_Abort;.     
1da60 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d     assert( pFrom
1da70 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 3b 0a  ->pSelect==0 );.
1da80 20 20 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70          pFrom->p
1da90 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33  Select = sqlite3
1daa0 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 54  SelectDup(db, pT
1dab0 61 62 2d 3e 70 53 65 6c 65 63 74 2c 20 30 29 3b  ab->pSelect, 0);
1dac0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1dad0 57 61 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b  WalkSelect(pWalk
1dae0 65 72 2c 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65  er, pFrom->pSele
1daf0 63 74 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  ct);.      }.#en
1db00 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  dif.    }..    /
1db10 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 64  * Locate the ind
1db20 65 78 20 6e 61 6d 65 64 20 62 79 20 74 68 65 20  ex named by the 
1db30 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73  INDEXED BY claus
1db40 65 2c 20 69 66 20 61 6e 79 2e 20 2a 2f 0a 20 20  e, if any. */.  
1db50 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 6e 64    if( sqlite3Ind
1db60 65 78 65 64 42 79 4c 6f 6f 6b 75 70 28 70 50 61  exedByLookup(pPa
1db70 72 73 65 2c 20 70 46 72 6f 6d 29 20 29 7b 0a 20  rse, pFrom) ){. 
1db80 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f       return WRC_
1db90 41 62 6f 72 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  Abort;.    }.  }
1dba0 0a 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 4e  ..  /* Process N
1dbb0 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 73 2c  ATURAL keywords,
1dbc0 20 61 6e 64 20 4f 4e 20 61 6e 64 20 55 53 49 4e   and ON and USIN
1dbd0 47 20 63 6c 61 75 73 65 73 20 6f 66 20 6a 6f 69  G clauses of joi
1dbe0 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64  ns..  */.  if( d
1dbf0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
1dc00 7c 7c 20 73 71 6c 69 74 65 50 72 6f 63 65 73 73  || sqliteProcess
1dc10 4a 6f 69 6e 28 70 50 61 72 73 65 2c 20 70 29 20  Join(pParse, p) 
1dc20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52  ){.    return WR
1dc30 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 0a 20 20  C_Abort;.  }..  
1dc40 2f 2a 20 46 6f 72 20 65 76 65 72 79 20 22 2a 22  /* For every "*"
1dc50 20 74 68 61 74 20 6f 63 63 75 72 73 20 69 6e 20   that occurs in 
1dc60 74 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2c  the column list,
1dc70 20 69 6e 73 65 72 74 20 74 68 65 20 6e 61 6d 65   insert the name
1dc80 73 20 6f 66 0a 20 20 2a 2a 20 61 6c 6c 20 63 6f  s of.  ** all co
1dc90 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c 20 74 61 62  lumns in all tab
1dca0 6c 65 73 2e 20 20 41 6e 64 20 66 6f 72 20 65 76  les.  And for ev
1dcb0 65 72 79 20 54 41 42 4c 45 2e 2a 20 69 6e 73 65  ery TABLE.* inse
1dcc0 72 74 20 74 68 65 20 6e 61 6d 65 73 0a 20 20 2a  rt the names.  *
1dcd0 2a 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73  * of all columns
1dce0 20 69 6e 20 54 41 42 4c 45 2e 20 20 54 68 65 20   in TABLE.  The 
1dcf0 70 61 72 73 65 72 20 69 6e 73 65 72 74 65 64 20  parser inserted 
1dd00 61 20 73 70 65 63 69 61 6c 20 65 78 70 72 65 73  a special expres
1dd10 73 69 6f 6e 0a 20 20 2a 2a 20 77 69 74 68 20 74  sion.  ** with t
1dd20 68 65 20 54 4b 5f 41 4c 4c 20 6f 70 65 72 61 74  he TK_ALL operat
1dd30 6f 72 20 66 6f 72 20 65 61 63 68 20 22 2a 22 20  or for each "*" 
1dd40 74 68 61 74 20 69 74 20 66 6f 75 6e 64 20 69 6e  that it found in
1dd50 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74   the column list
1dd60 2e 0a 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ..  ** The follo
1dd70 77 69 6e 67 20 63 6f 64 65 20 6a 75 73 74 20 68  wing code just h
1dd80 61 73 20 74 6f 20 6c 6f 63 61 74 65 20 74 68 65  as to locate the
1dd90 20 54 4b 5f 41 4c 4c 20 65 78 70 72 65 73 73 69   TK_ALL expressi
1dda0 6f 6e 73 20 61 6e 64 20 65 78 70 61 6e 64 0a 20  ons and expand. 
1ddb0 20 2a 2a 20 65 61 63 68 20 6f 6e 65 20 74 6f 20   ** each one to 
1ddc0 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20  the list of all 
1ddd0 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c 20 74  columns in all t
1dde0 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  ables..  **.  **
1ddf0 20 54 68 65 20 66 69 72 73 74 20 6c 6f 6f 70 20   The first loop 
1de00 6a 75 73 74 20 63 68 65 63 6b 73 20 74 6f 20 73  just checks to s
1de10 65 65 20 69 66 20 74 68 65 72 65 20 61 72 65 20  ee if there are 
1de20 61 6e 79 20 22 2a 22 20 6f 70 65 72 61 74 6f 72  any "*" operator
1de30 73 0a 20 20 2a 2a 20 74 68 61 74 20 6e 65 65 64  s.  ** that need
1de40 20 65 78 70 61 6e 64 69 6e 67 2e 0a 20 20 2a 2f   expanding..  */
1de50 0a 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45  .  for(k=0; k<pE
1de60 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b  List->nExpr; k++
1de70 29 7b 0a 20 20 20 20 70 45 20 3d 20 70 45 4c 69  ){.    pE = pELi
1de80 73 74 2d 3e 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a  st->a[k].pExpr;.
1de90 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d      if( pE->op==
1dea0 54 4b 5f 41 4c 4c 20 29 20 62 72 65 61 6b 3b 0a  TK_ALL ) break;.
1deb0 20 20 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e      assert( pE->
1dec0 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 45  op!=TK_DOT || pE
1ded0 2d 3e 70 52 69 67 68 74 21 3d 30 20 29 3b 0a 20  ->pRight!=0 );. 
1dee0 20 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e 6f     assert( pE->o
1def0 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 28 70 45  p!=TK_DOT || (pE
1df00 2d 3e 70 4c 65 66 74 21 3d 30 20 26 26 20 70 45  ->pLeft!=0 && pE
1df10 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f  ->pLeft->op==TK_
1df20 49 44 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ID) );.    if( p
1df30 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 26 26  E->op==TK_DOT &&
1df40 20 70 45 2d 3e 70 52 69 67 68 74 2d 3e 6f 70 3d   pE->pRight->op=
1df50 3d 54 4b 5f 41 4c 4c 20 29 20 62 72 65 61 6b 3b  =TK_ALL ) break;
1df60 0a 20 20 7d 0a 20 20 69 66 28 20 6b 3c 70 45 4c  .  }.  if( k<pEL
1df70 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  ist->nExpr ){.  
1df80 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 49 66 20 77    /*.    ** If w
1df90 65 20 67 65 74 20 68 65 72 65 20 69 74 20 6d 65  e get here it me
1dfa0 61 6e 73 20 74 68 65 20 72 65 73 75 6c 74 20 73  ans the result s
1dfb0 65 74 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20  et contains one 
1dfc0 6f 72 20 6d 6f 72 65 20 22 2a 22 0a 20 20 20 20  or more "*".    
1dfd0 2a 2a 20 6f 70 65 72 61 74 6f 72 73 20 74 68 61  ** operators tha
1dfe0 74 20 6e 65 65 64 20 74 6f 20 62 65 20 65 78 70  t need to be exp
1dff0 61 6e 64 65 64 2e 20 20 4c 6f 6f 70 20 74 68 72  anded.  Loop thr
1e000 6f 75 67 68 20 65 61 63 68 20 65 78 70 72 65 73  ough each expres
1e010 73 69 6f 6e 0a 20 20 20 20 2a 2a 20 69 6e 20 74  sion.    ** in t
1e020 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 61 6e  he result set an
1e030 64 20 65 78 70 61 6e 64 20 74 68 65 6d 20 6f 6e  d expand them on
1e040 65 20 62 79 20 6f 6e 65 2e 0a 20 20 20 20 2a 2f  e by one..    */
1e050 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72  .    struct Expr
1e060 4c 69 73 74 5f 69 74 65 6d 20 2a 61 20 3d 20 70  List_item *a = p
1e070 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 45 78  EList->a;.    Ex
1e080 70 72 4c 69 73 74 20 2a 70 4e 65 77 20 3d 20 30  prList *pNew = 0
1e090 3b 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20  ;.    int flags 
1e0a0 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c  = pParse->db->fl
1e0b0 61 67 73 3b 0a 20 20 20 20 69 6e 74 20 6c 6f 6e  ags;.    int lon
1e0c0 67 4e 61 6d 65 73 20 3d 20 28 66 6c 61 67 73 20  gNames = (flags 
1e0d0 26 20 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c  & SQLITE_FullCol
1e0e0 4e 61 6d 65 73 29 21 3d 30 0a 20 20 20 20 20 20  Names)!=0.      
1e0f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e100 26 26 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49  && (flags & SQLI
1e110 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73  TE_ShortColNames
1e120 29 3d 3d 30 3b 0a 0a 20 20 20 20 2f 2a 20 57 68  )==0;..    /* Wh
1e130 65 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 46 52  en processing FR
1e140 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62 71 75 65  OM-clause subque
1e150 72 69 65 73 2c 20 69 74 20 69 73 20 61 6c 77 61  ries, it is alwa
1e160 79 73 20 74 68 65 20 63 61 73 65 0a 20 20 20 20  ys the case.    
1e170 2a 2a 20 74 68 61 74 20 66 75 6c 6c 5f 63 6f 6c  ** that full_col
1e180 75 6d 6e 5f 6e 61 6d 65 73 3d 4f 46 46 20 61 6e  umn_names=OFF an
1e190 64 20 73 68 6f 72 74 5f 63 6f 6c 75 6d 6e 5f 6e  d short_column_n
1e1a0 61 6d 65 73 3d 4f 4e 2e 20 20 54 68 65 0a 20 20  ames=ON.  The.  
1e1b0 20 20 2a 2a 20 73 71 6c 69 74 65 33 52 65 73 75    ** sqlite3Resu
1e1c0 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 29 20  ltSetOfSelect() 
1e1d0 72 6f 75 74 69 6e 65 20 6d 61 6b 65 73 20 69 74  routine makes it
1e1e0 20 73 6f 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65   so. */.    asse
1e1f0 72 74 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73  rt( (p->selFlags
1e200 20 26 20 53 46 5f 4e 65 73 74 65 64 46 72 6f 6d   & SF_NestedFrom
1e210 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 7c  )==0.          |
1e220 7c 20 28 28 66 6c 61 67 73 20 26 20 53 51 4c 49  | ((flags & SQLI
1e230 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29  TE_FullColNames)
1e240 3d 3d 30 20 26 26 0a 20 20 20 20 20 20 20 20 20  ==0 &&.         
1e250 20 20 20 20 20 28 66 6c 61 67 73 20 26 20 53 51       (flags & SQ
1e260 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d  LITE_ShortColNam
1e270 65 73 29 21 3d 30 29 20 29 3b 0a 0a 20 20 20 20  es)!=0) );..    
1e280 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73  for(k=0; k<pELis
1e290 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a  t->nExpr; k++){.
1e2a0 20 20 20 20 20 20 70 45 20 3d 20 61 5b 6b 5d 2e        pE = a[k].
1e2b0 70 45 78 70 72 3b 0a 20 20 20 20 20 20 70 52 69  pExpr;.      pRi
1e2c0 67 68 74 20 3d 20 70 45 2d 3e 70 52 69 67 68 74  ght = pE->pRight
1e2d0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1e2e0 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c  pE->op!=TK_DOT |
1e2f0 7c 20 70 52 69 67 68 74 21 3d 30 20 29 3b 0a 20  | pRight!=0 );. 
1e300 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 21       if( pE->op!
1e310 3d 54 4b 5f 41 4c 4c 20 26 26 20 28 70 45 2d 3e  =TK_ALL && (pE->
1e320 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 52  op!=TK_DOT || pR
1e330 69 67 68 74 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c  ight->op!=TK_ALL
1e340 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
1e350 54 68 69 73 20 70 61 72 74 69 63 75 6c 61 72 20  This particular 
1e360 65 78 70 72 65 73 73 69 6f 6e 20 64 6f 65 73 20  expression does 
1e370 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 65  not need to be e
1e380 78 70 61 6e 64 65 64 2e 0a 20 20 20 20 20 20 20  xpanded..       
1e390 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77   */.        pNew
1e3a0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
1e3b0 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c  stAppend(pParse,
1e3c0 20 70 4e 65 77 2c 20 61 5b 6b 5d 2e 70 45 78 70   pNew, a[k].pExp
1e3d0 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  r);.        if( 
1e3e0 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20  pNew ){.        
1e3f0 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e    pNew->a[pNew->
1e400 6e 45 78 70 72 2d 31 5d 2e 7a 4e 61 6d 65 20 3d  nExpr-1].zName =
1e410 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20   a[k].zName;.   
1e420 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70         pNew->a[p
1e430 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a 53  New->nExpr-1].zS
1e440 70 61 6e 20 3d 20 61 5b 6b 5d 2e 7a 53 70 61 6e  pan = a[k].zSpan
1e450 3b 0a 20 20 20 20 20 20 20 20 20 20 61 5b 6b 5d  ;.          a[k]
1e460 2e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20  .zName = 0;.    
1e470 20 20 20 20 20 20 61 5b 6b 5d 2e 7a 53 70 61 6e        a[k].zSpan
1e480 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
1e490 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 70 45 78          a[k].pEx
1e4a0 70 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65  pr = 0;.      }e
1e4b0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
1e4c0 54 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20  This expression 
1e4d0 69 73 20 61 20 22 2a 22 20 6f 72 20 61 20 22 54  is a "*" or a "T
1e4e0 41 42 4c 45 2e 2a 22 20 61 6e 64 20 6e 65 65 64  ABLE.*" and need
1e4f0 73 20 74 6f 20 62 65 0a 20 20 20 20 20 20 20 20  s to be.        
1e500 2a 2a 20 65 78 70 61 6e 64 65 64 2e 20 2a 2f 0a  ** expanded. */.
1e510 20 20 20 20 20 20 20 20 69 6e 74 20 74 61 62 6c          int tabl
1e520 65 53 65 65 6e 20 3d 20 30 3b 20 20 20 20 20 20  eSeen = 0;      
1e530 2f 2a 20 53 65 74 20 74 6f 20 31 20 77 68 65 6e  /* Set to 1 when
1e540 20 54 41 42 4c 45 20 6d 61 74 63 68 65 73 20 2a   TABLE matches *
1e550 2f 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  /.        char *
1e560 7a 54 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20  zTName = 0;     
1e570 20 20 2f 2a 20 74 65 78 74 20 6f 66 20 6e 61 6d    /* text of nam
1e580 65 20 6f 66 20 54 41 42 4c 45 20 2a 2f 0a 20 20  e of TABLE */.  
1e590 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70        if( pE->op
1e5a0 3d 3d 54 4b 5f 44 4f 54 20 29 7b 0a 20 20 20 20  ==TK_DOT ){.    
1e5b0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
1e5c0 2d 3e 70 4c 65 66 74 21 3d 30 20 29 3b 0a 20 20  ->pLeft!=0 );.  
1e5d0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1e5e0 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
1e5f0 28 70 45 2d 3e 70 4c 65 66 74 2c 20 45 50 5f 49  (pE->pLeft, EP_I
1e600 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20  ntValue) );.    
1e610 20 20 20 20 20 20 7a 54 4e 61 6d 65 20 3d 20 70        zTName = p
1e620 45 2d 3e 70 4c 65 66 74 2d 3e 75 2e 7a 54 6f 6b  E->pLeft->u.zTok
1e630 65 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  en;.        }.  
1e640 20 20 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70        for(i=0, p
1e650 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61  From=pTabList->a
1e660 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  ; i<pTabList->nS
1e670 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b  rc; i++, pFrom++
1e680 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54 61 62  ){.          Tab
1e690 6c 65 20 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d  le *pTab = pFrom
1e6a0 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20  ->pTab;.        
1e6b0 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 20 3d    Select *pSub =
1e6c0 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b   pFrom->pSelect;
1e6d0 0a 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20  .          char 
1e6e0 2a 7a 54 61 62 4e 61 6d 65 20 3d 20 70 46 72 6f  *zTabName = pFro
1e6f0 6d 2d 3e 7a 41 6c 69 61 73 3b 0a 20 20 20 20 20  m->zAlias;.     
1e700 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
1e710 2a 7a 53 63 68 65 6d 61 4e 61 6d 65 20 3d 20 30  *zSchemaName = 0
1e720 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  ;.          int 
1e730 69 44 62 3b 0a 20 20 20 20 20 20 20 20 20 20 69  iDb;.          i
1e740 66 28 20 7a 54 61 62 4e 61 6d 65 3d 3d 30 20 29  f( zTabName==0 )
1e750 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 54  {.            zT
1e760 61 62 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 7a  abName = pTab->z
1e770 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Name;.          
1e780 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  }.          if( 
1e790 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1e7a0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
1e7b0 20 20 20 20 69 66 28 20 70 53 75 62 3d 3d 30 20      if( pSub==0 
1e7c0 7c 7c 20 28 70 53 75 62 2d 3e 73 65 6c 46 6c 61  || (pSub->selFla
1e7d0 67 73 20 26 20 53 46 5f 4e 65 73 74 65 64 46 72  gs & SF_NestedFr
1e7e0 6f 6d 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  om)==0 ){.      
1e7f0 20 20 20 20 20 20 70 53 75 62 20 3d 20 30 3b 0a        pSub = 0;.
1e800 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
1e810 7a 54 4e 61 6d 65 20 26 26 20 73 71 6c 69 74 65  zTName && sqlite
1e820 33 53 74 72 49 43 6d 70 28 7a 54 4e 61 6d 65 2c  3StrICmp(zTName,
1e830 20 7a 54 61 62 4e 61 6d 65 29 21 3d 30 20 29 7b   zTabName)!=0 ){
1e840 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63  .              c
1e850 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
1e860 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1e870 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33     iDb = sqlite3
1e880 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62  SchemaToIndex(db
1e890 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29  , pTab->pSchema)
1e8a0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 53  ;.            zS
1e8b0 63 68 65 6d 61 4e 61 6d 65 20 3d 20 69 44 62 3e  chemaName = iDb>
1e8c0 3d 30 20 3f 20 64 62 2d 3e 61 44 62 5b 69 44 62  =0 ? db->aDb[iDb
1e8d0 5d 2e 7a 4e 61 6d 65 20 3a 20 22 2a 22 3b 0a 20  ].zName : "*";. 
1e8e0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1e8f0 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
1e900 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29  pTab->nCol; j++)
1e910 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 68  {.            ch
1e920 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 54 61 62  ar *zName = pTab
1e930 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b  ->aCol[j].zName;
1e940 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61  .            cha
1e950 72 20 2a 7a 43 6f 6c 6e 61 6d 65 3b 20 20 2f 2a  r *zColname;  /*
1e960 20 54 68 65 20 63 6f 6d 70 75 74 65 64 20 63 6f   The computed co
1e970 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 20  lumn name */.   
1e980 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a           char *z
1e990 54 6f 46 72 65 65 3b 20 20 20 2f 2a 20 4d 61 6c  ToFree;   /* Mal
1e9a0 6c 6f 63 65 64 20 73 74 72 69 6e 67 20 74 68 61  loced string tha
1e9b0 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 66 72  t needs to be fr
1e9c0 65 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  eed */.         
1e9d0 20 20 20 54 6f 6b 65 6e 20 73 43 6f 6c 6e 61 6d     Token sColnam
1e9e0 65 3b 20 20 2f 2a 20 43 6f 6d 70 75 74 65 64 20  e;  /* Computed 
1e9f0 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 61 73 20 61  column name as a
1ea00 20 74 6f 6b 65 6e 20 2a 2f 0a 0a 20 20 20 20 20   token */..     
1ea10 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a         assert( z
1ea20 4e 61 6d 65 20 29 3b 0a 20 20 20 20 20 20 20 20  Name );.        
1ea30 20 20 20 20 69 66 28 20 7a 54 4e 61 6d 65 20 26      if( zTName &
1ea40 26 20 70 53 75 62 0a 20 20 20 20 20 20 20 20 20  & pSub.         
1ea50 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 4d 61      && sqlite3Ma
1ea60 74 63 68 53 70 61 6e 4e 61 6d 65 28 70 53 75 62  tchSpanName(pSub
1ea70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a  ->pEList->a[j].z
1ea80 53 70 61 6e 2c 20 30 2c 20 7a 54 4e 61 6d 65 2c  Span, 0, zTName,
1ea90 20 30 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20   0)==0.         
1eaa0 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
1eab0 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
1eac0 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20            }..   
1ead0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61           /* If a
1eae0 20 63 6f 6c 75 6d 6e 20 69 73 20 6d 61 72 6b 65   column is marke
1eaf0 64 20 61 73 20 27 68 69 64 64 65 6e 27 20 28 63  d as 'hidden' (c
1eb00 75 72 72 65 6e 74 6c 79 20 6f 6e 6c 79 20 70 6f  urrently only po
1eb10 73 73 69 62 6c 65 0a 20 20 20 20 20 20 20 20 20  ssible.         
1eb20 20 20 20 2a 2a 20 66 6f 72 20 76 69 72 74 75 61     ** for virtua
1eb30 6c 20 74 61 62 6c 65 73 29 2c 20 64 6f 20 6e 6f  l tables), do no
1eb40 74 20 69 6e 63 6c 75 64 65 20 69 74 20 69 6e 20  t include it in 
1eb50 74 68 65 20 65 78 70 61 6e 64 65 64 0a 20 20 20  the expanded.   
1eb60 20 20 20 20 20 20 20 20 20 2a 2a 20 72 65 73 75           ** resu
1eb70 6c 74 2d 73 65 74 20 6c 69 73 74 2e 0a 20 20 20  lt-set list..   
1eb80 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
1eb90 20 20 20 20 20 20 20 20 69 66 28 20 49 73 48 69          if( IsHi
1eba0 64 64 65 6e 43 6f 6c 75 6d 6e 28 26 70 54 61 62  ddenColumn(&pTab
1ebb0 2d 3e 61 43 6f 6c 5b 6a 5d 29 20 29 7b 0a 20 20  ->aCol[j]) ){.  
1ebc0 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
1ebd0 72 74 28 49 73 56 69 72 74 75 61 6c 28 70 54 61  rt(IsVirtual(pTa
1ebe0 62 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  b));.           
1ebf0 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
1ec00 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1ec10 20 20 20 20 20 20 20 74 61 62 6c 65 53 65 65 6e         tableSeen
1ec20 20 3d 20 31 3b 0a 0a 20 20 20 20 20 20 20 20 20   = 1;..         
1ec30 20 20 20 69 66 28 20 69 3e 30 20 26 26 20 7a 54     if( i>0 && zT
1ec40 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Name==0 ){.     
1ec50 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70 46           if( (pF
1ec60 72 6f 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20  rom->jointype & 
1ec70 4a 54 5f 4e 41 54 55 52 41 4c 29 21 3d 30 0a 20  JT_NATURAL)!=0. 
1ec80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
1ec90 26 20 74 61 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e  & tableAndColumn
1eca0 49 6e 64 65 78 28 70 54 61 62 4c 69 73 74 2c 20  Index(pTabList, 
1ecb0 69 2c 20 7a 4e 61 6d 65 2c 20 30 2c 20 30 29 0a  i, zName, 0, 0).
1ecc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 29 7b                ){
1ecd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1ece0 20 2f 2a 20 49 6e 20 61 20 4e 41 54 55 52 41 4c   /* In a NATURAL
1ecf0 20 6a 6f 69 6e 2c 20 6f 6d 69 74 20 74 68 65 20   join, omit the 
1ed00 6a 6f 69 6e 20 63 6f 6c 75 6d 6e 73 20 66 72 6f  join columns fro
1ed10 6d 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 20  m the .         
1ed20 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20         ** table 
1ed30 74 6f 20 74 68 65 20 72 69 67 68 74 20 6f 66 20  to the right of 
1ed40 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20 20 20  the join */.    
1ed50 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
1ed60 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
1ed70 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1ed80 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49      if( sqlite3I
1ed90 64 4c 69 73 74 49 6e 64 65 78 28 70 46 72 6f 6d  dListIndex(pFrom
1eda0 2d 3e 70 55 73 69 6e 67 2c 20 7a 4e 61 6d 65 29  ->pUsing, zName)
1edb0 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  >=0 ){.         
1edc0 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 61 20 6a         /* In a j
1edd0 6f 69 6e 20 77 69 74 68 20 61 20 55 53 49 4e 47  oin with a USING
1ede0 20 63 6c 61 75 73 65 2c 20 6f 6d 69 74 20 63 6f   clause, omit co
1edf0 6c 75 6d 6e 73 20 69 6e 20 74 68 65 0a 20 20 20  lumns in the.   
1ee00 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
1ee10 75 73 69 6e 67 20 63 6c 61 75 73 65 20 66 72 6f  using clause fro
1ee20 6d 20 74 68 65 20 74 61 62 6c 65 20 6f 6e 20 74  m the table on t
1ee30 68 65 20 72 69 67 68 74 2e 20 2a 2f 0a 20 20 20  he right. */.   
1ee40 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
1ee50 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
1ee60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1ee70 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
1ee80 20 70 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65   pRight = sqlite
1ee90 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 49 44 2c  3Expr(db, TK_ID,
1eea0 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20   zName);.       
1eeb0 20 20 20 20 20 7a 43 6f 6c 6e 61 6d 65 20 3d 20       zColname = 
1eec0 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20  zName;.         
1eed0 20 20 20 7a 54 6f 46 72 65 65 20 3d 20 30 3b 0a     zToFree = 0;.
1eee0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
1eef0 6c 6f 6e 67 4e 61 6d 65 73 20 7c 7c 20 70 54 61  longNames || pTa
1ef00 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 31 20 29 7b  bList->nSrc>1 ){
1ef10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45  .              E
1ef20 78 70 72 20 2a 70 4c 65 66 74 3b 0a 20 20 20 20  xpr *pLeft;.    
1ef30 20 20 20 20 20 20 20 20 20 20 70 4c 65 66 74 20            pLeft 
1ef40 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62  = sqlite3Expr(db
1ef50 2c 20 54 4b 5f 49 44 2c 20 7a 54 61 62 4e 61 6d  , TK_ID, zTabNam
1ef60 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
1ef70 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65    pExpr = sqlite
1ef80 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
1ef90 4b 5f 44 4f 54 2c 20 70 4c 65 66 74 2c 20 70 52  K_DOT, pLeft, pR
1efa0 69 67 68 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  ight, 0);.      
1efb0 20 20 20 20 20 20 20 20 69 66 28 20 7a 53 63 68          if( zSch
1efc0 65 6d 61 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20  emaName ){.     
1efd0 20 20 20 20 20 20 20 20 20 20 20 70 4c 65 66 74             pLeft
1efe0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 64   = sqlite3Expr(d
1eff0 62 2c 20 54 4b 5f 49 44 2c 20 7a 53 63 68 65 6d  b, TK_ID, zSchem
1f000 61 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  aName);.        
1f010 20 20 20 20 20 20 20 20 70 45 78 70 72 20 3d 20          pExpr = 
1f020 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
1f030 72 73 65 2c 20 54 4b 5f 44 4f 54 2c 20 70 4c 65  rse, TK_DOT, pLe
1f040 66 74 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20  ft, pExpr, 0);. 
1f050 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
1f060 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
1f070 20 6c 6f 6e 67 4e 61 6d 65 73 20 29 7b 0a 20 20   longNames ){.  
1f080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 43                zC
1f090 6f 6c 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  olname = sqlite3
1f0a0 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2e  MPrintf(db, "%s.
1f0b0 25 73 22 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 7a  %s", zTabName, z
1f0c0 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Name);.         
1f0d0 20 20 20 20 20 20 20 7a 54 6f 46 72 65 65 20 3d         zToFree =
1f0e0 20 7a 43 6f 6c 6e 61 6d 65 3b 0a 20 20 20 20 20   zColname;.     
1f0f0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1f100 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
1f110 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
1f120 72 20 3d 20 70 52 69 67 68 74 3b 0a 20 20 20 20  r = pRight;.    
1f130 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1f140 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c        pNew = sql
1f150 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
1f160 6e 64 28 70 50 61 72 73 65 2c 20 70 4e 65 77 2c  nd(pParse, pNew,
1f170 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20   pExpr);.       
1f180 20 20 20 20 20 73 43 6f 6c 6e 61 6d 65 2e 7a 20       sColname.z 
1f190 3d 20 7a 43 6f 6c 6e 61 6d 65 3b 0a 20 20 20 20  = zColname;.    
1f1a0 20 20 20 20 20 20 20 20 73 43 6f 6c 6e 61 6d 65          sColname
1f1b0 2e 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  .n = sqlite3Strl
1f1c0 65 6e 33 30 28 7a 43 6f 6c 6e 61 6d 65 29 3b 0a  en30(zColname);.
1f1d0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
1f1e0 74 65 33 45 78 70 72 4c 69 73 74 53 65 74 4e 61  te3ExprListSetNa
1f1f0 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 65 77 2c  me(pParse, pNew,
1f200 20 26 73 43 6f 6c 6e 61 6d 65 2c 20 30 29 3b 0a   &sColname, 0);.
1f210 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
1f220 70 4e 65 77 20 26 26 20 28 70 2d 3e 73 65 6c 46  pNew && (p->selF
1f230 6c 61 67 73 20 26 20 53 46 5f 4e 65 73 74 65 64  lags & SF_Nested
1f240 46 72 6f 6d 29 21 3d 30 20 29 7b 0a 20 20 20 20  From)!=0 ){.    
1f250 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74            struct
1f260 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
1f270 70 58 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 70 4e  pX = &pNew->a[pN
1f280 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20  ew->nExpr-1];.  
1f290 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
1f2a0 70 53 75 62 20 29 7b 0a 20 20 20 20 20 20 20 20  pSub ){.        
1f2b0 20 20 20 20 20 20 20 20 70 58 2d 3e 7a 53 70 61          pX->zSpa
1f2c0 6e 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  n = sqlite3DbStr
1f2d0 44 75 70 28 64 62 2c 20 70 53 75 62 2d 3e 70 45  Dup(db, pSub->pE
1f2e0 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 53 70 61 6e  List->a[j].zSpan
1f2f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
1f300 20 20 20 74 65 73 74 63 61 73 65 28 20 70 58 2d     testcase( pX-
1f310 3e 7a 53 70 61 6e 3d 3d 30 20 29 3b 0a 20 20 20  >zSpan==0 );.   
1f320 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65             }else
1f330 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1f340 20 20 70 58 2d 3e 7a 53 70 61 6e 20 3d 20 73 71    pX->zSpan = sq
1f350 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
1f360 20 22 25 73 2e 25 73 2e 25 73 22 2c 0a 20 20 20   "%s.%s.%s",.   
1f370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f390 20 20 20 20 20 20 20 20 7a 53 63 68 65 6d 61 4e          zSchemaN
1f3a0 61 6d 65 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 7a  ame, zTabName, z
1f3b0 43 6f 6c 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  Colname);.      
1f3c0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
1f3d0 73 65 28 20 70 58 2d 3e 7a 53 70 61 6e 3d 3d 30  se( pX->zSpan==0
1f3e0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
1f3f0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
1f400 20 20 70 58 2d 3e 62 53 70 61 6e 49 73 54 61 62    pX->bSpanIsTab
1f410 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
1f420 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
1f430 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
1f440 2c 20 7a 54 6f 46 72 65 65 29 3b 0a 20 20 20 20  , zToFree);.    
1f450 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1f460 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 74  }.        if( !t
1f470 61 62 6c 65 53 65 65 6e 20 29 7b 0a 20 20 20 20  ableSeen ){.    
1f480 20 20 20 20 20 20 69 66 28 20 7a 54 4e 61 6d 65        if( zTName
1f490 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1f4a0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
1f4b0 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68  pParse, "no such
1f4c0 20 74 61 62 6c 65 3a 20 25 73 22 2c 20 7a 54 4e   table: %s", zTN
1f4d0 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
1f4e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
1f4f0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
1f500 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 74  sg(pParse, "no t
1f510 61 62 6c 65 73 20 73 70 65 63 69 66 69 65 64 22  ables specified"
1f520 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
1f530 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1f540 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
1f550 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
1f560 28 64 62 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  (db, pEList);.  
1f570 20 20 70 2d 3e 70 45 4c 69 73 74 20 3d 20 70 4e    p->pEList = pN
1f580 65 77 3b 0a 20 20 7d 0a 23 69 66 20 53 51 4c 49  ew;.  }.#if SQLI
1f590 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 0a 20 20  TE_MAX_COLUMN.  
1f5a0 69 66 28 20 70 2d 3e 70 45 4c 69 73 74 20 26 26  if( p->pEList &&
1f5b0 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
1f5c0 72 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c  r>db->aLimit[SQL
1f5d0 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e  ITE_LIMIT_COLUMN
1f5e0 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ] ){.    sqlite3
1f5f0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
1f600 20 22 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d   "too many colum
1f610 6e 73 20 69 6e 20 72 65 73 75 6c 74 20 73 65 74  ns in result set
1f620 22 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ");.  }.#endif. 
1f630 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
1f640 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4e  inue;.}../*.** N
1f650 6f 2d 6f 70 20 72 6f 75 74 69 6e 65 20 66 6f 72  o-op routine for
1f660 20 74 68 65 20 70 61 72 73 65 2d 74 72 65 65 20   the parse-tree 
1f670 77 61 6c 6b 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 68  walker..**.** Wh
1f680 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
1f690 69 73 20 74 68 65 20 57 61 6c 6b 65 72 2e 78 45  is the Walker.xE
1f6a0 78 70 72 43 61 6c 6c 62 61 63 6b 20 74 68 65 6e  xprCallback then
1f6b0 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
1f6c0 73 0a 2a 2a 20 61 72 65 20 77 61 6c 6b 65 64 20  s.** are walked 
1f6d0 77 69 74 68 6f 75 74 20 61 6e 79 20 61 63 74 69  without any acti
1f6e0 6f 6e 73 20 62 65 69 6e 67 20 74 61 6b 65 6e 20  ons being taken 
1f6f0 61 74 20 65 61 63 68 20 6e 6f 64 65 2e 20 20 50  at each node.  P
1f700 72 65 73 75 6d 61 62 6c 79 2c 0a 2a 2a 20 77 68  resumably,.** wh
1f710 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
1f720 69 73 20 75 73 65 64 20 66 6f 72 20 57 61 6c 6b  is used for Walk
1f730 65 72 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b  er.xExprCallback
1f740 20 74 68 65 6e 20 0a 2a 2a 20 57 61 6c 6b 65 72   then .** Walker
1f750 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
1f760 20 69 73 20 73 65 74 20 74 6f 20 64 6f 20 73 6f   is set to do so
1f770 6d 65 74 68 69 6e 67 20 75 73 65 66 75 6c 20 66  mething useful f
1f780 6f 72 20 65 76 65 72 79 20 0a 2a 2a 20 73 75 62  or every .** sub
1f790 71 75 65 72 79 20 69 6e 20 74 68 65 20 70 61 72  query in the par
1f7a0 73 65 72 20 74 72 65 65 2e 0a 2a 2f 0a 73 74 61  ser tree..*/.sta
1f7b0 74 69 63 20 69 6e 74 20 65 78 70 72 57 61 6c 6b  tic int exprWalk
1f7c0 4e 6f 6f 70 28 57 61 6c 6b 65 72 20 2a 4e 6f 74  Noop(Walker *Not
1f7d0 55 73 65 64 2c 20 45 78 70 72 20 2a 4e 6f 74 55  Used, Expr *NotU
1f7e0 73 65 64 32 29 7b 0a 20 20 55 4e 55 53 45 44 5f  sed2){.  UNUSED_
1f7f0 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55 73  PARAMETER2(NotUs
1f800 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20  ed, NotUsed2);. 
1f810 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
1f820 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  inue;.}../*.** T
1f830 68 69 73 20 72 6f 75 74 69 6e 65 20 22 65 78 70  his routine "exp
1f840 61 6e 64 73 22 20 61 20 53 45 4c 45 43 54 20 73  ands" a SELECT s
1f850 74 61 74 65 6d 65 6e 74 20 61 6e 64 20 61 6c 6c  tatement and all
1f860 20 6f 66 20 69 74 73 20 73 75 62 71 75 65 72 69   of its subqueri
1f870 65 73 2e 0a 2a 2a 20 46 6f 72 20 61 64 64 69 74  es..** For addit
1f880 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
1f890 6e 20 6f 6e 20 77 68 61 74 20 69 74 20 6d 65 61  n on what it mea
1f8a0 6e 73 20 74 6f 20 22 65 78 70 61 6e 64 22 20 61  ns to "expand" a
1f8b0 20 53 45 4c 45 43 54 0a 2a 2a 20 73 74 61 74 65   SELECT.** state
1f8c0 6d 65 6e 74 2c 20 73 65 65 20 74 68 65 20 63 6f  ment, see the co
1f8d0 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 20 73 65 6c  mment on the sel
1f8e0 65 63 74 45 78 70 61 6e 64 20 77 6f 72 6b 65 72  ectExpand worker
1f8f0 20 63 61 6c 6c 62 61 63 6b 20 61 62 6f 76 65 2e   callback above.
1f900 0a 2a 2a 0a 2a 2a 20 45 78 70 61 6e 64 69 6e 67  .**.** Expanding
1f910 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
1f920 65 6e 74 20 69 73 20 74 68 65 20 66 69 72 73 74  ent is the first
1f930 20 73 74 65 70 20 69 6e 20 70 72 6f 63 65 73 73   step in process
1f940 69 6e 67 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20  ing a.** SELECT 
1f950 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20  statement.  The 
1f960 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
1f970 20 6d 75 73 74 20 62 65 20 65 78 70 61 6e 64 65   must be expande
1f980 64 20 62 65 66 6f 72 65 0a 2a 2a 20 6e 61 6d 65  d before.** name
1f990 20 72 65 73 6f 6c 75 74 69 6f 6e 20 69 73 20 70   resolution is p
1f9a0 65 72 66 6f 72 6d 65 64 2e 0a 2a 2a 0a 2a 2a 20  erformed..**.** 
1f9b0 49 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73  If anything goes
1f9c0 20 77 72 6f 6e 67 2c 20 61 6e 20 65 72 72 6f 72   wrong, an error
1f9d0 20 6d 65 73 73 61 67 65 20 69 73 20 77 72 69 74   message is writ
1f9e0 74 65 6e 20 69 6e 74 6f 20 70 50 61 72 73 65 2e  ten into pParse.
1f9f0 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 69 6e 67 20  .** The calling 
1fa00 66 75 6e 63 74 69 6f 6e 20 63 61 6e 20 64 65 74  function can det
1fa10 65 63 74 20 74 68 65 20 70 72 6f 62 6c 65 6d 20  ect the problem 
1fa20 62 79 20 6c 6f 6f 6b 69 6e 67 20 61 74 20 70 50  by looking at pP
1fa30 61 72 73 65 2d 3e 6e 45 72 72 0a 2a 2a 20 61 6e  arse->nErr.** an
1fa40 64 2f 6f 72 20 70 50 61 72 73 65 2d 3e 64 62 2d  d/or pParse->db-
1fa50 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 2e 0a 2a  >mallocFailed..*
1fa60 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  /.static void sq
1fa70 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 61 6e  lite3SelectExpan
1fa80 64 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  d(Parse *pParse,
1fa90 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
1faa0 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20  ){.  Walker w;. 
1fab0 20 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c 20 73   memset(&w, 0, s
1fac0 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20 77 2e 78  izeof(w));.  w.x
1fad0 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65  ExprCallback = e
1fae0 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77  xprWalkNoop;.  w
1faf0 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65  .pParse = pParse
1fb00 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
1fb10 68 61 73 43 6f 6d 70 6f 75 6e 64 20 29 7b 0a 20  hasCompound ){. 
1fb20 20 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c     w.xSelectCall
1fb30 62 61 63 6b 20 3d 20 63 6f 6e 76 65 72 74 43 6f  back = convertCo
1fb40 6d 70 6f 75 6e 64 53 65 6c 65 63 74 54 6f 53 75  mpoundSelectToSu
1fb50 62 71 75 65 72 79 3b 0a 20 20 20 20 73 71 6c 69  bquery;.    sqli
1fb60 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 26 77  te3WalkSelect(&w
1fb70 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 7d 0a  , pSelect);.  }.
1fb80 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62    w.xSelectCallb
1fb90 61 63 6b 20 3d 20 73 65 6c 65 63 74 45 78 70 61  ack = selectExpa
1fba0 6e 64 65 72 3b 0a 20 20 73 71 6c 69 74 65 33 57  nder;.  sqlite3W
1fbb0 61 6c 6b 53 65 6c 65 63 74 28 26 77 2c 20 70 53  alkSelect(&w, pS
1fbc0 65 6c 65 63 74 29 3b 0a 7d 0a 0a 0a 23 69 66 6e  elect);.}...#ifn
1fbd0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1fbe0 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 54  SUBQUERY./*.** T
1fbf0 68 69 73 20 69 73 20 61 20 57 61 6c 6b 65 72 2e  his is a Walker.
1fc00 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20  xSelectCallback 
1fc10 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 74 68 65  callback for the
1fc20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 79   sqlite3SelectTy
1fc30 70 65 49 6e 66 6f 28 29 0a 2a 2a 20 69 6e 74 65  peInfo().** inte
1fc40 72 66 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  rface..**.** For
1fc50 20 65 61 63 68 20 46 52 4f 4d 2d 63 6c 61 75 73   each FROM-claus
1fc60 65 20 73 75 62 71 75 65 72 79 2c 20 61 64 64 20  e subquery, add 
1fc70 43 6f 6c 75 6d 6e 2e 7a 54 79 70 65 20 61 6e 64  Column.zType and
1fc80 20 43 6f 6c 75 6d 6e 2e 7a 43 6f 6c 6c 0a 2a 2a   Column.zColl.**
1fc90 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20   information to 
1fca0 74 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74  the Table struct
1fcb0 75 72 65 20 74 68 61 74 20 72 65 70 72 65 73 65  ure that represe
1fcc0 6e 74 73 20 74 68 65 20 72 65 73 75 6c 74 20 73  nts the result s
1fcd0 65 74 0a 2a 2a 20 6f 66 20 74 68 61 74 20 73 75  et.** of that su
1fce0 62 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68  bquery..**.** Th
1fcf0 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72  e Table structur
1fd00 65 20 74 68 61 74 20 72 65 70 72 65 73 65 6e 74  e that represent
1fd10 73 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  s the result set
1fd20 20 77 61 73 20 63 6f 6e 73 74 72 75 63 74 65 64   was constructed
1fd30 0a 2a 2a 20 62 79 20 73 65 6c 65 63 74 45 78 70  .** by selectExp
1fd40 61 6e 64 65 72 28 29 20 62 75 74 20 74 68 65 20  ander() but the 
1fd50 74 79 70 65 20 61 6e 64 20 63 6f 6c 6c 61 74 69  type and collati
1fd60 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77  on information w
1fd70 61 73 20 6f 6d 69 74 74 65 64 0a 2a 2a 20 61 74  as omitted.** at
1fd80 20 74 68 61 74 20 70 6f 69 6e 74 20 62 65 63 61   that point beca
1fd90 75 73 65 20 69 64 65 6e 74 69 66 69 65 72 73 20  use identifiers 
1fda0 68 61 64 20 6e 6f 74 20 79 65 74 20 62 65 65 6e  had not yet been
1fdb0 20 72 65 73 6f 6c 76 65 64 2e 20 20 54 68 69 73   resolved.  This
1fdc0 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 63  .** routine is c
1fdd0 61 6c 6c 65 64 20 61 66 74 65 72 20 69 64 65 6e  alled after iden
1fde0 74 69 66 69 65 72 20 72 65 73 6f 6c 75 74 69 6f  tifier resolutio
1fdf0 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
1fe00 20 73 65 6c 65 63 74 41 64 64 53 75 62 71 75 65   selectAddSubque
1fe10 72 79 54 79 70 65 49 6e 66 6f 28 57 61 6c 6b 65  ryTypeInfo(Walke
1fe20 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65  r *pWalker, Sele
1fe30 63 74 20 2a 70 29 7b 0a 20 20 50 61 72 73 65 20  ct *p){.  Parse 
1fe40 2a 70 50 61 72 73 65 3b 0a 20 20 69 6e 74 20 69  *pParse;.  int i
1fe50 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  ;.  SrcList *pTa
1fe60 62 4c 69 73 74 3b 0a 20 20 73 74 72 75 63 74 20  bList;.  struct 
1fe70 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46  SrcList_item *pF
1fe80 72 6f 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  rom;..  assert( 
1fe90 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
1fea0 5f 52 65 73 6f 6c 76 65 64 20 29 3b 0a 20 20 69  _Resolved );.  i
1feb0 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20  f( (p->selFlags 
1fec0 26 20 53 46 5f 48 61 73 54 79 70 65 49 6e 66 6f  & SF_HasTypeInfo
1fed0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 73  )==0 ){.    p->s
1fee0 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 48 61  elFlags |= SF_Ha
1fef0 73 54 79 70 65 49 6e 66 6f 3b 0a 20 20 20 20 70  sTypeInfo;.    p
1ff00 50 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d  Parse = pWalker-
1ff10 3e 70 50 61 72 73 65 3b 0a 20 20 20 20 70 54 61  >pParse;.    pTa
1ff20 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b  bList = p->pSrc;
1ff30 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 46  .    for(i=0, pF
1ff40 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b  rom=pTabList->a;
1ff50 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   i<pTabList->nSr
1ff60 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29  c; i++, pFrom++)
1ff70 7b 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70  {.      Table *p
1ff80 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61  Tab = pFrom->pTa
1ff90 62 3b 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57  b;.      if( ALW
1ffa0 41 59 53 28 70 54 61 62 21 3d 30 29 20 26 26 20  AYS(pTab!=0) && 
1ffb0 28 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20  (pTab->tabFlags 
1ffc0 26 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 29 21  & TF_Ephemeral)!
1ffd0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  =0 ){.        /*
1ffe0 20 41 20 73 75 62 2d 71 75 65 72 79 20 69 6e 20   A sub-query in 
1fff0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
20000 6f 66 20 61 20 53 45 4c 45 43 54 20 2a 2f 0a 20  of a SELECT */. 
20010 20 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70         Select *p
20020 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65  Sel = pFrom->pSe
20030 6c 65 63 74 3b 0a 20 20 20 20 20 20 20 20 61 73  lect;.        as
20040 73 65 72 74 28 20 70 53 65 6c 20 29 3b 0a 20 20  sert( pSel );.  
20050 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 53 65        while( pSe
20060 6c 2d 3e 70 50 72 69 6f 72 20 29 20 70 53 65 6c  l->pPrior ) pSel
20070 20 3d 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 3b   = pSel->pPrior;
20080 0a 20 20 20 20 20 20 20 20 73 65 6c 65 63 74 41  .        selectA
20090 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43  ddColumnTypeAndC
200a0 6f 6c 6c 61 74 69 6f 6e 28 70 50 61 72 73 65 2c  ollation(pParse,
200b0 20 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 70 54 61   pTab->nCol, pTa
200c0 62 2d 3e 61 43 6f 6c 2c 20 70 53 65 6c 29 3b 0a  b->aCol, pSel);.
200d0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
200e0 7d 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43  }.  return WRC_C
200f0 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 23 65 6e 64 69  ontinue;.}.#endi
20100 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  f.../*.** This r
20110 6f 75 74 69 6e 65 20 61 64 64 73 20 64 61 74 61  outine adds data
20120 74 79 70 65 20 61 6e 64 20 63 6f 6c 6c 61 74 69  type and collati
20130 6e 67 20 73 65 71 75 65 6e 63 65 20 69 6e 66 6f  ng sequence info
20140 72 6d 61 74 69 6f 6e 20 74 6f 0a 2a 2a 20 74 68  rmation to.** th
20150 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72  e Table structur
20160 65 73 20 6f 66 20 61 6c 6c 20 46 52 4f 4d 2d 63  es of all FROM-c
20170 6c 61 75 73 65 20 73 75 62 71 75 65 72 69 65 73  lause subqueries
20180 20 69 6e 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20   in a.** SELECT 
20190 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a  statement..**.**
201a0 20 55 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e   Use this routin
201b0 65 20 61 66 74 65 72 20 6e 61 6d 65 20 72 65 73  e after name res
201c0 6f 6c 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  olution..*/.stat
201d0 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 53  ic void sqlite3S
201e0 65 6c 65 63 74 41 64 64 54 79 70 65 49 6e 66 6f  electAddTypeInfo
201f0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
20200 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29  Select *pSelect)
20210 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
20220 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
20230 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 6d 65 6d   Walker w;.  mem
20240 73 65 74 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f  set(&w, 0, sizeo
20250 66 28 77 29 29 3b 0a 20 20 77 2e 78 53 65 6c 65  f(w));.  w.xSele
20260 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73 65 6c  ctCallback = sel
20270 65 63 74 41 64 64 53 75 62 71 75 65 72 79 54 79  ectAddSubqueryTy
20280 70 65 49 6e 66 6f 3b 0a 20 20 77 2e 78 45 78 70  peInfo;.  w.xExp
20290 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72  rCallback = expr
202a0 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 70 50  WalkNoop;.  w.pP
202b0 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20  arse = pParse;. 
202c0 20 77 2e 62 53 65 6c 65 63 74 44 65 70 74 68 46   w.bSelectDepthF
202d0 69 72 73 74 20 3d 20 31 3b 0a 20 20 73 71 6c 69  irst = 1;.  sqli
202e0 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 26 77  te3WalkSelect(&w
202f0 2c 20 70 53 65 6c 65 63 74 29 3b 0a 23 65 6e 64  , pSelect);.#end
20300 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  if.}.../*.** Thi
20310 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 75  s routine sets u
20320 70 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  p a SELECT state
20330 6d 65 6e 74 20 66 6f 72 20 70 72 6f 63 65 73 73  ment for process
20340 69 6e 67 2e 20 20 54 68 65 0a 2a 2a 20 66 6f 6c  ing.  The.** fol
20350 6c 6f 77 69 6e 67 20 69 73 20 61 63 63 6f 6d 70  lowing is accomp
20360 6c 69 73 68 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20  lished:.**.**   
20370 20 20 2a 20 20 56 44 42 45 20 43 75 72 73 6f 72    *  VDBE Cursor
20380 20 6e 75 6d 62 65 72 73 20 61 72 65 20 61 73 73   numbers are ass
20390 69 67 6e 65 64 20 74 6f 20 61 6c 6c 20 46 52 4f  igned to all FRO
203a0 4d 2d 63 6c 61 75 73 65 20 74 65 72 6d 73 2e 0a  M-clause terms..
203b0 2a 2a 20 20 20 20 20 2a 20 20 45 70 68 65 6d 65  **     *  Epheme
203c0 72 61 6c 20 54 61 62 6c 65 20 6f 62 6a 65 63 74  ral Table object
203d0 73 20 61 72 65 20 63 72 65 61 74 65 64 20 66 6f  s are created fo
203e0 72 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73  r all FROM-claus
203f0 65 20 73 75 62 71 75 65 72 69 65 73 2e 0a 2a 2a  e subqueries..**
20400 20 20 20 20 20 2a 20 20 4f 4e 20 61 6e 64 20 55       *  ON and U
20410 53 49 4e 47 20 63 6c 61 75 73 65 73 20 61 72 65  SING clauses are
20420 20 73 68 69 66 74 65 64 20 69 6e 74 6f 20 57 48   shifted into WH
20430 45 52 45 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a  ERE statements.*
20440 2a 20 20 20 20 20 2a 20 20 57 69 6c 64 63 61 72  *     *  Wildcar
20450 64 73 20 22 2a 22 20 61 6e 64 20 22 54 41 42 4c  ds "*" and "TABL
20460 45 2e 2a 22 20 69 6e 20 72 65 73 75 6c 74 20 73  E.*" in result s
20470 65 74 73 20 61 72 65 20 65 78 70 61 6e 64 65 64  ets are expanded
20480 2e 0a 2a 2a 20 20 20 20 20 2a 20 20 49 64 65 6e  ..**     *  Iden
20490 74 69 66 69 65 72 73 20 69 6e 20 65 78 70 72 65  tifiers in expre
204a0 73 73 69 6f 6e 20 61 72 65 20 6d 61 74 63 68 65  ssion are matche
204b0 64 20 74 6f 20 74 61 62 6c 65 73 2e 0a 2a 2a 0a  d to tables..**.
204c0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
204d0 61 63 74 73 20 72 65 63 75 72 73 69 76 65 6c 79  acts recursively
204e0 20 6f 6e 20 61 6c 6c 20 73 75 62 71 75 65 72 69   on all subqueri
204f0 65 73 20 77 69 74 68 69 6e 20 74 68 65 20 53 45  es within the SE
20500 4c 45 43 54 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  LECT..*/.void sq
20510 6c 69 74 65 33 53 65 6c 65 63 74 50 72 65 70 28  lite3SelectPrep(
20520 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
20530 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ,         /* The
20540 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20   parser context 
20550 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
20560 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
20570 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
20580 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64 2e  ent being coded.
20590 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78   */.  NameContex
205a0 74 20 2a 70 4f 75 74 65 72 4e 43 20 20 2f 2a 20  t *pOuterNC  /* 
205b0 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20 66 6f 72  Name context for
205c0 20 63 6f 6e 74 61 69 6e 65 72 20 2a 2f 0a 29 7b   container */.){
205d0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
205e0 20 20 69 66 28 20 4e 45 56 45 52 28 70 3d 3d 30    if( NEVER(p==0
205f0 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 64 62  ) ) return;.  db
20600 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
20610 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
20620 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a  ailed ) return;.
20630 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67    if( p->selFlag
20640 73 20 26 20 53 46 5f 48 61 73 54 79 70 65 49 6e  s & SF_HasTypeIn
20650 66 6f 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73  fo ) return;.  s
20660 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 61  qlite3SelectExpa
20670 6e 64 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20  nd(pParse, p);. 
20680 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
20690 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  r || db->mallocF
206a0 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a  ailed ) return;.
206b0 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65    sqlite3Resolve
206c0 53 65 6c 65 63 74 4e 61 6d 65 73 28 70 50 61 72  SelectNames(pPar
206d0 73 65 2c 20 70 2c 20 70 4f 75 74 65 72 4e 43 29  se, p, pOuterNC)
206e0 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
206f0 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  nErr || db->mall
20700 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72  ocFailed ) retur
20710 6e 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  n;.  sqlite3Sele
20720 63 74 41 64 64 54 79 70 65 49 6e 66 6f 28 70 50  ctAddTypeInfo(pP
20730 61 72 73 65 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a  arse, p);.}../*.
20740 2a 2a 20 52 65 73 65 74 20 74 68 65 20 61 67 67  ** Reset the agg
20750 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74  regate accumulat
20760 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 67  or..**.** The ag
20770 67 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61  gregate accumula
20780 74 6f 72 20 69 73 20 61 20 73 65 74 20 6f 66 20  tor is a set of 
20790 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 74 68 61  memory cells tha
207a0 74 20 68 6f 6c 64 0a 2a 2a 20 69 6e 74 65 72 6d  t hold.** interm
207b0 65 64 69 61 74 65 20 72 65 73 75 6c 74 73 20 77  ediate results w
207c0 68 69 6c 65 20 63 61 6c 63 75 6c 61 74 69 6e 67  hile calculating
207d0 20 61 6e 20 61 67 67 72 65 67 61 74 65 2e 20 20   an aggregate.  
207e0 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  This.** routine 
207f0 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20 74  generates code t
20800 68 61 74 20 73 74 6f 72 65 73 20 4e 55 4c 4c 73  hat stores NULLs
20810 20 69 6e 20 61 6c 6c 20 6f 66 20 74 68 6f 73 65   in all of those
20820 20 6d 65 6d 6f 72 79 0a 2a 2a 20 63 65 6c 6c 73   memory.** cells
20830 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
20840 20 72 65 73 65 74 41 63 63 75 6d 75 6c 61 74 6f   resetAccumulato
20850 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  r(Parse *pParse,
20860 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e   AggInfo *pAggIn
20870 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  fo){.  Vdbe *v =
20880 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
20890 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63    int i;.  struc
208a0 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a  t AggInfo_func *
208b0 70 46 75 6e 63 3b 0a 20 20 69 66 28 20 70 41 67  pFunc;.  if( pAg
208c0 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 2b 70 41 67  gInfo->nFunc+pAg
208d0 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d  gInfo->nColumn==
208e0 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  0 ){.    return;
208f0 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20  .  }.  for(i=0; 
20900 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c  i<pAggInfo->nCol
20910 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  umn; i++){.    s
20920 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
20930 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
20940 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 69  pAggInfo->aCol[i
20950 5d 2e 69 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20 66  ].iMem);.  }.  f
20960 6f 72 28 70 46 75 6e 63 3d 70 41 67 67 49 6e 66  or(pFunc=pAggInf
20970 6f 2d 3e 61 46 75 6e 63 2c 20 69 3d 30 3b 20 69  o->aFunc, i=0; i
20980 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63  <pAggInfo->nFunc
20990 3b 20 69 2b 2b 2c 20 70 46 75 6e 63 2b 2b 29 7b  ; i++, pFunc++){
209a0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
209b0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp2(v, OP_Nul
209c0 6c 2c 20 30 2c 20 70 46 75 6e 63 2d 3e 69 4d 65  l, 0, pFunc->iMe
209d0 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 46 75 6e  m);.    if( pFun
209e0 63 2d 3e 69 44 69 73 74 69 6e 63 74 3e 3d 30 20  c->iDistinct>=0 
209f0 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ){.      Expr *p
20a00 45 20 3d 20 70 46 75 6e 63 2d 3e 70 45 78 70 72  E = pFunc->pExpr
20a10 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
20a20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
20a30 28 70 45 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  (pE, EP_xIsSelec
20a40 74 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  t) );.      if( 
20a50 70 45 2d 3e 78 2e 70 4c 69 73 74 3d 3d 30 20 7c  pE->x.pList==0 |
20a60 7c 20 70 45 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e  | pE->x.pList->n
20a70 45 78 70 72 21 3d 31 20 29 7b 0a 20 20 20 20 20  Expr!=1 ){.     
20a80 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
20a90 73 67 28 70 50 61 72 73 65 2c 20 22 44 49 53 54  sg(pParse, "DIST
20aa0 49 4e 43 54 20 61 67 67 72 65 67 61 74 65 73 20  INCT aggregates 
20ab0 6d 75 73 74 20 68 61 76 65 20 65 78 61 63 74 6c  must have exactl
20ac0 79 20 6f 6e 65 20 22 0a 20 20 20 20 20 20 20 20  y one ".        
20ad0 20 20 20 22 61 72 67 75 6d 65 6e 74 22 29 3b 0a     "argument");.
20ae0 20 20 20 20 20 20 20 20 70 46 75 6e 63 2d 3e 69          pFunc->i
20af0 44 69 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20  Distinct = -1;. 
20b00 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
20b10 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65      KeyInfo *pKe
20b20 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46  yInfo = keyInfoF
20b30 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72  romExprList(pPar
20b40 73 65 2c 20 70 45 2d 3e 78 2e 70 4c 69 73 74 29  se, pE->x.pList)
20b50 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
20b60 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
20b70 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
20b80 20 70 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63   pFunc->iDistinc
20b90 74 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20  t, 0, 0,.       
20ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20bb0 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e     (char*)pKeyIn
20bc0 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48  fo, P4_KEYINFO_H
20bd0 41 4e 44 4f 46 46 29 3b 0a 20 20 20 20 20 20 7d  ANDOFF);.      }
20be0 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
20bf0 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 4f  .** Invoke the O
20c00 50 5f 41 67 67 46 69 6e 61 6c 69 7a 65 20 6f 70  P_AggFinalize op
20c10 63 6f 64 65 20 66 6f 72 20 65 76 65 72 79 20 61  code for every a
20c20 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
20c30 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 41 67 67 49  n.** in the AggI
20c40 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  nfo structure..*
20c50 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 69  /.static void fi
20c60 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63 74 69 6f  nalizeAggFunctio
20c70 6e 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ns(Parse *pParse
20c80 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49  , AggInfo *pAggI
20c90 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  nfo){.  Vdbe *v 
20ca0 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
20cb0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75  .  int i;.  stru
20cc0 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20  ct AggInfo_func 
20cd0 2a 70 46 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20  *pF;.  for(i=0, 
20ce0 70 46 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75  pF=pAggInfo->aFu
20cf0 6e 63 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e  nc; i<pAggInfo->
20d00 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b 2b  nFunc; i++, pF++
20d10 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20  ){.    ExprList 
20d20 2a 70 4c 69 73 74 20 3d 20 70 46 2d 3e 70 45 78  *pList = pF->pEx
20d30 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20  pr->x.pList;.   
20d40 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
20d50 73 50 72 6f 70 65 72 74 79 28 70 46 2d 3e 70 45  sProperty(pF->pE
20d60 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
20d70 74 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  t) );.    sqlite
20d80 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
20d90 50 5f 41 67 67 46 69 6e 61 6c 2c 20 70 46 2d 3e  P_AggFinal, pF->
20da0 69 4d 65 6d 2c 20 70 4c 69 73 74 20 3f 20 70 4c  iMem, pList ? pL
20db0 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 2c 20  ist->nExpr : 0, 
20dc0 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
20dd0 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29           (void*)
20de0 70 46 2d 3e 70 46 75 6e 63 2c 20 50 34 5f 46 55  pF->pFunc, P4_FU
20df0 4e 43 44 45 46 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  NCDEF);.  }.}../
20e00 2a 0a 2a 2a 20 55 70 64 61 74 65 20 74 68 65 20  *.** Update the 
20e10 61 63 63 75 6d 75 6c 61 74 6f 72 20 6d 65 6d 6f  accumulator memo
20e20 72 79 20 63 65 6c 6c 73 20 66 6f 72 20 61 6e 20  ry cells for an 
20e30 61 67 67 72 65 67 61 74 65 20 62 61 73 65 64 20  aggregate based 
20e40 6f 6e 0a 2a 2a 20 74 68 65 20 63 75 72 72 65 6e  on.** the curren
20e50 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f  t cursor positio
20e60 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
20e70 64 20 75 70 64 61 74 65 41 63 63 75 6d 75 6c 61  d updateAccumula
20e80 74 6f 72 28 50 61 72 73 65 20 2a 70 50 61 72 73  tor(Parse *pPars
20e90 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67  e, AggInfo *pAgg
20ea0 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76  Info){.  Vdbe *v
20eb0 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
20ec0 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
20ed0 20 72 65 67 48 69 74 20 3d 20 30 3b 0a 20 20 69   regHit = 0;.  i
20ee0 6e 74 20 61 64 64 72 48 69 74 54 65 73 74 20 3d  nt addrHitTest =
20ef0 20 30 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67   0;.  struct Agg
20f00 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a 20  Info_func *pF;. 
20f10 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f   struct AggInfo_
20f20 63 6f 6c 20 2a 70 43 3b 0a 0a 20 20 70 41 67 67  col *pC;..  pAgg
20f30 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65  Info->directMode
20f40 20 3d 20 31 3b 0a 20 20 73 71 6c 69 74 65 33 45   = 1;.  sqlite3E
20f50 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50  xprCacheClear(pP
20f60 61 72 73 65 29 3b 0a 20 20 66 6f 72 28 69 3d 30  arse);.  for(i=0
20f70 2c 20 70 46 3d 70 41 67 67 49 6e 66 6f 2d 3e 61  , pF=pAggInfo->a
20f80 46 75 6e 63 3b 20 69 3c 70 41 67 67 49 6e 66 6f  Func; i<pAggInfo
20f90 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46  ->nFunc; i++, pF
20fa0 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6e 41 72  ++){.    int nAr
20fb0 67 3b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 4e  g;.    int addrN
20fc0 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  ext = 0;.    int
20fd0 20 72 65 67 41 67 67 3b 0a 20 20 20 20 45 78 70   regAgg;.    Exp
20fe0 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70  rList *pList = p
20ff0 46 2d 3e 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  F->pExpr->x.pLis
21000 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  t;.    assert( !
21010 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
21020 70 46 2d 3e 70 45 78 70 72 2c 20 45 50 5f 78 49  pF->pExpr, EP_xI
21030 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20  sSelect) );.    
21040 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20  if( pList ){.   
21050 20 20 20 6e 41 72 67 20 3d 20 70 4c 69 73 74 2d     nArg = pList-
21060 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 72 65  >nExpr;.      re
21070 67 41 67 67 20 3d 20 73 71 6c 69 74 65 33 47 65  gAgg = sqlite3Ge
21080 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  tTempRange(pPars
21090 65 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20 20 20  e, nArg);.      
210a0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45  sqlite3ExprCodeE
210b0 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
210c0 70 4c 69 73 74 2c 20 72 65 67 41 67 67 2c 20 31  pList, regAgg, 1
210d0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
210e0 20 20 20 20 6e 41 72 67 20 3d 20 30 3b 0a 20 20      nArg = 0;.  
210f0 20 20 20 20 72 65 67 41 67 67 20 3d 20 30 3b 0a      regAgg = 0;.
21100 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 46      }.    if( pF
21110 2d 3e 69 44 69 73 74 69 6e 63 74 3e 3d 30 20 29  ->iDistinct>=0 )
21120 7b 0a 20 20 20 20 20 20 61 64 64 72 4e 65 78 74  {.      addrNext
21130 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
21140 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
21150 20 20 61 73 73 65 72 74 28 20 6e 41 72 67 3d 3d    assert( nArg==
21160 31 20 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 44  1 );.      codeD
21170 69 73 74 69 6e 63 74 28 70 50 61 72 73 65 2c 20  istinct(pParse, 
21180 70 46 2d 3e 69 44 69 73 74 69 6e 63 74 2c 20 61  pF->iDistinct, a
21190 64 64 72 4e 65 78 74 2c 20 31 2c 20 72 65 67 41  ddrNext, 1, regA
211a0 67 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  gg);.    }.    i
211b0 66 28 20 70 46 2d 3e 70 46 75 6e 63 2d 3e 66 75  f( pF->pFunc->fu
211c0 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ncFlags & SQLITE
211d0 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 20 29  _FUNC_NEEDCOLL )
211e0 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20  {.      CollSeq 
211f0 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20 20  *pColl = 0;.    
21200 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
21210 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
21220 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
21230 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 21    assert( pList!
21240 3d 30 20 29 3b 20 20 2f 2a 20 70 4c 69 73 74 21  =0 );  /* pList!
21250 3d 30 20 69 66 20 70 46 2d 3e 70 46 75 6e 63 20  =0 if pF->pFunc 
21260 68 61 73 20 4e 45 45 44 43 4f 4c 4c 20 2a 2f 0a  has NEEDCOLL */.
21270 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70        for(j=0, p
21280 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 21  Item=pList->a; !
21290 70 43 6f 6c 6c 20 26 26 20 6a 3c 6e 41 72 67 3b  pColl && j<nArg;
212a0 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   j++, pItem++){.
212b0 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20          pColl = 
212c0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
212d0 65 71 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d  eq(pParse, pItem
212e0 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ->pExpr);.      
212f0 7d 0a 20 20 20 20 20 20 69 66 28 20 21 70 43 6f  }.      if( !pCo
21300 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  ll ){.        pC
21310 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  oll = pParse->db
21320 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20  ->pDfltColl;.   
21330 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
21340 65 67 48 69 74 3d 3d 30 20 26 26 20 70 41 67 67  egHit==0 && pAgg
21350 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61 74  Info->nAccumulat
21360 6f 72 20 29 20 72 65 67 48 69 74 20 3d 20 2b 2b  or ) regHit = ++
21370 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
21380 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
21390 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6c 6c  ddOp4(v, OP_Coll
213a0 53 65 71 2c 20 72 65 67 48 69 74 2c 20 30 2c 20  Seq, regHit, 0, 
213b0 30 2c 20 28 63 68 61 72 20 2a 29 70 43 6f 6c 6c  0, (char *)pColl
213c0 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20  , P4_COLLSEQ);. 
213d0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
213e0 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
213f0 5f 41 67 67 53 74 65 70 2c 20 30 2c 20 72 65 67  _AggStep, 0, reg
21400 41 67 67 2c 20 70 46 2d 3e 69 4d 65 6d 2c 0a 20  Agg, pF->iMem,. 
21410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21420 20 20 20 20 20 28 76 6f 69 64 2a 29 70 46 2d 3e       (void*)pF->
21430 70 46 75 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45  pFunc, P4_FUNCDE
21440 46 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  F);.    sqlite3V
21450 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 28  dbeChangeP5(v, (
21460 75 38 29 6e 41 72 67 29 3b 0a 20 20 20 20 73 71  u8)nArg);.    sq
21470 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66  lite3ExprCacheAf
21480 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61  finityChange(pPa
21490 72 73 65 2c 20 72 65 67 41 67 67 2c 20 6e 41 72  rse, regAgg, nAr
214a0 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52  g);.    sqlite3R
214b0 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28  eleaseTempRange(
214c0 70 50 61 72 73 65 2c 20 72 65 67 41 67 67 2c 20  pParse, regAgg, 
214d0 6e 41 72 67 29 3b 0a 20 20 20 20 69 66 28 20 61  nArg);.    if( a
214e0 64 64 72 4e 65 78 74 20 29 7b 0a 20 20 20 20 20  ddrNext ){.     
214f0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
21500 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72  lveLabel(v, addr
21510 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  Next);.      sql
21520 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65  ite3ExprCacheCle
21530 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  ar(pParse);.    
21540 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 66 6f  }.  }..  /* Befo
21550 72 65 20 70 6f 70 75 6c 61 74 69 6e 67 20 74 68  re populating th
21560 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 72 65  e accumulator re
21570 67 69 73 74 65 72 73 2c 20 63 6c 65 61 72 20 74  gisters, clear t
21580 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e  he column cache.
21590 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  .  ** Otherwise,
215a0 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20 72   if any of the r
215b0 65 71 75 69 72 65 64 20 63 6f 6c 75 6d 6e 20 76  equired column v
215c0 61 6c 75 65 73 20 61 72 65 20 61 6c 72 65 61 64  alues are alread
215d0 79 20 70 72 65 73 65 6e 74 20 0a 20 20 2a 2a 20  y present .  ** 
215e0 69 6e 20 72 65 67 69 73 74 65 72 73 2c 20 73 71  in registers, sq
215f0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 29 20  lite3ExprCode() 
21600 6d 61 79 20 75 73 65 20 4f 50 5f 53 43 6f 70 79  may use OP_SCopy
21610 20 74 6f 20 63 6f 70 79 20 74 68 65 20 76 61 6c   to copy the val
21620 75 65 0a 20 20 2a 2a 20 74 6f 20 70 43 2d 3e 69  ue.  ** to pC->i
21630 4d 65 6d 2e 20 42 75 74 20 62 79 20 74 68 65 20  Mem. But by the 
21640 74 69 6d 65 20 74 68 65 20 76 61 6c 75 65 20 69  time the value i
21650 73 20 75 73 65 64 2c 20 74 68 65 20 6f 72 69 67  s used, the orig
21660 69 6e 61 6c 20 72 65 67 69 73 74 65 72 0a 20 20  inal register.  
21670 2a 2a 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e  ** may have been
21680 20 75 73 65 64 2c 20 69 6e 76 61 6c 69 64 61 74   used, invalidat
21690 69 6e 67 20 74 68 65 20 75 6e 64 65 72 6c 79 69  ing the underlyi
216a0 6e 67 20 62 75 66 66 65 72 20 68 6f 6c 64 69 6e  ng buffer holdin
216b0 67 20 74 68 65 0a 20 20 2a 2a 20 74 65 78 74 20  g the.  ** text 
216c0 6f 72 20 62 6c 6f 62 20 76 61 6c 75 65 2e 20 53  or blob value. S
216d0 65 65 20 74 69 63 6b 65 74 20 5b 38 38 33 30 33  ee ticket [88303
216e0 34 64 63 62 35 5d 2e 0a 20 20 2a 2a 0a 20 20 2a  4dcb5]..  **.  *
216f0 2a 20 41 6e 6f 74 68 65 72 20 73 6f 6c 75 74 69  * Another soluti
21700 6f 6e 20 77 6f 75 6c 64 20 62 65 20 74 6f 20 63  on would be to c
21710 68 61 6e 67 65 20 74 68 65 20 4f 50 5f 53 43 6f  hange the OP_SCo
21720 70 79 20 75 73 65 64 20 74 6f 20 63 6f 70 79 20  py used to copy 
21730 63 61 63 68 65 64 0a 20 20 2a 2a 20 76 61 6c 75  cached.  ** valu
21740 65 73 20 74 6f 20 61 6e 20 4f 50 5f 43 6f 70 79  es to an OP_Copy
21750 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 65 67  ..  */.  if( reg
21760 48 69 74 20 29 7b 0a 20 20 20 20 61 64 64 72 48  Hit ){.    addrH
21770 69 74 54 65 73 74 20 3d 20 73 71 6c 69 74 65 33  itTest = sqlite3
21780 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
21790 5f 49 66 2c 20 72 65 67 48 69 74 29 3b 0a 20 20  _If, regHit);.  
217a0 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43  }.  sqlite3ExprC
217b0 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65  acheClear(pParse
217c0 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 43  );.  for(i=0, pC
217d0 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b  =pAggInfo->aCol;
217e0 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 41 63   i<pAggInfo->nAc
217f0 63 75 6d 75 6c 61 74 6f 72 3b 20 69 2b 2b 2c 20  cumulator; i++, 
21800 70 43 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74  pC++){.    sqlit
21810 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
21820 65 2c 20 70 43 2d 3e 70 45 78 70 72 2c 20 70 43  e, pC->pExpr, pC
21830 2d 3e 69 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20 70  ->iMem);.  }.  p
21840 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d  AggInfo->directM
21850 6f 64 65 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  ode = 0;.  sqlit
21860 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72  e3ExprCacheClear
21870 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
21880 61 64 64 72 48 69 74 54 65 73 74 20 29 7b 0a 20  addrHitTest ){. 
21890 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
218a0 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 48 69  mpHere(v, addrHi
218b0 74 54 65 73 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  tTest);.  }.}../
218c0 2a 0a 2a 2a 20 41 64 64 20 61 20 73 69 6e 67 6c  *.** Add a singl
218d0 65 20 4f 50 5f 45 78 70 6c 61 69 6e 20 69 6e 73  e OP_Explain ins
218e0 74 72 75 63 74 69 6f 6e 20 74 6f 20 74 68 65 20  truction to the 
218f0 56 44 42 45 20 74 6f 20 65 78 70 6c 61 69 6e 20  VDBE to explain 
21900 61 20 73 69 6d 70 6c 65 0a 2a 2a 20 63 6f 75 6e  a simple.** coun
21910 74 28 2a 29 20 71 75 65 72 79 20 28 22 53 45 4c  t(*) query ("SEL
21920 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  ECT count(*) FRO
21930 4d 20 70 54 61 62 22 29 2e 0a 2a 2f 0a 23 69 66  M pTab")..*/.#if
21940 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
21950 5f 45 58 50 4c 41 49 4e 0a 73 74 61 74 69 63 20  _EXPLAIN.static 
21960 76 6f 69 64 20 65 78 70 6c 61 69 6e 53 69 6d 70  void explainSimp
21970 6c 65 43 6f 75 6e 74 28 0a 20 20 50 61 72 73 65  leCount(.  Parse
21980 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
21990 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
219a0 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  rse context */. 
219b0 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20   Table *pTab,   
219c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
219d0 20 2f 2a 20 54 61 62 6c 65 20 62 65 69 6e 67 20   /* Table being 
219e0 71 75 65 72 69 65 64 20 2a 2f 0a 20 20 49 6e 64  queried */.  Ind
219f0 65 78 20 2a 70 49 64 78 20 20 20 20 20 20 20 20  ex *pIdx        
21a00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21a10 49 6e 64 65 78 20 75 73 65 64 20 74 6f 20 6f 70  Index used to op
21a20 74 69 6d 69 7a 65 20 73 63 61 6e 2c 20 6f 72 20  timize scan, or 
21a30 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69 66 28  NULL */.){.  if(
21a40 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e   pParse->explain
21a50 3d 3d 32 20 29 7b 0a 20 20 20 20 63 68 61 72 20  ==2 ){.    char 
21a60 2a 7a 45 71 70 20 3d 20 73 71 6c 69 74 65 33 4d  *zEqp = sqlite3M
21a70 50 72 69 6e 74 66 28 70 50 61 72 73 65 2d 3e 64  Printf(pParse->d
21a80 62 2c 20 22 53 43 41 4e 20 54 41 42 4c 45 20 25  b, "SCAN TABLE %
21a90 73 25 73 25 73 22 2c 0a 20 20 20 20 20 20 20 20  s%s%s",.        
21aa0 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 0a 20 20  pTab->zName, .  
21ab0 20 20 20 20 20 20 70 49 64 78 20 3f 20 22 20 55        pIdx ? " U
21ac0 53 49 4e 47 20 43 4f 56 45 52 49 4e 47 20 49 4e  SING COVERING IN
21ad0 44 45 58 20 22 20 3a 20 22 22 2c 0a 20 20 20 20  DEX " : "",.    
21ae0 20 20 20 20 70 49 64 78 20 3f 20 70 49 64 78 2d      pIdx ? pIdx-
21af0 3e 7a 4e 61 6d 65 20 3a 20 22 22 0a 20 20 20 20  >zName : "".    
21b00 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
21b10 62 65 41 64 64 4f 70 34 28 0a 20 20 20 20 20 20  beAddOp4(.      
21b20 20 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c    pParse->pVdbe,
21b30 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 70 50 61   OP_Explain, pPa
21b40 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20  rse->iSelectId, 
21b50 30 2c 20 30 2c 20 7a 45 71 70 2c 20 50 34 5f 44  0, 0, zEqp, P4_D
21b60 59 4e 41 4d 49 43 0a 20 20 20 20 29 3b 0a 20 20  YNAMIC.    );.  
21b70 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  }.}.#else.# defi
21b80 6e 65 20 65 78 70 6c 61 69 6e 53 69 6d 70 6c 65  ne explainSimple
21b90 43 6f 75 6e 74 28 61 2c 62 2c 63 29 0a 23 65 6e  Count(a,b,c).#en
21ba0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  dif../*.** Gener
21bb0 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65  ate code for the
21bc0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
21bd0 74 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20 70  t given in the p
21be0 20 61 72 67 75 6d 65 6e 74 2e 20 20 0a 2a 2a 0a   argument.  .**.
21bf0 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20 61  ** The results a
21c00 72 65 20 64 69 73 74 72 69 62 75 74 65 64 20 69  re distributed i
21c10 6e 20 76 61 72 69 6f 75 73 20 77 61 79 73 20 64  n various ways d
21c20 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 0a  epending on the.
21c30 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  ** contents of t
21c40 68 65 20 53 65 6c 65 63 74 44 65 73 74 20 73 74  he SelectDest st
21c50 72 75 63 74 75 72 65 20 70 6f 69 6e 74 65 64 20  ructure pointed 
21c60 74 6f 20 62 79 20 61 72 67 75 6d 65 6e 74 20 70  to by argument p
21c70 44 65 73 74 0a 2a 2a 20 61 73 20 66 6f 6c 6c 6f  Dest.** as follo
21c80 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 70 44  ws:.**.**     pD
21c90 65 73 74 2d 3e 65 44 65 73 74 20 20 20 20 52 65  est->eDest    Re
21ca0 73 75 6c 74 0a 2a 2a 20 20 20 20 20 2d 2d 2d 2d  sult.**     ----
21cb0 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 2d 2d 2d 2d  --------    ----
21cc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
21cd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
21ce0 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20 53  -------.**     S
21cf0 52 54 5f 4f 75 74 70 75 74 20 20 20 20 20 20 47  RT_Output      G
21d00 65 6e 65 72 61 74 65 20 61 20 72 6f 77 20 6f 66  enerate a row of
21d10 20 6f 75 74 70 75 74 20 28 75 73 69 6e 67 20 74   output (using t
21d20 68 65 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 0a  he OP_ResultRow.
21d30 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
21d40 20 20 20 20 20 20 20 6f 70 63 6f 64 65 29 20 66         opcode) f
21d50 6f 72 20 65 61 63 68 20 72 6f 77 20 69 6e 20 74  or each row in t
21d60 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 0a 2a  he result set..*
21d70 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 4d 65 6d  *.**     SRT_Mem
21d80 20 20 20 20 20 20 20 20 20 4f 6e 6c 79 20 76 61           Only va
21d90 6c 69 64 20 69 66 20 74 68 65 20 72 65 73 75 6c  lid if the resul
21da0 74 20 69 73 20 61 20 73 69 6e 67 6c 65 20 63 6f  t is a single co
21db0 6c 75 6d 6e 2e 0a 2a 2a 20 20 20 20 20 20 20 20  lumn..**        
21dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 53 74 6f               Sto
21dd0 72 65 20 74 68 65 20 66 69 72 73 74 20 63 6f 6c  re the first col
21de0 75 6d 6e 20 6f 66 20 74 68 65 20 66 69 72 73 74  umn of the first
21df0 20 72 65 73 75 6c 74 20 72 6f 77 0a 2a 2a 20 20   result row.**  
21e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21e10 20 20 20 69 6e 20 72 65 67 69 73 74 65 72 20 70     in register p
21e20 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 20 74 68  Dest->iSDParm th
21e30 65 6e 20 61 62 61 6e 64 6f 6e 20 74 68 65 20 72  en abandon the r
21e40 65 73 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  est.**          
21e50 20 20 20 20 20 20 20 20 20 20 20 6f 66 20 74 68             of th
21e60 65 20 71 75 65 72 79 2e 20 20 54 68 69 73 20 64  e query.  This d
21e70 65 73 74 69 6e 61 74 69 6f 6e 20 69 6d 70 6c 69  estination impli
21e80 65 73 20 22 4c 49 4d 49 54 20 31 22 2e 0a 2a 2a  es "LIMIT 1"..**
21e90 0a 2a 2a 20 20 20 20 20 53 52 54 5f 53 65 74 20  .**     SRT_Set 
21ea0 20 20 20 20 20 20 20 20 54 68 65 20 72 65 73 75          The resu
21eb0 6c 74 20 6d 75 73 74 20 62 65 20 61 20 73 69 6e  lt must be a sin
21ec0 67 6c 65 20 63 6f 6c 75 6d 6e 2e 20 20 53 74 6f  gle column.  Sto
21ed0 72 65 20 65 61 63 68 0a 2a 2a 20 20 20 20 20 20  re each.**      
21ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
21ef0 6f 77 20 6f 66 20 72 65 73 75 6c 74 20 61 73 20  ow of result as 
21f00 74 68 65 20 6b 65 79 20 69 6e 20 74 61 62 6c 65  the key in table
21f10 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 2e   pDest->iSDParm.
21f20 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20   .**            
21f30 20 20 20 20 20 20 20 20 20 41 70 70 6c 79 20 74           Apply t
21f40 68 65 20 61 66 66 69 6e 69 74 79 20 70 44 65 73  he affinity pDes
21f50 74 2d 3e 61 66 66 53 64 73 74 20 62 65 66 6f 72  t->affSdst befor
21f60 65 20 73 74 6f 72 69 6e 67 0a 2a 2a 20 20 20 20  e storing.**    
21f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21f80 20 72 65 73 75 6c 74 73 2e 20 20 55 73 65 64 20   results.  Used 
21f90 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 22 49 4e  to implement "IN
21fa0 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 2e 0a   (SELECT ...)"..
21fb0 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 55 6e  **.**     SRT_Un
21fc0 69 6f 6e 20 20 20 20 20 20 20 53 74 6f 72 65 20  ion       Store 
21fd0 72 65 73 75 6c 74 73 20 61 73 20 61 20 6b 65 79  results as a key
21fe0 20 69 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20   in a temporary 
21ff0 74 61 62 6c 65 20 0a 2a 2a 20 20 20 20 20 20 20  table .**       
22000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 64                id
22010 65 6e 74 69 66 69 65 64 20 62 79 20 70 44 65 73  entified by pDes
22020 74 2d 3e 69 53 44 50 61 72 6d 2e 0a 2a 2a 0a 2a  t->iSDParm..**.*
22030 2a 20 20 20 20 20 53 52 54 5f 45 78 63 65 70 74  *     SRT_Except
22040 20 20 20 20 20 20 52 65 6d 6f 76 65 20 72 65 73        Remove res
22050 75 6c 74 73 20 66 72 6f 6d 20 74 68 65 20 74 65  ults from the te
22060 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 70 44  mporary table pD
22070 65 73 74 2d 3e 69 53 44 50 61 72 6d 2e 0a 2a 2a  est->iSDParm..**
22080 0a 2a 2a 20 20 20 20 20 53 52 54 5f 54 61 62 6c  .**     SRT_Tabl
22090 65 20 20 20 20 20 20 20 53 74 6f 72 65 20 72 65  e       Store re
220a0 73 75 6c 74 73 20 69 6e 20 74 65 6d 70 6f 72 61  sults in tempora
220b0 72 79 20 74 61 62 6c 65 20 70 44 65 73 74 2d 3e  ry table pDest->
220c0 69 53 44 50 61 72 6d 2e 0a 2a 2a 20 20 20 20 20  iSDParm..**     
220d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
220e0 54 68 69 73 20 69 73 20 6c 69 6b 65 20 53 52 54  This is like SRT
220f0 5f 45 70 68 65 6d 54 61 62 20 65 78 63 65 70 74  _EphemTab except
22100 20 74 68 61 74 20 74 68 65 20 74 61 62 6c 65 0a   that the table.
22110 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
22120 20 20 20 20 20 20 20 69 73 20 61 73 73 75 6d 65         is assume
22130 64 20 74 6f 20 61 6c 72 65 61 64 79 20 62 65 20  d to already be 
22140 6f 70 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  open..**.**     
22150 53 52 54 5f 45 70 68 65 6d 54 61 62 20 20 20 20  SRT_EphemTab    
22160 43 72 65 61 74 65 20 61 6e 20 74 65 6d 70 6f 72  Create an tempor
22170 61 72 79 20 74 61 62 6c 65 20 70 44 65 73 74 2d  ary table pDest-
22180 3e 69 53 44 50 61 72 6d 20 61 6e 64 20 73 74 6f  >iSDParm and sto
22190 72 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  re.**           
221a0 20 20 20 20 20 20 20 20 20 20 74 68 65 20 72 65            the re
221b0 73 75 6c 74 20 74 68 65 72 65 2e 20 54 68 65 20  sult there. The 
221c0 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20 6f  cursor is left o
221d0 70 65 6e 20 61 66 74 65 72 0a 2a 2a 20 20 20 20  pen after.**    
221e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
221f0 20 72 65 74 75 72 6e 69 6e 67 2e 20 20 54 68 69   returning.  Thi
22200 73 20 69 73 20 6c 69 6b 65 20 53 52 54 5f 54 61  s is like SRT_Ta
22210 62 6c 65 20 65 78 63 65 70 74 20 74 68 61 74 0a  ble except that.
22220 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
22230 20 20 20 20 20 20 20 74 68 69 73 20 64 65 73 74         this dest
22240 69 6e 61 74 69 6f 6e 20 75 73 65 73 20 4f 50 5f  ination uses OP_
22250 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 74 6f  OpenEphemeral to
22260 20 63 72 65 61 74 65 0a 2a 2a 20 20 20 20 20 20   create.**      
22270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
22280 68 65 20 74 61 62 6c 65 20 66 69 72 73 74 2e 0a  he table first..
22290 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 43 6f  **.**     SRT_Co
222a0 72 6f 75 74 69 6e 65 20 20 20 47 65 6e 65 72 61  routine   Genera
222b0 74 65 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20  te a co-routine 
222c0 74 68 61 74 20 72 65 74 75 72 6e 73 20 61 20 6e  that returns a n
222d0 65 77 20 72 6f 77 20 6f 66 0a 2a 2a 20 20 20 20  ew row of.**    
222e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
222f0 20 72 65 73 75 6c 74 73 20 65 61 63 68 20 74 69   results each ti
22300 6d 65 20 69 74 20 69 73 20 69 6e 76 6f 6b 65 64  me it is invoked
22310 2e 20 20 54 68 65 20 65 6e 74 72 79 20 70 6f 69  .  The entry poi
22320 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  nt.**           
22330 20 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65            of the
22340 20 63 6f 2d 72 6f 75 74 69 6e 65 20 69 73 20 73   co-routine is s
22350 74 6f 72 65 64 20 69 6e 20 72 65 67 69 73 74 65  tored in registe
22360 72 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d  r pDest->iSDParm
22370 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f  ..**.**     SRT_
22380 45 78 69 73 74 73 20 20 20 20 20 20 53 74 6f 72  Exists      Stor
22390 65 20 61 20 31 20 69 6e 20 6d 65 6d 6f 72 79 20  e a 1 in memory 
223a0 63 65 6c 6c 20 70 44 65 73 74 2d 3e 69 53 44 50  cell pDest->iSDP
223b0 61 72 6d 20 69 66 20 74 68 65 20 72 65 73 75 6c  arm if the resul
223c0 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
223d0 20 20 20 20 20 20 20 20 20 73 65 74 20 69 73 20           set is 
223e0 6e 6f 74 20 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a  not empty..**.**
223f0 20 20 20 20 20 53 52 54 5f 44 69 73 63 61 72 64       SRT_Discard
22400 20 20 20 20 20 54 68 72 6f 77 20 74 68 65 20 72       Throw the r
22410 65 73 75 6c 74 73 20 61 77 61 79 2e 20 20 54 68  esults away.  Th
22420 69 73 20 69 73 20 75 73 65 64 20 62 79 20 53 45  is is used by SE
22430 4c 45 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 20  LECT.**         
22440 20 20 20 20 20 20 20 20 20 20 20 20 73 74 61 74              stat
22450 65 6d 65 6e 74 73 20 77 69 74 68 69 6e 20 74 72  ements within tr
22460 69 67 67 65 72 73 20 77 68 6f 73 65 20 6f 6e 6c  iggers whose onl
22470 79 20 70 75 72 70 6f 73 65 20 69 73 0a 2a 2a 20  y purpose is.** 
22480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22490 20 20 20 20 74 68 65 20 73 69 64 65 2d 65 66 66      the side-eff
224a0 65 63 74 73 20 6f 66 20 66 75 6e 63 74 69 6f 6e  ects of function
224b0 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
224c0 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68  utine returns th
224d0 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f  e number of erro
224e0 72 73 2e 20 20 49 66 20 61 6e 79 20 65 72 72 6f  rs.  If any erro
224f0 72 73 20 61 72 65 0a 2a 2a 20 65 6e 63 6f 75 6e  rs are.** encoun
22500 74 65 72 65 64 2c 20 74 68 65 6e 20 61 6e 20 61  tered, then an a
22510 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72  ppropriate error
22520 20 6d 65 73 73 61 67 65 20 69 73 20 6c 65 66 74   message is left
22530 20 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2d 3e 7a   in.** pParse->z
22540 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  ErrMsg..**.** Th
22550 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20  is routine does 
22560 4e 4f 54 20 66 72 65 65 20 74 68 65 20 53 65 6c  NOT free the Sel
22570 65 63 74 20 73 74 72 75 63 74 75 72 65 20 70 61  ect structure pa
22580 73 73 65 64 20 69 6e 2e 20 20 54 68 65 0a 2a 2a  ssed in.  The.**
22590 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   calling functio
225a0 6e 20 6e 65 65 64 73 20 74 6f 20 64 6f 20 74 68  n needs to do th
225b0 61 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  at..*/.int sqlit
225c0 65 33 53 65 6c 65 63 74 28 0a 20 20 50 61 72 73  e3Select(.  Pars
225d0 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
225e0 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72     /* The parser
225f0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
22600 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
22610 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45       /* The SELE
22620 43 54 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69  CT statement bei
22630 6e 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 53  ng coded. */.  S
22640 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74  electDest *pDest
22650 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f        /* What to
22660 20 64 6f 20 77 69 74 68 20 74 68 65 20 71 75 65   do with the que
22670 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b  ry results */.){
22680 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20  .  int i, j;    
22690 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
226a0 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20  p counters */.  
226b0 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
226c0 6f 3b 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e  o;     /* Return
226d0 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 57 68 65   from sqlite3Whe
226e0 72 65 42 65 67 69 6e 28 29 20 2a 2f 0a 20 20 56  reBegin() */.  V
226f0 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20  dbe *v;         
22700 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76 69 72        /* The vir
22710 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 75 6e 64  tual machine und
22720 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  er construction 
22730 2a 2f 0a 20 20 69 6e 74 20 69 73 41 67 67 3b 20  */.  int isAgg; 
22740 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
22750 72 75 65 20 66 6f 72 20 73 65 6c 65 63 74 20 6c  rue for select l
22760 69 73 74 73 20 6c 69 6b 65 20 22 63 6f 75 6e 74  ists like "count
22770 28 2a 29 22 20 2a 2f 0a 20 20 45 78 70 72 4c 69  (*)" */.  ExprLi
22780 73 74 20 2a 70 45 4c 69 73 74 3b 20 20 20 20 20  st *pEList;     
22790 20 2f 2a 20 4c 69 73 74 20 6f 66 20 63 6f 6c 75   /* List of colu
227a0 6d 6e 73 20 74 6f 20 65 78 74 72 61 63 74 2e 20  mns to extract. 
227b0 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  */.  SrcList *pT
227c0 61 62 4c 69 73 74 3b 20 20 20 20 20 2f 2a 20 4c  abList;     /* L
227d0 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 74 6f  ist of tables to
227e0 20 73 65 6c 65 63 74 20 66 72 6f 6d 20 2a 2f 0a   select from */.
227f0 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 3b 20    Expr *pWhere; 
22800 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
22810 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 4d  WHERE clause.  M
22820 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ay be NULL */.  
22830 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
22840 42 79 3b 20 20 20 20 2f 2a 20 54 68 65 20 4f 52  By;    /* The OR
22850 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 20 20  DER BY clause.  
22860 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  May be NULL */. 
22870 20 45 78 70 72 4c 69 73 74 20 2a 70 47 72 6f 75   ExprList *pGrou
22880 70 42 79 3b 20 20 20 20 2f 2a 20 54 68 65 20 47  pBy;    /* The G
22890 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e 20  ROUP BY clause. 
228a0 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a   May be NULL */.
228b0 20 20 45 78 70 72 20 2a 70 48 61 76 69 6e 67 3b    Expr *pHaving;
228c0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
228d0 48 41 56 49 4e 47 20 63 6c 61 75 73 65 2e 20 20  HAVING clause.  
228e0 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  May be NULL */. 
228f0 20 69 6e 74 20 72 63 20 3d 20 31 3b 20 20 20 20   int rc = 1;    
22900 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
22910 20 74 6f 20 72 65 74 75 72 6e 20 66 72 6f 6d 20   to return from 
22920 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  this function */
22930 0a 20 20 69 6e 74 20 61 64 64 72 53 6f 72 74 49  .  int addrSortI
22940 6e 64 65 78 3b 20 20 20 20 20 2f 2a 20 41 64 64  ndex;     /* Add
22950 72 65 73 73 20 6f 66 20 61 6e 20 4f 50 5f 4f 70  ress of an OP_Op
22960 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e 73 74  enEphemeral inst
22970 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 44 69 73  ruction */.  Dis
22980 74 69 6e 63 74 43 74 78 20 73 44 69 73 74 69 6e  tinctCtx sDistin
22990 63 74 3b 20 2f 2a 20 49 6e 66 6f 20 6f 6e 20 68  ct; /* Info on h
229a0 6f 77 20 74 6f 20 63 6f 64 65 20 74 68 65 20 44  ow to code the D
229b0 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20  ISTINCT keyword 
229c0 2a 2f 0a 20 20 41 67 67 49 6e 66 6f 20 73 41 67  */.  AggInfo sAg
229d0 67 49 6e 66 6f 3b 20 20 20 20 20 20 2f 2a 20 49  gInfo;      /* I
229e0 6e 66 6f 72 6d 61 74 69 6f 6e 20 75 73 65 64 20  nformation used 
229f0 62 79 20 61 67 67 72 65 67 61 74 65 20 71 75 65  by aggregate que
22a00 72 69 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 45  ries */.  int iE
22a10 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nd;             
22a20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
22a30 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 71 75  he end of the qu
22a40 65 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ery */.  sqlite3
22a50 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20   *db;           
22a60 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
22a70 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a 23  connection */..#
22a80 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
22a90 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 69 6e 74  IT_EXPLAIN.  int
22aa0 20 69 52 65 73 74 6f 72 65 53 65 6c 65 63 74 49   iRestoreSelectI
22ab0 64 20 3d 20 70 50 61 72 73 65 2d 3e 69 53 65 6c  d = pParse->iSel
22ac0 65 63 74 49 64 3b 0a 20 20 70 50 61 72 73 65 2d  ectId;.  pParse-
22ad0 3e 69 53 65 6c 65 63 74 49 64 20 3d 20 70 50 61  >iSelectId = pPa
22ae0 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74  rse->iNextSelect
22af0 49 64 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  Id++;.#endif..  
22b00 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
22b10 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 64  .  if( p==0 || d
22b20 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
22b30 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  || pParse->nErr 
22b40 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  ){.    return 1;
22b50 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74  .  }.  if( sqlit
22b60 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
22b70 73 65 2c 20 53 51 4c 49 54 45 5f 53 45 4c 45 43  se, SQLITE_SELEC
22b80 54 2c 20 30 2c 20 30 2c 20 30 29 20 29 20 72 65  T, 0, 0, 0) ) re
22b90 74 75 72 6e 20 31 3b 0a 20 20 6d 65 6d 73 65 74  turn 1;.  memset
22ba0 28 26 73 41 67 67 49 6e 66 6f 2c 20 30 2c 20 73  (&sAggInfo, 0, s
22bb0 69 7a 65 6f 66 28 73 41 67 67 49 6e 66 6f 29 29  izeof(sAggInfo))
22bc0 3b 0a 0a 20 20 69 66 28 20 49 67 6e 6f 72 61 62  ;..  if( Ignorab
22bd0 6c 65 4f 72 64 65 72 62 79 28 70 44 65 73 74 29  leOrderby(pDest)
22be0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 70   ){.    assert(p
22bf0 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54  Dest->eDest==SRT
22c00 5f 45 78 69 73 74 73 20 7c 7c 20 70 44 65 73 74  _Exists || pDest
22c10 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 55 6e 69  ->eDest==SRT_Uni
22c20 6f 6e 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20  on || .         
22c30 20 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d    pDest->eDest==
22c40 53 52 54 5f 45 78 63 65 70 74 20 7c 7c 20 70 44  SRT_Except || pD
22c50 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
22c60 44 69 73 63 61 72 64 29 3b 0a 20 20 20 20 2f 2a  Discard);.    /*
22c70 20 49 66 20 4f 52 44 45 52 20 42 59 20 6d 61 6b   If ORDER BY mak
22c80 65 73 20 6e 6f 20 64 69 66 66 65 72 65 6e 63 65  es no difference
22c90 20 69 6e 20 74 68 65 20 6f 75 74 70 75 74 20 74   in the output t
22ca0 68 65 6e 20 6e 65 69 74 68 65 72 20 64 6f 65 73  hen neither does
22cb0 0a 20 20 20 20 2a 2a 20 44 49 53 54 49 4e 43 54  .    ** DISTINCT
22cc0 20 73 6f 20 69 74 20 63 61 6e 20 62 65 20 72 65   so it can be re
22cd0 6d 6f 76 65 64 20 74 6f 6f 2e 20 2a 2f 0a 20 20  moved too. */.  
22ce0 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
22cf0 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  tDelete(db, p->p
22d00 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 70 2d  OrderBy);.    p-
22d10 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20  >pOrderBy = 0;. 
22d20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26     p->selFlags &
22d30 3d 20 7e 53 46 5f 44 69 73 74 69 6e 63 74 3b 0a  = ~SF_Distinct;.
22d40 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 65 6c    }.  sqlite3Sel
22d50 65 63 74 50 72 65 70 28 70 50 61 72 73 65 2c 20  ectPrep(pParse, 
22d60 70 2c 20 30 29 3b 0a 20 20 70 4f 72 64 65 72 42  p, 0);.  pOrderB
22d70 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b  y = p->pOrderBy;
22d80 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d  .  pTabList = p-
22d90 3e 70 53 72 63 3b 0a 20 20 70 45 4c 69 73 74 20  >pSrc;.  pEList 
22da0 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 69  = p->pEList;.  i
22db0 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
22dc0 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
22dd0 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  led ){.    goto 
22de0 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a  select_end;.  }.
22df0 20 20 69 73 41 67 67 20 3d 20 28 70 2d 3e 73 65    isAgg = (p->se
22e00 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67 67 72  lFlags & SF_Aggr
22e10 65 67 61 74 65 29 21 3d 30 3b 0a 20 20 61 73 73  egate)!=0;.  ass
22e20 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20 29  ert( pEList!=0 )
22e30 3b 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 67 65  ;..  /* Begin ge
22e40 6e 65 72 61 74 69 6e 67 20 63 6f 64 65 2e 0a 20  nerating code.. 
22e50 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65   */.  v = sqlite
22e60 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
22e70 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 67  ;.  if( v==0 ) g
22e80 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
22e90 0a 20 20 2f 2a 20 49 66 20 77 72 69 74 69 6e 67  .  /* If writing
22ea0 20 74 6f 20 6d 65 6d 6f 72 79 20 6f 72 20 67 65   to memory or ge
22eb0 6e 65 72 61 74 69 6e 67 20 61 20 73 65 74 0a 20  nerating a set. 
22ec0 20 2a 2a 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c   ** only a singl
22ed0 65 20 63 6f 6c 75 6d 6e 20 6d 61 79 20 62 65 20  e column may be 
22ee0 6f 75 74 70 75 74 2e 0a 20 20 2a 2f 0a 23 69 66  output..  */.#if
22ef0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
22f00 5f 53 55 42 51 55 45 52 59 0a 20 20 69 66 28 20  _SUBQUERY.  if( 
22f10 63 68 65 63 6b 46 6f 72 4d 75 6c 74 69 43 6f 6c  checkForMultiCol
22f20 75 6d 6e 53 65 6c 65 63 74 45 72 72 6f 72 28 70  umnSelectError(p
22f30 50 61 72 73 65 2c 20 70 44 65 73 74 2c 20 70 45  Parse, pDest, pE
22f40 4c 69 73 74 2d 3e 6e 45 78 70 72 29 20 29 7b 0a  List->nExpr) ){.
22f50 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
22f60 65 6e 64 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  end;.  }.#endif.
22f70 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63  .  /* Generate c
22f80 6f 64 65 20 66 6f 72 20 61 6c 6c 20 73 75 62 2d  ode for all sub-
22f90 71 75 65 72 69 65 73 20 69 6e 20 74 68 65 20 46  queries in the F
22fa0 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a  ROM clause.  */.
22fb0 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
22fc0 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
22fd0 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  Y) || !defined(S
22fe0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
22ff0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 21 70 2d 3e  .  for(i=0; !p->
23000 70 50 72 69 6f 72 20 26 26 20 69 3c 70 54 61 62  pPrior && i<pTab
23010 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29  List->nSrc; i++)
23020 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63  {.    struct Src
23030 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
23040 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b   = &pTabList->a[
23050 69 5d 3b 0a 20 20 20 20 53 65 6c 65 63 74 44 65  i];.    SelectDe
23060 73 74 20 64 65 73 74 3b 0a 20 20 20 20 53 65 6c  st dest;.    Sel
23070 65 63 74 20 2a 70 53 75 62 20 3d 20 70 49 74 65  ect *pSub = pIte
23080 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20  m->pSelect;.    
23090 69 6e 74 20 69 73 41 67 67 53 75 62 3b 0a 0a 20  int isAggSub;.. 
230a0 20 20 20 69 66 28 20 70 53 75 62 3d 3d 30 20 29     if( pSub==0 )
230b0 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20   continue;..    
230c0 2f 2a 20 53 6f 6d 65 74 69 6d 65 73 20 74 68 65  /* Sometimes the
230d0 20 63 6f 64 65 20 66 6f 72 20 61 20 73 75 62 71   code for a subq
230e0 75 65 72 79 20 77 69 6c 6c 20 62 65 20 67 65 6e  uery will be gen
230f0 65 72 61 74 65 64 20 6d 6f 72 65 20 74 68 61 6e  erated more than
23100 0a 20 20 20 20 2a 2a 20 6f 6e 63 65 2c 20 69 66  .    ** once, if
23110 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73   the subquery is
23120 20 70 61 72 74 20 6f 66 20 74 68 65 20 57 48 45   part of the WHE
23130 52 45 20 63 6c 61 75 73 65 20 69 6e 20 61 20 4c  RE clause in a L
23140 45 46 54 20 4a 4f 49 4e 2c 0a 20 20 20 20 2a 2a  EFT JOIN,.    **
23150 20 66 6f 72 20 65 78 61 6d 70 6c 65 2e 20 20 49   for example.  I
23160 6e 20 74 68 61 74 20 63 61 73 65 2c 20 64 6f 20  n that case, do 
23170 6e 6f 74 20 72 65 67 65 6e 65 72 61 74 65 20 74  not regenerate t
23180 68 65 20 63 6f 64 65 20 74 6f 20 6d 61 6e 69 66  he code to manif
23190 65 73 74 0a 20 20 20 20 2a 2a 20 61 20 76 69 65  est.    ** a vie
231a0 77 20 6f 72 20 74 68 65 20 63 6f 2d 72 6f 75 74  w or the co-rout
231b0 69 6e 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  ine to implement
231c0 20 61 20 76 69 65 77 2e 20 20 54 68 65 20 66 69   a view.  The fi
231d0 72 73 74 20 69 6e 73 74 61 6e 63 65 0a 20 20 20  rst instance.   
231e0 20 2a 2a 20 69 73 20 73 75 66 66 69 63 69 65 6e   ** is sufficien
231f0 74 2c 20 74 68 6f 75 67 68 20 74 68 65 20 73 75  t, though the su
23200 62 72 6f 75 74 69 6e 65 20 74 6f 20 6d 61 6e 69  broutine to mani
23210 66 65 73 74 20 74 68 65 20 76 69 65 77 20 64 6f  fest the view do
23220 65 73 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20 74  es need.    ** t
23230 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20 61 67 61  o be invoked aga
23240 69 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  in. */.    if( p
23250 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75  Item->addrFillSu
23260 62 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  b ){.      if( p
23270 49 74 65 6d 2d 3e 76 69 61 43 6f 72 6f 75 74 69  Item->viaCorouti
23280 6e 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ne==0 ){.       
23290 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
232a0 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
232b0 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e  pItem->regReturn
232c0 2c 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c  , pItem->addrFil
232d0 6c 53 75 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20  lSub);.      }. 
232e0 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
232f0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e 63     }..    /* Inc
23300 72 65 6d 65 6e 74 20 50 61 72 73 65 2e 6e 48 65  rement Parse.nHe
23310 69 67 68 74 20 62 79 20 74 68 65 20 68 65 69 67  ight by the heig
23320 68 74 20 6f 66 20 74 68 65 20 6c 61 72 67 65 73  ht of the larges
23330 74 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 20  t expression.   
23340 20 2a 2a 20 74 72 65 65 20 72 65 66 65 72 72 65   ** tree referre
23350 64 20 74 6f 20 62 79 20 74 68 69 73 2c 20 74 68  d to by this, th
23360 65 20 70 61 72 65 6e 74 20 73 65 6c 65 63 74 2e  e parent select.
23370 20 54 68 65 20 63 68 69 6c 64 20 73 65 6c 65 63   The child selec
23380 74 0a 20 20 20 20 2a 2a 20 6d 61 79 20 63 6f 6e  t.    ** may con
23390 74 61 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  tain expression 
233a0 74 72 65 65 73 20 6f 66 20 61 74 20 6d 6f 73 74  trees of at most
233b0 0a 20 20 20 20 2a 2a 20 28 53 51 4c 49 54 45 5f  .    ** (SQLITE_
233c0 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48 2d 50  MAX_EXPR_DEPTH-P
233d0 61 72 73 65 2e 6e 48 65 69 67 68 74 29 20 68 65  arse.nHeight) he
233e0 69 67 68 74 2e 20 54 68 69 73 20 69 73 20 61 20  ight. This is a 
233f0 62 69 74 0a 20 20 20 20 2a 2a 20 6d 6f 72 65 20  bit.    ** more 
23400 63 6f 6e 73 65 72 76 61 74 69 76 65 20 74 68 61  conservative tha
23410 6e 20 6e 65 63 65 73 73 61 72 79 2c 20 62 75 74  n necessary, but
23420 20 6d 75 63 68 20 65 61 73 69 65 72 20 74 68 61   much easier tha
23430 6e 20 65 6e 66 6f 72 63 69 6e 67 0a 20 20 20 20  n enforcing.    
23440 2a 2a 20 61 6e 20 65 78 61 63 74 20 6c 69 6d 69  ** an exact limi
23450 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50  t..    */.    pP
23460 61 72 73 65 2d 3e 6e 48 65 69 67 68 74 20 2b 3d  arse->nHeight +=
23470 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78   sqlite3SelectEx
23480 70 72 48 65 69 67 68 74 28 70 29 3b 0a 0a 20 20  prHeight(p);..  
23490 20 20 69 73 41 67 67 53 75 62 20 3d 20 28 70 53    isAggSub = (pS
234a0 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  ub->selFlags & S
234b0 46 5f 41 67 67 72 65 67 61 74 65 29 21 3d 30 3b  F_Aggregate)!=0;
234c0 0a 20 20 20 20 69 66 28 20 66 6c 61 74 74 65 6e  .    if( flatten
234d0 53 75 62 71 75 65 72 79 28 70 50 61 72 73 65 2c  Subquery(pParse,
234e0 20 70 2c 20 69 2c 20 69 73 41 67 67 2c 20 69 73   p, i, isAgg, is
234f0 41 67 67 53 75 62 29 20 29 7b 0a 20 20 20 20 20  AggSub) ){.     
23500 20 2f 2a 20 54 68 69 73 20 73 75 62 71 75 65 72   /* This subquer
23510 79 20 63 61 6e 20 62 65 20 61 62 73 6f 72 62 65  y can be absorbe
23520 64 20 69 6e 74 6f 20 69 74 73 20 70 61 72 65 6e  d into its paren
23530 74 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  t. */.      if( 
23540 69 73 41 67 67 53 75 62 20 29 7b 0a 20 20 20 20  isAggSub ){.    
23550 20 20 20 20 69 73 41 67 67 20 3d 20 31 3b 0a 20      isAgg = 1;. 
23560 20 20 20 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61         p->selFla
23570 67 73 20 7c 3d 20 53 46 5f 41 67 67 72 65 67 61  gs |= SF_Aggrega
23580 74 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  te;.      }.    
23590 20 20 69 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 65    i = -1;.    }e
235a0 6c 73 65 20 69 66 28 20 70 54 61 62 4c 69 73 74  lse if( pTabList
235b0 2d 3e 6e 53 72 63 3d 3d 31 20 26 26 20 28 70 2d  ->nSrc==1 && (p-
235c0 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 4d  >selFlags & SF_M
235d0 61 74 65 72 69 61 6c 69 7a 65 29 3d 3d 30 0a 20  aterialize)==0. 
235e0 20 20 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61       && Optimiza
235f0 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20  tionEnabled(db, 
23600 53 51 4c 49 54 45 5f 53 75 62 71 43 6f 72 6f 75  SQLITE_SubqCorou
23610 74 69 6e 65 29 0a 20 20 20 20 29 7b 0a 20 20 20  tine).    ){.   
23620 20 20 20 2f 2a 20 49 6d 70 6c 65 6d 65 6e 74 20     /* Implement 
23630 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20 74 68 61  a co-routine tha
23640 74 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 61 20  t will return a 
23650 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 74 68  single row of th
23660 65 20 72 65 73 75 6c 74 0a 20 20 20 20 20 20 2a  e result.      *
23670 2a 20 73 65 74 20 6f 6e 20 65 61 63 68 20 69 6e  * set on each in
23680 76 6f 63 61 74 69 6f 6e 2e 0a 20 20 20 20 20 20  vocation..      
23690 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  */.      int add
236a0 72 54 6f 70 3b 0a 20 20 20 20 20 20 69 6e 74 20  rTop;.      int 
236b0 61 64 64 72 45 6f 66 3b 0a 20 20 20 20 20 20 70  addrEof;.      p
236c0 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 20  Item->regReturn 
236d0 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
236e0 3b 0a 20 20 20 20 20 20 61 64 64 72 45 6f 66 20  ;.      addrEof 
236f0 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
23700 3b 0a 20 20 20 20 20 20 2f 2a 20 42 65 66 6f 72  ;.      /* Befor
23710 65 20 63 6f 64 69 6e 67 20 74 68 65 20 4f 50 5f  e coding the OP_
23720 47 6f 74 6f 20 74 6f 20 6a 75 6d 70 20 74 6f 20  Goto to jump to 
23730 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
23740 20 6d 61 69 6e 20 72 6f 75 74 69 6e 65 2c 0a 20   main routine,. 
23750 20 20 20 20 20 2a 2a 20 65 6e 73 75 72 65 20 74       ** ensure t
23760 68 61 74 20 74 68 65 20 6a 75 6d 70 20 74 6f 20  hat the jump to 
23770 74 68 65 20 76 65 72 69 66 79 2d 73 63 68 65 6d  the verify-schem
23780 61 20 72 6f 75 74 69 6e 65 20 68 61 73 20 61 6c  a routine has al
23790 72 65 61 64 79 0a 20 20 20 20 20 20 2a 2a 20 62  ready.      ** b
237a0 65 65 6e 20 63 6f 64 65 64 2e 20 4f 74 68 65 72  een coded. Other
237b0 77 69 73 65 2c 20 74 68 65 20 76 65 72 69 66 79  wise, the verify
237c0 2d 73 63 68 65 6d 61 20 77 6f 75 6c 64 20 6c 69  -schema would li
237d0 6b 65 6c 79 20 62 65 20 63 6f 64 65 64 20 61 73  kely be coded as
237e0 20 0a 20 20 20 20 20 20 2a 2a 20 70 61 72 74 20   .      ** part 
237f0 6f 66 20 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e  of the co-routin
23800 65 2e 20 49 66 20 74 68 65 20 6d 61 69 6e 20 72  e. If the main r
23810 6f 75 74 69 6e 65 20 74 68 65 6e 20 61 63 63 65  outine then acce
23820 73 73 65 64 20 74 68 65 20 0a 20 20 20 20 20 20  ssed the .      
23830 2a 2a 20 64 61 74 61 62 61 73 65 20 62 65 66 6f  ** database befo
23840 72 65 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20  re invoking the 
23850 63 6f 2d 72 6f 75 74 69 6e 65 20 66 6f 72 20 74  co-routine for t
23860 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 28 66  he first time (f
23870 6f 72 20 0a 20 20 20 20 20 20 2a 2a 20 65 78 61  or .      ** exa
23880 6d 70 6c 65 20 74 6f 20 69 6e 69 74 69 61 6c 69  mple to initiali
23890 7a 65 20 61 20 4c 49 4d 49 54 20 72 65 67 69 73  ze a LIMIT regis
238a0 74 65 72 20 66 72 6f 6d 20 61 20 73 75 62 2d 73  ter from a sub-s
238b0 65 6c 65 63 74 29 2c 20 69 74 20 77 6f 75 6c 64  elect), it would
238c0 20 0a 20 20 20 20 20 20 2a 2a 20 62 65 20 64 6f   .      ** be do
238d0 69 6e 67 20 73 6f 20 77 69 74 68 6f 75 74 20 68  ing so without h
238e0 61 76 69 6e 67 20 76 65 72 69 66 69 65 64 20 74  aving verified t
238f0 68 65 20 73 63 68 65 6d 61 20 76 65 72 73 69 6f  he schema versio
23900 6e 20 61 6e 64 20 6f 62 74 61 69 6e 65 64 20 0a  n and obtained .
23910 20 20 20 20 20 20 2a 2a 20 74 68 65 20 72 65 71        ** the req
23920 75 69 72 65 64 20 64 62 20 6c 6f 63 6b 73 2e 20  uired db locks. 
23930 53 65 65 20 74 69 63 6b 65 74 20 64 36 62 33 36  See ticket d6b36
23940 62 65 33 38 2e 20 20 2a 2f 0a 20 20 20 20 20 20  be38.  */.      
23950 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
23960 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20  ySchema(pParse, 
23970 2d 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  -1);.      sqlit
23980 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20  e3VdbeAddOp0(v, 
23990 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20 20 20 20 20  OP_Goto);.      
239a0 61 64 64 72 54 6f 70 20 3d 20 73 71 6c 69 74 65  addrTop = sqlite
239b0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
239c0 50 5f 4f 70 65 6e 50 73 65 75 64 6f 2c 20 70 49  P_OpenPseudo, pI
239d0 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20  tem->iCursor);. 
239e0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
239f0 43 68 61 6e 67 65 50 35 28 76 2c 20 31 29 3b 0a  ChangeP5(v, 1);.
23a00 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
23a10 74 28 28 76 2c 20 22 63 6f 72 6f 75 74 69 6e 65  t((v, "coroutine
23a20 20 66 6f 72 20 25 73 22 2c 20 70 49 74 65 6d 2d   for %s", pItem-
23a30 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a  >pTab->zName));.
23a40 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 61 64 64        pItem->add
23a50 72 46 69 6c 6c 53 75 62 20 3d 20 61 64 64 72 54  rFillSub = addrT
23a60 6f 70 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  op;.      sqlite
23a70 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
23a80 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 61 64  P_Integer, 0, ad
23a90 64 72 45 6f 66 29 3b 0a 20 20 20 20 20 20 73 71  drEof);.      sq
23aa0 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
23ab0 35 28 76 2c 20 31 29 3b 0a 20 20 20 20 20 20 73  5(v, 1);.      s
23ac0 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74  qlite3SelectDest
23ad0 49 6e 69 74 28 26 64 65 73 74 2c 20 53 52 54 5f  Init(&dest, SRT_
23ae0 43 6f 72 6f 75 74 69 6e 65 2c 20 70 49 74 65 6d  Coroutine, pItem
23af0 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a 20 20  ->regReturn);.  
23b00 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e      explainSetIn
23b10 74 65 67 65 72 28 70 49 74 65 6d 2d 3e 69 53 65  teger(pItem->iSe
23b20 6c 65 63 74 49 64 2c 20 28 75 38 29 70 50 61 72  lectId, (u8)pPar
23b30 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49  se->iNextSelectI
23b40 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  d);.      sqlite
23b50 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
23b60 70 53 75 62 2c 20 26 64 65 73 74 29 3b 0a 20 20  pSub, &dest);.  
23b70 20 20 20 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d      pItem->pTab-
23b80 3e 6e 52 6f 77 45 73 74 20 3d 20 28 75 6e 73 69  >nRowEst = (unsi
23b90 67 6e 65 64 29 70 53 75 62 2d 3e 6e 53 65 6c 65  gned)pSub->nSele
23ba0 63 74 52 6f 77 3b 0a 20 20 20 20 20 20 70 49 74  ctRow;.      pIt
23bb0 65 6d 2d 3e 76 69 61 43 6f 72 6f 75 74 69 6e 65  em->viaCoroutine
23bc0 20 3d 20 31 3b 0a 20 20 20 20 20 20 73 71 6c 69   = 1;.      sqli
23bd0 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28  te3VdbeChangeP2(
23be0 76 2c 20 61 64 64 72 54 6f 70 2c 20 64 65 73 74  v, addrTop, dest
23bf0 2e 69 53 64 73 74 29 3b 0a 20 20 20 20 20 20 73  .iSdst);.      s
23c00 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
23c10 50 33 28 76 2c 20 61 64 64 72 54 6f 70 2c 20 64  P3(v, addrTop, d
23c20 65 73 74 2e 6e 53 64 73 74 29 3b 0a 20 20 20 20  est.nSdst);.    
23c30 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
23c40 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
23c50 72 2c 20 31 2c 20 61 64 64 72 45 6f 66 29 3b 0a  r, 1, addrEof);.
23c60 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
23c70 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69  eAddOp1(v, OP_Yi
23c80 65 6c 64 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52  eld, pItem->regR
23c90 65 74 75 72 6e 29 3b 0a 20 20 20 20 20 20 56 64  eturn);.      Vd
23ca0 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65  beComment((v, "e
23cb0 6e 64 20 25 73 22 2c 20 70 49 74 65 6d 2d 3e 70  nd %s", pItem->p
23cc0 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20  Tab->zName));.  
23cd0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
23ce0 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 54  umpHere(v, addrT
23cf0 6f 70 2d 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  op-1);.      sql
23d00 69 74 65 33 43 6c 65 61 72 54 65 6d 70 52 65 67  ite3ClearTempReg
23d10 43 61 63 68 65 28 70 50 61 72 73 65 29 3b 0a 20  Cache(pParse);. 
23d20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
23d30 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75  /* Generate a su
23d40 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 77 69  broutine that wi
23d50 6c 6c 20 66 69 6c 6c 20 61 6e 20 65 70 68 65 6d  ll fill an ephem
23d60 65 72 61 6c 20 74 61 62 6c 65 20 77 69 74 68 0a  eral table with.
23d70 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 6f 6e        ** the con
23d80 74 65 6e 74 20 6f 66 20 74 68 69 73 20 73 75 62  tent of this sub
23d90 71 75 65 72 79 2e 20 20 70 49 74 65 6d 2d 3e 61  query.  pItem->a
23da0 64 64 72 46 69 6c 6c 53 75 62 20 77 69 6c 6c 20  ddrFillSub will 
23db0 70 6f 69 6e 74 0a 20 20 20 20 20 20 2a 2a 20 74  point.      ** t
23dc0 6f 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66  o the address of
23dd0 20 74 68 65 20 67 65 6e 65 72 61 74 65 64 20 73   the generated s
23de0 75 62 72 6f 75 74 69 6e 65 2e 20 20 70 49 74 65  ubroutine.  pIte
23df0 6d 2d 3e 72 65 67 52 65 74 75 72 6e 0a 20 20 20  m->regReturn.   
23e00 20 20 20 2a 2a 20 69 73 20 61 20 72 65 67 69 73     ** is a regis
23e10 74 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 74 6f  ter allocated to
23e20 20 68 6f 6c 64 20 74 68 65 20 73 75 62 72 6f 75   hold the subrou
23e30 74 69 6e 65 20 72 65 74 75 72 6e 20 61 64 64 72  tine return addr
23e40 65 73 73 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ess.      */.   
23e50 20 20 20 69 6e 74 20 74 6f 70 41 64 64 72 3b 0a     int topAddr;.
23e60 20 20 20 20 20 20 69 6e 74 20 6f 6e 63 65 41 64        int onceAd
23e70 64 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e  dr = 0;.      in
23e80 74 20 72 65 74 41 64 64 72 3b 0a 20 20 20 20 20  t retAddr;.     
23e90 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e   assert( pItem->
23ea0 61 64 64 72 46 69 6c 6c 53 75 62 3d 3d 30 20 29  addrFillSub==0 )
23eb0 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 72  ;.      pItem->r
23ec0 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50 61  egReturn = ++pPa
23ed0 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
23ee0 20 74 6f 70 41 64 64 72 20 3d 20 73 71 6c 69 74   topAddr = sqlit
23ef0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
23f00 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 70  OP_Integer, 0, p
23f10 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 29  Item->regReturn)
23f20 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 61  ;.      pItem->a
23f30 64 64 72 46 69 6c 6c 53 75 62 20 3d 20 74 6f 70  ddrFillSub = top
23f40 41 64 64 72 2b 31 3b 0a 20 20 20 20 20 20 56 64  Addr+1;.      Vd
23f50 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76  beNoopComment((v
23f60 2c 20 22 6d 61 74 65 72 69 61 6c 69 7a 65 20 25  , "materialize %
23f70 73 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d  s", pItem->pTab-
23f80 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20  >zName));.      
23f90 69 66 28 20 70 49 74 65 6d 2d 3e 69 73 43 6f 72  if( pItem->isCor
23fa0 72 65 6c 61 74 65 64 3d 3d 30 20 29 7b 0a 20 20  related==0 ){.  
23fb0 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
23fc0 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20  subquery is not 
23fd0 63 6f 72 72 65 6c 61 74 65 64 20 61 6e 64 20 69  correlated and i
23fe0 66 20 77 65 20 61 72 65 20 6e 6f 74 20 69 6e 73  f we are not ins
23ff0 69 64 65 20 6f 66 0a 20 20 20 20 20 20 20 20 2a  ide of.        *
24000 2a 20 61 20 74 72 69 67 67 65 72 2c 20 74 68 65  * a trigger, the
24010 6e 20 77 65 20 6f 6e 6c 79 20 6e 65 65 64 20 74  n we only need t
24020 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20 76 61  o compute the va
24030 6c 75 65 20 6f 66 20 74 68 65 20 73 75 62 71 75  lue of the subqu
24040 65 72 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  ery.        ** o
24050 6e 63 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  nce. */.        
24060 6f 6e 63 65 41 64 64 72 20 3d 20 73 71 6c 69 74  onceAddr = sqlit
24070 65 33 43 6f 64 65 4f 6e 63 65 28 70 50 61 72 73  e3CodeOnce(pPars
24080 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
24090 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
240a0 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20 53  estInit(&dest, S
240b0 52 54 5f 45 70 68 65 6d 54 61 62 2c 20 70 49 74  RT_EphemTab, pIt
240c0 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20  em->iCursor);.  
240d0 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e      explainSetIn
240e0 74 65 67 65 72 28 70 49 74 65 6d 2d 3e 69 53 65  teger(pItem->iSe
240f0 6c 65 63 74 49 64 2c 20 28 75 38 29 70 50 61 72  lectId, (u8)pPar
24100 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49  se->iNextSelectI
24110 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  d);.      sqlite
24120 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
24130 70 53 75 62 2c 20 26 64 65 73 74 29 3b 0a 20 20  pSub, &dest);.  
24140 20 20 20 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d      pItem->pTab-
24150 3e 6e 52 6f 77 45 73 74 20 3d 20 28 75 6e 73 69  >nRowEst = (unsi
24160 67 6e 65 64 29 70 53 75 62 2d 3e 6e 53 65 6c 65  gned)pSub->nSele
24170 63 74 52 6f 77 3b 0a 20 20 20 20 20 20 69 66 28  ctRow;.      if(
24180 20 6f 6e 63 65 41 64 64 72 20 29 20 73 71 6c 69   onceAddr ) sqli
24190 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
241a0 76 2c 20 6f 6e 63 65 41 64 64 72 29 3b 0a 20 20  v, onceAddr);.  
241b0 20 20 20 20 72 65 74 41 64 64 72 20 3d 20 73 71      retAddr = sq
241c0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
241d0 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 70 49  v, OP_Return, pI
241e0 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b  tem->regReturn);
241f0 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
24200 6e 74 28 28 76 2c 20 22 65 6e 64 20 25 73 22 2c  nt((v, "end %s",
24210 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e   pItem->pTab->zN
24220 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  ame));.      sql
24230 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 31  ite3VdbeChangeP1
24240 28 76 2c 20 74 6f 70 41 64 64 72 2c 20 72 65 74  (v, topAddr, ret
24250 41 64 64 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  Addr);.      sql
24260 69 74 65 33 43 6c 65 61 72 54 65 6d 70 52 65 67  ite3ClearTempReg
24270 43 61 63 68 65 28 70 50 61 72 73 65 29 3b 0a 20  Cache(pParse);. 
24280 20 20 20 7d 0a 20 20 20 20 69 66 28 20 2f 2a 70     }.    if( /*p
24290 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 2a 2f  Parse->nErr ||*/
242a0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
242b0 64 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  d ){.      goto 
242c0 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
242d0 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 48  }.    pParse->nH
242e0 65 69 67 68 74 20 2d 3d 20 73 71 6c 69 74 65 33  eight -= sqlite3
242f0 53 65 6c 65 63 74 45 78 70 72 48 65 69 67 68 74  SelectExprHeight
24300 28 70 29 3b 0a 20 20 20 20 70 54 61 62 4c 69 73  (p);.    pTabLis
24310 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20  t = p->pSrc;.   
24320 20 69 66 28 20 21 49 67 6e 6f 72 61 62 6c 65 4f   if( !IgnorableO
24330 72 64 65 72 62 79 28 70 44 65 73 74 29 20 29 7b  rderby(pDest) ){
24340 0a 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 20  .      pOrderBy 
24350 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20  = p->pOrderBy;. 
24360 20 20 20 7d 0a 20 20 7d 0a 20 20 70 45 4c 69 73     }.  }.  pELis
24370 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 23  t = p->pEList;.#
24380 65 6e 64 69 66 0a 20 20 70 57 68 65 72 65 20 3d  endif.  pWhere =
24390 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20 70 47   p->pWhere;.  pG
243a0 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f  roupBy = p->pGro
243b0 75 70 42 79 3b 0a 20 20 70 48 61 76 69 6e 67 20  upBy;.  pHaving 
243c0 3d 20 70 2d 3e 70 48 61 76 69 6e 67 3b 0a 20 20  = p->pHaving;.  
243d0 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74  sDistinct.isTnct
243e0 20 3d 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20   = (p->selFlags 
243f0 26 20 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d  & SF_Distinct)!=
24400 30 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  0;..#ifndef SQLI
24410 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  TE_OMIT_COMPOUND
24420 5f 53 45 4c 45 43 54 0a 20 20 2f 2a 20 49 66 20  _SELECT.  /* If 
24430 74 68 65 72 65 20 69 73 20 61 72 65 20 61 20 73  there is are a s
24440 65 71 75 65 6e 63 65 20 6f 66 20 71 75 65 72 69  equence of queri
24450 65 73 2c 20 64 6f 20 74 68 65 20 65 61 72 6c 69  es, do the earli
24460 65 72 20 6f 6e 65 73 20 66 69 72 73 74 2e 0a 20  er ones first.. 
24470 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72   */.  if( p->pPr
24480 69 6f 72 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ior ){.    if( p
24490 2d 3e 70 52 69 67 68 74 6d 6f 73 74 3d 3d 30 20  ->pRightmost==0 
244a0 29 7b 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20  ){.      Select 
244b0 2a 70 4c 6f 6f 70 2c 20 2a 70 52 69 67 68 74 20  *pLoop, *pRight 
244c0 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 63  = 0;.      int c
244d0 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e  nt = 0;.      in
244e0 74 20 6d 78 53 65 6c 65 63 74 3b 0a 20 20 20 20  t mxSelect;.    
244f0 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 3b 20 70    for(pLoop=p; p
24500 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f  Loop; pLoop=pLoo
24510 70 2d 3e 70 50 72 69 6f 72 2c 20 63 6e 74 2b 2b  p->pPrior, cnt++
24520 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70  ){.        pLoop
24530 2d 3e 70 52 69 67 68 74 6d 6f 73 74 20 3d 20 70  ->pRightmost = p
24540 3b 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d  ;.        pLoop-
24550 3e 70 4e 65 78 74 20 3d 20 70 52 69 67 68 74 3b  >pNext = pRight;
24560 0a 20 20 20 20 20 20 20 20 70 52 69 67 68 74 20  .        pRight 
24570 3d 20 70 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 7d  = pLoop;.      }
24580 0a 20 20 20 20 20 20 6d 78 53 65 6c 65 63 74 20  .      mxSelect 
24590 3d 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c  = db->aLimit[SQL
245a0 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4d 50 4f 55  ITE_LIMIT_COMPOU
245b0 4e 44 5f 53 45 4c 45 43 54 5d 3b 0a 20 20 20 20  ND_SELECT];.    
245c0 20 20 69 66 28 20 6d 78 53 65 6c 65 63 74 20 26    if( mxSelect &
245d0 26 20 63 6e 74 3e 6d 78 53 65 6c 65 63 74 20 29  & cnt>mxSelect )
245e0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
245f0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
24600 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 74 65 72 6d  , "too many term
24610 73 20 69 6e 20 63 6f 6d 70 6f 75 6e 64 20 53 45  s in compound SE
24620 4c 45 43 54 22 29 3b 0a 20 20 20 20 20 20 20 20  LECT");.        
24630 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
24640 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
24650 20 20 20 72 63 20 3d 20 6d 75 6c 74 69 53 65 6c     rc = multiSel
24660 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 70  ect(pParse, p, p
24670 44 65 73 74 29 3b 0a 20 20 20 20 65 78 70 6c 61  Dest);.    expla
24680 69 6e 53 65 74 49 6e 74 65 67 65 72 28 70 50 61  inSetInteger(pPa
24690 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20  rse->iSelectId, 
246a0 69 52 65 73 74 6f 72 65 53 65 6c 65 63 74 49 64  iRestoreSelectId
246b0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  );.    return rc
246c0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
246d0 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 62  /* If there is b
246e0 6f 74 68 20 61 20 47 52 4f 55 50 20 42 59 20 61  oth a GROUP BY a
246f0 6e 64 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  nd an ORDER BY c
24700 6c 61 75 73 65 20 61 6e 64 20 74 68 65 79 20 61  lause and they a
24710 72 65 0a 20 20 2a 2a 20 69 64 65 6e 74 69 63 61  re.  ** identica
24720 6c 2c 20 74 68 65 6e 20 64 69 73 61 62 6c 65 20  l, then disable 
24730 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
24740 75 73 65 20 73 69 6e 63 65 20 74 68 65 20 47 52  use since the GR
24750 4f 55 50 20 42 59 0a 20 20 2a 2a 20 77 69 6c 6c  OUP BY.  ** will
24760 20 63 61 75 73 65 20 65 6c 65 6d 65 6e 74 73 20   cause elements 
24770 74 6f 20 63 6f 6d 65 20 6f 75 74 20 69 6e 20 74  to come out in t
24780 68 65 20 63 6f 72 72 65 63 74 20 6f 72 64 65 72  he correct order
24790 2e 20 20 54 68 69 73 20 69 73 0a 20 20 2a 2a 20  .  This is.  ** 
247a0 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  an optimization 
247b0 2d 20 74 68 65 20 63 6f 72 72 65 63 74 20 61 6e  - the correct an
247c0 73 77 65 72 20 73 68 6f 75 6c 64 20 72 65 73 75  swer should resu
247d0 6c 74 20 72 65 67 61 72 64 6c 65 73 73 2e 0a 20  lt regardless.. 
247e0 20 2a 2a 20 55 73 65 20 74 68 65 20 53 51 4c 49   ** Use the SQLI
247f0 54 45 5f 47 72 6f 75 70 42 79 4f 72 64 65 72 20  TE_GroupByOrder 
24800 66 6c 61 67 20 77 69 74 68 20 53 51 4c 49 54 45  flag with SQLITE
24810 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49  _TESTCTRL_OPTIMI
24820 5a 45 52 0a 20 20 2a 2a 20 74 6f 20 64 69 73 61  ZER.  ** to disa
24830 62 6c 65 20 74 68 69 73 20 6f 70 74 69 6d 69 7a  ble this optimiz
24840 61 74 69 6f 6e 20 66 6f 72 20 74 65 73 74 69 6e  ation for testin
24850 67 20 70 75 72 70 6f 73 65 73 2e 0a 20 20 2a 2f  g purposes..  */
24860 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78  .  if( sqlite3Ex
24870 70 72 4c 69 73 74 43 6f 6d 70 61 72 65 28 70 2d  prListCompare(p-
24880 3e 70 47 72 6f 75 70 42 79 2c 20 70 4f 72 64 65  >pGroupBy, pOrde
24890 72 42 79 2c 20 2d 31 29 3d 3d 30 0a 20 20 20 20  rBy, -1)==0.    
248a0 20 20 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61       && Optimiza
248b0 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20  tionEnabled(db, 
248c0 53 51 4c 49 54 45 5f 47 72 6f 75 70 42 79 4f 72  SQLITE_GroupByOr
248d0 64 65 72 29 20 29 7b 0a 20 20 20 20 70 4f 72 64  der) ){.    pOrd
248e0 65 72 42 79 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  erBy = 0;.  }.. 
248f0 20 2f 2a 20 49 66 20 74 68 65 20 71 75 65 72 79   /* If the query
24900 20 69 73 20 44 49 53 54 49 4e 43 54 20 77 69 74   is DISTINCT wit
24910 68 20 61 6e 20 4f 52 44 45 52 20 42 59 20 62 75  h an ORDER BY bu
24920 74 20 69 73 20 6e 6f 74 20 61 6e 20 61 67 67 72  t is not an aggr
24930 65 67 61 74 65 2c 20 61 6e 64 20 0a 20 20 2a 2a  egate, and .  **
24940 20 69 66 20 74 68 65 20 73 65 6c 65 63 74 2d 6c   if the select-l
24950 69 73 74 20 69 73 20 74 68 65 20 73 61 6d 65 20  ist is the same 
24960 61 73 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  as the ORDER BY 
24970 6c 69 73 74 2c 20 74 68 65 6e 20 74 68 69 73 20  list, then this 
24980 71 75 65 72 79 0a 20 20 2a 2a 20 63 61 6e 20 62  query.  ** can b
24990 65 20 72 65 77 72 69 74 74 65 6e 20 61 73 20 61  e rewritten as a
249a0 20 47 52 4f 55 50 20 42 59 2e 20 49 6e 20 6f 74   GROUP BY. In ot
249b0 68 65 72 20 77 6f 72 64 73 2c 20 74 68 69 73 3a  her words, this:
249c0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53  .  **.  **     S
249d0 45 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20 78  ELECT DISTINCT x
249e0 79 7a 20 46 52 4f 4d 20 2e 2e 2e 20 4f 52 44 45  yz FROM ... ORDE
249f0 52 20 42 59 20 78 79 7a 0a 20 20 2a 2a 0a 20 20  R BY xyz.  **.  
24a00 2a 2a 20 69 73 20 74 72 61 6e 73 66 6f 72 6d 65  ** is transforme
24a10 64 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  d to:.  **.  ** 
24a20 20 20 20 20 53 45 4c 45 43 54 20 78 79 7a 20 46      SELECT xyz F
24a30 52 4f 4d 20 2e 2e 2e 20 47 52 4f 55 50 20 42 59  ROM ... GROUP BY
24a40 20 78 79 7a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54   xyz.  **.  ** T
24a50 68 65 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20 69  he second form i
24a60 73 20 70 72 65 66 65 72 72 65 64 20 61 73 20 61  s preferred as a
24a70 20 73 69 6e 67 6c 65 20 69 6e 64 65 78 20 28 6f   single index (o
24a80 72 20 74 65 6d 70 2d 74 61 62 6c 65 29 20 6d 61  r temp-table) ma
24a90 79 20 62 65 20 0a 20 20 2a 2a 20 75 73 65 64 20  y be .  ** used 
24aa0 66 6f 72 20 62 6f 74 68 20 74 68 65 20 4f 52 44  for both the ORD
24ab0 45 52 20 42 59 20 61 6e 64 20 44 49 53 54 49 4e  ER BY and DISTIN
24ac0 43 54 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 41  CT processing. A
24ad0 73 20 6f 72 69 67 69 6e 61 6c 6c 79 20 0a 20 20  s originally .  
24ae0 2a 2a 20 77 72 69 74 74 65 6e 20 74 68 65 20 71  ** written the q
24af0 75 65 72 79 20 6d 75 73 74 20 75 73 65 20 61 20  uery must use a 
24b00 74 65 6d 70 2d 74 61 62 6c 65 20 66 6f 72 20 61  temp-table for a
24b10 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 66 20 74  t least one of t
24b20 68 65 20 4f 52 44 45 52 20 0a 20 20 2a 2a 20 42  he ORDER .  ** B
24b30 59 20 61 6e 64 20 44 49 53 54 49 4e 43 54 2c 20  Y and DISTINCT, 
24b40 61 6e 64 20 61 6e 20 69 6e 64 65 78 20 6f 72 20  and an index or 
24b50 73 65 70 61 72 61 74 65 20 74 65 6d 70 2d 74 61  separate temp-ta
24b60 62 6c 65 20 66 6f 72 20 74 68 65 20 6f 74 68 65  ble for the othe
24b70 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70  r..  */.  if( (p
24b80 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46  ->selFlags & (SF
24b90 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67  _Distinct|SF_Agg
24ba0 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 44 69 73  regate))==SF_Dis
24bb0 74 69 6e 63 74 20 0a 20 20 20 26 26 20 73 71 6c  tinct .   && sql
24bc0 69 74 65 33 45 78 70 72 4c 69 73 74 43 6f 6d 70  ite3ExprListComp
24bd0 61 72 65 28 70 4f 72 64 65 72 42 79 2c 20 70 2d  are(pOrderBy, p-
24be0 3e 70 45 4c 69 73 74 2c 20 2d 31 29 3d 3d 30 0a  >pEList, -1)==0.
24bf0 20 20 29 7b 0a 20 20 20 20 70 2d 3e 73 65 6c 46    ){.    p->selF
24c00 6c 61 67 73 20 26 3d 20 7e 53 46 5f 44 69 73 74  lags &= ~SF_Dist
24c10 69 6e 63 74 3b 0a 20 20 20 20 70 2d 3e 70 47 72  inct;.    p->pGr
24c20 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65 33 45  oupBy = sqlite3E
24c30 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70  xprListDup(db, p
24c40 2d 3e 70 45 4c 69 73 74 2c 20 30 29 3b 0a 20 20  ->pEList, 0);.  
24c50 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e    pGroupBy = p->
24c60 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 70 4f  pGroupBy;.    pO
24c70 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20  rderBy = 0;.    
24c80 2f 2a 20 4e 6f 74 69 63 65 20 74 68 61 74 20 65  /* Notice that e
24c90 76 65 6e 20 74 68 6f 75 67 68 74 20 53 46 5f 44  ven thought SF_D
24ca0 69 73 74 69 6e 63 74 20 68 61 73 20 62 65 65 6e  istinct has been
24cb0 20 63 6c 65 61 72 65 64 20 66 72 6f 6d 20 70 2d   cleared from p-
24cc0 3e 73 65 6c 46 6c 61 67 73 2c 0a 20 20 20 20 2a  >selFlags,.    *
24cd0 2a 20 74 68 65 20 73 44 69 73 74 69 6e 63 74 2e  * the sDistinct.
24ce0 69 73 54 6e 63 74 20 69 73 20 73 74 69 6c 6c 20  isTnct is still 
24cf0 73 65 74 2e 20 20 48 65 6e 63 65 2c 20 69 73 54  set.  Hence, isT
24d00 6e 63 74 20 72 65 70 72 65 73 65 6e 74 73 20 74  nct represents t
24d10 68 65 0a 20 20 20 20 2a 2a 20 6f 72 69 67 69 6e  he.    ** origin
24d20 61 6c 20 73 65 74 74 69 6e 67 20 6f 66 20 74 68  al setting of th
24d30 65 20 53 46 5f 44 69 73 74 69 6e 63 74 20 66 6c  e SF_Distinct fl
24d40 61 67 2c 20 6e 6f 74 20 74 68 65 20 63 75 72 72  ag, not the curr
24d50 65 6e 74 20 73 65 74 74 69 6e 67 20 2a 2f 0a 20  ent setting */. 
24d60 20 20 20 61 73 73 65 72 74 28 20 73 44 69 73 74     assert( sDist
24d70 69 6e 63 74 2e 69 73 54 6e 63 74 20 29 3b 0a 20  inct.isTnct );. 
24d80 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72   }..  /* If ther
24d90 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59  e is an ORDER BY
24da0 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 74 68   clause, then th
24db0 69 73 20 73 6f 72 74 69 6e 67 0a 20 20 2a 2a 20  is sorting.  ** 
24dc0 69 6e 64 65 78 20 6d 69 67 68 74 20 65 6e 64 20  index might end 
24dd0 75 70 20 62 65 69 6e 67 20 75 6e 75 73 65 64 20  up being unused 
24de0 69 66 20 74 68 65 20 64 61 74 61 20 63 61 6e 20  if the data can 
24df0 62 65 20 0a 20 20 2a 2a 20 65 78 74 72 61 63 74  be .  ** extract
24e00 65 64 20 69 6e 20 70 72 65 2d 73 6f 72 74 65 64  ed in pre-sorted
24e10 20 6f 72 64 65 72 2e 20 20 49 66 20 74 68 61 74   order.  If that
24e20 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68   is the case, th
24e30 65 6e 20 74 68 65 0a 20 20 2a 2a 20 4f 50 5f 4f  en the.  ** OP_O
24e40 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e 73  penEphemeral ins
24e50 74 72 75 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65  truction will be
24e60 20 63 68 61 6e 67 65 64 20 74 6f 20 61 6e 20 4f   changed to an O
24e70 50 5f 4e 6f 6f 70 20 6f 6e 63 65 0a 20 20 2a 2a  P_Noop once.  **
24e80 20 77 65 20 66 69 67 75 72 65 20 6f 75 74 20 74   we figure out t
24e90 68 61 74 20 74 68 65 20 73 6f 72 74 69 6e 67 20  hat the sorting 
24ea0 69 6e 64 65 78 20 69 73 20 6e 6f 74 20 6e 65 65  index is not nee
24eb0 64 65 64 2e 20 20 54 68 65 20 61 64 64 72 53 6f  ded.  The addrSo
24ec0 72 74 49 6e 64 65 78 0a 20 20 2a 2a 20 76 61 72  rtIndex.  ** var
24ed0 69 61 62 6c 65 20 69 73 20 75 73 65 64 20 74 6f  iable is used to
24ee0 20 66 61 63 69 6c 69 74 61 74 65 20 74 68 61 74   facilitate that
24ef0 20 63 68 61 6e 67 65 2e 0a 20 20 2a 2f 0a 20 20   change..  */.  
24f00 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a  if( pOrderBy ){.
24f10 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65      KeyInfo *pKe
24f20 79 49 6e 66 6f 3b 0a 20 20 20 20 70 4b 65 79 49  yInfo;.    pKeyI
24f30 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f  nfo = keyInfoFro
24f40 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  mExprList(pParse
24f50 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20  , pOrderBy);.   
24f60 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72   pOrderBy->iECur
24f70 73 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  sor = pParse->nT
24f80 61 62 2b 2b 3b 0a 20 20 20 20 70 2d 3e 61 64 64  ab++;.    p->add
24f90 72 4f 70 65 6e 45 70 68 6d 5b 32 5d 20 3d 20 61  rOpenEphm[2] = a
24fa0 64 64 72 53 6f 72 74 49 6e 64 65 78 20 3d 0a 20  ddrSortIndex =. 
24fb0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
24fc0 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65  AddOp4(v, OP_Ope
24fd0 6e 45 70 68 65 6d 65 72 61 6c 2c 0a 20 20 20 20  nEphemeral,.    
24fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24ff0 20 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 2d         pOrderBy-
25000 3e 69 45 43 75 72 73 6f 72 2c 20 70 4f 72 64 65  >iECursor, pOrde
25010 72 42 79 2d 3e 6e 45 78 70 72 2b 32 2c 20 30 2c  rBy->nExpr+2, 0,
25020 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
25030 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
25040 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f  r*)pKeyInfo, P4_
25050 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29  KEYINFO_HANDOFF)
25060 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
25070 64 64 72 53 6f 72 74 49 6e 64 65 78 20 3d 20 2d  ddrSortIndex = -
25080 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  1;.  }..  /* If 
25090 74 68 65 20 6f 75 74 70 75 74 20 69 73 20 64 65  the output is de
250a0 73 74 69 6e 65 64 20 66 6f 72 20 61 20 74 65 6d  stined for a tem
250b0 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 6f 70  porary table, op
250c0 65 6e 20 74 68 61 74 20 74 61 62 6c 65 2e 0a 20  en that table.. 
250d0 20 2a 2f 0a 20 20 69 66 28 20 70 44 65 73 74 2d   */.  if( pDest-
250e0 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45 70 68 65  >eDest==SRT_Ephe
250f0 6d 54 61 62 20 29 7b 0a 20 20 20 20 73 71 6c 69  mTab ){.    sqli
25100 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
25110 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
25120 6c 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72  l, pDest->iSDPar
25130 6d 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  m, pEList->nExpr
25140 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74  );.  }..  /* Set
25150 20 74 68 65 20 6c 69 6d 69 74 65 72 2e 0a 20 20   the limiter..  
25160 2a 2f 0a 20 20 69 45 6e 64 20 3d 20 73 71 6c 69  */.  iEnd = sqli
25170 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
25180 28 76 29 3b 0a 20 20 70 2d 3e 6e 53 65 6c 65 63  (v);.  p->nSelec
25190 74 52 6f 77 20 3d 20 4c 41 52 47 45 53 54 5f 49  tRow = LARGEST_I
251a0 4e 54 36 34 3b 0a 20 20 63 6f 6d 70 75 74 65 4c  NT64;.  computeL
251b0 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50  imitRegisters(pP
251c0 61 72 73 65 2c 20 70 2c 20 69 45 6e 64 29 3b 0a  arse, p, iEnd);.
251d0 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 3d    if( p->iLimit=
251e0 3d 30 20 26 26 20 61 64 64 72 53 6f 72 74 49 6e  =0 && addrSortIn
251f0 64 65 78 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71  dex>=0 ){.    sq
25200 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 76  lite3VdbeGetOp(v
25210 2c 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78 29  , addrSortIndex)
25220 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 53 6f  ->opcode = OP_So
25230 72 74 65 72 4f 70 65 6e 3b 0a 20 20 20 20 70 2d  rterOpen;.    p-
25240 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f  >selFlags |= SF_
25250 55 73 65 53 6f 72 74 65 72 3b 0a 20 20 7d 0a 0a  UseSorter;.  }..
25260 20 20 2f 2a 20 4f 70 65 6e 20 61 20 76 69 72 74    /* Open a virt
25270 75 61 6c 20 69 6e 64 65 78 20 74 6f 20 75 73 65  ual index to use
25280 20 66 6f 72 20 74 68 65 20 64 69 73 74 69 6e 63   for the distinc
25290 74 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  t set..  */.  if
252a0 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ( p->selFlags & 
252b0 53 46 5f 44 69 73 74 69 6e 63 74 20 29 7b 0a 20  SF_Distinct ){. 
252c0 20 20 20 73 44 69 73 74 69 6e 63 74 2e 74 61 62     sDistinct.tab
252d0 54 6e 63 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e  Tnct = pParse->n
252e0 54 61 62 2b 2b 3b 0a 20 20 20 20 73 44 69 73 74  Tab++;.    sDist
252f0 69 6e 63 74 2e 61 64 64 72 54 6e 63 74 20 3d 20  inct.addrTnct = 
25300 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
25310 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65  4(v, OP_OpenEphe
25320 6d 65 72 61 6c 2c 0a 20 20 20 20 20 20 20 20 20  meral,.         
25330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25340 20 20 20 20 20 20 20 73 44 69 73 74 69 6e 63 74         sDistinct
25350 2e 74 61 62 54 6e 63 74 2c 20 30 2c 20 30 2c 0a  .tabTnct, 0, 0,.
25360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25380 28 63 68 61 72 2a 29 6b 65 79 49 6e 66 6f 46 72  (char*)keyInfoFr
25390 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  omExprList(pPars
253a0 65 2c 20 70 2d 3e 70 45 4c 69 73 74 29 2c 0a 20  e, p->pEList),. 
253b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
253c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50                 P
253d0 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46  4_KEYINFO_HANDOF
253e0 46 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  F);.    sqlite3V
253f0 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 42  dbeChangeP5(v, B
25400 54 52 45 45 5f 55 4e 4f 52 44 45 52 45 44 29 3b  TREE_UNORDERED);
25410 0a 20 20 20 20 73 44 69 73 74 69 6e 63 74 2e 65  .    sDistinct.e
25420 54 6e 63 74 54 79 70 65 20 3d 20 57 48 45 52 45  TnctType = WHERE
25430 5f 44 49 53 54 49 4e 43 54 5f 55 4e 4f 52 44 45  _DISTINCT_UNORDE
25440 52 45 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  RED;.  }else{.  
25450 20 20 73 44 69 73 74 69 6e 63 74 2e 65 54 6e 63    sDistinct.eTnc
25460 74 54 79 70 65 20 3d 20 57 48 45 52 45 5f 44 49  tType = WHERE_DI
25470 53 54 49 4e 43 54 5f 4e 4f 4f 50 3b 0a 20 20 7d  STINCT_NOOP;.  }
25480 0a 0a 20 20 69 66 28 20 21 69 73 41 67 67 20 26  ..  if( !isAgg &
25490 26 20 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 7b  & pGroupBy==0 ){
254a0 0a 20 20 20 20 2f 2a 20 4e 6f 20 61 67 67 72 65  .    /* No aggre
254b0 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 61  gate functions a
254c0 6e 64 20 6e 6f 20 47 52 4f 55 50 20 42 59 20 63  nd no GROUP BY c
254d0 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 75 31 36  lause */.    u16
254e0 20 77 63 74 72 6c 46 6c 61 67 73 20 3d 20 28 73   wctrlFlags = (s
254f0 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20  Distinct.isTnct 
25500 3f 20 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53  ? WHERE_WANT_DIS
25510 54 49 4e 43 54 20 3a 20 30 29 3b 0a 0a 20 20 20  TINCT : 0);..   
25520 20 2f 2a 20 42 65 67 69 6e 20 74 68 65 20 64 61   /* Begin the da
25530 74 61 62 61 73 65 20 73 63 61 6e 2e 20 2a 2f 0a  tabase scan. */.
25540 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c      pWInfo = sql
25550 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 70  ite3WhereBegin(p
25560 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c  Parse, pTabList,
25570 20 70 57 68 65 72 65 2c 20 70 4f 72 64 65 72 42   pWhere, pOrderB
25580 79 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 0a 20 20  y, p->pEList,.  
25590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
255a0 20 20 20 20 20 20 20 20 20 20 20 20 20 77 63 74               wct
255b0 72 6c 46 6c 61 67 73 2c 20 30 29 3b 0a 20 20 20  rlFlags, 0);.   
255c0 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29   if( pWInfo==0 )
255d0 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
255e0 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
255f0 33 57 68 65 72 65 4f 75 74 70 75 74 52 6f 77 43  3WhereOutputRowC
25600 6f 75 6e 74 28 70 57 49 6e 66 6f 29 20 3c 20 70  ount(pWInfo) < p
25610 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 29 7b 0a  ->nSelectRow ){.
25620 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74        p->nSelect
25630 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 57 68 65  Row = sqlite3Whe
25640 72 65 4f 75 74 70 75 74 52 6f 77 43 6f 75 6e 74  reOutputRowCount
25650 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 0a  (pWInfo);.    }.
25660 20 20 20 20 69 66 28 20 73 44 69 73 74 69 6e 63      if( sDistinc
25670 74 2e 69 73 54 6e 63 74 20 26 26 20 73 71 6c 69  t.isTnct && sqli
25680 74 65 33 57 68 65 72 65 49 73 44 69 73 74 69 6e  te3WhereIsDistin
25690 63 74 28 70 57 49 6e 66 6f 29 20 29 7b 0a 20 20  ct(pWInfo) ){.  
256a0 20 20 20 20 73 44 69 73 74 69 6e 63 74 2e 65 54      sDistinct.eT
256b0 6e 63 74 54 79 70 65 20 3d 20 73 71 6c 69 74 65  nctType = sqlite
256c0 33 57 68 65 72 65 49 73 44 69 73 74 69 6e 63 74  3WhereIsDistinct
256d0 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 0a  (pWInfo);.    }.
256e0 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79      if( pOrderBy
256f0 20 26 26 20 73 71 6c 69 74 65 33 57 68 65 72 65   && sqlite3Where
25700 49 73 4f 72 64 65 72 65 64 28 70 57 49 6e 66 6f  IsOrdered(pWInfo
25710 29 20 29 20 70 4f 72 64 65 72 42 79 20 3d 20 30  ) ) pOrderBy = 0
25720 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 73 6f 72  ;..    /* If sor
25730 74 69 6e 67 20 69 6e 64 65 78 20 74 68 61 74 20  ting index that 
25740 77 61 73 20 63 72 65 61 74 65 64 20 62 79 20 61  was created by a
25750 20 70 72 69 6f 72 20 4f 50 5f 4f 70 65 6e 45 70   prior OP_OpenEp
25760 68 65 6d 65 72 61 6c 20 0a 20 20 20 20 2a 2a 20  hemeral .    ** 
25770 69 6e 73 74 72 75 63 74 69 6f 6e 20 65 6e 64 65  instruction ende
25780 64 20 75 70 20 6e 6f 74 20 62 65 69 6e 67 20 6e  d up not being n
25790 65 65 64 65 64 2c 20 74 68 65 6e 20 63 68 61 6e  eeded, then chan
257a0 67 65 20 74 68 65 20 4f 50 5f 4f 70 65 6e 45 70  ge the OP_OpenEp
257b0 68 65 6d 65 72 61 6c 0a 20 20 20 20 2a 2a 20 69  hemeral.    ** i
257c0 6e 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 2e 0a  nto an OP_Noop..
257d0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 61      */.    if( a
257e0 64 64 72 53 6f 72 74 49 6e 64 65 78 3e 3d 30 20  ddrSortIndex>=0 
257f0 26 26 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 29  && pOrderBy==0 )
25800 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
25810 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28  dbeChangeToNoop(
25820 76 2c 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78  v, addrSortIndex
25830 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64 64 72  );.      p->addr
25840 4f 70 65 6e 45 70 68 6d 5b 32 5d 20 3d 20 2d 31  OpenEphm[2] = -1
25850 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
25860 55 73 65 20 74 68 65 20 73 74 61 6e 64 61 72 64  Use the standard
25870 20 69 6e 6e 65 72 20 6c 6f 6f 70 2e 20 2a 2f 0a   inner loop. */.
25880 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c      selectInnerL
25890 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70  oop(pParse, p, p
258a0 45 4c 69 73 74 2c 20 30 2c 20 30 2c 20 70 4f 72  EList, 0, 0, pOr
258b0 64 65 72 42 79 2c 20 26 73 44 69 73 74 69 6e 63  derBy, &sDistinc
258c0 74 2c 20 70 44 65 73 74 2c 0a 20 20 20 20 20 20  t, pDest,.      
258d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
258e0 6c 69 74 65 33 57 68 65 72 65 43 6f 6e 74 69 6e  lite3WhereContin
258f0 75 65 4c 61 62 65 6c 28 70 57 49 6e 66 6f 29 2c  ueLabel(pWInfo),
25900 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
25910 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72       sqlite3Wher
25920 65 42 72 65 61 6b 4c 61 62 65 6c 28 70 57 49 6e  eBreakLabel(pWIn
25930 66 6f 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 6e  fo));..    /* En
25940 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  d the database s
25950 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f  can loop..    */
25960 0a 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72  .    sqlite3Wher
25970 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20  eEnd(pWInfo);.  
25980 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68  }else{.    /* Th
25990 69 73 20 63 61 73 65 20 77 68 65 6e 20 74 68 65  is case when the
259a0 72 65 20 65 78 69 73 74 20 61 67 67 72 65 67 61  re exist aggrega
259b0 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 6f 72 20  te functions or 
259c0 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  a GROUP BY claus
259d0 65 0a 20 20 20 20 2a 2a 20 6f 72 20 62 6f 74 68  e.    ** or both
259e0 20 2a 2f 0a 20 20 20 20 4e 61 6d 65 43 6f 6e 74   */.    NameCont
259f0 65 78 74 20 73 4e 43 3b 20 20 20 20 2f 2a 20 4e  ext sNC;    /* N
25a00 61 6d 65 20 63 6f 6e 74 65 78 74 20 66 6f 72 20  ame context for 
25a10 70 72 6f 63 65 73 73 69 6e 67 20 61 67 67 72 65  processing aggre
25a20 67 61 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  gate information
25a30 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 41 4d 65   */.    int iAMe
25a40 6d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  m;          /* F
25a50 69 72 73 74 20 4d 65 6d 20 61 64 64 72 65 73 73  irst Mem address
25a60 20 66 6f 72 20 73 74 6f 72 69 6e 67 20 63 75 72   for storing cur
25a70 72 65 6e 74 20 47 52 4f 55 50 20 42 59 20 2a 2f  rent GROUP BY */
25a80 0a 20 20 20 20 69 6e 74 20 69 42 4d 65 6d 3b 20  .    int iBMem; 
25a90 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
25aa0 74 20 4d 65 6d 20 61 64 64 72 65 73 73 20 66 6f  t Mem address fo
25ab0 72 20 70 72 65 76 69 6f 75 73 20 47 52 4f 55 50  r previous GROUP
25ac0 20 42 59 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69   BY */.    int i
25ad0 55 73 65 46 6c 61 67 3b 20 20 20 20 20 20 20 2f  UseFlag;       /
25ae0 2a 20 4d 65 6d 20 61 64 64 72 65 73 73 20 68 6f  * Mem address ho
25af0 6c 64 69 6e 67 20 66 6c 61 67 20 69 6e 64 69 63  lding flag indic
25b00 61 74 69 6e 67 20 74 68 61 74 20 61 74 20 6c 65  ating that at le
25b10 61 73 74 0a 20 20 20 20 20 20 20 20 20 20 20 20  ast.            
25b20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f              ** o
25b30 6e 65 20 72 6f 77 20 6f 66 20 74 68 65 20 69 6e  ne row of the in
25b40 70 75 74 20 74 6f 20 74 68 65 20 61 67 67 72 65  put to the aggre
25b50 67 61 74 6f 72 20 68 61 73 20 62 65 65 6e 0a 20  gator has been. 
25b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25b70 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73         ** proces
25b80 73 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  sed */.    int i
25b90 41 62 6f 72 74 46 6c 61 67 3b 20 20 20 20 20 2f  AbortFlag;     /
25ba0 2a 20 4d 65 6d 20 61 64 64 72 65 73 73 20 77 68  * Mem address wh
25bb0 69 63 68 20 63 61 75 73 65 73 20 71 75 65 72 79  ich causes query
25bc0 20 61 62 6f 72 74 20 69 66 20 70 6f 73 69 74 69   abort if positi
25bd0 76 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 67 72  ve */.    int gr
25be0 6f 75 70 42 79 53 6f 72 74 3b 20 20 20 20 2f 2a  oupBySort;    /*
25bf0 20 52 6f 77 73 20 63 6f 6d 65 20 66 72 6f 6d 20   Rows come from 
25c00 73 6f 75 72 63 65 20 69 6e 20 47 52 4f 55 50 20  source in GROUP 
25c10 42 59 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20  BY order */.    
25c20 69 6e 74 20 61 64 64 72 45 6e 64 3b 20 20 20 20  int addrEnd;    
25c30 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 70 72      /* End of pr
25c40 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 74 68 69  ocessing for thi
25c50 73 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20  s SELECT */.    
25c60 69 6e 74 20 73 6f 72 74 50 54 61 62 20 3d 20 30  int sortPTab = 0
25c70 3b 20 20 20 2f 2a 20 50 73 65 75 64 6f 74 61 62  ;   /* Pseudotab
25c80 6c 65 20 75 73 65 64 20 74 6f 20 64 65 63 6f 64  le used to decod
25c90 65 20 73 6f 72 74 69 6e 67 20 72 65 73 75 6c 74  e sorting result
25ca0 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 6f 72  s */.    int sor
25cb0 74 4f 75 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20  tOut = 0;    /* 
25cc0 4f 75 74 70 75 74 20 72 65 67 69 73 74 65 72 20  Output register 
25cd0 66 72 6f 6d 20 74 68 65 20 73 6f 72 74 65 72 20  from the sorter 
25ce0 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 65 6d 6f 76  */..    /* Remov
25cf0 65 20 61 6e 79 20 61 6e 64 20 61 6c 6c 20 61 6c  e any and all al
25d00 69 61 73 65 73 20 62 65 74 77 65 65 6e 20 74 68  iases between th
25d10 65 20 72 65 73 75 6c 74 20 73 65 74 20 61 6e 64  e result set and
25d20 20 74 68 65 0a 20 20 20 20 2a 2a 20 47 52 4f 55   the.    ** GROU
25d30 50 20 42 59 20 63 6c 61 75 73 65 2e 0a 20 20 20  P BY clause..   
25d40 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 47 72 6f   */.    if( pGro
25d50 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20 69 6e  upBy ){.      in
25d60 74 20 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  t k;            
25d70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
25d80 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
25d90 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72       struct Expr
25da0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
25db0 3b 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e  ;  /* For loopin
25dc0 67 20 6f 76 65 72 20 65 78 70 72 65 73 73 69 6f  g over expressio
25dd0 6e 20 69 6e 20 61 20 6c 69 73 74 20 2a 2f 0a 0a  n in a list */..
25de0 20 20 20 20 20 20 66 6f 72 28 6b 3d 70 2d 3e 70        for(k=p->p
25df0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70 49  EList->nExpr, pI
25e00 74 65 6d 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 61  tem=p->pEList->a
25e10 3b 20 6b 3e 30 3b 20 6b 2d 2d 2c 20 70 49 74 65  ; k>0; k--, pIte
25e20 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 49  m++){.        pI
25e30 74 65 6d 2d 3e 69 41 6c 69 61 73 20 3d 20 30 3b  tem->iAlias = 0;
25e40 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
25e50 6f 72 28 6b 3d 70 47 72 6f 75 70 42 79 2d 3e 6e  or(k=pGroupBy->n
25e60 45 78 70 72 2c 20 70 49 74 65 6d 3d 70 47 72 6f  Expr, pItem=pGro
25e70 75 70 42 79 2d 3e 61 3b 20 6b 3e 30 3b 20 6b 2d  upBy->a; k>0; k-
25e80 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  -, pItem++){.   
25e90 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 41 6c 69       pItem->iAli
25ea0 61 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  as = 0;.      }.
25eb0 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 53 65        if( p->nSe
25ec0 6c 65 63 74 52 6f 77 3e 31 30 30 20 29 20 70 2d  lectRow>100 ) p-
25ed0 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 31 30  >nSelectRow = 10
25ee0 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
25ef0 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f      p->nSelectRo
25f00 77 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 0a  w = 1;.    }.. .
25f10 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 61 20      /* Create a 
25f20 6c 61 62 65 6c 20 74 6f 20 6a 75 6d 70 20 74 6f  label to jump to
25f30 20 77 68 65 6e 20 77 65 20 77 61 6e 74 20 74 6f   when we want to
25f40 20 61 62 6f 72 74 20 74 68 65 20 71 75 65 72 79   abort the query
25f50 20 2a 2f 0a 20 20 20 20 61 64 64 72 45 6e 64 20   */.    addrEnd 
25f60 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
25f70 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 20 20  eLabel(v);..    
25f80 2f 2a 20 43 6f 6e 76 65 72 74 20 54 4b 5f 43 4f  /* Convert TK_CO
25f90 4c 55 4d 4e 20 6e 6f 64 65 73 20 69 6e 74 6f 20  LUMN nodes into 
25fa0 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 61 6e  TK_AGG_COLUMN an
25fb0 64 20 6d 61 6b 65 20 65 6e 74 72 69 65 73 20 69  d make entries i
25fc0 6e 0a 20 20 20 20 2a 2a 20 73 41 67 67 49 6e 66  n.    ** sAggInf
25fd0 6f 20 66 6f 72 20 61 6c 6c 20 54 4b 5f 41 47 47  o for all TK_AGG
25fe0 5f 46 55 4e 43 54 49 4f 4e 20 6e 6f 64 65 73 20  _FUNCTION nodes 
25ff0 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6f  in expressions o
26000 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 53 45 4c  f the.    ** SEL
26010 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20  ECT statement.. 
26020 20 20 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74     */.    memset
26030 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66  (&sNC, 0, sizeof
26040 28 73 4e 43 29 29 3b 0a 20 20 20 20 73 4e 43 2e  (sNC));.    sNC.
26050 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b  pParse = pParse;
26060 0a 20 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73  .    sNC.pSrcLis
26070 74 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20 20  t = pTabList;.  
26080 20 20 73 4e 43 2e 70 41 67 67 49 6e 66 6f 20 3d    sNC.pAggInfo =
26090 20 26 73 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20   &sAggInfo;.    
260a0 73 41 67 67 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e  sAggInfo.nSortin
260b0 67 43 6f 6c 75 6d 6e 20 3d 20 70 47 72 6f 75 70  gColumn = pGroup
260c0 42 79 20 3f 20 70 47 72 6f 75 70 42 79 2d 3e 6e  By ? pGroupBy->n
260d0 45 78 70 72 2b 31 20 3a 20 30 3b 0a 20 20 20 20  Expr+1 : 0;.    
260e0 73 41 67 67 49 6e 66 6f 2e 70 47 72 6f 75 70 42  sAggInfo.pGroupB
260f0 79 20 3d 20 70 47 72 6f 75 70 42 79 3b 0a 20 20  y = pGroupBy;.  
26100 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61    sqlite3ExprAna
26110 6c 79 7a 65 41 67 67 4c 69 73 74 28 26 73 4e 43  lyzeAggList(&sNC
26120 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73  , pEList);.    s
26130 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
26140 65 41 67 67 4c 69 73 74 28 26 73 4e 43 2c 20 70  eAggList(&sNC, p
26150 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 69 66  OrderBy);.    if
26160 28 20 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20  ( pHaving ){.   
26170 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e     sqlite3ExprAn
26180 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28  alyzeAggregates(
26190 26 73 4e 43 2c 20 70 48 61 76 69 6e 67 29 3b 0a  &sNC, pHaving);.
261a0 20 20 20 20 7d 0a 20 20 20 20 73 41 67 67 49 6e      }.    sAggIn
261b0 66 6f 2e 6e 41 63 63 75 6d 75 6c 61 74 6f 72 20  fo.nAccumulator 
261c0 3d 20 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75  = sAggInfo.nColu
261d0 6d 6e 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  mn;.    for(i=0;
261e0 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 46 75 6e   i<sAggInfo.nFun
261f0 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61  c; i++){.      a
26200 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
26210 72 6f 70 65 72 74 79 28 73 41 67 67 49 6e 66 6f  roperty(sAggInfo
26220 2e 61 46 75 6e 63 5b 69 5d 2e 70 45 78 70 72 2c  .aFunc[i].pExpr,
26230 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
26240 3b 0a 20 20 20 20 20 20 73 4e 43 2e 6e 63 46 6c  ;.      sNC.ncFl
26250 61 67 73 20 7c 3d 20 4e 43 5f 49 6e 41 67 67 46  ags |= NC_InAggF
26260 75 6e 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  unc;.      sqlit
26270 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
26280 4c 69 73 74 28 26 73 4e 43 2c 20 73 41 67 67 49  List(&sNC, sAggI
26290 6e 66 6f 2e 61 46 75 6e 63 5b 69 5d 2e 70 45 78  nfo.aFunc[i].pEx
262a0 70 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20  pr->x.pList);.  
262b0 20 20 20 20 73 4e 43 2e 6e 63 46 6c 61 67 73 20      sNC.ncFlags 
262c0 26 3d 20 7e 4e 43 5f 49 6e 41 67 67 46 75 6e 63  &= ~NC_InAggFunc
262d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
262e0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
262f0 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65   ) goto select_e
26300 6e 64 3b 0a 0a 20 20 20 20 2f 2a 20 50 72 6f 63  nd;..    /* Proc
26310 65 73 73 69 6e 67 20 66 6f 72 20 61 67 67 72 65  essing for aggre
26320 67 61 74 65 73 20 77 69 74 68 20 47 52 4f 55 50  gates with GROUP
26330 20 42 59 20 69 73 20 76 65 72 79 20 64 69 66 66   BY is very diff
26340 65 72 65 6e 74 20 61 6e 64 0a 20 20 20 20 2a 2a  erent and.    **
26350 20 6d 75 63 68 20 6d 6f 72 65 20 63 6f 6d 70 6c   much more compl
26360 65 78 20 74 68 61 6e 20 61 67 67 72 65 67 61 74  ex than aggregat
26370 65 73 20 77 69 74 68 6f 75 74 20 61 20 47 52 4f  es without a GRO
26380 55 50 20 42 59 2e 0a 20 20 20 20 2a 2f 0a 20 20  UP BY..    */.  
26390 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 20 29    if( pGroupBy )
263a0 7b 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20  {.      KeyInfo 
263b0 2a 70 4b 65 79 49 6e 66 6f 3b 20 20 2f 2a 20 4b  *pKeyInfo;  /* K
263c0 65 79 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f  eying informatio
263d0 6e 20 66 6f 72 20 74 68 65 20 67 72 6f 75 70 20  n for the group 
263e0 62 79 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20  by clause */.   
263f0 20 20 20 69 6e 74 20 6a 31 3b 20 20 20 20 20 20     int j1;      
26400 20 20 20 20 20 20 20 2f 2a 20 41 2d 76 73 2d 42         /* A-vs-B
26410 20 63 6f 6d 70 61 72 69 73 69 6f 6e 20 6a 75 6d   comparision jum
26420 70 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61  p */.      int a
26430 64 64 72 4f 75 74 70 75 74 52 6f 77 3b 20 20 2f  ddrOutputRow;  /
26440 2a 20 53 74 61 72 74 20 6f 66 20 73 75 62 72 6f  * Start of subro
26450 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75  utine that outpu
26460 74 73 20 61 20 72 65 73 75 6c 74 20 72 6f 77 20  ts a result row 
26470 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67  */.      int reg
26480 4f 75 74 70 75 74 52 6f 77 3b 20 20 20 2f 2a 20  OutputRow;   /* 
26490 52 65 74 75 72 6e 20 61 64 64 72 65 73 73 20 72  Return address r
264a0 65 67 69 73 74 65 72 20 66 6f 72 20 6f 75 74 70  egister for outp
264b0 75 74 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f  ut subroutine */
264c0 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 53  .      int addrS
264d0 65 74 41 62 6f 72 74 3b 20 20 20 2f 2a 20 53 65  etAbort;   /* Se
264e0 74 20 74 68 65 20 61 62 6f 72 74 20 66 6c 61 67  t the abort flag
264f0 20 61 6e 64 20 72 65 74 75 72 6e 20 2a 2f 0a 20   and return */. 
26500 20 20 20 20 20 69 6e 74 20 61 64 64 72 54 6f 70       int addrTop
26510 4f 66 4c 6f 6f 70 3b 20 20 2f 2a 20 54 6f 70 20  OfLoop;  /* Top 
26520 6f 66 20 74 68 65 20 69 6e 70 75 74 20 6c 6f 6f  of the input loo
26530 70 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61  p */.      int a
26540 64 64 72 53 6f 72 74 69 6e 67 49 64 78 3b 20 2f  ddrSortingIdx; /
26550 2a 20 54 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68  * The OP_OpenEph
26560 65 6d 65 72 61 6c 20 66 6f 72 20 74 68 65 20 73  emeral for the s
26570 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 2a 2f 0a  orting index */.
26580 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 52 65        int addrRe
26590 73 65 74 3b 20 20 20 20 20 20 2f 2a 20 53 75 62  set;      /* Sub
265a0 72 6f 75 74 69 6e 65 20 66 6f 72 20 72 65 73 65  routine for rese
265b0 74 74 69 6e 67 20 74 68 65 20 61 63 63 75 6d 75  tting the accumu
265c0 6c 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 69  lator */.      i
265d0 6e 74 20 72 65 67 52 65 73 65 74 3b 20 20 20 20  nt regReset;    
265e0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 61 64 64     /* Return add
265f0 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66 6f  ress register fo
26600 72 20 72 65 73 65 74 20 73 75 62 72 6f 75 74 69  r reset subrouti
26610 6e 65 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20  ne */..      /* 
26620 49 66 20 74 68 65 72 65 20 69 73 20 61 20 47 52  If there is a GR
26630 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 77 65  OUP BY clause we
26640 20 6d 69 67 68 74 20 6e 65 65 64 20 61 20 73 6f   might need a so
26650 72 74 69 6e 67 20 69 6e 64 65 78 20 74 6f 0a 20  rting index to. 
26660 20 20 20 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e       ** implemen
26670 74 20 69 74 2e 20 20 41 6c 6c 6f 63 61 74 65 20  t it.  Allocate 
26680 74 68 61 74 20 73 6f 72 74 69 6e 67 20 69 6e 64  that sorting ind
26690 65 78 20 6e 6f 77 2e 20 20 49 66 20 69 74 20 74  ex now.  If it t
266a0 75 72 6e 73 20 6f 75 74 0a 20 20 20 20 20 20 2a  urns out.      *
266b0 2a 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74  * that we do not
266c0 20 6e 65 65 64 20 69 74 20 61 66 74 65 72 20 61   need it after a
266d0 6c 6c 2c 20 74 68 65 20 4f 50 5f 53 6f 72 74 65  ll, the OP_Sorte
266e0 72 4f 70 65 6e 20 69 6e 73 74 72 75 63 74 69 6f  rOpen instructio
266f0 6e 0a 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20  n.      ** will 
26700 62 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74  be converted int
26710 6f 20 61 20 4e 6f 6f 70 2e 20 20 0a 20 20 20 20  o a Noop.  .    
26720 20 20 2a 2f 0a 20 20 20 20 20 20 73 41 67 67 49    */.      sAggI
26730 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 20 3d  nfo.sortingIdx =
26740 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
26750 0a 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 20  .      pKeyInfo 
26760 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70  = keyInfoFromExp
26770 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 47  rList(pParse, pG
26780 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 20 20 61  roupBy);.      a
26790 64 64 72 53 6f 72 74 69 6e 67 49 64 78 20 3d 20  ddrSortingIdx = 
267a0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
267b0 34 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4f 70  4(v, OP_SorterOp
267c0 65 6e 2c 20 0a 20 20 20 20 20 20 20 20 20 20 73  en, .          s
267d0 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49  AggInfo.sortingI
267e0 64 78 2c 20 73 41 67 67 49 6e 66 6f 2e 6e 53 6f  dx, sAggInfo.nSo
267f0 72 74 69 6e 67 43 6f 6c 75 6d 6e 2c 20 0a 20 20  rtingColumn, .  
26800 20 20 20 20 20 20 20 20 30 2c 20 28 63 68 61 72          0, (char
26810 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b  *)pKeyInfo, P4_K
26820 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b  EYINFO_HANDOFF);
26830 0a 0a 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69  ..      /* Initi
26840 61 6c 69 7a 65 20 6d 65 6d 6f 72 79 20 6c 6f 63  alize memory loc
26850 61 74 69 6f 6e 73 20 75 73 65 64 20 62 79 20 47  ations used by G
26860 52 4f 55 50 20 42 59 20 61 67 67 72 65 67 61 74  ROUP BY aggregat
26870 65 20 70 72 6f 63 65 73 73 69 6e 67 0a 20 20 20  e processing.   
26880 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 55 73 65     */.      iUse
26890 46 6c 61 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d  Flag = ++pParse-
268a0 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 69 41 62  >nMem;.      iAb
268b0 6f 72 74 46 6c 61 67 20 3d 20 2b 2b 70 50 61 72  ortFlag = ++pPar
268c0 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
268d0 72 65 67 4f 75 74 70 75 74 52 6f 77 20 3d 20 2b  regOutputRow = +
268e0 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
268f0 20 20 20 20 20 61 64 64 72 4f 75 74 70 75 74 52       addrOutputR
26900 6f 77 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ow = sqlite3Vdbe
26910 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
26920 20 20 20 20 72 65 67 52 65 73 65 74 20 3d 20 2b      regReset = +
26930 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
26940 20 20 20 20 20 61 64 64 72 52 65 73 65 74 20 3d       addrReset =
26950 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
26960 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
26970 69 41 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e  iAMem = pParse->
26980 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 20 20 20 20  nMem + 1;.      
26990 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20  pParse->nMem += 
269a0 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b  pGroupBy->nExpr;
269b0 0a 20 20 20 20 20 20 69 42 4d 65 6d 20 3d 20 70  .      iBMem = p
269c0 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b  Parse->nMem + 1;
269d0 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
269e0 4d 65 6d 20 2b 3d 20 70 47 72 6f 75 70 42 79 2d  Mem += pGroupBy-
269f0 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 73 71  >nExpr;.      sq
26a00 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
26a10 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
26a20 2c 20 69 41 62 6f 72 74 46 6c 61 67 29 3b 0a 20  , iAbortFlag);. 
26a30 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
26a40 28 28 76 2c 20 22 63 6c 65 61 72 20 61 62 6f 72  ((v, "clear abor
26a50 74 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20 20  t flag"));.     
26a60 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
26a70 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
26a80 2c 20 30 2c 20 69 55 73 65 46 6c 61 67 29 3b 0a  , 0, iUseFlag);.
26a90 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
26aa0 74 28 28 76 2c 20 22 69 6e 64 69 63 61 74 65 20  t((v, "indicate 
26ab0 61 63 63 75 6d 75 6c 61 74 6f 72 20 65 6d 70 74  accumulator empt
26ac0 79 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  y"));.      sqli
26ad0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
26ae0 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 69 41 4d   OP_Null, 0, iAM
26af0 65 6d 2c 20 69 41 4d 65 6d 2b 70 47 72 6f 75 70  em, iAMem+pGroup
26b00 42 79 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a 0a 20  By->nExpr-1);.. 
26b10 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 61 20       /* Begin a 
26b20 6c 6f 6f 70 20 74 68 61 74 20 77 69 6c 6c 20 65  loop that will e
26b30 78 74 72 61 63 74 20 61 6c 6c 20 73 6f 75 72 63  xtract all sourc
26b40 65 20 72 6f 77 73 20 69 6e 20 47 52 4f 55 50 20  e rows in GROUP 
26b50 42 59 20 6f 72 64 65 72 2e 0a 20 20 20 20 20 20  BY order..      
26b60 2a 2a 20 54 68 69 73 20 6d 69 67 68 74 20 69 6e  ** This might in
26b70 76 6f 6c 76 65 20 74 77 6f 20 73 65 70 61 72 61  volve two separa
26b80 74 65 20 6c 6f 6f 70 73 20 77 69 74 68 20 61 6e  te loops with an
26b90 20 4f 50 5f 53 6f 72 74 20 69 6e 20 62 65 74 77   OP_Sort in betw
26ba0 65 65 6e 2c 20 6f 72 0a 20 20 20 20 20 20 2a 2a  een, or.      **
26bb0 20 69 74 20 6d 69 67 68 74 20 62 65 20 61 20 73   it might be a s
26bc0 69 6e 67 6c 65 20 6c 6f 6f 70 20 74 68 61 74 20  ingle loop that 
26bd0 75 73 65 73 20 61 6e 20 69 6e 64 65 78 20 74 6f  uses an index to
26be0 20 65 78 74 72 61 63 74 20 69 6e 66 6f 72 6d 61   extract informa
26bf0 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 69 6e  tion.      ** in
26c00 20 74 68 65 20 72 69 67 68 74 20 6f 72 64 65 72   the right order
26c10 20 74 6f 20 62 65 67 69 6e 20 77 69 74 68 2e 0a   to begin with..
26c20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
26c30 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
26c40 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65  (v, OP_Gosub, re
26c50 67 52 65 73 65 74 2c 20 61 64 64 72 52 65 73 65  gReset, addrRese
26c60 74 29 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f  t);.      pWInfo
26c70 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42   = sqlite3WhereB
26c80 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61  egin(pParse, pTa
26c90 62 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20 70  bList, pWhere, p
26ca0 47 72 6f 75 70 42 79 2c 20 30 2c 20 0a 20 20 20  GroupBy, 0, .   
26cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57 48                WH
26cd0 45 52 45 5f 47 52 4f 55 50 42 59 2c 20 30 29 3b  ERE_GROUPBY, 0);
26ce0 0a 20 20 20 20 20 20 69 66 28 20 70 57 49 6e 66  .      if( pWInf
26cf0 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65  o==0 ) goto sele
26d00 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 69 66  ct_end;.      if
26d10 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 49 73  ( sqlite3WhereIs
26d20 4f 72 64 65 72 65 64 28 70 57 49 6e 66 6f 29 20  Ordered(pWInfo) 
26d30 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
26d40 65 20 6f 70 74 69 6d 69 7a 65 72 20 69 73 20 61  e optimizer is a
26d50 62 6c 65 20 74 6f 20 64 65 6c 69 76 65 72 20 72  ble to deliver r
26d60 6f 77 73 20 69 6e 20 67 72 6f 75 70 20 62 79 20  ows in group by 
26d70 6f 72 64 65 72 20 73 6f 0a 20 20 20 20 20 20 20  order so.       
26d80 20 2a 2a 20 77 65 20 64 6f 20 6e 6f 74 20 68 61   ** we do not ha
26d90 76 65 20 74 6f 20 73 6f 72 74 2e 20 20 54 68 65  ve to sort.  The
26da0 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
26db0 6c 20 74 61 62 6c 65 20 77 69 6c 6c 20 62 65 0a  l table will be.
26dc0 20 20 20 20 20 20 20 20 2a 2a 20 63 61 6e 63 65          ** cance
26dd0 6c 6c 65 64 20 6c 61 74 65 72 20 62 65 63 61 75  lled later becau
26de0 73 65 20 77 65 20 73 74 69 6c 6c 20 6e 65 65 64  se we still need
26df0 20 74 6f 20 75 73 65 20 74 68 65 20 70 4b 65 79   to use the pKey
26e00 49 6e 66 6f 0a 20 20 20 20 20 20 20 20 2a 2f 0a  Info.        */.
26e10 20 20 20 20 20 20 20 20 67 72 6f 75 70 42 79 53          groupByS
26e20 6f 72 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ort = 0;.      }
26e30 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
26e40 20 52 6f 77 73 20 61 72 65 20 63 6f 6d 69 6e 67   Rows are coming
26e50 20 6f 75 74 20 69 6e 20 75 6e 64 65 74 65 72 6d   out in undeterm
26e60 69 6e 65 64 20 6f 72 64 65 72 2e 20 20 57 65 20  ined order.  We 
26e70 68 61 76 65 20 74 6f 20 70 75 73 68 0a 20 20 20  have to push.   
26e80 20 20 20 20 20 2a 2a 20 65 61 63 68 20 72 6f 77       ** each row
26e90 20 69 6e 74 6f 20 61 20 73 6f 72 74 69 6e 67 20   into a sorting 
26ea0 69 6e 64 65 78 2c 20 74 65 72 6d 69 6e 61 74 65  index, terminate
26eb0 20 74 68 65 20 66 69 72 73 74 20 6c 6f 6f 70 2c   the first loop,
26ec0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e  .        ** then
26ed0 20 6c 6f 6f 70 20 6f 76 65 72 20 74 68 65 20 73   loop over the s
26ee0 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 69 6e 20  orting index in 
26ef0 6f 72 64 65 72 20 74 6f 20 67 65 74 20 74 68 65  order to get the
26f00 20 6f 75 74 70 75 74 0a 20 20 20 20 20 20 20 20   output.        
26f10 2a 2a 20 69 6e 20 73 6f 72 74 65 64 20 6f 72 64  ** in sorted ord
26f20 65 72 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  er.        */.  
26f30 20 20 20 20 20 20 69 6e 74 20 72 65 67 42 61 73        int regBas
26f40 65 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  e;.        int r
26f50 65 67 52 65 63 6f 72 64 3b 0a 20 20 20 20 20 20  egRecord;.      
26f60 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 20 20    int nCol;.    
26f70 20 20 20 20 69 6e 74 20 6e 47 72 6f 75 70 42 79      int nGroupBy
26f80 3b 0a 0a 20 20 20 20 20 20 20 20 65 78 70 6c 61  ;..        expla
26f90 69 6e 54 65 6d 70 54 61 62 6c 65 28 70 50 61 72  inTempTable(pPar
26fa0 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  se, .           
26fb0 20 28 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e   (sDistinct.isTn
26fc0 63 74 20 26 26 20 28 70 2d 3e 73 65 6c 46 6c 61  ct && (p->selFla
26fd0 67 73 26 53 46 5f 44 69 73 74 69 6e 63 74 29 3d  gs&SF_Distinct)=
26fe0 3d 30 29 20 3f 0a 20 20 20 20 20 20 20 20 20 20  =0) ?.          
26ff0 20 20 20 20 20 20 20 20 20 20 22 44 49 53 54 49            "DISTI
27000 4e 43 54 22 20 3a 20 22 47 52 4f 55 50 20 42 59  NCT" : "GROUP BY
27010 22 29 3b 0a 0a 20 20 20 20 20 20 20 20 67 72 6f  ");..        gro
27020 75 70 42 79 53 6f 72 74 20 3d 20 31 3b 0a 20 20  upBySort = 1;.  
27030 20 20 20 20 20 20 6e 47 72 6f 75 70 42 79 20 3d        nGroupBy =
27040 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72   pGroupBy->nExpr
27050 3b 0a 20 20 20 20 20 20 20 20 6e 43 6f 6c 20 3d  ;.        nCol =
27060 20 6e 47 72 6f 75 70 42 79 20 2b 20 31 3b 0a 20   nGroupBy + 1;. 
27070 20 20 20 20 20 20 20 6a 20 3d 20 6e 47 72 6f 75         j = nGrou
27080 70 42 79 2b 31 3b 0a 20 20 20 20 20 20 20 20 66  pBy+1;.        f
27090 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e  or(i=0; i<sAggIn
270a0 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29  fo.nColumn; i++)
270b0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
270c0 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69 5d  sAggInfo.aCol[i]
270d0 2e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3e 3d  .iSorterColumn>=
270e0 6a 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  j ){.           
270f0 20 6e 43 6f 6c 2b 2b 3b 0a 20 20 20 20 20 20 20   nCol++;.       
27100 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20       j++;.      
27110 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
27120 20 20 20 20 20 20 20 20 72 65 67 42 61 73 65 20          regBase 
27130 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
27140 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 43  Range(pParse, nC
27150 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ol);.        sql
27160 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65  ite3ExprCacheCle
27170 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  ar(pParse);.    
27180 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
27190 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50 61 72  odeExprList(pPar
271a0 73 65 2c 20 70 47 72 6f 75 70 42 79 2c 20 72 65  se, pGroupBy, re
271b0 67 42 61 73 65 2c 20 30 29 3b 0a 20 20 20 20 20  gBase, 0);.     
271c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
271d0 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65 71 75 65  dOp2(v, OP_Seque
271e0 6e 63 65 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f  nce, sAggInfo.so
271f0 72 74 69 6e 67 49 64 78 2c 72 65 67 42 61 73 65  rtingIdx,regBase
27200 2b 6e 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20  +nGroupBy);.    
27210 20 20 20 20 6a 20 3d 20 6e 47 72 6f 75 70 42 79      j = nGroupBy
27220 2b 31 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  +1;.        for(
27230 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e  i=0; i<sAggInfo.
27240 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20  nColumn; i++){. 
27250 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20           struct 
27260 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f  AggInfo_col *pCo
27270 6c 20 3d 20 26 73 41 67 67 49 6e 66 6f 2e 61 43  l = &sAggInfo.aC
27280 6f 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20  ol[i];.         
27290 20 69 66 28 20 70 43 6f 6c 2d 3e 69 53 6f 72 74   if( pCol->iSort
272a0 65 72 43 6f 6c 75 6d 6e 3e 3d 6a 20 29 7b 0a 20  erColumn>=j ){. 
272b0 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 72             int r
272c0 31 20 3d 20 6a 20 2b 20 72 65 67 42 61 73 65 3b  1 = j + regBase;
272d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
272e0 20 72 32 3b 0a 0a 20 20 20 20 20 20 20 20 20 20   r2;..          
272f0 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78    r2 = sqlite3Ex
27300 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28  prCodeGetColumn(
27310 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20  pParse, .       
27320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27330 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 54          pCol->pT
27340 61 62 2c 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d  ab, pCol->iColum
27350 6e 2c 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 2c  n, pCol->iTable,
27360 20 72 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20   r1, 0);.       
27370 20 20 20 20 20 69 66 28 20 72 31 21 3d 72 32 20       if( r1!=r2 
27380 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
27390 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
273a0 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20  p2(v, OP_SCopy, 
273b0 72 32 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20  r2, r1);.       
273c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
273d0 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 20 20     j++;.        
273e0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
273f0 20 20 20 20 20 20 72 65 67 52 65 63 6f 72 64 20        regRecord 
27400 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
27410 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
27420 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
27430 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b  AddOp3(v, OP_Mak
27440 65 52 65 63 6f 72 64 2c 20 72 65 67 42 61 73 65  eRecord, regBase
27450 2c 20 6e 43 6f 6c 2c 20 72 65 67 52 65 63 6f 72  , nCol, regRecor
27460 64 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  d);.        sqli
27470 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
27480 20 4f 50 5f 53 6f 72 74 65 72 49 6e 73 65 72 74   OP_SorterInsert
27490 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69  , sAggInfo.sorti
274a0 6e 67 49 64 78 2c 20 72 65 67 52 65 63 6f 72 64  ngIdx, regRecord
274b0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
274c0 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
274d0 28 70 50 61 72 73 65 2c 20 72 65 67 52 65 63 6f  (pParse, regReco
274e0 72 64 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  rd);.        sql
274f0 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
27500 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67  ange(pParse, reg
27510 42 61 73 65 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20  Base, nCol);.   
27520 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72       sqlite3Wher
27530 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20  eEnd(pWInfo);.  
27540 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 73        sAggInfo.s
27550 6f 72 74 69 6e 67 49 64 78 50 54 61 62 20 3d 20  ortingIdxPTab = 
27560 73 6f 72 74 50 54 61 62 20 3d 20 70 50 61 72 73  sortPTab = pPars
27570 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20  e->nTab++;.     
27580 20 20 20 73 6f 72 74 4f 75 74 20 3d 20 73 71 6c     sortOut = sql
27590 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
275a0 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
275b0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
275c0 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75  3(v, OP_OpenPseu
275d0 64 6f 2c 20 73 6f 72 74 50 54 61 62 2c 20 73 6f  do, sortPTab, so
275e0 72 74 4f 75 74 2c 20 6e 43 6f 6c 29 3b 0a 20 20  rtOut, nCol);.  
275f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
27600 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f  eAddOp2(v, OP_So
27610 72 74 65 72 53 6f 72 74 2c 20 73 41 67 67 49 6e  rterSort, sAggIn
27620 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 61  fo.sortingIdx, a
27630 64 64 72 45 6e 64 29 3b 0a 20 20 20 20 20 20 20  ddrEnd);.       
27640 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
27650 20 22 47 52 4f 55 50 20 42 59 20 73 6f 72 74 22   "GROUP BY sort"
27660 29 29 3b 0a 20 20 20 20 20 20 20 20 73 41 67 67  ));.        sAgg
27670 49 6e 66 6f 2e 75 73 65 53 6f 72 74 69 6e 67 49  Info.useSortingI
27680 64 78 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  dx = 1;.        
27690 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
276a0 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20  Clear(pParse);. 
276b0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
276c0 20 45 76 61 6c 75 61 74 65 20 74 68 65 20 63 75   Evaluate the cu
276d0 72 72 65 6e 74 20 47 52 4f 55 50 20 42 59 20 74  rrent GROUP BY t
276e0 65 72 6d 73 20 61 6e 64 20 73 74 6f 72 65 20 69  erms and store i
276f0 6e 20 62 30 2c 20 62 31 2c 20 62 32 2e 2e 2e 0a  n b0, b1, b2....
27700 20 20 20 20 20 20 2a 2a 20 28 62 30 20 69 73 20        ** (b0 is 
27710 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20  memory location 
27720 69 42 4d 65 6d 2b 30 2c 20 62 31 20 69 73 20 69  iBMem+0, b1 is i
27730 42 4d 65 6d 2b 31 2c 20 61 6e 64 20 73 6f 20 66  BMem+1, and so f
27740 6f 72 74 68 29 0a 20 20 20 20 20 20 2a 2a 20 54  orth).      ** T
27750 68 65 6e 20 63 6f 6d 70 61 72 65 20 74 68 65 20  hen compare the 
27760 63 75 72 72 65 6e 74 20 47 52 4f 55 50 20 42 59  current GROUP BY
27770 20 74 65 72 6d 73 20 61 67 61 69 6e 73 74 20 74   terms against t
27780 68 65 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d  he GROUP BY term
27790 73 0a 20 20 20 20 20 20 2a 2a 20 66 72 6f 6d 20  s.      ** from 
277a0 74 68 65 20 70 72 65 76 69 6f 75 73 20 72 6f 77  the previous row
277b0 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72 65   currently store
277c0 64 20 69 6e 20 61 30 2c 20 61 31 2c 20 61 32 2e  d in a0, a1, a2.
277d0 2e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  ...      */.    
277e0 20 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 20    addrTopOfLoop 
277f0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
27800 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
27810 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
27820 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29  cheClear(pParse)
27830 3b 0a 20 20 20 20 20 20 69 66 28 20 67 72 6f 75  ;.      if( grou
27840 70 42 79 53 6f 72 74 20 29 7b 0a 20 20 20 20 20  pBySort ){.     
27850 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
27860 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65  dOp2(v, OP_Sorte
27870 72 44 61 74 61 2c 20 73 41 67 67 49 6e 66 6f 2e  rData, sAggInfo.
27880 73 6f 72 74 69 6e 67 49 64 78 2c 20 73 6f 72 74  sortingIdx, sort
27890 4f 75 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Out);.      }.  
278a0 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
278b0 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20  GroupBy->nExpr; 
278c0 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  j++){.        if
278d0 28 20 67 72 6f 75 70 42 79 53 6f 72 74 20 29 7b  ( groupBySort ){
278e0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
278f0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
27900 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73 6f 72 74 50  OP_Column, sortP
27910 54 61 62 2c 20 6a 2c 20 69 42 4d 65 6d 2b 6a 29  Tab, j, iBMem+j)
27920 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
27930 6a 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 56 64  j==0 ) sqlite3Vd
27940 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50  beChangeP5(v, OP
27950 46 4c 41 47 5f 43 4c 45 41 52 43 41 43 48 45 29  FLAG_CLEARCACHE)
27960 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
27970 0a 20 20 20 20 20 20 20 20 20 20 73 41 67 67 49  .          sAggI
27980 6e 66 6f 2e 64 69 72 65 63 74 4d 6f 64 65 20 3d  nfo.directMode =
27990 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71   1;.          sq
279a0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
279b0 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79 2d 3e  arse, pGroupBy->
279c0 61 5b 6a 5d 2e 70 45 78 70 72 2c 20 69 42 4d 65  a[j].pExpr, iBMe
279d0 6d 2b 6a 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  m+j);.        }.
279e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
279f0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
27a00 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 69  v, OP_Compare, i
27a10 41 4d 65 6d 2c 20 69 42 4d 65 6d 2c 20 70 47 72  AMem, iBMem, pGr
27a20 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2c 0a 20 20  oupBy->nExpr,.  
27a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27a40 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70          (char*)p
27a50 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49  KeyInfo, P4_KEYI
27a60 4e 46 4f 29 3b 0a 20 20 20 20 20 20 6a 31 20 3d  NFO);.      j1 =
27a70 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
27a80 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
27a90 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
27aa0 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20  Op3(v, OP_Jump, 
27ab0 6a 31 2b 31 2c 20 30 2c 20 6a 31 2b 31 29 3b 0a  j1+1, 0, j1+1);.
27ac0 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61  .      /* Genera
27ad0 74 65 20 63 6f 64 65 20 74 68 61 74 20 72 75 6e  te code that run
27ae0 73 20 77 68 65 6e 65 76 65 72 20 74 68 65 20 47  s whenever the G
27af0 52 4f 55 50 20 42 59 20 63 68 61 6e 67 65 73 2e  ROUP BY changes.
27b00 0a 20 20 20 20 20 20 2a 2a 20 43 68 61 6e 67 65  .      ** Change
27b10 73 20 69 6e 20 74 68 65 20 47 52 4f 55 50 20 42  s in the GROUP B
27b20 59 20 61 72 65 20 64 65 74 65 63 74 65 64 20 62  Y are detected b
27b30 79 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 63  y the previous c
27b40 6f 64 65 0a 20 20 20 20 20 20 2a 2a 20 62 6c 6f  ode.      ** blo
27b50 63 6b 2e 20 20 49 66 20 74 68 65 72 65 20 77 65  ck.  If there we
27b60 72 65 20 6e 6f 20 63 68 61 6e 67 65 73 2c 20 74  re no changes, t
27b70 68 69 73 20 62 6c 6f 63 6b 20 69 73 20 73 6b 69  his block is ski
27b80 70 70 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  pped..      **. 
27b90 20 20 20 20 20 2a 2a 20 54 68 69 73 20 63 6f 64       ** This cod
27ba0 65 20 63 6f 70 69 65 73 20 63 75 72 72 65 6e 74  e copies current
27bb0 20 67 72 6f 75 70 20 62 79 20 74 65 72 6d 73 20   group by terms 
27bc0 69 6e 20 62 30 2c 62 31 2c 62 32 2c 2e 2e 2e 0a  in b0,b1,b2,....
27bd0 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 20 74 6f        ** over to
27be0 20 61 30 2c 61 31 2c 61 32 2e 20 20 49 74 20 74   a0,a1,a2.  It t
27bf0 68 65 6e 20 63 61 6c 6c 73 20 74 68 65 20 6f 75  hen calls the ou
27c00 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65 0a  tput subroutine.
27c10 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 72 65 73        ** and res
27c20 65 74 73 20 74 68 65 20 61 67 67 72 65 67 61 74  ets the aggregat
27c30 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 72 65  e accumulator re
27c40 67 69 73 74 65 72 73 20 69 6e 20 70 72 65 70 61  gisters in prepa
27c50 72 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20  ration.      ** 
27c60 66 6f 72 20 74 68 65 20 6e 65 78 74 20 47 52 4f  for the next GRO
27c70 55 50 20 42 59 20 62 61 74 63 68 2e 0a 20 20 20  UP BY batch..   
27c80 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69     */.      sqli
27c90 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28  te3ExprCodeMove(
27ca0 70 50 61 72 73 65 2c 20 69 42 4d 65 6d 2c 20 69  pParse, iBMem, i
27cb0 41 4d 65 6d 2c 20 70 47 72 6f 75 70 42 79 2d 3e  AMem, pGroupBy->
27cc0 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20 73 71  nExpr);.      sq
27cd0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
27ce0 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67  v, OP_Gosub, reg
27cf0 4f 75 74 70 75 74 52 6f 77 2c 20 61 64 64 72 4f  OutputRow, addrO
27d00 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20  utputRow);.     
27d10 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
27d20 20 22 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f 77   "output one row
27d30 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  "));.      sqlit
27d40 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
27d50 4f 50 5f 49 66 50 6f 73 2c 20 69 41 62 6f 72 74  OP_IfPos, iAbort
27d60 46 6c 61 67 2c 20 61 64 64 72 45 6e 64 29 3b 0a  Flag, addrEnd);.
27d70 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
27d80 74 28 28 76 2c 20 22 63 68 65 63 6b 20 61 62 6f  t((v, "check abo
27d90 72 74 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20  rt flag"));.    
27da0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
27db0 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
27dc0 20 72 65 67 52 65 73 65 74 2c 20 61 64 64 72 52   regReset, addrR
27dd0 65 73 65 74 29 3b 0a 20 20 20 20 20 20 56 64 62  eset);.      Vdb
27de0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72 65  eComment((v, "re
27df0 73 65 74 20 61 63 63 75 6d 75 6c 61 74 6f 72 22  set accumulator"
27e00 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 55 70  ));..      /* Up
27e10 64 61 74 65 20 74 68 65 20 61 67 67 72 65 67 61  date the aggrega
27e20 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 73 20  te accumulators 
27e30 62 61 73 65 64 20 6f 6e 20 74 68 65 20 63 6f 6e  based on the con
27e40 74 65 6e 74 20 6f 66 0a 20 20 20 20 20 20 2a 2a  tent of.      **
27e50 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77   the current row
27e60 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
27e70 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
27e80 65 72 65 28 76 2c 20 6a 31 29 3b 0a 20 20 20 20  ere(v, j1);.    
27e90 20 20 75 70 64 61 74 65 41 63 63 75 6d 75 6c 61    updateAccumula
27ea0 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41 67  tor(pParse, &sAg
27eb0 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73 71  gInfo);.      sq
27ec0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
27ed0 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31  v, OP_Integer, 1
27ee0 2c 20 69 55 73 65 46 6c 61 67 29 3b 0a 20 20 20  , iUseFlag);.   
27ef0 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
27f00 76 2c 20 22 69 6e 64 69 63 61 74 65 20 64 61 74  v, "indicate dat
27f10 61 20 69 6e 20 61 63 63 75 6d 75 6c 61 74 6f 72  a in accumulator
27f20 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 45  "));..      /* E
27f30 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70 0a 20  nd of the loop. 
27f40 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
27f50 28 20 67 72 6f 75 70 42 79 53 6f 72 74 20 29 7b  ( groupBySort ){
27f60 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
27f70 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
27f80 5f 53 6f 72 74 65 72 4e 65 78 74 2c 20 73 41 67  _SorterNext, sAg
27f90 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78  gInfo.sortingIdx
27fa0 2c 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 29  , addrTopOfLoop)
27fb0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
27fc0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68         sqlite3Wh
27fd0 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a  ereEnd(pWInfo);.
27fe0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
27ff0 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28  dbeChangeToNoop(
28000 76 2c 20 61 64 64 72 53 6f 72 74 69 6e 67 49 64  v, addrSortingId
28010 78 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  x);.      }..   
28020 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 74 68 65     /* Output the
28030 20 66 69 6e 61 6c 20 72 6f 77 20 6f 66 20 72 65   final row of re
28040 73 75 6c 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20  sult.      */.  
28050 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
28060 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75  ddOp2(v, OP_Gosu
28070 62 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77 2c  b, regOutputRow,
28080 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 29 3b   addrOutputRow);
28090 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
280a0 6e 74 28 28 76 2c 20 22 6f 75 74 70 75 74 20 66  nt((v, "output f
280b0 69 6e 61 6c 20 72 6f 77 22 29 29 3b 0a 0a 20 20  inal row"));..  
280c0 20 20 20 20 2f 2a 20 4a 75 6d 70 20 6f 76 65 72      /* Jump over
280d0 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 73   the subroutines
280e0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
280f0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
28100 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
28110 20 61 64 64 72 45 6e 64 29 3b 0a 0a 20 20 20 20   addrEnd);..    
28120 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20    /* Generate a 
28130 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20  subroutine that 
28140 6f 75 74 70 75 74 73 20 61 20 73 69 6e 67 6c 65  outputs a single
28150 20 72 6f 77 20 6f 66 20 74 68 65 20 72 65 73 75   row of the resu
28160 6c 74 0a 20 20 20 20 20 20 2a 2a 20 73 65 74 2e  lt.      ** set.
28170 20 20 54 68 69 73 20 73 75 62 72 6f 75 74 69 6e    This subroutin
28180 65 20 66 69 72 73 74 20 6c 6f 6f 6b 73 20 61 74  e first looks at
28190 20 74 68 65 20 69 55 73 65 46 6c 61 67 2e 20 20   the iUseFlag.  
281a0 49 66 20 69 55 73 65 46 6c 61 67 0a 20 20 20 20  If iUseFlag.    
281b0 20 20 2a 2a 20 69 73 20 6c 65 73 73 20 74 68 61    ** is less tha
281c0 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 65  n or equal to ze
281d0 72 6f 2c 20 74 68 65 20 73 75 62 72 6f 75 74 69  ro, the subrouti
281e0 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20  ne is a no-op.  
281f0 49 66 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  If.      ** the 
28200 70 72 6f 63 65 73 73 69 6e 67 20 63 61 6c 6c 73  processing calls
28210 20 66 6f 72 20 74 68 65 20 71 75 65 72 79 20 74   for the query t
28220 6f 20 61 62 6f 72 74 2c 20 74 68 69 73 20 73 75  o abort, this su
28230 62 72 6f 75 74 69 6e 65 0a 20 20 20 20 20 20 2a  broutine.      *
28240 2a 20 69 6e 63 72 65 6d 65 6e 74 73 20 74 68 65  * increments the
28250 20 69 41 62 6f 72 74 46 6c 61 67 20 6d 65 6d 6f   iAbortFlag memo
28260 72 79 20 6c 6f 63 61 74 69 6f 6e 20 62 65 66 6f  ry location befo
28270 72 65 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 0a  re returning in.
28280 20 20 20 20 20 20 2a 2a 20 6f 72 64 65 72 20 74        ** order t
28290 6f 20 73 69 67 6e 61 6c 20 74 68 65 20 63 61 6c  o signal the cal
282a0 6c 65 72 20 74 6f 20 61 62 6f 72 74 2e 0a 20 20  ler to abort..  
282b0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 64 64      */.      add
282c0 72 53 65 74 41 62 6f 72 74 20 3d 20 73 71 6c 69  rSetAbort = sqli
282d0 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
282e0 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c  dr(v);.      sql
282f0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
28300 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c  , OP_Integer, 1,
28310 20 69 41 62 6f 72 74 46 6c 61 67 29 3b 0a 20 20   iAbortFlag);.  
28320 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
28330 28 76 2c 20 22 73 65 74 20 61 62 6f 72 74 20 66  (v, "set abort f
28340 6c 61 67 22 29 29 3b 0a 20 20 20 20 20 20 73 71  lag"));.      sq
28350 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
28360 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65  v, OP_Return, re
28370 67 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20  gOutputRow);.   
28380 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
28390 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64  solveLabel(v, ad
283a0 64 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20  drOutputRow);.  
283b0 20 20 20 20 61 64 64 72 4f 75 74 70 75 74 52 6f      addrOutputRo
283c0 77 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  w = sqlite3VdbeC
283d0 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
283e0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
283f0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 50  AddOp2(v, OP_IfP
28400 6f 73 2c 20 69 55 73 65 46 6c 61 67 2c 20 61 64  os, iUseFlag, ad
28410 64 72 4f 75 74 70 75 74 52 6f 77 2b 32 29 3b 0a  drOutputRow+2);.
28420 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
28430 74 28 28 76 2c 20 22 47 72 6f 75 70 62 79 20 72  t((v, "Groupby r
28440 65 73 75 6c 74 20 67 65 6e 65 72 61 74 6f 72 20  esult generator 
28450 65 6e 74 72 79 20 70 6f 69 6e 74 22 29 29 3b 0a  entry point"));.
28460 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
28470 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65  eAddOp1(v, OP_Re
28480 74 75 72 6e 2c 20 72 65 67 4f 75 74 70 75 74 52  turn, regOutputR
28490 6f 77 29 3b 0a 20 20 20 20 20 20 66 69 6e 61 6c  ow);.      final
284a0 69 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e 73 28  izeAggFunctions(
284b0 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66  pParse, &sAggInf
284c0 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  o);.      sqlite
284d0 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
284e0 72 73 65 2c 20 70 48 61 76 69 6e 67 2c 20 61 64  rse, pHaving, ad
284f0 64 72 4f 75 74 70 75 74 52 6f 77 2b 31 2c 20 53  drOutputRow+1, S
28500 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
28510 29 3b 0a 20 20 20 20 20 20 73 65 6c 65 63 74 49  );.      selectI
28520 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c  nnerLoop(pParse,
28530 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 30   p, p->pEList, 0
28540 2c 20 30 2c 20 70 4f 72 64 65 72 42 79 2c 0a 20  , 0, pOrderBy,. 
28550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28560 20 20 20 20 20 26 73 44 69 73 74 69 6e 63 74 2c       &sDistinct,
28570 20 70 44 65 73 74 2c 0a 20 20 20 20 20 20 20 20   pDest,.        
28580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 64                ad
28590 64 72 4f 75 74 70 75 74 52 6f 77 2b 31 2c 20 61  drOutputRow+1, a
285a0 64 64 72 53 65 74 41 62 6f 72 74 29 3b 0a 20 20  ddrSetAbort);.  
285b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
285c0 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75  ddOp1(v, OP_Retu
285d0 72 6e 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77  rn, regOutputRow
285e0 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
285f0 6d 65 6e 74 28 28 76 2c 20 22 65 6e 64 20 67 72  ment((v, "end gr
28600 6f 75 70 62 79 20 72 65 73 75 6c 74 20 67 65 6e  oupby result gen
28610 65 72 61 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20  erator"));..    
28620 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20    /* Generate a 
28630 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20  subroutine that 
28640 77 69 6c 6c 20 72 65 73 65 74 20 74 68 65 20 67  will reset the g
28650 72 6f 75 70 2d 62 79 20 61 63 63 75 6d 75 6c 61  roup-by accumula
28660 74 6f 72 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  tor.      */.   
28670 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
28680 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64  solveLabel(v, ad
28690 64 72 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20  drReset);.      
286a0 72 65 73 65 74 41 63 63 75 6d 75 6c 61 74 6f 72  resetAccumulator
286b0 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e  (pParse, &sAggIn
286c0 66 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  fo);.      sqlit
286d0 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
286e0 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 52 65  OP_Return, regRe
286f0 73 65 74 29 3b 0a 20 20 20 20 20 0a 20 20 20 20  set);.     .    
28700 7d 20 2f 2a 20 65 6e 64 69 66 20 70 47 72 6f 75  } /* endif pGrou
28710 70 42 79 2e 20 20 42 65 67 69 6e 20 61 67 67 72  pBy.  Begin aggr
28720 65 67 61 74 65 20 71 75 65 72 69 65 73 20 77 69  egate queries wi
28730 74 68 6f 75 74 20 47 52 4f 55 50 20 42 59 3a 20  thout GROUP BY: 
28740 2a 2f 0a 20 20 20 20 65 6c 73 65 20 7b 0a 20 20  */.    else {.  
28750 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 44      ExprList *pD
28760 65 6c 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20  el = 0;.#ifndef 
28770 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 54 52 45  SQLITE_OMIT_BTRE
28780 45 43 4f 55 4e 54 0a 20 20 20 20 20 20 54 61 62  ECOUNT.      Tab
28790 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 20 20  le *pTab;.      
287a0 69 66 28 20 28 70 54 61 62 20 3d 20 69 73 53 69  if( (pTab = isSi
287b0 6d 70 6c 65 43 6f 75 6e 74 28 70 2c 20 26 73 41  mpleCount(p, &sA
287c0 67 67 49 6e 66 6f 29 29 21 3d 30 20 29 7b 0a 20  ggInfo))!=0 ){. 
287d0 20 20 20 20 20 20 20 2f 2a 20 49 66 20 69 73 53         /* If isS
287e0 69 6d 70 6c 65 43 6f 75 6e 74 28 29 20 72 65 74  impleCount() ret
287f0 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74  urns a pointer t
28800 6f 20 61 20 54 61 62 6c 65 20 73 74 72 75 63 74  o a Table struct
28810 75 72 65 2c 20 74 68 65 6e 0a 20 20 20 20 20 20  ure, then.      
28820 20 20 2a 2a 20 74 68 65 20 53 51 4c 20 73 74 61    ** the SQL sta
28830 74 65 6d 65 6e 74 20 69 73 20 6f 66 20 74 68 65  tement is of the
28840 20 66 6f 72 6d 3a 0a 20 20 20 20 20 20 20 20 2a   form:.        *
28850 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 53  *.        **   S
28860 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
28870 52 4f 4d 20 3c 74 62 6c 3e 0a 20 20 20 20 20 20  ROM <tbl>.      
28880 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
28890 77 68 65 72 65 20 74 68 65 20 54 61 62 6c 65 20  where the Table 
288a0 73 74 72 75 63 74 75 72 65 20 72 65 74 75 72 6e  structure return
288b0 65 64 20 72 65 70 72 65 73 65 6e 74 73 20 74 61  ed represents ta
288c0 62 6c 65 20 3c 74 62 6c 3e 2e 0a 20 20 20 20 20  ble <tbl>..     
288d0 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
288e0 20 54 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20   This statement 
288f0 69 73 20 73 6f 20 63 6f 6d 6d 6f 6e 20 74 68 61  is so common tha
28900 74 20 69 74 20 69 73 20 6f 70 74 69 6d 69 7a 65  t it is optimize
28910 64 20 73 70 65 63 69 61 6c 6c 79 2e 20 54 68 65  d specially. The
28920 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 50 5f 43  .        ** OP_C
28930 6f 75 6e 74 20 69 6e 73 74 72 75 63 74 69 6f 6e  ount instruction
28940 20 69 73 20 65 78 65 63 75 74 65 64 20 65 69 74   is executed eit
28950 68 65 72 20 6f 6e 20 74 68 65 20 69 6e 74 6b 65  her on the intke
28960 79 20 74 61 62 6c 65 20 74 68 61 74 0a 20 20 20  y table that.   
28970 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73       ** contains
28980 20 74 68 65 20 64 61 74 61 20 66 6f 72 20 74 61   the data for ta
28990 62 6c 65 20 3c 74 62 6c 3e 20 6f 72 20 6f 6e 20  ble <tbl> or on 
289a0 6f 6e 65 20 6f 66 20 69 74 73 20 69 6e 64 65 78  one of its index
289b0 65 73 2e 20 49 74 0a 20 20 20 20 20 20 20 20 2a  es. It.        *
289c0 2a 20 69 73 20 62 65 74 74 65 72 20 74 6f 20 65  * is better to e
289d0 78 65 63 75 74 65 20 74 68 65 20 6f 70 20 6f 6e  xecute the op on
289e0 20 61 6e 20 69 6e 64 65 78 2c 20 61 73 20 69 6e   an index, as in
289f0 64 65 78 65 73 20 61 72 65 20 61 6c 6d 6f 73 74  dexes are almost
28a00 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 77 61  .        ** alwa
28a10 79 73 20 73 70 72 65 61 64 20 61 63 72 6f 73 73  ys spread across
28a20 20 6c 65 73 73 20 70 61 67 65 73 20 74 68 61 6e   less pages than
28a30 20 74 68 65 69 72 20 63 6f 72 72 65 73 70 6f 6e   their correspon
28a40 64 69 6e 67 20 74 61 62 6c 65 73 2e 0a 20 20 20  ding tables..   
28a50 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
28a60 63 6f 6e 73 74 20 69 6e 74 20 69 44 62 20 3d 20  const int iDb = 
28a70 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
28a80 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c  ndex(pParse->db,
28a90 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b   pTab->pSchema);
28aa0 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 69  .        const i
28ab0 6e 74 20 69 43 73 72 20 3d 20 70 50 61 72 73 65  nt iCsr = pParse
28ac0 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20 20 20 2f 2a  ->nTab++;     /*
28ad0 20 43 75 72 73 6f 72 20 74 6f 20 73 63 61 6e 20   Cursor to scan 
28ae0 62 2d 74 72 65 65 20 2a 2f 0a 20 20 20 20 20 20  b-tree */.      
28af0 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20    Index *pIdx;  
28b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b10 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74         /* Iterat
28b20 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20  or variable */. 
28b30 20 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a         KeyInfo *
28b40 70 4b 65 79 49 6e 66 6f 20 3d 20 30 3b 20 20 20  pKeyInfo = 0;   
28b50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4b              /* K
28b60 65 79 69 6e 66 6f 20 66 6f 72 20 73 63 61 6e 6e  eyinfo for scann
28b70 65 64 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20  ed index */.    
28b80 20 20 20 20 49 6e 64 65 78 20 2a 70 42 65 73 74      Index *pBest
28b90 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
28ba0 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65 73 74           /* Best
28bb0 20 69 6e 64 65 78 20 66 6f 75 6e 64 20 73 6f 20   index found so 
28bc0 66 61 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  far */.        i
28bd0 6e 74 20 69 52 6f 6f 74 20 3d 20 70 54 61 62 2d  nt iRoot = pTab-
28be0 3e 74 6e 75 6d 3b 20 20 20 20 20 20 20 20 20 20  >tnum;          
28bf0 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65      /* Root page
28c00 20 6f 66 20 73 63 61 6e 6e 65 64 20 62 2d 74 72   of scanned b-tr
28c10 65 65 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 73  ee */..        s
28c20 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79  qlite3CodeVerify
28c30 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69  Schema(pParse, i
28c40 44 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  Db);.        sql
28c50 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50  ite3TableLock(pP
28c60 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d  arse, iDb, pTab-
28c70 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e  >tnum, 0, pTab->
28c80 7a 4e 61 6d 65 29 3b 0a 0a 20 20 20 20 20 20 20  zName);..       
28c90 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 74   /* Search for t
28ca0 68 65 20 69 6e 64 65 78 20 74 68 61 74 20 68 61  he index that ha
28cb0 73 20 74 68 65 20 6c 6f 77 65 73 74 20 73 63 61  s the lowest sca
28cc0 6e 20 63 6f 73 74 2e 0a 20 20 20 20 20 20 20 20  n cost..        
28cd0 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 32  **.        ** (2
28ce0 30 31 31 2d 30 34 2d 31 35 29 20 44 6f 20 6e 6f  011-04-15) Do no
28cf0 74 20 64 6f 20 61 20 66 75 6c 6c 20 73 63 61 6e  t do a full scan
28d00 20 6f 66 20 61 6e 20 75 6e 6f 72 64 65 72 65 64   of an unordered
28d10 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20   index..        
28d20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 6e  **.        ** In
28d30 20 70 72 61 63 74 69 63 65 20 74 68 65 20 4b 65   practice the Ke
28d40 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  yInfo structure 
28d50 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75 73 65 64  will not be used
28d60 2e 20 49 74 20 69 73 20 6f 6e 6c 79 20 0a 20 20  . It is only .  
28d70 20 20 20 20 20 20 2a 2a 20 70 61 73 73 65 64 20        ** passed 
28d80 74 6f 20 6b 65 65 70 20 4f 50 5f 4f 70 65 6e 52  to keep OP_OpenR
28d90 65 61 64 20 68 61 70 70 79 2e 0a 20 20 20 20 20  ead happy..     
28da0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f     */.        fo
28db0 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  r(pIdx=pTab->pIn
28dc0 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d  dex; pIdx; pIdx=
28dd0 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pIdx->pNext){.  
28de0 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78          if( pIdx
28df0 2d 3e 62 55 6e 6f 72 64 65 72 65 64 3d 3d 30 0a  ->bUnordered==0.
28e00 20 20 20 20 20 20 20 20 20 20 20 26 26 20 70 49             && pI
28e10 64 78 2d 3e 69 53 63 61 6e 52 61 74 69 6f 3c 31  dx->iScanRatio<1
28e20 32 38 0a 20 20 20 20 20 20 20 20 20 20 20 26 26  28.           &&
28e30 20 70 49 64 78 2d 3e 70 50 61 72 74 49 64 78 57   pIdx->pPartIdxW
28e40 68 65 72 65 3d 3d 30 0a 20 20 20 20 20 20 20 20  here==0.        
28e50 20 20 20 26 26 20 28 21 70 42 65 73 74 20 7c 7c     && (!pBest ||
28e60 20 70 49 64 78 2d 3e 69 53 63 61 6e 52 61 74 69   pIdx->iScanRati
28e70 6f 3c 70 42 65 73 74 2d 3e 69 53 63 61 6e 52 61  o<pBest->iScanRa
28e80 74 69 6f 29 0a 20 20 20 20 20 20 20 20 20 20 29  tio).          )
28e90 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 42  {.            pB
28ea0 65 73 74 20 3d 20 70 49 64 78 3b 0a 20 20 20 20  est = pIdx;.    
28eb0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
28ec0 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 42  }.        if( pB
28ed0 65 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  est ){.         
28ee0 20 69 52 6f 6f 74 20 3d 20 70 42 65 73 74 2d 3e   iRoot = pBest->
28ef0 74 6e 75 6d 3b 0a 20 20 20 20 20 20 20 20 20 20  tnum;.          
28f00 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74  pKeyInfo = sqlit
28f10 65 33 49 6e 64 65 78 4b 65 79 69 6e 66 6f 28 70  e3IndexKeyinfo(p
28f20 50 61 72 73 65 2c 20 70 42 65 73 74 29 3b 0a 20  Parse, pBest);. 
28f30 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
28f40 20 20 2f 2a 20 4f 70 65 6e 20 61 20 72 65 61 64    /* Open a read
28f50 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 2c 20 65 78  -only cursor, ex
28f60 65 63 75 74 65 20 74 68 65 20 4f 50 5f 43 6f 75  ecute the OP_Cou
28f70 6e 74 2c 20 63 6c 6f 73 65 20 74 68 65 20 63 75  nt, close the cu
28f80 72 73 6f 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20  rsor. */.       
28f90 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
28fa0 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61  p3(v, OP_OpenRea
28fb0 64 2c 20 69 43 73 72 2c 20 69 52 6f 6f 74 2c 20  d, iCsr, iRoot, 
28fc0 69 44 62 29 3b 0a 20 20 20 20 20 20 20 20 69 66  iDb);.        if
28fd0 28 20 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20  ( pKeyInfo ){.  
28fe0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
28ff0 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d  dbeChangeP4(v, -
29000 31 2c 20 28 63 68 61 72 20 2a 29 70 4b 65 79 49  1, (char *)pKeyI
29010 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f  nfo, P4_KEYINFO_
29020 48 41 4e 44 4f 46 46 29 3b 0a 20 20 20 20 20 20  HANDOFF);.      
29030 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
29040 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
29050 20 4f 50 5f 43 6f 75 6e 74 2c 20 69 43 73 72 2c   OP_Count, iCsr,
29060 20 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b   sAggInfo.aFunc[
29070 30 5d 2e 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20  0].iMem);.      
29080 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
29090 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  Op1(v, OP_Close,
290a0 20 69 43 73 72 29 3b 0a 20 20 20 20 20 20 20 20   iCsr);.        
290b0 65 78 70 6c 61 69 6e 53 69 6d 70 6c 65 43 6f 75  explainSimpleCou
290c0 6e 74 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c  nt(pParse, pTab,
290d0 20 70 42 65 73 74 29 3b 0a 20 20 20 20 20 20 7d   pBest);.      }
290e0 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53  else.#endif /* S
290f0 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 54 52 45 45  QLITE_OMIT_BTREE
29100 43 4f 55 4e 54 20 2a 2f 0a 20 20 20 20 20 20 7b  COUNT */.      {
29110 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63  .        /* Chec
29120 6b 20 69 66 20 74 68 65 20 71 75 65 72 79 20 69  k if the query i
29130 73 20 6f 66 20 6f 6e 65 20 6f 66 20 74 68 65 20  s of one of the 
29140 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d 73 3a  following forms:
29150 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
29160 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20      **   SELECT 
29170 6d 69 6e 28 78 29 20 46 52 4f 4d 20 2e 2e 2e 0a  min(x) FROM ....
29180 20 20 20 20 20 20 20 20 2a 2a 20 20 20 53 45 4c          **   SEL
29190 45 43 54 20 6d 61 78 28 78 29 20 46 52 4f 4d 20  ECT max(x) FROM 
291a0 2e 2e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ....        **. 
291b0 20 20 20 20 20 20 20 2a 2a 20 49 66 20 69 74 20         ** If it 
291c0 69 73 2c 20 74 68 65 6e 20 61 73 6b 20 74 68 65  is, then ask the
291d0 20 63 6f 64 65 20 69 6e 20 77 68 65 72 65 2e 63   code in where.c
291e0 20 74 6f 20 61 74 74 65 6d 70 74 20 74 6f 20 73   to attempt to s
291f0 6f 72 74 20 72 65 73 75 6c 74 73 0a 20 20 20 20  ort results.    
29200 20 20 20 20 2a 2a 20 61 73 20 69 66 20 74 68 65      ** as if the
29210 72 65 20 77 61 73 20 61 6e 20 22 4f 52 44 45 52  re was an "ORDER
29220 20 4f 4e 20 78 22 20 6f 72 20 22 4f 52 44 45 52   ON x" or "ORDER
29230 20 4f 4e 20 78 20 44 45 53 43 22 20 63 6c 61 75   ON x DESC" clau
29240 73 65 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  se. .        ** 
29250 49 66 20 77 68 65 72 65 2e 63 20 69 73 20 61 62  If where.c is ab
29260 6c 65 20 74 6f 20 70 72 6f 64 75 63 65 20 72 65  le to produce re
29270 73 75 6c 74 73 20 73 6f 72 74 65 64 20 69 6e 20  sults sorted in 
29280 74 68 69 73 20 6f 72 64 65 72 2c 20 74 68 65 6e  this order, then
29290 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 64 64 20  .        ** add 
292a0 76 64 62 65 20 63 6f 64 65 20 74 6f 20 62 72 65  vdbe code to bre
292b0 61 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 70 72  ak out of the pr
292c0 6f 63 65 73 73 69 6e 67 20 6c 6f 6f 70 20 61 66  ocessing loop af
292d0 74 65 72 20 74 68 65 20 0a 20 20 20 20 20 20 20  ter the .       
292e0 20 2a 2a 20 66 69 72 73 74 20 69 74 65 72 61 74   ** first iterat
292f0 69 6f 6e 20 28 73 69 6e 63 65 20 74 68 65 20 66  ion (since the f
29300 69 72 73 74 20 69 74 65 72 61 74 69 6f 6e 20 6f  irst iteration o
29310 66 20 74 68 65 20 6c 6f 6f 70 20 69 73 20 0a 20  f the loop is . 
29320 20 20 20 20 20 20 20 2a 2a 20 67 75 61 72 61 6e         ** guaran
29330 74 65 65 64 20 74 6f 20 6f 70 65 72 61 74 65 20  teed to operate 
29340 6f 6e 20 74 68 65 20 72 6f 77 20 77 69 74 68 20  on the row with 
29350 74 68 65 20 6d 69 6e 69 6d 75 6d 20 6f 72 20 6d  the minimum or m
29360 61 78 69 6d 75 6d 20 0a 20 20 20 20 20 20 20 20  aximum .        
29370 2a 2a 20 76 61 6c 75 65 20 6f 66 20 78 2c 20 74  ** value of x, t
29380 68 65 20 6f 6e 6c 79 20 72 6f 77 20 72 65 71 75  he only row requ
29390 69 72 65 64 29 2e 0a 20 20 20 20 20 20 20 20 2a  ired)..        *
293a0 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 41 20 73  *.        ** A s
293b0 70 65 63 69 61 6c 20 66 6c 61 67 20 6d 75 73 74  pecial flag must
293c0 20 62 65 20 70 61 73 73 65 64 20 74 6f 20 73 71   be passed to sq
293d0 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
293e0 29 20 74 6f 20 73 6c 69 67 68 74 6c 79 0a 20 20  ) to slightly.  
293f0 20 20 20 20 20 20 2a 2a 20 6d 6f 64 69 66 79 20        ** modify 
29400 62 65 68 61 76 69 6f 72 20 61 73 20 66 6f 6c 6c  behavior as foll
29410 6f 77 73 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ows:.        **.
29420 20 20 20 20 20 20 20 20 2a 2a 20 20 20 2b 20 49          **   + I
29430 66 20 74 68 65 20 71 75 65 72 79 20 69 73 20 61  f the query is a
29440 20 22 53 45 4c 45 43 54 20 6d 69 6e 28 78 29 22   "SELECT min(x)"
29450 2c 20 74 68 65 6e 20 74 68 65 20 6c 6f 6f 70 20  , then the loop 
29460 63 6f 64 65 64 20 62 79 0a 20 20 20 20 20 20 20  coded by.       
29470 20 2a 2a 20 20 20 20 20 77 68 65 72 65 2e 63 20   **     where.c 
29480 73 68 6f 75 6c 64 20 6e 6f 74 20 69 74 65 72 61  should not itera
29490 74 65 20 6f 76 65 72 20 61 6e 79 20 76 61 6c 75  te over any valu
294a0 65 73 20 77 69 74 68 20 61 20 4e 55 4c 4c 20 76  es with a NULL v
294b0 61 6c 75 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  alue.        ** 
294c0 20 20 20 20 66 6f 72 20 78 2e 0a 20 20 20 20 20      for x..     
294d0 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
294e0 20 20 20 2b 20 54 68 65 20 6f 70 74 69 6d 69 7a     + The optimiz
294f0 65 72 20 63 6f 64 65 20 69 6e 20 77 68 65 72 65  er code in where
29500 2e 63 20 28 74 68 65 20 74 68 69 6e 67 20 74 68  .c (the thing th
29510 61 74 20 64 65 63 69 64 65 73 20 77 68 69 63 68  at decides which
29520 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20  .        **     
29530 69 6e 64 65 78 20 6f 72 20 69 6e 64 69 63 65 73  index or indices
29540 20 74 6f 20 75 73 65 29 20 73 68 6f 75 6c 64 20   to use) should 
29550 70 6c 61 63 65 20 61 20 64 69 66 66 65 72 65 6e  place a differen
29560 74 20 70 72 69 6f 72 69 74 79 20 6f 6e 20 0a 20  t priority on . 
29570 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 73 61         **     sa
29580 74 69 73 66 79 69 6e 67 20 74 68 65 20 27 4f 52  tisfying the 'OR
29590 44 45 52 20 42 59 27 20 63 6c 61 75 73 65 20 74  DER BY' clause t
295a0 68 61 6e 20 69 74 20 64 6f 65 73 20 69 6e 20 6f  han it does in o
295b0 74 68 65 72 20 63 61 73 65 73 2e 0a 20 20 20 20  ther cases..    
295c0 20 20 20 20 2a 2a 20 20 20 20 20 52 65 66 65 72      **     Refer
295d0 20 74 6f 20 63 6f 64 65 20 61 6e 64 20 63 6f 6d   to code and com
295e0 6d 65 6e 74 73 20 69 6e 20 77 68 65 72 65 2e 63  ments in where.c
295f0 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 20 20   for details..  
29600 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
29610 20 45 78 70 72 4c 69 73 74 20 2a 70 4d 69 6e 4d   ExprList *pMinM
29620 61 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ax = 0;.        
29630 75 38 20 66 6c 61 67 20 3d 20 57 48 45 52 45 5f  u8 flag = WHERE_
29640 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b 0a  ORDERBY_NORMAL;.
29650 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20          .       
29660 20 61 73 73 65 72 74 28 20 70 2d 3e 70 47 72 6f   assert( p->pGro
29670 75 70 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20  upBy==0 );.     
29680 20 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 3d     assert( flag=
29690 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  =0 );.        if
296a0 28 20 70 2d 3e 70 48 61 76 69 6e 67 3d 3d 30 20  ( p->pHaving==0 
296b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6c 61  ){.          fla
296c0 67 20 3d 20 6d 69 6e 4d 61 78 51 75 65 72 79 28  g = minMaxQuery(
296d0 26 73 41 67 67 49 6e 66 6f 2c 20 26 70 4d 69 6e  &sAggInfo, &pMin
296e0 4d 61 78 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Max);.        }.
296f0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
29700 66 6c 61 67 3d 3d 30 20 7c 7c 20 28 70 4d 69 6e  flag==0 || (pMin
29710 4d 61 78 21 3d 30 20 26 26 20 70 4d 69 6e 4d 61  Max!=0 && pMinMa
29720 78 2d 3e 6e 45 78 70 72 3d 3d 31 29 20 29 3b 0a  x->nExpr==1) );.
29730 0a 20 20 20 20 20 20 20 20 69 66 28 20 66 6c 61  .        if( fla
29740 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  g ){.          p
29750 4d 69 6e 4d 61 78 20 3d 20 73 71 6c 69 74 65 33  MinMax = sqlite3
29760 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20  ExprListDup(db, 
29770 70 4d 69 6e 4d 61 78 2c 20 30 29 3b 0a 20 20 20  pMinMax, 0);.   
29780 20 20 20 20 20 20 20 70 44 65 6c 20 3d 20 70 4d         pDel = pM
29790 69 6e 4d 61 78 3b 0a 20 20 20 20 20 20 20 20 20  inMax;.         
297a0 20 69 66 28 20 70 4d 69 6e 4d 61 78 20 26 26 20   if( pMinMax && 
297b0 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
297c0 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  d ){.           
297d0 20 70 4d 69 6e 4d 61 78 2d 3e 61 5b 30 5d 2e 73   pMinMax->a[0].s
297e0 6f 72 74 4f 72 64 65 72 20 3d 20 66 6c 61 67 21  ortOrder = flag!
297f0 3d 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d  =WHERE_ORDERBY_M
29800 49 4e 20 3f 31 3a 30 3b 0a 20 20 20 20 20 20 20  IN ?1:0;.       
29810 20 20 20 20 20 70 4d 69 6e 4d 61 78 2d 3e 61 5b       pMinMax->a[
29820 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54  0].pExpr->op = T
29830 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20  K_COLUMN;.      
29840 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
29850 20 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68    .        /* Th
29860 69 73 20 63 61 73 65 20 72 75 6e 73 20 69 66 20  is case runs if 
29870 74 68 65 20 61 67 67 72 65 67 61 74 65 20 68 61  the aggregate ha
29880 73 20 6e 6f 20 47 52 4f 55 50 20 42 59 20 63 6c  s no GROUP BY cl
29890 61 75 73 65 2e 20 20 54 68 65 0a 20 20 20 20 20  ause.  The.     
298a0 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67     ** processing
298b0 20 69 73 20 6d 75 63 68 20 73 69 6d 70 6c 65 72   is much simpler
298c0 20 73 69 6e 63 65 20 74 68 65 72 65 20 69 73 20   since there is 
298d0 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 72 6f  only a single ro
298e0 77 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20  w.        ** of 
298f0 6f 75 74 70 75 74 2e 0a 20 20 20 20 20 20 20 20  output..        
29900 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 73 65 74  */.        reset
29910 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72  Accumulator(pPar
29920 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a  se, &sAggInfo);.
29930 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f 20 3d          pWInfo =
29940 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
29950 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c  in(pParse, pTabL
29960 69 73 74 2c 20 70 57 68 65 72 65 2c 20 70 4d 69  ist, pWhere, pMi
29970 6e 4d 61 78 2c 30 2c 66 6c 61 67 2c 30 29 3b 0a  nMax,0,flag,0);.
29980 20 20 20 20 20 20 20 20 69 66 28 20 70 57 49 6e          if( pWIn
29990 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  fo==0 ){.       
299a0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
299b0 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 44 65  stDelete(db, pDe
299c0 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  l);.          go
299d0 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
299e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
299f0 20 75 70 64 61 74 65 41 63 63 75 6d 75 6c 61 74   updateAccumulat
29a00 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41 67 67  or(pParse, &sAgg
29a10 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 61  Info);.        a
29a20 73 73 65 72 74 28 20 70 4d 69 6e 4d 61 78 3d 3d  ssert( pMinMax==
29a30 30 20 7c 7c 20 70 4d 69 6e 4d 61 78 2d 3e 6e 45  0 || pMinMax->nE
29a40 78 70 72 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  xpr==1 );.      
29a50 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65    if( sqlite3Whe
29a60 72 65 49 73 4f 72 64 65 72 65 64 28 70 57 49 6e  reIsOrdered(pWIn
29a70 66 6f 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  fo) ){.         
29a80 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
29a90 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
29aa0 2c 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 72  , sqlite3WhereBr
29ab0 65 61 6b 4c 61 62 65 6c 28 70 57 49 6e 66 6f 29  eakLabel(pWInfo)
29ac0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 56 64 62  );.          Vdb
29ad0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73  eComment((v, "%s
29ae0 28 29 20 62 79 20 69 6e 64 65 78 22 2c 0a 20 20  () by index",.  
29af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 66                (f
29b00 6c 61 67 3d 3d 57 48 45 52 45 5f 4f 52 44 45 52  lag==WHERE_ORDER
29b10 42 59 5f 4d 49 4e 3f 22 6d 69 6e 22 3a 22 6d 61  BY_MIN?"min":"ma
29b20 78 22 29 29 29 3b 0a 20 20 20 20 20 20 20 20 7d  x")));.        }
29b30 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
29b40 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29  WhereEnd(pWInfo)
29b50 3b 0a 20 20 20 20 20 20 20 20 66 69 6e 61 6c 69  ;.        finali
29b60 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e 73 28 70  zeAggFunctions(p
29b70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f  Parse, &sAggInfo
29b80 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
29b90 20 20 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a    pOrderBy = 0;.
29ba0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
29bb0 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
29bc0 20 70 48 61 76 69 6e 67 2c 20 61 64 64 72 45 6e   pHaving, addrEn
29bd0 64 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  d, SQLITE_JUMPIF
29be0 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 65 6c  NULL);.      sel
29bf0 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61  ectInnerLoop(pPa
29c00 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73  rse, p, p->pELis
29c10 74 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 0a  t, 0, 0, 0, 0, .
29c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29c30 20 20 20 20 20 20 70 44 65 73 74 2c 20 61 64 64        pDest, add
29c40 72 45 6e 64 2c 20 61 64 64 72 45 6e 64 29 3b 0a  rEnd, addrEnd);.
29c50 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
29c60 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
29c70 70 44 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20  pDel);.    }.   
29c80 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
29c90 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72  lveLabel(v, addr
29ca0 45 6e 64 29 3b 0a 20 20 20 20 0a 20 20 7d 20 2f  End);.    .  } /
29cb0 2a 20 65 6e 64 69 66 20 61 67 67 72 65 67 61 74  * endif aggregat
29cc0 65 20 71 75 65 72 79 20 2a 2f 0a 0a 20 20 69 66  e query */..  if
29cd0 28 20 73 44 69 73 74 69 6e 63 74 2e 65 54 6e 63  ( sDistinct.eTnc
29ce0 74 54 79 70 65 3d 3d 57 48 45 52 45 5f 44 49 53  tType==WHERE_DIS
29cf0 54 49 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44 20  TINCT_UNORDERED 
29d00 29 7b 0a 20 20 20 20 65 78 70 6c 61 69 6e 54 65  ){.    explainTe
29d10 6d 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  mpTable(pParse, 
29d20 22 44 49 53 54 49 4e 43 54 22 29 3b 0a 20 20 7d  "DISTINCT");.  }
29d30 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
29d40 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  is an ORDER BY c
29d50 6c 61 75 73 65 2c 20 74 68 65 6e 20 77 65 20 6e  lause, then we n
29d60 65 65 64 20 74 6f 20 73 6f 72 74 20 74 68 65 20  eed to sort the 
29d70 72 65 73 75 6c 74 73 0a 20 20 2a 2a 20 61 6e 64  results.  ** and
29d80 20 73 65 6e 64 20 74 68 65 6d 20 74 6f 20 74 68   send them to th
29d90 65 20 63 61 6c 6c 62 61 63 6b 20 6f 6e 65 20 62  e callback one b
29da0 79 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  y one..  */.  if
29db0 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ( pOrderBy ){.  
29dc0 20 20 65 78 70 6c 61 69 6e 54 65 6d 70 54 61 62    explainTempTab
29dd0 6c 65 28 70 50 61 72 73 65 2c 20 22 4f 52 44 45  le(pParse, "ORDE
29de0 52 20 42 59 22 29 3b 0a 20 20 20 20 67 65 6e 65  R BY");.    gene
29df0 72 61 74 65 53 6f 72 74 54 61 69 6c 28 70 50 61  rateSortTail(pPa
29e00 72 73 65 2c 20 70 2c 20 76 2c 20 70 45 4c 69 73  rse, p, v, pELis
29e10 74 2d 3e 6e 45 78 70 72 2c 20 70 44 65 73 74 29  t->nExpr, pDest)
29e20 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70  ;.  }..  /* Jump
29e30 20 68 65 72 65 20 74 6f 20 73 6b 69 70 20 74 68   here to skip th
29e40 69 73 20 71 75 65 72 79 0a 20 20 2a 2f 0a 20 20  is query.  */.  
29e50 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
29e60 76 65 4c 61 62 65 6c 28 76 2c 20 69 45 6e 64 29  veLabel(v, iEnd)
29e70 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 53 45 4c 45  ;..  /* The SELE
29e80 43 54 20 77 61 73 20 73 75 63 63 65 73 73 66 75  CT was successfu
29e90 6c 6c 79 20 63 6f 64 65 64 2e 20 20 20 53 65 74  lly coded.   Set
29ea0 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65   the return code
29eb0 20 74 6f 20 30 0a 20 20 2a 2a 20 74 6f 20 69 6e   to 0.  ** to in
29ec0 64 69 63 61 74 65 20 6e 6f 20 65 72 72 6f 72 73  dicate no errors
29ed0 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 30 3b  ..  */.  rc = 0;
29ee0 0a 0a 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20 6a  ..  /* Control j
29ef0 75 6d 70 73 20 74 6f 20 68 65 72 65 20 69 66 20  umps to here if 
29f00 61 6e 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f  an error is enco
29f10 75 6e 74 65 72 65 64 20 61 62 6f 76 65 2c 20 6f  untered above, o
29f20 72 20 75 70 6f 6e 0a 20 20 2a 2a 20 73 75 63 63  r upon.  ** succ
29f30 65 73 73 66 75 6c 20 63 6f 64 69 6e 67 20 6f 66  essful coding of
29f40 20 74 68 65 20 53 45 4c 45 43 54 2e 0a 20 20 2a   the SELECT..  *
29f50 2f 0a 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 20 20  /.select_end:.  
29f60 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65  explainSetIntege
29f70 72 28 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63  r(pParse->iSelec
29f80 74 49 64 2c 20 69 52 65 73 74 6f 72 65 53 65 6c  tId, iRestoreSel
29f90 65 63 74 49 64 29 3b 0a 0a 20 20 2f 2a 20 49 64  ectId);..  /* Id
29fa0 65 6e 74 69 66 79 20 63 6f 6c 75 6d 6e 20 6e 61  entify column na
29fb0 6d 65 73 20 69 66 20 72 65 73 75 6c 74 73 20 6f  mes if results o
29fc0 66 20 74 68 65 20 53 45 4c 45 43 54 20 61 72 65  f the SELECT are
29fd0 20 74 6f 20 62 65 20 6f 75 74 70 75 74 2e 0a 20   to be output.. 
29fe0 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   */.  if( rc==SQ
29ff0 4c 49 54 45 5f 4f 4b 20 26 26 20 70 44 65 73 74  LITE_OK && pDest
2a000 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74  ->eDest==SRT_Out
2a010 70 75 74 20 29 7b 0a 20 20 20 20 67 65 6e 65 72  put ){.    gener
2a020 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70  ateColumnNames(p
2a030 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c  Parse, pTabList,
2a040 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a 20   pEList);.  }.. 
2a050 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
2a060 62 2c 20 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c  b, sAggInfo.aCol
2a070 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
2a080 65 65 28 64 62 2c 20 73 41 67 67 49 6e 66 6f 2e  ee(db, sAggInfo.
2a090 61 46 75 6e 63 29 3b 0a 20 20 72 65 74 75 72 6e  aFunc);.  return
2a0a0 20 72 63 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69   rc;.}..#if defi
2a0b0 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
2a0c0 45 5f 54 52 45 45 5f 45 58 50 4c 41 49 4e 29 0a  E_TREE_EXPLAIN).
2a0d0 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61  /*.** Generate a
2a0e0 20 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20   human-readable 
2a0f0 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 61  description of a
2a100 20 74 68 65 20 53 65 6c 65 63 74 20 6f 62 6a 65   the Select obje
2a110 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ct..*/.static vo
2a120 69 64 20 65 78 70 6c 61 69 6e 4f 6e 65 53 65 6c  id explainOneSel
2a130 65 63 74 28 56 64 62 65 20 2a 70 56 64 62 65 2c  ect(Vdbe *pVdbe,
2a140 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 73   Select *p){.  s
2a150 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69  qlite3ExplainPri
2a160 6e 74 66 28 70 56 64 62 65 2c 20 22 53 45 4c 45  ntf(pVdbe, "SELE
2a170 43 54 20 22 29 3b 0a 20 20 69 66 28 20 70 2d 3e  CT ");.  if( p->
2a180 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44  selFlags & (SF_D
2a190 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65  istinct|SF_Aggre
2a1a0 67 61 74 65 29 20 29 7b 0a 20 20 20 20 69 66 28  gate) ){.    if(
2a1b0 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53   p->selFlags & S
2a1c0 46 5f 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20  F_Distinct ){.  
2a1d0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
2a1e0 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20  inPrintf(pVdbe, 
2a1f0 22 44 49 53 54 49 4e 43 54 20 22 29 3b 0a 20 20  "DISTINCT ");.  
2a200 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 73    }.    if( p->s
2a210 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67 67  elFlags & SF_Agg
2a220 72 65 67 61 74 65 20 29 7b 0a 20 20 20 20 20 20  regate ){.      
2a230 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
2a240 69 6e 74 66 28 70 56 64 62 65 2c 20 22 61 67 67  intf(pVdbe, "agg
2a250 5f 66 6c 61 67 20 22 29 3b 0a 20 20 20 20 7d 0a  _flag ");.    }.
2a260 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
2a270 69 6e 4e 4c 28 70 56 64 62 65 29 3b 0a 20 20 20  inNL(pVdbe);.   
2a280 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
2a290 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22 20 20  rintf(pVdbe, "  
2a2a0 20 22 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74   ");.  }.  sqlit
2a2b0 65 33 45 78 70 6c 61 69 6e 45 78 70 72 4c 69 73  e3ExplainExprLis
2a2c0 74 28 70 56 64 62 65 2c 20 70 2d 3e 70 45 4c 69  t(pVdbe, p->pELi
2a2d0 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  st);.  sqlite3Ex
2a2e0 70 6c 61 69 6e 4e 4c 28 70 56 64 62 65 29 3b 0a  plainNL(pVdbe);.
2a2f0 20 20 69 66 28 20 70 2d 3e 70 53 72 63 20 26 26    if( p->pSrc &&
2a300 20 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 20 29   p->pSrc->nSrc )
2a310 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
2a320 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
2a330 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22 46 52  rintf(pVdbe, "FR
2a340 4f 4d 20 22 29 3b 0a 20 20 20 20 73 71 6c 69 74  OM ");.    sqlit
2a350 65 33 45 78 70 6c 61 69 6e 50 75 73 68 28 70 56  e3ExplainPush(pV
2a360 64 62 65 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  dbe);.    for(i=
2a370 30 3b 20 69 3c 70 2d 3e 70 53 72 63 2d 3e 6e 53  0; i<p->pSrc->nS
2a380 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rc; i++){.      
2a390 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
2a3a0 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 2d  tem *pItem = &p-
2a3b0 3e 70 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20  >pSrc->a[i];.   
2a3c0 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
2a3d0 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22  nPrintf(pVdbe, "
2a3e0 7b 25 64 2c 2a 7d 20 3d 20 22 2c 20 70 49 74 65  {%d,*} = ", pIte
2a3f0 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20  m->iCursor);.   
2a400 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 53     if( pItem->pS
2a410 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20  elect ){.       
2a420 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 53   sqlite3ExplainS
2a430 65 6c 65 63 74 28 70 56 64 62 65 2c 20 70 49 74  elect(pVdbe, pIt
2a440 65 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20  em->pSelect);.  
2a450 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d        if( pItem-
2a460 3e 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20  >pTab ){.       
2a470 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
2a480 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22  nPrintf(pVdbe, "
2a490 20 28 74 61 62 6e 61 6d 65 3d 25 73 29 22 2c 20   (tabname=%s)", 
2a4a0 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61  pItem->pTab->zNa
2a4b0 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  me);.        }. 
2a4c0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
2a4d0 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 29 7b 0a 20  Item->zName ){. 
2a4e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
2a4f0 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62  plainPrintf(pVdb
2a500 65 2c 20 22 25 73 22 2c 20 70 49 74 65 6d 2d 3e  e, "%s", pItem->
2a510 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a  zName);.      }.
2a520 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d        if( pItem-
2a530 3e 7a 41 6c 69 61 73 20 29 7b 0a 20 20 20 20 20  >zAlias ){.     
2a540 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
2a550 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22  nPrintf(pVdbe, "
2a560 20 28 41 53 20 25 73 29 22 2c 20 70 49 74 65 6d   (AS %s)", pItem
2a570 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 20  ->zAlias);.     
2a580 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 49 74   }.      if( pIt
2a590 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a  em->jointype & J
2a5a0 54 5f 4c 45 46 54 20 29 7b 0a 20 20 20 20 20 20  T_LEFT ){.      
2a5b0 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
2a5c0 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22 20  Printf(pVdbe, " 
2a5d0 4c 45 46 54 2d 4a 4f 49 4e 22 29 3b 0a 20 20 20  LEFT-JOIN");.   
2a5e0 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
2a5f0 65 33 45 78 70 6c 61 69 6e 4e 4c 28 70 56 64 62  e3ExplainNL(pVdb
2a600 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  e);.    }.    sq
2a610 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 6f 70 28  lite3ExplainPop(
2a620 70 56 64 62 65 29 3b 0a 20 20 7d 0a 20 20 69 66  pVdbe);.  }.  if
2a630 28 20 70 2d 3e 70 57 68 65 72 65 20 29 7b 0a 20  ( p->pWhere ){. 
2a640 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
2a650 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22  nPrintf(pVdbe, "
2a660 57 48 45 52 45 20 22 29 3b 0a 20 20 20 20 73 71  WHERE ");.    sq
2a670 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72  lite3ExplainExpr
2a680 28 70 56 64 62 65 2c 20 70 2d 3e 70 57 68 65 72  (pVdbe, p->pWher
2a690 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  e);.    sqlite3E
2a6a0 78 70 6c 61 69 6e 4e 4c 28 70 56 64 62 65 29 3b  xplainNL(pVdbe);
2a6b0 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 47  .  }.  if( p->pG
2a6c0 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 73 71  roupBy ){.    sq
2a6d0 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e  lite3ExplainPrin
2a6e0 74 66 28 70 56 64 62 65 2c 20 22 47 52 4f 55 50  tf(pVdbe, "GROUP
2a6f0 42 59 20 22 29 3b 0a 20 20 20 20 73 71 6c 69 74  BY ");.    sqlit
2a700 65 33 45 78 70 6c 61 69 6e 45 78 70 72 4c 69 73  e3ExplainExprLis
2a710 74 28 70 56 64 62 65 2c 20 70 2d 3e 70 47 72 6f  t(pVdbe, p->pGro
2a720 75 70 42 79 29 3b 0a 20 20 20 20 73 71 6c 69 74  upBy);.    sqlit
2a730 65 33 45 78 70 6c 61 69 6e 4e 4c 28 70 56 64 62  e3ExplainNL(pVdb
2a740 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d  e);.  }.  if( p-
2a750 3e 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20  >pHaving ){.    
2a760 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
2a770 69 6e 74 66 28 70 56 64 62 65 2c 20 22 48 41 56  intf(pVdbe, "HAV
2a780 49 4e 47 20 22 29 3b 0a 20 20 20 20 73 71 6c 69  ING ");.    sqli
2a790 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72 28 70  te3ExplainExpr(p
2a7a0 56 64 62 65 2c 20 70 2d 3e 70 48 61 76 69 6e 67  Vdbe, p->pHaving
2a7b0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
2a7c0 70 6c 61 69 6e 4e 4c 28 70 56 64 62 65 29 3b 0a  plainNL(pVdbe);.
2a7d0 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72    }.  if( p->pOr
2a7e0 64 65 72 42 79 20 29 7b 0a 20 20 20 20 73 71 6c  derBy ){.    sql
2a7f0 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74  ite3ExplainPrint
2a800 66 28 70 56 64 62 65 2c 20 22 4f 52 44 45 52 42  f(pVdbe, "ORDERB
2a810 59 20 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Y ");.    sqlite
2a820 33 45 78 70 6c 61 69 6e 45 78 70 72 4c 69 73 74  3ExplainExprList
2a830 28 70 56 64 62 65 2c 20 70 2d 3e 70 4f 72 64 65  (pVdbe, p->pOrde
2a840 72 42 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  rBy);.    sqlite
2a850 33 45 78 70 6c 61 69 6e 4e 4c 28 70 56 64 62 65  3ExplainNL(pVdbe
2a860 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  );.  }.  if( p->
2a870 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71  pLimit ){.    sq
2a880 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e  lite3ExplainPrin
2a890 74 66 28 70 56 64 62 65 2c 20 22 4c 49 4d 49 54  tf(pVdbe, "LIMIT
2a8a0 20 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   ");.    sqlite3
2a8b0 45 78 70 6c 61 69 6e 45 78 70 72 28 70 56 64 62  ExplainExpr(pVdb
2a8c0 65 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20  e, p->pLimit);. 
2a8d0 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
2a8e0 6e 4e 4c 28 70 56 64 62 65 29 3b 0a 20 20 7d 0a  nNL(pVdbe);.  }.
2a8f0 20 20 69 66 28 20 70 2d 3e 70 4f 66 66 73 65 74    if( p->pOffset
2a900 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
2a910 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64  xplainPrintf(pVd
2a920 62 65 2c 20 22 4f 46 46 53 45 54 20 22 29 3b 0a  be, "OFFSET ");.
2a930 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
2a940 69 6e 45 78 70 72 28 70 56 64 62 65 2c 20 70 2d  inExpr(pVdbe, p-
2a950 3e 70 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 73  >pOffset);.    s
2a960 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 4e 4c 28  qlite3ExplainNL(
2a970 70 56 64 62 65 29 3b 0a 20 20 7d 0a 7d 0a 76 6f  pVdbe);.  }.}.vo
2a980 69 64 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69  id sqlite3Explai
2a990 6e 53 65 6c 65 63 74 28 56 64 62 65 20 2a 70 56  nSelect(Vdbe *pV
2a9a0 64 62 65 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b  dbe, Select *p){
2a9b0 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20  .  if( p==0 ){. 
2a9c0 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
2a9d0 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22  nPrintf(pVdbe, "
2a9e0 28 6e 75 6c 6c 2d 73 65 6c 65 63 74 29 22 29 3b  (null-select)");
2a9f0 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
2aa00 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 70 50 72  .  while( p->pPr
2aa10 69 6f 72 20 29 7b 0a 20 20 20 20 70 2d 3e 70 50  ior ){.    p->pP
2aa20 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 70 3b  rior->pNext = p;
2aa30 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 50 72 69  .    p = p->pPri
2aa40 6f 72 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  or;.  }.  sqlite
2aa50 33 45 78 70 6c 61 69 6e 50 75 73 68 28 70 56 64  3ExplainPush(pVd
2aa60 62 65 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 20  be);.  while( p 
2aa70 29 7b 0a 20 20 20 20 65 78 70 6c 61 69 6e 4f 6e  ){.    explainOn
2aa80 65 53 65 6c 65 63 74 28 70 56 64 62 65 2c 20 70  eSelect(pVdbe, p
2aa90 29 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e  );.    p = p->pN
2aaa0 65 78 74 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d  ext;.    if( p==
2aab0 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 73  0 ) break;.    s
2aac0 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 4e 4c 28  qlite3ExplainNL(
2aad0 70 56 64 62 65 29 3b 0a 20 20 20 20 73 71 6c 69  pVdbe);.    sqli
2aae0 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
2aaf0 28 70 56 64 62 65 2c 20 22 25 73 5c 6e 22 2c 20  (pVdbe, "%s\n", 
2ab00 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e  selectOpName(p->
2ab10 6f 70 29 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  op));.  }.  sqli
2ab20 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
2ab30 28 70 56 64 62 65 2c 20 22 45 4e 44 22 29 3b 0a  (pVdbe, "END");.
2ab40 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
2ab50 50 6f 70 28 70 56 64 62 65 29 3b 0a 7d 0a 0a 2f  Pop(pVdbe);.}../
2ab60 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 73 74 72  * End of the str
2ab70 75 63 74 75 72 65 20 64 65 62 75 67 20 70 72 69  ucture debug pri
2ab80 6e 74 69 6e 67 20 63 6f 64 65 0a 2a 2a 2a 2a 2a  nting code.*****
2ab90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2aba0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2abb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2abc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2abd0 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 23 65 6e 64 69 66  ********/.#endif
2abe0 20 2f 2a 20 64 65 66 69 6e 65 64 28 53 51 4c 49   /* defined(SQLI
2abf0 54 45 5f 45 4e 41 42 4c 45 5f 54 52 45 45 5f 45  TE_ENABLE_TREE_E
2ac00 58 50 4c 41 49 4e 29 20 2a 2f 0a                 XPLAIN) */.