/ Hex Artifact Content
Login

Artifact 15127b54cc11defb2cddef6914e1f384501a61c4:


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 41 6c 73 6f 20 74  er..**.** Also t
8ea0: 72 79 20 74 6f 20 65 73 74 69 6d 61 74 65 20 74  ry to estimate t
8eb0: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 72  he size of the r
8ec0: 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20 61 6e  eturned value an
8ed0: 64 20 72 65 74 75 72 6e 20 74 68 61 74 0a 2a 2a  d return that.**
8ee0: 20 72 65 73 75 6c 74 20 69 6e 20 2a 70 45 73 74   result in *pEst
8ef0: 57 69 64 74 68 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  Width..**.** The
8f00: 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70   declaration typ
8f10: 65 20 69 73 20 74 68 65 20 65 78 61 63 74 20 64  e is the exact d
8f20: 61 74 61 74 79 70 65 20 64 65 66 69 6e 69 74 69  atatype definiti
8f30: 6f 6e 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  on extracted fro
8f40: 6d 20 74 68 65 0a 2a 2a 20 6f 72 69 67 69 6e 61  m the.** origina
8f50: 6c 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  l CREATE TABLE s
8f60: 74 61 74 65 6d 65 6e 74 20 69 66 20 74 68 65 20  tatement if the 
8f70: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20  expression is a 
8f80: 63 6f 6c 75 6d 6e 2e 20 54 68 65 0a 2a 2a 20 64  column. The.** d
8f90: 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20  eclaration type 
8fa0: 66 6f 72 20 61 20 52 4f 57 49 44 20 66 69 65 6c  for a ROWID fiel
8fb0: 64 20 69 73 20 49 4e 54 45 47 45 52 2e 20 45 78  d is INTEGER. Ex
8fc0: 61 63 74 6c 79 20 77 68 65 6e 20 61 6e 20 65 78  actly when an ex
8fd0: 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 63  pression.** is c
8fe0: 6f 6e 73 69 64 65 72 65 64 20 61 20 63 6f 6c 75  onsidered a colu
8ff0: 6d 6e 20 63 61 6e 20 62 65 20 63 6f 6d 70 6c 65  mn can be comple
9000: 78 20 69 6e 20 74 68 65 20 70 72 65 73 65 6e 63  x in the presenc
9010: 65 20 6f 66 20 73 75 62 71 75 65 72 69 65 73 2e  e of subqueries.
9020: 20 54 68 65 0a 2a 2a 20 72 65 73 75 6c 74 2d 73   The.** result-s
9030: 65 74 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e  et expression in
9040: 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c   all of the foll
9050: 6f 77 69 6e 67 20 53 45 4c 45 43 54 20 73 74 61  owing SELECT sta
9060: 74 65 6d 65 6e 74 73 20 69 73 20 0a 2a 2a 20 63  tements is .** c
9070: 6f 6e 73 69 64 65 72 65 64 20 61 20 63 6f 6c 75  onsidered a colu
9080: 6d 6e 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  mn by this funct
9090: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c  ion..**.**   SEL
90a0: 45 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c  ECT col FROM tbl
90b0: 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 28 53  ;.**   SELECT (S
90c0: 45 4c 45 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74  ELECT col FROM t
90d0: 62 6c 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20  bl;.**   SELECT 
90e0: 28 53 45 4c 45 43 54 20 63 6f 6c 20 46 52 4f 4d  (SELECT col FROM
90f0: 20 74 62 6c 29 3b 0a 2a 2a 20 20 20 53 45 4c 45   tbl);.**   SELE
9100: 43 54 20 61 62 63 20 46 52 4f 4d 20 28 53 45 4c  CT abc FROM (SEL
9110: 45 43 54 20 63 6f 6c 20 41 53 20 61 62 63 20 46  ECT col AS abc F
9120: 52 4f 4d 20 74 62 6c 29 3b 0a 2a 2a 20 0a 2a 2a  ROM tbl);.** .**
9130: 20 54 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e   The declaration
9140: 20 74 79 70 65 20 66 6f 72 20 61 6e 79 20 65 78   type for any ex
9150: 70 72 65 73 73 69 6f 6e 20 6f 74 68 65 72 20 74  pression other t
9160: 68 61 6e 20 61 20 63 6f 6c 75 6d 6e 20 69 73 20  han a column is 
9170: 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  NULL..**.** This
9180: 20 72 6f 75 74 69 6e 65 20 68 61 73 20 65 69 74   routine has eit
9190: 68 65 72 20 33 20 6f 72 20 36 20 70 61 72 61 6d  her 3 or 6 param
91a0: 65 74 65 72 73 20 64 65 70 65 6e 64 69 6e 67 20  eters depending 
91b0: 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  on whether or no
91c0: 74 0a 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f  t.** the SQLITE_
91d0: 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45  ENABLE_COLUMN_ME
91e0: 54 41 44 41 54 41 20 63 6f 6d 70 69 6c 65 2d 74  TADATA compile-t
91f0: 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20 75 73  ime option is us
9200: 65 64 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  ed..*/.#ifdef SQ
9210: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55  LITE_ENABLE_COLU
9220: 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 23 20 64 65  MN_METADATA.# de
9230: 66 69 6e 65 20 63 6f 6c 75 6d 6e 54 79 70 65 28  fine columnType(
9240: 41 2c 42 2c 43 2c 44 2c 45 2c 46 29 20 63 6f 6c  A,B,C,D,E,F) col
9250: 75 6d 6e 54 79 70 65 49 6d 70 6c 28 41 2c 42 2c  umnTypeImpl(A,B,
9260: 43 2c 44 2c 45 2c 46 29 0a 73 74 61 74 69 63 20  C,D,E,F).static 
9270: 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6c 75  const char *colu
9280: 6d 6e 54 79 70 65 49 6d 70 6c 28 0a 20 20 4e 61  mnTypeImpl(.  Na
9290: 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20  meContext *pNC, 
92a0: 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 0a  .  Expr *pExpr,.
92b0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70    const char **p
92c0: 7a 4f 72 69 67 44 62 2c 0a 20 20 63 6f 6e 73 74  zOrigDb,.  const
92d0: 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67 54 61   char **pzOrigTa
92e0: 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  b,.  const char 
92f0: 2a 2a 70 7a 4f 72 69 67 43 6f 6c 2c 0a 20 20 75  **pzOrigCol,.  u
9300: 38 20 2a 70 45 73 74 57 69 64 74 68 0a 29 7b 0a  8 *pEstWidth.){.
9310: 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f    char const *zO
9320: 72 69 67 44 62 20 3d 20 30 3b 0a 20 20 63 68 61  rigDb = 0;.  cha
9330: 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67 54 61  r const *zOrigTa
9340: 62 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 63 6f  b = 0;.  char co
9350: 6e 73 74 20 2a 7a 4f 72 69 67 43 6f 6c 20 3d 20  nst *zOrigCol = 
9360: 30 3b 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 21  0;.#else /* if !
9370: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
9380: 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54  NABLE_COLUMN_MET
9390: 41 44 41 54 41 29 20 2a 2f 0a 23 20 64 65 66 69  ADATA) */.# defi
93a0: 6e 65 20 63 6f 6c 75 6d 6e 54 79 70 65 28 41 2c  ne columnType(A,
93b0: 42 2c 43 2c 44 2c 45 2c 46 29 20 63 6f 6c 75 6d  B,C,D,E,F) colum
93c0: 6e 54 79 70 65 49 6d 70 6c 28 41 2c 42 2c 46 29  nTypeImpl(A,B,F)
93d0: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
93e0: 61 72 20 2a 63 6f 6c 75 6d 6e 54 79 70 65 49 6d  ar *columnTypeIm
93f0: 70 6c 28 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78  pl(.  NameContex
9400: 74 20 2a 70 4e 43 2c 20 0a 20 20 45 78 70 72 20  t *pNC, .  Expr 
9410: 2a 70 45 78 70 72 2c 0a 20 20 75 38 20 2a 70 45  *pExpr,.  u8 *pE
9420: 73 74 57 69 64 74 68 0a 29 7b 0a 23 65 6e 64 69  stWidth.){.#endi
9430: 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51  f /* !defined(SQ
9440: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55  LITE_ENABLE_COLU
9450: 4d 4e 5f 4d 45 54 41 44 41 54 41 29 20 2a 2f 0a  MN_METADATA) */.
9460: 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 54    char const *zT
9470: 79 70 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6a  ype = 0;.  int j
9480: 3b 0a 20 20 75 38 20 65 73 74 57 69 64 74 68 20  ;.  u8 estWidth 
9490: 3d 20 31 3b 0a 0a 20 20 69 66 28 20 4e 45 56 45  = 1;..  if( NEVE
94a0: 52 28 70 45 78 70 72 3d 3d 30 29 20 7c 7c 20 70  R(pExpr==0) || p
94b0: 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3d 3d 30 20  NC->pSrcList==0 
94c0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 77  ) return 0;.  sw
94d0: 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20  itch( pExpr->op 
94e0: 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  ){.    case TK_A
94f0: 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63  GG_COLUMN:.    c
9500: 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b  ase TK_COLUMN: {
9510: 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78  .      /* The ex
9520: 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f  pression is a co
9530: 6c 75 6d 6e 2e 20 4c 6f 63 61 74 65 20 74 68 65  lumn. Locate the
9540: 20 74 61 62 6c 65 20 74 68 65 20 63 6f 6c 75 6d   table the colum
9550: 6e 20 69 73 20 62 65 69 6e 67 0a 20 20 20 20 20  n is being.     
9560: 20 2a 2a 20 65 78 74 72 61 63 74 65 64 20 66 72   ** extracted fr
9570: 6f 6d 20 69 6e 20 4e 61 6d 65 43 6f 6e 74 65 78  om in NameContex
9580: 74 2e 70 53 72 63 4c 69 73 74 2e 20 54 68 69 73  t.pSrcList. This
9590: 20 74 61 62 6c 65 20 6d 61 79 20 62 65 20 72 65   table may be re
95a0: 61 6c 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61  al.      ** data
95b0: 62 61 73 65 20 74 61 62 6c 65 20 6f 72 20 61 20  base table or a 
95c0: 73 75 62 71 75 65 72 79 2e 0a 20 20 20 20 20 20  subquery..      
95d0: 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a  */.      Table *
95e0: 70 54 61 62 20 3d 20 30 3b 20 20 20 20 20 20 20  pTab = 0;       
95f0: 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 73 74       /* Table st
9600: 72 75 63 74 75 72 65 20 63 6f 6c 75 6d 6e 20 69  ructure column i
9610: 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  s extracted from
9620: 20 2a 2f 0a 20 20 20 20 20 20 53 65 6c 65 63 74   */.      Select
9630: 20 2a 70 53 20 3d 20 30 3b 20 20 20 20 20 20 20   *pS = 0;       
9640: 20 20 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 20        /* Select 
9650: 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 65 78  the column is ex
9660: 74 72 61 63 74 65 64 20 66 72 6f 6d 20 2a 2f 0a  tracted from */.
9670: 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d        int iCol =
9680: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b   pExpr->iColumn;
9690: 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f    /* Index of co
96a0: 6c 75 6d 6e 20 69 6e 20 70 54 61 62 20 2a 2f 0a  lumn in pTab */.
96b0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
96c0: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47  pExpr->op==TK_AG
96d0: 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20  G_COLUMN );.    
96e0: 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
96f0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op==TK_COLUMN
9700: 20 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28   );.      while(
9710: 20 70 4e 43 20 26 26 20 21 70 54 61 62 20 29 7b   pNC && !pTab ){
9720: 0a 20 20 20 20 20 20 20 20 53 72 63 4c 69 73 74  .        SrcList
9730: 20 2a 70 54 61 62 4c 69 73 74 20 3d 20 70 4e 43   *pTabList = pNC
9740: 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20 20 20  ->pSrcList;.    
9750: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 6a 3c 70 54      for(j=0;j<pT
9760: 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 26 26 20  abList->nSrc && 
9770: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69  pTabList->a[j].i
9780: 43 75 72 73 6f 72 21 3d 70 45 78 70 72 2d 3e 69  Cursor!=pExpr->i
9790: 54 61 62 6c 65 3b 6a 2b 2b 29 3b 0a 20 20 20 20  Table;j++);.    
97a0: 20 20 20 20 69 66 28 20 6a 3c 70 54 61 62 4c 69      if( j<pTabLi
97b0: 73 74 2d 3e 6e 53 72 63 20 29 7b 0a 20 20 20 20  st->nSrc ){.    
97c0: 20 20 20 20 20 20 70 54 61 62 20 3d 20 70 54 61        pTab = pTa
97d0: 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 54 61 62  bList->a[j].pTab
97e0: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53 20 3d  ;.          pS =
97f0: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e   pTabList->a[j].
9800: 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 20  pSelect;.       
9810: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
9820: 20 20 70 4e 43 20 3d 20 70 4e 43 2d 3e 70 4e 65    pNC = pNC->pNe
9830: 78 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  xt;.        }.  
9840: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28      }..      if(
9850: 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20   pTab==0 ){.    
9860: 20 20 20 20 2f 2a 20 41 74 20 6f 6e 65 20 74 69      /* At one ti
9870: 6d 65 2c 20 63 6f 64 65 20 73 75 63 68 20 61 73  me, code such as
9880: 20 22 53 45 4c 45 43 54 20 6e 65 77 2e 78 22 20   "SELECT new.x" 
9890: 77 69 74 68 69 6e 20 61 20 74 72 69 67 67 65 72  within a trigger
98a0: 20 77 6f 75 6c 64 0a 20 20 20 20 20 20 20 20 2a   would.        *
98b0: 2a 20 63 61 75 73 65 20 74 68 69 73 20 63 6f 6e  * cause this con
98c0: 64 69 74 69 6f 6e 20 74 6f 20 72 75 6e 2e 20 20  dition to run.  
98d0: 53 69 6e 63 65 20 74 68 65 6e 2c 20 77 65 20 68  Since then, we h
98e0: 61 76 65 20 72 65 73 74 72 75 63 74 75 72 65 64  ave restructured
98f0: 20 68 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a 20   how.        ** 
9900: 74 72 69 67 67 65 72 20 63 6f 64 65 20 69 73 20  trigger code is 
9910: 67 65 6e 65 72 61 74 65 64 20 61 6e 64 20 73 6f  generated and so
9920: 20 74 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e 20   this condition 
9930: 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 0a 20 20  is no longer .  
9940: 20 20 20 20 20 20 2a 2a 20 70 6f 73 73 69 62 6c        ** possibl
9950: 65 2e 20 48 6f 77 65 76 65 72 2c 20 69 74 20 63  e. However, it c
9960: 61 6e 20 73 74 69 6c 6c 20 62 65 20 74 72 75 65  an still be true
9970: 20 66 6f 72 20 73 74 61 74 65 6d 65 6e 74 73 20   for statements 
9980: 6c 69 6b 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  like.        ** 
9990: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20  the following:. 
99a0: 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
99b0: 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41    **   CREATE TA
99c0: 42 4c 45 20 74 31 28 63 6f 6c 20 49 4e 54 45 47  BLE t1(col INTEG
99d0: 45 52 29 3b 0a 20 20 20 20 20 20 20 20 2a 2a 20  ER);.        ** 
99e0: 20 20 53 45 4c 45 43 54 20 28 53 45 4c 45 43 54    SELECT (SELECT
99f0: 20 74 31 2e 63 6f 6c 29 20 46 52 4f 4d 20 46 52   t1.col) FROM FR
9a00: 4f 4d 20 74 31 3b 0a 20 20 20 20 20 20 20 20 2a  OM t1;.        *
9a10: 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 68 65  *.        ** whe
9a20: 6e 20 63 6f 6c 75 6d 6e 54 79 70 65 28 29 20 69  n columnType() i
9a30: 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20  s called on the 
9a40: 65 78 70 72 65 73 73 69 6f 6e 20 22 74 31 2e 63  expression "t1.c
9a50: 6f 6c 22 20 69 6e 20 74 68 65 20 0a 20 20 20 20  ol" in the .    
9a60: 20 20 20 20 2a 2a 20 73 75 62 2d 73 65 6c 65 63      ** sub-selec
9a70: 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c  t. In this case,
9a80: 20 73 65 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20   set the column 
9a90: 74 79 70 65 20 74 6f 20 4e 55 4c 4c 2c 20 65 76  type to NULL, ev
9aa0: 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  en.        ** th
9ab0: 6f 75 67 68 20 69 74 20 73 68 6f 75 6c 64 20 72  ough it should r
9ac0: 65 61 6c 6c 79 20 62 65 20 22 49 4e 54 45 47 45  eally be "INTEGE
9ad0: 52 22 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  R"..        **. 
9ae0: 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69         ** This i
9af0: 73 20 6e 6f 74 20 61 20 70 72 6f 62 6c 65 6d 2c  s not a problem,
9b00: 20 61 73 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74   as the column t
9b10: 79 70 65 20 6f 66 20 22 74 31 2e 63 6f 6c 22 20  ype of "t1.col" 
9b20: 69 73 20 6e 65 76 65 72 0a 20 20 20 20 20 20 20  is never.       
9b30: 20 2a 2a 20 75 73 65 64 2e 20 57 68 65 6e 20 63   ** used. When c
9b40: 6f 6c 75 6d 6e 54 79 70 65 28 29 20 69 73 20 63  olumnType() is c
9b50: 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 65 78 70  alled on the exp
9b60: 72 65 73 73 69 6f 6e 20 0a 20 20 20 20 20 20 20  ression .       
9b70: 20 2a 2a 20 22 28 53 45 4c 45 43 54 20 74 31 2e   ** "(SELECT t1.
9b80: 63 6f 6c 29 22 2c 20 74 68 65 20 63 6f 72 72 65  col)", the corre
9b90: 63 74 20 74 79 70 65 20 69 73 20 72 65 74 75 72  ct type is retur
9ba0: 6e 65 64 20 28 73 65 65 20 74 68 65 20 54 4b 5f  ned (see the TK_
9bb0: 53 45 4c 45 43 54 0a 20 20 20 20 20 20 20 20 2a  SELECT.        *
9bc0: 2a 20 62 72 61 6e 63 68 20 62 65 6c 6f 77 2e 20  * branch below. 
9bd0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61   */.        brea
9be0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  k;.      }..    
9bf0: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 20 26    assert( pTab &
9c00: 26 20 70 45 78 70 72 2d 3e 70 54 61 62 3d 3d 70  & pExpr->pTab==p
9c10: 54 61 62 20 29 3b 0a 20 20 20 20 20 20 69 66 28  Tab );.      if(
9c20: 20 70 53 20 29 7b 0a 20 20 20 20 20 20 20 20 2f   pS ){.        /
9c30: 2a 20 54 68 65 20 22 74 61 62 6c 65 22 20 69 73  * The "table" is
9c40: 20 61 63 74 75 61 6c 6c 79 20 61 20 73 75 62 2d   actually a sub-
9c50: 73 65 6c 65 63 74 20 6f 72 20 61 20 76 69 65 77  select or a view
9c60: 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
9c70: 75 73 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  use.        ** o
9c80: 66 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  f the SELECT sta
9c90: 74 65 6d 65 6e 74 2e 20 52 65 74 75 72 6e 20 74  tement. Return t
9ca0: 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74  he declaration t
9cb0: 79 70 65 20 61 6e 64 20 6f 72 69 67 69 6e 0a 20  ype and origin. 
9cc0: 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61 20 66         ** data f
9cd0: 6f 72 20 74 68 65 20 72 65 73 75 6c 74 2d 73 65  or the result-se
9ce0: 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  t column of the 
9cf0: 73 75 62 2d 73 65 6c 65 63 74 2e 0a 20 20 20 20  sub-select..    
9d00: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
9d10: 66 28 20 69 43 6f 6c 3e 3d 30 20 26 26 20 41 4c  f( iCol>=0 && AL
9d20: 57 41 59 53 28 69 43 6f 6c 3c 70 53 2d 3e 70 45  WAYS(iCol<pS->pE
9d30: 4c 69 73 74 2d 3e 6e 45 78 70 72 29 20 29 7b 0a  List->nExpr) ){.
9d40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
9d50: 69 43 6f 6c 20 69 73 20 6c 65 73 73 20 74 68 61  iCol is less tha
9d60: 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  n zero, then the
9d70: 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65 71 75   expression requ
9d80: 65 73 74 73 20 74 68 65 0a 20 20 20 20 20 20 20  ests the.       
9d90: 20 20 20 2a 2a 20 72 6f 77 69 64 20 6f 66 20 74     ** rowid of t
9da0: 68 65 20 73 75 62 2d 73 65 6c 65 63 74 20 6f 72  he sub-select or
9db0: 20 76 69 65 77 2e 20 54 68 69 73 20 65 78 70 72   view. This expr
9dc0: 65 73 73 69 6f 6e 20 69 73 20 6c 65 67 61 6c 20  ession is legal 
9dd0: 28 73 65 65 20 0a 20 20 20 20 20 20 20 20 20 20  (see .          
9de0: 2a 2a 20 74 65 73 74 20 63 61 73 65 20 6d 69 73  ** test case mis
9df0: 63 32 2e 32 2e 32 29 20 2d 20 69 74 20 61 6c 77  c2.2.2) - it alw
9e00: 61 79 73 20 65 76 61 6c 75 61 74 65 73 20 74 6f  ays evaluates to
9e10: 20 4e 55 4c 4c 2e 0a 20 20 20 20 20 20 20 20 20   NULL..         
9e20: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 4e 61   */.          Na
9e30: 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20  meContext sNC;. 
9e40: 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70           Expr *p
9e50: 20 3d 20 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 61   = pS->pEList->a
9e60: 5b 69 43 6f 6c 5d 2e 70 45 78 70 72 3b 0a 20 20  [iCol].pExpr;.  
9e70: 20 20 20 20 20 20 20 20 73 4e 43 2e 70 53 72 63          sNC.pSrc
9e80: 4c 69 73 74 20 3d 20 70 53 2d 3e 70 53 72 63 3b  List = pS->pSrc;
9e90: 0a 20 20 20 20 20 20 20 20 20 20 73 4e 43 2e 70  .          sNC.p
9ea0: 4e 65 78 74 20 3d 20 70 4e 43 3b 0a 20 20 20 20  Next = pNC;.    
9eb0: 20 20 20 20 20 20 73 4e 43 2e 70 50 61 72 73 65        sNC.pParse
9ec0: 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a   = pNC->pParse;.
9ed0: 20 20 20 20 20 20 20 20 20 20 7a 54 79 70 65 20            zType 
9ee0: 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e  = columnType(&sN
9ef0: 43 2c 20 70 2c 26 7a 4f 72 69 67 44 62 2c 26 7a  C, p,&zOrigDb,&z
9f00: 4f 72 69 67 54 61 62 2c 26 7a 4f 72 69 67 43 6f  OrigTab,&zOrigCo
9f10: 6c 2c 20 26 65 73 74 57 69 64 74 68 29 3b 20 0a  l, &estWidth); .
9f20: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
9f30: 7d 65 6c 73 65 20 69 66 28 20 41 4c 57 41 59 53  }else if( ALWAYS
9f40: 28 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 20  (pTab->pSchema) 
9f50: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 20  ){.        /* A 
9f60: 72 65 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20  real table */.  
9f70: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
9f80: 53 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  S );.        if(
9f90: 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d   iCol<0 ) iCol =
9fa0: 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20   pTab->iPKey;.  
9fb0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 43        assert( iC
9fc0: 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e  ol==-1 || (iCol>
9fd0: 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d  =0 && iCol<pTab-
9fe0: 3e 6e 43 6f 6c 29 20 29 3b 0a 23 69 66 64 65 66  >nCol) );.#ifdef
9ff0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
a000: 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20  OLUMN_METADATA. 
a010: 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c         if( iCol<
a020: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  0 ){.          z
a030: 54 79 70 65 20 3d 20 22 49 4e 54 45 47 45 52 22  Type = "INTEGER"
a040: 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 72 69  ;.          zOri
a050: 67 43 6f 6c 20 3d 20 22 72 6f 77 69 64 22 3b 0a  gCol = "rowid";.
a060: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
a070: 20 20 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d           zType =
a080: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
a090: 5d 2e 7a 54 79 70 65 3b 0a 20 20 20 20 20 20 20  ].zType;.       
a0a0: 20 20 20 7a 4f 72 69 67 43 6f 6c 20 3d 20 70 54     zOrigCol = pT
a0b0: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a  ab->aCol[iCol].z
a0c0: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Name;.          
a0d0: 65 73 74 57 69 64 74 68 20 3d 20 70 54 61 62 2d  estWidth = pTab-
a0e0: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 73 7a 45 73  >aCol[iCol].szEs
a0f0: 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
a100: 20 20 20 20 20 7a 4f 72 69 67 54 61 62 20 3d 20       zOrigTab = 
a110: 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20  pTab->zName;.   
a120: 20 20 20 20 20 69 66 28 20 70 4e 43 2d 3e 70 50       if( pNC->pP
a130: 61 72 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20  arse ){.        
a140: 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69    int iDb = sqli
a150: 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
a160: 28 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62  (pNC->pParse->db
a170: 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29  , pTab->pSchema)
a180: 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 72 69  ;.          zOri
a190: 67 44 62 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73  gDb = pNC->pPars
a1a0: 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e  e->db->aDb[iDb].
a1b0: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 7d  zName;.        }
a1c0: 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 20 20 69  .#else.        i
a1d0: 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20  f( iCol<0 ){.   
a1e0: 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22         zType = "
a1f0: 49 4e 54 45 47 45 52 22 3b 0a 20 20 20 20 20 20  INTEGER";.      
a200: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
a210: 20 20 20 7a 54 79 70 65 20 3d 20 70 54 61 62 2d     zType = pTab-
a220: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70  >aCol[iCol].zTyp
a230: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 65 73 74  e;.          est
a240: 57 69 64 74 68 20 3d 20 70 54 61 62 2d 3e 61 43  Width = pTab->aC
a250: 6f 6c 5b 69 43 6f 6c 5d 2e 73 7a 45 73 74 3b 0a  ol[iCol].szEst;.
a260: 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66          }.#endif
a270: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
a280: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  reak;.    }.#ifn
a290: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
a2a0: 53 55 42 51 55 45 52 59 0a 20 20 20 20 63 61 73  SUBQUERY.    cas
a2b0: 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20  e TK_SELECT: {. 
a2c0: 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72       /* The expr
a2d0: 65 73 73 69 6f 6e 20 69 73 20 61 20 73 75 62 2d  ession is a sub-
a2e0: 73 65 6c 65 63 74 2e 20 52 65 74 75 72 6e 20 74  select. Return t
a2f0: 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74  he declaration t
a300: 79 70 65 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a  ype and.      **
a310: 20 6f 72 69 67 69 6e 20 69 6e 66 6f 20 66 6f 72   origin info for
a320: 20 74 68 65 20 73 69 6e 67 6c 65 20 63 6f 6c 75   the single colu
a330: 6d 6e 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  mn in the result
a340: 20 73 65 74 20 6f 66 20 74 68 65 20 53 45 4c 45   set of the SELE
a350: 43 54 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74  CT.      ** stat
a360: 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a  ement..      */.
a370: 20 20 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78        NameContex
a380: 74 20 73 4e 43 3b 0a 20 20 20 20 20 20 53 65 6c  t sNC;.      Sel
a390: 65 63 74 20 2a 70 53 20 3d 20 70 45 78 70 72 2d  ect *pS = pExpr-
a3a0: 3e 78 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20  >x.pSelect;.    
a3b0: 20 20 45 78 70 72 20 2a 70 20 3d 20 70 53 2d 3e    Expr *p = pS->
a3c0: 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  pEList->a[0].pEx
a3d0: 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  pr;.      assert
a3e0: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
a3f0: 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
a400: 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20  elect) );.      
a410: 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70  sNC.pSrcList = p
a420: 53 2d 3e 70 53 72 63 3b 0a 20 20 20 20 20 20 73  S->pSrc;.      s
a430: 4e 43 2e 70 4e 65 78 74 20 3d 20 70 4e 43 3b 0a  NC.pNext = pNC;.
a440: 20 20 20 20 20 20 73 4e 43 2e 70 50 61 72 73 65        sNC.pParse
a450: 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a   = pNC->pParse;.
a460: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f        zType = co
a470: 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70  lumnType(&sNC, p
a480: 2c 20 26 7a 4f 72 69 67 44 62 2c 20 26 7a 4f 72  , &zOrigDb, &zOr
a490: 69 67 54 61 62 2c 20 26 7a 4f 72 69 67 43 6f 6c  igTab, &zOrigCol
a4a0: 2c 20 26 65 73 74 57 69 64 74 68 29 3b 20 0a 20  , &estWidth); . 
a4b0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
a4c0: 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 23 69  }.#endif.  }..#i
a4d0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
a4e0: 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41  LE_COLUMN_METADA
a4f0: 54 41 20 20 0a 20 20 69 66 28 20 70 7a 4f 72 69  TA  .  if( pzOri
a500: 67 44 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72  gDb ){.    asser
a510: 74 28 20 70 7a 4f 72 69 67 54 61 62 20 26 26 20  t( pzOrigTab && 
a520: 70 7a 4f 72 69 67 43 6f 6c 20 29 3b 0a 20 20 20  pzOrigCol );.   
a530: 20 2a 70 7a 4f 72 69 67 44 62 20 3d 20 7a 4f 72   *pzOrigDb = zOr
a540: 69 67 44 62 3b 0a 20 20 20 20 2a 70 7a 4f 72 69  igDb;.    *pzOri
a550: 67 54 61 62 20 3d 20 7a 4f 72 69 67 54 61 62 3b  gTab = zOrigTab;
a560: 0a 20 20 20 20 2a 70 7a 4f 72 69 67 43 6f 6c 20  .    *pzOrigCol 
a570: 3d 20 7a 4f 72 69 67 43 6f 6c 3b 0a 20 20 7d 0a  = zOrigCol;.  }.
a580: 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 45 73  #endif.  if( pEs
a590: 74 57 69 64 74 68 20 29 20 2a 70 45 73 74 57 69  tWidth ) *pEstWi
a5a0: 64 74 68 20 3d 20 65 73 74 57 69 64 74 68 3b 0a  dth = estWidth;.
a5b0: 20 20 72 65 74 75 72 6e 20 7a 54 79 70 65 3b 0a    return zType;.
a5c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
a5d0: 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
a5e0: 20 74 65 6c 6c 20 74 68 65 20 56 44 42 45 20 74   tell the VDBE t
a5f0: 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74  he declaration t
a600: 79 70 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a  ypes of columns.
a610: 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ** in the result
a620: 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   set..*/.static 
a630: 76 6f 69 64 20 67 65 6e 65 72 61 74 65 43 6f 6c  void generateCol
a640: 75 6d 6e 54 79 70 65 73 28 0a 20 20 50 61 72 73  umnTypes(.  Pars
a650: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
a660: 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78  /* Parser contex
a670: 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  t */.  SrcList *
a680: 70 54 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69  pTabList,  /* Li
a690: 73 74 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a  st of tables */.
a6a0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
a6b0: 73 74 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73  st    /* Express
a6c0: 69 6f 6e 73 20 64 65 66 69 6e 69 6e 67 20 74 68  ions defining th
a6d0: 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a  e result set */.
a6e0: 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
a6f0: 45 5f 4f 4d 49 54 5f 44 45 43 4c 54 59 50 45 0a  E_OMIT_DECLTYPE.
a700: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
a710: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
a720: 20 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78   i;.  NameContex
a730: 74 20 73 4e 43 3b 0a 20 20 73 4e 43 2e 70 53 72  t sNC;.  sNC.pSr
a740: 63 4c 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74  cList = pTabList
a750: 3b 0a 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d  ;.  sNC.pParse =
a760: 20 70 50 61 72 73 65 3b 0a 20 20 66 6f 72 28 69   pParse;.  for(i
a770: 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45  =0; i<pEList->nE
a780: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45  xpr; i++){.    E
a790: 78 70 72 20 2a 70 20 3d 20 70 45 4c 69 73 74 2d  xpr *p = pEList-
a7a0: 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
a7b0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79   const char *zTy
a7c0: 70 65 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  pe;.#ifdef SQLIT
a7d0: 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f  E_ENABLE_COLUMN_
a7e0: 4d 45 54 41 44 41 54 41 0a 20 20 20 20 63 6f 6e  METADATA.    con
a7f0: 73 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 44 62  st char *zOrigDb
a800: 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20   = 0;.    const 
a810: 63 68 61 72 20 2a 7a 4f 72 69 67 54 61 62 20 3d  char *zOrigTab =
a820: 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   0;.    const ch
a830: 61 72 20 2a 7a 4f 72 69 67 43 6f 6c 20 3d 20 30  ar *zOrigCol = 0
a840: 3b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f  ;.    zType = co
a850: 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70  lumnType(&sNC, p
a860: 2c 20 26 7a 4f 72 69 67 44 62 2c 20 26 7a 4f 72  , &zOrigDb, &zOr
a870: 69 67 54 61 62 2c 20 26 7a 4f 72 69 67 43 6f 6c  igTab, &zOrigCol
a880: 2c 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68  , 0);..    /* Th
a890: 65 20 76 64 62 65 20 6d 75 73 74 20 6d 61 6b 65  e vdbe must make
a8a0: 20 69 74 73 20 6f 77 6e 20 63 6f 70 79 20 6f 66   its own copy of
a8b0: 20 74 68 65 20 63 6f 6c 75 6d 6e 2d 74 79 70 65   the column-type
a8c0: 20 61 6e 64 20 6f 74 68 65 72 20 0a 20 20 20 20   and other .    
a8d0: 2a 2a 20 63 6f 6c 75 6d 6e 20 73 70 65 63 69 66  ** column specif
a8e0: 69 63 20 73 74 72 69 6e 67 73 2c 20 69 6e 20 63  ic strings, in c
a8f0: 61 73 65 20 74 68 65 20 73 63 68 65 6d 61 20 69  ase the schema i
a900: 73 20 72 65 73 65 74 20 62 65 66 6f 72 65 20 74  s reset before t
a910: 68 69 73 0a 20 20 20 20 2a 2a 20 76 69 72 74 75  his.    ** virtu
a920: 61 6c 20 6d 61 63 68 69 6e 65 20 69 73 20 64 65  al machine is de
a930: 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  leted..    */.  
a940: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
a950: 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f  ColName(v, i, CO
a960: 4c 4e 41 4d 45 5f 44 41 54 41 42 41 53 45 2c 20  LNAME_DATABASE, 
a970: 7a 4f 72 69 67 44 62 2c 20 53 51 4c 49 54 45 5f  zOrigDb, SQLITE_
a980: 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20  TRANSIENT);.    
a990: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
a9a0: 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e  lName(v, i, COLN
a9b0: 41 4d 45 5f 54 41 42 4c 45 2c 20 7a 4f 72 69 67  AME_TABLE, zOrig
a9c0: 54 61 62 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  Tab, SQLITE_TRAN
a9d0: 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69  SIENT);.    sqli
a9e0: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
a9f0: 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f  e(v, i, COLNAME_
aa00: 43 4f 4c 55 4d 4e 2c 20 7a 4f 72 69 67 43 6f 6c  COLUMN, zOrigCol
aa10: 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
aa20: 4e 54 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 7a  NT);.#else.    z
aa30: 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70  Type = columnTyp
aa40: 65 28 26 73 4e 43 2c 20 70 2c 20 30 2c 20 30 2c  e(&sNC, p, 0, 0,
aa50: 20 30 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20   0, 0);.#endif. 
aa60: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
aa70: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
aa80: 4f 4c 4e 41 4d 45 5f 44 45 43 4c 54 59 50 45 2c  OLNAME_DECLTYPE,
aa90: 20 7a 54 79 70 65 2c 20 53 51 4c 49 54 45 5f 54   zType, SQLITE_T
aaa0: 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 0a 23  RANSIENT);.  }.#
aab0: 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
aac0: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45  d(SQLITE_OMIT_DE
aad0: 43 4c 54 59 50 45 29 20 2a 2f 0a 7d 0a 0a 2f 2a  CLTYPE) */.}../*
aae0: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
aaf0: 65 20 74 68 61 74 20 77 69 6c 6c 20 74 65 6c 6c  e that will tell
ab00: 20 74 68 65 20 56 44 42 45 20 74 68 65 20 6e 61   the VDBE the na
ab10: 6d 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a  mes of columns.*
ab20: 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  * in the result 
ab30: 73 65 74 2e 20 20 54 68 69 73 20 69 6e 66 6f 72  set.  This infor
ab40: 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  mation is used t
ab50: 6f 20 70 72 6f 76 69 64 65 20 74 68 65 0a 2a 2a  o provide the.**
ab60: 20 61 7a 43 6f 6c 5b 5d 20 76 61 6c 75 65 73 20   azCol[] values 
ab70: 69 6e 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 2e  in the callback.
ab80: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
ab90: 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61  generateColumnNa
aba0: 6d 65 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50  mes(.  Parse *pP
abb0: 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61  arse,      /* Pa
abc0: 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
abd0: 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
abe0: 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66  ist,  /* List of
abf0: 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 45 78 70   tables */.  Exp
ac00: 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20  rList *pEList   
ac10: 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73 20   /* Expressions 
ac20: 64 65 66 69 6e 69 6e 67 20 74 68 65 20 72 65 73  defining the res
ac30: 75 6c 74 20 73 65 74 20 2a 2f 0a 29 7b 0a 20 20  ult set */.){.  
ac40: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
ac50: 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
ac60: 2c 20 6a 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  , j;.  sqlite3 *
ac70: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
ac80: 0a 20 20 69 6e 74 20 66 75 6c 6c 4e 61 6d 65 73  .  int fullNames
ac90: 2c 20 73 68 6f 72 74 4e 61 6d 65 73 3b 0a 0a 23  , shortNames;..#
aca0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
acb0: 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 2f 2a 20  IT_EXPLAIN.  /* 
acc0: 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 45 58  If this is an EX
acd0: 50 4c 41 49 4e 2c 20 73 6b 69 70 20 74 68 69 73  PLAIN, skip this
ace0: 20 73 74 65 70 20 2a 2f 0a 20 20 69 66 28 20 70   step */.  if( p
acf0: 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29  Parse->explain )
ad00: 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
ad10: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20  }.#endif..  if( 
ad20: 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73  pParse->colNames
ad30: 53 65 74 20 7c 7c 20 4e 45 56 45 52 28 76 3d 3d  Set || NEVER(v==
ad40: 30 29 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  0) || db->malloc
ad50: 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b  Failed ) return;
ad60: 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61  .  pParse->colNa
ad70: 6d 65 73 53 65 74 20 3d 20 31 3b 0a 20 20 66 75  mesSet = 1;.  fu
ad80: 6c 6c 4e 61 6d 65 73 20 3d 20 28 64 62 2d 3e 66  llNames = (db->f
ad90: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 75  lags & SQLITE_Fu
ada0: 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a  llColNames)!=0;.
adb0: 20 20 73 68 6f 72 74 4e 61 6d 65 73 20 3d 20 28    shortNames = (
adc0: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
add0: 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73  TE_ShortColNames
ade0: 29 21 3d 30 3b 0a 20 20 73 71 6c 69 74 65 33 56  )!=0;.  sqlite3V
adf0: 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 76 2c  dbeSetNumCols(v,
ae00: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b   pEList->nExpr);
ae10: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45  .  for(i=0; i<pE
ae20: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
ae30: 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 3b 0a  ){.    Expr *p;.
ae40: 20 20 20 20 70 20 3d 20 70 45 4c 69 73 74 2d 3e      p = pEList->
ae50: 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
ae60: 69 66 28 20 4e 45 56 45 52 28 70 3d 3d 30 29 20  if( NEVER(p==0) 
ae70: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
ae80: 69 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  if( pEList->a[i]
ae90: 2e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  .zName ){.      
aea0: 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 45  char *zName = pE
aeb0: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
aec0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
aed0: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
aee0: 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45   i, COLNAME_NAME
aef0: 2c 20 7a 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f  , zName, SQLITE_
af00: 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20  TRANSIENT);.    
af10: 7d 65 6c 73 65 20 69 66 28 20 28 70 2d 3e 6f 70  }else if( (p->op
af20: 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70  ==TK_COLUMN || p
af30: 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c  ->op==TK_AGG_COL
af40: 55 4d 4e 29 20 26 26 20 70 54 61 62 4c 69 73 74  UMN) && pTabList
af50: 20 29 7b 0a 20 20 20 20 20 20 54 61 62 6c 65 20   ){.      Table 
af60: 2a 70 54 61 62 3b 0a 20 20 20 20 20 20 63 68 61  *pTab;.      cha
af70: 72 20 2a 7a 43 6f 6c 3b 0a 20 20 20 20 20 20 69  r *zCol;.      i
af80: 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 69 43 6f  nt iCol = p->iCo
af90: 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 66 6f 72 28  lumn;.      for(
afa0: 6a 3d 30 3b 20 41 4c 57 41 59 53 28 6a 3c 70 54  j=0; ALWAYS(j<pT
afb0: 61 62 4c 69 73 74 2d 3e 6e 53 72 63 29 3b 20 6a  abList->nSrc); j
afc0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
afd0: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e   pTabList->a[j].
afe0: 69 43 75 72 73 6f 72 3d 3d 70 2d 3e 69 54 61 62  iCursor==p->iTab
aff0: 6c 65 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  le ) break;.    
b000: 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
b010: 28 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  ( j<pTabList->nS
b020: 72 63 20 29 3b 0a 20 20 20 20 20 20 70 54 61 62  rc );.      pTab
b030: 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a   = pTabList->a[j
b040: 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 69 66  ].pTab;.      if
b050: 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20  ( iCol<0 ) iCol 
b060: 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20  = pTab->iPKey;. 
b070: 20 20 20 20 20 61 73 73 65 72 74 28 20 69 43 6f       assert( iCo
b080: 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d  l==-1 || (iCol>=
b090: 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e  0 && iCol<pTab->
b0a0: 6e 43 6f 6c 29 20 29 3b 0a 20 20 20 20 20 20 69  nCol) );.      i
b0b0: 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20  f( iCol<0 ){.   
b0c0: 20 20 20 20 20 7a 43 6f 6c 20 3d 20 22 72 6f 77       zCol = "row
b0d0: 69 64 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  id";.      }else
b0e0: 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d  {.        zCol =
b0f0: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
b100: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 7d  ].zName;.      }
b110: 0a 20 20 20 20 20 20 69 66 28 20 21 73 68 6f 72  .      if( !shor
b120: 74 4e 61 6d 65 73 20 26 26 20 21 66 75 6c 6c 4e  tNames && !fullN
b130: 61 6d 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20  ames ){.        
b140: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
b150: 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e  lName(v, i, COLN
b160: 41 4d 45 5f 4e 41 4d 45 2c 20 0a 20 20 20 20 20  AME_NAME, .     
b170: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
b180: 53 74 72 44 75 70 28 64 62 2c 20 70 45 4c 69 73  StrDup(db, pELis
b190: 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 29 2c 20  t->a[i].zSpan), 
b1a0: 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b  SQLITE_DYNAMIC);
b1b0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
b1c0: 20 66 75 6c 6c 4e 61 6d 65 73 20 29 7b 0a 20 20   fullNames ){.  
b1d0: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d        char *zNam
b1e0: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7a  e = 0;.        z
b1f0: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50  Name = sqlite3MP
b200: 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2e 25 73  rintf(db, "%s.%s
b210: 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  ", pTab->zName, 
b220: 7a 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73  zCol);.        s
b230: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
b240: 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41  Name(v, i, COLNA
b250: 4d 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20  ME_NAME, zName, 
b260: 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b  SQLITE_DYNAMIC);
b270: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
b280: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
b290: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69  eSetColName(v, i
b2a0: 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20  , COLNAME_NAME, 
b2b0: 7a 43 6f 6c 2c 20 53 51 4c 49 54 45 5f 54 52 41  zCol, SQLITE_TRA
b2c0: 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 20 20 7d  NSIENT);.      }
b2d0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
b2e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
b2f0: 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f  ColName(v, i, CO
b300: 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 0a 20 20 20  LNAME_NAME, .   
b310: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
b320: 53 74 72 44 75 70 28 64 62 2c 20 70 45 4c 69 73  StrDup(db, pELis
b330: 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 29 2c 20  t->a[i].zSpan), 
b340: 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b  SQLITE_DYNAMIC);
b350: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 67 65 6e  .    }.  }.  gen
b360: 65 72 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73  erateColumnTypes
b370: 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73  (pParse, pTabLis
b380: 74 2c 20 70 45 4c 69 73 74 29 3b 0a 7d 0a 0a 2f  t, pEList);.}../
b390: 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 61 6e 20  *.** Given a an 
b3a0: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20  expression list 
b3b0: 28 77 68 69 63 68 20 69 73 20 72 65 61 6c 6c 79  (which is really
b3c0: 20 74 68 65 20 6c 69 73 74 20 6f 66 20 65 78 70   the list of exp
b3d0: 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 74 68 61 74  ressions.** that
b3e0: 20 66 6f 72 6d 20 74 68 65 20 72 65 73 75 6c 74   form the result
b3f0: 20 73 65 74 20 6f 66 20 61 20 53 45 4c 45 43 54   set of a SELECT
b400: 20 73 74 61 74 65 6d 65 6e 74 29 20 63 6f 6d 70   statement) comp
b410: 75 74 65 20 61 70 70 72 6f 70 72 69 61 74 65 0a  ute appropriate.
b420: 2a 2a 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  ** column names 
b430: 66 6f 72 20 61 20 74 61 62 6c 65 20 74 68 61 74  for a table that
b440: 20 77 6f 75 6c 64 20 68 6f 6c 64 20 74 68 65 20   would hold the 
b450: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e  expression list.
b460: 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 63 6f 6c 75 6d  .**.** All colum
b470: 6e 20 6e 61 6d 65 73 20 77 69 6c 6c 20 62 65 20  n names will be 
b480: 75 6e 69 71 75 65 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  unique..**.** On
b490: 6c 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  ly the column na
b4a0: 6d 65 73 20 61 72 65 20 63 6f 6d 70 75 74 65 64  mes are computed
b4b0: 2e 20 20 43 6f 6c 75 6d 6e 2e 7a 54 79 70 65 2c  .  Column.zType,
b4c0: 20 43 6f 6c 75 6d 6e 2e 7a 43 6f 6c 6c 2c 0a 2a   Column.zColl,.*
b4d0: 2a 20 61 6e 64 20 6f 74 68 65 72 20 66 69 65 6c  * and other fiel
b4e0: 64 73 20 6f 66 20 43 6f 6c 75 6d 6e 20 61 72 65  ds of Column are
b4f0: 20 7a 65 72 6f 65 64 2e 0a 2a 2a 0a 2a 2a 20 52   zeroed..**.** R
b500: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
b510: 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66 20  on success.  If 
b520: 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  a memory allocat
b530: 69 6f 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73  ion error occurs
b540: 2c 0a 2a 2a 20 73 74 6f 72 65 20 4e 55 4c 4c 20  ,.** store NULL 
b550: 69 6e 20 2a 70 61 43 6f 6c 20 61 6e 64 20 30 20  in *paCol and 0 
b560: 69 6e 20 2a 70 6e 43 6f 6c 20 61 6e 64 20 72 65  in *pnCol and re
b570: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
b580: 4d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  M..*/.static int
b590: 20 73 65 6c 65 63 74 43 6f 6c 75 6d 6e 73 46 72   selectColumnsFr
b5a0: 6f 6d 45 78 70 72 4c 69 73 74 28 0a 20 20 50 61  omExprList(.  Pa
b5b0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
b5c0: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
b5d0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
b5e0: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20  prList *pEList, 
b5f0: 20 20 20 20 20 20 2f 2a 20 45 78 70 72 20 6c 69        /* Expr li
b600: 73 74 20 66 72 6f 6d 20 77 68 69 63 68 20 74 6f  st from which to
b610: 20 64 65 72 69 76 65 20 63 6f 6c 75 6d 6e 20 6e   derive column n
b620: 61 6d 65 73 20 2a 2f 0a 20 20 69 31 36 20 2a 70  ames */.  i16 *p
b630: 6e 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20  nCol,           
b640: 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e    /* Write the n
b650: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
b660: 20 68 65 72 65 20 2a 2f 0a 20 20 43 6f 6c 75 6d   here */.  Colum
b670: 6e 20 2a 2a 70 61 43 6f 6c 20 20 20 20 20 20 20  n **paCol       
b680: 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
b690: 6e 65 77 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20  new column list 
b6a0: 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  here */.){.  sql
b6b0: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
b6c0: 65 2d 3e 64 62 3b 20 20 20 2f 2a 20 44 61 74 61  e->db;   /* Data
b6d0: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
b6e0: 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20  */.  int i, j;  
b6f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b700: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
b710: 73 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 3b 20  s */.  int cnt; 
b720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b730: 20 20 20 2f 2a 20 49 6e 64 65 78 20 61 64 64 65     /* Index adde
b740: 64 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 6e 61  d to make the na
b750: 6d 65 20 75 6e 69 71 75 65 20 2a 2f 0a 20 20 43  me unique */.  C
b760: 6f 6c 75 6d 6e 20 2a 61 43 6f 6c 2c 20 2a 70 43  olumn *aCol, *pC
b770: 6f 6c 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 6f  ol;        /* Fo
b780: 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 72  r looping over r
b790: 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f  esult columns */
b7a0: 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20  .  int nCol;    
b7b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
b7c0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  * Number of colu
b7d0: 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c  mns in the resul
b7e0: 74 20 73 65 74 20 2a 2f 0a 20 20 45 78 70 72 20  t set */.  Expr 
b7f0: 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *p;             
b800: 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73         /* Expres
b810: 73 69 6f 6e 20 66 6f 72 20 61 20 73 69 6e 67 6c  sion for a singl
b820: 65 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 20  e result column 
b830: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65  */.  char *zName
b840: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
b850: 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65 20   /* Column name 
b860: 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 20  */.  int nName; 
b870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b880: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6e 61 6d 65   /* Size of name
b890: 20 69 6e 20 7a 4e 61 6d 65 5b 5d 20 2a 2f 0a 0a   in zName[] */..
b8a0: 20 20 69 66 28 20 70 45 4c 69 73 74 20 29 7b 0a    if( pEList ){.
b8b0: 20 20 20 20 6e 43 6f 6c 20 3d 20 70 45 4c 69 73      nCol = pELis
b8c0: 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 61 43  t->nExpr;.    aC
b8d0: 6f 6c 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ol = sqlite3DbMa
b8e0: 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
b8f0: 65 6f 66 28 61 43 6f 6c 5b 30 5d 29 2a 6e 43 6f  eof(aCol[0])*nCo
b900: 6c 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  l);.    testcase
b910: 28 20 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 7d  ( aCol==0 );.  }
b920: 65 6c 73 65 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d  else{.    nCol =
b930: 20 30 3b 0a 20 20 20 20 61 43 6f 6c 20 3d 20 30   0;.    aCol = 0
b940: 3b 0a 20 20 7d 0a 20 20 2a 70 6e 43 6f 6c 20 3d  ;.  }.  *pnCol =
b950: 20 6e 43 6f 6c 3b 0a 20 20 2a 70 61 43 6f 6c 20   nCol;.  *paCol 
b960: 3d 20 61 43 6f 6c 3b 0a 0a 20 20 66 6f 72 28 69  = aCol;..  for(i
b970: 3d 30 2c 20 70 43 6f 6c 3d 61 43 6f 6c 3b 20 69  =0, pCol=aCol; i
b980: 3c 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c  <nCol; i++, pCol
b990: 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20 47 65 74 20  ++){.    /* Get 
b9a0: 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 6e  an appropriate n
b9b0: 61 6d 65 20 66 6f 72 20 74 68 65 20 63 6f 6c 75  ame for the colu
b9c0: 6d 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 20  mn.    */.    p 
b9d0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69  = sqlite3ExprSki
b9e0: 70 43 6f 6c 6c 61 74 65 28 70 45 4c 69 73 74 2d  pCollate(pEList-
b9f0: 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[i].pExpr);.  
ba00: 20 20 69 66 28 20 28 7a 4e 61 6d 65 20 3d 20 70    if( (zName = p
ba10: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  EList->a[i].zNam
ba20: 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  e)!=0 ){.      /
ba30: 2a 20 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  * If the column 
ba40: 63 6f 6e 74 61 69 6e 73 20 61 6e 20 22 41 53 20  contains an "AS 
ba50: 3c 6e 61 6d 65 3e 22 20 70 68 72 61 73 65 2c 20  <name>" phrase, 
ba60: 75 73 65 20 3c 6e 61 6d 65 3e 20 61 73 20 74 68  use <name> as th
ba70: 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20  e name */.      
ba80: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44  zName = sqlite3D
ba90: 62 53 74 72 44 75 70 28 64 62 2c 20 7a 4e 61 6d  bStrDup(db, zNam
baa0: 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  e);.    }else{. 
bab0: 20 20 20 20 20 45 78 70 72 20 2a 70 43 6f 6c 45       Expr *pColE
bac0: 78 70 72 20 3d 20 70 3b 20 20 2f 2a 20 54 68 65  xpr = p;  /* The
bad0: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74   expression that
bae0: 20 69 73 20 74 68 65 20 72 65 73 75 6c 74 20 63   is the result c
baf0: 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  olumn name */.  
bb00: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b      Table *pTab;
bb10: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
bb20: 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  e associated wit
bb30: 68 20 74 68 69 73 20 65 78 70 72 65 73 73 69 6f  h this expressio
bb40: 6e 20 2a 2f 0a 20 20 20 20 20 20 77 68 69 6c 65  n */.      while
bb50: 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f 70 3d 3d  ( pColExpr->op==
bb60: 54 4b 5f 44 4f 54 20 29 7b 0a 20 20 20 20 20 20  TK_DOT ){.      
bb70: 20 20 70 43 6f 6c 45 78 70 72 20 3d 20 70 43 6f    pColExpr = pCo
bb80: 6c 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20  lExpr->pRight;. 
bb90: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
bba0: 43 6f 6c 45 78 70 72 21 3d 30 20 29 3b 0a 20 20  ColExpr!=0 );.  
bbb0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
bbc0: 70 43 6f 6c 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  pColExpr->op==TK
bbd0: 5f 43 4f 4c 55 4d 4e 20 26 26 20 41 4c 57 41 59  _COLUMN && ALWAY
bbe0: 53 28 70 43 6f 6c 45 78 70 72 2d 3e 70 54 61 62  S(pColExpr->pTab
bbf0: 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  !=0) ){.        
bc00: 2f 2a 20 46 6f 72 20 63 6f 6c 75 6d 6e 73 20 75  /* For columns u
bc10: 73 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  se the column na
bc20: 6d 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20  me name */.     
bc30: 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 43     int iCol = pC
bc40: 6f 6c 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b  olExpr->iColumn;
bc50: 0a 20 20 20 20 20 20 20 20 70 54 61 62 20 3d 20  .        pTab = 
bc60: 70 43 6f 6c 45 78 70 72 2d 3e 70 54 61 62 3b 0a  pColExpr->pTab;.
bc70: 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c          if( iCol
bc80: 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70 54 61 62  <0 ) iCol = pTab
bc90: 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 20  ->iPKey;.       
bca0: 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
bcb0: 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 22  MPrintf(db, "%s"
bcc0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
bcd0: 20 20 20 69 43 6f 6c 3e 3d 30 20 3f 20 70 54 61     iCol>=0 ? pTa
bce0: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e  b->aCol[iCol].zN
bcf0: 61 6d 65 20 3a 20 22 72 6f 77 69 64 22 29 3b 0a  ame : "rowid");.
bd00: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
bd10: 70 43 6f 6c 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  pColExpr->op==TK
bd20: 5f 49 44 20 29 7b 0a 20 20 20 20 20 20 20 20 61  _ID ){.        a
bd30: 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
bd40: 72 6f 70 65 72 74 79 28 70 43 6f 6c 45 78 70 72  roperty(pColExpr
bd50: 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29  , EP_IntValue) )
bd60: 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  ;.        zName 
bd70: 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
bd80: 28 64 62 2c 20 22 25 73 22 2c 20 70 43 6f 6c 45  (db, "%s", pColE
bd90: 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a  xpr->u.zToken);.
bda0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
bdb0: 20 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65 20       /* Use the 
bdc0: 6f 72 69 67 69 6e 61 6c 20 74 65 78 74 20 6f 66  original text of
bdd0: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 65 78 70 72   the column expr
bde0: 65 73 73 69 6f 6e 20 61 73 20 69 74 73 20 6e 61  ession as its na
bdf0: 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 7a 4e  me */.        zN
be00: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  ame = sqlite3MPr
be10: 69 6e 74 66 28 64 62 2c 20 22 25 73 22 2c 20 70  intf(db, "%s", p
be20: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61  EList->a[i].zSpa
be30: 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  n);.      }.    
be40: 7d 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61  }.    if( db->ma
be50: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
be60: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
be70: 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  e(db, zName);.  
be80: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
be90: 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75  ..    /* Make su
bea0: 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  re the column na
beb0: 6d 65 20 69 73 20 75 6e 69 71 75 65 2e 20 20 49  me is unique.  I
bec0: 66 20 74 68 65 20 6e 61 6d 65 20 69 73 20 6e 6f  f the name is no
bed0: 74 20 75 6e 69 71 75 65 2c 0a 20 20 20 20 2a 2a  t unique,.    **
bee0: 20 61 70 70 65 6e 64 20 61 20 69 6e 74 65 67 65   append a intege
bef0: 72 20 74 6f 20 74 68 65 20 6e 61 6d 65 20 73 6f  r to the name so
bf00: 20 74 68 61 74 20 69 74 20 62 65 63 6f 6d 65 73   that it becomes
bf10: 20 75 6e 69 71 75 65 2e 0a 20 20 20 20 2a 2f 0a   unique..    */.
bf20: 20 20 20 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69      nName = sqli
bf30: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d  te3Strlen30(zNam
bf40: 65 29 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 63 6e  e);.    for(j=cn
bf50: 74 3d 30 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a  t=0; j<i; j++){.
bf60: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
bf70: 33 53 74 72 49 43 6d 70 28 61 43 6f 6c 5b 6a 5d  3StrICmp(aCol[j]
bf80: 2e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d  .zName, zName)==
bf90: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  0 ){.        cha
bfa0: 72 20 2a 7a 4e 65 77 4e 61 6d 65 3b 0a 20 20 20  r *zNewName;.   
bfb0: 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20       int k;.    
bfc0: 20 20 20 20 66 6f 72 28 6b 3d 6e 4e 61 6d 65 2d      for(k=nName-
bfd0: 31 3b 20 6b 3e 31 20 26 26 20 73 71 6c 69 74 65  1; k>1 && sqlite
bfe0: 33 49 73 64 69 67 69 74 28 7a 4e 61 6d 65 5b 6b  3Isdigit(zName[k
bff0: 5d 29 3b 20 6b 2d 2d 29 7b 7d 0a 20 20 20 20 20  ]); k--){}.     
c000: 20 20 20 69 66 28 20 7a 4e 61 6d 65 5b 6b 5d 3d     if( zName[k]=
c010: 3d 27 3a 27 20 29 20 6e 4e 61 6d 65 20 3d 20 6b  =':' ) nName = k
c020: 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 5b  ;.        zName[
c030: 6e 4e 61 6d 65 5d 20 3d 20 30 3b 0a 20 20 20 20  nName] = 0;.    
c040: 20 20 20 20 7a 4e 65 77 4e 61 6d 65 20 3d 20 73      zNewName = s
c050: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
c060: 2c 20 22 25 73 3a 25 64 22 2c 20 7a 4e 61 6d 65  , "%s:%d", zName
c070: 2c 20 2b 2b 63 6e 74 29 3b 0a 20 20 20 20 20 20  , ++cnt);.      
c080: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
c090: 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  db, zName);.    
c0a0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 7a 4e 65 77      zName = zNew
c0b0: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 6a 20  Name;.        j 
c0c0: 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 69 66  = -1;.        if
c0d0: 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 62 72 65  ( zName==0 ) bre
c0e0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
c0f0: 7d 0a 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d  }.    pCol->zNam
c100: 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 7d 0a 20  e = zName;.  }. 
c110: 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
c120: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 66 6f 72  ailed ){.    for
c130: 28 6a 3d 30 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 7b  (j=0; j<i; j++){
c140: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
c150: 46 72 65 65 28 64 62 2c 20 61 43 6f 6c 5b 6a 5d  Free(db, aCol[j]
c160: 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20  .zName);.    }. 
c170: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
c180: 28 64 62 2c 20 61 43 6f 6c 29 3b 0a 20 20 20 20  (db, aCol);.    
c190: 2a 70 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  *paCol = 0;.    
c1a0: 2a 70 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  *pnCol = 0;.    
c1b0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
c1c0: 4d 45 4d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  MEM;.  }.  retur
c1d0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
c1e0: 2f 2a 0a 2a 2a 20 41 64 64 20 74 79 70 65 20 61  /*.** Add type a
c1f0: 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 69 6e 66  nd collation inf
c200: 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 61 20 63 6f  ormation to a co
c210: 6c 75 6d 6e 20 6c 69 73 74 20 62 61 73 65 64 20  lumn list based 
c220: 6f 6e 0a 2a 2a 20 61 20 53 45 4c 45 43 54 20 73  on.** a SELECT s
c230: 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 0a 2a 2a  tatement..** .**
c240: 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74   The column list
c250: 20 70 72 65 73 75 6d 61 62 6c 79 20 63 61 6d 65   presumably came
c260: 20 66 72 6f 6d 20 73 65 6c 65 63 74 43 6f 6c 75   from selectColu
c270: 6d 6e 4e 61 6d 65 73 46 72 6f 6d 45 78 70 72 4c  mnNamesFromExprL
c280: 69 73 74 28 29 2e 0a 2a 2a 20 54 68 65 20 63 6f  ist()..** The co
c290: 6c 75 6d 6e 20 6c 69 73 74 20 68 61 73 20 6f 6e  lumn list has on
c2a0: 6c 79 20 6e 61 6d 65 73 2c 20 6e 6f 74 20 74 79  ly names, not ty
c2b0: 70 65 73 20 6f 72 20 63 6f 6c 6c 61 74 69 6f 6e  pes or collation
c2c0: 73 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74  s.  This.** rout
c2d0: 69 6e 65 20 67 6f 65 73 20 74 68 72 6f 75 67 68  ine goes through
c2e0: 20 61 6e 64 20 61 64 64 73 20 74 68 65 20 74 79   and adds the ty
c2f0: 70 65 73 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f  pes and collatio
c300: 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ns..**.** This r
c310: 6f 75 74 69 6e 65 20 72 65 71 75 69 72 65 73 20  outine requires 
c320: 74 68 61 74 20 61 6c 6c 20 69 64 65 6e 74 69 66  that all identif
c330: 69 65 72 73 20 69 6e 20 74 68 65 20 53 45 4c 45  iers in the SELE
c340: 43 54 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20  CT.** statement 
c350: 62 65 20 72 65 73 6f 6c 76 65 64 2e 0a 2a 2f 0a  be resolved..*/.
c360: 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 6c 65  static void sele
c370: 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41  ctAddColumnTypeA
c380: 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20 50  ndCollation(.  P
c390: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
c3a0: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
c3b0: 63 6f 6e 74 65 78 74 73 20 2a 2f 0a 20 20 54 61  contexts */.  Ta
c3c0: 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20 20  ble *pTab,      
c3d0: 20 20 20 20 2f 2a 20 41 64 64 20 63 6f 6c 75 6d      /* Add colum
c3e0: 6e 20 74 79 70 65 20 69 6e 66 6f 72 6d 61 74 69  n type informati
c3f0: 6f 6e 20 74 6f 20 74 68 69 73 20 74 61 62 6c 65  on to this table
c400: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53   */.  Select *pS
c410: 65 6c 65 63 74 20 20 20 20 20 20 20 2f 2a 20 53  elect       /* S
c420: 45 4c 45 43 54 20 75 73 65 64 20 74 6f 20 64 65  ELECT used to de
c430: 74 65 72 6d 69 6e 65 20 74 79 70 65 73 20 61 6e  termine types an
c440: 64 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 2a 2f 0a  d collations */.
c450: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
c460: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
c470: 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43   NameContext sNC
c480: 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c  ;.  Column *pCol
c490: 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f  ;.  CollSeq *pCo
c4a0: 6c 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 45  ll;.  int i;.  E
c4b0: 78 70 72 20 2a 70 3b 0a 20 20 73 74 72 75 63 74  xpr *p;.  struct
c4c0: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
c4d0: 61 3b 0a 20 20 75 36 34 20 73 7a 41 6c 6c 20 3d  a;.  u64 szAll =
c4e0: 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   0;..  assert( p
c4f0: 53 65 6c 65 63 74 21 3d 30 20 29 3b 0a 20 20 61  Select!=0 );.  a
c500: 73 73 65 72 74 28 20 28 70 53 65 6c 65 63 74 2d  ssert( (pSelect-
c510: 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52  >selFlags & SF_R
c520: 65 73 6f 6c 76 65 64 29 21 3d 30 20 29 3b 0a 20  esolved)!=0 );. 
c530: 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 6e   assert( pTab->n
c540: 43 6f 6c 3d 3d 70 53 65 6c 65 63 74 2d 3e 70 45  Col==pSelect->pE
c550: 4c 69 73 74 2d 3e 6e 45 78 70 72 20 7c 7c 20 64  List->nExpr || d
c560: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
c570: 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  );.  if( db->mal
c580: 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75  locFailed ) retu
c590: 72 6e 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 4e  rn;.  memset(&sN
c5a0: 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43  C, 0, sizeof(sNC
c5b0: 29 29 3b 0a 20 20 73 4e 43 2e 70 53 72 63 4c 69  ));.  sNC.pSrcLi
c5c0: 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 53  st = pSelect->pS
c5d0: 72 63 3b 0a 20 20 61 20 3d 20 70 53 65 6c 65 63  rc;.  a = pSelec
c5e0: 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20  t->pEList->a;.  
c5f0: 66 6f 72 28 69 3d 30 2c 20 70 43 6f 6c 3d 70 54  for(i=0, pCol=pT
c600: 61 62 2d 3e 61 43 6f 6c 3b 20 69 3c 70 54 61 62  ab->aCol; i<pTab
c610: 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f  ->nCol; i++, pCo
c620: 6c 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20 61 5b  l++){.    p = a[
c630: 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 43  i].pExpr;.    pC
c640: 6f 6c 2d 3e 7a 54 79 70 65 20 3d 20 73 71 6c 69  ol->zType = sqli
c650: 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
c660: 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c  columnType(&sNC,
c670: 20 70 2c 30 2c 30 2c 30 2c 20 26 70 43 6f 6c 2d   p,0,0,0, &pCol-
c680: 3e 73 7a 45 73 74 29 29 3b 0a 20 20 20 20 73 7a  >szEst));.    sz
c690: 41 6c 6c 20 2b 3d 20 70 43 6f 6c 2d 3e 73 7a 45  All += pCol->szE
c6a0: 73 74 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 61 66  st;.    pCol->af
c6b0: 66 69 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33  finity = sqlite3
c6c0: 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 29 3b  ExprAffinity(p);
c6d0: 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 61  .    if( pCol->a
c6e0: 66 66 69 6e 69 74 79 3d 3d 30 20 29 20 70 43 6f  ffinity==0 ) pCo
c6f0: 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 53 51  l->affinity = SQ
c700: 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20  LITE_AFF_NONE;. 
c710: 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
c720: 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
c730: 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 69 66  arse, p);.    if
c740: 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20  ( pColl ){.     
c750: 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 20 3d 20 73   pCol->zColl = s
c760: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
c770: 62 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29  b, pColl->zName)
c780: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 54  ;.    }.  }.  pT
c790: 61 62 2d 3e 73 7a 54 61 62 52 6f 77 20 3d 20 73  ab->szTabRow = s
c7a0: 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 73 7a 41  qlite3LogEst(szA
c7b0: 6c 6c 2a 34 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ll*4);.}../*.** 
c7c0: 47 69 76 65 6e 20 61 20 53 45 4c 45 43 54 20 73  Given a SELECT s
c7d0: 74 61 74 65 6d 65 6e 74 2c 20 67 65 6e 65 72 61  tatement, genera
c7e0: 74 65 20 61 20 54 61 62 6c 65 20 73 74 72 75 63  te a Table struc
c7f0: 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69  ture that descri
c800: 62 65 73 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c  bes.** the resul
c810: 74 20 73 65 74 20 6f 66 20 74 68 61 74 20 53 45  t set of that SE
c820: 4c 45 43 54 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a  LECT..*/.Table *
c830: 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74  sqlite3ResultSet
c840: 4f 66 53 65 6c 65 63 74 28 50 61 72 73 65 20 2a  OfSelect(Parse *
c850: 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a  pParse, Select *
c860: 70 53 65 6c 65 63 74 29 7b 0a 20 20 54 61 62 6c  pSelect){.  Tabl
c870: 65 20 2a 70 54 61 62 3b 0a 20 20 73 71 6c 69 74  e *pTab;.  sqlit
c880: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
c890: 3e 64 62 3b 0a 20 20 69 6e 74 20 73 61 76 65 64  >db;.  int saved
c8a0: 46 6c 61 67 73 3b 0a 0a 20 20 73 61 76 65 64 46  Flags;..  savedF
c8b0: 6c 61 67 73 20 3d 20 64 62 2d 3e 66 6c 61 67 73  lags = db->flags
c8c0: 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d  ;.  db->flags &=
c8d0: 20 7e 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c   ~SQLITE_FullCol
c8e0: 4e 61 6d 65 73 3b 0a 20 20 64 62 2d 3e 66 6c 61  Names;.  db->fla
c8f0: 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 53 68 6f  gs |= SQLITE_Sho
c900: 72 74 43 6f 6c 4e 61 6d 65 73 3b 0a 20 20 73 71  rtColNames;.  sq
c910: 6c 69 74 65 33 53 65 6c 65 63 74 50 72 65 70 28  lite3SelectPrep(
c920: 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c  pParse, pSelect,
c930: 20 30 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73   0);.  if( pPars
c940: 65 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e  e->nErr ) return
c950: 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 70 53 65   0;.  while( pSe
c960: 6c 65 63 74 2d 3e 70 50 72 69 6f 72 20 29 20 70  lect->pPrior ) p
c970: 53 65 6c 65 63 74 20 3d 20 70 53 65 6c 65 63 74  Select = pSelect
c980: 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 64 62 2d 3e  ->pPrior;.  db->
c990: 66 6c 61 67 73 20 3d 20 73 61 76 65 64 46 6c 61  flags = savedFla
c9a0: 67 73 3b 0a 20 20 70 54 61 62 20 3d 20 73 71 6c  gs;.  pTab = sql
c9b0: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
c9c0: 28 64 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c  (db, sizeof(Tabl
c9d0: 65 29 20 29 3b 0a 20 20 69 66 28 20 70 54 61 62  e) );.  if( pTab
c9e0: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
c9f0: 6e 20 30 3b 0a 20 20 7d 0a 20 20 2f 2a 20 54 68  n 0;.  }.  /* Th
ca00: 65 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53  e sqlite3ResultS
ca10: 65 74 4f 66 53 65 6c 65 63 74 28 29 20 69 73 20  etOfSelect() is 
ca20: 6f 6e 6c 79 20 75 73 65 64 20 6e 20 63 6f 6e 74  only used n cont
ca30: 65 78 74 73 20 77 68 65 72 65 20 6c 6f 6f 6b 61  exts where looka
ca40: 73 69 64 65 0a 20 20 2a 2a 20 69 73 20 64 69 73  side.  ** is dis
ca50: 61 62 6c 65 64 20 2a 2f 0a 20 20 61 73 73 65 72  abled */.  asser
ca60: 74 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65  t( db->lookaside
ca70: 2e 62 45 6e 61 62 6c 65 64 3d 3d 30 20 29 3b 0a  .bEnabled==0 );.
ca80: 20 20 70 54 61 62 2d 3e 6e 52 65 66 20 3d 20 31    pTab->nRef = 1
ca90: 3b 0a 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20  ;.  pTab->zName 
caa0: 3d 20 30 3b 0a 20 20 70 54 61 62 2d 3e 6e 52 6f  = 0;.  pTab->nRo
cab0: 77 45 73 74 20 3d 20 31 30 34 38 35 37 36 3b 0a  wEst = 1048576;.
cac0: 20 20 73 65 6c 65 63 74 43 6f 6c 75 6d 6e 73 46    selectColumnsF
cad0: 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72  romExprList(pPar
cae0: 73 65 2c 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c  se, pSelect->pEL
caf0: 69 73 74 2c 20 26 70 54 61 62 2d 3e 6e 43 6f 6c  ist, &pTab->nCol
cb00: 2c 20 26 70 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a  , &pTab->aCol);.
cb10: 20 20 73 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d    selectAddColum
cb20: 6e 54 79 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f  nTypeAndCollatio
cb30: 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20  n(pParse, pTab, 
cb40: 70 53 65 6c 65 63 74 29 3b 0a 20 20 70 54 61 62  pSelect);.  pTab
cb50: 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20  ->iPKey = -1;.  
cb60: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
cb70: 69 6c 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69  iled ){.    sqli
cb80: 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64  te3DeleteTable(d
cb90: 62 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 72 65  b, pTab);.    re
cba0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65  turn 0;.  }.  re
cbb0: 74 75 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a  turn pTab;.}../*
cbc0: 0a 2a 2a 20 47 65 74 20 61 20 56 44 42 45 20 66  .** Get a VDBE f
cbd0: 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70 61 72  or the given par
cbe0: 73 65 72 20 63 6f 6e 74 65 78 74 2e 20 20 43 72  ser context.  Cr
cbf0: 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 69  eate a new one i
cc00: 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20  f necessary..** 
cc10: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
cc20: 72 73 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20  rs, return NULL 
cc30: 61 6e 64 20 6c 65 61 76 65 20 61 20 6d 65 73 73  and leave a mess
cc40: 61 67 65 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a  age in pParse..*
cc50: 2f 0a 56 64 62 65 20 2a 73 71 6c 69 74 65 33 47  /.Vdbe *sqlite3G
cc60: 65 74 56 64 62 65 28 50 61 72 73 65 20 2a 70 50  etVdbe(Parse *pP
cc70: 61 72 73 65 29 7b 0a 20 20 56 64 62 65 20 2a 76  arse){.  Vdbe *v
cc80: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
cc90: 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 7b 0a  ;.  if( v==0 ){.
cca0: 20 20 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e      v = pParse->
ccb0: 70 56 64 62 65 20 3d 20 73 71 6c 69 74 65 33 56  pVdbe = sqlite3V
ccc0: 64 62 65 43 72 65 61 74 65 28 70 50 61 72 73 65  dbeCreate(pParse
ccd0: 2d 3e 64 62 29 3b 0a 23 69 66 6e 64 65 66 20 53  ->db);.#ifndef S
cce0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45  QLITE_OMIT_TRACE
ccf0: 0a 20 20 20 20 69 66 28 20 76 20 29 7b 0a 20 20  .    if( v ){.  
cd00: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
cd10: 64 64 4f 70 30 28 76 2c 20 4f 50 5f 54 72 61 63  ddOp0(v, OP_Trac
cd20: 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  e);.    }.#endif
cd30: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 76 3b  .  }.  return v;
cd40: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75  .}.../*.** Compu
cd50: 74 65 20 74 68 65 20 69 4c 69 6d 69 74 20 61 6e  te the iLimit an
cd60: 64 20 69 4f 66 66 73 65 74 20 66 69 65 6c 64 73  d iOffset fields
cd70: 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 62   of the SELECT b
cd80: 61 73 65 64 20 6f 6e 20 74 68 65 0a 2a 2a 20 70  ased on the.** p
cd90: 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66 66 73 65  Limit and pOffse
cda0: 74 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 20  t expressions.  
cdb0: 70 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66 66 73  pLimit and pOffs
cdc0: 65 74 20 68 6f 6c 64 20 74 68 65 20 65 78 70 72  et hold the expr
cdd0: 65 73 73 69 6f 6e 73 0a 2a 2a 20 74 68 61 74 20  essions.** that 
cde0: 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 6f 72  appear in the or
cdf0: 69 67 69 6e 61 6c 20 53 51 4c 20 73 74 61 74 65  iginal SQL state
ce00: 6d 65 6e 74 20 61 66 74 65 72 20 74 68 65 20 4c  ment after the L
ce10: 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 0a  IMIT and OFFSET.
ce20: 2a 2a 20 6b 65 79 77 6f 72 64 73 2e 20 20 4f 72  ** keywords.  Or
ce30: 20 4e 55 4c 4c 20 69 66 20 74 68 6f 73 65 20 6b   NULL if those k
ce40: 65 79 77 6f 72 64 73 20 61 72 65 20 6f 6d 69 74  eywords are omit
ce50: 74 65 64 2e 20 69 4c 69 6d 69 74 20 61 6e 64 20  ted. iLimit and 
ce60: 69 4f 66 66 73 65 74 20 0a 2a 2a 20 61 72 65 20  iOffset .** are 
ce70: 74 68 65 20 69 6e 74 65 67 65 72 20 6d 65 6d 6f  the integer memo
ce80: 72 79 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62  ry register numb
ce90: 65 72 73 20 66 6f 72 20 63 6f 75 6e 74 65 72 73  ers for counters
cea0: 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 75 74 65   used to compute
ceb0: 20 0a 2a 2a 20 74 68 65 20 6c 69 6d 69 74 20 61   .** the limit a
cec0: 6e 64 20 6f 66 66 73 65 74 2e 20 20 49 66 20 74  nd offset.  If t
ced0: 68 65 72 65 20 69 73 20 6e 6f 20 6c 69 6d 69 74  here is no limit
cee0: 20 61 6e 64 2f 6f 72 20 6f 66 66 73 65 74 2c 20   and/or offset, 
cef0: 74 68 65 6e 20 0a 2a 2a 20 69 4c 69 6d 69 74 20  then .** iLimit 
cf00: 61 6e 64 20 69 4f 66 66 73 65 74 20 61 72 65 20  and iOffset are 
cf10: 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20  negative..**.** 
cf20: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 61  This routine cha
cf30: 6e 67 65 73 20 74 68 65 20 76 61 6c 75 65 73 20  nges the values 
cf40: 6f 66 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f  of iLimit and iO
cf50: 66 66 73 65 74 20 6f 6e 6c 79 20 69 66 0a 2a 2a  ffset only if.**
cf60: 20 61 20 6c 69 6d 69 74 20 6f 72 20 6f 66 66 73   a limit or offs
cf70: 65 74 20 69 73 20 64 65 66 69 6e 65 64 20 62 79  et is defined by
cf80: 20 70 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66 66   pLimit and pOff
cf90: 73 65 74 2e 20 20 69 4c 69 6d 69 74 20 61 6e 64  set.  iLimit and
cfa0: 0a 2a 2a 20 69 4f 66 66 73 65 74 20 73 68 6f 75  .** iOffset shou
cfb0: 6c 64 20 68 61 76 65 20 62 65 65 6e 20 70 72 65  ld have been pre
cfc0: 73 65 74 20 74 6f 20 61 70 70 72 6f 70 72 69 61  set to appropria
cfd0: 74 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65  te default value
cfe0: 73 0a 2a 2a 20 28 75 73 75 61 6c 6c 79 20 62 75  s.** (usually bu
cff0: 74 20 6e 6f 74 20 61 6c 77 61 79 73 20 2d 31 29  t not always -1)
d000: 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e   prior to callin
d010: 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a  g this routine..
d020: 2a 2a 20 4f 6e 6c 79 20 69 66 20 70 4c 69 6d 69  ** Only if pLimi
d030: 74 21 3d 30 20 6f 72 20 70 4f 66 66 73 65 74 21  t!=0 or pOffset!
d040: 3d 30 20 64 6f 20 74 68 65 20 6c 69 6d 69 74 20  =0 do the limit 
d050: 72 65 67 69 73 74 65 72 73 20 67 65 74 0a 2a 2a  registers get.**
d060: 20 72 65 64 65 66 69 6e 65 64 2e 20 20 54 68 65   redefined.  The
d070: 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61   UNION ALL opera
d080: 74 6f 72 20 75 73 65 73 20 74 68 69 73 20 70 72  tor uses this pr
d090: 6f 70 65 72 74 79 20 74 6f 20 66 6f 72 63 65 0a  operty to force.
d0a0: 2a 2a 20 74 68 65 20 72 65 75 73 65 20 6f 66 20  ** the reuse of 
d0b0: 74 68 65 20 73 61 6d 65 20 6c 69 6d 69 74 20 61  the same limit a
d0c0: 6e 64 20 6f 66 66 73 65 74 20 72 65 67 69 73 74  nd offset regist
d0d0: 65 72 73 20 61 63 72 6f 73 73 20 6d 75 6c 74 69  ers across multi
d0e0: 70 6c 65 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74  ple.** SELECT st
d0f0: 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61  atements..*/.sta
d100: 74 69 63 20 76 6f 69 64 20 63 6f 6d 70 75 74 65  tic void compute
d110: 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 50  LimitRegisters(P
d120: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65  arse *pParse, Se
d130: 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 69 42 72  lect *p, int iBr
d140: 65 61 6b 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  eak){.  Vdbe *v 
d150: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4c 69 6d 69  = 0;.  int iLimi
d160: 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4f 66  t = 0;.  int iOf
d170: 66 73 65 74 3b 0a 20 20 69 6e 74 20 61 64 64 72  fset;.  int addr
d180: 31 2c 20 6e 3b 0a 20 20 69 66 28 20 70 2d 3e 69  1, n;.  if( p->i
d190: 4c 69 6d 69 74 20 29 20 72 65 74 75 72 6e 3b 0a  Limit ) return;.
d1a0: 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 22 4c 49 4d  .  /* .  ** "LIM
d1b0: 49 54 20 2d 31 22 20 61 6c 77 61 79 73 20 73 68  IT -1" always sh
d1c0: 6f 77 73 20 61 6c 6c 20 72 6f 77 73 2e 20 20 54  ows all rows.  T
d1d0: 68 65 72 65 20 69 73 20 73 6f 6d 65 0a 20 20 2a  here is some.  *
d1e0: 2a 20 63 6f 6e 74 72 6f 76 65 72 73 79 20 61 62  * controversy ab
d1f0: 6f 75 74 20 77 68 61 74 20 74 68 65 20 63 6f 72  out what the cor
d200: 72 65 63 74 20 62 65 68 61 76 69 6f 72 20 73 68  rect behavior sh
d210: 6f 75 6c 64 20 62 65 2e 0a 20 20 2a 2a 20 54 68  ould be..  ** Th
d220: 65 20 63 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d  e current implem
d230: 65 6e 74 61 74 69 6f 6e 20 69 6e 74 65 72 70 72  entation interpr
d240: 65 74 73 20 22 4c 49 4d 49 54 20 30 22 20 74 6f  ets "LIMIT 0" to
d250: 20 6d 65 61 6e 0a 20 20 2a 2a 20 6e 6f 20 72 6f   mean.  ** no ro
d260: 77 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ws..  */.  sqlit
d270: 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72  e3ExprCacheClear
d280: 28 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73 65  (pParse);.  asse
d290: 72 74 28 20 70 2d 3e 70 4f 66 66 73 65 74 3d 3d  rt( p->pOffset==
d2a0: 30 20 7c 7c 20 70 2d 3e 70 4c 69 6d 69 74 21 3d  0 || p->pLimit!=
d2b0: 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4c  0 );.  if( p->pL
d2c0: 69 6d 69 74 20 29 7b 0a 20 20 20 20 70 2d 3e 69  imit ){.    p->i
d2d0: 4c 69 6d 69 74 20 3d 20 69 4c 69 6d 69 74 20 3d  Limit = iLimit =
d2e0: 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
d2f0: 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33  .    v = sqlite3
d300: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
d310: 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 76  .    if( NEVER(v
d320: 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 3b 20 20  ==0) ) return;  
d330: 2f 2a 20 56 44 42 45 20 73 68 6f 75 6c 64 20 68  /* VDBE should h
d340: 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
d350: 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20   allocated */.  
d360: 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
d370: 72 49 73 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c  rIsInteger(p->pL
d380: 69 6d 69 74 2c 20 26 6e 29 20 29 7b 0a 20 20 20  imit, &n) ){.   
d390: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
d3a0: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
d3b0: 65 72 2c 20 6e 2c 20 69 4c 69 6d 69 74 29 3b 0a  er, n, iLimit);.
d3c0: 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
d3d0: 74 28 28 76 2c 20 22 4c 49 4d 49 54 20 63 6f 75  t((v, "LIMIT cou
d3e0: 6e 74 65 72 22 29 29 3b 0a 20 20 20 20 20 20 69  nter"));.      i
d3f0: 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( n==0 ){.     
d400: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
d410: 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
d420: 20 30 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20   0, iBreak);.   
d430: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3e 3d     }else if( n>=
d440: 30 20 26 26 20 70 2d 3e 6e 53 65 6c 65 63 74 52  0 && p->nSelectR
d450: 6f 77 3e 28 75 36 34 29 6e 20 29 7b 0a 20 20 20  ow>(u64)n ){.   
d460: 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52       p->nSelectR
d470: 6f 77 20 3d 20 6e 3b 0a 20 20 20 20 20 20 7d 0a  ow = n;.      }.
d480: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
d490: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
d4a0: 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 4c 69 6d  (pParse, p->pLim
d4b0: 69 74 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20  it, iLimit);.   
d4c0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
d4d0: 64 4f 70 31 28 76 2c 20 4f 50 5f 4d 75 73 74 42  dOp1(v, OP_MustB
d4e0: 65 49 6e 74 2c 20 69 4c 69 6d 69 74 29 3b 0a 20  eInt, iLimit);. 
d4f0: 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
d500: 28 28 76 2c 20 22 4c 49 4d 49 54 20 63 6f 75 6e  ((v, "LIMIT coun
d510: 74 65 72 22 29 29 3b 0a 20 20 20 20 20 20 73 71  ter"));.      sq
d520: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
d530: 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c 20 69 4c  v, OP_IfZero, iL
d540: 69 6d 69 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20  imit, iBreak);. 
d550: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e     }.    if( p->
d560: 70 4f 66 66 73 65 74 20 29 7b 0a 20 20 20 20 20  pOffset ){.     
d570: 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 69 4f   p->iOffset = iO
d580: 66 66 73 65 74 20 3d 20 2b 2b 70 50 61 72 73 65  ffset = ++pParse
d590: 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 70 50  ->nMem;.      pP
d5a0: 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 20 20 20  arse->nMem++;   
d5b0: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 20 65  /* Allocate an e
d5c0: 78 74 72 61 20 72 65 67 69 73 74 65 72 20 66 6f  xtra register fo
d5d0: 72 20 6c 69 6d 69 74 2b 6f 66 66 73 65 74 20 2a  r limit+offset *
d5e0: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  /.      sqlite3E
d5f0: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
d600: 70 2d 3e 70 4f 66 66 73 65 74 2c 20 69 4f 66 66  p->pOffset, iOff
d610: 73 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  set);.      sqli
d620: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
d630: 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 69   OP_MustBeInt, i
d640: 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 56  Offset);.      V
d650: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
d660: 4f 46 46 53 45 54 20 63 6f 75 6e 74 65 72 22 29  OFFSET counter")
d670: 29 3b 0a 20 20 20 20 20 20 61 64 64 72 31 20 3d  );.      addr1 =
d680: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
d690: 70 31 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20  p1(v, OP_IfPos, 
d6a0: 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20  iOffset);.      
d6b0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
d6c0: 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
d6d0: 20 30 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20 20   0, iOffset);.  
d6e0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
d6f0: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 31  umpHere(v, addr1
d700: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
d710: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
d720: 5f 41 64 64 2c 20 69 4c 69 6d 69 74 2c 20 69 4f  _Add, iLimit, iO
d730: 66 66 73 65 74 2c 20 69 4f 66 66 73 65 74 2b 31  ffset, iOffset+1
d740: 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
d750: 6d 65 6e 74 28 28 76 2c 20 22 4c 49 4d 49 54 2b  ment((v, "LIMIT+
d760: 4f 46 46 53 45 54 22 29 29 3b 0a 20 20 20 20 20  OFFSET"));.     
d770: 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33   addr1 = sqlite3
d780: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
d790: 5f 49 66 50 6f 73 2c 20 69 4c 69 6d 69 74 29 3b  _IfPos, iLimit);
d7a0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
d7b0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
d7c0: 6e 74 65 67 65 72 2c 20 2d 31 2c 20 69 4f 66 66  nteger, -1, iOff
d7d0: 73 65 74 2b 31 29 3b 0a 20 20 20 20 20 20 73 71  set+1);.      sq
d7e0: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
d7f0: 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 20  e(v, addr1);.   
d800: 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65   }.  }.}..#ifnde
d810: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  f SQLITE_OMIT_CO
d820: 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a  MPOUND_SELECT./*
d830: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 61  .** Return the a
d840: 70 70 72 6f 70 72 69 61 74 65 20 63 6f 6c 6c 61  ppropriate colla
d850: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f  ting sequence fo
d860: 72 20 74 68 65 20 69 43 6f 6c 2d 74 68 20 63 6f  r the iCol-th co
d870: 6c 75 6d 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 72  lumn of.** the r
d880: 65 73 75 6c 74 20 73 65 74 20 66 6f 72 20 74 68  esult set for th
d890: 65 20 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65 63  e compound-selec
d8a0: 74 20 73 74 61 74 65 6d 65 6e 74 20 22 70 22 2e  t statement "p".
d8b0: 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66    Return NULL if
d8c0: 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 20 68  .** the column h
d8d0: 61 73 20 6e 6f 20 64 65 66 61 75 6c 74 20 63 6f  as no default co
d8e0: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
d8f0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6c 6c  ..**.** The coll
d900: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66  ating sequence f
d910: 6f 72 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  or the compound 
d920: 73 65 6c 65 63 74 20 69 73 20 74 61 6b 65 6e 20  select is taken 
d930: 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 6c 65 66 74  from the.** left
d940: 2d 6d 6f 73 74 20 74 65 72 6d 20 6f 66 20 74 68  -most term of th
d950: 65 20 73 65 6c 65 63 74 20 74 68 61 74 20 68 61  e select that ha
d960: 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  s a collating se
d970: 71 75 65 6e 63 65 2e 0a 2a 2f 0a 73 74 61 74 69  quence..*/.stati
d980: 63 20 43 6f 6c 6c 53 65 71 20 2a 6d 75 6c 74 69  c CollSeq *multi
d990: 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 50 61  SelectCollSeq(Pa
d9a0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c  rse *pParse, Sel
d9b0: 65 63 74 20 2a 70 2c 20 69 6e 74 20 69 43 6f 6c  ect *p, int iCol
d9c0: 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 52  ){.  CollSeq *pR
d9d0: 65 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72  et;.  if( p->pPr
d9e0: 69 6f 72 20 29 7b 0a 20 20 20 20 70 52 65 74 20  ior ){.    pRet 
d9f0: 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c  = multiSelectCol
da00: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 2d 3e  lSeq(pParse, p->
da10: 70 50 72 69 6f 72 2c 20 69 43 6f 6c 29 3b 0a 20  pPrior, iCol);. 
da20: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 52 65 74   }else{.    pRet
da30: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65   = 0;.  }.  asse
da40: 72 74 28 20 69 43 6f 6c 3e 3d 30 20 29 3b 0a 20  rt( iCol>=0 );. 
da50: 20 69 66 28 20 70 52 65 74 3d 3d 30 20 26 26 20   if( pRet==0 && 
da60: 69 43 6f 6c 3c 70 2d 3e 70 45 4c 69 73 74 2d 3e  iCol<p->pEList->
da70: 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 70 52 65  nExpr ){.    pRe
da80: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  t = sqlite3ExprC
da90: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
daa0: 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c  ->pEList->a[iCol
dab0: 5d 2e 70 45 78 70 72 29 3b 0a 20 20 7d 0a 20 20  ].pExpr);.  }.  
dac0: 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 23  return pRet;.}.#
dad0: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
dae0: 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  OMIT_COMPOUND_SE
daf0: 4c 45 43 54 20 2a 2f 0a 0a 2f 2a 20 46 6f 72 77  LECT */../* Forw
db00: 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f  ard reference */
db10: 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74  .static int mult
db20: 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28 0a  iSelectOrderBy(.
db30: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
db40: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
db50: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
db60: 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20  Select *p,      
db70: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67        /* The rig
db80: 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43  ht-most of SELEC
db90: 54 73 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a  Ts to be coded *
dba0: 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a  /.  SelectDest *
dbb0: 70 44 65 73 74 20 20 20 20 20 2f 2a 20 57 68 61  pDest     /* Wha
dbc0: 74 20 74 6f 20 64 6f 20 77 69 74 68 20 71 75 65  t to do with que
dbd0: 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 3b  ry results */.);
dbe0: 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ...#ifndef SQLIT
dbf0: 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
dc00: 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 54 68 69  SELECT./*.** Thi
dc10: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
dc20: 6c 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20 61  led to process a
dc30: 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 20   compound query 
dc40: 66 6f 72 6d 20 66 72 6f 6d 0a 2a 2a 20 74 77 6f  form from.** two
dc50: 20 6f 72 20 6d 6f 72 65 20 73 65 70 61 72 61 74   or more separat
dc60: 65 20 71 75 65 72 69 65 73 20 75 73 69 6e 67 20  e queries using 
dc70: 55 4e 49 4f 4e 2c 20 55 4e 49 4f 4e 20 41 4c 4c  UNION, UNION ALL
dc80: 2c 20 45 58 43 45 50 54 2c 20 6f 72 0a 2a 2a 20  , EXCEPT, or.** 
dc90: 49 4e 54 45 52 53 45 43 54 0a 2a 2a 0a 2a 2a 20  INTERSECT.**.** 
dca0: 22 70 22 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  "p" points to th
dcb0: 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20  e right-most of 
dcc0: 74 68 65 20 74 77 6f 20 71 75 65 72 69 65 73 2e  the two queries.
dcd0: 20 20 74 68 65 20 71 75 65 72 79 20 6f 6e 20 74    the query on t
dce0: 68 65 0a 2a 2a 20 6c 65 66 74 20 69 73 20 70 2d  he.** left is p-
dcf0: 3e 70 50 72 69 6f 72 2e 20 20 54 68 65 20 6c 65  >pPrior.  The le
dd00: 66 74 20 71 75 65 72 79 20 63 6f 75 6c 64 20 61  ft query could a
dd10: 6c 73 6f 20 62 65 20 61 20 63 6f 6d 70 6f 75 6e  lso be a compoun
dd20: 64 20 71 75 65 72 79 0a 2a 2a 20 69 6e 20 77 68  d query.** in wh
dd30: 69 63 68 20 63 61 73 65 20 74 68 69 73 20 72 6f  ich case this ro
dd40: 75 74 69 6e 65 20 77 69 6c 6c 20 62 65 20 63 61  utine will be ca
dd50: 6c 6c 65 64 20 72 65 63 75 72 73 69 76 65 6c 79  lled recursively
dd60: 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73  . .**.** The res
dd70: 75 6c 74 73 20 6f 66 20 74 68 65 20 74 6f 74 61  ults of the tota
dd80: 6c 20 71 75 65 72 79 20 61 72 65 20 74 6f 20 62  l query are to b
dd90: 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 61  e written into a
dda0: 20 64 65 73 74 69 6e 61 74 69 6f 6e 0a 2a 2a 20   destination.** 
ddb0: 6f 66 20 74 79 70 65 20 65 44 65 73 74 20 77 69  of type eDest wi
ddc0: 74 68 20 70 61 72 61 6d 65 74 65 72 20 69 50 61  th parameter iPa
ddd0: 72 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c  rm..**.** Exampl
dde0: 65 20 31 3a 20 20 43 6f 6e 73 69 64 65 72 20 61  e 1:  Consider a
ddf0: 20 74 68 72 65 65 2d 77 61 79 20 63 6f 6d 70 6f   three-way compo
de00: 75 6e 64 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  und SQL statemen
de10: 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c  t..**.**     SEL
de20: 45 43 54 20 61 20 46 52 4f 4d 20 74 31 20 55 4e  ECT a FROM t1 UN
de30: 49 4f 4e 20 53 45 4c 45 43 54 20 62 20 46 52 4f  ION SELECT b FRO
de40: 4d 20 74 32 20 55 4e 49 4f 4e 20 53 45 4c 45 43  M t2 UNION SELEC
de50: 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a 2a 0a 2a  T c FROM t3.**.*
de60: 2a 20 54 68 69 73 20 73 74 61 74 65 6d 65 6e 74  * This statement
de70: 20 69 73 20 70 61 72 73 65 64 20 75 70 20 61 73   is parsed up as
de80: 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
de90: 20 20 20 20 53 45 4c 45 43 54 20 63 20 46 52 4f      SELECT c FRO
dea0: 4d 20 74 33 0a 2a 2a 20 20 20 20 20 20 7c 0a 2a  M t3.**      |.*
deb0: 2a 20 20 20 20 20 20 60 2d 2d 2d 2d 2d 3e 20 20  *      `----->  
dec0: 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 74 32  SELECT b FROM t2
ded0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
dee0: 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20     |.**         
def0: 20 20 20 20 20 20 20 60 2d 2d 2d 2d 2d 2d 3e 20         `------> 
df00: 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74   SELECT a FROM t
df10: 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 72 72 6f  1.**.** The arro
df20: 77 73 20 69 6e 20 74 68 65 20 64 69 61 67 72 61  ws in the diagra
df30: 6d 20 61 62 6f 76 65 20 72 65 70 72 65 73 65 6e  m above represen
df40: 74 20 74 68 65 20 53 65 6c 65 63 74 2e 70 50 72  t the Select.pPr
df50: 69 6f 72 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 20  ior pointer..** 
df60: 53 6f 20 69 66 20 74 68 69 73 20 72 6f 75 74 69  So if this routi
df70: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 69 74  ne is called wit
df80: 68 20 70 20 65 71 75 61 6c 20 74 6f 20 74 68 65  h p equal to the
df90: 20 74 33 20 71 75 65 72 79 2c 20 74 68 65 6e 0a   t3 query, then.
dfa0: 2a 2a 20 70 50 72 69 6f 72 20 77 69 6c 6c 20 62  ** pPrior will b
dfb0: 65 20 74 68 65 20 74 32 20 71 75 65 72 79 2e 20  e the t2 query. 
dfc0: 20 70 2d 3e 6f 70 20 77 69 6c 6c 20 62 65 20 54   p->op will be T
dfd0: 4b 5f 55 4e 49 4f 4e 20 69 6e 20 74 68 69 73 20  K_UNION in this 
dfe0: 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 69  case..**.** Noti
dff0: 63 65 20 74 68 61 74 20 62 65 63 61 75 73 65 20  ce that because 
e000: 6f 66 20 74 68 65 20 77 61 79 20 53 51 4c 69 74  of the way SQLit
e010: 65 20 70 61 72 73 65 73 20 63 6f 6d 70 6f 75 6e  e parses compoun
e020: 64 20 53 45 4c 45 43 54 73 2c 20 74 68 65 0a 2a  d SELECTs, the.*
e030: 2a 20 69 6e 64 69 76 69 64 75 61 6c 20 73 65 6c  * individual sel
e040: 65 63 74 73 20 61 6c 77 61 79 73 20 67 72 6f 75  ects always grou
e050: 70 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72  p from left to r
e060: 69 67 68 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ight..*/.static 
e070: 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74 28  int multiSelect(
e080: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
e090: 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  ,        /* Pars
e0a0: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
e0b0: 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
e0c0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69         /* The ri
e0d0: 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45  ght-most of SELE
e0e0: 43 54 73 20 74 6f 20 62 65 20 63 6f 64 65 64 20  CTs to be coded 
e0f0: 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  */.  SelectDest 
e100: 2a 70 44 65 73 74 20 20 20 20 20 2f 2a 20 57 68  *pDest     /* Wh
e110: 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 71 75  at to do with qu
e120: 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29  ery results */.)
e130: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
e140: 49 54 45 5f 4f 4b 3b 20 20 20 2f 2a 20 53 75 63  ITE_OK;   /* Suc
e150: 63 65 73 73 20 63 6f 64 65 20 66 72 6f 6d 20 61  cess code from a
e160: 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
e170: 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72 3b   Select *pPrior;
e180: 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65         /* Anothe
e190: 72 20 53 45 4c 45 43 54 20 69 6d 6d 65 64 69 61  r SELECT immedia
e1a0: 74 65 6c 79 20 74 6f 20 6f 75 72 20 6c 65 66 74  tely to our left
e1b0: 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20   */.  Vdbe *v;  
e1c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47              /* G
e1d0: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
e1e0: 74 68 69 73 20 56 44 42 45 20 2a 2f 0a 20 20 53  this VDBE */.  S
e1f0: 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b 20  electDest dest; 
e200: 20 20 20 20 20 2f 2a 20 41 6c 74 65 72 6e 61 74       /* Alternat
e210: 69 76 65 20 64 61 74 61 20 64 65 73 74 69 6e 61  ive data destina
e220: 74 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65 63 74  tion */.  Select
e230: 20 2a 70 44 65 6c 65 74 65 20 3d 20 30 3b 20 20   *pDelete = 0;  
e240: 2f 2a 20 43 68 61 69 6e 20 6f 66 20 73 69 6d 70  /* Chain of simp
e250: 6c 65 20 73 65 6c 65 63 74 73 20 74 6f 20 64 65  le selects to de
e260: 6c 65 74 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  lete */.  sqlite
e270: 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20  3 *db;          
e280: 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
e290: 65 63 74 69 6f 6e 20 2a 2f 0a 23 69 66 6e 64 65  ection */.#ifnde
e2a0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  f SQLITE_OMIT_EX
e2b0: 50 4c 41 49 4e 0a 20 20 69 6e 74 20 69 53 75 62  PLAIN.  int iSub
e2c0: 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  1;            /*
e2d0: 20 45 51 50 20 69 64 20 6f 66 20 6c 65 66 74 2d   EQP id of left-
e2e0: 68 61 6e 64 20 71 75 65 72 79 20 2a 2f 0a 20 20  hand query */.  
e2f0: 69 6e 74 20 69 53 75 62 32 3b 20 20 20 20 20 20  int iSub2;      
e300: 20 20 20 20 20 20 2f 2a 20 45 51 50 20 69 64 20        /* EQP id 
e310: 6f 66 20 72 69 67 68 74 2d 68 61 6e 64 20 71 75  of right-hand qu
e320: 65 72 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20  ery */.#endif.. 
e330: 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68   /* Make sure th
e340: 65 72 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20  ere is no ORDER 
e350: 42 59 20 6f 72 20 4c 49 4d 49 54 20 63 6c 61 75  BY or LIMIT clau
e360: 73 65 20 6f 6e 20 70 72 69 6f 72 20 53 45 4c 45  se on prior SELE
e370: 43 54 73 2e 20 20 4f 6e 6c 79 0a 20 20 2a 2a 20  CTs.  Only.  ** 
e380: 74 68 65 20 6c 61 73 74 20 28 72 69 67 68 74 2d  the last (right-
e390: 6d 6f 73 74 29 20 53 45 4c 45 43 54 20 69 6e 20  most) SELECT in 
e3a0: 74 68 65 20 73 65 72 69 65 73 20 6d 61 79 20 68  the series may h
e3b0: 61 76 65 20 61 6e 20 4f 52 44 45 52 20 42 59 20  ave an ORDER BY 
e3c0: 6f 72 20 4c 49 4d 49 54 2e 0a 20 20 2a 2f 0a 20  or LIMIT..  */. 
e3d0: 20 61 73 73 65 72 74 28 20 70 20 26 26 20 70 2d   assert( p && p-
e3e0: 3e 70 50 72 69 6f 72 20 29 3b 20 20 2f 2a 20 43  >pPrior );  /* C
e3f0: 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20  alling function 
e400: 67 75 61 72 61 6e 74 65 65 73 20 74 68 69 73 20  guarantees this 
e410: 6d 75 63 68 20 2a 2f 0a 20 20 64 62 20 3d 20 70  much */.  db = p
e420: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 50 72  Parse->db;.  pPr
e430: 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b  ior = p->pPrior;
e440: 0a 20 20 61 73 73 65 72 74 28 20 70 50 72 69 6f  .  assert( pPrio
e450: 72 2d 3e 70 52 69 67 68 74 6d 6f 73 74 21 3d 70  r->pRightmost!=p
e460: 50 72 69 6f 72 20 29 3b 0a 20 20 61 73 73 65 72  Prior );.  asser
e470: 74 28 20 70 50 72 69 6f 72 2d 3e 70 52 69 67 68  t( pPrior->pRigh
e480: 74 6d 6f 73 74 3d 3d 70 2d 3e 70 52 69 67 68 74  tmost==p->pRight
e490: 6d 6f 73 74 20 29 3b 0a 20 20 64 65 73 74 20 3d  most );.  dest =
e4a0: 20 2a 70 44 65 73 74 3b 0a 20 20 69 66 28 20 70   *pDest;.  if( p
e4b0: 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20  Prior->pOrderBy 
e4c0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
e4d0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22 4f  rorMsg(pParse,"O
e4e0: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 73  RDER BY clause s
e4f0: 68 6f 75 6c 64 20 63 6f 6d 65 20 61 66 74 65 72  hould come after
e500: 20 25 73 20 6e 6f 74 20 62 65 66 6f 72 65 22 2c   %s not before",
e510: 0a 20 20 20 20 20 20 73 65 6c 65 63 74 4f 70 4e  .      selectOpN
e520: 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20  ame(p->op));.   
e530: 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74   rc = 1;.    got
e540: 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
e550: 6e 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  nd;.  }.  if( pP
e560: 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a  rior->pLimit ){.
e570: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
e580: 4d 73 67 28 70 50 61 72 73 65 2c 22 4c 49 4d 49  Msg(pParse,"LIMI
e590: 54 20 63 6c 61 75 73 65 20 73 68 6f 75 6c 64 20  T clause should 
e5a0: 63 6f 6d 65 20 61 66 74 65 72 20 25 73 20 6e 6f  come after %s no
e5b0: 74 20 62 65 66 6f 72 65 22 2c 0a 20 20 20 20 20  t before",.     
e5c0: 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d   selectOpName(p-
e5d0: 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63 20 3d 20  >op));.    rc = 
e5e0: 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74  1;.    goto mult
e5f0: 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
e600: 7d 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33  }..  v = sqlite3
e610: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
e620: 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20  .  assert( v!=0 
e630: 29 3b 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20  );  /* The VDBE 
e640: 61 6c 72 65 61 64 79 20 63 72 65 61 74 65 64 20  already created 
e650: 62 79 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  by calling funct
e660: 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 43 72 65  ion */..  /* Cre
e670: 61 74 65 20 74 68 65 20 64 65 73 74 69 6e 61 74  ate the destinat
e680: 69 6f 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61  ion temporary ta
e690: 62 6c 65 20 69 66 20 6e 65 63 65 73 73 61 72 79  ble if necessary
e6a0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 65 73 74  .  */.  if( dest
e6b0: 2e 65 44 65 73 74 3d 3d 53 52 54 5f 45 70 68 65  .eDest==SRT_Ephe
e6c0: 6d 54 61 62 20 29 7b 0a 20 20 20 20 61 73 73 65  mTab ){.    asse
e6d0: 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b  rt( p->pEList );
e6e0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
e6f0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65  AddOp2(v, OP_Ope
e700: 6e 45 70 68 65 6d 65 72 61 6c 2c 20 64 65 73 74  nEphemeral, dest
e710: 2e 69 53 44 50 61 72 6d 2c 20 70 2d 3e 70 45 4c  .iSDParm, p->pEL
e720: 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20  ist->nExpr);.   
e730: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
e740: 67 65 50 35 28 76 2c 20 42 54 52 45 45 5f 55 4e  geP5(v, BTREE_UN
e750: 4f 52 44 45 52 45 44 29 3b 0a 20 20 20 20 64 65  ORDERED);.    de
e760: 73 74 2e 65 44 65 73 74 20 3d 20 53 52 54 5f 54  st.eDest = SRT_T
e770: 61 62 6c 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  able;.  }..  /* 
e780: 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 53 45  Make sure all SE
e790: 4c 45 43 54 73 20 69 6e 20 74 68 65 20 73 74 61  LECTs in the sta
e7a0: 74 65 6d 65 6e 74 20 68 61 76 65 20 74 68 65 20  tement have the 
e7b0: 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 65  same number of e
e7c0: 6c 65 6d 65 6e 74 73 0a 20 20 2a 2a 20 69 6e 20  lements.  ** in 
e7d0: 74 68 65 69 72 20 72 65 73 75 6c 74 20 73 65 74  their result set
e7e0: 73 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  s..  */.  assert
e7f0: 28 20 70 2d 3e 70 45 4c 69 73 74 20 26 26 20 70  ( p->pEList && p
e800: 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74 20 29 3b  Prior->pEList );
e810: 0a 20 20 69 66 28 20 70 2d 3e 70 45 4c 69 73 74  .  if( p->pEList
e820: 2d 3e 6e 45 78 70 72 21 3d 70 50 72 69 6f 72 2d  ->nExpr!=pPrior-
e830: 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  >pEList->nExpr )
e840: 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 73 65 6c  {.    if( p->sel
e850: 46 6c 61 67 73 20 26 20 53 46 5f 56 61 6c 75 65  Flags & SF_Value
e860: 73 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  s ){.      sqlit
e870: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
e880: 65 2c 20 22 61 6c 6c 20 56 41 4c 55 45 53 20 6d  e, "all VALUES m
e890: 75 73 74 20 68 61 76 65 20 74 68 65 20 73 61 6d  ust have the sam
e8a0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d  e number of term
e8b0: 73 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  s");.    }else{.
e8c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
e8d0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 53  orMsg(pParse, "S
e8e0: 45 4c 45 43 54 73 20 74 6f 20 74 68 65 20 6c 65  ELECTs to the le
e8f0: 66 74 20 61 6e 64 20 72 69 67 68 74 20 6f 66 20  ft and right of 
e900: 25 73 22 0a 20 20 20 20 20 20 20 20 22 20 64 6f  %s".        " do
e910: 20 6e 6f 74 20 68 61 76 65 20 74 68 65 20 73 61   not have the sa
e920: 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73  me number of res
e930: 75 6c 74 20 63 6f 6c 75 6d 6e 73 22 2c 20 73 65  ult columns", se
e940: 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70  lectOpName(p->op
e950: 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  ));.    }.    rc
e960: 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d   = 1;.    goto m
e970: 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
e980: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 6f  .  }..  /* Compo
e990: 75 6e 64 20 53 45 4c 45 43 54 73 20 74 68 61 74  und SELECTs that
e9a0: 20 68 61 76 65 20 61 6e 20 4f 52 44 45 52 20 42   have an ORDER B
e9b0: 59 20 63 6c 61 75 73 65 20 61 72 65 20 68 61 6e  Y clause are han
e9c0: 64 6c 65 64 20 73 65 70 61 72 61 74 65 6c 79 2e  dled separately.
e9d0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  .  */.  if( p->p
e9e0: 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 72  OrderBy ){.    r
e9f0: 65 74 75 72 6e 20 6d 75 6c 74 69 53 65 6c 65 63  eturn multiSelec
ea00: 74 4f 72 64 65 72 42 79 28 70 50 61 72 73 65 2c  tOrderBy(pParse,
ea10: 20 70 2c 20 70 44 65 73 74 29 3b 0a 20 20 7d 0a   p, pDest);.  }.
ea20: 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63  .  /* Generate c
ea30: 6f 64 65 20 66 6f 72 20 74 68 65 20 6c 65 66 74  ode for the left
ea40: 20 61 6e 64 20 72 69 67 68 74 20 53 45 4c 45 43   and right SELEC
ea50: 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20  T statements..  
ea60: 2a 2f 0a 20 20 73 77 69 74 63 68 28 20 70 2d 3e  */.  switch( p->
ea70: 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
ea80: 4b 5f 41 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 69  K_ALL: {.      i
ea90: 6e 74 20 61 64 64 72 20 3d 20 30 3b 0a 20 20 20  nt addr = 0;.   
eaa0: 20 20 20 69 6e 74 20 6e 4c 69 6d 69 74 3b 0a 20     int nLimit;. 
eab0: 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50       assert( !pP
eac0: 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 29 3b 0a  rior->pLimit );.
ead0: 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 69 4c        pPrior->iL
eae0: 69 6d 69 74 20 3d 20 70 2d 3e 69 4c 69 6d 69 74  imit = p->iLimit
eaf0: 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e  ;.      pPrior->
eb00: 69 4f 66 66 73 65 74 20 3d 20 70 2d 3e 69 4f 66  iOffset = p->iOf
eb10: 66 73 65 74 3b 0a 20 20 20 20 20 20 70 50 72 69  fset;.      pPri
eb20: 6f 72 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 2d 3e  or->pLimit = p->
eb30: 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 50  pLimit;.      pP
eb40: 72 69 6f 72 2d 3e 70 4f 66 66 73 65 74 20 3d 20  rior->pOffset = 
eb50: 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20 20  p->pOffset;.    
eb60: 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65    explainSetInte
eb70: 67 65 72 28 69 53 75 62 31 2c 20 70 50 61 72 73  ger(iSub1, pPars
eb80: 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64  e->iNextSelectId
eb90: 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
eba0: 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
ebb0: 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 64 65 73  se, pPrior, &des
ebc0: 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69  t);.      p->pLi
ebd0: 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  mit = 0;.      p
ebe0: 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20  ->pOffset = 0;. 
ebf0: 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
ec00: 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74         goto mult
ec10: 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
ec20: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 70      }.      p->p
ec30: 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20  Prior = 0;.     
ec40: 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 70 50 72   p->iLimit = pPr
ec50: 69 6f 72 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 20  ior->iLimit;.   
ec60: 20 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20     p->iOffset = 
ec70: 70 50 72 69 6f 72 2d 3e 69 4f 66 66 73 65 74 3b  pPrior->iOffset;
ec80: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 69 4c  .      if( p->iL
ec90: 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20  imit ){.        
eca0: 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
ecb0: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49  beAddOp1(v, OP_I
ecc0: 66 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74  fZero, p->iLimit
ecd0: 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
ece0: 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4a 75 6d 70  omment((v, "Jump
ecf0: 20 61 68 65 61 64 20 69 66 20 4c 49 4d 49 54 20   ahead if LIMIT 
ed00: 72 65 61 63 68 65 64 22 29 29 3b 0a 20 20 20 20  reached"));.    
ed10: 20 20 7d 0a 20 20 20 20 20 20 65 78 70 6c 61 69    }.      explai
ed20: 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53 75 62  nSetInteger(iSub
ed30: 32 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74  2, pParse->iNext
ed40: 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20  SelectId);.     
ed50: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c   rc = sqlite3Sel
ed60: 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26  ect(pParse, p, &
ed70: 64 65 73 74 29 3b 0a 20 20 20 20 20 20 74 65 73  dest);.      tes
ed80: 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54  tcase( rc!=SQLIT
ed90: 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 70 44  E_OK );.      pD
eda0: 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50 72 69 6f  elete = p->pPrio
edb0: 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69  r;.      p->pPri
edc0: 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20  or = pPrior;.   
edd0: 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77     p->nSelectRow
ede0: 20 2b 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c   += pPrior->nSel
edf0: 65 63 74 52 6f 77 3b 0a 20 20 20 20 20 20 69 66  ectRow;.      if
ee00: 28 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74  ( pPrior->pLimit
ee10: 0a 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74  .       && sqlit
ee20: 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28  e3ExprIsInteger(
ee30: 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 2c 20  pPrior->pLimit, 
ee40: 26 6e 4c 69 6d 69 74 29 0a 20 20 20 20 20 20 20  &nLimit).       
ee50: 26 26 20 6e 4c 69 6d 69 74 3e 30 20 26 26 20 70  && nLimit>0 && p
ee60: 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3e 20 28  ->nSelectRow > (
ee70: 75 36 34 29 6e 4c 69 6d 69 74 20 0a 20 20 20 20  u64)nLimit .    
ee80: 20 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e    ){.        p->
ee90: 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 6e 4c 69  nSelectRow = nLi
eea0: 6d 69 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  mit;.      }.   
eeb0: 20 20 20 69 66 28 20 61 64 64 72 20 29 7b 0a 20     if( addr ){. 
eec0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
eed0: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
eee0: 64 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  dr);.      }.   
eef0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
ef00: 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43 45      case TK_EXCE
ef10: 50 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  PT:.    case TK_
ef20: 55 4e 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 69  UNION: {.      i
ef30: 6e 74 20 75 6e 69 6f 6e 54 61 62 3b 20 20 20 20  nt unionTab;    
ef40: 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72  /* Cursor number
ef50: 20 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61 72   of the temporar
ef60: 79 20 74 61 62 6c 65 20 68 6f 6c 64 69 6e 67 20  y table holding 
ef70: 72 65 73 75 6c 74 20 2a 2f 0a 20 20 20 20 20 20  result */.      
ef80: 75 38 20 6f 70 20 3d 20 30 3b 20 20 20 20 20 20  u8 op = 0;      
ef90: 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 53   /* One of the S
efa0: 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e 73 20 74  RT_ operations t
efb0: 6f 20 61 70 70 6c 79 20 74 6f 20 73 65 6c 66 20  o apply to self 
efc0: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 70 72 69  */.      int pri
efd0: 6f 72 4f 70 3b 20 20 20 20 20 2f 2a 20 54 68 65  orOp;     /* The
efe0: 20 53 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e 20   SRT_ operation 
eff0: 74 6f 20 61 70 70 6c 79 20 74 6f 20 70 72 69 6f  to apply to prio
f000: 72 20 73 65 6c 65 63 74 73 20 2a 2f 0a 20 20 20  r selects */.   
f010: 20 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c     Expr *pLimit,
f020: 20 2a 70 4f 66 66 73 65 74 3b 20 2f 2a 20 53 61   *pOffset; /* Sa
f030: 76 65 64 20 76 61 6c 75 65 73 20 6f 66 20 70 2d  ved values of p-
f040: 3e 6e 4c 69 6d 69 74 20 61 6e 64 20 70 2d 3e 6e  >nLimit and p->n
f050: 4f 66 66 73 65 74 20 2a 2f 0a 20 20 20 20 20 20  Offset */.      
f060: 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20  int addr;.      
f070: 53 65 6c 65 63 74 44 65 73 74 20 75 6e 69 6f 6e  SelectDest union
f080: 64 65 73 74 3b 0a 0a 20 20 20 20 20 20 74 65 73  dest;..      tes
f090: 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b  tcase( p->op==TK
f0a0: 5f 45 58 43 45 50 54 20 29 3b 0a 20 20 20 20 20  _EXCEPT );.     
f0b0: 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e 6f 70   testcase( p->op
f0c0: 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20  ==TK_UNION );.  
f0d0: 20 20 20 20 70 72 69 6f 72 4f 70 20 3d 20 53 52      priorOp = SR
f0e0: 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20 20 20 69  T_Union;.      i
f0f0: 66 28 20 64 65 73 74 2e 65 44 65 73 74 3d 3d 70  f( dest.eDest==p
f100: 72 69 6f 72 4f 70 20 26 26 20 41 4c 57 41 59 53  riorOp && ALWAYS
f110: 28 21 70 2d 3e 70 4c 69 6d 69 74 20 26 26 21 70  (!p->pLimit &&!p
f120: 2d 3e 70 4f 66 66 73 65 74 29 20 29 7b 0a 20 20  ->pOffset) ){.  
f130: 20 20 20 20 20 20 2f 2a 20 57 65 20 63 61 6e 20        /* We can 
f140: 72 65 75 73 65 20 61 20 74 65 6d 70 6f 72 61 72  reuse a temporar
f150: 79 20 74 61 62 6c 65 20 67 65 6e 65 72 61 74 65  y table generate
f160: 64 20 62 79 20 61 20 53 45 4c 45 43 54 20 74 6f  d by a SELECT to
f170: 20 6f 75 72 0a 20 20 20 20 20 20 20 20 2a 2a 20   our.        ** 
f180: 72 69 67 68 74 2e 0a 20 20 20 20 20 20 20 20 2a  right..        *
f190: 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
f1a0: 28 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 21  ( p->pRightmost!
f1b0: 3d 70 20 29 3b 20 20 2f 2a 20 43 61 6e 20 6f 6e  =p );  /* Can on
f1c0: 6c 79 20 68 61 70 70 65 6e 20 66 6f 72 20 6c 65  ly happen for le
f1d0: 66 74 77 61 72 64 20 65 6c 65 6d 65 6e 74 73 0a  ftward elements.
f1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f1f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f200: 20 20 20 20 20 2a 2a 20 6f 66 20 61 20 33 2d 77       ** of a 3-w
f210: 61 79 20 6f 72 20 6d 6f 72 65 20 63 6f 6d 70 6f  ay or more compo
f220: 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 61  und */.        a
f230: 73 73 65 72 74 28 20 70 2d 3e 70 4c 69 6d 69 74  ssert( p->pLimit
f240: 3d 3d 30 20 29 3b 20 20 20 20 20 20 2f 2a 20 4e  ==0 );      /* N
f250: 6f 74 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 6c 65  ot allowed on le
f260: 66 74 77 61 72 64 20 65 6c 65 6d 65 6e 74 73 20  ftward elements 
f270: 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
f280: 74 28 20 70 2d 3e 70 4f 66 66 73 65 74 3d 3d 30  t( p->pOffset==0
f290: 20 29 3b 20 20 20 20 20 2f 2a 20 4e 6f 74 20 61   );     /* Not a
f2a0: 6c 6c 6f 77 65 64 20 6f 6e 20 6c 65 66 74 77 61  llowed on leftwa
f2b0: 72 64 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20  rd elements */. 
f2c0: 20 20 20 20 20 20 20 75 6e 69 6f 6e 54 61 62 20         unionTab 
f2d0: 3d 20 64 65 73 74 2e 69 53 44 50 61 72 6d 3b 0a  = dest.iSDParm;.
f2e0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
f2f0: 20 20 20 20 20 2f 2a 20 57 65 20 77 69 6c 6c 20       /* We will 
f300: 6e 65 65 64 20 74 6f 20 63 72 65 61 74 65 20 6f  need to create o
f310: 75 72 20 6f 77 6e 20 74 65 6d 70 6f 72 61 72 79  ur own temporary
f320: 20 74 61 62 6c 65 20 74 6f 20 68 6f 6c 64 20 74   table to hold t
f330: 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e  he.        ** in
f340: 74 65 72 6d 65 64 69 61 74 65 20 72 65 73 75 6c  termediate resul
f350: 74 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ts..        */. 
f360: 20 20 20 20 20 20 20 75 6e 69 6f 6e 54 61 62 20         unionTab 
f370: 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
f380: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
f390: 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30  ( p->pOrderBy==0
f3a0: 20 29 3b 0a 20 20 20 20 20 20 20 20 61 64 64 72   );.        addr
f3b0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
f3c0: 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  dOp2(v, OP_OpenE
f3d0: 70 68 65 6d 65 72 61 6c 2c 20 75 6e 69 6f 6e 54  phemeral, unionT
f3e0: 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ab, 0);.        
f3f0: 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f  assert( p->addrO
f400: 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20 2d 31  penEphm[0] == -1
f410: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61   );.        p->a
f420: 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d  ddrOpenEphm[0] =
f430: 20 61 64 64 72 3b 0a 20 20 20 20 20 20 20 20 70   addr;.        p
f440: 2d 3e 70 52 69 67 68 74 6d 6f 73 74 2d 3e 73 65  ->pRightmost->se
f450: 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 55 73 65  lFlags |= SF_Use
f460: 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20 20 20  sEphemeral;.    
f470: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
f480: 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20 7d  EList );.      }
f490: 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20  ..      /* Code 
f4a0: 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
f4b0: 6d 65 6e 74 73 20 74 6f 20 6f 75 72 20 6c 65 66  ments to our lef
f4c0: 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  t.      */.     
f4d0: 20 61 73 73 65 72 74 28 20 21 70 50 72 69 6f 72   assert( !pPrior
f4e0: 2d 3e 70 4f 72 64 65 72 42 79 20 29 3b 0a 20 20  ->pOrderBy );.  
f4f0: 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
f500: 74 44 65 73 74 49 6e 69 74 28 26 75 6e 69 6f 6e  tDestInit(&union
f510: 64 65 73 74 2c 20 70 72 69 6f 72 4f 70 2c 20 75  dest, priorOp, u
f520: 6e 69 6f 6e 54 61 62 29 3b 0a 20 20 20 20 20 20  nionTab);.      
f530: 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65  explainSetIntege
f540: 72 28 69 53 75 62 31 2c 20 70 50 61 72 73 65 2d  r(iSub1, pParse-
f550: 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b  >iNextSelectId);
f560: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
f570: 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
f580: 2c 20 70 50 72 69 6f 72 2c 20 26 75 6e 69 6f 6e  , pPrior, &union
f590: 64 65 73 74 29 3b 0a 20 20 20 20 20 20 69 66 28  dest);.      if(
f5a0: 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67   rc ){.        g
f5b0: 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
f5c0: 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  _end;.      }.. 
f5d0: 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65       /* Code the
f5e0: 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20   current SELECT 
f5f0: 73 74 61 74 65 6d 65 6e 74 0a 20 20 20 20 20 20  statement.      
f600: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  */.      if( p->
f610: 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20 29 7b  op==TK_EXCEPT ){
f620: 0a 20 20 20 20 20 20 20 20 6f 70 20 3d 20 53 52  .        op = SR
f630: 54 5f 45 78 63 65 70 74 3b 0a 20 20 20 20 20 20  T_Except;.      
f640: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61  }else{.        a
f650: 73 73 65 72 74 28 20 70 2d 3e 6f 70 3d 3d 54 4b  ssert( p->op==TK
f660: 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20  _UNION );.      
f670: 20 20 6f 70 20 3d 20 53 52 54 5f 55 6e 69 6f 6e    op = SRT_Union
f680: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
f690: 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20  p->pPrior = 0;. 
f6a0: 20 20 20 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d       pLimit = p-
f6b0: 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70  >pLimit;.      p
f6c0: 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->pLimit = 0;.  
f6d0: 20 20 20 20 70 4f 66 66 73 65 74 20 3d 20 70 2d      pOffset = p-
f6e0: 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  >pOffset;.      
f6f0: 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a  p->pOffset = 0;.
f700: 20 20 20 20 20 20 75 6e 69 6f 6e 64 65 73 74 2e        uniondest.
f710: 65 44 65 73 74 20 3d 20 6f 70 3b 0a 20 20 20 20  eDest = op;.    
f720: 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65    explainSetInte
f730: 67 65 72 28 69 53 75 62 32 2c 20 70 50 61 72 73  ger(iSub2, pPars
f740: 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64  e->iNextSelectId
f750: 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
f760: 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
f770: 73 65 2c 20 70 2c 20 26 75 6e 69 6f 6e 64 65 73  se, p, &uniondes
f780: 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  t);.      testca
f790: 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  se( rc!=SQLITE_O
f7a0: 4b 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20 51 75  K );.      /* Qu
f7b0: 65 72 79 20 66 6c 61 74 74 65 6e 69 6e 67 20 69  ery flattening i
f7c0: 6e 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  n sqlite3Select(
f7d0: 29 20 6d 69 67 68 74 20 72 65 66 69 6c 6c 20 70  ) might refill p
f7e0: 2d 3e 70 4f 72 64 65 72 42 79 2e 0a 20 20 20 20  ->pOrderBy..    
f7f0: 20 20 2a 2a 20 42 65 20 73 75 72 65 20 74 6f 20    ** Be sure to 
f800: 64 65 6c 65 74 65 20 70 2d 3e 70 4f 72 64 65 72  delete p->pOrder
f810: 42 79 2c 20 74 68 65 72 65 66 6f 72 65 2c 20 74  By, therefore, t
f820: 6f 20 61 76 6f 69 64 20 61 20 6d 65 6d 6f 72 79  o avoid a memory
f830: 20 6c 65 61 6b 2e 20 2a 2f 0a 20 20 20 20 20 20   leak. */.      
f840: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
f850: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 72  elete(db, p->pOr
f860: 64 65 72 42 79 29 3b 0a 20 20 20 20 20 20 70 44  derBy);.      pD
f870: 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50 72 69 6f  elete = p->pPrio
f880: 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69  r;.      p->pPri
f890: 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20  or = pPrior;.   
f8a0: 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d     p->pOrderBy =
f8b0: 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d   0;.      if( p-
f8c0: 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 20  >op==TK_UNION ) 
f8d0: 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 2b 3d  p->nSelectRow +=
f8e0: 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74   pPrior->nSelect
f8f0: 52 6f 77 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Row;.      sqlit
f900: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
f910: 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20   p->pLimit);.   
f920: 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70     p->pLimit = p
f930: 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e  Limit;.      p->
f940: 70 4f 66 66 73 65 74 20 3d 20 70 4f 66 66 73 65  pOffset = pOffse
f950: 74 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4c 69 6d  t;.      p->iLim
f960: 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d  it = 0;.      p-
f970: 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b 0a 0a 20  >iOffset = 0;.. 
f980: 20 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20       /* Convert 
f990: 74 68 65 20 64 61 74 61 20 69 6e 20 74 68 65 20  the data in the 
f9a0: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
f9b0: 69 6e 74 6f 20 77 68 61 74 65 76 65 72 20 66 6f  into whatever fo
f9c0: 72 6d 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 69  rm.      ** it i
f9d0: 73 20 74 68 61 74 20 77 65 20 63 75 72 72 65 6e  s that we curren
f9e0: 74 6c 79 20 6e 65 65 64 2e 0a 20 20 20 20 20 20  tly need..      
f9f0: 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
fa00: 20 75 6e 69 6f 6e 54 61 62 3d 3d 64 65 73 74 2e   unionTab==dest.
fa10: 69 53 44 50 61 72 6d 20 7c 7c 20 64 65 73 74 2e  iSDParm || dest.
fa20: 65 44 65 73 74 21 3d 70 72 69 6f 72 4f 70 20 29  eDest!=priorOp )
fa30: 3b 0a 20 20 20 20 20 20 69 66 28 20 64 65 73 74  ;.      if( dest
fa40: 2e 65 44 65 73 74 21 3d 70 72 69 6f 72 4f 70 20  .eDest!=priorOp 
fa50: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  ){.        int i
fa60: 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 69 53  Cont, iBreak, iS
fa70: 74 61 72 74 3b 0a 20 20 20 20 20 20 20 20 61 73  tart;.        as
fa80: 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20  sert( p->pEList 
fa90: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64  );.        if( d
faa0: 65 73 74 2e 65 44 65 73 74 3d 3d 53 52 54 5f 4f  est.eDest==SRT_O
fab0: 75 74 70 75 74 20 29 7b 0a 20 20 20 20 20 20 20  utput ){.       
fac0: 20 20 20 53 65 6c 65 63 74 20 2a 70 46 69 72 73     Select *pFirs
fad0: 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 20  t = p;.         
fae0: 20 77 68 69 6c 65 28 20 70 46 69 72 73 74 2d 3e   while( pFirst->
faf0: 70 50 72 69 6f 72 20 29 20 70 46 69 72 73 74 20  pPrior ) pFirst 
fb00: 3d 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72  = pFirst->pPrior
fb10: 3b 0a 20 20 20 20 20 20 20 20 20 20 67 65 6e 65  ;.          gene
fb20: 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  rateColumnNames(
fb30: 70 50 61 72 73 65 2c 20 30 2c 20 70 46 69 72 73  pParse, 0, pFirs
fb40: 74 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  t->pEList);.    
fb50: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 42      }.        iB
fb60: 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64  reak = sqlite3Vd
fb70: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
fb80: 20 20 20 20 20 20 20 20 69 43 6f 6e 74 20 3d 20          iCont = 
fb90: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
fba0: 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20  abel(v);.       
fbb0: 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67   computeLimitReg
fbc0: 69 73 74 65 72 73 28 70 50 61 72 73 65 2c 20 70  isters(pParse, p
fbd0: 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20  , iBreak);.     
fbe0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
fbf0: 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e  dOp2(v, OP_Rewin
fc00: 64 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69 42 72  d, unionTab, iBr
fc10: 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 69 53  eak);.        iS
fc20: 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64  tart = sqlite3Vd
fc30: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
fc40: 3b 0a 20 20 20 20 20 20 20 20 73 65 6c 65 63 74  ;.        select
fc50: 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65  InnerLoop(pParse
fc60: 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20  , p, p->pEList, 
fc70: 75 6e 69 6f 6e 54 61 62 2c 20 70 2d 3e 70 45 4c  unionTab, p->pEL
fc80: 69 73 74 2d 3e 6e 45 78 70 72 2c 0a 20 20 20 20  ist->nExpr,.    
fc90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fca0: 20 20 20 20 30 2c 20 30 2c 20 26 64 65 73 74 2c      0, 0, &dest,
fcb0: 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 29 3b   iCont, iBreak);
fcc0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
fcd0: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
fce0: 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20  (v, iCont);.    
fcf0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
fd00: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74  ddOp2(v, OP_Next
fd10: 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69 53 74 61  , unionTab, iSta
fd20: 72 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  rt);.        sql
fd30: 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
fd40: 61 62 65 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b  abel(v, iBreak);
fd50: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
fd60: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
fd70: 5f 43 6c 6f 73 65 2c 20 75 6e 69 6f 6e 54 61 62  _Close, unionTab
fd80: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
fd90: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
fda0: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 61 73  .    default: as
fdb0: 73 65 72 74 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  sert( p->op==TK_
fdc0: 49 4e 54 45 52 53 45 43 54 20 29 3b 20 7b 0a 20  INTERSECT ); {. 
fdd0: 20 20 20 20 20 69 6e 74 20 74 61 62 31 2c 20 74       int tab1, t
fde0: 61 62 32 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  ab2;.      int i
fdf0: 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 69 53  Cont, iBreak, iS
fe00: 74 61 72 74 3b 0a 20 20 20 20 20 20 45 78 70 72  tart;.      Expr
fe10: 20 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f 66 66 73   *pLimit, *pOffs
fe20: 65 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 61 64  et;.      int ad
fe30: 64 72 3b 0a 20 20 20 20 20 20 53 65 6c 65 63 74  dr;.      Select
fe40: 44 65 73 74 20 69 6e 74 65 72 73 65 63 74 64 65  Dest intersectde
fe50: 73 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 31  st;.      int r1
fe60: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 4e 54 45  ;..      /* INTE
fe70: 52 53 45 43 54 20 69 73 20 64 69 66 66 65 72 65  RSECT is differe
fe80: 6e 74 20 66 72 6f 6d 20 74 68 65 20 6f 74 68 65  nt from the othe
fe90: 72 73 20 73 69 6e 63 65 20 69 74 20 72 65 71 75  rs since it requ
fea0: 69 72 65 73 0a 20 20 20 20 20 20 2a 2a 20 74 77  ires.      ** tw
feb0: 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  o temporary tabl
fec0: 65 73 2e 20 20 48 65 6e 63 65 20 69 74 20 68 61  es.  Hence it ha
fed0: 73 20 69 74 73 20 6f 77 6e 20 63 61 73 65 2e 20  s its own case. 
fee0: 20 42 65 67 69 6e 0a 20 20 20 20 20 20 2a 2a 20   Begin.      ** 
fef0: 62 79 20 61 6c 6c 6f 63 61 74 69 6e 67 20 74 68  by allocating th
ff00: 65 20 74 61 62 6c 65 73 20 77 65 20 77 69 6c 6c  e tables we will
ff10: 20 6e 65 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a   need..      */.
ff20: 20 20 20 20 20 20 74 61 62 31 20 3d 20 70 50 61        tab1 = pPa
ff30: 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
ff40: 20 20 20 74 61 62 32 20 3d 20 70 50 61 72 73 65     tab2 = pParse
ff50: 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20  ->nTab++;.      
ff60: 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65  assert( p->pOrde
ff70: 72 42 79 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 20  rBy==0 );..     
ff80: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
ff90: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
ffa0: 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 74  OpenEphemeral, t
ffb0: 61 62 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 61  ab1, 0);.      a
ffc0: 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f 70  ssert( p->addrOp
ffd0: 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20 2d 31 20  enEphm[0] == -1 
ffe0: 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64 64 72  );.      p->addr
fff0: 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 61 64  OpenEphm[0] = ad
10000 64 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 52 69  dr;.      p->pRi
10010 67 68 74 6d 6f 73 74 2d 3e 73 65 6c 46 6c 61 67  ghtmost->selFlag
10020 73 20 7c 3d 20 53 46 5f 55 73 65 73 45 70 68 65  s |= SF_UsesEphe
10030 6d 65 72 61 6c 3b 0a 20 20 20 20 20 20 61 73 73  meral;.      ass
10040 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29  ert( p->pEList )
10050 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65  ;..      /* Code
10060 20 74 68 65 20 53 45 4c 45 43 54 73 20 74 6f 20   the SELECTs to 
10070 6f 75 72 20 6c 65 66 74 20 69 6e 74 6f 20 74 65  our left into te
10080 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 22 74  mporary table "t
10090 61 62 31 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ab1"..      */. 
100a0 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
100b0 63 74 44 65 73 74 49 6e 69 74 28 26 69 6e 74 65  ctDestInit(&inte
100c0 72 73 65 63 74 64 65 73 74 2c 20 53 52 54 5f 55  rsectdest, SRT_U
100d0 6e 69 6f 6e 2c 20 74 61 62 31 29 3b 0a 20 20 20  nion, tab1);.   
100e0 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74     explainSetInt
100f0 65 67 65 72 28 69 53 75 62 31 2c 20 70 50 61 72  eger(iSub1, pPar
10100 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49  se->iNextSelectI
10110 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  d);.      rc = s
10120 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
10130 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 69 6e  rse, pPrior, &in
10140 74 65 72 73 65 63 74 64 65 73 74 29 3b 0a 20 20  tersectdest);.  
10150 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
10160 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69        goto multi
10170 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20  _select_end;.   
10180 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43     }..      /* C
10190 6f 64 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ode the current 
101a0 53 45 4c 45 43 54 20 69 6e 74 6f 20 74 65 6d 70  SELECT into temp
101b0 6f 72 61 72 79 20 74 61 62 6c 65 20 22 74 61 62  orary table "tab
101c0 32 22 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  2".      */.    
101d0 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
101e0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
101f0 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20  _OpenEphemeral, 
10200 74 61 62 32 2c 20 30 29 3b 0a 20 20 20 20 20 20  tab2, 0);.      
10210 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f  assert( p->addrO
10220 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 3d 20 2d 31  penEphm[1] == -1
10230 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64 64   );.      p->add
10240 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 20 61  rOpenEphm[1] = a
10250 64 64 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50  ddr;.      p->pP
10260 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  rior = 0;.      
10270 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d  pLimit = p->pLim
10280 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69  it;.      p->pLi
10290 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  mit = 0;.      p
102a0 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66  Offset = p->pOff
102b0 73 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f  set;.      p->pO
102c0 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20  ffset = 0;.     
102d0 20 69 6e 74 65 72 73 65 63 74 64 65 73 74 2e 69   intersectdest.i
102e0 53 44 50 61 72 6d 20 3d 20 74 61 62 32 3b 0a 20  SDParm = tab2;. 
102f0 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49       explainSetI
10300 6e 74 65 67 65 72 28 69 53 75 62 32 2c 20 70 50  nteger(iSub2, pP
10310 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63  arse->iNextSelec
10320 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  tId);.      rc =
10330 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
10340 50 61 72 73 65 2c 20 70 2c 20 26 69 6e 74 65 72  Parse, p, &inter
10350 73 65 63 74 64 65 73 74 29 3b 0a 20 20 20 20 20  sectdest);.     
10360 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53   testcase( rc!=S
10370 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
10380 20 20 70 44 65 6c 65 74 65 20 3d 20 70 2d 3e 70    pDelete = p->p
10390 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e  Prior;.      p->
103a0 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b  pPrior = pPrior;
103b0 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 53  .      if( p->nS
103c0 65 6c 65 63 74 52 6f 77 3e 70 50 72 69 6f 72 2d  electRow>pPrior-
103d0 3e 6e 53 65 6c 65 63 74 52 6f 77 20 29 20 70 2d  >nSelectRow ) p-
103e0 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 70 50  >nSelectRow = pP
103f0 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  rior->nSelectRow
10400 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
10410 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  xprDelete(db, p-
10420 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20  >pLimit);.      
10430 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d  p->pLimit = pLim
10440 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66  it;.      p->pOf
10450 66 73 65 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a  fset = pOffset;.
10460 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61  .      /* Genera
10470 74 65 20 63 6f 64 65 20 74 6f 20 74 61 6b 65 20  te code to take 
10480 74 68 65 20 69 6e 74 65 72 73 65 63 74 69 6f 6e  the intersection
10490 20 6f 66 20 74 68 65 20 74 77 6f 20 74 65 6d 70   of the two temp
104a0 6f 72 61 72 79 0a 20 20 20 20 20 20 2a 2a 20 74  orary.      ** t
104b0 61 62 6c 65 73 2e 0a 20 20 20 20 20 20 2a 2f 0a  ables..      */.
104c0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
104d0 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20  >pEList );.     
104e0 20 69 66 28 20 64 65 73 74 2e 65 44 65 73 74 3d   if( dest.eDest=
104f0 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20  =SRT_Output ){. 
10500 20 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70         Select *p
10510 46 69 72 73 74 20 3d 20 70 3b 0a 20 20 20 20 20  First = p;.     
10520 20 20 20 77 68 69 6c 65 28 20 70 46 69 72 73 74     while( pFirst
10530 2d 3e 70 50 72 69 6f 72 20 29 20 70 46 69 72 73  ->pPrior ) pFirs
10540 74 20 3d 20 70 46 69 72 73 74 2d 3e 70 50 72 69  t = pFirst->pPri
10550 6f 72 3b 0a 20 20 20 20 20 20 20 20 67 65 6e 65  or;.        gene
10560 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  rateColumnNames(
10570 70 50 61 72 73 65 2c 20 30 2c 20 70 46 69 72 73  pParse, 0, pFirs
10580 74 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  t->pEList);.    
10590 20 20 7d 0a 20 20 20 20 20 20 69 42 72 65 61 6b    }.      iBreak
105a0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
105b0 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
105c0 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65    iCont = sqlite
105d0 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
105e0 29 3b 0a 20 20 20 20 20 20 63 6f 6d 70 75 74 65  );.      compute
105f0 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70  LimitRegisters(p
10600 50 61 72 73 65 2c 20 70 2c 20 69 42 72 65 61 6b  Parse, p, iBreak
10610 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
10620 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
10630 5f 52 65 77 69 6e 64 2c 20 74 61 62 31 2c 20 69  _Rewind, tab1, i
10640 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 72 31  Break);.      r1
10650 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
10660 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
10670 20 20 20 20 69 53 74 61 72 74 20 3d 20 73 71 6c      iStart = sql
10680 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
10690 2c 20 4f 50 5f 52 6f 77 4b 65 79 2c 20 74 61 62  , OP_RowKey, tab
106a0 31 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71  1, r1);.      sq
106b0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
106c0 6e 74 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e  nt(v, OP_NotFoun
106d0 64 2c 20 74 61 62 32 2c 20 69 43 6f 6e 74 2c 20  d, tab2, iCont, 
106e0 72 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  r1, 0);.      sq
106f0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
10700 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
10710 0a 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e  .      selectInn
10720 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70  erLoop(pParse, p
10730 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 74 61 62  , p->pEList, tab
10740 31 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  1, p->pEList->nE
10750 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20  xpr,.           
10760 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 30 2c             0, 0,
10770 20 26 64 65 73 74 2c 20 69 43 6f 6e 74 2c 20 69   &dest, iCont, i
10780 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 73 71  Break);.      sq
10790 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
107a0 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b  Label(v, iCont);
107b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
107c0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
107d0 65 78 74 2c 20 74 61 62 31 2c 20 69 53 74 61 72  ext, tab1, iStar
107e0 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
107f0 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
10800 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20  l(v, iBreak);.  
10810 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
10820 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73  ddOp2(v, OP_Clos
10830 65 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20 20 20  e, tab2, 0);.   
10840 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
10850 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  dOp2(v, OP_Close
10860 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20 20 20 20  , tab1, 0);.    
10870 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
10880 20 7d 0a 0a 20 20 65 78 70 6c 61 69 6e 43 6f 6d   }..  explainCom
10890 70 6f 73 69 74 65 28 70 50 61 72 73 65 2c 20 70  posite(pParse, p
108a0 2d 3e 6f 70 2c 20 69 53 75 62 31 2c 20 69 53 75  ->op, iSub1, iSu
108b0 62 32 2c 20 70 2d 3e 6f 70 21 3d 54 4b 5f 41 4c  b2, p->op!=TK_AL
108c0 4c 29 3b 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74  L);..  /* Comput
108d0 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
108e0 65 6e 63 65 73 20 75 73 65 64 20 62 79 20 0a 20  ences used by . 
108f0 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 74 61   ** temporary ta
10900 62 6c 65 73 20 6e 65 65 64 65 64 20 74 6f 20 69  bles needed to i
10910 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f 6d  mplement the com
10920 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20  pound select..  
10930 2a 2a 20 41 74 74 61 63 68 20 74 68 65 20 4b 65  ** Attach the Ke
10940 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  yInfo structure 
10950 74 6f 20 61 6c 6c 20 74 65 6d 70 6f 72 61 72 79  to all temporary
10960 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20   tables..  **.  
10970 2a 2a 20 54 68 69 73 20 73 65 63 74 69 6f 6e 20  ** This section 
10980 69 73 20 72 75 6e 20 62 79 20 74 68 65 20 72 69  is run by the ri
10990 67 68 74 2d 6d 6f 73 74 20 53 45 4c 45 43 54 20  ght-most SELECT 
109a0 73 74 61 74 65 6d 65 6e 74 20 6f 6e 6c 79 2e 0a  statement only..
109b0 20 20 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74    ** SELECT stat
109c0 65 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 6c 65  ements to the le
109d0 66 74 20 61 6c 77 61 79 73 20 73 6b 69 70 20 74  ft always skip t
109e0 68 69 73 20 70 61 72 74 2e 20 20 54 68 65 20 72  his part.  The r
109f0 69 67 68 74 2d 6d 6f 73 74 0a 20 20 2a 2a 20 53  ight-most.  ** S
10a00 45 4c 45 43 54 20 6d 69 67 68 74 20 61 6c 73 6f  ELECT might also
10a10 20 73 6b 69 70 20 74 68 69 73 20 70 61 72 74 20   skip this part 
10a20 69 66 20 69 74 20 68 61 73 20 6e 6f 20 4f 52 44  if it has no ORD
10a30 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 6e 64  ER BY clause and
10a40 0a 20 20 2a 2a 20 6e 6f 20 74 65 6d 70 20 74 61  .  ** no temp ta
10a50 62 6c 65 73 20 61 72 65 20 72 65 71 75 69 72 65  bles are require
10a60 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  d..  */.  if( p-
10a70 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 55  >selFlags & SF_U
10a80 73 65 73 45 70 68 65 6d 65 72 61 6c 20 29 7b 0a  sesEphemeral ){.
10a90 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20      int i;      
10aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ab0 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
10ac0 72 20 2a 2f 0a 20 20 20 20 4b 65 79 49 6e 66 6f  r */.    KeyInfo
10ad0 20 2a 70 4b 65 79 49 6e 66 6f 3b 20 20 20 20 20   *pKeyInfo;     
10ae0 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74         /* Collat
10af0 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72  ing sequence for
10b00 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
10b10 2a 2f 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70  */.    Select *p
10b20 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  Loop;           
10b30 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70       /* For loop
10b40 69 6e 67 20 74 68 72 6f 75 67 68 20 53 45 4c 45  ing through SELE
10b50 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f  CT statements */
10b60 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 2a 61  .    CollSeq **a
10b70 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  pColl;          
10b80 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e     /* For loopin
10b90 67 20 74 68 72 6f 75 67 68 20 70 4b 65 79 49 6e  g through pKeyIn
10ba0 66 6f 2d 3e 61 43 6f 6c 6c 5b 5d 20 2a 2f 0a 20  fo->aColl[] */. 
10bb0 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20     int nCol;    
10bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10bd0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f   /* Number of co
10be0 6c 75 6d 6e 73 20 69 6e 20 72 65 73 75 6c 74 20  lumns in result 
10bf0 73 65 74 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65  set */..    asse
10c00 72 74 28 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73  rt( p->pRightmos
10c10 74 3d 3d 70 20 29 3b 0a 20 20 20 20 6e 43 6f 6c  t==p );.    nCol
10c20 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45   = p->pEList->nE
10c30 78 70 72 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66  xpr;.    pKeyInf
10c40 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  o = sqlite3KeyIn
10c50 66 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e 43 6f 6c  foAlloc(db, nCol
10c60 29 3b 0a 20 20 20 20 69 66 28 20 21 70 4b 65 79  );.    if( !pKey
10c70 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 72 63  Info ){.      rc
10c80 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
10c90 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74  .      goto mult
10ca0 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
10cb0 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c    }.    for(i=0,
10cc0 20 61 70 43 6f 6c 6c 3d 70 4b 65 79 49 6e 66 6f   apColl=pKeyInfo
10cd0 2d 3e 61 43 6f 6c 6c 3b 20 69 3c 6e 43 6f 6c 3b  ->aColl; i<nCol;
10ce0 20 69 2b 2b 2c 20 61 70 43 6f 6c 6c 2b 2b 29 7b   i++, apColl++){
10cf0 0a 20 20 20 20 20 20 2a 61 70 43 6f 6c 6c 20 3d  .      *apColl =
10d00 20 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c   multiSelectColl
10d10 53 65 71 28 70 50 61 72 73 65 2c 20 70 2c 20 69  Seq(pParse, p, i
10d20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d  );.      if( 0==
10d30 2a 61 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20  *apColl ){.     
10d40 20 20 20 2a 61 70 43 6f 6c 6c 20 3d 20 64 62 2d     *apColl = db-
10d50 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20  >pDfltColl;.    
10d60 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66    }.    }..    f
10d70 6f 72 28 70 4c 6f 6f 70 3d 70 3b 20 70 4c 6f 6f  or(pLoop=p; pLoo
10d80 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e  p; pLoop=pLoop->
10d90 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 20 20 66  pPrior){.      f
10da0 6f 72 28 69 3d 30 3b 20 69 3c 32 3b 20 69 2b 2b  or(i=0; i<2; i++
10db0 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61  ){.        int a
10dc0 64 64 72 20 3d 20 70 4c 6f 6f 70 2d 3e 61 64 64  ddr = pLoop->add
10dd0 72 4f 70 65 6e 45 70 68 6d 5b 69 5d 3b 0a 20 20  rOpenEphm[i];.  
10de0 20 20 20 20 20 20 69 66 28 20 61 64 64 72 3c 30        if( addr<0
10df0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
10e00 20 49 66 20 5b 30 5d 20 69 73 20 75 6e 75 73 65   If [0] is unuse
10e10 64 20 74 68 65 6e 20 5b 31 5d 20 69 73 20 61 6c  d then [1] is al
10e20 73 6f 20 75 6e 75 73 65 64 2e 20 20 53 6f 20 77  so unused.  So w
10e30 65 20 63 61 6e 0a 20 20 20 20 20 20 20 20 20 20  e can.          
10e40 2a 2a 20 61 6c 77 61 79 73 20 73 61 66 65 6c 79  ** always safely
10e50 20 61 62 6f 72 74 20 61 73 20 73 6f 6f 6e 20 61   abort as soon a
10e60 73 20 74 68 65 20 66 69 72 73 74 20 75 6e 75 73  s the first unus
10e70 65 64 20 73 6c 6f 74 20 69 73 20 66 6f 75 6e 64  ed slot is found
10e80 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73   */.          as
10e90 73 65 72 74 28 20 70 4c 6f 6f 70 2d 3e 61 64 64  sert( pLoop->add
10ea0 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 3c 30 20 29  rOpenEphm[1]<0 )
10eb0 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
10ec0 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
10ed0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
10ee0 43 68 61 6e 67 65 50 32 28 76 2c 20 61 64 64 72  ChangeP2(v, addr
10ef0 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20  , nCol);.       
10f00 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
10f10 67 65 50 34 28 76 2c 20 61 64 64 72 2c 20 28 63  geP4(v, addr, (c
10f20 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50  har*)pKeyInfo, P
10f30 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20  4_KEYINFO);.    
10f40 20 20 20 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f      pLoop->addrO
10f50 70 65 6e 45 70 68 6d 5b 69 5d 20 3d 20 2d 31 3b  penEphm[i] = -1;
10f60 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
10f70 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
10f80 28 64 62 2c 20 70 4b 65 79 49 6e 66 6f 29 3b 0a  (db, pKeyInfo);.
10f90 20 20 7d 0a 0a 6d 75 6c 74 69 5f 73 65 6c 65 63    }..multi_selec
10fa0 74 5f 65 6e 64 3a 0a 20 20 70 44 65 73 74 2d 3e  t_end:.  pDest->
10fb0 69 53 64 73 74 20 3d 20 64 65 73 74 2e 69 53 64  iSdst = dest.iSd
10fc0 73 74 3b 0a 20 20 70 44 65 73 74 2d 3e 6e 53 64  st;.  pDest->nSd
10fd0 73 74 20 3d 20 64 65 73 74 2e 6e 53 64 73 74 3b  st = dest.nSdst;
10fe0 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
10ff0 44 65 6c 65 74 65 28 64 62 2c 20 70 44 65 6c 65  Delete(db, pDele
11000 74 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  te);.  return rc
11010 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
11020 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
11030 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 2f 2a  ND_SELECT */../*
11040 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 6f 75 74 70  .** Code an outp
11050 75 74 20 73 75 62 72 6f 75 74 69 6e 65 20 66 6f  ut subroutine fo
11060 72 20 61 20 63 6f 72 6f 75 74 69 6e 65 20 69 6d  r a coroutine im
11070 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
11080 61 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74  a.** SELECT stat
11090 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ment..**.** The 
110a0 64 61 74 61 20 74 6f 20 62 65 20 6f 75 74 70 75  data to be outpu
110b0 74 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20 69  t is contained i
110c0 6e 20 70 49 6e 2d 3e 69 53 64 73 74 2e 20 20 54  n pIn->iSdst.  T
110d0 68 65 72 65 20 61 72 65 0a 2a 2a 20 70 49 6e 2d  here are.** pIn-
110e0 3e 6e 53 64 73 74 20 63 6f 6c 75 6d 6e 73 20 74  >nSdst columns t
110f0 6f 20 62 65 20 6f 75 74 70 75 74 2e 20 20 70 44  o be output.  pD
11100 65 73 74 20 69 73 20 77 68 65 72 65 20 74 68 65  est is where the
11110 20 6f 75 74 70 75 74 20 73 68 6f 75 6c 64 0a 2a   output should.*
11120 2a 20 62 65 20 73 65 6e 74 2e 0a 2a 2a 0a 2a 2a  * be sent..**.**
11130 20 72 65 67 52 65 74 75 72 6e 20 69 73 20 74 68   regReturn is th
11140 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
11150 72 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67  register holding
11160 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 0a   the subroutine.
11170 2a 2a 20 72 65 74 75 72 6e 20 61 64 64 72 65 73  ** return addres
11180 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72 65 67 50  s..**.** If regP
11190 72 65 76 3e 30 20 74 68 65 6e 20 69 74 20 69 73  rev>0 then it is
111a0 20 74 68 65 20 66 69 72 73 74 20 72 65 67 69 73   the first regis
111b0 74 65 72 20 69 6e 20 61 20 76 65 63 74 6f 72 20  ter in a vector 
111c0 74 68 61 74 0a 2a 2a 20 72 65 63 6f 72 64 73 20  that.** records 
111d0 74 68 65 20 70 72 65 76 69 6f 75 73 20 6f 75 74  the previous out
111e0 70 75 74 2e 20 20 6d 65 6d 5b 72 65 67 50 72 65  put.  mem[regPre
111f0 76 5d 20 69 73 20 61 20 66 6c 61 67 20 74 68 61  v] is a flag tha
11200 74 20 69 73 20 66 61 6c 73 65 0a 2a 2a 20 69 66  t is false.** if
11210 20 74 68 65 72 65 20 68 61 73 20 62 65 65 6e 20   there has been 
11220 6e 6f 20 70 72 65 76 69 6f 75 73 20 6f 75 74 70  no previous outp
11230 75 74 2e 20 20 49 66 20 72 65 67 50 72 65 76 3e  ut.  If regPrev>
11240 30 20 74 68 65 6e 20 63 6f 64 65 20 69 73 0a 2a  0 then code is.*
11250 2a 20 67 65 6e 65 72 61 74 65 64 20 74 6f 20 73  * generated to s
11260 75 70 70 72 65 73 73 20 64 75 70 6c 69 63 61 74  uppress duplicat
11270 65 73 2e 20 20 70 4b 65 79 49 6e 66 6f 20 69 73  es.  pKeyInfo is
11280 20 75 73 65 64 20 66 6f 72 20 63 6f 6d 70 61 72   used for compar
11290 69 6e 67 0a 2a 2a 20 6b 65 79 73 2e 0a 2a 2a 0a  ing.** keys..**.
112a0 2a 2a 20 49 66 20 74 68 65 20 4c 49 4d 49 54 20  ** If the LIMIT 
112b0 66 6f 75 6e 64 20 69 6e 20 70 2d 3e 69 4c 69 6d  found in p->iLim
112c0 69 74 20 69 73 20 72 65 61 63 68 65 64 2c 20 6a  it is reached, j
112d0 75 6d 70 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ump immediately 
112e0 74 6f 0a 2a 2a 20 69 42 72 65 61 6b 2e 0a 2a 2f  to.** iBreak..*/
112f0 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 6e 65  .static int gene
11300 72 61 74 65 4f 75 74 70 75 74 53 75 62 72 6f 75  rateOutputSubrou
11310 74 69 6e 65 28 0a 20 20 50 61 72 73 65 20 2a 70  tine(.  Parse *p
11320 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
11330 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
11340 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  xt */.  Select *
11350 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
11360 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74  /* The SELECT st
11370 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 53 65 6c  atement */.  Sel
11380 65 63 74 44 65 73 74 20 2a 70 49 6e 2c 20 20 20  ectDest *pIn,   
11390 20 20 20 20 20 2f 2a 20 43 6f 72 6f 75 74 69 6e       /* Coroutin
113a0 65 20 73 75 70 70 6c 79 69 6e 67 20 64 61 74 61  e supplying data
113b0 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74   */.  SelectDest
113c0 20 2a 70 44 65 73 74 2c 20 20 20 20 20 20 2f 2a   *pDest,      /*
113d0 20 57 68 65 72 65 20 74 6f 20 73 65 6e 64 20 74   Where to send t
113e0 68 65 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74  he data */.  int
113f0 20 72 65 67 52 65 74 75 72 6e 2c 20 20 20 20 20   regReturn,     
11400 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 74 75       /* The retu
11410 72 6e 20 61 64 64 72 65 73 73 20 72 65 67 69 73  rn address regis
11420 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ter */.  int reg
11430 50 72 65 76 2c 20 20 20 20 20 20 20 20 20 20 20  Prev,           
11440 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 72 65 73   /* Previous res
11450 75 6c 74 20 72 65 67 69 73 74 65 72 2e 20 20 4e  ult register.  N
11460 6f 20 75 6e 69 71 75 65 6e 65 73 73 20 69 66 20  o uniqueness if 
11470 30 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a  0 */.  KeyInfo *
11480 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 2f  pKeyInfo,      /
11490 2a 20 46 6f 72 20 63 6f 6d 70 61 72 69 6e 67 20  * For comparing 
114a0 77 69 74 68 20 70 72 65 76 69 6f 75 73 20 65 6e  with previous en
114b0 74 72 79 20 2a 2f 0a 20 20 69 6e 74 20 70 34 74  try */.  int p4t
114c0 79 70 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ype,            
114d0 20 2f 2a 20 54 68 65 20 70 34 20 74 79 70 65 20   /* The p4 type 
114e0 66 6f 72 20 70 4b 65 79 49 6e 66 6f 20 2a 2f 0a  for pKeyInfo */.
114f0 20 20 69 6e 74 20 69 42 72 65 61 6b 20 20 20 20    int iBreak    
11500 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d            /* Jum
11510 70 20 68 65 72 65 20 69 66 20 77 65 20 68 69 74  p here if we hit
11520 20 74 68 65 20 4c 49 4d 49 54 20 2a 2f 0a 29 7b   the LIMIT */.){
11530 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
11540 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
11550 74 20 69 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 69  t iContinue;.  i
11560 6e 74 20 61 64 64 72 3b 0a 0a 20 20 61 64 64 72  nt addr;..  addr
11570 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
11580 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
11590 69 43 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c 69  iContinue = sqli
115a0 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
115b0 28 76 29 3b 0a 0a 20 20 2f 2a 20 53 75 70 70 72  (v);..  /* Suppr
115c0 65 73 73 20 64 75 70 6c 69 63 61 74 65 73 20 66  ess duplicates f
115d0 6f 72 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54  or UNION, EXCEPT
115e0 2c 20 61 6e 64 20 49 4e 54 45 52 53 45 43 54 20  , and INTERSECT 
115f0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 65 67 50  .  */.  if( regP
11600 72 65 76 20 29 7b 0a 20 20 20 20 69 6e 74 20 6a  rev ){.    int j
11610 31 2c 20 6a 32 3b 0a 20 20 20 20 6a 31 20 3d 20  1, j2;.    j1 = 
11620 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
11630 31 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 72  1(v, OP_IfNot, r
11640 65 67 50 72 65 76 29 3b 0a 20 20 20 20 6a 32 20  egPrev);.    j2 
11650 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
11660 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72  Op4(v, OP_Compar
11670 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 72  e, pIn->iSdst, r
11680 65 67 50 72 65 76 2b 31 2c 20 70 49 6e 2d 3e 6e  egPrev+1, pIn->n
11690 53 64 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20  Sdst,.          
116a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
116b0 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49      (char*)pKeyI
116c0 6e 66 6f 2c 20 70 34 74 79 70 65 29 3b 0a 20 20  nfo, p4type);.  
116d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
116e0 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20  Op3(v, OP_Jump, 
116f0 6a 32 2b 32 2c 20 69 43 6f 6e 74 69 6e 75 65 2c  j2+2, iContinue,
11700 20 6a 32 2b 32 29 3b 0a 20 20 20 20 73 71 6c 69   j2+2);.    sqli
11710 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
11720 76 2c 20 6a 31 29 3b 0a 20 20 20 20 73 71 6c 69  v, j1);.    sqli
11730 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
11740 20 4f 50 5f 43 6f 70 79 2c 20 70 49 6e 2d 3e 69   OP_Copy, pIn->i
11750 53 64 73 74 2c 20 72 65 67 50 72 65 76 2b 31 2c  Sdst, regPrev+1,
11760 20 70 49 6e 2d 3e 6e 53 64 73 74 2d 31 29 3b 0a   pIn->nSdst-1);.
11770 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
11780 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
11790 67 65 72 2c 20 31 2c 20 72 65 67 50 72 65 76 29  ger, 1, regPrev)
117a0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 72  ;.  }.  if( pPar
117b0 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
117c0 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20 30 3b  iled ) return 0;
117d0 0a 0a 20 20 2f 2a 20 53 75 70 70 72 65 73 73 20  ..  /* Suppress 
117e0 74 68 65 20 66 69 72 73 74 20 4f 46 46 53 45 54  the first OFFSET
117f0 20 65 6e 74 72 69 65 73 20 69 66 20 74 68 65 72   entries if ther
11800 65 20 69 73 20 61 6e 20 4f 46 46 53 45 54 20 63  e is an OFFSET c
11810 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20 63 6f 64  lause.  */.  cod
11820 65 4f 66 66 73 65 74 28 76 2c 20 70 2c 20 69 43  eOffset(v, p, iC
11830 6f 6e 74 69 6e 75 65 29 3b 0a 0a 20 20 73 77 69  ontinue);..  swi
11840 74 63 68 28 20 70 44 65 73 74 2d 3e 65 44 65 73  tch( pDest->eDes
11850 74 20 29 7b 0a 20 20 20 20 2f 2a 20 53 74 6f 72  t ){.    /* Stor
11860 65 20 74 68 65 20 72 65 73 75 6c 74 20 61 73 20  e the result as 
11870 64 61 74 61 20 75 73 69 6e 67 20 61 20 75 6e 69  data using a uni
11880 71 75 65 20 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a  que key..    */.
11890 20 20 20 20 63 61 73 65 20 53 52 54 5f 54 61 62      case SRT_Tab
118a0 6c 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54  le:.    case SRT
118b0 5f 45 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20  _EphemTab: {.   
118c0 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69     int r1 = sqli
118d0 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
118e0 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69 6e 74  arse);.      int
118f0 20 72 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r2 = sqlite3Get
11900 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
11910 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
11920 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53   pDest->eDest==S
11930 52 54 5f 54 61 62 6c 65 20 29 3b 0a 20 20 20 20  RT_Table );.    
11940 20 20 74 65 73 74 63 61 73 65 28 20 70 44 65 73    testcase( pDes
11950 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45 70  t->eDest==SRT_Ep
11960 68 65 6d 54 61 62 20 29 3b 0a 20 20 20 20 20 20  hemTab );.      
11970 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
11980 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  3(v, OP_MakeReco
11990 72 64 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20  rd, pIn->iSdst, 
119a0 70 49 6e 2d 3e 6e 53 64 73 74 2c 20 72 31 29 3b  pIn->nSdst, r1);
119b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
119c0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
119d0 65 77 52 6f 77 69 64 2c 20 70 44 65 73 74 2d 3e  ewRowid, pDest->
119e0 69 53 44 50 61 72 6d 2c 20 72 32 29 3b 0a 20 20  iSDParm, r2);.  
119f0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
11a00 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65  ddOp3(v, OP_Inse
11a10 72 74 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61  rt, pDest->iSDPa
11a20 72 6d 2c 20 72 31 2c 20 72 32 29 3b 0a 20 20 20  rm, r1, r2);.   
11a30 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
11a40 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47  angeP5(v, OPFLAG
11a50 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 20 20  _APPEND);.      
11a60 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
11a70 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 32  mpReg(pParse, r2
11a80 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
11a90 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
11aa0 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20  Parse, r1);.    
11ab0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
11ac0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
11ad0 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20  MIT_SUBQUERY.   
11ae0 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 63 72   /* If we are cr
11af0 65 61 74 69 6e 67 20 61 20 73 65 74 20 66 6f 72  eating a set for
11b00 20 61 6e 20 22 65 78 70 72 20 49 4e 20 28 53 45   an "expr IN (SE
11b10 4c 45 43 54 20 2e 2e 2e 29 22 20 63 6f 6e 73 74  LECT ...)" const
11b20 72 75 63 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65  ruct,.    ** the
11b30 6e 20 74 68 65 72 65 20 73 68 6f 75 6c 64 20 62  n there should b
11b40 65 20 61 20 73 69 6e 67 6c 65 20 69 74 65 6d 20  e a single item 
11b50 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20 57  on the stack.  W
11b60 72 69 74 65 20 74 68 69 73 0a 20 20 20 20 2a 2a  rite this.    **
11b70 20 69 74 65 6d 20 69 6e 74 6f 20 74 68 65 20 73   item into the s
11b80 65 74 20 74 61 62 6c 65 20 77 69 74 68 20 62 6f  et table with bo
11b90 67 75 73 20 64 61 74 61 2e 0a 20 20 20 20 2a 2f  gus data..    */
11ba0 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 53 65  .    case SRT_Se
11bb0 74 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  t: {.      int r
11bc0 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  1;.      assert(
11bd0 20 70 49 6e 2d 3e 6e 53 64 73 74 3d 3d 31 20 29   pIn->nSdst==1 )
11be0 3b 0a 20 20 20 20 20 20 70 44 65 73 74 2d 3e 61  ;.      pDest->a
11bf0 66 66 53 64 73 74 20 3d 20 0a 20 20 20 20 20 20  ffSdst = .      
11c00 20 20 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72     sqlite3Compar
11c10 65 41 66 66 69 6e 69 74 79 28 70 2d 3e 70 45 4c  eAffinity(p->pEL
11c20 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c  ist->a[0].pExpr,
11c30 20 70 44 65 73 74 2d 3e 61 66 66 53 64 73 74 29   pDest->affSdst)
11c40 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  ;.      r1 = sql
11c50 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
11c60 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71  Parse);.      sq
11c70 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
11c80 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
11c90 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 31 2c  , pIn->iSdst, 1,
11ca0 20 72 31 2c 20 26 70 44 65 73 74 2d 3e 61 66 66   r1, &pDest->aff
11cb0 53 64 73 74 2c 31 29 3b 0a 20 20 20 20 20 20 73  Sdst,1);.      s
11cc0 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41  qlite3ExprCacheA
11cd0 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50  ffinityChange(pP
11ce0 61 72 73 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74  arse, pIn->iSdst
11cf0 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 1);.      sqli
11d00 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
11d10 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 70   OP_IdxInsert, p
11d20 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 72  Dest->iSDParm, r
11d30 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
11d40 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
11d50 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20  pParse, r1);.   
11d60 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
11d70 0a 23 69 66 20 30 20 20 2f 2a 20 4e 65 76 65 72  .#if 0  /* Never
11d80 20 6f 63 63 75 72 73 20 6f 6e 20 61 6e 20 4f 52   occurs on an OR
11d90 44 45 52 20 42 59 20 71 75 65 72 79 20 2a 2f 0a  DER BY query */.
11da0 20 20 20 20 2f 2a 20 49 66 20 61 6e 79 20 72 6f      /* If any ro
11db0 77 20 65 78 69 73 74 20 69 6e 20 74 68 65 20 72  w exist in the r
11dc0 65 73 75 6c 74 20 73 65 74 2c 20 72 65 63 6f 72  esult set, recor
11dd0 64 20 74 68 61 74 20 66 61 63 74 20 61 6e 64 20  d that fact and 
11de0 61 62 6f 72 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  abort..    */.  
11df0 20 20 63 61 73 65 20 53 52 54 5f 45 78 69 73 74    case SRT_Exist
11e00 73 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  s: {.      sqlit
11e10 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
11e20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 70  OP_Integer, 1, p
11e30 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 29 3b 0a  Dest->iSDParm);.
11e40 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d        /* The LIM
11e50 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 74  IT clause will t
11e60 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f  erminate the loo
11e70 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20  p for us */.    
11e80 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
11e90 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49 66  endif..    /* If
11ea0 20 74 68 69 73 20 69 73 20 61 20 73 63 61 6c 61   this is a scala
11eb0 72 20 73 65 6c 65 63 74 20 74 68 61 74 20 69 73  r select that is
11ec0 20 70 61 72 74 20 6f 66 20 61 6e 20 65 78 70 72   part of an expr
11ed0 65 73 73 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20  ession, then.   
11ee0 20 2a 2a 20 73 74 6f 72 65 20 74 68 65 20 72 65   ** store the re
11ef0 73 75 6c 74 73 20 69 6e 20 74 68 65 20 61 70 70  sults in the app
11f00 72 6f 70 72 69 61 74 65 20 6d 65 6d 6f 72 79 20  ropriate memory 
11f10 63 65 6c 6c 20 61 6e 64 20 62 72 65 61 6b 20 6f  cell and break o
11f20 75 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  ut.    ** of the
11f30 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20   scan loop..    
11f40 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
11f50 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  Mem: {.      ass
11f60 65 72 74 28 20 70 49 6e 2d 3e 6e 53 64 73 74 3d  ert( pIn->nSdst=
11f70 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =1 );.      sqli
11f80 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28  te3ExprCodeMove(
11f90 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69 53 64  pParse, pIn->iSd
11fa0 73 74 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61  st, pDest->iSDPa
11fb0 72 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20 2f 2a  rm, 1);.      /*
11fc0 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73   The LIMIT claus
11fd0 65 20 77 69 6c 6c 20 6a 75 6d 70 20 6f 75 74 20  e will jump out 
11fe0 6f 66 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20  of the loop for 
11ff0 75 73 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61  us */.      brea
12000 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20  k;.    }.#endif 
12010 2f 2a 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /* #ifndef SQLIT
12020 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20  E_OMIT_SUBQUERY 
12030 2a 2f 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 72  */..    /* The r
12040 65 73 75 6c 74 73 20 61 72 65 20 73 74 6f 72 65  esults are store
12050 64 20 69 6e 20 61 20 73 65 71 75 65 6e 63 65 20  d in a sequence 
12060 6f 66 20 72 65 67 69 73 74 65 72 73 0a 20 20 20  of registers.   
12070 20 2a 2a 20 73 74 61 72 74 69 6e 67 20 61 74 20   ** starting at 
12080 70 44 65 73 74 2d 3e 69 53 64 73 74 2e 20 20 54  pDest->iSdst.  T
12090 68 65 6e 20 74 68 65 20 63 6f 2d 72 6f 75 74 69  hen the co-routi
120a0 6e 65 20 79 69 65 6c 64 73 2e 0a 20 20 20 20 2a  ne yields..    *
120b0 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 43  /.    case SRT_C
120c0 6f 72 6f 75 74 69 6e 65 3a 20 7b 0a 20 20 20 20  oroutine: {.    
120d0 20 20 69 66 28 20 70 44 65 73 74 2d 3e 69 53 64    if( pDest->iSd
120e0 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  st==0 ){.       
120f0 20 70 44 65 73 74 2d 3e 69 53 64 73 74 20 3d 20   pDest->iSdst = 
12100 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61  sqlite3GetTempRa
12110 6e 67 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d  nge(pParse, pIn-
12120 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20 20 20 20  >nSdst);.       
12130 20 70 44 65 73 74 2d 3e 6e 53 64 73 74 20 3d 20   pDest->nSdst = 
12140 70 49 6e 2d 3e 6e 53 64 73 74 3b 0a 20 20 20 20  pIn->nSdst;.    
12150 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
12160 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50  3ExprCodeMove(pP
12170 61 72 73 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74  arse, pIn->iSdst
12180 2c 20 70 44 65 73 74 2d 3e 69 53 64 73 74 2c 20  , pDest->iSdst, 
12190 70 44 65 73 74 2d 3e 6e 53 64 73 74 29 3b 0a 20  pDest->nSdst);. 
121a0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
121b0 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65  AddOp1(v, OP_Yie
121c0 6c 64 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61  ld, pDest->iSDPa
121d0 72 6d 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  rm);.      break
121e0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
121f0 49 66 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 61  If none of the a
12200 62 6f 76 65 2c 20 74 68 65 6e 20 74 68 65 20 72  bove, then the r
12210 65 73 75 6c 74 20 64 65 73 74 69 6e 61 74 69 6f  esult destinatio
12220 6e 20 6d 75 73 74 20 62 65 0a 20 20 20 20 2a 2a  n must be.    **
12230 20 53 52 54 5f 4f 75 74 70 75 74 2e 20 20 54 68   SRT_Output.  Th
12240 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 65  is routine is ne
12250 76 65 72 20 63 61 6c 6c 65 64 20 77 69 74 68 20  ver called with 
12260 61 6e 79 20 6f 74 68 65 72 0a 20 20 20 20 2a 2a  any other.    **
12270 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 6f 74 68   destination oth
12280 65 72 20 74 68 61 6e 20 74 68 65 20 6f 6e 65 73  er than the ones
12290 20 68 61 6e 64 6c 65 64 20 61 62 6f 76 65 20 6f   handled above o
122a0 72 20 53 52 54 5f 4f 75 74 70 75 74 2e 0a 20 20  r SRT_Output..  
122b0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 20    **.    ** For 
122c0 53 52 54 5f 4f 75 74 70 75 74 2c 20 72 65 73 75  SRT_Output, resu
122d0 6c 74 73 20 61 72 65 20 73 74 6f 72 65 64 20 69  lts are stored i
122e0 6e 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20  n a sequence of 
122f0 72 65 67 69 73 74 65 72 73 2e 20 20 0a 20 20 20  registers.  .   
12300 20 2a 2a 20 54 68 65 6e 20 74 68 65 20 4f 50 5f   ** Then the OP_
12310 52 65 73 75 6c 74 52 6f 77 20 6f 70 63 6f 64 65  ResultRow opcode
12320 20 69 73 20 75 73 65 64 20 74 6f 20 63 61 75 73   is used to caus
12330 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29  e sqlite3_step()
12340 20 74 6f 0a 20 20 20 20 2a 2a 20 72 65 74 75 72   to.    ** retur
12350 6e 20 74 68 65 20 6e 65 78 74 20 72 6f 77 20 6f  n the next row o
12360 66 20 72 65 73 75 6c 74 2e 0a 20 20 20 20 2a 2f  f result..    */
12370 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
12380 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 44        assert( pD
12390 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
123a0 4f 75 74 70 75 74 20 29 3b 0a 20 20 20 20 20 20  Output );.      
123b0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
123c0 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f  2(v, OP_ResultRo
123d0 77 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70  w, pIn->iSdst, p
123e0 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20  In->nSdst);.    
123f0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
12400 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  heAffinityChange
12410 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69 53  (pParse, pIn->iS
12420 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29  dst, pIn->nSdst)
12430 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
12440 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a     }.  }..  /* J
12450 75 6d 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  ump to the end o
12460 66 20 74 68 65 20 6c 6f 6f 70 20 69 66 20 74 68  f the loop if th
12470 65 20 4c 49 4d 49 54 20 69 73 20 72 65 61 63 68  e LIMIT is reach
12480 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ed..  */.  if( p
12490 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20  ->iLimit ){.    
124a0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
124b0 33 28 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c 20  3(v, OP_IfZero, 
124c0 70 2d 3e 69 4c 69 6d 69 74 2c 20 69 42 72 65 61  p->iLimit, iBrea
124d0 6b 2c 20 2d 31 29 3b 0a 20 20 7d 0a 0a 20 20 2f  k, -1);.  }..  /
124e0 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 73  * Generate the s
124f0 75 62 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  ubroutine return
12500 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  .  */.  sqlite3V
12510 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
12520 76 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20  v, iContinue);. 
12530 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12540 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c  p1(v, OP_Return,
12550 20 72 65 67 52 65 74 75 72 6e 29 3b 0a 0a 20 20   regReturn);..  
12560 72 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a  return addr;.}..
12570 2f 2a 0a 2a 2a 20 41 6c 74 65 72 6e 61 74 69 76  /*.** Alternativ
12580 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63  e compound selec
12590 74 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72  t code generator
125a0 20 66 6f 72 20 63 61 73 65 73 20 77 68 65 6e 20   for cases when 
125b0 74 68 65 72 65 0a 2a 2a 20 69 73 20 61 6e 20 4f  there.** is an O
125c0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 0a  RDER BY clause..
125d0 2a 2a 0a 2a 2a 20 57 65 20 61 73 73 75 6d 65 20  **.** We assume 
125e0 61 20 71 75 65 72 79 20 6f 66 20 74 68 65 20 66  a query of the f
125f0 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d 3a 0a 2a  ollowing form:.*
12600 2a 0a 2a 2a 20 20 20 20 20 20 3c 73 65 6c 65 63  *.**      <selec
12610 74 41 3e 20 20 3c 6f 70 65 72 61 74 6f 72 3e 20  tA>  <operator> 
12620 20 3c 73 65 6c 65 63 74 42 3e 20 20 4f 52 44 45   <selectB>  ORDE
12630 52 20 42 59 20 3c 6f 72 64 65 72 62 79 6c 69 73  R BY <orderbylis
12640 74 3e 0a 2a 2a 0a 2a 2a 20 3c 6f 70 65 72 61 74  t>.**.** <operat
12650 6f 72 3e 20 69 73 20 6f 6e 65 20 6f 66 20 55 4e  or> is one of UN
12660 49 4f 4e 20 41 4c 4c 2c 20 55 4e 49 4f 4e 2c 20  ION ALL, UNION, 
12670 45 58 43 45 50 54 2c 20 6f 72 20 49 4e 54 45 52  EXCEPT, or INTER
12680 53 45 43 54 2e 20 20 54 68 65 20 69 64 65 61 0a  SECT.  The idea.
12690 2a 2a 20 69 73 20 74 6f 20 63 6f 64 65 20 62 6f  ** is to code bo
126a0 74 68 20 3c 73 65 6c 65 63 74 41 3e 20 61 6e 64  th <selectA> and
126b0 20 3c 73 65 6c 65 63 74 42 3e 20 77 69 74 68 20   <selectB> with 
126c0 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
126d0 75 73 65 20 61 73 0a 2a 2a 20 63 6f 2d 72 6f 75  use as.** co-rou
126e0 74 69 6e 65 73 2e 20 20 54 68 65 6e 20 72 75 6e  tines.  Then run
126f0 20 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 73   the co-routines
12700 20 69 6e 20 70 61 72 61 6c 6c 65 6c 20 61 6e 64   in parallel and
12710 20 6d 65 72 67 65 20 74 68 65 20 72 65 73 75 6c   merge the resul
12720 74 73 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6f  ts.** into the o
12730 75 74 70 75 74 2e 20 20 49 6e 20 61 64 64 69 74  utput.  In addit
12740 69 6f 6e 20 74 6f 20 74 68 65 20 74 77 6f 20 63  ion to the two c
12750 6f 72 6f 75 74 69 6e 65 73 20 28 63 61 6c 6c 65  oroutines (calle
12760 64 20 73 65 6c 65 63 74 41 20 61 6e 64 0a 2a 2a  d selectA and.**
12770 20 73 65 6c 65 63 74 42 29 20 74 68 65 72 65 20   selectB) there 
12780 61 72 65 20 37 20 73 75 62 72 6f 75 74 69 6e 65  are 7 subroutine
12790 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 75 74 41  s:.**.**    outA
127a0 3a 20 20 20 20 4d 6f 76 65 20 74 68 65 20 6f 75  :    Move the ou
127b0 74 70 75 74 20 6f 66 20 74 68 65 20 73 65 6c 65  tput of the sele
127c0 63 74 41 20 63 6f 72 6f 75 74 69 6e 65 20 69 6e  ctA coroutine in
127d0 74 6f 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a  to the output.**
127e0 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 20               of 
127f0 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65  the compound que
12800 72 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 75 74  ry..**.**    out
12810 42 3a 20 20 20 20 4d 6f 76 65 20 74 68 65 20 6f  B:    Move the o
12820 75 74 70 75 74 20 6f 66 20 74 68 65 20 73 65 6c  utput of the sel
12830 65 63 74 42 20 63 6f 72 6f 75 74 69 6e 65 20 69  ectB coroutine i
12840 6e 74 6f 20 74 68 65 20 6f 75 74 70 75 74 0a 2a  nto the output.*
12850 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 66  *             of
12860 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75   the compound qu
12870 65 72 79 2e 20 20 28 4f 6e 6c 79 20 67 65 6e 65  ery.  (Only gene
12880 72 61 74 65 64 20 66 6f 72 20 55 4e 49 4f 4e 20  rated for UNION 
12890 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  and.**          
128a0 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 2e 20 20 45     UNION ALL.  E
128b0 58 43 45 50 54 20 61 6e 64 20 49 4e 53 45 52 54  XCEPT and INSERT
128c0 53 45 43 54 20 6e 65 76 65 72 20 6f 75 74 70 75  SECT never outpu
128d0 74 20 61 20 72 6f 77 20 74 68 61 74 0a 2a 2a 20  t a row that.** 
128e0 20 20 20 20 20 20 20 20 20 20 20 20 61 70 70 65              appe
128f0 61 72 73 20 6f 6e 6c 79 20 69 6e 20 42 2e 29 0a  ars only in B.).
12900 2a 2a 0a 2a 2a 20 20 20 20 41 6c 74 42 3a 20 20  **.**    AltB:  
12910 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 74 68    Called when th
12920 65 72 65 20 69 73 20 64 61 74 61 20 66 72 6f 6d  ere is data from
12930 20 62 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65 73   both coroutines
12940 20 61 6e 64 20 41 3c 42 2e 0a 2a 2a 0a 2a 2a 20   and A<B..**.** 
12950 20 20 20 41 65 71 42 3a 20 20 20 20 43 61 6c 6c     AeqB:    Call
12960 65 64 20 77 68 65 6e 20 74 68 65 72 65 20 69 73  ed when there is
12970 20 64 61 74 61 20 66 72 6f 6d 20 62 6f 74 68 20   data from both 
12980 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 41  coroutines and A
12990 3d 3d 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 67  ==B..**.**    Ag
129a0 74 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68  tB:    Called wh
129b0 65 6e 20 74 68 65 72 65 20 69 73 20 64 61 74 61  en there is data
129c0 20 66 72 6f 6d 20 62 6f 74 68 20 63 6f 72 6f 75   from both corou
129d0 74 69 6e 65 73 20 61 6e 64 20 41 3e 42 2e 0a 2a  tines and A>B..*
129e0 2a 0a 2a 2a 20 20 20 20 45 6f 66 41 3a 20 20 20  *.**    EofA:   
129f0 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 64 61 74   Called when dat
12a00 61 20 69 73 20 65 78 68 61 75 73 74 65 64 20 66  a is exhausted f
12a10 72 6f 6d 20 73 65 6c 65 63 74 41 2e 0a 2a 2a 0a  rom selectA..**.
12a20 2a 2a 20 20 20 20 45 6f 66 42 3a 20 20 20 20 43  **    EofB:    C
12a30 61 6c 6c 65 64 20 77 68 65 6e 20 64 61 74 61 20  alled when data 
12a40 69 73 20 65 78 68 61 75 73 74 65 64 20 66 72 6f  is exhausted fro
12a50 6d 20 73 65 6c 65 63 74 42 2e 0a 2a 2a 0a 2a 2a  m selectB..**.**
12a60 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   The implementat
12a70 69 6f 6e 20 6f 66 20 74 68 65 20 6c 61 74 74 65  ion of the latte
12a80 72 20 66 69 76 65 20 73 75 62 72 6f 75 74 69 6e  r five subroutin
12a90 65 73 20 64 65 70 65 6e 64 20 6f 6e 20 77 68 69  es depend on whi
12aa0 63 68 20 0a 2a 2a 20 3c 6f 70 65 72 61 74 6f 72  ch .** <operator
12ab0 3e 20 69 73 20 75 73 65 64 3a 0a 2a 2a 0a 2a 2a  > is used:.**.**
12ac0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
12ad0 55 4e 49 4f 4e 20 41 4c 4c 20 20 20 20 20 20 20  UNION ALL       
12ae0 20 20 55 4e 49 4f 4e 20 20 20 20 20 20 20 20 20    UNION         
12af0 20 20 20 45 58 43 45 50 54 20 20 20 20 20 20 20     EXCEPT       
12b00 20 20 20 49 4e 54 45 52 53 45 43 54 0a 2a 2a 20     INTERSECT.** 
12b10 20 20 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d           -------
12b20 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d  ------  --------
12b30 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d  ---------  -----
12b40 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d  ---------  -----
12b50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20  ------------.** 
12b60 20 20 41 6c 74 42 3a 20 20 20 6f 75 74 41 2c 20    AltB:   outA, 
12b70 6e 65 78 74 41 20 20 20 20 20 20 6f 75 74 41 2c  nextA      outA,
12b80 20 6e 65 78 74 41 20 20 20 20 20 20 20 6f 75 74   nextA       out
12b90 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20 20  A, nextA        
12ba0 20 6e 65 78 74 41 0a 2a 2a 0a 2a 2a 20 20 20 41   nextA.**.**   A
12bb0 65 71 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65 78  eqB:   outA, nex
12bc0 74 41 20 20 20 20 20 20 20 20 20 6e 65 78 74 41  tA         nextA
12bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 78               nex
12be0 74 41 20 20 20 20 20 20 20 20 20 6f 75 74 41 2c  tA         outA,
12bf0 20 6e 65 78 74 41 0a 2a 2a 0a 2a 2a 20 20 20 41   nextA.**.**   A
12c00 67 74 42 3a 20 20 20 6f 75 74 42 2c 20 6e 65 78  gtB:   outB, nex
12c10 74 42 20 20 20 20 20 20 6f 75 74 42 2c 20 6e 65  tB      outB, ne
12c20 78 74 42 20 20 20 20 20 20 20 20 20 20 6e 65 78  xtB          nex
12c30 74 42 20 20 20 20 20 20 20 20 20 20 20 20 6e 65  tB            ne
12c40 78 74 42 0a 2a 2a 0a 2a 2a 20 20 20 45 6f 66 41  xtB.**.**   EofA
12c50 3a 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20  :   outB, nextB 
12c60 20 20 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42       outB, nextB
12c70 20 20 20 20 20 20 20 20 20 20 68 61 6c 74 20 20            halt  
12c80 20 20 20 20 20 20 20 20 20 20 20 68 61 6c 74 0a             halt.
12c90 2a 2a 0a 2a 2a 20 20 20 45 6f 66 42 3a 20 20 20  **.**   EofB:   
12ca0 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20  outA, nextA     
12cb0 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20   outA, nextA    
12cc0 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20     outA, nextA  
12cd0 20 20 20 20 20 20 20 68 61 6c 74 0a 2a 2a 0a 2a         halt.**.*
12ce0 2a 20 49 6e 20 74 68 65 20 41 6c 74 42 2c 20 41  * In the AltB, A
12cf0 65 71 42 2c 20 61 6e 64 20 41 67 74 42 20 73 75  eqB, and AgtB su
12d00 62 72 6f 75 74 69 6e 65 73 2c 20 61 6e 20 45 4f  broutines, an EO
12d10 46 20 6f 6e 20 41 20 66 6f 6c 6c 6f 77 69 6e 67  F on A following
12d20 20 6e 65 78 74 41 0a 2a 2a 20 63 61 75 73 65 73   nextA.** causes
12d30 20 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 6a 75   an immediate ju
12d40 6d 70 20 74 6f 20 45 6f 66 41 20 61 6e 64 20 61  mp to EofA and a
12d50 6e 20 45 4f 46 20 6f 6e 20 42 20 66 6f 6c 6c 6f  n EOF on B follo
12d60 77 69 6e 67 20 6e 65 78 74 42 20 63 61 75 73 65  wing nextB cause
12d70 73 0a 2a 2a 20 61 6e 20 69 6d 6d 65 64 69 61 74  s.** an immediat
12d80 65 20 6a 75 6d 70 20 74 6f 20 45 6f 66 42 2e 20  e jump to EofB. 
12d90 20 57 69 74 68 69 6e 20 45 6f 66 41 20 61 6e 64   Within EofA and
12da0 20 45 6f 66 42 2c 20 61 6e 64 20 45 4f 46 20 6f   EofB, and EOF o
12db0 6e 20 65 6e 74 72 79 20 6f 72 0a 2a 2a 20 66 6f  n entry or.** fo
12dc0 6c 6c 6f 77 69 6e 67 20 6e 65 78 74 58 20 63 61  llowing nextX ca
12dd0 75 73 65 73 20 61 20 6a 75 6d 70 20 74 6f 20 74  uses a jump to t
12de0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 73 65  he end of the se
12df0 6c 65 63 74 20 70 72 6f 63 65 73 73 69 6e 67 2e  lect processing.
12e00 0a 2a 2a 0a 2a 2a 20 44 75 70 6c 69 63 61 74 65  .**.** Duplicate
12e10 20 72 65 6d 6f 76 61 6c 20 69 6e 20 74 68 65 20   removal in the 
12e20 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20 61  UNION, EXCEPT, a
12e30 6e 64 20 49 4e 54 45 52 53 45 43 54 20 63 61 73  nd INTERSECT cas
12e40 65 73 20 69 73 20 68 61 6e 64 6c 65 64 0a 2a 2a  es is handled.**
12e50 20 77 69 74 68 69 6e 20 74 68 65 20 6f 75 74 70   within the outp
12e60 75 74 20 73 75 62 72 6f 75 74 69 6e 65 2e 20 20  ut subroutine.  
12e70 54 68 65 20 72 65 67 50 72 65 76 20 72 65 67 69  The regPrev regi
12e80 73 74 65 72 20 73 65 74 20 68 6f 6c 64 73 20 74  ster set holds t
12e90 68 65 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a  he previously.**
12ea0 20 6f 75 74 70 75 74 20 76 61 6c 75 65 2e 20 20   output value.  
12eb0 41 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20  A comparison is 
12ec0 6d 61 64 65 20 61 67 61 69 6e 73 74 20 74 68 69  made against thi
12ed0 73 20 76 61 6c 75 65 20 61 6e 64 20 74 68 65 20  s value and the 
12ee0 6f 75 74 70 75 74 0a 2a 2a 20 69 73 20 73 6b 69  output.** is ski
12ef0 70 70 65 64 20 69 66 20 74 68 65 20 6e 65 78 74  pped if the next
12f00 20 72 65 73 75 6c 74 73 20 77 6f 75 6c 64 20 62   results would b
12f10 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68  e the same as th
12f20 65 20 70 72 65 76 69 6f 75 73 2e 0a 2a 2a 0a 2a  e previous..**.*
12f30 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  * The implementa
12f40 74 69 6f 6e 20 70 6c 61 6e 20 69 73 20 74 6f 20  tion plan is to 
12f50 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 74 77  implement the tw
12f60 6f 20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64  o coroutines and
12f70 20 73 65 76 65 6e 0a 2a 2a 20 73 75 62 72 6f 75   seven.** subrou
12f80 74 69 6e 65 73 20 66 69 72 73 74 2c 20 74 68 65  tines first, the
12f90 6e 20 70 75 74 20 74 68 65 20 63 6f 6e 74 72 6f  n put the contro
12fa0 6c 20 6c 6f 67 69 63 20 61 74 20 74 68 65 20 62  l logic at the b
12fb0 6f 74 74 6f 6d 2e 20 20 4c 69 6b 65 20 74 68 69  ottom.  Like thi
12fc0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  s:.**.**        
12fd0 20 20 67 6f 74 6f 20 49 6e 69 74 0a 2a 2a 20 20    goto Init.**  
12fe0 20 20 20 63 6f 41 3a 20 63 6f 72 6f 75 74 69 6e     coA: coroutin
12ff0 65 20 66 6f 72 20 6c 65 66 74 20 71 75 65 72 79  e for left query
13000 20 28 41 29 0a 2a 2a 20 20 20 20 20 63 6f 42 3a   (A).**     coB:
13010 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20 72   coroutine for r
13020 69 67 68 74 20 71 75 65 72 79 20 28 42 29 0a 2a  ight query (B).*
13030 2a 20 20 20 20 6f 75 74 41 3a 20 6f 75 74 70 75  *    outA: outpu
13040 74 20 6f 6e 65 20 72 6f 77 20 6f 66 20 41 0a 2a  t one row of A.*
13050 2a 20 20 20 20 6f 75 74 42 3a 20 6f 75 74 70 75  *    outB: outpu
13060 74 20 6f 6e 65 20 72 6f 77 20 6f 66 20 42 20 28  t one row of B (
13070 55 4e 49 4f 4e 20 61 6e 64 20 55 4e 49 4f 4e 20  UNION and UNION 
13080 41 4c 4c 20 6f 6e 6c 79 29 0a 2a 2a 20 20 20 20  ALL only).**    
13090 45 6f 66 41 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20  EofA: ....**    
130a0 45 6f 66 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20  EofB: ....**    
130b0 41 6c 74 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20  AltB: ....**    
130c0 41 65 71 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20  AeqB: ....**    
130d0 41 67 74 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20  AgtB: ....**    
130e0 49 6e 69 74 3a 20 69 6e 69 74 69 61 6c 69 7a 65  Init: initialize
130f0 20 63 6f 72 6f 75 74 69 6e 65 20 72 65 67 69 73   coroutine regis
13100 74 65 72 73 0a 2a 2a 20 20 20 20 20 20 20 20 20  ters.**         
13110 20 79 69 65 6c 64 20 63 6f 41 0a 2a 2a 20 20 20   yield coA.**   
13120 20 20 20 20 20 20 20 69 66 20 65 6f 66 28 41 29         if eof(A)
13130 20 67 6f 74 6f 20 45 6f 66 41 0a 2a 2a 20 20 20   goto EofA.**   
13140 20 20 20 20 20 20 20 79 69 65 6c 64 20 63 6f 42         yield coB
13150 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 69 66 20  .**          if 
13160 65 6f 66 28 42 29 20 67 6f 74 6f 20 45 6f 66 42  eof(B) goto EofB
13170 0a 2a 2a 20 20 20 20 43 6d 70 72 3a 20 43 6f 6d  .**    Cmpr: Com
13180 70 61 72 65 20 41 2c 20 42 0a 2a 2a 20 20 20 20  pare A, B.**    
13190 20 20 20 20 20 20 4a 75 6d 70 20 41 6c 74 42 2c        Jump AltB,
131a0 20 41 65 71 42 2c 20 41 67 74 42 0a 2a 2a 20 20   AeqB, AgtB.**  
131b0 20 20 20 45 6e 64 3a 20 2e 2e 2e 0a 2a 2a 0a 2a     End: ....**.*
131c0 2a 20 57 65 20 63 61 6c 6c 20 41 6c 74 42 2c 20  * We call AltB, 
131d0 41 65 71 42 2c 20 41 67 74 42 2c 20 45 6f 66 41  AeqB, AgtB, EofA
131e0 2c 20 61 6e 64 20 45 6f 66 42 20 22 73 75 62 72  , and EofB "subr
131f0 6f 75 74 69 6e 65 73 22 20 62 75 74 20 74 68 65  outines" but the
13200 79 20 61 72 65 20 6e 6f 74 0a 2a 2a 20 61 63 74  y are not.** act
13210 75 61 6c 6c 79 20 63 61 6c 6c 65 64 20 75 73 69  ually called usi
13220 6e 67 20 47 6f 73 75 62 20 61 6e 64 20 74 68 65  ng Gosub and the
13230 79 20 64 6f 20 6e 6f 74 20 52 65 74 75 72 6e 2e  y do not Return.
13240 20 20 45 6f 66 41 20 61 6e 64 20 45 6f 66 42 20    EofA and EofB 
13250 6c 6f 6f 70 0a 2a 2a 20 75 6e 74 69 6c 20 61 6c  loop.** until al
13260 6c 20 64 61 74 61 20 69 73 20 65 78 68 61 75 73  l data is exhaus
13270 74 65 64 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f  ted then jump to
13280 20 74 68 65 20 22 65 6e 64 22 20 6c 61 62 65 2e   the "end" labe.
13290 20 20 41 6c 74 42 2c 20 41 65 71 42 2c 0a 2a 2a    AltB, AeqB,.**
132a0 20 61 6e 64 20 41 67 74 42 20 6a 75 6d 70 20 74   and AgtB jump t
132b0 6f 20 65 69 74 68 65 72 20 4c 32 20 6f 72 20 74  o either L2 or t
132c0 6f 20 6f 6e 65 20 6f 66 20 45 6f 66 41 20 6f 72  o one of EofA or
132d0 20 45 6f 66 42 2e 0a 2a 2f 0a 23 69 66 6e 64 65   EofB..*/.#ifnde
132e0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  f SQLITE_OMIT_CO
132f0 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 73 74  MPOUND_SELECT.st
13300 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65  atic int multiSe
13310 6c 65 63 74 4f 72 64 65 72 42 79 28 0a 20 20 50  lectOrderBy(.  P
13320 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
13330 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
13340 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
13350 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
13360 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d     /* The right-
13370 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43 54 73 20  most of SELECTs 
13380 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20  to be coded */. 
13390 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65   SelectDest *pDe
133a0 73 74 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74  st     /* What t
133b0 6f 20 64 6f 20 77 69 74 68 20 71 75 65 72 79 20  o do with query 
133c0 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20  results */.){.  
133d0 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20  int i, j;       
133e0 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
133f0 75 6e 74 65 72 73 20 2a 2f 0a 20 20 53 65 6c 65  unters */.  Sele
13400 63 74 20 2a 70 50 72 69 6f 72 3b 20 20 20 20 20  ct *pPrior;     
13410 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20 53 45 4c    /* Another SEL
13420 45 43 54 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ECT immediately 
13430 74 6f 20 6f 75 72 20 6c 65 66 74 20 2a 2f 0a 20  to our left */. 
13440 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20   Vdbe *v;       
13450 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61         /* Genera
13460 74 65 20 63 6f 64 65 20 74 6f 20 74 68 69 73 20  te code to this 
13470 56 44 42 45 20 2a 2f 0a 20 20 53 65 6c 65 63 74  VDBE */.  Select
13480 44 65 73 74 20 64 65 73 74 41 3b 20 20 20 20 20  Dest destA;     
13490 2f 2a 20 44 65 73 74 69 6e 61 74 69 6f 6e 20 66  /* Destination f
134a0 6f 72 20 63 6f 72 6f 75 74 69 6e 65 20 41 20 2a  or coroutine A *
134b0 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 64  /.  SelectDest d
134c0 65 73 74 42 3b 20 20 20 20 20 2f 2a 20 44 65 73  estB;     /* Des
134d0 74 69 6e 61 74 69 6f 6e 20 66 6f 72 20 63 6f 72  tination for cor
134e0 6f 75 74 69 6e 65 20 42 20 2a 2f 0a 20 20 69 6e  outine B */.  in
134f0 74 20 72 65 67 41 64 64 72 41 3b 20 20 20 20 20  t regAddrA;     
13500 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 72      /* Address r
13510 65 67 69 73 74 65 72 20 66 6f 72 20 73 65 6c 65  egister for sele
13520 63 74 2d 41 20 63 6f 72 6f 75 74 69 6e 65 20 2a  ct-A coroutine *
13530 2f 0a 20 20 69 6e 74 20 72 65 67 45 6f 66 41 3b  /.  int regEofA;
13540 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
13550 67 20 74 6f 20 69 6e 64 69 63 61 74 65 20 77 68  g to indicate wh
13560 65 6e 20 73 65 6c 65 63 74 2d 41 20 69 73 20 63  en select-A is c
13570 6f 6d 70 6c 65 74 65 20 2a 2f 0a 20 20 69 6e 74  omplete */.  int
13580 20 72 65 67 41 64 64 72 42 3b 20 20 20 20 20 20   regAddrB;      
13590 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65     /* Address re
135a0 67 69 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63  gister for selec
135b0 74 2d 42 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f  t-B coroutine */
135c0 0a 20 20 69 6e 74 20 72 65 67 45 6f 66 42 3b 20  .  int regEofB; 
135d0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67           /* Flag
135e0 20 74 6f 20 69 6e 64 69 63 61 74 65 20 77 68 65   to indicate whe
135f0 6e 20 73 65 6c 65 63 74 2d 42 20 69 73 20 63 6f  n select-B is co
13600 6d 70 6c 65 74 65 20 2a 2f 0a 20 20 69 6e 74 20  mplete */.  int 
13610 61 64 64 72 53 65 6c 65 63 74 41 3b 20 20 20 20  addrSelectA;    
13620 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
13630 74 68 65 20 73 65 6c 65 63 74 2d 41 20 63 6f 72  the select-A cor
13640 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
13650 61 64 64 72 53 65 6c 65 63 74 42 3b 20 20 20 20  addrSelectB;    
13660 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
13670 74 68 65 20 73 65 6c 65 63 74 2d 42 20 63 6f 72  the select-B cor
13680 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
13690 72 65 67 4f 75 74 41 3b 20 20 20 20 20 20 20 20  regOutA;        
136a0 20 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67    /* Address reg
136b0 69 73 74 65 72 20 66 6f 72 20 74 68 65 20 6f 75  ister for the ou
136c0 74 70 75 74 2d 41 20 73 75 62 72 6f 75 74 69 6e  tput-A subroutin
136d0 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75  e */.  int regOu
136e0 74 42 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  tB;          /* 
136f0 41 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72  Address register
13700 20 66 6f 72 20 74 68 65 20 6f 75 74 70 75 74 2d   for the output-
13710 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  B subroutine */.
13720 20 20 69 6e 74 20 61 64 64 72 4f 75 74 41 3b 20    int addrOutA; 
13730 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
13740 73 73 20 6f 66 20 74 68 65 20 6f 75 74 70 75 74  ss of the output
13750 2d 41 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f  -A subroutine */
13760 0a 20 20 69 6e 74 20 61 64 64 72 4f 75 74 42 20  .  int addrOutB 
13770 3d 20 30 3b 20 20 20 20 20 2f 2a 20 41 64 64 72  = 0;     /* Addr
13780 65 73 73 20 6f 66 20 74 68 65 20 6f 75 74 70 75  ess of the outpu
13790 74 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  t-B subroutine *
137a0 2f 0a 20 20 69 6e 74 20 61 64 64 72 45 6f 66 41  /.  int addrEofA
137b0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64  ;         /* Add
137c0 72 65 73 73 20 6f 66 20 74 68 65 20 73 65 6c 65  ress of the sele
137d0 63 74 2d 41 2d 65 78 68 61 75 73 74 65 64 20 73  ct-A-exhausted s
137e0 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  ubroutine */.  i
137f0 6e 74 20 61 64 64 72 45 6f 66 42 3b 20 20 20 20  nt addrEofB;    
13800 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
13810 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d 42 2d  of the select-B-
13820 65 78 68 61 75 73 74 65 64 20 73 75 62 72 6f 75  exhausted subrou
13830 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tine */.  int ad
13840 64 72 41 6c 74 42 3b 20 20 20 20 20 20 20 20 20  drAltB;         
13850 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
13860 65 20 41 3c 42 20 73 75 62 72 6f 75 74 69 6e 65  e A<B subroutine
13870 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 41 65   */.  int addrAe
13880 71 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41  qB;         /* A
13890 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 41 3d  ddress of the A=
138a0 3d 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f  =B subroutine */
138b0 0a 20 20 69 6e 74 20 61 64 64 72 41 67 74 42 3b  .  int addrAgtB;
138c0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
138d0 65 73 73 20 6f 66 20 74 68 65 20 41 3e 42 20 73  ess of the A>B s
138e0 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  ubroutine */.  i
138f0 6e 74 20 72 65 67 4c 69 6d 69 74 41 3b 20 20 20  nt regLimitA;   
13900 20 20 20 20 20 2f 2a 20 4c 69 6d 69 74 20 72 65       /* Limit re
13910 67 69 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63  gister for selec
13920 74 2d 41 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  t-A */.  int reg
13930 4c 69 6d 69 74 42 3b 20 20 20 20 20 20 20 20 2f  LimitB;        /
13940 2a 20 4c 69 6d 69 74 20 72 65 67 69 73 74 65 72  * Limit register
13950 20 66 6f 72 20 73 65 6c 65 63 74 2d 41 20 2a 2f   for select-A */
13960 0a 20 20 69 6e 74 20 72 65 67 50 72 65 76 3b 20  .  int regPrev; 
13970 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 72 61           /* A ra
13980 6e 67 65 20 6f 66 20 72 65 67 69 73 74 65 72 73  nge of registers
13990 20 74 6f 20 68 6f 6c 64 20 70 72 65 76 69 6f 75   to hold previou
139a0 73 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 69 6e  s output */.  in
139b0 74 20 73 61 76 65 64 4c 69 6d 69 74 3b 20 20 20  t savedLimit;   
139c0 20 20 20 20 2f 2a 20 53 61 76 65 64 20 76 61 6c      /* Saved val
139d0 75 65 20 6f 66 20 70 2d 3e 69 4c 69 6d 69 74 20  ue of p->iLimit 
139e0 2a 2f 0a 20 20 69 6e 74 20 73 61 76 65 64 4f 66  */.  int savedOf
139f0 66 73 65 74 3b 20 20 20 20 20 20 2f 2a 20 53 61  fset;      /* Sa
13a00 76 65 64 20 76 61 6c 75 65 20 6f 66 20 70 2d 3e  ved value of p->
13a10 69 4f 66 66 73 65 74 20 2a 2f 0a 20 20 69 6e 74  iOffset */.  int
13a20 20 6c 61 62 65 6c 43 6d 70 72 3b 20 20 20 20 20   labelCmpr;     
13a30 20 20 20 2f 2a 20 4c 61 62 65 6c 20 66 6f 72 20     /* Label for 
13a40 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
13a50 20 6d 65 72 67 65 20 61 6c 67 6f 72 69 74 68 6d   merge algorithm
13a60 20 2a 2f 0a 20 20 69 6e 74 20 6c 61 62 65 6c 45   */.  int labelE
13a70 6e 64 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4c  nd;         /* L
13a80 61 62 65 6c 20 66 6f 72 20 74 68 65 20 65 6e 64  abel for the end
13a90 20 6f 66 20 74 68 65 20 6f 76 65 72 61 6c 6c 20   of the overall 
13aa0 53 45 4c 45 43 54 20 73 74 6d 74 20 2a 2f 0a 20  SELECT stmt */. 
13ab0 20 69 6e 74 20 6a 31 3b 20 20 20 20 20 20 20 20   int j1;        
13ac0 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 69         /* Jump i
13ad0 6e 73 74 72 75 63 74 69 6f 6e 73 20 74 68 61 74  nstructions that
13ae0 20 67 65 74 20 72 65 74 61 72 67 65 74 74 65 64   get retargetted
13af0 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20   */.  int op;   
13b00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
13b10 6e 65 20 6f 66 20 54 4b 5f 41 4c 4c 2c 20 54 4b  ne of TK_ALL, TK
13b20 5f 55 4e 49 4f 4e 2c 20 54 4b 5f 45 58 43 45 50  _UNION, TK_EXCEP
13b30 54 2c 20 54 4b 5f 49 4e 54 45 52 53 45 43 54 20  T, TK_INTERSECT 
13b40 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  */.  KeyInfo *pK
13b50 65 79 44 75 70 20 3d 20 30 3b 20 2f 2a 20 43 6f  eyDup = 0; /* Co
13b60 6d 70 61 72 69 73 6f 6e 20 69 6e 66 6f 72 6d 61  mparison informa
13b70 74 69 6f 6e 20 66 6f 72 20 64 75 70 6c 69 63 61  tion for duplica
13b80 74 65 20 72 65 6d 6f 76 61 6c 20 2a 2f 0a 20 20  te removal */.  
13b90 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 4d 65 72  KeyInfo *pKeyMer
13ba0 67 65 3b 20 20 20 2f 2a 20 43 6f 6d 70 61 72 69  ge;   /* Compari
13bb0 73 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  son information 
13bc0 66 6f 72 20 6d 65 72 67 69 6e 67 20 72 6f 77 73  for merging rows
13bd0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
13be0 62 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  b;          /* D
13bf0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
13c00 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  on */.  ExprList
13c10 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 20 2f 2a   *pOrderBy;   /*
13c20 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   The ORDER BY cl
13c30 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f  ause */.  int nO
13c40 72 64 65 72 42 79 3b 20 20 20 20 20 20 20 20 20  rderBy;         
13c50 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65 72  /* Number of ter
13c60 6d 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20  ms in the ORDER 
13c70 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69  BY clause */.  i
13c80 6e 74 20 2a 61 50 65 72 6d 75 74 65 3b 20 20 20  nt *aPermute;   
13c90 20 20 20 20 20 2f 2a 20 4d 61 70 70 69 6e 67 20       /* Mapping 
13ca0 66 72 6f 6d 20 4f 52 44 45 52 20 42 59 20 74 65  from ORDER BY te
13cb0 72 6d 73 20 74 6f 20 72 65 73 75 6c 74 20 73 65  rms to result se
13cc0 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 23 69 66  t columns */.#if
13cd0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
13ce0 5f 45 58 50 4c 41 49 4e 0a 20 20 69 6e 74 20 69  _EXPLAIN.  int i
13cf0 53 75 62 31 3b 20 20 20 20 20 20 20 20 20 20 20  Sub1;           
13d00 20 2f 2a 20 45 51 50 20 69 64 20 6f 66 20 6c 65   /* EQP id of le
13d10 66 74 2d 68 61 6e 64 20 71 75 65 72 79 20 2a 2f  ft-hand query */
13d20 0a 20 20 69 6e 74 20 69 53 75 62 32 3b 20 20 20  .  int iSub2;   
13d30 20 20 20 20 20 20 20 20 20 2f 2a 20 45 51 50 20           /* EQP 
13d40 69 64 20 6f 66 20 72 69 67 68 74 2d 68 61 6e 64  id of right-hand
13d50 20 71 75 65 72 79 20 2a 2f 0a 23 65 6e 64 69 66   query */.#endif
13d60 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  ..  assert( p->p
13d70 4f 72 64 65 72 42 79 21 3d 30 20 29 3b 0a 20 20  OrderBy!=0 );.  
13d80 61 73 73 65 72 74 28 20 70 4b 65 79 44 75 70 3d  assert( pKeyDup=
13d90 3d 30 20 29 3b 20 2f 2a 20 22 4d 61 6e 61 67 65  =0 ); /* "Manage
13da0 64 22 20 63 6f 64 65 20 6e 65 65 64 73 20 74 68  d" code needs th
13db0 69 73 2e 20 20 54 69 63 6b 65 74 20 23 33 33 38  is.  Ticket #338
13dc0 32 2e 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61  2. */.  db = pPa
13dd0 72 73 65 2d 3e 64 62 3b 0a 20 20 76 20 3d 20 70  rse->db;.  v = p
13de0 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
13df0 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 20  assert( v!=0 ); 
13e00 20 20 20 20 20 20 2f 2a 20 41 6c 72 65 61 64 79        /* Already
13e10 20 74 68 72 6f 77 6e 20 74 68 65 20 65 72 72 6f   thrown the erro
13e20 72 20 69 66 20 56 44 42 45 20 61 6c 6c 6f 63 20  r if VDBE alloc 
13e30 66 61 69 6c 65 64 20 2a 2f 0a 20 20 6c 61 62 65  failed */.  labe
13e40 6c 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64  lEnd = sqlite3Vd
13e50 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
13e60 20 20 6c 61 62 65 6c 43 6d 70 72 20 3d 20 73 71    labelCmpr = sq
13e70 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
13e80 65 6c 28 76 29 3b 0a 0a 0a 20 20 2f 2a 20 50 61  el(v);...  /* Pa
13e90 74 63 68 20 75 70 20 74 68 65 20 4f 52 44 45 52  tch up the ORDER
13ea0 20 42 59 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a   BY clause.  */.
13eb0 20 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b 20 20 0a    op = p->op;  .
13ec0 20 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50    pPrior = p->pP
13ed0 72 69 6f 72 3b 0a 20 20 61 73 73 65 72 74 28 20  rior;.  assert( 
13ee0 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79  pPrior->pOrderBy
13ef0 3d 3d 30 20 29 3b 0a 20 20 70 4f 72 64 65 72 42  ==0 );.  pOrderB
13f00 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b  y = p->pOrderBy;
13f10 0a 20 20 61 73 73 65 72 74 28 20 70 4f 72 64 65  .  assert( pOrde
13f20 72 42 79 20 29 3b 0a 20 20 6e 4f 72 64 65 72 42  rBy );.  nOrderB
13f30 79 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45  y = pOrderBy->nE
13f40 78 70 72 3b 0a 0a 20 20 2f 2a 20 46 6f 72 20 6f  xpr;..  /* For o
13f50 70 65 72 61 74 6f 72 73 20 6f 74 68 65 72 20 74  perators other t
13f60 68 61 6e 20 55 4e 49 4f 4e 20 41 4c 4c 20 77 65  han UNION ALL we
13f70 20 68 61 76 65 20 74 6f 20 6d 61 6b 65 20 73 75   have to make su
13f80 72 65 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65  re that.  ** the
13f90 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
13fa0 20 63 6f 76 65 72 73 20 65 76 65 72 79 20 74 65   covers every te
13fb0 72 6d 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74  rm of the result
13fc0 20 73 65 74 2e 20 20 41 64 64 0a 20 20 2a 2a 20   set.  Add.  ** 
13fd0 74 65 72 6d 73 20 74 6f 20 74 68 65 20 4f 52 44  terms to the ORD
13fe0 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 73 20  ER BY clause as 
13ff0 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a  necessary..  */.
14000 20 20 69 66 28 20 6f 70 21 3d 54 4b 5f 41 4c 4c    if( op!=TK_ALL
14010 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b   ){.    for(i=1;
14020 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
14030 64 3d 3d 30 20 26 26 20 69 3c 3d 70 2d 3e 70 45  d==0 && i<=p->pE
14040 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
14050 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  ){.      struct 
14060 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
14070 49 74 65 6d 3b 0a 20 20 20 20 20 20 66 6f 72 28  Item;.      for(
14080 6a 3d 30 2c 20 70 49 74 65 6d 3d 70 4f 72 64 65  j=0, pItem=pOrde
14090 72 42 79 2d 3e 61 3b 20 6a 3c 6e 4f 72 64 65 72  rBy->a; j<nOrder
140a0 42 79 3b 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b 2b  By; j++, pItem++
140b0 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
140c0 74 28 20 70 49 74 65 6d 2d 3e 69 4f 72 64 65 72  t( pItem->iOrder
140d0 42 79 43 6f 6c 3e 30 20 29 3b 0a 20 20 20 20 20  ByCol>0 );.     
140e0 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 69 4f     if( pItem->iO
140f0 72 64 65 72 42 79 43 6f 6c 3d 3d 69 20 29 20 62  rderByCol==i ) b
14100 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
14110 20 20 20 20 69 66 28 20 6a 3d 3d 6e 4f 72 64 65      if( j==nOrde
14120 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 45  rBy ){.        E
14130 78 70 72 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69  xpr *pNew = sqli
14140 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 49  te3Expr(db, TK_I
14150 4e 54 45 47 45 52 2c 20 30 29 3b 0a 20 20 20 20  NTEGER, 0);.    
14160 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20      if( pNew==0 
14170 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
14180 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 70  NOMEM;.        p
14190 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50  New->flags |= EP
141a0 5f 49 6e 74 56 61 6c 75 65 3b 0a 20 20 20 20 20  _IntValue;.     
141b0 20 20 20 70 4e 65 77 2d 3e 75 2e 69 56 61 6c 75     pNew->u.iValu
141c0 65 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 70  e = i;.        p
141d0 4f 72 64 65 72 42 79 20 3d 20 73 71 6c 69 74 65  OrderBy = sqlite
141e0 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
141f0 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79  pParse, pOrderBy
14200 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 20  , pNew);.       
14210 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 20   if( pOrderBy ) 
14220 70 4f 72 64 65 72 42 79 2d 3e 61 5b 6e 4f 72 64  pOrderBy->a[nOrd
14230 65 72 42 79 2b 2b 5d 2e 69 4f 72 64 65 72 42 79  erBy++].iOrderBy
14240 43 6f 6c 20 3d 20 28 75 31 36 29 69 3b 0a 20 20  Col = (u16)i;.  
14250 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
14260 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68  .  /* Compute th
14270 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 70 65 72  e comparison per
14280 6d 75 74 61 74 69 6f 6e 20 61 6e 64 20 6b 65 79  mutation and key
14290 69 6e 66 6f 20 74 68 61 74 20 69 73 20 75 73 65  info that is use
142a0 64 20 77 69 74 68 0a 20 20 2a 2a 20 74 68 65 20  d with.  ** the 
142b0 70 65 72 6d 75 74 61 74 69 6f 6e 20 75 73 65 64  permutation used
142c0 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66   to determine if
142d0 20 74 68 65 20 6e 65 78 74 0a 20 20 2a 2a 20 72   the next.  ** r
142e0 6f 77 20 6f 66 20 72 65 73 75 6c 74 73 20 63 6f  ow of results co
142f0 6d 65 73 20 66 72 6f 6d 20 73 65 6c 65 63 74 41  mes from selectA
14300 20 6f 72 20 73 65 6c 65 63 74 42 2e 20 20 41 6c   or selectB.  Al
14310 73 6f 20 61 64 64 20 65 78 70 6c 69 63 69 74 0a  so add explicit.
14320 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 73 20    ** collations 
14330 74 6f 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  to the ORDER BY 
14340 63 6c 61 75 73 65 20 74 65 72 6d 73 20 73 6f 20  clause terms so 
14350 74 68 61 74 20 77 68 65 6e 20 74 68 65 20 73 75  that when the su
14360 62 71 75 65 72 69 65 73 0a 20 20 2a 2a 20 74 6f  bqueries.  ** to
14370 20 74 68 65 20 72 69 67 68 74 20 61 6e 64 20 74   the right and t
14380 68 65 20 6c 65 66 74 20 61 72 65 20 65 76 61 6c  he left are eval
14390 75 61 74 65 64 2c 20 74 68 65 79 20 75 73 65 20  uated, they use 
143a0 74 68 65 20 63 6f 72 72 65 63 74 0a 20 20 2a 2a  the correct.  **
143b0 20 63 6f 6c 6c 61 74 69 6f 6e 2e 0a 20 20 2a 2f   collation..  */
143c0 0a 20 20 61 50 65 72 6d 75 74 65 20 3d 20 73 71  .  aPermute = sq
143d0 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
143e0 28 64 62 2c 20 73 69 7a 65 6f 66 28 69 6e 74 29  (db, sizeof(int)
143f0 2a 6e 4f 72 64 65 72 42 79 29 3b 0a 20 20 69 66  *nOrderBy);.  if
14400 28 20 61 50 65 72 6d 75 74 65 20 29 7b 0a 20 20  ( aPermute ){.  
14410 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
14420 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
14430 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 49 74 65     for(i=0, pIte
14440 6d 3d 70 4f 72 64 65 72 42 79 2d 3e 61 3b 20 69  m=pOrderBy->a; i
14450 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 2c 20  <nOrderBy; i++, 
14460 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
14470 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 69  assert( pItem->i
14480 4f 72 64 65 72 42 79 43 6f 6c 3e 30 20 20 26 26  OrderByCol>0  &&
14490 20 70 49 74 65 6d 2d 3e 69 4f 72 64 65 72 42 79   pItem->iOrderBy
144a0 43 6f 6c 3c 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e  Col<=p->pEList->
144b0 6e 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20 61  nExpr );.      a
144c0 50 65 72 6d 75 74 65 5b 69 5d 20 3d 20 70 49 74  Permute[i] = pIt
144d0 65 6d 2d 3e 69 4f 72 64 65 72 42 79 43 6f 6c 20  em->iOrderByCol 
144e0 2d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  - 1;.    }.    p
144f0 4b 65 79 4d 65 72 67 65 20 3d 20 73 71 6c 69 74  KeyMerge = sqlit
14500 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 64  e3KeyInfoAlloc(d
14510 62 2c 20 6e 4f 72 64 65 72 42 79 29 3b 0a 20 20  b, nOrderBy);.  
14520 20 20 69 66 28 20 70 4b 65 79 4d 65 72 67 65 20    if( pKeyMerge 
14530 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  ){.      for(i=0
14540 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b  ; i<nOrderBy; i+
14550 2b 29 7b 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c  +){.        Coll
14560 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20  Seq *pColl;.    
14570 20 20 20 20 45 78 70 72 20 2a 70 54 65 72 6d 20      Expr *pTerm 
14580 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  = pOrderBy->a[i]
14590 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  .pExpr;.        
145a0 69 66 28 20 70 54 65 72 6d 2d 3e 66 6c 61 67 73  if( pTerm->flags
145b0 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 20 29 7b   & EP_Collate ){
145c0 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 6c  .          pColl
145d0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
145e0 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 54  llSeq(pParse, pT
145f0 65 72 6d 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  erm);.        }e
14600 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70  lse{.          p
14610 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69 53 65 6c 65  Coll = multiSele
14620 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  ctCollSeq(pParse
14630 2c 20 70 2c 20 61 50 65 72 6d 75 74 65 5b 69 5d  , p, aPermute[i]
14640 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
14650 20 70 43 6f 6c 6c 3d 3d 30 20 29 20 70 43 6f 6c   pColl==0 ) pCol
14660 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c  l = db->pDfltCol
14670 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 72  l;.          pOr
14680 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  derBy->a[i].pExp
14690 72 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20  r =.            
146a0 20 73 71 6c 69 74 65 33 45 78 70 72 41 64 64 43   sqlite3ExprAddC
146b0 6f 6c 6c 61 74 65 53 74 72 69 6e 67 28 70 50 61  ollateString(pPa
146c0 72 73 65 2c 20 70 54 65 72 6d 2c 20 70 43 6f 6c  rse, pTerm, pCol
146d0 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  l->zName);.     
146e0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 4b 65     }.        pKe
146f0 79 4d 65 72 67 65 2d 3e 61 43 6f 6c 6c 5b 69 5d  yMerge->aColl[i]
14700 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20   = pColl;.      
14710 20 20 70 4b 65 79 4d 65 72 67 65 2d 3e 61 53 6f    pKeyMerge->aSo
14720 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 70 4f 72  rtOrder[i] = pOr
14730 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74  derBy->a[i].sort
14740 4f 72 64 65 72 3b 0a 20 20 20 20 20 20 7d 0a 20  Order;.      }. 
14750 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
14760 20 20 70 4b 65 79 4d 65 72 67 65 20 3d 20 30 3b    pKeyMerge = 0;
14770 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 74 74  .  }..  /* Reatt
14780 61 63 68 20 74 68 65 20 4f 52 44 45 52 20 42 59  ach the ORDER BY
14790 20 63 6c 61 75 73 65 20 74 6f 20 74 68 65 20 71   clause to the q
147a0 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e  uery..  */.  p->
147b0 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65  pOrderBy = pOrde
147c0 72 42 79 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 70  rBy;.  pPrior->p
147d0 4f 72 64 65 72 42 79 20 3d 20 73 71 6c 69 74 65  OrderBy = sqlite
147e0 33 45 78 70 72 4c 69 73 74 44 75 70 28 70 50 61  3ExprListDup(pPa
147f0 72 73 65 2d 3e 64 62 2c 20 70 4f 72 64 65 72 42  rse->db, pOrderB
14800 79 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c  y, 0);..  /* All
14810 6f 63 61 74 65 20 61 20 72 61 6e 67 65 20 6f 66  ocate a range of
14820 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73   temporary regis
14830 74 65 72 73 20 61 6e 64 20 74 68 65 20 4b 65 79  ters and the Key
14840 49 6e 66 6f 20 6e 65 65 64 65 64 0a 20 20 2a 2a  Info needed.  **
14850 20 66 6f 72 20 74 68 65 20 6c 6f 67 69 63 20 74   for the logic t
14860 68 61 74 20 72 65 6d 6f 76 65 73 20 64 75 70 6c  hat removes dupl
14870 69 63 61 74 65 20 72 65 73 75 6c 74 20 72 6f 77  icate result row
14880 73 20 77 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20  s when the.  ** 
14890 6f 70 65 72 61 74 6f 72 20 69 73 20 55 4e 49 4f  operator is UNIO
148a0 4e 2c 20 45 58 43 45 50 54 2c 20 6f 72 20 49 4e  N, EXCEPT, or IN
148b0 54 45 52 53 45 43 54 20 28 62 75 74 20 6e 6f 74  TERSECT (but not
148c0 20 55 4e 49 4f 4e 20 41 4c 4c 29 2e 0a 20 20 2a   UNION ALL)..  *
148d0 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41  /.  if( op==TK_A
148e0 4c 4c 20 29 7b 0a 20 20 20 20 72 65 67 50 72 65  LL ){.    regPre
148f0 76 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  v = 0;.  }else{.
14900 20 20 20 20 69 6e 74 20 6e 45 78 70 72 20 3d 20      int nExpr = 
14910 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
14920 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 4f  ;.    assert( nO
14930 72 64 65 72 42 79 3e 3d 6e 45 78 70 72 20 7c 7c  rderBy>=nExpr ||
14940 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
14950 64 20 29 3b 0a 20 20 20 20 72 65 67 50 72 65 76  d );.    regPrev
14960 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b   = pParse->nMem+
14970 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  1;.    pParse->n
14980 4d 65 6d 20 2b 3d 20 6e 45 78 70 72 2b 31 3b 0a  Mem += nExpr+1;.
14990 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
149a0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
149b0 67 65 72 2c 20 30 2c 20 72 65 67 50 72 65 76 29  ger, 0, regPrev)
149c0 3b 0a 20 20 20 20 70 4b 65 79 44 75 70 20 3d 20  ;.    pKeyDup = 
149d0 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c  sqlite3KeyInfoAl
149e0 6c 6f 63 28 64 62 2c 20 6e 45 78 70 72 29 3b 0a  loc(db, nExpr);.
149f0 20 20 20 20 69 66 28 20 70 4b 65 79 44 75 70 20      if( pKeyDup 
14a00 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  ){.      for(i=0
14a10 3b 20 69 3c 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  ; i<nExpr; i++){
14a20 0a 20 20 20 20 20 20 20 20 70 4b 65 79 44 75 70  .        pKeyDup
14a30 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 6d 75 6c  ->aColl[i] = mul
14a40 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28  tiSelectCollSeq(
14a50 70 50 61 72 73 65 2c 20 70 2c 20 69 29 3b 0a 20  pParse, p, i);. 
14a60 20 20 20 20 20 20 20 70 4b 65 79 44 75 70 2d 3e         pKeyDup->
14a70 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20  aSortOrder[i] = 
14a80 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
14a90 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20 53 65 70 61  .  }. .  /* Sepa
14aa0 72 61 74 65 20 74 68 65 20 6c 65 66 74 20 61 6e  rate the left an
14ab0 64 20 74 68 65 20 72 69 67 68 74 20 71 75 65 72  d the right quer
14ac0 79 20 66 72 6f 6d 20 6f 6e 65 20 61 6e 6f 74 68  y from one anoth
14ad0 65 72 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 50 72  er.  */.  p->pPr
14ae0 69 6f 72 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  ior = 0;.  sqlit
14af0 65 33 52 65 73 6f 6c 76 65 4f 72 64 65 72 47 72  e3ResolveOrderGr
14b00 6f 75 70 42 79 28 70 50 61 72 73 65 2c 20 70 2c  oupBy(pParse, p,
14b10 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 22 4f   p->pOrderBy, "O
14b20 52 44 45 52 22 29 3b 0a 20 20 69 66 28 20 70 50  RDER");.  if( pP
14b30 72 69 6f 72 2d 3e 70 50 72 69 6f 72 3d 3d 30 20  rior->pPrior==0 
14b40 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  ){.    sqlite3Re
14b50 73 6f 6c 76 65 4f 72 64 65 72 47 72 6f 75 70 42  solveOrderGroupB
14b60 79 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72  y(pParse, pPrior
14b70 2c 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72  , pPrior->pOrder
14b80 42 79 2c 20 22 4f 52 44 45 52 22 29 3b 0a 20 20  By, "ORDER");.  
14b90 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20  }..  /* Compute 
14ba0 74 68 65 20 6c 69 6d 69 74 20 72 65 67 69 73 74  the limit regist
14bb0 65 72 73 20 2a 2f 0a 20 20 63 6f 6d 70 75 74 65  ers */.  compute
14bc0 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70  LimitRegisters(p
14bd0 50 61 72 73 65 2c 20 70 2c 20 6c 61 62 65 6c 45  Parse, p, labelE
14be0 6e 64 29 3b 0a 20 20 69 66 28 20 70 2d 3e 69 4c  nd);.  if( p->iL
14bf0 69 6d 69 74 20 26 26 20 6f 70 3d 3d 54 4b 5f 41  imit && op==TK_A
14c00 4c 4c 20 29 7b 0a 20 20 20 20 72 65 67 4c 69 6d  LL ){.    regLim
14c10 69 74 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  itA = ++pParse->
14c20 6e 4d 65 6d 3b 0a 20 20 20 20 72 65 67 4c 69 6d  nMem;.    regLim
14c30 69 74 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  itB = ++pParse->
14c40 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65  nMem;.    sqlite
14c50 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
14c60 50 5f 43 6f 70 79 2c 20 70 2d 3e 69 4f 66 66 73  P_Copy, p->iOffs
14c70 65 74 20 3f 20 70 2d 3e 69 4f 66 66 73 65 74 2b  et ? p->iOffset+
14c80 31 20 3a 20 70 2d 3e 69 4c 69 6d 69 74 2c 0a 20  1 : p->iLimit,. 
14c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14cb0 20 72 65 67 4c 69 6d 69 74 41 29 3b 0a 20 20 20   regLimitA);.   
14cc0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14cd0 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72  p2(v, OP_Copy, r
14ce0 65 67 4c 69 6d 69 74 41 2c 20 72 65 67 4c 69 6d  egLimitA, regLim
14cf0 69 74 42 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  itB);.  }else{. 
14d00 20 20 20 72 65 67 4c 69 6d 69 74 41 20 3d 20 72     regLimitA = r
14d10 65 67 4c 69 6d 69 74 42 20 3d 20 30 3b 0a 20 20  egLimitB = 0;.  
14d20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  }.  sqlite3ExprD
14d30 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69  elete(db, p->pLi
14d40 6d 69 74 29 3b 0a 20 20 70 2d 3e 70 4c 69 6d 69  mit);.  p->pLimi
14d50 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  t = 0;.  sqlite3
14d60 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
14d70 2d 3e 70 4f 66 66 73 65 74 29 3b 0a 20 20 70 2d  ->pOffset);.  p-
14d80 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 0a 20  >pOffset = 0;.. 
14d90 20 72 65 67 41 64 64 72 41 20 3d 20 2b 2b 70 50   regAddrA = ++pP
14da0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65  arse->nMem;.  re
14db0 67 45 6f 66 41 20 3d 20 2b 2b 70 50 61 72 73 65  gEofA = ++pParse
14dc0 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 41 64 64  ->nMem;.  regAdd
14dd0 72 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  rB = ++pParse->n
14de0 4d 65 6d 3b 0a 20 20 72 65 67 45 6f 66 42 20 3d  Mem;.  regEofB =
14df0 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
14e00 0a 20 20 72 65 67 4f 75 74 41 20 3d 20 2b 2b 70  .  regOutA = ++p
14e10 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72  Parse->nMem;.  r
14e20 65 67 4f 75 74 42 20 3d 20 2b 2b 70 50 61 72 73  egOutB = ++pPars
14e30 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69 74  e->nMem;.  sqlit
14e40 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74  e3SelectDestInit
14e50 28 26 64 65 73 74 41 2c 20 53 52 54 5f 43 6f 72  (&destA, SRT_Cor
14e60 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72 41  outine, regAddrA
14e70 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  );.  sqlite3Sele
14e80 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74  ctDestInit(&dest
14e90 42 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65  B, SRT_Coroutine
14ea0 2c 20 72 65 67 41 64 64 72 42 29 3b 0a 0a 20 20  , regAddrB);..  
14eb0 2f 2a 20 4a 75 6d 70 20 70 61 73 74 20 74 68 65  /* Jump past the
14ec0 20 76 61 72 69 6f 75 73 20 73 75 62 72 6f 75 74   various subrout
14ed0 69 6e 65 73 20 61 6e 64 20 63 6f 72 6f 75 74 69  ines and corouti
14ee0 6e 65 73 20 74 6f 20 74 68 65 20 6d 61 69 6e 0a  nes to the main.
14ef0 20 20 2a 2a 20 6d 65 72 67 65 20 6c 6f 6f 70 0a    ** merge loop.
14f00 20 20 2a 2f 0a 20 20 6a 31 20 3d 20 73 71 6c 69    */.  j1 = sqli
14f10 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c  te3VdbeAddOp0(v,
14f20 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20 61 64 64   OP_Goto);.  add
14f30 72 53 65 6c 65 63 74 41 20 3d 20 73 71 6c 69 74  rSelectA = sqlit
14f40 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
14f50 72 28 76 29 3b 0a 0a 0a 20 20 2f 2a 20 47 65 6e  r(v);...  /* Gen
14f60 65 72 61 74 65 20 61 20 63 6f 72 6f 75 74 69 6e  erate a coroutin
14f70 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68  e to evaluate th
14f80 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
14f90 6e 74 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 6c  nt to the.  ** l
14fa0 65 66 74 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f  eft of the compo
14fb0 75 6e 64 20 6f 70 65 72 61 74 6f 72 20 2d 20 74  und operator - t
14fc0 68 65 20 22 41 22 20 73 65 6c 65 63 74 2e 0a 20  he "A" select.. 
14fd0 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f   */.  VdbeNoopCo
14fe0 6d 6d 65 6e 74 28 28 76 2c 20 22 42 65 67 69 6e  mment((v, "Begin
14ff0 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20 6c   coroutine for l
15000 65 66 74 20 53 45 4c 45 43 54 22 29 29 3b 0a 20  eft SELECT"));. 
15010 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 20   pPrior->iLimit 
15020 3d 20 72 65 67 4c 69 6d 69 74 41 3b 0a 20 20 65  = regLimitA;.  e
15030 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72  xplainSetInteger
15040 28 69 53 75 62 31 2c 20 70 50 61 72 73 65 2d 3e  (iSub1, pParse->
15050 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a  iNextSelectId);.
15060 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28    sqlite3Select(
15070 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20  pParse, pPrior, 
15080 26 64 65 73 74 41 29 3b 0a 20 20 73 71 6c 69 74  &destA);.  sqlit
15090 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
150a0 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 72  OP_Integer, 1, r
150b0 65 67 45 6f 66 41 29 3b 0a 20 20 73 71 6c 69 74  egEofA);.  sqlit
150c0 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
150d0 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64  OP_Yield, regAdd
150e0 72 41 29 3b 0a 20 20 56 64 62 65 4e 6f 6f 70 43  rA);.  VdbeNoopC
150f0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 45 6e 64 20  omment((v, "End 
15100 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20 6c 65  coroutine for le
15110 66 74 20 53 45 4c 45 43 54 22 29 29 3b 0a 0a 20  ft SELECT"));.. 
15120 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 63   /* Generate a c
15130 6f 72 6f 75 74 69 6e 65 20 74 6f 20 65 76 61 6c  oroutine to eval
15140 75 61 74 65 20 74 68 65 20 53 45 4c 45 43 54 20  uate the SELECT 
15150 73 74 61 74 65 6d 65 6e 74 20 6f 6e 20 0a 20 20  statement on .  
15160 2a 2a 20 74 68 65 20 72 69 67 68 74 20 2d 20 74  ** the right - t
15170 68 65 20 22 42 22 20 73 65 6c 65 63 74 0a 20 20  he "B" select.  
15180 2a 2f 0a 20 20 61 64 64 72 53 65 6c 65 63 74 42  */.  addrSelectB
15190 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
151a0 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
151b0 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28  VdbeNoopComment(
151c0 28 76 2c 20 22 42 65 67 69 6e 20 63 6f 72 6f 75  (v, "Begin corou
151d0 74 69 6e 65 20 66 6f 72 20 72 69 67 68 74 20 53  tine for right S
151e0 45 4c 45 43 54 22 29 29 3b 0a 20 20 73 61 76 65  ELECT"));.  save
151f0 64 4c 69 6d 69 74 20 3d 20 70 2d 3e 69 4c 69 6d  dLimit = p->iLim
15200 69 74 3b 0a 20 20 73 61 76 65 64 4f 66 66 73 65  it;.  savedOffse
15210 74 20 3d 20 70 2d 3e 69 4f 66 66 73 65 74 3b 0a  t = p->iOffset;.
15220 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 72 65    p->iLimit = re
15230 67 4c 69 6d 69 74 42 3b 0a 20 20 70 2d 3e 69 4f  gLimitB;.  p->iO
15240 66 66 73 65 74 20 3d 20 30 3b 20 20 0a 20 20 65  ffset = 0;  .  e
15250 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72  xplainSetInteger
15260 28 69 53 75 62 32 2c 20 70 50 61 72 73 65 2d 3e  (iSub2, pParse->
15270 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a  iNextSelectId);.
15280 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28    sqlite3Select(
15290 70 50 61 72 73 65 2c 20 70 2c 20 26 64 65 73 74  pParse, p, &dest
152a0 42 29 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69 74 20  B);.  p->iLimit 
152b0 3d 20 73 61 76 65 64 4c 69 6d 69 74 3b 0a 20 20  = savedLimit;.  
152c0 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 73 61 76  p->iOffset = sav
152d0 65 64 4f 66 66 73 65 74 3b 0a 20 20 73 71 6c 69  edOffset;.  sqli
152e0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
152f0 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20   OP_Integer, 1, 
15300 72 65 67 45 6f 66 42 29 3b 0a 20 20 73 71 6c 69  regEofB);.  sqli
15310 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
15320 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64   OP_Yield, regAd
15330 64 72 42 29 3b 0a 20 20 56 64 62 65 4e 6f 6f 70  drB);.  VdbeNoop
15340 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 45 6e 64  Comment((v, "End
15350 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20 72   coroutine for r
15360 69 67 68 74 20 53 45 4c 45 43 54 22 29 29 3b 0a  ight SELECT"));.
15370 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61  .  /* Generate a
15380 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74   subroutine that
15390 20 6f 75 74 70 75 74 73 20 74 68 65 20 63 75 72   outputs the cur
153a0 72 65 6e 74 20 72 6f 77 20 6f 66 20 74 68 65 20  rent row of the 
153b0 41 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20 61 73  A.  ** select as
153c0 20 74 68 65 20 6e 65 78 74 20 6f 75 74 70 75 74   the next output
153d0 20 72 6f 77 20 6f 66 20 74 68 65 20 63 6f 6d 70   row of the comp
153e0 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a  ound select..  *
153f0 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d  /.  VdbeNoopComm
15400 65 6e 74 28 28 76 2c 20 22 4f 75 74 70 75 74 20  ent((v, "Output 
15410 72 6f 75 74 69 6e 65 20 66 6f 72 20 41 22 29 29  routine for A"))
15420 3b 0a 20 20 61 64 64 72 4f 75 74 41 20 3d 20 67  ;.  addrOutA = g
15430 65 6e 65 72 61 74 65 4f 75 74 70 75 74 53 75 62  enerateOutputSub
15440 72 6f 75 74 69 6e 65 28 70 50 61 72 73 65 2c 0a  routine(pParse,.
15450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15460 20 70 2c 20 26 64 65 73 74 41 2c 20 70 44 65 73   p, &destA, pDes
15470 74 2c 20 72 65 67 4f 75 74 41 2c 0a 20 20 20 20  t, regOutA,.    
15480 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 67               reg
15490 50 72 65 76 2c 20 70 4b 65 79 44 75 70 2c 20 50  Prev, pKeyDup, P
154a0 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46  4_KEYINFO_HANDOF
154b0 46 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20  F, labelEnd);.  
154c0 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61  .  /* Generate a
154d0 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74   subroutine that
154e0 20 6f 75 74 70 75 74 73 20 74 68 65 20 63 75 72   outputs the cur
154f0 72 65 6e 74 20 72 6f 77 20 6f 66 20 74 68 65 20  rent row of the 
15500 42 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20 61 73  B.  ** select as
15510 20 74 68 65 20 6e 65 78 74 20 6f 75 74 70 75 74   the next output
15520 20 72 6f 77 20 6f 66 20 74 68 65 20 63 6f 6d 70   row of the comp
15530 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a  ound select..  *
15540 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41  /.  if( op==TK_A
15550 4c 4c 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 4e 49  LL || op==TK_UNI
15560 4f 4e 20 29 7b 0a 20 20 20 20 56 64 62 65 4e 6f  ON ){.    VdbeNo
15570 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f  opComment((v, "O
15580 75 74 70 75 74 20 72 6f 75 74 69 6e 65 20 66 6f  utput routine fo
15590 72 20 42 22 29 29 3b 0a 20 20 20 20 61 64 64 72  r B"));.    addr
155a0 4f 75 74 42 20 3d 20 67 65 6e 65 72 61 74 65 4f  OutB = generateO
155b0 75 74 70 75 74 53 75 62 72 6f 75 74 69 6e 65 28  utputSubroutine(
155c0 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20  pParse,.        
155d0 20 20 20 20 20 20 20 20 20 70 2c 20 26 64 65 73           p, &des
155e0 74 42 2c 20 70 44 65 73 74 2c 20 72 65 67 4f 75  tB, pDest, regOu
155f0 74 42 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  tB,.            
15600 20 20 20 20 20 72 65 67 50 72 65 76 2c 20 70 4b       regPrev, pK
15610 65 79 44 75 70 2c 20 50 34 5f 4b 45 59 49 4e 46  eyDup, P4_KEYINF
15620 4f 5f 53 54 41 54 49 43 2c 20 6c 61 62 65 6c 45  O_STATIC, labelE
15630 6e 64 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47  nd);.  }..  /* G
15640 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75  enerate a subrou
15650 74 69 6e 65 20 74 6f 20 72 75 6e 20 77 68 65 6e  tine to run when
15660 20 74 68 65 20 72 65 73 75 6c 74 73 20 66 72 6f   the results fro
15670 6d 20 73 65 6c 65 63 74 20 41 0a 20 20 2a 2a 20  m select A.  ** 
15680 61 72 65 20 65 78 68 61 75 73 74 65 64 20 61 6e  are exhausted an
15690 64 20 6f 6e 6c 79 20 64 61 74 61 20 69 6e 20 73  d only data in s
156a0 65 6c 65 63 74 20 42 20 72 65 6d 61 69 6e 73 2e  elect B remains.
156b0 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70  .  */.  VdbeNoop
156c0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6f 66  Comment((v, "eof
156d0 2d 41 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29  -A subroutine"))
156e0 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 45  ;.  if( op==TK_E
156f0 58 43 45 50 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f  XCEPT || op==TK_
15700 49 4e 54 45 52 53 45 43 54 20 29 7b 0a 20 20 20  INTERSECT ){.   
15710 20 61 64 64 72 45 6f 66 41 20 3d 20 73 71 6c 69   addrEofA = sqli
15720 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
15730 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c 61 62   OP_Goto, 0, lab
15740 65 6c 45 6e 64 29 3b 0a 20 20 7d 65 6c 73 65 7b  elEnd);.  }else{
15750 20 20 0a 20 20 20 20 61 64 64 72 45 6f 66 41 20    .    addrEofA 
15760 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
15770 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65  Op2(v, OP_If, re
15780 67 45 6f 66 42 2c 20 6c 61 62 65 6c 45 6e 64 29  gEofB, labelEnd)
15790 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
157a0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
157b0 73 75 62 2c 20 72 65 67 4f 75 74 42 2c 20 61 64  sub, regOutB, ad
157c0 64 72 4f 75 74 42 29 3b 0a 20 20 20 20 73 71 6c  drOutB);.    sql
157d0 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
157e0 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41  , OP_Yield, regA
157f0 64 64 72 42 29 3b 0a 20 20 20 20 73 71 6c 69 74  ddrB);.    sqlit
15800 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
15810 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72  OP_Goto, 0, addr
15820 45 6f 66 41 29 3b 0a 20 20 20 20 70 2d 3e 6e 53  EofA);.    p->nS
15830 65 6c 65 63 74 52 6f 77 20 2b 3d 20 70 50 72 69  electRow += pPri
15840 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a  or->nSelectRow;.
15850 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61    }..  /* Genera
15860 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  te a subroutine 
15870 74 6f 20 72 75 6e 20 77 68 65 6e 20 74 68 65 20  to run when the 
15880 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 73 65 6c  results from sel
15890 65 63 74 20 42 0a 20 20 2a 2a 20 61 72 65 20 65  ect B.  ** are e
158a0 78 68 61 75 73 74 65 64 20 61 6e 64 20 6f 6e 6c  xhausted and onl
158b0 79 20 64 61 74 61 20 69 6e 20 73 65 6c 65 63 74  y data in select
158c0 20 41 20 72 65 6d 61 69 6e 73 2e 0a 20 20 2a 2f   A remains..  */
158d0 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e  .  if( op==TK_IN
158e0 54 45 52 53 45 43 54 20 29 7b 0a 20 20 20 20 61  TERSECT ){.    a
158f0 64 64 72 45 6f 66 42 20 3d 20 61 64 64 72 45 6f  ddrEofB = addrEo
15900 66 41 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e  fA;.    if( p->n
15910 53 65 6c 65 63 74 52 6f 77 20 3e 20 70 50 72 69  SelectRow > pPri
15920 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 29  or->nSelectRow )
15930 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d   p->nSelectRow =
15940 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74   pPrior->nSelect
15950 52 6f 77 3b 0a 20 20 7d 65 6c 73 65 7b 20 20 0a  Row;.  }else{  .
15960 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d      VdbeNoopComm
15970 65 6e 74 28 28 76 2c 20 22 65 6f 66 2d 42 20 73  ent((v, "eof-B s
15980 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20  ubroutine"));.  
15990 20 20 61 64 64 72 45 6f 66 42 20 3d 20 73 71 6c    addrEofB = sql
159a0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
159b0 2c 20 4f 50 5f 49 66 2c 20 72 65 67 45 6f 66 41  , OP_If, regEofA
159c0 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 20  , labelEnd);.   
159d0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
159e0 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
159f0 72 65 67 4f 75 74 41 2c 20 61 64 64 72 4f 75 74  regOutA, addrOut
15a00 41 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  A);.    sqlite3V
15a10 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
15a20 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41 29  Yield, regAddrA)
15a30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
15a40 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
15a50 74 6f 2c 20 30 2c 20 61 64 64 72 45 6f 66 42 29  to, 0, addrEofB)
15a60 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65  ;.  }..  /* Gene
15a70 72 61 74 65 20 63 6f 64 65 20 74 6f 20 68 61 6e  rate code to han
15a80 64 6c 65 20 74 68 65 20 63 61 73 65 20 6f 66 20  dle the case of 
15a90 41 3c 42 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e  A<B.  */.  VdbeN
15aa0 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  oopComment((v, "
15ab0 41 2d 6c 74 2d 42 20 73 75 62 72 6f 75 74 69 6e  A-lt-B subroutin
15ac0 65 22 29 29 3b 0a 20 20 61 64 64 72 41 6c 74 42  e"));.  addrAltB
15ad0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
15ae0 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
15af0 2c 20 72 65 67 4f 75 74 41 2c 20 61 64 64 72 4f  , regOutA, addrO
15b00 75 74 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  utA);.  sqlite3V
15b10 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
15b20 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41 29  Yield, regAddrA)
15b30 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
15b40 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20  ddOp2(v, OP_If, 
15b50 72 65 67 45 6f 66 41 2c 20 61 64 64 72 45 6f 66  regEofA, addrEof
15b60 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  A);.  sqlite3Vdb
15b70 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
15b80 74 6f 2c 20 30 2c 20 6c 61 62 65 6c 43 6d 70 72  to, 0, labelCmpr
15b90 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  );..  /* Generat
15ba0 65 20 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c 65  e code to handle
15bb0 20 74 68 65 20 63 61 73 65 20 6f 66 20 41 3d 3d   the case of A==
15bc0 42 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d  B.  */.  if( op=
15bd0 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 61  =TK_ALL ){.    a
15be0 64 64 72 41 65 71 42 20 3d 20 61 64 64 72 41 6c  ddrAeqB = addrAl
15bf0 74 42 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  tB;.  }else if( 
15c00 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54  op==TK_INTERSECT
15c10 20 29 7b 0a 20 20 20 20 61 64 64 72 41 65 71 42   ){.    addrAeqB
15c20 20 3d 20 61 64 64 72 41 6c 74 42 3b 0a 20 20 20   = addrAltB;.   
15c30 20 61 64 64 72 41 6c 74 42 2b 2b 3b 0a 20 20 7d   addrAltB++;.  }
15c40 65 6c 73 65 7b 0a 20 20 20 20 56 64 62 65 4e 6f  else{.    VdbeNo
15c50 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 41  opComment((v, "A
15c60 2d 65 71 2d 42 20 73 75 62 72 6f 75 74 69 6e 65  -eq-B subroutine
15c70 22 29 29 3b 0a 20 20 20 20 61 64 64 72 41 65 71  "));.    addrAeq
15c80 42 20 3d 0a 20 20 20 20 73 71 6c 69 74 65 33 56  B =.    sqlite3V
15c90 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
15ca0 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41 29  Yield, regAddrA)
15cb0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
15cc0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66  eAddOp2(v, OP_If
15cd0 2c 20 72 65 67 45 6f 66 41 2c 20 61 64 64 72 45  , regEofA, addrE
15ce0 6f 66 41 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ofA);.    sqlite
15cf0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
15d00 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c 61 62 65 6c  P_Goto, 0, label
15d10 43 6d 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Cmpr);.  }..  /*
15d20 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
15d30 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 63 61 73  o handle the cas
15d40 65 20 6f 66 20 41 3e 42 0a 20 20 2a 2f 0a 20 20  e of A>B.  */.  
15d50 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28  VdbeNoopComment(
15d60 28 76 2c 20 22 41 2d 67 74 2d 42 20 73 75 62 72  (v, "A-gt-B subr
15d70 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 61 64 64  outine"));.  add
15d80 72 41 67 74 42 20 3d 20 73 71 6c 69 74 65 33 56  rAgtB = sqlite3V
15d90 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
15da0 29 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  );.  if( op==TK_
15db0 41 4c 4c 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 4e  ALL || op==TK_UN
15dc0 49 4f 4e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ION ){.    sqlit
15dd0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
15de0 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74  OP_Gosub, regOut
15df0 42 2c 20 61 64 64 72 4f 75 74 42 29 3b 0a 20 20  B, addrOutB);.  
15e00 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  }.  sqlite3VdbeA
15e10 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c  ddOp1(v, OP_Yiel
15e20 64 2c 20 72 65 67 41 64 64 72 42 29 3b 0a 20 20  d, regAddrB);.  
15e30 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15e40 32 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 45  2(v, OP_If, regE
15e50 6f 66 42 2c 20 61 64 64 72 45 6f 66 42 29 3b 0a  ofB, addrEofB);.
15e60 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15e70 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
15e80 30 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 0a  0, labelCmpr);..
15e90 20 20 2f 2a 20 54 68 69 73 20 63 6f 64 65 20 72    /* This code r
15ea0 75 6e 73 20 6f 6e 63 65 20 74 6f 20 69 6e 69 74  uns once to init
15eb0 69 61 6c 69 7a 65 20 65 76 65 72 79 74 68 69 6e  ialize everythin
15ec0 67 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  g..  */.  sqlite
15ed0 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
15ee0 20 6a 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56   j1);.  sqlite3V
15ef0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
15f00 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67 45  Integer, 0, regE
15f10 6f 66 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ofA);.  sqlite3V
15f20 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
15f30 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67 45  Integer, 0, regE
15f40 6f 66 42 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ofB);.  sqlite3V
15f50 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
15f60 47 6f 73 75 62 2c 20 72 65 67 41 64 64 72 41 2c  Gosub, regAddrA,
15f70 20 61 64 64 72 53 65 6c 65 63 74 41 29 3b 0a 20   addrSelectA);. 
15f80 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15f90 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
15fa0 72 65 67 41 64 64 72 42 2c 20 61 64 64 72 53 65  regAddrB, addrSe
15fb0 6c 65 63 74 42 29 3b 0a 20 20 73 71 6c 69 74 65  lectB);.  sqlite
15fc0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
15fd0 50 5f 49 66 2c 20 72 65 67 45 6f 66 41 2c 20 61  P_If, regEofA, a
15fe0 64 64 72 45 6f 66 41 29 3b 0a 20 20 73 71 6c 69  ddrEofA);.  sqli
15ff0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
16000 20 4f 50 5f 49 66 2c 20 72 65 67 45 6f 66 42 2c   OP_If, regEofB,
16010 20 61 64 64 72 45 6f 66 42 29 3b 0a 0a 20 20 2f   addrEofB);..  /
16020 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  * Implement the 
16030 6d 61 69 6e 20 6d 65 72 67 65 20 6c 6f 6f 70 0a  main merge loop.
16040 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64    */.  sqlite3Vd
16050 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
16060 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 20 20  , labelCmpr);.  
16070 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
16080 34 28 76 2c 20 4f 50 5f 50 65 72 6d 75 74 61 74  4(v, OP_Permutat
16090 69 6f 6e 2c 20 30 2c 20 30 2c 20 30 2c 20 28 63  ion, 0, 0, 0, (c
160a0 68 61 72 2a 29 61 50 65 72 6d 75 74 65 2c 20 50  har*)aPermute, P
160b0 34 5f 49 4e 54 41 52 52 41 59 29 3b 0a 20 20 73  4_INTARRAY);.  s
160c0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
160d0 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20  (v, OP_Compare, 
160e0 64 65 73 74 41 2e 69 53 64 73 74 2c 20 64 65 73  destA.iSdst, des
160f0 74 42 2e 69 53 64 73 74 2c 20 6e 4f 72 64 65 72  tB.iSdst, nOrder
16100 42 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  By,.            
16110 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
16120 61 72 2a 29 70 4b 65 79 4d 65 72 67 65 2c 20 50  ar*)pKeyMerge, P
16130 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46  4_KEYINFO_HANDOF
16140 46 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  F);.  sqlite3Vdb
16150 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46  eChangeP5(v, OPF
16160 4c 41 47 5f 50 45 52 4d 55 54 45 29 3b 0a 20 20  LAG_PERMUTE);.  
16170 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
16180 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61 64  3(v, OP_Jump, ad
16190 64 72 41 6c 74 42 2c 20 61 64 64 72 41 65 71 42  drAltB, addrAeqB
161a0 2c 20 61 64 64 72 41 67 74 42 29 3b 0a 0a 20 20  , addrAgtB);..  
161b0 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20 74  /* Jump to the t
161c0 68 69 73 20 70 6f 69 6e 74 20 69 6e 20 6f 72 64  his point in ord
161d0 65 72 20 74 6f 20 74 65 72 6d 69 6e 61 74 65 20  er to terminate 
161e0 74 68 65 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a  the query..  */.
161f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
16200 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 61 62  olveLabel(v, lab
16210 65 6c 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20 53 65  elEnd);..  /* Se
16220 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
16230 6f 75 74 70 75 74 20 63 6f 6c 75 6d 6e 73 0a 20  output columns. 
16240 20 2a 2f 0a 20 20 69 66 28 20 70 44 65 73 74 2d   */.  if( pDest-
16250 3e 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70  >eDest==SRT_Outp
16260 75 74 20 29 7b 0a 20 20 20 20 53 65 6c 65 63 74  ut ){.    Select
16270 20 2a 70 46 69 72 73 74 20 3d 20 70 50 72 69 6f   *pFirst = pPrio
16280 72 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 46  r;.    while( pF
16290 69 72 73 74 2d 3e 70 50 72 69 6f 72 20 29 20 70  irst->pPrior ) p
162a0 46 69 72 73 74 20 3d 20 70 46 69 72 73 74 2d 3e  First = pFirst->
162b0 70 50 72 69 6f 72 3b 0a 20 20 20 20 67 65 6e 65  pPrior;.    gene
162c0 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  rateColumnNames(
162d0 70 50 61 72 73 65 2c 20 30 2c 20 70 46 69 72 73  pParse, 0, pFirs
162e0 74 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a  t->pEList);.  }.
162f0 0a 20 20 2f 2a 20 52 65 61 73 73 65 6d 62 6c 79  .  /* Reassembly
16300 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75   the compound qu
16310 65 72 79 20 73 6f 20 74 68 61 74 20 69 74 20 77  ery so that it w
16320 69 6c 6c 20 62 65 20 66 72 65 65 64 20 63 6f 72  ill be freed cor
16330 72 65 63 74 6c 79 0a 20 20 2a 2a 20 62 79 20 74  rectly.  ** by t
16340 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  he calling funct
16350 69 6f 6e 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ion */.  if( p->
16360 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 73 71  pPrior ){.    sq
16370 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
16380 65 28 64 62 2c 20 70 2d 3e 70 50 72 69 6f 72 29  e(db, p->pPrior)
16390 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 50 72 69 6f  ;.  }.  p->pPrio
163a0 72 20 3d 20 70 50 72 69 6f 72 3b 0a 0a 20 20 2f  r = pPrior;..  /
163b0 2a 2a 2a 20 54 42 44 3a 20 20 49 6e 73 65 72 74  *** TBD:  Insert
163c0 20 73 75 62 72 6f 75 74 69 6e 65 20 63 61 6c 6c   subroutine call
163d0 73 20 74 6f 20 63 6c 6f 73 65 20 63 75 72 73 6f  s to close curso
163e0 72 73 20 6f 6e 20 69 6e 63 6f 6d 70 6c 65 74 65  rs on incomplete
163f0 0a 20 20 2a 2a 2a 2a 20 73 75 62 71 75 65 72 69  .  **** subqueri
16400 65 73 20 2a 2a 2a 2a 2f 0a 20 20 65 78 70 6c 61  es ****/.  expla
16410 69 6e 43 6f 6d 70 6f 73 69 74 65 28 70 50 61 72  inComposite(pPar
16420 73 65 2c 20 70 2d 3e 6f 70 2c 20 69 53 75 62 31  se, p->op, iSub1
16430 2c 20 69 53 75 62 32 2c 20 30 29 3b 0a 20 20 72  , iSub2, 0);.  r
16440 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
16450 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21  .}.#endif..#if !
16460 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
16470 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c  MIT_SUBQUERY) ||
16480 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
16490 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 2f 2a 20 46  _OMIT_VIEW)./* F
164a0 6f 72 77 61 72 64 20 44 65 63 6c 61 72 61 74 69  orward Declarati
164b0 6f 6e 73 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ons */.static vo
164c0 69 64 20 73 75 62 73 74 45 78 70 72 4c 69 73 74  id substExprList
164d0 28 73 71 6c 69 74 65 33 2a 2c 20 45 78 70 72 4c  (sqlite3*, ExprL
164e0 69 73 74 2a 2c 20 69 6e 74 2c 20 45 78 70 72 4c  ist*, int, ExprL
164f0 69 73 74 2a 29 3b 0a 73 74 61 74 69 63 20 76 6f  ist*);.static vo
16500 69 64 20 73 75 62 73 74 53 65 6c 65 63 74 28 73  id substSelect(s
16510 71 6c 69 74 65 33 2a 2c 20 53 65 6c 65 63 74 20  qlite3*, Select 
16520 2a 2c 20 69 6e 74 2c 20 45 78 70 72 4c 69 73 74  *, int, ExprList
16530 20 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 53 63 61 6e   *);../*.** Scan
16540 20 74 68 72 6f 75 67 68 20 74 68 65 20 65 78 70   through the exp
16550 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 20  ression pExpr.  
16560 52 65 70 6c 61 63 65 20 65 76 65 72 79 20 72 65  Replace every re
16570 66 65 72 65 6e 63 65 20 74 6f 0a 2a 2a 20 61 20  ference to.** a 
16580 63 6f 6c 75 6d 6e 20 69 6e 20 74 61 62 6c 65 20  column in table 
16590 6e 75 6d 62 65 72 20 69 54 61 62 6c 65 20 77 69  number iTable wi
165a0 74 68 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  th a copy of the
165b0 20 69 43 6f 6c 75 6d 6e 2d 74 68 0a 2a 2a 20 65   iColumn-th.** e
165c0 6e 74 72 79 20 69 6e 20 70 45 4c 69 73 74 2e 20  ntry in pEList. 
165d0 20 28 42 75 74 20 6c 65 61 76 65 20 72 65 66 65   (But leave refe
165e0 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 52 4f  rences to the RO
165f0 57 49 44 20 63 6f 6c 75 6d 6e 20 0a 2a 2a 20 75  WID column .** u
16600 6e 63 68 61 6e 67 65 64 2e 29 0a 2a 2a 0a 2a 2a  nchanged.).**.**
16610 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
16620 20 70 61 72 74 20 6f 66 20 74 68 65 20 66 6c 61   part of the fla
16630 74 74 65 6e 69 6e 67 20 70 72 6f 63 65 64 75 72  ttening procedur
16640 65 2e 20 20 41 20 73 75 62 71 75 65 72 79 0a 2a  e.  A subquery.*
16650 2a 20 77 68 6f 73 65 20 72 65 73 75 6c 74 20 73  * whose result s
16660 65 74 20 69 73 20 64 65 66 69 6e 65 64 20 62 79  et is defined by
16670 20 70 45 4c 69 73 74 20 61 70 70 65 61 72 73 20   pEList appears 
16680 61 73 20 65 6e 74 72 79 20 69 6e 20 74 68 65 0a  as entry in the.
16690 2a 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  ** FROM clause o
166a0 66 20 61 20 53 45 4c 45 43 54 20 73 75 63 68 20  f a SELECT such 
166b0 74 68 61 74 20 74 68 65 20 56 44 42 45 20 63 75  that the VDBE cu
166c0 72 73 6f 72 20 61 73 73 69 67 6e 65 64 20 74 6f  rsor assigned to
166d0 20 74 68 61 74 0a 2a 2a 20 46 4f 52 4d 20 63 6c   that.** FORM cl
166e0 61 75 73 65 20 65 6e 74 72 79 20 69 73 20 69 54  ause entry is iT
166f0 61 62 6c 65 2e 20 20 54 68 69 73 20 72 6f 75 74  able.  This rout
16700 69 6e 65 20 6d 61 6b 65 20 74 68 65 20 6e 65 63  ine make the nec
16710 65 73 73 61 72 79 20 0a 2a 2a 20 63 68 61 6e 67  essary .** chang
16720 65 73 20 74 6f 20 70 45 78 70 72 20 73 6f 20 74  es to pExpr so t
16730 68 61 74 20 69 74 20 72 65 66 65 72 73 20 64 69  hat it refers di
16740 72 65 63 74 6c 79 20 74 6f 20 74 68 65 20 73 6f  rectly to the so
16750 75 72 63 65 20 74 61 62 6c 65 0a 2a 2a 20 6f 66  urce table.** of
16760 20 74 68 65 20 73 75 62 71 75 65 72 79 20 72 61   the subquery ra
16770 74 68 65 72 20 74 68 65 20 72 65 73 75 6c 74 20  ther the result 
16780 73 65 74 20 6f 66 20 74 68 65 20 73 75 62 71 75  set of the subqu
16790 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 45  ery..*/.static E
167a0 78 70 72 20 2a 73 75 62 73 74 45 78 70 72 28 0a  xpr *substExpr(.
167b0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
167c0 20 20 20 20 20 20 2f 2a 20 52 65 70 6f 72 74 20        /* Report 
167d0 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20 74 6f  malloc errors to
167e0 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e   this connection
167f0 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70   */.  Expr *pExp
16800 72 2c 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70  r,        /* Exp
16810 72 20 69 6e 20 77 68 69 63 68 20 73 75 62 73 74  r in which subst
16820 69 74 75 74 69 6f 6e 20 6f 63 63 75 72 73 20 2a  itution occurs *
16830 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20  /.  int iTable, 
16840 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
16850 20 74 6f 20 62 65 20 73 75 62 73 74 69 74 75 74   to be substitut
16860 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  ed */.  ExprList
16870 20 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a 20 53   *pEList    /* S
16880 75 62 73 74 69 74 75 74 65 20 65 78 70 72 65 73  ubstitute expres
16890 73 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 69 66  sions */.){.  if
168a0 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74  ( pExpr==0 ) ret
168b0 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 45 78  urn 0;.  if( pEx
168c0 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  pr->op==TK_COLUM
168d0 4e 20 26 26 20 70 45 78 70 72 2d 3e 69 54 61 62  N && pExpr->iTab
168e0 6c 65 3d 3d 69 54 61 62 6c 65 20 29 7b 0a 20 20  le==iTable ){.  
168f0 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f    if( pExpr->iCo
16900 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20  lumn<0 ){.      
16910 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 4e  pExpr->op = TK_N
16920 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ULL;.    }else{.
16930 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77        Expr *pNew
16940 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
16950 70 45 4c 69 73 74 21 3d 30 20 26 26 20 70 45 78  pEList!=0 && pEx
16960 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 45 4c 69  pr->iColumn<pELi
16970 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20  st->nExpr );.   
16980 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
16990 2d 3e 70 4c 65 66 74 3d 3d 30 20 26 26 20 70 45  ->pLeft==0 && pE
169a0 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29  xpr->pRight==0 )
169b0 3b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73  ;.      pNew = s
169c0 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
169d0 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 70 45 78 70  , pEList->a[pExp
169e0 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 70 45 78 70  r->iColumn].pExp
169f0 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  r, 0);.      sql
16a00 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
16a10 62 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20  b, pExpr);.     
16a20 20 70 45 78 70 72 20 3d 20 70 4e 65 77 3b 0a 20   pExpr = pNew;. 
16a30 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
16a40 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d    pExpr->pLeft =
16a50 20 73 75 62 73 74 45 78 70 72 28 64 62 2c 20 70   substExpr(db, p
16a60 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 69 54 61  Expr->pLeft, iTa
16a70 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ble, pEList);.  
16a80 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20    pExpr->pRight 
16a90 3d 20 73 75 62 73 74 45 78 70 72 28 64 62 2c 20  = substExpr(db, 
16aa0 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 69  pExpr->pRight, i
16ab0 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a  Table, pEList);.
16ac0 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50      if( ExprHasP
16ad0 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
16ae0 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a  P_xIsSelect) ){.
16af0 20 20 20 20 20 20 73 75 62 73 74 53 65 6c 65 63        substSelec
16b00 74 28 64 62 2c 20 70 45 78 70 72 2d 3e 78 2e 70  t(db, pExpr->x.p
16b10 53 65 6c 65 63 74 2c 20 69 54 61 62 6c 65 2c 20  Select, iTable, 
16b20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 7d 65 6c  pEList);.    }el
16b30 73 65 7b 0a 20 20 20 20 20 20 73 75 62 73 74 45  se{.      substE
16b40 78 70 72 4c 69 73 74 28 64 62 2c 20 70 45 78 70  xprList(db, pExp
16b50 72 2d 3e 78 2e 70 4c 69 73 74 2c 20 69 54 61 62  r->x.pList, iTab
16b60 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20  le, pEList);.   
16b70 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
16b80 70 45 78 70 72 3b 0a 7d 0a 73 74 61 74 69 63 20  pExpr;.}.static 
16b90 76 6f 69 64 20 73 75 62 73 74 45 78 70 72 4c 69  void substExprLi
16ba0 73 74 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  st(.  sqlite3 *d
16bb0 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  b,         /* Re
16bc0 70 6f 72 74 20 6d 61 6c 6c 6f 63 20 65 72 72 6f  port malloc erro
16bd0 72 73 20 68 65 72 65 20 2a 2f 0a 20 20 45 78 70  rs here */.  Exp
16be0 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20  rList *pList,   
16bf0 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 73 63 61    /* List to sca
16c00 6e 20 61 6e 64 20 69 6e 20 77 68 69 63 68 20 74  n and in which t
16c10 6f 20 6d 61 6b 65 20 73 75 62 73 74 69 74 75 74  o make substitut
16c20 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  es */.  int iTab
16c30 6c 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  le,          /* 
16c40 54 61 62 6c 65 20 74 6f 20 62 65 20 73 75 62 73  Table to be subs
16c50 74 69 74 75 74 65 64 20 2a 2f 0a 20 20 45 78 70  tituted */.  Exp
16c60 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20  rList *pEList   
16c70 20 20 2f 2a 20 53 75 62 73 74 69 74 75 74 65 20    /* Substitute 
16c80 76 61 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20 20 69  values */.){.  i
16c90 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73  nt i;.  if( pLis
16ca0 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  t==0 ) return;. 
16cb0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73   for(i=0; i<pLis
16cc0 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
16cd0 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e      pList->a[i].
16ce0 70 45 78 70 72 20 3d 20 73 75 62 73 74 45 78 70  pExpr = substExp
16cf0 72 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61 5b 69  r(db, pList->a[i
16d00 5d 2e 70 45 78 70 72 2c 20 69 54 61 62 6c 65 2c  ].pExpr, iTable,
16d10 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a   pEList);.  }.}.
16d20 73 74 61 74 69 63 20 76 6f 69 64 20 73 75 62 73  static void subs
16d30 74 53 65 6c 65 63 74 28 0a 20 20 73 71 6c 69 74  tSelect(.  sqlit
16d40 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
16d50 2f 2a 20 52 65 70 6f 72 74 20 6d 61 6c 6c 6f 63  /* Report malloc
16d60 20 65 72 72 6f 72 73 20 68 65 72 65 20 2a 2f 0a   errors here */.
16d70 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
16d80 20 20 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54         /* SELECT
16d90 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 77 68   statement in wh
16da0 69 63 68 20 74 6f 20 6d 61 6b 65 20 73 75 62 73  ich to make subs
16db0 74 69 74 75 74 69 6f 6e 73 20 2a 2f 0a 20 20 69  titutions */.  i
16dc0 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20  nt iTable,      
16dd0 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20      /* Table to 
16de0 62 65 20 72 65 70 6c 61 63 65 64 20 2a 2f 0a 20  be replaced */. 
16df0 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
16e00 74 20 20 20 20 20 2f 2a 20 53 75 62 73 74 69 74  t     /* Substit
16e10 75 74 65 20 76 61 6c 75 65 73 20 2a 2f 0a 29 7b  ute values */.){
16e20 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
16e30 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  ;.  struct SrcLi
16e40 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
16e50 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 21    int i;.  if( !
16e60 70 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 75  p ) return;.  su
16e70 62 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20  bstExprList(db, 
16e80 70 2d 3e 70 45 4c 69 73 74 2c 20 69 54 61 62 6c  p->pEList, iTabl
16e90 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 73 75  e, pEList);.  su
16ea0 62 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20  bstExprList(db, 
16eb0 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 69 54 61  p->pGroupBy, iTa
16ec0 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ble, pEList);.  
16ed0 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 64 62  substExprList(db
16ee0 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 69  , p->pOrderBy, i
16ef0 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a  Table, pEList);.
16f00 20 20 70 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73    p->pHaving = s
16f10 75 62 73 74 45 78 70 72 28 64 62 2c 20 70 2d 3e  ubstExpr(db, p->
16f20 70 48 61 76 69 6e 67 2c 20 69 54 61 62 6c 65 2c  pHaving, iTable,
16f30 20 70 45 4c 69 73 74 29 3b 0a 20 20 70 2d 3e 70   pEList);.  p->p
16f40 57 68 65 72 65 20 3d 20 73 75 62 73 74 45 78 70  Where = substExp
16f50 72 28 64 62 2c 20 70 2d 3e 70 57 68 65 72 65 2c  r(db, p->pWhere,
16f60 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
16f70 3b 0a 20 20 73 75 62 73 74 53 65 6c 65 63 74 28  ;.  substSelect(
16f80 64 62 2c 20 70 2d 3e 70 50 72 69 6f 72 2c 20 69  db, p->pPrior, i
16f90 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a  Table, pEList);.
16fa0 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63    pSrc = p->pSrc
16fb0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72 63  ;.  assert( pSrc
16fc0 20 29 3b 20 20 2f 2a 20 45 76 65 6e 20 66 6f 72   );  /* Even for
16fd0 20 28 53 45 4c 45 43 54 20 31 29 20 77 65 20 68   (SELECT 1) we h
16fe0 61 76 65 3a 20 70 53 72 63 21 3d 30 20 62 75 74  ave: pSrc!=0 but
16ff0 20 70 53 72 63 2d 3e 6e 53 72 63 3d 3d 30 20 2a   pSrc->nSrc==0 *
17000 2f 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70  /.  if( ALWAYS(p
17010 53 72 63 29 20 29 7b 0a 20 20 20 20 66 6f 72 28  Src) ){.    for(
17020 69 3d 70 53 72 63 2d 3e 6e 53 72 63 2c 20 70 49  i=pSrc->nSrc, pI
17030 74 65 6d 3d 70 53 72 63 2d 3e 61 3b 20 69 3e 30  tem=pSrc->a; i>0
17040 3b 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i--, pItem++){
17050 0a 20 20 20 20 20 20 73 75 62 73 74 53 65 6c 65  .      substSele
17060 63 74 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70 53  ct(db, pItem->pS
17070 65 6c 65 63 74 2c 20 69 54 61 62 6c 65 2c 20 70  elect, iTable, p
17080 45 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20  EList);.    }.  
17090 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64  }.}.#endif /* !d
170a0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
170b0 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20  IT_SUBQUERY) || 
170c0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
170d0 4f 4d 49 54 5f 56 49 45 57 29 20 2a 2f 0a 0a 23  OMIT_VIEW) */..#
170e0 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
170f0 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
17100 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
17110 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a  LITE_OMIT_VIEW).
17120 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
17130 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20 66  ne attempts to f
17140 6c 61 74 74 65 6e 20 73 75 62 71 75 65 72 69 65  latten subquerie
17150 73 20 61 73 20 61 20 70 65 72 66 6f 72 6d 61 6e  s as a performan
17160 63 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e  ce optimization.
17170 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
17180 20 72 65 74 75 72 6e 73 20 31 20 69 66 20 69 74   returns 1 if it
17190 20 6d 61 6b 65 73 20 63 68 61 6e 67 65 73 20 61   makes changes a
171a0 6e 64 20 30 20 69 66 20 6e 6f 20 66 6c 61 74 74  nd 0 if no flatt
171b0 65 6e 69 6e 67 20 6f 63 63 75 72 73 2e 0a 2a 2a  ening occurs..**
171c0 0a 2a 2a 20 54 6f 20 75 6e 64 65 72 73 74 61 6e  .** To understan
171d0 64 20 74 68 65 20 63 6f 6e 63 65 70 74 20 6f 66  d the concept of
171e0 20 66 6c 61 74 74 65 6e 69 6e 67 2c 20 63 6f 6e   flattening, con
171f0 73 69 64 65 72 20 74 68 65 20 66 6f 6c 6c 6f 77  sider the follow
17200 69 6e 67 0a 2a 2a 20 71 75 65 72 79 3a 0a 2a 2a  ing.** query:.**
17210 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61  .**     SELECT a
17220 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 78 2b   FROM (SELECT x+
17230 79 20 41 53 20 61 20 46 52 4f 4d 20 74 31 20 57  y AS a FROM t1 W
17240 48 45 52 45 20 7a 3c 31 30 30 29 20 57 48 45 52  HERE z<100) WHER
17250 45 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20  E a>5.**.** The 
17260 64 65 66 61 75 6c 74 20 77 61 79 20 6f 66 20 69  default way of i
17270 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68 69 73  mplementing this
17280 20 71 75 65 72 79 20 69 73 20 74 6f 20 65 78 65   query is to exe
17290 63 75 74 65 20 74 68 65 0a 2a 2a 20 73 75 62 71  cute the.** subq
172a0 75 65 72 79 20 66 69 72 73 74 20 61 6e 64 20 73  uery first and s
172b0 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73  tore the results
172c0 20 69 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20   in a temporary 
172d0 74 61 62 6c 65 2c 20 74 68 65 6e 0a 2a 2a 20 72  table, then.** r
172e0 75 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  un the outer que
172f0 72 79 20 6f 6e 20 74 68 61 74 20 74 65 6d 70 6f  ry on that tempo
17300 72 61 72 79 20 74 61 62 6c 65 2e 20 20 54 68 69  rary table.  Thi
17310 73 20 72 65 71 75 69 72 65 73 20 74 77 6f 0a 2a  s requires two.*
17320 2a 20 70 61 73 73 65 73 20 6f 76 65 72 20 74 68  * passes over th
17330 65 20 64 61 74 61 2e 20 20 46 75 72 74 68 65 72  e data.  Further
17340 6d 6f 72 65 2c 20 62 65 63 61 75 73 65 20 74 68  more, because th
17350 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  e temporary tabl
17360 65 0a 2a 2a 20 68 61 73 20 6e 6f 20 69 6e 64 69  e.** has no indi
17370 63 65 73 2c 20 74 68 65 20 57 48 45 52 45 20 63  ces, the WHERE c
17380 6c 61 75 73 65 20 6f 6e 20 74 68 65 20 6f 75 74  lause on the out
17390 65 72 20 71 75 65 72 79 20 63 61 6e 6e 6f 74 20  er query cannot 
173a0 62 65 0a 2a 2a 20 6f 70 74 69 6d 69 7a 65 64 2e  be.** optimized.
173b0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
173c0 69 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20  ine attempts to 
173d0 72 65 77 72 69 74 65 20 71 75 65 72 69 65 73 20  rewrite queries 
173e0 73 75 63 68 20 61 73 20 74 68 65 20 61 62 6f 76  such as the abov
173f0 65 20 69 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e 67  e into.** a sing
17400 6c 65 20 66 6c 61 74 20 73 65 6c 65 63 74 2c 20  le flat select, 
17410 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a  like this:.**.**
17420 20 20 20 20 20 53 45 4c 45 43 54 20 78 2b 79 20       SELECT x+y 
17430 41 53 20 61 20 46 52 4f 4d 20 74 31 20 57 48 45  AS a FROM t1 WHE
17440 52 45 20 7a 3c 31 30 30 20 41 4e 44 20 61 3e 35  RE z<100 AND a>5
17450 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20  .**.** The code 
17460 67 65 6e 65 72 61 74 65 64 20 66 6f 72 20 74 68  generated for th
17470 69 73 20 73 69 6d 70 69 66 69 63 61 74 69 6f 6e  is simpification
17480 20 67 69 76 65 73 20 74 68 65 20 73 61 6d 65 20   gives the same 
17490 72 65 73 75 6c 74 0a 2a 2a 20 62 75 74 20 6f 6e  result.** but on
174a0 6c 79 20 68 61 73 20 74 6f 20 73 63 61 6e 20 74  ly has to scan t
174b0 68 65 20 64 61 74 61 20 6f 6e 63 65 2e 20 20 41  he data once.  A
174c0 6e 64 20 62 65 63 61 75 73 65 20 69 6e 64 69 63  nd because indic
174d0 65 73 20 6d 69 67 68 74 20 0a 2a 2a 20 65 78 69  es might .** exi
174e0 73 74 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20  st on the table 
174f0 74 31 2c 20 61 20 63 6f 6d 70 6c 65 74 65 20 73  t1, a complete s
17500 63 61 6e 20 6f 66 20 74 68 65 20 64 61 74 61 20  can of the data 
17510 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61 76 6f 69  might be.** avoi
17520 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6c 61 74 74  ded..**.** Flatt
17530 65 6e 69 6e 67 20 69 73 20 6f 6e 6c 79 20 61 74  ening is only at
17540 74 65 6d 70 74 65 64 20 69 66 20 61 6c 6c 20 6f  tempted if all o
17550 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
17560 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20  are true:.**.** 
17570 20 20 28 31 29 20 20 54 68 65 20 73 75 62 71 75    (1)  The subqu
17580 65 72 79 20 61 6e 64 20 74 68 65 20 6f 75 74 65  ery and the oute
17590 72 20 71 75 65 72 79 20 64 6f 20 6e 6f 74 20 62  r query do not b
175a0 6f 74 68 20 75 73 65 20 61 67 67 72 65 67 61 74  oth use aggregat
175b0 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 32 29 20  es..**.**   (2) 
175c0 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73   The subquery is
175d0 20 6e 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74   not an aggregat
175e0 65 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71  e or the outer q
175f0 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f  uery is not a jo
17600 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 33 29 20  in..**.**   (3) 
17610 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73   The subquery is
17620 20 6e 6f 74 20 74 68 65 20 72 69 67 68 74 20 6f   not the right o
17630 70 65 72 61 6e 64 20 6f 66 20 61 20 6c 65 66 74  perand of a left
17640 20 6f 75 74 65 72 20 6a 6f 69 6e 0a 2a 2a 20 20   outer join.**  
17650 20 20 20 20 20 20 28 4f 72 69 67 69 6e 61 6c 6c        (Originall
17660 79 20 74 69 63 6b 65 74 20 23 33 30 36 2e 20 20  y ticket #306.  
17670 53 74 72 65 6e 67 74 68 65 6e 65 64 20 62 79 20  Strengthened by 
17680 74 69 63 6b 65 74 20 23 33 33 30 30 29 0a 2a 2a  ticket #3300).**
17690 0a 2a 2a 20 20 20 28 34 29 20 20 54 68 65 20 73  .**   (4)  The s
176a0 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 44  ubquery is not D
176b0 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20 20  ISTINCT..**.**  
176c0 28 2a 2a 29 20 20 41 74 20 6f 6e 65 20 70 6f 69  (**)  At one poi
176d0 6e 74 20 72 65 73 74 72 69 63 74 69 6f 6e 73 20  nt restrictions 
176e0 28 34 29 20 61 6e 64 20 28 35 29 20 64 65 66 69  (4) and (5) defi
176f0 6e 65 64 20 61 20 73 75 62 73 65 74 20 6f 66 20  ned a subset of 
17700 44 49 53 54 49 4e 43 54 0a 2a 2a 20 20 20 20 20  DISTINCT.**     
17710 20 20 20 73 75 62 2d 71 75 65 72 69 65 73 20 74     sub-queries t
17720 68 61 74 20 77 65 72 65 20 65 78 63 6c 75 64 65  hat were exclude
17730 64 20 66 72 6f 6d 20 74 68 69 73 20 6f 70 74 69  d from this opti
17740 6d 69 7a 61 74 69 6f 6e 2e 20 52 65 73 74 72 69  mization. Restri
17750 63 74 69 6f 6e 20 0a 2a 2a 20 20 20 20 20 20 20  ction .**       
17760 20 28 34 29 20 68 61 73 20 73 69 6e 63 65 20 62   (4) has since b
17770 65 65 6e 20 65 78 70 61 6e 64 65 64 20 74 6f 20  een expanded to 
17780 65 78 63 6c 75 64 65 20 61 6c 6c 20 44 49 53 54  exclude all DIST
17790 49 4e 43 54 20 73 75 62 71 75 65 72 69 65 73 2e  INCT subqueries.
177a0 0a 2a 2a 0a 2a 2a 20 20 20 28 36 29 20 20 54 68  .**.**   (6)  Th
177b0 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20  e subquery does 
177c0 6e 6f 74 20 75 73 65 20 61 67 67 72 65 67 61 74  not use aggregat
177d0 65 73 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20  es or the outer 
177e0 71 75 65 72 79 20 69 73 20 6e 6f 74 0a 2a 2a 20  query is not.** 
177f0 20 20 20 20 20 20 20 44 49 53 54 49 4e 43 54 2e         DISTINCT.
17800 0a 2a 2a 0a 2a 2a 20 20 20 28 37 29 20 20 54 68  .**.**   (7)  Th
17810 65 20 73 75 62 71 75 65 72 79 20 68 61 73 20 61  e subquery has a
17820 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 54   FROM clause.  T
17830 4f 44 4f 3a 20 20 46 6f 72 20 73 75 62 71 75 65  ODO:  For subque
17840 72 69 65 73 20 77 69 74 68 6f 75 74 0a 2a 2a 20  ries without.** 
17850 20 20 20 20 20 20 20 41 20 46 52 4f 4d 20 63 6c         A FROM cl
17860 61 75 73 65 2c 20 63 6f 6e 73 69 64 65 72 20 61  ause, consider a
17870 64 64 69 6e 67 20 61 20 46 52 4f 4d 20 63 6c 6f  dding a FROM clo
17880 73 65 20 77 69 74 68 20 74 68 65 20 73 70 65 63  se with the spec
17890 69 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 74 61  ial.**        ta
178a0 62 6c 65 20 73 71 6c 69 74 65 5f 6f 6e 63 65 20  ble sqlite_once 
178b0 74 68 61 74 20 63 6f 6e 73 69 73 74 73 20 6f 66  that consists of
178c0 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 63 6f   a single row co
178d0 6e 74 61 69 6e 69 6e 67 20 61 0a 2a 2a 20 20 20  ntaining a.**   
178e0 20 20 20 20 20 73 69 6e 67 6c 65 20 4e 55 4c 4c       single NULL
178f0 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 38 29 20 20 54  ..**.**   (8)  T
17900 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73  he subquery does
17910 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 20 6f   not use LIMIT o
17920 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  r the outer quer
17930 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e  y is not a join.
17940 0a 2a 2a 0a 2a 2a 20 20 20 28 39 29 20 20 54 68  .**.**   (9)  Th
17950 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20  e subquery does 
17960 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 20 6f 72  not use LIMIT or
17970 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
17980 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 0a 2a 2a   does not use.**
17990 20 20 20 20 20 20 20 20 61 67 67 72 65 67 61 74          aggregat
179a0 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 30 29 20  es..**.**  (10) 
179b0 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f   The subquery do
179c0 65 73 20 6e 6f 74 20 75 73 65 20 61 67 67 72 65  es not use aggre
179d0 67 61 74 65 73 20 6f 72 20 74 68 65 20 6f 75 74  gates or the out
179e0 65 72 20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f  er query does no
179f0 74 0a 2a 2a 20 20 20 20 20 20 20 20 75 73 65 20  t.**        use 
17a00 4c 49 4d 49 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31  LIMIT..**.**  (1
17a10 31 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  1)  The subquery
17a20 20 61 6e 64 20 74 68 65 20 6f 75 74 65 72 20 71   and the outer q
17a30 75 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68  uery do not both
17a40 20 68 61 76 65 20 4f 52 44 45 52 20 42 59 20 63   have ORDER BY c
17a50 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28  lauses..**.**  (
17a60 2a 2a 29 20 20 4e 6f 74 20 69 6d 70 6c 65 6d 65  **)  Not impleme
17a70 6e 74 65 64 2e 20 20 53 75 62 73 75 6d 65 64 20  nted.  Subsumed 
17a80 69 6e 74 6f 20 72 65 73 74 72 69 63 74 69 6f 6e  into restriction
17a90 20 28 33 29 2e 20 20 57 61 73 20 70 72 65 76 69   (3).  Was previ
17aa0 6f 75 73 6c 79 0a 2a 2a 20 20 20 20 20 20 20 20  ously.**        
17ab0 61 20 73 65 70 61 72 61 74 65 20 72 65 73 74 72  a separate restr
17ac0 69 63 74 69 6f 6e 20 64 65 72 69 76 69 6e 67 20  iction deriving 
17ad0 66 72 6f 6d 20 74 69 63 6b 65 74 20 23 33 35 30  from ticket #350
17ae0 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 33 29 20 20 54  ..**.**  (13)  T
17af0 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20  he subquery and 
17b00 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 20 6e  outer query do n
17b10 6f 74 20 62 6f 74 68 20 75 73 65 20 4c 49 4d 49  ot both use LIMI
17b20 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 34 29 20 20  T..**.**  (14)  
17b30 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65  The subquery doe
17b40 73 20 6e 6f 74 20 75 73 65 20 4f 46 46 53 45 54  s not use OFFSET
17b50 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 35 29 20 20 54  ..**.**  (15)  T
17b60 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69  he outer query i
17b70 73 20 6e 6f 74 20 70 61 72 74 20 6f 66 20 61 20  s not part of a 
17b80 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20  compound select 
17b90 6f 72 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  or the.**       
17ba0 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e   subquery does n
17bb0 6f 74 20 68 61 76 65 20 61 20 4c 49 4d 49 54 20  ot have a LIMIT 
17bc0 63 6c 61 75 73 65 2e 0a 2a 2a 20 20 20 20 20 20  clause..**      
17bd0 20 20 28 53 65 65 20 74 69 63 6b 65 74 20 23 32    (See ticket #2
17be0 33 33 39 20 61 6e 64 20 74 69 63 6b 65 74 20 5b  339 and ticket [
17bf0 30 32 61 38 65 38 31 64 34 34 5d 29 2e 0a 2a 2a  02a8e81d44])..**
17c00 0a 2a 2a 20 20 28 31 36 29 20 20 54 68 65 20 6f  .**  (16)  The o
17c10 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f  uter query is no
17c20 74 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 6f  t an aggregate o
17c30 72 20 74 68 65 20 73 75 62 71 75 65 72 79 20 64  r the subquery d
17c40 6f 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 6e 6f  oes.**        no
17c50 74 20 63 6f 6e 74 61 69 6e 20 4f 52 44 45 52 20  t contain ORDER 
17c60 42 59 2e 20 20 28 54 69 63 6b 65 74 20 23 32 39  BY.  (Ticket #29
17c70 34 32 29 20 20 54 68 69 73 20 75 73 65 64 20 74  42)  This used t
17c80 6f 20 6e 6f 74 20 6d 61 74 74 65 72 0a 2a 2a 20  o not matter.** 
17c90 20 20 20 20 20 20 20 75 6e 74 69 6c 20 77 65 20         until we 
17ca0 69 6e 74 72 6f 64 75 63 65 64 20 74 68 65 20 67  introduced the g
17cb0 72 6f 75 70 5f 63 6f 6e 63 61 74 28 29 20 66 75  roup_concat() fu
17cc0 6e 63 74 69 6f 6e 2e 20 20 0a 2a 2a 0a 2a 2a 20  nction.  .**.** 
17cd0 20 28 31 37 29 20 20 54 68 65 20 73 75 62 2d 71   (17)  The sub-q
17ce0 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20 63 6f  uery is not a co
17cf0 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20 6f  mpound select, o
17d00 72 20 69 74 20 69 73 20 61 20 55 4e 49 4f 4e 20  r it is a UNION 
17d10 41 4c 4c 20 0a 2a 2a 20 20 20 20 20 20 20 20 63  ALL .**        c
17d20 6f 6d 70 6f 75 6e 64 20 63 6c 61 75 73 65 20 6d  ompound clause m
17d30 61 64 65 20 75 70 20 65 6e 74 69 72 65 6c 79 20  ade up entirely 
17d40 6f 66 20 6e 6f 6e 2d 61 67 67 72 65 67 61 74 65  of non-aggregate
17d50 20 71 75 65 72 69 65 73 2c 20 61 6e 64 20 0a 2a   queries, and .*
17d60 2a 20 20 20 20 20 20 20 20 74 68 65 20 70 61 72  *        the par
17d70 65 6e 74 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a  ent query:.**.**
17d80 20 20 20 20 20 20 20 20 20 20 2a 20 69 73 20 6e            * is n
17d90 6f 74 20 69 74 73 65 6c 66 20 70 61 72 74 20 6f  ot itself part o
17da0 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c  f a compound sel
17db0 65 63 74 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20  ect,.**         
17dc0 20 2a 20 69 73 20 6e 6f 74 20 61 6e 20 61 67 67   * is not an agg
17dd0 72 65 67 61 74 65 20 6f 72 20 44 49 53 54 49 4e  regate or DISTIN
17de0 43 54 20 71 75 65 72 79 2c 20 61 6e 64 0a 2a 2a  CT query, and.**
17df0 20 20 20 20 20 20 20 20 20 20 2a 20 69 73 20 6e            * is n
17e00 6f 74 20 61 20 6a 6f 69 6e 0a 2a 2a 0a 2a 2a 20  ot a join.**.** 
17e10 20 20 20 20 20 20 20 54 68 65 20 70 61 72 65 6e         The paren
17e20 74 20 61 6e 64 20 73 75 62 2d 71 75 65 72 79 20  t and sub-query 
17e30 6d 61 79 20 63 6f 6e 74 61 69 6e 20 57 48 45 52  may contain WHER
17e40 45 20 63 6c 61 75 73 65 73 2e 20 53 75 62 6a 65  E clauses. Subje
17e50 63 74 20 74 6f 0a 2a 2a 20 20 20 20 20 20 20 20  ct to.**        
17e60 72 75 6c 65 73 20 28 31 31 29 2c 20 28 31 33 29  rules (11), (13)
17e70 20 61 6e 64 20 28 31 34 29 2c 20 74 68 65 79 20   and (14), they 
17e80 6d 61 79 20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e  may also contain
17e90 20 4f 52 44 45 52 20 42 59 2c 0a 2a 2a 20 20 20   ORDER BY,.**   
17ea0 20 20 20 20 20 4c 49 4d 49 54 20 61 6e 64 20 4f       LIMIT and O
17eb0 46 46 53 45 54 20 63 6c 61 75 73 65 73 2e 20 20  FFSET clauses.  
17ec0 54 68 65 20 73 75 62 71 75 65 72 79 20 63 61 6e  The subquery can
17ed0 6e 6f 74 20 75 73 65 20 61 6e 79 20 63 6f 6d 70  not use any comp
17ee0 6f 75 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 6f  ound.**        o
17ef0 70 65 72 61 74 6f 72 20 6f 74 68 65 72 20 74 68  perator other th
17f00 61 6e 20 55 4e 49 4f 4e 20 41 4c 4c 20 62 65 63  an UNION ALL bec
17f10 61 75 73 65 20 61 6c 6c 20 74 68 65 20 6f 74 68  ause all the oth
17f20 65 72 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20  er compound.**  
17f30 20 20 20 20 20 20 6f 70 65 72 61 74 6f 72 73 20        operators 
17f40 68 61 76 65 20 61 6e 20 69 6d 70 6c 69 65 64 20  have an implied 
17f50 44 49 53 54 49 4e 43 54 20 77 68 69 63 68 20 69  DISTINCT which i
17f60 73 20 64 69 73 61 6c 6c 6f 77 65 64 20 62 79 0a  s disallowed by.
17f70 2a 2a 20 20 20 20 20 20 20 20 72 65 73 74 72 69  **        restri
17f80 63 74 69 6f 6e 20 28 34 29 2e 0a 2a 2a 0a 2a 2a  ction (4)..**.**
17f90 20 20 20 20 20 20 20 20 41 6c 73 6f 2c 20 65 61          Also, ea
17fa0 63 68 20 63 6f 6d 70 6f 6e 65 6e 74 20 6f 66 20  ch component of 
17fb0 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 6d 75  the sub-query mu
17fc0 73 74 20 72 65 74 75 72 6e 20 74 68 65 20 73 61  st return the sa
17fd0 6d 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 20 20 20  me number.**    
17fe0 20 20 20 20 6f 66 20 72 65 73 75 6c 74 20 63 6f      of result co
17ff0 6c 75 6d 6e 73 2e 20 54 68 69 73 20 69 73 20 61  lumns. This is a
18000 63 74 75 61 6c 6c 79 20 61 20 72 65 71 75 69 72  ctually a requir
18010 65 6d 65 6e 74 20 66 6f 72 20 61 6e 79 20 63 6f  ement for any co
18020 6d 70 6f 75 6e 64 0a 2a 2a 20 20 20 20 20 20 20  mpound.**       
18030 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
18040 74 2c 20 62 75 74 20 61 6c 6c 20 74 68 65 20 63  t, but all the c
18050 6f 64 65 20 68 65 72 65 20 64 6f 65 73 20 69 73  ode here does is
18060 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
18070 6e 6f 0a 2a 2a 20 20 20 20 20 20 20 20 73 75 63  no.**        suc
18080 68 20 28 69 6c 6c 65 67 61 6c 29 20 73 75 62 2d  h (illegal) sub-
18090 71 75 65 72 79 20 69 73 20 66 6c 61 74 74 65 6e  query is flatten
180a0 65 64 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77  ed. The caller w
180b0 69 6c 6c 20 64 65 74 65 63 74 20 74 68 65 0a 2a  ill detect the.*
180c0 2a 20 20 20 20 20 20 20 20 73 79 6e 74 61 78 20  *        syntax 
180d0 65 72 72 6f 72 20 61 6e 64 20 72 65 74 75 72 6e  error and return
180e0 20 61 20 64 65 74 61 69 6c 65 64 20 6d 65 73 73   a detailed mess
180f0 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 38 29  age..**.**  (18)
18100 20 20 49 66 20 74 68 65 20 73 75 62 2d 71 75 65    If the sub-que
18110 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64  ry is a compound
18120 20 73 65 6c 65 63 74 2c 20 74 68 65 6e 20 61 6c   select, then al
18130 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65 0a 2a  l terms of the.*
18140 2a 20 20 20 20 20 20 20 20 4f 52 44 45 52 20 62  *        ORDER b
18150 79 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  y clause of the 
18160 70 61 72 65 6e 74 20 6d 75 73 74 20 62 65 20 73  parent must be s
18170 69 6d 70 6c 65 20 72 65 66 65 72 65 6e 63 65 73  imple references
18180 20 74 6f 20 0a 2a 2a 20 20 20 20 20 20 20 20 63   to .**        c
18190 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 73 75  olumns of the su
181a0 62 2d 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 20  b-query..**.**  
181b0 28 31 39 29 20 20 54 68 65 20 73 75 62 71 75 65  (19)  The subque
181c0 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  ry does not use 
181d0 4c 49 4d 49 54 20 6f 72 20 74 68 65 20 6f 75 74  LIMIT or the out
181e0 65 72 20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f  er query does no
181f0 74 0a 2a 2a 20 20 20 20 20 20 20 20 68 61 76 65  t.**        have
18200 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e   a WHERE clause.
18210 0a 2a 2a 0a 2a 2a 20 20 28 32 30 29 20 20 49 66  .**.**  (20)  If
18220 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 69   the sub-query i
18230 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c  s a compound sel
18240 65 63 74 2c 20 74 68 65 6e 20 69 74 20 6d 75 73  ect, then it mus
18250 74 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 20 20 20  t not use.**    
18260 20 20 20 20 61 6e 20 4f 52 44 45 52 20 42 59 20      an ORDER BY 
18270 63 6c 61 75 73 65 2e 20 20 54 69 63 6b 65 74 20  clause.  Ticket 
18280 23 33 37 37 33 2e 20 20 57 65 20 63 6f 75 6c 64  #3773.  We could
18290 20 72 65 6c 61 78 20 74 68 69 73 20 63 6f 6e 73   relax this cons
182a0 74 72 61 69 6e 74 0a 2a 2a 20 20 20 20 20 20 20  traint.**       
182b0 20 73 6f 6d 65 77 68 61 74 20 62 79 20 73 61 79   somewhat by say
182c0 69 6e 67 20 74 68 61 74 20 74 68 65 20 74 65 72  ing that the ter
182d0 6d 73 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20  ms of the ORDER 
182e0 42 59 20 63 6c 61 75 73 65 20 6d 75 73 74 0a 2a  BY clause must.*
182f0 2a 20 20 20 20 20 20 20 20 61 70 70 65 61 72 20  *        appear 
18300 61 73 20 75 6e 6d 6f 64 69 66 69 65 64 20 72 65  as unmodified re
18310 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  sult columns in 
18320 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e  the outer query.
18330 20 20 42 75 74 20 77 65 0a 2a 2a 20 20 20 20 20    But we.**     
18340 20 20 20 68 61 76 65 20 6f 74 68 65 72 20 6f 70     have other op
18350 74 69 6d 69 7a 61 74 69 6f 6e 73 20 69 6e 20 6d  timizations in m
18360 69 6e 64 20 74 6f 20 64 65 61 6c 20 77 69 74 68  ind to deal with
18370 20 74 68 61 74 20 63 61 73 65 2e 0a 2a 2a 0a 2a   that case..**.*
18380 2a 20 20 28 32 31 29 20 20 54 68 65 20 73 75 62  *  (21)  The sub
18390 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75  query does not u
183a0 73 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65 20  se LIMIT or the 
183b0 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e  outer query is n
183c0 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 44 49 53  ot.**        DIS
183d0 54 49 4e 43 54 2e 20 20 28 53 65 65 20 74 69 63  TINCT.  (See tic
183e0 6b 65 74 20 5b 37 35 32 65 31 36 34 36 66 63 5d  ket [752e1646fc]
183f0 29 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 69 73  )..**.** In this
18400 20 72 6f 75 74 69 6e 65 2c 20 74 68 65 20 22 70   routine, the "p
18410 22 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61  " parameter is a
18420 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
18430 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 2a 2a 20  outer query..** 
18440 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  The subquery is 
18450 70 2d 3e 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d  p->pSrc->a[iFrom
18460 5d 2e 20 20 69 73 41 67 67 20 69 73 20 74 72 75  ].  isAgg is tru
18470 65 20 69 66 20 74 68 65 20 6f 75 74 65 72 20 71  e if the outer q
18480 75 65 72 79 0a 2a 2a 20 75 73 65 73 20 61 67 67  uery.** uses agg
18490 72 65 67 61 74 65 73 20 61 6e 64 20 73 75 62 71  regates and subq
184a0 75 65 72 79 49 73 41 67 67 20 69 73 20 74 72 75  ueryIsAgg is tru
184b0 65 20 69 66 20 74 68 65 20 73 75 62 71 75 65 72  e if the subquer
184c0 79 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65  y uses aggregate
184d0 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 66 6c 61 74  s..**.** If flat
184e0 74 65 6e 69 6e 67 20 69 73 20 6e 6f 74 20 61 74  tening is not at
184f0 74 65 6d 70 74 65 64 2c 20 74 68 69 73 20 72 6f  tempted, this ro
18500 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
18510 20 61 6e 64 20 72 65 74 75 72 6e 73 20 30 2e 0a   and returns 0..
18520 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e 69 6e 67  ** If flattening
18530 20 69 73 20 61 74 74 65 6d 70 74 65 64 20 74 68   is attempted th
18540 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
18550 6e 73 20 31 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20  ns 1..**.** All 
18560 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  of the expressio
18570 6e 20 61 6e 61 6c 79 73 69 73 20 6d 75 73 74 20  n analysis must 
18580 6f 63 63 75 72 20 6f 6e 20 62 6f 74 68 20 74 68  occur on both th
18590 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 61 6e  e outer query an
185a0 64 0a 2a 2a 20 74 68 65 20 73 75 62 71 75 65 72  d.** the subquer
185b0 79 20 62 65 66 6f 72 65 20 74 68 69 73 20 72 6f  y before this ro
185c0 75 74 69 6e 65 20 72 75 6e 73 2e 0a 2a 2f 0a 73  utine runs..*/.s
185d0 74 61 74 69 63 20 69 6e 74 20 66 6c 61 74 74 65  tatic int flatte
185e0 6e 53 75 62 71 75 65 72 79 28 0a 20 20 50 61 72  nSubquery(.  Par
185f0 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
18600 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
18610 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
18620 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 2f   *p,           /
18630 2a 20 54 68 65 20 70 61 72 65 6e 74 20 6f 72 20  * The parent or 
18640 6f 75 74 65 72 20 53 45 4c 45 43 54 20 73 74 61  outer SELECT sta
18650 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  tement */.  int 
18660 69 46 72 6f 6d 2c 20 20 20 20 20 20 20 20 20 20  iFrom,          
18670 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70 2d 3e   /* Index in p->
18680 70 53 72 63 2d 3e 61 5b 5d 20 6f 66 20 74 68 65  pSrc->a[] of the
18690 20 69 6e 6e 65 72 20 73 75 62 71 75 65 72 79 20   inner subquery 
186a0 2a 2f 0a 20 20 69 6e 74 20 69 73 41 67 67 2c 20  */.  int isAgg, 
186b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
186c0 65 20 69 66 20 6f 75 74 65 72 20 53 45 4c 45 43  e if outer SELEC
186d0 54 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65  T uses aggregate
186e0 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20   functions */.  
186f0 69 6e 74 20 73 75 62 71 75 65 72 79 49 73 41 67  int subqueryIsAg
18700 67 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20  g    /* True if 
18710 74 68 65 20 73 75 62 71 75 65 72 79 20 75 73 65  the subquery use
18720 73 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  s aggregate func
18730 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f  tions */.){.  co
18740 6e 73 74 20 63 68 61 72 20 2a 7a 53 61 76 65 64  nst char *zSaved
18750 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70 50  AuthContext = pP
18760 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65  arse->zAuthConte
18770 78 74 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 50  xt;.  Select *pP
18780 61 72 65 6e 74 3b 0a 20 20 53 65 6c 65 63 74 20  arent;.  Select 
18790 2a 70 53 75 62 3b 20 20 20 20 20 20 20 2f 2a 20  *pSub;       /* 
187a0 54 68 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20  The inner query 
187b0 6f 72 20 22 73 75 62 71 75 65 72 79 22 20 2a 2f  or "subquery" */
187c0 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 31  .  Select *pSub1
187d0 3b 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65  ;      /* Pointe
187e0 72 20 74 6f 20 74 68 65 20 72 69 67 68 74 6d 6f  r to the rightmo
187f0 73 74 20 73 65 6c 65 63 74 20 69 6e 20 73 75 62  st select in sub
18800 2d 71 75 65 72 79 20 2a 2f 0a 20 20 53 72 63 4c  -query */.  SrcL
18810 69 73 74 20 2a 70 53 72 63 3b 20 20 20 20 20 20  ist *pSrc;      
18820 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* The FROM clau
18830 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20  se of the outer 
18840 71 75 65 72 79 20 2a 2f 0a 20 20 53 72 63 4c 69  query */.  SrcLi
18850 73 74 20 2a 70 53 75 62 53 72 63 3b 20 20 20 2f  st *pSubSrc;   /
18860 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * The FROM claus
18870 65 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72  e of the subquer
18880 79 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  y */.  ExprList 
18890 2a 70 4c 69 73 74 3b 20 20 20 20 2f 2a 20 54 68  *pList;    /* Th
188a0 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20  e result set of 
188b0 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
188c0 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 65 6e 74  */.  int iParent
188d0 3b 20 20 20 20 20 20 20 20 2f 2a 20 56 44 42 45  ;        /* VDBE
188e0 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f   cursor number o
188f0 66 20 74 68 65 20 70 53 75 62 20 72 65 73 75 6c  f the pSub resul
18900 74 20 73 65 74 20 74 65 6d 70 20 74 61 62 6c 65  t set temp table
18910 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   */.  int i;    
18920 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
18930 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 45  p counter */.  E
18940 78 70 72 20 2a 70 57 68 65 72 65 3b 20 20 20 20  xpr *pWhere;    
18950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18960 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
18970 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  use */.  struct 
18980 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53  SrcList_item *pS
18990 75 62 69 74 65 6d 3b 20 20 20 2f 2a 20 54 68 65  ubitem;   /* The
189a0 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 73   subquery */.  s
189b0 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
189c0 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 43  rse->db;..  /* C
189d0 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 66  heck to see if f
189e0 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 70 65 72  lattening is per
189f0 6d 69 74 74 65 64 2e 20 20 52 65 74 75 72 6e 20  mitted.  Return 
18a00 30 20 69 66 20 6e 6f 74 2e 0a 20 20 2a 2f 0a 20  0 if not..  */. 
18a10 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b   assert( p!=0 );
18a20 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 50  .  assert( p->pP
18a30 72 69 6f 72 3d 3d 30 20 29 3b 20 20 2f 2a 20 55  rior==0 );  /* U
18a40 6e 61 62 6c 65 20 74 6f 20 66 6c 61 74 74 65 6e  nable to flatten
18a50 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 69 65   compound querie
18a60 73 20 2a 2f 0a 20 20 69 66 28 20 4f 70 74 69 6d  s */.  if( Optim
18a70 69 7a 61 74 69 6f 6e 44 69 73 61 62 6c 65 64 28  izationDisabled(
18a80 64 62 2c 20 53 51 4c 49 54 45 5f 51 75 65 72 79  db, SQLITE_Query
18a90 46 6c 61 74 74 65 6e 65 72 29 20 29 20 72 65 74  Flattener) ) ret
18aa0 75 72 6e 20 30 3b 0a 20 20 70 53 72 63 20 3d 20  urn 0;.  pSrc = 
18ab0 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72  p->pSrc;.  asser
18ac0 74 28 20 70 53 72 63 20 26 26 20 69 46 72 6f 6d  t( pSrc && iFrom
18ad0 3e 3d 30 20 26 26 20 69 46 72 6f 6d 3c 70 53 72  >=0 && iFrom<pSr
18ae0 63 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 70 53 75  c->nSrc );.  pSu
18af0 62 69 74 65 6d 20 3d 20 26 70 53 72 63 2d 3e 61  bitem = &pSrc->a
18b00 5b 69 46 72 6f 6d 5d 3b 0a 20 20 69 50 61 72 65  [iFrom];.  iPare
18b10 6e 74 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 69  nt = pSubitem->i
18b20 43 75 72 73 6f 72 3b 0a 20 20 70 53 75 62 20 3d  Cursor;.  pSub =
18b30 20 70 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65   pSubitem->pSele
18b40 63 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53  ct;.  assert( pS
18b50 75 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 69  ub!=0 );.  if( i
18b60 73 41 67 67 20 26 26 20 73 75 62 71 75 65 72 79  sAgg && subquery
18b70 49 73 41 67 67 20 29 20 72 65 74 75 72 6e 20 30  IsAgg ) return 0
18b80 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
18b90 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
18ba0 20 28 31 29 20 20 2a 2f 0a 20 20 69 66 28 20 73   (1)  */.  if( s
18bb0 75 62 71 75 65 72 79 49 73 41 67 67 20 26 26 20  ubqueryIsAgg && 
18bc0 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20 29 20 72  pSrc->nSrc>1 ) r
18bd0 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
18be0 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
18bf0 20 28 32 29 20 20 2a 2f 0a 20 20 70 53 75 62 53   (2)  */.  pSubS
18c00 72 63 20 3d 20 70 53 75 62 2d 3e 70 53 72 63 3b  rc = pSub->pSrc;
18c10 0a 20 20 61 73 73 65 72 74 28 20 70 53 75 62 53  .  assert( pSubS
18c20 72 63 20 29 3b 0a 20 20 2f 2a 20 50 72 69 6f 72  rc );.  /* Prior
18c30 20 74 6f 20 76 65 72 73 69 6f 6e 20 33 2e 31 2e   to version 3.1.
18c40 32 2c 20 77 68 65 6e 20 4c 49 4d 49 54 20 61 6e  2, when LIMIT an
18c50 64 20 4f 46 46 53 45 54 20 68 61 64 20 74 6f 20  d OFFSET had to 
18c60 62 65 20 73 69 6d 70 6c 65 20 63 6f 6e 73 74 61  be simple consta
18c70 6e 74 73 2c 0a 20 20 2a 2a 20 6e 6f 74 20 61 72  nts,.  ** not ar
18c80 62 69 74 72 61 72 79 20 65 78 70 72 65 73 73 73  bitrary expresss
18c90 69 6f 6e 73 2c 20 77 65 20 61 6c 6c 6f 77 65 64  ions, we allowed
18ca0 20 73 6f 6d 65 20 63 6f 6d 62 69 6e 69 6e 67 20   some combining 
18cb0 6f 66 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46  of LIMIT and OFF
18cc0 53 45 54 0a 20 20 2a 2a 20 62 65 63 61 75 73 65  SET.  ** because
18cd0 20 74 68 65 79 20 63 6f 75 6c 64 20 62 65 20 63   they could be c
18ce0 6f 6d 70 75 74 65 64 20 61 74 20 63 6f 6d 70 69  omputed at compi
18cf0 6c 65 2d 74 69 6d 65 2e 20 20 42 75 74 20 77 68  le-time.  But wh
18d00 65 6e 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46  en LIMIT and OFF
18d10 53 45 54 0a 20 20 2a 2a 20 62 65 63 61 6d 65 20  SET.  ** became 
18d20 61 72 62 69 74 72 61 72 79 20 65 78 70 72 65 73  arbitrary expres
18d30 73 69 6f 6e 73 2c 20 77 65 20 77 65 72 65 20 66  sions, we were f
18d40 6f 72 63 65 64 20 74 6f 20 61 64 64 20 72 65 73  orced to add res
18d50 74 72 69 63 74 69 6f 6e 73 20 28 31 33 29 0a 20  trictions (13). 
18d60 20 2a 2a 20 61 6e 64 20 28 31 34 29 2e 20 2a 2f   ** and (14). */
18d70 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69  .  if( pSub->pLi
18d80 6d 69 74 20 26 26 20 70 2d 3e 70 4c 69 6d 69 74  mit && p->pLimit
18d90 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
18da0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
18db0 74 72 69 63 74 69 6f 6e 20 28 31 33 29 20 2a 2f  triction (13) */
18dc0 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4f 66  .  if( pSub->pOf
18dd0 66 73 65 74 20 29 20 72 65 74 75 72 6e 20 30 3b  fset ) return 0;
18de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18df0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
18e00 74 72 69 63 74 69 6f 6e 20 28 31 34 29 20 2a 2f  triction (14) */
18e10 0a 20 20 69 66 28 20 70 2d 3e 70 52 69 67 68 74  .  if( p->pRight
18e20 6d 6f 73 74 20 26 26 20 70 53 75 62 2d 3e 70 4c  most && pSub->pL
18e30 69 6d 69 74 20 29 7b 0a 20 20 20 20 72 65 74 75  imit ){.    retu
18e40 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
18e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18e70 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
18e80 28 31 35 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66  (15) */.  }.  if
18e90 28 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63 3d  ( pSubSrc->nSrc=
18ea0 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  =0 ) return 0;  
18eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18ec0 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
18ed0 69 6f 6e 20 28 37 29 20 20 2a 2f 0a 20 20 69 66  ion (7)  */.  if
18ee0 28 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73  ( pSub->selFlags
18ef0 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 20 29   & SF_Distinct )
18f00 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
18f10 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
18f20 69 6f 6e 20 28 35 29 20 20 2a 2f 0a 20 20 69 66  ion (5)  */.  if
18f30 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26  ( pSub->pLimit &
18f40 26 20 28 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20  & (pSrc->nSrc>1 
18f50 7c 7c 20 69 73 41 67 67 29 20 29 7b 0a 20 20 20  || isAgg) ){.   
18f60 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20    return 0;     
18f70 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
18f80 6f 6e 73 20 28 38 29 28 39 29 20 2a 2f 0a 20 20  ons (8)(9) */.  
18f90 7d 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46  }.  if( (p->selF
18fa0 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e  lags & SF_Distin
18fb0 63 74 29 21 3d 30 20 26 26 20 73 75 62 71 75 65  ct)!=0 && subque
18fc0 72 79 49 73 41 67 67 20 29 7b 0a 20 20 20 20 20  ryIsAgg ){.     
18fd0 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
18fe0 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
18ff0 20 28 36 29 20 20 2a 2f 0a 20 20 7d 0a 20 20 69   (6)  */.  }.  i
19000 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 26  f( p->pOrderBy &
19010 26 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79  & pSub->pOrderBy
19020 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20   ){.     return 
19030 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
19040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19050 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19060 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 31 29  Restriction (11)
19070 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 69 73   */.  }.  if( is
19080 41 67 67 20 26 26 20 70 53 75 62 2d 3e 70 4f 72  Agg && pSub->pOr
19090 64 65 72 42 79 20 29 20 72 65 74 75 72 6e 20 30  derBy ) return 0
190a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
190b0 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
190c0 28 31 36 29 20 2a 2f 0a 20 20 69 66 28 20 70 53  (16) */.  if( pS
190d0 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 70 2d  ub->pLimit && p-
190e0 3e 70 57 68 65 72 65 20 29 20 72 65 74 75 72 6e  >pWhere ) return
190f0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
19100 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
19110 28 31 39 29 20 2a 2f 0a 20 20 69 66 28 20 70 53  (19) */.  if( pS
19120 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 28 70  ub->pLimit && (p
19130 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
19140 44 69 73 74 69 6e 63 74 29 21 3d 30 20 29 7b 0a  Distinct)!=0 ){.
19150 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20       return 0;  
19160 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
19170 63 74 69 6f 6e 20 28 32 31 29 20 2a 2f 0a 20 20  ction (21) */.  
19180 7d 0a 0a 20 20 2f 2a 20 4f 42 53 4f 4c 45 54 45  }..  /* OBSOLETE
19190 20 43 4f 4d 4d 45 4e 54 20 31 3a 0a 20 20 2a 2a   COMMENT 1:.  **
191a0 20 52 65 73 74 72 69 63 74 69 6f 6e 20 33 3a 20   Restriction 3: 
191b0 20 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79   If the subquery
191c0 20 69 73 20 61 20 6a 6f 69 6e 2c 20 6d 61 6b 65   is a join, make
191d0 20 73 75 72 65 20 74 68 65 20 73 75 62 71 75 65   sure the subque
191e0 72 79 20 69 73 20 0a 20 20 2a 2a 20 6e 6f 74 20  ry is .  ** not 
191f0 75 73 65 64 20 61 73 20 74 68 65 20 72 69 67 68  used as the righ
19200 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 6e 20  t operand of an 
19210 6f 75 74 65 72 20 6a 6f 69 6e 2e 20 20 45 78 61  outer join.  Exa
19220 6d 70 6c 65 73 20 6f 66 20 77 68 79 20 74 68 69  mples of why thi
19230 73 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 6c  s.  ** is not al
19240 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  lowed:.  **.  **
19250 20 20 20 20 20 20 20 20 20 74 31 20 4c 45 46 54           t1 LEFT
19260 20 4f 55 54 45 52 20 4a 4f 49 4e 20 28 74 32 20   OUTER JOIN (t2 
19270 4a 4f 49 4e 20 74 33 29 0a 20 20 2a 2a 0a 20 20  JOIN t3).  **.  
19280 2a 2a 20 49 66 20 77 65 20 66 6c 61 74 74 65 6e  ** If we flatten
19290 20 74 68 65 20 61 62 6f 76 65 2c 20 77 65 20 77   the above, we w
192a0 6f 75 6c 64 20 67 65 74 0a 20 20 2a 2a 0a 20 20  ould get.  **.  
192b0 2a 2a 20 20 20 20 20 20 20 20 20 28 74 31 20 4c  **         (t1 L
192c0 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 74  EFT OUTER JOIN t
192d0 32 29 20 4a 4f 49 4e 20 74 33 0a 20 20 2a 2a 0a  2) JOIN t3.  **.
192e0 20 20 2a 2a 20 77 68 69 63 68 20 69 73 20 6e 6f    ** which is no
192f0 74 20 61 74 20 61 6c 6c 20 74 68 65 20 73 61 6d  t at all the sam
19300 65 20 74 68 69 6e 67 2e 0a 20 20 2a 2a 0a 20 20  e thing..  **.  
19310 2a 2a 20 4f 42 53 4f 4c 45 54 45 20 43 4f 4d 4d  ** OBSOLETE COMM
19320 45 4e 54 20 32 3a 0a 20 20 2a 2a 20 52 65 73 74  ENT 2:.  ** Rest
19330 72 69 63 74 69 6f 6e 20 31 32 3a 20 20 49 66 20  riction 12:  If 
19340 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  the subquery is 
19350 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e  the right operan
19360 64 20 6f 66 20 61 20 6c 65 66 74 20 6f 75 74 65  d of a left oute
19370 72 0a 20 20 2a 2a 20 6a 6f 69 6e 2c 20 6d 61 6b  r.  ** join, mak
19380 65 20 73 75 72 65 20 74 68 65 20 73 75 62 71 75  e sure the subqu
19390 65 72 79 20 68 61 73 20 6e 6f 20 57 48 45 52 45  ery has no WHERE
193a0 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 20 41 6e   clause..  ** An
193b0 20 65 78 61 6d 70 6c 65 73 20 6f 66 20 77 68 79   examples of why
193c0 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61 6c 6c   this is not all
193d0 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  owed:.  **.  ** 
193e0 20 20 20 20 20 20 20 20 74 31 20 4c 45 46 54 20          t1 LEFT 
193f0 4f 55 54 45 52 20 4a 4f 49 4e 20 28 53 45 4c 45  OUTER JOIN (SELE
19400 43 54 20 2a 20 46 52 4f 4d 20 74 32 20 57 48 45  CT * FROM t2 WHE
19410 52 45 20 74 32 2e 78 3e 30 29 0a 20 20 2a 2a 0a  RE t2.x>0).  **.
19420 20 20 2a 2a 20 49 66 20 77 65 20 66 6c 61 74 74    ** If we flatt
19430 65 6e 20 74 68 65 20 61 62 6f 76 65 2c 20 77 65  en the above, we
19440 20 77 6f 75 6c 64 20 67 65 74 0a 20 20 2a 2a 0a   would get.  **.
19450 20 20 2a 2a 20 20 20 20 20 20 20 20 20 28 74 31    **         (t1
19460 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e   LEFT OUTER JOIN
19470 20 74 32 29 20 57 48 45 52 45 20 74 32 2e 78 3e   t2) WHERE t2.x>
19480 30 0a 20 20 2a 2a 0a 20 20 2a 2a 20 42 75 74 20  0.  **.  ** But 
19490 74 68 65 20 74 32 2e 78 3e 30 20 74 65 73 74 20  the t2.x>0 test 
194a0 77 69 6c 6c 20 61 6c 77 61 79 73 20 66 61 69 6c  will always fail
194b0 20 6f 6e 20 61 20 4e 55 4c 4c 20 72 6f 77 20 6f   on a NULL row o
194c0 66 20 74 32 2c 20 77 68 69 63 68 0a 20 20 2a 2a  f t2, which.  **
194d0 20 65 66 66 65 63 74 69 76 65 6c 79 20 63 6f 6e   effectively con
194e0 76 65 72 74 73 20 74 68 65 20 4f 55 54 45 52 20  verts the OUTER 
194f0 4a 4f 49 4e 20 69 6e 74 6f 20 61 6e 20 49 4e 4e  JOIN into an INN
19500 45 52 20 4a 4f 49 4e 2e 0a 20 20 2a 2a 0a 20 20  ER JOIN..  **.  
19510 2a 2a 20 54 48 49 53 20 4f 56 45 52 52 49 44 45  ** THIS OVERRIDE
19520 53 20 4f 42 53 4f 4c 45 54 45 20 43 4f 4d 4d 45  S OBSOLETE COMME
19530 4e 54 53 20 31 20 41 4e 44 20 32 20 41 42 4f 56  NTS 1 AND 2 ABOV
19540 45 3a 0a 20 20 2a 2a 20 54 69 63 6b 65 74 20 23  E:.  ** Ticket #
19550 33 33 30 30 20 73 68 6f 77 73 20 74 68 61 74 20  3300 shows that 
19560 66 6c 61 74 74 65 6e 69 6e 67 20 74 68 65 20 72  flattening the r
19570 69 67 68 74 20 74 65 72 6d 20 6f 66 20 61 20 4c  ight term of a L
19580 45 46 54 20 4a 4f 49 4e 0a 20 20 2a 2a 20 69 73  EFT JOIN.  ** is
19590 20 66 72 61 75 67 68 74 20 77 69 74 68 20 64 61   fraught with da
195a0 6e 67 65 72 2e 20 20 42 65 73 74 20 74 6f 20 61  nger.  Best to a
195b0 76 6f 69 64 20 74 68 65 20 77 68 6f 6c 65 20 74  void the whole t
195c0 68 69 6e 67 2e 20 20 49 66 20 74 68 65 0a 20 20  hing.  If the.  
195d0 2a 2a 20 73 75 62 71 75 65 72 79 20 69 73 20 74  ** subquery is t
195e0 68 65 20 72 69 67 68 74 20 74 65 72 6d 20 6f 66  he right term of
195f0 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2c 20 74 68   a LEFT JOIN, th
19600 65 6e 20 64 6f 20 6e 6f 74 20 66 6c 61 74 74 65  en do not flatte
19610 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70  n..  */.  if( (p
19620 53 75 62 69 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70  Subitem->jointyp
19630 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30  e & JT_OUTER)!=0
19640 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
19650 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 74  ;.  }..  /* Rest
19660 72 69 63 74 69 6f 6e 20 31 37 3a 20 49 66 20 74  riction 17: If t
19670 68 65 20 73 75 62 2d 71 75 65 72 79 20 69 73 20  he sub-query is 
19680 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43  a compound SELEC
19690 54 2c 20 74 68 65 6e 20 69 74 20 6d 75 73 74 0a  T, then it must.
196a0 20 20 2a 2a 20 75 73 65 20 6f 6e 6c 79 20 74 68    ** use only th
196b0 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72  e UNION ALL oper
196c0 61 74 6f 72 2e 20 41 6e 64 20 6e 6f 6e 65 20 6f  ator. And none o
196d0 66 20 74 68 65 20 73 69 6d 70 6c 65 20 73 65 6c  f the simple sel
196e0 65 63 74 20 71 75 65 72 69 65 73 0a 20 20 2a 2a  ect queries.  **
196f0 20 74 68 61 74 20 6d 61 6b 65 20 75 70 20 74 68   that make up th
19700 65 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43  e compound SELEC
19710 54 20 61 72 65 20 61 6c 6c 6f 77 65 64 20 74 6f  T are allowed to
19720 20 62 65 20 61 67 67 72 65 67 61 74 65 20 6f 72   be aggregate or
19730 20 64 69 73 74 69 6e 63 74 0a 20 20 2a 2a 20 71   distinct.  ** q
19740 75 65 72 69 65 73 2e 0a 20 20 2a 2f 0a 20 20 69  ueries..  */.  i
19750 66 28 20 70 53 75 62 2d 3e 70 50 72 69 6f 72 20  f( pSub->pPrior 
19760 29 7b 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d  ){.    if( pSub-
19770 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  >pOrderBy ){.   
19780 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a     return 0;  /*
19790 20 52 65 73 74 72 69 63 74 69 6f 6e 20 32 30 20   Restriction 20 
197a0 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  */.    }.    if(
197b0 20 69 73 41 67 67 20 7c 7c 20 28 70 2d 3e 73 65   isAgg || (p->se
197c0 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74  lFlags & SF_Dist
197d0 69 6e 63 74 29 21 3d 30 20 7c 7c 20 70 53 72 63  inct)!=0 || pSrc
197e0 2d 3e 6e 53 72 63 21 3d 31 20 29 7b 0a 20 20 20  ->nSrc!=1 ){.   
197f0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
19800 20 7d 0a 20 20 20 20 66 6f 72 28 70 53 75 62 31   }.    for(pSub1
19810 3d 70 53 75 62 3b 20 70 53 75 62 31 3b 20 70 53  =pSub; pSub1; pS
19820 75 62 31 3d 70 53 75 62 31 2d 3e 70 50 72 69 6f  ub1=pSub1->pPrio
19830 72 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61  r){.      testca
19840 73 65 28 20 28 70 53 75 62 31 2d 3e 73 65 6c 46  se( (pSub1->selF
19850 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69  lags & (SF_Disti
19860 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65  nct|SF_Aggregate
19870 29 29 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74 20  ))==SF_Distinct 
19880 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
19890 65 28 20 28 70 53 75 62 31 2d 3e 73 65 6c 46 6c  e( (pSub1->selFl
198a0 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e  ags & (SF_Distin
198b0 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29  ct|SF_Aggregate)
198c0 29 3d 3d 53 46 5f 41 67 67 72 65 67 61 74 65 20  )==SF_Aggregate 
198d0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
198e0 20 70 53 75 62 2d 3e 70 53 72 63 21 3d 30 20 29   pSub->pSrc!=0 )
198f0 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 53 75  ;.      if( (pSu
19900 62 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28  b1->selFlags & (
19910 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41  SF_Distinct|SF_A
19920 67 67 72 65 67 61 74 65 29 29 21 3d 30 0a 20 20  ggregate))!=0.  
19930 20 20 20 20 20 7c 7c 20 28 70 53 75 62 31 2d 3e       || (pSub1->
19940 70 50 72 69 6f 72 20 26 26 20 70 53 75 62 31 2d  pPrior && pSub1-
19950 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29 20 0a 20 20  >op!=TK_ALL) .  
19960 20 20 20 20 20 7c 7c 20 70 53 75 62 31 2d 3e 70       || pSub1->p
19970 53 72 63 2d 3e 6e 53 72 63 3c 31 0a 20 20 20 20  Src->nSrc<1.    
19980 20 20 20 7c 7c 20 70 53 75 62 2d 3e 70 45 4c 69     || pSub->pELi
19990 73 74 2d 3e 6e 45 78 70 72 21 3d 70 53 75 62 31  st->nExpr!=pSub1
199a0 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 0a  ->pEList->nExpr.
199b0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
199c0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
199d0 20 7d 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   }.      testcas
199e0 65 28 20 70 53 75 62 31 2d 3e 70 53 72 63 2d 3e  e( pSub1->pSrc->
199f0 6e 53 72 63 3e 31 20 29 3b 0a 20 20 20 20 7d 0a  nSrc>1 );.    }.
19a00 0a 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74  .    /* Restrict
19a10 69 6f 6e 20 31 38 2e 20 2a 2f 0a 20 20 20 20 69  ion 18. */.    i
19a20 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29  f( p->pOrderBy )
19a30 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 69 3b 0a  {.      int ii;.
19a40 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20        for(ii=0; 
19a50 69 69 3c 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e  ii<p->pOrderBy->
19a60 6e 45 78 70 72 3b 20 69 69 2b 2b 29 7b 0a 20 20  nExpr; ii++){.  
19a70 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 72        if( p->pOr
19a80 64 65 72 42 79 2d 3e 61 5b 69 69 5d 2e 69 4f 72  derBy->a[ii].iOr
19a90 64 65 72 42 79 43 6f 6c 3d 3d 30 20 29 20 72 65  derByCol==0 ) re
19aa0 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a  turn 0;.      }.
19ab0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 2a      }.  }..  /**
19ac0 2a 2a 2a 20 49 66 20 77 65 20 72 65 61 63 68 20  *** If we reach 
19ad0 74 68 69 73 20 70 6f 69 6e 74 2c 20 66 6c 61 74  this point, flat
19ae0 74 65 6e 69 6e 67 20 69 73 20 70 65 72 6d 69 74  tening is permit
19af0 74 65 64 2e 20 2a 2a 2a 2a 2a 2f 0a 0a 20 20 2f  ted. *****/..  /
19b00 2a 20 41 75 74 68 6f 72 69 7a 65 20 74 68 65 20  * Authorize the 
19b10 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 70 50  subquery */.  pP
19b20 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65  arse->zAuthConte
19b30 78 74 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 7a  xt = pSubitem->z
19b40 4e 61 6d 65 3b 0a 20 20 54 45 53 54 4f 4e 4c 59  Name;.  TESTONLY
19b50 28 69 20 3d 29 20 73 71 6c 69 74 65 33 41 75 74  (i =) sqlite3Aut
19b60 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
19b70 51 4c 49 54 45 5f 53 45 4c 45 43 54 2c 20 30 2c  QLITE_SELECT, 0,
19b80 20 30 2c 20 30 29 3b 0a 20 20 74 65 73 74 63 61   0, 0);.  testca
19b90 73 65 28 20 69 3d 3d 53 51 4c 49 54 45 5f 44 45  se( i==SQLITE_DE
19ba0 4e 59 20 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e  NY );.  pParse->
19bb0 7a 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 7a  zAuthContext = z
19bc0 53 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74  SavedAuthContext
19bd0 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 73  ;..  /* If the s
19be0 75 62 2d 71 75 65 72 79 20 69 73 20 61 20 63 6f  ub-query is a co
19bf0 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 73 74  mpound SELECT st
19c00 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20 28 62  atement, then (b
19c10 79 20 72 65 73 74 72 69 63 74 69 6f 6e 73 0a 20  y restrictions. 
19c20 20 2a 2a 20 31 37 20 61 6e 64 20 31 38 20 61 62   ** 17 and 18 ab
19c30 6f 76 65 29 20 69 74 20 6d 75 73 74 20 62 65 20  ove) it must be 
19c40 61 20 55 4e 49 4f 4e 20 41 4c 4c 20 61 6e 64 20  a UNION ALL and 
19c50 74 68 65 20 70 61 72 65 6e 74 20 71 75 65 72 79  the parent query
19c60 20 6d 75 73 74 20 0a 20 20 2a 2a 20 62 65 20 6f   must .  ** be o
19c70 66 20 74 68 65 20 66 6f 72 6d 3a 0a 20 20 2a 2a  f the form:.  **
19c80 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  .  **     SELECT
19c90 20 3c 65 78 70 72 2d 6c 69 73 74 3e 20 46 52 4f   <expr-list> FRO
19ca0 4d 20 28 3c 73 75 62 2d 71 75 65 72 79 3e 29 20  M (<sub-query>) 
19cb0 3c 77 68 65 72 65 2d 63 6c 61 75 73 65 3e 20 0a  <where-clause> .
19cc0 20 20 2a 2a 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77    **.  ** follow
19cd0 65 64 20 62 79 20 61 6e 79 20 4f 52 44 45 52 20  ed by any ORDER 
19ce0 42 59 2c 20 4c 49 4d 49 54 20 61 6e 64 2f 6f 72  BY, LIMIT and/or
19cf0 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73 2e   OFFSET clauses.
19d00 20 54 68 69 73 20 62 6c 6f 63 6b 0a 20 20 2a 2a   This block.  **
19d10 20 63 72 65 61 74 65 73 20 4e 2d 31 20 63 6f 70   creates N-1 cop
19d20 69 65 73 20 6f 66 20 74 68 65 20 70 61 72 65 6e  ies of the paren
19d30 74 20 71 75 65 72 79 20 77 69 74 68 6f 75 74 20  t query without 
19d40 61 6e 79 20 4f 52 44 45 52 20 42 59 2c 20 4c 49  any ORDER BY, LI
19d50 4d 49 54 20 6f 72 20 0a 20 20 2a 2a 20 4f 46 46  MIT or .  ** OFF
19d60 53 45 54 20 63 6c 61 75 73 65 73 20 61 6e 64 20  SET clauses and 
19d70 6a 6f 69 6e 73 20 74 68 65 6d 20 74 6f 20 74 68  joins them to th
19d80 65 20 6c 65 66 74 2d 68 61 6e 64 2d 73 69 64 65  e left-hand-side
19d90 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   of the original
19da0 0a 20 20 2a 2a 20 75 73 69 6e 67 20 55 4e 49 4f  .  ** using UNIO
19db0 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72 73 2e  N ALL operators.
19dc0 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 4e 20   In this case N 
19dd0 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
19de0 20 73 69 6d 70 6c 65 0a 20 20 2a 2a 20 73 65 6c   simple.  ** sel
19df0 65 63 74 20 73 74 61 74 65 6d 65 6e 74 73 20 69  ect statements i
19e00 6e 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73  n the compound s
19e10 75 62 2d 71 75 65 72 79 2e 0a 20 20 2a 2a 0a 20  ub-query..  **. 
19e20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20 2a   ** Example:.  *
19e30 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43  *.  **     SELEC
19e40 54 20 61 2b 31 20 46 52 4f 4d 20 28 0a 20 20 2a  T a+1 FROM (.  *
19e50 2a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20  *        SELECT 
19e60 78 20 46 52 4f 4d 20 74 61 62 0a 20 20 2a 2a 20  x FROM tab.  ** 
19e70 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c         UNION ALL
19e80 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 53 45 4c  .  **        SEL
19e90 45 43 54 20 79 20 46 52 4f 4d 20 74 61 62 0a 20  ECT y FROM tab. 
19ea0 20 2a 2a 20 20 20 20 20 20 20 20 55 4e 49 4f 4e   **        UNION
19eb0 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 20 20   ALL.  **       
19ec0 20 53 45 4c 45 43 54 20 61 62 73 28 7a 2a 32 29   SELECT abs(z*2)
19ed0 20 46 52 4f 4d 20 74 61 62 32 0a 20 20 2a 2a 20   FROM tab2.  ** 
19ee0 20 20 20 20 29 20 57 48 45 52 45 20 61 21 3d 35      ) WHERE a!=5
19ef0 20 4f 52 44 45 52 20 42 59 20 31 0a 20 20 2a 2a   ORDER BY 1.  **
19f00 0a 20 20 2a 2a 20 54 72 61 6e 73 66 6f 72 6d 65  .  ** Transforme
19f10 64 20 69 6e 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a  d into:.  **.  *
19f20 2a 20 20 20 20 20 53 45 4c 45 43 54 20 78 2b 31  *     SELECT x+1
19f30 20 46 52 4f 4d 20 74 61 62 20 57 48 45 52 45 20   FROM tab WHERE 
19f40 78 2b 31 21 3d 35 0a 20 20 2a 2a 20 20 20 20 20  x+1!=5.  **     
19f50 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20  UNION ALL.  **  
19f60 20 20 20 53 45 4c 45 43 54 20 79 2b 31 20 46 52     SELECT y+1 FR
19f70 4f 4d 20 74 61 62 20 57 48 45 52 45 20 79 2b 31  OM tab WHERE y+1
19f80 21 3d 35 0a 20 20 2a 2a 20 20 20 20 20 55 4e 49  !=5.  **     UNI
19f90 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20  ON ALL.  **     
19fa0 53 45 4c 45 43 54 20 61 62 73 28 7a 2a 32 29 2b  SELECT abs(z*2)+
19fb0 31 20 46 52 4f 4d 20 74 61 62 32 20 57 48 45 52  1 FROM tab2 WHER
19fc0 45 20 61 62 73 28 7a 2a 32 29 2b 31 21 3d 35 0a  E abs(z*2)+1!=5.
19fd0 20 20 2a 2a 20 20 20 20 20 4f 52 44 45 52 20 42    **     ORDER B
19fe0 59 20 31 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 65  Y 1.  **.  ** We
19ff0 20 63 61 6c 6c 20 74 68 69 73 20 74 68 65 20 22   call this the "
1a000 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65 72  compound-subquer
1a010 79 20 66 6c 61 74 74 65 6e 69 6e 67 22 2e 0a 20  y flattening".. 
1a020 20 2a 2f 0a 20 20 66 6f 72 28 70 53 75 62 3d 70   */.  for(pSub=p
1a030 53 75 62 2d 3e 70 50 72 69 6f 72 3b 20 70 53 75  Sub->pPrior; pSu
1a040 62 3b 20 70 53 75 62 3d 70 53 75 62 2d 3e 70 50  b; pSub=pSub->pP
1a050 72 69 6f 72 29 7b 0a 20 20 20 20 53 65 6c 65 63  rior){.    Selec
1a060 74 20 2a 70 4e 65 77 3b 0a 20 20 20 20 45 78 70  t *pNew;.    Exp
1a070 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20  rList *pOrderBy 
1a080 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20  = p->pOrderBy;. 
1a090 20 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 20     Expr *pLimit 
1a0a0 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20  = p->pLimit;.   
1a0b0 20 45 78 70 72 20 2a 70 4f 66 66 73 65 74 20 3d   Expr *pOffset =
1a0c0 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20   p->pOffset;.   
1a0d0 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72 20   Select *pPrior 
1a0e0 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20  = p->pPrior;.   
1a0f0 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30   p->pOrderBy = 0
1a100 3b 0a 20 20 20 20 70 2d 3e 70 53 72 63 20 3d 20  ;.    p->pSrc = 
1a110 30 3b 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f 72  0;.    p->pPrior
1a120 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 4c 69   = 0;.    p->pLi
1a130 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e  mit = 0;.    p->
1a140 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20  pOffset = 0;.   
1a150 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 53   pNew = sqlite3S
1a160 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 2c 20  electDup(db, p, 
1a170 30 29 3b 0a 20 20 20 20 70 2d 3e 70 4f 66 66 73  0);.    p->pOffs
1a180 65 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a 20 20  et = pOffset;.  
1a190 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c    p->pLimit = pL
1a1a0 69 6d 69 74 3b 0a 20 20 20 20 70 2d 3e 70 4f 72  imit;.    p->pOr
1a1b0 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79  derBy = pOrderBy
1a1c0 3b 0a 20 20 20 20 70 2d 3e 70 53 72 63 20 3d 20  ;.    p->pSrc = 
1a1d0 70 53 72 63 3b 0a 20 20 20 20 70 2d 3e 6f 70 20  pSrc;.    p->op 
1a1e0 3d 20 54 4b 5f 41 4c 4c 3b 0a 20 20 20 20 70 2d  = TK_ALL;.    p-
1a1f0 3e 70 52 69 67 68 74 6d 6f 73 74 20 3d 20 30 3b  >pRightmost = 0;
1a200 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  .    if( pNew==0
1a210 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d   ){.      pNew =
1a220 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 7d 65 6c   pPrior;.    }el
1a230 73 65 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  se{.      pNew->
1a240 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b  pPrior = pPrior;
1a250 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 52 69  .      pNew->pRi
1a260 67 68 74 6d 6f 73 74 20 3d 20 30 3b 0a 20 20 20  ghtmost = 0;.   
1a270 20 7d 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f 72   }.    p->pPrior
1a280 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 69 66 28   = pNew;.    if(
1a290 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
1a2a0 64 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  d ) return 1;.  
1a2b0 7d 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 66 6c  }..  /* Begin fl
1a2c0 61 74 74 65 6e 69 6e 67 20 74 68 65 20 69 46 72  attening the iFr
1a2d0 6f 6d 2d 74 68 20 65 6e 74 72 79 20 6f 66 20 74  om-th entry of t
1a2e0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 0a  he FROM clause .
1a2f0 20 20 2a 2a 20 69 6e 20 74 68 65 20 6f 75 74 65    ** in the oute
1a300 72 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20  r query..  */.  
1a310 70 53 75 62 20 3d 20 70 53 75 62 31 20 3d 20 70  pSub = pSub1 = p
1a320 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74  Subitem->pSelect
1a330 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 74  ;..  /* Delete t
1a340 68 65 20 74 72 61 6e 73 69 65 6e 74 20 74 61 62  he transient tab
1a350 6c 65 20 73 74 72 75 63 74 75 72 65 20 61 73 73  le structure ass
1a360 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
1a370 0a 20 20 2a 2a 20 73 75 62 71 75 65 72 79 0a 20  .  ** subquery. 
1a380 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 44 62 46   */.  sqlite3DbF
1a390 72 65 65 28 64 62 2c 20 70 53 75 62 69 74 65 6d  ree(db, pSubitem
1a3a0 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20  ->zDatabase);.  
1a3b0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
1a3c0 2c 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d  , pSubitem->zNam
1a3d0 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  e);.  sqlite3DbF
1a3e0 72 65 65 28 64 62 2c 20 70 53 75 62 69 74 65 6d  ree(db, pSubitem
1a3f0 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 70 53 75  ->zAlias);.  pSu
1a400 62 69 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65  bitem->zDatabase
1a410 20 3d 20 30 3b 0a 20 20 70 53 75 62 69 74 65 6d   = 0;.  pSubitem
1a420 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 70  ->zName = 0;.  p
1a430 53 75 62 69 74 65 6d 2d 3e 7a 41 6c 69 61 73 20  Subitem->zAlias 
1a440 3d 20 30 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d  = 0;.  pSubitem-
1a450 3e 70 53 65 6c 65 63 74 20 3d 20 30 3b 0a 0a 20  >pSelect = 0;.. 
1a460 20 2f 2a 20 44 65 66 65 72 20 64 65 6c 65 74 69   /* Defer deleti
1a470 6e 67 20 74 68 65 20 54 61 62 6c 65 20 6f 62 6a  ng the Table obj
1a480 65 63 74 20 61 73 73 6f 63 69 61 74 65 64 20 77  ect associated w
1a490 69 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 75 62  ith the.  ** sub
1a4a0 71 75 65 72 79 20 75 6e 74 69 6c 20 63 6f 64 65  query until code
1a4b0 20 67 65 6e 65 72 61 74 69 6f 6e 20 69 73 0a 20   generation is. 
1a4c0 20 2a 2a 20 63 6f 6d 70 6c 65 74 65 2c 20 73 69   ** complete, si
1a4d0 6e 63 65 20 74 68 65 72 65 20 6d 61 79 20 73 74  nce there may st
1a4e0 69 6c 6c 20 65 78 69 73 74 20 45 78 70 72 2e 70  ill exist Expr.p
1a4f0 54 61 62 20 65 6e 74 72 69 65 73 20 74 68 61 74  Tab entries that
1a500 0a 20 20 2a 2a 20 72 65 66 65 72 20 74 6f 20 74  .  ** refer to t
1a510 68 65 20 73 75 62 71 75 65 72 79 20 65 76 65 6e  he subquery even
1a520 20 61 66 74 65 72 20 66 6c 61 74 74 65 6e 69 6e   after flattenin
1a530 67 2e 20 20 54 69 63 6b 65 74 20 23 33 33 34 36  g.  Ticket #3346
1a540 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 70 53 75 62  ..  **.  ** pSub
1a550 69 74 65 6d 2d 3e 70 54 61 62 20 69 73 20 61 6c  item->pTab is al
1a560 77 61 79 73 20 6e 6f 6e 2d 4e 55 4c 4c 20 62 79  ways non-NULL by
1a570 20 74 65 73 74 20 72 65 73 74 72 69 63 74 69 6f   test restrictio
1a580 6e 73 20 61 6e 64 20 74 65 73 74 73 20 61 62 6f  ns and tests abo
1a590 76 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 41  ve..  */.  if( A
1a5a0 4c 57 41 59 53 28 70 53 75 62 69 74 65 6d 2d 3e  LWAYS(pSubitem->
1a5b0 70 54 61 62 21 3d 30 29 20 29 7b 0a 20 20 20 20  pTab!=0) ){.    
1a5c0 54 61 62 6c 65 20 2a 70 54 61 62 54 6f 44 65 6c  Table *pTabToDel
1a5d0 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70 54 61   = pSubitem->pTa
1a5e0 62 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 54  b;.    if( pTabT
1a5f0 6f 44 65 6c 2d 3e 6e 52 65 66 3d 3d 31 20 29 7b  oDel->nRef==1 ){
1a600 0a 20 20 20 20 20 20 50 61 72 73 65 20 2a 70 54  .      Parse *pT
1a610 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74 65  oplevel = sqlite
1a620 33 50 61 72 73 65 54 6f 70 6c 65 76 65 6c 28 70  3ParseToplevel(p
1a630 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 70 54  Parse);.      pT
1a640 61 62 54 6f 44 65 6c 2d 3e 70 4e 65 78 74 5a 6f  abToDel->pNextZo
1a650 6d 62 69 65 20 3d 20 70 54 6f 70 6c 65 76 65 6c  mbie = pToplevel
1a660 2d 3e 70 5a 6f 6d 62 69 65 54 61 62 3b 0a 20 20  ->pZombieTab;.  
1a670 20 20 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 70      pToplevel->p
1a680 5a 6f 6d 62 69 65 54 61 62 20 3d 20 70 54 61 62  ZombieTab = pTab
1a690 54 6f 44 65 6c 3b 0a 20 20 20 20 7d 65 6c 73 65  ToDel;.    }else
1a6a0 7b 0a 20 20 20 20 20 20 70 54 61 62 54 6f 44 65  {.      pTabToDe
1a6b0 6c 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 7d  l->nRef--;.    }
1a6c0 0a 20 20 20 20 70 53 75 62 69 74 65 6d 2d 3e 70  .    pSubitem->p
1a6d0 54 61 62 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  Tab = 0;.  }..  
1a6e0 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  /* The following
1a6f0 20 6c 6f 6f 70 20 72 75 6e 73 20 6f 6e 63 65 20   loop runs once 
1a700 66 6f 72 20 65 61 63 68 20 74 65 72 6d 20 69 6e  for each term in
1a710 20 61 20 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71   a compound-subq
1a720 75 65 72 79 0a 20 20 2a 2a 20 66 6c 61 74 74 65  uery.  ** flatte
1a730 6e 69 6e 67 20 28 61 73 20 64 65 73 63 72 69 62  ning (as describ
1a740 65 64 20 61 62 6f 76 65 29 2e 20 20 49 66 20 77  ed above).  If w
1a750 65 20 61 72 65 20 64 6f 69 6e 67 20 61 20 64 69  e are doing a di
1a760 66 66 65 72 65 6e 74 20 6b 69 6e 64 0a 20 20 2a  fferent kind.  *
1a770 2a 20 6f 66 20 66 6c 61 74 74 65 6e 69 6e 67 20  * of flattening 
1a780 2d 20 61 20 66 6c 61 74 74 65 6e 69 6e 67 20 6f  - a flattening o
1a790 74 68 65 72 20 74 68 61 6e 20 61 20 63 6f 6d 70  ther than a comp
1a7a0 6f 75 6e 64 2d 73 75 62 71 75 65 72 79 20 66 6c  ound-subquery fl
1a7b0 61 74 74 65 6e 69 6e 67 20 2d 0a 20 20 2a 2a 20  attening -.  ** 
1a7c0 74 68 65 6e 20 74 68 69 73 20 6c 6f 6f 70 20 6f  then this loop o
1a7d0 6e 6c 79 20 72 75 6e 73 20 6f 6e 63 65 2e 0a 20  nly runs once.. 
1a7e0 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 6c 6f   **.  ** This lo
1a7f0 6f 70 20 6d 6f 76 65 73 20 61 6c 6c 20 6f 66 20  op moves all of 
1a800 74 68 65 20 46 52 4f 4d 20 65 6c 65 6d 65 6e 74  the FROM element
1a810 73 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72  s of the subquer
1a820 79 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20  y into the.  ** 
1a830 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
1a840 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  of the outer que
1a850 72 79 2e 20 20 42 65 66 6f 72 65 20 64 6f 69 6e  ry.  Before doin
1a860 67 20 74 68 69 73 2c 20 72 65 6d 65 6d 62 65 72  g this, remember
1a870 0a 20 20 2a 2a 20 74 68 65 20 63 75 72 73 6f 72  .  ** the cursor
1a880 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
1a890 6f 72 69 67 69 6e 61 6c 20 6f 75 74 65 72 20 71  original outer q
1a8a0 75 65 72 79 20 46 52 4f 4d 20 65 6c 65 6d 65 6e  uery FROM elemen
1a8b0 74 20 69 6e 0a 20 20 2a 2a 20 69 50 61 72 65 6e  t in.  ** iParen
1a8c0 74 2e 20 20 54 68 65 20 69 50 61 72 65 6e 74 20  t.  The iParent 
1a8d0 63 75 72 73 6f 72 20 77 69 6c 6c 20 6e 65 76 65  cursor will neve
1a8e0 72 20 62 65 20 75 73 65 64 2e 20 20 53 75 62 73  r be used.  Subs
1a8f0 65 71 75 65 6e 74 20 63 6f 64 65 0a 20 20 2a 2a  equent code.  **
1a900 20 77 69 6c 6c 20 73 63 61 6e 20 65 78 70 72 65   will scan expre
1a910 73 73 69 6f 6e 73 20 6c 6f 6f 6b 69 6e 67 20 66  ssions looking f
1a920 6f 72 20 69 50 61 72 65 6e 74 20 72 65 66 65 72  or iParent refer
1a930 65 6e 63 65 73 20 61 6e 64 20 72 65 70 6c 61 63  ences and replac
1a940 65 0a 20 20 2a 2a 20 74 68 6f 73 65 20 72 65 66  e.  ** those ref
1a950 65 72 65 6e 63 65 73 20 77 69 74 68 20 65 78 70  erences with exp
1a960 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20 72 65  ressions that re
1a970 73 6f 6c 76 65 20 74 6f 20 74 68 65 20 73 75 62  solve to the sub
1a980 71 75 65 72 79 20 46 52 4f 4d 0a 20 20 2a 2a 20  query FROM.  ** 
1a990 65 6c 65 6d 65 6e 74 73 20 77 65 20 61 72 65 20  elements we are 
1a9a0 6e 6f 77 20 63 6f 70 79 69 6e 67 20 69 6e 2e 0a  now copying in..
1a9b0 20 20 2a 2f 0a 20 20 66 6f 72 28 70 50 61 72 65    */.  for(pPare
1a9c0 6e 74 3d 70 3b 20 70 50 61 72 65 6e 74 3b 20 70  nt=p; pParent; p
1a9d0 50 61 72 65 6e 74 3d 70 50 61 72 65 6e 74 2d 3e  Parent=pParent->
1a9e0 70 50 72 69 6f 72 2c 20 70 53 75 62 3d 70 53 75  pPrior, pSub=pSu
1a9f0 62 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20  b->pPrior){.    
1aa00 69 6e 74 20 6e 53 75 62 53 72 63 3b 0a 20 20 20  int nSubSrc;.   
1aa10 20 75 38 20 6a 6f 69 6e 74 79 70 65 20 3d 20 30   u8 jointype = 0
1aa20 3b 0a 20 20 20 20 70 53 75 62 53 72 63 20 3d 20  ;.    pSubSrc = 
1aa30 70 53 75 62 2d 3e 70 53 72 63 3b 20 20 20 20 20  pSub->pSrc;     
1aa40 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  /* FROM clause o
1aa50 66 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20  f subquery */.  
1aa60 20 20 6e 53 75 62 53 72 63 20 3d 20 70 53 75 62    nSubSrc = pSub
1aa70 53 72 63 2d 3e 6e 53 72 63 3b 20 20 2f 2a 20 4e  Src->nSrc;  /* N
1aa80 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 20 69  umber of terms i
1aa90 6e 20 73 75 62 71 75 65 72 79 20 46 52 4f 4d 20  n subquery FROM 
1aaa0 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 70 53  clause */.    pS
1aab0 72 63 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70 53  rc = pParent->pS
1aac0 72 63 3b 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20  rc;     /* FROM 
1aad0 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75  clause of the ou
1aae0 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 0a 20 20  ter query */..  
1aaf0 20 20 69 66 28 20 70 53 72 63 20 29 7b 0a 20 20    if( pSrc ){.  
1ab00 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
1ab10 65 6e 74 3d 3d 70 20 29 3b 20 20 2f 2a 20 46 69  ent==p );  /* Fi
1ab20 72 73 74 20 74 69 6d 65 20 74 68 72 6f 75 67 68  rst time through
1ab30 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20   the loop */.   
1ab40 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d 20 70 53     jointype = pS
1ab50 75 62 69 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65  ubitem->jointype
1ab60 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1ab70 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65     assert( pPare
1ab80 6e 74 21 3d 70 20 29 3b 20 20 2f 2a 20 32 6e 64  nt!=p );  /* 2nd
1ab90 20 61 6e 64 20 73 75 62 73 65 71 75 65 6e 74 20   and subsequent 
1aba0 74 69 6d 65 73 20 74 68 72 6f 75 67 68 20 74 68  times through th
1abb0 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20  e loop */.      
1abc0 70 53 72 63 20 3d 20 70 50 61 72 65 6e 74 2d 3e  pSrc = pParent->
1abd0 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53 72  pSrc = sqlite3Sr
1abe0 63 4c 69 73 74 41 70 70 65 6e 64 28 64 62 2c 20  cListAppend(db, 
1abf0 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  0, 0, 0);.      
1ac00 69 66 28 20 70 53 72 63 3d 3d 30 20 29 7b 0a 20  if( pSrc==0 ){. 
1ac10 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 64         assert( d
1ac20 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
1ac30 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
1ac40 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1ac50 0a 20 20 20 20 2f 2a 20 54 68 65 20 73 75 62 71  .    /* The subq
1ac60 75 65 72 79 20 75 73 65 73 20 61 20 73 69 6e 67  uery uses a sing
1ac70 6c 65 20 73 6c 6f 74 20 6f 66 20 74 68 65 20 46  le slot of the F
1ac80 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ROM clause of th
1ac90 65 20 6f 75 74 65 72 0a 20 20 20 20 2a 2a 20 71  e outer.    ** q
1aca0 75 65 72 79 2e 20 20 49 66 20 74 68 65 20 73 75  uery.  If the su
1acb0 62 71 75 65 72 79 20 68 61 73 20 6d 6f 72 65 20  bquery has more 
1acc0 74 68 61 6e 20 6f 6e 65 20 65 6c 65 6d 65 6e 74  than one element
1acd0 20 69 6e 20 69 74 73 20 46 52 4f 4d 20 63 6c 61   in its FROM cla
1ace0 75 73 65 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e  use,.    ** then
1acf0 20 65 78 70 61 6e 64 20 74 68 65 20 6f 75 74 65   expand the oute
1ad00 72 20 71 75 65 72 79 20 74 6f 20 6d 61 6b 65 20  r query to make 
1ad10 73 70 61 63 65 20 66 6f 72 20 69 74 20 74 6f 20  space for it to 
1ad20 68 6f 6c 64 20 61 6c 6c 20 65 6c 65 6d 65 6e 74  hold all element
1ad30 73 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20  s.    ** of the 
1ad40 73 75 62 71 75 65 72 79 2e 0a 20 20 20 20 2a 2a  subquery..    **
1ad50 0a 20 20 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a  .    ** Example:
1ad60 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
1ad70 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
1ad80 74 61 62 41 2c 20 28 53 45 4c 45 43 54 20 2a 20  tabA, (SELECT * 
1ad90 46 52 4f 4d 20 73 75 62 31 2c 20 73 75 62 32 29  FROM sub1, sub2)
1ada0 2c 20 74 61 62 42 3b 0a 20 20 20 20 2a 2a 0a 20  , tabB;.    **. 
1adb0 20 20 20 2a 2a 20 54 68 65 20 6f 75 74 65 72 20     ** The outer 
1adc0 71 75 65 72 79 20 68 61 73 20 33 20 73 6c 6f 74  query has 3 slot
1add0 73 20 69 6e 20 69 74 73 20 46 52 4f 4d 20 63 6c  s in its FROM cl
1ade0 61 75 73 65 2e 20 20 4f 6e 65 20 73 6c 6f 74 20  ause.  One slot 
1adf0 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 75  of the.    ** ou
1ae00 74 65 72 20 71 75 65 72 79 20 28 74 68 65 20 6d  ter query (the m
1ae10 69 64 64 6c 65 20 73 6c 6f 74 29 20 69 73 20 75  iddle slot) is u
1ae20 73 65 64 20 62 79 20 74 68 65 20 73 75 62 71 75  sed by the subqu
1ae30 65 72 79 2e 20 20 54 68 65 20 6e 65 78 74 0a 20  ery.  The next. 
1ae40 20 20 20 2a 2a 20 62 6c 6f 63 6b 20 6f 66 20 63     ** block of c
1ae50 6f 64 65 20 77 69 6c 6c 20 65 78 70 61 6e 64 20  ode will expand 
1ae60 74 68 65 20 6f 75 74 20 71 75 65 72 79 20 74 6f  the out query to
1ae70 20 34 20 73 6c 6f 74 73 2e 20 20 54 68 65 20 6d   4 slots.  The m
1ae80 69 64 64 6c 65 0a 20 20 20 20 2a 2a 20 73 6c 6f  iddle.    ** slo
1ae90 74 20 69 73 20 65 78 70 61 6e 64 65 64 20 74 6f  t is expanded to
1aea0 20 74 77 6f 20 73 6c 6f 74 73 20 69 6e 20 6f 72   two slots in or
1aeb0 64 65 72 20 74 6f 20 6d 61 6b 65 20 73 70 61 63  der to make spac
1aec0 65 20 66 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a  e for the.    **
1aed0 20 74 77 6f 20 65 6c 65 6d 65 6e 74 73 20 69 6e   two elements in
1aee0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
1aef0 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79   of the subquery
1af00 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1af10 20 6e 53 75 62 53 72 63 3e 31 20 29 7b 0a 20 20   nSubSrc>1 ){.  
1af20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 53 72      pParent->pSr
1af30 63 20 3d 20 70 53 72 63 20 3d 20 73 71 6c 69 74  c = pSrc = sqlit
1af40 65 33 53 72 63 4c 69 73 74 45 6e 6c 61 72 67 65  e3SrcListEnlarge
1af50 28 64 62 2c 20 70 53 72 63 2c 20 6e 53 75 62 53  (db, pSrc, nSubS
1af60 72 63 2d 31 2c 69 46 72 6f 6d 2b 31 29 3b 0a 20  rc-1,iFrom+1);. 
1af70 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c       if( db->mal
1af80 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
1af90 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1afa0 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
1afb0 2a 20 54 72 61 6e 73 66 65 72 20 74 68 65 20 46  * Transfer the F
1afc0 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 73  ROM clause terms
1afd0 20 66 72 6f 6d 20 74 68 65 20 73 75 62 71 75 65   from the subque
1afe0 72 79 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20  ry into the.    
1aff0 2a 2a 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a  ** outer query..
1b000 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69      */.    for(i
1b010 3d 30 3b 20 69 3c 6e 53 75 62 53 72 63 3b 20 69  =0; i<nSubSrc; i
1b020 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
1b030 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 64  e3IdListDelete(d
1b040 62 2c 20 70 53 72 63 2d 3e 61 5b 69 2b 69 46 72  b, pSrc->a[i+iFr
1b050 6f 6d 5d 2e 70 55 73 69 6e 67 29 3b 0a 20 20 20  om].pUsing);.   
1b060 20 20 20 70 53 72 63 2d 3e 61 5b 69 2b 69 46 72     pSrc->a[i+iFr
1b070 6f 6d 5d 20 3d 20 70 53 75 62 53 72 63 2d 3e 61  om] = pSubSrc->a
1b080 5b 69 5d 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65  [i];.      memse
1b090 74 28 26 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d  t(&pSubSrc->a[i]
1b0a0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 53 75 62  , 0, sizeof(pSub
1b0b0 53 72 63 2d 3e 61 5b 69 5d 29 29 3b 0a 20 20 20  Src->a[i]));.   
1b0c0 20 7d 0a 20 20 20 20 70 53 72 63 2d 3e 61 5b 69   }.    pSrc->a[i
1b0d0 46 72 6f 6d 5d 2e 6a 6f 69 6e 74 79 70 65 20 3d  From].jointype =
1b0e0 20 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 0a 20 20   jointype;.  .  
1b0f0 20 20 2f 2a 20 4e 6f 77 20 62 65 67 69 6e 20 73    /* Now begin s
1b100 75 62 73 74 69 74 75 74 69 6e 67 20 73 75 62 71  ubstituting subq
1b110 75 65 72 79 20 72 65 73 75 6c 74 20 73 65 74 20  uery result set 
1b120 65 78 70 72 65 73 73 69 6f 6e 73 20 66 6f 72 20  expressions for 
1b130 0a 20 20 20 20 2a 2a 20 72 65 66 65 72 65 6e 63  .    ** referenc
1b140 65 73 20 74 6f 20 74 68 65 20 69 50 61 72 65 6e  es to the iParen
1b150 74 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71  t in the outer q
1b160 75 65 72 79 2e 0a 20 20 20 20 2a 2a 20 0a 20 20  uery..    ** .  
1b170 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20    ** Example:.  
1b180 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 53 45    **.    **   SE
1b190 4c 45 43 54 20 61 2b 35 2c 20 62 2a 31 30 20 46  LECT a+5, b*10 F
1b1a0 52 4f 4d 20 28 53 45 4c 45 43 54 20 78 2a 33 20  ROM (SELECT x*3 
1b1b0 41 53 20 61 2c 20 79 2b 31 30 20 41 53 20 62 20  AS a, y+10 AS b 
1b1c0 46 52 4f 4d 20 74 31 29 20 57 48 45 52 45 20 61  FROM t1) WHERE a
1b1d0 3e 62 3b 0a 20 20 20 20 2a 2a 20 20 20 5c 20 20  >b;.    **   \  
1b1e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b1f0 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f     \____________
1b200 5f 20 73 75 62 71 75 65 72 79 20 5f 5f 5f 5f 5f  _ subquery _____
1b210 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20 20 20 20 20  _____/          
1b220 2f 0a 20 20 20 20 2a 2a 20 20 20 20 5c 5f 5f 5f  /.    **    \___
1b230 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
1b240 5f 5f 20 6f 75 74 65 72 20 71 75 65 72 79 20 5f  __ outer query _
1b250 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
1b260 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 20  _____________/. 
1b270 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 57 65 20     **.    ** We 
1b280 6c 6f 6f 6b 20 61 74 20 65 76 65 72 79 20 65 78  look at every ex
1b290 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 65 20  pression in the 
1b2a0 6f 75 74 65 72 20 71 75 65 72 79 20 61 6e 64 20  outer query and 
1b2b0 65 76 65 72 79 20 70 6c 61 63 65 20 77 65 20 73  every place we s
1b2c0 65 65 0a 20 20 20 20 2a 2a 20 22 61 22 20 77 65  ee.    ** "a" we
1b2d0 20 73 75 62 73 74 69 74 75 74 65 20 22 78 2a 33   substitute "x*3
1b2e0 22 20 61 6e 64 20 65 76 65 72 79 20 70 6c 61 63  " and every plac
1b2f0 65 20 77 65 20 73 65 65 20 22 62 22 20 77 65 20  e we see "b" we 
1b300 73 75 62 73 74 69 74 75 74 65 20 22 79 2b 31 30  substitute "y+10
1b310 22 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 4c  "..    */.    pL
1b320 69 73 74 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70  ist = pParent->p
1b330 45 4c 69 73 74 3b 0a 20 20 20 20 66 6f 72 28 69  EList;.    for(i
1b340 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  =0; i<pList->nEx
1b350 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
1b360 69 66 28 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  if( pList->a[i].
1b370 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  zName==0 ){.    
1b380 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20      char *zName 
1b390 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
1b3a0 70 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61 5b 69  p(db, pList->a[i
1b3b0 5d 2e 7a 53 70 61 6e 29 3b 0a 20 20 20 20 20 20  ].zSpan);.      
1b3c0 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65    sqlite3Dequote
1b3d0 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  (zName);.       
1b3e0 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61   pList->a[i].zNa
1b3f0 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20 20  me = zName;.    
1b400 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 75    }.    }.    su
1b410 62 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20  bstExprList(db, 
1b420 70 50 61 72 65 6e 74 2d 3e 70 45 4c 69 73 74 2c  pParent->pEList,
1b430 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e   iParent, pSub->
1b440 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 69 66 28  pEList);.    if(
1b450 20 69 73 41 67 67 20 29 7b 0a 20 20 20 20 20 20   isAgg ){.      
1b460 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 64 62  substExprList(db
1b470 2c 20 70 50 61 72 65 6e 74 2d 3e 70 47 72 6f 75  , pParent->pGrou
1b480 70 42 79 2c 20 69 50 61 72 65 6e 74 2c 20 70 53  pBy, iParent, pS
1b490 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20  ub->pEList);.   
1b4a0 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76     pParent->pHav
1b4b0 69 6e 67 20 3d 20 73 75 62 73 74 45 78 70 72 28  ing = substExpr(
1b4c0 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 48 61  db, pParent->pHa
1b4d0 76 69 6e 67 2c 20 69 50 61 72 65 6e 74 2c 20 70  ving, iParent, p
1b4e0 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  Sub->pEList);.  
1b4f0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 53 75 62    }.    if( pSub
1b500 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ->pOrderBy ){.  
1b510 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
1b520 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30  ent->pOrderBy==0
1b530 20 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e   );.      pParen
1b540 74 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 53  t->pOrderBy = pS
1b550 75 62 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20  ub->pOrderBy;.  
1b560 20 20 20 20 70 53 75 62 2d 3e 70 4f 72 64 65 72      pSub->pOrder
1b570 42 79 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  By = 0;.    }els
1b580 65 20 69 66 28 20 70 50 61 72 65 6e 74 2d 3e 70  e if( pParent->p
1b590 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
1b5a0 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 64   substExprList(d
1b5b0 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 4f 72 64  b, pParent->pOrd
1b5c0 65 72 42 79 2c 20 69 50 61 72 65 6e 74 2c 20 70  erBy, iParent, p
1b5d0 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  Sub->pEList);.  
1b5e0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 53 75 62    }.    if( pSub
1b5f0 2d 3e 70 57 68 65 72 65 20 29 7b 0a 20 20 20 20  ->pWhere ){.    
1b600 20 20 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74    pWhere = sqlit
1b610 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 53  e3ExprDup(db, pS
1b620 75 62 2d 3e 70 57 68 65 72 65 2c 20 30 29 3b 0a  ub->pWhere, 0);.
1b630 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1b640 20 70 57 68 65 72 65 20 3d 20 30 3b 0a 20 20 20   pWhere = 0;.   
1b650 20 7d 0a 20 20 20 20 69 66 28 20 73 75 62 71 75   }.    if( subqu
1b660 65 72 79 49 73 41 67 67 20 29 7b 0a 20 20 20 20  eryIsAgg ){.    
1b670 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e    assert( pParen
1b680 74 2d 3e 70 48 61 76 69 6e 67 3d 3d 30 20 29 3b  t->pHaving==0 );
1b690 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e  .      pParent->
1b6a0 70 48 61 76 69 6e 67 20 3d 20 70 50 61 72 65 6e  pHaving = pParen
1b6b0 74 2d 3e 70 57 68 65 72 65 3b 0a 20 20 20 20 20  t->pWhere;.     
1b6c0 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65   pParent->pWhere
1b6d0 20 3d 20 70 57 68 65 72 65 3b 0a 20 20 20 20 20   = pWhere;.     
1b6e0 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e   pParent->pHavin
1b6f0 67 20 3d 20 73 75 62 73 74 45 78 70 72 28 64 62  g = substExpr(db
1b700 2c 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69  , pParent->pHavi
1b710 6e 67 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75  ng, iParent, pSu
1b720 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  b->pEList);.    
1b730 20 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69    pParent->pHavi
1b740 6e 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ng = sqlite3Expr
1b750 41 6e 64 28 64 62 2c 20 70 50 61 72 65 6e 74 2d  And(db, pParent-
1b760 3e 70 48 61 76 69 6e 67 2c 20 0a 20 20 20 20 20  >pHaving, .     
1b770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b780 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
1b790 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
1b7a0 70 53 75 62 2d 3e 70 48 61 76 69 6e 67 2c 20 30  pSub->pHaving, 0
1b7b0 29 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ));.      assert
1b7c0 28 20 70 50 61 72 65 6e 74 2d 3e 70 47 72 6f 75  ( pParent->pGrou
1b7d0 70 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  pBy==0 );.      
1b7e0 70 50 61 72 65 6e 74 2d 3e 70 47 72 6f 75 70 42  pParent->pGroupB
1b7f0 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  y = sqlite3ExprL
1b800 69 73 74 44 75 70 28 64 62 2c 20 70 53 75 62 2d  istDup(db, pSub-
1b810 3e 70 47 72 6f 75 70 42 79 2c 20 30 29 3b 0a 20  >pGroupBy, 0);. 
1b820 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1b830 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 20  pParent->pWhere 
1b840 3d 20 73 75 62 73 74 45 78 70 72 28 64 62 2c 20  = substExpr(db, 
1b850 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 2c  pParent->pWhere,
1b860 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e   iParent, pSub->
1b870 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 70  pEList);.      p
1b880 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 20 3d  Parent->pWhere =
1b890 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28   sqlite3ExprAnd(
1b8a0 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 57 68  db, pParent->pWh
1b8b0 65 72 65 2c 20 70 57 68 65 72 65 29 3b 0a 20 20  ere, pWhere);.  
1b8c0 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 54 68    }.  .    /* Th
1b8d0 65 20 66 6c 61 74 74 65 6e 65 64 20 71 75 65 72  e flattened quer
1b8e0 79 20 69 73 20 64 69 73 74 69 6e 63 74 20 69 66  y is distinct if
1b8f0 20 65 69 74 68 65 72 20 74 68 65 20 69 6e 6e 65   either the inne
1b900 72 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20  r or the.    ** 
1b910 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20 64  outer query is d
1b920 69 73 74 69 6e 63 74 2e 20 0a 20 20 20 20 2a 2f  istinct. .    */
1b930 0a 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 73 65  .    pParent->se
1b940 6c 46 6c 61 67 73 20 7c 3d 20 70 53 75 62 2d 3e  lFlags |= pSub->
1b950 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69  selFlags & SF_Di
1b960 73 74 69 6e 63 74 3b 0a 20 20 0a 20 20 20 20 2f  stinct;.  .    /
1b970 2a 0a 20 20 20 20 2a 2a 20 53 45 4c 45 43 54 20  *.    ** SELECT 
1b980 2e 2e 2e 20 46 52 4f 4d 20 28 53 45 4c 45 43 54  ... FROM (SELECT
1b990 20 2e 2e 2e 20 4c 49 4d 49 54 20 61 20 4f 46 46   ... LIMIT a OFF
1b9a0 53 45 54 20 62 29 20 4c 49 4d 49 54 20 78 20 4f  SET b) LIMIT x O
1b9b0 46 46 53 45 54 20 79 3b 0a 20 20 20 20 2a 2a 0a  FFSET y;.    **.
1b9c0 20 20 20 20 2a 2a 20 4f 6e 65 20 69 73 20 74 65      ** One is te
1b9d0 6d 70 74 65 64 20 74 6f 20 74 72 79 20 74 6f 20  mpted to try to 
1b9e0 61 64 64 20 61 20 61 6e 64 20 62 20 74 6f 20 63  add a and b to c
1b9f0 6f 6d 62 69 6e 65 20 74 68 65 20 6c 69 6d 69 74  ombine the limit
1ba00 73 2e 20 20 42 75 74 20 74 68 69 73 0a 20 20 20  s.  But this.   
1ba10 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72   ** does not wor
1ba20 6b 20 69 66 20 65 69 74 68 65 72 20 6c 69 6d 69  k if either limi
1ba30 74 20 69 73 20 6e 65 67 61 74 69 76 65 2e 0a 20  t is negative.. 
1ba40 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53     */.    if( pS
1ba50 75 62 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20  ub->pLimit ){.  
1ba60 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 4c 69      pParent->pLi
1ba70 6d 69 74 20 3d 20 70 53 75 62 2d 3e 70 4c 69 6d  mit = pSub->pLim
1ba80 69 74 3b 0a 20 20 20 20 20 20 70 53 75 62 2d 3e  it;.      pSub->
1ba90 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20  pLimit = 0;.    
1baa0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 69  }.  }..  /* Fini
1bab0 61 6c 6c 79 2c 20 64 65 6c 65 74 65 20 77 68 61  ally, delete wha
1bac0 74 20 69 73 20 6c 65 66 74 20 6f 66 20 74 68 65  t is left of the
1bad0 20 73 75 62 71 75 65 72 79 20 61 6e 64 20 72 65   subquery and re
1bae0 74 75 72 6e 0a 20 20 2a 2a 20 73 75 63 63 65 73  turn.  ** succes
1baf0 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  s..  */.  sqlite
1bb00 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
1bb10 2c 20 70 53 75 62 31 29 3b 0a 0a 20 20 72 65 74  , pSub1);..  ret
1bb20 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20  urn 1;.}.#endif 
1bb30 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
1bb40 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
1bb50 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
1bb60 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20  LITE_OMIT_VIEW) 
1bb70 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 42 61 73 65 64 20  */../*.** Based 
1bb80 6f 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  on the contents 
1bb90 6f 66 20 74 68 65 20 41 67 67 49 6e 66 6f 20 73  of the AggInfo s
1bba0 74 72 75 63 74 75 72 65 20 69 6e 64 69 63 61 74  tructure indicat
1bbb0 65 64 20 62 79 20 74 68 65 20 66 69 72 73 74 0a  ed by the first.
1bbc0 2a 2a 20 61 72 67 75 6d 65 6e 74 2c 20 74 68 69  ** argument, thi
1bbd0 73 20 66 75 6e 63 74 69 6f 6e 20 63 68 65 63 6b  s function check
1bbe0 73 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  s if the followi
1bbf0 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a  ng are true:.**.
1bc00 2a 2a 20 20 20 20 2a 20 74 68 65 20 71 75 65 72  **    * the quer
1bc10 79 20 63 6f 6e 74 61 69 6e 73 20 6a 75 73 74 20  y contains just 
1bc20 61 20 73 69 6e 67 6c 65 20 61 67 67 72 65 67 61  a single aggrega
1bc30 74 65 20 66 75 6e 63 74 69 6f 6e 2c 0a 2a 2a 20  te function,.** 
1bc40 20 20 20 2a 20 74 68 65 20 61 67 67 72 65 67 61     * the aggrega
1bc50 74 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 65  te function is e
1bc60 69 74 68 65 72 20 6d 69 6e 28 29 20 6f 72 20 6d  ither min() or m
1bc70 61 78 28 29 2c 20 61 6e 64 0a 2a 2a 20 20 20 20  ax(), and.**    
1bc80 2a 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 74  * the argument t
1bc90 6f 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20  o the aggregate 
1bca0 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 63 6f  function is a co
1bcb0 6c 75 6d 6e 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a  lumn value..**.*
1bcc0 2a 20 49 66 20 61 6c 6c 20 6f 66 20 74 68 65 20  * If all of the 
1bcd0 61 62 6f 76 65 20 61 72 65 20 74 72 75 65 2c 20  above are true, 
1bce0 74 68 65 6e 20 57 48 45 52 45 5f 4f 52 44 45 52  then WHERE_ORDER
1bcf0 42 59 5f 4d 49 4e 20 6f 72 20 57 48 45 52 45 5f  BY_MIN or WHERE_
1bd00 4f 52 44 45 52 42 59 5f 4d 41 58 0a 2a 2a 20 69  ORDERBY_MAX.** i
1bd10 73 20 72 65 74 75 72 6e 65 64 20 61 73 20 61 70  s returned as ap
1bd20 70 72 6f 70 72 69 61 74 65 2e 20 41 6c 73 6f 2c  propriate. Also,
1bd30 20 2a 70 70 4d 69 6e 4d 61 78 20 69 73 20 73 65   *ppMinMax is se
1bd40 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  t to point to th
1bd50 65 20 0a 2a 2a 20 6c 69 73 74 20 6f 66 20 61 72  e .** list of ar
1bd60 67 75 6d 65 6e 74 73 20 70 61 73 73 65 64 20 74  guments passed t
1bd70 6f 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20  o the aggregate 
1bd80 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
1bd90 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 74  ..**.** Or, if t
1bda0 68 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61 62  he conditions ab
1bdb0 6f 76 65 20 61 72 65 20 6e 6f 74 20 6d 65 74 2c  ove are not met,
1bdc0 20 2a 70 70 4d 69 6e 4d 61 78 20 69 73 20 73 65   *ppMinMax is se
1bdd0 74 20 74 6f 20 30 20 61 6e 64 0a 2a 2a 20 57 48  t to 0 and.** WH
1bde0 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d  ERE_ORDERBY_NORM
1bdf0 41 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  AL is returned..
1be00 2a 2f 0a 73 74 61 74 69 63 20 75 38 20 6d 69 6e  */.static u8 min
1be10 4d 61 78 51 75 65 72 79 28 41 67 67 49 6e 66 6f  MaxQuery(AggInfo
1be20 20 2a 70 41 67 67 49 6e 66 6f 2c 20 45 78 70 72   *pAggInfo, Expr
1be30 4c 69 73 74 20 2a 2a 70 70 4d 69 6e 4d 61 78 29  List **ppMinMax)
1be40 7b 0a 20 20 69 6e 74 20 65 52 65 74 20 3d 20 57  {.  int eRet = W
1be50 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52  HERE_ORDERBY_NOR
1be60 4d 41 4c 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  MAL;          /*
1be70 20 52 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f   Return value */
1be80 0a 0a 20 20 2a 70 70 4d 69 6e 4d 61 78 20 3d 20  ..  *ppMinMax = 
1be90 30 3b 0a 20 20 69 66 28 20 70 41 67 67 49 6e 66  0;.  if( pAggInf
1bea0 6f 2d 3e 6e 46 75 6e 63 3d 3d 31 20 29 7b 0a 20  o->nFunc==1 ){. 
1beb0 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d     Expr *pExpr =
1bec0 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63   pAggInfo->aFunc
1bed0 5b 30 5d 2e 70 45 78 70 72 3b 20 2f 2a 20 41 67  [0].pExpr; /* Ag
1bee0 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
1bef0 20 2a 2f 0a 20 20 20 20 45 78 70 72 4c 69 73 74   */.    ExprList
1bf00 20 2a 70 45 4c 69 73 74 20 3d 20 70 45 78 70 72   *pEList = pExpr
1bf10 2d 3e 78 2e 70 4c 69 73 74 3b 20 20 20 20 20 20  ->x.pList;      
1bf20 2f 2a 20 41 72 67 75 6d 65 6e 74 73 20 74 6f 20  /* Arguments to 
1bf30 61 67 67 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  agg function */.
1bf40 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78  .    assert( pEx
1bf50 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46  pr->op==TK_AGG_F
1bf60 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 20 20 69  UNCTION );.    i
1bf70 66 28 20 70 45 4c 69 73 74 20 26 26 20 70 45 4c  f( pEList && pEL
1bf80 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 31 20 26 26  ist->nExpr==1 &&
1bf90 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45   pEList->a[0].pE
1bfa0 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f  xpr->op==TK_AGG_
1bfb0 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20  COLUMN ){.      
1bfc0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e  const char *zFun
1bfd0 63 20 3d 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  c = pExpr->u.zTo
1bfe0 6b 65 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 73  ken;.      if( s
1bff0 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 46  qlite3StrICmp(zF
1c000 75 6e 63 2c 20 22 6d 69 6e 22 29 3d 3d 30 20 29  unc, "min")==0 )
1c010 7b 0a 20 20 20 20 20 20 20 20 65 52 65 74 20 3d  {.        eRet =
1c020 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d   WHERE_ORDERBY_M
1c030 49 4e 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 4d  IN;.        *ppM
1c040 69 6e 4d 61 78 20 3d 20 70 45 4c 69 73 74 3b 0a  inMax = pEList;.
1c050 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1c060 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
1c070 46 75 6e 63 2c 20 22 6d 61 78 22 29 3d 3d 30 20  Func, "max")==0 
1c080 29 7b 0a 20 20 20 20 20 20 20 20 65 52 65 74 20  ){.        eRet 
1c090 3d 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  = WHERE_ORDERBY_
1c0a0 4d 41 58 3b 0a 20 20 20 20 20 20 20 20 2a 70 70  MAX;.        *pp
1c0b0 4d 69 6e 4d 61 78 20 3d 20 70 45 4c 69 73 74 3b  MinMax = pEList;
1c0c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1c0d0 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 2a 70   }..  assert( *p
1c0e0 70 4d 69 6e 4d 61 78 3d 3d 30 20 7c 7c 20 28 2a  pMinMax==0 || (*
1c0f0 70 70 4d 69 6e 4d 61 78 29 2d 3e 6e 45 78 70 72  ppMinMax)->nExpr
1c100 3d 3d 31 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ==1 );.  return 
1c110 65 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  eRet;.}../*.** T
1c120 68 65 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d  he select statem
1c130 65 6e 74 20 70 61 73 73 65 64 20 61 73 20 74 68  ent passed as th
1c140 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
1c150 20 69 73 20 61 6e 20 61 67 67 72 65 67 61 74 65   is an aggregate
1c160 20 71 75 65 72 79 2e 0a 2a 2a 20 54 68 65 20 73   query..** The s
1c170 65 63 6f 6e 64 20 61 72 67 6d 65 6e 74 20 69 73  econd argment is
1c180 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20   the associated 
1c190 61 67 67 72 65 67 61 74 65 2d 69 6e 66 6f 20 6f  aggregate-info o
1c1a0 62 6a 65 63 74 2e 20 54 68 69 73 20 0a 2a 2a 20  bject. This .** 
1c1b0 66 75 6e 63 74 69 6f 6e 20 74 65 73 74 73 20 69  function tests i
1c1c0 66 20 74 68 65 20 53 45 4c 45 43 54 20 69 73 20  f the SELECT is 
1c1d0 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a  of the form:.**.
1c1e0 2a 2a 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e  **   SELECT coun
1c1f0 74 28 2a 29 20 46 52 4f 4d 20 3c 74 62 6c 3e 0a  t(*) FROM <tbl>.
1c200 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 74 61 62 6c  **.** where tabl
1c210 65 20 69 73 20 61 20 64 61 74 61 62 61 73 65 20  e is a database 
1c220 74 61 62 6c 65 2c 20 6e 6f 74 20 61 20 73 75 62  table, not a sub
1c230 2d 73 65 6c 65 63 74 20 6f 72 20 76 69 65 77 2e  -select or view.
1c240 20 49 66 20 74 68 65 20 71 75 65 72 79 0a 2a 2a   If the query.**
1c250 20 64 6f 65 73 20 6d 61 74 63 68 20 74 68 69 73   does match this
1c260 20 70 61 74 74 65 72 6e 2c 20 74 68 65 6e 20 61   pattern, then a
1c270 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
1c280 54 61 62 6c 65 20 6f 62 6a 65 63 74 20 72 65 70  Table object rep
1c290 72 65 73 65 6e 74 69 6e 67 0a 2a 2a 20 3c 74 62  resenting.** <tb
1c2a0 6c 3e 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  l> is returned. 
1c2b0 4f 74 68 65 72 77 69 73 65 2c 20 30 20 69 73 20  Otherwise, 0 is 
1c2c0 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
1c2d0 74 69 63 20 54 61 62 6c 65 20 2a 69 73 53 69 6d  tic Table *isSim
1c2e0 70 6c 65 43 6f 75 6e 74 28 53 65 6c 65 63 74 20  pleCount(Select 
1c2f0 2a 70 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67  *p, AggInfo *pAg
1c300 67 49 6e 66 6f 29 7b 0a 20 20 54 61 62 6c 65 20  gInfo){.  Table 
1c310 2a 70 54 61 62 3b 0a 20 20 45 78 70 72 20 2a 70  *pTab;.  Expr *p
1c320 45 78 70 72 3b 0a 0a 20 20 61 73 73 65 72 74 28  Expr;..  assert(
1c330 20 21 70 2d 3e 70 47 72 6f 75 70 42 79 20 29 3b   !p->pGroupBy );
1c340 0a 0a 20 20 69 66 28 20 70 2d 3e 70 57 68 65 72  ..  if( p->pWher
1c350 65 20 7c 7c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  e || p->pEList->
1c360 6e 45 78 70 72 21 3d 31 20 0a 20 20 20 7c 7c 20  nExpr!=1 .   || 
1c370 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31  p->pSrc->nSrc!=1
1c380 20 7c 7c 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30   || p->pSrc->a[0
1c390 5d 2e 70 53 65 6c 65 63 74 0a 20 20 29 7b 0a 20  ].pSelect.  ){. 
1c3a0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
1c3b0 0a 20 20 70 54 61 62 20 3d 20 70 2d 3e 70 53 72  .  pTab = p->pSr
1c3c0 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 20 20  c->a[0].pTab;.  
1c3d0 70 45 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73  pExpr = p->pELis
1c3e0 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20  t->a[0].pExpr;. 
1c3f0 20 61 73 73 65 72 74 28 20 70 54 61 62 20 26 26   assert( pTab &&
1c400 20 21 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20   !pTab->pSelect 
1c410 26 26 20 70 45 78 70 72 20 29 3b 0a 0a 20 20 69  && pExpr );..  i
1c420 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61  f( IsVirtual(pTa
1c430 62 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  b) ) return 0;. 
1c440 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d   if( pExpr->op!=
1c450 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20  TK_AGG_FUNCTION 
1c460 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
1c470 28 20 4e 45 56 45 52 28 70 41 67 67 49 6e 66 6f  ( NEVER(pAggInfo
1c480 2d 3e 6e 46 75 6e 63 3d 3d 30 29 20 29 20 72 65  ->nFunc==0) ) re
1c490 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70  turn 0;.  if( (p
1c4a0 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30  AggInfo->aFunc[0
1c4b0 5d 2e 70 46 75 6e 63 2d 3e 66 75 6e 63 46 6c 61  ].pFunc->funcFla
1c4c0 67 73 26 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43  gs&SQLITE_FUNC_C
1c4d0 4f 55 4e 54 29 3d 3d 30 20 29 20 72 65 74 75 72  OUNT)==0 ) retur
1c4e0 6e 20 30 3b 0a 20 20 69 66 28 20 70 45 78 70 72  n 0;.  if( pExpr
1c4f0 2d 3e 66 6c 61 67 73 26 45 50 5f 44 69 73 74 69  ->flags&EP_Disti
1c500 6e 63 74 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  nct ) return 0;.
1c510 0a 20 20 72 65 74 75 72 6e 20 70 54 61 62 3b 0a  .  return pTab;.
1c520 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  }../*.** If the 
1c530 73 6f 75 72 63 65 2d 6c 69 73 74 20 69 74 65 6d  source-list item
1c540 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 61 72   passed as an ar
1c550 67 75 6d 65 6e 74 20 77 61 73 20 61 75 67 6d 65  gument was augme
1c560 6e 74 65 64 20 77 69 74 68 20 61 6e 0a 2a 2a 20  nted with an.** 
1c570 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73  INDEXED BY claus
1c580 65 2c 20 74 68 65 6e 20 74 72 79 20 74 6f 20 6c  e, then try to l
1c590 6f 63 61 74 65 20 74 68 65 20 73 70 65 63 69 66  ocate the specif
1c5a0 69 65 64 20 69 6e 64 65 78 2e 20 49 66 20 74 68  ied index. If th
1c5b0 65 72 65 0a 2a 2a 20 77 61 73 20 73 75 63 68 20  ere.** was such 
1c5c0 61 20 63 6c 61 75 73 65 20 61 6e 64 20 74 68 65  a clause and the
1c5d0 20 6e 61 6d 65 64 20 69 6e 64 65 78 20 63 61 6e   named index can
1c5e0 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2c 20 72 65  not be found, re
1c5f0 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f  turn .** SQLITE_
1c600 45 52 52 4f 52 20 61 6e 64 20 6c 65 61 76 65 20  ERROR and leave 
1c610 61 6e 20 65 72 72 6f 72 20 69 6e 20 70 50 61 72  an error in pPar
1c620 73 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 70  se. Otherwise, p
1c630 6f 70 75 6c 61 74 65 20 0a 2a 2a 20 70 46 72 6f  opulate .** pFro
1c640 6d 2d 3e 70 49 6e 64 65 78 20 61 6e 64 20 72 65  m->pIndex and re
1c650 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  turn SQLITE_OK..
1c660 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 6e  */.int sqlite3In
1c670 64 65 78 65 64 42 79 4c 6f 6f 6b 75 70 28 50 61  dexedByLookup(Pa
1c680 72 73 65 20 2a 70 50 61 72 73 65 2c 20 73 74 72  rse *pParse, str
1c690 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
1c6a0 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 69 66 28 20   *pFrom){.  if( 
1c6b0 70 46 72 6f 6d 2d 3e 70 54 61 62 20 26 26 20 70  pFrom->pTab && p
1c6c0 46 72 6f 6d 2d 3e 7a 49 6e 64 65 78 20 29 7b 0a  From->zIndex ){.
1c6d0 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
1c6e0 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20  = pFrom->pTab;. 
1c6f0 20 20 20 63 68 61 72 20 2a 7a 49 6e 64 65 78 20     char *zIndex 
1c700 3d 20 70 46 72 6f 6d 2d 3e 7a 49 6e 64 65 78 3b  = pFrom->zIndex;
1c710 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78  .    Index *pIdx
1c720 3b 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70  ;.    for(pIdx=p
1c730 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 0a 20 20  Tab->pIndex; .  
1c740 20 20 20 20 20 20 70 49 64 78 20 26 26 20 73 71        pIdx && sq
1c750 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 49 64  lite3StrICmp(pId
1c760 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 49 6e 64 65 78  x->zName, zIndex
1c770 29 3b 20 0a 20 20 20 20 20 20 20 20 70 49 64 78  ); .        pIdx
1c780 3d 70 49 64 78 2d 3e 70 4e 65 78 74 0a 20 20 20  =pIdx->pNext.   
1c790 20 29 3b 0a 20 20 20 20 69 66 28 20 21 70 49 64   );.    if( !pId
1c7a0 78 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  x ){.      sqlit
1c7b0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
1c7c0 65 2c 20 22 6e 6f 20 73 75 63 68 20 69 6e 64 65  e, "no such inde
1c7d0 78 3a 20 25 73 22 2c 20 7a 49 6e 64 65 78 2c 20  x: %s", zIndex, 
1c7e0 30 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  0);.      pParse
1c7f0 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61 20 3d 20  ->checkSchema = 
1c800 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  1;.      return 
1c810 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
1c820 20 20 7d 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 70    }.    pFrom->p
1c830 49 6e 64 65 78 20 3d 20 70 49 64 78 3b 0a 20 20  Index = pIdx;.  
1c840 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
1c850 45 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 44 65  E_OK;.}./*.** De
1c860 74 65 63 74 20 63 6f 6d 70 6f 75 6e 64 20 53 45  tect compound SE
1c870 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20  LECT statements 
1c880 74 68 61 74 20 75 73 65 20 61 6e 20 4f 52 44 45  that use an ORDE
1c890 52 20 42 59 20 63 6c 61 75 73 65 20 77 69 74 68  R BY clause with
1c8a0 20 0a 2a 2a 20 61 6e 20 61 6c 74 65 72 6e 61 74   .** an alternat
1c8b0 69 76 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  ive collating se
1c8c0 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 20 20  quence..**.**   
1c8d0 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d   SELECT ... FROM
1c8e0 20 74 31 20 45 58 43 45 50 54 20 53 45 4c 45 43   t1 EXCEPT SELEC
1c8f0 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 32 20 4f 52  T ... FROM t2 OR
1c900 44 45 52 20 42 59 20 2e 2e 20 43 4f 4c 4c 41 54  DER BY .. COLLAT
1c910 45 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73  E ....**.** Thes
1c920 65 20 61 72 65 20 72 65 77 72 69 74 74 65 6e 20  e are rewritten 
1c930 61 73 20 61 20 73 75 62 71 75 65 72 79 3a 0a 2a  as a subquery:.*
1c940 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a  *.**    SELECT *
1c950 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 2e 2e   FROM (SELECT ..
1c960 2e 20 46 52 4f 4d 20 74 31 20 45 58 43 45 50 54  . FROM t1 EXCEPT
1c970 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d   SELECT ... FROM
1c980 20 74 32 29 0a 2a 2a 20 20 20 20 20 4f 52 44 45   t2).**     ORDE
1c990 52 20 42 59 20 2e 2e 2e 20 43 4f 4c 4c 41 54 45  R BY ... COLLATE
1c9a0 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20   ....**.** This 
1c9b0 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 69  transformation i
1c9c0 73 20 6e 65 63 65 73 73 61 72 79 20 62 65 63 61  s necessary beca
1c9d0 75 73 65 20 74 68 65 20 6d 75 6c 74 69 53 65 6c  use the multiSel
1c9e0 65 63 74 4f 72 64 65 72 42 79 28 29 20 72 6f 75  ectOrderBy() rou
1c9f0 74 69 6e 65 0a 2a 2a 20 61 62 6f 76 65 20 74 68  tine.** above th
1ca00 61 74 20 67 65 6e 65 72 61 74 65 73 20 74 68 65  at generates the
1ca10 20 63 6f 64 65 20 66 6f 72 20 61 20 63 6f 6d 70   code for a comp
1ca20 6f 75 6e 64 20 53 45 4c 45 43 54 20 77 69 74 68  ound SELECT with
1ca30 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
1ca40 75 73 65 0a 2a 2a 20 75 73 65 73 20 61 20 6d 65  use.** uses a me
1ca50 72 67 65 20 61 6c 67 6f 72 69 74 68 6d 20 74 68  rge algorithm th
1ca60 61 74 20 72 65 71 75 69 72 65 73 20 74 68 65 20  at requires the 
1ca70 73 61 6d 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73  same collating s
1ca80 65 71 75 65 6e 63 65 20 6f 6e 20 74 68 65 0a 2a  equence on the.*
1ca90 2a 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  * result columns
1caa0 20 61 73 20 6f 6e 20 74 68 65 20 4f 52 44 45 52   as on the ORDER
1cab0 20 42 59 20 63 6c 61 75 73 65 2e 20 20 53 65 65   BY clause.  See
1cac0 20 74 69 63 6b 65 74 0a 2a 2a 20 68 74 74 70 3a   ticket.** http:
1cad0 2f 2f 77 77 77 2e 73 71 6c 69 74 65 2e 6f 72 67  //www.sqlite.org
1cae0 2f 73 72 63 2f 69 6e 66 6f 2f 36 37 30 39 35 37  /src/info/670957
1caf0 34 64 32 61 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  4d2a.**.** This 
1cb00 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 69  transformation i
1cb10 73 20 6f 6e 6c 79 20 6e 65 65 64 65 64 20 66 6f  s only needed fo
1cb20 72 20 45 58 43 45 50 54 2c 20 49 4e 54 45 52 53  r EXCEPT, INTERS
1cb30 45 43 54 2c 20 61 6e 64 20 55 4e 49 4f 4e 2e 0a  ECT, and UNION..
1cb40 2a 2a 20 54 68 65 20 55 4e 49 4f 4e 20 41 4c 4c  ** The UNION ALL
1cb50 20 6f 70 65 72 61 74 6f 72 20 77 6f 72 6b 73 20   operator works 
1cb60 66 69 6e 65 20 77 69 74 68 20 6d 75 6c 74 69 53  fine with multiS
1cb70 65 6c 65 63 74 4f 72 64 65 72 42 79 28 29 20 65  electOrderBy() e
1cb80 76 65 6e 20 77 68 65 6e 0a 2a 2a 20 74 68 65 72  ven when.** ther
1cb90 65 20 61 72 65 20 43 4f 4c 4c 41 54 45 20 74 65  e are COLLATE te
1cba0 72 6d 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52  rms in the ORDER
1cbb0 20 42 59 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69   BY..*/.static i
1cbc0 6e 74 20 63 6f 6e 76 65 72 74 43 6f 6d 70 6f 75  nt convertCompou
1cbd0 6e 64 53 65 6c 65 63 74 54 6f 53 75 62 71 75 65  ndSelectToSubque
1cbe0 72 79 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b  ry(Walker *pWalk
1cbf0 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a  er, Select *p){.
1cc00 20 20 69 6e 74 20 69 3b 0a 20 20 53 65 6c 65 63    int i;.  Selec
1cc10 74 20 2a 70 4e 65 77 3b 0a 20 20 53 65 6c 65 63  t *pNew;.  Selec
1cc20 74 20 2a 70 58 3b 0a 20 20 73 71 6c 69 74 65 33  t *pX;.  sqlite3
1cc30 20 2a 64 62 3b 0a 20 20 73 74 72 75 63 74 20 45   *db;.  struct E
1cc40 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b  xprList_item *a;
1cc50 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 4e 65 77  .  SrcList *pNew
1cc60 53 72 63 3b 0a 20 20 50 61 72 73 65 20 2a 70 50  Src;.  Parse *pP
1cc70 61 72 73 65 3b 0a 20 20 54 6f 6b 65 6e 20 64 75  arse;.  Token du
1cc80 6d 6d 79 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 70  mmy;..  if( p->p
1cc90 50 72 69 6f 72 3d 3d 30 20 29 20 72 65 74 75 72  Prior==0 ) retur
1cca0 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
1ccb0 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42    if( p->pOrderB
1ccc0 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52  y==0 ) return WR
1ccd0 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 66 6f  C_Continue;.  fo
1cce0 72 28 70 58 3d 70 3b 20 70 58 20 26 26 20 28 70  r(pX=p; pX && (p
1ccf0 58 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c  X->op==TK_ALL ||
1cd00 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45   pX->op==TK_SELE
1cd10 43 54 29 3b 20 70 58 3d 70 58 2d 3e 70 50 72 69  CT); pX=pX->pPri
1cd20 6f 72 29 7b 7d 0a 20 20 69 66 28 20 70 58 3d 3d  or){}.  if( pX==
1cd30 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 43  0 ) return WRC_C
1cd40 6f 6e 74 69 6e 75 65 3b 0a 20 20 61 20 3d 20 70  ontinue;.  a = p
1cd50 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 61 3b 0a 20  ->pOrderBy->a;. 
1cd60 20 66 6f 72 28 69 3d 70 2d 3e 70 4f 72 64 65 72   for(i=p->pOrder
1cd70 42 79 2d 3e 6e 45 78 70 72 2d 31 3b 20 69 3e 3d  By->nExpr-1; i>=
1cd80 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69 66 28  0; i--){.    if(
1cd90 20 61 5b 69 5d 2e 70 45 78 70 72 2d 3e 66 6c 61   a[i].pExpr->fla
1cda0 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 20  gs & EP_Collate 
1cdb0 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69  ) break;.  }.  i
1cdc0 66 28 20 69 3c 30 20 29 20 72 65 74 75 72 6e 20  f( i<0 ) return 
1cdd0 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 0a 20  WRC_Continue;.. 
1cde0 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68 20   /* If we reach 
1cdf0 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 61 74  this point, that
1ce00 20 6d 65 61 6e 73 20 74 68 65 20 74 72 61 6e 73   means the trans
1ce10 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 72 65 71  formation is req
1ce20 75 69 72 65 64 2e 20 2a 2f 0a 0a 20 20 70 50 61  uired. */..  pPa
1ce30 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70  rse = pWalker->p
1ce40 50 61 72 73 65 3b 0a 20 20 64 62 20 3d 20 70 50  Parse;.  db = pP
1ce50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 4e 65 77  arse->db;.  pNew
1ce60 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
1ce70 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f  ocZero(db, sizeo
1ce80 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69 66  f(*pNew) );.  if
1ce90 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75  ( pNew==0 ) retu
1cea0 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
1ceb0 6d 65 6d 73 65 74 28 26 64 75 6d 6d 79 2c 20 30  memset(&dummy, 0
1cec0 2c 20 73 69 7a 65 6f 66 28 64 75 6d 6d 79 29 29  , sizeof(dummy))
1ced0 3b 0a 20 20 70 4e 65 77 53 72 63 20 3d 20 73 71  ;.  pNewSrc = sq
1cee0 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65  lite3SrcListAppe
1cef0 6e 64 46 72 6f 6d 54 65 72 6d 28 70 50 61 72 73  ndFromTerm(pPars
1cf00 65 2c 30 2c 30 2c 30 2c 26 64 75 6d 6d 79 2c 70  e,0,0,0,&dummy,p
1cf10 4e 65 77 2c 30 2c 30 29 3b 0a 20 20 69 66 28 20  New,0,0);.  if( 
1cf20 70 4e 65 77 53 72 63 3d 3d 30 20 29 20 72 65 74  pNewSrc==0 ) ret
1cf30 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
1cf40 20 2a 70 4e 65 77 20 3d 20 2a 70 3b 0a 20 20 70   *pNew = *p;.  p
1cf50 2d 3e 70 53 72 63 20 3d 20 70 4e 65 77 53 72 63  ->pSrc = pNewSrc
1cf60 3b 0a 20 20 70 2d 3e 70 45 4c 69 73 74 20 3d 20  ;.  p->pEList = 
1cf70 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
1cf80 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c  ppend(pParse, 0,
1cf90 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c   sqlite3Expr(db,
1cfa0 20 54 4b 5f 41 4c 4c 2c 20 30 29 29 3b 0a 20 20   TK_ALL, 0));.  
1cfb0 70 2d 3e 6f 70 20 3d 20 54 4b 5f 53 45 4c 45 43  p->op = TK_SELEC
1cfc0 54 3b 0a 20 20 70 2d 3e 70 57 68 65 72 65 20 3d  T;.  p->pWhere =
1cfd0 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 47 72 6f   0;.  pNew->pGro
1cfe0 75 70 42 79 20 3d 20 30 3b 0a 20 20 70 4e 65 77  upBy = 0;.  pNew
1cff0 2d 3e 70 48 61 76 69 6e 67 20 3d 20 30 3b 0a 20  ->pHaving = 0;. 
1d000 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79 20   pNew->pOrderBy 
1d010 3d 20 30 3b 0a 20 20 70 2d 3e 70 50 72 69 6f 72  = 0;.  p->pPrior
1d020 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c   = 0;.  pNew->pL
1d030 69 6d 69 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77  imit = 0;.  pNew
1d040 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20  ->pOffset = 0;. 
1d050 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
1d060 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  inue;.}../*.** T
1d070 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
1d080 20 57 61 6c 6b 65 72 20 63 61 6c 6c 62 61 63 6b   Walker callback
1d090 20 66 6f 72 20 22 65 78 70 61 6e 64 69 6e 67 22   for "expanding"
1d0a0 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
1d0b0 65 6e 74 2e 0a 2a 2a 20 22 45 78 70 61 6e 64 69  ent..** "Expandi
1d0c0 6e 67 22 20 6d 65 61 6e 73 20 74 6f 20 64 6f 20  ng" means to do 
1d0d0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a  the following:.*
1d0e0 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20 4d 61 6b  *.**    (1)  Mak
1d0f0 65 20 73 75 72 65 20 56 44 42 45 20 63 75 72 73  e sure VDBE curs
1d100 6f 72 20 6e 75 6d 62 65 72 73 20 68 61 76 65 20  or numbers have 
1d110 62 65 65 6e 20 61 73 73 69 67 6e 65 64 20 74 6f  been assigned to
1d120 20 65 76 65 72 79 0a 2a 2a 20 20 20 20 20 20 20   every.**       
1d130 20 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65    element of the
1d140 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a   FROM clause..**
1d150 0a 2a 2a 20 20 20 20 28 32 29 20 20 46 69 6c 6c  .**    (2)  Fill
1d160 20 69 6e 20 74 68 65 20 70 54 61 62 4c 69 73 74   in the pTabList
1d170 2d 3e 61 5b 5d 2e 70 54 61 62 20 66 69 65 6c 64  ->a[].pTab field
1d180 73 20 69 6e 20 74 68 65 20 53 72 63 4c 69 73 74  s in the SrcList
1d190 20 74 68 61 74 20 0a 2a 2a 20 20 20 20 20 20 20   that .**       
1d1a0 20 20 64 65 66 69 6e 65 73 20 46 52 4f 4d 20 63    defines FROM c
1d1b0 6c 61 75 73 65 2e 20 20 57 68 65 6e 20 76 69 65  lause.  When vie
1d1c0 77 73 20 61 70 70 65 61 72 20 69 6e 20 74 68 65  ws appear in the
1d1d0 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c 0a 2a 2a   FROM clause,.**
1d1e0 20 20 20 20 20 20 20 20 20 66 69 6c 6c 20 70 54           fill pT
1d1f0 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70 53 65 6c  abList->a[].pSel
1d200 65 63 74 20 77 69 74 68 20 61 20 63 6f 70 79 20  ect with a copy 
1d210 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  of the SELECT st
1d220 61 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20  atement.**      
1d230 20 20 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e     that implemen
1d240 74 73 20 74 68 65 20 76 69 65 77 2e 20 20 41 20  ts the view.  A 
1d250 63 6f 70 79 20 69 73 20 6d 61 64 65 20 6f 66 20  copy is made of 
1d260 74 68 65 20 76 69 65 77 27 73 20 53 45 4c 45 43  the view's SELEC
1d270 54 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 74 61  T.**         sta
1d280 74 65 6d 65 6e 74 20 73 6f 20 74 68 61 74 20 77  tement so that w
1d290 65 20 63 61 6e 20 66 72 65 65 6c 79 20 6d 6f 64  e can freely mod
1d2a0 69 66 79 20 6f 72 20 64 65 6c 65 74 65 20 74 68  ify or delete th
1d2b0 61 74 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20  at statement.** 
1d2c0 20 20 20 20 20 20 20 20 77 69 74 68 6f 75 74 20          without 
1d2d0 77 6f 72 72 79 69 6e 67 20 61 62 6f 75 74 20 6d  worrying about m
1d2e0 65 73 73 69 6e 67 20 75 70 20 74 68 65 20 70 72  essing up the pr
1d2f0 65 73 69 73 74 65 6e 74 20 72 65 70 72 65 73 65  esistent represe
1d300 6e 74 61 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 20  ntation.**      
1d310 20 20 20 6f 66 20 74 68 65 20 76 69 65 77 2e 0a     of the view..
1d320 2a 2a 0a 2a 2a 20 20 20 20 28 33 29 20 20 41 64  **.**    (3)  Ad
1d330 64 20 74 65 72 6d 73 20 74 6f 20 74 68 65 20 57  d terms to the W
1d340 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20 61  HERE clause to a
1d350 63 63 6f 6d 6f 64 61 74 65 20 74 68 65 20 4e 41  ccomodate the NA
1d360 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 0a 2a 2a  TURAL keyword.**
1d370 20 20 20 20 20 20 20 20 20 6f 6e 20 6a 6f 69 6e           on join
1d380 73 20 61 6e 64 20 74 68 65 20 4f 4e 20 61 6e 64  s and the ON and
1d390 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66   USING clause of
1d3a0 20 6a 6f 69 6e 73 2e 0a 2a 2a 0a 2a 2a 20 20 20   joins..**.**   
1d3b0 20 28 34 29 20 20 53 63 61 6e 20 74 68 65 20 6c   (4)  Scan the l
1d3c0 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ist of columns i
1d3d0 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
1d3e0 20 28 70 45 4c 69 73 74 29 20 6c 6f 6f 6b 69 6e   (pEList) lookin
1d3f0 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 66 6f 72  g.**         for
1d400 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68   instances of th
1d410 65 20 22 2a 22 20 6f 70 65 72 61 74 6f 72 20 6f  e "*" operator o
1d420 72 20 74 68 65 20 54 41 42 4c 45 2e 2a 20 6f 70  r the TABLE.* op
1d430 65 72 61 74 6f 72 2e 0a 2a 2a 20 20 20 20 20 20  erator..**      
1d440 20 20 20 49 66 20 66 6f 75 6e 64 2c 20 65 78 70     If found, exp
1d450 61 6e 64 20 65 61 63 68 20 22 2a 22 20 74 6f 20  and each "*" to 
1d460 62 65 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20  be every column 
1d470 69 6e 20 65 76 65 72 79 20 74 61 62 6c 65 0a 2a  in every table.*
1d480 2a 20 20 20 20 20 20 20 20 20 61 6e 64 20 54 41  *         and TA
1d490 42 4c 45 2e 2a 20 74 6f 20 62 65 20 65 76 65 72  BLE.* to be ever
1d4a0 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 54 41 42 4c  y column in TABL
1d4b0 45 2e 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20  E..**.*/.static 
1d4c0 69 6e 74 20 73 65 6c 65 63 74 45 78 70 61 6e 64  int selectExpand
1d4d0 65 72 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b  er(Walker *pWalk
1d4e0 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a  er, Select *p){.
1d4f0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20    Parse *pParse 
1d500 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73  = pWalker->pPars
1d510 65 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b  e;.  int i, j, k
1d520 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  ;.  SrcList *pTa
1d530 62 4c 69 73 74 3b 0a 20 20 45 78 70 72 4c 69 73  bList;.  ExprLis
1d540 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 73 74 72  t *pEList;.  str
1d550 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
1d560 20 2a 70 46 72 6f 6d 3b 0a 20 20 73 71 6c 69 74   *pFrom;.  sqlit
1d570 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
1d580 3e 64 62 3b 0a 20 20 45 78 70 72 20 2a 70 45 2c  >db;.  Expr *pE,
1d590 20 2a 70 52 69 67 68 74 2c 20 2a 70 45 78 70 72   *pRight, *pExpr
1d5a0 3b 0a 20 20 75 31 36 20 73 65 6c 46 6c 61 67 73  ;.  u16 selFlags
1d5b0 20 3d 20 70 2d 3e 73 65 6c 46 6c 61 67 73 3b 0a   = p->selFlags;.
1d5c0 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c  .  p->selFlags |
1d5d0 3d 20 53 46 5f 45 78 70 61 6e 64 65 64 3b 0a 20  = SF_Expanded;. 
1d5e0 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
1d5f0 61 69 6c 65 64 20 20 29 7b 0a 20 20 20 20 72 65  ailed  ){.    re
1d600 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
1d610 20 20 7d 0a 20 20 69 66 28 20 4e 45 56 45 52 28    }.  if( NEVER(
1d620 70 2d 3e 70 53 72 63 3d 3d 30 29 20 7c 7c 20 28  p->pSrc==0) || (
1d630 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 45 78  selFlags & SF_Ex
1d640 70 61 6e 64 65 64 29 21 3d 30 20 29 7b 0a 20 20  panded)!=0 ){.  
1d650 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75    return WRC_Pru
1d660 6e 65 3b 0a 20 20 7d 0a 20 20 70 54 61 62 4c 69  ne;.  }.  pTabLi
1d670 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20  st = p->pSrc;.  
1d680 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69  pEList = p->pELi
1d690 73 74 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73  st;..  /* Make s
1d6a0 75 72 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  ure cursor numbe
1d6b0 72 73 20 68 61 76 65 20 62 65 65 6e 20 61 73 73  rs have been ass
1d6c0 69 67 6e 65 64 20 74 6f 20 61 6c 6c 20 65 6e 74  igned to all ent
1d6d0 72 69 65 73 20 69 6e 0a 20 20 2a 2a 20 74 68 65  ries in.  ** the
1d6e0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
1d6f0 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
1d700 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  ment..  */.  sql
1d710 69 74 65 33 53 72 63 4c 69 73 74 41 73 73 69 67  ite3SrcListAssig
1d720 6e 43 75 72 73 6f 72 73 28 70 50 61 72 73 65 2c  nCursors(pParse,
1d730 20 70 54 61 62 4c 69 73 74 29 3b 0a 0a 20 20 2f   pTabList);..  /
1d740 2a 20 4c 6f 6f 6b 20 75 70 20 65 76 65 72 79 20  * Look up every 
1d750 74 61 62 6c 65 20 6e 61 6d 65 64 20 69 6e 20 74  table named in t
1d760 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
1d770 66 20 74 68 65 20 73 65 6c 65 63 74 2e 20 20 49  f the select.  I
1d780 66 0a 20 20 2a 2a 20 61 6e 20 65 6e 74 72 79 20  f.  ** an entry 
1d790 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  of the FROM clau
1d7a0 73 65 20 69 73 20 61 20 73 75 62 71 75 65 72 79  se is a subquery
1d7b0 20 69 6e 73 74 65 61 64 20 6f 66 20 61 20 74 61   instead of a ta
1d7c0 62 6c 65 20 6f 72 20 76 69 65 77 2c 0a 20 20 2a  ble or view,.  *
1d7d0 2a 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20  * then create a 
1d7e0 74 72 61 6e 73 69 65 6e 74 20 74 61 62 6c 65 20  transient table 
1d7f0 73 74 72 75 63 74 75 72 65 20 74 6f 20 64 65 73  structure to des
1d800 63 72 69 62 65 20 74 68 65 20 73 75 62 71 75 65  cribe the subque
1d810 72 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  ry..  */.  for(i
1d820 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69  =0, pFrom=pTabLi
1d830 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73  st->a; i<pTabLis
1d840 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46  t->nSrc; i++, pF
1d850 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c  rom++){.    Tabl
1d860 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 69 66 28  e *pTab;.    if(
1d870 20 70 46 72 6f 6d 2d 3e 70 54 61 62 21 3d 30 20   pFrom->pTab!=0 
1d880 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73  ){.      /* This
1d890 20 73 74 61 74 65 6d 65 6e 74 20 68 61 73 20 61   statement has a
1d8a0 6c 72 65 61 64 79 20 62 65 65 6e 20 70 72 65 70  lready been prep
1d8b0 61 72 65 64 2e 20 20 54 68 65 72 65 20 69 73 20  ared.  There is 
1d8c0 6e 6f 20 6e 65 65 64 0a 20 20 20 20 20 20 2a 2a  no need.      **
1d8d0 20 74 6f 20 67 6f 20 66 75 72 74 68 65 72 2e 20   to go further. 
1d8e0 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
1d8f0 20 69 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72   i==0 );.      r
1d900 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b  eturn WRC_Prune;
1d910 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
1d920 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 29  From->zName==0 )
1d930 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
1d940 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
1d950 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65       Select *pSe
1d960 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65  l = pFrom->pSele
1d970 63 74 3b 0a 20 20 20 20 20 20 2f 2a 20 41 20 73  ct;.      /* A s
1d980 75 62 2d 71 75 65 72 79 20 69 6e 20 74 68 65 20  ub-query in the 
1d990 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61  FROM clause of a
1d9a0 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20 20   SELECT */.     
1d9b0 20 61 73 73 65 72 74 28 20 70 53 65 6c 21 3d 30   assert( pSel!=0
1d9c0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1d9d0 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30  ( pFrom->pTab==0
1d9e0 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
1d9f0 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c  3WalkSelect(pWal
1da00 6b 65 72 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20  ker, pSel);.    
1da10 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20    pFrom->pTab = 
1da20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 44 62  pTab = sqlite3Db
1da30 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
1da40 69 7a 65 6f 66 28 54 61 62 6c 65 29 29 3b 0a 20  izeof(Table));. 
1da50 20 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30       if( pTab==0
1da60 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62   ) return WRC_Ab
1da70 6f 72 74 3b 0a 20 20 20 20 20 20 70 54 61 62 2d  ort;.      pTab-
1da80 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 20  >nRef = 1;.     
1da90 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 73   pTab->zName = s
1daa0 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
1dab0 2c 20 22 73 71 6c 69 74 65 5f 73 71 5f 25 70 22  , "sqlite_sq_%p"
1dac0 2c 20 28 76 6f 69 64 2a 29 70 54 61 62 29 3b 0a  , (void*)pTab);.
1dad0 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 53 65        while( pSe
1dae0 6c 2d 3e 70 50 72 69 6f 72 20 29 7b 20 70 53 65  l->pPrior ){ pSe
1daf0 6c 20 3d 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72  l = pSel->pPrior
1db00 3b 20 7d 0a 20 20 20 20 20 20 73 65 6c 65 63 74  ; }.      select
1db10 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c  ColumnsFromExprL
1db20 69 73 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c  ist(pParse, pSel
1db30 2d 3e 70 45 4c 69 73 74 2c 20 26 70 54 61 62 2d  ->pEList, &pTab-
1db40 3e 6e 43 6f 6c 2c 20 26 70 54 61 62 2d 3e 61 43  >nCol, &pTab->aC
1db50 6f 6c 29 3b 0a 20 20 20 20 20 20 70 54 61 62 2d  ol);.      pTab-
1db60 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 20  >iPKey = -1;.   
1db70 20 20 20 70 54 61 62 2d 3e 6e 52 6f 77 45 73 74     pTab->nRowEst
1db80 20 3d 20 31 30 34 38 35 37 36 3b 0a 20 20 20 20   = 1048576;.    
1db90 20 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73    pTab->tabFlags
1dba0 20 7c 3d 20 54 46 5f 45 70 68 65 6d 65 72 61 6c   |= TF_Ephemeral
1dbb0 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c  ;.#endif.    }el
1dbc0 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20  se{.      /* An 
1dbd0 6f 72 64 69 6e 61 72 79 20 74 61 62 6c 65 20 6f  ordinary table o
1dbe0 72 20 76 69 65 77 20 6e 61 6d 65 20 69 6e 20 74  r view name in t
1dbf0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a  he FROM clause *
1dc00 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
1dc10 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29  pFrom->pTab==0 )
1dc20 3b 0a 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70  ;.      pFrom->p
1dc30 54 61 62 20 3d 20 70 54 61 62 20 3d 20 73 71 6c  Tab = pTab = sql
1dc40 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 49  ite3LocateTableI
1dc50 74 65 6d 28 70 50 61 72 73 65 2c 20 30 2c 20 70  tem(pParse, 0, p
1dc60 46 72 6f 6d 29 3b 0a 20 20 20 20 20 20 69 66 28  From);.      if(
1dc70 20 70 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72   pTab==0 ) retur
1dc80 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20  n WRC_Abort;.   
1dc90 20 20 20 69 66 28 20 70 54 61 62 2d 3e 6e 52 65     if( pTab->nRe
1dca0 66 3d 3d 30 78 66 66 66 66 20 29 7b 0a 20 20 20  f==0xffff ){.   
1dcb0 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
1dcc0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f  rMsg(pParse, "to
1dcd0 6f 20 6d 61 6e 79 20 72 65 66 65 72 65 6e 63 65  o many reference
1dce0 73 20 74 6f 20 5c 22 25 73 5c 22 3a 20 6d 61 78  s to \"%s\": max
1dcf0 20 36 35 35 33 35 22 2c 0a 20 20 20 20 20 20 20   65535",.       
1dd00 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29      pTab->zName)
1dd10 3b 0a 20 20 20 20 20 20 20 20 70 46 72 6f 6d 2d  ;.        pFrom-
1dd20 3e 70 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 20  >pTab = 0;.     
1dd30 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62     return WRC_Ab
1dd40 6f 72 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ort;.      }.   
1dd50 20 20 20 70 54 61 62 2d 3e 6e 52 65 66 2b 2b 3b     pTab->nRef++;
1dd60 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
1dd70 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20  LITE_OMIT_VIEW) 
1dd80 7c 7c 20 21 64 65 66 69 6e 65 64 20 28 53 51 4c  || !defined (SQL
1dd90 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
1dda0 54 41 42 4c 45 29 0a 20 20 20 20 20 20 69 66 28  TABLE).      if(
1ddb0 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 7c   pTab->pSelect |
1ddc0 7c 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  | IsVirtual(pTab
1ddd0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
1dde0 57 65 20 72 65 61 63 68 20 68 65 72 65 20 69 66  We reach here if
1ddf0 20 74 68 65 20 6e 61 6d 65 64 20 74 61 62 6c 65   the named table
1de00 20 69 73 20 61 20 72 65 61 6c 6c 79 20 61 20 76   is a really a v
1de10 69 65 77 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  iew */.        i
1de20 66 28 20 73 71 6c 69 74 65 33 56 69 65 77 47 65  f( sqlite3ViewGe
1de30 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61  tColumnNames(pPa
1de40 72 73 65 2c 20 70 54 61 62 29 20 29 20 72 65 74  rse, pTab) ) ret
1de50 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
1de60 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
1de70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3d 3d 30  From->pSelect==0
1de80 20 29 3b 0a 20 20 20 20 20 20 20 20 70 46 72 6f   );.        pFro
1de90 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c  m->pSelect = sql
1dea0 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62  ite3SelectDup(db
1deb0 2c 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 2c  , pTab->pSelect,
1dec0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   0);.        sql
1ded0 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70  ite3WalkSelect(p
1dee0 57 61 6c 6b 65 72 2c 20 70 46 72 6f 6d 2d 3e 70  Walker, pFrom->p
1def0 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 7d  Select);.      }
1df00 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20  .#endif.    }.. 
1df10 20 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65     /* Locate the
1df20 20 69 6e 64 65 78 20 6e 61 6d 65 64 20 62 79 20   index named by 
1df30 74 68 65 20 49 4e 44 45 58 45 44 20 42 59 20 63  the INDEXED BY c
1df40 6c 61 75 73 65 2c 20 69 66 20 61 6e 79 2e 20 2a  lause, if any. *
1df50 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  /.    if( sqlite
1df60 33 49 6e 64 65 78 65 64 42 79 4c 6f 6f 6b 75 70  3IndexedByLookup
1df70 28 70 50 61 72 73 65 2c 20 70 46 72 6f 6d 29 20  (pParse, pFrom) 
1df80 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1df90 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 7d  WRC_Abort;.    }
1dfa0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 6f 63 65  .  }..  /* Proce
1dfb0 73 73 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f  ss NATURAL keywo
1dfc0 72 64 73 2c 20 61 6e 64 20 4f 4e 20 61 6e 64 20  rds, and ON and 
1dfd0 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20 6f 66  USING clauses of
1dfe0 20 6a 6f 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69   joins..  */.  i
1dff0 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
1e000 6c 65 64 20 7c 7c 20 73 71 6c 69 74 65 50 72 6f  led || sqlitePro
1e010 63 65 73 73 4a 6f 69 6e 28 70 50 61 72 73 65 2c  cessJoin(pParse,
1e020 20 70 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72   p) ){.    retur
1e030 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d  n WRC_Abort;.  }
1e040 0a 0a 20 20 2f 2a 20 46 6f 72 20 65 76 65 72 79  ..  /* For every
1e050 20 22 2a 22 20 74 68 61 74 20 6f 63 63 75 72 73   "*" that occurs
1e060 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6c   in the column l
1e070 69 73 74 2c 20 69 6e 73 65 72 74 20 74 68 65 20  ist, insert the 
1e080 6e 61 6d 65 73 20 6f 66 0a 20 20 2a 2a 20 61 6c  names of.  ** al
1e090 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c  l columns in all
1e0a0 20 74 61 62 6c 65 73 2e 20 20 41 6e 64 20 66 6f   tables.  And fo
1e0b0 72 20 65 76 65 72 79 20 54 41 42 4c 45 2e 2a 20  r every TABLE.* 
1e0c0 69 6e 73 65 72 74 20 74 68 65 20 6e 61 6d 65 73  insert the names
1e0d0 0a 20 20 2a 2a 20 6f 66 20 61 6c 6c 20 63 6f 6c  .  ** of all col
1e0e0 75 6d 6e 73 20 69 6e 20 54 41 42 4c 45 2e 20 20  umns in TABLE.  
1e0f0 54 68 65 20 70 61 72 73 65 72 20 69 6e 73 65 72  The parser inser
1e100 74 65 64 20 61 20 73 70 65 63 69 61 6c 20 65 78  ted a special ex
1e110 70 72 65 73 73 69 6f 6e 0a 20 20 2a 2a 20 77 69  pression.  ** wi
1e120 74 68 20 74 68 65 20 54 4b 5f 41 4c 4c 20 6f 70  th the TK_ALL op
1e130 65 72 61 74 6f 72 20 66 6f 72 20 65 61 63 68 20  erator for each 
1e140 22 2a 22 20 74 68 61 74 20 69 74 20 66 6f 75 6e  "*" that it foun
1e150 64 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20  d in the column 
1e160 6c 69 73 74 2e 0a 20 20 2a 2a 20 54 68 65 20 66  list..  ** The f
1e170 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20 6a 75  ollowing code ju
1e180 73 74 20 68 61 73 20 74 6f 20 6c 6f 63 61 74 65  st has to locate
1e190 20 74 68 65 20 54 4b 5f 41 4c 4c 20 65 78 70 72   the TK_ALL expr
1e1a0 65 73 73 69 6f 6e 73 20 61 6e 64 20 65 78 70 61  essions and expa
1e1b0 6e 64 0a 20 20 2a 2a 20 65 61 63 68 20 6f 6e 65  nd.  ** each one
1e1c0 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20   to the list of 
1e1d0 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61  all columns in a
1e1e0 6c 6c 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a  ll tables..  **.
1e1f0 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20 6c    ** The first l
1e200 6f 6f 70 20 6a 75 73 74 20 63 68 65 63 6b 73 20  oop just checks 
1e210 74 6f 20 73 65 65 20 69 66 20 74 68 65 72 65 20  to see if there 
1e220 61 72 65 20 61 6e 79 20 22 2a 22 20 6f 70 65 72  are any "*" oper
1e230 61 74 6f 72 73 0a 20 20 2a 2a 20 74 68 61 74 20  ators.  ** that 
1e240 6e 65 65 64 20 65 78 70 61 6e 64 69 6e 67 2e 0a  need expanding..
1e250 20 20 2a 2f 0a 20 20 66 6f 72 28 6b 3d 30 3b 20    */.  for(k=0; 
1e260 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  k<pEList->nExpr;
1e270 20 6b 2b 2b 29 7b 0a 20 20 20 20 70 45 20 3d 20   k++){.    pE = 
1e280 70 45 4c 69 73 74 2d 3e 61 5b 6b 5d 2e 70 45 78  pEList->a[k].pEx
1e290 70 72 3b 0a 20 20 20 20 69 66 28 20 70 45 2d 3e  pr;.    if( pE->
1e2a0 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 20 62 72 65  op==TK_ALL ) bre
1e2b0 61 6b 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ak;.    assert( 
1e2c0 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c  pE->op!=TK_DOT |
1e2d0 7c 20 70 45 2d 3e 70 52 69 67 68 74 21 3d 30 20  | pE->pRight!=0 
1e2e0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
1e2f0 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c  E->op!=TK_DOT ||
1e300 20 28 70 45 2d 3e 70 4c 65 66 74 21 3d 30 20 26   (pE->pLeft!=0 &
1e310 26 20 70 45 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d  & pE->pLeft->op=
1e320 3d 54 4b 5f 49 44 29 20 29 3b 0a 20 20 20 20 69  =TK_ID) );.    i
1e330 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f  f( pE->op==TK_DO
1e340 54 20 26 26 20 70 45 2d 3e 70 52 69 67 68 74 2d  T && pE->pRight-
1e350 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 20 62 72  >op==TK_ALL ) br
1e360 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6b  eak;.  }.  if( k
1e370 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  <pEList->nExpr )
1e380 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  {.    /*.    ** 
1e390 49 66 20 77 65 20 67 65 74 20 68 65 72 65 20 69  If we get here i
1e3a0 74 20 6d 65 61 6e 73 20 74 68 65 20 72 65 73 75  t means the resu
1e3b0 6c 74 20 73 65 74 20 63 6f 6e 74 61 69 6e 73 20  lt set contains 
1e3c0 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 22 2a 22 0a  one or more "*".
1e3d0 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72 73      ** operators
1e3e0 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65   that need to be
1e3f0 20 65 78 70 61 6e 64 65 64 2e 20 20 4c 6f 6f 70   expanded.  Loop
1e400 20 74 68 72 6f 75 67 68 20 65 61 63 68 20 65 78   through each ex
1e410 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2a 20  pression.    ** 
1e420 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
1e430 74 20 61 6e 64 20 65 78 70 61 6e 64 20 74 68 65  t and expand the
1e440 6d 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20  m one by one..  
1e450 20 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20    */.    struct 
1e460 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61  ExprList_item *a
1e470 20 3d 20 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20   = pEList->a;.  
1e480 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4e 65 77    ExprList *pNew
1e490 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 66 6c   = 0;.    int fl
1e4a0 61 67 73 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  ags = pParse->db
1e4b0 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 69 6e 74  ->flags;.    int
1e4c0 20 6c 6f 6e 67 4e 61 6d 65 73 20 3d 20 28 66 6c   longNames = (fl
1e4d0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 75 6c  ags & SQLITE_Ful
1e4e0 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 0a 20 20  lColNames)!=0.  
1e4f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e500 20 20 20 20 26 26 20 28 66 6c 61 67 73 20 26 20      && (flags & 
1e510 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e  SQLITE_ShortColN
1e520 61 6d 65 73 29 3d 3d 30 3b 0a 0a 20 20 20 20 2f  ames)==0;..    /
1e530 2a 20 57 68 65 6e 20 70 72 6f 63 65 73 73 69 6e  * When processin
1e540 67 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75  g FROM-clause su
1e550 62 71 75 65 72 69 65 73 2c 20 69 74 20 69 73 20  bqueries, it is 
1e560 61 6c 77 61 79 73 20 74 68 65 20 63 61 73 65 0a  always the case.
1e570 20 20 20 20 2a 2a 20 74 68 61 74 20 66 75 6c 6c      ** that full
1e580 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 73 3d 4f 46  _column_names=OF
1e590 46 20 61 6e 64 20 73 68 6f 72 74 5f 63 6f 6c 75  F and short_colu
1e5a0 6d 6e 5f 6e 61 6d 65 73 3d 4f 4e 2e 20 20 54 68  mn_names=ON.  Th
1e5b0 65 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  e.    ** sqlite3
1e5c0 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63  ResultSetOfSelec
1e5d0 74 28 29 20 72 6f 75 74 69 6e 65 20 6d 61 6b 65  t() routine make
1e5e0 73 20 69 74 20 73 6f 2e 20 2a 2f 0a 20 20 20 20  s it so. */.    
1e5f0 61 73 73 65 72 74 28 20 28 70 2d 3e 73 65 6c 46  assert( (p->selF
1e600 6c 61 67 73 20 26 20 53 46 5f 4e 65 73 74 65 64  lags & SF_Nested
1e610 46 72 6f 6d 29 3d 3d 30 0a 20 20 20 20 20 20 20  From)==0.       
1e620 20 20 20 7c 7c 20 28 28 66 6c 61 67 73 20 26 20     || ((flags & 
1e630 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61  SQLITE_FullColNa
1e640 6d 65 73 29 3d 3d 30 20 26 26 0a 20 20 20 20 20  mes)==0 &&.     
1e650 20 20 20 20 20 20 20 20 20 28 66 6c 61 67 73 20           (flags 
1e660 26 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f  & SQLITE_ShortCo
1e670 6c 4e 61 6d 65 73 29 21 3d 30 29 20 29 3b 0a 0a  lNames)!=0) );..
1e680 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70      for(k=0; k<p
1e690 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b  EList->nExpr; k+
1e6a0 2b 29 7b 0a 20 20 20 20 20 20 70 45 20 3d 20 61  +){.      pE = a
1e6b0 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [k].pExpr;.     
1e6c0 20 70 52 69 67 68 74 20 3d 20 70 45 2d 3e 70 52   pRight = pE->pR
1e6d0 69 67 68 74 3b 0a 20 20 20 20 20 20 61 73 73 65  ight;.      asse
1e6e0 72 74 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44  rt( pE->op!=TK_D
1e6f0 4f 54 20 7c 7c 20 70 52 69 67 68 74 21 3d 30 20  OT || pRight!=0 
1e700 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 2d  );.      if( pE-
1e710 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 20 26 26 20 28  >op!=TK_ALL && (
1e720 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c  pE->op!=TK_DOT |
1e730 7c 20 70 52 69 67 68 74 2d 3e 6f 70 21 3d 54 4b  | pRight->op!=TK
1e740 5f 41 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20 20  _ALL) ){.       
1e750 20 2f 2a 20 54 68 69 73 20 70 61 72 74 69 63 75   /* This particu
1e760 6c 61 72 20 65 78 70 72 65 73 73 69 6f 6e 20 64  lar expression d
1e770 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20  oes not need to 
1e780 62 65 20 65 78 70 61 6e 64 65 64 2e 0a 20 20 20  be expanded..   
1e790 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
1e7a0 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78  pNew = sqlite3Ex
1e7b0 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61  prListAppend(pPa
1e7c0 72 73 65 2c 20 70 4e 65 77 2c 20 61 5b 6b 5d 2e  rse, pNew, a[k].
1e7d0 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
1e7e0 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20  if( pNew ){.    
1e7f0 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e        pNew->a[pN
1e800 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a 4e 61  ew->nExpr-1].zNa
1e810 6d 65 20 3d 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 3b  me = a[k].zName;
1e820 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d  .          pNew-
1e830 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31  >a[pNew->nExpr-1
1e840 5d 2e 7a 53 70 61 6e 20 3d 20 61 5b 6b 5d 2e 7a  ].zSpan = a[k].z
1e850 53 70 61 6e 3b 0a 20 20 20 20 20 20 20 20 20 20  Span;.          
1e860 61 5b 6b 5d 2e 7a 4e 61 6d 65 20 3d 20 30 3b 0a  a[k].zName = 0;.
1e870 20 20 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 7a            a[k].z
1e880 53 70 61 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  Span = 0;.      
1e890 20 20 7d 0a 20 20 20 20 20 20 20 20 61 5b 6b 5d    }.        a[k]
1e8a0 2e 70 45 78 70 72 20 3d 20 30 3b 0a 20 20 20 20  .pExpr = 0;.    
1e8b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1e8c0 20 2f 2a 20 54 68 69 73 20 65 78 70 72 65 73 73   /* This express
1e8d0 69 6f 6e 20 69 73 20 61 20 22 2a 22 20 6f 72 20  ion is a "*" or 
1e8e0 61 20 22 54 41 42 4c 45 2e 2a 22 20 61 6e 64 20  a "TABLE.*" and 
1e8f0 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20 20 20  needs to be.    
1e900 20 20 20 20 2a 2a 20 65 78 70 61 6e 64 65 64 2e      ** expanded.
1e910 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
1e920 74 61 62 6c 65 53 65 65 6e 20 3d 20 30 3b 20 20  tableSeen = 0;  
1e930 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 31 20      /* Set to 1 
1e940 77 68 65 6e 20 54 41 42 4c 45 20 6d 61 74 63 68  when TABLE match
1e950 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 68  es */.        ch
1e960 61 72 20 2a 7a 54 4e 61 6d 65 20 3d 20 30 3b 20  ar *zTName = 0; 
1e970 20 20 20 20 20 20 2f 2a 20 74 65 78 74 20 6f 66        /* text of
1e980 20 6e 61 6d 65 20 6f 66 20 54 41 42 4c 45 20 2a   name of TABLE *
1e990 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 45  /.        if( pE
1e9a0 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29 7b 0a  ->op==TK_DOT ){.
1e9b0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
1e9c0 28 20 70 45 2d 3e 70 4c 65 66 74 21 3d 30 20 29  ( pE->pLeft!=0 )
1e9d0 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
1e9e0 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
1e9f0 65 72 74 79 28 70 45 2d 3e 70 4c 65 66 74 2c 20  erty(pE->pLeft, 
1ea00 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a  EP_IntValue) );.
1ea10 20 20 20 20 20 20 20 20 20 20 7a 54 4e 61 6d 65            zTName
1ea20 20 3d 20 70 45 2d 3e 70 4c 65 66 74 2d 3e 75 2e   = pE->pLeft->u.
1ea30 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20  zToken;.        
1ea40 7d 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  }.        for(i=
1ea50 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73  0, pFrom=pTabLis
1ea60 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74  t->a; i<pTabList
1ea70 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72  ->nSrc; i++, pFr
1ea80 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  om++){.         
1ea90 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
1eaa0 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20  From->pTab;.    
1eab0 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53        Select *pS
1eac0 75 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c  ub = pFrom->pSel
1ead0 65 63 74 3b 0a 20 20 20 20 20 20 20 20 20 20 63  ect;.          c
1eae0 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65 20 3d 20  har *zTabName = 
1eaf0 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 3b 0a 20  pFrom->zAlias;. 
1eb00 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63           const c
1eb10 68 61 72 20 2a 7a 53 63 68 65 6d 61 4e 61 6d 65  har *zSchemaName
1eb20 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
1eb30 69 6e 74 20 69 44 62 3b 0a 20 20 20 20 20 20 20  int iDb;.       
1eb40 20 20 20 69 66 28 20 7a 54 61 62 4e 61 6d 65 3d     if( zTabName=
1eb50 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
1eb60 20 20 7a 54 61 62 4e 61 6d 65 20 3d 20 70 54 61    zTabName = pTa
1eb70 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  b->zName;.      
1eb80 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1eb90 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
1eba0 69 6c 65 64 20 29 20 62 72 65 61 6b 3b 0a 20 20  iled ) break;.  
1ebb0 20 20 20 20 20 20 20 20 69 66 28 20 70 53 75 62          if( pSub
1ebc0 3d 3d 30 20 7c 7c 20 28 70 53 75 62 2d 3e 73 65  ==0 || (pSub->se
1ebd0 6c 46 6c 61 67 73 20 26 20 53 46 5f 4e 65 73 74  lFlags & SF_Nest
1ebe0 65 64 46 72 6f 6d 29 3d 3d 30 20 29 7b 0a 20 20  edFrom)==0 ){.  
1ebf0 20 20 20 20 20 20 20 20 20 20 70 53 75 62 20 3d            pSub =
1ec00 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
1ec10 69 66 28 20 7a 54 4e 61 6d 65 20 26 26 20 73 71  if( zTName && sq
1ec20 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 54 4e  lite3StrICmp(zTN
1ec30 61 6d 65 2c 20 7a 54 61 62 4e 61 6d 65 29 21 3d  ame, zTabName)!=
1ec40 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
1ec50 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
1ec60 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1ec70 20 20 20 20 20 20 20 69 44 62 20 3d 20 73 71 6c         iDb = sql
1ec80 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
1ec90 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68  x(db, pTab->pSch
1eca0 65 6d 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ema);.          
1ecb0 20 20 7a 53 63 68 65 6d 61 4e 61 6d 65 20 3d 20    zSchemaName = 
1ecc0 69 44 62 3e 3d 30 20 3f 20 64 62 2d 3e 61 44 62  iDb>=0 ? db->aDb
1ecd0 5b 69 44 62 5d 2e 7a 4e 61 6d 65 20 3a 20 22 2a  [iDb].zName : "*
1ece0 22 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  ";.          }. 
1ecf0 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30           for(j=0
1ed00 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20  ; j<pTab->nCol; 
1ed10 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j++){.          
1ed20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20    char *zName = 
1ed30 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e  pTab->aCol[j].zN
1ed40 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ame;.           
1ed50 20 63 68 61 72 20 2a 7a 43 6f 6c 6e 61 6d 65 3b   char *zColname;
1ed60 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 75 74 65    /* The compute
1ed70 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f  d column name */
1ed80 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61  .            cha
1ed90 72 20 2a 7a 54 6f 46 72 65 65 3b 20 20 20 2f 2a  r *zToFree;   /*
1eda0 20 4d 61 6c 6c 6f 63 65 64 20 73 74 72 69 6e 67   Malloced string
1edb0 20 74 68 61 74 20 6e 65 65 64 73 20 74 6f 20 62   that needs to b
1edc0 65 20 66 72 65 65 64 20 2a 2f 0a 20 20 20 20 20  e freed */.     
1edd0 20 20 20 20 20 20 20 54 6f 6b 65 6e 20 73 43 6f         Token sCo
1ede0 6c 6e 61 6d 65 3b 20 20 2f 2a 20 43 6f 6d 70 75  lname;  /* Compu
1edf0 74 65 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20  ted column name 
1ee00 61 73 20 61 20 74 6f 6b 65 6e 20 2a 2f 0a 0a 20  as a token */.. 
1ee10 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
1ee20 74 28 20 7a 4e 61 6d 65 20 29 3b 0a 20 20 20 20  t( zName );.    
1ee30 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 4e 61          if( zTNa
1ee40 6d 65 20 26 26 20 70 53 75 62 0a 20 20 20 20 20  me && pSub.     
1ee50 20 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74          && sqlit
1ee60 65 33 4d 61 74 63 68 53 70 61 6e 4e 61 6d 65 28  e3MatchSpanName(
1ee70 70 53 75 62 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b  pSub->pEList->a[
1ee80 6a 5d 2e 7a 53 70 61 6e 2c 20 30 2c 20 7a 54 4e  j].zSpan, 0, zTN
1ee90 61 6d 65 2c 20 30 29 3d 3d 30 0a 20 20 20 20 20  ame, 0)==0.     
1eea0 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
1eeb0 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
1eec0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
1eed0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
1eee0 49 66 20 61 20 63 6f 6c 75 6d 6e 20 69 73 20 6d  If a column is m
1eef0 61 72 6b 65 64 20 61 73 20 27 68 69 64 64 65 6e  arked as 'hidden
1ef00 27 20 28 63 75 72 72 65 6e 74 6c 79 20 6f 6e 6c  ' (currently onl
1ef10 79 20 70 6f 73 73 69 62 6c 65 0a 20 20 20 20 20  y possible.     
1ef20 20 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 76 69         ** for vi
1ef30 72 74 75 61 6c 20 74 61 62 6c 65 73 29 2c 20 64  rtual tables), d
1ef40 6f 20 6e 6f 74 20 69 6e 63 6c 75 64 65 20 69 74  o not include it
1ef50 20 69 6e 20 74 68 65 20 65 78 70 61 6e 64 65 64   in the expanded
1ef60 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
1ef70 72 65 73 75 6c 74 2d 73 65 74 20 6c 69 73 74 2e  result-set list.
1ef80 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  .            */.
1ef90 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
1efa0 49 73 48 69 64 64 65 6e 43 6f 6c 75 6d 6e 28 26  IsHiddenColumn(&
1efb0 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 29 20 29  pTab->aCol[j]) )
1efc0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1efd0 61 73 73 65 72 74 28 49 73 56 69 72 74 75 61 6c  assert(IsVirtual
1efe0 28 70 54 61 62 29 29 3b 0a 20 20 20 20 20 20 20  (pTab));.       
1eff0 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
1f000 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
1f010 20 20 20 20 20 20 20 20 20 20 20 74 61 62 6c 65             table
1f020 53 65 65 6e 20 3d 20 31 3b 0a 0a 20 20 20 20 20  Seen = 1;..     
1f030 20 20 20 20 20 20 20 69 66 28 20 69 3e 30 20 26         if( i>0 &
1f040 26 20 7a 54 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20  & zTName==0 ){. 
1f050 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
1f060 20 28 70 46 72 6f 6d 2d 3e 6a 6f 69 6e 74 79 70   (pFrom->jointyp
1f070 65 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c 29 21  e & JT_NATURAL)!
1f080 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  =0.             
1f090 20 20 20 26 26 20 74 61 62 6c 65 41 6e 64 43 6f     && tableAndCo
1f0a0 6c 75 6d 6e 49 6e 64 65 78 28 70 54 61 62 4c 69  lumnIndex(pTabLi
1f0b0 73 74 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20 30 2c  st, i, zName, 0,
1f0c0 20 30 29 0a 20 20 20 20 20 20 20 20 20 20 20 20   0).            
1f0d0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20    ){.           
1f0e0 20 20 20 20 20 2f 2a 20 49 6e 20 61 20 4e 41 54       /* In a NAT
1f0f0 55 52 41 4c 20 6a 6f 69 6e 2c 20 6f 6d 69 74 20  URAL join, omit 
1f100 74 68 65 20 6a 6f 69 6e 20 63 6f 6c 75 6d 6e 73  the join columns
1f110 20 66 72 6f 6d 20 74 68 65 20 0a 20 20 20 20 20   from the .     
1f120 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 61             ** ta
1f130 62 6c 65 20 74 6f 20 74 68 65 20 72 69 67 68 74  ble to the right
1f140 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a   of the join */.
1f150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f160 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
1f170 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1f180 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
1f190 74 65 33 49 64 4c 69 73 74 49 6e 64 65 78 28 70  te3IdListIndex(p
1f1a0 46 72 6f 6d 2d 3e 70 55 73 69 6e 67 2c 20 7a 4e  From->pUsing, zN
1f1b0 61 6d 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20  ame)>=0 ){.     
1f1c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
1f1d0 20 61 20 6a 6f 69 6e 20 77 69 74 68 20 61 20 55   a join with a U
1f1e0 53 49 4e 47 20 63 6c 61 75 73 65 2c 20 6f 6d 69  SING clause, omi
1f1f0 74 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  t columns in the
1f200 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1f210 20 2a 2a 20 75 73 69 6e 67 20 63 6c 61 75 73 65   ** using clause
1f220 20 66 72 6f 6d 20 74 68 65 20 74 61 62 6c 65 20   from the table 
1f230 6f 6e 20 74 68 65 20 72 69 67 68 74 2e 20 2a 2f  on the right. */
1f240 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1f250 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
1f260 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1f270 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1f280 20 20 20 20 20 70 52 69 67 68 74 20 3d 20 73 71       pRight = sq
1f290 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b  lite3Expr(db, TK
1f2a0 5f 49 44 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  _ID, zName);.   
1f2b0 20 20 20 20 20 20 20 20 20 7a 43 6f 6c 6e 61 6d           zColnam
1f2c0 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  e = zName;.     
1f2d0 20 20 20 20 20 20 20 7a 54 6f 46 72 65 65 20 3d         zToFree =
1f2e0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
1f2f0 69 66 28 20 6c 6f 6e 67 4e 61 6d 65 73 20 7c 7c  if( longNames ||
1f300 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e   pTabList->nSrc>
1f310 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  1 ){.           
1f320 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 3b 0a     Expr *pLeft;.
1f330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4c                pL
1f340 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  eft = sqlite3Exp
1f350 72 28 64 62 2c 20 54 4b 5f 49 44 2c 20 7a 54 61  r(db, TK_ID, zTa
1f360 62 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  bName);.        
1f370 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 73 71        pExpr = sq
1f380 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
1f390 65 2c 20 54 4b 5f 44 4f 54 2c 20 70 4c 65 66 74  e, TK_DOT, pLeft
1f3a0 2c 20 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20  , pRight, 0);.  
1f3b0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
1f3c0 7a 53 63 68 65 6d 61 4e 61 6d 65 20 29 7b 0a 20  zSchemaName ){. 
1f3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1f3e0 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78  Left = sqlite3Ex
1f3f0 70 72 28 64 62 2c 20 54 4b 5f 49 44 2c 20 7a 53  pr(db, TK_ID, zS
1f400 63 68 65 6d 61 4e 61 6d 65 29 3b 0a 20 20 20 20  chemaName);.    
1f410 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
1f420 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  r = sqlite3PExpr
1f430 28 70 50 61 72 73 65 2c 20 54 4b 5f 44 4f 54 2c  (pParse, TK_DOT,
1f440 20 70 4c 65 66 74 2c 20 70 45 78 70 72 2c 20 30   pLeft, pExpr, 0
1f450 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
1f460 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
1f470 20 69 66 28 20 6c 6f 6e 67 4e 61 6d 65 73 20 29   if( longNames )
1f480 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1f490 20 20 7a 43 6f 6c 6e 61 6d 65 20 3d 20 73 71 6c    zColname = sql
1f4a0 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
1f4b0 22 25 73 2e 25 73 22 2c 20 7a 54 61 62 4e 61 6d  "%s.%s", zTabNam
1f4c0 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  e, zName);.     
1f4d0 20 20 20 20 20 20 20 20 20 20 20 7a 54 6f 46 72             zToFr
1f4e0 65 65 20 3d 20 7a 43 6f 6c 6e 61 6d 65 3b 0a 20  ee = zColname;. 
1f4f0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
1f500 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65             }else
1f510 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1f520 70 45 78 70 72 20 3d 20 70 52 69 67 68 74 3b 0a  pExpr = pRight;.
1f530 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
1f540 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d            pNew =
1f550 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
1f560 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70  Append(pParse, p
1f570 4e 65 77 2c 20 70 45 78 70 72 29 3b 0a 20 20 20  New, pExpr);.   
1f580 20 20 20 20 20 20 20 20 20 73 43 6f 6c 6e 61 6d           sColnam
1f590 65 2e 7a 20 3d 20 7a 43 6f 6c 6e 61 6d 65 3b 0a  e.z = zColname;.
1f5a0 20 20 20 20 20 20 20 20 20 20 20 20 73 43 6f 6c              sCol
1f5b0 6e 61 6d 65 2e 6e 20 3d 20 73 71 6c 69 74 65 33  name.n = sqlite3
1f5c0 53 74 72 6c 65 6e 33 30 28 7a 43 6f 6c 6e 61 6d  Strlen30(zColnam
1f5d0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
1f5e0 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 53  sqlite3ExprListS
1f5f0 65 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70  etName(pParse, p
1f600 4e 65 77 2c 20 26 73 43 6f 6c 6e 61 6d 65 2c 20  New, &sColname, 
1f610 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
1f620 69 66 28 20 70 4e 65 77 20 26 26 20 28 70 2d 3e  if( pNew && (p->
1f630 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 4e 65  selFlags & SF_Ne
1f640 73 74 65 64 46 72 6f 6d 29 21 3d 30 20 29 7b 0a  stedFrom)!=0 ){.
1f650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74                st
1f660 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
1f670 65 6d 20 2a 70 58 20 3d 20 26 70 4e 65 77 2d 3e  em *pX = &pNew->
1f680 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d  a[pNew->nExpr-1]
1f690 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1f6a0 69 66 28 20 70 53 75 62 20 29 7b 0a 20 20 20 20  if( pSub ){.    
1f6b0 20 20 20 20 20 20 20 20 20 20 20 20 70 58 2d 3e              pX->
1f6c0 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74 65 33 44  zSpan = sqlite3D
1f6d0 62 53 74 72 44 75 70 28 64 62 2c 20 70 53 75 62  bStrDup(db, pSub
1f6e0 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a  ->pEList->a[j].z
1f6f0 53 70 61 6e 29 3b 0a 20 20 20 20 20 20 20 20 20  Span);.         
1f700 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
1f710 20 70 58 2d 3e 7a 53 70 61 6e 3d 3d 30 20 29 3b   pX->zSpan==0 );
1f720 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
1f730 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1f740 20 20 20 20 20 20 70 58 2d 3e 7a 53 70 61 6e 20        pX->zSpan 
1f750 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
1f760 28 64 62 2c 20 22 25 73 2e 25 73 2e 25 73 22 2c  (db, "%s.%s.%s",
1f770 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1f780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f790 20 20 20 20 20 20 20 20 20 20 20 20 7a 53 63 68              zSch
1f7a0 65 6d 61 4e 61 6d 65 2c 20 7a 54 61 62 4e 61 6d  emaName, zTabNam
1f7b0 65 2c 20 7a 43 6f 6c 6e 61 6d 65 29 3b 0a 20 20  e, zColname);.  
1f7c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65                te
1f7d0 73 74 63 61 73 65 28 20 70 58 2d 3e 7a 53 70 61  stcase( pX->zSpa
1f7e0 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  n==0 );.        
1f7f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1f800 20 20 20 20 20 20 70 58 2d 3e 62 53 70 61 6e 49        pX->bSpanI
1f810 73 54 61 62 20 3d 20 31 3b 0a 20 20 20 20 20 20  sTab = 1;.      
1f820 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1f830 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
1f840 65 28 64 62 2c 20 7a 54 6f 46 72 65 65 29 3b 0a  e(db, zToFree);.
1f850 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1f860 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
1f870 28 20 21 74 61 62 6c 65 53 65 65 6e 20 29 7b 0a  ( !tableSeen ){.
1f880 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 54            if( zT
1f890 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Name ){.        
1f8a0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
1f8b0 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20  Msg(pParse, "no 
1f8c0 73 75 63 68 20 74 61 62 6c 65 3a 20 25 73 22 2c  such table: %s",
1f8d0 20 7a 54 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20   zTName);.      
1f8e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1f8f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
1f900 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
1f910 6e 6f 20 74 61 62 6c 65 73 20 73 70 65 63 69 66  no tables specif
1f920 69 65 64 22 29 3b 0a 20 20 20 20 20 20 20 20 20  ied");.         
1f930 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
1f940 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
1f950 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
1f960 6c 65 74 65 28 64 62 2c 20 70 45 4c 69 73 74 29  lete(db, pEList)
1f970 3b 0a 20 20 20 20 70 2d 3e 70 45 4c 69 73 74 20  ;.    p->pEList 
1f980 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 23 69 66 20  = pNew;.  }.#if 
1f990 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d  SQLITE_MAX_COLUM
1f9a0 4e 0a 20 20 69 66 28 20 70 2d 3e 70 45 4c 69 73  N.  if( p->pELis
1f9b0 74 20 26 26 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  t && p->pEList->
1f9c0 6e 45 78 70 72 3e 64 62 2d 3e 61 4c 69 6d 69 74  nExpr>db->aLimit
1f9d0 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f  [SQLITE_LIMIT_CO
1f9e0 4c 55 4d 4e 5d 20 29 7b 0a 20 20 20 20 73 71 6c  LUMN] ){.    sql
1f9f0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
1fa00 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 63  rse, "too many c
1fa10 6f 6c 75 6d 6e 73 20 69 6e 20 72 65 73 75 6c 74  olumns in result
1fa20 20 73 65 74 22 29 3b 0a 20 20 7d 0a 23 65 6e 64   set");.  }.#end
1fa30 69 66 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f  if.  return WRC_
1fa40 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a  Continue;.}../*.
1fa50 2a 2a 20 4e 6f 2d 6f 70 20 72 6f 75 74 69 6e 65  ** No-op routine
1fa60 20 66 6f 72 20 74 68 65 20 70 61 72 73 65 2d 74   for the parse-t
1fa70 72 65 65 20 77 61 6c 6b 65 72 2e 0a 2a 2a 0a 2a  ree walker..**.*
1fa80 2a 20 57 68 65 6e 20 74 68 69 73 20 72 6f 75 74  * When this rout
1fa90 69 6e 65 20 69 73 20 74 68 65 20 57 61 6c 6b 65  ine is the Walke
1faa0 72 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20  r.xExprCallback 
1fab0 74 68 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  then expression 
1fac0 74 72 65 65 73 0a 2a 2a 20 61 72 65 20 77 61 6c  trees.** are wal
1fad0 6b 65 64 20 77 69 74 68 6f 75 74 20 61 6e 79 20  ked without any 
1fae0 61 63 74 69 6f 6e 73 20 62 65 69 6e 67 20 74 61  actions being ta
1faf0 6b 65 6e 20 61 74 20 65 61 63 68 20 6e 6f 64 65  ken at each node
1fb00 2e 20 20 50 72 65 73 75 6d 61 62 6c 79 2c 0a 2a  .  Presumably,.*
1fb10 2a 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74  * when this rout
1fb20 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20  ine is used for 
1fb30 57 61 6c 6b 65 72 2e 78 45 78 70 72 43 61 6c 6c  Walker.xExprCall
1fb40 62 61 63 6b 20 74 68 65 6e 20 0a 2a 2a 20 57 61  back then .** Wa
1fb50 6c 6b 65 72 2e 78 53 65 6c 65 63 74 43 61 6c 6c  lker.xSelectCall
1fb60 62 61 63 6b 20 69 73 20 73 65 74 20 74 6f 20 64  back is set to d
1fb70 6f 20 73 6f 6d 65 74 68 69 6e 67 20 75 73 65 66  o something usef
1fb80 75 6c 20 66 6f 72 20 65 76 65 72 79 20 0a 2a 2a  ul for every .**
1fb90 20 73 75 62 71 75 65 72 79 20 69 6e 20 74 68 65   subquery in the
1fba0 20 70 61 72 73 65 72 20 74 72 65 65 2e 0a 2a 2f   parser tree..*/
1fbb0 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72  .static int expr
1fbc0 57 61 6c 6b 4e 6f 6f 70 28 57 61 6c 6b 65 72 20  WalkNoop(Walker 
1fbd0 2a 4e 6f 74 55 73 65 64 2c 20 45 78 70 72 20 2a  *NotUsed, Expr *
1fbe0 4e 6f 74 55 73 65 64 32 29 7b 0a 20 20 55 4e 55  NotUsed2){.  UNU
1fbf0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 32 28 4e  SED_PARAMETER2(N
1fc00 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73 65 64 32  otUsed, NotUsed2
1fc10 29 3b 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f  );.  return WRC_
1fc20 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a  Continue;.}../*.
1fc30 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1fc40 22 65 78 70 61 6e 64 73 22 20 61 20 53 45 4c 45  "expands" a SELE
1fc50 43 54 20 73 74 61 74 65 6d 65 6e 74 20 61 6e 64  CT statement and
1fc60 20 61 6c 6c 20 6f 66 20 69 74 73 20 73 75 62 71   all of its subq
1fc70 75 65 72 69 65 73 2e 0a 2a 2a 20 46 6f 72 20 61  ueries..** For a
1fc80 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
1fc90 61 74 69 6f 6e 20 6f 6e 20 77 68 61 74 20 69 74  ation on what it
1fca0 20 6d 65 61 6e 73 20 74 6f 20 22 65 78 70 61 6e   means to "expan
1fcb0 64 22 20 61 20 53 45 4c 45 43 54 0a 2a 2a 20 73  d" a SELECT.** s
1fcc0 74 61 74 65 6d 65 6e 74 2c 20 73 65 65 20 74 68  tatement, see th
1fcd0 65 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 65  e comment on the
1fce0 20 73 65 6c 65 63 74 45 78 70 61 6e 64 20 77 6f   selectExpand wo
1fcf0 72 6b 65 72 20 63 61 6c 6c 62 61 63 6b 20 61 62  rker callback ab
1fd00 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20 45 78 70 61 6e  ove..**.** Expan
1fd10 64 69 6e 67 20 61 20 53 45 4c 45 43 54 20 73 74  ding a SELECT st
1fd20 61 74 65 6d 65 6e 74 20 69 73 20 74 68 65 20 66  atement is the f
1fd30 69 72 73 74 20 73 74 65 70 20 69 6e 20 70 72 6f  irst step in pro
1fd40 63 65 73 73 69 6e 67 20 61 0a 2a 2a 20 53 45 4c  cessing a.** SEL
1fd50 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  ECT statement.  
1fd60 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  The SELECT state
1fd70 6d 65 6e 74 20 6d 75 73 74 20 62 65 20 65 78 70  ment must be exp
1fd80 61 6e 64 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20  anded before.** 
1fd90 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 20  name resolution 
1fda0 69 73 20 70 65 72 66 6f 72 6d 65 64 2e 0a 2a 2a  is performed..**
1fdb0 0a 2a 2a 20 49 66 20 61 6e 79 74 68 69 6e 67 20  .** If anything 
1fdc0 67 6f 65 73 20 77 72 6f 6e 67 2c 20 61 6e 20 65  goes wrong, an e
1fdd0 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20  rror message is 
1fde0 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 70 50 61  written into pPa
1fdf0 72 73 65 2e 0a 2a 2a 20 54 68 65 20 63 61 6c 6c  rse..** The call
1fe00 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e  ing function can
1fe10 20 64 65 74 65 63 74 20 74 68 65 20 70 72 6f 62   detect the prob
1fe20 6c 65 6d 20 62 79 20 6c 6f 6f 6b 69 6e 67 20 61  lem by looking a
1fe30 74 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 0a 2a  t pParse->nErr.*
1fe40 2a 20 61 6e 64 2f 6f 72 20 70 50 61 72 73 65 2d  * and/or pParse-
1fe50 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
1fe60 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
1fe70 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45  d sqlite3SelectE
1fe80 78 70 61 6e 64 28 50 61 72 73 65 20 2a 70 50 61  xpand(Parse *pPa
1fe90 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 53 65  rse, Select *pSe
1fea0 6c 65 63 74 29 7b 0a 20 20 57 61 6c 6b 65 72 20  lect){.  Walker 
1feb0 77 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c 20  w;.  memset(&w, 
1fec0 30 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20  0, sizeof(w));. 
1fed0 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b   w.xExprCallback
1fee0 20 3d 20 65 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b   = exprWalkNoop;
1fef0 0a 20 20 77 2e 70 50 61 72 73 65 20 3d 20 70 50  .  w.pParse = pP
1ff00 61 72 73 65 3b 0a 20 20 69 66 28 20 70 50 61 72  arse;.  if( pPar
1ff10 73 65 2d 3e 68 61 73 43 6f 6d 70 6f 75 6e 64 20  se->hasCompound 
1ff20 29 7b 0a 20 20 20 20 77 2e 78 53 65 6c 65 63 74  ){.    w.xSelect
1ff30 43 61 6c 6c 62 61 63 6b 20 3d 20 63 6f 6e 76 65  Callback = conve
1ff40 72 74 43 6f 6d 70 6f 75 6e 64 53 65 6c 65 63 74  rtCompoundSelect
1ff50 54 6f 53 75 62 71 75 65 72 79 3b 0a 20 20 20 20  ToSubquery;.    
1ff60 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63  sqlite3WalkSelec
1ff70 74 28 26 77 2c 20 70 53 65 6c 65 63 74 29 3b 0a  t(&w, pSelect);.
1ff80 20 20 7d 0a 20 20 77 2e 78 53 65 6c 65 63 74 43    }.  w.xSelectC
1ff90 61 6c 6c 62 61 63 6b 20 3d 20 73 65 6c 65 63 74  allback = select
1ffa0 45 78 70 61 6e 64 65 72 3b 0a 20 20 73 71 6c 69  Expander;.  sqli
1ffb0 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 26 77  te3WalkSelect(&w
1ffc0 2c 20 70 53 65 6c 65 63 74 29 3b 0a 7d 0a 0a 0a  , pSelect);.}...
1ffd0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1ffe0 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a  MIT_SUBQUERY./*.
1fff0 2a 2a 20 54 68 69 73 20 69 73 20 61 20 57 61 6c  ** This is a Wal
20000 6b 65 72 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62  ker.xSelectCallb
20010 61 63 6b 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72  ack callback for
20020 20 74 68 65 20 73 71 6c 69 74 65 33 53 65 6c 65   the sqlite3Sele
20030 63 74 54 79 70 65 49 6e 66 6f 28 29 0a 2a 2a 20  ctTypeInfo().** 
20040 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2a 0a 2a 2a  interface..**.**
20050 20 46 6f 72 20 65 61 63 68 20 46 52 4f 4d 2d 63   For each FROM-c
20060 6c 61 75 73 65 20 73 75 62 71 75 65 72 79 2c 20  lause subquery, 
20070 61 64 64 20 43 6f 6c 75 6d 6e 2e 7a 54 79 70 65  add Column.zType
20080 20 61 6e 64 20 43 6f 6c 75 6d 6e 2e 7a 43 6f 6c   and Column.zCol
20090 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  l.** information
200a0 20 74 6f 20 74 68 65 20 54 61 62 6c 65 20 73 74   to the Table st
200b0 72 75 63 74 75 72 65 20 74 68 61 74 20 72 65 70  ructure that rep
200c0 72 65 73 65 6e 74 73 20 74 68 65 20 72 65 73 75  resents the resu
200d0 6c 74 20 73 65 74 0a 2a 2a 20 6f 66 20 74 68 61  lt set.** of tha
200e0 74 20 73 75 62 71 75 65 72 79 2e 0a 2a 2a 0a 2a  t subquery..**.*
200f0 2a 20 54 68 65 20 54 61 62 6c 65 20 73 74 72 75  * The Table stru
20100 63 74 75 72 65 20 74 68 61 74 20 72 65 70 72 65  cture that repre
20110 73 65 6e 74 73 20 74 68 65 20 72 65 73 75 6c 74  sents the result
20120 20 73 65 74 20 77 61 73 20 63 6f 6e 73 74 72 75   set was constru
20130 63 74 65 64 0a 2a 2a 20 62 79 20 73 65 6c 65 63  cted.** by selec
20140 74 45 78 70 61 6e 64 65 72 28 29 20 62 75 74 20  tExpander() but 
20150 74 68 65 20 74 79 70 65 20 61 6e 64 20 63 6f 6c  the type and col
20160 6c 61 74 69 6f 6e 20 69 6e 66 6f 72 6d 61 74 69  lation informati
20170 6f 6e 20 77 61 73 20 6f 6d 69 74 74 65 64 0a 2a  on was omitted.*
20180 2a 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74 20  * at that point 
20190 62 65 63 61 75 73 65 20 69 64 65 6e 74 69 66 69  because identifi
201a0 65 72 73 20 68 61 64 20 6e 6f 74 20 79 65 74 20  ers had not yet 
201b0 62 65 65 6e 20 72 65 73 6f 6c 76 65 64 2e 20 20  been resolved.  
201c0 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  This.** routine 
201d0 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20  is called after 
201e0 69 64 65 6e 74 69 66 69 65 72 20 72 65 73 6f 6c  identifier resol
201f0 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ution..*/.static
20200 20 69 6e 74 20 73 65 6c 65 63 74 41 64 64 53 75   int selectAddSu
20210 62 71 75 65 72 79 54 79 70 65 49 6e 66 6f 28 57  bqueryTypeInfo(W
20220 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
20230 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 50 61  Select *p){.  Pa
20240 72 73 65 20 2a 70 50 61 72 73 65 3b 0a 20 20 69  rse *pParse;.  i
20250 6e 74 20 69 3b 0a 20 20 53 72 63 4c 69 73 74 20  nt i;.  SrcList 
20260 2a 70 54 61 62 4c 69 73 74 3b 0a 20 20 73 74 72  *pTabList;.  str
20270 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
20280 20 2a 70 46 72 6f 6d 3b 0a 0a 20 20 61 73 73 65   *pFrom;..  asse
20290 72 74 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  rt( p->selFlags 
202a0 26 20 53 46 5f 52 65 73 6f 6c 76 65 64 20 29 3b  & SF_Resolved );
202b0 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c  .  if( (p->selFl
202c0 61 67 73 20 26 20 53 46 5f 48 61 73 54 79 70 65  ags & SF_HasType
202d0 49 6e 66 6f 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Info)==0 ){.    
202e0 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53  p->selFlags |= S
202f0 46 5f 48 61 73 54 79 70 65 49 6e 66 6f 3b 0a 20  F_HasTypeInfo;. 
20300 20 20 20 70 50 61 72 73 65 20 3d 20 70 57 61 6c     pParse = pWal
20310 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20  ker->pParse;.   
20320 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70   pTabList = p->p
20330 53 72 63 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  Src;.    for(i=0
20340 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74  , pFrom=pTabList
20350 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d  ->a; i<pTabList-
20360 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f  >nSrc; i++, pFro
20370 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 54 61 62 6c  m++){.      Tabl
20380 65 20 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d  e *pTab = pFrom-
20390 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 69 66 28  >pTab;.      if(
203a0 20 41 4c 57 41 59 53 28 70 54 61 62 21 3d 30 29   ALWAYS(pTab!=0)
203b0 20 26 26 20 28 70 54 61 62 2d 3e 74 61 62 46 6c   && (pTab->tabFl
203c0 61 67 73 20 26 20 54 46 5f 45 70 68 65 6d 65 72  ags & TF_Ephemer
203d0 61 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  al)!=0 ){.      
203e0 20 20 2f 2a 20 41 20 73 75 62 2d 71 75 65 72 79    /* A sub-query
203f0 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
20400 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20  use of a SELECT 
20410 2a 2f 0a 20 20 20 20 20 20 20 20 53 65 6c 65 63  */.        Selec
20420 74 20 2a 70 53 65 6c 20 3d 20 70 46 72 6f 6d 2d  t *pSel = pFrom-
20430 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20  >pSelect;.      
20440 20 20 61 73 73 65 72 74 28 20 70 53 65 6c 20 29    assert( pSel )
20450 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  ;.        while(
20460 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 20 29 20   pSel->pPrior ) 
20470 70 53 65 6c 20 3d 20 70 53 65 6c 2d 3e 70 50 72  pSel = pSel->pPr
20480 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 73 65 6c  ior;.        sel
20490 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65  ectAddColumnType
204a0 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 70 50 61  AndCollation(pPa
204b0 72 73 65 2c 20 70 54 61 62 2c 20 70 53 65 6c 29  rse, pTab, pSel)
204c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
204d0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 57 52 43    }.  return WRC
204e0 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 23 65 6e  _Continue;.}.#en
204f0 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  dif.../*.** This
20500 20 72 6f 75 74 69 6e 65 20 61 64 64 73 20 64 61   routine adds da
20510 74 61 74 79 70 65 20 61 6e 64 20 63 6f 6c 6c 61  tatype and colla
20520 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69 6e  ting sequence in
20530 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 0a 2a 2a 20  formation to.** 
20540 74 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74  the Table struct
20550 75 72 65 73 20 6f 66 20 61 6c 6c 20 46 52 4f 4d  ures of all FROM
20560 2d 63 6c 61 75 73 65 20 73 75 62 71 75 65 72 69  -clause subqueri
20570 65 73 20 69 6e 20 61 0a 2a 2a 20 53 45 4c 45 43  es in a.** SELEC
20580 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a  T statement..**.
20590 2a 2a 20 55 73 65 20 74 68 69 73 20 72 6f 75 74  ** Use this rout
205a0 69 6e 65 20 61 66 74 65 72 20 6e 61 6d 65 20 72  ine after name r
205b0 65 73 6f 6c 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  esolution..*/.st
205c0 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65  atic void sqlite
205d0 33 53 65 6c 65 63 74 41 64 64 54 79 70 65 49 6e  3SelectAddTypeIn
205e0 66 6f 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  fo(Parse *pParse
205f0 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63  , Select *pSelec
20600 74 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  t){.#ifndef SQLI
20610 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
20620 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 6d  .  Walker w;.  m
20630 65 6d 73 65 74 28 26 77 2c 20 30 2c 20 73 69 7a  emset(&w, 0, siz
20640 65 6f 66 28 77 29 29 3b 0a 20 20 77 2e 78 53 65  eof(w));.  w.xSe
20650 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73  lectCallback = s
20660 65 6c 65 63 74 41 64 64 53 75 62 71 75 65 72 79  electAddSubquery
20670 54 79 70 65 49 6e 66 6f 3b 0a 20 20 77 2e 78 45  TypeInfo;.  w.xE
20680 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78  xprCallback = ex
20690 70 72 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e  prWalkNoop;.  w.
206a0 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b  pParse = pParse;
206b0 0a 20 20 77 2e 62 53 65 6c 65 63 74 44 65 70 74  .  w.bSelectDept
206c0 68 46 69 72 73 74 20 3d 20 31 3b 0a 20 20 73 71  hFirst = 1;.  sq
206d0 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28  lite3WalkSelect(
206e0 26 77 2c 20 70 53 65 6c 65 63 74 29 3b 0a 23 65  &w, pSelect);.#e
206f0 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54  ndif.}.../*.** T
20700 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73  his routine sets
20710 20 75 70 20 61 20 53 45 4c 45 43 54 20 73 74 61   up a SELECT sta
20720 74 65 6d 65 6e 74 20 66 6f 72 20 70 72 6f 63 65  tement for proce
20730 73 73 69 6e 67 2e 20 20 54 68 65 0a 2a 2a 20 66  ssing.  The.** f
20740 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 61 63 63 6f  ollowing is acco
20750 6d 70 6c 69 73 68 65 64 3a 0a 2a 2a 0a 2a 2a 20  mplished:.**.** 
20760 20 20 20 20 2a 20 20 56 44 42 45 20 43 75 72 73      *  VDBE Curs
20770 6f 72 20 6e 75 6d 62 65 72 73 20 61 72 65 20 61  or numbers are a
20780 73 73 69 67 6e 65 64 20 74 6f 20 61 6c 6c 20 46  ssigned to all F
20790 52 4f 4d 2d 63 6c 61 75 73 65 20 74 65 72 6d 73  ROM-clause terms
207a0 2e 0a 2a 2a 20 20 20 20 20 2a 20 20 45 70 68 65  ..**     *  Ephe
207b0 6d 65 72 61 6c 20 54 61 62 6c 65 20 6f 62 6a 65  meral Table obje
207c0 63 74 73 20 61 72 65 20 63 72 65 61 74 65 64 20  cts are created 
207d0 66 6f 72 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61  for all FROM-cla
207e0 75 73 65 20 73 75 62 71 75 65 72 69 65 73 2e 0a  use subqueries..
207f0 2a 2a 20 20 20 20 20 2a 20 20 4f 4e 20 61 6e 64  **     *  ON and
20800 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20 61   USING clauses a
20810 72 65 20 73 68 69 66 74 65 64 20 69 6e 74 6f 20  re shifted into 
20820 57 48 45 52 45 20 73 74 61 74 65 6d 65 6e 74 73  WHERE statements
20830 0a 2a 2a 20 20 20 20 20 2a 20 20 57 69 6c 64 63  .**     *  Wildc
20840 61 72 64 73 20 22 2a 22 20 61 6e 64 20 22 54 41  ards "*" and "TA
20850 42 4c 45 2e 2a 22 20 69 6e 20 72 65 73 75 6c 74  BLE.*" in result
20860 20 73 65 74 73 20 61 72 65 20 65 78 70 61 6e 64   sets are expand
20870 65 64 2e 0a 2a 2a 20 20 20 20 20 2a 20 20 49 64  ed..**     *  Id
20880 65 6e 74 69 66 69 65 72 73 20 69 6e 20 65 78 70  entifiers in exp
20890 72 65 73 73 69 6f 6e 20 61 72 65 20 6d 61 74 63  ression are matc
208a0 68 65 64 20 74 6f 20 74 61 62 6c 65 73 2e 0a 2a  hed to tables..*
208b0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
208c0 65 20 61 63 74 73 20 72 65 63 75 72 73 69 76 65  e acts recursive
208d0 6c 79 20 6f 6e 20 61 6c 6c 20 73 75 62 71 75 65  ly on all subque
208e0 72 69 65 73 20 77 69 74 68 69 6e 20 74 68 65 20  ries within the 
208f0 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76 6f 69 64 20  SELECT..*/.void 
20900 73 71 6c 69 74 65 33 53 65 6c 65 63 74 50 72 65  sqlite3SelectPre
20910 70 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  p(.  Parse *pPar
20920 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54  se,         /* T
20930 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78  he parser contex
20940 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
20950 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
20960 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   The SELECT stat
20970 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65  ement being code
20980 64 2e 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74  d. */.  NameCont
20990 65 78 74 20 2a 70 4f 75 74 65 72 4e 43 20 20 2f  ext *pOuterNC  /
209a0 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20 66  * Name context f
209b0 6f 72 20 63 6f 6e 74 61 69 6e 65 72 20 2a 2f 0a  or container */.
209c0 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
209d0 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 3d  ;.  if( NEVER(p=
209e0 3d 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  =0) ) return;.  
209f0 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
20a00 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
20a10 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
20a20 3b 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c  ;.  if( p->selFl
20a30 61 67 73 20 26 20 53 46 5f 48 61 73 54 79 70 65  ags & SF_HasType
20a40 49 6e 66 6f 20 29 20 72 65 74 75 72 6e 3b 0a 20  Info ) return;. 
20a50 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78   sqlite3SelectEx
20a60 70 61 6e 64 28 70 50 61 72 73 65 2c 20 70 29 3b  pand(pParse, p);
20a70 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
20a80 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  Err || db->mallo
20a90 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
20aa0 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c  ;.  sqlite3Resol
20ab0 76 65 53 65 6c 65 63 74 4e 61 6d 65 73 28 70 50  veSelectNames(pP
20ac0 61 72 73 65 2c 20 70 2c 20 70 4f 75 74 65 72 4e  arse, p, pOuterN
20ad0 43 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65  C);.  if( pParse
20ae0 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61  ->nErr || db->ma
20af0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74  llocFailed ) ret
20b00 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  urn;.  sqlite3Se
20b10 6c 65 63 74 41 64 64 54 79 70 65 49 6e 66 6f 28  lectAddTypeInfo(
20b20 70 50 61 72 73 65 2c 20 70 29 3b 0a 7d 0a 0a 2f  pParse, p);.}../
20b30 2a 0a 2a 2a 20 52 65 73 65 74 20 74 68 65 20 61  *.** Reset the a
20b40 67 67 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c  ggregate accumul
20b50 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ator..**.** The 
20b60 61 67 67 72 65 67 61 74 65 20 61 63 63 75 6d 75  aggregate accumu
20b70 6c 61 74 6f 72 20 69 73 20 61 20 73 65 74 20 6f  lator is a set o
20b80 66 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 74  f memory cells t
20b90 68 61 74 20 68 6f 6c 64 0a 2a 2a 20 69 6e 74 65  hat hold.** inte
20ba0 72 6d 65 64 69 61 74 65 20 72 65 73 75 6c 74 73  rmediate results
20bb0 20 77 68 69 6c 65 20 63 61 6c 63 75 6c 61 74 69   while calculati
20bc0 6e 67 20 61 6e 20 61 67 67 72 65 67 61 74 65 2e  ng an aggregate.
20bd0 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e    This.** routin
20be0 65 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65  e generates code
20bf0 20 74 68 61 74 20 73 74 6f 72 65 73 20 4e 55 4c   that stores NUL
20c00 4c 73 20 69 6e 20 61 6c 6c 20 6f 66 20 74 68 6f  Ls in all of tho
20c10 73 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20 63 65 6c  se memory.** cel
20c20 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ls..*/.static vo
20c30 69 64 20 72 65 73 65 74 41 63 63 75 6d 75 6c 61  id resetAccumula
20c40 74 6f 72 28 50 61 72 73 65 20 2a 70 50 61 72 73  tor(Parse *pPars
20c50 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67  e, AggInfo *pAgg
20c60 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76  Info){.  Vdbe *v
20c70 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
20c80 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72  ;.  int i;.  str
20c90 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63  uct AggInfo_func
20ca0 20 2a 70 46 75 6e 63 3b 0a 20 20 69 66 28 20 70   *pFunc;.  if( p
20cb0 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 2b 70  AggInfo->nFunc+p
20cc0 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e  AggInfo->nColumn
20cd0 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
20ce0 6e 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  n;.  }.  for(i=0
20cf0 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 43  ; i<pAggInfo->nC
20d00 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  olumn; i++){.   
20d10 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
20d20 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  p2(v, OP_Null, 0
20d30 2c 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c  , pAggInfo->aCol
20d40 5b 69 5d 2e 69 4d 65 6d 29 3b 0a 20 20 7d 0a 20  [i].iMem);.  }. 
20d50 20 66 6f 72 28 70 46 75 6e 63 3d 70 41 67 67 49   for(pFunc=pAggI
20d60 6e 66 6f 2d 3e 61 46 75 6e 63 2c 20 69 3d 30 3b  nfo->aFunc, i=0;
20d70 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75   i<pAggInfo->nFu
20d80 6e 63 3b 20 69 2b 2b 2c 20 70 46 75 6e 63 2b 2b  nc; i++, pFunc++
20d90 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
20da0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
20db0 75 6c 6c 2c 20 30 2c 20 70 46 75 6e 63 2d 3e 69  ull, 0, pFunc->i
20dc0 4d 65 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 46  Mem);.    if( pF
20dd0 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74 3e 3d  unc->iDistinct>=
20de0 30 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  0 ){.      Expr 
20df0 2a 70 45 20 3d 20 70 46 75 6e 63 2d 3e 70 45 78  *pE = pFunc->pEx
20e00 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  pr;.      assert
20e10 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
20e20 74 79 28 70 45 2c 20 45 50 5f 78 49 73 53 65 6c  ty(pE, EP_xIsSel
20e30 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20 69 66  ect) );.      if
20e40 28 20 70 45 2d 3e 78 2e 70 4c 69 73 74 3d 3d 30  ( pE->x.pList==0
20e50 20 7c 7c 20 70 45 2d 3e 78 2e 70 4c 69 73 74 2d   || pE->x.pList-
20e60 3e 6e 45 78 70 72 21 3d 31 20 29 7b 0a 20 20 20  >nExpr!=1 ){.   
20e70 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
20e80 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 44 49  rMsg(pParse, "DI
20e90 53 54 49 4e 43 54 20 61 67 67 72 65 67 61 74 65  STINCT aggregate
20ea0 73 20 6d 75 73 74 20 68 61 76 65 20 65 78 61 63  s must have exac
20eb0 74 6c 79 20 6f 6e 65 20 22 0a 20 20 20 20 20 20  tly one ".      
20ec0 20 20 20 20 20 22 61 72 67 75 6d 65 6e 74 22 29       "argument")
20ed0 3b 0a 20 20 20 20 20 20 20 20 70 46 75 6e 63 2d  ;.        pFunc-
20ee0 3e 69 44 69 73 74 69 6e 63 74 20 3d 20 2d 31 3b  >iDistinct = -1;
20ef0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
20f00 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70        KeyInfo *p
20f10 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66  KeyInfo = keyInf
20f20 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50  oFromExprList(pP
20f30 61 72 73 65 2c 20 70 45 2d 3e 78 2e 70 4c 69 73  arse, pE->x.pLis
20f40 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  t);.        sqli
20f50 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
20f60 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
20f70 6c 2c 20 70 46 75 6e 63 2d 3e 69 44 69 73 74 69  l, pFunc->iDisti
20f80 6e 63 74 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20  nct, 0, 0,.     
20f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20fa0 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79       (char*)pKey
20fb0 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  Info, P4_KEYINFO
20fc0 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 20 20 20  _HANDOFF);.     
20fd0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a   }.    }.  }.}..
20fe0 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65  /*.** Invoke the
20ff0 20 4f 50 5f 41 67 67 46 69 6e 61 6c 69 7a 65 20   OP_AggFinalize 
21000 6f 70 63 6f 64 65 20 66 6f 72 20 65 76 65 72 79  opcode for every
21010 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
21020 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 41 67  ion.** in the Ag
21030 67 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e  gInfo structure.
21040 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
21050 66 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63 74  finalizeAggFunct
21060 69 6f 6e 73 28 50 61 72 73 65 20 2a 70 50 61 72  ions(Parse *pPar
21070 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67  se, AggInfo *pAg
21080 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a  gInfo){.  Vdbe *
21090 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
210a0 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  e;.  int i;.  st
210b0 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e  ruct AggInfo_fun
210c0 63 20 2a 70 46 3b 0a 20 20 66 6f 72 28 69 3d 30  c *pF;.  for(i=0
210d0 2c 20 70 46 3d 70 41 67 67 49 6e 66 6f 2d 3e 61  , pF=pAggInfo->a
210e0 46 75 6e 63 3b 20 69 3c 70 41 67 67 49 6e 66 6f  Func; i<pAggInfo
210f0 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46  ->nFunc; i++, pF
21100 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73  ++){.    ExprLis
21110 74 20 2a 70 4c 69 73 74 20 3d 20 70 46 2d 3e 70  t *pList = pF->p
21120 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20  Expr->x.pList;. 
21130 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
21140 48 61 73 50 72 6f 70 65 72 74 79 28 70 46 2d 3e  HasProperty(pF->
21150 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
21160 65 63 74 29 20 29 3b 0a 20 20 20 20 73 71 6c 69  ect) );.    sqli
21170 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
21180 20 4f 50 5f 41 67 67 46 69 6e 61 6c 2c 20 70 46   OP_AggFinal, pF
21190 2d 3e 69 4d 65 6d 2c 20 70 4c 69 73 74 20 3f 20  ->iMem, pList ? 
211a0 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30  pList->nExpr : 0
211b0 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
211c0 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64             (void
211d0 2a 29 70 46 2d 3e 70 46 75 6e 63 2c 20 50 34 5f  *)pF->pFunc, P4_
211e0 46 55 4e 43 44 45 46 29 3b 0a 20 20 7d 0a 7d 0a  FUNCDEF);.  }.}.
211f0 0a 2f 2a 0a 2a 2a 20 55 70 64 61 74 65 20 74 68  ./*.** Update th
21200 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 6d 65  e accumulator me
21210 6d 6f 72 79 20 63 65 6c 6c 73 20 66 6f 72 20 61  mory cells for a
21220 6e 20 61 67 67 72 65 67 61 74 65 20 62 61 73 65  n aggregate base
21230 64 20 6f 6e 0a 2a 2a 20 74 68 65 20 63 75 72 72  d on.** the curr
21240 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74  ent cursor posit
21250 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ion..*/.static v
21260 6f 69 64 20 75 70 64 61 74 65 41 63 63 75 6d 75  oid updateAccumu
21270 6c 61 74 6f 72 28 50 61 72 73 65 20 2a 70 50 61  lator(Parse *pPa
21280 72 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41  rse, AggInfo *pA
21290 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20  ggInfo){.  Vdbe 
212a0 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
212b0 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  be;.  int i;.  i
212c0 6e 74 20 72 65 67 48 69 74 20 3d 20 30 3b 0a 20  nt regHit = 0;. 
212d0 20 69 6e 74 20 61 64 64 72 48 69 74 54 65 73 74   int addrHitTest
212e0 20 3d 20 30 3b 0a 20 20 73 74 72 75 63 74 20 41   = 0;.  struct A
212f0 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 3b  ggInfo_func *pF;
21300 0a 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66  .  struct AggInf
21310 6f 5f 63 6f 6c 20 2a 70 43 3b 0a 0a 20 20 70 41  o_col *pC;..  pA
21320 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f  ggInfo->directMo
21330 64 65 20 3d 20 31 3b 0a 20 20 73 71 6c 69 74 65  de = 1;.  sqlite
21340 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28  3ExprCacheClear(
21350 70 50 61 72 73 65 29 3b 0a 20 20 66 6f 72 28 69  pParse);.  for(i
21360 3d 30 2c 20 70 46 3d 70 41 67 67 49 6e 66 6f 2d  =0, pF=pAggInfo-
21370 3e 61 46 75 6e 63 3b 20 69 3c 70 41 67 67 49 6e  >aFunc; i<pAggIn
21380 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20  fo->nFunc; i++, 
21390 70 46 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6e  pF++){.    int n
213a0 41 72 67 3b 0a 20 20 20 20 69 6e 74 20 61 64 64  Arg;.    int add
213b0 72 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 69  rNext = 0;.    i
213c0 6e 74 20 72 65 67 41 67 67 3b 0a 20 20 20 20 45  nt regAgg;.    E
213d0 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d  xprList *pList =
213e0 20 70 46 2d 3e 70 45 78 70 72 2d 3e 78 2e 70 4c   pF->pExpr->x.pL
213f0 69 73 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ist;.    assert(
21400 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
21410 79 28 70 46 2d 3e 70 45 78 70 72 2c 20 45 50 5f  y(pF->pExpr, EP_
21420 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20  xIsSelect) );.  
21430 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20    if( pList ){. 
21440 20 20 20 20 20 6e 41 72 67 20 3d 20 70 4c 69 73       nArg = pLis
21450 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20  t->nExpr;.      
21460 72 65 67 41 67 67 20 3d 20 73 71 6c 69 74 65 33  regAgg = sqlite3
21470 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61  GetTempRange(pPa
21480 72 73 65 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20  rse, nArg);.    
21490 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
214a0 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  eExprList(pParse
214b0 2c 20 70 4c 69 73 74 2c 20 72 65 67 41 67 67 2c  , pList, regAgg,
214c0 20 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   1);.    }else{.
214d0 20 20 20 20 20 20 6e 41 72 67 20 3d 20 30 3b 0a        nArg = 0;.
214e0 20 20 20 20 20 20 72 65 67 41 67 67 20 3d 20 30        regAgg = 0
214f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
21500 70 46 2d 3e 69 44 69 73 74 69 6e 63 74 3e 3d 30  pF->iDistinct>=0
21510 20 29 7b 0a 20 20 20 20 20 20 61 64 64 72 4e 65   ){.      addrNe
21520 78 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  xt = sqlite3Vdbe
21530 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
21540 20 20 20 20 61 73 73 65 72 74 28 20 6e 41 72 67      assert( nArg
21550 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 63 6f 64  ==1 );.      cod
21560 65 44 69 73 74 69 6e 63 74 28 70 50 61 72 73 65  eDistinct(pParse
21570 2c 20 70 46 2d 3e 69 44 69 73 74 69 6e 63 74 2c  , pF->iDistinct,
21580 20 61 64 64 72 4e 65 78 74 2c 20 31 2c 20 72 65   addrNext, 1, re
21590 67 41 67 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20  gAgg);.    }.   
215a0 20 69 66 28 20 70 46 2d 3e 70 46 75 6e 63 2d 3e   if( pF->pFunc->
215b0 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49  funcFlags & SQLI
215c0 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c  TE_FUNC_NEEDCOLL
215d0 20 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65   ){.      CollSe
215e0 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20  q *pColl = 0;.  
215f0 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
21600 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
21610 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20  .      int j;.  
21620 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73      assert( pLis
21630 74 21 3d 30 20 29 3b 20 20 2f 2a 20 70 4c 69 73  t!=0 );  /* pLis
21640 74 21 3d 30 20 69 66 20 70 46 2d 3e 70 46 75 6e  t!=0 if pF->pFun
21650 63 20 68 61 73 20 4e 45 45 44 43 4f 4c 4c 20 2a  c has NEEDCOLL *
21660 2f 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c  /.      for(j=0,
21670 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b   pItem=pList->a;
21680 20 21 70 43 6f 6c 6c 20 26 26 20 6a 3c 6e 41 72   !pColl && j<nAr
21690 67 3b 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  g; j++, pItem++)
216a0 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20  {.        pColl 
216b0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
216c0 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 49 74  lSeq(pParse, pIt
216d0 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20  em->pExpr);.    
216e0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 70    }.      if( !p
216f0 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  Coll ){.        
21700 70 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e  pColl = pParse->
21710 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20  db->pDfltColl;. 
21720 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
21730 20 72 65 67 48 69 74 3d 3d 30 20 26 26 20 70 41   regHit==0 && pA
21740 67 67 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c  ggInfo->nAccumul
21750 61 74 6f 72 20 29 20 72 65 67 48 69 74 20 3d 20  ator ) regHit = 
21760 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
21770 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
21780 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f  eAddOp4(v, OP_Co
21790 6c 6c 53 65 71 2c 20 72 65 67 48 69 74 2c 20 30  llSeq, regHit, 0
217a0 2c 20 30 2c 20 28 63 68 61 72 20 2a 29 70 43 6f  , 0, (char *)pCo
217b0 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b  ll, P4_COLLSEQ);
217c0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
217d0 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
217e0 4f 50 5f 41 67 67 53 74 65 70 2c 20 30 2c 20 72  OP_AggStep, 0, r
217f0 65 67 41 67 67 2c 20 70 46 2d 3e 69 4d 65 6d 2c  egAgg, pF->iMem,
21800 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
21810 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 70 46         (void*)pF
21820 2d 3e 70 46 75 6e 63 2c 20 50 34 5f 46 55 4e 43  ->pFunc, P4_FUNC
21830 44 45 46 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  DEF);.    sqlite
21840 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
21850 20 28 75 38 29 6e 41 72 67 29 3b 0a 20 20 20 20   (u8)nArg);.    
21860 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
21870 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70  AffinityChange(p
21880 50 61 72 73 65 2c 20 72 65 67 41 67 67 2c 20 6e  Parse, regAgg, n
21890 41 72 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Arg);.    sqlite
218a0 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67  3ReleaseTempRang
218b0 65 28 70 50 61 72 73 65 2c 20 72 65 67 41 67 67  e(pParse, regAgg
218c0 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20 69 66 28  , nArg);.    if(
218d0 20 61 64 64 72 4e 65 78 74 20 29 7b 0a 20 20 20   addrNext ){.   
218e0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
218f0 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64  solveLabel(v, ad
21900 64 72 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 73  drNext);.      s
21910 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43  qlite3ExprCacheC
21920 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20  lear(pParse);.  
21930 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65    }.  }..  /* Be
21940 66 6f 72 65 20 70 6f 70 75 6c 61 74 69 6e 67 20  fore populating 
21950 74 68 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20  the accumulator 
21960 72 65 67 69 73 74 65 72 73 2c 20 63 6c 65 61 72  registers, clear
21970 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68   the column cach
21980 65 2e 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69 73  e..  ** Otherwis
21990 65 2c 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65  e, if any of the
219a0 20 72 65 71 75 69 72 65 64 20 63 6f 6c 75 6d 6e   required column
219b0 20 76 61 6c 75 65 73 20 61 72 65 20 61 6c 72 65   values are alre
219c0 61 64 79 20 70 72 65 73 65 6e 74 20 0a 20 20 2a  ady present .  *
219d0 2a 20 69 6e 20 72 65 67 69 73 74 65 72 73 2c 20  * in registers, 
219e0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
219f0 29 20 6d 61 79 20 75 73 65 20 4f 50 5f 53 43 6f  ) may use OP_SCo
21a00 70 79 20 74 6f 20 63 6f 70 79 20 74 68 65 20 76  py to copy the v
21a10 61 6c 75 65 0a 20 20 2a 2a 20 74 6f 20 70 43 2d  alue.  ** to pC-
21a20 3e 69 4d 65 6d 2e 20 42 75 74 20 62 79 20 74 68  >iMem. But by th
21a30 65 20 74 69 6d 65 20 74 68 65 20 76 61 6c 75 65  e time the value
21a40 20 69 73 20 75 73 65 64 2c 20 74 68 65 20 6f 72   is used, the or
21a50 69 67 69 6e 61 6c 20 72 65 67 69 73 74 65 72 0a  iginal register.
21a60 20 20 2a 2a 20 6d 61 79 20 68 61 76 65 20 62 65    ** may have be
21a70 65 6e 20 75 73 65 64 2c 20 69 6e 76 61 6c 69 64  en used, invalid
21a80 61 74 69 6e 67 20 74 68 65 20 75 6e 64 65 72 6c  ating the underl
21a90 79 69 6e 67 20 62 75 66 66 65 72 20 68 6f 6c 64  ying buffer hold
21aa0 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 74 65 78  ing the.  ** tex
21ab0 74 20 6f 72 20 62 6c 6f 62 20 76 61 6c 75 65 2e  t or blob value.
21ac0 20 53 65 65 20 74 69 63 6b 65 74 20 5b 38 38 33   See ticket [883
21ad0 30 33 34 64 63 62 35 5d 2e 0a 20 20 2a 2a 0a 20  034dcb5]..  **. 
21ae0 20 2a 2a 20 41 6e 6f 74 68 65 72 20 73 6f 6c 75   ** Another solu
21af0 74 69 6f 6e 20 77 6f 75 6c 64 20 62 65 20 74 6f  tion would be to
21b00 20 63 68 61 6e 67 65 20 74 68 65 20 4f 50 5f 53   change the OP_S
21b10 43 6f 70 79 20 75 73 65 64 20 74 6f 20 63 6f 70  Copy used to cop
21b20 79 20 63 61 63 68 65 64 0a 20 20 2a 2a 20 76 61  y cached.  ** va
21b30 6c 75 65 73 20 74 6f 20 61 6e 20 4f 50 5f 43 6f  lues to an OP_Co
21b40 70 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  py..  */.  if( r
21b50 65 67 48 69 74 20 29 7b 0a 20 20 20 20 61 64 64  egHit ){.    add
21b60 72 48 69 74 54 65 73 74 20 3d 20 73 71 6c 69 74  rHitTest = sqlit
21b70 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
21b80 4f 50 5f 49 66 2c 20 72 65 67 48 69 74 29 3b 0a  OP_If, regHit);.
21b90 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70    }.  sqlite3Exp
21ba0 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72  rCacheClear(pPar
21bb0 73 65 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20  se);.  for(i=0, 
21bc0 70 43 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f  pC=pAggInfo->aCo
21bd0 6c 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e  l; i<pAggInfo->n
21be0 41 63 63 75 6d 75 6c 61 74 6f 72 3b 20 69 2b 2b  Accumulator; i++
21bf0 2c 20 70 43 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  , pC++){.    sql
21c00 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
21c10 72 73 65 2c 20 70 43 2d 3e 70 45 78 70 72 2c 20  rse, pC->pExpr, 
21c20 70 43 2d 3e 69 4d 65 6d 29 3b 0a 20 20 7d 0a 20  pC->iMem);.  }. 
21c30 20 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63   pAggInfo->direc
21c40 74 4d 6f 64 65 20 3d 20 30 3b 0a 20 20 73 71 6c  tMode = 0;.  sql
21c50 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65  ite3ExprCacheCle
21c60 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  ar(pParse);.  if
21c70 28 20 61 64 64 72 48 69 74 54 65 73 74 20 29 7b  ( addrHitTest ){
21c80 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
21c90 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
21ca0 48 69 74 54 65 73 74 29 3b 0a 20 20 7d 0a 7d 0a  HitTest);.  }.}.
21cb0 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 73 69 6e  ./*.** Add a sin
21cc0 67 6c 65 20 4f 50 5f 45 78 70 6c 61 69 6e 20 69  gle OP_Explain i
21cd0 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 74 68  nstruction to th
21ce0 65 20 56 44 42 45 20 74 6f 20 65 78 70 6c 61 69  e VDBE to explai
21cf0 6e 20 61 20 73 69 6d 70 6c 65 0a 2a 2a 20 63 6f  n a simple.** co
21d00 75 6e 74 28 2a 29 20 71 75 65 72 79 20 28 22 53  unt(*) query ("S
21d10 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
21d20 52 4f 4d 20 70 54 61 62 22 29 2e 0a 2a 2f 0a 23  ROM pTab")..*/.#
21d30 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
21d40 49 54 5f 45 58 50 4c 41 49 4e 0a 73 74 61 74 69  IT_EXPLAIN.stati
21d50 63 20 76 6f 69 64 20 65 78 70 6c 61 69 6e 53 69  c void explainSi
21d60 6d 70 6c 65 43 6f 75 6e 74 28 0a 20 20 50 61 72  mpleCount(.  Par
21d70 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
21d80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21d90 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f  Parse context */
21da0 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20  .  Table *pTab, 
21db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21dc0 20 20 20 2f 2a 20 54 61 62 6c 65 20 62 65 69 6e     /* Table bein
21dd0 67 20 71 75 65 72 69 65 64 20 2a 2f 0a 20 20 49  g queried */.  I
21de0 6e 64 65 78 20 2a 70 49 64 78 20 20 20 20 20 20  ndex *pIdx      
21df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21e00 2a 20 49 6e 64 65 78 20 75 73 65 64 20 74 6f 20  * Index used to 
21e10 6f 70 74 69 6d 69 7a 65 20 73 63 61 6e 2c 20 6f  optimize scan, o
21e20 72 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69  r NULL */.){.  i
21e30 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61  f( pParse->expla
21e40 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 63 68 61  in==2 ){.    cha
21e50 72 20 2a 7a 45 71 70 20 3d 20 73 71 6c 69 74 65  r *zEqp = sqlite
21e60 33 4d 50 72 69 6e 74 66 28 70 50 61 72 73 65 2d  3MPrintf(pParse-
21e70 3e 64 62 2c 20 22 53 43 41 4e 20 54 41 42 4c 45  >db, "SCAN TABLE
21e80 20 25 73 25 73 25 73 22 2c 0a 20 20 20 20 20 20   %s%s%s",.      
21e90 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 0a    pTab->zName, .
21ea0 20 20 20 20 20 20 20 20 70 49 64 78 20 3f 20 22          pIdx ? "
21eb0 20 55 53 49 4e 47 20 43 4f 56 45 52 49 4e 47 20   USING COVERING 
21ec0 49 4e 44 45 58 20 22 20 3a 20 22 22 2c 0a 20 20  INDEX " : "",.  
21ed0 20 20 20 20 20 20 70 49 64 78 20 3f 20 70 49 64        pIdx ? pId
21ee0 78 2d 3e 7a 4e 61 6d 65 20 3a 20 22 22 0a 20 20  x->zName : "".  
21ef0 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33    );.    sqlite3
21f00 56 64 62 65 41 64 64 4f 70 34 28 0a 20 20 20 20  VdbeAddOp4(.    
21f10 20 20 20 20 70 50 61 72 73 65 2d 3e 70 56 64 62      pParse->pVdb
21f20 65 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 70  e, OP_Explain, p
21f30 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64  Parse->iSelectId
21f40 2c 20 30 2c 20 30 2c 20 7a 45 71 70 2c 20 50 34  , 0, 0, zEqp, P4
21f50 5f 44 59 4e 41 4d 49 43 0a 20 20 20 20 29 3b 0a  _DYNAMIC.    );.
21f60 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65    }.}.#else.# de
21f70 66 69 6e 65 20 65 78 70 6c 61 69 6e 53 69 6d 70  fine explainSimp
21f80 6c 65 43 6f 75 6e 74 28 61 2c 62 2c 63 29 0a 23  leCount(a,b,c).#
21f90 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  endif../*.** Gen
21fa0 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74  erate code for t
21fb0 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
21fc0 65 6e 74 20 67 69 76 65 6e 20 69 6e 20 74 68 65  ent given in the
21fd0 20 70 20 61 72 67 75 6d 65 6e 74 2e 20 20 0a 2a   p argument.  .*
21fe0 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 73  *.** The results
21ff0 20 61 72 65 20 64 69 73 74 72 69 62 75 74 65 64   are distributed
22000 20 69 6e 20 76 61 72 69 6f 75 73 20 77 61 79 73   in various ways
22010 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68   depending on th
22020 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66  e.** contents of
22030 20 74 68 65 20 53 65 6c 65 63 74 44 65 73 74 20   the SelectDest 
22040 73 74 72 75 63 74 75 72 65 20 70 6f 69 6e 74 65  structure pointe
22050 64 20 74 6f 20 62 79 20 61 72 67 75 6d 65 6e 74  d to by argument
22060 20 70 44 65 73 74 0a 2a 2a 20 61 73 20 66 6f 6c   pDest.** as fol
22070 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  lows:.**.**     
22080 70 44 65 73 74 2d 3e 65 44 65 73 74 20 20 20 20  pDest->eDest    
22090 52 65 73 75 6c 74 0a 2a 2a 20 20 20 20 20 2d 2d  Result.**     --
220a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 2d 2d  ----------    --
220b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
220c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
220d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20  ---------.**    
220e0 20 53 52 54 5f 4f 75 74 70 75 74 20 20 20 20 20   SRT_Output     
220f0 20 47 65 6e 65 72 61 74 65 20 61 20 72 6f 77 20   Generate a row 
22100 6f 66 20 6f 75 74 70 75 74 20 28 75 73 69 6e 67  of output (using
22110 20 74 68 65 20 4f 50 5f 52 65 73 75 6c 74 52 6f   the OP_ResultRo
22120 77 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  w.**            
22130 20 20 20 20 20 20 20 20 20 6f 70 63 6f 64 65 29           opcode)
22140 20 66 6f 72 20 65 61 63 68 20 72 6f 77 20 69 6e   for each row in
22150 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e   the result set.
22160 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 4d  .**.**     SRT_M
22170 65 6d 20 20 20 20 20 20 20 20 20 4f 6e 6c 79 20  em         Only 
22180 76 61 6c 69 64 20 69 66 20 74 68 65 20 72 65 73  valid if the res
22190 75 6c 74 20 69 73 20 61 20 73 69 6e 67 6c 65 20  ult is a single 
221a0 63 6f 6c 75 6d 6e 2e 0a 2a 2a 20 20 20 20 20 20  column..**      
221b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
221c0 74 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 63  tore the first c
221d0 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 66 69 72  olumn of the fir
221e0 73 74 20 72 65 73 75 6c 74 20 72 6f 77 0a 2a 2a  st result row.**
221f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22200 20 20 20 20 20 69 6e 20 72 65 67 69 73 74 65 72       in register
22210 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 20   pDest->iSDParm 
22220 74 68 65 6e 20 61 62 61 6e 64 6f 6e 20 74 68 65  then abandon the
22230 20 72 65 73 74 0a 2a 2a 20 20 20 20 20 20 20 20   rest.**        
22240 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 20               of 
22250 74 68 65 20 71 75 65 72 79 2e 20 20 54 68 69 73  the query.  This
22260 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 69 6d 70   destination imp
22270 6c 69 65 73 20 22 4c 49 4d 49 54 20 31 22 2e 0a  lies "LIMIT 1"..
22280 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 53 65  **.**     SRT_Se
22290 74 20 20 20 20 20 20 20 20 20 54 68 65 20 72 65  t         The re
222a0 73 75 6c 74 20 6d 75 73 74 20 62 65 20 61 20 73  sult must be a s
222b0 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 2e 20 20 53  ingle column.  S
222c0 74 6f 72 65 20 65 61 63 68 0a 2a 2a 20 20 20 20  tore each.**    
222d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
222e0 20 72 6f 77 20 6f 66 20 72 65 73 75 6c 74 20 61   row of result a
222f0 73 20 74 68 65 20 6b 65 79 20 69 6e 20 74 61 62  s the key in tab
22300 6c 65 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72  le pDest->iSDPar
22310 6d 2e 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  m. .**          
22320 20 20 20 20 20 20 20 20 20 20 20 41 70 70 6c 79             Apply
22330 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 70 44   the affinity pD
22340 65 73 74 2d 3e 61 66 66 53 64 73 74 20 62 65 66  est->affSdst bef
22350 6f 72 65 20 73 74 6f 72 69 6e 67 0a 2a 2a 20 20  ore storing.**  
22360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22370 20 20 20 72 65 73 75 6c 74 73 2e 20 20 55 73 65     results.  Use
22380 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 22  d to implement "
22390 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22  IN (SELECT ...)"
223a0 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f  ..**.**     SRT_
223b0 55 6e 69 6f 6e 20 20 20 20 20 20 20 53 74 6f 72  Union       Stor
223c0 65 20 72 65 73 75 6c 74 73 20 61 73 20 61 20 6b  e results as a k
223d0 65 79 20 69 6e 20 61 20 74 65 6d 70 6f 72 61 72  ey in a temporar
223e0 79 20 74 61 62 6c 65 20 0a 2a 2a 20 20 20 20 20  y table .**     
223f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22400 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 70 44  identified by pD
22410 65 73 74 2d 3e 69 53 44 50 61 72 6d 2e 0a 2a 2a  est->iSDParm..**
22420 0a 2a 2a 20 20 20 20 20 53 52 54 5f 45 78 63 65  .**     SRT_Exce
22430 70 74 20 20 20 20 20 20 52 65 6d 6f 76 65 20 72  pt      Remove r
22440 65 73 75 6c 74 73 20 66 72 6f 6d 20 74 68 65 20  esults from the 
22450 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
22460 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 2e 0a  pDest->iSDParm..
22470 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 54 61  **.**     SRT_Ta
22480 62 6c 65 20 20 20 20 20 20 20 53 74 6f 72 65 20  ble       Store 
22490 72 65 73 75 6c 74 73 20 69 6e 20 74 65 6d 70 6f  results in tempo
224a0 72 61 72 79 20 74 61 62 6c 65 20 70 44 65 73 74  rary table pDest
224b0 2d 3e 69 53 44 50 61 72 6d 2e 0a 2a 2a 20 20 20  ->iSDParm..**   
224c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
224d0 20 20 54 68 69 73 20 69 73 20 6c 69 6b 65 20 53    This is like S
224e0 52 54 5f 45 70 68 65 6d 54 61 62 20 65 78 63 65  RT_EphemTab exce
224f0 70 74 20 74 68 61 74 20 74 68 65 20 74 61 62 6c  pt that the tabl
22500 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
22510 20 20 20 20 20 20 20 20 20 69 73 20 61 73 73 75           is assu
22520 6d 65 64 20 74 6f 20 61 6c 72 65 61 64 79 20 62  med to already b
22530 65 20 6f 70 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20  e open..**.**   
22540 20 20 53 52 54 5f 45 70 68 65 6d 54 61 62 20 20    SRT_EphemTab  
22550 20 20 43 72 65 61 74 65 20 61 6e 20 74 65 6d 70    Create an temp
22560 6f 72 61 72 79 20 74 61 62 6c 65 20 70 44 65 73  orary table pDes
22570 74 2d 3e 69 53 44 50 61 72 6d 20 61 6e 64 20 73  t->iSDParm and s
22580 74 6f 72 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  tore.**         
22590 20 20 20 20 20 20 20 20 20 20 20 20 74 68 65 20              the 
225a0 72 65 73 75 6c 74 20 74 68 65 72 65 2e 20 54 68  result there. Th
225b0 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74  e cursor is left
225c0 20 6f 70 65 6e 20 61 66 74 65 72 0a 2a 2a 20 20   open after.**  
225d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
225e0 20 20 20 72 65 74 75 72 6e 69 6e 67 2e 20 20 54     returning.  T
225f0 68 69 73 20 69 73 20 6c 69 6b 65 20 53 52 54 5f  his is like SRT_
22600 54 61 62 6c 65 20 65 78 63 65 70 74 20 74 68 61  Table except tha
22610 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
22620 20 20 20 20 20 20 20 20 20 74 68 69 73 20 64 65           this de
22630 73 74 69 6e 61 74 69 6f 6e 20 75 73 65 73 20 4f  stination uses O
22640 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20  P_OpenEphemeral 
22650 74 6f 20 63 72 65 61 74 65 0a 2a 2a 20 20 20 20  to create.**    
22660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22670 20 74 68 65 20 74 61 62 6c 65 20 66 69 72 73 74   the table first
22680 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f  ..**.**     SRT_
22690 43 6f 72 6f 75 74 69 6e 65 20 20 20 47 65 6e 65  Coroutine   Gene
226a0 72 61 74 65 20 61 20 63 6f 2d 72 6f 75 74 69 6e  rate a co-routin
226b0 65 20 74 68 61 74 20 72 65 74 75 72 6e 73 20 61  e that returns a
226c0 20 6e 65 77 20 72 6f 77 20 6f 66 0a 2a 2a 20 20   new row of.**  
226d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
226e0 20 20 20 72 65 73 75 6c 74 73 20 65 61 63 68 20     results each 
226f0 74 69 6d 65 20 69 74 20 69 73 20 69 6e 76 6f 6b  time it is invok
22700 65 64 2e 20 20 54 68 65 20 65 6e 74 72 79 20 70  ed.  The entry p
22710 6f 69 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  oint.**         
22720 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 20 74              of t
22730 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20 69 73  he co-routine is
22740 20 73 74 6f 72 65 64 20 69 6e 20 72 65 67 69 73   stored in regis
22750 74 65 72 20 70 44 65 73 74 2d 3e 69 53 44 50 61  ter pDest->iSDPa
22760 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52  rm..**.**     SR
22770 54 5f 45 78 69 73 74 73 20 20 20 20 20 20 53 74  T_Exists      St
22780 6f 72 65 20 61 20 31 20 69 6e 20 6d 65 6d 6f 72  ore a 1 in memor
22790 79 20 63 65 6c 6c 20 70 44 65 73 74 2d 3e 69 53  y cell pDest->iS
227a0 44 50 61 72 6d 20 69 66 20 74 68 65 20 72 65 73  DParm if the res
227b0 75 6c 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ult.**          
227c0 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 69             set i
227d0 73 20 6e 6f 74 20 65 6d 70 74 79 2e 0a 2a 2a 0a  s not empty..**.
227e0 2a 2a 20 20 20 20 20 53 52 54 5f 44 69 73 63 61  **     SRT_Disca
227f0 72 64 20 20 20 20 20 54 68 72 6f 77 20 74 68 65  rd     Throw the
22800 20 72 65 73 75 6c 74 73 20 61 77 61 79 2e 20 20   results away.  
22810 54 68 69 73 20 69 73 20 75 73 65 64 20 62 79 20  This is used by 
22820 53 45 4c 45 43 54 0a 2a 2a 20 20 20 20 20 20 20  SELECT.**       
22830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74                st
22840 61 74 65 6d 65 6e 74 73 20 77 69 74 68 69 6e 20  atements within 
22850 74 72 69 67 67 65 72 73 20 77 68 6f 73 65 20 6f  triggers whose o
22860 6e 6c 79 20 70 75 72 70 6f 73 65 20 69 73 0a 2a  nly purpose is.*
22870 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
22880 20 20 20 20 20 20 74 68 65 20 73 69 64 65 2d 65        the side-e
22890 66 66 65 63 74 73 20 6f 66 20 66 75 6e 63 74 69  ffects of functi
228a0 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ons..**.** This 
228b0 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
228c0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72  the number of er
228d0 72 6f 72 73 2e 20 20 49 66 20 61 6e 79 20 65 72  rors.  If any er
228e0 72 6f 72 73 20 61 72 65 0a 2a 2a 20 65 6e 63 6f  rors are.** enco
228f0 75 6e 74 65 72 65 64 2c 20 74 68 65 6e 20 61 6e  untered, then an
22900 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72   appropriate err
22910 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 6c 65  or message is le
22920 66 74 20 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2d  ft in.** pParse-
22930 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20  >zErrMsg..**.** 
22940 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65  This routine doe
22950 73 20 4e 4f 54 20 66 72 65 65 20 74 68 65 20 53  s NOT free the S
22960 65 6c 65 63 74 20 73 74 72 75 63 74 75 72 65 20  elect structure 
22970 70 61 73 73 65 64 20 69 6e 2e 20 20 54 68 65 0a  passed in.  The.
22980 2a 2a 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  ** calling funct
22990 69 6f 6e 20 6e 65 65 64 73 20 74 6f 20 64 6f 20  ion needs to do 
229a0 74 68 61 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  that..*/.int sql
229b0 69 74 65 33 53 65 6c 65 63 74 28 0a 20 20 50 61  ite3Select(.  Pa
229c0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
229d0 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
229e0 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
229f0 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20  Select *p,      
22a00 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45         /* The SE
22a10 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 62  LECT statement b
22a20 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20  eing coded. */. 
22a30 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65   SelectDest *pDe
22a40 73 74 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20  st      /* What 
22a50 74 6f 20 64 6f 20 77 69 74 68 20 74 68 65 20 71  to do with the q
22a60 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a  uery results */.
22a70 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20  ){.  int i, j;  
22a80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
22a90 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a  oop counters */.
22aa0 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
22ab0 6e 66 6f 3b 20 20 20 20 20 2f 2a 20 52 65 74 75  nfo;     /* Retu
22ac0 72 6e 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 57  rn from sqlite3W
22ad0 68 65 72 65 42 65 67 69 6e 28 29 20 2a 2f 0a 20  hereBegin() */. 
22ae0 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20   Vdbe *v;       
22af0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76          /* The v
22b00 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 75  irtual machine u
22b10 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
22b20 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41 67 67  n */.  int isAgg
22b30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
22b40 20 54 72 75 65 20 66 6f 72 20 73 65 6c 65 63 74   True for select
22b50 20 6c 69 73 74 73 20 6c 69 6b 65 20 22 63 6f 75   lists like "cou
22b60 6e 74 28 2a 29 22 20 2a 2f 0a 20 20 45 78 70 72  nt(*)" */.  Expr
22b70 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 20 20 20  List *pEList;   
22b80 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 63 6f     /* List of co
22b90 6c 75 6d 6e 73 20 74 6f 20 65 78 74 72 61 63 74  lumns to extract
22ba0 2e 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  . */.  SrcList *
22bb0 70 54 61 62 4c 69 73 74 3b 20 20 20 20 20 2f 2a  pTabList;     /*
22bc0 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20   List of tables 
22bd0 74 6f 20 73 65 6c 65 63 74 20 66 72 6f 6d 20 2a  to select from *
22be0 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65  /.  Expr *pWhere
22bf0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ;          /* Th
22c00 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20  e WHERE clause. 
22c10 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a   May be NULL */.
22c20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
22c30 65 72 42 79 3b 20 20 20 20 2f 2a 20 54 68 65 20  erBy;    /* The 
22c40 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e  ORDER BY clause.
22c50 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f    May be NULL */
22c60 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47 72  .  ExprList *pGr
22c70 6f 75 70 42 79 3b 20 20 20 20 2f 2a 20 54 68 65  oupBy;    /* The
22c80 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
22c90 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a  .  May be NULL *
22ca0 2f 0a 20 20 45 78 70 72 20 2a 70 48 61 76 69 6e  /.  Expr *pHavin
22cb0 67 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  g;         /* Th
22cc0 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 2e  e HAVING clause.
22cd0 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f    May be NULL */
22ce0 0a 20 20 69 6e 74 20 72 63 20 3d 20 31 3b 20 20  .  int rc = 1;  
22cf0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
22d00 75 65 20 74 6f 20 72 65 74 75 72 6e 20 66 72 6f  ue to return fro
22d10 6d 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  m this function 
22d20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 53 6f 72  */.  int addrSor
22d30 74 49 6e 64 65 78 3b 20 20 20 20 20 2f 2a 20 41  tIndex;     /* A
22d40 64 64 72 65 73 73 20 6f 66 20 61 6e 20 4f 50 5f  ddress of an OP_
22d50 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e  OpenEphemeral in
22d60 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 44  struction */.  D
22d70 69 73 74 69 6e 63 74 43 74 78 20 73 44 69 73 74  istinctCtx sDist
22d80 69 6e 63 74 3b 20 2f 2a 20 49 6e 66 6f 20 6f 6e  inct; /* Info on
22d90 20 68 6f 77 20 74 6f 20 63 6f 64 65 20 74 68 65   how to code the
22da0 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72   DISTINCT keywor
22db0 64 20 2a 2f 0a 20 20 41 67 67 49 6e 66 6f 20 73  d */.  AggInfo s
22dc0 41 67 67 49 6e 66 6f 3b 20 20 20 20 20 20 2f 2a  AggInfo;      /*
22dd0 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 75 73 65   Information use
22de0 64 20 62 79 20 61 67 67 72 65 67 61 74 65 20 71  d by aggregate q
22df0 75 65 72 69 65 73 20 2a 2f 0a 20 20 69 6e 74 20  ueries */.  int 
22e00 69 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20  iEnd;           
22e10 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
22e20 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
22e30 71 75 65 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74  query */.  sqlit
22e40 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20  e3 *db;         
22e50 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
22e60 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
22e70 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
22e80 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 69  OMIT_EXPLAIN.  i
22e90 6e 74 20 69 52 65 73 74 6f 72 65 53 65 6c 65 63  nt iRestoreSelec
22ea0 74 49 64 20 3d 20 70 50 61 72 73 65 2d 3e 69 53  tId = pParse->iS
22eb0 65 6c 65 63 74 49 64 3b 0a 20 20 70 50 61 72 73  electId;.  pPars
22ec0 65 2d 3e 69 53 65 6c 65 63 74 49 64 20 3d 20 70  e->iSelectId = p
22ed0 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65  Parse->iNextSele
22ee0 63 74 49 64 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a  ctId++;.#endif..
22ef0 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64    db = pParse->d
22f00 62 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c  b;.  if( p==0 ||
22f10 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
22f20 64 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72  d || pParse->nEr
22f30 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  r ){.    return 
22f40 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c  1;.  }.  if( sql
22f50 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
22f60 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 53 45 4c  arse, SQLITE_SEL
22f70 45 43 54 2c 20 30 2c 20 30 2c 20 30 29 20 29 20  ECT, 0, 0, 0) ) 
22f80 72 65 74 75 72 6e 20 31 3b 0a 20 20 6d 65 6d 73  return 1;.  mems
22f90 65 74 28 26 73 41 67 67 49 6e 66 6f 2c 20 30 2c  et(&sAggInfo, 0,
22fa0 20 73 69 7a 65 6f 66 28 73 41 67 67 49 6e 66 6f   sizeof(sAggInfo
22fb0 29 29 3b 0a 0a 20 20 69 66 28 20 49 67 6e 6f 72  ));..  if( Ignor
22fc0 61 62 6c 65 4f 72 64 65 72 62 79 28 70 44 65 73  ableOrderby(pDes
22fd0 74 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  t) ){.    assert
22fe0 28 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53  (pDest->eDest==S
22ff0 52 54 5f 45 78 69 73 74 73 20 7c 7c 20 70 44 65  RT_Exists || pDe
23000 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 55  st->eDest==SRT_U
23010 6e 69 6f 6e 20 7c 7c 20 0a 20 20 20 20 20 20 20  nion || .       
23020 20 20 20 20 70 44 65 73 74 2d 3e 65 44 65 73 74      pDest->eDest
23030 3d 3d 53 52 54 5f 45 78 63 65 70 74 20 7c 7c 20  ==SRT_Except || 
23040 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52  pDest->eDest==SR
23050 54 5f 44 69 73 63 61 72 64 29 3b 0a 20 20 20 20  T_Discard);.    
23060 2f 2a 20 49 66 20 4f 52 44 45 52 20 42 59 20 6d  /* If ORDER BY m
23070 61 6b 65 73 20 6e 6f 20 64 69 66 66 65 72 65 6e  akes no differen
23080 63 65 20 69 6e 20 74 68 65 20 6f 75 74 70 75 74  ce in the output
23090 20 74 68 65 6e 20 6e 65 69 74 68 65 72 20 64 6f   then neither do
230a0 65 73 0a 20 20 20 20 2a 2a 20 44 49 53 54 49 4e  es.    ** DISTIN
230b0 43 54 20 73 6f 20 69 74 20 63 61 6e 20 62 65 20  CT so it can be 
230c0 72 65 6d 6f 76 65 64 20 74 6f 6f 2e 20 2a 2f 0a  removed too. */.
230d0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
230e0 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  istDelete(db, p-
230f0 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20  >pOrderBy);.    
23100 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b  p->pOrderBy = 0;
23110 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73  .    p->selFlags
23120 20 26 3d 20 7e 53 46 5f 44 69 73 74 69 6e 63 74   &= ~SF_Distinct
23130 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53  ;.  }.  sqlite3S
23140 65 6c 65 63 74 50 72 65 70 28 70 50 61 72 73 65  electPrep(pParse
23150 2c 20 70 2c 20 30 29 3b 0a 20 20 70 4f 72 64 65  , p, 0);.  pOrde
23160 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42  rBy = p->pOrderB
23170 79 3b 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20  y;.  pTabList = 
23180 70 2d 3e 70 53 72 63 3b 0a 20 20 70 45 4c 69 73  p->pSrc;.  pELis
23190 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20  t = p->pEList;. 
231a0 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
231b0 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  r || db->mallocF
231c0 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74  ailed ){.    got
231d0 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
231e0 7d 0a 20 20 69 73 41 67 67 20 3d 20 28 70 2d 3e  }.  isAgg = (p->
231f0 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67  selFlags & SF_Ag
23200 67 72 65 67 61 74 65 29 21 3d 30 3b 0a 20 20 61  gregate)!=0;.  a
23210 73 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30  ssert( pEList!=0
23220 20 29 3b 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20   );..  /* Begin 
23230 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 64 65 2e  generating code.
23240 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69  .  */.  v = sqli
23250 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
23260 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29  e);.  if( v==0 )
23270 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
23280 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 72 69 74 69  ;..  /* If writi
23290 6e 67 20 74 6f 20 6d 65 6d 6f 72 79 20 6f 72 20  ng to memory or 
232a0 67 65 6e 65 72 61 74 69 6e 67 20 61 20 73 65 74  generating a set
232b0 0a 20 20 2a 2a 20 6f 6e 6c 79 20 61 20 73 69 6e  .  ** only a sin
232c0 67 6c 65 20 63 6f 6c 75 6d 6e 20 6d 61 79 20 62  gle column may b
232d0 65 20 6f 75 74 70 75 74 2e 0a 20 20 2a 2f 0a 23  e output..  */.#
232e0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
232f0 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 69 66  IT_SUBQUERY.  if
23300 28 20 63 68 65 63 6b 46 6f 72 4d 75 6c 74 69 43  ( checkForMultiC
23310 6f 6c 75 6d 6e 53 65 6c 65 63 74 45 72 72 6f 72  olumnSelectError
23320 28 70 50 61 72 73 65 2c 20 70 44 65 73 74 2c 20  (pParse, pDest, 
23330 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 20 29  pEList->nExpr) )
23340 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63  {.    goto selec
23350 74 5f 65 6e 64 3b 0a 20 20 7d 0a 23 65 6e 64 69  t_end;.  }.#endi
23360 66 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  f..  /* Generate
23370 20 63 6f 64 65 20 66 6f 72 20 61 6c 6c 20 73 75   code for all su
23380 62 2d 71 75 65 72 69 65 73 20 69 6e 20 74 68 65  b-queries in the
23390 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20 2a   FROM clause.  *
233a0 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  /.#if !defined(S
233b0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
233c0 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  ERY) || !defined
233d0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
233e0 57 29 0a 20 20 66 6f 72 28 69 3d 30 3b 20 21 70  W).  for(i=0; !p
233f0 2d 3e 70 50 72 69 6f 72 20 26 26 20 69 3c 70 54  ->pPrior && i<pT
23400 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  abList->nSrc; i+
23410 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53  +){.    struct S
23420 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
23430 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e  em = &pTabList->
23440 61 5b 69 5d 3b 0a 20 20 20 20 53 65 6c 65 63 74  a[i];.    Select
23450 44 65 73 74 20 64 65 73 74 3b 0a 20 20 20 20 53  Dest dest;.    S
23460 65 6c 65 63 74 20 2a 70 53 75 62 20 3d 20 70 49  elect *pSub = pI
23470 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20  tem->pSelect;.  
23480 20 20 69 6e 74 20 69 73 41 67 67 53 75 62 3b 0a    int isAggSub;.
23490 0a 20 20 20 20 69 66 28 20 70 53 75 62 3d 3d 30  .    if( pSub==0
234a0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20   ) continue;..  
234b0 20 20 2f 2a 20 53 6f 6d 65 74 69 6d 65 73 20 74    /* Sometimes t
234c0 68 65 20 63 6f 64 65 20 66 6f 72 20 61 20 73 75  he code for a su
234d0 62 71 75 65 72 79 20 77 69 6c 6c 20 62 65 20 67  bquery will be g
234e0 65 6e 65 72 61 74 65 64 20 6d 6f 72 65 20 74 68  enerated more th
234f0 61 6e 0a 20 20 20 20 2a 2a 20 6f 6e 63 65 2c 20  an.    ** once, 
23500 69 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  if the subquery 
23510 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 57  is part of the W
23520 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e 20 61  HERE clause in a
23530 20 4c 45 46 54 20 4a 4f 49 4e 2c 0a 20 20 20 20   LEFT JOIN,.    
23540 2a 2a 20 66 6f 72 20 65 78 61 6d 70 6c 65 2e 20  ** for example. 
23550 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 64   In that case, d
23560 6f 20 6e 6f 74 20 72 65 67 65 6e 65 72 61 74 65  o not regenerate
23570 20 74 68 65 20 63 6f 64 65 20 74 6f 20 6d 61 6e   the code to man
23580 69 66 65 73 74 0a 20 20 20 20 2a 2a 20 61 20 76  ifest.    ** a v
23590 69 65 77 20 6f 72 20 74 68 65 20 63 6f 2d 72 6f  iew or the co-ro
235a0 75 74 69 6e 65 20 74 6f 20 69 6d 70 6c 65 6d 65  utine to impleme
235b0 6e 74 20 61 20 76 69 65 77 2e 20 20 54 68 65 20  nt a view.  The 
235c0 66 69 72 73 74 20 69 6e 73 74 61 6e 63 65 0a 20  first instance. 
235d0 20 20 20 2a 2a 20 69 73 20 73 75 66 66 69 63 69     ** is suffici
235e0 65 6e 74 2c 20 74 68 6f 75 67 68 20 74 68 65 20  ent, though the 
235f0 73 75 62 72 6f 75 74 69 6e 65 20 74 6f 20 6d 61  subroutine to ma
23600 6e 69 66 65 73 74 20 74 68 65 20 76 69 65 77 20  nifest the view 
23610 64 6f 65 73 20 6e 65 65 64 0a 20 20 20 20 2a 2a  does need.    **
23620 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20 61   to be invoked a
23630 67 61 69 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28  gain. */.    if(
23640 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c   pItem->addrFill
23650 53 75 62 20 29 7b 0a 20 20 20 20 20 20 69 66 28  Sub ){.      if(
23660 20 70 49 74 65 6d 2d 3e 76 69 61 43 6f 72 6f 75   pItem->viaCorou
23670 74 69 6e 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  tine==0 ){.     
23680 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
23690 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
236a0 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75  , pItem->regRetu
236b0 72 6e 2c 20 70 49 74 65 6d 2d 3e 61 64 64 72 46  rn, pItem->addrF
236c0 69 6c 6c 53 75 62 29 3b 0a 20 20 20 20 20 20 7d  illSub);.      }
236d0 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b  .      continue;
236e0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
236f0 6e 63 72 65 6d 65 6e 74 20 50 61 72 73 65 2e 6e  ncrement Parse.n
23700 48 65 69 67 68 74 20 62 79 20 74 68 65 20 68 65  Height by the he
23710 69 67 68 74 20 6f 66 20 74 68 65 20 6c 61 72 67  ight of the larg
23720 65 73 74 20 65 78 70 72 65 73 73 69 6f 6e 0a 20  est expression. 
23730 20 20 20 2a 2a 20 74 72 65 65 20 72 65 66 65 72     ** tree refer
23740 72 65 64 20 74 6f 20 62 79 20 74 68 69 73 2c 20  red to by this, 
23750 74 68 65 20 70 61 72 65 6e 74 20 73 65 6c 65 63  the parent selec
23760 74 2e 20 54 68 65 20 63 68 69 6c 64 20 73 65 6c  t. The child sel
23770 65 63 74 0a 20 20 20 20 2a 2a 20 6d 61 79 20 63  ect.    ** may c
23780 6f 6e 74 61 69 6e 20 65 78 70 72 65 73 73 69 6f  ontain expressio
23790 6e 20 74 72 65 65 73 20 6f 66 20 61 74 20 6d 6f  n trees of at mo
237a0 73 74 0a 20 20 20 20 2a 2a 20 28 53 51 4c 49 54  st.    ** (SQLIT
237b0 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48  E_MAX_EXPR_DEPTH
237c0 2d 50 61 72 73 65 2e 6e 48 65 69 67 68 74 29 20  -Parse.nHeight) 
237d0 68 65 69 67 68 74 2e 20 54 68 69 73 20 69 73 20  height. This is 
237e0 61 20 62 69 74 0a 20 20 20 20 2a 2a 20 6d 6f 72  a bit.    ** mor
237f0 65 20 63 6f 6e 73 65 72 76 61 74 69 76 65 20 74  e conservative t
23800 68 61 6e 20 6e 65 63 65 73 73 61 72 79 2c 20 62  han necessary, b
23810 75 74 20 6d 75 63 68 20 65 61 73 69 65 72 20 74  ut much easier t
23820 68 61 6e 20 65 6e 66 6f 72 63 69 6e 67 0a 20 20  han enforcing.  
23830 20 20 2a 2a 20 61 6e 20 65 78 61 63 74 20 6c 69    ** an exact li
23840 6d 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  mit..    */.    
23850 70 50 61 72 73 65 2d 3e 6e 48 65 69 67 68 74 20  pParse->nHeight 
23860 2b 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  += sqlite3Select
23870 45 78 70 72 48 65 69 67 68 74 28 70 29 3b 0a 0a  ExprHeight(p);..
23880 20 20 20 20 69 73 41 67 67 53 75 62 20 3d 20 28      isAggSub = (
23890 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26  pSub->selFlags &
238a0 20 53 46 5f 41 67 67 72 65 67 61 74 65 29 21 3d   SF_Aggregate)!=
238b0 30 3b 0a 20 20 20 20 69 66 28 20 66 6c 61 74 74  0;.    if( flatt
238c0 65 6e 53 75 62 71 75 65 72 79 28 70 50 61 72 73  enSubquery(pPars
238d0 65 2c 20 70 2c 20 69 2c 20 69 73 41 67 67 2c 20  e, p, i, isAgg, 
238e0 69 73 41 67 67 53 75 62 29 20 29 7b 0a 20 20 20  isAggSub) ){.   
238f0 20 20 20 2f 2a 20 54 68 69 73 20 73 75 62 71 75     /* This subqu
23900 65 72 79 20 63 61 6e 20 62 65 20 61 62 73 6f 72  ery can be absor
23910 62 65 64 20 69 6e 74 6f 20 69 74 73 20 70 61 72  bed into its par
23920 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66  ent. */.      if
23930 28 20 69 73 41 67 67 53 75 62 20 29 7b 0a 20 20  ( isAggSub ){.  
23940 20 20 20 20 20 20 69 73 41 67 67 20 3d 20 31 3b        isAgg = 1;
23950 0a 20 20 20 20 20 20 20 20 70 2d 3e 73 65 6c 46  .        p->selF
23960 6c 61 67 73 20 7c 3d 20 53 46 5f 41 67 67 72 65  lags |= SF_Aggre
23970 67 61 74 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  gate;.      }.  
23980 20 20 20 20 69 20 3d 20 2d 31 3b 0a 20 20 20 20      i = -1;.    
23990 7d 65 6c 73 65 20 69 66 28 20 70 54 61 62 4c 69  }else if( pTabLi
239a0 73 74 2d 3e 6e 53 72 63 3d 3d 31 20 26 26 20 28  st->nSrc==1 && (
239b0 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
239c0 5f 4d 61 74 65 72 69 61 6c 69 7a 65 29 3d 3d 30  _Materialize)==0
239d0 0a 20 20 20 20 20 20 26 26 20 4f 70 74 69 6d 69  .      && Optimi
239e0 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62  zationEnabled(db
239f0 2c 20 53 51 4c 49 54 45 5f 53 75 62 71 43 6f 72  , SQLITE_SubqCor
23a00 6f 75 74 69 6e 65 29 0a 20 20 20 20 29 7b 0a 20  outine).    ){. 
23a10 20 20 20 20 20 2f 2a 20 49 6d 70 6c 65 6d 65 6e       /* Implemen
23a20 74 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20 74  t a co-routine t
23a30 68 61 74 20 77 69 6c 6c 20 72 65 74 75 72 6e 20  hat will return 
23a40 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20  a single row of 
23a50 74 68 65 20 72 65 73 75 6c 74 0a 20 20 20 20 20  the result.     
23a60 20 2a 2a 20 73 65 74 20 6f 6e 20 65 61 63 68 20   ** set on each 
23a70 69 6e 76 6f 63 61 74 69 6f 6e 2e 0a 20 20 20 20  invocation..    
23a80 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61    */.      int a
23a90 64 64 72 54 6f 70 3b 0a 20 20 20 20 20 20 69 6e  ddrTop;.      in
23aa0 74 20 61 64 64 72 45 6f 66 3b 0a 20 20 20 20 20  t addrEof;.     
23ab0 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72   pItem->regRetur
23ac0 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  n = ++pParse->nM
23ad0 65 6d 3b 0a 20 20 20 20 20 20 61 64 64 72 45 6f  em;.      addrEo
23ae0 66 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  f = ++pParse->nM
23af0 65 6d 3b 0a 20 20 20 20 20 20 2f 2a 20 42 65 66  em;.      /* Bef
23b00 6f 72 65 20 63 6f 64 69 6e 67 20 74 68 65 20 4f  ore coding the O
23b10 50 5f 47 6f 74 6f 20 74 6f 20 6a 75 6d 70 20 74  P_Goto to jump t
23b20 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  o the start of t
23b30 68 65 20 6d 61 69 6e 20 72 6f 75 74 69 6e 65 2c  he main routine,
23b40 0a 20 20 20 20 20 20 2a 2a 20 65 6e 73 75 72 65  .      ** ensure
23b50 20 74 68 61 74 20 74 68 65 20 6a 75 6d 70 20 74   that the jump t
23b60 6f 20 74 68 65 20 76 65 72 69 66 79 2d 73 63 68  o the verify-sch
23b70 65 6d 61 20 72 6f 75 74 69 6e 65 20 68 61 73 20  ema routine has 
23b80 61 6c 72 65 61 64 79 0a 20 20 20 20 20 20 2a 2a  already.      **
23b90 20 62 65 65 6e 20 63 6f 64 65 64 2e 20 4f 74 68   been coded. Oth
23ba0 65 72 77 69 73 65 2c 20 74 68 65 20 76 65 72 69  erwise, the veri
23bb0 66 79 2d 73 63 68 65 6d 61 20 77 6f 75 6c 64 20  fy-schema would 
23bc0 6c 69 6b 65 6c 79 20 62 65 20 63 6f 64 65 64 20  likely be coded 
23bd0 61 73 20 0a 20 20 20 20 20 20 2a 2a 20 70 61 72  as .      ** par
23be0 74 20 6f 66 20 74 68 65 20 63 6f 2d 72 6f 75 74  t of the co-rout
23bf0 69 6e 65 2e 20 49 66 20 74 68 65 20 6d 61 69 6e  ine. If the main
23c00 20 72 6f 75 74 69 6e 65 20 74 68 65 6e 20 61 63   routine then ac
23c10 63 65 73 73 65 64 20 74 68 65 20 0a 20 20 20 20  cessed the .    
23c20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 62 65    ** database be
23c30 66 6f 72 65 20 69 6e 76 6f 6b 69 6e 67 20 74 68  fore invoking th
23c40 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20 66 6f 72  e co-routine for
23c50 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   the first time 
23c60 28 66 6f 72 20 0a 20 20 20 20 20 20 2a 2a 20 65  (for .      ** e
23c70 78 61 6d 70 6c 65 20 74 6f 20 69 6e 69 74 69 61  xample to initia
23c80 6c 69 7a 65 20 61 20 4c 49 4d 49 54 20 72 65 67  lize a LIMIT reg
23c90 69 73 74 65 72 20 66 72 6f 6d 20 61 20 73 75 62  ister from a sub
23ca0 2d 73 65 6c 65 63 74 29 2c 20 69 74 20 77 6f 75  -select), it wou
23cb0 6c 64 20 0a 20 20 20 20 20 20 2a 2a 20 62 65 20  ld .      ** be 
23cc0 64 6f 69 6e 67 20 73 6f 20 77 69 74 68 6f 75 74  doing so without
23cd0 20 68 61 76 69 6e 67 20 76 65 72 69 66 69 65 64   having verified
23ce0 20 74 68 65 20 73 63 68 65 6d 61 20 76 65 72 73   the schema vers
23cf0 69 6f 6e 20 61 6e 64 20 6f 62 74 61 69 6e 65 64  ion and obtained
23d00 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 72   .      ** the r
23d10 65 71 75 69 72 65 64 20 64 62 20 6c 6f 63 6b 73  equired db locks
23d20 2e 20 53 65 65 20 74 69 63 6b 65 74 20 64 36 62  . See ticket d6b
23d30 33 36 62 65 33 38 2e 20 20 2a 2f 0a 20 20 20 20  36be38.  */.    
23d40 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72    sqlite3CodeVer
23d50 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65  ifySchema(pParse
23d60 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  , -1);.      sql
23d70 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76  ite3VdbeAddOp0(v
23d80 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20 20 20  , OP_Goto);.    
23d90 20 20 61 64 64 72 54 6f 70 20 3d 20 73 71 6c 69    addrTop = sqli
23da0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
23db0 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f 2c 20   OP_OpenPseudo, 
23dc0 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b  pItem->iCursor);
23dd0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
23de0 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 31 29  beChangeP5(v, 1)
23df0 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
23e00 65 6e 74 28 28 76 2c 20 22 63 6f 72 6f 75 74 69  ent((v, "corouti
23e10 6e 65 20 66 6f 72 20 25 73 22 2c 20 70 49 74 65  ne for %s", pIte
23e20 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29  m->pTab->zName))
23e30 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 61  ;.      pItem->a
23e40 64 64 72 46 69 6c 6c 53 75 62 20 3d 20 61 64 64  ddrFillSub = add
23e50 72 54 6f 70 3b 0a 20 20 20 20 20 20 73 71 6c 69  rTop;.      sqli
23e60 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
23e70 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
23e80 61 64 64 72 45 6f 66 29 3b 0a 20 20 20 20 20 20  addrEof);.      
23e90 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
23ea0 65 50 35 28 76 2c 20 31 29 3b 0a 20 20 20 20 20  eP5(v, 1);.     
23eb0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
23ec0 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20 53 52  stInit(&dest, SR
23ed0 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 70 49 74  T_Coroutine, pIt
23ee0 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a  em->regReturn);.
23ef0 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74        explainSet
23f00 49 6e 74 65 67 65 72 28 70 49 74 65 6d 2d 3e 69  Integer(pItem->i
23f10 53 65 6c 65 63 74 49 64 2c 20 28 75 38 29 70 50  SelectId, (u8)pP
23f20 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63  arse->iNextSelec
23f30 74 49 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  tId);.      sqli
23f40 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
23f50 2c 20 70 53 75 62 2c 20 26 64 65 73 74 29 3b 0a  , pSub, &dest);.
23f60 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 54 61        pItem->pTa
23f70 62 2d 3e 6e 52 6f 77 45 73 74 20 3d 20 28 75 6e  b->nRowEst = (un
23f80 73 69 67 6e 65 64 29 70 53 75 62 2d 3e 6e 53 65  signed)pSub->nSe
23f90 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20 20 20 70  lectRow;.      p
23fa0 49 74 65 6d 2d 3e 76 69 61 43 6f 72 6f 75 74 69  Item->viaCorouti
23fb0 6e 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 73 71  ne = 1;.      sq
23fc0 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
23fd0 32 28 76 2c 20 61 64 64 72 54 6f 70 2c 20 64 65  2(v, addrTop, de
23fe0 73 74 2e 69 53 64 73 74 29 3b 0a 20 20 20 20 20  st.iSdst);.     
23ff0 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
24000 67 65 50 33 28 76 2c 20 61 64 64 72 54 6f 70 2c  geP3(v, addrTop,
24010 20 64 65 73 74 2e 6e 53 64 73 74 29 3b 0a 20 20   dest.nSdst);.  
24020 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
24030 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
24040 67 65 72 2c 20 31 2c 20 61 64 64 72 45 6f 66 29  ger, 1, addrEof)
24050 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
24060 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
24070 59 69 65 6c 64 2c 20 70 49 74 65 6d 2d 3e 72 65  Yield, pItem->re
24080 67 52 65 74 75 72 6e 29 3b 0a 20 20 20 20 20 20  gReturn);.      
24090 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
240a0 22 65 6e 64 20 25 73 22 2c 20 70 49 74 65 6d 2d  "end %s", pItem-
240b0 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a  >pTab->zName));.
240c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
240d0 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
240e0 72 54 6f 70 2d 31 29 3b 0a 20 20 20 20 20 20 73  rTop-1);.      s
240f0 71 6c 69 74 65 33 43 6c 65 61 72 54 65 6d 70 52  qlite3ClearTempR
24100 65 67 43 61 63 68 65 28 70 50 61 72 73 65 29 3b  egCache(pParse);
24110 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
24120 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20    /* Generate a 
24130 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20  subroutine that 
24140 77 69 6c 6c 20 66 69 6c 6c 20 61 6e 20 65 70 68  will fill an eph
24150 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 77 69 74  emeral table wit
24160 68 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63  h.      ** the c
24170 6f 6e 74 65 6e 74 20 6f 66 20 74 68 69 73 20 73  ontent of this s
24180 75 62 71 75 65 72 79 2e 20 20 70 49 74 65 6d 2d  ubquery.  pItem-
24190 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 77 69 6c  >addrFillSub wil
241a0 6c 20 70 6f 69 6e 74 0a 20 20 20 20 20 20 2a 2a  l point.      **
241b0 20 74 6f 20 74 68 65 20 61 64 64 72 65 73 73 20   to the address 
241c0 6f 66 20 74 68 65 20 67 65 6e 65 72 61 74 65 64  of the generated
241d0 20 73 75 62 72 6f 75 74 69 6e 65 2e 20 20 70 49   subroutine.  pI
241e0 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 0a 20  tem->regReturn. 
241f0 20 20 20 20 20 2a 2a 20 69 73 20 61 20 72 65 67       ** is a reg
24200 69 73 74 65 72 20 61 6c 6c 6f 63 61 74 65 64 20  ister allocated 
24210 74 6f 20 68 6f 6c 64 20 74 68 65 20 73 75 62 72  to hold the subr
24220 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 20 61 64  outine return ad
24230 64 72 65 73 73 0a 20 20 20 20 20 20 2a 2f 0a 20  dress.      */. 
24240 20 20 20 20 20 69 6e 74 20 74 6f 70 41 64 64 72       int topAddr
24250 3b 0a 20 20 20 20 20 20 69 6e 74 20 6f 6e 63 65  ;.      int once
24260 41 64 64 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  Addr = 0;.      
24270 69 6e 74 20 72 65 74 41 64 64 72 3b 0a 20 20 20  int retAddr;.   
24280 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d     assert( pItem
24290 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 3d 3d 30  ->addrFillSub==0
242a0 20 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d   );.      pItem-
242b0 3e 72 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70  >regReturn = ++p
242c0 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
242d0 20 20 20 74 6f 70 41 64 64 72 20 3d 20 73 71 6c     topAddr = sql
242e0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
242f0 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
24300 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72   pItem->regRetur
24310 6e 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d  n);.      pItem-
24320 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 3d 20 74  >addrFillSub = t
24330 6f 70 41 64 64 72 2b 31 3b 0a 20 20 20 20 20 20  opAddr+1;.      
24340 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28  VdbeNoopComment(
24350 28 76 2c 20 22 6d 61 74 65 72 69 61 6c 69 7a 65  (v, "materialize
24360 20 25 73 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61   %s", pItem->pTa
24370 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20  b->zName));.    
24380 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 69 73 43    if( pItem->isC
24390 6f 72 72 65 6c 61 74 65 64 3d 3d 30 20 29 7b 0a  orrelated==0 ){.
243a0 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
243b0 65 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f  e subquery is no
243c0 74 20 63 6f 72 72 65 6c 61 74 65 64 20 61 6e 64  t correlated and
243d0 20 69 66 20 77 65 20 61 72 65 20 6e 6f 74 20 69   if we are not i
243e0 6e 73 69 64 65 20 6f 66 0a 20 20 20 20 20 20 20  nside of.       
243f0 20 2a 2a 20 61 20 74 72 69 67 67 65 72 2c 20 74   ** a trigger, t
24400 68 65 6e 20 77 65 20 6f 6e 6c 79 20 6e 65 65 64  hen we only need
24410 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20   to compute the 
24420 76 61 6c 75 65 20 6f 66 20 74 68 65 20 73 75 62  value of the sub
24430 71 75 65 72 79 0a 20 20 20 20 20 20 20 20 2a 2a  query.        **
24440 20 6f 6e 63 65 2e 20 2a 2f 0a 20 20 20 20 20 20   once. */.      
24450 20 20 6f 6e 63 65 41 64 64 72 20 3d 20 73 71 6c    onceAddr = sql
24460 69 74 65 33 43 6f 64 65 4f 6e 63 65 28 70 50 61  ite3CodeOnce(pPa
24470 72 73 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rse);.      }.  
24480 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
24490 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c  tDestInit(&dest,
244a0 20 53 52 54 5f 45 70 68 65 6d 54 61 62 2c 20 70   SRT_EphemTab, p
244b0 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a  Item->iCursor);.
244c0 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74        explainSet
244d0 49 6e 74 65 67 65 72 28 70 49 74 65 6d 2d 3e 69  Integer(pItem->i
244e0 53 65 6c 65 63 74 49 64 2c 20 28 75 38 29 70 50  SelectId, (u8)pP
244f0 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63  arse->iNextSelec
24500 74 49 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  tId);.      sqli
24510 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
24520 2c 20 70 53 75 62 2c 20 26 64 65 73 74 29 3b 0a  , pSub, &dest);.
24530 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 54 61        pItem->pTa
24540 62 2d 3e 6e 52 6f 77 45 73 74 20 3d 20 28 75 6e  b->nRowEst = (un
24550 73 69 67 6e 65 64 29 70 53 75 62 2d 3e 6e 53 65  signed)pSub->nSe
24560 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20 20 20 69  lectRow;.      i
24570 66 28 20 6f 6e 63 65 41 64 64 72 20 29 20 73 71  f( onceAddr ) sq
24580 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
24590 65 28 76 2c 20 6f 6e 63 65 41 64 64 72 29 3b 0a  e(v, onceAddr);.
245a0 20 20 20 20 20 20 72 65 74 41 64 64 72 20 3d 20        retAddr = 
245b0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
245c0 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20  1(v, OP_Return, 
245d0 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e  pItem->regReturn
245e0 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
245f0 6d 65 6e 74 28 28 76 2c 20 22 65 6e 64 20 25 73  ment((v, "end %s
24600 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e  ", pItem->pTab->
24610 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 73  zName));.      s
24620 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
24630 50 31 28 76 2c 20 74 6f 70 41 64 64 72 2c 20 72  P1(v, topAddr, r
24640 65 74 41 64 64 72 29 3b 0a 20 20 20 20 20 20 73  etAddr);.      s
24650 71 6c 69 74 65 33 43 6c 65 61 72 54 65 6d 70 52  qlite3ClearTempR
24660 65 67 43 61 63 68 65 28 70 50 61 72 73 65 29 3b  egCache(pParse);
24670 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 2f  .    }.    if( /
24680 2a 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c  *pParse->nErr ||
24690 2a 2f 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  */ db->mallocFai
246a0 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  led ){.      got
246b0 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
246c0 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e    }.    pParse->
246d0 6e 48 65 69 67 68 74 20 2d 3d 20 73 71 6c 69 74  nHeight -= sqlit
246e0 65 33 53 65 6c 65 63 74 45 78 70 72 48 65 69 67  e3SelectExprHeig
246f0 68 74 28 70 29 3b 0a 20 20 20 20 70 54 61 62 4c  ht(p);.    pTabL
24700 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20  ist = p->pSrc;. 
24710 20 20 20 69 66 28 20 21 49 67 6e 6f 72 61 62 6c     if( !Ignorabl
24720 65 4f 72 64 65 72 62 79 28 70 44 65 73 74 29 20  eOrderby(pDest) 
24730 29 7b 0a 20 20 20 20 20 20 70 4f 72 64 65 72 42  ){.      pOrderB
24740 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b  y = p->pOrderBy;
24750 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 45 4c  .    }.  }.  pEL
24760 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b  ist = p->pEList;
24770 0a 23 65 6e 64 69 66 0a 20 20 70 57 68 65 72 65  .#endif.  pWhere
24780 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20   = p->pWhere;.  
24790 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47  pGroupBy = p->pG
247a0 72 6f 75 70 42 79 3b 0a 20 20 70 48 61 76 69 6e  roupBy;.  pHavin
247b0 67 20 3d 20 70 2d 3e 70 48 61 76 69 6e 67 3b 0a  g = p->pHaving;.
247c0 20 20 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e    sDistinct.isTn
247d0 63 74 20 3d 20 28 70 2d 3e 73 65 6c 46 6c 61 67  ct = (p->selFlag
247e0 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 29  s & SF_Distinct)
247f0 21 3d 30 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  !=0;..#ifndef SQ
24800 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
24810 4e 44 5f 53 45 4c 45 43 54 0a 20 20 2f 2a 20 49  ND_SELECT.  /* I
24820 66 20 74 68 65 72 65 20 69 73 20 61 72 65 20 61  f there is are a
24830 20 73 65 71 75 65 6e 63 65 20 6f 66 20 71 75 65   sequence of que
24840 72 69 65 73 2c 20 64 6f 20 74 68 65 20 65 61 72  ries, do the ear
24850 6c 69 65 72 20 6f 6e 65 73 20 66 69 72 73 74 2e  lier ones first.
24860 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  .  */.  if( p->p
24870 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 69 66 28  Prior ){.    if(
24880 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 3d 3d   p->pRightmost==
24890 30 20 29 7b 0a 20 20 20 20 20 20 53 65 6c 65 63  0 ){.      Selec
248a0 74 20 2a 70 4c 6f 6f 70 2c 20 2a 70 52 69 67 68  t *pLoop, *pRigh
248b0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74  t = 0;.      int
248c0 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20 20   cnt = 0;.      
248d0 69 6e 74 20 6d 78 53 65 6c 65 63 74 3b 0a 20 20  int mxSelect;.  
248e0 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 3b      for(pLoop=p;
248f0 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c   pLoop; pLoop=pL
24900 6f 6f 70 2d 3e 70 50 72 69 6f 72 2c 20 63 6e 74  oop->pPrior, cnt
24910 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 6f  ++){.        pLo
24920 6f 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 20 3d  op->pRightmost =
24930 20 70 3b 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f   p;.        pLoo
24940 70 2d 3e 70 4e 65 78 74 20 3d 20 70 52 69 67 68  p->pNext = pRigh
24950 74 3b 0a 20 20 20 20 20 20 20 20 70 52 69 67 68  t;.        pRigh
24960 74 20 3d 20 70 4c 6f 6f 70 3b 0a 20 20 20 20 20  t = pLoop;.     
24970 20 7d 0a 20 20 20 20 20 20 6d 78 53 65 6c 65 63   }.      mxSelec
24980 74 20 3d 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 53  t = db->aLimit[S
24990 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4d 50  QLITE_LIMIT_COMP
249a0 4f 55 4e 44 5f 53 45 4c 45 43 54 5d 3b 0a 20 20  OUND_SELECT];.  
249b0 20 20 20 20 69 66 28 20 6d 78 53 65 6c 65 63 74      if( mxSelect
249c0 20 26 26 20 63 6e 74 3e 6d 78 53 65 6c 65 63 74   && cnt>mxSelect
249d0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
249e0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
249f0 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 74 65  se, "too many te
24a00 72 6d 73 20 69 6e 20 63 6f 6d 70 6f 75 6e 64 20  rms in compound 
24a10 53 45 4c 45 43 54 22 29 3b 0a 20 20 20 20 20 20  SELECT");.      
24a20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e    goto select_en
24a30 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  d;.      }.    }
24a40 0a 20 20 20 20 72 63 20 3d 20 6d 75 6c 74 69 53  .    rc = multiS
24a50 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c  elect(pParse, p,
24a60 20 70 44 65 73 74 29 3b 0a 20 20 20 20 65 78 70   pDest);.    exp
24a70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 70  lainSetInteger(p
24a80 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64  Parse->iSelectId
24a90 2c 20 69 52 65 73 74 6f 72 65 53 65 6c 65 63 74  , iRestoreSelect
24aa0 49 64 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  Id);.    return 
24ab0 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  rc;.  }.#endif..
24ac0 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
24ad0 20 62 6f 74 68 20 61 20 47 52 4f 55 50 20 42 59   both a GROUP BY
24ae0 20 61 6e 64 20 61 6e 20 4f 52 44 45 52 20 42 59   and an ORDER BY
24af0 20 63 6c 61 75 73 65 20 61 6e 64 20 74 68 65 79   clause and they
24b00 20 61 72 65 0a 20 20 2a 2a 20 69 64 65 6e 74 69   are.  ** identi
24b10 63 61 6c 2c 20 74 68 65 6e 20 64 69 73 61 62 6c  cal, then disabl
24b20 65 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  e the ORDER BY c
24b30 6c 61 75 73 65 20 73 69 6e 63 65 20 74 68 65 20  lause since the 
24b40 47 52 4f 55 50 20 42 59 0a 20 20 2a 2a 20 77 69  GROUP BY.  ** wi
24b50 6c 6c 20 63 61 75 73 65 20 65 6c 65 6d 65 6e 74  ll cause element
24b60 73 20 74 6f 20 63 6f 6d 65 20 6f 75 74 20 69 6e  s to come out in
24b70 20 74 68 65 20 63 6f 72 72 65 63 74 20 6f 72 64   the correct ord
24b80 65 72 2e 20 20 54 68 69 73 20 69 73 0a 20 20 2a  er.  This is.  *
24b90 2a 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f  * an optimizatio
24ba0 6e 20 2d 20 74 68 65 20 63 6f 72 72 65 63 74 20  n - the correct 
24bb0 61 6e 73 77 65 72 20 73 68 6f 75 6c 64 20 72 65  answer should re
24bc0 73 75 6c 74 20 72 65 67 61 72 64 6c 65 73 73 2e  sult regardless.
24bd0 0a 20 20 2a 2a 20 55 73 65 20 74 68 65 20 53 51  .  ** Use the SQ
24be0 4c 49 54 45 5f 47 72 6f 75 70 42 79 4f 72 64 65  LITE_GroupByOrde
24bf0 72 20 66 6c 61 67 20 77 69 74 68 20 53 51 4c 49  r flag with SQLI
24c00 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54 49  TE_TESTCTRL_OPTI
24c10 4d 49 5a 45 52 0a 20 20 2a 2a 20 74 6f 20 64 69  MIZER.  ** to di
24c20 73 61 62 6c 65 20 74 68 69 73 20 6f 70 74 69 6d  sable this optim
24c30 69 7a 61 74 69 6f 6e 20 66 6f 72 20 74 65 73 74  ization for test
24c40 69 6e 67 20 70 75 72 70 6f 73 65 73 2e 0a 20 20  ing purposes..  
24c50 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  */.  if( sqlite3
24c60 45 78 70 72 4c 69 73 74 43 6f 6d 70 61 72 65 28  ExprListCompare(
24c70 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 70 4f 72  p->pGroupBy, pOr
24c80 64 65 72 42 79 2c 20 2d 31 29 3d 3d 30 0a 20 20  derBy, -1)==0.  
24c90 20 20 20 20 20 20 20 26 26 20 4f 70 74 69 6d 69         && Optimi
24ca0 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62  zationEnabled(db
24cb0 2c 20 53 51 4c 49 54 45 5f 47 72 6f 75 70 42 79  , SQLITE_GroupBy
24cc0 4f 72 64 65 72 29 20 29 7b 0a 20 20 20 20 70 4f  Order) ){.    pO
24cd0 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 7d 0a  rderBy = 0;.  }.
24ce0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 71 75 65  .  /* If the que
24cf0 72 79 20 69 73 20 44 49 53 54 49 4e 43 54 20 77  ry is DISTINCT w
24d00 69 74 68 20 61 6e 20 4f 52 44 45 52 20 42 59 20  ith an ORDER BY 
24d10 62 75 74 20 69 73 20 6e 6f 74 20 61 6e 20 61 67  but is not an ag
24d20 67 72 65 67 61 74 65 2c 20 61 6e 64 20 0a 20 20  gregate, and .  
24d30 2a 2a 20 69 66 20 74 68 65 20 73 65 6c 65 63 74  ** if the select
24d40 2d 6c 69 73 74 20 69 73 20 74 68 65 20 73 61 6d  -list is the sam
24d50 65 20 61 73 20 74 68 65 20 4f 52 44 45 52 20 42  e as the ORDER B
24d60 59 20 6c 69 73 74 2c 20 74 68 65 6e 20 74 68 69  Y list, then thi
24d70 73 20 71 75 65 72 79 0a 20 20 2a 2a 20 63 61 6e  s query.  ** can
24d80 20 62 65 20 72 65 77 72 69 74 74 65 6e 20 61 73   be rewritten as
24d90 20 61 20 47 52 4f 55 50 20 42 59 2e 20 49 6e 20   a GROUP BY. In 
24da0 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68 69  other words, thi
24db0 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  s:.  **.  **    
24dc0 20 53 45 4c 45 43 54 20 44 49 53 54 49 4e 43 54   SELECT DISTINCT
24dd0 20 78 79 7a 20 46 52 4f 4d 20 2e 2e 2e 20 4f 52   xyz FROM ... OR
24de0 44 45 52 20 42 59 20 78 79 7a 0a 20 20 2a 2a 0a  DER BY xyz.  **.
24df0 20 20 2a 2a 20 69 73 20 74 72 61 6e 73 66 6f 72    ** is transfor
24e00 6d 65 64 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a  med to:.  **.  *
24e10 2a 20 20 20 20 20 53 45 4c 45 43 54 20 78 79 7a  *     SELECT xyz
24e20 20 46 52 4f 4d 20 2e 2e 2e 20 47 52 4f 55 50 20   FROM ... GROUP 
24e30 42 59 20 78 79 7a 0a 20 20 2a 2a 0a 20 20 2a 2a  BY xyz.  **.  **
24e40 20 54 68 65 20 73 65 63 6f 6e 64 20 66 6f 72 6d   The second form
24e50 20 69 73 20 70 72 65 66 65 72 72 65 64 20 61 73   is preferred as
24e60 20 61 20 73 69 6e 67 6c 65 20 69 6e 64 65 78 20   a single index 
24e70 28 6f 72 20 74 65 6d 70 2d 74 61 62 6c 65 29 20  (or temp-table) 
24e80 6d 61 79 20 62 65 20 0a 20 20 2a 2a 20 75 73 65  may be .  ** use
24e90 64 20 66 6f 72 20 62 6f 74 68 20 74 68 65 20 4f  d for both the O
24ea0 52 44 45 52 20 42 59 20 61 6e 64 20 44 49 53 54  RDER BY and DIST
24eb0 49 4e 43 54 20 70 72 6f 63 65 73 73 69 6e 67 2e  INCT processing.
24ec0 20 41 73 20 6f 72 69 67 69 6e 61 6c 6c 79 20 0a   As originally .
24ed0 20 20 2a 2a 20 77 72 69 74 74 65 6e 20 74 68 65    ** written the
24ee0 20 71 75 65 72 79 20 6d 75 73 74 20 75 73 65 20   query must use 
24ef0 61 20 74 65 6d 70 2d 74 61 62 6c 65 20 66 6f 72  a temp-table for
24f00 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 66   at least one of
24f10 20 74 68 65 20 4f 52 44 45 52 20 0a 20 20 2a 2a   the ORDER .  **
24f20 20 42 59 20 61 6e 64 20 44 49 53 54 49 4e 43 54   BY and DISTINCT
24f30 2c 20 61 6e 64 20 61 6e 20 69 6e 64 65 78 20 6f  , and an index o
24f40 72 20 73 65 70 61 72 61 74 65 20 74 65 6d 70 2d  r separate temp-
24f50 74 61 62 6c 65 20 66 6f 72 20 74 68 65 20 6f 74  table for the ot
24f60 68 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  her..  */.  if( 
24f70 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28  (p->selFlags & (
24f80 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41  SF_Distinct|SF_A
24f90 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 44  ggregate))==SF_D
24fa0 69 73 74 69 6e 63 74 20 0a 20 20 20 26 26 20 73  istinct .   && s
24fb0 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43 6f  qlite3ExprListCo
24fc0 6d 70 61 72 65 28 70 4f 72 64 65 72 42 79 2c 20  mpare(pOrderBy, 
24fd0 70 2d 3e 70 45 4c 69 73 74 2c 20 2d 31 29 3d 3d  p->pEList, -1)==
24fe0 30 0a 20 20 29 7b 0a 20 20 20 20 70 2d 3e 73 65  0.  ){.    p->se
24ff0 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f 44 69  lFlags &= ~SF_Di
25000 73 74 69 6e 63 74 3b 0a 20 20 20 20 70 2d 3e 70  stinct;.    p->p
25010 47 72 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65  GroupBy = sqlite
25020 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c  3ExprListDup(db,
25030 20 70 2d 3e 70 45 4c 69 73 74 2c 20 30 29 3b 0a   p->pEList, 0);.
25040 20 20 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70      pGroupBy = p
25050 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20  ->pGroupBy;.    
25060 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  pOrderBy = 0;.  
25070 20 20 2f 2a 20 4e 6f 74 69 63 65 20 74 68 61 74    /* Notice that
25080 20 65 76 65 6e 20 74 68 6f 75 67 68 74 20 53 46   even thought SF
25090 5f 44 69 73 74 69 6e 63 74 20 68 61 73 20 62 65  _Distinct has be
250a0 65 6e 20 63 6c 65 61 72 65 64 20 66 72 6f 6d 20  en cleared from 
250b0 70 2d 3e 73 65 6c 46 6c 61 67 73 2c 0a 20 20 20  p->selFlags,.   
250c0 20 2a 2a 20 74 68 65 20 73 44 69 73 74 69 6e 63   ** the sDistinc
250d0 74 2e 69 73 54 6e 63 74 20 69 73 20 73 74 69 6c  t.isTnct is stil
250e0 6c 20 73 65 74 2e 20 20 48 65 6e 63 65 2c 20 69  l set.  Hence, i
250f0 73 54 6e 63 74 20 72 65 70 72 65 73 65 6e 74 73  sTnct represents
25100 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 72 69 67   the.    ** orig
25110 69 6e 61 6c 20 73 65 74 74 69 6e 67 20 6f 66 20  inal setting of 
25120 74 68 65 20 53 46 5f 44 69 73 74 69 6e 63 74 20  the SF_Distinct 
25130 66 6c 61 67 2c 20 6e 6f 74 20 74 68 65 20 63 75  flag, not the cu
25140 72 72 65 6e 74 20 73 65 74 74 69 6e 67 20 2a 2f  rrent setting */
25150 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 44 69  .    assert( sDi
25160 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 29 3b  stinct.isTnct );
25170 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
25180 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20  ere is an ORDER 
25190 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20  BY clause, then 
251a0 74 68 69 73 20 73 6f 72 74 69 6e 67 0a 20 20 2a  this sorting.  *
251b0 2a 20 69 6e 64 65 78 20 6d 69 67 68 74 20 65 6e  * index might en
251c0 64 20 75 70 20 62 65 69 6e 67 20 75 6e 75 73 65  d up being unuse
251d0 64 20 69 66 20 74 68 65 20 64 61 74 61 20 63 61  d if the data ca
251e0 6e 20 62 65 20 0a 20 20 2a 2a 20 65 78 74 72 61  n be .  ** extra
251f0 63 74 65 64 20 69 6e 20 70 72 65 2d 73 6f 72 74  cted in pre-sort
25200 65 64 20 6f 72 64 65 72 2e 20 20 49 66 20 74 68  ed order.  If th
25210 61 74 20 69 73 20 74 68 65 20 63 61 73 65 2c 20  at is the case, 
25220 74 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 4f 50  then the.  ** OP
25230 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69  _OpenEphemeral i
25240 6e 73 74 72 75 63 74 69 6f 6e 20 77 69 6c 6c 20  nstruction will 
25250 62 65 20 63 68 61 6e 67 65 64 20 74 6f 20 61 6e  be changed to an
25260 20 4f 50 5f 4e 6f 6f 70 20 6f 6e 63 65 0a 20 20   OP_Noop once.  
25270 2a 2a 20 77 65 20 66 69 67 75 72 65 20 6f 75 74  ** we figure out
25280 20 74 68 61 74 20 74 68 65 20 73 6f 72 74 69 6e   that the sortin
25290 67 20 69 6e 64 65 78 20 69 73 20 6e 6f 74 20 6e  g index is not n
252a0 65 65 64 65 64 2e 20 20 54 68 65 20 61 64 64 72  eeded.  The addr
252b0 53 6f 72 74 49 6e 64 65 78 0a 20 20 2a 2a 20 76  SortIndex.  ** v
252c0 61 72 69 61 62 6c 65 20 69 73 20 75 73 65 64 20  ariable is used 
252d0 74 6f 20 66 61 63 69 6c 69 74 61 74 65 20 74 68  to facilitate th
252e0 61 74 20 63 68 61 6e 67 65 2e 0a 20 20 2a 2f 0a  at change..  */.
252f0 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29    if( pOrderBy )
25300 7b 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70  {.    KeyInfo *p
25310 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 70 4b 65  KeyInfo;.    pKe
25320 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46  yInfo = keyInfoF
25330 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72  romExprList(pPar
25340 73 65 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a 20  se, pOrderBy);. 
25350 20 20 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43     pOrderBy->iEC
25360 75 72 73 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e  ursor = pParse->
25370 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 70 2d 3e 61  nTab++;.    p->a
25380 64 64 72 4f 70 65 6e 45 70 68 6d 5b 32 5d 20 3d  ddrOpenEphm[2] =
25390 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78 20 3d   addrSortIndex =
253a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
253b0 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f  beAddOp4(v, OP_O
253c0 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 0a 20 20  penEphemeral,.  
253d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
253e0 20 20 20 20 20 20 20 20 20 70 4f 72 64 65 72 42           pOrderB
253f0 79 2d 3e 69 45 43 75 72 73 6f 72 2c 20 70 4f 72  y->iECursor, pOr
25400 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b 32 2c 20  derBy->nExpr+2, 
25410 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
25420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
25430 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50  har*)pKeyInfo, P
25440 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46  4_KEYINFO_HANDOF
25450 46 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  F);.  }else{.   
25460 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78 20 3d   addrSortIndex =
25470 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49   -1;.  }..  /* I
25480 66 20 74 68 65 20 6f 75 74 70 75 74 20 69 73 20  f the output is 
25490 64 65 73 74 69 6e 65 64 20 66 6f 72 20 61 20 74  destined for a t
254a0 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20  emporary table, 
254b0 6f 70 65 6e 20 74 68 61 74 20 74 61 62 6c 65 2e  open that table.
254c0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 44 65 73  .  */.  if( pDes
254d0 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45 70  t->eDest==SRT_Ep
254e0 68 65 6d 54 61 62 20 29 7b 0a 20 20 20 20 73 71  hemTab ){.    sq
254f0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
25500 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
25510 72 61 6c 2c 20 70 44 65 73 74 2d 3e 69 53 44 50  ral, pDest->iSDP
25520 61 72 6d 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78  arm, pEList->nEx
25530 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  pr);.  }..  /* S
25540 65 74 20 74 68 65 20 6c 69 6d 69 74 65 72 2e 0a  et the limiter..
25550 20 20 2a 2f 0a 20 20 69 45 6e 64 20 3d 20 73 71    */.  iEnd = sq
25560 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
25570 65 6c 28 76 29 3b 0a 20 20 70 2d 3e 6e 53 65 6c  el(v);.  p->nSel
25580 65 63 74 52 6f 77 20 3d 20 4c 41 52 47 45 53 54  ectRow = LARGEST
25590 5f 49 4e 54 36 34 3b 0a 20 20 63 6f 6d 70 75 74  _INT64;.  comput
255a0 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28  eLimitRegisters(
255b0 70 50 61 72 73 65 2c 20 70 2c 20 69 45 6e 64 29  pParse, p, iEnd)
255c0 3b 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69  ;.  if( p->iLimi
255d0 74 3d 3d 30 20 26 26 20 61 64 64 72 53 6f 72 74  t==0 && addrSort
255e0 49 6e 64 65 78 3e 3d 30 20 29 7b 0a 20 20 20 20  Index>=0 ){.    
255f0 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70  sqlite3VdbeGetOp
25600 28 76 2c 20 61 64 64 72 53 6f 72 74 49 6e 64 65  (v, addrSortInde
25610 78 29 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f  x)->opcode = OP_
25620 53 6f 72 74 65 72 4f 70 65 6e 3b 0a 20 20 20 20  SorterOpen;.    
25630 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53  p->selFlags |= S
25640 46 5f 55 73 65 53 6f 72 74 65 72 3b 0a 20 20 7d  F_UseSorter;.  }
25650 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 20 76 69  ..  /* Open a vi
25660 72 74 75 61 6c 20 69 6e 64 65 78 20 74 6f 20 75  rtual index to u
25670 73 65 20 66 6f 72 20 74 68 65 20 64 69 73 74 69  se for the disti
25680 6e 63 74 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20  nct set..  */.  
25690 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  if( p->selFlags 
256a0 26 20 53 46 5f 44 69 73 74 69 6e 63 74 20 29 7b  & SF_Distinct ){
256b0 0a 20 20 20 20 73 44 69 73 74 69 6e 63 74 2e 74  .    sDistinct.t
256c0 61 62 54 6e 63 74 20 3d 20 70 50 61 72 73 65 2d  abTnct = pParse-
256d0 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 73 44 69  >nTab++;.    sDi
256e0 73 74 69 6e 63 74 2e 61 64 64 72 54 6e 63 74 20  stinct.addrTnct 
256f0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
25700 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  Op4(v, OP_OpenEp
25710 68 65 6d 65 72 61 6c 2c 0a 20 20 20 20 20 20 20  hemeral,.       
25720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25730 20 20 20 20 20 20 20 20 20 73 44 69 73 74 69 6e           sDistin
25740 63 74 2e 74 61 62 54 6e 63 74 2c 20 30 2c 20 30  ct.tabTnct, 0, 0
25750 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
25760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25770 20 20 28 63 68 61 72 2a 29 6b 65 79 49 6e 66 6f    (char*)keyInfo
25780 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61  FromExprList(pPa
25790 72 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74 29 2c  rse, p->pEList),
257a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
257b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
257c0 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44   P4_KEYINFO_HAND
257d0 4f 46 46 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  OFF);.    sqlite
257e0 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
257f0 20 42 54 52 45 45 5f 55 4e 4f 52 44 45 52 45 44   BTREE_UNORDERED
25800 29 3b 0a 20 20 20 20 73 44 69 73 74 69 6e 63 74  );.    sDistinct
25810 2e 65 54 6e 63 74 54 79 70 65 20 3d 20 57 48 45  .eTnctType = WHE
25820 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 4f 52  RE_DISTINCT_UNOR
25830 44 45 52 45 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a  DERED;.  }else{.
25840 20 20 20 20 73 44 69 73 74 69 6e 63 74 2e 65 54      sDistinct.eT
25850 6e 63 74 54 79 70 65 20 3d 20 57 48 45 52 45 5f  nctType = WHERE_
25860 44 49 53 54 49 4e 43 54 5f 4e 4f 4f 50 3b 0a 20  DISTINCT_NOOP;. 
25870 20 7d 0a 0a 20 20 69 66 28 20 21 69 73 41 67 67   }..  if( !isAgg
25880 20 26 26 20 70 47 72 6f 75 70 42 79 3d 3d 30 20   && pGroupBy==0 
25890 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 61 67 67  ){.    /* No agg
258a0 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73  regate functions
258b0 20 61 6e 64 20 6e 6f 20 47 52 4f 55 50 20 42 59   and no GROUP BY
258c0 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 75   clause */.    u
258d0 31 36 20 77 63 74 72 6c 46 6c 61 67 73 20 3d 20  16 wctrlFlags = 
258e0 28 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63  (sDistinct.isTnc
258f0 74 20 3f 20 57 48 45 52 45 5f 57 41 4e 54 5f 44  t ? WHERE_WANT_D
25900 49 53 54 49 4e 43 54 20 3a 20 30 29 3b 0a 0a 20  ISTINCT : 0);.. 
25910 20 20 20 2f 2a 20 42 65 67 69 6e 20 74 68 65 20     /* Begin the 
25920 64 61 74 61 62 61 73 65 20 73 63 61 6e 2e 20 2a  database scan. *
25930 2f 0a 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 73  /.    pWInfo = s
25940 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
25950 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73  (pParse, pTabLis
25960 74 2c 20 70 57 68 65 72 65 2c 20 70 4f 72 64 65  t, pWhere, pOrde
25970 72 42 79 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 0a  rBy, p->pEList,.
25980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77                 w
259a0 63 74 72 6c 46 6c 61 67 73 2c 20 30 29 3b 0a 20  ctrlFlags, 0);. 
259b0 20 20 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30     if( pWInfo==0
259c0 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65   ) goto select_e
259d0 6e 64 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  nd;.    if( sqli
259e0 74 65 33 57 68 65 72 65 4f 75 74 70 75 74 52 6f  te3WhereOutputRo
259f0 77 43 6f 75 6e 74 28 70 57 49 6e 66 6f 29 20 3c  wCount(pWInfo) <
25a00 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 29   p->nSelectRow )
25a10 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65  {.      p->nSele
25a20 63 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 57  ctRow = sqlite3W
25a30 68 65 72 65 4f 75 74 70 75 74 52 6f 77 43 6f 75  hereOutputRowCou
25a40 6e 74 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20  nt(pWInfo);.    
25a50 7d 0a 20 20 20 20 69 66 28 20 73 44 69 73 74 69  }.    if( sDisti
25a60 6e 63 74 2e 69 73 54 6e 63 74 20 26 26 20 73 71  nct.isTnct && sq
25a70 6c 69 74 65 33 57 68 65 72 65 49 73 44 69 73 74  lite3WhereIsDist
25a80 69 6e 63 74 28 70 57 49 6e 66 6f 29 20 29 7b 0a  inct(pWInfo) ){.
25a90 20 20 20 20 20 20 73 44 69 73 74 69 6e 63 74 2e        sDistinct.
25aa0 65 54 6e 63 74 54 79 70 65 20 3d 20 73 71 6c 69  eTnctType = sqli
25ab0 74 65 33 57 68 65 72 65 49 73 44 69 73 74 69 6e  te3WhereIsDistin
25ac0 63 74 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20  ct(pWInfo);.    
25ad0 7d 0a 20 20 20 20 69 66 28 20 70 4f 72 64 65 72  }.    if( pOrder
25ae0 42 79 20 26 26 20 73 71 6c 69 74 65 33 57 68 65  By && sqlite3Whe
25af0 72 65 49 73 4f 72 64 65 72 65 64 28 70 57 49 6e  reIsOrdered(pWIn
25b00 66 6f 29 20 29 20 70 4f 72 64 65 72 42 79 20 3d  fo) ) pOrderBy =
25b10 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 73   0;..    /* If s
25b20 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74 68 61  orting index tha
25b30 74 20 77 61 73 20 63 72 65 61 74 65 64 20 62 79  t was created by
25b40 20 61 20 70 72 69 6f 72 20 4f 50 5f 4f 70 65 6e   a prior OP_Open
25b50 45 70 68 65 6d 65 72 61 6c 20 0a 20 20 20 20 2a  Ephemeral .    *
25b60 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 65 6e  * instruction en
25b70 64 65 64 20 75 70 20 6e 6f 74 20 62 65 69 6e 67  ded up not being
25b80 20 6e 65 65 64 65 64 2c 20 74 68 65 6e 20 63 68   needed, then ch
25b90 61 6e 67 65 20 74 68 65 20 4f 50 5f 4f 70 65 6e  ange the OP_Open
25ba0 45 70 68 65 6d 65 72 61 6c 0a 20 20 20 20 2a 2a  Ephemeral.    **
25bb0 20 69 6e 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70   into an OP_Noop
25bc0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
25bd0 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78 3e 3d   addrSortIndex>=
25be0 30 20 26 26 20 70 4f 72 64 65 72 42 79 3d 3d 30  0 && pOrderBy==0
25bf0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
25c00 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f  3VdbeChangeToNoo
25c10 70 28 76 2c 20 61 64 64 72 53 6f 72 74 49 6e 64  p(v, addrSortInd
25c20 65 78 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64  ex);.      p->ad
25c30 64 72 4f 70 65 6e 45 70 68 6d 5b 32 5d 20 3d 20  drOpenEphm[2] = 
25c40 2d 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  -1;.    }..    /
25c50 2a 20 55 73 65 20 74 68 65 20 73 74 61 6e 64 61  * Use the standa
25c60 72 64 20 69 6e 6e 65 72 20 6c 6f 6f 70 2e 20 2a  rd inner loop. *
25c70 2f 0a 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65  /.    selectInne
25c80 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c  rLoop(pParse, p,
25c90 20 70 45 4c 69 73 74 2c 20 30 2c 20 30 2c 20 70   pEList, 0, 0, p
25ca0 4f 72 64 65 72 42 79 2c 20 26 73 44 69 73 74 69  OrderBy, &sDisti
25cb0 6e 63 74 2c 20 70 44 65 73 74 2c 0a 20 20 20 20  nct, pDest,.    
25cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25cd0 73 71 6c 69 74 65 33 57 68 65 72 65 43 6f 6e 74  sqlite3WhereCont
25ce0 69 6e 75 65 4c 61 62 65 6c 28 70 57 49 6e 66 6f  inueLabel(pWInfo
25cf0 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
25d00 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68         sqlite3Wh
25d10 65 72 65 42 72 65 61 6b 4c 61 62 65 6c 28 70 57  ereBreakLabel(pW
25d20 49 6e 66 6f 29 29 3b 0a 0a 20 20 20 20 2f 2a 20  Info));..    /* 
25d30 45 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65  End the database
25d40 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20   scan loop..    
25d50 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 57 68  */.    sqlite3Wh
25d60 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a  ereEnd(pWInfo);.
25d70 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
25d80 54 68 69 73 20 63 61 73 65 20 77 68 65 6e 20 74  This case when t
25d90 68 65 72 65 20 65 78 69 73 74 20 61 67 67 72 65  here exist aggre
25da0 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 6f  gate functions o
25db0 72 20 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61  r a GROUP BY cla
25dc0 75 73 65 0a 20 20 20 20 2a 2a 20 6f 72 20 62 6f  use.    ** or bo
25dd0 74 68 20 2a 2f 0a 20 20 20 20 4e 61 6d 65 43 6f  th */.    NameCo
25de0 6e 74 65 78 74 20 73 4e 43 3b 20 20 20 20 2f 2a  ntext sNC;    /*
25df0 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20 66 6f   Name context fo
25e00 72 20 70 72 6f 63 65 73 73 69 6e 67 20 61 67 67  r processing agg
25e10 72 65 67 61 74 65 20 69 6e 66 6f 72 6d 61 74 69  regate informati
25e20 6f 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 41  on */.    int iA
25e30 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  Mem;          /*
25e40 20 46 69 72 73 74 20 4d 65 6d 20 61 64 64 72 65   First Mem addre
25e50 73 73 20 66 6f 72 20 73 74 6f 72 69 6e 67 20 63  ss for storing c
25e60 75 72 72 65 6e 74 20 47 52 4f 55 50 20 42 59 20  urrent GROUP BY 
25e70 2a 2f 0a 20 20 20 20 69 6e 74 20 69 42 4d 65 6d  */.    int iBMem
25e80 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  ;          /* Fi
25e90 72 73 74 20 4d 65 6d 20 61 64 64 72 65 73 73 20  rst Mem address 
25ea0 66 6f 72 20 70 72 65 76 69 6f 75 73 20 47 52 4f  for previous GRO
25eb0 55 50 20 42 59 20 2a 2f 0a 20 20 20 20 69 6e 74  UP BY */.    int
25ec0 20 69 55 73 65 46 6c 61 67 3b 20 20 20 20 20 20   iUseFlag;      
25ed0 20 2f 2a 20 4d 65 6d 20 61 64 64 72 65 73 73 20   /* Mem address 
25ee0 68 6f 6c 64 69 6e 67 20 66 6c 61 67 20 69 6e 64  holding flag ind
25ef0 69 63 61 74 69 6e 67 20 74 68 61 74 20 61 74 20  icating that at 
25f00 6c 65 61 73 74 0a 20 20 20 20 20 20 20 20 20 20  least.          
25f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
25f20 20 6f 6e 65 20 72 6f 77 20 6f 66 20 74 68 65 20   one row of the 
25f30 69 6e 70 75 74 20 74 6f 20 74 68 65 20 61 67 67  input to the agg
25f40 72 65 67 61 74 6f 72 20 68 61 73 20 62 65 65 6e  regator has been
25f50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
25f60 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63           ** proc
25f70 65 73 73 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74  essed */.    int
25f80 20 69 41 62 6f 72 74 46 6c 61 67 3b 20 20 20 20   iAbortFlag;    
25f90 20 2f 2a 20 4d 65 6d 20 61 64 64 72 65 73 73 20   /* Mem address 
25fa0 77 68 69 63 68 20 63 61 75 73 65 73 20 71 75 65  which causes que
25fb0 72 79 20 61 62 6f 72 74 20 69 66 20 70 6f 73 69  ry abort if posi
25fc0 74 69 76 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20  tive */.    int 
25fd0 67 72 6f 75 70 42 79 53 6f 72 74 3b 20 20 20 20  groupBySort;    
25fe0 2f 2a 20 52 6f 77 73 20 63 6f 6d 65 20 66 72 6f  /* Rows come fro
25ff0 6d 20 73 6f 75 72 63 65 20 69 6e 20 47 52 4f 55  m source in GROU
26000 50 20 42 59 20 6f 72 64 65 72 20 2a 2f 0a 20 20  P BY order */.  
26010 20 20 69 6e 74 20 61 64 64 72 45 6e 64 3b 20 20    int addrEnd;  
26020 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20        /* End of 
26030 70 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 74  processing for t
26040 68 69 73 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20  his SELECT */.  
26050 20 20 69 6e 74 20 73 6f 72 74 50 54 61 62 20 3d    int sortPTab =
26060 20 30 3b 20 20 20 2f 2a 20 50 73 65 75 64 6f 74   0;   /* Pseudot
26070 61 62 6c 65 20 75 73 65 64 20 74 6f 20 64 65 63  able used to dec
26080 6f 64 65 20 73 6f 72 74 69 6e 67 20 72 65 73 75  ode sorting resu
26090 6c 74 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73  lts */.    int s
260a0 6f 72 74 4f 75 74 20 3d 20 30 3b 20 20 20 20 2f  ortOut = 0;    /
260b0 2a 20 4f 75 74 70 75 74 20 72 65 67 69 73 74 65  * Output registe
260c0 72 20 66 72 6f 6d 20 74 68 65 20 73 6f 72 74 65  r from the sorte
260d0 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 65 6d  r */..    /* Rem
260e0 6f 76 65 20 61 6e 79 20 61 6e 64 20 61 6c 6c 20  ove any and all 
260f0 61 6c 69 61 73 65 73 20 62 65 74 77 65 65 6e 20  aliases between 
26100 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 61  the result set a
26110 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20 47 52  nd the.    ** GR
26120 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e 0a 20  OUP BY clause.. 
26130 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 47     */.    if( pG
26140 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20  roupBy ){.      
26150 69 6e 74 20 6b 3b 20 20 20 20 20 20 20 20 20 20  int k;          
26160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26170 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
26180 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78  .      struct Ex
26190 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
261a0 65 6d 3b 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70  em;  /* For loop
261b0 69 6e 67 20 6f 76 65 72 20 65 78 70 72 65 73 73  ing over express
261c0 69 6f 6e 20 69 6e 20 61 20 6c 69 73 74 20 2a 2f  ion in a list */
261d0 0a 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 70 2d  ..      for(k=p-
261e0 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20  >pEList->nExpr, 
261f0 70 49 74 65 6d 3d 70 2d 3e 70 45 4c 69 73 74 2d  pItem=p->pEList-
26200 3e 61 3b 20 6b 3e 30 3b 20 6b 2d 2d 2c 20 70 49  >a; k>0; k--, pI
26210 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  tem++){.        
26220 70 49 74 65 6d 2d 3e 69 41 6c 69 61 73 20 3d 20  pItem->iAlias = 
26230 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
26240 20 66 6f 72 28 6b 3d 70 47 72 6f 75 70 42 79 2d   for(k=pGroupBy-
26250 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d 70 47  >nExpr, pItem=pG
26260 72 6f 75 70 42 79 2d 3e 61 3b 20 6b 3e 30 3b 20  roupBy->a; k>0; 
26270 6b 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  k--, pItem++){. 
26280 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 41         pItem->iA
26290 6c 69 61 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  lias = 0;.      
262a0 7d 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e  }.      if( p->n
262b0 53 65 6c 65 63 74 52 6f 77 3e 31 30 30 20 29 20  SelectRow>100 ) 
262c0 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20  p->nSelectRow = 
262d0 31 30 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  100;.    }else{.
262e0 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74        p->nSelect
262f0 52 6f 77 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a  Row = 1;.    }..
26300 20 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20   .    /* Create 
26310 61 20 6c 61 62 65 6c 20 74 6f 20 6a 75 6d 70 20  a label to jump 
26320 74 6f 20 77 68 65 6e 20 77 65 20 77 61 6e 74 20  to when we want 
26330 74 6f 20 61 62 6f 72 74 20 74 68 65 20 71 75 65  to abort the que
26340 72 79 20 2a 2f 0a 20 20 20 20 61 64 64 72 45 6e  ry */.    addrEn
26350 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  d = sqlite3VdbeM
26360 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20  akeLabel(v);..  
26370 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 54 4b 5f    /* Convert TK_
26380 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73 20 69 6e 74  COLUMN nodes int
26390 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20  o TK_AGG_COLUMN 
263a0 61 6e 64 20 6d 61 6b 65 20 65 6e 74 72 69 65 73  and make entries
263b0 20 69 6e 0a 20 20 20 20 2a 2a 20 73 41 67 67 49   in.    ** sAggI
263c0 6e 66 6f 20 66 6f 72 20 61 6c 6c 20 54 4b 5f 41  nfo for all TK_A
263d0 47 47 5f 46 55 4e 43 54 49 4f 4e 20 6e 6f 64 65  GG_FUNCTION node
263e0 73 20 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 73  s in expressions
263f0 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 53   of the.    ** S
26400 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
26410 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6d 65 6d 73  .    */.    mems
26420 65 74 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65  et(&sNC, 0, size
26430 6f 66 28 73 4e 43 29 29 3b 0a 20 20 20 20 73 4e  of(sNC));.    sN
26440 43 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73  C.pParse = pPars
26450 65 3b 0a 20 20 20 20 73 4e 43 2e 70 53 72 63 4c  e;.    sNC.pSrcL
26460 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a  ist = pTabList;.
26470 20 20 20 20 73 4e 43 2e 70 41 67 67 49 6e 66 6f      sNC.pAggInfo
26480 20 3d 20 26 73 41 67 67 49 6e 66 6f 3b 0a 20 20   = &sAggInfo;.  
26490 20 20 73 41 67 67 49 6e 66 6f 2e 6e 53 6f 72 74    sAggInfo.nSort
264a0 69 6e 67 43 6f 6c 75 6d 6e 20 3d 20 70 47 72 6f  ingColumn = pGro
264b0 75 70 42 79 20 3f 20 70 47 72 6f 75 70 42 79 2d  upBy ? pGroupBy-
264c0 3e 6e 45 78 70 72 2b 31 20 3a 20 30 3b 0a 20 20  >nExpr+1 : 0;.  
264d0 20 20 73 41 67 67 49 6e 66 6f 2e 70 47 72 6f 75    sAggInfo.pGrou
264e0 70 42 79 20 3d 20 70 47 72 6f 75 70 42 79 3b 0a  pBy = pGroupBy;.
264f0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41      sqlite3ExprA
26500 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 26 73  nalyzeAggList(&s
26510 4e 43 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20  NC, pEList);.   
26520 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
26530 79 7a 65 41 67 67 4c 69 73 74 28 26 73 4e 43 2c  yzeAggList(&sNC,
26540 20 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20   pOrderBy);.    
26550 69 66 28 20 70 48 61 76 69 6e 67 20 29 7b 0a 20  if( pHaving ){. 
26560 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
26570 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  AnalyzeAggregate
26580 73 28 26 73 4e 43 2c 20 70 48 61 76 69 6e 67 29  s(&sNC, pHaving)
26590 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 41 67 67  ;.    }.    sAgg
265a0 49 6e 66 6f 2e 6e 41 63 63 75 6d 75 6c 61 74 6f  Info.nAccumulato
265b0 72 20 3d 20 73 41 67 67 49 6e 66 6f 2e 6e 43 6f  r = sAggInfo.nCo
265c0 6c 75 6d 6e 3b 0a 20 20 20 20 66 6f 72 28 69 3d  lumn;.    for(i=
265d0 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 46  0; i<sAggInfo.nF
265e0 75 6e 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  unc; i++){.     
265f0 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
26600 73 50 72 6f 70 65 72 74 79 28 73 41 67 67 49 6e  sProperty(sAggIn
26610 66 6f 2e 61 46 75 6e 63 5b 69 5d 2e 70 45 78 70  fo.aFunc[i].pExp
26620 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
26630 20 29 3b 0a 20 20 20 20 20 20 73 4e 43 2e 6e 63   );.      sNC.nc
26640 46 6c 61 67 73 20 7c 3d 20 4e 43 5f 49 6e 41 67  Flags |= NC_InAg
26650 67 46 75 6e 63 3b 0a 20 20 20 20 20 20 73 71 6c  gFunc;.      sql
26660 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
26670 67 67 4c 69 73 74 28 26 73 4e 43 2c 20 73 41 67  ggList(&sNC, sAg
26680 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 69 5d 2e 70  gInfo.aFunc[i].p
26690 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a  Expr->x.pList);.
266a0 20 20 20 20 20 20 73 4e 43 2e 6e 63 46 6c 61 67        sNC.ncFlag
266b0 73 20 26 3d 20 7e 4e 43 5f 49 6e 41 67 67 46 75  s &= ~NC_InAggFu
266c0 6e 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  nc;.    }.    if
266d0 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
266e0 65 64 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74  ed ) goto select
266f0 5f 65 6e 64 3b 0a 0a 20 20 20 20 2f 2a 20 50 72  _end;..    /* Pr
26700 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 61 67 67  ocessing for agg
26710 72 65 67 61 74 65 73 20 77 69 74 68 20 47 52 4f  regates with GRO
26720 55 50 20 42 59 20 69 73 20 76 65 72 79 20 64 69  UP BY is very di
26730 66 66 65 72 65 6e 74 20 61 6e 64 0a 20 20 20 20  fferent and.    
26740 2a 2a 20 6d 75 63 68 20 6d 6f 72 65 20 63 6f 6d  ** much more com
26750 70 6c 65 78 20 74 68 61 6e 20 61 67 67 72 65 67  plex than aggreg
26760 61 74 65 73 20 77 69 74 68 6f 75 74 20 61 20 47  ates without a G
26770 52 4f 55 50 20 42 59 2e 0a 20 20 20 20 2a 2f 0a  ROUP BY..    */.
26780 20 20 20 20 69 66 28 20 70 47 72 6f 75 70 42 79      if( pGroupBy
26790 20 29 7b 0a 20 20 20 20 20 20 4b 65 79 49 6e 66   ){.      KeyInf
267a0 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 20 20 2f 2a  o *pKeyInfo;  /*
267b0 20 4b 65 79 69 6e 67 20 69 6e 66 6f 72 6d 61 74   Keying informat
267c0 69 6f 6e 20 66 6f 72 20 74 68 65 20 67 72 6f 75  ion for the grou
267d0 70 20 62 79 20 63 6c 61 75 73 65 20 2a 2f 0a 20  p by clause */. 
267e0 20 20 20 20 20 69 6e 74 20 6a 31 3b 20 20 20 20       int j1;    
267f0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 2d 76 73           /* A-vs
26800 2d 42 20 63 6f 6d 70 61 72 69 73 69 6f 6e 20 6a  -B comparision j
26810 75 6d 70 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ump */.      int
26820 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 3b 20   addrOutputRow; 
26830 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 73 75 62   /* Start of sub
26840 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74  routine that out
26850 70 75 74 73 20 61 20 72 65 73 75 6c 74 20 72 6f  puts a result ro
26860 77 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72  w */.      int r
26870 65 67 4f 75 74 70 75 74 52 6f 77 3b 20 20 20 2f  egOutputRow;   /
26880 2a 20 52 65 74 75 72 6e 20 61 64 64 72 65 73 73  * Return address
26890 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 6f 75   register for ou
268a0 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65 20  tput subroutine 
268b0 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  */.      int add
268c0 72 53 65 74 41 62 6f 72 74 3b 20 20 20 2f 2a 20  rSetAbort;   /* 
268d0 53 65 74 20 74 68 65 20 61 62 6f 72 74 20 66 6c  Set the abort fl
268e0 61 67 20 61 6e 64 20 72 65 74 75 72 6e 20 2a 2f  ag and return */
268f0 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 54  .      int addrT
26900 6f 70 4f 66 4c 6f 6f 70 3b 20 20 2f 2a 20 54 6f  opOfLoop;  /* To
26910 70 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 6c  p of the input l
26920 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  oop */.      int
26930 20 61 64 64 72 53 6f 72 74 69 6e 67 49 64 78 3b   addrSortingIdx;
26940 20 2f 2a 20 54 68 65 20 4f 50 5f 4f 70 65 6e 45   /* The OP_OpenE
26950 70 68 65 6d 65 72 61 6c 20 66 6f 72 20 74 68 65  phemeral for the
26960 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 2a   sorting index *
26970 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  /.      int addr
26980 52 65 73 65 74 3b 20 20 20 20 20 20 2f 2a 20 53  Reset;      /* S
26990 75 62 72 6f 75 74 69 6e 65 20 66 6f 72 20 72 65  ubroutine for re
269a0 73 65 74 74 69 6e 67 20 74 68 65 20 61 63 63 75  setting the accu
269b0 6d 75 6c 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20  mulator */.     
269c0 20 69 6e 74 20 72 65 67 52 65 73 65 74 3b 20 20   int regReset;  
269d0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 61       /* Return a
269e0 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20  ddress register 
269f0 66 6f 72 20 72 65 73 65 74 20 73 75 62 72 6f 75  for reset subrou
26a00 74 69 6e 65 20 2a 2f 0a 0a 20 20 20 20 20 20 2f  tine */..      /
26a10 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20  * If there is a 
26a20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20  GROUP BY clause 
26a30 77 65 20 6d 69 67 68 74 20 6e 65 65 64 20 61 20  we might need a 
26a40 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74 6f  sorting index to
26a50 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70 6c 65 6d  .      ** implem
26a60 65 6e 74 20 69 74 2e 20 20 41 6c 6c 6f 63 61 74  ent it.  Allocat
26a70 65 20 74 68 61 74 20 73 6f 72 74 69 6e 67 20 69  e that sorting i
26a80 6e 64 65 78 20 6e 6f 77 2e 20 20 49 66 20 69 74  ndex now.  If it
26a90 20 74 75 72 6e 73 20 6f 75 74 0a 20 20 20 20 20   turns out.     
26aa0 20 2a 2a 20 74 68 61 74 20 77 65 20 64 6f 20 6e   ** that we do n
26ab0 6f 74 20 6e 65 65 64 20 69 74 20 61 66 74 65 72  ot need it after
26ac0 20 61 6c 6c 2c 20 74 68 65 20 4f 50 5f 53 6f 72   all, the OP_Sor
26ad0 74 65 72 4f 70 65 6e 20 69 6e 73 74 72 75 63 74  terOpen instruct
26ae0 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 77 69 6c  ion.      ** wil
26af0 6c 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20 69  l be converted i
26b00 6e 74 6f 20 61 20 4e 6f 6f 70 2e 20 20 0a 20 20  nto a Noop.  .  
26b10 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 41 67      */.      sAg
26b20 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78  gInfo.sortingIdx
26b30 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
26b40 2b 3b 0a 20 20 20 20 20 20 70 4b 65 79 49 6e 66  +;.      pKeyInf
26b50 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45  o = keyInfoFromE
26b60 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
26b70 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 20  pGroupBy);.     
26b80 20 61 64 64 72 53 6f 72 74 69 6e 67 49 64 78 20   addrSortingIdx 
26b90 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
26ba0 4f 70 34 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72  Op4(v, OP_Sorter
26bb0 4f 70 65 6e 2c 20 0a 20 20 20 20 20 20 20 20 20  Open, .         
26bc0 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e   sAggInfo.sortin
26bd0 67 49 64 78 2c 20 73 41 67 67 49 6e 66 6f 2e 6e  gIdx, sAggInfo.n
26be0 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 2c 20 0a  SortingColumn, .
26bf0 20 20 20 20 20 20 20 20 20 20 30 2c 20 28 63 68            0, (ch
26c00 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34  ar*)pKeyInfo, P4
26c10 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46  _KEYINFO_HANDOFF
26c20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 6e 69  );..      /* Ini
26c30 74 69 61 6c 69 7a 65 20 6d 65 6d 6f 72 79 20 6c  tialize memory l
26c40 6f 63 61 74 69 6f 6e 73 20 75 73 65 64 20 62 79  ocations used by
26c50 20 47 52 4f 55 50 20 42 59 20 61 67 67 72 65 67   GROUP BY aggreg
26c60 61 74 65 20 70 72 6f 63 65 73 73 69 6e 67 0a 20  ate processing. 
26c70 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 55       */.      iU
26c80 73 65 46 6c 61 67 20 3d 20 2b 2b 70 50 61 72 73  seFlag = ++pPars
26c90 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 69  e->nMem;.      i
26ca0 41 62 6f 72 74 46 6c 61 67 20 3d 20 2b 2b 70 50  AbortFlag = ++pP
26cb0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
26cc0 20 20 72 65 67 4f 75 74 70 75 74 52 6f 77 20 3d    regOutputRow =
26cd0 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
26ce0 0a 20 20 20 20 20 20 61 64 64 72 4f 75 74 70 75  .      addrOutpu
26cf0 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 56 64  tRow = sqlite3Vd
26d00 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
26d10 20 20 20 20 20 20 72 65 67 52 65 73 65 74 20 3d        regReset =
26d20 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
26d30 0a 20 20 20 20 20 20 61 64 64 72 52 65 73 65 74  .      addrReset
26d40 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
26d50 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
26d60 20 20 69 41 4d 65 6d 20 3d 20 70 50 61 72 73 65    iAMem = pParse
26d70 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 20 20  ->nMem + 1;.    
26d80 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
26d90 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  = pGroupBy->nExp
26da0 72 3b 0a 20 20 20 20 20 20 69 42 4d 65 6d 20 3d  r;.      iBMem =
26db0 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20   pParse->nMem + 
26dc0 31 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  1;.      pParse-
26dd0 3e 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f 75 70 42  >nMem += pGroupB
26de0 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20  y->nExpr;.      
26df0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
26e00 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
26e10 20 30 2c 20 69 41 62 6f 72 74 46 6c 61 67 29 3b   0, iAbortFlag);
26e20 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
26e30 6e 74 28 28 76 2c 20 22 63 6c 65 61 72 20 61 62  nt((v, "clear ab
26e40 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a 20 20 20  ort flag"));.   
26e50 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
26e60 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
26e70 65 72 2c 20 30 2c 20 69 55 73 65 46 6c 61 67 29  er, 0, iUseFlag)
26e80 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
26e90 65 6e 74 28 28 76 2c 20 22 69 6e 64 69 63 61 74  ent((v, "indicat
26ea0 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 65 6d  e accumulator em
26eb0 70 74 79 22 29 29 3b 0a 20 20 20 20 20 20 73 71  pty"));.      sq
26ec0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
26ed0 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 69  v, OP_Null, 0, i
26ee0 41 4d 65 6d 2c 20 69 41 4d 65 6d 2b 70 47 72 6f  AMem, iAMem+pGro
26ef0 75 70 42 79 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a  upBy->nExpr-1);.
26f00 0a 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20  .      /* Begin 
26f10 61 20 6c 6f 6f 70 20 74 68 61 74 20 77 69 6c 6c  a loop that will
26f20 20 65 78 74 72 61 63 74 20 61 6c 6c 20 73 6f 75   extract all sou
26f30 72 63 65 20 72 6f 77 73 20 69 6e 20 47 52 4f 55  rce rows in GROU
26f40 50 20 42 59 20 6f 72 64 65 72 2e 0a 20 20 20 20  P BY order..    
26f50 20 20 2a 2a 20 54 68 69 73 20 6d 69 67 68 74 20    ** This might 
26f60 69 6e 76 6f 6c 76 65 20 74 77 6f 20 73 65 70 61  involve two sepa
26f70 72 61 74 65 20 6c 6f 6f 70 73 20 77 69 74 68 20  rate loops with 
26f80 61 6e 20 4f 50 5f 53 6f 72 74 20 69 6e 20 62 65  an OP_Sort in be
26f90 74 77 65 65 6e 2c 20 6f 72 0a 20 20 20 20 20 20  tween, or.      
26fa0 2a 2a 20 69 74 20 6d 69 67 68 74 20 62 65 20 61  ** it might be a
26fb0 20 73 69 6e 67 6c 65 20 6c 6f 6f 70 20 74 68 61   single loop tha
26fc0 74 20 75 73 65 73 20 61 6e 20 69 6e 64 65 78 20  t uses an index 
26fd0 74 6f 20 65 78 74 72 61 63 74 20 69 6e 66 6f 72  to extract infor
26fe0 6d 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20  mation.      ** 
26ff0 69 6e 20 74 68 65 20 72 69 67 68 74 20 6f 72 64  in the right ord
27000 65 72 20 74 6f 20 62 65 67 69 6e 20 77 69 74 68  er to begin with
27010 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
27020 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
27030 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
27040 72 65 67 52 65 73 65 74 2c 20 61 64 64 72 52 65  regReset, addrRe
27050 73 65 74 29 3b 0a 20 20 20 20 20 20 70 57 49 6e  set);.      pWIn
27060 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72  fo = sqlite3Wher
27070 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70  eBegin(pParse, p
27080 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65 2c  TabList, pWhere,
27090 20 70 47 72 6f 75 70 42 79 2c 20 30 2c 20 0a 20   pGroupBy, 0, . 
270a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
270b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
270c0 57 48 45 52 45 5f 47 52 4f 55 50 42 59 2c 20 30  WHERE_GROUPBY, 0
270d0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57 49  );.      if( pWI
270e0 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65  nfo==0 ) goto se
270f0 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
27100 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65  if( sqlite3Where
27110 49 73 4f 72 64 65 72 65 64 28 70 57 49 6e 66 6f  IsOrdered(pWInfo
27120 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
27130 54 68 65 20 6f 70 74 69 6d 69 7a 65 72 20 69 73  The optimizer is
27140 20 61 62 6c 65 20 74 6f 20 64 65 6c 69 76 65 72   able to deliver
27150 20 72 6f 77 73 20 69 6e 20 67 72 6f 75 70 20 62   rows in group b
27160 79 20 6f 72 64 65 72 20 73 6f 0a 20 20 20 20 20  y order so.     
27170 20 20 20 2a 2a 20 77 65 20 64 6f 20 6e 6f 74 20     ** we do not 
27180 68 61 76 65 20 74 6f 20 73 6f 72 74 2e 20 20 54  have to sort.  T
27190 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  he OP_OpenEpheme
271a0 72 61 6c 20 74 61 62 6c 65 20 77 69 6c 6c 20 62  ral table will b
271b0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61 6e  e.        ** can
271c0 63 65 6c 6c 65 64 20 6c 61 74 65 72 20 62 65 63  celled later bec
271d0 61 75 73 65 20 77 65 20 73 74 69 6c 6c 20 6e 65  ause we still ne
271e0 65 64 20 74 6f 20 75 73 65 20 74 68 65 20 70 4b  ed to use the pK
271f0 65 79 49 6e 66 6f 0a 20 20 20 20 20 20 20 20 2a  eyInfo.        *
27200 2f 0a 20 20 20 20 20 20 20 20 67 72 6f 75 70 42  /.        groupB
27210 79 53 6f 72 74 20 3d 20 30 3b 0a 20 20 20 20 20  ySort = 0;.     
27220 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
27230 2f 2a 20 52 6f 77 73 20 61 72 65 20 63 6f 6d 69  /* Rows are comi
27240 6e 67 20 6f 75 74 20 69 6e 20 75 6e 64 65 74 65  ng out in undete
27250 72 6d 69 6e 65 64 20 6f 72 64 65 72 2e 20 20 57  rmined order.  W
27260 65 20 68 61 76 65 20 74 6f 20 70 75 73 68 0a 20  e have to push. 
27270 20 20 20 20 20 20 20 2a 2a 20 65 61 63 68 20 72         ** each r
27280 6f 77 20 69 6e 74 6f 20 61 20 73 6f 72 74 69 6e  ow into a sortin
27290 67 20 69 6e 64 65 78 2c 20 74 65 72 6d 69 6e 61  g index, termina
272a0 74 65 20 74 68 65 20 66 69 72 73 74 20 6c 6f 6f  te the first loo
272b0 70 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  p,.        ** th
272c0 65 6e 20 6c 6f 6f 70 20 6f 76 65 72 20 74 68 65  en loop over the
272d0 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 69   sorting index i
272e0 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 74 20 74  n order to get t
272f0 68 65 20 6f 75 74 70 75 74 0a 20 20 20 20 20 20  he output.      
27300 20 20 2a 2a 20 69 6e 20 73 6f 72 74 65 64 20 6f    ** in sorted o
27310 72 64 65 72 0a 20 20 20 20 20 20 20 20 2a 2f 0a  rder.        */.
27320 20 20 20 20 20 20 20 20 69 6e 74 20 72 65 67 42          int regB
27330 61 73 65 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  ase;.        int
27340 20 72 65 67 52 65 63 6f 72 64 3b 0a 20 20 20 20   regRecord;.    
27350 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20      int nCol;.  
27360 20 20 20 20 20 20 69 6e 74 20 6e 47 72 6f 75 70        int nGroup
27370 42 79 3b 0a 0a 20 20 20 20 20 20 20 20 65 78 70  By;..        exp
27380 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65 28 70 50  lainTempTable(pP
27390 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20  arse, .         
273a0 20 20 20 28 73 44 69 73 74 69 6e 63 74 2e 69 73     (sDistinct.is
273b0 54 6e 63 74 20 26 26 20 28 70 2d 3e 73 65 6c 46  Tnct && (p->selF
273c0 6c 61 67 73 26 53 46 5f 44 69 73 74 69 6e 63 74  lags&SF_Distinct
273d0 29 3d 3d 30 29 20 3f 0a 20 20 20 20 20 20 20 20  )==0) ?.        
273e0 20 20 20 20 20 20 20 20 20 20 20 20 22 44 49 53              "DIS
273f0 54 49 4e 43 54 22 20 3a 20 22 47 52 4f 55 50 20  TINCT" : "GROUP 
27400 42 59 22 29 3b 0a 0a 20 20 20 20 20 20 20 20 67  BY");..        g
27410 72 6f 75 70 42 79 53 6f 72 74 20 3d 20 31 3b 0a  roupBySort = 1;.
27420 20 20 20 20 20 20 20 20 6e 47 72 6f 75 70 42 79          nGroupBy
27430 20 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78   = pGroupBy->nEx
27440 70 72 3b 0a 20 20 20 20 20 20 20 20 6e 43 6f 6c  pr;.        nCol
27450 20 3d 20 6e 47 72 6f 75 70 42 79 20 2b 20 31 3b   = nGroupBy + 1;
27460 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 6e 47 72  .        j = nGr
27470 6f 75 70 42 79 2b 31 3b 0a 20 20 20 20 20 20 20  oupBy+1;.       
27480 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67 67   for(i=0; i<sAgg
27490 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b  Info.nColumn; i+
274a0 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  +){.          if
274b0 28 20 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b  ( sAggInfo.aCol[
274c0 69 5d 2e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e  i].iSorterColumn
274d0 3e 3d 6a 20 29 7b 0a 20 20 20 20 20 20 20 20 20  >=j ){.         
274e0 20 20 20 6e 43 6f 6c 2b 2b 3b 0a 20 20 20 20 20     nCol++;.     
274f0 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20         j++;.    
27500 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
27510 7d 0a 20 20 20 20 20 20 20 20 72 65 67 42 61 73  }.        regBas
27520 65 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  e = sqlite3GetTe
27530 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
27540 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73  nCol);.        s
27550 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43  qlite3ExprCacheC
27560 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20  lear(pParse);.  
27570 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
27580 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50  rCodeExprList(pP
27590 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79 2c 20  arse, pGroupBy, 
275a0 72 65 67 42 61 73 65 2c 20 30 29 3b 0a 20 20 20  regBase, 0);.   
275b0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
275c0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65 71  AddOp2(v, OP_Seq
275d0 75 65 6e 63 65 2c 20 73 41 67 67 49 6e 66 6f 2e  uence, sAggInfo.
275e0 73 6f 72 74 69 6e 67 49 64 78 2c 72 65 67 42 61  sortingIdx,regBa
275f0 73 65 2b 6e 47 72 6f 75 70 42 79 29 3b 0a 20 20  se+nGroupBy);.  
27600 20 20 20 20 20 20 6a 20 3d 20 6e 47 72 6f 75 70        j = nGroup
27610 42 79 2b 31 3b 0a 20 20 20 20 20 20 20 20 66 6f  By+1;.        fo
27620 72 28 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66  r(i=0; i<sAggInf
27630 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b  o.nColumn; i++){
27640 0a 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63  .          struc
27650 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70  t AggInfo_col *p
27660 43 6f 6c 20 3d 20 26 73 41 67 67 49 6e 66 6f 2e  Col = &sAggInfo.
27670 61 43 6f 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 20  aCol[i];.       
27680 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69 53 6f     if( pCol->iSo
27690 72 74 65 72 43 6f 6c 75 6d 6e 3e 3d 6a 20 29 7b  rterColumn>=j ){
276a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
276b0 20 72 31 20 3d 20 6a 20 2b 20 72 65 67 42 61 73   r1 = j + regBas
276c0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  e;.            i
276d0 6e 74 20 72 32 3b 0a 0a 20 20 20 20 20 20 20 20  nt r2;..        
276e0 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33      r2 = sqlite3
276f0 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d  ExprCodeGetColum
27700 6e 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  n(pParse, .     
27710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27720 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
27730 70 54 61 62 2c 20 70 43 6f 6c 2d 3e 69 43 6f 6c  pTab, pCol->iCol
27740 75 6d 6e 2c 20 70 43 6f 6c 2d 3e 69 54 61 62 6c  umn, pCol->iTabl
27750 65 2c 20 72 31 2c 20 30 29 3b 0a 20 20 20 20 20  e, r1, 0);.     
27760 20 20 20 20 20 20 20 69 66 28 20 72 31 21 3d 72         if( r1!=r
27770 32 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  2 ){.           
27780 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
27790 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79  dOp2(v, OP_SCopy
277a0 2c 20 72 32 2c 20 72 31 29 3b 0a 20 20 20 20 20  , r2, r1);.     
277b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
277c0 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20       j++;.      
277d0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
277e0 20 20 20 20 20 20 20 20 72 65 67 52 65 63 6f 72          regRecor
277f0 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  d = sqlite3GetTe
27800 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
27810 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
27820 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d  beAddOp3(v, OP_M
27830 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 42 61  akeRecord, regBa
27840 73 65 2c 20 6e 43 6f 6c 2c 20 72 65 67 52 65 63  se, nCol, regRec
27850 6f 72 64 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ord);.        sq
27860 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
27870 76 2c 20 4f 50 5f 53 6f 72 74 65 72 49 6e 73 65  v, OP_SorterInse
27880 72 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72  rt, sAggInfo.sor
27890 74 69 6e 67 49 64 78 2c 20 72 65 67 52 65 63 6f  tingIdx, regReco
278a0 72 64 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  rd);.        sql
278b0 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
278c0 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 52 65  eg(pParse, regRe
278d0 63 6f 72 64 29 3b 0a 20 20 20 20 20 20 20 20 73  cord);.        s
278e0 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
278f0 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72  pRange(pParse, r
27900 65 67 42 61 73 65 2c 20 6e 43 6f 6c 29 3b 0a 20  egBase, nCol);. 
27910 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68         sqlite3Wh
27920 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a  ereEnd(pWInfo);.
27930 20 20 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f          sAggInfo
27940 2e 73 6f 72 74 69 6e 67 49 64 78 50 54 61 62 20  .sortingIdxPTab 
27950 3d 20 73 6f 72 74 50 54 61 62 20 3d 20 70 50 61  = sortPTab = pPa
27960 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
27970 20 20 20 20 20 73 6f 72 74 4f 75 74 20 3d 20 73       sortOut = s
27980 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
27990 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
279a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
279b0 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 50 73  Op3(v, OP_OpenPs
279c0 65 75 64 6f 2c 20 73 6f 72 74 50 54 61 62 2c 20  eudo, sortPTab, 
279d0 73 6f 72 74 4f 75 74 2c 20 6e 43 6f 6c 29 3b 0a  sortOut, nCol);.
279e0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
279f0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
27a00 53 6f 72 74 65 72 53 6f 72 74 2c 20 73 41 67 67  SorterSort, sAgg
27a10 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c  Info.sortingIdx,
27a20 20 61 64 64 72 45 6e 64 29 3b 0a 20 20 20 20 20   addrEnd);.     
27a30 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
27a40 76 2c 20 22 47 52 4f 55 50 20 42 59 20 73 6f 72  v, "GROUP BY sor
27a50 74 22 29 29 3b 0a 20 20 20 20 20 20 20 20 73 41  t"));.        sA
27a60 67 67 49 6e 66 6f 2e 75 73 65 53 6f 72 74 69 6e  ggInfo.useSortin
27a70 67 49 64 78 20 3d 20 31 3b 0a 20 20 20 20 20 20  gIdx = 1;.      
27a80 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
27a90 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b  heClear(pParse);
27aa0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
27ab0 2f 2a 20 45 76 61 6c 75 61 74 65 20 74 68 65 20  /* Evaluate the 
27ac0 63 75 72 72 65 6e 74 20 47 52 4f 55 50 20 42 59  current GROUP BY
27ad0 20 74 65 72 6d 73 20 61 6e 64 20 73 74 6f 72 65   terms and store
27ae0 20 69 6e 20 62 30 2c 20 62 31 2c 20 62 32 2e 2e   in b0, b1, b2..
27af0 2e 0a 20 20 20 20 20 20 2a 2a 20 28 62 30 20 69  ..      ** (b0 i
27b00 73 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f  s memory locatio
27b10 6e 20 69 42 4d 65 6d 2b 30 2c 20 62 31 20 69 73  n iBMem+0, b1 is
27b20 20 69 42 4d 65 6d 2b 31 2c 20 61 6e 64 20 73 6f   iBMem+1, and so
27b30 20 66 6f 72 74 68 29 0a 20 20 20 20 20 20 2a 2a   forth).      **
27b40 20 54 68 65 6e 20 63 6f 6d 70 61 72 65 20 74 68   Then compare th
27b50 65 20 63 75 72 72 65 6e 74 20 47 52 4f 55 50 20  e current GROUP 
27b60 42 59 20 74 65 72 6d 73 20 61 67 61 69 6e 73 74  BY terms against
27b70 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 74 65   the GROUP BY te
27b80 72 6d 73 0a 20 20 20 20 20 20 2a 2a 20 66 72 6f  rms.      ** fro
27b90 6d 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 72  m the previous r
27ba0 6f 77 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f  ow currently sto
27bb0 72 65 64 20 69 6e 20 61 30 2c 20 61 31 2c 20 61  red in a0, a1, a
27bc0 32 2e 2e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  2....      */.  
27bd0 20 20 20 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f      addrTopOfLoo
27be0 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  p = sqlite3VdbeC
27bf0 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
27c00 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
27c10 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73  CacheClear(pPars
27c20 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 67 72  e);.      if( gr
27c30 6f 75 70 42 79 53 6f 72 74 20 29 7b 0a 20 20 20  oupBySort ){.   
27c40 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
27c50 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72  AddOp2(v, OP_Sor
27c60 74 65 72 44 61 74 61 2c 20 73 41 67 67 49 6e 66  terData, sAggInf
27c70 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 73 6f  o.sortingIdx, so
27c80 72 74 4f 75 74 29 3b 0a 20 20 20 20 20 20 7d 0a  rtOut);.      }.
27c90 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
27ca0 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72  <pGroupBy->nExpr
27cb0 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
27cc0 69 66 28 20 67 72 6f 75 70 42 79 53 6f 72 74 20  if( groupBySort 
27cd0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
27ce0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
27cf0 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73 6f 72  , OP_Column, sor
27d00 74 50 54 61 62 2c 20 6a 2c 20 69 42 4d 65 6d 2b  tPTab, j, iBMem+
27d10 6a 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  j);.          if
27d20 28 20 6a 3d 3d 30 20 29 20 73 71 6c 69 74 65 33  ( j==0 ) sqlite3
27d30 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
27d40 4f 50 46 4c 41 47 5f 43 4c 45 41 52 43 41 43 48  OPFLAG_CLEARCACH
27d50 45 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  E);.        }els
27d60 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 41 67  e{.          sAg
27d70 67 49 6e 66 6f 2e 64 69 72 65 63 74 4d 6f 64 65  gInfo.directMode
27d80 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
27d90 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
27da0 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79  pParse, pGroupBy
27db0 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72 2c 20 69 42  ->a[j].pExpr, iB
27dc0 4d 65 6d 2b 6a 29 3b 0a 20 20 20 20 20 20 20 20  Mem+j);.        
27dd0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
27de0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
27df0 34 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c  4(v, OP_Compare,
27e00 20 69 41 4d 65 6d 2c 20 69 42 4d 65 6d 2c 20 70   iAMem, iBMem, p
27e10 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2c 0a  GroupBy->nExpr,.
27e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27e30 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
27e40 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45  )pKeyInfo, P4_KE
27e50 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 6a 31  YINFO);.      j1
27e60 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
27e70 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
27e80 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
27e90 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70  ddOp3(v, OP_Jump
27ea0 2c 20 6a 31 2b 31 2c 20 30 2c 20 6a 31 2b 31 29  , j1+1, 0, j1+1)
27eb0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65  ;..      /* Gene
27ec0 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 72  rate code that r
27ed0 75 6e 73 20 77 68 65 6e 65 76 65 72 20 74 68 65  uns whenever the
27ee0 20 47 52 4f 55 50 20 42 59 20 63 68 61 6e 67 65   GROUP BY change
27ef0 73 2e 0a 20 20 20 20 20 20 2a 2a 20 43 68 61 6e  s..      ** Chan
27f00 67 65 73 20 69 6e 20 74 68 65 20 47 52 4f 55 50  ges in the GROUP
27f10 20 42 59 20 61 72 65 20 64 65 74 65 63 74 65 64   BY are detected
27f20 20 62 79 20 74 68 65 20 70 72 65 76 69 6f 75 73   by the previous
27f30 20 63 6f 64 65 0a 20 20 20 20 20 20 2a 2a 20 62   code.      ** b
27f40 6c 6f 63 6b 2e 20 20 49 66 20 74 68 65 72 65 20  lock.  If there 
27f50 77 65 72 65 20 6e 6f 20 63 68 61 6e 67 65 73 2c  were no changes,
27f60 20 74 68 69 73 20 62 6c 6f 63 6b 20 69 73 20 73   this block is s
27f70 6b 69 70 70 65 64 2e 0a 20 20 20 20 20 20 2a 2a  kipped..      **
27f80 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 63  .      ** This c
27f90 6f 64 65 20 63 6f 70 69 65 73 20 63 75 72 72 65  ode copies curre
27fa0 6e 74 20 67 72 6f 75 70 20 62 79 20 74 65 72 6d  nt group by term
27fb0 73 20 69 6e 20 62 30 2c 62 31 2c 62 32 2c 2e 2e  s in b0,b1,b2,..
27fc0 2e 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 20  ..      ** over 
27fd0 74 6f 20 61 30 2c 61 31 2c 61 32 2e 20 20 49 74  to a0,a1,a2.  It
27fe0 20 74 68 65 6e 20 63 61 6c 6c 73 20 74 68 65 20   then calls the 
27ff0 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e  output subroutin
28000 65 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 72  e.      ** and r
28010 65 73 65 74 73 20 74 68 65 20 61 67 67 72 65 67  esets the aggreg
28020 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20  ate accumulator 
28030 72 65 67 69 73 74 65 72 73 20 69 6e 20 70 72 65  registers in pre
28040 70 61 72 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a  paration.      *
28050 2a 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 47  * for the next G
28060 52 4f 55 50 20 42 59 20 62 61 74 63 68 2e 0a 20  ROUP BY batch.. 
28070 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
28080 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76  lite3ExprCodeMov
28090 65 28 70 50 61 72 73 65 2c 20 69 42 4d 65 6d 2c  e(pParse, iBMem,
280a0 20 69 41 4d 65 6d 2c 20 70 47 72 6f 75 70 42 79   iAMem, pGroupBy
280b0 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ->nExpr);.      
280c0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
280d0 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72  2(v, OP_Gosub, r
280e0 65 67 4f 75 74 70 75 74 52 6f 77 2c 20 61 64 64  egOutputRow, add
280f0 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20  rOutputRow);.   
28100 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
28110 76 2c 20 22 6f 75 74 70 75 74 20 6f 6e 65 20 72  v, "output one r
28120 6f 77 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  ow"));.      sql
28130 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
28140 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69 41 62 6f  , OP_IfPos, iAbo
28150 72 74 46 6c 61 67 2c 20 61 64 64 72 45 6e 64 29  rtFlag, addrEnd)
28160 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
28170 65 6e 74 28 28 76 2c 20 22 63 68 65 63 6b 20 61  ent((v, "check a
28180 62 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a 20 20  bort flag"));.  
28190 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
281a0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75  ddOp2(v, OP_Gosu
281b0 62 2c 20 72 65 67 52 65 73 65 74 2c 20 61 64 64  b, regReset, add
281c0 72 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20 56  rReset);.      V
281d0 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
281e0 72 65 73 65 74 20 61 63 63 75 6d 75 6c 61 74 6f  reset accumulato
281f0 72 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  r"));..      /* 
28200 55 70 64 61 74 65 20 74 68 65 20 61 67 67 72 65  Update the aggre
28210 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72  gate accumulator
28220 73 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 63  s based on the c
28230 6f 6e 74 65 6e 74 20 6f 66 0a 20 20 20 20 20 20  ontent of.      
28240 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  ** the current r
28250 6f 77 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  ow.      */.    
28260 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
28270 70 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a 20 20  pHere(v, j1);.  
28280 20 20 20 20 75 70 64 61 74 65 41 63 63 75 6d 75      updateAccumu
28290 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73  lator(pParse, &s
282a0 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  AggInfo);.      
282b0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
282c0 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
282d0 20 31 2c 20 69 55 73 65 46 6c 61 67 29 3b 0a 20   1, iUseFlag);. 
282e0 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
282f0 28 28 76 2c 20 22 69 6e 64 69 63 61 74 65 20 64  ((v, "indicate d
28300 61 74 61 20 69 6e 20 61 63 63 75 6d 75 6c 61 74  ata in accumulat
28310 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  or"));..      /*
28320 20 45 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70   End of the loop
28330 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
28340 69 66 28 20 67 72 6f 75 70 42 79 53 6f 72 74 20  if( groupBySort 
28350 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
28360 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
28370 4f 50 5f 53 6f 72 74 65 72 4e 65 78 74 2c 20 73  OP_SorterNext, s
28380 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49  AggInfo.sortingI
28390 64 78 2c 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f  dx, addrTopOfLoo
283a0 70 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  p);.      }else{
283b0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
283c0 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29  WhereEnd(pWInfo)
283d0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
283e0 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f  3VdbeChangeToNoo
283f0 70 28 76 2c 20 61 64 64 72 53 6f 72 74 69 6e 67  p(v, addrSorting
28400 49 64 78 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  Idx);.      }.. 
28410 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 74       /* Output t
28420 68 65 20 66 69 6e 61 6c 20 72 6f 77 20 6f 66 20  he final row of 
28430 72 65 73 75 6c 74 0a 20 20 20 20 20 20 2a 2f 0a  result.      */.
28440 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
28450 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
28460 73 75 62 2c 20 72 65 67 4f 75 74 70 75 74 52 6f  sub, regOutputRo
28470 77 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77  w, addrOutputRow
28480 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
28490 6d 65 6e 74 28 28 76 2c 20 22 6f 75 74 70 75 74  ment((v, "output
284a0 20 66 69 6e 61 6c 20 72 6f 77 22 29 29 3b 0a 0a   final row"));..
284b0 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 6f 76        /* Jump ov
284c0 65 72 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e  er the subroutin
284d0 65 73 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  es.      */.    
284e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
284f0 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
28500 30 2c 20 61 64 64 72 45 6e 64 29 3b 0a 0a 20 20  0, addrEnd);..  
28510 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
28520 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61  a subroutine tha
28530 74 20 6f 75 74 70 75 74 73 20 61 20 73 69 6e 67  t outputs a sing
28540 6c 65 20 72 6f 77 20 6f 66 20 74 68 65 20 72 65  le row of the re
28550 73 75 6c 74 0a 20 20 20 20 20 20 2a 2a 20 73 65  sult.      ** se
28560 74 2e 20 20 54 68 69 73 20 73 75 62 72 6f 75 74  t.  This subrout
28570 69 6e 65 20 66 69 72 73 74 20 6c 6f 6f 6b 73 20  ine first looks 
28580 61 74 20 74 68 65 20 69 55 73 65 46 6c 61 67 2e  at the iUseFlag.
28590 20 20 49 66 20 69 55 73 65 46 6c 61 67 0a 20 20    If iUseFlag.  
285a0 20 20 20 20 2a 2a 20 69 73 20 6c 65 73 73 20 74      ** is less t
285b0 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
285c0 7a 65 72 6f 2c 20 74 68 65 20 73 75 62 72 6f 75  zero, the subrou
285d0 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
285e0 20 20 49 66 0a 20 20 20 20 20 20 2a 2a 20 74 68    If.      ** th
285f0 65 20 70 72 6f 63 65 73 73 69 6e 67 20 63 61 6c  e processing cal
28600 6c 73 20 66 6f 72 20 74 68 65 20 71 75 65 72 79  ls for the query
28610 20 74 6f 20 61 62 6f 72 74 2c 20 74 68 69 73 20   to abort, this 
28620 73 75 62 72 6f 75 74 69 6e 65 0a 20 20 20 20 20  subroutine.     
28630 20 2a 2a 20 69 6e 63 72 65 6d 65 6e 74 73 20 74   ** increments t
28640 68 65 20 69 41 62 6f 72 74 46 6c 61 67 20 6d 65  he iAbortFlag me
28650 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20 62 65  mory location be
28660 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 69  fore returning i
28670 6e 0a 20 20 20 20 20 20 2a 2a 20 6f 72 64 65 72  n.      ** order
28680 20 74 6f 20 73 69 67 6e 61 6c 20 74 68 65 20 63   to signal the c
28690 61 6c 6c 65 72 20 74 6f 20 61 62 6f 72 74 2e 0a  aller to abort..
286a0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61        */.      a
286b0 64 64 72 53 65 74 41 62 6f 72 74 20 3d 20 73 71  ddrSetAbort = sq
286c0 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
286d0 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73  Addr(v);.      s
286e0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
286f0 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
28700 31 2c 20 69 41 62 6f 72 74 46 6c 61 67 29 3b 0a  1, iAbortFlag);.
28710 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
28720 74 28 28 76 2c 20 22 73 65 74 20 61 62 6f 72 74  t((v, "set abort
28730 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20 20 20   flag"));.      
28740 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
28750 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20  1(v, OP_Return, 
28760 72 65 67 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20  regOutputRow);. 
28770 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
28780 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
28790 61 64 64 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a  addrOutputRow);.
287a0 20 20 20 20 20 20 61 64 64 72 4f 75 74 70 75 74        addrOutput
287b0 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Row = sqlite3Vdb
287c0 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
287d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
287e0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
287f0 66 50 6f 73 2c 20 69 55 73 65 46 6c 61 67 2c 20  fPos, iUseFlag, 
28800 61 64 64 72 4f 75 74 70 75 74 52 6f 77 2b 32 29  addrOutputRow+2)
28810 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
28820 65 6e 74 28 28 76 2c 20 22 47 72 6f 75 70 62 79  ent((v, "Groupby
28830 20 72 65 73 75 6c 74 20 67 65 6e 65 72 61 74 6f   result generato
28840 72 20 65 6e 74 72 79 20 70 6f 69 6e 74 22 29 29  r entry point"))
28850 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
28860 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
28870 52 65 74 75 72 6e 2c 20 72 65 67 4f 75 74 70 75  Return, regOutpu
28880 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 66 69 6e  tRow);.      fin
28890 61 6c 69 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e  alizeAggFunction
288a0 73 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49  s(pParse, &sAggI
288b0 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  nfo);.      sqli
288c0 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
288d0 50 61 72 73 65 2c 20 70 48 61 76 69 6e 67 2c 20  Parse, pHaving, 
288e0 61 64 64 72 4f 75 74 70 75 74 52 6f 77 2b 31 2c  addrOutputRow+1,
288f0 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55   SQLITE_JUMPIFNU
28900 4c 4c 29 3b 0a 20 20 20 20 20 20 73 65 6c 65 63  LL);.      selec
28910 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73  tInnerLoop(pPars
28920 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c  e, p, p->pEList,
28930 20 30 2c 20 30 2c 20 70 4f 72 64 65 72 42 79 2c   0, 0, pOrderBy,
28940 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
28950 20 20 20 20 20 20 20 26 73 44 69 73 74 69 6e 63         &sDistinc
28960 74 2c 20 70 44 65 73 74 2c 0a 20 20 20 20 20 20  t, pDest,.      
28970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28980 61 64 64 72 4f 75 74 70 75 74 52 6f 77 2b 31 2c  addrOutputRow+1,
28990 20 61 64 64 72 53 65 74 41 62 6f 72 74 29 3b 0a   addrSetAbort);.
289a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
289b0 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65  eAddOp1(v, OP_Re
289c0 74 75 72 6e 2c 20 72 65 67 4f 75 74 70 75 74 52  turn, regOutputR
289d0 6f 77 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  ow);.      VdbeC
289e0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6e 64 20  omment((v, "end 
289f0 67 72 6f 75 70 62 79 20 72 65 73 75 6c 74 20 67  groupby result g
28a00 65 6e 65 72 61 74 6f 72 22 29 29 3b 0a 0a 20 20  enerator"));..  
28a10 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
28a20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61  a subroutine tha
28a30 74 20 77 69 6c 6c 20 72 65 73 65 74 20 74 68 65  t will reset the
28a40 20 67 72 6f 75 70 2d 62 79 20 61 63 63 75 6d 75   group-by accumu
28a50 6c 61 74 6f 72 0a 20 20 20 20 20 20 2a 2f 0a 20  lator.      */. 
28a60 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
28a70 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
28a80 61 64 64 72 52 65 73 65 74 29 3b 0a 20 20 20 20  addrReset);.    
28a90 20 20 72 65 73 65 74 41 63 63 75 6d 75 6c 61 74    resetAccumulat
28aa0 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41 67 67  or(pParse, &sAgg
28ab0 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c  Info);.      sql
28ac0 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
28ad0 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67  , OP_Return, reg
28ae0 52 65 73 65 74 29 3b 0a 20 20 20 20 20 0a 20 20  Reset);.     .  
28af0 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20 70 47 72    } /* endif pGr
28b00 6f 75 70 42 79 2e 20 20 42 65 67 69 6e 20 61 67  oupBy.  Begin ag
28b10 67 72 65 67 61 74 65 20 71 75 65 72 69 65 73 20  gregate queries 
28b20 77 69 74 68 6f 75 74 20 47 52 4f 55 50 20 42 59  without GROUP BY
28b30 3a 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 7b 0a  : */.    else {.
28b40 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a        ExprList *
28b50 70 44 65 6c 20 3d 20 30 3b 0a 23 69 66 6e 64 65  pDel = 0;.#ifnde
28b60 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 54  f SQLITE_OMIT_BT
28b70 52 45 45 43 4f 55 4e 54 0a 20 20 20 20 20 20 54  REECOUNT.      T
28b80 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20  able *pTab;.    
28b90 20 20 69 66 28 20 28 70 54 61 62 20 3d 20 69 73    if( (pTab = is
28ba0 53 69 6d 70 6c 65 43 6f 75 6e 74 28 70 2c 20 26  SimpleCount(p, &
28bb0 73 41 67 67 49 6e 66 6f 29 29 21 3d 30 20 29 7b  sAggInfo))!=0 ){
28bc0 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 69  .        /* If i
28bd0 73 53 69 6d 70 6c 65 43 6f 75 6e 74 28 29 20 72  sSimpleCount() r
28be0 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72  eturns a pointer
28bf0 20 74 6f 20 61 20 54 61 62 6c 65 20 73 74 72 75   to a Table stru
28c00 63 74 75 72 65 2c 20 74 68 65 6e 0a 20 20 20 20  cture, then.    
28c10 20 20 20 20 2a 2a 20 74 68 65 20 53 51 4c 20 73      ** the SQL s
28c20 74 61 74 65 6d 65 6e 74 20 69 73 20 6f 66 20 74  tatement is of t
28c30 68 65 20 66 6f 72 6d 3a 0a 20 20 20 20 20 20 20  he form:.       
28c40 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20   **.        **  
28c50 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29   SELECT count(*)
28c60 20 46 52 4f 4d 20 3c 74 62 6c 3e 0a 20 20 20 20   FROM <tbl>.    
28c70 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
28c80 2a 20 77 68 65 72 65 20 74 68 65 20 54 61 62 6c  * where the Tabl
28c90 65 20 73 74 72 75 63 74 75 72 65 20 72 65 74 75  e structure retu
28ca0 72 6e 65 64 20 72 65 70 72 65 73 65 6e 74 73 20  rned represents 
28cb0 74 61 62 6c 65 20 3c 74 62 6c 3e 2e 0a 20 20 20  table <tbl>..   
28cc0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
28cd0 2a 2a 20 54 68 69 73 20 73 74 61 74 65 6d 65 6e  ** This statemen
28ce0 74 20 69 73 20 73 6f 20 63 6f 6d 6d 6f 6e 20 74  t is so common t
28cf0 68 61 74 20 69 74 20 69 73 20 6f 70 74 69 6d 69  hat it is optimi
28d00 7a 65 64 20 73 70 65 63 69 61 6c 6c 79 2e 20 54  zed specially. T
28d10 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 50  he.        ** OP
28d20 5f 43 6f 75 6e 74 20 69 6e 73 74 72 75 63 74 69  _Count instructi
28d30 6f 6e 20 69 73 20 65 78 65 63 75 74 65 64 20 65  on is executed e
28d40 69 74 68 65 72 20 6f 6e 20 74 68 65 20 69 6e 74  ither on the int
28d50 6b 65 79 20 74 61 62 6c 65 20 74 68 61 74 0a 20  key table that. 
28d60 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69         ** contai
28d70 6e 73 20 74 68 65 20 64 61 74 61 20 66 6f 72 20  ns the data for 
28d80 74 61 62 6c 65 20 3c 74 62 6c 3e 20 6f 72 20 6f  table <tbl> or o
28d90 6e 20 6f 6e 65 20 6f 66 20 69 74 73 20 69 6e 64  n one of its ind
28da0 65 78 65 73 2e 20 49 74 0a 20 20 20 20 20 20 20  exes. It.       
28db0 20 2a 2a 20 69 73 20 62 65 74 74 65 72 20 74 6f   ** is better to
28dc0 20 65 78 65 63 75 74 65 20 74 68 65 20 6f 70 20   execute the op 
28dd0 6f 6e 20 61 6e 20 69 6e 64 65 78 2c 20 61 73 20  on an index, as 
28de0 69 6e 64 65 78 65 73 20 61 72 65 20 61 6c 6d 6f  indexes are almo
28df0 73 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c  st.        ** al
28e00 77 61 79 73 20 73 70 72 65 61 64 20 61 63 72 6f  ways spread acro
28e10 73 73 20 6c 65 73 73 20 70 61 67 65 73 20 74 68  ss less pages th
28e20 61 6e 20 74 68 65 69 72 20 63 6f 72 72 65 73 70  an their corresp
28e30 6f 6e 64 69 6e 67 20 74 61 62 6c 65 73 2e 0a 20  onding tables.. 
28e40 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
28e50 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 44 62 20    const int iDb 
28e60 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
28e70 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64  oIndex(pParse->d
28e80 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  b, pTab->pSchema
28e90 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  );.        const
28ea0 20 69 6e 74 20 69 43 73 72 20 3d 20 70 50 61 72   int iCsr = pPar
28eb0 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20 20 20  se->nTab++;     
28ec0 2f 2a 20 43 75 72 73 6f 72 20 74 6f 20 73 63 61  /* Cursor to sca
28ed0 6e 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 20 20  n b-tree */.    
28ee0 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b      Index *pIdx;
28ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28f00 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72           /* Iter
28f10 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f  ator variable */
28f20 0a 20 20 20 20 20 20 20 20 4b 65 79 49 6e 66 6f  .        KeyInfo
28f30 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 30 3b 20   *pKeyInfo = 0; 
28f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28f50 20 4b 65 79 69 6e 66 6f 20 66 6f 72 20 73 63 61   Keyinfo for sca
28f60 6e 6e 65 64 20 69 6e 64 65 78 20 2a 2f 0a 20 20  nned index */.  
28f70 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 42 65        Index *pBe
28f80 73 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  st = 0;         
28f90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65             /* Be
28fa0 73 74 20 69 6e 64 65 78 20 66 6f 75 6e 64 20 73  st index found s
28fb0 6f 20 66 61 72 20 2a 2f 0a 20 20 20 20 20 20 20  o far */.       
28fc0 20 69 6e 74 20 69 52 6f 6f 74 20 3d 20 70 54 61   int iRoot = pTa
28fd0 62 2d 3e 74 6e 75 6d 3b 20 20 20 20 20 20 20 20  b->tnum;        
28fe0 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61        /* Root pa
28ff0 67 65 20 6f 66 20 73 63 61 6e 6e 65 64 20 62 2d  ge of scanned b-
29000 74 72 65 65 20 2a 2f 0a 0a 20 20 20 20 20 20 20  tree */..       
29010 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
29020 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c  fySchema(pParse,
29030 20 69 44 62 29 3b 0a 20 20 20 20 20 20 20 20 73   iDb);.        s
29040 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28  qlite3TableLock(
29050 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61  pParse, iDb, pTa
29060 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62  b->tnum, 0, pTab
29070 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20 20 20 20  ->zName);..     
29080 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72     /* Search for
29090 20 74 68 65 20 69 6e 64 65 78 20 74 68 61 74 20   the index that 
290a0 68 61 73 20 74 68 65 20 6c 6f 77 65 73 74 20 73  has the lowest s
290b0 63 61 6e 20 63 6f 73 74 2e 0a 20 20 20 20 20 20  can cost..      
290c0 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
290d0 28 32 30 31 31 2d 30 34 2d 31 35 29 20 44 6f 20  (2011-04-15) Do 
290e0 6e 6f 74 20 64 6f 20 61 20 66 75 6c 6c 20 73 63  not do a full sc
290f0 61 6e 20 6f 66 20 61 6e 20 75 6e 6f 72 64 65 72  an of an unorder
29100 65 64 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20  ed index..      
29110 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
29120 28 32 30 31 33 2d 31 30 2d 30 33 29 20 44 6f 20  (2013-10-03) Do 
29130 6e 6f 74 20 63 6f 75 6e 74 20 74 68 65 20 65 6e  not count the en
29140 74 69 72 65 73 20 69 6e 20 61 20 70 61 72 74 69  tires in a parti
29150 61 6c 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20  al index..      
29160 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
29170 49 6e 20 70 72 61 63 74 69 63 65 20 74 68 65 20  In practice the 
29180 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
29190 65 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75 73  e will not be us
291a0 65 64 2e 20 49 74 20 69 73 20 6f 6e 6c 79 20 0a  ed. It is only .
291b0 20 20 20 20 20 20 20 20 2a 2a 20 70 61 73 73 65          ** passe
291c0 64 20 74 6f 20 6b 65 65 70 20 4f 50 5f 4f 70 65  d to keep OP_Ope
291d0 6e 52 65 61 64 20 68 61 70 70 79 2e 0a 20 20 20  nRead happy..   
291e0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
291f0 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70  for(pIdx=pTab->p
29200 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64  Index; pIdx; pId
29210 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a  x=pIdx->pNext){.
29220 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49            if( pI
29230 64 78 2d 3e 62 55 6e 6f 72 64 65 72 65 64 3d 3d  dx->bUnordered==
29240 30 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20  0.           && 
29250 70 49 64 78 2d 3e 73 7a 49 64 78 52 6f 77 3c 70  pIdx->szIdxRow<p
29260 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 0a 20 20  Tab->szTabRow.  
29270 20 20 20 20 20 20 20 20 20 26 26 20 70 49 64 78           && pIdx
29280 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72 65 3d  ->pPartIdxWhere=
29290 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 26 26  =0.           &&
292a0 20 28 21 70 42 65 73 74 20 7c 7c 20 70 49 64 78   (!pBest || pIdx
292b0 2d 3e 73 7a 49 64 78 52 6f 77 3c 70 42 65 73 74  ->szIdxRow<pBest
292c0 2d 3e 73 7a 49 64 78 52 6f 77 29 0a 20 20 20 20  ->szIdxRow).    
292d0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
292e0 20 20 20 20 20 70 42 65 73 74 20 3d 20 70 49 64       pBest = pId
292f0 78 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  x;.          }. 
29300 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
29310 20 69 66 28 20 70 42 65 73 74 20 29 7b 0a 20 20   if( pBest ){.  
29320 20 20 20 20 20 20 20 20 69 52 6f 6f 74 20 3d 20          iRoot = 
29330 70 42 65 73 74 2d 3e 74 6e 75 6d 3b 0a 20 20 20  pBest->tnum;.   
29340 20 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 20         pKeyInfo 
29350 3d 20 73 71 6c 69 74 65 33 49 6e 64 65 78 4b 65  = sqlite3IndexKe
29360 79 69 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 42  yinfo(pParse, pB
29370 65 73 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  est);.        }.
29380 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e  .        /* Open
29390 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72   a read-only cur
293a0 73 6f 72 2c 20 65 78 65 63 75 74 65 20 74 68 65  sor, execute the
293b0 20 4f 50 5f 43 6f 75 6e 74 2c 20 63 6c 6f 73 65   OP_Count, close
293c0 20 74 68 65 20 63 75 72 73 6f 72 2e 20 2a 2f 0a   the cursor. */.
293d0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
293e0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
293f0 4f 70 65 6e 52 65 61 64 2c 20 69 43 73 72 2c 20  OpenRead, iCsr, 
29400 69 52 6f 6f 74 2c 20 69 44 62 29 3b 0a 20 20 20  iRoot, iDb);.   
29410 20 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66       if( pKeyInf
29420 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  o ){.          s
29430 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
29440 50 34 28 76 2c 20 2d 31 2c 20 28 63 68 61 72 20  P4(v, -1, (char 
29450 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b  *)pKeyInfo, P4_K
29460 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b  EYINFO_HANDOFF);
29470 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
29480 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
29490 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 75 6e 74  dOp2(v, OP_Count
294a0 2c 20 69 43 73 72 2c 20 73 41 67 67 49 6e 66 6f  , iCsr, sAggInfo
294b0 2e 61 46 75 6e 63 5b 30 5d 2e 69 4d 65 6d 29 3b  .aFunc[0].iMem);
294c0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
294d0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
294e0 5f 43 6c 6f 73 65 2c 20 69 43 73 72 29 3b 0a 20  _Close, iCsr);. 
294f0 20 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 69         explainSi
29500 6d 70 6c 65 43 6f 75 6e 74 28 70 50 61 72 73 65  mpleCount(pParse
29510 2c 20 70 54 61 62 2c 20 70 42 65 73 74 29 3b 0a  , pTab, pBest);.
29520 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64        }else.#end
29530 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
29540 54 5f 42 54 52 45 45 43 4f 55 4e 54 20 2a 2f 0a  T_BTREECOUNT */.
29550 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
29560 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20  /* Check if the 
29570 71 75 65 72 79 20 69 73 20 6f 66 20 6f 6e 65 20  query is of one 
29580 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
29590 20 66 6f 72 6d 73 3a 0a 20 20 20 20 20 20 20 20   forms:.        
295a0 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  **.        **   
295b0 53 45 4c 45 43 54 20 6d 69 6e 28 78 29 20 46 52  SELECT min(x) FR
295c0 4f 4d 20 2e 2e 2e 0a 20 20 20 20 20 20 20 20 2a  OM ....        *
295d0 2a 20 20 20 53 45 4c 45 43 54 20 6d 61 78 28 78  *   SELECT max(x
295e0 29 20 46 52 4f 4d 20 2e 2e 2e 0a 20 20 20 20 20  ) FROM ....     
295f0 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
29600 20 49 66 20 69 74 20 69 73 2c 20 74 68 65 6e 20   If it is, then 
29610 61 73 6b 20 74 68 65 20 63 6f 64 65 20 69 6e 20  ask the code in 
29620 77 68 65 72 65 2e 63 20 74 6f 20 61 74 74 65 6d  where.c to attem
29630 70 74 20 74 6f 20 73 6f 72 74 20 72 65 73 75 6c  pt to sort resul
29640 74 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 73  ts.        ** as
29650 20 69 66 20 74 68 65 72 65 20 77 61 73 20 61 6e   if there was an
29660 20 22 4f 52 44 45 52 20 4f 4e 20 78 22 20 6f 72   "ORDER ON x" or
29670 20 22 4f 52 44 45 52 20 4f 4e 20 78 20 44 45 53   "ORDER ON x DES
29680 43 22 20 63 6c 61 75 73 65 2e 20 0a 20 20 20 20  C" clause. .    
29690 20 20 20 20 2a 2a 20 49 66 20 77 68 65 72 65 2e      ** If where.
296a0 63 20 69 73 20 61 62 6c 65 20 74 6f 20 70 72 6f  c is able to pro
296b0 64 75 63 65 20 72 65 73 75 6c 74 73 20 73 6f 72  duce results sor
296c0 74 65 64 20 69 6e 20 74 68 69 73 20 6f 72 64 65  ted in this orde
296d0 72 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 20 20  r, then.        
296e0 2a 2a 20 61 64 64 20 76 64 62 65 20 63 6f 64 65  ** add vdbe code
296f0 20 74 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f 66   to break out of
29700 20 74 68 65 20 70 72 6f 63 65 73 73 69 6e 67 20   the processing 
29710 6c 6f 6f 70 20 61 66 74 65 72 20 74 68 65 20 0a  loop after the .
29720 20 20 20 20 20 20 20 20 2a 2a 20 66 69 72 73 74          ** first
29730 20 69 74 65 72 61 74 69 6f 6e 20 28 73 69 6e 63   iteration (sinc
29740 65 20 74 68 65 20 66 69 72 73 74 20 69 74 65 72  e the first iter
29750 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 6f 6f  ation of the loo
29760 70 20 69 73 20 0a 20 20 20 20 20 20 20 20 2a 2a  p is .        **
29770 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 6f   guaranteed to o
29780 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 72 6f  perate on the ro
29790 77 20 77 69 74 68 20 74 68 65 20 6d 69 6e 69 6d  w with the minim
297a0 75 6d 20 6f 72 20 6d 61 78 69 6d 75 6d 20 0a 20  um or maximum . 
297b0 20 20 20 20 20 20 20 2a 2a 20 76 61 6c 75 65 20         ** value 
297c0 6f 66 20 78 2c 20 74 68 65 20 6f 6e 6c 79 20 72  of x, the only r
297d0 6f 77 20 72 65 71 75 69 72 65 64 29 2e 0a 20 20  ow required)..  
297e0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
297f0 20 2a 2a 20 41 20 73 70 65 63 69 61 6c 20 66 6c   ** A special fl
29800 61 67 20 6d 75 73 74 20 62 65 20 70 61 73 73 65  ag must be passe
29810 64 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72  d to sqlite3Wher
29820 65 42 65 67 69 6e 28 29 20 74 6f 20 73 6c 69 67  eBegin() to slig
29830 68 74 6c 79 0a 20 20 20 20 20 20 20 20 2a 2a 20  htly.        ** 
29840 6d 6f 64 69 66 79 20 62 65 68 61 76 69 6f 72 20  modify behavior 
29850 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20  as follows:.    
29860 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
29870 2a 20 20 20 2b 20 49 66 20 74 68 65 20 71 75 65  *   + If the que
29880 72 79 20 69 73 20 61 20 22 53 45 4c 45 43 54 20  ry is a "SELECT 
29890 6d 69 6e 28 78 29 22 2c 20 74 68 65 6e 20 74 68  min(x)", then th
298a0 65 20 6c 6f 6f 70 20 63 6f 64 65 64 20 62 79 0a  e loop coded by.
298b0 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 77          **     w
298c0 68 65 72 65 2e 63 20 73 68 6f 75 6c 64 20 6e 6f  here.c should no
298d0 74 20 69 74 65 72 61 74 65 20 6f 76 65 72 20 61  t iterate over a
298e0 6e 79 20 76 61 6c 75 65 73 20 77 69 74 68 20 61  ny values with a
298f0 20 4e 55 4c 4c 20 76 61 6c 75 65 0a 20 20 20 20   NULL value.    
29900 20 20 20 20 2a 2a 20 20 20 20 20 66 6f 72 20 78      **     for x
29910 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
29920 20 20 20 20 20 2a 2a 20 20 20 2b 20 54 68 65 20       **   + The 
29930 6f 70 74 69 6d 69 7a 65 72 20 63 6f 64 65 20 69  optimizer code i
29940 6e 20 77 68 65 72 65 2e 63 20 28 74 68 65 20 74  n where.c (the t
29950 68 69 6e 67 20 74 68 61 74 20 64 65 63 69 64 65  hing that decide
29960 73 20 77 68 69 63 68 0a 20 20 20 20 20 20 20 20  s which.        
29970 2a 2a 20 20 20 20 20 69 6e 64 65 78 20 6f 72 20  **     index or 
29980 69 6e 64 69 63 65 73 20 74 6f 20 75 73 65 29 20  indices to use) 
29990 73 68 6f 75 6c 64 20 70 6c 61 63 65 20 61 20 64  should place a d
299a0 69 66 66 65 72 65 6e 74 20 70 72 69 6f 72 69 74  ifferent priorit
299b0 79 20 6f 6e 20 0a 20 20 20 20 20 20 20 20 2a 2a  y on .        **
299c0 20 20 20 20 20 73 61 74 69 73 66 79 69 6e 67 20       satisfying 
299d0 74 68 65 20 27 4f 52 44 45 52 20 42 59 27 20 63  the 'ORDER BY' c
299e0 6c 61 75 73 65 20 74 68 61 6e 20 69 74 20 64 6f  lause than it do
299f0 65 73 20 69 6e 20 6f 74 68 65 72 20 63 61 73 65  es in other case
29a00 73 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  s..        **   
29a10 20 20 52 65 66 65 72 20 74 6f 20 63 6f 64 65 20    Refer to code 
29a20 61 6e 64 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20  and comments in 
29a30 77 68 65 72 65 2e 63 20 66 6f 72 20 64 65 74 61  where.c for deta
29a40 69 6c 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ils..        */.
29a50 20 20 20 20 20 20 20 20 45 78 70 72 4c 69 73 74          ExprList
29a60 20 2a 70 4d 69 6e 4d 61 78 20 3d 20 30 3b 0a 20   *pMinMax = 0;. 
29a70 20 20 20 20 20 20 20 75 38 20 66 6c 61 67 20 3d         u8 flag =
29a80 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e   WHERE_ORDERBY_N
29a90 4f 52 4d 41 4c 3b 0a 20 20 20 20 20 20 20 20 0a  ORMAL;.        .
29aa0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
29ab0 70 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20 29  p->pGroupBy==0 )
29ac0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
29ad0 28 20 66 6c 61 67 3d 3d 30 20 29 3b 0a 20 20 20  ( flag==0 );.   
29ae0 20 20 20 20 20 69 66 28 20 70 2d 3e 70 48 61 76       if( p->pHav
29af0 69 6e 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ing==0 ){.      
29b00 20 20 20 20 66 6c 61 67 20 3d 20 6d 69 6e 4d 61      flag = minMa
29b10 78 51 75 65 72 79 28 26 73 41 67 67 49 6e 66 6f  xQuery(&sAggInfo
29b20 2c 20 26 70 4d 69 6e 4d 61 78 29 3b 0a 20 20 20  , &pMinMax);.   
29b30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
29b40 73 73 65 72 74 28 20 66 6c 61 67 3d 3d 30 20 7c  ssert( flag==0 |
29b50 7c 20 28 70 4d 69 6e 4d 61 78 21 3d 30 20 26 26  | (pMinMax!=0 &&
29b60 20 70 4d 69 6e 4d 61 78 2d 3e 6e 45 78 70 72 3d   pMinMax->nExpr=
29b70 3d 31 29 20 29 3b 0a 0a 20 20 20 20 20 20 20 20  =1) );..        
29b80 69 66 28 20 66 6c 61 67 20 29 7b 0a 20 20 20 20  if( flag ){.    
29b90 20 20 20 20 20 20 70 4d 69 6e 4d 61 78 20 3d 20        pMinMax = 
29ba0 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
29bb0 75 70 28 64 62 2c 20 70 4d 69 6e 4d 61 78 2c 20  up(db, pMinMax, 
29bc0 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 44  0);.          pD
29bd0 65 6c 20 3d 20 70 4d 69 6e 4d 61 78 3b 0a 20 20  el = pMinMax;.  
29be0 20 20 20 20 20 20 20 20 69 66 28 20 70 4d 69 6e          if( pMin
29bf0 4d 61 78 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c  Max && !db->mall
29c00 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
29c10 20 20 20 20 20 20 20 20 70 4d 69 6e 4d 61 78 2d          pMinMax-
29c20 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72 20  >a[0].sortOrder 
29c30 3d 20 66 6c 61 67 21 3d 57 48 45 52 45 5f 4f 52  = flag!=WHERE_OR
29c40 44 45 52 42 59 5f 4d 49 4e 20 3f 31 3a 30 3b 0a  DERBY_MIN ?1:0;.
29c50 20 20 20 20 20 20 20 20 20 20 20 20 70 4d 69 6e              pMin
29c60 4d 61 78 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d  Max->a[0].pExpr-
29c70 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b  >op = TK_COLUMN;
29c80 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
29c90 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20       }.  .      
29ca0 20 20 2f 2a 20 54 68 69 73 20 63 61 73 65 20 72    /* This case r
29cb0 75 6e 73 20 69 66 20 74 68 65 20 61 67 67 72 65  uns if the aggre
29cc0 67 61 74 65 20 68 61 73 20 6e 6f 20 47 52 4f 55  gate has no GROU
29cd0 50 20 42 59 20 63 6c 61 75 73 65 2e 20 20 54 68  P BY clause.  Th
29ce0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f  e.        ** pro
29cf0 63 65 73 73 69 6e 67 20 69 73 20 6d 75 63 68 20  cessing is much 
29d00 73 69 6d 70 6c 65 72 20 73 69 6e 63 65 20 74 68  simpler since th
29d10 65 72 65 20 69 73 20 6f 6e 6c 79 20 61 20 73 69  ere is only a si
29d20 6e 67 6c 65 20 72 6f 77 0a 20 20 20 20 20 20 20  ngle row.       
29d30 20 2a 2a 20 6f 66 20 6f 75 74 70 75 74 2e 0a 20   ** of output.. 
29d40 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
29d50 20 20 72 65 73 65 74 41 63 63 75 6d 75 6c 61 74    resetAccumulat
29d60 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41 67 67  or(pParse, &sAgg
29d70 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 70  Info);.        p
29d80 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57  WInfo = sqlite3W
29d90 68 65 72 65 42 65 67 69 6e 28 70 50 61 72 73 65  hereBegin(pParse
29da0 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65  , pTabList, pWhe
29db0 72 65 2c 20 70 4d 69 6e 4d 61 78 2c 30 2c 66 6c  re, pMinMax,0,fl
29dc0 61 67 2c 30 29 3b 0a 20 20 20 20 20 20 20 20 69  ag,0);.        i
29dd0 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 7b 0a  f( pWInfo==0 ){.
29de0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
29df0 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
29e00 64 62 2c 20 70 44 65 6c 29 3b 0a 20 20 20 20 20  db, pDel);.     
29e10 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74       goto select
29e20 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _end;.        }.
29e30 20 20 20 20 20 20 20 20 75 70 64 61 74 65 41 63          updateAc
29e40 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65  cumulator(pParse
29e50 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20  , &sAggInfo);.  
29e60 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4d        assert( pM
29e70 69 6e 4d 61 78 3d 3d 30 20 7c 7c 20 70 4d 69 6e  inMax==0 || pMin
29e80 4d 61 78 2d 3e 6e 45 78 70 72 3d 3d 31 20 29 3b  Max->nExpr==1 );
29e90 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
29ea0 69 74 65 33 57 68 65 72 65 49 73 4f 72 64 65 72  ite3WhereIsOrder
29eb0 65 64 28 70 57 49 6e 66 6f 29 20 29 7b 0a 20 20  ed(pWInfo) ){.  
29ec0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
29ed0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
29ee0 47 6f 74 6f 2c 20 30 2c 20 73 71 6c 69 74 65 33  Goto, 0, sqlite3
29ef0 57 68 65 72 65 42 72 65 61 6b 4c 61 62 65 6c 28  WhereBreakLabel(
29f00 70 57 49 6e 66 6f 29 29 3b 0a 20 20 20 20 20 20  pWInfo));.      
29f10 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
29f20 28 76 2c 20 22 25 73 28 29 20 62 79 20 69 6e 64  (v, "%s() by ind
29f30 65 78 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ex",.           
29f40 20 20 20 20 20 28 66 6c 61 67 3d 3d 57 48 45 52       (flag==WHER
29f50 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 3f 22 6d  E_ORDERBY_MIN?"m
29f60 69 6e 22 3a 22 6d 61 78 22 29 29 29 3b 0a 20 20  in":"max")));.  
29f70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
29f80 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
29f90 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20  pWInfo);.       
29fa0 20 66 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63   finalizeAggFunc
29fb0 74 69 6f 6e 73 28 70 50 61 72 73 65 2c 20 26 73  tions(pParse, &s
29fc0 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  AggInfo);.      
29fd0 7d 0a 0a 20 20 20 20 20 20 70 4f 72 64 65 72 42  }..      pOrderB
29fe0 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c  y = 0;.      sql
29ff0 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
2a000 70 50 61 72 73 65 2c 20 70 48 61 76 69 6e 67 2c  pParse, pHaving,
2a010 20 61 64 64 72 45 6e 64 2c 20 53 51 4c 49 54 45   addrEnd, SQLITE
2a020 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20  _JUMPIFNULL);.  
2a030 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c      selectInnerL
2a040 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70  oop(pParse, p, p
2a050 2d 3e 70 45 4c 69 73 74 2c 20 30 2c 20 30 2c 20  ->pEList, 0, 0, 
2a060 30 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20  0, 0, .         
2a070 20 20 20 20 20 20 20 20 20 20 20 20 20 70 44 65               pDe
2a080 73 74 2c 20 61 64 64 72 45 6e 64 2c 20 61 64 64  st, addrEnd, add
2a090 72 45 6e 64 29 3b 0a 20 20 20 20 20 20 73 71 6c  rEnd);.      sql
2a0a0 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
2a0b0 74 65 28 64 62 2c 20 70 44 65 6c 29 3b 0a 20 20  te(db, pDel);.  
2a0c0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
2a0d0 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
2a0e0 76 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20 20 20  v, addrEnd);.   
2a0f0 20 0a 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20 61   .  } /* endif a
2a100 67 67 72 65 67 61 74 65 20 71 75 65 72 79 20 2a  ggregate query *
2a110 2f 0a 0a 20 20 69 66 28 20 73 44 69 73 74 69 6e  /..  if( sDistin
2a120 63 74 2e 65 54 6e 63 74 54 79 70 65 3d 3d 57 48  ct.eTnctType==WH
2a130 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 4f  ERE_DISTINCT_UNO
2a140 52 44 45 52 45 44 20 29 7b 0a 20 20 20 20 65 78  RDERED ){.    ex
2a150 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65 28 70  plainTempTable(p
2a160 50 61 72 73 65 2c 20 22 44 49 53 54 49 4e 43 54  Parse, "DISTINCT
2a170 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  ");.  }..  /* If
2a180 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44   there is an ORD
2a190 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68  ER BY clause, th
2a1a0 65 6e 20 77 65 20 6e 65 65 64 20 74 6f 20 73 6f  en we need to so
2a1b0 72 74 20 74 68 65 20 72 65 73 75 6c 74 73 0a 20  rt the results. 
2a1c0 20 2a 2a 20 61 6e 64 20 73 65 6e 64 20 74 68 65   ** and send the
2a1d0 6d 20 74 6f 20 74 68 65 20 63 61 6c 6c 62 61 63  m to the callbac
2a1e0 6b 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20  k one by one..  
2a1f0 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42  */.  if( pOrderB
2a200 79 20 29 7b 0a 20 20 20 20 65 78 70 6c 61 69 6e  y ){.    explain
2a210 54 65 6d 70 54 61 62 6c 65 28 70 50 61 72 73 65  TempTable(pParse
2a220 2c 20 22 4f 52 44 45 52 20 42 59 22 29 3b 0a 20  , "ORDER BY");. 
2a230 20 20 20 67 65 6e 65 72 61 74 65 53 6f 72 74 54     generateSortT
2a240 61 69 6c 28 70 50 61 72 73 65 2c 20 70 2c 20 76  ail(pParse, p, v
2a250 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c  , pEList->nExpr,
2a260 20 70 44 65 73 74 29 3b 0a 20 20 7d 0a 0a 20 20   pDest);.  }..  
2a270 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20  /* Jump here to 
2a280 73 6b 69 70 20 74 68 69 73 20 71 75 65 72 79 0a  skip this query.
2a290 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64    */.  sqlite3Vd
2a2a0 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
2a2b0 2c 20 69 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20 54  , iEnd);..  /* T
2a2c0 68 65 20 53 45 4c 45 43 54 20 77 61 73 20 73 75  he SELECT was su
2a2d0 63 63 65 73 73 66 75 6c 6c 79 20 63 6f 64 65 64  ccessfully coded
2a2e0 2e 20 20 20 53 65 74 20 74 68 65 20 72 65 74 75  .   Set the retu
2a2f0 72 6e 20 63 6f 64 65 20 74 6f 20 30 0a 20 20 2a  rn code to 0.  *
2a300 2a 20 74 6f 20 69 6e 64 69 63 61 74 65 20 6e 6f  * to indicate no
2a310 20 65 72 72 6f 72 73 2e 0a 20 20 2a 2f 0a 20 20   errors..  */.  
2a320 72 63 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43 6f  rc = 0;..  /* Co
2a330 6e 74 72 6f 6c 20 6a 75 6d 70 73 20 74 6f 20 68  ntrol jumps to h
2a340 65 72 65 20 69 66 20 61 6e 20 65 72 72 6f 72 20  ere if an error 
2a350 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 61  is encountered a
2a360 62 6f 76 65 2c 20 6f 72 20 75 70 6f 6e 0a 20 20  bove, or upon.  
2a370 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 63 6f  ** successful co
2a380 64 69 6e 67 20 6f 66 20 74 68 65 20 53 45 4c 45  ding of the SELE
2a390 43 54 2e 0a 20 20 2a 2f 0a 73 65 6c 65 63 74 5f  CT..  */.select_
2a3a0 65 6e 64 3a 0a 20 20 65 78 70 6c 61 69 6e 53 65  end:.  explainSe
2a3b0 74 49 6e 74 65 67 65 72 28 70 50 61 72 73 65 2d  tInteger(pParse-
2a3c0 3e 69 53 65 6c 65 63 74 49 64 2c 20 69 52 65 73  >iSelectId, iRes
2a3d0 74 6f 72 65 53 65 6c 65 63 74 49 64 29 3b 0a 0a  toreSelectId);..
2a3e0 20 20 2f 2a 20 49 64 65 6e 74 69 66 79 20 63 6f    /* Identify co
2a3f0 6c 75 6d 6e 20 6e 61 6d 65 73 20 69 66 20 72 65  lumn names if re
2a400 73 75 6c 74 73 20 6f 66 20 74 68 65 20 53 45 4c  sults of the SEL
2a410 45 43 54 20 61 72 65 20 74 6f 20 62 65 20 6f 75  ECT are to be ou
2a420 74 70 75 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  tput..  */.  if(
2a430 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
2a440 26 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d  & pDest->eDest==
2a450 53 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20  SRT_Output ){.  
2a460 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e    generateColumn
2a470 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 54  Names(pParse, pT
2a480 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 29 3b  abList, pEList);
2a490 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 44  .  }..  sqlite3D
2a4a0 62 46 72 65 65 28 64 62 2c 20 73 41 67 67 49 6e  bFree(db, sAggIn
2a4b0 66 6f 2e 61 43 6f 6c 29 3b 0a 20 20 73 71 6c 69  fo.aCol);.  sqli
2a4c0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 73 41  te3DbFree(db, sA
2a4d0 67 67 49 6e 66 6f 2e 61 46 75 6e 63 29 3b 0a 20  ggInfo.aFunc);. 
2a4e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
2a4f0 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
2a500 45 5f 45 4e 41 42 4c 45 5f 54 52 45 45 5f 45 58  E_ENABLE_TREE_EX
2a510 50 4c 41 49 4e 29 0a 2f 2a 0a 2a 2a 20 47 65 6e  PLAIN)./*.** Gen
2a520 65 72 61 74 65 20 61 20 68 75 6d 61 6e 2d 72 65  erate a human-re
2a530 61 64 61 62 6c 65 20 64 65 73 63 72 69 70 74 69  adable descripti
2a540 6f 6e 20 6f 66 20 61 20 74 68 65 20 53 65 6c 65  on of a the Sele
2a550 63 74 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74  ct object..*/.st
2a560 61 74 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69  atic void explai
2a570 6e 4f 6e 65 53 65 6c 65 63 74 28 56 64 62 65 20  nOneSelect(Vdbe 
2a580 2a 70 56 64 62 65 2c 20 53 65 6c 65 63 74 20 2a  *pVdbe, Select *
2a590 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  p){.  sqlite3Exp
2a5a0 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65  lainPrintf(pVdbe
2a5b0 2c 20 22 53 45 4c 45 43 54 20 22 29 3b 0a 20 20  , "SELECT ");.  
2a5c0 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  if( p->selFlags 
2a5d0 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53  & (SF_Distinct|S
2a5e0 46 5f 41 67 67 72 65 67 61 74 65 29 20 29 7b 0a  F_Aggregate) ){.
2a5f0 20 20 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c      if( p->selFl
2a600 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63  ags & SF_Distinc
2a610 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  t ){.      sqlit
2a620 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28  e3ExplainPrintf(
2a630 70 56 64 62 65 2c 20 22 44 49 53 54 49 4e 43 54  pVdbe, "DISTINCT
2a640 20 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   ");.    }.    i
2a650 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  f( p->selFlags &
2a660 20 53 46 5f 41 67 67 72 65 67 61 74 65 20 29 7b   SF_Aggregate ){
2a670 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
2a680 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62  plainPrintf(pVdb
2a690 65 2c 20 22 61 67 67 5f 66 6c 61 67 20 22 29 3b  e, "agg_flag ");
2a6a0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
2a6b0 65 33 45 78 70 6c 61 69 6e 4e 4c 28 70 56 64 62  e3ExplainNL(pVdb
2a6c0 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  e);.    sqlite3E
2a6d0 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64  xplainPrintf(pVd
2a6e0 62 65 2c 20 22 20 20 20 22 29 3b 0a 20 20 7d 0a  be, "   ");.  }.
2a6f0 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
2a700 45 78 70 72 4c 69 73 74 28 70 56 64 62 65 2c 20  ExprList(pVdbe, 
2a710 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 73 71  p->pEList);.  sq
2a720 6c 69 74 65 33 45 78 70 6c 61 69 6e 4e 4c 28 70  lite3ExplainNL(p
2a730 56 64 62 65 29 3b 0a 20 20 69 66 28 20 70 2d 3e  Vdbe);.  if( p->
2a740 70 53 72 63 20 26 26 20 70 2d 3e 70 53 72 63 2d  pSrc && p->pSrc-
2a750 3e 6e 53 72 63 20 29 7b 0a 20 20 20 20 69 6e 74  >nSrc ){.    int
2a760 20 69 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   i;.    sqlite3E
2a770 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64  xplainPrintf(pVd
2a780 62 65 2c 20 22 46 52 4f 4d 20 22 29 3b 0a 20 20  be, "FROM ");.  
2a790 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
2a7a0 50 75 73 68 28 70 56 64 62 65 29 3b 0a 20 20 20  Push(pVdbe);.   
2a7b0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 70   for(i=0; i<p->p
2a7c0 53 72 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b  Src->nSrc; i++){
2a7d0 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 53 72  .      struct Sr
2a7e0 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
2a7f0 6d 20 3d 20 26 70 2d 3e 70 53 72 63 2d 3e 61 5b  m = &p->pSrc->a[
2a800 69 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  i];.      sqlite
2a810 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70  3ExplainPrintf(p
2a820 56 64 62 65 2c 20 22 7b 25 64 2c 2a 7d 20 3d 20  Vdbe, "{%d,*} = 
2a830 22 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f  ", pItem->iCurso
2a840 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49  r);.      if( pI
2a850 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a  tem->pSelect ){.
2a860 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
2a870 78 70 6c 61 69 6e 53 65 6c 65 63 74 28 70 56 64  xplainSelect(pVd
2a880 62 65 2c 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65  be, pItem->pSele
2a890 63 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ct);.        if(
2a8a0 20 70 49 74 65 6d 2d 3e 70 54 61 62 20 29 7b 0a   pItem->pTab ){.
2a8b0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2a8c0 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70  3ExplainPrintf(p
2a8d0 56 64 62 65 2c 20 22 20 28 74 61 62 6e 61 6d 65  Vdbe, " (tabname
2a8e0 3d 25 73 29 22 2c 20 70 49 74 65 6d 2d 3e 70 54  =%s)", pItem->pT
2a8f0 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
2a900 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
2a910 65 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 4e 61  e if( pItem->zNa
2a920 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  me ){.        sq
2a930 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e  lite3ExplainPrin
2a940 74 66 28 70 56 64 62 65 2c 20 22 25 73 22 2c 20  tf(pVdbe, "%s", 
2a950 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  pItem->zName);. 
2a960 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
2a970 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 29   pItem->zAlias )
2a980 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
2a990 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70  3ExplainPrintf(p
2a9a0 56 64 62 65 2c 20 22 20 28 41 53 20 25 73 29 22  Vdbe, " (AS %s)"
2a9b0 2c 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29  , pItem->zAlias)
2a9c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2a9d0 69 66 28 20 70 49 74 65 6d 2d 3e 6a 6f 69 6e 74  if( pItem->joint
2a9e0 79 70 65 20 26 20 4a 54 5f 4c 45 46 54 20 29 7b  ype & JT_LEFT ){
2a9f0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2aa00 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56  ExplainPrintf(pV
2aa10 64 62 65 2c 20 22 20 4c 45 46 54 2d 4a 4f 49 4e  dbe, " LEFT-JOIN
2aa20 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ");.      }.    
2aa30 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
2aa40 4e 4c 28 70 56 64 62 65 29 3b 0a 20 20 20 20 7d  NL(pVdbe);.    }
2aa50 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c  .    sqlite3Expl
2aa60 61 69 6e 50 6f 70 28 70 56 64 62 65 29 3b 0a 20  ainPop(pVdbe);. 
2aa70 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 57 68 65   }.  if( p->pWhe
2aa80 72 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  re ){.    sqlite
2aa90 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70  3ExplainPrintf(p
2aaa0 56 64 62 65 2c 20 22 57 48 45 52 45 20 22 29 3b  Vdbe, "WHERE ");
2aab0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c  .    sqlite3Expl
2aac0 61 69 6e 45 78 70 72 28 70 56 64 62 65 2c 20 70  ainExpr(pVdbe, p
2aad0 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20 73  ->pWhere);.    s
2aae0 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 4e 4c 28  qlite3ExplainNL(
2aaf0 70 56 64 62 65 29 3b 0a 20 20 7d 0a 20 20 69 66  pVdbe);.  }.  if
2ab00 28 20 70 2d 3e 70 47 72 6f 75 70 42 79 20 29 7b  ( p->pGroupBy ){
2ab10 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c  .    sqlite3Expl
2ab20 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c  ainPrintf(pVdbe,
2ab30 20 22 47 52 4f 55 50 42 59 20 22 29 3b 0a 20 20   "GROUPBY ");.  
2ab40 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
2ab50 45 78 70 72 4c 69 73 74 28 70 56 64 62 65 2c 20  ExprList(pVdbe, 
2ab60 70 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20  p->pGroupBy);.  
2ab70 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
2ab80 4e 4c 28 70 56 64 62 65 29 3b 0a 20 20 7d 0a 20  NL(pVdbe);.  }. 
2ab90 20 69 66 28 20 70 2d 3e 70 48 61 76 69 6e 67 20   if( p->pHaving 
2aba0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  ){.    sqlite3Ex
2abb0 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62  plainPrintf(pVdb
2abc0 65 2c 20 22 48 41 56 49 4e 47 20 22 29 3b 0a 20  e, "HAVING ");. 
2abd0 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
2abe0 6e 45 78 70 72 28 70 56 64 62 65 2c 20 70 2d 3e  nExpr(pVdbe, p->
2abf0 70 48 61 76 69 6e 67 29 3b 0a 20 20 20 20 73 71  pHaving);.    sq
2ac00 6c 69 74 65 33 45 78 70 6c 61 69 6e 4e 4c 28 70  lite3ExplainNL(p
2ac10 56 64 62 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28  Vdbe);.  }.  if(
2ac20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a   p->pOrderBy ){.
2ac30 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
2ac40 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20  inPrintf(pVdbe, 
2ac50 22 4f 52 44 45 52 42 59 20 22 29 3b 0a 20 20 20  "ORDERBY ");.   
2ac60 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45   sqlite3ExplainE
2ac70 78 70 72 4c 69 73 74 28 70 56 64 62 65 2c 20 70  xprList(pVdbe, p
2ac80 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20  ->pOrderBy);.   
2ac90 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 4e   sqlite3ExplainN
2aca0 4c 28 70 56 64 62 65 29 3b 0a 20 20 7d 0a 20 20  L(pVdbe);.  }.  
2acb0 69 66 28 20 70 2d 3e 70 4c 69 6d 69 74 20 29 7b  if( p->pLimit ){
2acc0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c  .    sqlite3Expl
2acd0 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c  ainPrintf(pVdbe,
2ace0 20 22 4c 49 4d 49 54 20 22 29 3b 0a 20 20 20 20   "LIMIT ");.    
2acf0 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78  sqlite3ExplainEx
2ad00 70 72 28 70 56 64 62 65 2c 20 70 2d 3e 70 4c 69  pr(pVdbe, p->pLi
2ad10 6d 69 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  mit);.    sqlite
2ad20 33 45 78 70 6c 61 69 6e 4e 4c 28 70 56 64 62 65  3ExplainNL(pVdbe
2ad30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  );.  }.  if( p->
2ad40 70 4f 66 66 73 65 74 20 29 7b 0a 20 20 20 20 73  pOffset ){.    s
2ad50 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69  qlite3ExplainPri
2ad60 6e 74 66 28 70 56 64 62 65 2c 20 22 4f 46 46 53  ntf(pVdbe, "OFFS
2ad70 45 54 20 22 29 3b 0a 20 20 20 20 73 71 6c 69 74  ET ");.    sqlit
2ad80 65 33 45 78 70 6c 61 69 6e 45 78 70 72 28 70 56  e3ExplainExpr(pV
2ad90 64 62 65 2c 20 70 2d 3e 70 4f 66 66 73 65 74 29  dbe, p->pOffset)
2ada0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
2adb0 6c 61 69 6e 4e 4c 28 70 56 64 62 65 29 3b 0a 20  lainNL(pVdbe);. 
2adc0 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65   }.}.void sqlite
2add0 33 45 78 70 6c 61 69 6e 53 65 6c 65 63 74 28 56  3ExplainSelect(V
2ade0 64 62 65 20 2a 70 56 64 62 65 2c 20 53 65 6c 65  dbe *pVdbe, Sele
2adf0 63 74 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 3d  ct *p){.  if( p=
2ae00 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
2ae10 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70  3ExplainPrintf(p
2ae20 56 64 62 65 2c 20 22 28 6e 75 6c 6c 2d 73 65 6c  Vdbe, "(null-sel
2ae30 65 63 74 29 22 29 3b 0a 20 20 20 20 72 65 74 75  ect)");.    retu
2ae40 72 6e 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28  rn;.  }.  while(
2ae50 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20   p->pPrior ){.  
2ae60 20 20 70 2d 3e 70 50 72 69 6f 72 2d 3e 70 4e 65    p->pPrior->pNe
2ae70 78 74 20 3d 20 70 3b 0a 20 20 20 20 70 20 3d 20  xt = p;.    p = 
2ae80 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 7d 0a 20  p->pPrior;.  }. 
2ae90 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
2aea0 75 73 68 28 70 56 64 62 65 29 3b 0a 20 20 77 68  ush(pVdbe);.  wh
2aeb0 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 65 78  ile( p ){.    ex
2aec0 70 6c 61 69 6e 4f 6e 65 53 65 6c 65 63 74 28 70  plainOneSelect(p
2aed0 56 64 62 65 2c 20 70 29 3b 0a 20 20 20 20 70 20  Vdbe, p);.    p 
2aee0 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  = p->pNext;.    
2aef0 69 66 28 20 70 3d 3d 30 20 29 20 62 72 65 61 6b  if( p==0 ) break
2af00 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
2af10 6c 61 69 6e 4e 4c 28 70 56 64 62 65 29 3b 0a 20  lainNL(pVdbe);. 
2af20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
2af30 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22  nPrintf(pVdbe, "
2af40 25 73 5c 6e 22 2c 20 73 65 6c 65 63 74 4f 70 4e  %s\n", selectOpN
2af50 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 7d  ame(p->op));.  }
2af60 0a 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69  .  sqlite3Explai
2af70 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22  nPrintf(pVdbe, "
2af80 45 4e 44 22 29 3b 0a 20 20 73 71 6c 69 74 65 33  END");.  sqlite3
2af90 45 78 70 6c 61 69 6e 50 6f 70 28 70 56 64 62 65  ExplainPop(pVdbe
2afa0 29 3b 0a 7d 0a 0a 2f 2a 20 45 6e 64 20 6f 66 20  );.}../* End of 
2afb0 74 68 65 20 73 74 72 75 63 74 75 72 65 20 64 65  the structure de
2afc0 62 75 67 20 70 72 69 6e 74 69 6e 67 20 63 6f 64  bug printing cod
2afd0 65 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  e.**************
2afe0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2aff0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b000 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b010 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
2b020 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e  .#endif /* defin
2b030 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
2b040 5f 54 52 45 45 5f 45 58 50 4c 41 49 4e 29 20 2a  _TREE_EXPLAIN) *
2b050 2f 0a                                            /.