/ Hex Artifact Content
Login

Artifact 01540bcd3df3c8f1187158e77986028b1c667258:


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 65 64 69 6e 67 20 74 68  rs preceeding th
0cb0: 65 20 4a 4f 49 4e 20 6b 65 79 77 6f 72 64 2c 20  e JOIN keyword, 
0cc0: 64 65 74 65 72 6d 69 6e 65 20 74 68 65 0a 2a 2a  determine the.**
0cd0: 20 74 79 70 65 20 6f 66 20 6a 6f 69 6e 2e 20 20   type of join.  
0ce0: 52 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65  Return an intege
0cf0: 72 20 63 6f 6e 73 74 61 6e 74 20 74 68 61 74 20  r constant that 
0d00: 65 78 70 72 65 73 73 65 73 20 74 68 61 74 20 74  expresses that t
0d10: 79 70 65 0a 2a 2a 20 69 6e 20 74 65 72 6d 73 20  ype.** in terms 
0d20: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
0d30: 20 62 69 74 20 76 61 6c 75 65 73 3a 0a 2a 2a 0a   bit values:.**.
0d40: 2a 2a 20 20 20 20 20 4a 54 5f 49 4e 4e 45 52 0a  **     JT_INNER.
0d50: 2a 2a 20 20 20 20 20 4a 54 5f 43 52 4f 53 53 0a  **     JT_CROSS.
0d60: 2a 2a 20 20 20 20 20 4a 54 5f 4f 55 54 45 52 0a  **     JT_OUTER.
0d70: 2a 2a 20 20 20 20 20 4a 54 5f 4e 41 54 55 52 41  **     JT_NATURA
0d80: 4c 0a 2a 2a 20 20 20 20 20 4a 54 5f 4c 45 46 54  L.**     JT_LEFT
0d90: 0a 2a 2a 20 20 20 20 20 4a 54 5f 52 49 47 48 54  .**     JT_RIGHT
0da0: 0a 2a 2a 0a 2a 2a 20 41 20 66 75 6c 6c 20 6f 75  .**.** A full ou
0db0: 74 65 72 20 6a 6f 69 6e 20 69 73 20 74 68 65 20  ter join is the 
0dc0: 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20 4a  combination of J
0dd0: 54 5f 4c 45 46 54 20 61 6e 64 20 4a 54 5f 52 49  T_LEFT and JT_RI
0de0: 47 48 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  GHT..**.** If an
0df0: 20 69 6c 6c 65 67 61 6c 20 6f 72 20 75 6e 73 75   illegal or unsu
0e00: 70 70 6f 72 74 65 64 20 6a 6f 69 6e 20 74 79 70  pported join typ
0e10: 65 20 69 73 20 73 65 65 6e 2c 20 74 68 65 6e 20  e is seen, then 
0e20: 73 74 69 6c 6c 20 72 65 74 75 72 6e 0a 2a 2a 20  still return.** 
0e30: 61 20 6a 6f 69 6e 20 74 79 70 65 2c 20 62 75 74  a join type, but
0e40: 20 70 75 74 20 61 6e 20 65 72 72 6f 72 20 69 6e   put an error in
0e50: 20 74 68 65 20 70 50 61 72 73 65 20 73 74 72 75   the pParse stru
0e60: 63 74 75 72 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  cture..*/.int sq
0e70: 6c 69 74 65 33 4a 6f 69 6e 54 79 70 65 28 50 61  lite3JoinType(Pa
0e80: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b  rse *pParse, Tok
0e90: 65 6e 20 2a 70 41 2c 20 54 6f 6b 65 6e 20 2a 70  en *pA, Token *p
0ea0: 42 2c 20 54 6f 6b 65 6e 20 2a 70 43 29 7b 0a 20  B, Token *pC){. 
0eb0: 20 69 6e 74 20 6a 6f 69 6e 74 79 70 65 20 3d 20   int jointype = 
0ec0: 30 3b 0a 20 20 54 6f 6b 65 6e 20 2a 61 70 41 6c  0;.  Token *apAl
0ed0: 6c 5b 33 5d 3b 0a 20 20 54 6f 6b 65 6e 20 2a 70  l[3];.  Token *p
0ee0: 3b 0a 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 20 2f                 /
0f00: 2a 20 20 20 30 31 32 33 34 35 36 37 38 39 20 31  *   0123456789 1
0f10: 32 33 34 35 36 37 38 39 20 31 32 33 34 35 36 37  23456789 1234567
0f20: 38 39 20 31 32 33 20 2a 2f 0a 20 20 73 74 61 74  89 123 */.  stat
0f30: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 4b  ic const char zK
0f40: 65 79 54 65 78 74 5b 5d 20 3d 20 22 6e 61 74 75  eyText[] = "natu
0f50: 72 61 6c 65 66 74 6f 75 74 65 72 69 67 68 74 66  raleftouterightf
0f60: 75 6c 6c 69 6e 6e 65 72 63 72 6f 73 73 22 3b 0a  ullinnercross";.
0f70: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73    static const s
0f80: 74 72 75 63 74 20 7b 0a 20 20 20 20 75 38 20 69  truct {.    u8 i
0f90: 3b 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69  ;        /* Begi
0fa0: 6e 6e 69 6e 67 20 6f 66 20 6b 65 79 77 6f 72 64  nning of keyword
0fb0: 20 74 65 78 74 20 69 6e 20 7a 4b 65 79 54 65 78   text in zKeyTex
0fc0: 74 5b 5d 20 2a 2f 0a 20 20 20 20 75 38 20 6e 43  t[] */.    u8 nC
0fd0: 68 61 72 3b 20 20 20 20 2f 2a 20 4c 65 6e 67 74  har;    /* Lengt
0fe0: 68 20 6f 66 20 74 68 65 20 6b 65 79 77 6f 72 64  h of the keyword
0ff0: 20 69 6e 20 63 68 61 72 61 63 74 65 72 73 20 2a   in characters *
1000: 2f 0a 20 20 20 20 75 38 20 63 6f 64 65 3b 20 20  /.    u8 code;  
1010: 20 20 20 2f 2a 20 4a 6f 69 6e 20 74 79 70 65 20     /* Join type 
1020: 6d 61 73 6b 20 2a 2f 0a 20 20 7d 20 61 4b 65 79  mask */.  } aKey
1030: 77 6f 72 64 5b 5d 20 3d 20 7b 0a 20 20 20 20 2f  word[] = {.    /
1040: 2a 20 6e 61 74 75 72 61 6c 20 2a 2f 20 7b 20 30  * natural */ { 0
1050: 2c 20 20 37 2c 20 4a 54 5f 4e 41 54 55 52 41 4c  ,  7, JT_NATURAL
1060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1070: 7d 2c 0a 20 20 20 20 2f 2a 20 6c 65 66 74 20 20  },.    /* left  
1080: 20 20 2a 2f 20 7b 20 36 2c 20 20 34 2c 20 4a 54    */ { 6,  4, JT
1090: 5f 4c 45 46 54 7c 4a 54 5f 4f 55 54 45 52 20 20  _LEFT|JT_OUTER  
10a0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f          },.    /
10b0: 2a 20 6f 75 74 65 72 20 20 20 2a 2f 20 7b 20 31  * outer   */ { 1
10c0: 30 2c 20 35 2c 20 4a 54 5f 4f 55 54 45 52 20 20  0, 5, JT_OUTER  
10d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e0: 7d 2c 0a 20 20 20 20 2f 2a 20 72 69 67 68 74 20  },.    /* right 
10f0: 20 20 2a 2f 20 7b 20 31 34 2c 20 35 2c 20 4a 54    */ { 14, 5, JT
1100: 5f 52 49 47 48 54 7c 4a 54 5f 4f 55 54 45 52 20  _RIGHT|JT_OUTER 
1110: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f          },.    /
1120: 2a 20 66 75 6c 6c 20 20 20 20 2a 2f 20 7b 20 31  * full    */ { 1
1130: 39 2c 20 34 2c 20 4a 54 5f 4c 45 46 54 7c 4a 54  9, 4, JT_LEFT|JT
1140: 5f 52 49 47 48 54 7c 4a 54 5f 4f 55 54 45 52 20  _RIGHT|JT_OUTER 
1150: 7d 2c 0a 20 20 20 20 2f 2a 20 69 6e 6e 65 72 20  },.    /* inner 
1160: 20 20 2a 2f 20 7b 20 32 33 2c 20 35 2c 20 4a 54    */ { 23, 5, JT
1170: 5f 49 4e 4e 45 52 20 20 20 20 20 20 20 20 20 20  _INNER          
1180: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f          },.    /
1190: 2a 20 63 72 6f 73 73 20 20 20 2a 2f 20 7b 20 32  * cross   */ { 2
11a0: 38 2c 20 35 2c 20 4a 54 5f 49 4e 4e 45 52 7c 4a  8, 5, JT_INNER|J
11b0: 54 5f 43 52 4f 53 53 20 20 20 20 20 20 20 20 20  T_CROSS         
11c0: 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 2c  },.  };.  int i,
11d0: 20 6a 3b 0a 20 20 61 70 41 6c 6c 5b 30 5d 20 3d   j;.  apAll[0] =
11e0: 20 70 41 3b 0a 20 20 61 70 41 6c 6c 5b 31 5d 20   pA;.  apAll[1] 
11f0: 3d 20 70 42 3b 0a 20 20 61 70 41 6c 6c 5b 32 5d  = pB;.  apAll[2]
1200: 20 3d 20 70 43 3b 0a 20 20 66 6f 72 28 69 3d 30   = pC;.  for(i=0
1210: 3b 20 69 3c 33 20 26 26 20 61 70 41 6c 6c 5b 69  ; i<3 && apAll[i
1220: 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d  ]; i++){.    p =
1230: 20 61 70 41 6c 6c 5b 69 5d 3b 0a 20 20 20 20 66   apAll[i];.    f
1240: 6f 72 28 6a 3d 30 3b 20 6a 3c 41 72 72 61 79 53  or(j=0; j<ArrayS
1250: 69 7a 65 28 61 4b 65 79 77 6f 72 64 29 3b 20 6a  ize(aKeyword); j
1260: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ++){.      if( p
1270: 2d 3e 6e 3d 3d 61 4b 65 79 77 6f 72 64 5b 6a 5d  ->n==aKeyword[j]
1280: 2e 6e 43 68 61 72 20 0a 20 20 20 20 20 20 20 20  .nChar .        
1290: 20 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 4e    && sqlite3StrN
12a0: 49 43 6d 70 28 28 63 68 61 72 2a 29 70 2d 3e 7a  ICmp((char*)p->z
12b0: 2c 20 26 7a 4b 65 79 54 65 78 74 5b 61 4b 65 79  , &zKeyText[aKey
12c0: 77 6f 72 64 5b 6a 5d 2e 69 5d 2c 20 70 2d 3e 6e  word[j].i], p->n
12d0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
12e0: 6a 6f 69 6e 74 79 70 65 20 7c 3d 20 61 4b 65 79  jointype |= aKey
12f0: 77 6f 72 64 5b 6a 5d 2e 63 6f 64 65 3b 0a 20 20  word[j].code;.  
1300: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1310: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 74     }.    }.    t
1320: 65 73 74 63 61 73 65 28 20 6a 3d 3d 30 20 7c 7c  estcase( j==0 ||
1330: 20 6a 3d 3d 31 20 7c 7c 20 6a 3d 3d 32 20 7c 7c   j==1 || j==2 ||
1340: 20 6a 3d 3d 33 20 7c 7c 20 6a 3d 3d 34 20 7c 7c   j==3 || j==4 ||
1350: 20 6a 3d 3d 35 20 7c 7c 20 6a 3d 3d 36 20 29 3b   j==5 || j==6 );
1360: 0a 20 20 20 20 69 66 28 20 6a 3e 3d 41 72 72 61  .    if( j>=Arra
1370: 79 53 69 7a 65 28 61 4b 65 79 77 6f 72 64 29 20  ySize(aKeyword) 
1380: 29 7b 0a 20 20 20 20 20 20 6a 6f 69 6e 74 79 70  ){.      jointyp
1390: 65 20 7c 3d 20 4a 54 5f 45 52 52 4f 52 3b 0a 20  e |= JT_ERROR;. 
13a0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
13b0: 7d 0a 20 20 7d 0a 20 20 69 66 28 0a 20 20 20 20  }.  }.  if(.    
13c0: 20 28 6a 6f 69 6e 74 79 70 65 20 26 20 28 4a 54   (jointype & (JT
13d0: 5f 49 4e 4e 45 52 7c 4a 54 5f 4f 55 54 45 52 29  _INNER|JT_OUTER)
13e0: 29 3d 3d 28 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f  )==(JT_INNER|JT_
13f0: 4f 55 54 45 52 29 20 7c 7c 0a 20 20 20 20 20 28  OUTER) ||.     (
1400: 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 45 52  jointype & JT_ER
1410: 52 4f 52 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20  ROR)!=0.  ){.   
1420: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 70   const char *zSp
1430: 20 3d 20 22 20 22 3b 0a 20 20 20 20 61 73 73 65   = " ";.    asse
1440: 72 74 28 20 70 42 21 3d 30 20 29 3b 0a 20 20 20  rt( pB!=0 );.   
1450: 20 69 66 28 20 70 43 3d 3d 30 20 29 7b 20 7a 53   if( pC==0 ){ zS
1460: 70 2b 2b 3b 20 7d 0a 20 20 20 20 73 71 6c 69 74  p++; }.    sqlit
1470: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
1480: 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6f 72 20 75  e, "unknown or u
1490: 6e 73 75 70 70 6f 72 74 65 64 20 6a 6f 69 6e 20  nsupported join 
14a0: 74 79 70 65 3a 20 22 0a 20 20 20 20 20 20 20 22  type: ".       "
14b0: 25 54 20 25 54 25 73 25 54 22 2c 20 70 41 2c 20  %T %T%s%T", pA, 
14c0: 70 42 2c 20 7a 53 70 2c 20 70 43 29 3b 0a 20 20  pB, zSp, pC);.  
14d0: 20 20 6a 6f 69 6e 74 79 70 65 20 3d 20 4a 54 5f    jointype = JT_
14e0: 49 4e 4e 45 52 3b 0a 20 20 7d 65 6c 73 65 20 69  INNER;.  }else i
14f0: 66 28 20 28 6a 6f 69 6e 74 79 70 65 20 26 20 4a  f( (jointype & J
1500: 54 5f 4f 55 54 45 52 29 21 3d 30 20 0a 20 20 20  T_OUTER)!=0 .   
1510: 20 20 20 20 20 20 26 26 20 28 6a 6f 69 6e 74 79        && (jointy
1520: 70 65 20 26 20 28 4a 54 5f 4c 45 46 54 7c 4a 54  pe & (JT_LEFT|JT
1530: 5f 52 49 47 48 54 29 29 21 3d 4a 54 5f 4c 45 46  _RIGHT))!=JT_LEF
1540: 54 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  T ){.    sqlite3
1550: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
1560: 20 0a 20 20 20 20 20 20 22 52 49 47 48 54 20 61   .      "RIGHT a
1570: 6e 64 20 46 55 4c 4c 20 4f 55 54 45 52 20 4a 4f  nd FULL OUTER JO
1580: 49 4e 73 20 61 72 65 20 6e 6f 74 20 63 75 72 72  INs are not curr
1590: 65 6e 74 6c 79 20 73 75 70 70 6f 72 74 65 64 22  ently supported"
15a0: 29 3b 0a 20 20 20 20 6a 6f 69 6e 74 79 70 65 20  );.    jointype 
15b0: 3d 20 4a 54 5f 49 4e 4e 45 52 3b 0a 20 20 7d 0a  = JT_INNER;.  }.
15c0: 20 20 72 65 74 75 72 6e 20 6a 6f 69 6e 74 79 70    return jointyp
15d0: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  e;.}../*.** Retu
15e0: 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  rn the index of 
15f0: 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 20 74 61  a column in a ta
1600: 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 2d 31 20  ble.  Return -1 
1610: 69 66 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 2a 2a  if the column.**
1620: 20 69 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65   is not containe
1630: 64 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a  d in the table..
1640: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f  */.static int co
1650: 6c 75 6d 6e 49 6e 64 65 78 28 54 61 62 6c 65 20  lumnIndex(Table 
1660: 2a 70 54 61 62 2c 20 63 6f 6e 73 74 20 63 68 61  *pTab, const cha
1670: 72 20 2a 7a 43 6f 6c 29 7b 0a 20 20 69 6e 74 20  r *zCol){.  int 
1680: 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
1690: 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29  pTab->nCol; i++)
16a0: 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
16b0: 33 53 74 72 49 43 6d 70 28 70 54 61 62 2d 3e 61  3StrICmp(pTab->a
16c0: 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 43  Col[i].zName, zC
16d0: 6f 6c 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ol)==0 ) return 
16e0: 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  i;.  }.  return 
16f0: 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61  -1;.}../*.** Sea
1700: 72 63 68 20 74 68 65 20 66 69 72 73 74 20 4e 20  rch the first N 
1710: 74 61 62 6c 65 73 20 69 6e 20 70 53 72 63 2c 20  tables in pSrc, 
1720: 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67  from left to rig
1730: 68 74 2c 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20  ht, looking for 
1740: 61 0a 2a 2a 20 74 61 62 6c 65 20 74 68 61 74 20  a.** table that 
1750: 68 61 73 20 61 20 63 6f 6c 75 6d 6e 20 6e 61 6d  has a column nam
1760: 65 64 20 7a 43 6f 6c 2e 20 20 0a 2a 2a 0a 2a 2a  ed zCol.  .**.**
1770: 20 57 68 65 6e 20 66 6f 75 6e 64 2c 20 73 65 74   When found, set
1780: 20 2a 70 69 54 61 62 20 61 6e 64 20 2a 70 69 43   *piTab and *piC
1790: 6f 6c 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  ol to the table 
17a0: 69 6e 64 65 78 20 61 6e 64 20 63 6f 6c 75 6d 6e  index and column
17b0: 20 69 6e 64 65 78 0a 2a 2a 20 6f 66 20 74 68 65   index.** of the
17c0: 20 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e   matching column
17d0: 20 61 6e 64 20 72 65 74 75 72 6e 20 54 52 55 45   and return TRUE
17e0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 74 20 66  ..**.** If not f
17f0: 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20 46 41 4c  ound, return FAL
1800: 53 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  SE..*/.static in
1810: 74 20 74 61 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e  t tableAndColumn
1820: 49 6e 64 65 78 28 0a 20 20 53 72 63 4c 69 73 74  Index(.  SrcList
1830: 20 2a 70 53 72 63 2c 20 20 20 20 20 20 20 2f 2a   *pSrc,       /*
1840: 20 41 72 72 61 79 20 6f 66 20 74 61 62 6c 65 73   Array of tables
1850: 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20   to search */.  
1860: 69 6e 74 20 4e 2c 20 20 20 20 20 20 20 20 20 20  int N,          
1870: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1880: 66 20 74 61 62 6c 65 73 20 69 6e 20 70 53 72 63  f tables in pSrc
1890: 2d 3e 61 5b 5d 20 74 6f 20 73 65 61 72 63 68 20  ->a[] to search 
18a0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
18b0: 2a 7a 43 6f 6c 2c 20 20 20 20 2f 2a 20 4e 61 6d  *zCol,    /* Nam
18c0: 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  e of the column 
18d0: 77 65 20 61 72 65 20 6c 6f 6f 6b 69 6e 67 20 66  we are looking f
18e0: 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 54  or */.  int *piT
18f0: 61 62 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ab,          /* 
1900: 57 72 69 74 65 20 69 6e 64 65 78 20 6f 66 20 70  Write index of p
1910: 53 72 63 2d 3e 61 5b 5d 20 68 65 72 65 20 2a 2f  Src->a[] here */
1920: 0a 20 20 69 6e 74 20 2a 70 69 43 6f 6c 20 20 20  .  int *piCol   
1930: 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
1940: 20 69 6e 64 65 78 20 6f 66 20 70 53 72 63 2d 3e   index of pSrc->
1950: 61 5b 2a 70 69 54 61 62 5d 2e 70 54 61 62 2d 3e  a[*piTab].pTab->
1960: 61 43 6f 6c 5b 5d 20 68 65 72 65 20 2a 2f 0a 29  aCol[] here */.)
1970: 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  {.  int i;      
1980: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20           /* For 
1990: 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 74 61 62  looping over tab
19a0: 6c 65 73 20 69 6e 20 70 53 72 63 20 2a 2f 0a 20  les in pSrc */. 
19b0: 20 69 6e 74 20 69 43 6f 6c 3b 20 20 20 20 20 20   int iCol;      
19c0: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
19d0: 66 20 63 6f 6c 75 6d 6e 20 6d 61 74 63 68 69 6e  f column matchin
19e0: 67 20 7a 43 6f 6c 20 2a 2f 0a 0a 20 20 61 73 73  g zCol */..  ass
19f0: 65 72 74 28 20 28 70 69 54 61 62 3d 3d 30 29 3d  ert( (piTab==0)=
1a00: 3d 28 70 69 43 6f 6c 3d 3d 30 29 20 29 3b 20 20  =(piCol==0) );  
1a10: 2f 2a 20 42 6f 74 68 20 6f 72 20 6e 65 69 74 68  /* Both or neith
1a20: 65 72 20 61 72 65 20 4e 55 4c 4c 20 2a 2f 0a 20  er are NULL */. 
1a30: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4e 3b 20 69   for(i=0; i<N; i
1a40: 2b 2b 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20  ++){.    iCol = 
1a50: 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 53 72 63  columnIndex(pSrc
1a60: 2d 3e 61 5b 69 5d 2e 70 54 61 62 2c 20 7a 43 6f  ->a[i].pTab, zCo
1a70: 6c 29 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6c  l);.    if( iCol
1a80: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  >=0 ){.      if(
1a90: 20 70 69 54 61 62 20 29 7b 0a 20 20 20 20 20 20   piTab ){.      
1aa0: 20 20 2a 70 69 54 61 62 20 3d 20 69 3b 0a 20 20    *piTab = i;.  
1ab0: 20 20 20 20 20 20 2a 70 69 43 6f 6c 20 3d 20 69        *piCol = i
1ac0: 43 6f 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Col;.      }.   
1ad0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
1ae0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1af0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  0;.}../*.** This
1b00: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
1b10: 64 20 74 6f 20 61 64 64 20 74 65 72 6d 73 20 69  d to add terms i
1b20: 6d 70 6c 69 65 64 20 62 79 20 4a 4f 49 4e 20 73  mplied by JOIN s
1b30: 79 6e 74 61 78 20 74 6f 20 74 68 65 0a 2a 2a 20  yntax to the.** 
1b40: 57 48 45 52 45 20 63 6c 61 75 73 65 20 65 78 70  WHERE clause exp
1b50: 72 65 73 73 69 6f 6e 20 6f 66 20 61 20 53 45 4c  ression of a SEL
1b60: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 54  ECT statement. T
1b70: 68 65 20 6e 65 77 20 74 65 72 6d 2c 20 77 68 69  he new term, whi
1b80: 63 68 0a 2a 2a 20 69 73 20 41 4e 44 65 64 20 77  ch.** is ANDed w
1b90: 69 74 68 20 74 68 65 20 65 78 69 73 74 69 6e 67  ith the existing
1ba0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 2c 20 69   WHERE clause, i
1bb0: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a  s of the form:.*
1bc0: 2a 0a 2a 2a 20 20 20 20 28 74 61 62 31 2e 63 6f  *.**    (tab1.co
1bd0: 6c 31 20 3d 20 74 61 62 32 2e 63 6f 6c 32 29 0a  l1 = tab2.col2).
1be0: 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 74 61 62 31  **.** where tab1
1bf0: 20 69 73 20 74 68 65 20 69 53 72 63 27 74 68 20   is the iSrc'th 
1c00: 74 61 62 6c 65 20 69 6e 20 53 72 63 4c 69 73 74  table in SrcList
1c10: 20 70 53 72 63 20 61 6e 64 20 74 61 62 32 20 69   pSrc and tab2 i
1c20: 73 20 74 68 65 20 0a 2a 2a 20 28 69 53 72 63 2b  s the .** (iSrc+
1c30: 31 29 27 74 68 2e 20 43 6f 6c 75 6d 6e 20 63 6f  1)'th. Column co
1c40: 6c 31 20 69 73 20 63 6f 6c 75 6d 6e 20 69 43 6f  l1 is column iCo
1c50: 6c 4c 65 66 74 20 6f 66 20 74 61 62 31 2c 20 61  lLeft of tab1, a
1c60: 6e 64 20 63 6f 6c 32 20 69 73 0a 2a 2a 20 63 6f  nd col2 is.** co
1c70: 6c 75 6d 6e 20 69 43 6f 6c 52 69 67 68 74 20 6f  lumn iColRight o
1c80: 66 20 74 61 62 32 2e 0a 2a 2f 0a 73 74 61 74 69  f tab2..*/.stati
1c90: 63 20 76 6f 69 64 20 61 64 64 57 68 65 72 65 54  c void addWhereT
1ca0: 65 72 6d 28 0a 20 20 50 61 72 73 65 20 2a 70 50  erm(.  Parse *pP
1cb0: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  arse,           
1cc0: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
1cd0: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  g context */.  S
1ce0: 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20  rcList *pSrc,   
1cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1d00: 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73  * List of tables
1d10: 20 69 6e 20 46 52 4f 4d 20 63 6c 61 75 73 65 20   in FROM clause 
1d20: 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 66 74 2c 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 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
1d50: 20 66 69 72 73 74 20 74 61 62 6c 65 20 74 6f 20   first table to 
1d60: 6a 6f 69 6e 20 69 6e 20 70 53 72 63 20 2a 2f 0a  join in pSrc */.
1d70: 20 20 69 6e 74 20 69 43 6f 6c 4c 65 66 74 2c 20    int iColLeft, 
1d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d90: 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f    /* Index of co
1da0: 6c 75 6d 6e 20 69 6e 20 66 69 72 73 74 20 74 61  lumn in first ta
1db0: 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 69  ble */.  int iRi
1dc0: 67 68 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  ght,            
1dd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
1de0: 78 20 6f 66 20 73 65 63 6f 6e 64 20 74 61 62 6c  x of second tabl
1df0: 65 20 69 6e 20 70 53 72 63 20 2a 2f 0a 20 20 69  e in pSrc */.  i
1e00: 6e 74 20 69 43 6f 6c 52 69 67 68 74 2c 20 20 20  nt iColRight,   
1e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1e20: 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d  * Index of colum
1e30: 6e 20 69 6e 20 73 65 63 6f 6e 64 20 74 61 62 6c  n in second tabl
1e40: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4f 75 74  e */.  int isOut
1e50: 65 72 4a 6f 69 6e 2c 20 20 20 20 20 20 20 20 20  erJoin,         
1e60: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
1e70: 66 20 74 68 69 73 20 69 73 20 61 6e 20 4f 55 54  f this is an OUT
1e80: 45 52 20 6a 6f 69 6e 20 2a 2f 0a 20 20 45 78 70  ER join */.  Exp
1e90: 72 20 2a 2a 70 70 57 68 65 72 65 20 20 20 20 20  r **ppWhere     
1ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1eb0: 49 4e 2f 4f 55 54 3a 20 54 68 65 20 57 48 45 52  IN/OUT: The WHER
1ec0: 45 20 63 6c 61 75 73 65 20 74 6f 20 61 64 64 20  E clause to add 
1ed0: 74 6f 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  to */.){.  sqlit
1ee0: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
1ef0: 3e 64 62 3b 0a 20 20 45 78 70 72 20 2a 70 45 31  >db;.  Expr *pE1
1f00: 3b 0a 20 20 45 78 70 72 20 2a 70 45 32 3b 0a 20  ;.  Expr *pE2;. 
1f10: 20 45 78 70 72 20 2a 70 45 71 3b 0a 0a 20 20 61   Expr *pEq;..  a
1f20: 73 73 65 72 74 28 20 69 4c 65 66 74 3c 69 52 69  ssert( iLeft<iRi
1f30: 67 68 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ght );.  assert(
1f40: 20 70 53 72 63 2d 3e 6e 53 72 63 3e 69 52 69 67   pSrc->nSrc>iRig
1f50: 68 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ht );.  assert( 
1f60: 70 53 72 63 2d 3e 61 5b 69 4c 65 66 74 5d 2e 70  pSrc->a[iLeft].p
1f70: 54 61 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28  Tab );.  assert(
1f80: 20 70 53 72 63 2d 3e 61 5b 69 52 69 67 68 74 5d   pSrc->a[iRight]
1f90: 2e 70 54 61 62 20 29 3b 0a 0a 20 20 70 45 31 20  .pTab );..  pE1 
1fa0: 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 43  = sqlite3CreateC
1fb0: 6f 6c 75 6d 6e 45 78 70 72 28 64 62 2c 20 70 53  olumnExpr(db, pS
1fc0: 72 63 2c 20 69 4c 65 66 74 2c 20 69 43 6f 6c 4c  rc, iLeft, iColL
1fd0: 65 66 74 29 3b 0a 20 20 70 45 32 20 3d 20 73 71  eft);.  pE2 = sq
1fe0: 6c 69 74 65 33 43 72 65 61 74 65 43 6f 6c 75 6d  lite3CreateColum
1ff0: 6e 45 78 70 72 28 64 62 2c 20 70 53 72 63 2c 20  nExpr(db, pSrc, 
2000: 69 52 69 67 68 74 2c 20 69 43 6f 6c 52 69 67 68  iRight, iColRigh
2010: 74 29 3b 0a 0a 20 20 70 45 71 20 3d 20 73 71 6c  t);..  pEq = sql
2020: 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
2030: 2c 20 54 4b 5f 45 51 2c 20 70 45 31 2c 20 70 45  , TK_EQ, pE1, pE
2040: 32 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 45 71  2, 0);.  if( pEq
2050: 20 26 26 20 69 73 4f 75 74 65 72 4a 6f 69 6e 20   && isOuterJoin 
2060: 29 7b 0a 20 20 20 20 45 78 70 72 53 65 74 50 72  ){.    ExprSetPr
2070: 6f 70 65 72 74 79 28 70 45 71 2c 20 45 50 5f 46  operty(pEq, EP_F
2080: 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20 61 73  romJoin);.    as
2090: 73 65 72 74 28 20 21 45 78 70 72 48 61 73 41 6e  sert( !ExprHasAn
20a0: 79 50 72 6f 70 65 72 74 79 28 70 45 71 2c 20 45  yProperty(pEq, E
20b0: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52  P_TokenOnly|EP_R
20c0: 65 64 75 63 65 64 29 20 29 3b 0a 20 20 20 20 45  educed) );.    E
20d0: 78 70 72 53 65 74 49 72 72 65 64 75 63 69 62 6c  xprSetIrreducibl
20e0: 65 28 70 45 71 29 3b 0a 20 20 20 20 70 45 71 2d  e(pEq);.    pEq-
20f0: 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65  >iRightJoinTable
2100: 20 3d 20 28 69 31 36 29 70 45 32 2d 3e 69 54 61   = (i16)pE2->iTa
2110: 62 6c 65 3b 0a 20 20 7d 0a 20 20 2a 70 70 57 68  ble;.  }.  *ppWh
2120: 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ere = sqlite3Exp
2130: 72 41 6e 64 28 64 62 2c 20 2a 70 70 57 68 65 72  rAnd(db, *ppWher
2140: 65 2c 20 70 45 71 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  e, pEq);.}../*.*
2150: 2a 20 53 65 74 20 74 68 65 20 45 50 5f 46 72 6f  * Set the EP_Fro
2160: 6d 4a 6f 69 6e 20 70 72 6f 70 65 72 74 79 20 6f  mJoin property o
2170: 6e 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74  n all terms of t
2180: 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73  he given express
2190: 69 6f 6e 2e 0a 2a 2a 20 41 6e 64 20 73 65 74 20  ion..** And set 
21a0: 74 68 65 20 45 78 70 72 2e 69 52 69 67 68 74 4a  the Expr.iRightJ
21b0: 6f 69 6e 54 61 62 6c 65 20 74 6f 20 69 54 61 62  oinTable to iTab
21c0: 6c 65 20 66 6f 72 20 65 76 65 72 79 20 74 65 72  le for every ter
21d0: 6d 20 69 6e 20 74 68 65 0a 2a 2a 20 65 78 70 72  m in the.** expr
21e0: 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  ession..**.** Th
21f0: 65 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 70 72  e EP_FromJoin pr
2200: 6f 70 65 72 74 79 20 69 73 20 75 73 65 64 20 6f  operty is used o
2210: 6e 20 74 65 72 6d 73 20 6f 66 20 61 6e 20 65 78  n terms of an ex
2220: 70 72 65 73 73 69 6f 6e 20 74 6f 20 74 65 6c 6c  pression to tell
2230: 0a 2a 2a 20 74 68 65 20 4c 45 46 54 20 4f 55 54  .** the LEFT OUT
2240: 45 52 20 4a 4f 49 4e 20 70 72 6f 63 65 73 73 69  ER JOIN processi
2250: 6e 67 20 6c 6f 67 69 63 20 74 68 61 74 20 74 68  ng logic that th
2260: 69 73 20 74 65 72 6d 20 69 73 20 70 61 72 74 20  is term is part 
2270: 6f 66 20 74 68 65 0a 2a 2a 20 6a 6f 69 6e 20 72  of the.** join r
2280: 65 73 74 72 69 63 74 69 6f 6e 20 73 70 65 63 69  estriction speci
2290: 66 69 65 64 20 69 6e 20 74 68 65 20 4f 4e 20 6f  fied in the ON o
22a0: 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 61  r USING clause a
22b0: 6e 64 20 6e 6f 74 20 61 20 70 61 72 74 0a 2a 2a  nd not a part.**
22c0: 20 6f 66 20 74 68 65 20 6d 6f 72 65 20 67 65 6e   of the more gen
22d0: 65 72 61 6c 20 57 48 45 52 45 20 63 6c 61 75 73  eral WHERE claus
22e0: 65 2e 20 20 54 68 65 73 65 20 74 65 72 6d 73 20  e.  These terms 
22f0: 61 72 65 20 6d 6f 76 65 64 20 6f 76 65 72 20 74  are moved over t
2300: 6f 20 74 68 65 0a 2a 2a 20 57 48 45 52 45 20 63  o the.** WHERE c
2310: 6c 61 75 73 65 20 64 75 72 69 6e 67 20 6a 6f 69  lause during joi
2320: 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 62 75 74  n processing but
2330: 20 77 65 20 6e 65 65 64 20 74 6f 20 72 65 6d 65   we need to reme
2340: 6d 62 65 72 20 74 68 61 74 20 74 68 65 79 0a 2a  mber that they.*
2350: 2a 20 6f 72 69 67 69 6e 61 74 65 64 20 69 6e 20  * originated in 
2360: 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20  the ON or USING 
2370: 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  clause..**.** Th
2380: 65 20 45 78 70 72 2e 69 52 69 67 68 74 4a 6f 69  e Expr.iRightJoi
2390: 6e 54 61 62 6c 65 20 74 65 6c 6c 73 20 74 68 65  nTable tells the
23a0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 70 72   WHERE clause pr
23b0: 6f 63 65 73 73 69 6e 67 20 74 68 61 74 20 74 68  ocessing that th
23c0: 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20  e.** expression 
23d0: 64 65 70 65 6e 64 73 20 6f 6e 20 74 61 62 6c 65  depends on table
23e0: 20 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65   iRightJoinTable
23f0: 20 65 76 65 6e 20 69 66 20 74 68 61 74 20 74 61   even if that ta
2400: 62 6c 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 65 78  ble is not.** ex
2410: 70 6c 69 63 69 74 6c 79 20 6d 65 6e 74 69 6f 6e  plicitly mention
2420: 65 64 20 69 6e 20 74 68 65 20 65 78 70 72 65 73  ed in the expres
2430: 73 69 6f 6e 2e 20 20 54 68 61 74 20 69 6e 66 6f  sion.  That info
2440: 72 6d 61 74 69 6f 6e 20 69 73 20 6e 65 65 64 65  rmation is neede
2450: 64 0a 2a 2a 20 66 6f 72 20 63 61 73 65 73 20 6c  d.** for cases l
2460: 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20  ike this:.**.** 
2470: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
2480: 20 74 31 20 4c 45 46 54 20 4a 4f 49 4e 20 74 32   t1 LEFT JOIN t2
2490: 20 4f 4e 20 74 31 2e 61 3d 74 32 2e 62 20 41 4e   ON t1.a=t2.b AN
24a0: 44 20 74 31 2e 78 3d 35 0a 2a 2a 0a 2a 2a 20 54  D t1.x=5.**.** T
24b0: 68 65 20 77 68 65 72 65 20 63 6c 61 75 73 65 20  he where clause 
24c0: 6e 65 65 64 73 20 74 6f 20 64 65 66 65 72 20 74  needs to defer t
24d0: 68 65 20 68 61 6e 64 6c 69 6e 67 20 6f 66 20 74  he handling of t
24e0: 68 65 20 74 31 2e 78 3d 35 0a 2a 2a 20 74 65 72  he t1.x=5.** ter
24f0: 6d 20 75 6e 74 69 6c 20 61 66 74 65 72 20 74 68  m until after th
2500: 65 20 74 32 20 6c 6f 6f 70 20 6f 66 20 74 68 65  e t2 loop of the
2510: 20 6a 6f 69 6e 2e 20 20 49 6e 20 74 68 61 74 20   join.  In that 
2520: 77 61 79 2c 20 61 0a 2a 2a 20 4e 55 4c 4c 20 74  way, a.** NULL t
2530: 32 20 72 6f 77 20 77 69 6c 6c 20 62 65 20 69 6e  2 row will be in
2540: 73 65 72 74 65 64 20 77 68 65 6e 65 76 65 72 20  serted whenever 
2550: 74 31 2e 78 21 3d 35 2e 20 20 49 66 20 77 65 20  t1.x!=5.  If we 
2560: 64 6f 20 6e 6f 74 0a 2a 2a 20 64 65 66 65 72 20  do not.** defer 
2570: 74 68 65 20 68 61 6e 64 6c 69 6e 67 20 6f 66 20  the handling of 
2580: 74 31 2e 78 3d 35 2c 20 69 74 20 77 69 6c 6c 20  t1.x=5, it will 
2590: 62 65 20 70 72 6f 63 65 73 73 65 64 20 69 6d 6d  be processed imm
25a0: 65 64 69 61 74 65 6c 79 0a 2a 2a 20 61 66 74 65  ediately.** afte
25b0: 72 20 74 68 65 20 74 31 20 6c 6f 6f 70 20 61 6e  r the t1 loop an
25c0: 64 20 72 6f 77 73 20 77 69 74 68 20 74 31 2e 78  d rows with t1.x
25d0: 21 3d 35 20 77 69 6c 6c 20 6e 65 76 65 72 20 61  !=5 will never a
25e0: 70 70 65 61 72 20 69 6e 0a 2a 2a 20 74 68 65 20  ppear in.** the 
25f0: 6f 75 74 70 75 74 2c 20 77 68 69 63 68 20 69 73  output, which is
2600: 20 69 6e 63 6f 72 72 65 63 74 2e 0a 2a 2f 0a 73   incorrect..*/.s
2610: 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 4a 6f  tatic void setJo
2620: 69 6e 45 78 70 72 28 45 78 70 72 20 2a 70 2c 20  inExpr(Expr *p, 
2630: 69 6e 74 20 69 54 61 62 6c 65 29 7b 0a 20 20 77  int iTable){.  w
2640: 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 45  hile( p ){.    E
2650: 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70  xprSetProperty(p
2660: 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a  , EP_FromJoin);.
2670: 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
2680: 72 48 61 73 41 6e 79 50 72 6f 70 65 72 74 79 28  rHasAnyProperty(
2690: 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c  p, EP_TokenOnly|
26a0: 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a 20  EP_Reduced) );. 
26b0: 20 20 20 45 78 70 72 53 65 74 49 72 72 65 64 75     ExprSetIrredu
26c0: 63 69 62 6c 65 28 70 29 3b 0a 20 20 20 20 70 2d  cible(p);.    p-
26d0: 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65  >iRightJoinTable
26e0: 20 3d 20 28 69 31 36 29 69 54 61 62 6c 65 3b 0a   = (i16)iTable;.
26f0: 20 20 20 20 73 65 74 4a 6f 69 6e 45 78 70 72 28      setJoinExpr(
2700: 70 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 6c 65  p->pLeft, iTable
2710: 29 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 52  );.    p = p->pR
2720: 69 67 68 74 3b 0a 20 20 7d 20 0a 7d 0a 0a 2f 2a  ight;.  } .}../*
2730: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
2740: 20 70 72 6f 63 65 73 73 65 73 20 74 68 65 20 6a   processes the j
2750: 6f 69 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  oin information 
2760: 66 6f 72 20 61 20 53 45 4c 45 43 54 20 73 74 61  for a SELECT sta
2770: 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4f 4e 20 61 6e  tement..** ON an
2780: 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20  d USING clauses 
2790: 61 72 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e  are converted in
27a0: 74 6f 20 65 78 74 72 61 20 74 65 72 6d 73 20 6f  to extra terms o
27b0: 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
27c0: 73 65 2e 0a 2a 2a 20 4e 41 54 55 52 41 4c 20 6a  se..** NATURAL j
27d0: 6f 69 6e 73 20 61 6c 73 6f 20 63 72 65 61 74 65  oins also create
27e0: 20 65 78 74 72 61 20 57 48 45 52 45 20 63 6c 61   extra WHERE cla
27f0: 75 73 65 20 74 65 72 6d 73 2e 0a 2a 2a 0a 2a 2a  use terms..**.**
2800: 20 54 68 65 20 74 65 72 6d 73 20 6f 66 20 61 20   The terms of a 
2810: 46 52 4f 4d 20 63 6c 61 75 73 65 20 61 72 65 20  FROM clause are 
2820: 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65  contained in the
2830: 20 53 65 6c 65 63 74 2e 70 53 72 63 20 73 74 72   Select.pSrc str
2840: 75 63 74 75 72 65 2e 0a 2a 2a 20 54 68 65 20 6c  ucture..** The l
2850: 65 66 74 20 6d 6f 73 74 20 74 61 62 6c 65 20 69  eft most table i
2860: 73 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72  s the first entr
2870: 79 20 69 6e 20 53 65 6c 65 63 74 2e 70 53 72 63  y in Select.pSrc
2880: 2e 20 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73  .  The right-mos
2890: 74 0a 2a 2a 20 74 61 62 6c 65 20 69 73 20 74 68  t.** table is th
28a0: 65 20 6c 61 73 74 20 65 6e 74 72 79 2e 20 20 54  e last entry.  T
28b0: 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72  he join operator
28c0: 20 69 73 20 68 65 6c 64 20 69 6e 20 74 68 65 20   is held in the 
28d0: 65 6e 74 72 79 20 74 6f 0a 2a 2a 20 74 68 65 20  entry to.** the 
28e0: 6c 65 66 74 2e 20 20 54 68 75 73 20 65 6e 74 72  left.  Thus entr
28f0: 79 20 30 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  y 0 contains the
2900: 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 20 66   join operator f
2910: 6f 72 20 74 68 65 20 6a 6f 69 6e 20 62 65 74 77  or the join betw
2920: 65 65 6e 0a 2a 2a 20 65 6e 74 72 69 65 73 20 30  een.** entries 0
2930: 20 61 6e 64 20 31 2e 20 20 41 6e 79 20 4f 4e 20   and 1.  Any ON 
2940: 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73  or USING clauses
2950: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
2960: 20 74 68 65 20 6a 6f 69 6e 20 61 72 65 0a 2a 2a   the join are.**
2970: 20 61 6c 73 6f 20 61 74 74 61 63 68 65 64 20 74   also attached t
2980: 6f 20 74 68 65 20 6c 65 66 74 20 65 6e 74 72 79  o the left entry
2990: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
29a0: 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65  tine returns the
29b0: 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72   number of error
29c0: 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a  s encountered..*
29d0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c  /.static int sql
29e0: 69 74 65 50 72 6f 63 65 73 73 4a 6f 69 6e 28 50  iteProcessJoin(P
29f0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65  arse *pParse, Se
2a00: 6c 65 63 74 20 2a 70 29 7b 0a 20 20 53 72 63 4c  lect *p){.  SrcL
2a10: 69 73 74 20 2a 70 53 72 63 3b 20 20 20 20 20 20  ist *pSrc;      
2a20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
2a30: 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65  ll tables in the
2a40: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a   FROM clause */.
2a50: 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20    int i, j;     
2a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a70: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
2a80: 72 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  rs */.  struct S
2a90: 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4c 65  rcList_item *pLe
2aa0: 66 74 3b 20 20 20 20 20 2f 2a 20 4c 65 66 74 20  ft;     /* Left 
2ab0: 74 61 62 6c 65 20 62 65 69 6e 67 20 6a 6f 69 6e  table being join
2ac0: 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  ed */.  struct S
2ad0: 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 52 69  rcList_item *pRi
2ae0: 67 68 74 3b 20 20 20 20 2f 2a 20 52 69 67 68 74  ght;    /* Right
2af0: 20 74 61 62 6c 65 20 62 65 69 6e 67 20 6a 6f 69   table being joi
2b00: 6e 65 64 20 2a 2f 0a 0a 20 20 70 53 72 63 20 3d  ned */..  pSrc =
2b10: 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 4c 65 66   p->pSrc;.  pLef
2b20: 74 20 3d 20 26 70 53 72 63 2d 3e 61 5b 30 5d 3b  t = &pSrc->a[0];
2b30: 0a 20 20 70 52 69 67 68 74 20 3d 20 26 70 4c 65  .  pRight = &pLe
2b40: 66 74 5b 31 5d 3b 0a 20 20 66 6f 72 28 69 3d 30  ft[1];.  for(i=0
2b50: 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63 2d 31  ; i<pSrc->nSrc-1
2b60: 3b 20 69 2b 2b 2c 20 70 52 69 67 68 74 2b 2b 2c  ; i++, pRight++,
2b70: 20 70 4c 65 66 74 2b 2b 29 7b 0a 20 20 20 20 54   pLeft++){.    T
2b80: 61 62 6c 65 20 2a 70 4c 65 66 74 54 61 62 20 3d  able *pLeftTab =
2b90: 20 70 4c 65 66 74 2d 3e 70 54 61 62 3b 0a 20 20   pLeft->pTab;.  
2ba0: 20 20 54 61 62 6c 65 20 2a 70 52 69 67 68 74 54    Table *pRightT
2bb0: 61 62 20 3d 20 70 52 69 67 68 74 2d 3e 70 54 61  ab = pRight->pTa
2bc0: 62 3b 0a 20 20 20 20 69 6e 74 20 69 73 4f 75 74  b;.    int isOut
2bd0: 65 72 3b 0a 0a 20 20 20 20 69 66 28 20 4e 45 56  er;..    if( NEV
2be0: 45 52 28 70 4c 65 66 74 54 61 62 3d 3d 30 20 7c  ER(pLeftTab==0 |
2bf0: 7c 20 70 52 69 67 68 74 54 61 62 3d 3d 30 29 20  | pRightTab==0) 
2c00: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
2c10: 69 73 4f 75 74 65 72 20 3d 20 28 70 52 69 67 68  isOuter = (pRigh
2c20: 74 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54  t->jointype & JT
2c30: 5f 4f 55 54 45 52 29 21 3d 30 3b 0a 0a 20 20 20  _OUTER)!=0;..   
2c40: 20 2f 2a 20 57 68 65 6e 20 74 68 65 20 4e 41 54   /* When the NAT
2c50: 55 52 41 4c 20 6b 65 79 77 6f 72 64 20 69 73 20  URAL keyword is 
2c60: 70 72 65 73 65 6e 74 2c 20 61 64 64 20 57 48 45  present, add WHE
2c70: 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20  RE clause terms 
2c80: 66 6f 72 0a 20 20 20 20 2a 2a 20 65 76 65 72 79  for.    ** every
2c90: 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 74 68 65   column that the
2ca0: 20 74 77 6f 20 74 61 62 6c 65 73 20 68 61 76 65   two tables have
2cb0: 20 69 6e 20 63 6f 6d 6d 6f 6e 2e 0a 20 20 20 20   in common..    
2cc0: 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 69 67 68  */.    if( pRigh
2cd0: 74 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54  t->jointype & JT
2ce0: 5f 4e 41 54 55 52 41 4c 20 29 7b 0a 20 20 20 20  _NATURAL ){.    
2cf0: 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 70 4f    if( pRight->pO
2d00: 6e 20 7c 7c 20 70 52 69 67 68 74 2d 3e 70 55 73  n || pRight->pUs
2d10: 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ing ){.        s
2d20: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
2d30: 50 61 72 73 65 2c 20 22 61 20 4e 41 54 55 52 41  Parse, "a NATURA
2d40: 4c 20 6a 6f 69 6e 20 6d 61 79 20 6e 6f 74 20 68  L join may not h
2d50: 61 76 65 20 22 0a 20 20 20 20 20 20 20 20 20 20  ave ".          
2d60: 20 22 61 6e 20 4f 4e 20 6f 72 20 55 53 49 4e 47   "an ON or USING
2d70: 20 63 6c 61 75 73 65 22 2c 20 30 29 3b 0a 20 20   clause", 0);.  
2d80: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
2d90: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f        }.      fo
2da0: 72 28 6a 3d 30 3b 20 6a 3c 70 52 69 67 68 74 54  r(j=0; j<pRightT
2db0: 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a  ab->nCol; j++){.
2dc0: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e          char *zN
2dd0: 61 6d 65 3b 20 20 20 2f 2a 20 4e 61 6d 65 20 6f  ame;   /* Name o
2de0: 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20  f column in the 
2df0: 72 69 67 68 74 20 74 61 62 6c 65 20 2a 2f 0a 20  right table */. 
2e00: 20 20 20 20 20 20 20 69 6e 74 20 69 4c 65 66 74         int iLeft
2e10: 3b 20 20 20 20 20 2f 2a 20 4d 61 74 63 68 69 6e  ;     /* Matchin
2e20: 67 20 6c 65 66 74 20 74 61 62 6c 65 20 2a 2f 0a  g left table */.
2e30: 20 20 20 20 20 20 20 20 69 6e 74 20 69 4c 65 66          int iLef
2e40: 74 43 6f 6c 3b 20 20 2f 2a 20 4d 61 74 63 68 69  tCol;  /* Matchi
2e50: 6e 67 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65  ng column in the
2e60: 20 6c 65 66 74 20 74 61 62 6c 65 20 2a 2f 0a 0a   left table */..
2e70: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
2e80: 70 52 69 67 68 74 54 61 62 2d 3e 61 43 6f 6c 5b  pRightTab->aCol[
2e90: 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  j].zName;.      
2ea0: 20 20 69 66 28 20 74 61 62 6c 65 41 6e 64 43 6f    if( tableAndCo
2eb0: 6c 75 6d 6e 49 6e 64 65 78 28 70 53 72 63 2c 20  lumnIndex(pSrc, 
2ec0: 69 2b 31 2c 20 7a 4e 61 6d 65 2c 20 26 69 4c 65  i+1, zName, &iLe
2ed0: 66 74 2c 20 26 69 4c 65 66 74 43 6f 6c 29 20 29  ft, &iLeftCol) )
2ee0: 7b 0a 20 20 20 20 20 20 20 20 20 20 61 64 64 57  {.          addW
2ef0: 68 65 72 65 54 65 72 6d 28 70 50 61 72 73 65 2c  hereTerm(pParse,
2f00: 20 70 53 72 63 2c 20 69 4c 65 66 74 2c 20 69 4c   pSrc, iLeft, iL
2f10: 65 66 74 43 6f 6c 2c 20 69 2b 31 2c 20 6a 2c 0a  eftCol, i+1, j,.
2f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f30: 20 20 20 20 20 20 20 69 73 4f 75 74 65 72 2c 20         isOuter, 
2f40: 26 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20  &p->pWhere);.   
2f50: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
2f60: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 69 73     }..    /* Dis
2f70: 61 6c 6c 6f 77 20 62 6f 74 68 20 4f 4e 20 61 6e  allow both ON an
2f80: 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20  d USING clauses 
2f90: 69 6e 20 74 68 65 20 73 61 6d 65 20 6a 6f 69 6e  in the same join
2fa0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
2fb0: 70 52 69 67 68 74 2d 3e 70 4f 6e 20 26 26 20 70  pRight->pOn && p
2fc0: 52 69 67 68 74 2d 3e 70 55 73 69 6e 67 20 29 7b  Right->pUsing ){
2fd0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
2fe0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
2ff0: 63 61 6e 6e 6f 74 20 68 61 76 65 20 62 6f 74 68  cannot have both
3000: 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 22 0a   ON and USING ".
3010: 20 20 20 20 20 20 20 20 22 63 6c 61 75 73 65 73          "clauses
3020: 20 69 6e 20 74 68 65 20 73 61 6d 65 20 6a 6f 69   in the same joi
3030: 6e 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  n");.      retur
3040: 6e 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  n 1;.    }..    
3050: 2f 2a 20 41 64 64 20 74 68 65 20 4f 4e 20 63 6c  /* Add the ON cl
3060: 61 75 73 65 20 74 6f 20 74 68 65 20 65 6e 64 20  ause to the end 
3070: 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
3080: 75 73 65 2c 20 63 6f 6e 6e 65 63 74 65 64 20 62  use, connected b
3090: 79 0a 20 20 20 20 2a 2a 20 61 6e 20 41 4e 44 20  y.    ** an AND 
30a0: 6f 70 65 72 61 74 6f 72 2e 0a 20 20 20 20 2a 2f  operator..    */
30b0: 0a 20 20 20 20 69 66 28 20 70 52 69 67 68 74 2d  .    if( pRight-
30c0: 3e 70 4f 6e 20 29 7b 0a 20 20 20 20 20 20 69 66  >pOn ){.      if
30d0: 28 20 69 73 4f 75 74 65 72 20 29 20 73 65 74 4a  ( isOuter ) setJ
30e0: 6f 69 6e 45 78 70 72 28 70 52 69 67 68 74 2d 3e  oinExpr(pRight->
30f0: 70 4f 6e 2c 20 70 52 69 67 68 74 2d 3e 69 43 75  pOn, pRight->iCu
3100: 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 70 2d 3e  rsor);.      p->
3110: 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33  pWhere = sqlite3
3120: 45 78 70 72 41 6e 64 28 70 50 61 72 73 65 2d 3e  ExprAnd(pParse->
3130: 64 62 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20 70  db, p->pWhere, p
3140: 52 69 67 68 74 2d 3e 70 4f 6e 29 3b 0a 20 20 20  Right->pOn);.   
3150: 20 20 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20 3d     pRight->pOn =
3160: 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f   0;.    }..    /
3170: 2a 20 43 72 65 61 74 65 20 65 78 74 72 61 20 74  * Create extra t
3180: 65 72 6d 73 20 6f 6e 20 74 68 65 20 57 48 45 52  erms on the WHER
3190: 45 20 63 6c 61 75 73 65 20 66 6f 72 20 65 61 63  E clause for eac
31a0: 68 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64 0a 20  h column named. 
31b0: 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 55 53 49     ** in the USI
31c0: 4e 47 20 63 6c 61 75 73 65 2e 20 20 45 78 61 6d  NG clause.  Exam
31d0: 70 6c 65 3a 20 49 66 20 74 68 65 20 74 77 6f 20  ple: If the two 
31e0: 74 61 62 6c 65 73 20 74 6f 20 62 65 20 6a 6f 69  tables to be joi
31f0: 6e 65 64 20 61 72 65 20 0a 20 20 20 20 2a 2a 20  ned are .    ** 
3200: 41 20 61 6e 64 20 42 20 61 6e 64 20 74 68 65 20  A and B and the 
3210: 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6e 61 6d  USING clause nam
3220: 65 73 20 58 2c 20 59 2c 20 61 6e 64 20 5a 2c 20  es X, Y, and Z, 
3230: 74 68 65 6e 20 61 64 64 20 74 68 69 73 0a 20 20  then add this.  
3240: 20 20 2a 2a 20 74 6f 20 74 68 65 20 57 48 45 52    ** to the WHER
3250: 45 20 63 6c 61 75 73 65 3a 20 20 20 20 41 2e 58  E clause:    A.X
3260: 3d 42 2e 58 20 41 4e 44 20 41 2e 59 3d 42 2e 59  =B.X AND A.Y=B.Y
3270: 20 41 4e 44 20 41 2e 5a 3d 42 2e 5a 0a 20 20 20   AND A.Z=B.Z.   
3280: 20 2a 2a 20 52 65 70 6f 72 74 20 61 6e 20 65 72   ** Report an er
3290: 72 6f 72 20 69 66 20 61 6e 79 20 63 6f 6c 75 6d  ror if any colum
32a0: 6e 20 6d 65 6e 74 69 6f 6e 65 64 20 69 6e 20 74  n mentioned in t
32b0: 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20  he USING clause 
32c0: 69 73 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 63 6f  is.    ** not co
32d0: 6e 74 61 69 6e 65 64 20 69 6e 20 62 6f 74 68 20  ntained in both 
32e0: 74 61 62 6c 65 73 20 74 6f 20 62 65 20 6a 6f 69  tables to be joi
32f0: 6e 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ned..    */.    
3300: 69 66 28 20 70 52 69 67 68 74 2d 3e 70 55 73 69  if( pRight->pUsi
3310: 6e 67 20 29 7b 0a 20 20 20 20 20 20 49 64 4c 69  ng ){.      IdLi
3320: 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 52 69 67  st *pList = pRig
3330: 68 74 2d 3e 70 55 73 69 6e 67 3b 0a 20 20 20 20  ht->pUsing;.    
3340: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4c 69    for(j=0; j<pLi
3350: 73 74 2d 3e 6e 49 64 3b 20 6a 2b 2b 29 7b 0a 20  st->nId; j++){. 
3360: 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61         char *zNa
3370: 6d 65 3b 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20  me;     /* Name 
3380: 6f 66 20 74 68 65 20 74 65 72 6d 20 69 6e 20 74  of the term in t
3390: 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20  he USING clause 
33a0: 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  */.        int i
33b0: 4c 65 66 74 3b 20 20 20 20 20 20 20 2f 2a 20 54  Left;       /* T
33c0: 61 62 6c 65 20 6f 6e 20 74 68 65 20 6c 65 66 74  able on the left
33d0: 20 77 69 74 68 20 6d 61 74 63 68 69 6e 67 20 63   with matching c
33e0: 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  olumn name */.  
33f0: 20 20 20 20 20 20 69 6e 74 20 69 4c 65 66 74 43        int iLeftC
3400: 6f 6c 3b 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e  ol;    /* Column
3410: 20 6e 75 6d 62 65 72 20 6f 66 20 6d 61 74 63 68   number of match
3420: 69 6e 67 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74 68  ing column on th
3430: 65 20 6c 65 66 74 20 2a 2f 0a 20 20 20 20 20 20  e left */.      
3440: 20 20 69 6e 74 20 69 52 69 67 68 74 43 6f 6c 3b    int iRightCol;
3450: 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d     /* Column num
3460: 62 65 72 20 6f 66 20 6d 61 74 63 68 69 6e 67 20  ber of matching 
3470: 63 6f 6c 75 6d 6e 20 6f 6e 20 74 68 65 20 72 69  column on the ri
3480: 67 68 74 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20  ght */..        
3490: 7a 4e 61 6d 65 20 3d 20 70 4c 69 73 74 2d 3e 61  zName = pList->a
34a0: 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  [j].zName;.     
34b0: 20 20 20 69 52 69 67 68 74 43 6f 6c 20 3d 20 63     iRightCol = c
34c0: 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 52 69 67 68  olumnIndex(pRigh
34d0: 74 54 61 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  tTab, zName);.  
34e0: 20 20 20 20 20 20 69 66 28 20 69 52 69 67 68 74        if( iRight
34f0: 43 6f 6c 3c 30 0a 20 20 20 20 20 20 20 20 20 7c  Col<0.         |
3500: 7c 20 21 74 61 62 6c 65 41 6e 64 43 6f 6c 75 6d  | !tableAndColum
3510: 6e 49 6e 64 65 78 28 70 53 72 63 2c 20 69 2b 31  nIndex(pSrc, i+1
3520: 2c 20 7a 4e 61 6d 65 2c 20 26 69 4c 65 66 74 2c  , zName, &iLeft,
3530: 20 26 69 4c 65 66 74 43 6f 6c 29 0a 20 20 20 20   &iLeftCol).    
3540: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
3550: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
3560: 28 70 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74  (pParse, "cannot
3570: 20 6a 6f 69 6e 20 75 73 69 6e 67 20 63 6f 6c 75   join using colu
3580: 6d 6e 20 25 73 20 2d 20 63 6f 6c 75 6d 6e 20 22  mn %s - column "
3590: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 6e 6f  .            "no
35a0: 74 20 70 72 65 73 65 6e 74 20 69 6e 20 62 6f 74  t present in bot
35b0: 68 20 74 61 62 6c 65 73 22 2c 20 7a 4e 61 6d 65  h tables", zName
35c0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
35d0: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  urn 1;.        }
35e0: 0a 20 20 20 20 20 20 20 20 61 64 64 57 68 65 72  .        addWher
35f0: 65 54 65 72 6d 28 70 50 61 72 73 65 2c 20 70 53  eTerm(pParse, pS
3600: 72 63 2c 20 69 4c 65 66 74 2c 20 69 4c 65 66 74  rc, iLeft, iLeft
3610: 43 6f 6c 2c 20 69 2b 31 2c 20 69 52 69 67 68 74  Col, i+1, iRight
3620: 43 6f 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Col,.           
3630: 20 20 20 20 20 20 20 20 20 20 69 73 4f 75 74 65            isOute
3640: 72 2c 20 26 70 2d 3e 70 57 68 65 72 65 29 3b 0a  r, &p->pWhere);.
3650: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
3660: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
3670: 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 63 6f  ./*.** Insert co
3680: 64 65 20 69 6e 74 6f 20 22 76 22 20 74 68 61 74  de into "v" that
3690: 20 77 69 6c 6c 20 70 75 73 68 20 74 68 65 20 72   will push the r
36a0: 65 63 6f 72 64 20 6f 6e 20 74 68 65 20 74 6f 70  ecord on the top
36b0: 20 6f 66 20 74 68 65 0a 2a 2a 20 73 74 61 63 6b   of the.** stack
36c0: 20 69 6e 74 6f 20 74 68 65 20 73 6f 72 74 65 72   into the sorter
36d0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
36e0: 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28   pushOntoSorter(
36f0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
3700: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72  ,         /* Par
3710: 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ser context */. 
3720: 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
3730: 72 42 79 2c 20 20 20 20 2f 2a 20 54 68 65 20 4f  rBy,    /* The O
3740: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a  RDER BY clause *
3750: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  /.  Select *pSel
3760: 65 63 74 2c 20 20 20 20 20 20 20 2f 2a 20 54 68  ect,       /* Th
3770: 65 20 77 68 6f 6c 65 20 53 45 4c 45 43 54 20 73  e whole SELECT s
3780: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e  tatement */.  in
3790: 74 20 72 65 67 44 61 74 61 20 20 20 20 20 20 20  t regData       
37a0: 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
37b0: 20 68 6f 6c 64 69 6e 67 20 64 61 74 61 20 74 6f   holding data to
37c0: 20 62 65 20 73 6f 72 74 65 64 20 2a 2f 0a 29 7b   be sorted */.){
37d0: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
37e0: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
37f0: 74 20 6e 45 78 70 72 20 3d 20 70 4f 72 64 65 72  t nExpr = pOrder
3800: 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 69 6e 74  By->nExpr;.  int
3810: 20 72 65 67 42 61 73 65 20 3d 20 73 71 6c 69 74   regBase = sqlit
3820: 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70  e3GetTempRange(p
3830: 50 61 72 73 65 2c 20 6e 45 78 70 72 2b 32 29 3b  Parse, nExpr+2);
3840: 0a 20 20 69 6e 74 20 72 65 67 52 65 63 6f 72 64  .  int regRecord
3850: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
3860: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
3870: 69 6e 74 20 6f 70 3b 0a 20 20 73 71 6c 69 74 65  int op;.  sqlite
3880: 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28  3ExprCacheClear(
3890: 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74  pParse);.  sqlit
38a0: 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69  e3ExprCodeExprLi
38b0: 73 74 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65  st(pParse, pOrde
38c0: 72 42 79 2c 20 72 65 67 42 61 73 65 2c 20 30 29  rBy, regBase, 0)
38d0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
38e0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65 71 75  ddOp2(v, OP_Sequ
38f0: 65 6e 63 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e  ence, pOrderBy->
3900: 69 45 43 75 72 73 6f 72 2c 20 72 65 67 42 61 73  iECursor, regBas
3910: 65 2b 6e 45 78 70 72 29 3b 0a 20 20 73 71 6c 69  e+nExpr);.  sqli
3920: 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28  te3ExprCodeMove(
3930: 70 50 61 72 73 65 2c 20 72 65 67 44 61 74 61 2c  pParse, regData,
3940: 20 72 65 67 42 61 73 65 2b 6e 45 78 70 72 2b 31   regBase+nExpr+1
3950: 2c 20 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  , 1);.  sqlite3V
3960: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
3970: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 42  MakeRecord, regB
3980: 61 73 65 2c 20 6e 45 78 70 72 20 2b 20 32 2c 20  ase, nExpr + 2, 
3990: 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 69 66  regRecord);.  if
39a0: 28 20 70 53 65 6c 65 63 74 2d 3e 73 65 6c 46 6c  ( pSelect->selFl
39b0: 61 67 73 20 26 20 53 46 5f 55 73 65 53 6f 72 74  ags & SF_UseSort
39c0: 65 72 20 29 7b 0a 20 20 20 20 6f 70 20 3d 20 4f  er ){.    op = O
39d0: 50 5f 53 6f 72 74 65 72 49 6e 73 65 72 74 3b 0a  P_SorterInsert;.
39e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 70 20    }else{.    op 
39f0: 3d 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 3b 0a  = OP_IdxInsert;.
3a00: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
3a10: 65 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20 70  eAddOp2(v, op, p
3a20: 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f  OrderBy->iECurso
3a30: 72 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20  r, regRecord);. 
3a40: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
3a50: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
3a60: 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c  egRecord);.  sql
3a70: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
3a80: 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67  ange(pParse, reg
3a90: 42 61 73 65 2c 20 6e 45 78 70 72 2b 32 29 3b 0a  Base, nExpr+2);.
3aa0: 20 20 69 66 28 20 70 53 65 6c 65 63 74 2d 3e 69    if( pSelect->i
3ab0: 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 69 6e 74  Limit ){.    int
3ac0: 20 61 64 64 72 31 2c 20 61 64 64 72 32 3b 0a 20   addr1, addr2;. 
3ad0: 20 20 20 69 6e 74 20 69 4c 69 6d 69 74 3b 0a 20     int iLimit;. 
3ae0: 20 20 20 69 66 28 20 70 53 65 6c 65 63 74 2d 3e     if( pSelect->
3af0: 69 4f 66 66 73 65 74 20 29 7b 0a 20 20 20 20 20  iOffset ){.     
3b00: 20 69 4c 69 6d 69 74 20 3d 20 70 53 65 6c 65 63   iLimit = pSelec
3b10: 74 2d 3e 69 4f 66 66 73 65 74 2b 31 3b 0a 20 20  t->iOffset+1;.  
3b20: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
3b30: 4c 69 6d 69 74 20 3d 20 70 53 65 6c 65 63 74 2d  Limit = pSelect-
3b40: 3e 69 4c 69 6d 69 74 3b 0a 20 20 20 20 7d 0a 20  >iLimit;.    }. 
3b50: 20 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74     addr1 = sqlit
3b60: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
3b70: 4f 50 5f 49 66 5a 65 72 6f 2c 20 69 4c 69 6d 69  OP_IfZero, iLimi
3b80: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  t);.    sqlite3V
3b90: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
3ba0: 41 64 64 49 6d 6d 2c 20 69 4c 69 6d 69 74 2c 20  AddImm, iLimit, 
3bb0: 2d 31 29 3b 0a 20 20 20 20 61 64 64 72 32 20 3d  -1);.    addr2 =
3bc0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
3bd0: 70 30 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a  p0(v, OP_Goto);.
3be0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
3bf0: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 31  umpHere(v, addr1
3c00: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
3c10: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4c  beAddOp1(v, OP_L
3c20: 61 73 74 2c 20 70 4f 72 64 65 72 42 79 2d 3e 69  ast, pOrderBy->i
3c30: 45 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 73 71  ECursor);.    sq
3c40: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
3c50: 76 2c 20 4f 50 5f 44 65 6c 65 74 65 2c 20 70 4f  v, OP_Delete, pO
3c60: 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72  rderBy->iECursor
3c70: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
3c80: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
3c90: 64 72 32 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  dr2);.  }.}../*.
3ca0: 2a 2a 20 41 64 64 20 63 6f 64 65 20 74 6f 20 69  ** Add code to i
3cb0: 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 4f 46 46  mplement the OFF
3cc0: 53 45 54 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  SET.*/.static vo
3cd0: 69 64 20 63 6f 64 65 4f 66 66 73 65 74 28 0a 20  id codeOffset(. 
3ce0: 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20 20 20   Vdbe *v,       
3cf0: 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63     /* Generate c
3d00: 6f 64 65 20 69 6e 74 6f 20 74 68 69 73 20 56 4d  ode into this VM
3d10: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
3d20: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53          /* The S
3d30: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
3d40: 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20  being coded */. 
3d50: 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 20 20   int iContinue  
3d60: 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
3d70: 74 6f 20 73 6b 69 70 20 74 68 65 20 63 75 72 72  to skip the curr
3d80: 65 6e 74 20 72 65 63 6f 72 64 20 2a 2f 0a 29 7b  ent record */.){
3d90: 0a 20 20 69 66 28 20 70 2d 3e 69 4f 66 66 73 65  .  if( p->iOffse
3da0: 74 20 26 26 20 69 43 6f 6e 74 69 6e 75 65 21 3d  t && iContinue!=
3db0: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 64 64  0 ){.    int add
3dc0: 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  r;.    sqlite3Vd
3dd0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41  beAddOp2(v, OP_A
3de0: 64 64 49 6d 6d 2c 20 70 2d 3e 69 4f 66 66 73 65  ddImm, p->iOffse
3df0: 74 2c 20 2d 31 29 3b 0a 20 20 20 20 61 64 64 72  t, -1);.    addr
3e00: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
3e10: 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e 65 67  dOp1(v, OP_IfNeg
3e20: 2c 20 70 2d 3e 69 4f 66 66 73 65 74 29 3b 0a 20  , p->iOffset);. 
3e30: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
3e40: 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
3e50: 20 30 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a   0, iContinue);.
3e60: 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
3e70: 28 76 2c 20 22 73 6b 69 70 20 4f 46 46 53 45 54  (v, "skip OFFSET
3e80: 20 72 65 63 6f 72 64 73 22 29 29 3b 0a 20 20 20   records"));.   
3e90: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
3ea0: 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20  Here(v, addr);. 
3eb0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20   }.}../*.** Add 
3ec0: 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 63  code that will c
3ed0: 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72  heck to make sur
3ee0: 65 20 74 68 65 20 4e 20 72 65 67 69 73 74 65 72  e the N register
3ef0: 73 20 73 74 61 72 74 69 6e 67 20 61 74 20 69 4d  s starting at iM
3f00: 65 6d 0a 2a 2a 20 66 6f 72 6d 20 61 20 64 69 73  em.** form a dis
3f10: 74 69 6e 63 74 20 65 6e 74 72 79 2e 20 20 69 54  tinct entry.  iT
3f20: 61 62 20 69 73 20 61 20 73 6f 72 74 69 6e 67 20  ab is a sorting 
3f30: 69 6e 64 65 78 20 74 68 61 74 20 68 6f 6c 64 73  index that holds
3f40: 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 73   previously.** s
3f50: 65 65 6e 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73  een combinations
3f60: 20 6f 66 20 74 68 65 20 4e 20 76 61 6c 75 65 73   of the N values
3f70: 2e 20 20 41 20 6e 65 77 20 65 6e 74 72 79 20 69  .  A new entry i
3f80: 73 20 6d 61 64 65 20 69 6e 20 69 54 61 62 0a 2a  s made in iTab.*
3f90: 2a 20 69 66 20 74 68 65 20 63 75 72 72 65 6e 74  * if the current
3fa0: 20 4e 20 76 61 6c 75 65 73 20 61 72 65 20 6e 65   N values are ne
3fb0: 77 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a 75 6d 70 20  w..**.** A jump 
3fc0: 74 6f 20 61 64 64 72 52 65 70 65 61 74 20 69 73  to addrRepeat is
3fd0: 20 6d 61 64 65 20 61 6e 64 20 74 68 65 20 4e 2b   made and the N+
3fe0: 31 20 76 61 6c 75 65 73 20 61 72 65 20 70 6f 70  1 values are pop
3ff0: 70 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20  ped from the.** 
4000: 73 74 61 63 6b 20 69 66 20 74 68 65 20 74 6f 70  stack if the top
4010: 20 4e 20 65 6c 65 6d 65 6e 74 73 20 61 72 65 20   N elements are 
4020: 6e 6f 74 20 64 69 73 74 69 6e 63 74 2e 0a 2a 2f  not distinct..*/
4030: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64  .static void cod
4040: 65 44 69 73 74 69 6e 63 74 28 0a 20 20 50 61 72  eDistinct(.  Par
4050: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
4060: 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63  /* Parsing and c
4070: 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63  ode generating c
4080: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20  ontext */.  int 
4090: 69 54 61 62 2c 20 20 20 20 20 20 20 20 20 20 2f  iTab,          /
40a0: 2a 20 41 20 73 6f 72 74 69 6e 67 20 69 6e 64 65  * A sorting inde
40b0: 78 20 75 73 65 64 20 74 6f 20 74 65 73 74 20 66  x used to test f
40c0: 6f 72 20 64 69 73 74 69 6e 63 74 6e 65 73 73 20  or distinctness 
40d0: 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 52 65 70  */.  int addrRep
40e0: 65 61 74 2c 20 20 20 20 2f 2a 20 4a 75 6d 70 20  eat,    /* Jump 
40f0: 74 6f 20 68 65 72 65 20 69 66 20 6e 6f 74 20 64  to here if not d
4100: 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20 69 6e 74  istinct */.  int
4110: 20 4e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   N,             
4120: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65  /* Number of ele
4130: 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69  ments */.  int i
4140: 4d 65 6d 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Mem           /*
4150: 20 46 69 72 73 74 20 65 6c 65 6d 65 6e 74 20 2a   First element *
4160: 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  /.){.  Vdbe *v;.
4170: 20 20 69 6e 74 20 72 31 3b 0a 0a 20 20 76 20 3d    int r1;..  v =
4180: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
4190: 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65    r1 = sqlite3Ge
41a0: 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
41b0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
41c0: 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46  ddOp4Int(v, OP_F
41d0: 6f 75 6e 64 2c 20 69 54 61 62 2c 20 61 64 64 72  ound, iTab, addr
41e0: 52 65 70 65 61 74 2c 20 69 4d 65 6d 2c 20 4e 29  Repeat, iMem, N)
41f0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
4200: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp3(v, OP_Make
4210: 52 65 63 6f 72 64 2c 20 69 4d 65 6d 2c 20 4e 2c  Record, iMem, N,
4220: 20 72 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56   r1);.  sqlite3V
4230: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
4240: 49 64 78 49 6e 73 65 72 74 2c 20 69 54 61 62 2c  IdxInsert, iTab,
4250: 20 72 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 52   r1);.  sqlite3R
4260: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
4270: 61 72 73 65 2c 20 72 31 29 3b 0a 7d 0a 0a 23 69  arse, r1);.}..#i
4280: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
4290: 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a  T_SUBQUERY./*.**
42a0: 20 47 65 6e 65 72 61 74 65 20 61 6e 20 65 72 72   Generate an err
42b0: 6f 72 20 6d 65 73 73 61 67 65 20 77 68 65 6e 20  or message when 
42c0: 61 20 53 45 4c 45 43 54 20 69 73 20 75 73 65 64  a SELECT is used
42d0: 20 77 69 74 68 69 6e 20 61 20 73 75 62 65 78 70   within a subexp
42e0: 72 65 73 73 69 6f 6e 0a 2a 2a 20 28 65 78 61 6d  ression.** (exam
42f0: 70 6c 65 3a 20 20 22 61 20 49 4e 20 28 53 45 4c  ple:  "a IN (SEL
4300: 45 43 54 20 2a 20 46 52 4f 4d 20 74 61 62 6c 65  ECT * FROM table
4310: 29 22 29 20 62 75 74 20 69 74 20 68 61 73 20 6d  )") but it has m
4320: 6f 72 65 20 74 68 61 6e 20 31 20 72 65 73 75 6c  ore than 1 resul
4330: 74 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e 20 20 57 65  t.** column.  We
4340: 20 64 6f 20 74 68 69 73 20 69 6e 20 61 20 73 75   do this in a su
4350: 62 72 6f 75 74 69 6e 65 20 62 65 63 61 75 73 65  broutine because
4360: 20 74 68 65 20 65 72 72 6f 72 20 75 73 65 64 20   the error used 
4370: 74 6f 20 6f 63 63 75 72 0a 2a 2a 20 69 6e 20 6d  to occur.** in m
4380: 75 6c 74 69 70 6c 65 20 70 6c 61 63 65 73 2e 20  ultiple places. 
4390: 20 28 54 68 65 20 65 72 72 6f 72 20 6f 6e 6c 79   (The error only
43a0: 20 6f 63 63 75 72 73 20 69 6e 20 6f 6e 65 20 70   occurs in one p
43b0: 6c 61 63 65 20 6e 6f 77 2c 20 62 75 74 20 77 65  lace now, but we
43c0: 0a 2a 2a 20 72 65 74 61 69 6e 20 74 68 65 20 73  .** retain the s
43d0: 75 62 72 6f 75 74 69 6e 65 20 74 6f 20 6d 69 6e  ubroutine to min
43e0: 69 6d 69 7a 65 20 63 6f 64 65 20 64 69 73 72 75  imize code disru
43f0: 70 74 69 6f 6e 2e 29 0a 2a 2f 0a 73 74 61 74 69  ption.).*/.stati
4400: 63 20 69 6e 74 20 63 68 65 63 6b 46 6f 72 4d 75  c int checkForMu
4410: 6c 74 69 43 6f 6c 75 6d 6e 53 65 6c 65 63 74 45  ltiColumnSelectE
4420: 72 72 6f 72 28 0a 20 20 50 61 72 73 65 20 2a 70  rror(.  Parse *p
4430: 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20  Parse,       /* 
4440: 50 61 72 73 65 20 63 6f 6e 74 65 78 74 2e 20 2a  Parse context. *
4450: 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a  /.  SelectDest *
4460: 70 44 65 73 74 2c 20 20 20 2f 2a 20 44 65 73 74  pDest,   /* Dest
4470: 69 6e 61 74 69 6f 6e 20 6f 66 20 53 45 4c 45 43  ination of SELEC
4480: 54 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69  T results */.  i
4490: 6e 74 20 6e 45 78 70 72 20 20 20 20 20 20 20 20  nt nExpr        
44a0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
44b0: 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20   result columns 
44c0: 72 65 74 75 72 6e 65 64 20 62 79 20 53 45 4c 45  returned by SELE
44d0: 43 54 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 65  CT */.){.  int e
44e0: 44 65 73 74 20 3d 20 70 44 65 73 74 2d 3e 65 44  Dest = pDest->eD
44f0: 65 73 74 3b 0a 20 20 69 66 28 20 6e 45 78 70 72  est;.  if( nExpr
4500: 3e 31 20 26 26 20 28 65 44 65 73 74 3d 3d 53 52  >1 && (eDest==SR
4510: 54 5f 4d 65 6d 20 7c 7c 20 65 44 65 73 74 3d 3d  T_Mem || eDest==
4520: 53 52 54 5f 53 65 74 29 20 29 7b 0a 20 20 20 20  SRT_Set) ){.    
4530: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
4540: 70 50 61 72 73 65 2c 20 22 6f 6e 6c 79 20 61 20  pParse, "only a 
4550: 73 69 6e 67 6c 65 20 72 65 73 75 6c 74 20 61 6c  single result al
4560: 6c 6f 77 65 64 20 66 6f 72 20 22 0a 20 20 20 20  lowed for ".    
4570: 20 20 20 22 61 20 53 45 4c 45 43 54 20 74 68 61     "a SELECT tha
4580: 74 20 69 73 20 70 61 72 74 20 6f 66 20 61 6e 20  t is part of an 
4590: 65 78 70 72 65 73 73 69 6f 6e 22 29 3b 0a 20 20  expression");.  
45a0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 65    return 1;.  }e
45b0: 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  lse{.    return 
45c0: 30 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a  0;.  }.}.#endif.
45d0: 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e  ./*.** An instan
45e0: 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ce of the follow
45f0: 69 6e 67 20 6f 62 6a 65 63 74 20 69 73 20 75 73  ing object is us
4600: 65 64 20 74 6f 20 72 65 63 6f 72 64 20 69 6e 66  ed to record inf
4610: 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 0a 2a  ormation about.*
4620: 2a 20 68 6f 77 20 74 6f 20 70 72 6f 63 65 73 73  * how to process
4630: 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65   the DISTINCT ke
4640: 79 77 6f 72 64 2c 20 74 6f 20 73 69 6d 70 6c 69  yword, to simpli
4650: 66 79 20 70 61 73 73 69 6e 67 20 74 68 61 74 20  fy passing that 
4660: 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 69  information.** i
4670: 6e 74 6f 20 74 68 65 20 73 65 6c 65 63 74 49 6e  nto the selectIn
4680: 6e 65 72 4c 6f 6f 70 28 29 20 72 6f 75 74 69 6e  nerLoop() routin
4690: 65 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  e..*/.typedef st
46a0: 72 75 63 74 20 44 69 73 74 69 6e 63 74 43 74 78  ruct DistinctCtx
46b0: 20 44 69 73 74 69 6e 63 74 43 74 78 3b 0a 73 74   DistinctCtx;.st
46c0: 72 75 63 74 20 44 69 73 74 69 6e 63 74 43 74 78  ruct DistinctCtx
46d0: 20 7b 0a 20 20 75 38 20 69 73 54 6e 63 74 3b 20   {.  u8 isTnct; 
46e0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
46f0: 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79  the DISTINCT key
4700: 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74 20  word is present 
4710: 2a 2f 0a 20 20 75 38 20 65 54 6e 63 74 54 79 70  */.  u8 eTnctTyp
4720: 65 3b 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74  e;   /* One of t
4730: 68 65 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43  he WHERE_DISTINC
4740: 54 5f 2a 20 6f 70 65 72 61 74 6f 72 73 20 2a 2f  T_* operators */
4750: 0a 20 20 69 6e 74 20 74 61 62 54 6e 63 74 3b 20  .  int tabTnct; 
4760: 20 20 20 2f 2a 20 45 70 68 65 6d 65 72 61 6c 20     /* Ephemeral 
4770: 74 61 62 6c 65 20 75 73 65 64 20 66 6f 72 20 44  table used for D
4780: 49 53 54 49 4e 43 54 20 70 72 6f 63 65 73 73 69  ISTINCT processi
4790: 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ng */.  int addr
47a0: 54 6e 63 74 3b 20 20 20 2f 2a 20 41 64 64 72 65  Tnct;   /* Addre
47b0: 73 73 20 6f 66 20 4f 50 5f 4f 70 65 6e 45 70 68  ss of OP_OpenEph
47c0: 65 6d 65 72 61 6c 20 6f 70 63 6f 64 65 20 66 6f  emeral opcode fo
47d0: 72 20 74 61 62 54 6e 63 74 20 2a 2f 0a 7d 3b 0a  r tabTnct */.};.
47e0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
47f0: 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 74 68  ine generates th
4800: 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 69  e code for the i
4810: 6e 73 69 64 65 20 6f 66 20 74 68 65 20 69 6e 6e  nside of the inn
4820: 65 72 20 6c 6f 6f 70 0a 2a 2a 20 6f 66 20 61 20  er loop.** of a 
4830: 53 45 4c 45 43 54 2e 0a 2a 2a 0a 2a 2a 20 49 66  SELECT..**.** If
4840: 20 73 72 63 54 61 62 20 61 6e 64 20 6e 43 6f 6c   srcTab and nCol
4850: 75 6d 6e 20 61 72 65 20 62 6f 74 68 20 7a 65 72  umn are both zer
4860: 6f 2c 20 74 68 65 6e 20 74 68 65 20 70 45 4c 69  o, then the pELi
4870: 73 74 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a  st expressions.*
4880: 2a 20 61 72 65 20 65 76 61 6c 75 61 74 65 64 20  * are evaluated 
4890: 69 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 74 20  in order to get 
48a0: 74 68 65 20 64 61 74 61 20 66 6f 72 20 74 68 69  the data for thi
48b0: 73 20 72 6f 77 2e 20 20 49 66 20 6e 43 6f 6c 75  s row.  If nColu
48c0: 6d 6e 3e 30 0a 2a 2a 20 74 68 65 6e 20 64 61 74  mn>0.** then dat
48d0: 61 20 69 73 20 70 75 6c 6c 65 64 20 66 72 6f 6d  a is pulled from
48e0: 20 73 72 63 54 61 62 20 61 6e 64 20 70 45 4c 69   srcTab and pELi
48f0: 73 74 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20  st is used only 
4900: 74 6f 20 67 65 74 20 74 68 65 0a 2a 2a 20 64 61  to get the.** da
4910: 74 61 74 79 70 65 73 20 66 6f 72 20 65 61 63 68  tatypes for each
4920: 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 73 74 61 74   column..*/.stat
4930: 69 63 20 76 6f 69 64 20 73 65 6c 65 63 74 49 6e  ic void selectIn
4940: 6e 65 72 4c 6f 6f 70 28 0a 20 20 50 61 72 73 65  nerLoop(.  Parse
4950: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
4960: 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72     /* The parser
4970: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
4980: 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
4990: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d        /* The com
49a0: 70 6c 65 74 65 20 73 65 6c 65 63 74 20 73 74 61  plete select sta
49b0: 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64  tement being cod
49c0: 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  ed */.  ExprList
49d0: 20 2a 70 45 4c 69 73 74 2c 20 20 20 20 20 20 20   *pEList,       
49e0: 2f 2a 20 4c 69 73 74 20 6f 66 20 76 61 6c 75 65  /* List of value
49f0: 73 20 62 65 69 6e 67 20 65 78 74 72 61 63 74 65  s being extracte
4a00: 64 20 2a 2f 0a 20 20 69 6e 74 20 73 72 63 54 61  d */.  int srcTa
4a10: 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  b,             /
4a20: 2a 20 50 75 6c 6c 20 64 61 74 61 20 66 72 6f 6d  * Pull data from
4a30: 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20   this table */. 
4a40: 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e 2c 20 20 20   int nColumn,   
4a50: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
4a60: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
4a70: 20 74 68 65 20 73 6f 75 72 63 65 20 74 61 62 6c   the source tabl
4a80: 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  e */.  ExprList 
4a90: 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20 20 2f  *pOrderBy,     /
4aa0: 2a 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 73  * If not NULL, s
4ab0: 6f 72 74 20 72 65 73 75 6c 74 73 20 75 73 69 6e  ort results usin
4ac0: 67 20 74 68 69 73 20 6b 65 79 20 2a 2f 0a 20 20  g this key */.  
4ad0: 44 69 73 74 69 6e 63 74 43 74 78 20 2a 70 44 69  DistinctCtx *pDi
4ae0: 73 74 69 6e 63 74 2c 20 2f 2a 20 49 66 20 6e 6f  stinct, /* If no
4af0: 74 20 4e 55 4c 4c 2c 20 69 6e 66 6f 20 6f 6e 20  t NULL, info on 
4b00: 68 6f 77 20 74 6f 20 70 72 6f 63 65 73 73 20 44  how to process D
4b10: 49 53 54 49 4e 43 54 20 2a 2f 0a 20 20 53 65 6c  ISTINCT */.  Sel
4b20: 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 2c 20  ectDest *pDest, 
4b30: 20 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20 64       /* How to d
4b40: 69 73 70 6f 73 65 20 6f 66 20 74 68 65 20 72 65  ispose of the re
4b50: 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69  sults */.  int i
4b60: 43 6f 6e 74 69 6e 75 65 2c 20 20 20 20 20 20 20  Continue,       
4b70: 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
4b80: 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68  to continue with
4b90: 20 6e 65 78 74 20 72 6f 77 20 2a 2f 0a 20 20 69   next row */.  i
4ba0: 6e 74 20 69 42 72 65 61 6b 20 20 20 20 20 20 20  nt iBreak       
4bb0: 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68         /* Jump h
4bc0: 65 72 65 20 74 6f 20 62 72 65 61 6b 20 6f 75 74  ere to break out
4bd0: 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f   of the inner lo
4be0: 6f 70 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20  op */.){.  Vdbe 
4bf0: 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
4c00: 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  be;.  int i;.  i
4c10: 6e 74 20 68 61 73 44 69 73 74 69 6e 63 74 3b 20  nt hasDistinct; 
4c20: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
4c30: 66 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b  f the DISTINCT k
4c40: 65 79 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e  eyword is presen
4c50: 74 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65  t */.  int regRe
4c60: 73 75 6c 74 3b 20 20 20 20 20 20 20 20 20 20 20  sult;           
4c70: 20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 6d     /* Start of m
4c80: 65 6d 6f 72 79 20 68 6f 6c 64 69 6e 67 20 72 65  emory holding re
4c90: 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 69 6e  sult set */.  in
4ca0: 74 20 65 44 65 73 74 20 3d 20 70 44 65 73 74 2d  t eDest = pDest-
4cb0: 3e 65 44 65 73 74 3b 20 20 20 2f 2a 20 48 6f 77  >eDest;   /* How
4cc0: 20 74 6f 20 64 69 73 70 6f 73 65 20 6f 66 20 72   to dispose of r
4cd0: 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20  esults */.  int 
4ce0: 69 50 61 72 6d 20 3d 20 70 44 65 73 74 2d 3e 69  iParm = pDest->i
4cf0: 53 44 50 61 72 6d 3b 20 2f 2a 20 46 69 72 73 74  SDParm; /* First
4d00: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 64 69 73   argument to dis
4d10: 70 6f 73 61 6c 20 6d 65 74 68 6f 64 20 2a 2f 0a  posal method */.
4d20: 20 20 69 6e 74 20 6e 52 65 73 75 6c 74 43 6f 6c    int nResultCol
4d30: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
4d40: 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c   Number of resul
4d50: 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 0a 20 20  t columns */..  
4d60: 61 73 73 65 72 74 28 20 76 20 29 3b 0a 20 20 69  assert( v );.  i
4d70: 66 28 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 29  f( NEVER(v==0) )
4d80: 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72   return;.  asser
4d90: 74 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a  t( pEList!=0 );.
4da0: 20 20 68 61 73 44 69 73 74 69 6e 63 74 20 3d 20    hasDistinct = 
4db0: 70 44 69 73 74 69 6e 63 74 20 3f 20 70 44 69 73  pDistinct ? pDis
4dc0: 74 69 6e 63 74 2d 3e 65 54 6e 63 74 54 79 70 65  tinct->eTnctType
4dd0: 20 3a 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43   : WHERE_DISTINC
4de0: 54 5f 4e 4f 4f 50 3b 0a 20 20 69 66 28 20 70 4f  T_NOOP;.  if( pO
4df0: 72 64 65 72 42 79 3d 3d 30 20 26 26 20 21 68 61  rderBy==0 && !ha
4e00: 73 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20  sDistinct ){.   
4e10: 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70   codeOffset(v, p
4e20: 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20  , iContinue);.  
4e30: 7d 0a 0a 20 20 2f 2a 20 50 75 6c 6c 20 74 68 65  }..  /* Pull the
4e40: 20 72 65 71 75 65 73 74 65 64 20 63 6f 6c 75 6d   requested colum
4e50: 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e  ns..  */.  if( n
4e60: 43 6f 6c 75 6d 6e 3e 30 20 29 7b 0a 20 20 20 20  Column>0 ){.    
4e70: 6e 52 65 73 75 6c 74 43 6f 6c 20 3d 20 6e 43 6f  nResultCol = nCo
4e80: 6c 75 6d 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  lumn;.  }else{. 
4e90: 20 20 20 6e 52 65 73 75 6c 74 43 6f 6c 20 3d 20     nResultCol = 
4ea0: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20  pEList->nExpr;. 
4eb0: 20 7d 0a 20 20 69 66 28 20 70 44 65 73 74 2d 3e   }.  if( pDest->
4ec0: 69 53 64 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  iSdst==0 ){.    
4ed0: 70 44 65 73 74 2d 3e 69 53 64 73 74 20 3d 20 70  pDest->iSdst = p
4ee0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20  Parse->nMem+1;. 
4ef0: 20 20 20 70 44 65 73 74 2d 3e 6e 53 64 73 74 20     pDest->nSdst 
4f00: 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20  = nResultCol;.  
4f10: 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
4f20: 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20  = nResultCol;.  
4f30: 7d 65 6c 73 65 7b 20 0a 20 20 20 20 61 73 73 65  }else{ .    asse
4f40: 72 74 28 20 70 44 65 73 74 2d 3e 6e 53 64 73 74  rt( pDest->nSdst
4f50: 3d 3d 6e 52 65 73 75 6c 74 43 6f 6c 20 29 3b 0a  ==nResultCol );.
4f60: 20 20 7d 0a 20 20 72 65 67 52 65 73 75 6c 74 20    }.  regResult 
4f70: 3d 20 70 44 65 73 74 2d 3e 69 53 64 73 74 3b 0a  = pDest->iSdst;.
4f80: 20 20 69 66 28 20 6e 43 6f 6c 75 6d 6e 3e 30 20    if( nColumn>0 
4f90: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
4fa0: 69 3c 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b  i<nColumn; i++){
4fb0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
4fc0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
4fd0: 6f 6c 75 6d 6e 2c 20 73 72 63 54 61 62 2c 20 69  olumn, srcTab, i
4fe0: 2c 20 72 65 67 52 65 73 75 6c 74 2b 69 29 3b 0a  , regResult+i);.
4ff0: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
5000: 28 20 65 44 65 73 74 21 3d 53 52 54 5f 45 78 69  ( eDest!=SRT_Exi
5010: 73 74 73 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  sts ){.    /* If
5020: 20 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e   the destination
5030: 20 69 73 20 61 6e 20 45 58 49 53 54 53 28 2e 2e   is an EXISTS(..
5040: 2e 29 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74  .) expression, t
5050: 68 65 20 61 63 74 75 61 6c 0a 20 20 20 20 2a 2a  he actual.    **
5060: 20 76 61 6c 75 65 73 20 72 65 74 75 72 6e 65 64   values returned
5070: 20 62 79 20 74 68 65 20 53 45 4c 45 43 54 20 61   by the SELECT a
5080: 72 65 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e  re not required.
5090: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
50a0: 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61  te3ExprCacheClea
50b0: 72 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 73  r(pParse);.    s
50c0: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78  qlite3ExprCodeEx
50d0: 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
50e0: 45 4c 69 73 74 2c 20 72 65 67 52 65 73 75 6c 74  EList, regResult
50f0: 2c 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74  , eDest==SRT_Out
5100: 70 75 74 29 3b 0a 20 20 7d 0a 20 20 6e 43 6f 6c  put);.  }.  nCol
5110: 75 6d 6e 20 3d 20 6e 52 65 73 75 6c 74 43 6f 6c  umn = nResultCol
5120: 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 44  ;..  /* If the D
5130: 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20  ISTINCT keyword 
5140: 77 61 73 20 70 72 65 73 65 6e 74 20 6f 6e 20 74  was present on t
5150: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
5160: 65 6e 74 0a 20 20 2a 2a 20 61 6e 64 20 74 68 69  ent.  ** and thi
5170: 73 20 72 6f 77 20 68 61 73 20 62 65 65 6e 20 73  s row has been s
5180: 65 65 6e 20 62 65 66 6f 72 65 2c 20 74 68 65 6e  een before, then
5190: 20 64 6f 20 6e 6f 74 20 6d 61 6b 65 20 74 68 69   do not make thi
51a0: 73 20 72 6f 77 0a 20 20 2a 2a 20 70 61 72 74 20  s row.  ** part 
51b0: 6f 66 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 20  of the result.. 
51c0: 20 2a 2f 0a 20 20 69 66 28 20 68 61 73 44 69 73   */.  if( hasDis
51d0: 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 61 73 73  tinct ){.    ass
51e0: 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20 29  ert( pEList!=0 )
51f0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45  ;.    assert( pE
5200: 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 6e 43 6f  List->nExpr==nCo
5210: 6c 75 6d 6e 20 29 3b 0a 20 20 20 20 73 77 69 74  lumn );.    swit
5220: 63 68 28 20 70 44 69 73 74 69 6e 63 74 2d 3e 65  ch( pDistinct->e
5230: 54 6e 63 74 54 79 70 65 20 29 7b 0a 20 20 20 20  TnctType ){.    
5240: 20 20 63 61 73 65 20 57 48 45 52 45 5f 44 49 53    case WHERE_DIS
5250: 54 49 4e 43 54 5f 4f 52 44 45 52 45 44 3a 20 7b  TINCT_ORDERED: {
5260: 0a 20 20 20 20 20 20 20 20 56 64 62 65 4f 70 20  .        VdbeOp 
5270: 2a 70 4f 70 3b 20 20 20 20 20 20 20 20 20 20 20  *pOp;           
5280: 20 2f 2a 20 4e 6f 20 6c 6f 6e 67 65 72 20 72 65   /* No longer re
5290: 71 75 69 72 65 64 20 4f 70 65 6e 45 70 68 65 6d  quired OpenEphem
52a0: 65 72 61 6c 20 69 6e 73 74 72 2e 20 2a 2f 0a 20  eral instr. */. 
52b0: 20 20 20 20 20 20 20 69 6e 74 20 69 4a 75 6d 70         int iJump
52c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
52d0: 2a 20 4a 75 6d 70 20 64 65 73 74 69 6e 61 74 69  * Jump destinati
52e0: 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  on */.        in
52f0: 74 20 72 65 67 50 72 65 76 3b 20 20 20 20 20 20  t regPrev;      
5300: 20 20 20 20 20 20 2f 2a 20 50 72 65 76 69 6f 75        /* Previou
5310: 73 20 72 6f 77 20 63 6f 6e 74 65 6e 74 20 2a 2f  s row content */
5320: 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c  ..        /* All
5330: 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20  ocate space for 
5340: 74 68 65 20 70 72 65 76 69 6f 75 73 20 72 6f 77  the previous row
5350: 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 67 50   */.        regP
5360: 72 65 76 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  rev = pParse->nM
5370: 65 6d 2b 31 3b 0a 20 20 20 20 20 20 20 20 70 50  em+1;.        pP
5380: 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 43  arse->nMem += nC
5390: 6f 6c 75 6d 6e 3b 0a 0a 20 20 20 20 20 20 20 20  olumn;..        
53a0: 2f 2a 20 43 68 61 6e 67 65 20 74 68 65 20 4f 50  /* Change the OP
53b0: 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 63  _OpenEphemeral c
53c0: 6f 64 65 64 20 65 61 72 6c 69 65 72 20 74 6f 20  oded earlier to 
53d0: 61 6e 20 4f 50 5f 4e 75 6c 6c 0a 20 20 20 20 20  an OP_Null.     
53e0: 20 20 20 2a 2a 20 73 65 74 73 20 74 68 65 20 4d     ** sets the M
53f0: 45 4d 5f 43 6c 65 61 72 65 64 20 62 69 74 20 6f  EM_Cleared bit o
5400: 6e 20 74 68 65 20 66 69 72 73 74 20 72 65 67 69  n the first regi
5410: 73 74 65 72 20 6f 66 20 74 68 65 0a 20 20 20 20  ster of the.    
5420: 20 20 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 20      ** previous 
5430: 76 61 6c 75 65 2e 20 20 54 68 69 73 20 77 69 6c  value.  This wil
5440: 6c 20 63 61 75 73 65 20 74 68 65 20 4f 50 5f 4e  l cause the OP_N
5450: 65 20 62 65 6c 6f 77 20 74 6f 20 61 6c 77 61 79  e below to alway
5460: 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 61 69  s.        ** fai
5470: 6c 20 6f 6e 20 74 68 65 20 66 69 72 73 74 20 69  l on the first i
5480: 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  teration of the 
5490: 6c 6f 6f 70 20 65 76 65 6e 20 69 66 20 74 68 65  loop even if the
54a0: 20 66 69 72 73 74 0a 20 20 20 20 20 20 20 20 2a   first.        *
54b0: 2a 20 72 6f 77 20 69 73 20 61 6c 6c 20 4e 55 4c  * row is all NUL
54c0: 4c 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  Ls..        */. 
54d0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
54e0: 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76  beChangeToNoop(v
54f0: 2c 20 70 44 69 73 74 69 6e 63 74 2d 3e 61 64 64  , pDistinct->add
5500: 72 54 6e 63 74 29 3b 0a 20 20 20 20 20 20 20 20  rTnct);.        
5510: 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  pOp = sqlite3Vdb
5520: 65 47 65 74 4f 70 28 76 2c 20 70 44 69 73 74 69  eGetOp(v, pDisti
5530: 6e 63 74 2d 3e 61 64 64 72 54 6e 63 74 29 3b 0a  nct->addrTnct);.
5540: 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63          pOp->opc
5550: 6f 64 65 20 3d 20 4f 50 5f 4e 75 6c 6c 3b 0a 20  ode = OP_Null;. 
5560: 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d         pOp->p1 =
5570: 20 31 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d   1;.        pOp-
5580: 3e 70 32 20 3d 20 72 65 67 50 72 65 76 3b 0a 0a  >p2 = regPrev;..
5590: 20 20 20 20 20 20 20 20 69 4a 75 6d 70 20 3d 20          iJump = 
55a0: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
55b0: 6e 74 41 64 64 72 28 76 29 20 2b 20 6e 43 6f 6c  ntAddr(v) + nCol
55c0: 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  umn;.        for
55d0: 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 75 6d 6e 3b  (i=0; i<nColumn;
55e0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
55f0: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20   CollSeq *pColl 
5600: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
5610: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 45 4c  lSeq(pParse, pEL
5620: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  ist->a[i].pExpr)
5630: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
5640: 69 3c 6e 43 6f 6c 75 6d 6e 2d 31 20 29 7b 0a 20  i<nColumn-1 ){. 
5650: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
5660: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
5670: 4f 50 5f 4e 65 2c 20 72 65 67 52 65 73 75 6c 74  OP_Ne, regResult
5680: 2b 69 2c 20 69 4a 75 6d 70 2c 20 72 65 67 50 72  +i, iJump, regPr
5690: 65 76 2b 69 29 3b 0a 20 20 20 20 20 20 20 20 20  ev+i);.         
56a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
56b0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
56c0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 45 71 2c 20  ddOp3(v, OP_Eq, 
56d0: 72 65 67 52 65 73 75 6c 74 2b 69 2c 20 69 43 6f  regResult+i, iCo
56e0: 6e 74 69 6e 75 65 2c 20 72 65 67 50 72 65 76 2b  ntinue, regPrev+
56f0: 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  i);.          }.
5700: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
5710: 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c  3VdbeChangeP4(v,
5720: 20 2d 31 2c 20 28 63 6f 6e 73 74 20 63 68 61 72   -1, (const char
5730: 20 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c   *)pColl, P4_COL
5740: 4c 53 45 51 29 3b 0a 20 20 20 20 20 20 20 20 20  LSEQ);.         
5750: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
5760: 67 65 50 35 28 76 2c 20 53 51 4c 49 54 45 5f 4e  geP5(v, SQLITE_N
5770: 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 20 20  ULLEQ);.        
5780: 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  }.        assert
5790: 28 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  ( sqlite3VdbeCur
57a0: 72 65 6e 74 41 64 64 72 28 76 29 3d 3d 69 4a 75  rentAddr(v)==iJu
57b0: 6d 70 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  mp );.        sq
57c0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
57d0: 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 65 67 52  v, OP_Copy, regR
57e0: 65 73 75 6c 74 2c 20 72 65 67 50 72 65 76 2c 20  esult, regPrev, 
57f0: 6e 43 6f 6c 75 6d 6e 2d 31 29 3b 0a 20 20 20 20  nColumn-1);.    
5800: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
5810: 20 7d 0a 0a 20 20 20 20 20 20 63 61 73 65 20 57   }..      case W
5820: 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e  HERE_DISTINCT_UN
5830: 49 51 55 45 3a 20 7b 0a 20 20 20 20 20 20 20 20  IQUE: {.        
5840: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
5850: 65 54 6f 4e 6f 6f 70 28 76 2c 20 70 44 69 73 74  eToNoop(v, pDist
5860: 69 6e 63 74 2d 3e 61 64 64 72 54 6e 63 74 29 3b  inct->addrTnct);
5870: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
5880: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 64        }..      d
5890: 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
58a0: 20 20 61 73 73 65 72 74 28 20 70 44 69 73 74 69    assert( pDisti
58b0: 6e 63 74 2d 3e 65 54 6e 63 74 54 79 70 65 3d 3d  nct->eTnctType==
58c0: 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55  WHERE_DISTINCT_U
58d0: 4e 4f 52 44 45 52 45 44 20 29 3b 0a 20 20 20 20  NORDERED );.    
58e0: 20 20 20 20 63 6f 64 65 44 69 73 74 69 6e 63 74      codeDistinct
58f0: 28 70 50 61 72 73 65 2c 20 70 44 69 73 74 69 6e  (pParse, pDistin
5900: 63 74 2d 3e 74 61 62 54 6e 63 74 2c 20 69 43 6f  ct->tabTnct, iCo
5910: 6e 74 69 6e 75 65 2c 20 6e 43 6f 6c 75 6d 6e 2c  ntinue, nColumn,
5920: 20 72 65 67 52 65 73 75 6c 74 29 3b 0a 20 20 20   regResult);.   
5930: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
5940: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
5950: 28 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b  ( pOrderBy==0 ){
5960: 0a 20 20 20 20 20 20 63 6f 64 65 4f 66 66 73 65  .      codeOffse
5970: 74 28 76 2c 20 70 2c 20 69 43 6f 6e 74 69 6e 75  t(v, p, iContinu
5980: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  e);.    }.  }.. 
5990: 20 73 77 69 74 63 68 28 20 65 44 65 73 74 20 29   switch( eDest )
59a0: 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73  {.    /* In this
59b0: 20 6d 6f 64 65 2c 20 77 72 69 74 65 20 65 61 63   mode, write eac
59c0: 68 20 71 75 65 72 79 20 72 65 73 75 6c 74 20 74  h query result t
59d0: 6f 20 74 68 65 20 6b 65 79 20 6f 66 20 74 68 65  o the key of the
59e0: 20 74 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 2a   temporary.    *
59f0: 2a 20 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a 20  * table iParm.. 
5a00: 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51     */.#ifndef SQ
5a10: 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
5a20: 4e 44 5f 53 45 4c 45 43 54 0a 20 20 20 20 63 61  ND_SELECT.    ca
5a30: 73 65 20 53 52 54 5f 55 6e 69 6f 6e 3a 20 7b 0a  se SRT_Union: {.
5a40: 20 20 20 20 20 20 69 6e 74 20 72 31 3b 0a 20 20        int r1;.  
5a50: 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
5a60: 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
5a70: 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
5a80: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
5a90: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65  P_MakeRecord, re
5aa0: 67 52 65 73 75 6c 74 2c 20 6e 43 6f 6c 75 6d 6e  gResult, nColumn
5ab0: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  , r1);.      sql
5ac0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
5ad0: 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20  , OP_IdxInsert, 
5ae0: 69 50 61 72 6d 2c 20 72 31 29 3b 0a 20 20 20 20  iParm, r1);.    
5af0: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
5b00: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
5b10: 72 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  r1);.      break
5b20: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
5b30: 43 6f 6e 73 74 72 75 63 74 20 61 20 72 65 63 6f  Construct a reco
5b40: 72 64 20 66 72 6f 6d 20 74 68 65 20 71 75 65 72  rd from the quer
5b50: 79 20 72 65 73 75 6c 74 2c 20 62 75 74 20 69 6e  y result, but in
5b60: 73 74 65 61 64 20 6f 66 0a 20 20 20 20 2a 2a 20  stead of.    ** 
5b70: 73 61 76 69 6e 67 20 74 68 61 74 20 72 65 63 6f  saving that reco
5b80: 72 64 2c 20 75 73 65 20 69 74 20 61 73 20 61 20  rd, use it as a 
5b90: 6b 65 79 20 74 6f 20 64 65 6c 65 74 65 20 65 6c  key to delete el
5ba0: 65 6d 65 6e 74 73 20 66 72 6f 6d 0a 20 20 20 20  ements from.    
5bb0: 2a 2a 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  ** the temporary
5bc0: 20 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a 20 20   table iParm..  
5bd0: 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52    */.    case SR
5be0: 54 5f 45 78 63 65 70 74 3a 20 7b 0a 20 20 20 20  T_Except: {.    
5bf0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
5c00: 4f 70 33 28 76 2c 20 4f 50 5f 49 64 78 44 65 6c  Op3(v, OP_IdxDel
5c10: 65 74 65 2c 20 69 50 61 72 6d 2c 20 72 65 67 52  ete, iParm, regR
5c20: 65 73 75 6c 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b  esult, nColumn);
5c30: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
5c40: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
5c50: 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 72 65 73  /* Store the res
5c60: 75 6c 74 20 61 73 20 64 61 74 61 20 75 73 69 6e  ult as data usin
5c70: 67 20 61 20 75 6e 69 71 75 65 20 6b 65 79 2e 0a  g a unique key..
5c80: 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
5c90: 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20 20 63  SRT_Table:.    c
5ca0: 61 73 65 20 53 52 54 5f 45 70 68 65 6d 54 61 62  ase SRT_EphemTab
5cb0: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31  : {.      int r1
5cc0: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
5cd0: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
5ce0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44      testcase( eD
5cf0: 65 73 74 3d 3d 53 52 54 5f 54 61 62 6c 65 20 29  est==SRT_Table )
5d00: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
5d10: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 45 70 68  ( eDest==SRT_Eph
5d20: 65 6d 54 61 62 20 29 3b 0a 20 20 20 20 20 20 73  emTab );.      s
5d30: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
5d40: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
5d50: 64 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 43  d, regResult, nC
5d60: 6f 6c 75 6d 6e 2c 20 72 31 29 3b 0a 20 20 20 20  olumn, r1);.    
5d70: 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29    if( pOrderBy )
5d80: 7b 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e  {.        pushOn
5d90: 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c  toSorter(pParse,
5da0: 20 70 4f 72 64 65 72 42 79 2c 20 70 2c 20 72 31   pOrderBy, p, r1
5db0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
5dc0: 20 20 20 20 20 20 20 20 69 6e 74 20 72 32 20 3d          int r2 =
5dd0: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
5de0: 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
5df0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
5e00: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52  ddOp2(v, OP_NewR
5e10: 6f 77 69 64 2c 20 69 50 61 72 6d 2c 20 72 32 29  owid, iParm, r2)
5e20: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
5e30: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
5e40: 50 5f 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c  P_Insert, iParm,
5e50: 20 72 31 2c 20 72 32 29 3b 0a 20 20 20 20 20 20   r1, r2);.      
5e60: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
5e70: 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f  ngeP5(v, OPFLAG_
5e80: 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 20 20 20  APPEND);.       
5e90: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
5ea0: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
5eb0: 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  2);.      }.    
5ec0: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
5ed0: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
5ee0: 72 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  r1);.      break
5ef0: 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66  ;.    }..#ifndef
5f00: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
5f10: 51 55 45 52 59 0a 20 20 20 20 2f 2a 20 49 66 20  QUERY.    /* If 
5f20: 77 65 20 61 72 65 20 63 72 65 61 74 69 6e 67 20  we are creating 
5f30: 61 20 73 65 74 20 66 6f 72 20 61 6e 20 22 65 78  a set for an "ex
5f40: 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e  pr IN (SELECT ..
5f50: 2e 29 22 20 63 6f 6e 73 74 72 75 63 74 2c 0a 20  .)" construct,. 
5f60: 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65     ** then there
5f70: 20 73 68 6f 75 6c 64 20 62 65 20 61 20 73 69 6e   should be a sin
5f80: 67 6c 65 20 69 74 65 6d 20 6f 6e 20 74 68 65 20  gle item on the 
5f90: 73 74 61 63 6b 2e 20 20 57 72 69 74 65 20 74 68  stack.  Write th
5fa0: 69 73 0a 20 20 20 20 2a 2a 20 69 74 65 6d 20 69  is.    ** item i
5fb0: 6e 74 6f 20 74 68 65 20 73 65 74 20 74 61 62 6c  nto the set tabl
5fc0: 65 20 77 69 74 68 20 62 6f 67 75 73 20 64 61 74  e with bogus dat
5fd0: 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  a..    */.    ca
5fe0: 73 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20  se SRT_Set: {.  
5ff0: 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c      assert( nCol
6000: 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  umn==1 );.      
6010: 70 44 65 73 74 2d 3e 61 66 66 53 64 73 74 20 3d  pDest->affSdst =
6020: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
6030: 20 20 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72     sqlite3Compar
6040: 65 41 66 66 69 6e 69 74 79 28 70 45 4c 69 73 74  eAffinity(pEList
6050: 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20 70 44  ->a[0].pExpr, pD
6060: 65 73 74 2d 3e 61 66 66 53 64 73 74 29 3b 0a 20  est->affSdst);. 
6070: 20 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42       if( pOrderB
6080: 79 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  y ){.        /* 
6090: 41 74 20 66 69 72 73 74 20 67 6c 61 6e 63 65 20  At first glance 
60a0: 79 6f 75 20 77 6f 75 6c 64 20 74 68 69 6e 6b 20  you would think 
60b0: 77 65 20 63 6f 75 6c 64 20 6f 70 74 69 6d 69 7a  we could optimiz
60c0: 65 20 6f 75 74 20 74 68 65 0a 20 20 20 20 20 20  e out the.      
60d0: 20 20 2a 2a 20 4f 52 44 45 52 20 42 59 20 69 6e    ** ORDER BY in
60e0: 20 74 68 69 73 20 63 61 73 65 20 73 69 6e 63 65   this case since
60f0: 20 74 68 65 20 6f 72 64 65 72 20 6f 66 20 65 6e   the order of en
6100: 74 72 69 65 73 20 69 6e 20 74 68 65 20 73 65 74  tries in the set
6110: 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 6f 65 73  .        ** does
6120: 20 6e 6f 74 20 6d 61 74 74 65 72 2e 20 20 42 75   not matter.  Bu
6130: 74 20 74 68 65 72 65 20 6d 69 67 68 74 20 62 65  t there might be
6140: 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 2c   a LIMIT clause,
6150: 20 69 6e 20 77 68 69 63 68 0a 20 20 20 20 20 20   in which.      
6160: 20 20 2a 2a 20 63 61 73 65 20 74 68 65 20 6f 72    ** case the or
6170: 64 65 72 20 64 6f 65 73 20 6d 61 74 74 65 72 20  der does matter 
6180: 2a 2f 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f  */.        pushO
6190: 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65  ntoSorter(pParse
61a0: 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 2c 20 72  , pOrderBy, p, r
61b0: 65 67 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 20  egResult);.     
61c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
61d0: 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33  int r1 = sqlite3
61e0: 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
61f0: 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  e);.        sqli
6200: 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
6210: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
6220: 72 65 67 52 65 73 75 6c 74 2c 31 2c 72 31 2c 20  regResult,1,r1, 
6230: 26 70 44 65 73 74 2d 3e 61 66 66 53 64 73 74 2c  &pDest->affSdst,
6240: 20 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   1);.        sql
6250: 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66  ite3ExprCacheAff
6260: 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72  inityChange(pPar
6270: 73 65 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 31  se, regResult, 1
6280: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
6290: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
62a0: 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50  OP_IdxInsert, iP
62b0: 61 72 6d 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  arm, r1);.      
62c0: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
62d0: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
62e0: 72 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  r1);.      }.   
62f0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
6300: 0a 20 20 20 20 2f 2a 20 49 66 20 61 6e 79 20 72  .    /* If any r
6310: 6f 77 20 65 78 69 73 74 20 69 6e 20 74 68 65 20  ow exist in the 
6320: 72 65 73 75 6c 74 20 73 65 74 2c 20 72 65 63 6f  result set, reco
6330: 72 64 20 74 68 61 74 20 66 61 63 74 20 61 6e 64  rd that fact and
6340: 20 61 62 6f 72 74 2e 0a 20 20 20 20 2a 2f 0a 20   abort..    */. 
6350: 20 20 20 63 61 73 65 20 53 52 54 5f 45 78 69 73     case SRT_Exis
6360: 74 73 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  ts: {.      sqli
6370: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
6380: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20   OP_Integer, 1, 
6390: 69 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 2f 2a  iParm);.      /*
63a0: 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73   The LIMIT claus
63b0: 65 20 77 69 6c 6c 20 74 65 72 6d 69 6e 61 74 65  e will terminate
63c0: 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73   the loop for us
63d0: 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   */.      break;
63e0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
63f0: 66 20 74 68 69 73 20 69 73 20 61 20 73 63 61 6c  f this is a scal
6400: 61 72 20 73 65 6c 65 63 74 20 74 68 61 74 20 69  ar select that i
6410: 73 20 70 61 72 74 20 6f 66 20 61 6e 20 65 78 70  s part of an exp
6420: 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e 0a 20 20  ression, then.  
6430: 20 20 2a 2a 20 73 74 6f 72 65 20 74 68 65 20 72    ** store the r
6440: 65 73 75 6c 74 73 20 69 6e 20 74 68 65 20 61 70  esults in the ap
6450: 70 72 6f 70 72 69 61 74 65 20 6d 65 6d 6f 72 79  propriate memory
6460: 20 63 65 6c 6c 20 61 6e 64 20 62 72 65 61 6b 20   cell and break 
6470: 6f 75 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68  out.    ** of th
6480: 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20  e scan loop..   
6490: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
64a0: 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73  _Mem: {.      as
64b0: 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31  sert( nColumn==1
64c0: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f   );.      if( pO
64d0: 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
64e0: 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72    pushOntoSorter
64f0: 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42  (pParse, pOrderB
6500: 79 2c 20 70 2c 20 72 65 67 52 65 73 75 6c 74 29  y, p, regResult)
6510: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
6520: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
6530: 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73  prCodeMove(pPars
6540: 65 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 69 50  e, regResult, iP
6550: 61 72 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  arm, 1);.       
6560: 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c   /* The LIMIT cl
6570: 61 75 73 65 20 77 69 6c 6c 20 6a 75 6d 70 20 6f  ause will jump o
6580: 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 66  ut of the loop f
6590: 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 7d  or us */.      }
65a0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
65b0: 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69    }.#endif /* #i
65c0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
65d0: 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 20  T_SUBQUERY */.. 
65e0: 20 20 20 2f 2a 20 53 65 6e 64 20 74 68 65 20 64     /* Send the d
65f0: 61 74 61 20 74 6f 20 74 68 65 20 63 61 6c 6c 62  ata to the callb
6600: 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 6f 72 20  ack function or 
6610: 74 6f 20 61 20 73 75 62 72 6f 75 74 69 6e 65 2e  to a subroutine.
6620: 20 20 49 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20    In the.    ** 
6630: 63 61 73 65 20 6f 66 20 61 20 73 75 62 72 6f 75  case of a subrou
6640: 74 69 6e 65 2c 20 74 68 65 20 73 75 62 72 6f 75  tine, the subrou
6650: 74 69 6e 65 20 69 74 73 65 6c 66 20 69 73 20 72  tine itself is r
6660: 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 0a 20  esponsible for. 
6670: 20 20 20 2a 2a 20 70 6f 70 70 69 6e 67 20 74 68     ** popping th
6680: 65 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20  e data from the 
6690: 73 74 61 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20  stack..    */.  
66a0: 20 20 63 61 73 65 20 53 52 54 5f 43 6f 72 6f 75    case SRT_Corou
66b0: 74 69 6e 65 3a 0a 20 20 20 20 63 61 73 65 20 53  tine:.    case S
66c0: 52 54 5f 4f 75 74 70 75 74 3a 20 7b 0a 20 20 20  RT_Output: {.   
66d0: 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65     testcase( eDe
66e0: 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e  st==SRT_Coroutin
66f0: 65 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  e );.      testc
6700: 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f  ase( eDest==SRT_
6710: 4f 75 74 70 75 74 20 29 3b 0a 20 20 20 20 20 20  Output );.      
6720: 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a  if( pOrderBy ){.
6730: 20 20 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d          int r1 =
6740: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
6750: 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
6760: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
6770: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp3(v, OP_Make
6780: 52 65 63 6f 72 64 2c 20 72 65 67 52 65 73 75 6c  Record, regResul
6790: 74 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 72 31 29 3b  t, nColumn, r1);
67a0: 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74  .        pushOnt
67b0: 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20  oSorter(pParse, 
67c0: 70 4f 72 64 65 72 42 79 2c 20 70 2c 20 72 31 29  pOrderBy, p, r1)
67d0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
67e0: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
67f0: 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20  pParse, r1);.   
6800: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 44 65     }else if( eDe
6810: 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e  st==SRT_Coroutin
6820: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  e ){.        sql
6830: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
6840: 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 70 44 65 73  , OP_Yield, pDes
6850: 74 2d 3e 69 53 44 50 61 72 6d 29 3b 0a 20 20 20  t->iSDParm);.   
6860: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
6870: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6880: 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74  Op2(v, OP_Result
6890: 52 6f 77 2c 20 72 65 67 52 65 73 75 6c 74 2c 20  Row, regResult, 
68a0: 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20  nColumn);.      
68b0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
68c0: 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  heAffinityChange
68d0: 28 70 50 61 72 73 65 2c 20 72 65 67 52 65 73 75  (pParse, regResu
68e0: 6c 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20  lt, nColumn);.  
68f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
6900: 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20 21 64  k;.    }..#if !d
6910: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
6920: 49 54 5f 54 52 49 47 47 45 52 29 0a 20 20 20 20  IT_TRIGGER).    
6930: 2f 2a 20 44 69 73 63 61 72 64 20 74 68 65 20 72  /* Discard the r
6940: 65 73 75 6c 74 73 2e 20 20 54 68 69 73 20 69 73  esults.  This is
6950: 20 75 73 65 64 20 66 6f 72 20 53 45 4c 45 43 54   used for SELECT
6960: 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 73 69   statements insi
6970: 64 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 62 6f  de.    ** the bo
6980: 64 79 20 6f 66 20 61 20 54 52 49 47 47 45 52 2e  dy of a TRIGGER.
6990: 20 20 54 68 65 20 70 75 72 70 6f 73 65 20 6f 66    The purpose of
69a0: 20 73 75 63 68 20 73 65 6c 65 63 74 73 20 69 73   such selects is
69b0: 20 74 6f 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20   to call.    ** 
69c0: 75 73 65 72 2d 64 65 66 69 6e 65 64 20 66 75 6e  user-defined fun
69d0: 63 74 69 6f 6e 73 20 74 68 61 74 20 68 61 76 65  ctions that have
69e0: 20 73 69 64 65 20 65 66 66 65 63 74 73 2e 20 20   side effects.  
69f0: 57 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 0a 20  We do not care. 
6a00: 20 20 20 2a 2a 20 61 62 6f 75 74 20 74 68 65 20     ** about the 
6a10: 61 63 74 75 61 6c 20 72 65 73 75 6c 74 73 20 6f  actual results o
6a20: 66 20 74 68 65 20 73 65 6c 65 63 74 2e 0a 20 20  f the select..  
6a30: 20 20 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c 74    */.    default
6a40: 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
6a50: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73  ( eDest==SRT_Dis
6a60: 63 61 72 64 20 29 3b 0a 20 20 20 20 20 20 62 72  card );.      br
6a70: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
6a80: 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70  f.  }..  /* Jump
6a90: 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74   to the end of t
6aa0: 68 65 20 6c 6f 6f 70 20 69 66 20 74 68 65 20 4c  he loop if the L
6ab0: 49 4d 49 54 20 69 73 20 72 65 61 63 68 65 64 2e  IMIT is reached.
6ac0: 20 20 45 78 63 65 70 74 2c 20 69 66 0a 20 20 2a    Except, if.  *
6ad0: 2a 20 74 68 65 72 65 20 69 73 20 61 20 73 6f 72  * there is a sor
6ae0: 74 65 72 2c 20 69 6e 20 77 68 69 63 68 20 63 61  ter, in which ca
6af0: 73 65 20 74 68 65 20 73 6f 72 74 65 72 20 68 61  se the sorter ha
6b00: 73 20 61 6c 72 65 61 64 79 20 6c 69 6d 69 74 65  s already limite
6b10: 64 0a 20 20 2a 2a 20 74 68 65 20 6f 75 74 70 75  d.  ** the outpu
6b20: 74 20 66 6f 72 20 75 73 2e 0a 20 20 2a 2f 0a 20  t for us..  */. 
6b30: 20 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d 30   if( pOrderBy==0
6b40: 20 26 26 20 70 2d 3e 69 4c 69 6d 69 74 20 29 7b   && p->iLimit ){
6b50: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
6b60: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 5a  AddOp3(v, OP_IfZ
6b70: 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20  ero, p->iLimit, 
6b80: 69 42 72 65 61 6b 2c 20 2d 31 29 3b 0a 20 20 7d  iBreak, -1);.  }
6b90: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  .}../*.** Given 
6ba0: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  an expression li
6bb0: 73 74 2c 20 67 65 6e 65 72 61 74 65 20 61 20 4b  st, generate a K
6bc0: 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
6bd0: 20 74 68 61 74 20 72 65 63 6f 72 64 73 0a 2a 2a   that records.**
6be0: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73   the collating s
6bf0: 65 71 75 65 6e 63 65 20 66 6f 72 20 65 61 63 68  equence for each
6c00: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 74   expression in t
6c10: 68 61 74 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  hat expression l
6c20: 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ist..**.** If th
6c30: 65 20 45 78 70 72 4c 69 73 74 20 69 73 20 61 6e  e ExprList is an
6c40: 20 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f   ORDER BY or GRO
6c50: 55 50 20 42 59 20 63 6c 61 75 73 65 20 74 68 65  UP BY clause the
6c60: 6e 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67 0a  n the resulting.
6c70: 2a 2a 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63  ** KeyInfo struc
6c80: 74 75 72 65 20 69 73 20 61 70 70 72 6f 70 72 69  ture is appropri
6c90: 61 74 65 20 66 6f 72 20 69 6e 69 74 69 61 6c 69  ate for initiali
6ca0: 7a 69 6e 67 20 61 20 76 69 72 74 75 61 6c 20 69  zing a virtual i
6cb0: 6e 64 65 78 20 74 6f 0a 2a 2a 20 69 6d 70 6c 65  ndex to.** imple
6cc0: 6d 65 6e 74 20 74 68 61 74 20 63 6c 61 75 73 65  ment that clause
6cd0: 2e 20 20 49 66 20 74 68 65 20 45 78 70 72 4c 69  .  If the ExprLi
6ce0: 73 74 20 69 73 20 74 68 65 20 72 65 73 75 6c 74  st is the result
6cf0: 20 73 65 74 20 6f 66 20 61 20 53 45 4c 45 43 54   set of a SELECT
6d00: 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 4b 65 79  .** then the Key
6d10: 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69  Info structure i
6d20: 73 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f  s appropriate fo
6d30: 72 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 61  r initializing a
6d40: 20 76 69 72 74 75 61 6c 0a 2a 2a 20 69 6e 64 65   virtual.** inde
6d50: 78 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61  x to implement a
6d60: 20 44 49 53 54 49 4e 43 54 20 74 65 73 74 2e 0a   DISTINCT test..
6d70: 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68  **.** Space to h
6d80: 6f 6c 64 20 74 68 65 20 4b 65 79 49 6e 66 6f 20  old the KeyInfo 
6d90: 73 74 72 75 63 74 75 72 65 20 69 73 20 6f 62 74  structure is obt
6da0: 61 69 6e 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e  ain from malloc.
6db0: 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a    The calling.**
6dc0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 73   function is res
6dd0: 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 73 65 65  ponsible for see
6de0: 69 6e 67 20 74 68 61 74 20 74 68 69 73 20 73 74  ing that this st
6df0: 72 75 63 74 75 72 65 20 69 73 20 65 76 65 6e 74  ructure is event
6e00: 75 61 6c 6c 79 0a 2a 2a 20 66 72 65 65 64 2e 20  ually.** freed. 
6e10: 20 41 64 64 20 74 68 65 20 4b 65 79 49 6e 66 6f   Add the KeyInfo
6e20: 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 74 68   structure to th
6e30: 65 20 50 34 20 66 69 65 6c 64 20 6f 66 20 61 6e  e P4 field of an
6e40: 20 6f 70 63 6f 64 65 20 75 73 69 6e 67 0a 2a 2a   opcode using.**
6e50: 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44   P4_KEYINFO_HAND
6e60: 4f 46 46 20 69 73 20 74 68 65 20 75 73 75 61 6c  OFF is the usual
6e70: 20 77 61 79 20 6f 66 20 64 65 61 6c 69 6e 67 20   way of dealing 
6e80: 77 69 74 68 20 74 68 69 73 2e 0a 2a 2f 0a 73 74  with this..*/.st
6e90: 61 74 69 63 20 4b 65 79 49 6e 66 6f 20 2a 6b 65  atic KeyInfo *ke
6ea0: 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73  yInfoFromExprLis
6eb0: 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  t(Parse *pParse,
6ec0: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
6ed0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
6ee0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
6ef0: 20 69 6e 74 20 6e 45 78 70 72 3b 0a 20 20 4b 65   int nExpr;.  Ke
6f00: 79 49 6e 66 6f 20 2a 70 49 6e 66 6f 3b 0a 20 20  yInfo *pInfo;.  
6f10: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
6f20: 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69  item *pItem;.  i
6f30: 6e 74 20 69 3b 0a 0a 20 20 6e 45 78 70 72 20 3d  nt i;..  nExpr =
6f40: 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20   pList->nExpr;. 
6f50: 20 70 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33   pInfo = sqlite3
6f60: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
6f70: 20 73 69 7a 65 6f 66 28 2a 70 49 6e 66 6f 29 20   sizeof(*pInfo) 
6f80: 2b 20 6e 45 78 70 72 2a 28 73 69 7a 65 6f 66 28  + nExpr*(sizeof(
6f90: 43 6f 6c 6c 53 65 71 2a 29 2b 31 29 20 29 3b 0a  CollSeq*)+1) );.
6fa0: 20 20 69 66 28 20 70 49 6e 66 6f 20 29 7b 0a 20    if( pInfo ){. 
6fb0: 20 20 20 70 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f     pInfo->aSortO
6fc0: 72 64 65 72 20 3d 20 28 75 38 2a 29 26 70 49 6e  rder = (u8*)&pIn
6fd0: 66 6f 2d 3e 61 43 6f 6c 6c 5b 6e 45 78 70 72 5d  fo->aColl[nExpr]
6fe0: 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 46 69  ;.    pInfo->nFi
6ff0: 65 6c 64 20 3d 20 28 75 31 36 29 6e 45 78 70 72  eld = (u16)nExpr
7000: 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 65 6e 63  ;.    pInfo->enc
7010: 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20 20 20   = ENC(db);.    
7020: 70 49 6e 66 6f 2d 3e 64 62 20 3d 20 64 62 3b 0a  pInfo->db = db;.
7030: 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 49 74      for(i=0, pIt
7040: 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3c 6e  em=pList->a; i<n
7050: 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d  Expr; i++, pItem
7060: 2b 2b 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53  ++){.      CollS
7070: 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 20  eq *pColl;.     
7080: 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
7090: 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
70a0: 73 65 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72  se, pItem->pExpr
70b0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 43  );.      if( !pC
70c0: 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70  oll ){.        p
70d0: 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74  Coll = db->pDflt
70e0: 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Coll;.      }.  
70f0: 20 20 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 6c      pInfo->aColl
7100: 5b 69 5d 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20  [i] = pColl;.   
7110: 20 20 20 70 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f     pInfo->aSortO
7120: 72 64 65 72 5b 69 5d 20 3d 20 70 49 74 65 6d 2d  rder[i] = pItem-
7130: 3e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20  >sortOrder;.    
7140: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  }.  }.  return p
7150: 49 6e 66 6f 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  Info;.}..#ifndef
7160: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d   SQLITE_OMIT_COM
7170: 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a  POUND_SELECT./*.
7180: 2a 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63  ** Name of the c
7190: 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70 65 72 61 74  onnection operat
71a0: 6f 72 2c 20 75 73 65 64 20 66 6f 72 20 65 72 72  or, used for err
71b0: 6f 72 20 6d 65 73 73 61 67 65 73 2e 0a 2a 2f 0a  or messages..*/.
71c0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
71d0: 72 20 2a 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28  r *selectOpName(
71e0: 69 6e 74 20 69 64 29 7b 0a 20 20 63 68 61 72 20  int id){.  char 
71f0: 2a 7a 3b 0a 20 20 73 77 69 74 63 68 28 20 69 64  *z;.  switch( id
7200: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
7210: 41 4c 4c 3a 20 20 20 20 20 20 20 7a 20 3d 20 22  ALL:       z = "
7220: 55 4e 49 4f 4e 20 41 4c 4c 22 3b 20 20 20 62 72  UNION ALL";   br
7230: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
7240: 5f 49 4e 54 45 52 53 45 43 54 3a 20 7a 20 3d 20  _INTERSECT: z = 
7250: 22 49 4e 54 45 52 53 45 43 54 22 3b 20 20 20 62  "INTERSECT";   b
7260: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
7270: 4b 5f 45 58 43 45 50 54 3a 20 20 20 20 7a 20 3d  K_EXCEPT:    z =
7280: 20 22 45 58 43 45 50 54 22 3b 20 20 20 20 20 20   "EXCEPT";      
7290: 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75  break;.    defau
72a0: 6c 74 3a 20 20 20 20 20 20 20 20 20 20 20 7a 20  lt:           z 
72b0: 3d 20 22 55 4e 49 4f 4e 22 3b 20 20 20 20 20 20  = "UNION";      
72c0: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65   break;.  }.  re
72d0: 74 75 72 6e 20 7a 3b 0a 7d 0a 23 65 6e 64 69 66  turn z;.}.#endif
72e0: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
72f0: 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20  COMPOUND_SELECT 
7300: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
7310: 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a  TE_OMIT_EXPLAIN.
7320: 2f 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 61 6e 20  /*.** Unless an 
7330: 22 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50  "EXPLAIN QUERY P
7340: 4c 41 4e 22 20 63 6f 6d 6d 61 6e 64 20 69 73 20  LAN" command is 
7350: 62 65 69 6e 67 20 70 72 6f 63 65 73 73 65 64 2c  being processed,
7360: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a   this function.*
7370: 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 4f 74  * is a no-op. Ot
7380: 68 65 72 77 69 73 65 2c 20 69 74 20 61 64 64 73  herwise, it adds
7390: 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66   a single row of
73a0: 20 6f 75 74 70 75 74 20 74 6f 20 74 68 65 20 45   output to the E
73b0: 51 50 20 72 65 73 75 6c 74 2c 0a 2a 2a 20 77 68  QP result,.** wh
73c0: 65 72 65 20 74 68 65 20 63 61 70 74 69 6f 6e 20  ere the caption 
73d0: 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a  is of the form:.
73e0: 2a 2a 0a 2a 2a 20 20 20 22 55 53 45 20 54 45 4d  **.**   "USE TEM
73f0: 50 20 42 2d 54 52 45 45 20 46 4f 52 20 78 78 78  P B-TREE FOR xxx
7400: 22 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 78 78  ".**.** where xx
7410: 78 20 69 73 20 6f 6e 65 20 6f 66 20 22 44 49 53  x is one of "DIS
7420: 54 49 4e 43 54 22 2c 20 22 4f 52 44 45 52 20 42  TINCT", "ORDER B
7430: 59 22 20 6f 72 20 22 47 52 4f 55 50 20 42 59 22  Y" or "GROUP BY"
7440: 2e 20 45 78 61 63 74 6c 79 20 77 68 69 63 68 0a  . Exactly which.
7450: 2a 2a 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64  ** is determined
7460: 20 62 79 20 74 68 65 20 7a 55 73 61 67 65 20 61   by the zUsage a
7470: 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  rgument..*/.stat
7480: 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69 6e 54  ic void explainT
7490: 65 6d 70 54 61 62 6c 65 28 50 61 72 73 65 20 2a  empTable(Parse *
74a0: 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68  pParse, const ch
74b0: 61 72 20 2a 7a 55 73 61 67 65 29 7b 0a 20 20 69  ar *zUsage){.  i
74c0: 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61  f( pParse->expla
74d0: 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 56 64 62  in==2 ){.    Vdb
74e0: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
74f0: 56 64 62 65 3b 0a 20 20 20 20 63 68 61 72 20 2a  Vdbe;.    char *
7500: 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50  zMsg = sqlite3MP
7510: 72 69 6e 74 66 28 70 50 61 72 73 65 2d 3e 64 62  rintf(pParse->db
7520: 2c 20 22 55 53 45 20 54 45 4d 50 20 42 2d 54 52  , "USE TEMP B-TR
7530: 45 45 20 46 4f 52 20 25 73 22 2c 20 7a 55 73 61  EE FOR %s", zUsa
7540: 67 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ge);.    sqlite3
7550: 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
7560: 5f 45 78 70 6c 61 69 6e 2c 20 70 50 61 72 73 65  _Explain, pParse
7570: 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 30 2c 20  ->iSelectId, 0, 
7580: 30 2c 20 7a 4d 73 67 2c 20 50 34 5f 44 59 4e 41  0, zMsg, P4_DYNA
7590: 4d 49 43 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  MIC);.  }.}../*.
75a0: 2a 2a 20 41 73 73 69 67 6e 20 65 78 70 72 65 73  ** Assign expres
75b0: 73 69 6f 6e 20 62 20 74 6f 20 6c 76 61 6c 75 65  sion b to lvalue
75c0: 20 61 2e 20 41 20 73 65 63 6f 6e 64 2c 20 6e 6f   a. A second, no
75d0: 2d 6f 70 2c 20 76 65 72 73 69 6f 6e 20 6f 66 20  -op, version of 
75e0: 74 68 69 73 20 6d 61 63 72 6f 0a 2a 2a 20 69 73  this macro.** is
75f0: 20 70 72 6f 76 69 64 65 64 20 77 68 65 6e 20 53   provided when S
7600: 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
7610: 49 4e 20 69 73 20 64 65 66 69 6e 65 64 2e 20 54  IN is defined. T
7620: 68 69 73 20 61 6c 6c 6f 77 73 20 74 68 65 20 63  his allows the c
7630: 6f 64 65 0a 2a 2a 20 69 6e 20 73 71 6c 69 74 65  ode.** in sqlite
7640: 33 53 65 6c 65 63 74 28 29 20 74 6f 20 61 73 73  3Select() to ass
7650: 69 67 6e 20 76 61 6c 75 65 73 20 74 6f 20 73 74  ign values to st
7660: 72 75 63 74 75 72 65 20 6d 65 6d 62 65 72 20 76  ructure member v
7670: 61 72 69 61 62 6c 65 73 20 74 68 61 74 0a 2a 2a  ariables that.**
7680: 20 6f 6e 6c 79 20 65 78 69 73 74 20 69 66 20 53   only exist if S
7690: 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
76a0: 49 4e 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65  IN is not define
76b0: 64 20 77 69 74 68 6f 75 74 20 70 6f 6c 6c 75 74  d without pollut
76c0: 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 64 65 20  ing the.** code 
76d0: 77 69 74 68 20 23 69 66 6e 64 65 66 20 64 69 72  with #ifndef dir
76e0: 65 63 74 69 76 65 73 2e 0a 2a 2f 0a 23 20 64 65  ectives..*/.# de
76f0: 66 69 6e 65 20 65 78 70 6c 61 69 6e 53 65 74 49  fine explainSetI
7700: 6e 74 65 67 65 72 28 61 2c 20 62 29 20 61 20 3d  nteger(a, b) a =
7710: 20 62 0a 0a 23 65 6c 73 65 0a 2f 2a 20 4e 6f 2d   b..#else./* No-
7720: 6f 70 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74  op versions of t
7730: 68 65 20 65 78 70 6c 61 69 6e 58 58 58 28 29 20  he explainXXX() 
7740: 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 20 6d 61  functions and ma
7750: 63 72 6f 73 2e 20 2a 2f 0a 23 20 64 65 66 69 6e  cros. */.# defin
7760: 65 20 65 78 70 6c 61 69 6e 54 65 6d 70 54 61 62  e explainTempTab
7770: 6c 65 28 79 2c 7a 29 0a 23 20 64 65 66 69 6e 65  le(y,z).# define
7780: 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67   explainSetInteg
7790: 65 72 28 79 2c 7a 29 0a 23 65 6e 64 69 66 0a 0a  er(y,z).#endif..
77a0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
77b0: 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e  ITE_OMIT_EXPLAIN
77c0: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  ) && !defined(SQ
77d0: 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
77e0: 4e 44 5f 53 45 4c 45 43 54 29 0a 2f 2a 0a 2a 2a  ND_SELECT)./*.**
77f0: 20 55 6e 6c 65 73 73 20 61 6e 20 22 45 58 50 4c   Unless an "EXPL
7800: 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 22 20  AIN QUERY PLAN" 
7810: 63 6f 6d 6d 61 6e 64 20 69 73 20 62 65 69 6e 67  command is being
7820: 20 70 72 6f 63 65 73 73 65 64 2c 20 74 68 69 73   processed, this
7830: 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20   function.** is 
7840: 61 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69  a no-op. Otherwi
7850: 73 65 2c 20 69 74 20 61 64 64 73 20 61 20 73 69  se, it adds a si
7860: 6e 67 6c 65 20 72 6f 77 20 6f 66 20 6f 75 74 70  ngle row of outp
7870: 75 74 20 74 6f 20 74 68 65 20 45 51 50 20 72 65  ut to the EQP re
7880: 73 75 6c 74 2c 0a 2a 2a 20 77 68 65 72 65 20 74  sult,.** where t
7890: 68 65 20 63 61 70 74 69 6f 6e 20 69 73 20 6f 66  he caption is of
78a0: 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 77 6f 20   one of the two 
78b0: 66 6f 72 6d 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 22  forms:.**.**   "
78c0: 43 4f 4d 50 4f 53 49 54 45 20 53 55 42 51 55 45  COMPOSITE SUBQUE
78d0: 52 49 45 53 20 69 53 75 62 31 20 61 6e 64 20 69  RIES iSub1 and i
78e0: 53 75 62 32 20 28 6f 70 29 22 0a 2a 2a 20 20 20  Sub2 (op)".**   
78f0: 22 43 4f 4d 50 4f 53 49 54 45 20 53 55 42 51 55  "COMPOSITE SUBQU
7900: 45 52 49 45 53 20 69 53 75 62 31 20 61 6e 64 20  ERIES iSub1 and 
7910: 69 53 75 62 32 20 55 53 49 4e 47 20 54 45 4d 50  iSub2 USING TEMP
7920: 20 42 2d 54 52 45 45 20 28 6f 70 29 22 0a 2a 2a   B-TREE (op)".**
7930: 0a 2a 2a 20 77 68 65 72 65 20 69 53 75 62 31 20  .** where iSub1 
7940: 61 6e 64 20 69 53 75 62 32 20 61 72 65 20 74 68  and iSub2 are th
7950: 65 20 69 6e 74 65 67 65 72 73 20 70 61 73 73 65  e integers passe
7960: 64 20 61 73 20 74 68 65 20 63 6f 72 72 65 73 70  d as the corresp
7970: 6f 6e 64 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69  onding.** functi
7980: 6f 6e 20 70 61 72 61 6d 65 74 65 72 73 2c 20 61  on parameters, a
7990: 6e 64 20 6f 70 20 69 73 20 74 68 65 20 74 65 78  nd op is the tex
79a0: 74 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  t representation
79b0: 20 6f 66 20 74 68 65 20 70 61 72 61 6d 65 74 65   of the paramete
79c0: 72 0a 2a 2a 20 6f 66 20 74 68 65 20 73 61 6d 65  r.** of the same
79d0: 20 6e 61 6d 65 2e 20 54 68 65 20 70 61 72 61 6d   name. The param
79e0: 65 74 65 72 20 22 6f 70 22 20 6d 75 73 74 20 62  eter "op" must b
79f0: 65 20 6f 6e 65 20 6f 66 20 54 4b 5f 55 4e 49 4f  e one of TK_UNIO
7a00: 4e 2c 20 54 4b 5f 45 58 43 45 50 54 2c 0a 2a 2a  N, TK_EXCEPT,.**
7a10: 20 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 6f 72   TK_INTERSECT or
7a20: 20 54 4b 5f 41 4c 4c 2e 20 54 68 65 20 66 69 72   TK_ALL. The fir
7a30: 73 74 20 66 6f 72 6d 20 69 73 20 75 73 65 64 20  st form is used 
7a40: 69 66 20 61 72 67 75 6d 65 6e 74 20 62 55 73 65  if argument bUse
7a50: 54 6d 70 20 69 73 20 0a 2a 2a 20 66 61 6c 73 65  Tmp is .** false
7a60: 2c 20 6f 72 20 74 68 65 20 73 65 63 6f 6e 64 20  , or the second 
7a70: 66 6f 72 6d 20 69 66 20 69 74 20 69 73 20 74 72  form if it is tr
7a80: 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ue..*/.static vo
7a90: 69 64 20 65 78 70 6c 61 69 6e 43 6f 6d 70 6f 73  id explainCompos
7aa0: 69 74 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ite(.  Parse *pP
7ab0: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  arse,           
7ac0: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20         /* Parse 
7ad0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74  context */.  int
7ae0: 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   op,            
7af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7b00: 4f 6e 65 20 6f 66 20 54 4b 5f 55 4e 49 4f 4e 2c  One of TK_UNION,
7b10: 20 54 4b 5f 45 58 43 45 50 54 20 65 74 63 2e 20   TK_EXCEPT etc. 
7b20: 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62 31 2c 20  */.  int iSub1, 
7b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7b40: 20 20 20 20 20 2f 2a 20 53 75 62 71 75 65 72 79       /* Subquery
7b50: 20 69 64 20 31 20 2a 2f 0a 20 20 69 6e 74 20 69   id 1 */.  int i
7b60: 53 75 62 32 2c 20 20 20 20 20 20 20 20 20 20 20  Sub2,           
7b70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75             /* Su
7b80: 62 71 75 65 72 79 20 69 64 20 32 20 2a 2f 0a 20  bquery id 2 */. 
7b90: 20 69 6e 74 20 62 55 73 65 54 6d 70 20 20 20 20   int bUseTmp    
7ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7bb0: 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 74 65   /* True if a te
7bc0: 6d 70 20 74 61 62 6c 65 20 77 61 73 20 75 73 65  mp table was use
7bd0: 64 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74  d */.){.  assert
7be0: 28 20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 7c  ( op==TK_UNION |
7bf0: 7c 20 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20  | op==TK_EXCEPT 
7c00: 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53  || op==TK_INTERS
7c10: 45 43 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 41 4c  ECT || op==TK_AL
7c20: 4c 20 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73  L );.  if( pPars
7c30: 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29 7b  e->explain==2 ){
7c40: 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20 70  .    Vdbe *v = p
7c50: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
7c60: 20 20 63 68 61 72 20 2a 7a 4d 73 67 20 3d 20 73    char *zMsg = s
7c70: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 0a 20  qlite3MPrintf(. 
7c80: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64         pParse->d
7c90: 62 2c 20 22 43 4f 4d 50 4f 55 4e 44 20 53 55 42  b, "COMPOUND SUB
7ca0: 51 55 45 52 49 45 53 20 25 64 20 41 4e 44 20 25  QUERIES %d AND %
7cb0: 64 20 25 73 28 25 73 29 22 2c 20 69 53 75 62 31  d %s(%s)", iSub1
7cc0: 2c 20 69 53 75 62 32 2c 0a 20 20 20 20 20 20 20  , iSub2,.       
7cd0: 20 62 55 73 65 54 6d 70 3f 22 55 53 49 4e 47 20   bUseTmp?"USING 
7ce0: 54 45 4d 50 20 42 2d 54 52 45 45 20 22 3a 22 22  TEMP B-TREE ":""
7cf0: 2c 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 6f  , selectOpName(o
7d00: 70 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71  p).    );.    sq
7d10: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
7d20: 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 70  v, OP_Explain, p
7d30: 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64  Parse->iSelectId
7d40: 2c 20 30 2c 20 30 2c 20 7a 4d 73 67 2c 20 50 34  , 0, 0, zMsg, P4
7d50: 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 7d  _DYNAMIC);.  }.}
7d60: 0a 23 65 6c 73 65 0a 2f 2a 20 4e 6f 2d 6f 70 20  .#else./* No-op 
7d70: 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20  versions of the 
7d80: 65 78 70 6c 61 69 6e 58 58 58 28 29 20 66 75 6e  explainXXX() fun
7d90: 63 74 69 6f 6e 73 20 61 6e 64 20 6d 61 63 72 6f  ctions and macro
7da0: 73 2e 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 65  s. */.# define e
7db0: 78 70 6c 61 69 6e 43 6f 6d 70 6f 73 69 74 65 28  xplainComposite(
7dc0: 76 2c 77 2c 78 2c 79 2c 7a 29 0a 23 65 6e 64 69  v,w,x,y,z).#endi
7dd0: 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  f../*.** If the 
7de0: 69 6e 6e 65 72 20 6c 6f 6f 70 20 77 61 73 20 67  inner loop was g
7df0: 65 6e 65 72 61 74 65 64 20 75 73 69 6e 67 20 61  enerated using a
7e00: 20 6e 6f 6e 2d 6e 75 6c 6c 20 70 4f 72 64 65 72   non-null pOrder
7e10: 42 79 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20  By argument,.** 
7e20: 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 73  then the results
7e30: 20 77 65 72 65 20 70 6c 61 63 65 64 20 69 6e 20   were placed in 
7e40: 61 20 73 6f 72 74 65 72 2e 20 20 41 66 74 65 72  a sorter.  After
7e50: 20 74 68 65 20 6c 6f 6f 70 20 69 73 20 74 65 72   the loop is ter
7e60: 6d 69 6e 61 74 65 64 0a 2a 2a 20 77 65 20 6e 65  minated.** we ne
7e70: 65 64 20 74 6f 20 72 75 6e 20 74 68 65 20 73 6f  ed to run the so
7e80: 72 74 65 72 20 61 6e 64 20 6f 75 74 70 75 74 20  rter and output 
7e90: 74 68 65 20 72 65 73 75 6c 74 73 2e 20 20 54 68  the results.  Th
7ea0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 72  e following.** r
7eb0: 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73  outine generates
7ec0: 20 74 68 65 20 63 6f 64 65 20 6e 65 65 64 65 64   the code needed
7ed0: 20 74 6f 20 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a   to do that..*/.
7ee0: 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65  static void gene
7ef0: 72 61 74 65 53 6f 72 74 54 61 69 6c 28 0a 20 20  rateSortTail(.  
7f00: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
7f10: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
7f20: 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
7f30: 20 2a 70 2c 20 20 20 20 20 20 20 20 2f 2a 20 54   *p,        /* T
7f40: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
7f50: 65 6e 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  ent */.  Vdbe *v
7f60: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65  ,          /* Ge
7f70: 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f  nerate code into
7f80: 20 74 68 69 73 20 56 44 42 45 20 2a 2f 0a 20 20   this VDBE */.  
7f90: 69 6e 74 20 6e 43 6f 6c 75 6d 6e 2c 20 20 20 20  int nColumn,    
7fa0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
7fb0: 6f 6c 75 6d 6e 73 20 6f 66 20 64 61 74 61 20 2a  olumns of data *
7fc0: 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a  /.  SelectDest *
7fd0: 70 44 65 73 74 20 2f 2a 20 57 72 69 74 65 20 74  pDest /* Write t
7fe0: 68 65 20 73 6f 72 74 65 64 20 72 65 73 75 6c 74  he sorted result
7ff0: 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  s here */.){.  i
8000: 6e 74 20 61 64 64 72 42 72 65 61 6b 20 3d 20 73  nt addrBreak = s
8010: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
8020: 62 65 6c 28 76 29 3b 20 20 20 20 20 2f 2a 20 4a  bel(v);     /* J
8030: 75 6d 70 20 68 65 72 65 20 74 6f 20 65 78 69 74  ump here to exit
8040: 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61   loop */.  int a
8050: 64 64 72 43 6f 6e 74 69 6e 75 65 20 3d 20 73 71  ddrContinue = sq
8060: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
8070: 65 6c 28 76 29 3b 20 20 2f 2a 20 4a 75 6d 70 20  el(v);  /* Jump 
8080: 68 65 72 65 20 66 6f 72 20 6e 65 78 74 20 63 79  here for next cy
8090: 63 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  cle */.  int add
80a0: 72 3b 0a 20 20 69 6e 74 20 69 54 61 62 3b 0a 20  r;.  int iTab;. 
80b0: 20 69 6e 74 20 70 73 65 75 64 6f 54 61 62 20 3d   int pseudoTab =
80c0: 20 30 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   0;.  ExprList *
80d0: 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f  pOrderBy = p->pO
80e0: 72 64 65 72 42 79 3b 0a 0a 20 20 69 6e 74 20 65  rderBy;..  int e
80f0: 44 65 73 74 20 3d 20 70 44 65 73 74 2d 3e 65 44  Dest = pDest->eD
8100: 65 73 74 3b 0a 20 20 69 6e 74 20 69 50 61 72 6d  est;.  int iParm
8110: 20 3d 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72   = pDest->iSDPar
8120: 6d 3b 0a 0a 20 20 69 6e 74 20 72 65 67 52 6f 77  m;..  int regRow
8130: 3b 0a 20 20 69 6e 74 20 72 65 67 52 6f 77 69 64  ;.  int regRowid
8140: 3b 0a 0a 20 20 69 54 61 62 20 3d 20 70 4f 72 64  ;..  iTab = pOrd
8150: 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 3b 0a  erBy->iECursor;.
8160: 20 20 72 65 67 52 6f 77 20 3d 20 73 71 6c 69 74    regRow = sqlit
8170: 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
8180: 72 73 65 29 3b 0a 20 20 69 66 28 20 65 44 65 73  rse);.  if( eDes
8190: 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 7c 7c  t==SRT_Output ||
81a0: 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f   eDest==SRT_Coro
81b0: 75 74 69 6e 65 20 29 7b 0a 20 20 20 20 70 73 65  utine ){.    pse
81c0: 75 64 6f 54 61 62 20 3d 20 70 50 61 72 73 65 2d  udoTab = pParse-
81d0: 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 73 71 6c  >nTab++;.    sql
81e0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
81f0: 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f 2c  , OP_OpenPseudo,
8200: 20 70 73 65 75 64 6f 54 61 62 2c 20 72 65 67 52   pseudoTab, regR
8210: 6f 77 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20  ow, nColumn);.  
8220: 20 20 72 65 67 52 6f 77 69 64 20 3d 20 30 3b 0a    regRowid = 0;.
8230: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 67    }else{.    reg
8240: 52 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33 47  Rowid = sqlite3G
8250: 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
8260: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  );.  }.  if( p->
8270: 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 55 73  selFlags & SF_Us
8280: 65 53 6f 72 74 65 72 20 29 7b 0a 20 20 20 20 69  eSorter ){.    i
8290: 6e 74 20 72 65 67 53 6f 72 74 4f 75 74 20 3d 20  nt regSortOut = 
82a0: 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
82b0: 20 20 20 20 69 6e 74 20 70 74 61 62 32 20 3d 20      int ptab2 = 
82c0: 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
82d0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
82e0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp3(v, OP_Open
82f0: 50 73 65 75 64 6f 2c 20 70 74 61 62 32 2c 20 72  Pseudo, ptab2, r
8300: 65 67 53 6f 72 74 4f 75 74 2c 20 70 4f 72 64 65  egSortOut, pOrde
8310: 72 42 79 2d 3e 6e 45 78 70 72 2b 32 29 3b 0a 20  rBy->nExpr+2);. 
8320: 20 20 20 61 64 64 72 20 3d 20 31 20 2b 20 73 71     addr = 1 + sq
8330: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
8340: 76 2c 20 4f 50 5f 53 6f 72 74 65 72 53 6f 72 74  v, OP_SorterSort
8350: 2c 20 69 54 61 62 2c 20 61 64 64 72 42 72 65 61  , iTab, addrBrea
8360: 6b 29 3b 0a 20 20 20 20 63 6f 64 65 4f 66 66 73  k);.    codeOffs
8370: 65 74 28 76 2c 20 70 2c 20 61 64 64 72 43 6f 6e  et(v, p, addrCon
8380: 74 69 6e 75 65 29 3b 0a 20 20 20 20 73 71 6c 69  tinue);.    sqli
8390: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
83a0: 20 4f 50 5f 53 6f 72 74 65 72 44 61 74 61 2c 20   OP_SorterData, 
83b0: 69 54 61 62 2c 20 72 65 67 53 6f 72 74 4f 75 74  iTab, regSortOut
83c0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
83d0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
83e0: 6f 6c 75 6d 6e 2c 20 70 74 61 62 32 2c 20 70 4f  olumn, ptab2, pO
83f0: 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b 31 2c  rderBy->nExpr+1,
8400: 20 72 65 67 52 6f 77 29 3b 0a 20 20 20 20 73 71   regRow);.    sq
8410: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
8420: 35 28 76 2c 20 4f 50 46 4c 41 47 5f 43 4c 45 41  5(v, OPFLAG_CLEA
8430: 52 43 41 43 48 45 29 3b 0a 20 20 7d 65 6c 73 65  RCACHE);.  }else
8440: 7b 0a 20 20 20 20 61 64 64 72 20 3d 20 31 20 2b  {.    addr = 1 +
8450: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
8460: 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 2c 20 69  p2(v, OP_Sort, i
8470: 54 61 62 2c 20 61 64 64 72 42 72 65 61 6b 29 3b  Tab, addrBreak);
8480: 0a 20 20 20 20 63 6f 64 65 4f 66 66 73 65 74 28  .    codeOffset(
8490: 76 2c 20 70 2c 20 61 64 64 72 43 6f 6e 74 69 6e  v, p, addrContin
84a0: 75 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ue);.    sqlite3
84b0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
84c0: 5f 43 6f 6c 75 6d 6e 2c 20 69 54 61 62 2c 20 70  _Column, iTab, p
84d0: 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b 31  OrderBy->nExpr+1
84e0: 2c 20 72 65 67 52 6f 77 29 3b 0a 20 20 7d 0a 20  , regRow);.  }. 
84f0: 20 73 77 69 74 63 68 28 20 65 44 65 73 74 20 29   switch( eDest )
8500: 7b 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 54  {.    case SRT_T
8510: 61 62 6c 65 3a 0a 20 20 20 20 63 61 73 65 20 53  able:.    case S
8520: 52 54 5f 45 70 68 65 6d 54 61 62 3a 20 7b 0a 20  RT_EphemTab: {. 
8530: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65       testcase( e
8540: 44 65 73 74 3d 3d 53 52 54 5f 54 61 62 6c 65 20  Dest==SRT_Table 
8550: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
8560: 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 45 70  e( eDest==SRT_Ep
8570: 68 65 6d 54 61 62 20 29 3b 0a 20 20 20 20 20 20  hemTab );.      
8580: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
8590: 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64  2(v, OP_NewRowid
85a0: 2c 20 69 50 61 72 6d 2c 20 72 65 67 52 6f 77 69  , iParm, regRowi
85b0: 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  d);.      sqlite
85c0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
85d0: 50 5f 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c  P_Insert, iParm,
85e0: 20 72 65 67 52 6f 77 2c 20 72 65 67 52 6f 77 69   regRow, regRowi
85f0: 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  d);.      sqlite
8600: 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
8610: 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b   OPFLAG_APPEND);
8620: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
8630: 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
8640: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
8650: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 53 65  .    case SRT_Se
8660: 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  t: {.      asser
8670: 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b  t( nColumn==1 );
8680: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
8690: 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d  beAddOp4(v, OP_M
86a0: 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52 6f  akeRecord, regRo
86b0: 77 2c 20 31 2c 20 72 65 67 52 6f 77 69 64 2c 0a  w, 1, regRowid,.
86c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
86d0: 20 20 20 20 20 20 20 20 26 70 44 65 73 74 2d 3e          &pDest->
86e0: 61 66 66 53 64 73 74 2c 20 31 29 3b 0a 20 20 20  affSdst, 1);.   
86f0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
8700: 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67  cheAffinityChang
8710: 65 28 70 50 61 72 73 65 2c 20 72 65 67 52 6f 77  e(pParse, regRow
8720: 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 1);.      sqli
8730: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
8740: 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69   OP_IdxInsert, i
8750: 50 61 72 6d 2c 20 72 65 67 52 6f 77 69 64 29 3b  Parm, regRowid);
8760: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
8770: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 52 54    }.    case SRT
8780: 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73  _Mem: {.      as
8790: 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31  sert( nColumn==1
87a0: 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
87b0: 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50  3ExprCodeMove(pP
87c0: 61 72 73 65 2c 20 72 65 67 52 6f 77 2c 20 69 50  arse, regRow, iP
87d0: 61 72 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20 2f  arm, 1);.      /
87e0: 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75  * The LIMIT clau
87f0: 73 65 20 77 69 6c 6c 20 74 65 72 6d 69 6e 61 74  se will terminat
8800: 65 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75  e the loop for u
8810: 73 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b  s */.      break
8820: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
8830: 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
8840: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
8850: 20 61 73 73 65 72 74 28 20 65 44 65 73 74 3d 3d   assert( eDest==
8860: 53 52 54 5f 4f 75 74 70 75 74 20 7c 7c 20 65 44  SRT_Output || eD
8870: 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69  est==SRT_Corouti
8880: 6e 65 20 29 3b 20 0a 20 20 20 20 20 20 74 65 73  ne ); .      tes
8890: 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52  tcase( eDest==SR
88a0: 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20 20 20 20  T_Output );.    
88b0: 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73    testcase( eDes
88c0: 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65  t==SRT_Coroutine
88d0: 20 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   );.      for(i=
88e0: 30 3b 20 69 3c 6e 43 6f 6c 75 6d 6e 3b 20 69 2b  0; i<nColumn; i+
88f0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  +){.        asse
8900: 72 74 28 20 72 65 67 52 6f 77 21 3d 70 44 65 73  rt( regRow!=pDes
8910: 74 2d 3e 69 53 64 73 74 2b 69 20 29 3b 0a 20 20  t->iSdst+i );.  
8920: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
8930: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
8940: 6c 75 6d 6e 2c 20 70 73 65 75 64 6f 54 61 62 2c  lumn, pseudoTab,
8950: 20 69 2c 20 70 44 65 73 74 2d 3e 69 53 64 73 74   i, pDest->iSdst
8960: 2b 69 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  +i);.        if(
8970: 20 69 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20   i==0 ){.       
8980: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
8990: 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47  angeP5(v, OPFLAG
89a0: 5f 43 4c 45 41 52 43 41 43 48 45 29 3b 0a 20 20  _CLEARCACHE);.  
89b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
89c0: 20 20 20 20 20 20 69 66 28 20 65 44 65 73 74 3d        if( eDest=
89d0: 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20  =SRT_Output ){. 
89e0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
89f0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
8a00: 65 73 75 6c 74 52 6f 77 2c 20 70 44 65 73 74 2d  esultRow, pDest-
8a10: 3e 69 53 64 73 74 2c 20 6e 43 6f 6c 75 6d 6e 29  >iSdst, nColumn)
8a20: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
8a30: 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69  3ExprCacheAffini
8a40: 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c  tyChange(pParse,
8a50: 20 70 44 65 73 74 2d 3e 69 53 64 73 74 2c 20 6e   pDest->iSdst, n
8a60: 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 7d  Column);.      }
8a70: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
8a80: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
8a90: 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 70 44 65  v, OP_Yield, pDe
8aa0: 73 74 2d 3e 69 53 44 50 61 72 6d 29 3b 0a 20 20  st->iSDParm);.  
8ab0: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
8ac0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  k;.    }.  }.  s
8ad0: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
8ae0: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
8af0: 52 6f 77 29 3b 0a 20 20 73 71 6c 69 74 65 33 52  Row);.  sqlite3R
8b00: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
8b10: 61 72 73 65 2c 20 72 65 67 52 6f 77 69 64 29 3b  arse, regRowid);
8b20: 0a 0a 20 20 2f 2a 20 54 68 65 20 62 6f 74 74 6f  ..  /* The botto
8b30: 6d 20 6f 66 20 74 68 65 20 6c 6f 6f 70 0a 20 20  m of the loop.  
8b40: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
8b50: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
8b60: 61 64 64 72 43 6f 6e 74 69 6e 75 65 29 3b 0a 20  addrContinue);. 
8b70: 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73   if( p->selFlags
8b80: 20 26 20 53 46 5f 55 73 65 53 6f 72 74 65 72 20   & SF_UseSorter 
8b90: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
8ba0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
8bb0: 6f 72 74 65 72 4e 65 78 74 2c 20 69 54 61 62 2c  orterNext, iTab,
8bc0: 20 61 64 64 72 29 3b 0a 20 20 7d 65 6c 73 65 7b   addr);.  }else{
8bd0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
8be0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78  AddOp2(v, OP_Nex
8bf0: 74 2c 20 69 54 61 62 2c 20 61 64 64 72 29 3b 0a  t, iTab, addr);.
8c00: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
8c10: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
8c20: 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20 20 69   addrBreak);.  i
8c30: 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75  f( eDest==SRT_Ou
8c40: 74 70 75 74 20 7c 7c 20 65 44 65 73 74 3d 3d 53  tput || eDest==S
8c50: 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a  RT_Coroutine ){.
8c60: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
8c70: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73  ddOp2(v, OP_Clos
8c80: 65 2c 20 70 73 65 75 64 6f 54 61 62 2c 20 30 29  e, pseudoTab, 0)
8c90: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
8ca0: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
8cb0: 74 6f 20 61 20 73 74 72 69 6e 67 20 63 6f 6e 74  to a string cont
8cc0: 61 69 6e 69 6e 67 20 74 68 65 20 27 64 65 63 6c  aining the 'decl
8cd0: 61 72 61 74 69 6f 6e 20 74 79 70 65 27 20 6f 66  aration type' of
8ce0: 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69   the.** expressi
8cf0: 6f 6e 20 70 45 78 70 72 2e 20 54 68 65 20 73 74  on pExpr. The st
8d00: 72 69 6e 67 20 6d 61 79 20 62 65 20 74 72 65 61  ring may be trea
8d10: 74 65 64 20 61 73 20 73 74 61 74 69 63 20 62 79  ted as static by
8d20: 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a   the caller..**.
8d30: 2a 2a 20 54 68 65 20 64 65 63 6c 61 72 61 74 69  ** The declarati
8d40: 6f 6e 20 74 79 70 65 20 69 73 20 74 68 65 20 65  on type is the e
8d50: 78 61 63 74 20 64 61 74 61 74 79 70 65 20 64 65  xact datatype de
8d60: 66 69 6e 69 74 69 6f 6e 20 65 78 74 72 61 63 74  finition extract
8d70: 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 6f  ed from the.** o
8d80: 72 69 67 69 6e 61 6c 20 43 52 45 41 54 45 20 54  riginal CREATE T
8d90: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 69  ABLE statement i
8da0: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
8db0: 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 54 68   is a column. Th
8dc0: 65 0a 2a 2a 20 64 65 63 6c 61 72 61 74 69 6f 6e  e.** declaration
8dd0: 20 74 79 70 65 20 66 6f 72 20 61 20 52 4f 57 49   type for a ROWI
8de0: 44 20 66 69 65 6c 64 20 69 73 20 49 4e 54 45 47  D field is INTEG
8df0: 45 52 2e 20 45 78 61 63 74 6c 79 20 77 68 65 6e  ER. Exactly when
8e00: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a   an expression.*
8e10: 2a 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20  * is considered 
8e20: 61 20 63 6f 6c 75 6d 6e 20 63 61 6e 20 62 65 20  a column can be 
8e30: 63 6f 6d 70 6c 65 78 20 69 6e 20 74 68 65 20 70  complex in the p
8e40: 72 65 73 65 6e 63 65 20 6f 66 20 73 75 62 71 75  resence of subqu
8e50: 65 72 69 65 73 2e 20 54 68 65 0a 2a 2a 20 72 65  eries. The.** re
8e60: 73 75 6c 74 2d 73 65 74 20 65 78 70 72 65 73 73  sult-set express
8e70: 69 6f 6e 20 69 6e 20 61 6c 6c 20 6f 66 20 74 68  ion in all of th
8e80: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 53 45 4c 45  e following SELE
8e90: 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 69 73  CT statements is
8ea0: 20 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 20   .** considered 
8eb0: 61 20 63 6f 6c 75 6d 6e 20 62 79 20 74 68 69 73  a column by this
8ec0: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   function..**.**
8ed0: 20 20 20 53 45 4c 45 43 54 20 63 6f 6c 20 46 52     SELECT col FR
8ee0: 4f 4d 20 74 62 6c 3b 0a 2a 2a 20 20 20 53 45 4c  OM tbl;.**   SEL
8ef0: 45 43 54 20 28 53 45 4c 45 43 54 20 63 6f 6c 20  ECT (SELECT col 
8f00: 46 52 4f 4d 20 74 62 6c 3b 0a 2a 2a 20 20 20 53  FROM tbl;.**   S
8f10: 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20 63 6f  ELECT (SELECT co
8f20: 6c 20 46 52 4f 4d 20 74 62 6c 29 3b 0a 2a 2a 20  l FROM tbl);.** 
8f30: 20 20 53 45 4c 45 43 54 20 61 62 63 20 46 52 4f    SELECT abc FRO
8f40: 4d 20 28 53 45 4c 45 43 54 20 63 6f 6c 20 41 53  M (SELECT col AS
8f50: 20 61 62 63 20 46 52 4f 4d 20 74 62 6c 29 3b 0a   abc FROM tbl);.
8f60: 2a 2a 20 0a 2a 2a 20 54 68 65 20 64 65 63 6c 61  ** .** The decla
8f70: 72 61 74 69 6f 6e 20 74 79 70 65 20 66 6f 72 20  ration type for 
8f80: 61 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20 6f  any expression o
8f90: 74 68 65 72 20 74 68 61 6e 20 61 20 63 6f 6c 75  ther than a colu
8fa0: 6d 6e 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73  mn is NULL..*/.s
8fb0: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
8fc0: 20 2a 63 6f 6c 75 6d 6e 54 79 70 65 28 0a 20 20   *columnType(.  
8fd0: 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43  NameContext *pNC
8fe0: 2c 20 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  , .  Expr *pExpr
8ff0: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
9000: 2a 70 7a 4f 72 69 67 69 6e 44 62 2c 0a 20 20 63  *pzOriginDb,.  c
9010: 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f 72  onst char **pzOr
9020: 69 67 69 6e 54 61 62 2c 0a 20 20 63 6f 6e 73 74  iginTab,.  const
9030: 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67 69 6e   char **pzOrigin
9040: 43 6f 6c 0a 29 7b 0a 20 20 63 68 61 72 20 63 6f  Col.){.  char co
9050: 6e 73 74 20 2a 7a 54 79 70 65 20 3d 20 30 3b 0a  nst *zType = 0;.
9060: 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f    char const *zO
9070: 72 69 67 69 6e 44 62 20 3d 20 30 3b 0a 20 20 63  riginDb = 0;.  c
9080: 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67  har const *zOrig
9090: 69 6e 54 61 62 20 3d 20 30 3b 0a 20 20 63 68 61  inTab = 0;.  cha
90a0: 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67 69 6e  r const *zOrigin
90b0: 43 6f 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6a  Col = 0;.  int j
90c0: 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 45  ;.  if( NEVER(pE
90d0: 78 70 72 3d 3d 30 29 20 7c 7c 20 70 4e 43 2d 3e  xpr==0) || pNC->
90e0: 70 53 72 63 4c 69 73 74 3d 3d 30 20 29 20 72 65  pSrcList==0 ) re
90f0: 74 75 72 6e 20 30 3b 0a 0a 20 20 73 77 69 74 63  turn 0;..  switc
9100: 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a  h( pExpr->op ){.
9110: 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f      case TK_AGG_
9120: 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65  COLUMN:.    case
9130: 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20   TK_COLUMN: {.  
9140: 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65      /* The expre
9150: 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d  ssion is a colum
9160: 6e 2e 20 4c 6f 63 61 74 65 20 74 68 65 20 74 61  n. Locate the ta
9170: 62 6c 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69  ble the column i
9180: 73 20 62 65 69 6e 67 0a 20 20 20 20 20 20 2a 2a  s being.      **
9190: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
91a0: 69 6e 20 4e 61 6d 65 43 6f 6e 74 65 78 74 2e 70  in NameContext.p
91b0: 53 72 63 4c 69 73 74 2e 20 54 68 69 73 20 74 61  SrcList. This ta
91c0: 62 6c 65 20 6d 61 79 20 62 65 20 72 65 61 6c 0a  ble may be real.
91d0: 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73        ** databas
91e0: 65 20 74 61 62 6c 65 20 6f 72 20 61 20 73 75 62  e table or a sub
91f0: 71 75 65 72 79 2e 0a 20 20 20 20 20 20 2a 2f 0a  query..      */.
9200: 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61        Table *pTa
9210: 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  b = 0;          
9220: 20 20 2f 2a 20 54 61 62 6c 65 20 73 74 72 75 63    /* Table struc
9230: 74 75 72 65 20 63 6f 6c 75 6d 6e 20 69 73 20 65  ture column is e
9240: 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 2a 2f  xtracted from */
9250: 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70  .      Select *p
9260: 53 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  S = 0;          
9270: 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 74 68 65     /* Select the
9280: 20 63 6f 6c 75 6d 6e 20 69 73 20 65 78 74 72 61   column is extra
9290: 63 74 65 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 20  cted from */.   
92a0: 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 45     int iCol = pE
92b0: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 20 20 2f  xpr->iColumn;  /
92c0: 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d  * Index of colum
92d0: 6e 20 69 6e 20 70 54 61 62 20 2a 2f 0a 20 20 20  n in pTab */.   
92e0: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
92f0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43  pr->op==TK_AGG_C
9300: 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 74  OLUMN );.      t
9310: 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
9320: 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b  op==TK_COLUMN );
9330: 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 4e  .      while( pN
9340: 43 20 26 26 20 21 70 54 61 62 20 29 7b 0a 20 20  C && !pTab ){.  
9350: 20 20 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70        SrcList *p
9360: 54 61 62 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70  TabList = pNC->p
9370: 53 72 63 4c 69 73 74 3b 0a 20 20 20 20 20 20 20  SrcList;.       
9380: 20 66 6f 72 28 6a 3d 30 3b 6a 3c 70 54 61 62 4c   for(j=0;j<pTabL
9390: 69 73 74 2d 3e 6e 53 72 63 20 26 26 20 70 54 61  ist->nSrc && pTa
93a0: 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72  bList->a[j].iCur
93b0: 73 6f 72 21 3d 70 45 78 70 72 2d 3e 69 54 61 62  sor!=pExpr->iTab
93c0: 6c 65 3b 6a 2b 2b 29 3b 0a 20 20 20 20 20 20 20  le;j++);.       
93d0: 20 69 66 28 20 6a 3c 70 54 61 62 4c 69 73 74 2d   if( j<pTabList-
93e0: 3e 6e 53 72 63 20 29 7b 0a 20 20 20 20 20 20 20  >nSrc ){.       
93f0: 20 20 20 70 54 61 62 20 3d 20 70 54 61 62 4c 69     pTab = pTabLi
9400: 73 74 2d 3e 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20  st->a[j].pTab;. 
9410: 20 20 20 20 20 20 20 20 20 70 53 20 3d 20 70 54           pS = pT
9420: 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 53 65  abList->a[j].pSe
9430: 6c 65 63 74 3b 0a 20 20 20 20 20 20 20 20 7d 65  lect;.        }e
9440: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70  lse{.          p
9450: 4e 43 20 3d 20 70 4e 43 2d 3e 70 4e 65 78 74 3b  NC = pNC->pNext;
9460: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
9470: 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 70 54   }..      if( pT
9480: 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ab==0 ){.       
9490: 20 2f 2a 20 41 74 20 6f 6e 65 20 74 69 6d 65 2c   /* At one time,
94a0: 20 63 6f 64 65 20 73 75 63 68 20 61 73 20 22 53   code such as "S
94b0: 45 4c 45 43 54 20 6e 65 77 2e 78 22 20 77 69 74  ELECT new.x" wit
94c0: 68 69 6e 20 61 20 74 72 69 67 67 65 72 20 77 6f  hin a trigger wo
94d0: 75 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 63  uld.        ** c
94e0: 61 75 73 65 20 74 68 69 73 20 63 6f 6e 64 69 74  ause this condit
94f0: 69 6f 6e 20 74 6f 20 72 75 6e 2e 20 20 53 69 6e  ion to run.  Sin
9500: 63 65 20 74 68 65 6e 2c 20 77 65 20 68 61 76 65  ce then, we have
9510: 20 72 65 73 74 72 75 63 74 75 72 65 64 20 68 6f   restructured ho
9520: 77 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72 69  w.        ** tri
9530: 67 67 65 72 20 63 6f 64 65 20 69 73 20 67 65 6e  gger code is gen
9540: 65 72 61 74 65 64 20 61 6e 64 20 73 6f 20 74 68  erated and so th
9550: 69 73 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20  is condition is 
9560: 6e 6f 20 6c 6f 6e 67 65 72 20 0a 20 20 20 20 20  no longer .     
9570: 20 20 20 2a 2a 20 70 6f 73 73 69 62 6c 65 2e 20     ** possible. 
9580: 48 6f 77 65 76 65 72 2c 20 69 74 20 63 61 6e 20  However, it can 
9590: 73 74 69 6c 6c 20 62 65 20 74 72 75 65 20 66 6f  still be true fo
95a0: 72 20 73 74 61 74 65 6d 65 6e 74 73 20 6c 69 6b  r statements lik
95b0: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  e.        ** the
95c0: 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20 20 20   following:.    
95d0: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
95e0: 2a 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45  *   CREATE TABLE
95f0: 20 74 31 28 63 6f 6c 20 49 4e 54 45 47 45 52 29   t1(col INTEGER)
9600: 3b 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 53  ;.        **   S
9610: 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20 74 31  ELECT (SELECT t1
9620: 2e 63 6f 6c 29 20 46 52 4f 4d 20 46 52 4f 4d 20  .col) FROM FROM 
9630: 74 31 3b 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  t1;.        **. 
9640: 20 20 20 20 20 20 20 2a 2a 20 77 68 65 6e 20 63         ** when c
9650: 6f 6c 75 6d 6e 54 79 70 65 28 29 20 69 73 20 63  olumnType() is c
9660: 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 65 78 70  alled on the exp
9670: 72 65 73 73 69 6f 6e 20 22 74 31 2e 63 6f 6c 22  ression "t1.col"
9680: 20 69 6e 20 74 68 65 20 0a 20 20 20 20 20 20 20   in the .       
9690: 20 2a 2a 20 73 75 62 2d 73 65 6c 65 63 74 2e 20   ** sub-select. 
96a0: 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 73 65  In this case, se
96b0: 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 79 70  t the column typ
96c0: 65 20 74 6f 20 4e 55 4c 4c 2c 20 65 76 65 6e 0a  e to NULL, even.
96d0: 20 20 20 20 20 20 20 20 2a 2a 20 74 68 6f 75 67          ** thoug
96e0: 68 20 69 74 20 73 68 6f 75 6c 64 20 72 65 61 6c  h it should real
96f0: 6c 79 20 62 65 20 22 49 4e 54 45 47 45 52 22 2e  ly be "INTEGER".
9700: 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
9710: 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 6e      ** This is n
9720: 6f 74 20 61 20 70 72 6f 62 6c 65 6d 2c 20 61 73  ot a problem, as
9730: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 79 70 65   the column type
9740: 20 6f 66 20 22 74 31 2e 63 6f 6c 22 20 69 73 20   of "t1.col" is 
9750: 6e 65 76 65 72 0a 20 20 20 20 20 20 20 20 2a 2a  never.        **
9760: 20 75 73 65 64 2e 20 57 68 65 6e 20 63 6f 6c 75   used. When colu
9770: 6d 6e 54 79 70 65 28 29 20 69 73 20 63 61 6c 6c  mnType() is call
9780: 65 64 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73  ed on the expres
9790: 73 69 6f 6e 20 0a 20 20 20 20 20 20 20 20 2a 2a  sion .        **
97a0: 20 22 28 53 45 4c 45 43 54 20 74 31 2e 63 6f 6c   "(SELECT t1.col
97b0: 29 22 2c 20 74 68 65 20 63 6f 72 72 65 63 74 20  )", the correct 
97c0: 74 79 70 65 20 69 73 20 72 65 74 75 72 6e 65 64  type is returned
97d0: 20 28 73 65 65 20 74 68 65 20 54 4b 5f 53 45 4c   (see the TK_SEL
97e0: 45 43 54 0a 20 20 20 20 20 20 20 20 2a 2a 20 62  ECT.        ** b
97f0: 72 61 6e 63 68 20 62 65 6c 6f 77 2e 20 20 2a 2f  ranch below.  */
9800: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
9810: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61        }..      a
9820: 73 73 65 72 74 28 20 70 54 61 62 20 26 26 20 70  ssert( pTab && p
9830: 45 78 70 72 2d 3e 70 54 61 62 3d 3d 70 54 61 62  Expr->pTab==pTab
9840: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53   );.      if( pS
9850: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
9860: 68 65 20 22 74 61 62 6c 65 22 20 69 73 20 61 63  he "table" is ac
9870: 74 75 61 6c 6c 79 20 61 20 73 75 62 2d 73 65 6c  tually a sub-sel
9880: 65 63 74 20 6f 72 20 61 20 76 69 65 77 20 69 6e  ect or a view in
9890: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
98a0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74  .        ** of t
98b0: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
98c0: 65 6e 74 2e 20 52 65 74 75 72 6e 20 74 68 65 20  ent. Return the 
98d0: 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65  declaration type
98e0: 20 61 6e 64 20 6f 72 69 67 69 6e 0a 20 20 20 20   and origin.    
98f0: 20 20 20 20 2a 2a 20 64 61 74 61 20 66 6f 72 20      ** data for 
9900: 74 68 65 20 72 65 73 75 6c 74 2d 73 65 74 20 63  the result-set c
9910: 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 73 75 62  olumn of the sub
9920: 2d 73 65 6c 65 63 74 2e 0a 20 20 20 20 20 20 20  -select..       
9930: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
9940: 69 43 6f 6c 3e 3d 30 20 26 26 20 41 4c 57 41 59  iCol>=0 && ALWAY
9950: 53 28 69 43 6f 6c 3c 70 53 2d 3e 70 45 4c 69 73  S(iCol<pS->pELis
9960: 74 2d 3e 6e 45 78 70 72 29 20 29 7b 0a 20 20 20  t->nExpr) ){.   
9970: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 69 43 6f         /* If iCo
9980: 6c 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a  l is less than z
9990: 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 65 78  ero, then the ex
99a0: 70 72 65 73 73 69 6f 6e 20 72 65 71 75 65 73 74  pression request
99b0: 73 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20  s the.          
99c0: 2a 2a 20 72 6f 77 69 64 20 6f 66 20 74 68 65 20  ** rowid of the 
99d0: 73 75 62 2d 73 65 6c 65 63 74 20 6f 72 20 76 69  sub-select or vi
99e0: 65 77 2e 20 54 68 69 73 20 65 78 70 72 65 73 73  ew. This express
99f0: 69 6f 6e 20 69 73 20 6c 65 67 61 6c 20 28 73 65  ion is legal (se
9a00: 65 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  e .          ** 
9a10: 74 65 73 74 20 63 61 73 65 20 6d 69 73 63 32 2e  test case misc2.
9a20: 32 2e 32 29 20 2d 20 69 74 20 61 6c 77 61 79 73  2.2) - it always
9a30: 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20 4e 55   evaluates to NU
9a40: 4c 4c 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  LL..          */
9a50: 0a 20 20 20 20 20 20 20 20 20 20 4e 61 6d 65 43  .          NameC
9a60: 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20 20 20  ontext sNC;.    
9a70: 20 20 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20        Expr *p = 
9a80: 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 43  pS->pEList->a[iC
9a90: 6f 6c 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  ol].pExpr;.     
9aa0: 20 20 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73       sNC.pSrcLis
9ab0: 74 20 3d 20 70 53 2d 3e 70 53 72 63 3b 0a 20 20  t = pS->pSrc;.  
9ac0: 20 20 20 20 20 20 20 20 73 4e 43 2e 70 4e 65 78          sNC.pNex
9ad0: 74 20 3d 20 70 4e 43 3b 0a 20 20 20 20 20 20 20  t = pNC;.       
9ae0: 20 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20     sNC.pParse = 
9af0: 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20  pNC->pParse;.   
9b00: 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 63         zType = c
9b10: 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20  olumnType(&sNC, 
9b20: 70 2c 20 26 7a 4f 72 69 67 69 6e 44 62 2c 20 26  p, &zOriginDb, &
9b30: 7a 4f 72 69 67 69 6e 54 61 62 2c 20 26 7a 4f 72  zOriginTab, &zOr
9b40: 69 67 69 6e 43 6f 6c 29 3b 20 0a 20 20 20 20 20  iginCol); .     
9b50: 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
9b60: 20 69 66 28 20 41 4c 57 41 59 53 28 70 54 61 62   if( ALWAYS(pTab
9b70: 2d 3e 70 53 63 68 65 6d 61 29 20 29 7b 0a 20 20  ->pSchema) ){.  
9b80: 20 20 20 20 20 20 2f 2a 20 41 20 72 65 61 6c 20        /* A real 
9b90: 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20  table */.       
9ba0: 20 61 73 73 65 72 74 28 20 21 70 53 20 29 3b 0a   assert( !pS );.
9bb0: 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c          if( iCol
9bc0: 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70 54 61 62  <0 ) iCol = pTab
9bd0: 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 20  ->iPKey;.       
9be0: 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d 2d   assert( iCol==-
9bf0: 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20 26 26  1 || (iCol>=0 &&
9c00: 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c   iCol<pTab->nCol
9c10: 29 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ) );.        if(
9c20: 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20   iCol<0 ){.     
9c30: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 49 4e       zType = "IN
9c40: 54 45 47 45 52 22 3b 0a 20 20 20 20 20 20 20 20  TEGER";.        
9c50: 20 20 7a 4f 72 69 67 69 6e 43 6f 6c 20 3d 20 22    zOriginCol = "
9c60: 72 6f 77 69 64 22 3b 0a 20 20 20 20 20 20 20 20  rowid";.        
9c70: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
9c80: 20 7a 54 79 70 65 20 3d 20 70 54 61 62 2d 3e 61   zType = pTab->a
9c90: 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b  Col[iCol].zType;
9ca0: 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 72 69 67  .          zOrig
9cb0: 69 6e 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43  inCol = pTab->aC
9cc0: 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a  ol[iCol].zName;.
9cd0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
9ce0: 20 20 7a 4f 72 69 67 69 6e 54 61 62 20 3d 20 70    zOriginTab = p
9cf0: 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20  Tab->zName;.    
9d00: 20 20 20 20 69 66 28 20 70 4e 43 2d 3e 70 50 61      if( pNC->pPa
9d10: 72 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  rse ){.         
9d20: 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74   int iDb = sqlit
9d30: 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
9d40: 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2c  pNC->pParse->db,
9d50: 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b   pTab->pSchema);
9d60: 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 72 69 67  .          zOrig
9d70: 69 6e 44 62 20 3d 20 70 4e 43 2d 3e 70 50 61 72  inDb = pNC->pPar
9d80: 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d  se->db->aDb[iDb]
9d90: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  .zName;.        
9da0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
9db0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66  break;.    }.#if
9dc0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
9dd0: 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 63 61  _SUBQUERY.    ca
9de0: 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a  se TK_SELECT: {.
9df0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70        /* The exp
9e00: 72 65 73 73 69 6f 6e 20 69 73 20 61 20 73 75 62  ression is a sub
9e10: 2d 73 65 6c 65 63 74 2e 20 52 65 74 75 72 6e 20  -select. Return 
9e20: 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  the declaration 
9e30: 74 79 70 65 20 61 6e 64 0a 20 20 20 20 20 20 2a  type and.      *
9e40: 2a 20 6f 72 69 67 69 6e 20 69 6e 66 6f 20 66 6f  * origin info fo
9e50: 72 20 74 68 65 20 73 69 6e 67 6c 65 20 63 6f 6c  r the single col
9e60: 75 6d 6e 20 69 6e 20 74 68 65 20 72 65 73 75 6c  umn in the resul
9e70: 74 20 73 65 74 20 6f 66 20 74 68 65 20 53 45 4c  t set of the SEL
9e80: 45 43 54 0a 20 20 20 20 20 20 2a 2a 20 73 74 61  ECT.      ** sta
9e90: 74 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f  tement..      */
9ea0: 0a 20 20 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65  .      NameConte
9eb0: 78 74 20 73 4e 43 3b 0a 20 20 20 20 20 20 53 65  xt sNC;.      Se
9ec0: 6c 65 63 74 20 2a 70 53 20 3d 20 70 45 78 70 72  lect *pS = pExpr
9ed0: 2d 3e 78 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20  ->x.pSelect;.   
9ee0: 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70 53 2d     Expr *p = pS-
9ef0: 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  >pEList->a[0].pE
9f00: 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72  xpr;.      asser
9f10: 74 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  t( ExprHasProper
9f20: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73  ty(pExpr, EP_xIs
9f30: 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20  Select) );.     
9f40: 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20   sNC.pSrcList = 
9f50: 70 53 2d 3e 70 53 72 63 3b 0a 20 20 20 20 20 20  pS->pSrc;.      
9f60: 73 4e 43 2e 70 4e 65 78 74 20 3d 20 70 4e 43 3b  sNC.pNext = pNC;
9f70: 0a 20 20 20 20 20 20 73 4e 43 2e 70 50 61 72 73  .      sNC.pPars
9f80: 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b  e = pNC->pParse;
9f90: 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 63  .      zType = c
9fa0: 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20  olumnType(&sNC, 
9fb0: 70 2c 20 26 7a 4f 72 69 67 69 6e 44 62 2c 20 26  p, &zOriginDb, &
9fc0: 7a 4f 72 69 67 69 6e 54 61 62 2c 20 26 7a 4f 72  zOriginTab, &zOr
9fd0: 69 67 69 6e 43 6f 6c 29 3b 20 0a 20 20 20 20 20  iginCol); .     
9fe0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
9ff0: 6e 64 69 66 0a 20 20 7d 0a 20 20 0a 20 20 69 66  ndif.  }.  .  if
a000: 28 20 70 7a 4f 72 69 67 69 6e 44 62 20 29 7b 0a  ( pzOriginDb ){.
a010: 20 20 20 20 61 73 73 65 72 74 28 20 70 7a 4f 72      assert( pzOr
a020: 69 67 69 6e 54 61 62 20 26 26 20 70 7a 4f 72 69  iginTab && pzOri
a030: 67 69 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 2a 70  ginCol );.    *p
a040: 7a 4f 72 69 67 69 6e 44 62 20 3d 20 7a 4f 72 69  zOriginDb = zOri
a050: 67 69 6e 44 62 3b 0a 20 20 20 20 2a 70 7a 4f 72  ginDb;.    *pzOr
a060: 69 67 69 6e 54 61 62 20 3d 20 7a 4f 72 69 67 69  iginTab = zOrigi
a070: 6e 54 61 62 3b 0a 20 20 20 20 2a 70 7a 4f 72 69  nTab;.    *pzOri
a080: 67 69 6e 43 6f 6c 20 3d 20 7a 4f 72 69 67 69 6e  ginCol = zOrigin
a090: 43 6f 6c 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  Col;.  }.  retur
a0a0: 6e 20 7a 54 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  n zType;.}../*.*
a0b0: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
a0c0: 74 68 61 74 20 77 69 6c 6c 20 74 65 6c 6c 20 74  that will tell t
a0d0: 68 65 20 56 44 42 45 20 74 68 65 20 64 65 63 6c  he VDBE the decl
a0e0: 61 72 61 74 69 6f 6e 20 74 79 70 65 73 20 6f 66  aration types of
a0f0: 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74   columns.** in t
a100: 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 0a 2a  he result set..*
a110: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 65  /.static void ge
a120: 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65  nerateColumnType
a130: 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  s(.  Parse *pPar
a140: 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73  se,      /* Pars
a150: 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
a160: 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
a170: 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74  t,  /* List of t
a180: 61 62 6c 65 73 20 2a 2f 0a 20 20 45 78 70 72 4c  ables */.  ExprL
a190: 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20 2f  ist *pEList    /
a1a0: 2a 20 45 78 70 72 65 73 73 69 6f 6e 73 20 64 65  * Expressions de
a1b0: 66 69 6e 69 6e 67 20 74 68 65 20 72 65 73 75 6c  fining the resul
a1c0: 74 20 73 65 74 20 2a 2f 0a 29 7b 0a 23 69 66 6e  t set */.){.#ifn
a1d0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
a1e0: 44 45 43 4c 54 59 50 45 0a 20 20 56 64 62 65 20  DECLTYPE.  Vdbe 
a1f0: 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
a200: 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4e  be;.  int i;.  N
a210: 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a  ameContext sNC;.
a220: 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d    sNC.pSrcList =
a230: 20 70 54 61 62 4c 69 73 74 3b 0a 20 20 73 4e 43   pTabList;.  sNC
a240: 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65  .pParse = pParse
a250: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
a260: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  EList->nExpr; i+
a270: 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 20  +){.    Expr *p 
a280: 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  = pEList->a[i].p
a290: 45 78 70 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20  Expr;.    const 
a2a0: 63 68 61 72 20 2a 7a 54 79 70 65 3b 0a 23 69 66  char *zType;.#if
a2b0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
a2c0: 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54  E_COLUMN_METADAT
a2d0: 41 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  A.    const char
a2e0: 20 2a 7a 4f 72 69 67 44 62 20 3d 20 30 3b 0a 20   *zOrigDb = 0;. 
a2f0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
a300: 4f 72 69 67 54 61 62 20 3d 20 30 3b 0a 20 20 20  OrigTab = 0;.   
a310: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72   const char *zOr
a320: 69 67 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 7a  igCol = 0;.    z
a330: 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70  Type = columnTyp
a340: 65 28 26 73 4e 43 2c 20 70 2c 20 26 7a 4f 72 69  e(&sNC, p, &zOri
a350: 67 44 62 2c 20 26 7a 4f 72 69 67 54 61 62 2c 20  gDb, &zOrigTab, 
a360: 26 7a 4f 72 69 67 43 6f 6c 29 3b 0a 0a 20 20 20  &zOrigCol);..   
a370: 20 2f 2a 20 54 68 65 20 76 64 62 65 20 6d 75 73   /* The vdbe mus
a380: 74 20 6d 61 6b 65 20 69 74 73 20 6f 77 6e 20 63  t make its own c
a390: 6f 70 79 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  opy of the colum
a3a0: 6e 2d 74 79 70 65 20 61 6e 64 20 6f 74 68 65 72  n-type and other
a3b0: 20 0a 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20   .    ** column 
a3c0: 73 70 65 63 69 66 69 63 20 73 74 72 69 6e 67 73  specific strings
a3d0: 2c 20 69 6e 20 63 61 73 65 20 74 68 65 20 73 63  , in case the sc
a3e0: 68 65 6d 61 20 69 73 20 72 65 73 65 74 20 62 65  hema is reset be
a3f0: 66 6f 72 65 20 74 68 69 73 0a 20 20 20 20 2a 2a  fore this.    **
a400: 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
a410: 20 69 73 20 64 65 6c 65 74 65 64 2e 0a 20 20 20   is deleted..   
a420: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56   */.    sqlite3V
a430: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
a440: 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 44 41 54 41   i, COLNAME_DATA
a450: 42 41 53 45 2c 20 7a 4f 72 69 67 44 62 2c 20 53  BASE, zOrigDb, S
a460: 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
a470: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
a480: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69  eSetColName(v, i
a490: 2c 20 43 4f 4c 4e 41 4d 45 5f 54 41 42 4c 45 2c  , COLNAME_TABLE,
a4a0: 20 7a 4f 72 69 67 54 61 62 2c 20 53 51 4c 49 54   zOrigTab, SQLIT
a4b0: 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
a4c0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
a4d0: 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f  ColName(v, i, CO
a4e0: 4c 4e 41 4d 45 5f 43 4f 4c 55 4d 4e 2c 20 7a 4f  LNAME_COLUMN, zO
a4f0: 72 69 67 43 6f 6c 2c 20 53 51 4c 49 54 45 5f 54  rigCol, SQLITE_T
a500: 52 41 4e 53 49 45 4e 54 29 3b 0a 23 65 6c 73 65  RANSIENT);.#else
a510: 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c  .    zType = col
a520: 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c  umnType(&sNC, p,
a530: 20 30 2c 20 30 2c 20 30 29 3b 0a 23 65 6e 64 69   0, 0, 0);.#endi
a540: 66 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  f.    sqlite3Vdb
a550: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69  eSetColName(v, i
a560: 2c 20 43 4f 4c 4e 41 4d 45 5f 44 45 43 4c 54 59  , COLNAME_DECLTY
a570: 50 45 2c 20 7a 54 79 70 65 2c 20 53 51 4c 49 54  PE, zType, SQLIT
a580: 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
a590: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
a5a0: 54 45 5f 4f 4d 49 54 5f 44 45 43 4c 54 59 50 45  TE_OMIT_DECLTYPE
a5b0: 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e   */.}../*.** Gen
a5c0: 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
a5d0: 77 69 6c 6c 20 74 65 6c 6c 20 74 68 65 20 56 44  will tell the VD
a5e0: 42 45 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20  BE the names of 
a5f0: 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68  columns.** in th
a600: 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20 20 54  e result set.  T
a610: 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  his information 
a620: 69 73 20 75 73 65 64 20 74 6f 20 70 72 6f 76 69  is used to provi
a630: 64 65 20 74 68 65 0a 2a 2a 20 61 7a 43 6f 6c 5b  de the.** azCol[
a640: 5d 20 76 61 6c 75 65 73 20 69 6e 20 74 68 65 20  ] values in the 
a650: 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61  callback..*/.sta
a660: 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74  tic void generat
a670: 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 0a 20 20  eColumnNames(.  
a680: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
a690: 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f      /* Parser co
a6a0: 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69  ntext */.  SrcLi
a6b0: 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 2f  st *pTabList,  /
a6c0: 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73  * List of tables
a6d0: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
a6e0: 70 45 4c 69 73 74 20 20 20 20 2f 2a 20 45 78 70  pEList    /* Exp
a6f0: 72 65 73 73 69 6f 6e 73 20 64 65 66 69 6e 69 6e  ressions definin
a700: 67 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  g the result set
a710: 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76   */.){.  Vdbe *v
a720: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
a730: 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  ;.  int i, j;.  
a740: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
a750: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20  arse->db;.  int 
a760: 66 75 6c 6c 4e 61 6d 65 73 2c 20 73 68 6f 72 74  fullNames, short
a770: 4e 61 6d 65 73 3b 0a 0a 23 69 66 6e 64 65 66 20  Names;..#ifndef 
a780: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
a790: 41 49 4e 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  AIN.  /* If this
a7a0: 20 69 73 20 61 6e 20 45 58 50 4c 41 49 4e 2c 20   is an EXPLAIN, 
a7b0: 73 6b 69 70 20 74 68 69 73 20 73 74 65 70 20 2a  skip this step *
a7c0: 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  /.  if( pParse->
a7d0: 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 72  explain ){.    r
a7e0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69  eturn;.  }.#endi
a7f0: 66 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  f..  if( pParse-
a800: 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 7c 7c 20  >colNamesSet || 
a810: 4e 45 56 45 52 28 76 3d 3d 30 29 20 7c 7c 20 64  NEVER(v==0) || d
a820: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
a830: 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 50 61 72  ) return;.  pPar
a840: 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20  se->colNamesSet 
a850: 3d 20 31 3b 0a 20 20 66 75 6c 6c 4e 61 6d 65 73  = 1;.  fullNames
a860: 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20   = (db->flags & 
a870: 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61  SQLITE_FullColNa
a880: 6d 65 73 29 21 3d 30 3b 0a 20 20 73 68 6f 72 74  mes)!=0;.  short
a890: 4e 61 6d 65 73 20 3d 20 28 64 62 2d 3e 66 6c 61  Names = (db->fla
a8a0: 67 73 20 26 20 53 51 4c 49 54 45 5f 53 68 6f 72  gs & SQLITE_Shor
a8b0: 74 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a 20  tColNames)!=0;. 
a8c0: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e   sqlite3VdbeSetN
a8d0: 75 6d 43 6f 6c 73 28 76 2c 20 70 45 4c 69 73 74  umCols(v, pEList
a8e0: 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 66 6f 72 28  ->nExpr);.  for(
a8f0: 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e  i=0; i<pEList->n
a900: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
a910: 45 78 70 72 20 2a 70 3b 0a 20 20 20 20 70 20 3d  Expr *p;.    p =
a920: 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45   pEList->a[i].pE
a930: 78 70 72 3b 0a 20 20 20 20 69 66 28 20 4e 45 56  xpr;.    if( NEV
a940: 45 52 28 70 3d 3d 30 29 20 29 20 63 6f 6e 74 69  ER(p==0) ) conti
a950: 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 45 4c  nue;.    if( pEL
a960: 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20  ist->a[i].zName 
a970: 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  ){.      char *z
a980: 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61  Name = pEList->a
a990: 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  [i].zName;.     
a9a0: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
a9b0: 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c  olName(v, i, COL
a9c0: 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65  NAME_NAME, zName
a9d0: 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
a9e0: 4e 54 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  NT);.    }else i
a9f0: 66 28 20 28 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  f( (p->op==TK_CO
aa00: 4c 55 4d 4e 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54  LUMN || p->op==T
aa10: 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 29 20 26 26  K_AGG_COLUMN) &&
aa20: 20 70 54 61 62 4c 69 73 74 20 29 7b 0a 20 20 20   pTabList ){.   
aa30: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a     Table *pTab;.
aa40: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c        char *zCol
aa50: 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c  ;.      int iCol
aa60: 20 3d 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20   = p->iColumn;. 
aa70: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 41 4c       for(j=0; AL
aa80: 57 41 59 53 28 6a 3c 70 54 61 62 4c 69 73 74 2d  WAYS(j<pTabList-
aa90: 3e 6e 53 72 63 29 3b 20 6a 2b 2b 29 7b 0a 20 20  >nSrc); j++){.  
aaa0: 20 20 20 20 20 20 69 66 28 20 70 54 61 62 4c 69        if( pTabLi
aab0: 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f 72  st->a[j].iCursor
aac0: 3d 3d 70 2d 3e 69 54 61 62 6c 65 20 29 20 62 72  ==p->iTable ) br
aad0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
aae0: 20 20 20 61 73 73 65 72 74 28 20 6a 3c 70 54 61     assert( j<pTa
aaf0: 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 3b 0a 20  bList->nSrc );. 
ab00: 20 20 20 20 20 70 54 61 62 20 3d 20 70 54 61 62       pTab = pTab
ab10: 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 54 61 62 3b  List->a[j].pTab;
ab20: 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c  .      if( iCol<
ab30: 30 20 29 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d  0 ) iCol = pTab-
ab40: 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 61 73  >iPKey;.      as
ab50: 73 65 72 74 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c  sert( iCol==-1 |
ab60: 7c 20 28 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43  | (iCol>=0 && iC
ab70: 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29  ol<pTab->nCol) )
ab80: 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c  ;.      if( iCol
ab90: 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 43  <0 ){.        zC
aba0: 6f 6c 20 3d 20 22 72 6f 77 69 64 22 3b 0a 20 20  ol = "rowid";.  
abb0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
abc0: 20 20 20 7a 43 6f 6c 20 3d 20 70 54 61 62 2d 3e     zCol = pTab->
abd0: 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65  aCol[iCol].zName
abe0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
abf0: 69 66 28 20 21 73 68 6f 72 74 4e 61 6d 65 73 20  if( !shortNames 
ac00: 26 26 20 21 66 75 6c 6c 4e 61 6d 65 73 20 29 7b  && !fullNames ){
ac10: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
ac20: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76  VdbeSetColName(v
ac30: 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d  , i, COLNAME_NAM
ac40: 45 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  E, .            
ac50: 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
ac60: 64 62 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  db, pEList->a[i]
ac70: 2e 7a 53 70 61 6e 29 2c 20 53 51 4c 49 54 45 5f  .zSpan), SQLITE_
ac80: 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20  DYNAMIC);.      
ac90: 7d 65 6c 73 65 20 69 66 28 20 66 75 6c 6c 4e 61  }else if( fullNa
aca0: 6d 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20 63  mes ){.        c
acb0: 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a  har *zName = 0;.
acc0: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
acd0: 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
ace0: 62 2c 20 22 25 73 2e 25 73 22 2c 20 70 54 61 62  b, "%s.%s", pTab
acf0: 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3b 0a  ->zName, zCol);.
ad00: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
ad10: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
ad20: 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45   i, COLNAME_NAME
ad30: 2c 20 7a 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f  , zName, SQLITE_
ad40: 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20  DYNAMIC);.      
ad50: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
ad60: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
ad70: 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41  Name(v, i, COLNA
ad80: 4d 45 5f 4e 41 4d 45 2c 20 7a 43 6f 6c 2c 20 53  ME_NAME, zCol, S
ad90: 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
ada0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
adb0: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
adc0: 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
add0: 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e  (v, i, COLNAME_N
ade0: 41 4d 45 2c 20 0a 20 20 20 20 20 20 20 20 20 20  AME, .          
adf0: 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
ae00: 64 62 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  db, pEList->a[i]
ae10: 2e 7a 53 70 61 6e 29 2c 20 53 51 4c 49 54 45 5f  .zSpan), SQLITE_
ae20: 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 7d 0a  DYNAMIC);.    }.
ae30: 20 20 7d 0a 20 20 67 65 6e 65 72 61 74 65 43 6f    }.  generateCo
ae40: 6c 75 6d 6e 54 79 70 65 73 28 70 50 61 72 73 65  lumnTypes(pParse
ae50: 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69  , pTabList, pELi
ae60: 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69  st);.}../*.** Gi
ae70: 76 65 6e 20 61 20 61 6e 20 65 78 70 72 65 73 73  ven a an express
ae80: 69 6f 6e 20 6c 69 73 74 20 28 77 68 69 63 68 20  ion list (which 
ae90: 69 73 20 72 65 61 6c 6c 79 20 74 68 65 20 6c 69  is really the li
aea0: 73 74 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e  st of expression
aeb0: 73 0a 2a 2a 20 74 68 61 74 20 66 6f 72 6d 20 74  s.** that form t
aec0: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66  he result set of
aed0: 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
aee0: 65 6e 74 29 20 63 6f 6d 70 75 74 65 20 61 70 70  ent) compute app
aef0: 72 6f 70 72 69 61 74 65 0a 2a 2a 20 63 6f 6c 75  ropriate.** colu
af00: 6d 6e 20 6e 61 6d 65 73 20 66 6f 72 20 61 20 74  mn names for a t
af10: 61 62 6c 65 20 74 68 61 74 20 77 6f 75 6c 64 20  able that would 
af20: 68 6f 6c 64 20 74 68 65 20 65 78 70 72 65 73 73  hold the express
af30: 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20  ion list..**.** 
af40: 41 6c 6c 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  All column names
af50: 20 77 69 6c 6c 20 62 65 20 75 6e 69 71 75 65 2e   will be unique.
af60: 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65 20  .**.** Only the 
af70: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61 72 65  column names are
af80: 20 63 6f 6d 70 75 74 65 64 2e 20 20 43 6f 6c 75   computed.  Colu
af90: 6d 6e 2e 7a 54 79 70 65 2c 20 43 6f 6c 75 6d 6e  mn.zType, Column
afa0: 2e 7a 43 6f 6c 6c 2c 0a 2a 2a 20 61 6e 64 20 6f  .zColl,.** and o
afb0: 74 68 65 72 20 66 69 65 6c 64 73 20 6f 66 20 43  ther fields of C
afc0: 6f 6c 75 6d 6e 20 61 72 65 20 7a 65 72 6f 65 64  olumn are zeroed
afd0: 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ..**.** Return S
afe0: 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
aff0: 65 73 73 2e 20 20 49 66 20 61 20 6d 65 6d 6f 72  ess.  If a memor
b000: 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72  y allocation err
b010: 6f 72 20 6f 63 63 75 72 73 2c 0a 2a 2a 20 73 74  or occurs,.** st
b020: 6f 72 65 20 4e 55 4c 4c 20 69 6e 20 2a 70 61 43  ore NULL in *paC
b030: 6f 6c 20 61 6e 64 20 30 20 69 6e 20 2a 70 6e 43  ol and 0 in *pnC
b040: 6f 6c 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51  ol and return SQ
b050: 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 0a 2a 2f 0a 73  LITE_NOMEM..*/.s
b060: 74 61 74 69 63 20 69 6e 74 20 73 65 6c 65 63 74  tatic int select
b070: 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c  ColumnsFromExprL
b080: 69 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ist(.  Parse *pP
b090: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f  arse,          /
b0a0: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
b0b0: 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
b0c0: 2a 70 45 4c 69 73 74 2c 20 20 20 20 20 20 20 2f  *pEList,       /
b0d0: 2a 20 45 78 70 72 20 6c 69 73 74 20 66 72 6f 6d  * Expr list from
b0e0: 20 77 68 69 63 68 20 74 6f 20 64 65 72 69 76 65   which to derive
b0f0: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f   column names */
b100: 0a 20 20 69 31 36 20 2a 70 6e 43 6f 6c 2c 20 20  .  i16 *pnCol,  
b110: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
b120: 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ite the number o
b130: 66 20 63 6f 6c 75 6d 6e 73 20 68 65 72 65 20 2a  f columns here *
b140: 2f 0a 20 20 43 6f 6c 75 6d 6e 20 2a 2a 70 61 43  /.  Column **paC
b150: 6f 6c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  ol          /* W
b160: 72 69 74 65 20 74 68 65 20 6e 65 77 20 63 6f 6c  rite the new col
b170: 75 6d 6e 20 6c 69 73 74 20 68 65 72 65 20 2a 2f  umn list here */
b180: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
b190: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20  b = pParse->db; 
b1a0: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f    /* Database co
b1b0: 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  nnection */.  in
b1c0: 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20  t i, j;         
b1d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
b1e0: 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20  p counters */.  
b1f0: 69 6e 74 20 63 6e 74 3b 20 20 20 20 20 20 20 20  int cnt;        
b200: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
b210: 6e 64 65 78 20 61 64 64 65 64 20 74 6f 20 6d 61  ndex added to ma
b220: 6b 65 20 74 68 65 20 6e 61 6d 65 20 75 6e 69 71  ke the name uniq
b230: 75 65 20 2a 2f 0a 20 20 43 6f 6c 75 6d 6e 20 2a  ue */.  Column *
b240: 61 43 6f 6c 2c 20 2a 70 43 6f 6c 3b 20 20 20 20  aCol, *pCol;    
b250: 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69      /* For loopi
b260: 6e 67 20 6f 76 65 72 20 72 65 73 75 6c 74 20 63  ng over result c
b270: 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  olumns */.  int 
b280: 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20  nCol;           
b290: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
b2a0: 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
b2b0: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a  the result set *
b2c0: 2f 0a 20 20 45 78 70 72 20 2a 70 3b 20 20 20 20  /.  Expr *p;    
b2d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b2e0: 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 66 6f  /* Expression fo
b2f0: 72 20 61 20 73 69 6e 67 6c 65 20 72 65 73 75 6c  r a single resul
b300: 74 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63 68  t column */.  ch
b310: 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 20  ar *zName;      
b320: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
b330: 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e  umn name */.  in
b340: 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20 20  t nName;        
b350: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
b360: 65 20 6f 66 20 6e 61 6d 65 20 69 6e 20 7a 4e 61  e of name in zNa
b370: 6d 65 5b 5d 20 2a 2f 0a 0a 20 20 69 66 28 20 70  me[] */..  if( p
b380: 45 4c 69 73 74 20 29 7b 0a 20 20 20 20 6e 43 6f  EList ){.    nCo
b390: 6c 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  l = pEList->nExp
b3a0: 72 3b 0a 20 20 20 20 61 43 6f 6c 20 3d 20 73 71  r;.    aCol = sq
b3b0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
b3c0: 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 61 43 6f  o(db, sizeof(aCo
b3d0: 6c 5b 30 5d 29 2a 6e 43 6f 6c 29 3b 0a 20 20 20  l[0])*nCol);.   
b3e0: 20 74 65 73 74 63 61 73 65 28 20 61 43 6f 6c 3d   testcase( aCol=
b3f0: 3d 30 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  =0 );.  }else{. 
b400: 20 20 20 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20     nCol = 0;.   
b410: 20 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20   aCol = 0;.  }. 
b420: 20 2a 70 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a   *pnCol = nCol;.
b430: 20 20 2a 70 61 43 6f 6c 20 3d 20 61 43 6f 6c 3b    *paCol = aCol;
b440: 0a 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 43 6f  ..  for(i=0, pCo
b450: 6c 3d 61 43 6f 6c 3b 20 69 3c 6e 43 6f 6c 3b 20  l=aCol; i<nCol; 
b460: 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20  i++, pCol++){.  
b470: 20 20 2f 2a 20 47 65 74 20 61 6e 20 61 70 70 72    /* Get an appr
b480: 6f 70 72 69 61 74 65 20 6e 61 6d 65 20 66 6f 72  opriate name for
b490: 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 20 20 20 20   the column.    
b4a0: 2a 2f 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74  */.    p = sqlit
b4b0: 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74  e3ExprSkipCollat
b4c0: 65 28 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  e(pEList->a[i].p
b4d0: 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20 28  Expr);.    if( (
b4e0: 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e  zName = pEList->
b4f0: 61 5b 69 5d 2e 7a 4e 61 6d 65 29 21 3d 30 20 29  a[i].zName)!=0 )
b500: 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
b510: 65 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e  e column contain
b520: 73 20 61 6e 20 22 41 53 20 3c 6e 61 6d 65 3e 22  s an "AS <name>"
b530: 20 70 68 72 61 73 65 2c 20 75 73 65 20 3c 6e 61   phrase, use <na
b540: 6d 65 3e 20 61 73 20 74 68 65 20 6e 61 6d 65 20  me> as the name 
b550: 2a 2f 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  */.      zName =
b560: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
b570: 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  (db, zName);.   
b580: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 45 78   }else{.      Ex
b590: 70 72 20 2a 70 43 6f 6c 45 78 70 72 20 3d 20 70  pr *pColExpr = p
b5a0: 3b 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73  ;  /* The expres
b5b0: 73 69 6f 6e 20 74 68 61 74 20 69 73 20 74 68 65  sion that is the
b5c0: 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 20 6e   result column n
b5d0: 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 54 61 62  ame */.      Tab
b5e0: 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20  le *pTab;       
b5f0: 20 20 2f 2a 20 54 61 62 6c 65 20 61 73 73 6f 63    /* Table assoc
b600: 69 61 74 65 64 20 77 69 74 68 20 74 68 69 73 20  iated with this 
b610: 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20  expression */.  
b620: 20 20 20 20 77 68 69 6c 65 28 20 70 43 6f 6c 45      while( pColE
b630: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20  xpr->op==TK_DOT 
b640: 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 45  ){.        pColE
b650: 78 70 72 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e  xpr = pColExpr->
b660: 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20  pRight;.        
b670: 61 73 73 65 72 74 28 20 70 43 6f 6c 45 78 70 72  assert( pColExpr
b680: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20  !=0 );.      }. 
b690: 20 20 20 20 20 69 66 28 20 70 43 6f 6c 45 78 70       if( pColExp
b6a0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op==TK_COLUMN
b6b0: 20 26 26 20 41 4c 57 41 59 53 28 70 43 6f 6c 45   && ALWAYS(pColE
b6c0: 78 70 72 2d 3e 70 54 61 62 21 3d 30 29 20 29 7b  xpr->pTab!=0) ){
b6d0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20  .        /* For 
b6e0: 63 6f 6c 75 6d 6e 73 20 75 73 65 20 74 68 65 20  columns use the 
b6f0: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 6e 61 6d 65  column name name
b700: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
b710: 69 43 6f 6c 20 3d 20 70 43 6f 6c 45 78 70 72 2d  iCol = pColExpr-
b720: 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  >iColumn;.      
b730: 20 20 70 54 61 62 20 3d 20 70 43 6f 6c 45 78 70    pTab = pColExp
b740: 72 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 20  r->pTab;.       
b750: 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43   if( iCol<0 ) iC
b760: 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79  ol = pTab->iPKey
b770: 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  ;.        zName 
b780: 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
b790: 28 64 62 2c 20 22 25 73 22 2c 0a 20 20 20 20 20  (db, "%s",.     
b7a0: 20 20 20 20 20 20 20 20 20 20 20 20 69 43 6f 6c              iCol
b7b0: 3e 3d 30 20 3f 20 70 54 61 62 2d 3e 61 43 6f 6c  >=0 ? pTab->aCol
b7c0: 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 20 3a 20 22  [iCol].zName : "
b7d0: 72 6f 77 69 64 22 29 3b 0a 20 20 20 20 20 20 7d  rowid");.      }
b7e0: 65 6c 73 65 20 69 66 28 20 70 43 6f 6c 45 78 70  else if( pColExp
b7f0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 7b 0a  r->op==TK_ID ){.
b800: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
b810: 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
b820: 28 70 43 6f 6c 45 78 70 72 2c 20 45 50 5f 49 6e  (pColExpr, EP_In
b830: 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20  tValue) );.     
b840: 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74     zName = sqlit
b850: 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25  e3MPrintf(db, "%
b860: 73 22 2c 20 70 43 6f 6c 45 78 70 72 2d 3e 75 2e  s", pColExpr->u.
b870: 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 7d  zToken);.      }
b880: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
b890: 20 55 73 65 20 74 68 65 20 6f 72 69 67 69 6e 61   Use the origina
b8a0: 6c 20 74 65 78 74 20 6f 66 20 74 68 65 20 63 6f  l text of the co
b8b0: 6c 75 6d 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  lumn expression 
b8c0: 61 73 20 69 74 73 20 6e 61 6d 65 20 2a 2f 0a 20  as its name */. 
b8d0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73         zName = s
b8e0: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
b8f0: 2c 20 22 25 73 22 2c 20 70 45 4c 69 73 74 2d 3e  , "%s", pEList->
b900: 61 5b 69 5d 2e 7a 53 70 61 6e 29 3b 0a 20 20 20  a[i].zSpan);.   
b910: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
b920: 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
b930: 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  led ){.      sql
b940: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
b950: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 62 72 65  Name);.      bre
b960: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
b970: 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
b980: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 73 20 75  column name is u
b990: 6e 69 71 75 65 2e 20 20 49 66 20 74 68 65 20 6e  nique.  If the n
b9a0: 61 6d 65 20 69 73 20 6e 6f 74 20 75 6e 69 71 75  ame is not uniqu
b9b0: 65 2c 0a 20 20 20 20 2a 2a 20 61 70 70 65 6e 64  e,.    ** append
b9c0: 20 61 20 69 6e 74 65 67 65 72 20 74 6f 20 74 68   a integer to th
b9d0: 65 20 6e 61 6d 65 20 73 6f 20 74 68 61 74 20 69  e name so that i
b9e0: 74 20 62 65 63 6f 6d 65 73 20 75 6e 69 71 75 65  t becomes unique
b9f0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e 4e 61  ..    */.    nNa
ba00: 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  me = sqlite3Strl
ba10: 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 20  en30(zName);.   
ba20: 20 66 6f 72 28 6a 3d 63 6e 74 3d 30 3b 20 6a 3c   for(j=cnt=0; j<
ba30: 69 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69  i; j++){.      i
ba40: 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
ba50: 70 28 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c  p(aCol[j].zName,
ba60: 20 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20   zName)==0 ){.  
ba70: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 65 77        char *zNew
ba80: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 6e  Name;.        in
ba90: 74 20 6b 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  t k;.        for
baa0: 28 6b 3d 6e 4e 61 6d 65 2d 31 3b 20 6b 3e 31 20  (k=nName-1; k>1 
bab0: 26 26 20 73 71 6c 69 74 65 33 49 73 64 69 67 69  && sqlite3Isdigi
bac0: 74 28 7a 4e 61 6d 65 5b 6b 5d 29 3b 20 6b 2d 2d  t(zName[k]); k--
bad0: 29 7b 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20  ){}.        if( 
bae0: 7a 4e 61 6d 65 5b 6b 5d 3d 3d 27 3a 27 20 29 20  zName[k]==':' ) 
baf0: 6e 4e 61 6d 65 20 3d 20 6b 3b 0a 20 20 20 20 20  nName = k;.     
bb00: 20 20 20 7a 4e 61 6d 65 5b 6e 4e 61 6d 65 5d 20     zName[nName] 
bb10: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7a 4e 65  = 0;.        zNe
bb20: 77 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d  wName = sqlite3M
bb30: 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 3a 25  Printf(db, "%s:%
bb40: 64 22 2c 20 7a 4e 61 6d 65 2c 20 2b 2b 63 6e 74  d", zName, ++cnt
bb50: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
bb60: 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e 61  e3DbFree(db, zNa
bb70: 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61  me);.        zNa
bb80: 6d 65 20 3d 20 7a 4e 65 77 4e 61 6d 65 3b 0a 20  me = zNewName;. 
bb90: 20 20 20 20 20 20 20 6a 20 3d 20 2d 31 3b 0a 20         j = -1;. 
bba0: 20 20 20 20 20 20 20 69 66 28 20 7a 4e 61 6d 65         if( zName
bbb0: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
bbc0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
bbd0: 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61  Col->zName = zNa
bbe0: 6d 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 64 62  me;.  }.  if( db
bbf0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
bc00: 7b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  {.    for(j=0; j
bc10: 3c 69 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  <i; j++){.      
bc20: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
bc30: 2c 20 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 29  , aCol[j].zName)
bc40: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
bc50: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 61 43  te3DbFree(db, aC
bc60: 6f 6c 29 3b 0a 20 20 20 20 2a 70 61 43 6f 6c 20  ol);.    *paCol 
bc70: 3d 20 30 3b 0a 20 20 20 20 2a 70 6e 43 6f 6c 20  = 0;.    *pnCol 
bc80: 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 0;.    return 
bc90: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
bca0: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
bcb0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  E_OK;.}../*.** A
bcc0: 64 64 20 74 79 70 65 20 61 6e 64 20 63 6f 6c 6c  dd type and coll
bcd0: 61 74 69 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f  ation informatio
bce0: 6e 20 74 6f 20 61 20 63 6f 6c 75 6d 6e 20 6c 69  n to a column li
bcf0: 73 74 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 61  st based on.** a
bd00: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
bd10: 74 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 65 20 63 6f  t..** .** The co
bd20: 6c 75 6d 6e 20 6c 69 73 74 20 70 72 65 73 75 6d  lumn list presum
bd30: 61 62 6c 79 20 63 61 6d 65 20 66 72 6f 6d 20 73  ably came from s
bd40: 65 6c 65 63 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73  electColumnNames
bd50: 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 29 2e 0a  FromExprList()..
bd60: 2a 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6c 69  ** The column li
bd70: 73 74 20 68 61 73 20 6f 6e 6c 79 20 6e 61 6d 65  st has only name
bd80: 73 2c 20 6e 6f 74 20 74 79 70 65 73 20 6f 72 20  s, not types or 
bd90: 63 6f 6c 6c 61 74 69 6f 6e 73 2e 20 20 54 68 69  collations.  Thi
bda0: 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67 6f 65  s.** routine goe
bdb0: 73 20 74 68 72 6f 75 67 68 20 61 6e 64 20 61 64  s through and ad
bdc0: 64 73 20 74 68 65 20 74 79 70 65 73 20 61 6e 64  ds the types and
bdd0: 20 63 6f 6c 6c 61 74 69 6f 6e 73 2e 0a 2a 2a 0a   collations..**.
bde0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
bdf0: 72 65 71 75 69 72 65 73 20 74 68 61 74 20 61 6c  requires that al
be00: 6c 20 69 64 65 6e 74 69 66 69 65 72 73 20 69 6e  l identifiers in
be10: 20 74 68 65 20 53 45 4c 45 43 54 0a 2a 2a 20 73   the SELECT.** s
be20: 74 61 74 65 6d 65 6e 74 20 62 65 20 72 65 73 6f  tatement be reso
be30: 6c 76 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lved..*/.static 
be40: 76 6f 69 64 20 73 65 6c 65 63 74 41 64 64 43 6f  void selectAddCo
be50: 6c 75 6d 6e 54 79 70 65 41 6e 64 43 6f 6c 6c 61  lumnTypeAndColla
be60: 74 69 6f 6e 28 0a 20 20 50 61 72 73 65 20 2a 70  tion(.  Parse *p
be70: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a  Parse,        /*
be80: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
be90: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 2c  s */.  int nCol,
bea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
beb0: 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  Number of column
bec0: 73 20 2a 2f 0a 20 20 43 6f 6c 75 6d 6e 20 2a 61  s */.  Column *a
bed0: 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  Col,         /* 
bee0: 4c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  List of columns 
bef0: 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65  */.  Select *pSe
bf00: 6c 65 63 74 20 20 20 20 20 20 20 2f 2a 20 53 45  lect       /* SE
bf10: 4c 45 43 54 20 75 73 65 64 20 74 6f 20 64 65 74  LECT used to det
bf20: 65 72 6d 69 6e 65 20 74 79 70 65 73 20 61 6e 64  ermine types and
bf30: 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 2a 2f 0a 29   collations */.)
bf40: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
bf50: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
bf60: 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b  NameContext sNC;
bf70: 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b  .  Column *pCol;
bf80: 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  .  CollSeq *pCol
bf90: 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 45 78  l;.  int i;.  Ex
bfa0: 70 72 20 2a 70 3b 0a 20 20 73 74 72 75 63 74 20  pr *p;.  struct 
bfb0: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61  ExprList_item *a
bfc0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 53 65  ;..  assert( pSe
bfd0: 6c 65 63 74 21 3d 30 20 29 3b 0a 20 20 61 73 73  lect!=0 );.  ass
bfe0: 65 72 74 28 20 28 70 53 65 6c 65 63 74 2d 3e 73  ert( (pSelect->s
bff0: 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65 73  elFlags & SF_Res
c000: 6f 6c 76 65 64 29 21 3d 30 20 29 3b 0a 20 20 61  olved)!=0 );.  a
c010: 73 73 65 72 74 28 20 6e 43 6f 6c 3d 3d 70 53 65  ssert( nCol==pSe
c020: 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  lect->pEList->nE
c030: 78 70 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  xpr || db->mallo
c040: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28  cFailed );.  if(
c050: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
c060: 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 6d 65  d ) return;.  me
c070: 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c 20 73 69  mset(&sNC, 0, si
c080: 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20 73 4e  zeof(sNC));.  sN
c090: 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 53 65  C.pSrcList = pSe
c0a0: 6c 65 63 74 2d 3e 70 53 72 63 3b 0a 20 20 61 20  lect->pSrc;.  a 
c0b0: 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  = pSelect->pELis
c0c0: 74 2d 3e 61 3b 0a 20 20 66 6f 72 28 69 3d 30 2c  t->a;.  for(i=0,
c0d0: 20 70 43 6f 6c 3d 61 43 6f 6c 3b 20 69 3c 6e 43   pCol=aCol; i<nC
c0e0: 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29  ol; i++, pCol++)
c0f0: 7b 0a 20 20 20 20 70 20 3d 20 61 5b 69 5d 2e 70  {.    p = a[i].p
c100: 45 78 70 72 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e  Expr;.    pCol->
c110: 7a 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33 44  zType = sqlite3D
c120: 62 53 74 72 44 75 70 28 64 62 2c 20 63 6f 6c 75  bStrDup(db, colu
c130: 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20  mnType(&sNC, p, 
c140: 30 2c 20 30 2c 20 30 29 29 3b 0a 20 20 20 20 70  0, 0, 0));.    p
c150: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20  Col->affinity = 
c160: 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e  sqlite3ExprAffin
c170: 69 74 79 28 70 29 3b 0a 20 20 20 20 69 66 28 20  ity(p);.    if( 
c180: 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d  pCol->affinity==
c190: 30 20 29 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69  0 ) pCol->affini
c1a0: 74 79 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ty = SQLITE_AFF_
c1b0: 4e 4f 4e 45 3b 0a 20 20 20 20 70 43 6f 6c 6c 20  NONE;.    pColl 
c1c0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
c1d0: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 29 3b  lSeq(pParse, p);
c1e0: 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 29  .    if( pColl )
c1f0: 7b 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 43  {.      pCol->zC
c200: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 44 62 53  oll = sqlite3DbS
c210: 74 72 44 75 70 28 64 62 2c 20 70 43 6f 6c 6c 2d  trDup(db, pColl-
c220: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20  >zName);.    }. 
c230: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65   }.}../*.** Give
c240: 6e 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  n a SELECT state
c250: 6d 65 6e 74 2c 20 67 65 6e 65 72 61 74 65 20 61  ment, generate a
c260: 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   Table structure
c270: 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73 0a   that describes.
c280: 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  ** the result se
c290: 74 20 6f 66 20 74 68 61 74 20 53 45 4c 45 43 54  t of that SELECT
c2a0: 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69  ..*/.Table *sqli
c2b0: 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65  te3ResultSetOfSe
c2c0: 6c 65 63 74 28 50 61 72 73 65 20 2a 70 50 61 72  lect(Parse *pPar
c2d0: 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  se, Select *pSel
c2e0: 65 63 74 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  ect){.  Table *p
c2f0: 54 61 62 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  Tab;.  sqlite3 *
c300: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
c310: 0a 20 20 69 6e 74 20 73 61 76 65 64 46 6c 61 67  .  int savedFlag
c320: 73 3b 0a 0a 20 20 73 61 76 65 64 46 6c 61 67 73  s;..  savedFlags
c330: 20 3d 20 64 62 2d 3e 66 6c 61 67 73 3b 0a 20 20   = db->flags;.  
c340: 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51  db->flags &= ~SQ
c350: 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65  LITE_FullColName
c360: 73 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c  s;.  db->flags |
c370: 3d 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f  = SQLITE_ShortCo
c380: 6c 4e 61 6d 65 73 3b 0a 20 20 73 71 6c 69 74 65  lNames;.  sqlite
c390: 33 53 65 6c 65 63 74 50 72 65 70 28 70 50 61 72  3SelectPrep(pPar
c3a0: 73 65 2c 20 70 53 65 6c 65 63 74 2c 20 30 29 3b  se, pSelect, 0);
c3b0: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
c3c0: 45 72 72 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  Err ) return 0;.
c3d0: 20 20 77 68 69 6c 65 28 20 70 53 65 6c 65 63 74    while( pSelect
c3e0: 2d 3e 70 50 72 69 6f 72 20 29 20 70 53 65 6c 65  ->pPrior ) pSele
c3f0: 63 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 50  ct = pSelect->pP
c400: 72 69 6f 72 3b 0a 20 20 64 62 2d 3e 66 6c 61 67  rior;.  db->flag
c410: 73 20 3d 20 73 61 76 65 64 46 6c 61 67 73 3b 0a  s = savedFlags;.
c420: 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33    pTab = sqlite3
c430: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
c440: 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 20 29   sizeof(Table) )
c450: 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20  ;.  if( pTab==0 
c460: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
c470: 0a 20 20 7d 0a 20 20 2f 2a 20 54 68 65 20 73 71  .  }.  /* The sq
c480: 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66  lite3ResultSetOf
c490: 53 65 6c 65 63 74 28 29 20 69 73 20 6f 6e 6c 79  Select() is only
c4a0: 20 75 73 65 64 20 6e 20 63 6f 6e 74 65 78 74 73   used n contexts
c4b0: 20 77 68 65 72 65 20 6c 6f 6f 6b 61 73 69 64 65   where lookaside
c4c0: 0a 20 20 2a 2a 20 69 73 20 64 69 73 61 62 6c 65  .  ** is disable
c4d0: 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 64  d */.  assert( d
c4e0: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e  b->lookaside.bEn
c4f0: 61 62 6c 65 64 3d 3d 30 20 29 3b 0a 20 20 70 54  abled==0 );.  pT
c500: 61 62 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20  ab->nRef = 1;.  
c510: 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b  pTab->zName = 0;
c520: 0a 20 20 70 54 61 62 2d 3e 6e 52 6f 77 45 73 74  .  pTab->nRowEst
c530: 20 3d 20 31 30 30 30 30 30 30 3b 0a 20 20 73 65   = 1000000;.  se
c540: 6c 65 63 74 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45  lectColumnsFromE
c550: 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
c560: 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2c  pSelect->pEList,
c570: 20 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 26 70   &pTab->nCol, &p
c580: 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20 20 73 65  Tab->aCol);.  se
c590: 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70  lectAddColumnTyp
c5a0: 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 70 50  eAndCollation(pP
c5b0: 61 72 73 65 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c  arse, pTab->nCol
c5c0: 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 2c 20 70 53  , pTab->aCol, pS
c5d0: 65 6c 65 63 74 29 3b 0a 20 20 70 54 61 62 2d 3e  elect);.  pTab->
c5e0: 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 69 66  iPKey = -1;.  if
c5f0: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
c600: 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ed ){.    sqlite
c610: 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c  3DeleteTable(db,
c620: 20 70 54 61 62 29 3b 0a 20 20 20 20 72 65 74 75   pTab);.    retu
c630: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 0;.  }.  retu
c640: 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pTab;.}../*.*
c650: 2a 20 47 65 74 20 61 20 56 44 42 45 20 66 6f 72  * Get a VDBE for
c660: 20 74 68 65 20 67 69 76 65 6e 20 70 61 72 73 65   the given parse
c670: 72 20 63 6f 6e 74 65 78 74 2e 20 20 43 72 65 61  r context.  Crea
c680: 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 69 66 20  te a new one if 
c690: 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20 49 66  necessary..** If
c6a0: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
c6b0: 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20 61 6e  , return NULL an
c6c0: 64 20 6c 65 61 76 65 20 61 20 6d 65 73 73 61 67  d leave a messag
c6d0: 65 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a  e in pParse..*/.
c6e0: 56 64 62 65 20 2a 73 71 6c 69 74 65 33 47 65 74  Vdbe *sqlite3Get
c6f0: 56 64 62 65 28 50 61 72 73 65 20 2a 70 50 61 72  Vdbe(Parse *pPar
c700: 73 65 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  se){.  Vdbe *v =
c710: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
c720: 20 20 69 66 28 20 76 3d 3d 30 20 29 7b 0a 20 20    if( v==0 ){.  
c730: 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56    v = pParse->pV
c740: 64 62 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62  dbe = sqlite3Vdb
c750: 65 43 72 65 61 74 65 28 70 50 61 72 73 65 2d 3e  eCreate(pParse->
c760: 64 62 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  db);.#ifndef SQL
c770: 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a 20  ITE_OMIT_TRACE. 
c780: 20 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20     if( v ){.    
c790: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
c7a0: 4f 70 30 28 76 2c 20 4f 50 5f 54 72 61 63 65 29  Op0(v, OP_Trace)
c7b0: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
c7c0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 76 3b 0a 7d   }.  return v;.}
c7d0: 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65  .../*.** Compute
c7e0: 20 74 68 65 20 69 4c 69 6d 69 74 20 61 6e 64 20   the iLimit and 
c7f0: 69 4f 66 66 73 65 74 20 66 69 65 6c 64 73 20 6f  iOffset fields o
c800: 66 20 74 68 65 20 53 45 4c 45 43 54 20 62 61 73  f the SELECT bas
c810: 65 64 20 6f 6e 20 74 68 65 0a 2a 2a 20 70 4c 69  ed on the.** pLi
c820: 6d 69 74 20 61 6e 64 20 70 4f 66 66 73 65 74 20  mit and pOffset 
c830: 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 20 70 4c  expressions.  pL
c840: 69 6d 69 74 20 61 6e 64 20 70 4f 66 66 73 65 74  imit and pOffset
c850: 20 68 6f 6c 64 20 74 68 65 20 65 78 70 72 65 73   hold the expres
c860: 73 69 6f 6e 73 0a 2a 2a 20 74 68 61 74 20 61 70  sions.** that ap
c870: 70 65 61 72 20 69 6e 20 74 68 65 20 6f 72 69 67  pear in the orig
c880: 69 6e 61 6c 20 53 51 4c 20 73 74 61 74 65 6d 65  inal SQL stateme
c890: 6e 74 20 61 66 74 65 72 20 74 68 65 20 4c 49 4d  nt after the LIM
c8a0: 49 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 2a 2a  IT and OFFSET.**
c8b0: 20 6b 65 79 77 6f 72 64 73 2e 20 20 4f 72 20 4e   keywords.  Or N
c8c0: 55 4c 4c 20 69 66 20 74 68 6f 73 65 20 6b 65 79  ULL if those key
c8d0: 77 6f 72 64 73 20 61 72 65 20 6f 6d 69 74 74 65  words are omitte
c8e0: 64 2e 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f  d. iLimit and iO
c8f0: 66 66 73 65 74 20 0a 2a 2a 20 61 72 65 20 74 68  ffset .** are th
c900: 65 20 69 6e 74 65 67 65 72 20 6d 65 6d 6f 72 79  e integer memory
c910: 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72   register number
c920: 73 20 66 6f 72 20 63 6f 75 6e 74 65 72 73 20 75  s for counters u
c930: 73 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 0a  sed to compute .
c940: 2a 2a 20 74 68 65 20 6c 69 6d 69 74 20 61 6e 64  ** the limit and
c950: 20 6f 66 66 73 65 74 2e 20 20 49 66 20 74 68 65   offset.  If the
c960: 72 65 20 69 73 20 6e 6f 20 6c 69 6d 69 74 20 61  re is no limit a
c970: 6e 64 2f 6f 72 20 6f 66 66 73 65 74 2c 20 74 68  nd/or offset, th
c980: 65 6e 20 0a 2a 2a 20 69 4c 69 6d 69 74 20 61 6e  en .** iLimit an
c990: 64 20 69 4f 66 66 73 65 74 20 61 72 65 20 6e 65  d iOffset are ne
c9a0: 67 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  gative..**.** Th
c9b0: 69 73 20 72 6f 75 74 69 6e 65 20 63 68 61 6e 67  is routine chang
c9c0: 65 73 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66  es the values of
c9d0: 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66   iLimit and iOff
c9e0: 73 65 74 20 6f 6e 6c 79 20 69 66 0a 2a 2a 20 61  set only if.** a
c9f0: 20 6c 69 6d 69 74 20 6f 72 20 6f 66 66 73 65 74   limit or offset
ca00: 20 69 73 20 64 65 66 69 6e 65 64 20 62 79 20 70   is defined by p
ca10: 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66 66 73 65  Limit and pOffse
ca20: 74 2e 20 20 69 4c 69 6d 69 74 20 61 6e 64 0a 2a  t.  iLimit and.*
ca30: 2a 20 69 4f 66 66 73 65 74 20 73 68 6f 75 6c 64  * iOffset should
ca40: 20 68 61 76 65 20 62 65 65 6e 20 70 72 65 73 65   have been prese
ca50: 74 20 74 6f 20 61 70 70 72 6f 70 72 69 61 74 65  t to appropriate
ca60: 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 73 0a   default values.
ca70: 2a 2a 20 28 75 73 75 61 6c 6c 79 20 62 75 74 20  ** (usually but 
ca80: 6e 6f 74 20 61 6c 77 61 79 73 20 2d 31 29 20 70  not always -1) p
ca90: 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20  rior to calling 
caa0: 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a  this routine..**
cab0: 20 4f 6e 6c 79 20 69 66 20 70 4c 69 6d 69 74 21   Only if pLimit!
cac0: 3d 30 20 6f 72 20 70 4f 66 66 73 65 74 21 3d 30  =0 or pOffset!=0
cad0: 20 64 6f 20 74 68 65 20 6c 69 6d 69 74 20 72 65   do the limit re
cae0: 67 69 73 74 65 72 73 20 67 65 74 0a 2a 2a 20 72  gisters get.** r
caf0: 65 64 65 66 69 6e 65 64 2e 20 20 54 68 65 20 55  edefined.  The U
cb00: 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f  NION ALL operato
cb10: 72 20 75 73 65 73 20 74 68 69 73 20 70 72 6f 70  r uses this prop
cb20: 65 72 74 79 20 74 6f 20 66 6f 72 63 65 0a 2a 2a  erty to force.**
cb30: 20 74 68 65 20 72 65 75 73 65 20 6f 66 20 74 68   the reuse of th
cb40: 65 20 73 61 6d 65 20 6c 69 6d 69 74 20 61 6e 64  e same limit and
cb50: 20 6f 66 66 73 65 74 20 72 65 67 69 73 74 65 72   offset register
cb60: 73 20 61 63 72 6f 73 73 20 6d 75 6c 74 69 70 6c  s across multipl
cb70: 65 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74  e.** SELECT stat
cb80: 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74 69  ements..*/.stati
cb90: 63 20 76 6f 69 64 20 63 6f 6d 70 75 74 65 4c 69  c void computeLi
cba0: 6d 69 74 52 65 67 69 73 74 65 72 73 28 50 61 72  mitRegisters(Par
cbb0: 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65  se *pParse, Sele
cbc0: 63 74 20 2a 70 2c 20 69 6e 74 20 69 42 72 65 61  ct *p, int iBrea
cbd0: 6b 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  k){.  Vdbe *v = 
cbe0: 30 3b 0a 20 20 69 6e 74 20 69 4c 69 6d 69 74 20  0;.  int iLimit 
cbf0: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4f 66 66 73  = 0;.  int iOffs
cc00: 65 74 3b 0a 20 20 69 6e 74 20 61 64 64 72 31 2c  et;.  int addr1,
cc10: 20 6e 3b 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69   n;.  if( p->iLi
cc20: 6d 69 74 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  mit ) return;.. 
cc30: 20 2f 2a 20 0a 20 20 2a 2a 20 22 4c 49 4d 49 54   /* .  ** "LIMIT
cc40: 20 2d 31 22 20 61 6c 77 61 79 73 20 73 68 6f 77   -1" always show
cc50: 73 20 61 6c 6c 20 72 6f 77 73 2e 20 20 54 68 65  s all rows.  The
cc60: 72 65 20 69 73 20 73 6f 6d 65 0a 20 20 2a 2a 20  re is some.  ** 
cc70: 63 6f 6e 74 72 61 76 65 72 73 79 20 61 62 6f 75  contraversy abou
cc80: 74 20 77 68 61 74 20 74 68 65 20 63 6f 72 72 65  t what the corre
cc90: 63 74 20 62 65 68 61 76 69 6f 72 20 73 68 6f 75  ct behavior shou
cca0: 6c 64 20 62 65 2e 0a 20 20 2a 2a 20 54 68 65 20  ld be..  ** The 
ccb0: 63 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e  current implemen
ccc0: 74 61 74 69 6f 6e 20 69 6e 74 65 72 70 72 65 74  tation interpret
ccd0: 73 20 22 4c 49 4d 49 54 20 30 22 20 74 6f 20 6d  s "LIMIT 0" to m
cce0: 65 61 6e 0a 20 20 2a 2a 20 6e 6f 20 72 6f 77 73  ean.  ** no rows
ccf0: 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
cd00: 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70  ExprCacheClear(p
cd10: 50 61 72 73 65 29 3b 0a 20 20 61 73 73 65 72 74  Parse);.  assert
cd20: 28 20 70 2d 3e 70 4f 66 66 73 65 74 3d 3d 30 20  ( p->pOffset==0 
cd30: 7c 7c 20 70 2d 3e 70 4c 69 6d 69 74 21 3d 30 20  || p->pLimit!=0 
cd40: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4c 69 6d  );.  if( p->pLim
cd50: 69 74 20 29 7b 0a 20 20 20 20 70 2d 3e 69 4c 69  it ){.    p->iLi
cd60: 6d 69 74 20 3d 20 69 4c 69 6d 69 74 20 3d 20 2b  mit = iLimit = +
cd70: 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
cd80: 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65     v = sqlite3Ge
cd90: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
cda0: 20 20 20 69 66 28 20 4e 45 56 45 52 28 76 3d 3d     if( NEVER(v==
cdb0: 30 29 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a  0) ) return;  /*
cdc0: 20 56 44 42 45 20 73 68 6f 75 6c 64 20 68 61 76   VDBE should hav
cdd0: 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61  e already been a
cde0: 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20 20 20  llocated */.    
cdf0: 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49  if( sqlite3ExprI
ce00: 73 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c 69 6d  sInteger(p->pLim
ce10: 69 74 2c 20 26 6e 29 20 29 7b 0a 20 20 20 20 20  it, &n) ){.     
ce20: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
ce30: 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
ce40: 2c 20 6e 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20  , n, iLimit);.  
ce50: 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
ce60: 28 76 2c 20 22 4c 49 4d 49 54 20 63 6f 75 6e 74  (v, "LIMIT count
ce70: 65 72 22 29 29 3b 0a 20 20 20 20 20 20 69 66 28  er"));.      if(
ce80: 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20   n==0 ){.       
ce90: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
cea0: 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
ceb0: 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20  , iBreak);.     
cec0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
ced0: 69 66 28 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f  if( p->nSelectRo
cee0: 77 20 3e 20 28 64 6f 75 62 6c 65 29 6e 20 29 20  w > (double)n ) 
cef0: 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20  p->nSelectRow = 
cf00: 28 64 6f 75 62 6c 65 29 6e 3b 0a 20 20 20 20 20  (double)n;.     
cf10: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
cf20: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
cf30: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 2d 3e 70  ode(pParse, p->p
cf40: 4c 69 6d 69 74 2c 20 69 4c 69 6d 69 74 29 3b 0a  Limit, iLimit);.
cf50: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
cf60: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4d 75  eAddOp1(v, OP_Mu
cf70: 73 74 42 65 49 6e 74 2c 20 69 4c 69 6d 69 74 29  stBeInt, iLimit)
cf80: 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
cf90: 65 6e 74 28 28 76 2c 20 22 4c 49 4d 49 54 20 63  ent((v, "LIMIT c
cfa0: 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20 20 20 20  ounter"));.     
cfb0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
cfc0: 70 32 28 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c  p2(v, OP_IfZero,
cfd0: 20 69 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b 29   iLimit, iBreak)
cfe0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
cff0: 70 2d 3e 70 4f 66 66 73 65 74 20 29 7b 0a 20 20  p->pOffset ){.  
d000: 20 20 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d      p->iOffset =
d010: 20 69 4f 66 66 73 65 74 20 3d 20 2b 2b 70 50 61   iOffset = ++pPa
d020: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
d030: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b   pParse->nMem++;
d040: 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61     /* Allocate a
d050: 6e 20 65 78 74 72 61 20 72 65 67 69 73 74 65 72  n extra register
d060: 20 66 6f 72 20 6c 69 6d 69 74 2b 6f 66 66 73 65   for limit+offse
d070: 74 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  t */.      sqlit
d080: 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
d090: 65 2c 20 70 2d 3e 70 4f 66 66 73 65 74 2c 20 69  e, p->pOffset, i
d0a0: 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 73  Offset);.      s
d0b0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
d0c0: 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74  (v, OP_MustBeInt
d0d0: 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20  , iOffset);.    
d0e0: 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
d0f0: 2c 20 22 4f 46 46 53 45 54 20 63 6f 75 6e 74 65  , "OFFSET counte
d100: 72 22 29 29 3b 0a 20 20 20 20 20 20 61 64 64 72  r"));.      addr
d110: 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 = sqlite3VdbeA
d120: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 50 6f  ddOp1(v, OP_IfPo
d130: 73 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 20  s, iOffset);.   
d140: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
d150: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
d160: 65 72 2c 20 30 2c 20 69 4f 66 66 73 65 74 29 3b  er, 0, iOffset);
d170: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
d180: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
d190: 64 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  dr1);.      sqli
d1a0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
d1b0: 20 4f 50 5f 41 64 64 2c 20 69 4c 69 6d 69 74 2c   OP_Add, iLimit,
d1c0: 20 69 4f 66 66 73 65 74 2c 20 69 4f 66 66 73 65   iOffset, iOffse
d1d0: 74 2b 31 29 3b 0a 20 20 20 20 20 20 56 64 62 65  t+1);.      Vdbe
d1e0: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c 49 4d  Comment((v, "LIM
d1f0: 49 54 2b 4f 46 46 53 45 54 22 29 29 3b 0a 20 20  IT+OFFSET"));.  
d200: 20 20 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69      addr1 = sqli
d210: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
d220: 20 4f 50 5f 49 66 50 6f 73 2c 20 69 4c 69 6d 69   OP_IfPos, iLimi
d230: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
d240: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
d250: 50 5f 49 6e 74 65 67 65 72 2c 20 2d 31 2c 20 69  P_Integer, -1, i
d260: 4f 66 66 73 65 74 2b 31 29 3b 0a 20 20 20 20 20  Offset+1);.     
d270: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
d280: 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a  Here(v, addr1);.
d290: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66      }.  }.}..#if
d2a0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
d2b0: 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
d2c0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
d2d0: 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 63 6f  e appropriate co
d2e0: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
d2f0: 20 66 6f 72 20 74 68 65 20 69 43 6f 6c 2d 74 68   for the iCol-th
d300: 20 63 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a 20 74 68   column of.** th
d310: 65 20 72 65 73 75 6c 74 20 73 65 74 20 66 6f 72  e result set for
d320: 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 2d 73 65   the compound-se
d330: 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20 22  lect statement "
d340: 70 22 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c  p".  Return NULL
d350: 20 69 66 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d   if.** the colum
d360: 6e 20 68 61 73 20 6e 6f 20 64 65 66 61 75 6c 74  n has no default
d370: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
d380: 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  nce..**.** The c
d390: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
d3a0: 65 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 6f 75  e for the compou
d3b0: 6e 64 20 73 65 6c 65 63 74 20 69 73 20 74 61 6b  nd select is tak
d3c0: 65 6e 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 6c  en from the.** l
d3d0: 65 66 74 2d 6d 6f 73 74 20 74 65 72 6d 20 6f 66  eft-most term of
d3e0: 20 74 68 65 20 73 65 6c 65 63 74 20 74 68 61 74   the select that
d3f0: 20 68 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67   has a collating
d400: 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2f 0a 73 74   sequence..*/.st
d410: 61 74 69 63 20 43 6f 6c 6c 53 65 71 20 2a 6d 75  atic CollSeq *mu
d420: 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71  ltiSelectCollSeq
d430: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
d440: 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 69  Select *p, int i
d450: 43 6f 6c 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20  Col){.  CollSeq 
d460: 2a 70 52 65 74 3b 0a 20 20 69 66 28 20 70 2d 3e  *pRet;.  if( p->
d470: 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 70 52  pPrior ){.    pR
d480: 65 74 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74  et = multiSelect
d490: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
d4a0: 70 2d 3e 70 50 72 69 6f 72 2c 20 69 43 6f 6c 29  p->pPrior, iCol)
d4b0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
d4c0: 52 65 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61  Ret = 0;.  }.  a
d4d0: 73 73 65 72 74 28 20 69 43 6f 6c 3e 3d 30 20 29  ssert( iCol>=0 )
d4e0: 3b 0a 20 20 69 66 28 20 70 52 65 74 3d 3d 30 20  ;.  if( pRet==0 
d4f0: 26 26 20 69 43 6f 6c 3c 70 2d 3e 70 45 4c 69 73  && iCol<p->pELis
d500: 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  t->nExpr ){.    
d510: 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33 45 78  pRet = sqlite3Ex
d520: 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
d530: 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69  , p->pEList->a[i
d540: 43 6f 6c 5d 2e 70 45 78 70 72 29 3b 0a 20 20 7d  Col].pExpr);.  }
d550: 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a  .  return pRet;.
d560: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
d570: 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  TE_OMIT_COMPOUND
d580: 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 2f 2a 20 46  _SELECT */../* F
d590: 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65  orward reference
d5a0: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d   */.static int m
d5b0: 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42  ultiSelectOrderB
d5c0: 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  y(.  Parse *pPar
d5d0: 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61  se,        /* Pa
d5e0: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
d5f0: 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
d600: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
d610: 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45  right-most of SE
d620: 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f 64 65  LECTs to be code
d630: 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  d */.  SelectDes
d640: 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a 20  t *pDest     /* 
d650: 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20  What to do with 
d660: 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f  query results */
d670: 0a 29 3b 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51  .);...#ifndef SQ
d680: 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
d690: 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20  ND_SELECT./*.** 
d6a0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
d6b0: 63 61 6c 6c 65 64 20 74 6f 20 70 72 6f 63 65 73  called to proces
d6c0: 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65  s a compound que
d6d0: 72 79 20 66 6f 72 6d 20 66 72 6f 6d 0a 2a 2a 20  ry form from.** 
d6e0: 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73 65 70 61  two or more sepa
d6f0: 72 61 74 65 20 71 75 65 72 69 65 73 20 75 73 69  rate queries usi
d700: 6e 67 20 55 4e 49 4f 4e 2c 20 55 4e 49 4f 4e 20  ng UNION, UNION 
d710: 41 4c 4c 2c 20 45 58 43 45 50 54 2c 20 6f 72 0a  ALL, EXCEPT, or.
d720: 2a 2a 20 49 4e 54 45 52 53 45 43 54 0a 2a 2a 0a  ** INTERSECT.**.
d730: 2a 2a 20 22 70 22 20 70 6f 69 6e 74 73 20 74 6f  ** "p" points to
d740: 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
d750: 6f 66 20 74 68 65 20 74 77 6f 20 71 75 65 72 69  of the two queri
d760: 65 73 2e 20 20 74 68 65 20 71 75 65 72 79 20 6f  es.  the query o
d770: 6e 20 74 68 65 0a 2a 2a 20 6c 65 66 74 20 69 73  n the.** left is
d780: 20 70 2d 3e 70 50 72 69 6f 72 2e 20 20 54 68 65   p->pPrior.  The
d790: 20 6c 65 66 74 20 71 75 65 72 79 20 63 6f 75 6c   left query coul
d7a0: 64 20 61 6c 73 6f 20 62 65 20 61 20 63 6f 6d 70  d also be a comp
d7b0: 6f 75 6e 64 20 71 75 65 72 79 0a 2a 2a 20 69 6e  ound query.** in
d7c0: 20 77 68 69 63 68 20 63 61 73 65 20 74 68 69 73   which case this
d7d0: 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 62 65   routine will be
d7e0: 20 63 61 6c 6c 65 64 20 72 65 63 75 72 73 69 76   called recursiv
d7f0: 65 6c 79 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ely. .**.** The 
d800: 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 74  results of the t
d810: 6f 74 61 6c 20 71 75 65 72 79 20 61 72 65 20 74  otal query are t
d820: 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74  o be written int
d830: 6f 20 61 20 64 65 73 74 69 6e 61 74 69 6f 6e 0a  o a destination.
d840: 2a 2a 20 6f 66 20 74 79 70 65 20 65 44 65 73 74  ** of type eDest
d850: 20 77 69 74 68 20 70 61 72 61 6d 65 74 65 72 20   with parameter 
d860: 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78 61  iParm..**.** Exa
d870: 6d 70 6c 65 20 31 3a 20 20 43 6f 6e 73 69 64 65  mple 1:  Conside
d880: 72 20 61 20 74 68 72 65 65 2d 77 61 79 20 63 6f  r a three-way co
d890: 6d 70 6f 75 6e 64 20 53 51 4c 20 73 74 61 74 65  mpound SQL state
d8a0: 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ment..**.**     
d8b0: 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31  SELECT a FROM t1
d8c0: 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 62 20   UNION SELECT b 
d8d0: 46 52 4f 4d 20 74 32 20 55 4e 49 4f 4e 20 53 45  FROM t2 UNION SE
d8e0: 4c 45 43 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a  LECT c FROM t3.*
d8f0: 2a 0a 2a 2a 20 54 68 69 73 20 73 74 61 74 65 6d  *.** This statem
d900: 65 6e 74 20 69 73 20 70 61 72 73 65 64 20 75 70  ent is parsed up
d910: 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
d920: 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 63 20  **     SELECT c 
d930: 46 52 4f 4d 20 74 33 0a 2a 2a 20 20 20 20 20 20  FROM t3.**      
d940: 7c 0a 2a 2a 20 20 20 20 20 20 60 2d 2d 2d 2d 2d  |.**      `-----
d950: 3e 20 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d  >  SELECT b FROM
d960: 20 74 32 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   t2.**          
d970: 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
d980: 20 20 20 20 20 20 20 20 20 20 60 2d 2d 2d 2d 2d            `-----
d990: 2d 3e 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f  ->  SELECT a FRO
d9a0: 4d 20 74 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61  M t1.**.** The a
d9b0: 72 72 6f 77 73 20 69 6e 20 74 68 65 20 64 69 61  rrows in the dia
d9c0: 67 72 61 6d 20 61 62 6f 76 65 20 72 65 70 72 65  gram above repre
d9d0: 73 65 6e 74 20 74 68 65 20 53 65 6c 65 63 74 2e  sent the Select.
d9e0: 70 50 72 69 6f 72 20 70 6f 69 6e 74 65 72 2e 0a  pPrior pointer..
d9f0: 2a 2a 20 53 6f 20 69 66 20 74 68 69 73 20 72 6f  ** So if this ro
da00: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
da10: 77 69 74 68 20 70 20 65 71 75 61 6c 20 74 6f 20  with p equal to 
da20: 74 68 65 20 74 33 20 71 75 65 72 79 2c 20 74 68  the t3 query, th
da30: 65 6e 0a 2a 2a 20 70 50 72 69 6f 72 20 77 69 6c  en.** pPrior wil
da40: 6c 20 62 65 20 74 68 65 20 74 32 20 71 75 65 72  l be the t2 quer
da50: 79 2e 20 20 70 2d 3e 6f 70 20 77 69 6c 6c 20 62  y.  p->op will b
da60: 65 20 54 4b 5f 55 4e 49 4f 4e 20 69 6e 20 74 68  e TK_UNION in th
da70: 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e  is case..**.** N
da80: 6f 74 69 63 65 20 74 68 61 74 20 62 65 63 61 75  otice that becau
da90: 73 65 20 6f 66 20 74 68 65 20 77 61 79 20 53 51  se of the way SQ
daa0: 4c 69 74 65 20 70 61 72 73 65 73 20 63 6f 6d 70  Lite parses comp
dab0: 6f 75 6e 64 20 53 45 4c 45 43 54 73 2c 20 74 68  ound SELECTs, th
dac0: 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c 20  e.** individual 
dad0: 73 65 6c 65 63 74 73 20 61 6c 77 61 79 73 20 67  selects always g
dae0: 72 6f 75 70 20 66 72 6f 6d 20 6c 65 66 74 20 74  roup from left t
daf0: 6f 20 72 69 67 68 74 2e 0a 2a 2f 0a 73 74 61 74  o right..*/.stat
db00: 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65  ic int multiSele
db10: 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ct(.  Parse *pPa
db20: 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  rse,        /* P
db30: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
db40: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
db50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
db60: 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53   right-most of S
db70: 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f 64  ELECTs to be cod
db80: 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  ed */.  SelectDe
db90: 73 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a  st *pDest     /*
dba0: 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68   What to do with
dbb0: 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a   query results *
dbc0: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
dbd0: 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 2f 2a 20  SQLITE_OK;   /* 
dbe0: 53 75 63 63 65 73 73 20 63 6f 64 65 20 66 72 6f  Success code fro
dbf0: 6d 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  m a subroutine *
dc00: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69  /.  Select *pPri
dc10: 6f 72 3b 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f  or;       /* Ano
dc20: 74 68 65 72 20 53 45 4c 45 43 54 20 69 6d 6d 65  ther SELECT imme
dc30: 64 69 61 74 65 6c 79 20 74 6f 20 6f 75 72 20 6c  diately to our l
dc40: 65 66 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  eft */.  Vdbe *v
dc50: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
dc60: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
dc70: 74 6f 20 74 68 69 73 20 56 44 42 45 20 2a 2f 0a  to this VDBE */.
dc80: 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73    SelectDest des
dc90: 74 3b 20 20 20 20 20 20 2f 2a 20 41 6c 74 65 72  t;      /* Alter
dca0: 6e 61 74 69 76 65 20 64 61 74 61 20 64 65 73 74  native data dest
dcb0: 69 6e 61 74 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c  ination */.  Sel
dcc0: 65 63 74 20 2a 70 44 65 6c 65 74 65 20 3d 20 30  ect *pDelete = 0
dcd0: 3b 20 20 2f 2a 20 43 68 61 69 6e 20 6f 66 20 73  ;  /* Chain of s
dce0: 69 6d 70 6c 65 20 73 65 6c 65 63 74 73 20 74 6f  imple selects to
dcf0: 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20 73 71 6c   delete */.  sql
dd00: 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20  ite3 *db;       
dd10: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
dd20: 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 23 69 66  onnection */.#if
dd30: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
dd40: 5f 45 58 50 4c 41 49 4e 0a 20 20 69 6e 74 20 69  _EXPLAIN.  int i
dd50: 53 75 62 31 3b 20 20 20 20 20 20 20 20 20 20 20  Sub1;           
dd60: 20 2f 2a 20 45 51 50 20 69 64 20 6f 66 20 6c 65   /* EQP id of le
dd70: 66 74 2d 68 61 6e 64 20 71 75 65 72 79 20 2a 2f  ft-hand query */
dd80: 0a 20 20 69 6e 74 20 69 53 75 62 32 3b 20 20 20  .  int iSub2;   
dd90: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 51 50 20           /* EQP 
dda0: 69 64 20 6f 66 20 72 69 67 68 74 2d 68 61 6e 64  id of right-hand
ddb0: 20 71 75 65 72 79 20 2a 2f 0a 23 65 6e 64 69 66   query */.#endif
ddc0: 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
ddd0: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 4f 52 44   there is no ORD
dde0: 45 52 20 42 59 20 6f 72 20 4c 49 4d 49 54 20 63  ER BY or LIMIT c
ddf0: 6c 61 75 73 65 20 6f 6e 20 70 72 69 6f 72 20 53  lause on prior S
de00: 45 4c 45 43 54 73 2e 20 20 4f 6e 6c 79 0a 20 20  ELECTs.  Only.  
de10: 2a 2a 20 74 68 65 20 6c 61 73 74 20 28 72 69 67  ** the last (rig
de20: 68 74 2d 6d 6f 73 74 29 20 53 45 4c 45 43 54 20  ht-most) SELECT 
de30: 69 6e 20 74 68 65 20 73 65 72 69 65 73 20 6d 61  in the series ma
de40: 79 20 68 61 76 65 20 61 6e 20 4f 52 44 45 52 20  y have an ORDER 
de50: 42 59 20 6f 72 20 4c 49 4d 49 54 2e 0a 20 20 2a  BY or LIMIT..  *
de60: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 20 26 26  /.  assert( p &&
de70: 20 70 2d 3e 70 50 72 69 6f 72 20 29 3b 20 20 2f   p->pPrior );  /
de80: 2a 20 43 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  * Calling functi
de90: 6f 6e 20 67 75 61 72 61 6e 74 65 65 73 20 74 68  on guarantees th
dea0: 69 73 20 6d 75 63 68 20 2a 2f 0a 20 20 64 62 20  is much */.  db 
deb0: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
dec0: 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69  pPrior = p->pPri
ded0: 6f 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  or;.  assert( pP
dee0: 72 69 6f 72 2d 3e 70 52 69 67 68 74 6d 6f 73 74  rior->pRightmost
def0: 21 3d 70 50 72 69 6f 72 20 29 3b 0a 20 20 61 73  !=pPrior );.  as
df00: 73 65 72 74 28 20 70 50 72 69 6f 72 2d 3e 70 52  sert( pPrior->pR
df10: 69 67 68 74 6d 6f 73 74 3d 3d 70 2d 3e 70 52 69  ightmost==p->pRi
df20: 67 68 74 6d 6f 73 74 20 29 3b 0a 20 20 64 65 73  ghtmost );.  des
df30: 74 20 3d 20 2a 70 44 65 73 74 3b 0a 20 20 69 66  t = *pDest;.  if
df40: 28 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72  ( pPrior->pOrder
df50: 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  By ){.    sqlite
df60: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
df70: 2c 22 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  ,"ORDER BY claus
df80: 65 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20 61 66  e should come af
df90: 74 65 72 20 25 73 20 6e 6f 74 20 62 65 66 6f 72  ter %s not befor
dfa0: 65 22 2c 0a 20 20 20 20 20 20 73 65 6c 65 63 74  e",.      select
dfb0: 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a  OpName(p->op));.
dfc0: 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
dfd0: 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
dfe0: 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 69 66 28  t_end;.  }.  if(
dff0: 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20   pPrior->pLimit 
e000: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
e010: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22 4c  rorMsg(pParse,"L
e020: 49 4d 49 54 20 63 6c 61 75 73 65 20 73 68 6f 75  IMIT clause shou
e030: 6c 64 20 63 6f 6d 65 20 61 66 74 65 72 20 25 73  ld come after %s
e040: 20 6e 6f 74 20 62 65 66 6f 72 65 22 2c 0a 20 20   not before",.  
e050: 20 20 20 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65      selectOpName
e060: 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63  (p->op));.    rc
e070: 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d   = 1;.    goto m
e080: 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
e090: 0a 20 20 7d 0a 0a 20 20 76 20 3d 20 73 71 6c 69  .  }..  v = sqli
e0a0: 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
e0b0: 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21  e);.  assert( v!
e0c0: 3d 30 20 29 3b 20 20 2f 2a 20 54 68 65 20 56 44  =0 );  /* The VD
e0d0: 42 45 20 61 6c 72 65 61 64 79 20 63 72 65 61 74  BE already creat
e0e0: 65 64 20 62 79 20 63 61 6c 6c 69 6e 67 20 66 75  ed by calling fu
e0f0: 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20  nction */..  /* 
e100: 43 72 65 61 74 65 20 74 68 65 20 64 65 73 74 69  Create the desti
e110: 6e 61 74 69 6f 6e 20 74 65 6d 70 6f 72 61 72 79  nation temporary
e120: 20 74 61 62 6c 65 20 69 66 20 6e 65 63 65 73 73   table if necess
e130: 61 72 79 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64  ary.  */.  if( d
e140: 65 73 74 2e 65 44 65 73 74 3d 3d 53 52 54 5f 45  est.eDest==SRT_E
e150: 70 68 65 6d 54 61 62 20 29 7b 0a 20 20 20 20 61  phemTab ){.    a
e160: 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
e170: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   );.    sqlite3V
e180: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
e190: 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 64  OpenEphemeral, d
e1a0: 65 73 74 2e 69 53 44 50 61 72 6d 2c 20 70 2d 3e  est.iSDParm, p->
e1b0: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a  pEList->nExpr);.
e1c0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
e1d0: 68 61 6e 67 65 50 35 28 76 2c 20 42 54 52 45 45  hangeP5(v, BTREE
e1e0: 5f 55 4e 4f 52 44 45 52 45 44 29 3b 0a 20 20 20  _UNORDERED);.   
e1f0: 20 64 65 73 74 2e 65 44 65 73 74 20 3d 20 53 52   dest.eDest = SR
e200: 54 5f 54 61 62 6c 65 3b 0a 20 20 7d 0a 0a 20 20  T_Table;.  }..  
e210: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c  /* Make sure all
e220: 20 53 45 4c 45 43 54 73 20 69 6e 20 74 68 65 20   SELECTs in the 
e230: 73 74 61 74 65 6d 65 6e 74 20 68 61 76 65 20 74  statement have t
e240: 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f  he same number o
e250: 66 20 65 6c 65 6d 65 6e 74 73 0a 20 20 2a 2a 20  f elements.  ** 
e260: 69 6e 20 74 68 65 69 72 20 72 65 73 75 6c 74 20  in their result 
e270: 73 65 74 73 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  sets..  */.  ass
e280: 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 26  ert( p->pEList &
e290: 26 20 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74  & pPrior->pEList
e2a0: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 45 4c   );.  if( p->pEL
e2b0: 69 73 74 2d 3e 6e 45 78 70 72 21 3d 70 50 72 69  ist->nExpr!=pPri
e2c0: 6f 72 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  or->pEList->nExp
e2d0: 72 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  r ){.    if( p->
e2e0: 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 56 61  selFlags & SF_Va
e2f0: 6c 75 65 73 20 29 7b 0a 20 20 20 20 20 20 73 71  lues ){.      sq
e300: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
e310: 61 72 73 65 2c 20 22 61 6c 6c 20 56 41 4c 55 45  arse, "all VALUE
e320: 53 20 6d 75 73 74 20 68 61 76 65 20 74 68 65 20  S must have the 
e330: 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  same number of t
e340: 65 72 6d 73 22 29 3b 0a 20 20 20 20 7d 65 6c 73  erms");.    }els
e350: 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
e360: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
e370: 20 22 53 45 4c 45 43 54 73 20 74 6f 20 74 68 65   "SELECTs to the
e380: 20 6c 65 66 74 20 61 6e 64 20 72 69 67 68 74 20   left and right 
e390: 6f 66 20 25 73 22 0a 20 20 20 20 20 20 20 20 22  of %s".        "
e3a0: 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 68 65   do not have the
e3b0: 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20   same number of 
e3c0: 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 22 2c  result columns",
e3d0: 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d   selectOpName(p-
e3e0: 3e 6f 70 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  >op));.    }.   
e3f0: 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74   rc = 1;.    got
e400: 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
e410: 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f  nd;.  }..  /* Co
e420: 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 73 20 74  mpound SELECTs t
e430: 68 61 74 20 68 61 76 65 20 61 6e 20 4f 52 44 45  hat have an ORDE
e440: 52 20 42 59 20 63 6c 61 75 73 65 20 61 72 65 20  R BY clause are 
e450: 68 61 6e 64 6c 65 64 20 73 65 70 61 72 61 74 65  handled separate
e460: 6c 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ly..  */.  if( p
e470: 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ->pOrderBy ){.  
e480: 20 20 72 65 74 75 72 6e 20 6d 75 6c 74 69 53 65    return multiSe
e490: 6c 65 63 74 4f 72 64 65 72 42 79 28 70 50 61 72  lectOrderBy(pPar
e4a0: 73 65 2c 20 70 2c 20 70 44 65 73 74 29 3b 0a 20  se, p, pDest);. 
e4b0: 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74   }..  /* Generat
e4c0: 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 6c  e code for the l
e4d0: 65 66 74 20 61 6e 64 20 72 69 67 68 74 20 53 45  eft and right SE
e4e0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e  LECT statements.
e4f0: 0a 20 20 2a 2f 0a 20 20 73 77 69 74 63 68 28 20  .  */.  switch( 
e500: 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  p->op ){.    cas
e510: 65 20 54 4b 5f 41 4c 4c 3a 20 7b 0a 20 20 20 20  e TK_ALL: {.    
e520: 20 20 69 6e 74 20 61 64 64 72 20 3d 20 30 3b 0a    int addr = 0;.
e530: 20 20 20 20 20 20 69 6e 74 20 6e 4c 69 6d 69 74        int nLimit
e540: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
e550: 21 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20  !pPrior->pLimit 
e560: 29 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72 2d  );.      pPrior-
e570: 3e 69 4c 69 6d 69 74 20 3d 20 70 2d 3e 69 4c 69  >iLimit = p->iLi
e580: 6d 69 74 3b 0a 20 20 20 20 20 20 70 50 72 69 6f  mit;.      pPrio
e590: 72 2d 3e 69 4f 66 66 73 65 74 20 3d 20 70 2d 3e  r->iOffset = p->
e5a0: 69 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70  iOffset;.      p
e5b0: 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 3d 20  Prior->pLimit = 
e5c0: 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20  p->pLimit;.     
e5d0: 20 70 50 72 69 6f 72 2d 3e 70 4f 66 66 73 65 74   pPrior->pOffset
e5e0: 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20   = p->pOffset;. 
e5f0: 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49       explainSetI
e600: 6e 74 65 67 65 72 28 69 53 75 62 31 2c 20 70 50  nteger(iSub1, pP
e610: 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63  arse->iNextSelec
e620: 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  tId);.      rc =
e630: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
e640: 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26  Parse, pPrior, &
e650: 64 65 73 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e  dest);.      p->
e660: 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20  pLimit = 0;.    
e670: 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30    p->pOffset = 0
e680: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
e690: 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d  {.        goto m
e6a0: 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
e6b0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
e6c0: 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20  ->pPrior = 0;.  
e6d0: 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20      p->iLimit = 
e6e0: 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 3b 0a  pPrior->iLimit;.
e6f0: 20 20 20 20 20 20 70 2d 3e 69 4f 66 66 73 65 74        p->iOffset
e700: 20 3d 20 70 50 72 69 6f 72 2d 3e 69 4f 66 66 73   = pPrior->iOffs
e710: 65 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  et;.      if( p-
e720: 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20  >iLimit ){.     
e730: 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
e740: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
e750: 50 5f 49 66 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69  P_IfZero, p->iLi
e760: 6d 69 74 29 3b 0a 20 20 20 20 20 20 20 20 56 64  mit);.        Vd
e770: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4a  beComment((v, "J
e780: 75 6d 70 20 61 68 65 61 64 20 69 66 20 4c 49 4d  ump ahead if LIM
e790: 49 54 20 72 65 61 63 68 65 64 22 29 29 3b 0a 20  IT reached"));. 
e7a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 65 78 70       }.      exp
e7b0: 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69  lainSetInteger(i
e7c0: 53 75 62 32 2c 20 70 50 61 72 73 65 2d 3e 69 4e  Sub2, pParse->iN
e7d0: 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20  extSelectId);.  
e7e0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
e7f0: 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
e800: 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20 20  , &dest);.      
e810: 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51  testcase( rc!=SQ
e820: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
e830: 20 70 44 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50   pDelete = p->pP
e840: 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70  rior;.      p->p
e850: 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a  Prior = pPrior;.
e860: 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74        p->nSelect
e870: 52 6f 77 20 2b 3d 20 70 50 72 69 6f 72 2d 3e 6e  Row += pPrior->n
e880: 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20 20  SelectRow;.     
e890: 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70 4c 69   if( pPrior->pLi
e8a0: 6d 69 74 0a 20 20 20 20 20 20 20 26 26 20 73 71  mit.       && sq
e8b0: 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67  lite3ExprIsInteg
e8c0: 65 72 28 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69  er(pPrior->pLimi
e8d0: 74 2c 20 26 6e 4c 69 6d 69 74 29 0a 20 20 20 20  t, &nLimit).    
e8e0: 20 20 20 26 26 20 70 2d 3e 6e 53 65 6c 65 63 74     && p->nSelect
e8f0: 52 6f 77 20 3e 20 28 64 6f 75 62 6c 65 29 6e 4c  Row > (double)nL
e900: 69 6d 69 74 20 0a 20 20 20 20 20 20 29 7b 0a 20  imit .      ){. 
e910: 20 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63         p->nSelec
e920: 74 52 6f 77 20 3d 20 28 64 6f 75 62 6c 65 29 6e  tRow = (double)n
e930: 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 7d 0a 20  Limit;.      }. 
e940: 20 20 20 20 20 69 66 28 20 61 64 64 72 20 29 7b       if( addr ){
e950: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
e960: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
e970: 61 64 64 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  addr);.      }. 
e980: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
e990: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58  }.    case TK_EX
e9a0: 43 45 50 54 3a 0a 20 20 20 20 63 61 73 65 20 54  CEPT:.    case T
e9b0: 4b 5f 55 4e 49 4f 4e 3a 20 7b 0a 20 20 20 20 20  K_UNION: {.     
e9c0: 20 69 6e 74 20 75 6e 69 6f 6e 54 61 62 3b 20 20   int unionTab;  
e9d0: 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62    /* Cursor numb
e9e0: 65 72 20 6f 66 20 74 68 65 20 74 65 6d 70 6f 72  er of the tempor
e9f0: 61 72 79 20 74 61 62 6c 65 20 68 6f 6c 64 69 6e  ary table holdin
ea00: 67 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 20 20  g result */.    
ea10: 20 20 75 38 20 6f 70 20 3d 20 30 3b 20 20 20 20    u8 op = 0;    
ea20: 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65     /* One of the
ea30: 20 53 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e 73   SRT_ operations
ea40: 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 73 65 6c   to apply to sel
ea50: 66 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 70  f */.      int p
ea60: 72 69 6f 72 4f 70 3b 20 20 20 20 20 2f 2a 20 54  riorOp;     /* T
ea70: 68 65 20 53 52 54 5f 20 6f 70 65 72 61 74 69 6f  he SRT_ operatio
ea80: 6e 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 70 72  n to apply to pr
ea90: 69 6f 72 20 73 65 6c 65 63 74 73 20 2a 2f 0a 20  ior selects */. 
eaa0: 20 20 20 20 20 45 78 70 72 20 2a 70 4c 69 6d 69       Expr *pLimi
eab0: 74 2c 20 2a 70 4f 66 66 73 65 74 3b 20 2f 2a 20  t, *pOffset; /* 
eac0: 53 61 76 65 64 20 76 61 6c 75 65 73 20 6f 66 20  Saved values of 
ead0: 70 2d 3e 6e 4c 69 6d 69 74 20 61 6e 64 20 70 2d  p->nLimit and p-
eae0: 3e 6e 4f 66 66 73 65 74 20 2a 2f 0a 20 20 20 20  >nOffset */.    
eaf0: 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20    int addr;.    
eb00: 20 20 53 65 6c 65 63 74 44 65 73 74 20 75 6e 69    SelectDest uni
eb10: 6f 6e 64 65 73 74 3b 0a 0a 20 20 20 20 20 20 74  ondest;..      t
eb20: 65 73 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d  estcase( p->op==
eb30: 54 4b 5f 45 58 43 45 50 54 20 29 3b 0a 20 20 20  TK_EXCEPT );.   
eb40: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e     testcase( p->
eb50: 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a  op==TK_UNION );.
eb60: 20 20 20 20 20 20 70 72 69 6f 72 4f 70 20 3d 20        priorOp = 
eb70: 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20 20  SRT_Union;.     
eb80: 20 69 66 28 20 64 65 73 74 2e 65 44 65 73 74 3d   if( dest.eDest=
eb90: 3d 70 72 69 6f 72 4f 70 20 26 26 20 41 4c 57 41  =priorOp && ALWA
eba0: 59 53 28 21 70 2d 3e 70 4c 69 6d 69 74 20 26 26  YS(!p->pLimit &&
ebb0: 21 70 2d 3e 70 4f 66 66 73 65 74 29 20 29 7b 0a  !p->pOffset) ){.
ebc0: 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 63 61          /* We ca
ebd0: 6e 20 72 65 75 73 65 20 61 20 74 65 6d 70 6f 72  n reuse a tempor
ebe0: 61 72 79 20 74 61 62 6c 65 20 67 65 6e 65 72 61  ary table genera
ebf0: 74 65 64 20 62 79 20 61 20 53 45 4c 45 43 54 20  ted by a SELECT 
ec00: 74 6f 20 6f 75 72 0a 20 20 20 20 20 20 20 20 2a  to our.        *
ec10: 2a 20 72 69 67 68 74 2e 0a 20 20 20 20 20 20 20  * right..       
ec20: 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
ec30: 72 74 28 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73  rt( p->pRightmos
ec40: 74 21 3d 70 20 29 3b 20 20 2f 2a 20 43 61 6e 20  t!=p );  /* Can 
ec50: 6f 6e 6c 79 20 68 61 70 70 65 6e 20 66 6f 72 20  only happen for 
ec60: 6c 65 66 74 77 61 72 64 20 65 6c 65 6d 65 6e 74  leftward element
ec70: 73 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s.              
ec80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ec90: 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 61 20 33         ** of a 3
eca0: 2d 77 61 79 20 6f 72 20 6d 6f 72 65 20 63 6f 6d  -way or more com
ecb0: 70 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 20  pound */.       
ecc0: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4c 69 6d   assert( p->pLim
ecd0: 69 74 3d 3d 30 20 29 3b 20 20 20 20 20 20 2f 2a  it==0 );      /*
ece0: 20 4e 6f 74 20 61 6c 6c 6f 77 65 64 20 6f 6e 20   Not allowed on 
ecf0: 6c 65 66 74 77 61 72 64 20 65 6c 65 6d 65 6e 74  leftward element
ed00: 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73  s */.        ass
ed10: 65 72 74 28 20 70 2d 3e 70 4f 66 66 73 65 74 3d  ert( p->pOffset=
ed20: 3d 30 20 29 3b 20 20 20 20 20 2f 2a 20 4e 6f 74  =0 );     /* Not
ed30: 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 6c 65 66 74   allowed on left
ed40: 77 61 72 64 20 65 6c 65 6d 65 6e 74 73 20 2a 2f  ward elements */
ed50: 0a 20 20 20 20 20 20 20 20 75 6e 69 6f 6e 54 61  .        unionTa
ed60: 62 20 3d 20 64 65 73 74 2e 69 53 44 50 61 72 6d  b = dest.iSDParm
ed70: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
ed80: 20 20 20 20 20 20 20 2f 2a 20 57 65 20 77 69 6c         /* We wil
ed90: 6c 20 6e 65 65 64 20 74 6f 20 63 72 65 61 74 65  l need to create
eda0: 20 6f 75 72 20 6f 77 6e 20 74 65 6d 70 6f 72 61   our own tempora
edb0: 72 79 20 74 61 62 6c 65 20 74 6f 20 68 6f 6c 64  ry table to hold
edc0: 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
edd0: 69 6e 74 65 72 6d 65 64 69 61 74 65 20 72 65 73  intermediate res
ede0: 75 6c 74 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ults..        */
edf0: 0a 20 20 20 20 20 20 20 20 75 6e 69 6f 6e 54 61  .        unionTa
ee00: 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  b = pParse->nTab
ee10: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ++;.        asse
ee20: 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d  rt( p->pOrderBy=
ee30: 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61 64  =0 );.        ad
ee40: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
ee50: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65  AddOp2(v, OP_Ope
ee60: 6e 45 70 68 65 6d 65 72 61 6c 2c 20 75 6e 69 6f  nEphemeral, unio
ee70: 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20  nTab, 0);.      
ee80: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64    assert( p->add
ee90: 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20  rOpenEphm[0] == 
eea0: 2d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d  -1 );.        p-
eeb0: 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d  >addrOpenEphm[0]
eec0: 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20 20   = addr;.       
eed0: 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 2d 3e   p->pRightmost->
eee0: 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 55  selFlags |= SF_U
eef0: 73 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20  sesEphemeral;.  
ef00: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
ef10: 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20  >pEList );.     
ef20: 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64   }..      /* Cod
ef30: 65 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  e the SELECT sta
ef40: 74 65 6d 65 6e 74 73 20 74 6f 20 6f 75 72 20 6c  tements to our l
ef50: 65 66 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  eft.      */.   
ef60: 20 20 20 61 73 73 65 72 74 28 20 21 70 50 72 69     assert( !pPri
ef70: 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 29 3b 0a  or->pOrderBy );.
ef80: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
ef90: 65 63 74 44 65 73 74 49 6e 69 74 28 26 75 6e 69  ectDestInit(&uni
efa0: 6f 6e 64 65 73 74 2c 20 70 72 69 6f 72 4f 70 2c  ondest, priorOp,
efb0: 20 75 6e 69 6f 6e 54 61 62 29 3b 0a 20 20 20 20   unionTab);.    
efc0: 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65    explainSetInte
efd0: 67 65 72 28 69 53 75 62 31 2c 20 70 50 61 72 73  ger(iSub1, pPars
efe0: 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64  e->iNextSelectId
eff0: 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
f000: 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
f010: 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 75 6e 69  se, pPrior, &uni
f020: 6f 6e 64 65 73 74 29 3b 0a 20 20 20 20 20 20 69  ondest);.      i
f030: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
f040: 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
f050: 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a  ct_end;.      }.
f060: 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74  .      /* Code t
f070: 68 65 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43  he current SELEC
f080: 54 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 20 20  T statement.    
f090: 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
f0a0: 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20  ->op==TK_EXCEPT 
f0b0: 29 7b 0a 20 20 20 20 20 20 20 20 6f 70 20 3d 20  ){.        op = 
f0c0: 53 52 54 5f 45 78 63 65 70 74 3b 0a 20 20 20 20  SRT_Except;.    
f0d0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
f0e0: 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 3d 3d   assert( p->op==
f0f0: 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 20 20  TK_UNION );.    
f100: 20 20 20 20 6f 70 20 3d 20 53 52 54 5f 55 6e 69      op = SRT_Uni
f110: 6f 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  on;.      }.    
f120: 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b    p->pPrior = 0;
f130: 0a 20 20 20 20 20 20 70 4c 69 6d 69 74 20 3d 20  .      pLimit = 
f140: 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20  p->pLimit;.     
f150: 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a   p->pLimit = 0;.
f160: 20 20 20 20 20 20 70 4f 66 66 73 65 74 20 3d 20        pOffset = 
f170: 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20 20  p->pOffset;.    
f180: 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30    p->pOffset = 0
f190: 3b 0a 20 20 20 20 20 20 75 6e 69 6f 6e 64 65 73  ;.      uniondes
f1a0: 74 2e 65 44 65 73 74 20 3d 20 6f 70 3b 0a 20 20  t.eDest = op;.  
f1b0: 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e      explainSetIn
f1c0: 74 65 67 65 72 28 69 53 75 62 32 2c 20 70 50 61  teger(iSub2, pPa
f1d0: 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74  rse->iNextSelect
f1e0: 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  Id);.      rc = 
f1f0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
f200: 61 72 73 65 2c 20 70 2c 20 26 75 6e 69 6f 6e 64  arse, p, &uniond
f210: 65 73 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74  est);.      test
f220: 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45  case( rc!=SQLITE
f230: 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20  _OK );.      /* 
f240: 51 75 65 72 79 20 66 6c 61 74 74 65 6e 69 6e 67  Query flattening
f250: 20 69 6e 20 73 71 6c 69 74 65 33 53 65 6c 65 63   in sqlite3Selec
f260: 74 28 29 20 6d 69 67 68 74 20 72 65 66 69 6c 6c  t() might refill
f270: 20 70 2d 3e 70 4f 72 64 65 72 42 79 2e 0a 20 20   p->pOrderBy..  
f280: 20 20 20 20 2a 2a 20 42 65 20 73 75 72 65 20 74      ** Be sure t
f290: 6f 20 64 65 6c 65 74 65 20 70 2d 3e 70 4f 72 64  o delete p->pOrd
f2a0: 65 72 42 79 2c 20 74 68 65 72 65 66 6f 72 65 2c  erBy, therefore,
f2b0: 20 74 6f 20 61 76 6f 69 64 20 61 20 6d 65 6d 6f   to avoid a memo
f2c0: 72 79 20 6c 65 61 6b 2e 20 2a 2f 0a 20 20 20 20  ry leak. */.    
f2d0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
f2e0: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  tDelete(db, p->p
f2f0: 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 20 20  OrderBy);.      
f300: 70 44 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50 72  pDelete = p->pPr
f310: 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50  ior;.      p->pP
f320: 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20  rior = pPrior;. 
f330: 20 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79       p->pOrderBy
f340: 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20   = 0;.      if( 
f350: 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20  p->op==TK_UNION 
f360: 29 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20  ) p->nSelectRow 
f370: 2b 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65  += pPrior->nSele
f380: 63 74 52 6f 77 3b 0a 20 20 20 20 20 20 73 71 6c  ctRow;.      sql
f390: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
f3a0: 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20  b, p->pLimit);. 
f3b0: 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d       p->pLimit =
f3c0: 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70   pLimit;.      p
f3d0: 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f 66 66  ->pOffset = pOff
f3e0: 73 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4c  set;.      p->iL
f3f0: 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  imit = 0;.      
f400: 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b 0a  p->iOffset = 0;.
f410: 0a 20 20 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72  .      /* Conver
f420: 74 20 74 68 65 20 64 61 74 61 20 69 6e 20 74 68  t the data in th
f430: 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  e temporary tabl
f440: 65 20 69 6e 74 6f 20 77 68 61 74 65 76 65 72 20  e into whatever 
f450: 66 6f 72 6d 0a 20 20 20 20 20 20 2a 2a 20 69 74  form.      ** it
f460: 20 69 73 20 74 68 61 74 20 77 65 20 63 75 72 72   is that we curr
f470: 65 6e 74 6c 79 20 6e 65 65 64 2e 0a 20 20 20 20  ently need..    
f480: 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72    */.      asser
f490: 74 28 20 75 6e 69 6f 6e 54 61 62 3d 3d 64 65 73  t( unionTab==des
f4a0: 74 2e 69 53 44 50 61 72 6d 20 7c 7c 20 64 65 73  t.iSDParm || des
f4b0: 74 2e 65 44 65 73 74 21 3d 70 72 69 6f 72 4f 70  t.eDest!=priorOp
f4c0: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64 65   );.      if( de
f4d0: 73 74 2e 65 44 65 73 74 21 3d 70 72 69 6f 72 4f  st.eDest!=priorO
f4e0: 70 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  p ){.        int
f4f0: 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20   iCont, iBreak, 
f500: 69 53 74 61 72 74 3b 0a 20 20 20 20 20 20 20 20  iStart;.        
f510: 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73  assert( p->pELis
f520: 74 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  t );.        if(
f530: 20 64 65 73 74 2e 65 44 65 73 74 3d 3d 53 52 54   dest.eDest==SRT
f540: 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20 20  _Output ){.     
f550: 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 46 69       Select *pFi
f560: 72 73 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20  rst = p;.       
f570: 20 20 20 77 68 69 6c 65 28 20 70 46 69 72 73 74     while( pFirst
f580: 2d 3e 70 50 72 69 6f 72 20 29 20 70 46 69 72 73  ->pPrior ) pFirs
f590: 74 20 3d 20 70 46 69 72 73 74 2d 3e 70 50 72 69  t = pFirst->pPri
f5a0: 6f 72 3b 0a 20 20 20 20 20 20 20 20 20 20 67 65  or;.          ge
f5b0: 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65  nerateColumnName
f5c0: 73 28 70 50 61 72 73 65 2c 20 30 2c 20 70 46 69  s(pParse, 0, pFi
f5d0: 72 73 74 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  rst->pEList);.  
f5e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
f5f0: 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33  iBreak = sqlite3
f600: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
f610: 3b 0a 20 20 20 20 20 20 20 20 69 43 6f 6e 74 20  ;.        iCont 
f620: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
f630: 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
f640: 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52     computeLimitR
f650: 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c  egisters(pParse,
f660: 20 70 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20   p, iBreak);.   
f670: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
f680: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77  AddOp2(v, OP_Rew
f690: 69 6e 64 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69  ind, unionTab, i
f6a0: 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20  Break);.        
f6b0: 69 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33  iStart = sqlite3
f6c0: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
f6d0: 76 29 3b 0a 20 20 20 20 20 20 20 20 73 65 6c 65  v);.        sele
f6e0: 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72  ctInnerLoop(pPar
f6f0: 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74  se, p, p->pEList
f700: 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 70 2d 3e 70  , unionTab, p->p
f710: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 0a 20 20  EList->nExpr,.  
f720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f730: 20 20 20 20 20 20 30 2c 20 30 2c 20 26 64 65 73        0, 0, &des
f740: 74 2c 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b  t, iCont, iBreak
f750: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
f760: 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
f770: 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20  el(v, iCont);.  
f780: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
f790: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
f7a0: 78 74 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69 53  xt, unionTab, iS
f7b0: 74 61 72 74 29 3b 0a 20 20 20 20 20 20 20 20 73  tart);.        s
f7c0: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
f7d0: 65 4c 61 62 65 6c 28 76 2c 20 69 42 72 65 61 6b  eLabel(v, iBreak
f7e0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
f7f0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
f800: 4f 50 5f 43 6c 6f 73 65 2c 20 75 6e 69 6f 6e 54  OP_Close, unionT
f810: 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  ab, 0);.      }.
f820: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
f830: 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20   }.    default: 
f840: 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 3d 3d 54  assert( p->op==T
f850: 4b 5f 49 4e 54 45 52 53 45 43 54 20 29 3b 20 7b  K_INTERSECT ); {
f860: 0a 20 20 20 20 20 20 69 6e 74 20 74 61 62 31 2c  .      int tab1,
f870: 20 74 61 62 32 3b 0a 20 20 20 20 20 20 69 6e 74   tab2;.      int
f880: 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20   iCont, iBreak, 
f890: 69 53 74 61 72 74 3b 0a 20 20 20 20 20 20 45 78  iStart;.      Ex
f8a0: 70 72 20 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f 66  pr *pLimit, *pOf
f8b0: 66 73 65 74 3b 0a 20 20 20 20 20 20 69 6e 74 20  fset;.      int 
f8c0: 61 64 64 72 3b 0a 20 20 20 20 20 20 53 65 6c 65  addr;.      Sele
f8d0: 63 74 44 65 73 74 20 69 6e 74 65 72 73 65 63 74  ctDest intersect
f8e0: 64 65 73 74 3b 0a 20 20 20 20 20 20 69 6e 74 20  dest;.      int 
f8f0: 72 31 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 4e  r1;..      /* IN
f900: 54 45 52 53 45 43 54 20 69 73 20 64 69 66 66 65  TERSECT is diffe
f910: 72 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 6f 74  rent from the ot
f920: 68 65 72 73 20 73 69 6e 63 65 20 69 74 20 72 65  hers since it re
f930: 71 75 69 72 65 73 0a 20 20 20 20 20 20 2a 2a 20  quires.      ** 
f940: 74 77 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61  two temporary ta
f950: 62 6c 65 73 2e 20 20 48 65 6e 63 65 20 69 74 20  bles.  Hence it 
f960: 68 61 73 20 69 74 73 20 6f 77 6e 20 63 61 73 65  has its own case
f970: 2e 20 20 42 65 67 69 6e 0a 20 20 20 20 20 20 2a  .  Begin.      *
f980: 2a 20 62 79 20 61 6c 6c 6f 63 61 74 69 6e 67 20  * by allocating 
f990: 74 68 65 20 74 61 62 6c 65 73 20 77 65 20 77 69  the tables we wi
f9a0: 6c 6c 20 6e 65 65 64 2e 0a 20 20 20 20 20 20 2a  ll need..      *
f9b0: 2f 0a 20 20 20 20 20 20 74 61 62 31 20 3d 20 70  /.      tab1 = p
f9c0: 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
f9d0: 20 20 20 20 20 74 61 62 32 20 3d 20 70 50 61 72       tab2 = pPar
f9e0: 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
f9f0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72    assert( p->pOr
fa00: 64 65 72 42 79 3d 3d 30 20 29 3b 0a 0a 20 20 20  derBy==0 );..   
fa10: 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
fa20: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
fa30: 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
fa40: 20 74 61 62 31 2c 20 30 29 3b 0a 20 20 20 20 20   tab1, 0);.     
fa50: 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72   assert( p->addr
fa60: 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20 2d  OpenEphm[0] == -
fa70: 31 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64  1 );.      p->ad
fa80: 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20  drOpenEphm[0] = 
fa90: 61 64 64 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70  addr;.      p->p
faa0: 52 69 67 68 74 6d 6f 73 74 2d 3e 73 65 6c 46 6c  Rightmost->selFl
fab0: 61 67 73 20 7c 3d 20 53 46 5f 55 73 65 73 45 70  ags |= SF_UsesEp
fac0: 68 65 6d 65 72 61 6c 3b 0a 20 20 20 20 20 20 61  hemeral;.      a
fad0: 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
fae0: 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f   );..      /* Co
faf0: 64 65 20 74 68 65 20 53 45 4c 45 43 54 73 20 74  de the SELECTs t
fb00: 6f 20 6f 75 72 20 6c 65 66 74 20 69 6e 74 6f 20  o our left into 
fb10: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
fb20: 22 74 61 62 31 22 2e 0a 20 20 20 20 20 20 2a 2f  "tab1"..      */
fb30: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65  .      sqlite3Se
fb40: 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 69 6e  lectDestInit(&in
fb50: 74 65 72 73 65 63 74 64 65 73 74 2c 20 53 52 54  tersectdest, SRT
fb60: 5f 55 6e 69 6f 6e 2c 20 74 61 62 31 29 3b 0a 20  _Union, tab1);. 
fb70: 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49       explainSetI
fb80: 6e 74 65 67 65 72 28 69 53 75 62 31 2c 20 70 50  nteger(iSub1, pP
fb90: 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63  arse->iNextSelec
fba0: 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  tId);.      rc =
fbb0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
fbc0: 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26  Parse, pPrior, &
fbd0: 69 6e 74 65 72 73 65 63 74 64 65 73 74 29 3b 0a  intersectdest);.
fbe0: 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
fbf0: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c          goto mul
fc00: 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
fc10: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
fc20: 20 43 6f 64 65 20 74 68 65 20 63 75 72 72 65 6e   Code the curren
fc30: 74 20 53 45 4c 45 43 54 20 69 6e 74 6f 20 74 65  t SELECT into te
fc40: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 22 74  mporary table "t
fc50: 61 62 32 22 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ab2".      */.  
fc60: 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
fc70: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
fc80: 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
fc90: 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20 20 20 20  , tab2, 0);.    
fca0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64    assert( p->add
fcb0: 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 3d 20  rOpenEphm[1] == 
fcc0: 2d 31 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61  -1 );.      p->a
fcd0: 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d  ddrOpenEphm[1] =
fce0: 20 61 64 64 72 3b 0a 20 20 20 20 20 20 70 2d 3e   addr;.      p->
fcf0: 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20  pPrior = 0;.    
fd00: 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c    pLimit = p->pL
fd10: 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70  imit;.      p->p
fd20: 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20  Limit = 0;.     
fd30: 20 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f   pOffset = p->pO
fd40: 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e  ffset;.      p->
fd50: 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20  pOffset = 0;.   
fd60: 20 20 20 69 6e 74 65 72 73 65 63 74 64 65 73 74     intersectdest
fd70: 2e 69 53 44 50 61 72 6d 20 3d 20 74 61 62 32 3b  .iSDParm = tab2;
fd80: 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65  .      explainSe
fd90: 74 49 6e 74 65 67 65 72 28 69 53 75 62 32 2c 20  tInteger(iSub2, 
fda0: 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c  pParse->iNextSel
fdb0: 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63  ectId);.      rc
fdc0: 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
fdd0: 28 70 50 61 72 73 65 2c 20 70 2c 20 26 69 6e 74  (pParse, p, &int
fde0: 65 72 73 65 63 74 64 65 73 74 29 3b 0a 20 20 20  ersectdest);.   
fdf0: 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21     testcase( rc!
fe00: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
fe10: 20 20 20 20 70 44 65 6c 65 74 65 20 3d 20 70 2d      pDelete = p-
fe20: 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70  >pPrior;.      p
fe30: 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f  ->pPrior = pPrio
fe40: 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  r;.      if( p->
fe50: 6e 53 65 6c 65 63 74 52 6f 77 3e 70 50 72 69 6f  nSelectRow>pPrio
fe60: 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 29 20  r->nSelectRow ) 
fe70: 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20  p->nSelectRow = 
fe80: 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52  pPrior->nSelectR
fe90: 6f 77 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ow;.      sqlite
fea0: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
feb0: 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20  p->pLimit);.    
fec0: 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c    p->pLimit = pL
fed0: 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70  imit;.      p->p
fee0: 4f 66 66 73 65 74 20 3d 20 70 4f 66 66 73 65 74  Offset = pOffset
fef0: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65  ;..      /* Gene
ff00: 72 61 74 65 20 63 6f 64 65 20 74 6f 20 74 61 6b  rate code to tak
ff10: 65 20 74 68 65 20 69 6e 74 65 72 73 65 63 74 69  e the intersecti
ff20: 6f 6e 20 6f 66 20 74 68 65 20 74 77 6f 20 74 65  on of the two te
ff30: 6d 70 6f 72 61 72 79 0a 20 20 20 20 20 20 2a 2a  mporary.      **
ff40: 20 74 61 62 6c 65 73 2e 0a 20 20 20 20 20 20 2a   tables..      *
ff50: 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
ff60: 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20  p->pEList );.   
ff70: 20 20 20 69 66 28 20 64 65 73 74 2e 65 44 65 73     if( dest.eDes
ff80: 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 7b  t==SRT_Output ){
ff90: 0a 20 20 20 20 20 20 20 20 53 65 6c 65 63 74 20  .        Select 
ffa0: 2a 70 46 69 72 73 74 20 3d 20 70 3b 0a 20 20 20  *pFirst = p;.   
ffb0: 20 20 20 20 20 77 68 69 6c 65 28 20 70 46 69 72       while( pFir
ffc0: 73 74 2d 3e 70 50 72 69 6f 72 20 29 20 70 46 69  st->pPrior ) pFi
ffd0: 72 73 74 20 3d 20 70 46 69 72 73 74 2d 3e 70 50  rst = pFirst->pP
ffe0: 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 67 65  rior;.        ge
fff0: 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65  nerateColumnName
10000 73 28 70 50 61 72 73 65 2c 20 30 2c 20 70 46 69  s(pParse, 0, pFi
10010 72 73 74 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  rst->pEList);.  
10020 20 20 20 20 7d 0a 20 20 20 20 20 20 69 42 72 65      }.      iBre
10030 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ak = sqlite3Vdbe
10040 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
10050 20 20 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69      iCont = sqli
10060 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
10070 28 76 29 3b 0a 20 20 20 20 20 20 63 6f 6d 70 75  (v);.      compu
10080 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73  teLimitRegisters
10090 28 70 50 61 72 73 65 2c 20 70 2c 20 69 42 72 65  (pParse, p, iBre
100a0 61 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ak);.      sqlit
100b0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
100c0 4f 50 5f 52 65 77 69 6e 64 2c 20 74 61 62 31 2c  OP_Rewind, tab1,
100d0 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
100e0 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
100f0 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
10100 20 20 20 20 20 20 69 53 74 61 72 74 20 3d 20 73        iStart = s
10110 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
10120 28 76 2c 20 4f 50 5f 52 6f 77 4b 65 79 2c 20 74  (v, OP_RowKey, t
10130 61 62 31 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  ab1, r1);.      
10140 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10150 34 49 6e 74 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f  4Int(v, OP_NotFo
10160 75 6e 64 2c 20 74 61 62 32 2c 20 69 43 6f 6e 74  und, tab2, iCont
10170 2c 20 72 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  , r1, 0);.      
10180 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
10190 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31  mpReg(pParse, r1
101a0 29 3b 0a 20 20 20 20 20 20 73 65 6c 65 63 74 49  );.      selectI
101b0 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c  nnerLoop(pParse,
101c0 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 74   p, p->pEList, t
101d0 61 62 31 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  ab1, p->pEList->
101e0 6e 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20  nExpr,.         
101f0 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20               0, 
10200 30 2c 20 26 64 65 73 74 2c 20 69 43 6f 6e 74 2c  0, &dest, iCont,
10210 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
10220 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
10230 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74  veLabel(v, iCont
10240 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
10250 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
10260 5f 4e 65 78 74 2c 20 74 61 62 31 2c 20 69 53 74  _Next, tab1, iSt
10270 61 72 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  art);.      sqli
10280 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
10290 62 65 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a  bel(v, iBreak);.
102a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
102b0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c  eAddOp2(v, OP_Cl
102c0 6f 73 65 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20  ose, tab2, 0);. 
102d0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
102e0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f  AddOp2(v, OP_Clo
102f0 73 65 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20 20  se, tab1, 0);.  
10300 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
10310 0a 20 20 7d 0a 0a 20 20 65 78 70 6c 61 69 6e 43  .  }..  explainC
10320 6f 6d 70 6f 73 69 74 65 28 70 50 61 72 73 65 2c  omposite(pParse,
10330 20 70 2d 3e 6f 70 2c 20 69 53 75 62 31 2c 20 69   p->op, iSub1, i
10340 53 75 62 32 2c 20 70 2d 3e 6f 70 21 3d 54 4b 5f  Sub2, p->op!=TK_
10350 41 4c 4c 29 3b 0a 0a 20 20 2f 2a 20 43 6f 6d 70  ALL);..  /* Comp
10360 75 74 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  ute collating se
10370 71 75 65 6e 63 65 73 20 75 73 65 64 20 62 79 20  quences used by 
10380 0a 20 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20  .  ** temporary 
10390 74 61 62 6c 65 73 20 6e 65 65 64 65 64 20 74 6f  tables needed to
103a0 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 63   implement the c
103b0 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a  ompound select..
103c0 20 20 2a 2a 20 41 74 74 61 63 68 20 74 68 65 20    ** Attach the 
103d0 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
103e0 65 20 74 6f 20 61 6c 6c 20 74 65 6d 70 6f 72 61  e to all tempora
103f0 72 79 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a  ry tables..  **.
10400 20 20 2a 2a 20 54 68 69 73 20 73 65 63 74 69 6f    ** This sectio
10410 6e 20 69 73 20 72 75 6e 20 62 79 20 74 68 65 20  n is run by the 
10420 72 69 67 68 74 2d 6d 6f 73 74 20 53 45 4c 45 43  right-most SELEC
10430 54 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 6c 79  T statement only
10440 2e 0a 20 20 2a 2a 20 53 45 4c 45 43 54 20 73 74  ..  ** SELECT st
10450 61 74 65 6d 65 6e 74 73 20 74 6f 20 74 68 65 20  atements to the 
10460 6c 65 66 74 20 61 6c 77 61 79 73 20 73 6b 69 70  left always skip
10470 20 74 68 69 73 20 70 61 72 74 2e 20 20 54 68 65   this part.  The
10480 20 72 69 67 68 74 2d 6d 6f 73 74 0a 20 20 2a 2a   right-most.  **
10490 20 53 45 4c 45 43 54 20 6d 69 67 68 74 20 61 6c   SELECT might al
104a0 73 6f 20 73 6b 69 70 20 74 68 69 73 20 70 61 72  so skip this par
104b0 74 20 69 66 20 69 74 20 68 61 73 20 6e 6f 20 4f  t if it has no O
104c0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61  RDER BY clause a
104d0 6e 64 0a 20 20 2a 2a 20 6e 6f 20 74 65 6d 70 20  nd.  ** no temp 
104e0 74 61 62 6c 65 73 20 61 72 65 20 72 65 71 75 69  tables are requi
104f0 72 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  red..  */.  if( 
10500 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
10510 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c 20 29  _UsesEphemeral )
10520 7b 0a 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20  {.    int i;    
10530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10540 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
10550 74 65 72 20 2a 2f 0a 20 20 20 20 4b 65 79 49 6e  ter */.    KeyIn
10560 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 20 20 20  fo *pKeyInfo;   
10570 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c           /* Coll
10580 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66  ating sequence f
10590 6f 72 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  or the result se
105a0 74 20 2a 2f 0a 20 20 20 20 53 65 6c 65 63 74 20  t */.    Select 
105b0 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20  *pLoop;         
105c0 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f         /* For lo
105d0 6f 70 69 6e 67 20 74 68 72 6f 75 67 68 20 53 45  oping through SE
105e0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20  LECT statements 
105f0 2a 2f 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  */.    CollSeq *
10600 2a 61 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20  *apColl;        
10610 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70       /* For loop
10620 69 6e 67 20 74 68 72 6f 75 67 68 20 70 4b 65 79  ing through pKey
10630 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 5d 20 2a 2f  Info->aColl[] */
10640 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20  .    int nCol;  
10650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10660 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
10670 63 6f 6c 75 6d 6e 73 20 69 6e 20 72 65 73 75 6c  columns in resul
10680 74 20 73 65 74 20 2a 2f 0a 0a 20 20 20 20 61 73  t set */..    as
10690 73 65 72 74 28 20 70 2d 3e 70 52 69 67 68 74 6d  sert( p->pRightm
106a0 6f 73 74 3d 3d 70 20 29 3b 0a 20 20 20 20 6e 43  ost==p );.    nC
106b0 6f 6c 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  ol = p->pEList->
106c0 6e 45 78 70 72 3b 0a 20 20 20 20 70 4b 65 79 49  nExpr;.    pKeyI
106d0 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  nfo = sqlite3DbM
106e0 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 0a 20 20  allocZero(db,.  
106f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10700 20 20 20 20 20 73 69 7a 65 6f 66 28 2a 70 4b 65       sizeof(*pKe
10710 79 49 6e 66 6f 29 2b 6e 43 6f 6c 2a 28 73 69 7a  yInfo)+nCol*(siz
10720 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 20 2b 20  eof(CollSeq*) + 
10730 31 29 29 3b 0a 20 20 20 20 69 66 28 20 21 70 4b  1));.    if( !pK
10740 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20  eyInfo ){.      
10750 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
10760 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 75  M;.      goto mu
10770 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
10780 20 20 20 20 7d 0a 0a 20 20 20 20 70 4b 65 79 49      }..    pKeyI
10790 6e 66 6f 2d 3e 65 6e 63 20 3d 20 45 4e 43 28 64  nfo->enc = ENC(d
107a0 62 29 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f  b);.    pKeyInfo
107b0 2d 3e 6e 46 69 65 6c 64 20 3d 20 28 75 31 36 29  ->nField = (u16)
107c0 6e 43 6f 6c 3b 0a 0a 20 20 20 20 66 6f 72 28 69  nCol;..    for(i
107d0 3d 30 2c 20 61 70 43 6f 6c 6c 3d 70 4b 65 79 49  =0, apColl=pKeyI
107e0 6e 66 6f 2d 3e 61 43 6f 6c 6c 3b 20 69 3c 6e 43  nfo->aColl; i<nC
107f0 6f 6c 3b 20 69 2b 2b 2c 20 61 70 43 6f 6c 6c 2b  ol; i++, apColl+
10800 2b 29 7b 0a 20 20 20 20 20 20 2a 61 70 43 6f 6c  +){.      *apCol
10810 6c 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43  l = multiSelectC
10820 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
10830 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , i);.      if( 
10840 30 3d 3d 2a 61 70 43 6f 6c 6c 20 29 7b 0a 20 20  0==*apColl ){.  
10850 20 20 20 20 20 20 2a 61 70 43 6f 6c 6c 20 3d 20        *apColl = 
10860 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20  db->pDfltColl;. 
10870 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
10880 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74   pKeyInfo->aSort
10890 4f 72 64 65 72 20 3d 20 28 75 38 2a 29 61 70 43  Order = (u8*)apC
108a0 6f 6c 6c 3b 0a 0a 20 20 20 20 66 6f 72 28 70 4c  oll;..    for(pL
108b0 6f 6f 70 3d 70 3b 20 70 4c 6f 6f 70 3b 20 70 4c  oop=p; pLoop; pL
108c0 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 50 72 69 6f  oop=pLoop->pPrio
108d0 72 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  r){.      for(i=
108e0 30 3b 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20 20  0; i<2; i++){.  
108f0 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 20 3d        int addr =
10900 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e   pLoop->addrOpen
10910 45 70 68 6d 5b 69 5d 3b 0a 20 20 20 20 20 20 20  Ephm[i];.       
10920 20 69 66 28 20 61 64 64 72 3c 30 20 29 7b 0a 20   if( addr<0 ){. 
10930 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 5b           /* If [
10940 30 5d 20 69 73 20 75 6e 75 73 65 64 20 74 68 65  0] is unused the
10950 6e 20 5b 31 5d 20 69 73 20 61 6c 73 6f 20 75 6e  n [1] is also un
10960 75 73 65 64 2e 20 20 53 6f 20 77 65 20 63 61 6e  used.  So we can
10970 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6c  .          ** al
10980 77 61 79 73 20 73 61 66 65 6c 79 20 61 62 6f 72  ways safely abor
10990 74 20 61 73 20 73 6f 6f 6e 20 61 73 20 74 68 65  t as soon as the
109a0 20 66 69 72 73 74 20 75 6e 75 73 65 64 20 73 6c   first unused sl
109b0 6f 74 20 69 73 20 66 6f 75 6e 64 20 2a 2f 0a 20  ot is found */. 
109c0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
109d0 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e   pLoop->addrOpen
109e0 45 70 68 6d 5b 31 5d 3c 30 20 29 3b 0a 20 20 20  Ephm[1]<0 );.   
109f0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
10a00 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
10a10 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
10a20 65 50 32 28 76 2c 20 61 64 64 72 2c 20 6e 43 6f  eP2(v, addr, nCo
10a30 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  l);.        sqli
10a40 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28  te3VdbeChangeP4(
10a50 76 2c 20 61 64 64 72 2c 20 28 63 68 61 72 2a 29  v, addr, (char*)
10a60 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59  pKeyInfo, P4_KEY
10a70 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 20 20 70  INFO);.        p
10a80 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70  Loop->addrOpenEp
10a90 68 6d 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20 20 20  hm[i] = -1;.    
10aa0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
10ab0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
10ac0 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 7d 0a 0a  pKeyInfo);.  }..
10ad0 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
10ae0 3a 0a 20 20 70 44 65 73 74 2d 3e 69 53 64 73 74  :.  pDest->iSdst
10af0 20 3d 20 64 65 73 74 2e 69 53 64 73 74 3b 0a 20   = dest.iSdst;. 
10b00 20 70 44 65 73 74 2d 3e 6e 53 64 73 74 20 3d 20   pDest->nSdst = 
10b10 64 65 73 74 2e 6e 53 64 73 74 3b 0a 20 20 73 71  dest.nSdst;.  sq
10b20 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
10b30 65 28 64 62 2c 20 70 44 65 6c 65 74 65 29 3b 0a  e(db, pDelete);.
10b40 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
10b50 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
10b60 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  OMIT_COMPOUND_SE
10b70 4c 45 43 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43  LECT */../*.** C
10b80 6f 64 65 20 61 6e 20 6f 75 74 70 75 74 20 73 75  ode an output su
10b90 62 72 6f 75 74 69 6e 65 20 66 6f 72 20 61 20 63  broutine for a c
10ba0 6f 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65  oroutine impleme
10bb0 6e 74 61 74 69 6f 6e 20 6f 66 20 61 0a 2a 2a 20  ntation of a.** 
10bc0 53 45 4c 45 43 54 20 73 74 61 74 6d 65 6e 74 2e  SELECT statment.
10bd0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 61 74 61 20  .**.** The data 
10be0 74 6f 20 62 65 20 6f 75 74 70 75 74 20 69 73 20  to be output is 
10bf0 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 70 49 6e  contained in pIn
10c00 2d 3e 69 53 64 73 74 2e 20 20 54 68 65 72 65 20  ->iSdst.  There 
10c10 61 72 65 0a 2a 2a 20 70 49 6e 2d 3e 6e 53 64 73  are.** pIn->nSds
10c20 74 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20  t columns to be 
10c30 6f 75 74 70 75 74 2e 20 20 70 44 65 73 74 20 69  output.  pDest i
10c40 73 20 77 68 65 72 65 20 74 68 65 20 6f 75 74 70  s where the outp
10c50 75 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20  ut should.** be 
10c60 73 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 72 65 67 52  sent..**.** regR
10c70 65 74 75 72 6e 20 69 73 20 74 68 65 20 6e 75 6d  eturn is the num
10c80 62 65 72 20 6f 66 20 74 68 65 20 72 65 67 69 73  ber of the regis
10c90 74 65 72 20 68 6f 6c 64 69 6e 67 20 74 68 65 20  ter holding the 
10ca0 73 75 62 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65  subroutine.** re
10cb0 74 75 72 6e 20 61 64 64 72 65 73 73 2e 0a 2a 2a  turn address..**
10cc0 0a 2a 2a 20 49 66 20 72 65 67 50 72 65 76 3e 30  .** If regPrev>0
10cd0 20 74 68 65 6e 20 69 74 20 69 73 20 74 68 65 20   then it is the 
10ce0 66 69 72 73 74 20 72 65 67 69 73 74 65 72 20 69  first register i
10cf0 6e 20 61 20 76 65 63 74 6f 72 20 74 68 61 74 0a  n a vector that.
10d00 2a 2a 20 72 65 63 6f 72 64 73 20 74 68 65 20 70  ** records the p
10d10 72 65 76 69 6f 75 73 20 6f 75 74 70 75 74 2e 20  revious output. 
10d20 20 6d 65 6d 5b 72 65 67 50 72 65 76 5d 20 69 73   mem[regPrev] is
10d30 20 61 20 66 6c 61 67 20 74 68 61 74 20 69 73 20   a flag that is 
10d40 66 61 6c 73 65 0a 2a 2a 20 69 66 20 74 68 65 72  false.** if ther
10d50 65 20 68 61 73 20 62 65 65 6e 20 6e 6f 20 70 72  e has been no pr
10d60 65 76 69 6f 75 73 20 6f 75 74 70 75 74 2e 20 20  evious output.  
10d70 49 66 20 72 65 67 50 72 65 76 3e 30 20 74 68 65  If regPrev>0 the
10d80 6e 20 63 6f 64 65 20 69 73 0a 2a 2a 20 67 65 6e  n code is.** gen
10d90 65 72 61 74 65 64 20 74 6f 20 73 75 70 70 72 65  erated to suppre
10da0 73 73 20 64 75 70 6c 69 63 61 74 65 73 2e 20 20  ss duplicates.  
10db0 70 4b 65 79 49 6e 66 6f 20 69 73 20 75 73 65 64  pKeyInfo is used
10dc0 20 66 6f 72 20 63 6f 6d 70 61 72 69 6e 67 0a 2a   for comparing.*
10dd0 2a 20 6b 65 79 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  * keys..**.** If
10de0 20 74 68 65 20 4c 49 4d 49 54 20 66 6f 75 6e 64   the LIMIT found
10df0 20 69 6e 20 70 2d 3e 69 4c 69 6d 69 74 20 69 73   in p->iLimit is
10e00 20 72 65 61 63 68 65 64 2c 20 6a 75 6d 70 20 69   reached, jump i
10e10 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 0a 2a 2a  mmediately to.**
10e20 20 69 42 72 65 61 6b 2e 0a 2a 2f 0a 73 74 61 74   iBreak..*/.stat
10e30 69 63 20 69 6e 74 20 67 65 6e 65 72 61 74 65 4f  ic int generateO
10e40 75 74 70 75 74 53 75 62 72 6f 75 74 69 6e 65 28  utputSubroutine(
10e50 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
10e60 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
10e70 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
10e80 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
10e90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
10ea0 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
10eb0 6e 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  nt */.  SelectDe
10ec0 73 74 20 2a 70 49 6e 2c 20 20 20 20 20 20 20 20  st *pIn,        
10ed0 2f 2a 20 43 6f 72 6f 75 74 69 6e 65 20 73 75 70  /* Coroutine sup
10ee0 70 6c 79 69 6e 67 20 64 61 74 61 20 2a 2f 0a 20  plying data */. 
10ef0 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65   SelectDest *pDe
10f00 73 74 2c 20 20 20 20 20 20 2f 2a 20 57 68 65 72  st,      /* Wher
10f10 65 20 74 6f 20 73 65 6e 64 20 74 68 65 20 64 61  e to send the da
10f20 74 61 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52  ta */.  int regR
10f30 65 74 75 72 6e 2c 20 20 20 20 20 20 20 20 20 20  eturn,          
10f40 2f 2a 20 54 68 65 20 72 65 74 75 72 6e 20 61 64  /* The return ad
10f50 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20 2a  dress register *
10f60 2f 0a 20 20 69 6e 74 20 72 65 67 50 72 65 76 2c  /.  int regPrev,
10f70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
10f80 72 65 76 69 6f 75 73 20 72 65 73 75 6c 74 20 72  revious result r
10f90 65 67 69 73 74 65 72 2e 20 20 4e 6f 20 75 6e 69  egister.  No uni
10fa0 71 75 65 6e 65 73 73 20 69 66 20 30 20 2a 2f 0a  queness if 0 */.
10fb0 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
10fc0 6e 66 6f 2c 20 20 20 20 20 20 2f 2a 20 46 6f 72  nfo,      /* For
10fd0 20 63 6f 6d 70 61 72 69 6e 67 20 77 69 74 68 20   comparing with 
10fe0 70 72 65 76 69 6f 75 73 20 65 6e 74 72 79 20 2a  previous entry *
10ff0 2f 0a 20 20 69 6e 74 20 70 34 74 79 70 65 2c 20  /.  int p4type, 
11000 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
11010 68 65 20 70 34 20 74 79 70 65 20 66 6f 72 20 70  he p4 type for p
11020 4b 65 79 49 6e 66 6f 20 2a 2f 0a 20 20 69 6e 74  KeyInfo */.  int
11030 20 69 42 72 65 61 6b 20 20 20 20 20 20 20 20 20   iBreak         
11040 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72       /* Jump her
11050 65 20 69 66 20 77 65 20 68 69 74 20 74 68 65 20  e if we hit the 
11060 4c 49 4d 49 54 20 2a 2f 0a 29 7b 0a 20 20 56 64  LIMIT */.){.  Vd
11070 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
11080 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 43 6f  pVdbe;.  int iCo
11090 6e 74 69 6e 75 65 3b 0a 20 20 69 6e 74 20 61 64  ntinue;.  int ad
110a0 64 72 3b 0a 0a 20 20 61 64 64 72 20 3d 20 73 71  dr;..  addr = sq
110b0 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
110c0 41 64 64 72 28 76 29 3b 0a 20 20 69 43 6f 6e 74  Addr(v);.  iCont
110d0 69 6e 75 65 20 3d 20 73 71 6c 69 74 65 33 56 64  inue = sqlite3Vd
110e0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
110f0 0a 20 20 2f 2a 20 53 75 70 70 72 65 73 73 20 64  .  /* Suppress d
11100 75 70 6c 69 63 61 74 65 73 20 66 6f 72 20 55 4e  uplicates for UN
11110 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20 61 6e 64  ION, EXCEPT, and
11120 20 49 4e 54 45 52 53 45 43 54 20 0a 20 20 2a 2f   INTERSECT .  */
11130 0a 20 20 69 66 28 20 72 65 67 50 72 65 76 20 29  .  if( regPrev )
11140 7b 0a 20 20 20 20 69 6e 74 20 6a 31 2c 20 6a 32  {.    int j1, j2
11150 3b 0a 20 20 20 20 6a 31 20 3d 20 73 71 6c 69 74  ;.    j1 = sqlit
11160 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
11170 4f 50 5f 49 66 4e 6f 74 2c 20 72 65 67 50 72 65  OP_IfNot, regPre
11180 76 29 3b 0a 20 20 20 20 6a 32 20 3d 20 73 71 6c  v);.    j2 = sql
11190 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
111a0 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 70 49  , OP_Compare, pI
111b0 6e 2d 3e 69 53 64 73 74 2c 20 72 65 67 50 72 65  n->iSdst, regPre
111c0 76 2b 31 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 2c  v+1, pIn->nSdst,
111d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
111e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
111f0 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20  char*)pKeyInfo, 
11200 70 34 74 79 70 65 29 3b 0a 20 20 20 20 73 71 6c  p4type);.    sql
11210 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
11220 2c 20 4f 50 5f 4a 75 6d 70 2c 20 6a 32 2b 32 2c  , OP_Jump, j2+2,
11230 20 69 43 6f 6e 74 69 6e 75 65 2c 20 6a 32 2b 32   iContinue, j2+2
11240 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
11250 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 31  beJumpHere(v, j1
11260 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
11270 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
11280 6f 70 79 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c  opy, pIn->iSdst,
11290 20 72 65 67 50 72 65 76 2b 31 2c 20 70 49 6e 2d   regPrev+1, pIn-
112a0 3e 6e 53 64 73 74 2d 31 29 3b 0a 20 20 20 20 73  >nSdst-1);.    s
112b0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
112c0 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
112d0 31 2c 20 72 65 67 50 72 65 76 29 3b 0a 20 20 7d  1, regPrev);.  }
112e0 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64  .  if( pParse->d
112f0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
11300 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f  ) return 0;..  /
11310 2a 20 53 75 70 70 72 65 73 73 20 74 68 65 20 66  * Suppress the f
11320 69 72 73 74 20 4f 46 46 53 45 54 20 65 6e 74 72  irst OFFSET entr
11330 69 65 73 20 69 66 20 74 68 65 72 65 20 69 73 20  ies if there is 
11340 61 6e 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65  an OFFSET clause
11350 0a 20 20 2a 2f 0a 20 20 63 6f 64 65 4f 66 66 73  .  */.  codeOffs
11360 65 74 28 76 2c 20 70 2c 20 69 43 6f 6e 74 69 6e  et(v, p, iContin
11370 75 65 29 3b 0a 0a 20 20 73 77 69 74 63 68 28 20  ue);..  switch( 
11380 70 44 65 73 74 2d 3e 65 44 65 73 74 20 29 7b 0a  pDest->eDest ){.
11390 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65      /* Store the
113a0 20 72 65 73 75 6c 74 20 61 73 20 64 61 74 61 20   result as data 
113b0 75 73 69 6e 67 20 61 20 75 6e 69 71 75 65 20 6b  using a unique k
113c0 65 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ey..    */.    c
113d0 61 73 65 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20  ase SRT_Table:. 
113e0 20 20 20 63 61 73 65 20 53 52 54 5f 45 70 68 65     case SRT_Ephe
113f0 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20 20 69 6e  mTab: {.      in
11400 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65  t r1 = sqlite3Ge
11410 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
11420 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 32 20 3d  ;.      int r2 =
11430 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
11440 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
11450 20 20 74 65 73 74 63 61 73 65 28 20 70 44 65 73    testcase( pDes
11460 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 54 61  t->eDest==SRT_Ta
11470 62 6c 65 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ble );.      tes
11480 74 63 61 73 65 28 20 70 44 65 73 74 2d 3e 65 44  tcase( pDest->eD
11490 65 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61  est==SRT_EphemTa
114a0 62 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  b );.      sqlit
114b0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
114c0 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 70  OP_MakeRecord, p
114d0 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e  In->iSdst, pIn->
114e0 6e 53 64 73 74 2c 20 72 31 29 3b 0a 20 20 20 20  nSdst, r1);.    
114f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
11500 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77  Op2(v, OP_NewRow
11510 69 64 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61  id, pDest->iSDPa
11520 72 6d 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 73  rm, r2);.      s
11530 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
11540 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 70  (v, OP_Insert, p
11550 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 72  Dest->iSDParm, r
11560 31 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 73 71  1, r2);.      sq
11570 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
11580 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45  5(v, OPFLAG_APPE
11590 4e 44 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ND);.      sqlit
115a0 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
115b0 28 70 50 61 72 73 65 2c 20 72 32 29 3b 0a 20 20  (pParse, r2);.  
115c0 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
115d0 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
115e0 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72 65  , r1);.      bre
115f0 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64  ak;.    }..#ifnd
11600 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
11610 55 42 51 55 45 52 59 0a 20 20 20 20 2f 2a 20 49  UBQUERY.    /* I
11620 66 20 77 65 20 61 72 65 20 63 72 65 61 74 69 6e  f we are creatin
11630 67 20 61 20 73 65 74 20 66 6f 72 20 61 6e 20 22  g a set for an "
11640 65 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20  expr IN (SELECT 
11650 2e 2e 2e 29 22 20 63 6f 6e 73 74 72 75 63 74 2c  ...)" construct,
11660 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65  .    ** then the
11670 72 65 20 73 68 6f 75 6c 64 20 62 65 20 61 20 73  re should be a s
11680 69 6e 67 6c 65 20 69 74 65 6d 20 6f 6e 20 74 68  ingle item on th
11690 65 20 73 74 61 63 6b 2e 20 20 57 72 69 74 65 20  e stack.  Write 
116a0 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 74 65 6d  this.    ** item
116b0 20 69 6e 74 6f 20 74 68 65 20 73 65 74 20 74 61   into the set ta
116c0 62 6c 65 20 77 69 74 68 20 62 6f 67 75 73 20 64  ble with bogus d
116d0 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ata..    */.    
116e0 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a  case SRT_Set: {.
116f0 20 20 20 20 20 20 69 6e 74 20 72 31 3b 0a 20 20        int r1;.  
11700 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 2d      assert( pIn-
11710 3e 6e 53 64 73 74 3d 3d 31 20 29 3b 0a 20 20 20  >nSdst==1 );.   
11720 20 20 20 70 44 65 73 74 2d 3e 61 66 66 53 64 73     pDest->affSds
11730 74 20 3d 20 0a 20 20 20 20 20 20 20 20 20 73 71  t = .         sq
11740 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69  lite3CompareAffi
11750 6e 69 74 79 28 70 2d 3e 70 45 4c 69 73 74 2d 3e  nity(p->pEList->
11760 61 5b 30 5d 2e 70 45 78 70 72 2c 20 70 44 65 73  a[0].pExpr, pDes
11770 74 2d 3e 61 66 66 53 64 73 74 29 3b 0a 20 20 20  t->affSdst);.   
11780 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47     r1 = sqlite3G
11790 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
117a0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
117b0 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
117c0 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 70 49 6e  _MakeRecord, pIn
117d0 2d 3e 69 53 64 73 74 2c 20 31 2c 20 72 31 2c 20  ->iSdst, 1, r1, 
117e0 26 70 44 65 73 74 2d 3e 61 66 66 53 64 73 74 2c  &pDest->affSdst,
117f0 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
11800 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69  3ExprCacheAffini
11810 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c  tyChange(pParse,
11820 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 31 29 3b   pIn->iSdst, 1);
11830 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
11840 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
11850 64 78 49 6e 73 65 72 74 2c 20 70 44 65 73 74 2d  dxInsert, pDest-
11860 3e 69 53 44 50 61 72 6d 2c 20 72 31 29 3b 0a 20  >iSDParm, r1);. 
11870 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
11880 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
11890 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72  e, r1);.      br
118a0 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20  eak;.    }..#if 
118b0 30 20 20 2f 2a 20 4e 65 76 65 72 20 6f 63 63 75  0  /* Never occu
118c0 72 73 20 6f 6e 20 61 6e 20 4f 52 44 45 52 20 42  rs on an ORDER B
118d0 59 20 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 2f  Y query */.    /
118e0 2a 20 49 66 20 61 6e 79 20 72 6f 77 20 65 78 69  * If any row exi
118f0 73 74 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  st in the result
11900 20 73 65 74 2c 20 72 65 63 6f 72 64 20 74 68 61   set, record tha
11910 74 20 66 61 63 74 20 61 6e 64 20 61 62 6f 72 74  t fact and abort
11920 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
11930 65 20 53 52 54 5f 45 78 69 73 74 73 3a 20 7b 0a  e SRT_Exists: {.
11940 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
11950 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
11960 74 65 67 65 72 2c 20 31 2c 20 70 44 65 73 74 2d  teger, 1, pDest-
11970 3e 69 53 44 50 61 72 6d 29 3b 0a 20 20 20 20 20  >iSDParm);.     
11980 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c   /* The LIMIT cl
11990 61 75 73 65 20 77 69 6c 6c 20 74 65 72 6d 69 6e  ause will termin
119a0 61 74 65 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72  ate the loop for
119b0 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 62 72 65   us */.      bre
119c0 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
119d0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
119e0 20 69 73 20 61 20 73 63 61 6c 61 72 20 73 65 6c   is a scalar sel
119f0 65 63 74 20 74 68 61 74 20 69 73 20 70 61 72 74  ect that is part
11a00 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f   of an expressio
11a10 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 73  n, then.    ** s
11a20 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73  tore the results
11a30 20 69 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69   in the appropri
11a40 61 74 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20  ate memory cell 
11a50 61 6e 64 20 62 72 65 61 6b 20 6f 75 74 0a 20 20  and break out.  
11a60 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 63 61 6e    ** of the scan
11a70 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20   loop..    */.  
11a80 20 20 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20    case SRT_Mem: 
11a90 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
11aa0 70 49 6e 2d 3e 6e 53 64 73 74 3d 3d 31 20 29 3b  pIn->nSdst==1 );
11ab0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
11ac0 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73  prCodeMove(pPars
11ad0 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70  e, pIn->iSdst, p
11ae0 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 31  Dest->iSDParm, 1
11af0 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  );.      /* The 
11b00 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69 6c  LIMIT clause wil
11b10 6c 20 6a 75 6d 70 20 6f 75 74 20 6f 66 20 74 68  l jump out of th
11b20 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f  e loop for us */
11b30 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
11b40 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69    }.#endif /* #i
11b50 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
11b60 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 20  T_SUBQUERY */.. 
11b70 20 20 20 2f 2a 20 54 68 65 20 72 65 73 75 6c 74     /* The result
11b80 73 20 61 72 65 20 73 74 6f 72 65 64 20 69 6e 20  s are stored in 
11b90 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20 72 65  a sequence of re
11ba0 67 69 73 74 65 72 73 0a 20 20 20 20 2a 2a 20 73  gisters.    ** s
11bb0 74 61 72 74 69 6e 67 20 61 74 20 70 44 65 73 74  tarting at pDest
11bc0 2d 3e 69 53 64 73 74 2e 20 20 54 68 65 6e 20 74  ->iSdst.  Then t
11bd0 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20 79 69  he co-routine yi
11be0 65 6c 64 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  elds..    */.   
11bf0 20 63 61 73 65 20 53 52 54 5f 43 6f 72 6f 75 74   case SRT_Corout
11c00 69 6e 65 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  ine: {.      if(
11c10 20 70 44 65 73 74 2d 3e 69 53 64 73 74 3d 3d 30   pDest->iSdst==0
11c20 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65 73   ){.        pDes
11c30 74 2d 3e 69 53 64 73 74 20 3d 20 73 71 6c 69 74  t->iSdst = sqlit
11c40 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70  e3GetTempRange(p
11c50 50 61 72 73 65 2c 20 70 49 6e 2d 3e 6e 53 64 73  Parse, pIn->nSds
11c60 74 29 3b 0a 20 20 20 20 20 20 20 20 70 44 65 73  t);.        pDes
11c70 74 2d 3e 6e 53 64 73 74 20 3d 20 70 49 6e 2d 3e  t->nSdst = pIn->
11c80 6e 53 64 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20  nSdst;.      }. 
11c90 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
11ca0 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c  CodeMove(pParse,
11cb0 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 44 65   pIn->iSdst, pDe
11cc0 73 74 2d 3e 69 53 64 73 74 2c 20 70 44 65 73 74  st->iSdst, pDest
11cd0 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20 20 20  ->nSdst);.      
11ce0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
11cf0 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 70  1(v, OP_Yield, p
11d00 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 29 3b 0a  Dest->iSDParm);.
11d10 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
11d20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f   }..    /* If no
11d30 6e 65 20 6f 66 20 74 68 65 20 61 62 6f 76 65 2c  ne of the above,
11d40 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74   then the result
11d50 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 6d 75 73   destination mus
11d60 74 20 62 65 0a 20 20 20 20 2a 2a 20 53 52 54 5f  t be.    ** SRT_
11d70 4f 75 74 70 75 74 2e 20 20 54 68 69 73 20 72 6f  Output.  This ro
11d80 75 74 69 6e 65 20 69 73 20 6e 65 76 65 72 20 63  utine is never c
11d90 61 6c 6c 65 64 20 77 69 74 68 20 61 6e 79 20 6f  alled with any o
11da0 74 68 65 72 0a 20 20 20 20 2a 2a 20 64 65 73 74  ther.    ** dest
11db0 69 6e 61 74 69 6f 6e 20 6f 74 68 65 72 20 74 68  ination other th
11dc0 61 6e 20 74 68 65 20 6f 6e 65 73 20 68 61 6e 64  an the ones hand
11dd0 6c 65 64 20 61 62 6f 76 65 20 6f 72 20 53 52 54  led above or SRT
11de0 5f 4f 75 74 70 75 74 2e 0a 20 20 20 20 2a 2a 0a  _Output..    **.
11df0 20 20 20 20 2a 2a 20 46 6f 72 20 53 52 54 5f 4f      ** For SRT_O
11e00 75 74 70 75 74 2c 20 72 65 73 75 6c 74 73 20 61  utput, results a
11e10 72 65 20 73 74 6f 72 65 64 20 69 6e 20 61 20 73  re stored in a s
11e20 65 71 75 65 6e 63 65 20 6f 66 20 72 65 67 69 73  equence of regis
11e30 74 65 72 73 2e 20 20 0a 20 20 20 20 2a 2a 20 54  ters.  .    ** T
11e40 68 65 6e 20 74 68 65 20 4f 50 5f 52 65 73 75 6c  hen the OP_Resul
11e50 74 52 6f 77 20 6f 70 63 6f 64 65 20 69 73 20 75  tRow opcode is u
11e60 73 65 64 20 74 6f 20 63 61 75 73 65 20 73 71 6c  sed to cause sql
11e70 69 74 65 33 5f 73 74 65 70 28 29 20 74 6f 0a 20  ite3_step() to. 
11e80 20 20 20 2a 2a 20 72 65 74 75 72 6e 20 74 68 65     ** return the
11e90 20 6e 65 78 74 20 72 6f 77 20 6f 66 20 72 65 73   next row of res
11ea0 75 6c 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ult..    */.    
11eb0 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
11ec0 20 61 73 73 65 72 74 28 20 70 44 65 73 74 2d 3e   assert( pDest->
11ed0 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75  eDest==SRT_Outpu
11ee0 74 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  t );.      sqlit
11ef0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
11f00 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 70 49  OP_ResultRow, pI
11f10 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e  n->iSdst, pIn->n
11f20 53 64 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  Sdst);.      sql
11f30 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66  ite3ExprCacheAff
11f40 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72  inityChange(pPar
11f50 73 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20  se, pIn->iSdst, 
11f60 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20  pIn->nSdst);.   
11f70 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
11f80 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74    }..  /* Jump t
11f90 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
11fa0 20 6c 6f 6f 70 20 69 66 20 74 68 65 20 4c 49 4d   loop if the LIM
11fb0 49 54 20 69 73 20 72 65 61 63 68 65 64 2e 0a 20  IT is reached.. 
11fc0 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69   */.  if( p->iLi
11fd0 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  mit ){.    sqlit
11fe0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
11ff0 4f 50 5f 49 66 5a 65 72 6f 2c 20 70 2d 3e 69 4c  OP_IfZero, p->iL
12000 69 6d 69 74 2c 20 69 42 72 65 61 6b 2c 20 2d 31  imit, iBreak, -1
12010 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e  );.  }..  /* Gen
12020 65 72 61 74 65 20 74 68 65 20 73 75 62 72 6f 75  erate the subrou
12030 74 69 6e 65 20 72 65 74 75 72 6e 0a 20 20 2a 2f  tine return.  */
12040 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  .  sqlite3VdbeRe
12050 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43  solveLabel(v, iC
12060 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 73 71 6c 69  ontinue);.  sqli
12070 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
12080 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 52   OP_Return, regR
12090 65 74 75 72 6e 29 3b 0a 0a 20 20 72 65 74 75 72  eturn);..  retur
120a0 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n addr;.}../*.**
120b0 20 41 6c 74 65 72 6e 61 74 69 76 65 20 63 6f 6d   Alternative com
120c0 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 63 6f 64  pound select cod
120d0 65 20 67 65 6e 65 72 61 74 6f 72 20 66 6f 72 20  e generator for 
120e0 63 61 73 65 73 20 77 68 65 6e 20 74 68 65 72 65  cases when there
120f0 0a 2a 2a 20 69 73 20 61 6e 20 4f 52 44 45 52 20  .** is an ORDER 
12100 42 59 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a  BY clause..**.**
12110 20 57 65 20 61 73 73 75 6d 65 20 61 20 71 75 65   We assume a que
12120 72 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ry of the follow
12130 69 6e 67 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20  ing form:.**.** 
12140 20 20 20 20 20 3c 73 65 6c 65 63 74 41 3e 20 20       <selectA>  
12150 3c 6f 70 65 72 61 74 6f 72 3e 20 20 3c 73 65 6c  <operator>  <sel
12160 65 63 74 42 3e 20 20 4f 52 44 45 52 20 42 59 20  ectB>  ORDER BY 
12170 3c 6f 72 64 65 72 62 79 6c 69 73 74 3e 0a 2a 2a  <orderbylist>.**
12180 0a 2a 2a 20 3c 6f 70 65 72 61 74 6f 72 3e 20 69  .** <operator> i
12190 73 20 6f 6e 65 20 6f 66 20 55 4e 49 4f 4e 20 41  s one of UNION A
121a0 4c 4c 2c 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50  LL, UNION, EXCEP
121b0 54 2c 20 6f 72 20 49 4e 54 45 52 53 45 43 54 2e  T, or INTERSECT.
121c0 20 20 54 68 65 20 69 64 65 61 0a 2a 2a 20 69 73    The idea.** is
121d0 20 74 6f 20 63 6f 64 65 20 62 6f 74 68 20 3c 73   to code both <s
121e0 65 6c 65 63 74 41 3e 20 61 6e 64 20 3c 73 65 6c  electA> and <sel
121f0 65 63 74 42 3e 20 77 69 74 68 20 74 68 65 20 4f  ectB> with the O
12200 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61  RDER BY clause a
12210 73 0a 2a 2a 20 63 6f 2d 72 6f 75 74 69 6e 65 73  s.** co-routines
12220 2e 20 20 54 68 65 6e 20 72 75 6e 20 74 68 65 20  .  Then run the 
12230 63 6f 2d 72 6f 75 74 69 6e 65 73 20 69 6e 20 70  co-routines in p
12240 61 72 61 6c 6c 65 6c 20 61 6e 64 20 6d 65 72 67  arallel and merg
12250 65 20 74 68 65 20 72 65 73 75 6c 74 73 0a 2a 2a  e the results.**
12260 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75 74   into the output
12270 2e 20 20 49 6e 20 61 64 64 69 74 69 6f 6e 20 74  .  In addition t
12280 6f 20 74 68 65 20 74 77 6f 20 63 6f 72 6f 75 74  o the two corout
12290 69 6e 65 73 20 28 63 61 6c 6c 65 64 20 73 65 6c  ines (called sel
122a0 65 63 74 41 20 61 6e 64 0a 2a 2a 20 73 65 6c 65  ectA and.** sele
122b0 63 74 42 29 20 74 68 65 72 65 20 61 72 65 20 37  ctB) there are 7
122c0 20 73 75 62 72 6f 75 74 69 6e 65 73 3a 0a 2a 2a   subroutines:.**
122d0 0a 2a 2a 20 20 20 20 6f 75 74 41 3a 20 20 20 20  .**    outA:    
122e0 4d 6f 76 65 20 74 68 65 20 6f 75 74 70 75 74 20  Move the output 
122f0 6f 66 20 74 68 65 20 73 65 6c 65 63 74 41 20 63  of the selectA c
12300 6f 72 6f 75 74 69 6e 65 20 69 6e 74 6f 20 74 68  oroutine into th
12310 65 20 6f 75 74 70 75 74 0a 2a 2a 20 20 20 20 20  e output.**     
12320 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 63          of the c
12330 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 2e 0a 2a  ompound query..*
12340 2a 0a 2a 2a 20 20 20 20 6f 75 74 42 3a 20 20 20  *.**    outB:   
12350 20 4d 6f 76 65 20 74 68 65 20 6f 75 74 70 75 74   Move the output
12360 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 42 20   of the selectB 
12370 63 6f 72 6f 75 74 69 6e 65 20 69 6e 74 6f 20 74  coroutine into t
12380 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 20 20 20  he output.**    
12390 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20           of the 
123a0 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 2e 20  compound query. 
123b0 20 28 4f 6e 6c 79 20 67 65 6e 65 72 61 74 65 64   (Only generated
123c0 20 66 6f 72 20 55 4e 49 4f 4e 20 61 6e 64 0a 2a   for UNION and.*
123d0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 55 4e  *             UN
123e0 49 4f 4e 20 41 4c 4c 2e 20 20 45 58 43 45 50 54  ION ALL.  EXCEPT
123f0 20 61 6e 64 20 49 4e 53 45 52 54 53 45 43 54 20   and INSERTSECT 
12400 6e 65 76 65 72 20 6f 75 74 70 75 74 20 61 20 72  never output a r
12410 6f 77 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20  ow that.**      
12420 20 20 20 20 20 20 20 61 70 70 65 61 72 73 20 6f         appears o
12430 6e 6c 79 20 69 6e 20 42 2e 29 0a 2a 2a 0a 2a 2a  nly in B.).**.**
12440 20 20 20 20 41 6c 74 42 3a 20 20 20 20 43 61 6c      AltB:    Cal
12450 6c 65 64 20 77 68 65 6e 20 74 68 65 72 65 20 69  led when there i
12460 73 20 64 61 74 61 20 66 72 6f 6d 20 62 6f 74 68  s data from both
12470 20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64 20   coroutines and 
12480 41 3c 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 65  A<B..**.**    Ae
12490 71 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68  qB:    Called wh
124a0 65 6e 20 74 68 65 72 65 20 69 73 20 64 61 74 61  en there is data
124b0 20 66 72 6f 6d 20 62 6f 74 68 20 63 6f 72 6f 75   from both corou
124c0 74 69 6e 65 73 20 61 6e 64 20 41 3d 3d 42 2e 0a  tines and A==B..
124d0 2a 2a 0a 2a 2a 20 20 20 20 41 67 74 42 3a 20 20  **.**    AgtB:  
124e0 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 74 68    Called when th
124f0 65 72 65 20 69 73 20 64 61 74 61 20 66 72 6f 6d  ere is data from
12500 20 62 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65 73   both coroutines
12510 20 61 6e 64 20 41 3e 42 2e 0a 2a 2a 0a 2a 2a 20   and A>B..**.** 
12520 20 20 20 45 6f 66 41 3a 20 20 20 20 43 61 6c 6c     EofA:    Call
12530 65 64 20 77 68 65 6e 20 64 61 74 61 20 69 73 20  ed when data is 
12540 65 78 68 61 75 73 74 65 64 20 66 72 6f 6d 20 73  exhausted from s
12550 65 6c 65 63 74 41 2e 0a 2a 2a 0a 2a 2a 20 20 20  electA..**.**   
12560 20 45 6f 66 42 3a 20 20 20 20 43 61 6c 6c 65 64   EofB:    Called
12570 20 77 68 65 6e 20 64 61 74 61 20 69 73 20 65 78   when data is ex
12580 68 61 75 73 74 65 64 20 66 72 6f 6d 20 73 65 6c  hausted from sel
12590 65 63 74 42 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ectB..**.** The 
125a0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
125b0 66 20 74 68 65 20 6c 61 74 74 65 72 20 66 69 76  f the latter fiv
125c0 65 20 73 75 62 72 6f 75 74 69 6e 65 73 20 64 65  e subroutines de
125d0 70 65 6e 64 20 6f 6e 20 77 68 69 63 68 20 0a 2a  pend on which .*
125e0 2a 20 3c 6f 70 65 72 61 74 6f 72 3e 20 69 73 20  * <operator> is 
125f0 75 73 65 64 3a 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 20  used:.**.**.**  
12600 20 20 20 20 20 20 20 20 20 20 20 55 4e 49 4f 4e             UNION
12610 20 41 4c 4c 20 20 20 20 20 20 20 20 20 55 4e 49   ALL         UNI
12620 4f 4e 20 20 20 20 20 20 20 20 20 20 20 20 45 58  ON            EX
12630 43 45 50 54 20 20 20 20 20 20 20 20 20 20 49 4e  CEPT          IN
12640 54 45 52 53 45 43 54 0a 2a 2a 20 20 20 20 20 20  TERSECT.**      
12650 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d      ------------
12660 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  -  -------------
12670 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----  ----------
12680 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----  ----------
12690 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 41 6c 74  -------.**   Alt
126a0 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41  B:   outA, nextA
126b0 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74        outA, next
126c0 41 20 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65  A       outA, ne
126d0 78 74 41 20 20 20 20 20 20 20 20 20 6e 65 78 74  xtA         next
126e0 41 0a 2a 2a 0a 2a 2a 20 20 20 41 65 71 42 3a 20  A.**.**   AeqB: 
126f0 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20    outA, nextA   
12700 20 20 20 20 20 20 6e 65 78 74 41 20 20 20 20 20        nextA     
12710 20 20 20 20 20 20 20 20 6e 65 78 74 41 20 20 20          nextA   
12720 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74        outA, next
12730 41 0a 2a 2a 0a 2a 2a 20 20 20 41 67 74 42 3a 20  A.**.**   AgtB: 
12740 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20 20    outB, nextB   
12750 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20     outB, nextB  
12760 20 20 20 20 20 20 20 20 6e 65 78 74 42 20 20 20          nextB   
12770 20 20 20 20 20 20 20 20 20 6e 65 78 74 42 0a 2a           nextB.*
12780 2a 0a 2a 2a 20 20 20 45 6f 66 41 3a 20 20 20 6f  *.**   EofA:   o
12790 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20 20  utB, nextB      
127a0 6f 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20  outB, nextB     
127b0 20 20 20 20 20 68 61 6c 74 20 20 20 20 20 20 20       halt       
127c0 20 20 20 20 20 20 68 61 6c 74 0a 2a 2a 0a 2a 2a        halt.**.**
127d0 20 20 20 45 6f 66 42 3a 20 20 20 6f 75 74 41 2c     EofB:   outA,
127e0 20 6e 65 78 74 41 20 20 20 20 20 20 6f 75 74 41   nextA      outA
127f0 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20 6f 75  , nextA       ou
12800 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20  tA, nextA       
12810 20 20 68 61 6c 74 0a 2a 2a 0a 2a 2a 20 49 6e 20    halt.**.** In 
12820 74 68 65 20 41 6c 74 42 2c 20 41 65 71 42 2c 20  the AltB, AeqB, 
12830 61 6e 64 20 41 67 74 42 20 73 75 62 72 6f 75 74  and AgtB subrout
12840 69 6e 65 73 2c 20 61 6e 20 45 4f 46 20 6f 6e 20  ines, an EOF on 
12850 41 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78 74  A following next
12860 41 0a 2a 2a 20 63 61 75 73 65 73 20 61 6e 20 69  A.** causes an i
12870 6d 6d 65 64 69 61 74 65 20 6a 75 6d 70 20 74 6f  mmediate jump to
12880 20 45 6f 66 41 20 61 6e 64 20 61 6e 20 45 4f 46   EofA and an EOF
12890 20 6f 6e 20 42 20 66 6f 6c 6c 6f 77 69 6e 67 20   on B following 
128a0 6e 65 78 74 42 20 63 61 75 73 65 73 0a 2a 2a 20  nextB causes.** 
128b0 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 6a 75 6d  an immediate jum
128c0 70 20 74 6f 20 45 6f 66 42 2e 20 20 57 69 74 68  p to EofB.  With
128d0 69 6e 20 45 6f 66 41 20 61 6e 64 20 45 6f 66 42  in EofA and EofB
128e0 2c 20 61 6e 64 20 45 4f 46 20 6f 6e 20 65 6e 74  , and EOF on ent
128f0 72 79 20 6f 72 0a 2a 2a 20 66 6f 6c 6c 6f 77 69  ry or.** followi
12900 6e 67 20 6e 65 78 74 58 20 63 61 75 73 65 73 20  ng nextX causes 
12910 61 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 65 6e  a jump to the en
12920 64 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 20  d of the select 
12930 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a  processing..**.*
12940 2a 20 44 75 70 6c 69 63 61 74 65 20 72 65 6d 6f  * Duplicate remo
12950 76 61 6c 20 69 6e 20 74 68 65 20 55 4e 49 4f 4e  val in the UNION
12960 2c 20 45 58 43 45 50 54 2c 20 61 6e 64 20 49 4e  , EXCEPT, and IN
12970 54 45 52 53 45 43 54 20 63 61 73 65 73 20 69 73  TERSECT cases is
12980 20 68 61 6e 64 6c 65 64 0a 2a 2a 20 77 69 74 68   handled.** with
12990 69 6e 20 74 68 65 20 6f 75 74 70 75 74 20 73 75  in the output su
129a0 62 72 6f 75 74 69 6e 65 2e 20 20 54 68 65 20 72  broutine.  The r
129b0 65 67 50 72 65 76 20 72 65 67 69 73 74 65 72 20  egPrev register 
129c0 73 65 74 20 68 6f 6c 64 73 20 74 68 65 20 70 72  set holds the pr
129d0 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 6f 75 74 70  eviously.** outp
129e0 75 74 20 76 61 6c 75 65 2e 20 20 41 20 63 6f 6d  ut value.  A com
129f0 70 61 72 69 73 6f 6e 20 69 73 20 6d 61 64 65 20  parison is made 
12a00 61 67 61 69 6e 73 74 20 74 68 69 73 20 76 61 6c  against this val
12a10 75 65 20 61 6e 64 20 74 68 65 20 6f 75 74 70 75  ue and the outpu
12a20 74 0a 2a 2a 20 69 73 20 73 6b 69 70 70 65 64 20  t.** is skipped 
12a30 69 66 20 74 68 65 20 6e 65 78 74 20 72 65 73 75  if the next resu
12a40 6c 74 73 20 77 6f 75 6c 64 20 62 65 20 74 68 65  lts would be the
12a50 20 73 61 6d 65 20 61 73 20 74 68 65 20 70 72 65   same as the pre
12a60 76 69 6f 75 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  vious..**.** The
12a70 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
12a80 70 6c 61 6e 20 69 73 20 74 6f 20 69 6d 70 6c 65  plan is to imple
12a90 6d 65 6e 74 20 74 68 65 20 74 77 6f 20 63 6f 72  ment the two cor
12aa0 6f 75 74 69 6e 65 73 20 61 6e 64 20 73 65 76 65  outines and seve
12ab0 6e 0a 2a 2a 20 73 75 62 72 6f 75 74 69 6e 65 73  n.** subroutines
12ac0 20 66 69 72 73 74 2c 20 74 68 65 6e 20 70 75 74   first, then put
12ad0 20 74 68 65 20 63 6f 6e 74 72 6f 6c 20 6c 6f 67   the control log
12ae0 69 63 20 61 74 20 74 68 65 20 62 6f 74 74 6f 6d  ic at the bottom
12af0 2e 20 20 4c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a  .  Like this:.**
12b00 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 67 6f 74  .**          got
12b10 6f 20 49 6e 69 74 0a 2a 2a 20 20 20 20 20 63 6f  o Init.**     co
12b20 41 3a 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72  A: coroutine for
12b30 20 6c 65 66 74 20 71 75 65 72 79 20 28 41 29 0a   left query (A).
12b40 2a 2a 20 20 20 20 20 63 6f 42 3a 20 63 6f 72 6f  **     coB: coro
12b50 75 74 69 6e 65 20 66 6f 72 20 72 69 67 68 74 20  utine for right 
12b60 71 75 65 72 79 20 28 42 29 0a 2a 2a 20 20 20 20  query (B).**    
12b70 6f 75 74 41 3a 20 6f 75 74 70 75 74 20 6f 6e 65  outA: output one
12b80 20 72 6f 77 20 6f 66 20 41 0a 2a 2a 20 20 20 20   row of A.**    
12b90 6f 75 74 42 3a 20 6f 75 74 70 75 74 20 6f 6e 65  outB: output one
12ba0 20 72 6f 77 20 6f 66 20 42 20 28 55 4e 49 4f 4e   row of B (UNION
12bb0 20 61 6e 64 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f   and UNION ALL o
12bc0 6e 6c 79 29 0a 2a 2a 20 20 20 20 45 6f 66 41 3a  nly).**    EofA:
12bd0 20 2e 2e 2e 0a 2a 2a 20 20 20 20 45 6f 66 42 3a   ....**    EofB:
12be0 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 6c 74 42 3a   ....**    AltB:
12bf0 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 65 71 42 3a   ....**    AeqB:
12c00 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 67 74 42 3a   ....**    AgtB:
12c10 20 2e 2e 2e 0a 2a 2a 20 20 20 20 49 6e 69 74 3a   ....**    Init:
12c20 20 69 6e 69 74 69 61 6c 69 7a 65 20 63 6f 72 6f   initialize coro
12c30 75 74 69 6e 65 20 72 65 67 69 73 74 65 72 73 0a  utine registers.
12c40 2a 2a 20 20 20 20 20 20 20 20 20 20 79 69 65 6c  **          yiel
12c50 64 20 63 6f 41 0a 2a 2a 20 20 20 20 20 20 20 20  d coA.**        
12c60 20 20 69 66 20 65 6f 66 28 41 29 20 67 6f 74 6f    if eof(A) goto
12c70 20 45 6f 66 41 0a 2a 2a 20 20 20 20 20 20 20 20   EofA.**        
12c80 20 20 79 69 65 6c 64 20 63 6f 42 0a 2a 2a 20 20    yield coB.**  
12c90 20 20 20 20 20 20 20 20 69 66 20 65 6f 66 28 42          if eof(B
12ca0 29 20 67 6f 74 6f 20 45 6f 66 42 0a 2a 2a 20 20  ) goto EofB.**  
12cb0 20 20 43 6d 70 72 3a 20 43 6f 6d 70 61 72 65 20    Cmpr: Compare 
12cc0 41 2c 20 42 0a 2a 2a 20 20 20 20 20 20 20 20 20  A, B.**         
12cd0 20 4a 75 6d 70 20 41 6c 74 42 2c 20 41 65 71 42   Jump AltB, AeqB
12ce0 2c 20 41 67 74 42 0a 2a 2a 20 20 20 20 20 45 6e  , AgtB.**     En
12cf0 64 3a 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 57 65 20  d: ....**.** We 
12d00 63 61 6c 6c 20 41 6c 74 42 2c 20 41 65 71 42 2c  call AltB, AeqB,
12d10 20 41 67 74 42 2c 20 45 6f 66 41 2c 20 61 6e 64   AgtB, EofA, and
12d20 20 45 6f 66 42 20 22 73 75 62 72 6f 75 74 69 6e   EofB "subroutin
12d30 65 73 22 20 62 75 74 20 74 68 65 79 20 61 72 65  es" but they are
12d40 20 6e 6f 74 0a 2a 2a 20 61 63 74 75 61 6c 6c 79   not.** actually
12d50 20 63 61 6c 6c 65 64 20 75 73 69 6e 67 20 47 6f   called using Go
12d60 73 75 62 20 61 6e 64 20 74 68 65 79 20 64 6f 20  sub and they do 
12d70 6e 6f 74 20 52 65 74 75 72 6e 2e 20 20 45 6f 66  not Return.  Eof
12d80 41 20 61 6e 64 20 45 6f 66 42 20 6c 6f 6f 70 0a  A and EofB loop.
12d90 2a 2a 20 75 6e 74 69 6c 20 61 6c 6c 20 64 61 74  ** until all dat
12da0 61 20 69 73 20 65 78 68 61 75 73 74 65 64 20 74  a is exhausted t
12db0 68 65 6e 20 6a 75 6d 70 20 74 6f 20 74 68 65 20  hen jump to the 
12dc0 22 65 6e 64 22 20 6c 61 62 65 2e 20 20 41 6c 74  "end" labe.  Alt
12dd0 42 2c 20 41 65 71 42 2c 0a 2a 2a 20 61 6e 64 20  B, AeqB,.** and 
12de0 41 67 74 42 20 6a 75 6d 70 20 74 6f 20 65 69 74  AgtB jump to eit
12df0 68 65 72 20 4c 32 20 6f 72 20 74 6f 20 6f 6e 65  her L2 or to one
12e00 20 6f 66 20 45 6f 66 41 20 6f 72 20 45 6f 66 42   of EofA or EofB
12e10 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
12e20 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e  ITE_OMIT_COMPOUN
12e30 44 5f 53 45 4c 45 43 54 0a 73 74 61 74 69 63 20  D_SELECT.static 
12e40 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f  int multiSelectO
12e50 72 64 65 72 42 79 28 0a 20 20 50 61 72 73 65 20  rderBy(.  Parse 
12e60 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
12e70 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
12e80 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  xt */.  Select *
12e90 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p,            /*
12ea0 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   The right-most 
12eb0 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65  of SELECTs to be
12ec0 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65   coded */.  Sele
12ed0 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 20 20  ctDest *pDest   
12ee0 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20    /* What to do 
12ef0 77 69 74 68 20 71 75 65 72 79 20 72 65 73 75 6c  with query resul
12f00 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  ts */.){.  int i
12f10 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20  , j;            
12f20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
12f30 73 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  s */.  Select *p
12f40 50 72 69 6f 72 3b 20 20 20 20 20 20 20 2f 2a 20  Prior;       /* 
12f50 41 6e 6f 74 68 65 72 20 53 45 4c 45 43 54 20 69  Another SELECT i
12f60 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 6f 75  mmediately to ou
12f70 72 20 6c 65 66 74 20 2a 2f 0a 20 20 56 64 62 65  r left */.  Vdbe
12f80 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20   *v;            
12f90 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
12fa0 64 65 20 74 6f 20 74 68 69 73 20 56 44 42 45 20  de to this VDBE 
12fb0 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  */.  SelectDest 
12fc0 64 65 73 74 41 3b 20 20 20 20 20 2f 2a 20 44 65  destA;     /* De
12fd0 73 74 69 6e 61 74 69 6f 6e 20 66 6f 72 20 63 6f  stination for co
12fe0 72 6f 75 74 69 6e 65 20 41 20 2a 2f 0a 20 20 53  routine A */.  S
12ff0 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 42 3b  electDest destB;
13000 20 20 20 20 20 2f 2a 20 44 65 73 74 69 6e 61 74       /* Destinat
13010 69 6f 6e 20 66 6f 72 20 63 6f 72 6f 75 74 69 6e  ion for coroutin
13020 65 20 42 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  e B */.  int reg
13030 41 64 64 72 41 3b 20 20 20 20 20 20 20 20 20 2f  AddrA;         /
13040 2a 20 41 64 64 72 65 73 73 20 72 65 67 69 73 74  * Address regist
13050 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 41 20  er for select-A 
13060 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  coroutine */.  i
13070 6e 74 20 72 65 67 45 6f 66 41 3b 20 20 20 20 20  nt regEofA;     
13080 20 20 20 20 20 2f 2a 20 46 6c 61 67 20 74 6f 20       /* Flag to 
13090 69 6e 64 69 63 61 74 65 20 77 68 65 6e 20 73 65  indicate when se
130a0 6c 65 63 74 2d 41 20 69 73 20 63 6f 6d 70 6c 65  lect-A is comple
130b0 74 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 41  te */.  int regA
130c0 64 64 72 42 3b 20 20 20 20 20 20 20 20 20 2f 2a  ddrB;         /*
130d0 20 41 64 64 72 65 73 73 20 72 65 67 69 73 74 65   Address registe
130e0 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 42 20 63  r for select-B c
130f0 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  oroutine */.  in
13100 74 20 72 65 67 45 6f 66 42 3b 20 20 20 20 20 20  t regEofB;      
13110 20 20 20 20 2f 2a 20 46 6c 61 67 20 74 6f 20 69      /* Flag to i
13120 6e 64 69 63 61 74 65 20 77 68 65 6e 20 73 65 6c  ndicate when sel
13130 65 63 74 2d 42 20 69 73 20 63 6f 6d 70 6c 65 74  ect-B is complet
13140 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 53  e */.  int addrS
13150 65 6c 65 63 74 41 3b 20 20 20 20 20 20 2f 2a 20  electA;      /* 
13160 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 73  Address of the s
13170 65 6c 65 63 74 2d 41 20 63 6f 72 6f 75 74 69 6e  elect-A coroutin
13180 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 53  e */.  int addrS
13190 65 6c 65 63 74 42 3b 20 20 20 20 20 20 2f 2a 20  electB;      /* 
131a0 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 73  Address of the s
131b0 65 6c 65 63 74 2d 42 20 63 6f 72 6f 75 74 69 6e  elect-B coroutin
131c0 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75  e */.  int regOu
131d0 74 41 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  tA;          /* 
131e0 41 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72  Address register
131f0 20 66 6f 72 20 74 68 65 20 6f 75 74 70 75 74 2d   for the output-
13200 41 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  A subroutine */.
13210 20 20 69 6e 74 20 72 65 67 4f 75 74 42 3b 20 20    int regOutB;  
13220 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
13230 73 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20  ss register for 
13240 74 68 65 20 6f 75 74 70 75 74 2d 42 20 73 75 62  the output-B sub
13250 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
13260 20 61 64 64 72 4f 75 74 41 3b 20 20 20 20 20 20   addrOutA;      
13270 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
13280 20 74 68 65 20 6f 75 74 70 75 74 2d 41 20 73 75   the output-A su
13290 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  broutine */.  in
132a0 74 20 61 64 64 72 4f 75 74 42 20 3d 20 30 3b 20  t addrOutB = 0; 
132b0 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
132c0 66 20 74 68 65 20 6f 75 74 70 75 74 2d 42 20 73  f the output-B s
132d0 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  ubroutine */.  i
132e0 6e 74 20 61 64 64 72 45 6f 66 41 3b 20 20 20 20  nt addrEofA;    
132f0 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
13300 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d 41 2d  of the select-A-
13310 65 78 68 61 75 73 74 65 64 20 73 75 62 72 6f 75  exhausted subrou
13320 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tine */.  int ad
13330 64 72 45 6f 66 42 3b 20 20 20 20 20 20 20 20 20  drEofB;         
13340 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
13350 65 20 73 65 6c 65 63 74 2d 42 2d 65 78 68 61 75  e select-B-exhau
13360 73 74 65 64 20 73 75 62 72 6f 75 74 69 6e 65 20  sted subroutine 
13370 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 41 6c 74  */.  int addrAlt
13380 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64  B;         /* Ad
13390 64 72 65 73 73 20 6f 66 20 74 68 65 20 41 3c 42  dress of the A<B
133a0 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
133b0 20 69 6e 74 20 61 64 64 72 41 65 71 42 3b 20 20   int addrAeqB;  
133c0 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
133d0 73 20 6f 66 20 74 68 65 20 41 3d 3d 42 20 73 75  s of the A==B su
133e0 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  broutine */.  in
133f0 74 20 61 64 64 72 41 67 74 42 3b 20 20 20 20 20  t addrAgtB;     
13400 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
13410 66 20 74 68 65 20 41 3e 42 20 73 75 62 72 6f 75  f the A>B subrou
13420 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65  tine */.  int re
13430 67 4c 69 6d 69 74 41 3b 20 20 20 20 20 20 20 20  gLimitA;        
13440 2f 2a 20 4c 69 6d 69 74 20 72 65 67 69 73 74 65  /* Limit registe
13450 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 41 20 2a  r for select-A *
13460 2f 0a 20 20 69 6e 74 20 72 65 67 4c 69 6d 69 74  /.  int regLimit
13470 42 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6d  B;        /* Lim
13480 69 74 20 72 65 67 69 73 74 65 72 20 66 6f 72 20  it register for 
13490 73 65 6c 65 63 74 2d 41 20 2a 2f 0a 20 20 69 6e  select-A */.  in
134a0 74 20 72 65 67 50 72 65 76 3b 20 20 20 20 20 20  t regPrev;      
134b0 20 20 20 20 2f 2a 20 41 20 72 61 6e 67 65 20 6f      /* A range o
134c0 66 20 72 65 67 69 73 74 65 72 73 20 74 6f 20 68  f registers to h
134d0 6f 6c 64 20 70 72 65 76 69 6f 75 73 20 6f 75 74  old previous out
134e0 70 75 74 20 2a 2f 0a 20 20 69 6e 74 20 73 61 76  put */.  int sav
134f0 65 64 4c 69 6d 69 74 3b 20 20 20 20 20 20 20 2f  edLimit;       /
13500 2a 20 53 61 76 65 64 20 76 61 6c 75 65 20 6f 66  * Saved value of
13510 20 70 2d 3e 69 4c 69 6d 69 74 20 2a 2f 0a 20 20   p->iLimit */.  
13520 69 6e 74 20 73 61 76 65 64 4f 66 66 73 65 74 3b  int savedOffset;
13530 20 20 20 20 20 20 2f 2a 20 53 61 76 65 64 20 76        /* Saved v
13540 61 6c 75 65 20 6f 66 20 70 2d 3e 69 4f 66 66 73  alue of p->iOffs
13550 65 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 61 62 65  et */.  int labe
13560 6c 43 6d 70 72 3b 20 20 20 20 20 20 20 20 2f 2a  lCmpr;        /*
13570 20 4c 61 62 65 6c 20 66 6f 72 20 74 68 65 20 73   Label for the s
13580 74 61 72 74 20 6f 66 20 74 68 65 20 6d 65 72 67  tart of the merg
13590 65 20 61 6c 67 6f 72 69 74 68 6d 20 2a 2f 0a 20  e algorithm */. 
135a0 20 69 6e 74 20 6c 61 62 65 6c 45 6e 64 3b 20 20   int labelEnd;  
135b0 20 20 20 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20         /* Label 
135c0 66 6f 72 20 74 68 65 20 65 6e 64 20 6f 66 20 74  for the end of t
135d0 68 65 20 6f 76 65 72 61 6c 6c 20 53 45 4c 45 43  he overall SELEC
135e0 54 20 73 74 6d 74 20 2a 2f 0a 20 20 69 6e 74 20  T stmt */.  int 
135f0 6a 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  j1;             
13600 20 20 2f 2a 20 4a 75 6d 70 20 69 6e 73 74 72 75    /* Jump instru
13610 63 74 69 6f 6e 73 20 74 68 61 74 20 67 65 74 20  ctions that get 
13620 72 65 74 61 72 67 65 74 74 65 64 20 2a 2f 0a 20  retargetted */. 
13630 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20   int op;        
13640 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
13650 20 54 4b 5f 41 4c 4c 2c 20 54 4b 5f 55 4e 49 4f   TK_ALL, TK_UNIO
13660 4e 2c 20 54 4b 5f 45 58 43 45 50 54 2c 20 54 4b  N, TK_EXCEPT, TK
13670 5f 49 4e 54 45 52 53 45 43 54 20 2a 2f 0a 20 20  _INTERSECT */.  
13680 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 44 75 70  KeyInfo *pKeyDup
13690 20 3d 20 30 3b 20 2f 2a 20 43 6f 6d 70 61 72 69   = 0; /* Compari
136a0 73 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  son information 
136b0 66 6f 72 20 64 75 70 6c 69 63 61 74 65 20 72 65  for duplicate re
136c0 6d 6f 76 61 6c 20 2a 2f 0a 20 20 4b 65 79 49 6e  moval */.  KeyIn
136d0 66 6f 20 2a 70 4b 65 79 4d 65 72 67 65 3b 20 20  fo *pKeyMerge;  
136e0 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20 69   /* Comparison i
136f0 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 6d  nformation for m
13700 65 72 67 69 6e 67 20 72 6f 77 73 20 2a 2f 0a 20  erging rows */. 
13710 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20   sqlite3 *db;   
13720 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
13730 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
13740 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  .  ExprList *pOr
13750 64 65 72 42 79 3b 20 20 20 2f 2a 20 54 68 65 20  derBy;   /* The 
13760 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
13770 2a 2f 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72 42  */.  int nOrderB
13780 79 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  y;         /* Nu
13790 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 20 69 6e  mber of terms in
137a0 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
137b0 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 61  ause */.  int *a
137c0 50 65 72 6d 75 74 65 3b 20 20 20 20 20 20 20 20  Permute;        
137d0 2f 2a 20 4d 61 70 70 69 6e 67 20 66 72 6f 6d 20  /* Mapping from 
137e0 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 74  ORDER BY terms t
137f0 6f 20 72 65 73 75 6c 74 20 73 65 74 20 63 6f 6c  o result set col
13800 75 6d 6e 73 20 2a 2f 0a 23 69 66 6e 64 65 66 20  umns */.#ifndef 
13810 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
13820 41 49 4e 0a 20 20 69 6e 74 20 69 53 75 62 31 3b  AIN.  int iSub1;
13830 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
13840 51 50 20 69 64 20 6f 66 20 6c 65 66 74 2d 68 61  QP id of left-ha
13850 6e 64 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e  nd query */.  in
13860 74 20 69 53 75 62 32 3b 20 20 20 20 20 20 20 20  t iSub2;        
13870 20 20 20 20 2f 2a 20 45 51 50 20 69 64 20 6f 66      /* EQP id of
13880 20 72 69 67 68 74 2d 68 61 6e 64 20 71 75 65 72   right-hand quer
13890 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 61  y */.#endif..  a
138a0 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72  ssert( p->pOrder
138b0 42 79 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  By!=0 );.  asser
138c0 74 28 20 70 4b 65 79 44 75 70 3d 3d 30 20 29 3b  t( pKeyDup==0 );
138d0 20 2f 2a 20 22 4d 61 6e 61 67 65 64 22 20 63 6f   /* "Managed" co
138e0 64 65 20 6e 65 65 64 73 20 74 68 69 73 2e 20 20  de needs this.  
138f0 54 69 63 6b 65 74 20 23 33 33 38 32 2e 20 2a 2f  Ticket #3382. */
13900 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  .  db = pParse->
13910 64 62 3b 0a 20 20 76 20 3d 20 70 50 61 72 73 65  db;.  v = pParse
13920 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72  ->pVdbe;.  asser
13930 74 28 20 76 21 3d 30 20 29 3b 20 20 20 20 20 20  t( v!=0 );      
13940 20 2f 2a 20 41 6c 72 65 61 64 79 20 74 68 72 6f   /* Already thro
13950 77 6e 20 74 68 65 20 65 72 72 6f 72 20 69 66 20  wn the error if 
13960 56 44 42 45 20 61 6c 6c 6f 63 20 66 61 69 6c 65  VDBE alloc faile
13970 64 20 2a 2f 0a 20 20 6c 61 62 65 6c 45 6e 64 20  d */.  labelEnd 
13980 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
13990 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 6c 61 62  eLabel(v);.  lab
139a0 65 6c 43 6d 70 72 20 3d 20 73 71 6c 69 74 65 33  elCmpr = sqlite3
139b0 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
139c0 3b 0a 0a 0a 20 20 2f 2a 20 50 61 74 63 68 20 75  ;...  /* Patch u
139d0 70 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  p the ORDER BY c
139e0 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20 6f 70 20  lause.  */.  op 
139f0 3d 20 70 2d 3e 6f 70 3b 20 20 0a 20 20 70 50 72  = p->op;  .  pPr
13a00 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b  ior = p->pPrior;
13a10 0a 20 20 61 73 73 65 72 74 28 20 70 50 72 69 6f  .  assert( pPrio
13a20 72 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29  r->pOrderBy==0 )
13a30 3b 0a 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70  ;.  pOrderBy = p
13a40 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 61 73  ->pOrderBy;.  as
13a50 73 65 72 74 28 20 70 4f 72 64 65 72 42 79 20 29  sert( pOrderBy )
13a60 3b 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 70  ;.  nOrderBy = p
13a70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a  OrderBy->nExpr;.
13a80 0a 20 20 2f 2a 20 46 6f 72 20 6f 70 65 72 61 74  .  /* For operat
13a90 6f 72 73 20 6f 74 68 65 72 20 74 68 61 6e 20 55  ors other than U
13aa0 4e 49 4f 4e 20 41 4c 4c 20 77 65 20 68 61 76 65  NION ALL we have
13ab0 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
13ac0 61 74 0a 20 20 2a 2a 20 74 68 65 20 4f 52 44 45  at.  ** the ORDE
13ad0 52 20 42 59 20 63 6c 61 75 73 65 20 63 6f 76 65  R BY clause cove
13ae0 72 73 20 65 76 65 72 79 20 74 65 72 6d 20 6f 66  rs every term of
13af0 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e   the result set.
13b00 20 20 41 64 64 0a 20 20 2a 2a 20 74 65 72 6d 73    Add.  ** terms
13b10 20 74 6f 20 74 68 65 20 4f 52 44 45 52 20 42 59   to the ORDER BY
13b20 20 63 6c 61 75 73 65 20 61 73 20 6e 65 63 65 73   clause as neces
13b30 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  sary..  */.  if(
13b40 20 6f 70 21 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20   op!=TK_ALL ){. 
13b50 20 20 20 66 6f 72 28 69 3d 31 3b 20 64 62 2d 3e     for(i=1; db->
13b60 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20  mallocFailed==0 
13b70 26 26 20 69 3c 3d 70 2d 3e 70 45 4c 69 73 74 2d  && i<=p->pEList-
13b80 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
13b90 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
13ba0 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
13bb0 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20  .      for(j=0, 
13bc0 70 49 74 65 6d 3d 70 4f 72 64 65 72 42 79 2d 3e  pItem=pOrderBy->
13bd0 61 3b 20 6a 3c 6e 4f 72 64 65 72 42 79 3b 20 6a  a; j<nOrderBy; j
13be0 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
13bf0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
13c00 74 65 6d 2d 3e 69 4f 72 64 65 72 42 79 43 6f 6c  tem->iOrderByCol
13c10 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  >0 );.        if
13c20 28 20 70 49 74 65 6d 2d 3e 69 4f 72 64 65 72 42  ( pItem->iOrderB
13c30 79 43 6f 6c 3d 3d 69 20 29 20 62 72 65 61 6b 3b  yCol==i ) break;
13c40 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
13c50 66 28 20 6a 3d 3d 6e 4f 72 64 65 72 42 79 20 29  f( j==nOrderBy )
13c60 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a  {.        Expr *
13c70 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78  pNew = sqlite3Ex
13c80 70 72 28 64 62 2c 20 54 4b 5f 49 4e 54 45 47 45  pr(db, TK_INTEGE
13c90 52 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  R, 0);.        i
13ca0 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74  f( pNew==0 ) ret
13cb0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
13cc0 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
13cd0 66 6c 61 67 73 20 7c 3d 20 45 50 5f 49 6e 74 56  flags |= EP_IntV
13ce0 61 6c 75 65 3b 0a 20 20 20 20 20 20 20 20 70 4e  alue;.        pN
13cf0 65 77 2d 3e 75 2e 69 56 61 6c 75 65 20 3d 20 69  ew->u.iValue = i
13d00 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 64 65 72  ;.        pOrder
13d10 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  By = sqlite3Expr
13d20 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73  ListAppend(pPars
13d30 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 4e 65  e, pOrderBy, pNe
13d40 77 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  w);.        if( 
13d50 70 4f 72 64 65 72 42 79 20 29 20 70 4f 72 64 65  pOrderBy ) pOrde
13d60 72 42 79 2d 3e 61 5b 6e 4f 72 64 65 72 42 79 2b  rBy->a[nOrderBy+
13d70 2b 5d 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20 3d  +].iOrderByCol =
13d80 20 28 75 31 36 29 69 3b 0a 20 20 20 20 20 20 7d   (u16)i;.      }
13d90 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
13da0 20 43 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6d   Compute the com
13db0 70 61 72 69 73 6f 6e 20 70 65 72 6d 75 74 61 74  parison permutat
13dc0 69 6f 6e 20 61 6e 64 20 6b 65 79 69 6e 66 6f 20  ion and keyinfo 
13dd0 74 68 61 74 20 69 73 20 75 73 65 64 20 77 69 74  that is used wit
13de0 68 0a 20 20 2a 2a 20 74 68 65 20 70 65 72 6d 75  h.  ** the permu
13df0 74 61 74 69 6f 6e 20 75 73 65 64 20 74 6f 20 64  tation used to d
13e00 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20  etermine if the 
13e10 6e 65 78 74 0a 20 20 2a 2a 20 72 6f 77 20 6f 66  next.  ** row of
13e20 20 72 65 73 75 6c 74 73 20 63 6f 6d 65 73 20 66   results comes f
13e30 72 6f 6d 20 73 65 6c 65 63 74 41 20 6f 72 20 73  rom selectA or s
13e40 65 6c 65 63 74 42 2e 20 20 41 6c 73 6f 20 61 64  electB.  Also ad
13e50 64 20 65 78 70 6c 69 63 69 74 0a 20 20 2a 2a 20  d explicit.  ** 
13e60 63 6f 6c 6c 61 74 69 6f 6e 73 20 74 6f 20 74 68  collations to th
13e70 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
13e80 65 20 74 65 72 6d 73 20 73 6f 20 74 68 61 74 20  e terms so that 
13e90 77 68 65 6e 20 74 68 65 20 73 75 62 71 75 65 72  when the subquer
13ea0 69 65 73 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20  ies.  ** to the 
13eb0 72 69 67 68 74 20 61 6e 64 20 74 68 65 20 6c 65  right and the le
13ec0 66 74 20 61 72 65 20 65 76 61 6c 75 61 74 65 64  ft are evaluated
13ed0 2c 20 74 68 65 79 20 75 73 65 20 74 68 65 20 63  , they use the c
13ee0 6f 72 72 65 63 74 0a 20 20 2a 2a 20 63 6f 6c 6c  orrect.  ** coll
13ef0 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 61 50  ation..  */.  aP
13f00 65 72 6d 75 74 65 20 3d 20 73 71 6c 69 74 65 33  ermute = sqlite3
13f10 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20  DbMallocRaw(db, 
13f20 73 69 7a 65 6f 66 28 69 6e 74 29 2a 6e 4f 72 64  sizeof(int)*nOrd
13f30 65 72 42 79 29 3b 0a 20 20 69 66 28 20 61 50 65  erBy);.  if( aPe
13f40 72 6d 75 74 65 20 29 7b 0a 20 20 20 20 73 74 72  rmute ){.    str
13f50 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
13f60 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 66 6f  m *pItem;.    fo
13f70 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70 4f 72  r(i=0, pItem=pOr
13f80 64 65 72 42 79 2d 3e 61 3b 20 69 3c 6e 4f 72 64  derBy->a; i<nOrd
13f90 65 72 42 79 3b 20 69 2b 2b 2c 20 70 49 74 65 6d  erBy; i++, pItem
13fa0 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  ++){.      asser
13fb0 74 28 20 70 49 74 65 6d 2d 3e 69 4f 72 64 65 72  t( pItem->iOrder
13fc0 42 79 43 6f 6c 3e 30 20 20 26 26 20 70 49 74 65  ByCol>0  && pIte
13fd0 6d 2d 3e 69 4f 72 64 65 72 42 79 43 6f 6c 3c 3d  m->iOrderByCol<=
13fe0 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
13ff0 20 29 3b 0a 20 20 20 20 20 20 61 50 65 72 6d 75   );.      aPermu
14000 74 65 5b 69 5d 20 3d 20 70 49 74 65 6d 2d 3e 69  te[i] = pItem->i
14010 4f 72 64 65 72 42 79 43 6f 6c 20 2d 20 31 3b 0a  OrderByCol - 1;.
14020 20 20 20 20 7d 0a 20 20 20 20 70 4b 65 79 4d 65      }.    pKeyMe
14030 72 67 65 20 3d 0a 20 20 20 20 20 20 73 71 6c 69  rge =.      sqli
14040 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64  te3DbMallocRaw(d
14050 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4b 65 79 4d  b, sizeof(*pKeyM
14060 65 72 67 65 29 2b 6e 4f 72 64 65 72 42 79 2a 28  erge)+nOrderBy*(
14070 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29  sizeof(CollSeq*)
14080 2b 31 29 29 3b 0a 20 20 20 20 69 66 28 20 70 4b  +1));.    if( pK
14090 65 79 4d 65 72 67 65 20 29 7b 0a 20 20 20 20 20  eyMerge ){.     
140a0 20 70 4b 65 79 4d 65 72 67 65 2d 3e 61 53 6f 72   pKeyMerge->aSor
140b0 74 4f 72 64 65 72 20 3d 20 28 75 38 2a 29 26 70  tOrder = (u8*)&p
140c0 4b 65 79 4d 65 72 67 65 2d 3e 61 43 6f 6c 6c 5b  KeyMerge->aColl[
140d0 6e 4f 72 64 65 72 42 79 5d 3b 0a 20 20 20 20 20  nOrderBy];.     
140e0 20 70 4b 65 79 4d 65 72 67 65 2d 3e 6e 46 69 65   pKeyMerge->nFie
140f0 6c 64 20 3d 20 28 75 31 36 29 6e 4f 72 64 65 72  ld = (u16)nOrder
14100 42 79 3b 0a 20 20 20 20 20 20 70 4b 65 79 4d 65  By;.      pKeyMe
14110 72 67 65 2d 3e 65 6e 63 20 3d 20 45 4e 43 28 64  rge->enc = ENC(d
14120 62 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  b);.      for(i=
14130 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69  0; i<nOrderBy; i
14140 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 43 6f 6c  ++){.        Col
14150 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20  lSeq *pColl;.   
14160 20 20 20 20 20 45 78 70 72 20 2a 70 54 65 72 6d       Expr *pTerm
14170 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69   = pOrderBy->a[i
14180 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ].pExpr;.       
14190 20 69 66 28 20 70 54 65 72 6d 2d 3e 66 6c 61 67   if( pTerm->flag
141a0 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 20 29  s & EP_Collate )
141b0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c  {.          pCol
141c0 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
141d0 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
141e0 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 20 20 7d  Term);.        }
141f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
14200 70 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69 53 65 6c  pColl = multiSel
14210 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  ectCollSeq(pPars
14220 65 2c 20 70 2c 20 61 50 65 72 6d 75 74 65 5b 69  e, p, aPermute[i
14230 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ]);.          if
14240 28 20 70 43 6f 6c 6c 3d 3d 30 20 29 20 70 43 6f  ( pColl==0 ) pCo
14250 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f  ll = db->pDfltCo
14260 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4f  ll;.          pO
14270 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78  rderBy->a[i].pEx
14280 70 72 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20  pr =.           
14290 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 64 64    sqlite3ExprAdd
142a0 43 6f 6c 6c 61 74 65 53 74 72 69 6e 67 28 70 50  CollateString(pP
142b0 61 72 73 65 2c 20 70 54 65 72 6d 2c 20 70 43 6f  arse, pTerm, pCo
142c0 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ll->zName);.    
142d0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 4b      }.        pK
142e0 65 79 4d 65 72 67 65 2d 3e 61 43 6f 6c 6c 5b 69  eyMerge->aColl[i
142f0 5d 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20 20 20  ] = pColl;.     
14300 20 20 20 70 4b 65 79 4d 65 72 67 65 2d 3e 61 53     pKeyMerge->aS
14310 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 70 4f  ortOrder[i] = pO
14320 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72  rderBy->a[i].sor
14330 74 4f 72 64 65 72 3b 0a 20 20 20 20 20 20 7d 0a  tOrder;.      }.
14340 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
14350 20 20 20 70 4b 65 79 4d 65 72 67 65 20 3d 20 30     pKeyMerge = 0
14360 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 74  ;.  }..  /* Reat
14370 74 61 63 68 20 74 68 65 20 4f 52 44 45 52 20 42  tach the ORDER B
14380 59 20 63 6c 61 75 73 65 20 74 6f 20 74 68 65 20  Y clause to the 
14390 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 70 2d  query..  */.  p-
143a0 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64  >pOrderBy = pOrd
143b0 65 72 42 79 3b 0a 20 20 70 50 72 69 6f 72 2d 3e  erBy;.  pPrior->
143c0 70 4f 72 64 65 72 42 79 20 3d 20 73 71 6c 69 74  pOrderBy = sqlit
143d0 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 70 50  e3ExprListDup(pP
143e0 61 72 73 65 2d 3e 64 62 2c 20 70 4f 72 64 65 72  arse->db, pOrder
143f0 42 79 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20 41 6c  By, 0);..  /* Al
14400 6c 6f 63 61 74 65 20 61 20 72 61 6e 67 65 20 6f  locate a range o
14410 66 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69  f temporary regi
14420 73 74 65 72 73 20 61 6e 64 20 74 68 65 20 4b 65  sters and the Ke
14430 79 49 6e 66 6f 20 6e 65 65 64 65 64 0a 20 20 2a  yInfo needed.  *
14440 2a 20 66 6f 72 20 74 68 65 20 6c 6f 67 69 63 20  * for the logic 
14450 74 68 61 74 20 72 65 6d 6f 76 65 73 20 64 75 70  that removes dup
14460 6c 69 63 61 74 65 20 72 65 73 75 6c 74 20 72 6f  licate result ro
14470 77 73 20 77 68 65 6e 20 74 68 65 0a 20 20 2a 2a  ws when the.  **
14480 20 6f 70 65 72 61 74 6f 72 20 69 73 20 55 4e 49   operator is UNI
14490 4f 4e 2c 20 45 58 43 45 50 54 2c 20 6f 72 20 49  ON, EXCEPT, or I
144a0 4e 54 45 52 53 45 43 54 20 28 62 75 74 20 6e 6f  NTERSECT (but no
144b0 74 20 55 4e 49 4f 4e 20 41 4c 4c 29 2e 0a 20 20  t UNION ALL)..  
144c0 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  */.  if( op==TK_
144d0 41 4c 4c 20 29 7b 0a 20 20 20 20 72 65 67 50 72  ALL ){.    regPr
144e0 65 76 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  ev = 0;.  }else{
144f0 0a 20 20 20 20 69 6e 74 20 6e 45 78 70 72 20 3d  .    int nExpr =
14500 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
14510 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  r;.    assert( n
14520 4f 72 64 65 72 42 79 3e 3d 6e 45 78 70 72 20 7c  OrderBy>=nExpr |
14530 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
14540 65 64 20 29 3b 0a 20 20 20 20 72 65 67 50 72 65  ed );.    regPre
14550 76 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  v = pParse->nMem
14560 2b 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  +1;.    pParse->
14570 6e 4d 65 6d 20 2b 3d 20 6e 45 78 70 72 2b 31 3b  nMem += nExpr+1;
14580 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
14590 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
145a0 65 67 65 72 2c 20 30 2c 20 72 65 67 50 72 65 76  eger, 0, regPrev
145b0 29 3b 0a 20 20 20 20 70 4b 65 79 44 75 70 20 3d  );.    pKeyDup =
145c0 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
145d0 5a 65 72 6f 28 64 62 2c 0a 20 20 20 20 20 20 20  Zero(db,.       
145e0 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f             sizeo
145f0 66 28 2a 70 4b 65 79 44 75 70 29 20 2b 20 6e 45  f(*pKeyDup) + nE
14600 78 70 72 2a 28 73 69 7a 65 6f 66 28 43 6f 6c 6c  xpr*(sizeof(Coll
14610 53 65 71 2a 29 2b 31 29 20 29 3b 0a 20 20 20 20  Seq*)+1) );.    
14620 69 66 28 20 70 4b 65 79 44 75 70 20 29 7b 0a 20  if( pKeyDup ){. 
14630 20 20 20 20 20 70 4b 65 79 44 75 70 2d 3e 61 53       pKeyDup->aS
14640 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38 2a 29  ortOrder = (u8*)
14650 26 70 4b 65 79 44 75 70 2d 3e 61 43 6f 6c 6c 5b  &pKeyDup->aColl[
14660 6e 45 78 70 72 5d 3b 0a 20 20 20 20 20 20 70 4b  nExpr];.      pK
14670 65 79 44 75 70 2d 3e 6e 46 69 65 6c 64 20 3d 20  eyDup->nField = 
14680 28 75 31 36 29 6e 45 78 70 72 3b 0a 20 20 20 20  (u16)nExpr;.    
14690 20 20 70 4b 65 79 44 75 70 2d 3e 65 6e 63 20 3d    pKeyDup->enc =
146a0 20 45 4e 43 28 64 62 29 3b 0a 20 20 20 20 20 20   ENC(db);.      
146b0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72  for(i=0; i<nExpr
146c0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
146d0 70 4b 65 79 44 75 70 2d 3e 61 43 6f 6c 6c 5b 69  pKeyDup->aColl[i
146e0 5d 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43  ] = multiSelectC
146f0 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
14700 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 70 4b  , i);.        pK
14710 65 79 44 75 70 2d 3e 61 53 6f 72 74 4f 72 64 65  eyDup->aSortOrde
14720 72 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  r[i] = 0;.      
14730 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 0a 20 20  }.    }.  }. .  
14740 2f 2a 20 53 65 70 61 72 61 74 65 20 74 68 65 20  /* Separate the 
14750 6c 65 66 74 20 61 6e 64 20 74 68 65 20 72 69 67  left and the rig
14760 68 74 20 71 75 65 72 79 20 66 72 6f 6d 20 6f 6e  ht query from on
14770 65 20 61 6e 6f 74 68 65 72 0a 20 20 2a 2f 0a 20  e another.  */. 
14780 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a   p->pPrior = 0;.
14790 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65    sqlite3Resolve
147a0 4f 72 64 65 72 47 72 6f 75 70 42 79 28 70 50 61  OrderGroupBy(pPa
147b0 72 73 65 2c 20 70 2c 20 70 2d 3e 70 4f 72 64 65  rse, p, p->pOrde
147c0 72 42 79 2c 20 22 4f 52 44 45 52 22 29 3b 0a 20  rBy, "ORDER");. 
147d0 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70 50 72   if( pPrior->pPr
147e0 69 6f 72 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  ior==0 ){.    sq
147f0 6c 69 74 65 33 52 65 73 6f 6c 76 65 4f 72 64 65  lite3ResolveOrde
14800 72 47 72 6f 75 70 42 79 28 70 50 61 72 73 65 2c  rGroupBy(pParse,
14810 20 70 50 72 69 6f 72 2c 20 70 50 72 69 6f 72 2d   pPrior, pPrior-
14820 3e 70 4f 72 64 65 72 42 79 2c 20 22 4f 52 44 45  >pOrderBy, "ORDE
14830 52 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  R");.  }..  /* C
14840 6f 6d 70 75 74 65 20 74 68 65 20 6c 69 6d 69 74  ompute the limit
14850 20 72 65 67 69 73 74 65 72 73 20 2a 2f 0a 20 20   registers */.  
14860 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69  computeLimitRegi
14870 73 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c  sters(pParse, p,
14880 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 69 66   labelEnd);.  if
14890 28 20 70 2d 3e 69 4c 69 6d 69 74 20 26 26 20 6f  ( p->iLimit && o
148a0 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20  p==TK_ALL ){.   
148b0 20 72 65 67 4c 69 6d 69 74 41 20 3d 20 2b 2b 70   regLimitA = ++p
148c0 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
148d0 20 72 65 67 4c 69 6d 69 74 42 20 3d 20 2b 2b 70   regLimitB = ++p
148e0 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
148f0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14900 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 70  p2(v, OP_Copy, p
14910 2d 3e 69 4f 66 66 73 65 74 20 3f 20 70 2d 3e 69  ->iOffset ? p->i
14920 4f 66 66 73 65 74 2b 31 20 3a 20 70 2d 3e 69 4c  Offset+1 : p->iL
14930 69 6d 69 74 2c 0a 20 20 20 20 20 20 20 20 20 20  imit,.          
14940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14950 20 20 20 20 20 20 20 20 72 65 67 4c 69 6d 69 74          regLimit
14960 41 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  A);.    sqlite3V
14970 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
14980 43 6f 70 79 2c 20 72 65 67 4c 69 6d 69 74 41 2c  Copy, regLimitA,
14990 20 72 65 67 4c 69 6d 69 74 42 29 3b 0a 20 20 7d   regLimitB);.  }
149a0 65 6c 73 65 7b 0a 20 20 20 20 72 65 67 4c 69 6d  else{.    regLim
149b0 69 74 41 20 3d 20 72 65 67 4c 69 6d 69 74 42 20  itA = regLimitB 
149c0 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  = 0;.  }.  sqlit
149d0 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
149e0 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 70   p->pLimit);.  p
149f0 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->pLimit = 0;.  
14a00 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
14a10 65 28 64 62 2c 20 70 2d 3e 70 4f 66 66 73 65 74  e(db, p->pOffset
14a20 29 3b 0a 20 20 70 2d 3e 70 4f 66 66 73 65 74 20  );.  p->pOffset 
14a30 3d 20 30 3b 0a 0a 20 20 72 65 67 41 64 64 72 41  = 0;..  regAddrA
14a40 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
14a50 6d 3b 0a 20 20 72 65 67 45 6f 66 41 20 3d 20 2b  m;.  regEofA = +
14a60 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
14a70 20 72 65 67 41 64 64 72 42 20 3d 20 2b 2b 70 50   regAddrB = ++pP
14a80 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65  arse->nMem;.  re
14a90 67 45 6f 66 42 20 3d 20 2b 2b 70 50 61 72 73 65  gEofB = ++pParse
14aa0 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 4f 75 74  ->nMem;.  regOut
14ab0 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  A = ++pParse->nM
14ac0 65 6d 3b 0a 20 20 72 65 67 4f 75 74 42 20 3d 20  em;.  regOutB = 
14ad0 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
14ae0 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
14af0 65 73 74 49 6e 69 74 28 26 64 65 73 74 41 2c 20  estInit(&destA, 
14b00 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 72  SRT_Coroutine, r
14b10 65 67 41 64 64 72 41 29 3b 0a 20 20 73 71 6c 69  egAddrA);.  sqli
14b20 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69  te3SelectDestIni
14b30 74 28 26 64 65 73 74 42 2c 20 53 52 54 5f 43 6f  t(&destB, SRT_Co
14b40 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72  routine, regAddr
14b50 42 29 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 70  B);..  /* Jump p
14b60 61 73 74 20 74 68 65 20 76 61 72 69 6f 75 73 20  ast the various 
14b70 73 75 62 72 6f 75 74 69 6e 65 73 20 61 6e 64 20  subroutines and 
14b80 63 6f 72 6f 75 74 69 6e 65 73 20 74 6f 20 74 68  coroutines to th
14b90 65 20 6d 61 69 6e 0a 20 20 2a 2a 20 6d 65 72 67  e main.  ** merg
14ba0 65 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20 20 6a 31  e loop.  */.  j1
14bb0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
14bc0 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74 6f 29  dOp0(v, OP_Goto)
14bd0 3b 0a 20 20 61 64 64 72 53 65 6c 65 63 74 41 20  ;.  addrSelectA 
14be0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
14bf0 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 0a 0a 20  rentAddr(v);... 
14c00 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 63   /* Generate a c
14c10 6f 72 6f 75 74 69 6e 65 20 74 6f 20 65 76 61 6c  oroutine to eval
14c20 75 61 74 65 20 74 68 65 20 53 45 4c 45 43 54 20  uate the SELECT 
14c30 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 74 68 65  statement to the
14c40 0a 20 20 2a 2a 20 6c 65 66 74 20 6f 66 20 74 68  .  ** left of th
14c50 65 20 63 6f 6d 70 6f 75 6e 64 20 6f 70 65 72 61  e compound opera
14c60 74 6f 72 20 2d 20 74 68 65 20 22 41 22 20 73 65  tor - the "A" se
14c70 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 56 64 62  lect..  */.  Vdb
14c80 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c  eNoopComment((v,
14c90 20 22 42 65 67 69 6e 20 63 6f 72 6f 75 74 69 6e   "Begin coroutin
14ca0 65 20 66 6f 72 20 6c 65 66 74 20 53 45 4c 45 43  e for left SELEC
14cb0 54 22 29 29 3b 0a 20 20 70 50 72 69 6f 72 2d 3e  T"));.  pPrior->
14cc0 69 4c 69 6d 69 74 20 3d 20 72 65 67 4c 69 6d 69  iLimit = regLimi
14cd0 74 41 3b 0a 20 20 65 78 70 6c 61 69 6e 53 65 74  tA;.  explainSet
14ce0 49 6e 74 65 67 65 72 28 69 53 75 62 31 2c 20 70  Integer(iSub1, p
14cf0 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65  Parse->iNextSele
14d00 63 74 49 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  ctId);.  sqlite3
14d10 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
14d20 50 72 69 6f 72 2c 20 26 64 65 73 74 41 29 3b 0a  Prior, &destA);.
14d30 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
14d40 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
14d50 72 2c 20 31 2c 20 72 65 67 45 6f 66 41 29 3b 0a  r, 1, regEofA);.
14d60 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
14d70 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c  Op1(v, OP_Yield,
14d80 20 72 65 67 41 64 64 72 41 29 3b 0a 20 20 56 64   regAddrA);.  Vd
14d90 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76  beNoopComment((v
14da0 2c 20 22 45 6e 64 20 63 6f 72 6f 75 74 69 6e 65  , "End coroutine
14db0 20 66 6f 72 20 6c 65 66 74 20 53 45 4c 45 43 54   for left SELECT
14dc0 22 29 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  "));..  /* Gener
14dd0 61 74 65 20 61 20 63 6f 72 6f 75 74 69 6e 65 20  ate a coroutine 
14de0 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65 20  to evaluate the 
14df0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
14e00 20 6f 6e 20 0a 20 20 2a 2a 20 74 68 65 20 72 69   on .  ** the ri
14e10 67 68 74 20 2d 20 74 68 65 20 22 42 22 20 73 65  ght - the "B" se
14e20 6c 65 63 74 0a 20 20 2a 2f 0a 20 20 61 64 64 72  lect.  */.  addr
14e30 53 65 6c 65 63 74 42 20 3d 20 73 71 6c 69 74 65  SelectB = sqlite
14e40 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
14e50 28 76 29 3b 0a 20 20 56 64 62 65 4e 6f 6f 70 43  (v);.  VdbeNoopC
14e60 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 42 65 67 69  omment((v, "Begi
14e70 6e 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20  n coroutine for 
14e80 72 69 67 68 74 20 53 45 4c 45 43 54 22 29 29 3b  right SELECT"));
14e90 0a 20 20 73 61 76 65 64 4c 69 6d 69 74 20 3d 20  .  savedLimit = 
14ea0 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 73 61 76  p->iLimit;.  sav
14eb0 65 64 4f 66 66 73 65 74 20 3d 20 70 2d 3e 69 4f  edOffset = p->iO
14ec0 66 66 73 65 74 3b 0a 20 20 70 2d 3e 69 4c 69 6d  ffset;.  p->iLim
14ed0 69 74 20 3d 20 72 65 67 4c 69 6d 69 74 42 3b 0a  it = regLimitB;.
14ee0 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30    p->iOffset = 0
14ef0 3b 20 20 0a 20 20 65 78 70 6c 61 69 6e 53 65 74  ;  .  explainSet
14f00 49 6e 74 65 67 65 72 28 69 53 75 62 32 2c 20 70  Integer(iSub2, p
14f10 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65  Parse->iNextSele
14f20 63 74 49 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  ctId);.  sqlite3
14f30 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
14f40 2c 20 26 64 65 73 74 42 29 3b 0a 20 20 70 2d 3e  , &destB);.  p->
14f50 69 4c 69 6d 69 74 20 3d 20 73 61 76 65 64 4c 69  iLimit = savedLi
14f60 6d 69 74 3b 0a 20 20 70 2d 3e 69 4f 66 66 73 65  mit;.  p->iOffse
14f70 74 20 3d 20 73 61 76 65 64 4f 66 66 73 65 74 3b  t = savedOffset;
14f80 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
14f90 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
14fa0 65 72 2c 20 31 2c 20 72 65 67 45 6f 66 42 29 3b  er, 1, regEofB);
14fb0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
14fc0 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64  dOp1(v, OP_Yield
14fd0 2c 20 72 65 67 41 64 64 72 42 29 3b 0a 20 20 56  , regAddrB);.  V
14fe0 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28  dbeNoopComment((
14ff0 76 2c 20 22 45 6e 64 20 63 6f 72 6f 75 74 69 6e  v, "End coroutin
15000 65 20 66 6f 72 20 72 69 67 68 74 20 53 45 4c 45  e for right SELE
15010 43 54 22 29 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e  CT"));..  /* Gen
15020 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69  erate a subrouti
15030 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74 73 20  ne that outputs 
15040 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20  the current row 
15050 6f 66 20 74 68 65 20 41 0a 20 20 2a 2a 20 73 65  of the A.  ** se
15060 6c 65 63 74 20 61 73 20 74 68 65 20 6e 65 78 74  lect as the next
15070 20 6f 75 74 70 75 74 20 72 6f 77 20 6f 66 20 74   output row of t
15080 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65  he compound sele
15090 63 74 2e 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e  ct..  */.  VdbeN
150a0 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  oopComment((v, "
150b0 4f 75 74 70 75 74 20 72 6f 75 74 69 6e 65 20 66  Output routine f
150c0 6f 72 20 41 22 29 29 3b 0a 20 20 61 64 64 72 4f  or A"));.  addrO
150d0 75 74 41 20 3d 20 67 65 6e 65 72 61 74 65 4f 75  utA = generateOu
150e0 74 70 75 74 53 75 62 72 6f 75 74 69 6e 65 28 70  tputSubroutine(p
150f0 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20  Parse,.         
15100 20 20 20 20 20 20 20 20 70 2c 20 26 64 65 73 74          p, &dest
15110 41 2c 20 70 44 65 73 74 2c 20 72 65 67 4f 75 74  A, pDest, regOut
15120 41 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  A,.             
15130 20 20 20 20 72 65 67 50 72 65 76 2c 20 70 4b 65      regPrev, pKe
15140 79 44 75 70 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  yDup, P4_KEYINFO
15150 5f 48 41 4e 44 4f 46 46 2c 20 6c 61 62 65 6c 45  _HANDOFF, labelE
15160 6e 64 29 3b 0a 20 20 0a 20 20 2f 2a 20 47 65 6e  nd);.  .  /* Gen
15170 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69  erate a subrouti
15180 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74 73 20  ne that outputs 
15190 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20  the current row 
151a0 6f 66 20 74 68 65 20 42 0a 20 20 2a 2a 20 73 65  of the B.  ** se
151b0 6c 65 63 74 20 61 73 20 74 68 65 20 6e 65 78 74  lect as the next
151c0 20 6f 75 74 70 75 74 20 72 6f 77 20 6f 66 20 74   output row of t
151d0 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65  he compound sele
151e0 63 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f  ct..  */.  if( o
151f0 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 6f 70 3d  p==TK_ALL || op=
15200 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20 20  =TK_UNION ){.   
15210 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74   VdbeNoopComment
15220 28 28 76 2c 20 22 4f 75 74 70 75 74 20 72 6f 75  ((v, "Output rou
15230 74 69 6e 65 20 66 6f 72 20 42 22 29 29 3b 0a 20  tine for B"));. 
15240 20 20 20 61 64 64 72 4f 75 74 42 20 3d 20 67 65     addrOutB = ge
15250 6e 65 72 61 74 65 4f 75 74 70 75 74 53 75 62 72  nerateOutputSubr
15260 6f 75 74 69 6e 65 28 70 50 61 72 73 65 2c 0a 20  outine(pParse,. 
15270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15280 70 2c 20 26 64 65 73 74 42 2c 20 70 44 65 73 74  p, &destB, pDest
15290 2c 20 72 65 67 4f 75 74 42 2c 0a 20 20 20 20 20  , regOutB,.     
152a0 20 20 20 20 20 20 20 20 20 20 20 20 72 65 67 50              regP
152b0 72 65 76 2c 20 70 4b 65 79 44 75 70 2c 20 50 34  rev, pKeyDup, P4
152c0 5f 4b 45 59 49 4e 46 4f 5f 53 54 41 54 49 43 2c  _KEYINFO_STATIC,
152d0 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 7d 0a   labelEnd);.  }.
152e0 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61  .  /* Generate a
152f0 20 73 75 62 72 6f 75 74 69 6e 65 20 74 6f 20 72   subroutine to r
15300 75 6e 20 77 68 65 6e 20 74 68 65 20 72 65 73 75  un when the resu
15310 6c 74 73 20 66 72 6f 6d 20 73 65 6c 65 63 74 20  lts from select 
15320 41 0a 20 20 2a 2a 20 61 72 65 20 65 78 68 61 75  A.  ** are exhau
15330 73 74 65 64 20 61 6e 64 20 6f 6e 6c 79 20 64 61  sted and only da
15340 74 61 20 69 6e 20 73 65 6c 65 63 74 20 42 20 72  ta in select B r
15350 65 6d 61 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 56  emains..  */.  V
15360 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28  dbeNoopComment((
15370 76 2c 20 22 65 6f 66 2d 41 20 73 75 62 72 6f 75  v, "eof-A subrou
15380 74 69 6e 65 22 29 29 3b 0a 20 20 69 66 28 20 6f  tine"));.  if( o
15390 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20 7c 7c 20  p==TK_EXCEPT || 
153a0 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54  op==TK_INTERSECT
153b0 20 29 7b 0a 20 20 20 20 61 64 64 72 45 6f 66 41   ){.    addrEofA
153c0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
153d0 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
153e0 20 30 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20   0, labelEnd);. 
153f0 20 7d 65 6c 73 65 7b 20 20 0a 20 20 20 20 61 64   }else{  .    ad
15400 64 72 45 6f 66 41 20 3d 20 73 71 6c 69 74 65 33  drEofA = sqlite3
15410 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
15420 5f 49 66 2c 20 72 65 67 45 6f 66 42 2c 20 6c 61  _If, regEofB, la
15430 62 65 6c 45 6e 64 29 3b 0a 20 20 20 20 73 71 6c  belEnd);.    sql
15440 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
15450 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f  , OP_Gosub, regO
15460 75 74 42 2c 20 61 64 64 72 4f 75 74 42 29 3b 0a  utB, addrOutB);.
15470 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
15480 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c  ddOp1(v, OP_Yiel
15490 64 2c 20 72 65 67 41 64 64 72 42 29 3b 0a 20 20  d, regAddrB);.  
154a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
154b0 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
154c0 30 2c 20 61 64 64 72 45 6f 66 41 29 3b 0a 20 20  0, addrEofA);.  
154d0 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20    p->nSelectRow 
154e0 2b 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65  += pPrior->nSele
154f0 63 74 52 6f 77 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ctRow;.  }..  /*
15500 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72   Generate a subr
15510 6f 75 74 69 6e 65 20 74 6f 20 72 75 6e 20 77 68  outine to run wh
15520 65 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 66  en the results f
15530 72 6f 6d 20 73 65 6c 65 63 74 20 42 0a 20 20 2a  rom select B.  *
15540 2a 20 61 72 65 20 65 78 68 61 75 73 74 65 64 20  * are exhausted 
15550 61 6e 64 20 6f 6e 6c 79 20 64 61 74 61 20 69 6e  and only data in
15560 20 73 65 6c 65 63 74 20 41 20 72 65 6d 61 69 6e   select A remain
15570 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70  s..  */.  if( op
15580 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 29  ==TK_INTERSECT )
15590 7b 0a 20 20 20 20 61 64 64 72 45 6f 66 42 20 3d  {.    addrEofB =
155a0 20 61 64 64 72 45 6f 66 41 3b 0a 20 20 20 20 69   addrEofA;.    i
155b0 66 28 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  f( p->nSelectRow
155c0 20 3e 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65   > pPrior->nSele
155d0 63 74 52 6f 77 20 29 20 70 2d 3e 6e 53 65 6c 65  ctRow ) p->nSele
155e0 63 74 52 6f 77 20 3d 20 70 50 72 69 6f 72 2d 3e  ctRow = pPrior->
155f0 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 7d 65  nSelectRow;.  }e
15600 6c 73 65 7b 20 20 0a 20 20 20 20 56 64 62 65 4e  lse{  .    VdbeN
15610 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  oopComment((v, "
15620 65 6f 66 2d 42 20 73 75 62 72 6f 75 74 69 6e 65  eof-B subroutine
15630 22 29 29 3b 0a 20 20 20 20 61 64 64 72 45 6f 66  "));.    addrEof
15640 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  B = sqlite3VdbeA
15650 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20  ddOp2(v, OP_If, 
15660 72 65 67 45 6f 66 41 2c 20 6c 61 62 65 6c 45 6e  regEofA, labelEn
15670 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  d);.    sqlite3V
15680 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
15690 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 41 2c 20  Gosub, regOutA, 
156a0 61 64 64 72 4f 75 74 41 29 3b 0a 20 20 20 20 73  addrOutA);.    s
156b0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
156c0 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65  (v, OP_Yield, re
156d0 67 41 64 64 72 41 29 3b 0a 20 20 20 20 73 71 6c  gAddrA);.    sql
156e0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
156f0 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64  , OP_Goto, 0, ad
15700 64 72 45 6f 66 42 29 3b 0a 20 20 7d 0a 0a 20 20  drEofB);.  }..  
15710 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
15720 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 63   to handle the c
15730 61 73 65 20 6f 66 20 41 3c 42 0a 20 20 2a 2f 0a  ase of A<B.  */.
15740 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e    VdbeNoopCommen
15750 74 28 28 76 2c 20 22 41 2d 6c 74 2d 42 20 73 75  t((v, "A-lt-B su
15760 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 61  broutine"));.  a
15770 64 64 72 41 6c 74 42 20 3d 20 73 71 6c 69 74 65  ddrAltB = sqlite
15780 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
15790 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 41  P_Gosub, regOutA
157a0 2c 20 61 64 64 72 4f 75 74 41 29 3b 0a 20 20 73  , addrOutA);.  s
157b0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
157c0 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65  (v, OP_Yield, re
157d0 67 41 64 64 72 41 29 3b 0a 20 20 73 71 6c 69 74  gAddrA);.  sqlit
157e0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
157f0 4f 50 5f 49 66 2c 20 72 65 67 45 6f 66 41 2c 20  OP_If, regEofA, 
15800 61 64 64 72 45 6f 66 41 29 3b 0a 20 20 73 71 6c  addrEofA);.  sql
15810 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
15820 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c 61  , OP_Goto, 0, la
15830 62 65 6c 43 6d 70 72 29 3b 0a 0a 20 20 2f 2a 20  belCmpr);..  /* 
15840 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
15850 20 68 61 6e 64 6c 65 20 74 68 65 20 63 61 73 65   handle the case
15860 20 6f 66 20 41 3d 3d 42 0a 20 20 2a 2f 0a 20 20   of A==B.  */.  
15870 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29  if( op==TK_ALL )
15880 7b 0a 20 20 20 20 61 64 64 72 41 65 71 42 20 3d  {.    addrAeqB =
15890 20 61 64 64 72 41 6c 74 42 3b 0a 20 20 7d 65 6c   addrAltB;.  }el
158a0 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e  se if( op==TK_IN
158b0 54 45 52 53 45 43 54 20 29 7b 0a 20 20 20 20 61  TERSECT ){.    a
158c0 64 64 72 41 65 71 42 20 3d 20 61 64 64 72 41 6c  ddrAeqB = addrAl
158d0 74 42 3b 0a 20 20 20 20 61 64 64 72 41 6c 74 42  tB;.    addrAltB
158e0 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ++;.  }else{.   
158f0 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74   VdbeNoopComment
15900 28 28 76 2c 20 22 41 2d 65 71 2d 42 20 73 75 62  ((v, "A-eq-B sub
15910 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 20 20  routine"));.    
15920 61 64 64 72 41 65 71 42 20 3d 0a 20 20 20 20 73  addrAeqB =.    s
15930 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
15940 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65  (v, OP_Yield, re
15950 67 41 64 64 72 41 29 3b 0a 20 20 20 20 73 71 6c  gAddrA);.    sql
15960 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
15970 2c 20 4f 50 5f 49 66 2c 20 72 65 67 45 6f 66 41  , OP_If, regEofA
15980 2c 20 61 64 64 72 45 6f 66 41 29 3b 0a 20 20 20  , addrEofA);.   
15990 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
159a0 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
159b0 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 20 20  , labelCmpr);.  
159c0 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  }..  /* Generate
159d0 20 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c 65 20   code to handle 
159e0 74 68 65 20 63 61 73 65 20 6f 66 20 41 3e 42 0a  the case of A>B.
159f0 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43    */.  VdbeNoopC
15a00 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 41 2d 67 74  omment((v, "A-gt
15a10 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29  -B subroutine"))
15a20 3b 0a 20 20 61 64 64 72 41 67 74 42 20 3d 20 73  ;.  addrAgtB = s
15a30 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
15a40 74 41 64 64 72 28 76 29 3b 0a 20 20 69 66 28 20  tAddr(v);.  if( 
15a50 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 6f 70  op==TK_ALL || op
15a60 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20  ==TK_UNION ){.  
15a70 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15a80 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
15a90 20 72 65 67 4f 75 74 42 2c 20 61 64 64 72 4f 75   regOutB, addrOu
15aa0 74 42 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  tB);.  }.  sqlit
15ab0 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
15ac0 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64  OP_Yield, regAdd
15ad0 72 42 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  rB);.  sqlite3Vd
15ae0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
15af0 66 2c 20 72 65 67 45 6f 66 42 2c 20 61 64 64 72  f, regEofB, addr
15b00 45 6f 66 42 29 3b 0a 20 20 73 71 6c 69 74 65 33  EofB);.  sqlite3
15b10 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
15b20 5f 47 6f 74 6f 2c 20 30 2c 20 6c 61 62 65 6c 43  _Goto, 0, labelC
15b30 6d 70 72 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73  mpr);..  /* This
15b40 20 63 6f 64 65 20 72 75 6e 73 20 6f 6e 63 65 20   code runs once 
15b50 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 65 76  to initialize ev
15b60 65 72 79 74 68 69 6e 67 2e 0a 20 20 2a 2f 0a 20  erything..  */. 
15b70 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
15b80 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a 20 20 73  Here(v, j1);.  s
15b90 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
15ba0 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
15bb0 30 2c 20 72 65 67 45 6f 66 41 29 3b 0a 20 20 73  0, regEofA);.  s
15bc0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
15bd0 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
15be0 30 2c 20 72 65 67 45 6f 66 42 29 3b 0a 20 20 73  0, regEofB);.  s
15bf0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
15c00 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65  (v, OP_Gosub, re
15c10 67 41 64 64 72 41 2c 20 61 64 64 72 53 65 6c 65  gAddrA, addrSele
15c20 63 74 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ctA);.  sqlite3V
15c30 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
15c40 47 6f 73 75 62 2c 20 72 65 67 41 64 64 72 42 2c  Gosub, regAddrB,
15c50 20 61 64 64 72 53 65 6c 65 63 74 42 29 3b 0a 20   addrSelectB);. 
15c60 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15c70 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67  p2(v, OP_If, reg
15c80 45 6f 66 41 2c 20 61 64 64 72 45 6f 66 41 29 3b  EofA, addrEofA);
15c90 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
15ca0 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20 72  dOp2(v, OP_If, r
15cb0 65 67 45 6f 66 42 2c 20 61 64 64 72 45 6f 66 42  egEofB, addrEofB
15cc0 29 3b 0a 0a 20 20 2f 2a 20 49 6d 70 6c 65 6d 65  );..  /* Impleme
15cd0 6e 74 20 74 68 65 20 6d 61 69 6e 20 6d 65 72 67  nt the main merg
15ce0 65 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20 20 73 71  e loop.  */.  sq
15cf0 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
15d00 4c 61 62 65 6c 28 76 2c 20 6c 61 62 65 6c 43 6d  Label(v, labelCm
15d10 70 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  pr);.  sqlite3Vd
15d20 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 50  beAddOp4(v, OP_P
15d30 65 72 6d 75 74 61 74 69 6f 6e 2c 20 30 2c 20 30  ermutation, 0, 0
15d40 2c 20 30 2c 20 28 63 68 61 72 2a 29 61 50 65 72  , 0, (char*)aPer
15d50 6d 75 74 65 2c 20 50 34 5f 49 4e 54 41 52 52 41  mute, P4_INTARRA
15d60 59 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  Y);.  sqlite3Vdb
15d70 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f  eAddOp4(v, OP_Co
15d80 6d 70 61 72 65 2c 20 64 65 73 74 41 2e 69 53 64  mpare, destA.iSd
15d90 73 74 2c 20 64 65 73 74 42 2e 69 53 64 73 74 2c  st, destB.iSdst,
15da0 20 6e 4f 72 64 65 72 42 79 2c 0a 20 20 20 20 20   nOrderBy,.     
15db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15dc0 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 4d      (char*)pKeyM
15dd0 65 72 67 65 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  erge, P4_KEYINFO
15de0 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 73 71 6c  _HANDOFF);.  sql
15df0 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
15e00 28 76 2c 20 4f 50 46 4c 41 47 5f 50 45 52 4d 55  (v, OPFLAG_PERMU
15e10 54 45 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  TE);.  sqlite3Vd
15e20 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a  beAddOp3(v, OP_J
15e30 75 6d 70 2c 20 61 64 64 72 41 6c 74 42 2c 20 61  ump, addrAltB, a
15e40 64 64 72 41 65 71 42 2c 20 61 64 64 72 41 67 74  ddrAeqB, addrAgt
15e50 42 29 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74  B);..  /* Jump t
15e60 6f 20 74 68 65 20 74 68 69 73 20 70 6f 69 6e 74  o the this point
15e70 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 74 65 72   in order to ter
15e80 6d 69 6e 61 74 65 20 74 68 65 20 71 75 65 72 79  minate the query
15e90 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
15ea0 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
15eb0 28 76 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 0a  (v, labelEnd);..
15ec0 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6e 75 6d    /* Set the num
15ed0 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20 63 6f  ber of output co
15ee0 6c 75 6d 6e 73 0a 20 20 2a 2f 0a 20 20 69 66 28  lumns.  */.  if(
15ef0 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53   pDest->eDest==S
15f00 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20  RT_Output ){.   
15f10 20 53 65 6c 65 63 74 20 2a 70 46 69 72 73 74 20   Select *pFirst 
15f20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 77 68  = pPrior;.    wh
15f30 69 6c 65 28 20 70 46 69 72 73 74 2d 3e 70 50 72  ile( pFirst->pPr
15f40 69 6f 72 20 29 20 70 46 69 72 73 74 20 3d 20 70  ior ) pFirst = p
15f50 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 3b 0a 20  First->pPrior;. 
15f60 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d     generateColum
15f70 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 30  nNames(pParse, 0
15f80 2c 20 70 46 69 72 73 74 2d 3e 70 45 4c 69 73 74  , pFirst->pEList
15f90 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61  );.  }..  /* Rea
15fa0 73 73 65 6d 62 6c 79 20 74 68 65 20 63 6f 6d 70  ssembly the comp
15fb0 6f 75 6e 64 20 71 75 65 72 79 20 73 6f 20 74 68  ound query so th
15fc0 61 74 20 69 74 20 77 69 6c 6c 20 62 65 20 66 72  at it will be fr
15fd0 65 65 64 20 63 6f 72 72 65 63 74 6c 79 0a 20 20  eed correctly.  
15fe0 2a 2a 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e  ** by the callin
15ff0 67 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  g function */.  
16000 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b  if( p->pPrior ){
16010 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65  .    sqlite3Sele
16020 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  ctDelete(db, p->
16030 70 50 72 69 6f 72 29 3b 0a 20 20 7d 0a 20 20 70  pPrior);.  }.  p
16040 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f  ->pPrior = pPrio
16050 72 3b 0a 0a 20 20 2f 2a 2a 2a 20 54 42 44 3a 20  r;..  /*** TBD: 
16060 20 49 6e 73 65 72 74 20 73 75 62 72 6f 75 74 69   Insert subrouti
16070 6e 65 20 63 61 6c 6c 73 20 74 6f 20 63 6c 6f 73  ne calls to clos
16080 65 20 63 75 72 73 6f 72 73 20 6f 6e 20 69 6e 63  e cursors on inc
16090 6f 6d 70 6c 65 74 65 0a 20 20 2a 2a 2a 2a 20 73  omplete.  **** s
160a0 75 62 71 75 65 72 69 65 73 20 2a 2a 2a 2a 2f 0a  ubqueries ****/.
160b0 20 20 65 78 70 6c 61 69 6e 43 6f 6d 70 6f 73 69    explainComposi
160c0 74 65 28 70 50 61 72 73 65 2c 20 70 2d 3e 6f 70  te(pParse, p->op
160d0 2c 20 69 53 75 62 31 2c 20 69 53 75 62 32 2c 20  , iSub1, iSub2, 
160e0 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  0);.  return SQL
160f0 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
16100 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
16110 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
16120 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  ERY) || !defined
16130 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
16140 57 29 0a 2f 2a 20 46 6f 72 77 61 72 64 20 44 65  W)./* Forward De
16150 63 6c 61 72 61 74 69 6f 6e 73 20 2a 2f 0a 73 74  clarations */.st
16160 61 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 45  atic void substE
16170 78 70 72 4c 69 73 74 28 73 71 6c 69 74 65 33 2a  xprList(sqlite3*
16180 2c 20 45 78 70 72 4c 69 73 74 2a 2c 20 69 6e 74  , ExprList*, int
16190 2c 20 45 78 70 72 4c 69 73 74 2a 29 3b 0a 73 74  , ExprList*);.st
161a0 61 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 53  atic void substS
161b0 65 6c 65 63 74 28 73 71 6c 69 74 65 33 2a 2c 20  elect(sqlite3*, 
161c0 53 65 6c 65 63 74 20 2a 2c 20 69 6e 74 2c 20 45  Select *, int, E
161d0 78 70 72 4c 69 73 74 20 2a 29 3b 0a 0a 2f 2a 0a  xprList *);../*.
161e0 2a 2a 20 53 63 61 6e 20 74 68 72 6f 75 67 68 20  ** Scan through 
161f0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70  the expression p
16200 45 78 70 72 2e 20 20 52 65 70 6c 61 63 65 20 65  Expr.  Replace e
16210 76 65 72 79 20 72 65 66 65 72 65 6e 63 65 20 74  very reference t
16220 6f 0a 2a 2a 20 61 20 63 6f 6c 75 6d 6e 20 69 6e  o.** a column in
16230 20 74 61 62 6c 65 20 6e 75 6d 62 65 72 20 69 54   table number iT
16240 61 62 6c 65 20 77 69 74 68 20 61 20 63 6f 70 79  able with a copy
16250 20 6f 66 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d   of the iColumn-
16260 74 68 0a 2a 2a 20 65 6e 74 72 79 20 69 6e 20 70  th.** entry in p
16270 45 4c 69 73 74 2e 20 20 28 42 75 74 20 6c 65 61  EList.  (But lea
16280 76 65 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  ve references to
16290 20 74 68 65 20 52 4f 57 49 44 20 63 6f 6c 75 6d   the ROWID colum
162a0 6e 20 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 2e  n .** unchanged.
162b0 29 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ).**.** This rou
162c0 74 69 6e 65 20 69 73 20 70 61 72 74 20 6f 66 20  tine is part of 
162d0 74 68 65 20 66 6c 61 74 74 65 6e 69 6e 67 20 70  the flattening p
162e0 72 6f 63 65 64 75 72 65 2e 20 20 41 20 73 75 62  rocedure.  A sub
162f0 71 75 65 72 79 0a 2a 2a 20 77 68 6f 73 65 20 72  query.** whose r
16300 65 73 75 6c 74 20 73 65 74 20 69 73 20 64 65 66  esult set is def
16310 69 6e 65 64 20 62 79 20 70 45 4c 69 73 74 20 61  ined by pEList a
16320 70 70 65 61 72 73 20 61 73 20 65 6e 74 72 79 20  ppears as entry 
16330 69 6e 20 74 68 65 0a 2a 2a 20 46 52 4f 4d 20 63  in the.** FROM c
16340 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43  lause of a SELEC
16350 54 20 73 75 63 68 20 74 68 61 74 20 74 68 65 20  T such that the 
16360 56 44 42 45 20 63 75 72 73 6f 72 20 61 73 73 69  VDBE cursor assi
16370 67 6e 65 64 20 74 6f 20 74 68 61 74 0a 2a 2a 20  gned to that.** 
16380 46 4f 52 4d 20 63 6c 61 75 73 65 20 65 6e 74 72  FORM clause entr
16390 79 20 69 73 20 69 54 61 62 6c 65 2e 20 20 54 68  y is iTable.  Th
163a0 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 6b 65 20  is routine make 
163b0 74 68 65 20 6e 65 63 65 73 73 61 72 79 20 0a 2a  the necessary .*
163c0 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 70 45 78  * changes to pEx
163d0 70 72 20 73 6f 20 74 68 61 74 20 69 74 20 72 65  pr so that it re
163e0 66 65 72 73 20 64 69 72 65 63 74 6c 79 20 74 6f  fers directly to
163f0 20 74 68 65 20 73 6f 75 72 63 65 20 74 61 62 6c   the source tabl
16400 65 0a 2a 2a 20 6f 66 20 74 68 65 20 73 75 62 71  e.** of the subq
16410 75 65 72 79 20 72 61 74 68 65 72 20 74 68 65 20  uery rather the 
16420 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68  result set of th
16430 65 20 73 75 62 71 75 65 72 79 2e 0a 2a 2f 0a 73  e subquery..*/.s
16440 74 61 74 69 63 20 45 78 70 72 20 2a 73 75 62 73  tatic Expr *subs
16450 74 45 78 70 72 28 0a 20 20 73 71 6c 69 74 65 33  tExpr(.  sqlite3
16460 20 2a 64 62 2c 20 20 20 20 20 20 20 20 2f 2a 20   *db,        /* 
16470 52 65 70 6f 72 74 20 6d 61 6c 6c 6f 63 20 65 72  Report malloc er
16480 72 6f 72 73 20 74 6f 20 74 68 69 73 20 63 6f 6e  rors to this con
16490 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70  nection */.  Exp
164a0 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20  r *pExpr,       
164b0 20 2f 2a 20 45 78 70 72 20 69 6e 20 77 68 69 63   /* Expr in whic
164c0 68 20 73 75 62 73 74 69 74 75 74 69 6f 6e 20 6f  h substitution o
164d0 63 63 75 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69  ccurs */.  int i
164e0 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 2f  Table,         /
164f0 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20 73 75  * Table to be su
16500 62 73 74 69 74 75 74 65 64 20 2a 2f 0a 20 20 45  bstituted */.  E
16510 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20  xprList *pEList 
16520 20 20 20 2f 2a 20 53 75 62 73 74 69 74 75 74 65     /* Substitute
16530 20 65 78 70 72 65 73 73 69 6f 6e 73 20 2a 2f 0a   expressions */.
16540 29 7b 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d  ){.  if( pExpr==
16550 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
16560 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  if( pExpr->op==T
16570 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 45 78 70  K_COLUMN && pExp
16580 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62 6c  r->iTable==iTabl
16590 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70 45 78  e ){.    if( pEx
165a0 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b  pr->iColumn<0 ){
165b0 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70  .      pExpr->op
165c0 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20   = TK_NULL;.    
165d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 45 78 70  }else{.      Exp
165e0 72 20 2a 70 4e 65 77 3b 0a 20 20 20 20 20 20 61  r *pNew;.      a
165f0 73 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30  ssert( pEList!=0
16600 20 26 26 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75   && pExpr->iColu
16610 6d 6e 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  mn<pEList->nExpr
16620 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
16630 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3d 3d  ( pExpr->pLeft==
16640 30 20 26 26 20 70 45 78 70 72 2d 3e 70 52 69 67  0 && pExpr->pRig
16650 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  ht==0 );.      p
16660 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70  New = sqlite3Exp
16670 72 44 75 70 28 64 62 2c 20 70 45 4c 69 73 74 2d  rDup(db, pEList-
16680 3e 61 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  >a[pExpr->iColum
16690 6e 5d 2e 70 45 78 70 72 2c 20 30 29 3b 0a 20 20  n].pExpr, 0);.  
166a0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
166b0 65 6c 65 74 65 28 64 62 2c 20 70 45 78 70 72 29  elete(db, pExpr)
166c0 3b 0a 20 20 20 20 20 20 70 45 78 70 72 20 3d 20  ;.      pExpr = 
166d0 70 4e 65 77 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  pNew;.    }.  }e
166e0 6c 73 65 7b 0a 20 20 20 20 70 45 78 70 72 2d 3e  lse{.    pExpr->
166f0 70 4c 65 66 74 20 3d 20 73 75 62 73 74 45 78 70  pLeft = substExp
16700 72 28 64 62 2c 20 70 45 78 70 72 2d 3e 70 4c 65  r(db, pExpr->pLe
16710 66 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69  ft, iTable, pELi
16720 73 74 29 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e  st);.    pExpr->
16730 70 52 69 67 68 74 20 3d 20 73 75 62 73 74 45 78  pRight = substEx
16740 70 72 28 64 62 2c 20 70 45 78 70 72 2d 3e 70 52  pr(db, pExpr->pR
16750 69 67 68 74 2c 20 69 54 61 62 6c 65 2c 20 70 45  ight, iTable, pE
16760 4c 69 73 74 29 3b 0a 20 20 20 20 69 66 28 20 45  List);.    if( E
16770 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
16780 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
16790 63 74 29 20 29 7b 0a 20 20 20 20 20 20 73 75 62  ct) ){.      sub
167a0 73 74 53 65 6c 65 63 74 28 64 62 2c 20 70 45 78  stSelect(db, pEx
167b0 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20 69  pr->x.pSelect, i
167c0 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a  Table, pEList);.
167d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
167e0 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 64   substExprList(d
167f0 62 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  b, pExpr->x.pLis
16800 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  t, iTable, pELis
16810 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  t);.    }.  }.  
16820 72 65 74 75 72 6e 20 70 45 78 70 72 3b 0a 7d 0a  return pExpr;.}.
16830 73 74 61 74 69 63 20 76 6f 69 64 20 73 75 62 73  static void subs
16840 74 45 78 70 72 4c 69 73 74 28 0a 20 20 73 71 6c  tExprList(.  sql
16850 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
16860 20 20 2f 2a 20 52 65 70 6f 72 74 20 6d 61 6c 6c    /* Report mall
16870 6f 63 20 65 72 72 6f 72 73 20 68 65 72 65 20 2a  oc errors here *
16880 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  /.  ExprList *pL
16890 69 73 74 2c 20 20 20 20 20 2f 2a 20 4c 69 73 74  ist,     /* List
168a0 20 74 6f 20 73 63 61 6e 20 61 6e 64 20 69 6e 20   to scan and in 
168b0 77 68 69 63 68 20 74 6f 20 6d 61 6b 65 20 73 75  which to make su
168c0 62 73 74 69 74 75 74 65 73 20 2a 2f 0a 20 20 69  bstitutes */.  i
168d0 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20  nt iTable,      
168e0 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20      /* Table to 
168f0 62 65 20 73 75 62 73 74 69 74 75 74 65 64 20 2a  be substituted *
16900 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  /.  ExprList *pE
16910 4c 69 73 74 20 20 20 20 20 2f 2a 20 53 75 62 73  List     /* Subs
16920 74 69 74 75 74 65 20 76 61 6c 75 65 73 20 2a 2f  titute values */
16930 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  .){.  int i;.  i
16940 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65  f( pList==0 ) re
16950 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  turn;.  for(i=0;
16960 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   i<pList->nExpr;
16970 20 69 2b 2b 29 7b 0a 20 20 20 20 70 4c 69 73 74   i++){.    pList
16980 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 20 3d 20 73  ->a[i].pExpr = s
16990 75 62 73 74 45 78 70 72 28 64 62 2c 20 70 4c 69  ubstExpr(db, pLi
169a0 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20  st->a[i].pExpr, 
169b0 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
169c0 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f  .  }.}.static vo
169d0 69 64 20 73 75 62 73 74 53 65 6c 65 63 74 28 0a  id substSelect(.
169e0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
169f0 20 20 20 20 20 20 20 2f 2a 20 52 65 70 6f 72 74         /* Report
16a00 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20 68   malloc errors h
16a10 65 72 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ere */.  Select 
16a20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  *p,           /*
16a30 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
16a40 74 20 69 6e 20 77 68 69 63 68 20 74 6f 20 6d 61  t in which to ma
16a50 6b 65 20 73 75 62 73 74 69 74 75 74 69 6f 6e 73  ke substitutions
16a60 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65   */.  int iTable
16a70 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61  ,          /* Ta
16a80 62 6c 65 20 74 6f 20 62 65 20 72 65 70 6c 61 63  ble to be replac
16a90 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  ed */.  ExprList
16aa0 20 2a 70 45 4c 69 73 74 20 20 20 20 20 2f 2a 20   *pEList     /* 
16ab0 53 75 62 73 74 69 74 75 74 65 20 76 61 6c 75 65  Substitute value
16ac0 73 20 2a 2f 0a 29 7b 0a 20 20 53 72 63 4c 69 73  s */.){.  SrcLis
16ad0 74 20 2a 70 53 72 63 3b 0a 20 20 73 74 72 75 63  t *pSrc;.  struc
16ae0 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
16af0 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a  pItem;.  int i;.
16b00 20 20 69 66 28 20 21 70 20 29 20 72 65 74 75 72    if( !p ) retur
16b10 6e 3b 0a 20 20 73 75 62 73 74 45 78 70 72 4c 69  n;.  substExprLi
16b20 73 74 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74  st(db, p->pEList
16b30 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
16b40 29 3b 0a 20 20 73 75 62 73 74 45 78 70 72 4c 69  );.  substExprLi
16b50 73 74 28 64 62 2c 20 70 2d 3e 70 47 72 6f 75 70  st(db, p->pGroup
16b60 42 79 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69  By, iTable, pELi
16b70 73 74 29 3b 0a 20 20 73 75 62 73 74 45 78 70 72  st);.  substExpr
16b80 4c 69 73 74 28 64 62 2c 20 70 2d 3e 70 4f 72 64  List(db, p->pOrd
16b90 65 72 42 79 2c 20 69 54 61 62 6c 65 2c 20 70 45  erBy, iTable, pE
16ba0 4c 69 73 74 29 3b 0a 20 20 70 2d 3e 70 48 61 76  List);.  p->pHav
16bb0 69 6e 67 20 3d 20 73 75 62 73 74 45 78 70 72 28  ing = substExpr(
16bc0 64 62 2c 20 70 2d 3e 70 48 61 76 69 6e 67 2c 20  db, p->pHaving, 
16bd0 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
16be0 0a 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 73  .  p->pWhere = s
16bf0 75 62 73 74 45 78 70 72 28 64 62 2c 20 70 2d 3e  ubstExpr(db, p->
16c00 70 57 68 65 72 65 2c 20 69 54 61 62 6c 65 2c 20  pWhere, iTable, 
16c10 70 45 4c 69 73 74 29 3b 0a 20 20 73 75 62 73 74  pEList);.  subst
16c20 53 65 6c 65 63 74 28 64 62 2c 20 70 2d 3e 70 50  Select(db, p->pP
16c30 72 69 6f 72 2c 20 69 54 61 62 6c 65 2c 20 70 45  rior, iTable, pE
16c40 4c 69 73 74 29 3b 0a 20 20 70 53 72 63 20 3d 20  List);.  pSrc = 
16c50 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72  p->pSrc;.  asser
16c60 74 28 20 70 53 72 63 20 29 3b 20 20 2f 2a 20 45  t( pSrc );  /* E
16c70 76 65 6e 20 66 6f 72 20 28 53 45 4c 45 43 54 20  ven for (SELECT 
16c80 31 29 20 77 65 20 68 61 76 65 3a 20 70 53 72 63  1) we have: pSrc
16c90 21 3d 30 20 62 75 74 20 70 53 72 63 2d 3e 6e 53  !=0 but pSrc->nS
16ca0 72 63 3d 3d 30 20 2a 2f 0a 20 20 69 66 28 20 41  rc==0 */.  if( A
16cb0 4c 57 41 59 53 28 70 53 72 63 29 20 29 7b 0a 20  LWAYS(pSrc) ){. 
16cc0 20 20 20 66 6f 72 28 69 3d 70 53 72 63 2d 3e 6e     for(i=pSrc->n
16cd0 53 72 63 2c 20 70 49 74 65 6d 3d 70 53 72 63 2d  Src, pItem=pSrc-
16ce0 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 49  >a; i>0; i--, pI
16cf0 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 73 75  tem++){.      su
16d00 62 73 74 53 65 6c 65 63 74 28 64 62 2c 20 70 49  bstSelect(db, pI
16d10 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2c 20 69 54  tem->pSelect, iT
16d20 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20  able, pEList);. 
16d30 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69     }.  }.}.#endi
16d40 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51  f /* !defined(SQ
16d50 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
16d60 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  RY) || !defined(
16d70 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
16d80 29 20 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e  ) */..#if !defin
16d90 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
16da0 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66  UBQUERY) || !def
16db0 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
16dc0 5f 56 49 45 57 29 0a 2f 2a 0a 2a 2a 20 54 68 69  _VIEW)./*.** Thi
16dd0 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65 6d 70  s routine attemp
16de0 74 73 20 74 6f 20 66 6c 61 74 74 65 6e 20 73 75  ts to flatten su
16df0 62 71 75 65 72 69 65 73 20 61 73 20 61 20 70 65  bqueries as a pe
16e00 72 66 6f 72 6d 61 6e 63 65 20 6f 70 74 69 6d 69  rformance optimi
16e10 7a 61 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20  zation..** This 
16e20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
16e30 31 20 69 66 20 69 74 20 6d 61 6b 65 73 20 63 68  1 if it makes ch
16e40 61 6e 67 65 73 20 61 6e 64 20 30 20 69 66 20 6e  anges and 0 if n
16e50 6f 20 66 6c 61 74 74 65 6e 69 6e 67 20 6f 63 63  o flattening occ
16e60 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 75 6e  urs..**.** To un
16e70 64 65 72 73 74 61 6e 64 20 74 68 65 20 63 6f 6e  derstand the con
16e80 63 65 70 74 20 6f 66 20 66 6c 61 74 74 65 6e 69  cept of flatteni
16e90 6e 67 2c 20 63 6f 6e 73 69 64 65 72 20 74 68 65  ng, consider the
16ea0 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 71 75   following.** qu
16eb0 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  ery:.**.**     S
16ec0 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 28 53 45  ELECT a FROM (SE
16ed0 4c 45 43 54 20 78 2b 79 20 41 53 20 61 20 46 52  LECT x+y AS a FR
16ee0 4f 4d 20 74 31 20 57 48 45 52 45 20 7a 3c 31 30  OM t1 WHERE z<10
16ef0 30 29 20 57 48 45 52 45 20 61 3e 35 0a 2a 2a 0a  0) WHERE a>5.**.
16f00 2a 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20 77  ** The default w
16f10 61 79 20 6f 66 20 69 6d 70 6c 65 6d 65 6e 74 69  ay of implementi
16f20 6e 67 20 74 68 69 73 20 71 75 65 72 79 20 69 73  ng this query is
16f30 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 65 0a   to execute the.
16f40 2a 2a 20 73 75 62 71 75 65 72 79 20 66 69 72 73  ** subquery firs
16f50 74 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20  t and store the 
16f60 72 65 73 75 6c 74 73 20 69 6e 20 61 20 74 65 6d  results in a tem
16f70 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 74 68  porary table, th
16f80 65 6e 0a 2a 2a 20 72 75 6e 20 74 68 65 20 6f 75  en.** run the ou
16f90 74 65 72 20 71 75 65 72 79 20 6f 6e 20 74 68 61  ter query on tha
16fa0 74 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  t temporary tabl
16fb0 65 2e 20 20 54 68 69 73 20 72 65 71 75 69 72 65  e.  This require
16fc0 73 20 74 77 6f 0a 2a 2a 20 70 61 73 73 65 73 20  s two.** passes 
16fd0 6f 76 65 72 20 74 68 65 20 64 61 74 61 2e 20 20  over the data.  
16fe0 46 75 72 74 68 65 72 6d 6f 72 65 2c 20 62 65 63  Furthermore, bec
16ff0 61 75 73 65 20 74 68 65 20 74 65 6d 70 6f 72 61  ause the tempora
17000 72 79 20 74 61 62 6c 65 0a 2a 2a 20 68 61 73 20  ry table.** has 
17010 6e 6f 20 69 6e 64 69 63 65 73 2c 20 74 68 65 20  no indices, the 
17020 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f 6e 20  WHERE clause on 
17030 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
17040 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6f 70 74  cannot be.** opt
17050 69 6d 69 7a 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  imized..**.** Th
17060 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65 6d  is routine attem
17070 70 74 73 20 74 6f 20 72 65 77 72 69 74 65 20 71  pts to rewrite q
17080 75 65 72 69 65 73 20 73 75 63 68 20 61 73 20 74  ueries such as t
17090 68 65 20 61 62 6f 76 65 20 69 6e 74 6f 0a 2a 2a  he above into.**
170a0 20 61 20 73 69 6e 67 6c 65 20 66 6c 61 74 20 73   a single flat s
170b0 65 6c 65 63 74 2c 20 6c 69 6b 65 20 74 68 69 73  elect, like this
170c0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45  :.**.**     SELE
170d0 43 54 20 78 2b 79 20 41 53 20 61 20 46 52 4f 4d  CT x+y AS a FROM
170e0 20 74 31 20 57 48 45 52 45 20 7a 3c 31 30 30 20   t1 WHERE z<100 
170f0 41 4e 44 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68  AND a>5.**.** Th
17100 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64  e code generated
17110 20 66 6f 72 20 74 68 69 73 20 73 69 6d 70 69 66   for this simpif
17120 69 63 61 74 69 6f 6e 20 67 69 76 65 73 20 74 68  ication gives th
17130 65 20 73 61 6d 65 20 72 65 73 75 6c 74 0a 2a 2a  e same result.**
17140 20 62 75 74 20 6f 6e 6c 79 20 68 61 73 20 74 6f   but only has to
17150 20 73 63 61 6e 20 74 68 65 20 64 61 74 61 20 6f   scan the data o
17160 6e 63 65 2e 20 20 41 6e 64 20 62 65 63 61 75 73  nce.  And becaus
17170 65 20 69 6e 64 69 63 65 73 20 6d 69 67 68 74 20  e indices might 
17180 0a 2a 2a 20 65 78 69 73 74 20 6f 6e 20 74 68 65  .** exist on the
17190 20 74 61 62 6c 65 20 74 31 2c 20 61 20 63 6f 6d   table t1, a com
171a0 70 6c 65 74 65 20 73 63 61 6e 20 6f 66 20 74 68  plete scan of th
171b0 65 20 64 61 74 61 20 6d 69 67 68 74 20 62 65 0a  e data might be.
171c0 2a 2a 20 61 76 6f 69 64 65 64 2e 0a 2a 2a 0a 2a  ** avoided..**.*
171d0 2a 20 46 6c 61 74 74 65 6e 69 6e 67 20 69 73 20  * Flattening is 
171e0 6f 6e 6c 79 20 61 74 74 65 6d 70 74 65 64 20 69  only attempted i
171f0 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c  f all of the fol
17200 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a  lowing are true:
17210 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 20 54 68  .**.**   (1)  Th
17220 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20 74  e subquery and t
17230 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64  he outer query d
17240 6f 20 6e 6f 74 20 62 6f 74 68 20 75 73 65 20 61  o not both use a
17250 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a  ggregates..**.**
17260 20 20 20 28 32 29 20 20 54 68 65 20 73 75 62 71     (2)  The subq
17270 75 65 72 79 20 69 73 20 6e 6f 74 20 61 6e 20 61  uery is not an a
17280 67 67 72 65 67 61 74 65 20 6f 72 20 74 68 65 20  ggregate or the 
17290 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e  outer query is n
172a0 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a  ot a join..**.**
172b0 20 20 20 28 33 29 20 20 54 68 65 20 73 75 62 71     (3)  The subq
172c0 75 65 72 79 20 69 73 20 6e 6f 74 20 74 68 65 20  uery is not the 
172d0 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66  right operand of
172e0 20 61 20 6c 65 66 74 20 6f 75 74 65 72 20 6a 6f   a left outer jo
172f0 69 6e 0a 2a 2a 20 20 20 20 20 20 20 20 28 4f 72  in.**        (Or
17300 69 67 69 6e 61 6c 6c 79 20 74 69 63 6b 65 74 20  iginally ticket 
17310 23 33 30 36 2e 20 20 53 74 72 65 6e 67 74 68 65  #306.  Strengthe
17320 6e 65 64 20 62 79 20 74 69 63 6b 65 74 20 23 33  ned by ticket #3
17330 33 30 30 29 0a 2a 2a 0a 2a 2a 20 20 20 28 34 29  300).**.**   (4)
17340 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69    The subquery i
17350 73 20 6e 6f 74 20 44 49 53 54 49 4e 43 54 2e 0a  s not DISTINCT..
17360 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 41 74 20  **.**  (**)  At 
17370 6f 6e 65 20 70 6f 69 6e 74 20 72 65 73 74 72 69  one point restri
17380 63 74 69 6f 6e 73 20 28 34 29 20 61 6e 64 20 28  ctions (4) and (
17390 35 29 20 64 65 66 69 6e 65 64 20 61 20 73 75 62  5) defined a sub
173a0 73 65 74 20 6f 66 20 44 49 53 54 49 4e 43 54 0a  set of DISTINCT.
173b0 2a 2a 20 20 20 20 20 20 20 20 73 75 62 2d 71 75  **        sub-qu
173c0 65 72 69 65 73 20 74 68 61 74 20 77 65 72 65 20  eries that were 
173d0 65 78 63 6c 75 64 65 64 20 66 72 6f 6d 20 74 68  excluded from th
173e0 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e  is optimization.
173f0 20 52 65 73 74 72 69 63 74 69 6f 6e 20 0a 2a 2a   Restriction .**
17400 20 20 20 20 20 20 20 20 28 34 29 20 68 61 73 20          (4) has 
17410 73 69 6e 63 65 20 62 65 65 6e 20 65 78 70 61 6e  since been expan
17420 64 65 64 20 74 6f 20 65 78 63 6c 75 64 65 20 61  ded to exclude a
17430 6c 6c 20 44 49 53 54 49 4e 43 54 20 73 75 62 71  ll DISTINCT subq
17440 75 65 72 69 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20  ueries..**.**   
17450 28 36 29 20 20 54 68 65 20 73 75 62 71 75 65 72  (6)  The subquer
17460 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 61  y does not use a
17470 67 67 72 65 67 61 74 65 73 20 6f 72 20 74 68 65  ggregates or the
17480 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20   outer query is 
17490 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 44 49  not.**        DI
174a0 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20 20 20  STINCT..**.**   
174b0 28 37 29 20 20 54 68 65 20 73 75 62 71 75 65 72  (7)  The subquer
174c0 79 20 68 61 73 20 61 20 46 52 4f 4d 20 63 6c 61  y has a FROM cla
174d0 75 73 65 2e 20 20 54 4f 44 4f 3a 20 20 46 6f 72  use.  TODO:  For
174e0 20 73 75 62 71 75 65 72 69 65 73 20 77 69 74 68   subqueries with
174f0 6f 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 41 20  out.**        A 
17500 46 52 4f 4d 20 63 6c 61 75 73 65 2c 20 63 6f 6e  FROM clause, con
17510 73 69 64 65 72 20 61 64 64 69 6e 67 20 61 20 46  sider adding a F
17520 52 4f 4d 20 63 6c 6f 73 65 20 77 69 74 68 20 74  ROM close with t
17530 68 65 20 73 70 65 63 69 61 6c 0a 2a 2a 20 20 20  he special.**   
17540 20 20 20 20 20 74 61 62 6c 65 20 73 71 6c 69 74       table sqlit
17550 65 5f 6f 6e 63 65 20 74 68 61 74 20 63 6f 6e 73  e_once that cons
17560 69 73 74 73 20 6f 66 20 61 20 73 69 6e 67 6c 65  ists of a single
17570 20 72 6f 77 20 63 6f 6e 74 61 69 6e 69 6e 67 20   row containing 
17580 61 0a 2a 2a 20 20 20 20 20 20 20 20 73 69 6e 67  a.**        sing
17590 6c 65 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 20  le NULL..**.**  
175a0 20 28 38 29 20 20 54 68 65 20 73 75 62 71 75 65   (8)  The subque
175b0 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  ry does not use 
175c0 4c 49 4d 49 54 20 6f 72 20 74 68 65 20 6f 75 74  LIMIT or the out
175d0 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20  er query is not 
175e0 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20  a join..**.**   
175f0 28 39 29 20 20 54 68 65 20 73 75 62 71 75 65 72  (9)  The subquer
17600 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c  y does not use L
17610 49 4d 49 54 20 6f 72 20 74 68 65 20 6f 75 74 65  IMIT or the oute
17620 72 20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  r query does not
17630 20 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 61   use.**        a
17640 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a  ggregates..**.**
17650 20 20 28 31 30 29 20 20 54 68 65 20 73 75 62 71    (10)  The subq
17660 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73  uery does not us
17670 65 20 61 67 67 72 65 67 61 74 65 73 20 6f 72 20  e aggregates or 
17680 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
17690 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20  does not.**     
176a0 20 20 20 75 73 65 20 4c 49 4d 49 54 2e 0a 2a 2a     use LIMIT..**
176b0 0a 2a 2a 20 20 28 31 31 29 20 20 54 68 65 20 73  .**  (11)  The s
176c0 75 62 71 75 65 72 79 20 61 6e 64 20 74 68 65 20  ubquery and the 
176d0 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 20 6e  outer query do n
176e0 6f 74 20 62 6f 74 68 20 68 61 76 65 20 4f 52 44  ot both have ORD
176f0 45 52 20 42 59 20 63 6c 61 75 73 65 73 2e 0a 2a  ER BY clauses..*
17700 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 4e 6f 74 20  *.**  (**)  Not 
17710 69 6d 70 6c 65 6d 65 6e 74 65 64 2e 20 20 53 75  implemented.  Su
17720 62 73 75 6d 65 64 20 69 6e 74 6f 20 72 65 73 74  bsumed into rest
17730 72 69 63 74 69 6f 6e 20 28 33 29 2e 20 20 57 61  riction (3).  Wa
17740 73 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20  s previously.** 
17750 20 20 20 20 20 20 20 61 20 73 65 70 61 72 61 74         a separat
17760 65 20 72 65 73 74 72 69 63 74 69 6f 6e 20 64 65  e restriction de
17770 72 69 76 69 6e 67 20 66 72 6f 6d 20 74 69 63 6b  riving from tick
17780 65 74 20 23 33 35 30 2e 0a 2a 2a 0a 2a 2a 20 20  et #350..**.**  
17790 28 31 33 29 20 20 54 68 65 20 73 75 62 71 75 65  (13)  The subque
177a0 72 79 20 61 6e 64 20 6f 75 74 65 72 20 71 75 65  ry and outer que
177b0 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20 75  ry do not both u
177c0 73 65 20 4c 49 4d 49 54 2e 0a 2a 2a 0a 2a 2a 20  se LIMIT..**.** 
177d0 20 28 31 34 29 20 20 54 68 65 20 73 75 62 71 75   (14)  The subqu
177e0 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  ery does not use
177f0 20 4f 46 46 53 45 54 2e 0a 2a 2a 0a 2a 2a 20 20   OFFSET..**.**  
17800 28 31 35 29 20 20 54 68 65 20 6f 75 74 65 72 20  (15)  The outer 
17810 71 75 65 72 79 20 69 73 20 6e 6f 74 20 70 61 72  query is not par
17820 74 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20  t of a compound 
17830 73 65 6c 65 63 74 20 6f 72 20 74 68 65 0a 2a 2a  select or the.**
17840 20 20 20 20 20 20 20 20 73 75 62 71 75 65 72 79          subquery
17850 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 61   does not have a
17860 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 2e 0a 2a   LIMIT clause..*
17870 2a 20 20 20 20 20 20 20 20 28 53 65 65 20 74 69  *        (See ti
17880 63 6b 65 74 20 23 32 33 33 39 20 61 6e 64 20 74  cket #2339 and t
17890 69 63 6b 65 74 20 5b 30 32 61 38 65 38 31 64 34  icket [02a8e81d4
178a0 34 5d 29 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 36 29  4])..**.**  (16)
178b0 20 20 54 68 65 20 6f 75 74 65 72 20 71 75 65 72    The outer quer
178c0 79 20 69 73 20 6e 6f 74 20 61 6e 20 61 67 67 72  y is not an aggr
178d0 65 67 61 74 65 20 6f 72 20 74 68 65 20 73 75 62  egate or the sub
178e0 71 75 65 72 79 20 64 6f 65 73 0a 2a 2a 20 20 20  query does.**   
178f0 20 20 20 20 20 6e 6f 74 20 63 6f 6e 74 61 69 6e       not contain
17900 20 4f 52 44 45 52 20 42 59 2e 20 20 28 54 69 63   ORDER BY.  (Tic
17910 6b 65 74 20 23 32 39 34 32 29 20 20 54 68 69 73  ket #2942)  This
17920 20 75 73 65 64 20 74 6f 20 6e 6f 74 20 6d 61 74   used to not mat
17930 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 20 75 6e  ter.**        un
17940 74 69 6c 20 77 65 20 69 6e 74 72 6f 64 75 63 65  til we introduce
17950 64 20 74 68 65 20 67 72 6f 75 70 5f 63 6f 6e 63  d the group_conc
17960 61 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20  at() function.  
17970 0a 2a 2a 0a 2a 2a 20 20 28 31 37 29 20 20 54 68  .**.**  (17)  Th
17980 65 20 73 75 62 2d 71 75 65 72 79 20 69 73 20 6e  e sub-query is n
17990 6f 74 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65  ot a compound se
179a0 6c 65 63 74 2c 20 6f 72 20 69 74 20 69 73 20 61  lect, or it is a
179b0 20 55 4e 49 4f 4e 20 41 4c 4c 20 0a 2a 2a 20 20   UNION ALL .**  
179c0 20 20 20 20 20 20 63 6f 6d 70 6f 75 6e 64 20 63        compound c
179d0 6c 61 75 73 65 20 6d 61 64 65 20 75 70 20 65 6e  lause made up en
179e0 74 69 72 65 6c 79 20 6f 66 20 6e 6f 6e 2d 61 67  tirely of non-ag
179f0 67 72 65 67 61 74 65 20 71 75 65 72 69 65 73 2c  gregate queries,
17a00 20 61 6e 64 20 0a 2a 2a 20 20 20 20 20 20 20 20   and .**        
17a10 74 68 65 20 70 61 72 65 6e 74 20 71 75 65 72 79  the parent query
17a20 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  :.**.**         
17a30 20 2a 20 69 73 20 6e 6f 74 20 69 74 73 65 6c 66   * is not itself
17a40 20 70 61 72 74 20 6f 66 20 61 20 63 6f 6d 70 6f   part of a compo
17a50 75 6e 64 20 73 65 6c 65 63 74 2c 0a 2a 2a 20 20  und select,.**  
17a60 20 20 20 20 20 20 20 20 2a 20 69 73 20 6e 6f 74          * is not
17a70 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 6f 72   an aggregate or
17a80 20 44 49 53 54 49 4e 43 54 20 71 75 65 72 79 2c   DISTINCT query,
17a90 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 20   and.**         
17aa0 20 2a 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e   * is not a join
17ab0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 54 68  .**.**        Th
17ac0 65 20 70 61 72 65 6e 74 20 61 6e 64 20 73 75 62  e parent and sub
17ad0 2d 71 75 65 72 79 20 6d 61 79 20 63 6f 6e 74 61  -query may conta
17ae0 69 6e 20 57 48 45 52 45 20 63 6c 61 75 73 65 73  in WHERE clauses
17af0 2e 20 53 75 62 6a 65 63 74 20 74 6f 0a 2a 2a 20  . Subject to.** 
17b00 20 20 20 20 20 20 20 72 75 6c 65 73 20 28 31 31         rules (11
17b10 29 2c 20 28 31 33 29 20 61 6e 64 20 28 31 34 29  ), (13) and (14)
17b20 2c 20 74 68 65 79 20 6d 61 79 20 61 6c 73 6f 20  , they may also 
17b30 63 6f 6e 74 61 69 6e 20 4f 52 44 45 52 20 42 59  contain ORDER BY
17b40 2c 0a 2a 2a 20 20 20 20 20 20 20 20 4c 49 4d 49  ,.**        LIMI
17b50 54 20 61 6e 64 20 4f 46 46 53 45 54 20 63 6c 61  T and OFFSET cla
17b60 75 73 65 73 2e 20 20 54 68 65 20 73 75 62 71 75  uses.  The subqu
17b70 65 72 79 20 63 61 6e 6e 6f 74 20 75 73 65 20 61  ery cannot use a
17b80 6e 79 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20  ny compound.**  
17b90 20 20 20 20 20 20 6f 70 65 72 61 74 6f 72 20 6f        operator o
17ba0 74 68 65 72 20 74 68 61 6e 20 55 4e 49 4f 4e 20  ther than UNION 
17bb0 41 4c 4c 20 62 65 63 61 75 73 65 20 61 6c 6c 20  ALL because all 
17bc0 74 68 65 20 6f 74 68 65 72 20 63 6f 6d 70 6f 75  the other compou
17bd0 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 6f 70 65  nd.**        ope
17be0 72 61 74 6f 72 73 20 68 61 76 65 20 61 6e 20 69  rators have an i
17bf0 6d 70 6c 69 65 64 20 44 49 53 54 49 4e 43 54 20  mplied DISTINCT 
17c00 77 68 69 63 68 20 69 73 20 64 69 73 61 6c 6c 6f  which is disallo
17c10 77 65 64 20 62 79 0a 2a 2a 20 20 20 20 20 20 20  wed by.**       
17c20 20 72 65 73 74 72 69 63 74 69 6f 6e 20 28 34 29   restriction (4)
17c30 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 41  ..**.**        A
17c40 6c 73 6f 2c 20 65 61 63 68 20 63 6f 6d 70 6f 6e  lso, each compon
17c50 65 6e 74 20 6f 66 20 74 68 65 20 73 75 62 2d 71  ent of the sub-q
17c60 75 65 72 79 20 6d 75 73 74 20 72 65 74 75 72 6e  uery must return
17c70 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72   the same number
17c80 0a 2a 2a 20 20 20 20 20 20 20 20 6f 66 20 72 65  .**        of re
17c90 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 2e 20 54 68  sult columns. Th
17ca0 69 73 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61  is is actually a
17cb0 20 72 65 71 75 69 72 65 6d 65 6e 74 20 66 6f 72   requirement for
17cc0 20 61 6e 79 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a   any compound.**
17cd0 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 73          SELECT s
17ce0 74 61 74 65 6d 65 6e 74 2c 20 62 75 74 20 61 6c  tatement, but al
17cf0 6c 20 74 68 65 20 63 6f 64 65 20 68 65 72 65 20  l the code here 
17d00 64 6f 65 73 20 69 73 20 6d 61 6b 65 20 73 75 72  does is make sur
17d10 65 20 74 68 61 74 20 6e 6f 0a 2a 2a 20 20 20 20  e that no.**    
17d20 20 20 20 20 73 75 63 68 20 28 69 6c 6c 65 67 61      such (illega
17d30 6c 29 20 73 75 62 2d 71 75 65 72 79 20 69 73 20  l) sub-query is 
17d40 66 6c 61 74 74 65 6e 65 64 2e 20 54 68 65 20 63  flattened. The c
17d50 61 6c 6c 65 72 20 77 69 6c 6c 20 64 65 74 65 63  aller will detec
17d60 74 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  t the.**        
17d70 73 79 6e 74 61 78 20 65 72 72 6f 72 20 61 6e 64  syntax error and
17d80 20 72 65 74 75 72 6e 20 61 20 64 65 74 61 69 6c   return a detail
17d90 65 64 20 6d 65 73 73 61 67 65 2e 0a 2a 2a 0a 2a  ed message..**.*
17da0 2a 20 20 28 31 38 29 20 20 49 66 20 74 68 65 20  *  (18)  If the 
17db0 73 75 62 2d 71 75 65 72 79 20 69 73 20 61 20 63  sub-query is a c
17dc0 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20  ompound select, 
17dd0 74 68 65 6e 20 61 6c 6c 20 74 65 72 6d 73 20 6f  then all terms o
17de0 66 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  f the.**        
17df0 4f 52 44 45 52 20 62 79 20 63 6c 61 75 73 65 20  ORDER by clause 
17e00 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20 6d 75  of the parent mu
17e10 73 74 20 62 65 20 73 69 6d 70 6c 65 20 72 65 66  st be simple ref
17e20 65 72 65 6e 63 65 73 20 74 6f 20 0a 2a 2a 20 20  erences to .**  
17e30 20 20 20 20 20 20 63 6f 6c 75 6d 6e 73 20 6f 66        columns of
17e40 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 2e 0a   the sub-query..
17e50 2a 2a 0a 2a 2a 20 20 28 31 39 29 20 20 54 68 65  **.**  (19)  The
17e60 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e   subquery does n
17e70 6f 74 20 75 73 65 20 4c 49 4d 49 54 20 6f 72 20  ot use LIMIT or 
17e80 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
17e90 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20  does not.**     
17ea0 20 20 20 68 61 76 65 20 61 20 57 48 45 52 45 20     have a WHERE 
17eb0 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 28  clause..**.**  (
17ec0 32 30 29 20 20 49 66 20 74 68 65 20 73 75 62 2d  20)  If the sub-
17ed0 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f  query is a compo
17ee0 75 6e 64 20 73 65 6c 65 63 74 2c 20 74 68 65 6e  und select, then
17ef0 20 69 74 20 6d 75 73 74 20 6e 6f 74 20 75 73 65   it must not use
17f00 0a 2a 2a 20 20 20 20 20 20 20 20 61 6e 20 4f 52  .**        an OR
17f10 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 20 20  DER BY clause.  
17f20 54 69 63 6b 65 74 20 23 33 37 37 33 2e 20 20 57  Ticket #3773.  W
17f30 65 20 63 6f 75 6c 64 20 72 65 6c 61 78 20 74 68  e could relax th
17f40 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a  is constraint.**
17f50 20 20 20 20 20 20 20 20 73 6f 6d 65 77 68 61 74          somewhat
17f60 20 62 79 20 73 61 79 69 6e 67 20 74 68 61 74 20   by saying that 
17f70 74 68 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65  the terms of the
17f80 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
17f90 20 6d 75 73 74 0a 2a 2a 20 20 20 20 20 20 20 20   must.**        
17fa0 61 70 70 65 61 72 20 61 73 20 75 6e 6d 6f 64 69  appear as unmodi
17fb0 66 69 65 64 20 72 65 73 75 6c 74 20 63 6f 6c 75  fied result colu
17fc0 6d 6e 73 20 69 6e 20 74 68 65 20 6f 75 74 65 72  mns in the outer
17fd0 20 71 75 65 72 79 2e 20 20 42 75 74 20 77 65 0a   query.  But we.
17fe0 2a 2a 20 20 20 20 20 20 20 20 68 61 76 65 20 6f  **        have o
17ff0 74 68 65 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f  ther optimizatio
18000 6e 73 20 69 6e 20 6d 69 6e 64 20 74 6f 20 64 65  ns in mind to de
18010 61 6c 20 77 69 74 68 20 74 68 61 74 20 63 61 73  al with that cas
18020 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 31 29 20 20  e..**.**  (21)  
18030 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65  The subquery doe
18040 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 20  s not use LIMIT 
18050 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  or the outer que
18060 72 79 20 69 73 20 6e 6f 74 0a 2a 2a 20 20 20 20  ry is not.**    
18070 20 20 20 20 44 49 53 54 49 4e 43 54 2e 20 20 28      DISTINCT.  (
18080 53 65 65 20 74 69 63 6b 65 74 20 5b 37 35 32 65  See ticket [752e
18090 31 36 34 36 66 63 5d 29 2e 0a 2a 2a 0a 2a 2a 20  1646fc])..**.** 
180a0 49 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c  In this routine,
180b0 20 74 68 65 20 22 70 22 20 70 61 72 61 6d 65 74   the "p" paramet
180c0 65 72 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  er is a pointer 
180d0 74 6f 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  to the outer que
180e0 72 79 2e 0a 2a 2a 20 54 68 65 20 73 75 62 71 75  ry..** The subqu
180f0 65 72 79 20 69 73 20 70 2d 3e 70 53 72 63 2d 3e  ery is p->pSrc->
18100 61 5b 69 46 72 6f 6d 5d 2e 20 20 69 73 41 67 67  a[iFrom].  isAgg
18110 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20   is true if the 
18120 6f 75 74 65 72 20 71 75 65 72 79 0a 2a 2a 20 75  outer query.** u
18130 73 65 73 20 61 67 67 72 65 67 61 74 65 73 20 61  ses aggregates a
18140 6e 64 20 73 75 62 71 75 65 72 79 49 73 41 67 67  nd subqueryIsAgg
18150 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20   is true if the 
18160 73 75 62 71 75 65 72 79 20 75 73 65 73 20 61 67  subquery uses ag
18170 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  gregates..**.** 
18180 49 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73  If flattening is
18190 20 6e 6f 74 20 61 74 74 65 6d 70 74 65 64 2c 20   not attempted, 
181a0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
181b0 61 20 6e 6f 2d 6f 70 20 61 6e 64 20 72 65 74 75  a no-op and retu
181c0 72 6e 73 20 30 2e 0a 2a 2a 20 49 66 20 66 6c 61  rns 0..** If fla
181d0 74 74 65 6e 69 6e 67 20 69 73 20 61 74 74 65 6d  ttening is attem
181e0 70 74 65 64 20 74 68 69 73 20 72 6f 75 74 69 6e  pted this routin
181f0 65 20 72 65 74 75 72 6e 73 20 31 2e 0a 2a 2a 0a  e returns 1..**.
18200 2a 2a 20 41 6c 6c 20 6f 66 20 74 68 65 20 65 78  ** All of the ex
18210 70 72 65 73 73 69 6f 6e 20 61 6e 61 6c 79 73 69  pression analysi
18220 73 20 6d 75 73 74 20 6f 63 63 75 72 20 6f 6e 20  s must occur on 
18230 62 6f 74 68 20 74 68 65 20 6f 75 74 65 72 20 71  both the outer q
18240 75 65 72 79 20 61 6e 64 0a 2a 2a 20 74 68 65 20  uery and.** the 
18250 73 75 62 71 75 65 72 79 20 62 65 66 6f 72 65 20  subquery before 
18260 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e  this routine run
18270 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
18280 20 66 6c 61 74 74 65 6e 53 75 62 71 75 65 72 79   flattenSubquery
18290 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
182a0 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  e,       /* Pars
182b0 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
182c0 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
182d0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
182e0 65 6e 74 20 6f 72 20 6f 75 74 65 72 20 53 45 4c  ent or outer SEL
182f0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  ECT statement */
18300 0a 20 20 69 6e 74 20 69 46 72 6f 6d 2c 20 20 20  .  int iFrom,   
18310 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
18320 20 69 6e 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 5d   in p->pSrc->a[]
18330 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 73 75   of the inner su
18340 62 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20  bquery */.  int 
18350 69 73 41 67 67 2c 20 20 20 20 20 20 20 20 20 20  isAgg,          
18360 20 2f 2a 20 54 72 75 65 20 69 66 20 6f 75 74 65   /* True if oute
18370 72 20 53 45 4c 45 43 54 20 75 73 65 73 20 61 67  r SELECT uses ag
18380 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
18390 73 20 2a 2f 0a 20 20 69 6e 74 20 73 75 62 71 75  s */.  int subqu
183a0 65 72 79 49 73 41 67 67 20 20 20 20 2f 2a 20 54  eryIsAgg    /* T
183b0 72 75 65 20 69 66 20 74 68 65 20 73 75 62 71 75  rue if the subqu
183c0 65 72 79 20 75 73 65 73 20 61 67 67 72 65 67 61  ery uses aggrega
183d0 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a  te functions */.
183e0 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
183f0 2a 7a 53 61 76 65 64 41 75 74 68 43 6f 6e 74 65  *zSavedAuthConte
18400 78 74 20 3d 20 70 50 61 72 73 65 2d 3e 7a 41 75  xt = pParse->zAu
18410 74 68 43 6f 6e 74 65 78 74 3b 0a 20 20 53 65 6c  thContext;.  Sel
18420 65 63 74 20 2a 70 50 61 72 65 6e 74 3b 0a 20 20  ect *pParent;.  
18430 53 65 6c 65 63 74 20 2a 70 53 75 62 3b 20 20 20  Select *pSub;   
18440 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 6e 65 72      /* The inner
18450 20 71 75 65 72 79 20 6f 72 20 22 73 75 62 71 75   query or "subqu
18460 65 72 79 22 20 2a 2f 0a 20 20 53 65 6c 65 63 74  ery" */.  Select
18470 20 2a 70 53 75 62 31 3b 20 20 20 20 20 20 2f 2a   *pSub1;      /*
18480 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   Pointer to the 
18490 72 69 67 68 74 6d 6f 73 74 20 73 65 6c 65 63 74  rightmost select
184a0 20 69 6e 20 73 75 62 2d 71 75 65 72 79 20 2a 2f   in sub-query */
184b0 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
184c0 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52  ;      /* The FR
184d0 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
184e0 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a   outer query */.
184f0 20 20 53 72 63 4c 69 73 74 20 2a 70 53 75 62 53    SrcList *pSubS
18500 72 63 3b 20 20 20 2f 2a 20 54 68 65 20 46 52 4f  rc;   /* The FRO
18510 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
18520 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 45 78  subquery */.  Ex
18530 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b 20 20  prList *pList;  
18540 20 20 2f 2a 20 54 68 65 20 72 65 73 75 6c 74 20    /* The result 
18550 73 65 74 20 6f 66 20 74 68 65 20 6f 75 74 65 72  set of the outer
18560 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20   query */.  int 
18570 69 50 61 72 65 6e 74 3b 20 20 20 20 20 20 20 20  iParent;        
18580 2f 2a 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e  /* VDBE cursor n
18590 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 53 75  umber of the pSu
185a0 62 20 72 65 73 75 6c 74 20 73 65 74 20 74 65 6d  b result set tem
185b0 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  p table */.  int
185c0 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
185d0 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
185e0 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65   */.  Expr *pWhe
185f0 72 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  re;             
18600 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48         /* The WH
18610 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
18620 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
18630 74 65 6d 20 2a 70 53 75 62 69 74 65 6d 3b 20 20  tem *pSubitem;  
18640 20 2f 2a 20 54 68 65 20 73 75 62 71 75 65 72 79   /* The subquery
18650 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
18660 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
18670 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73  .  /* Check to s
18680 65 65 20 69 66 20 66 6c 61 74 74 65 6e 69 6e 67  ee if flattening
18690 20 69 73 20 70 65 72 6d 69 74 74 65 64 2e 20 20   is permitted.  
186a0 52 65 74 75 72 6e 20 30 20 69 66 20 6e 6f 74 2e  Return 0 if not.
186b0 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
186c0 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  p!=0 );.  assert
186d0 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29  ( p->pPrior==0 )
186e0 3b 20 20 2f 2a 20 55 6e 61 62 6c 65 20 74 6f 20  ;  /* Unable to 
186f0 66 6c 61 74 74 65 6e 20 63 6f 6d 70 6f 75 6e 64  flatten compound
18700 20 71 75 65 72 69 65 73 20 2a 2f 0a 20 20 69 66   queries */.  if
18710 28 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 44 69  ( OptimizationDi
18720 73 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54  sabled(db, SQLIT
18730 45 5f 51 75 65 72 79 46 6c 61 74 74 65 6e 65 72  E_QueryFlattener
18740 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
18750 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  pSrc = p->pSrc;.
18760 20 20 61 73 73 65 72 74 28 20 70 53 72 63 20 26    assert( pSrc &
18770 26 20 69 46 72 6f 6d 3e 3d 30 20 26 26 20 69 46  & iFrom>=0 && iF
18780 72 6f 6d 3c 70 53 72 63 2d 3e 6e 53 72 63 20 29  rom<pSrc->nSrc )
18790 3b 0a 20 20 70 53 75 62 69 74 65 6d 20 3d 20 26  ;.  pSubitem = &
187a0 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 3b 0a  pSrc->a[iFrom];.
187b0 20 20 69 50 61 72 65 6e 74 20 3d 20 70 53 75 62    iParent = pSub
187c0 69 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20  item->iCursor;. 
187d0 20 70 53 75 62 20 3d 20 70 53 75 62 69 74 65 6d   pSub = pSubitem
187e0 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 61 73 73  ->pSelect;.  ass
187f0 65 72 74 28 20 70 53 75 62 21 3d 30 20 29 3b 0a  ert( pSub!=0 );.
18800 20 20 69 66 28 20 69 73 41 67 67 20 26 26 20 73    if( isAgg && s
18810 75 62 71 75 65 72 79 49 73 41 67 67 20 29 20 72  ubqueryIsAgg ) r
18820 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
18830 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
18840 72 69 63 74 69 6f 6e 20 28 31 29 20 20 2a 2f 0a  riction (1)  */.
18850 20 20 69 66 28 20 73 75 62 71 75 65 72 79 49 73    if( subqueryIs
18860 41 67 67 20 26 26 20 70 53 72 63 2d 3e 6e 53 72  Agg && pSrc->nSr
18870 63 3e 31 20 29 20 72 65 74 75 72 6e 20 30 3b 20  c>1 ) return 0; 
18880 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
18890 72 69 63 74 69 6f 6e 20 28 32 29 20 20 2a 2f 0a  riction (2)  */.
188a0 20 20 70 53 75 62 53 72 63 20 3d 20 70 53 75 62    pSubSrc = pSub
188b0 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74  ->pSrc;.  assert
188c0 28 20 70 53 75 62 53 72 63 20 29 3b 0a 20 20 2f  ( pSubSrc );.  /
188d0 2a 20 50 72 69 6f 72 20 74 6f 20 76 65 72 73 69  * Prior to versi
188e0 6f 6e 20 33 2e 31 2e 32 2c 20 77 68 65 6e 20 4c  on 3.1.2, when L
188f0 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20  IMIT and OFFSET 
18900 68 61 64 20 74 6f 20 62 65 20 73 69 6d 70 6c 65  had to be simple
18910 20 63 6f 6e 73 74 61 6e 74 73 2c 0a 20 20 2a 2a   constants,.  **
18920 20 6e 6f 74 20 61 72 62 69 74 72 61 72 79 20 65   not arbitrary e
18930 78 70 72 65 73 73 73 69 6f 6e 73 2c 20 77 65 20  xpresssions, we 
18940 61 6c 6c 6f 77 65 64 20 73 6f 6d 65 20 63 6f 6d  allowed some com
18950 62 69 6e 69 6e 67 20 6f 66 20 4c 49 4d 49 54 20  bining of LIMIT 
18960 61 6e 64 20 4f 46 46 53 45 54 0a 20 20 2a 2a 20  and OFFSET.  ** 
18970 62 65 63 61 75 73 65 20 74 68 65 79 20 63 6f 75  because they cou
18980 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64 20 61  ld be computed a
18990 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2e 20  t compile-time. 
189a0 20 42 75 74 20 77 68 65 6e 20 4c 49 4d 49 54 20   But when LIMIT 
189b0 61 6e 64 20 4f 46 46 53 45 54 0a 20 20 2a 2a 20  and OFFSET.  ** 
189c0 62 65 63 61 6d 65 20 61 72 62 69 74 72 61 72 79  became arbitrary
189d0 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 77 65   expressions, we
189e0 20 77 65 72 65 20 66 6f 72 63 65 64 20 74 6f 20   were forced to 
189f0 61 64 64 20 72 65 73 74 72 69 63 74 69 6f 6e 73  add restrictions
18a00 20 28 31 33 29 0a 20 20 2a 2a 20 61 6e 64 20 28   (13).  ** and (
18a10 31 34 29 2e 20 2a 2f 0a 20 20 69 66 28 20 70 53  14). */.  if( pS
18a20 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 70 2d  ub->pLimit && p-
18a30 3e 70 4c 69 6d 69 74 20 29 20 72 65 74 75 72 6e  >pLimit ) return
18a40 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
18a50 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
18a60 28 31 33 29 20 2a 2f 0a 20 20 69 66 28 20 70 53  (13) */.  if( pS
18a70 75 62 2d 3e 70 4f 66 66 73 65 74 20 29 20 72 65  ub->pOffset ) re
18a80 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
18a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18aa0 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
18ab0 28 31 34 29 20 2a 2f 0a 20 20 69 66 28 20 70 2d  (14) */.  if( p-
18ac0 3e 70 52 69 67 68 74 6d 6f 73 74 20 26 26 20 70  >pRightmost && p
18ad0 53 75 62 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20  Sub->pLimit ){. 
18ae0 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20     return 0;    
18af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18b10 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
18b20 69 63 74 69 6f 6e 20 28 31 35 29 20 2a 2f 0a 20  iction (15) */. 
18b30 20 7d 0a 20 20 69 66 28 20 70 53 75 62 53 72 63   }.  if( pSubSrc
18b40 2d 3e 6e 53 72 63 3d 3d 30 20 29 20 72 65 74 75  ->nSrc==0 ) retu
18b50 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
18b60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
18b70 65 73 74 72 69 63 74 69 6f 6e 20 28 37 29 20 20  estriction (7)  
18b80 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 73  */.  if( pSub->s
18b90 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73  elFlags & SF_Dis
18ba0 74 69 6e 63 74 20 29 20 72 65 74 75 72 6e 20 30  tinct ) return 0
18bb0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  ;           /* R
18bc0 65 73 74 72 69 63 74 69 6f 6e 20 28 35 29 20 20  estriction (5)  
18bd0 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70  */.  if( pSub->p
18be0 4c 69 6d 69 74 20 26 26 20 28 70 53 72 63 2d 3e  Limit && (pSrc->
18bf0 6e 53 72 63 3e 31 20 7c 7c 20 69 73 41 67 67 29  nSrc>1 || isAgg)
18c00 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20   ){.     return 
18c10 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  0;         /* Re
18c20 73 74 72 69 63 74 69 6f 6e 73 20 28 38 29 28 39  strictions (8)(9
18c30 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 28  ) */.  }.  if( (
18c40 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
18c50 5f 44 69 73 74 69 6e 63 74 29 21 3d 30 20 26 26  _Distinct)!=0 &&
18c60 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20 29   subqueryIsAgg )
18c70 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  {.     return 0;
18c80 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
18c90 72 69 63 74 69 6f 6e 20 28 36 29 20 20 2a 2f 0a  riction (6)  */.
18ca0 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72    }.  if( p->pOr
18cb0 64 65 72 42 79 20 26 26 20 70 53 75 62 2d 3e 70  derBy && pSub->p
18cc0 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
18cd0 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
18ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18d00 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
18d10 6f 6e 20 28 31 31 29 20 2a 2f 0a 20 20 7d 0a 20  on (11) */.  }. 
18d20 20 69 66 28 20 69 73 41 67 67 20 26 26 20 70 53   if( isAgg && pS
18d30 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 20 72  ub->pOrderBy ) r
18d40 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
18d50 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
18d60 69 63 74 69 6f 6e 20 28 31 36 29 20 2a 2f 0a 20  iction (16) */. 
18d70 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69   if( pSub->pLimi
18d80 74 20 26 26 20 70 2d 3e 70 57 68 65 72 65 20 29  t && p->pWhere )
18d90 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
18da0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
18db0 69 63 74 69 6f 6e 20 28 31 39 29 20 2a 2f 0a 20  iction (19) */. 
18dc0 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69   if( pSub->pLimi
18dd0 74 20 26 26 20 28 70 2d 3e 73 65 6c 46 6c 61 67  t && (p->selFlag
18de0 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 29  s & SF_Distinct)
18df0 21 3d 30 20 29 7b 0a 20 20 20 20 20 72 65 74 75  !=0 ){.     retu
18e00 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a  rn 0;         /*
18e10 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 32 31   Restriction (21
18e20 29 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f  ) */.  }..  /* O
18e30 42 53 4f 4c 45 54 45 20 43 4f 4d 4d 45 4e 54 20  BSOLETE COMMENT 
18e40 31 3a 0a 20 20 2a 2a 20 52 65 73 74 72 69 63 74  1:.  ** Restrict
18e50 69 6f 6e 20 33 3a 20 20 49 66 20 74 68 65 20 73  ion 3:  If the s
18e60 75 62 71 75 65 72 79 20 69 73 20 61 20 6a 6f 69  ubquery is a joi
18e70 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65  n, make sure the
18e80 20 73 75 62 71 75 65 72 79 20 69 73 20 0a 20 20   subquery is .  
18e90 2a 2a 20 6e 6f 74 20 75 73 65 64 20 61 73 20 74  ** not used as t
18ea0 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64  he right operand
18eb0 20 6f 66 20 61 6e 20 6f 75 74 65 72 20 6a 6f 69   of an outer joi
18ec0 6e 2e 20 20 45 78 61 6d 70 6c 65 73 20 6f 66 20  n.  Examples of 
18ed0 77 68 79 20 74 68 69 73 0a 20 20 2a 2a 20 69 73  why this.  ** is
18ee0 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a 20 20   not allowed:.  
18ef0 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20  **.  **         
18f00 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f  t1 LEFT OUTER JO
18f10 49 4e 20 28 74 32 20 4a 4f 49 4e 20 74 33 29 0a  IN (t2 JOIN t3).
18f20 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20    **.  ** If we 
18f30 66 6c 61 74 74 65 6e 20 74 68 65 20 61 62 6f 76  flatten the abov
18f40 65 2c 20 77 65 20 77 6f 75 6c 64 20 67 65 74 0a  e, we would get.
18f50 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20    **.  **       
18f60 20 20 28 74 31 20 4c 45 46 54 20 4f 55 54 45 52    (t1 LEFT OUTER
18f70 20 4a 4f 49 4e 20 74 32 29 20 4a 4f 49 4e 20 74   JOIN t2) JOIN t
18f80 33 0a 20 20 2a 2a 0a 20 20 2a 2a 20 77 68 69 63  3.  **.  ** whic
18f90 68 20 69 73 20 6e 6f 74 20 61 74 20 61 6c 6c 20  h is not at all 
18fa0 74 68 65 20 73 61 6d 65 20 74 68 69 6e 67 2e 0a  the same thing..
18fb0 20 20 2a 2a 0a 20 20 2a 2a 20 4f 42 53 4f 4c 45    **.  ** OBSOLE
18fc0 54 45 20 43 4f 4d 4d 45 4e 54 20 32 3a 0a 20 20  TE COMMENT 2:.  
18fd0 2a 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 31  ** Restriction 1
18fe0 32 3a 20 20 49 66 20 74 68 65 20 73 75 62 71 75  2:  If the subqu
18ff0 65 72 79 20 69 73 20 74 68 65 20 72 69 67 68 74  ery is the right
19000 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 6c 65   operand of a le
19010 66 74 20 6f 75 74 65 72 0a 20 20 2a 2a 20 6a 6f  ft outer.  ** jo
19020 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68  in, make sure th
19030 65 20 73 75 62 71 75 65 72 79 20 68 61 73 20 6e  e subquery has n
19040 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a  o WHERE clause..
19050 20 20 2a 2a 20 41 6e 20 65 78 61 6d 70 6c 65 73    ** An examples
19060 20 6f 66 20 77 68 79 20 74 68 69 73 20 69 73 20   of why this is 
19070 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a  not allowed:.  *
19080 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74  *.  **         t
19090 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  1 LEFT OUTER JOI
190a0 4e 20 28 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  N (SELECT * FROM
190b0 20 74 32 20 57 48 45 52 45 20 74 32 2e 78 3e 30   t2 WHERE t2.x>0
190c0 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 77  ).  **.  ** If w
190d0 65 20 66 6c 61 74 74 65 6e 20 74 68 65 20 61 62  e flatten the ab
190e0 6f 76 65 2c 20 77 65 20 77 6f 75 6c 64 20 67 65  ove, we would ge
190f0 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  t.  **.  **     
19100 20 20 20 20 28 74 31 20 4c 45 46 54 20 4f 55 54      (t1 LEFT OUT
19110 45 52 20 4a 4f 49 4e 20 74 32 29 20 57 48 45 52  ER JOIN t2) WHER
19120 45 20 74 32 2e 78 3e 30 0a 20 20 2a 2a 0a 20 20  E t2.x>0.  **.  
19130 2a 2a 20 42 75 74 20 74 68 65 20 74 32 2e 78 3e  ** But the t2.x>
19140 30 20 74 65 73 74 20 77 69 6c 6c 20 61 6c 77 61  0 test will alwa
19150 79 73 20 66 61 69 6c 20 6f 6e 20 61 20 4e 55 4c  ys fail on a NUL
19160 4c 20 72 6f 77 20 6f 66 20 74 32 2c 20 77 68 69  L row of t2, whi
19170 63 68 0a 20 20 2a 2a 20 65 66 66 65 63 74 69 76  ch.  ** effectiv
19180 65 6c 79 20 63 6f 6e 76 65 72 74 73 20 74 68 65  ely converts the
19190 20 4f 55 54 45 52 20 4a 4f 49 4e 20 69 6e 74 6f   OUTER JOIN into
191a0 20 61 6e 20 49 4e 4e 45 52 20 4a 4f 49 4e 2e 0a   an INNER JOIN..
191b0 20 20 2a 2a 0a 20 20 2a 2a 20 54 48 49 53 20 4f    **.  ** THIS O
191c0 56 45 52 52 49 44 45 53 20 4f 42 53 4f 4c 45 54  VERRIDES OBSOLET
191d0 45 20 43 4f 4d 4d 45 4e 54 53 20 31 20 41 4e 44  E COMMENTS 1 AND
191e0 20 32 20 41 42 4f 56 45 3a 0a 20 20 2a 2a 20 54   2 ABOVE:.  ** T
191f0 69 63 6b 65 74 20 23 33 33 30 30 20 73 68 6f 77  icket #3300 show
19200 73 20 74 68 61 74 20 66 6c 61 74 74 65 6e 69 6e  s that flattenin
19210 67 20 74 68 65 20 72 69 67 68 74 20 74 65 72 6d  g the right term
19220 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 0a   of a LEFT JOIN.
19230 20 20 2a 2a 20 69 73 20 66 72 61 75 67 68 74 20    ** is fraught 
19240 77 69 74 68 20 64 61 6e 67 65 72 2e 20 20 42 65  with danger.  Be
19250 73 74 20 74 6f 20 61 76 6f 69 64 20 74 68 65 20  st to avoid the 
19260 77 68 6f 6c 65 20 74 68 69 6e 67 2e 20 20 49 66  whole thing.  If
19270 20 74 68 65 0a 20 20 2a 2a 20 73 75 62 71 75 65   the.  ** subque
19280 72 79 20 69 73 20 74 68 65 20 72 69 67 68 74 20  ry is the right 
19290 74 65 72 6d 20 6f 66 20 61 20 4c 45 46 54 20 4a  term of a LEFT J
192a0 4f 49 4e 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74  OIN, then do not
192b0 20 66 6c 61 74 74 65 6e 2e 0a 20 20 2a 2f 0a 20   flatten..  */. 
192c0 20 69 66 28 20 28 70 53 75 62 69 74 65 6d 2d 3e   if( (pSubitem->
192d0 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55  jointype & JT_OU
192e0 54 45 52 29 21 3d 30 20 29 7b 0a 20 20 20 20 72  TER)!=0 ){.    r
192f0 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20  eturn 0;.  }..  
19300 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 31  /* Restriction 1
19310 37 3a 20 49 66 20 74 68 65 20 73 75 62 2d 71 75  7: If the sub-qu
19320 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e  ery is a compoun
19330 64 20 53 45 4c 45 43 54 2c 20 74 68 65 6e 20 69  d SELECT, then i
19340 74 20 6d 75 73 74 0a 20 20 2a 2a 20 75 73 65 20  t must.  ** use 
19350 6f 6e 6c 79 20 74 68 65 20 55 4e 49 4f 4e 20 41  only the UNION A
19360 4c 4c 20 6f 70 65 72 61 74 6f 72 2e 20 41 6e 64  LL operator. And
19370 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 73 69 6d   none of the sim
19380 70 6c 65 20 73 65 6c 65 63 74 20 71 75 65 72 69  ple select queri
19390 65 73 0a 20 20 2a 2a 20 74 68 61 74 20 6d 61 6b  es.  ** that mak
193a0 65 20 75 70 20 74 68 65 20 63 6f 6d 70 6f 75 6e  e up the compoun
193b0 64 20 53 45 4c 45 43 54 20 61 72 65 20 61 6c 6c  d SELECT are all
193c0 6f 77 65 64 20 74 6f 20 62 65 20 61 67 67 72 65  owed to be aggre
193d0 67 61 74 65 20 6f 72 20 64 69 73 74 69 6e 63 74  gate or distinct
193e0 0a 20 20 2a 2a 20 71 75 65 72 69 65 73 2e 0a 20  .  ** queries.. 
193f0 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e   */.  if( pSub->
19400 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 69 66  pPrior ){.    if
19410 28 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79  ( pSub->pOrderBy
19420 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
19430 20 30 3b 20 20 2f 2a 20 52 65 73 74 72 69 63 74   0;  /* Restrict
19440 69 6f 6e 20 32 30 20 2a 2f 0a 20 20 20 20 7d 0a  ion 20 */.    }.
19450 20 20 20 20 69 66 28 20 69 73 41 67 67 20 7c 7c      if( isAgg ||
19460 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
19470 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30 20  SF_Distinct)!=0 
19480 7c 7c 20 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31  || pSrc->nSrc!=1
19490 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
194a0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f   0;.    }.    fo
194b0 72 28 70 53 75 62 31 3d 70 53 75 62 3b 20 70 53  r(pSub1=pSub; pS
194c0 75 62 31 3b 20 70 53 75 62 31 3d 70 53 75 62 31  ub1; pSub1=pSub1
194d0 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 20  ->pPrior){.     
194e0 20 74 65 73 74 63 61 73 65 28 20 28 70 53 75 62   testcase( (pSub
194f0 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53  1->selFlags & (S
19500 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67  F_Distinct|SF_Ag
19510 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 44 69  gregate))==SF_Di
19520 73 74 69 6e 63 74 20 29 3b 0a 20 20 20 20 20 20  stinct );.      
19530 74 65 73 74 63 61 73 65 28 20 28 70 53 75 62 31  testcase( (pSub1
19540 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46  ->selFlags & (SF
19550 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67  _Distinct|SF_Agg
19560 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 41 67 67  regate))==SF_Agg
19570 72 65 67 61 74 65 20 29 3b 0a 20 20 20 20 20 20  regate );.      
19580 61 73 73 65 72 74 28 20 70 53 75 62 2d 3e 70 53  assert( pSub->pS
19590 72 63 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  rc!=0 );.      i
195a0 66 28 20 28 70 53 75 62 31 2d 3e 73 65 6c 46 6c  f( (pSub1->selFl
195b0 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e  ags & (SF_Distin
195c0 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29  ct|SF_Aggregate)
195d0 29 21 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 28  )!=0.       || (
195e0 70 53 75 62 31 2d 3e 70 50 72 69 6f 72 20 26 26  pSub1->pPrior &&
195f0 20 70 53 75 62 31 2d 3e 6f 70 21 3d 54 4b 5f 41   pSub1->op!=TK_A
19600 4c 4c 29 20 0a 20 20 20 20 20 20 20 7c 7c 20 70  LL) .       || p
19610 53 75 62 31 2d 3e 70 53 72 63 2d 3e 6e 53 72 63  Sub1->pSrc->nSrc
19620 3c 31 0a 20 20 20 20 20 20 20 7c 7c 20 70 53 75  <1.       || pSu
19630 62 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  b->pEList->nExpr
19640 21 3d 70 53 75 62 31 2d 3e 70 45 4c 69 73 74 2d  !=pSub1->pEList-
19650 3e 6e 45 78 70 72 0a 20 20 20 20 20 20 29 7b 0a  >nExpr.      ){.
19660 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30          return 0
19670 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
19680 74 65 73 74 63 61 73 65 28 20 70 53 75 62 31 2d  testcase( pSub1-
19690 3e 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20 29 3b  >pSrc->nSrc>1 );
196a0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52  .    }..    /* R
196b0 65 73 74 72 69 63 74 69 6f 6e 20 31 38 2e 20 2a  estriction 18. *
196c0 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 72  /.    if( p->pOr
196d0 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 69  derBy ){.      i
196e0 6e 74 20 69 69 3b 0a 20 20 20 20 20 20 66 6f 72  nt ii;.      for
196f0 28 69 69 3d 30 3b 20 69 69 3c 70 2d 3e 70 4f 72  (ii=0; ii<p->pOr
19700 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 69  derBy->nExpr; ii
19710 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
19720 20 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 61 5b   p->pOrderBy->a[
19730 69 69 5d 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3d  ii].iOrderByCol=
19740 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
19750 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
19760 0a 0a 20 20 2f 2a 2a 2a 2a 2a 20 49 66 20 77 65  ..  /***** If we
19770 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e   reach this poin
19780 74 2c 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73  t, flattening is
19790 20 70 65 72 6d 69 74 74 65 64 2e 20 2a 2a 2a 2a   permitted. ****
197a0 2a 2f 0a 0a 20 20 2f 2a 20 41 75 74 68 6f 72 69  */..  /* Authori
197b0 7a 65 20 74 68 65 20 73 75 62 71 75 65 72 79 20  ze the subquery 
197c0 2a 2f 0a 20 20 70 50 61 72 73 65 2d 3e 7a 41 75  */.  pParse->zAu
197d0 74 68 43 6f 6e 74 65 78 74 20 3d 20 70 53 75 62  thContext = pSub
197e0 69 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 54  item->zName;.  T
197f0 45 53 54 4f 4e 4c 59 28 69 20 3d 29 20 73 71 6c  ESTONLY(i =) sql
19800 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
19810 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 53 45 4c  arse, SQLITE_SEL
19820 45 43 54 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  ECT, 0, 0, 0);. 
19830 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d 53 51   testcase( i==SQ
19840 4c 49 54 45 5f 44 45 4e 59 20 29 3b 0a 20 20 70  LITE_DENY );.  p
19850 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74  Parse->zAuthCont
19860 65 78 74 20 3d 20 7a 53 61 76 65 64 41 75 74 68  ext = zSavedAuth
19870 43 6f 6e 74 65 78 74 3b 0a 0a 20 20 2f 2a 20 49  Context;..  /* I
19880 66 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20  f the sub-query 
19890 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45  is a compound SE
198a0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 20  LECT statement, 
198b0 74 68 65 6e 20 28 62 79 20 72 65 73 74 72 69 63  then (by restric
198c0 74 69 6f 6e 73 0a 20 20 2a 2a 20 31 37 20 61 6e  tions.  ** 17 an
198d0 64 20 31 38 20 61 62 6f 76 65 29 20 69 74 20 6d  d 18 above) it m
198e0 75 73 74 20 62 65 20 61 20 55 4e 49 4f 4e 20 41  ust be a UNION A
198f0 4c 4c 20 61 6e 64 20 74 68 65 20 70 61 72 65 6e  LL and the paren
19900 74 20 71 75 65 72 79 20 6d 75 73 74 20 0a 20 20  t query must .  
19910 2a 2a 20 62 65 20 6f 66 20 74 68 65 20 66 6f 72  ** be of the for
19920 6d 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  m:.  **.  **    
19930 20 53 45 4c 45 43 54 20 3c 65 78 70 72 2d 6c 69   SELECT <expr-li
19940 73 74 3e 20 46 52 4f 4d 20 28 3c 73 75 62 2d 71  st> FROM (<sub-q
19950 75 65 72 79 3e 29 20 3c 77 68 65 72 65 2d 63 6c  uery>) <where-cl
19960 61 75 73 65 3e 20 0a 20 20 2a 2a 0a 20 20 2a 2a  ause> .  **.  **
19970 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61 6e 79   followed by any
19980 20 4f 52 44 45 52 20 42 59 2c 20 4c 49 4d 49 54   ORDER BY, LIMIT
19990 20 61 6e 64 2f 6f 72 20 4f 46 46 53 45 54 20 63   and/or OFFSET c
199a0 6c 61 75 73 65 73 2e 20 54 68 69 73 20 62 6c 6f  lauses. This blo
199b0 63 6b 0a 20 20 2a 2a 20 63 72 65 61 74 65 73 20  ck.  ** creates 
199c0 4e 2d 31 20 63 6f 70 69 65 73 20 6f 66 20 74 68  N-1 copies of th
199d0 65 20 70 61 72 65 6e 74 20 71 75 65 72 79 20 77  e parent query w
199e0 69 74 68 6f 75 74 20 61 6e 79 20 4f 52 44 45 52  ithout any ORDER
199f0 20 42 59 2c 20 4c 49 4d 49 54 20 6f 72 20 0a 20   BY, LIMIT or . 
19a00 20 2a 2a 20 4f 46 46 53 45 54 20 63 6c 61 75 73   ** OFFSET claus
19a10 65 73 20 61 6e 64 20 6a 6f 69 6e 73 20 74 68 65  es and joins the
19a20 6d 20 74 6f 20 74 68 65 20 6c 65 66 74 2d 68 61  m to the left-ha
19a30 6e 64 2d 73 69 64 65 20 6f 66 20 74 68 65 20 6f  nd-side of the o
19a40 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 75 73 69  riginal.  ** usi
19a50 6e 67 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65  ng UNION ALL ope
19a60 72 61 74 6f 72 73 2e 20 49 6e 20 74 68 69 73 20  rators. In this 
19a70 63 61 73 65 20 4e 20 69 73 20 74 68 65 20 6e 75  case N is the nu
19a80 6d 62 65 72 20 6f 66 20 73 69 6d 70 6c 65 0a 20  mber of simple. 
19a90 20 2a 2a 20 73 65 6c 65 63 74 20 73 74 61 74 65   ** select state
19aa0 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 63 6f 6d  ments in the com
19ab0 70 6f 75 6e 64 20 73 75 62 2d 71 75 65 72 79 2e  pound sub-query.
19ac0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 61 6d 70  .  **.  ** Examp
19ad0 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  le:.  **.  **   
19ae0 20 20 53 45 4c 45 43 54 20 61 2b 31 20 46 52 4f    SELECT a+1 FRO
19af0 4d 20 28 0a 20 20 2a 2a 20 20 20 20 20 20 20 20  M (.  **        
19b00 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 61  SELECT x FROM ta
19b10 62 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 55 4e  b.  **        UN
19b20 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20  ION ALL.  **    
19b30 20 20 20 20 53 45 4c 45 43 54 20 79 20 46 52 4f      SELECT y FRO
19b40 4d 20 74 61 62 0a 20 20 2a 2a 20 20 20 20 20 20  M tab.  **      
19b50 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a    UNION ALL.  **
19b60 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 61          SELECT a
19b70 62 73 28 7a 2a 32 29 20 46 52 4f 4d 20 74 61 62  bs(z*2) FROM tab
19b80 32 0a 20 20 2a 2a 20 20 20 20 20 29 20 57 48 45  2.  **     ) WHE
19b90 52 45 20 61 21 3d 35 20 4f 52 44 45 52 20 42 59  RE a!=5 ORDER BY
19ba0 20 31 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 72 61   1.  **.  ** Tra
19bb0 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f 3a 0a 20  nsformed into:. 
19bc0 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c   **.  **     SEL
19bd0 45 43 54 20 78 2b 31 20 46 52 4f 4d 20 74 61 62  ECT x+1 FROM tab
19be0 20 57 48 45 52 45 20 78 2b 31 21 3d 35 0a 20 20   WHERE x+1!=5.  
19bf0 2a 2a 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c  **     UNION ALL
19c00 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  .  **     SELECT
19c10 20 79 2b 31 20 46 52 4f 4d 20 74 61 62 20 57 48   y+1 FROM tab WH
19c20 45 52 45 20 79 2b 31 21 3d 35 0a 20 20 2a 2a 20  ERE y+1!=5.  ** 
19c30 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20      UNION ALL.  
19c40 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61 62  **     SELECT ab
19c50 73 28 7a 2a 32 29 2b 31 20 46 52 4f 4d 20 74 61  s(z*2)+1 FROM ta
19c60 62 32 20 57 48 45 52 45 20 61 62 73 28 7a 2a 32  b2 WHERE abs(z*2
19c70 29 2b 31 21 3d 35 0a 20 20 2a 2a 20 20 20 20 20  )+1!=5.  **     
19c80 4f 52 44 45 52 20 42 59 20 31 0a 20 20 2a 2a 0a  ORDER BY 1.  **.
19c90 20 20 2a 2a 20 57 65 20 63 61 6c 6c 20 74 68 69    ** We call thi
19ca0 73 20 74 68 65 20 22 63 6f 6d 70 6f 75 6e 64 2d  s the "compound-
19cb0 73 75 62 71 75 65 72 79 20 66 6c 61 74 74 65 6e  subquery flatten
19cc0 69 6e 67 22 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  ing"..  */.  for
19cd0 28 70 53 75 62 3d 70 53 75 62 2d 3e 70 50 72 69  (pSub=pSub->pPri
19ce0 6f 72 3b 20 70 53 75 62 3b 20 70 53 75 62 3d 70  or; pSub; pSub=p
19cf0 53 75 62 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20  Sub->pPrior){.  
19d00 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a    Select *pNew;.
19d10 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f      ExprList *pO
19d20 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64  rderBy = p->pOrd
19d30 65 72 42 79 3b 0a 20 20 20 20 45 78 70 72 20 2a  erBy;.    Expr *
19d40 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d  pLimit = p->pLim
19d50 69 74 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 4f  it;.    Expr *pO
19d60 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73  ffset = p->pOffs
19d70 65 74 3b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a  et;.    Select *
19d80 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69  pPrior = p->pPri
19d90 6f 72 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65  or;.    p->pOrde
19da0 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e  rBy = 0;.    p->
19db0 70 53 72 63 20 3d 20 30 3b 0a 20 20 20 20 70 2d  pSrc = 0;.    p-
19dc0 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20  >pPrior = 0;.   
19dd0 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a   p->pLimit = 0;.
19de0 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d      p->pOffset =
19df0 20 30 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 73   0;.    pNew = s
19e00 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28  qlite3SelectDup(
19e10 64 62 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20 70  db, p, 0);.    p
19e20 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f 66 66  ->pOffset = pOff
19e30 73 65 74 3b 0a 20 20 20 20 70 2d 3e 70 4c 69 6d  set;.    p->pLim
19e40 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20  it = pLimit;.   
19e50 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70   p->pOrderBy = p
19e60 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 70 2d 3e  OrderBy;.    p->
19e70 70 53 72 63 20 3d 20 70 53 72 63 3b 0a 20 20 20  pSrc = pSrc;.   
19e80 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f 41 4c 4c 3b   p->op = TK_ALL;
19e90 0a 20 20 20 20 70 2d 3e 70 52 69 67 68 74 6d 6f  .    p->pRightmo
19ea0 73 74 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  st = 0;.    if( 
19eb0 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pNew==0 ){.     
19ec0 20 70 4e 65 77 20 3d 20 70 50 72 69 6f 72 3b 0a   pNew = pPrior;.
19ed0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
19ee0 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72 20 3d 20   pNew->pPrior = 
19ef0 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 4e  pPrior;.      pN
19f00 65 77 2d 3e 70 52 69 67 68 74 6d 6f 73 74 20 3d  ew->pRightmost =
19f10 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d   0;.    }.    p-
19f20 3e 70 50 72 69 6f 72 20 3d 20 70 4e 65 77 3b 0a  >pPrior = pNew;.
19f30 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c      if( db->mall
19f40 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72  ocFailed ) retur
19f50 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42  n 1;.  }..  /* B
19f60 65 67 69 6e 20 66 6c 61 74 74 65 6e 69 6e 67 20  egin flattening 
19f70 74 68 65 20 69 46 72 6f 6d 2d 74 68 20 65 6e 74  the iFrom-th ent
19f80 72 79 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63  ry of the FROM c
19f90 6c 61 75 73 65 20 0a 20 20 2a 2a 20 69 6e 20 74  lause .  ** in t
19fa0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a  he outer query..
19fb0 20 20 2a 2f 0a 20 20 70 53 75 62 20 3d 20 70 53    */.  pSub = pS
19fc0 75 62 31 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e  ub1 = pSubitem->
19fd0 70 53 65 6c 65 63 74 3b 0a 0a 20 20 2f 2a 20 44  pSelect;..  /* D
19fe0 65 6c 65 74 65 20 74 68 65 20 74 72 61 6e 73 69  elete the transi
19ff0 65 6e 74 20 74 61 62 6c 65 20 73 74 72 75 63 74  ent table struct
1a000 75 72 65 20 61 73 73 6f 63 69 61 74 65 64 20 77  ure associated w
1a010 69 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 75 62  ith the.  ** sub
1a020 71 75 65 72 79 0a 20 20 2a 2f 0a 20 20 73 71 6c  query.  */.  sql
1a030 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
1a040 53 75 62 69 74 65 6d 2d 3e 7a 44 61 74 61 62 61  Subitem->zDataba
1a050 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  se);.  sqlite3Db
1a060 46 72 65 65 28 64 62 2c 20 70 53 75 62 69 74 65  Free(db, pSubite
1a070 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c  m->zName);.  sql
1a080 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
1a090 53 75 62 69 74 65 6d 2d 3e 7a 41 6c 69 61 73 29  Subitem->zAlias)
1a0a0 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a 44  ;.  pSubitem->zD
1a0b0 61 74 61 62 61 73 65 20 3d 20 30 3b 0a 20 20 70  atabase = 0;.  p
1a0c0 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d  Subitem->zName =
1a0d0 20 30 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e   0;.  pSubitem->
1a0e0 7a 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20 70 53  zAlias = 0;.  pS
1a0f0 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20  ubitem->pSelect 
1a100 3d 20 30 3b 0a 0a 20 20 2f 2a 20 44 65 66 65 72  = 0;..  /* Defer
1a110 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20 54 61   deleting the Ta
1a120 62 6c 65 20 6f 62 6a 65 63 74 20 61 73 73 6f 63  ble object assoc
1a130 69 61 74 65 64 20 77 69 74 68 20 74 68 65 0a 20  iated with the. 
1a140 20 2a 2a 20 73 75 62 71 75 65 72 79 20 75 6e 74   ** subquery unt
1a150 69 6c 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  il code generati
1a160 6f 6e 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 70 6c  on is.  ** compl
1a170 65 74 65 2c 20 73 69 6e 63 65 20 74 68 65 72 65  ete, since there
1a180 20 6d 61 79 20 73 74 69 6c 6c 20 65 78 69 73 74   may still exist
1a190 20 45 78 70 72 2e 70 54 61 62 20 65 6e 74 72 69   Expr.pTab entri
1a1a0 65 73 20 74 68 61 74 0a 20 20 2a 2a 20 72 65 66  es that.  ** ref
1a1b0 65 72 20 74 6f 20 74 68 65 20 73 75 62 71 75 65  er to the subque
1a1c0 72 79 20 65 76 65 6e 20 61 66 74 65 72 20 66 6c  ry even after fl
1a1d0 61 74 74 65 6e 69 6e 67 2e 20 20 54 69 63 6b 65  attening.  Ticke
1a1e0 74 20 23 33 33 34 36 2e 0a 20 20 2a 2a 0a 20 20  t #3346..  **.  
1a1f0 2a 2a 20 70 53 75 62 69 74 65 6d 2d 3e 70 54 61  ** pSubitem->pTa
1a200 62 20 69 73 20 61 6c 77 61 79 73 20 6e 6f 6e 2d  b is always non-
1a210 4e 55 4c 4c 20 62 79 20 74 65 73 74 20 72 65 73  NULL by test res
1a220 74 72 69 63 74 69 6f 6e 73 20 61 6e 64 20 74 65  trictions and te
1a230 73 74 73 20 61 62 6f 76 65 2e 0a 20 20 2a 2f 0a  sts above..  */.
1a240 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 53 75    if( ALWAYS(pSu
1a250 62 69 74 65 6d 2d 3e 70 54 61 62 21 3d 30 29 20  bitem->pTab!=0) 
1a260 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  ){.    Table *pT
1a270 61 62 54 6f 44 65 6c 20 3d 20 70 53 75 62 69 74  abToDel = pSubit
1a280 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 66  em->pTab;.    if
1a290 28 20 70 54 61 62 54 6f 44 65 6c 2d 3e 6e 52 65  ( pTabToDel->nRe
1a2a0 66 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 50 61  f==1 ){.      Pa
1a2b0 72 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d  rse *pToplevel =
1a2c0 20 73 71 6c 69 74 65 33 50 61 72 73 65 54 6f 70   sqlite3ParseTop
1a2d0 6c 65 76 65 6c 28 70 50 61 72 73 65 29 3b 0a 20  level(pParse);. 
1a2e0 20 20 20 20 20 70 54 61 62 54 6f 44 65 6c 2d 3e       pTabToDel->
1a2f0 70 4e 65 78 74 5a 6f 6d 62 69 65 20 3d 20 70 54  pNextZombie = pT
1a300 6f 70 6c 65 76 65 6c 2d 3e 70 5a 6f 6d 62 69 65  oplevel->pZombie
1a310 54 61 62 3b 0a 20 20 20 20 20 20 70 54 6f 70 6c  Tab;.      pTopl
1a320 65 76 65 6c 2d 3e 70 5a 6f 6d 62 69 65 54 61 62  evel->pZombieTab
1a330 20 3d 20 70 54 61 62 54 6f 44 65 6c 3b 0a 20 20   = pTabToDel;.  
1a340 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
1a350 54 61 62 54 6f 44 65 6c 2d 3e 6e 52 65 66 2d 2d  TabToDel->nRef--
1a360 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 75 62  ;.    }.    pSub
1a370 69 74 65 6d 2d 3e 70 54 61 62 20 3d 20 30 3b 0a  item->pTab = 0;.
1a380 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f    }..  /* The fo
1a390 6c 6c 6f 77 69 6e 67 20 6c 6f 6f 70 20 72 75 6e  llowing loop run
1a3a0 73 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20  s once for each 
1a3b0 74 65 72 6d 20 69 6e 20 61 20 63 6f 6d 70 6f 75  term in a compou
1a3c0 6e 64 2d 73 75 62 71 75 65 72 79 0a 20 20 2a 2a  nd-subquery.  **
1a3d0 20 66 6c 61 74 74 65 6e 69 6e 67 20 28 61 73 20   flattening (as 
1a3e0 64 65 73 63 72 69 62 65 64 20 61 62 6f 76 65 29  described above)
1a3f0 2e 20 20 49 66 20 77 65 20 61 72 65 20 64 6f 69  .  If we are doi
1a400 6e 67 20 61 20 64 69 66 66 65 72 65 6e 74 20 6b  ng a different k
1a410 69 6e 64 0a 20 20 2a 2a 20 6f 66 20 66 6c 61 74  ind.  ** of flat
1a420 74 65 6e 69 6e 67 20 2d 20 61 20 66 6c 61 74 74  tening - a flatt
1a430 65 6e 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e  ening other than
1a440 20 61 20 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71   a compound-subq
1a450 75 65 72 79 20 66 6c 61 74 74 65 6e 69 6e 67 20  uery flattening 
1a460 2d 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68 69 73  -.  ** then this
1a470 20 6c 6f 6f 70 20 6f 6e 6c 79 20 72 75 6e 73 20   loop only runs 
1a480 6f 6e 63 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  once..  **.  ** 
1a490 54 68 69 73 20 6c 6f 6f 70 20 6d 6f 76 65 73 20  This loop moves 
1a4a0 61 6c 6c 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  all of the FROM 
1a4b0 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20  elements of the 
1a4c0 73 75 62 71 75 65 72 79 20 69 6e 74 6f 20 74 68  subquery into th
1a4d0 65 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20  e.  ** the FROM 
1a4e0 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75  clause of the ou
1a4f0 74 65 72 20 71 75 65 72 79 2e 20 20 42 65 66 6f  ter query.  Befo
1a500 72 65 20 64 6f 69 6e 67 20 74 68 69 73 2c 20 72  re doing this, r
1a510 65 6d 65 6d 62 65 72 0a 20 20 2a 2a 20 74 68 65  emember.  ** the
1a520 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66   cursor number f
1a530 6f 72 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  or the original 
1a540 6f 75 74 65 72 20 71 75 65 72 79 20 46 52 4f 4d  outer query FROM
1a550 20 65 6c 65 6d 65 6e 74 20 69 6e 0a 20 20 2a 2a   element in.  **
1a560 20 69 50 61 72 65 6e 74 2e 20 20 54 68 65 20 69   iParent.  The i
1a570 50 61 72 65 6e 74 20 63 75 72 73 6f 72 20 77 69  Parent cursor wi
1a580 6c 6c 20 6e 65 76 65 72 20 62 65 20 75 73 65 64  ll never be used
1a590 2e 20 20 53 75 62 73 65 71 75 65 6e 74 20 63 6f  .  Subsequent co
1a5a0 64 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 73 63 61  de.  ** will sca
1a5b0 6e 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6c 6f  n expressions lo
1a5c0 6f 6b 69 6e 67 20 66 6f 72 20 69 50 61 72 65 6e  oking for iParen
1a5d0 74 20 72 65 66 65 72 65 6e 63 65 73 20 61 6e 64  t references and
1a5e0 20 72 65 70 6c 61 63 65 0a 20 20 2a 2a 20 74 68   replace.  ** th
1a5f0 6f 73 65 20 72 65 66 65 72 65 6e 63 65 73 20 77  ose references w
1a600 69 74 68 20 65 78 70 72 65 73 73 69 6f 6e 73 20  ith expressions 
1a610 74 68 61 74 20 72 65 73 6f 6c 76 65 20 74 6f 20  that resolve to 
1a620 74 68 65 20 73 75 62 71 75 65 72 79 20 46 52 4f  the subquery FRO
1a630 4d 0a 20 20 2a 2a 20 65 6c 65 6d 65 6e 74 73 20  M.  ** elements 
1a640 77 65 20 61 72 65 20 6e 6f 77 20 63 6f 70 79 69  we are now copyi
1a650 6e 67 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 66 6f  ng in..  */.  fo
1a660 72 28 70 50 61 72 65 6e 74 3d 70 3b 20 70 50 61  r(pParent=p; pPa
1a670 72 65 6e 74 3b 20 70 50 61 72 65 6e 74 3d 70 50  rent; pParent=pP
1a680 61 72 65 6e 74 2d 3e 70 50 72 69 6f 72 2c 20 70  arent->pPrior, p
1a690 53 75 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72  Sub=pSub->pPrior
1a6a0 29 7b 0a 20 20 20 20 69 6e 74 20 6e 53 75 62 53  ){.    int nSubS
1a6b0 72 63 3b 0a 20 20 20 20 75 38 20 6a 6f 69 6e 74  rc;.    u8 joint
1a6c0 79 70 65 20 3d 20 30 3b 0a 20 20 20 20 70 53 75  ype = 0;.    pSu
1a6d0 62 53 72 63 20 3d 20 70 53 75 62 2d 3e 70 53 72  bSrc = pSub->pSr
1a6e0 63 3b 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63  c;     /* FROM c
1a6f0 6c 61 75 73 65 20 6f 66 20 73 75 62 71 75 65 72  lause of subquer
1a700 79 20 2a 2f 0a 20 20 20 20 6e 53 75 62 53 72 63  y */.    nSubSrc
1a710 20 3d 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63   = pSubSrc->nSrc
1a720 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20  ;  /* Number of 
1a730 74 65 72 6d 73 20 69 6e 20 73 75 62 71 75 65 72  terms in subquer
1a740 79 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  y FROM clause */
1a750 0a 20 20 20 20 70 53 72 63 20 3d 20 70 50 61 72  .    pSrc = pPar
1a760 65 6e 74 2d 3e 70 53 72 63 3b 20 20 20 20 20 2f  ent->pSrc;     /
1a770 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  * FROM clause of
1a780 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1a790 20 2a 2f 0a 0a 20 20 20 20 69 66 28 20 70 53 72   */..    if( pSr
1a7a0 63 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  c ){.      asser
1a7b0 74 28 20 70 50 61 72 65 6e 74 3d 3d 70 20 29 3b  t( pParent==p );
1a7c0 20 20 2f 2a 20 46 69 72 73 74 20 74 69 6d 65 20    /* First time 
1a7d0 74 68 72 6f 75 67 68 20 74 68 65 20 6c 6f 6f 70  through the loop
1a7e0 20 2a 2f 0a 20 20 20 20 20 20 6a 6f 69 6e 74 79   */.      jointy
1a7f0 70 65 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 6a  pe = pSubitem->j
1a800 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20 7d 65 6c  ointype;.    }el
1a810 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
1a820 28 20 70 50 61 72 65 6e 74 21 3d 70 20 29 3b 20  ( pParent!=p ); 
1a830 20 2f 2a 20 32 6e 64 20 61 6e 64 20 73 75 62 73   /* 2nd and subs
1a840 65 71 75 65 6e 74 20 74 69 6d 65 73 20 74 68 72  equent times thr
1a850 6f 75 67 68 20 74 68 65 20 6c 6f 6f 70 20 2a 2f  ough the loop */
1a860 0a 20 20 20 20 20 20 70 53 72 63 20 3d 20 70 50  .      pSrc = pP
1a870 61 72 65 6e 74 2d 3e 70 53 72 63 20 3d 20 73 71  arent->pSrc = sq
1a880 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65  lite3SrcListAppe
1a890 6e 64 28 64 62 2c 20 30 2c 20 30 2c 20 30 29 3b  nd(db, 0, 0, 0);
1a8a0 0a 20 20 20 20 20 20 69 66 28 20 70 53 72 63 3d  .      if( pSrc=
1a8b0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  =0 ){.        as
1a8c0 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63  sert( db->malloc
1a8d0 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20  Failed );.      
1a8e0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
1a8f0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54  .    }..    /* T
1a900 68 65 20 73 75 62 71 75 65 72 79 20 75 73 65 73  he subquery uses
1a910 20 61 20 73 69 6e 67 6c 65 20 73 6c 6f 74 20 6f   a single slot o
1a920 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  f the FROM claus
1a930 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72 0a 20  e of the outer. 
1a940 20 20 20 2a 2a 20 71 75 65 72 79 2e 20 20 49 66     ** query.  If
1a950 20 74 68 65 20 73 75 62 71 75 65 72 79 20 68 61   the subquery ha
1a960 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  s more than one 
1a970 65 6c 65 6d 65 6e 74 20 69 6e 20 69 74 73 20 46  element in its F
1a980 52 4f 4d 20 63 6c 61 75 73 65 2c 0a 20 20 20 20  ROM clause,.    
1a990 2a 2a 20 74 68 65 6e 20 65 78 70 61 6e 64 20 74  ** then expand t
1a9a0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 74  he outer query t
1a9b0 6f 20 6d 61 6b 65 20 73 70 61 63 65 20 66 6f 72  o make space for
1a9c0 20 69 74 20 74 6f 20 68 6f 6c 64 20 61 6c 6c 20   it to hold all 
1a9d0 65 6c 65 6d 65 6e 74 73 0a 20 20 20 20 2a 2a 20  elements.    ** 
1a9e0 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79 2e  of the subquery.
1a9f0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45  .    **.    ** E
1aa00 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20  xample:.    **. 
1aa10 20 20 20 2a 2a 20 20 20 20 53 45 4c 45 43 54 20     **    SELECT 
1aa20 2a 20 46 52 4f 4d 20 74 61 62 41 2c 20 28 53 45  * FROM tabA, (SE
1aa30 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73 75 62 31  LECT * FROM sub1
1aa40 2c 20 73 75 62 32 29 2c 20 74 61 62 42 3b 0a 20  , sub2), tabB;. 
1aa50 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
1aa60 20 6f 75 74 65 72 20 71 75 65 72 79 20 68 61 73   outer query has
1aa70 20 33 20 73 6c 6f 74 73 20 69 6e 20 69 74 73 20   3 slots in its 
1aa80 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 4f 6e  FROM clause.  On
1aa90 65 20 73 6c 6f 74 20 6f 66 20 74 68 65 0a 20 20  e slot of the.  
1aaa0 20 20 2a 2a 20 6f 75 74 65 72 20 71 75 65 72 79    ** outer query
1aab0 20 28 74 68 65 20 6d 69 64 64 6c 65 20 73 6c 6f   (the middle slo
1aac0 74 29 20 69 73 20 75 73 65 64 20 62 79 20 74 68  t) is used by th
1aad0 65 20 73 75 62 71 75 65 72 79 2e 20 20 54 68 65  e subquery.  The
1aae0 20 6e 65 78 74 0a 20 20 20 20 2a 2a 20 62 6c 6f   next.    ** blo
1aaf0 63 6b 20 6f 66 20 63 6f 64 65 20 77 69 6c 6c 20  ck of code will 
1ab00 65 78 70 61 6e 64 20 74 68 65 20 6f 75 74 20 71  expand the out q
1ab10 75 65 72 79 20 74 6f 20 34 20 73 6c 6f 74 73 2e  uery to 4 slots.
1ab20 20 20 54 68 65 20 6d 69 64 64 6c 65 0a 20 20 20    The middle.   
1ab30 20 2a 2a 20 73 6c 6f 74 20 69 73 20 65 78 70 61   ** slot is expa
1ab40 6e 64 65 64 20 74 6f 20 74 77 6f 20 73 6c 6f 74  nded to two slot
1ab50 73 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6d 61  s in order to ma
1ab60 6b 65 20 73 70 61 63 65 20 66 6f 72 20 74 68 65  ke space for the
1ab70 0a 20 20 20 20 2a 2a 20 74 77 6f 20 65 6c 65 6d  .    ** two elem
1ab80 65 6e 74 73 20 69 6e 20 74 68 65 20 46 52 4f 4d  ents in the FROM
1ab90 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 73   clause of the s
1aba0 75 62 71 75 65 72 79 2e 0a 20 20 20 20 2a 2f 0a  ubquery..    */.
1abb0 20 20 20 20 69 66 28 20 6e 53 75 62 53 72 63 3e      if( nSubSrc>
1abc0 31 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 65  1 ){.      pPare
1abd0 6e 74 2d 3e 70 53 72 63 20 3d 20 70 53 72 63 20  nt->pSrc = pSrc 
1abe0 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  = sqlite3SrcList
1abf0 45 6e 6c 61 72 67 65 28 64 62 2c 20 70 53 72 63  Enlarge(db, pSrc
1ac00 2c 20 6e 53 75 62 53 72 63 2d 31 2c 69 46 72 6f  , nSubSrc-1,iFro
1ac10 6d 2b 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20  m+1);.      if( 
1ac20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1ac30 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61   ){.        brea
1ac40 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
1ac50 0a 0a 20 20 20 20 2f 2a 20 54 72 61 6e 73 66 65  ..    /* Transfe
1ac60 72 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  r the FROM claus
1ac70 65 20 74 65 72 6d 73 20 66 72 6f 6d 20 74 68 65  e terms from the
1ac80 20 73 75 62 71 75 65 72 79 20 69 6e 74 6f 20 74   subquery into t
1ac90 68 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72 20  he.    ** outer 
1aca0 71 75 65 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  query..    */.  
1acb0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 75    for(i=0; i<nSu
1acc0 62 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  bSrc; i++){.    
1acd0 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44    sqlite3IdListD
1ace0 65 6c 65 74 65 28 64 62 2c 20 70 53 72 63 2d 3e  elete(db, pSrc->
1acf0 61 5b 69 2b 69 46 72 6f 6d 5d 2e 70 55 73 69 6e  a[i+iFrom].pUsin
1ad00 67 29 3b 0a 20 20 20 20 20 20 70 53 72 63 2d 3e  g);.      pSrc->
1ad10 61 5b 69 2b 69 46 72 6f 6d 5d 20 3d 20 70 53 75  a[i+iFrom] = pSu
1ad20 62 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  bSrc->a[i];.    
1ad30 20 20 6d 65 6d 73 65 74 28 26 70 53 75 62 53 72    memset(&pSubSr
1ad40 63 2d 3e 61 5b 69 5d 2c 20 30 2c 20 73 69 7a 65  c->a[i], 0, size
1ad50 6f 66 28 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d  of(pSubSrc->a[i]
1ad60 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53  ));.    }.    pS
1ad70 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 6a 6f 69  rc->a[iFrom].joi
1ad80 6e 74 79 70 65 20 3d 20 6a 6f 69 6e 74 79 70 65  ntype = jointype
1ad90 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 4e 6f 77 20  ;.  .    /* Now 
1ada0 62 65 67 69 6e 20 73 75 62 73 74 69 74 75 74 69  begin substituti
1adb0 6e 67 20 73 75 62 71 75 65 72 79 20 72 65 73 75  ng subquery resu
1adc0 6c 74 20 73 65 74 20 65 78 70 72 65 73 73 69 6f  lt set expressio
1add0 6e 73 20 66 6f 72 20 0a 20 20 20 20 2a 2a 20 72  ns for .    ** r
1ade0 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65  eferences to the
1adf0 20 69 50 61 72 65 6e 74 20 69 6e 20 74 68 65 20   iParent in the 
1ae00 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20 20  outer query..   
1ae10 20 2a 2a 20 0a 20 20 20 20 2a 2a 20 45 78 61 6d   ** .    ** Exam
1ae20 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ple:.    **.    
1ae30 2a 2a 20 20 20 53 45 4c 45 43 54 20 61 2b 35 2c  **   SELECT a+5,
1ae40 20 62 2a 31 30 20 46 52 4f 4d 20 28 53 45 4c 45   b*10 FROM (SELE
1ae50 43 54 20 78 2a 33 20 41 53 20 61 2c 20 79 2b 31  CT x*3 AS a, y+1
1ae60 30 20 41 53 20 62 20 46 52 4f 4d 20 74 31 29 20  0 AS b FROM t1) 
1ae70 57 48 45 52 45 20 61 3e 62 3b 0a 20 20 20 20 2a  WHERE a>b;.    *
1ae80 2a 20 20 20 5c 20 20 20 20 20 20 20 20 20 20 20  *   \           
1ae90 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f            \_____
1aea0 5f 5f 5f 5f 5f 5f 5f 5f 20 73 75 62 71 75 65 72  ________ subquer
1aeb0 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20  y __________/   
1aec0 20 20 20 20 20 20 20 2f 0a 20 20 20 20 2a 2a 20         /.    ** 
1aed0 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f     \____________
1aee0 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65 72 20  _________ outer 
1aef0 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  query __________
1af00 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
1af10 5f 5f 5f 5f 2f 0a 20 20 20 20 2a 2a 0a 20 20 20  ____/.    **.   
1af20 20 2a 2a 20 57 65 20 6c 6f 6f 6b 20 61 74 20 65   ** We look at e
1af30 76 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20  very expression 
1af40 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  in the outer que
1af50 72 79 20 61 6e 64 20 65 76 65 72 79 20 70 6c 61  ry and every pla
1af60 63 65 20 77 65 20 73 65 65 0a 20 20 20 20 2a 2a  ce we see.    **
1af70 20 22 61 22 20 77 65 20 73 75 62 73 74 69 74 75   "a" we substitu
1af80 74 65 20 22 78 2a 33 22 20 61 6e 64 20 65 76 65  te "x*3" and eve
1af90 72 79 20 70 6c 61 63 65 20 77 65 20 73 65 65 20  ry place we see 
1afa0 22 62 22 20 77 65 20 73 75 62 73 74 69 74 75 74  "b" we substitut
1afb0 65 20 22 79 2b 31 30 22 2e 0a 20 20 20 20 2a 2f  e "y+10"..    */
1afc0 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70 50 61  .    pList = pPa
1afd0 72 65 6e 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20  rent->pEList;.  
1afe0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69    for(i=0; i<pLi
1aff0 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
1b000 0a 20 20 20 20 20 20 69 66 28 20 70 4c 69 73 74  .      if( pList
1b010 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3d 3d 30 20  ->a[i].zName==0 
1b020 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
1b030 2a 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  *zName = sqlite3
1b040 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4c 69  DbStrDup(db, pLi
1b050 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 29 3b  st->a[i].zSpan);
1b060 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1b070 44 65 71 75 6f 74 65 28 7a 4e 61 6d 65 29 3b 0a  Dequote(zName);.
1b080 20 20 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 61          pList->a
1b090 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d  [i].zName = zNam
1b0a0 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  e;.      }.    }
1b0b0 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 4c 69  .    substExprLi
1b0c0 73 74 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e  st(db, pParent->
1b0d0 70 45 4c 69 73 74 2c 20 69 50 61 72 65 6e 74 2c  pEList, iParent,
1b0e0 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a   pSub->pEList);.
1b0f0 20 20 20 20 69 66 28 20 69 73 41 67 67 20 29 7b      if( isAgg ){
1b100 0a 20 20 20 20 20 20 73 75 62 73 74 45 78 70 72  .      substExpr
1b110 4c 69 73 74 28 64 62 2c 20 70 50 61 72 65 6e 74  List(db, pParent
1b120 2d 3e 70 47 72 6f 75 70 42 79 2c 20 69 50 61 72  ->pGroupBy, iPar
1b130 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73  ent, pSub->pELis
1b140 74 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e  t);.      pParen
1b150 74 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 75 62  t->pHaving = sub
1b160 73 74 45 78 70 72 28 64 62 2c 20 70 50 61 72 65  stExpr(db, pPare
1b170 6e 74 2d 3e 70 48 61 76 69 6e 67 2c 20 69 50 61  nt->pHaving, iPa
1b180 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69  rent, pSub->pELi
1b190 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  st);.    }.    i
1b1a0 66 28 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42  f( pSub->pOrderB
1b1b0 79 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  y ){.      asser
1b1c0 74 28 20 70 50 61 72 65 6e 74 2d 3e 70 4f 72 64  t( pParent->pOrd
1b1d0 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20  erBy==0 );.     
1b1e0 20 70 50 61 72 65 6e 74 2d 3e 70 4f 72 64 65 72   pParent->pOrder
1b1f0 42 79 20 3d 20 70 53 75 62 2d 3e 70 4f 72 64 65  By = pSub->pOrde
1b200 72 42 79 3b 0a 20 20 20 20 20 20 70 53 75 62 2d  rBy;.      pSub-
1b210 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20  >pOrderBy = 0;. 
1b220 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61     }else if( pPa
1b230 72 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79 20 29  rent->pOrderBy )
1b240 7b 0a 20 20 20 20 20 20 73 75 62 73 74 45 78 70  {.      substExp
1b250 72 4c 69 73 74 28 64 62 2c 20 70 50 61 72 65 6e  rList(db, pParen
1b260 74 2d 3e 70 4f 72 64 65 72 42 79 2c 20 69 50 61  t->pOrderBy, iPa
1b270 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69  rent, pSub->pELi
1b280 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  st);.    }.    i
1b290 66 28 20 70 53 75 62 2d 3e 70 57 68 65 72 65 20  f( pSub->pWhere 
1b2a0 29 7b 0a 20 20 20 20 20 20 70 57 68 65 72 65 20  ){.      pWhere 
1b2b0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
1b2c0 28 64 62 2c 20 70 53 75 62 2d 3e 70 57 68 65 72  (db, pSub->pWher
1b2d0 65 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65  e, 0);.    }else
1b2e0 7b 0a 20 20 20 20 20 20 70 57 68 65 72 65 20 3d  {.      pWhere =
1b2f0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   0;.    }.    if
1b300 28 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20  ( subqueryIsAgg 
1b310 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
1b320 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e   pParent->pHavin
1b330 67 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50  g==0 );.      pP
1b340 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 20 3d  arent->pHaving =
1b350 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65   pParent->pWhere
1b360 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d  ;.      pParent-
1b370 3e 70 57 68 65 72 65 20 3d 20 70 57 68 65 72 65  >pWhere = pWhere
1b380 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d  ;.      pParent-
1b390 3e 70 48 61 76 69 6e 67 20 3d 20 73 75 62 73 74  >pHaving = subst
1b3a0 45 78 70 72 28 64 62 2c 20 70 50 61 72 65 6e 74  Expr(db, pParent
1b3b0 2d 3e 70 48 61 76 69 6e 67 2c 20 69 50 61 72 65  ->pHaving, iPare
1b3c0 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74  nt, pSub->pEList
1b3d0 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74  );.      pParent
1b3e0 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 71 6c 69  ->pHaving = sqli
1b3f0 74 65 33 45 78 70 72 41 6e 64 28 64 62 2c 20 70  te3ExprAnd(db, p
1b400 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 2c  Parent->pHaving,
1b410 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
1b420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b430 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
1b440 75 70 28 64 62 2c 20 70 53 75 62 2d 3e 70 48 61  up(db, pSub->pHa
1b450 76 69 6e 67 2c 20 30 29 29 3b 0a 20 20 20 20 20  ving, 0));.     
1b460 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74   assert( pParent
1b470 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b  ->pGroupBy==0 );
1b480 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e  .      pParent->
1b490 70 47 72 6f 75 70 42 79 20 3d 20 73 71 6c 69 74  pGroupBy = sqlit
1b4a0 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62  e3ExprListDup(db
1b4b0 2c 20 70 53 75 62 2d 3e 70 47 72 6f 75 70 42 79  , pSub->pGroupBy
1b4c0 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , 0);.    }else{
1b4d0 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e  .      pParent->
1b4e0 70 57 68 65 72 65 20 3d 20 73 75 62 73 74 45 78  pWhere = substEx
1b4f0 70 72 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e  pr(db, pParent->
1b500 70 57 68 65 72 65 2c 20 69 50 61 72 65 6e 74 2c  pWhere, iParent,
1b510 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a   pSub->pEList);.
1b520 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70        pParent->p
1b530 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45  Where = sqlite3E
1b540 78 70 72 41 6e 64 28 64 62 2c 20 70 50 61 72 65  xprAnd(db, pPare
1b550 6e 74 2d 3e 70 57 68 65 72 65 2c 20 70 57 68 65  nt->pWhere, pWhe
1b560 72 65 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20  re);.    }.  .  
1b570 20 20 2f 2a 20 54 68 65 20 66 6c 61 74 74 65 6e    /* The flatten
1b580 65 64 20 71 75 65 72 79 20 69 73 20 64 69 73 74  ed query is dist
1b590 69 6e 63 74 20 69 66 20 65 69 74 68 65 72 20 74  inct if either t
1b5a0 68 65 20 69 6e 6e 65 72 20 6f 72 20 74 68 65 0a  he inner or the.
1b5b0 20 20 20 20 2a 2a 20 6f 75 74 65 72 20 71 75 65      ** outer que
1b5c0 72 79 20 69 73 20 64 69 73 74 69 6e 63 74 2e 20  ry is distinct. 
1b5d0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 72  .    */.    pPar
1b5e0 65 6e 74 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d  ent->selFlags |=
1b5f0 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20   pSub->selFlags 
1b600 26 20 53 46 5f 44 69 73 74 69 6e 63 74 3b 0a 20  & SF_Distinct;. 
1b610 20 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20   .    /*.    ** 
1b620 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20  SELECT ... FROM 
1b630 28 53 45 4c 45 43 54 20 2e 2e 2e 20 4c 49 4d 49  (SELECT ... LIMI
1b640 54 20 61 20 4f 46 46 53 45 54 20 62 29 20 4c 49  T a OFFSET b) LI
1b650 4d 49 54 20 78 20 4f 46 46 53 45 54 20 79 3b 0a  MIT x OFFSET y;.
1b660 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f 6e      **.    ** On
1b670 65 20 69 73 20 74 65 6d 70 74 65 64 20 74 6f 20  e is tempted to 
1b680 74 72 79 20 74 6f 20 61 64 64 20 61 20 61 6e 64  try to add a and
1b690 20 62 20 74 6f 20 63 6f 6d 62 69 6e 65 20 74 68   b to combine th
1b6a0 65 20 6c 69 6d 69 74 73 2e 20 20 42 75 74 20 74  e limits.  But t
1b6b0 68 69 73 0a 20 20 20 20 2a 2a 20 64 6f 65 73 20  his.    ** does 
1b6c0 6e 6f 74 20 77 6f 72 6b 20 69 66 20 65 69 74 68  not work if eith
1b6d0 65 72 20 6c 69 6d 69 74 20 69 73 20 6e 65 67 61  er limit is nega
1b6e0 74 69 76 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tive..    */.   
1b6f0 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69   if( pSub->pLimi
1b700 74 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 65  t ){.      pPare
1b710 6e 74 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 53 75  nt->pLimit = pSu
1b720 62 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20  b->pLimit;.     
1b730 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 3d 20   pSub->pLimit = 
1b740 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  0;.    }.  }..  
1b750 2f 2a 20 46 69 6e 69 61 6c 6c 79 2c 20 64 65 6c  /* Finially, del
1b760 65 74 65 20 77 68 61 74 20 69 73 20 6c 65 66 74  ete what is left
1b770 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79   of the subquery
1b780 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20 2a 2a   and return.  **
1b790 20 73 75 63 63 65 73 73 2e 0a 20 20 2a 2f 0a 20   success..  */. 
1b7a0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
1b7b0 6c 65 74 65 28 64 62 2c 20 70 53 75 62 31 29 3b  lete(db, pSub1);
1b7c0 0a 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  ..  return 1;.}.
1b7d0 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e  #endif /* !defin
1b7e0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
1b7f0 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66  UBQUERY) || !def
1b800 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
1b810 5f 56 49 45 57 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _VIEW) */../*.**
1b820 20 42 61 73 65 64 20 6f 6e 20 74 68 65 20 63 6f   Based on the co
1b830 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 41 67  ntents of the Ag
1b840 67 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  gInfo structure 
1b850 69 6e 64 69 63 61 74 65 64 20 62 79 20 74 68 65  indicated by the
1b860 20 66 69 72 73 74 0a 2a 2a 20 61 72 67 75 6d 65   first.** argume
1b870 6e 74 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  nt, this functio
1b880 6e 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 20  n checks if the 
1b890 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72  following are tr
1b8a0 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 74  ue:.**.**    * t
1b8b0 68 65 20 71 75 65 72 79 20 63 6f 6e 74 61 69 6e  he query contain
1b8c0 73 20 6a 75 73 74 20 61 20 73 69 6e 67 6c 65 20  s just a single 
1b8d0 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
1b8e0 6f 6e 2c 0a 2a 2a 20 20 20 20 2a 20 74 68 65 20  on,.**    * the 
1b8f0 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
1b900 6f 6e 20 69 73 20 65 69 74 68 65 72 20 6d 69 6e  on is either min
1b910 28 29 20 6f 72 20 6d 61 78 28 29 2c 20 61 6e 64  () or max(), and
1b920 0a 2a 2a 20 20 20 20 2a 20 74 68 65 20 61 72 67  .**    * the arg
1b930 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 61 67 67  ument to the agg
1b940 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20  regate function 
1b950 69 73 20 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75  is a column valu
1b960 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6c 6c 20  e..**.** If all 
1b970 6f 66 20 74 68 65 20 61 62 6f 76 65 20 61 72 65  of the above are
1b980 20 74 72 75 65 2c 20 74 68 65 6e 20 57 48 45 52   true, then WHER
1b990 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 20 6f 72  E_ORDERBY_MIN or
1b9a0 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d   WHERE_ORDERBY_M
1b9b0 41 58 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65  AX.** is returne
1b9c0 64 20 61 73 20 61 70 70 72 6f 70 72 69 61 74 65  d as appropriate
1b9d0 2e 20 41 6c 73 6f 2c 20 2a 70 70 4d 69 6e 4d 61  . Also, *ppMinMa
1b9e0 78 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e  x is set to poin
1b9f0 74 20 74 6f 20 74 68 65 20 0a 2a 2a 20 6c 69 73  t to the .** lis
1ba00 74 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 70  t of arguments p
1ba10 61 73 73 65 64 20 74 6f 20 74 68 65 20 61 67 67  assed to the agg
1ba20 72 65 67 61 74 65 20 62 65 66 6f 72 65 20 72 65  regate before re
1ba30 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 4f  turning..**.** O
1ba40 72 2c 20 69 66 20 74 68 65 20 63 6f 6e 64 69 74  r, if the condit
1ba50 69 6f 6e 73 20 61 62 6f 76 65 20 61 72 65 20 6e  ions above are n
1ba60 6f 74 20 6d 65 74 2c 20 2a 70 70 4d 69 6e 4d 61  ot met, *ppMinMa
1ba70 78 20 69 73 20 73 65 74 20 74 6f 20 30 20 61 6e  x is set to 0 an
1ba80 64 0a 2a 2a 20 57 48 45 52 45 5f 4f 52 44 45 52  d.** WHERE_ORDER
1ba90 42 59 5f 4e 4f 52 4d 41 4c 20 69 73 20 72 65 74  BY_NORMAL is ret
1baa0 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
1bab0 20 75 38 20 6d 69 6e 4d 61 78 51 75 65 72 79 28   u8 minMaxQuery(
1bac0 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66  AggInfo *pAggInf
1bad0 6f 2c 20 45 78 70 72 4c 69 73 74 20 2a 2a 70 70  o, ExprList **pp
1bae0 4d 69 6e 4d 61 78 29 7b 0a 20 20 69 6e 74 20 65  MinMax){.  int e
1baf0 52 65 74 20 3d 20 57 48 45 52 45 5f 4f 52 44 45  Ret = WHERE_ORDE
1bb00 52 42 59 5f 4e 4f 52 4d 41 4c 3b 20 20 20 20 20  RBY_NORMAL;     
1bb10 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 76       /* Return v
1bb20 61 6c 75 65 20 2a 2f 0a 0a 20 20 2a 70 70 4d 69  alue */..  *ppMi
1bb30 6e 4d 61 78 20 3d 20 30 3b 0a 20 20 69 66 28 20  nMax = 0;.  if( 
1bb40 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3d  pAggInfo->nFunc=
1bb50 3d 31 20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  =1 ){.    Expr *
1bb60 70 45 78 70 72 20 3d 20 70 41 67 67 49 6e 66 6f  pExpr = pAggInfo
1bb70 2d 3e 61 46 75 6e 63 5b 30 5d 2e 70 45 78 70 72  ->aFunc[0].pExpr
1bb80 3b 20 2f 2a 20 41 67 67 72 65 67 61 74 65 20 66  ; /* Aggregate f
1bb90 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 45  unction */.    E
1bba0 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20  xprList *pEList 
1bbb0 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  = pExpr->x.pList
1bbc0 3b 20 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65  ;      /* Argume
1bbd0 6e 74 73 20 74 6f 20 61 67 67 20 66 75 6e 63 74  nts to agg funct
1bbe0 69 6f 6e 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65  ion */..    asse
1bbf0 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  rt( pExpr->op==T
1bc00 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29  K_AGG_FUNCTION )
1bc10 3b 0a 20 20 20 20 69 66 28 20 70 45 4c 69 73 74  ;.    if( pEList
1bc20 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70   && pEList->nExp
1bc30 72 3d 3d 31 20 26 26 20 70 45 4c 69 73 74 2d 3e  r==1 && pEList->
1bc40 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 3d 3d  a[0].pExpr->op==
1bc50 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 7b  TK_AGG_COLUMN ){
1bc60 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
1bc70 72 20 2a 7a 46 75 6e 63 20 3d 20 70 45 78 70 72  r *zFunc = pExpr
1bc80 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20  ->u.zToken;.    
1bc90 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
1bca0 49 43 6d 70 28 7a 46 75 6e 63 2c 20 22 6d 69 6e  ICmp(zFunc, "min
1bcb0 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
1bcc0 20 65 52 65 74 20 3d 20 57 48 45 52 45 5f 4f 52   eRet = WHERE_OR
1bcd0 44 45 52 42 59 5f 4d 49 4e 3b 0a 20 20 20 20 20  DERBY_MIN;.     
1bce0 20 20 20 2a 70 70 4d 69 6e 4d 61 78 20 3d 20 70     *ppMinMax = p
1bcf0 45 4c 69 73 74 3b 0a 20 20 20 20 20 20 7d 65 6c  EList;.      }el
1bd00 73 65 20 69 66 28 20 73 71 6c 69 74 65 33 53 74  se if( sqlite3St
1bd10 72 49 43 6d 70 28 7a 46 75 6e 63 2c 20 22 6d 61  rICmp(zFunc, "ma
1bd20 78 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  x")==0 ){.      
1bd30 20 20 65 52 65 74 20 3d 20 57 48 45 52 45 5f 4f    eRet = WHERE_O
1bd40 52 44 45 52 42 59 5f 4d 41 58 3b 0a 20 20 20 20  RDERBY_MAX;.    
1bd50 20 20 20 20 2a 70 70 4d 69 6e 4d 61 78 20 3d 20      *ppMinMax = 
1bd60 70 45 4c 69 73 74 3b 0a 20 20 20 20 20 20 7d 0a  pEList;.      }.
1bd70 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73      }.  }..  ass
1bd80 65 72 74 28 20 2a 70 70 4d 69 6e 4d 61 78 3d 3d  ert( *ppMinMax==
1bd90 30 20 7c 7c 20 28 2a 70 70 4d 69 6e 4d 61 78 29  0 || (*ppMinMax)
1bda0 2d 3e 6e 45 78 70 72 3d 3d 31 20 29 3b 0a 20 20  ->nExpr==1 );.  
1bdb0 72 65 74 75 72 6e 20 65 52 65 74 3b 0a 7d 0a 0a  return eRet;.}..
1bdc0 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 6c 65 63 74  /*.** The select
1bdd0 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73 73 65   statement passe
1bde0 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61  d as the first a
1bdf0 72 67 75 6d 65 6e 74 20 69 73 20 61 6e 20 61 67  rgument is an ag
1be00 67 72 65 67 61 74 65 20 71 75 65 72 79 2e 0a 2a  gregate query..*
1be10 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67  * The second arg
1be20 6d 65 6e 74 20 69 73 20 74 68 65 20 61 73 73 6f  ment is the asso
1be30 63 69 61 74 65 64 20 61 67 67 72 65 67 61 74 65  ciated aggregate
1be40 2d 69 6e 66 6f 20 6f 62 6a 65 63 74 2e 20 54 68  -info object. Th
1be50 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  is .** function 
1be60 74 65 73 74 73 20 69 66 20 74 68 65 20 53 45 4c  tests if the SEL
1be70 45 43 54 20 69 73 20 6f 66 20 74 68 65 20 66 6f  ECT is of the fo
1be80 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45  rm:.**.**   SELE
1be90 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  CT count(*) FROM
1bea0 20 3c 74 62 6c 3e 0a 2a 2a 0a 2a 2a 20 77 68 65   <tbl>.**.** whe
1beb0 72 65 20 74 61 62 6c 65 20 69 73 20 61 20 64 61  re table is a da
1bec0 74 61 62 61 73 65 20 74 61 62 6c 65 2c 20 6e 6f  tabase table, no
1bed0 74 20 61 20 73 75 62 2d 73 65 6c 65 63 74 20 6f  t a sub-select o
1bee0 72 20 76 69 65 77 2e 20 49 66 20 74 68 65 20 71  r view. If the q
1bef0 75 65 72 79 0a 2a 2a 20 64 6f 65 73 20 6d 61 74  uery.** does mat
1bf00 63 68 20 74 68 69 73 20 70 61 74 74 65 72 6e 2c  ch this pattern,
1bf10 20 74 68 65 6e 20 61 20 70 6f 69 6e 74 65 72 20   then a pointer 
1bf20 74 6f 20 74 68 65 20 54 61 62 6c 65 20 6f 62 6a  to the Table obj
1bf30 65 63 74 20 72 65 70 72 65 73 65 6e 74 69 6e 67  ect representing
1bf40 0a 2a 2a 20 3c 74 62 6c 3e 20 69 73 20 72 65 74  .** <tbl> is ret
1bf50 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
1bf60 2c 20 30 20 69 73 20 72 65 74 75 72 6e 65 64 2e  , 0 is returned.
1bf70 0a 2a 2f 0a 73 74 61 74 69 63 20 54 61 62 6c 65  .*/.static Table
1bf80 20 2a 69 73 53 69 6d 70 6c 65 43 6f 75 6e 74 28   *isSimpleCount(
1bf90 53 65 6c 65 63 74 20 2a 70 2c 20 41 67 67 49 6e  Select *p, AggIn
1bfa0 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20  fo *pAggInfo){. 
1bfb0 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
1bfc0 45 78 70 72 20 2a 70 45 78 70 72 3b 0a 0a 20 20  Expr *pExpr;..  
1bfd0 61 73 73 65 72 74 28 20 21 70 2d 3e 70 47 72 6f  assert( !p->pGro
1bfe0 75 70 42 79 20 29 3b 0a 0a 20 20 69 66 28 20 70  upBy );..  if( p
1bff0 2d 3e 70 57 68 65 72 65 20 7c 7c 20 70 2d 3e 70  ->pWhere || p->p
1c000 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20  EList->nExpr!=1 
1c010 0a 20 20 20 7c 7c 20 70 2d 3e 70 53 72 63 2d 3e  .   || p->pSrc->
1c020 6e 53 72 63 21 3d 31 20 7c 7c 20 70 2d 3e 70 53  nSrc!=1 || p->pS
1c030 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74  rc->a[0].pSelect
1c040 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  .  ){.    return
1c050 20 30 3b 0a 20 20 7d 0a 20 20 70 54 61 62 20 3d   0;.  }.  pTab =
1c060 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70   p->pSrc->a[0].p
1c070 54 61 62 3b 0a 20 20 70 45 78 70 72 20 3d 20 70  Tab;.  pExpr = p
1c080 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  ->pEList->a[0].p
1c090 45 78 70 72 3b 0a 20 20 61 73 73 65 72 74 28 20  Expr;.  assert( 
1c0a0 70 54 61 62 20 26 26 20 21 70 54 61 62 2d 3e 70  pTab && !pTab->p
1c0b0 53 65 6c 65 63 74 20 26 26 20 70 45 78 70 72 20  Select && pExpr 
1c0c0 29 3b 0a 0a 20 20 69 66 28 20 49 73 56 69 72 74  );..  if( IsVirt
1c0d0 75 61 6c 28 70 54 61 62 29 20 29 20 72 65 74 75  ual(pTab) ) retu
1c0e0 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 45 78 70  rn 0;.  if( pExp
1c0f0 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 46 55  r->op!=TK_AGG_FU
1c100 4e 43 54 49 4f 4e 20 29 20 72 65 74 75 72 6e 20  NCTION ) return 
1c110 30 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70  0;.  if( NEVER(p
1c120 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3d 3d  AggInfo->nFunc==
1c130 30 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  0) ) return 0;. 
1c140 20 69 66 28 20 28 70 41 67 67 49 6e 66 6f 2d 3e   if( (pAggInfo->
1c150 61 46 75 6e 63 5b 30 5d 2e 70 46 75 6e 63 2d 3e  aFunc[0].pFunc->
1c160 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 46 55 4e  flags&SQLITE_FUN
1c170 43 5f 43 4f 55 4e 54 29 3d 3d 30 20 29 20 72 65  C_COUNT)==0 ) re
1c180 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 45  turn 0;.  if( pE
1c190 78 70 72 2d 3e 66 6c 61 67 73 26 45 50 5f 44 69  xpr->flags&EP_Di
1c1a0 73 74 69 6e 63 74 20 29 20 72 65 74 75 72 6e 20  stinct ) return 
1c1b0 30 3b 0a 0a 20 20 72 65 74 75 72 6e 20 70 54 61  0;..  return pTa
1c1c0 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  b;.}../*.** If t
1c1d0 68 65 20 73 6f 75 72 63 65 2d 6c 69 73 74 20 69  he source-list i
1c1e0 74 65 6d 20 70 61 73 73 65 64 20 61 73 20 61 6e  tem passed as an
1c1f0 20 61 72 67 75 6d 65 6e 74 20 77 61 73 20 61 75   argument was au
1c200 67 6d 65 6e 74 65 64 20 77 69 74 68 20 61 6e 0a  gmented with an.
1c210 2a 2a 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c  ** INDEXED BY cl
1c220 61 75 73 65 2c 20 74 68 65 6e 20 74 72 79 20 74  ause, then try t
1c230 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 73 70 65  o locate the spe
1c240 63 69 66 69 65 64 20 69 6e 64 65 78 2e 20 49 66  cified index. If
1c250 20 74 68 65 72 65 0a 2a 2a 20 77 61 73 20 73 75   there.** was su
1c260 63 68 20 61 20 63 6c 61 75 73 65 20 61 6e 64 20  ch a clause and 
1c270 74 68 65 20 6e 61 6d 65 64 20 69 6e 64 65 78 20  the named index 
1c280 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2c  cannot be found,
1c290 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49   return .** SQLI
1c2a0 54 45 5f 45 52 52 4f 52 20 61 6e 64 20 6c 65 61  TE_ERROR and lea
1c2b0 76 65 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 70  ve an error in p
1c2c0 50 61 72 73 65 2e 20 4f 74 68 65 72 77 69 73 65  Parse. Otherwise
1c2d0 2c 20 70 6f 70 75 6c 61 74 65 20 0a 2a 2a 20 70  , populate .** p
1c2e0 46 72 6f 6d 2d 3e 70 49 6e 64 65 78 20 61 6e 64  From->pIndex and
1c2f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1c300 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  K..*/.int sqlite
1c310 33 49 6e 64 65 78 65 64 42 79 4c 6f 6f 6b 75 70  3IndexedByLookup
1c320 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1c330 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
1c340 74 65 6d 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 69  tem *pFrom){.  i
1c350 66 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 26  f( pFrom->pTab &
1c360 26 20 70 46 72 6f 6d 2d 3e 7a 49 6e 64 65 78 20  & pFrom->zIndex 
1c370 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  ){.    Table *pT
1c380 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62  ab = pFrom->pTab
1c390 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 49 6e 64  ;.    char *zInd
1c3a0 65 78 20 3d 20 70 46 72 6f 6d 2d 3e 7a 49 6e 64  ex = pFrom->zInd
1c3b0 65 78 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70  ex;.    Index *p
1c3c0 49 64 78 3b 0a 20 20 20 20 66 6f 72 28 70 49 64  Idx;.    for(pId
1c3d0 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20  x=pTab->pIndex; 
1c3e0 0a 20 20 20 20 20 20 20 20 70 49 64 78 20 26 26  .        pIdx &&
1c3f0 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
1c400 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 49 6e  pIdx->zName, zIn
1c410 64 65 78 29 3b 20 0a 20 20 20 20 20 20 20 20 70  dex); .        p
1c420 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 0a  Idx=pIdx->pNext.
1c430 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 21      );.    if( !
1c440 70 49 64 78 20 29 7b 0a 20 20 20 20 20 20 73 71  pIdx ){.      sq
1c450 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
1c460 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 69  arse, "no such i
1c470 6e 64 65 78 3a 20 25 73 22 2c 20 7a 49 6e 64 65  ndex: %s", zInde
1c480 78 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61  x, 0);.      pPa
1c490 72 73 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61  rse->checkSchema
1c4a0 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 65 74 75   = 1;.      retu
1c4b0 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
1c4c0 0a 20 20 20 20 7d 0a 20 20 20 20 70 46 72 6f 6d  .    }.    pFrom
1c4d0 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49 64 78 3b  ->pIndex = pIdx;
1c4e0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
1c4f0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
1c500 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
1c510 73 20 61 20 57 61 6c 6b 65 72 20 63 61 6c 6c 62  s a Walker callb
1c520 61 63 6b 20 66 6f 72 20 22 65 78 70 61 6e 64 69  ack for "expandi
1c530 6e 67 22 20 61 20 53 45 4c 45 43 54 20 73 74 61  ng" a SELECT sta
1c540 74 65 6d 65 6e 74 2e 0a 2a 2a 20 22 45 78 70 61  tement..** "Expa
1c550 6e 64 69 6e 67 22 20 6d 65 61 6e 73 20 74 6f 20  nding" means to 
1c560 64 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  do the following
1c570 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20  :.**.**    (1)  
1c580 4d 61 6b 65 20 73 75 72 65 20 56 44 42 45 20 63  Make sure VDBE c
1c590 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 68 61  ursor numbers ha
1c5a0 76 65 20 62 65 65 6e 20 61 73 73 69 67 6e 65 64  ve been assigned
1c5b0 20 74 6f 20 65 76 65 72 79 0a 2a 2a 20 20 20 20   to every.**    
1c5c0 20 20 20 20 20 65 6c 65 6d 65 6e 74 20 6f 66 20       element of 
1c5d0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e  the FROM clause.
1c5e0 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20 46  .**.**    (2)  F
1c5f0 69 6c 6c 20 69 6e 20 74 68 65 20 70 54 61 62 4c  ill in the pTabL
1c600 69 73 74 2d 3e 61 5b 5d 2e 70 54 61 62 20 66 69  ist->a[].pTab fi
1c610 65 6c 64 73 20 69 6e 20 74 68 65 20 53 72 63 4c  elds in the SrcL
1c620 69 73 74 20 74 68 61 74 20 0a 2a 2a 20 20 20 20  ist that .**    
1c630 20 20 20 20 20 64 65 66 69 6e 65 73 20 46 52 4f       defines FRO
1c640 4d 20 63 6c 61 75 73 65 2e 20 20 57 68 65 6e 20  M clause.  When 
1c650 76 69 65 77 73 20 61 70 70 65 61 72 20 69 6e 20  views appear in 
1c660 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c  the FROM clause,
1c670 0a 2a 2a 20 20 20 20 20 20 20 20 20 66 69 6c 6c  .**         fill
1c680 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70   pTabList->a[].p
1c690 53 65 6c 65 63 74 20 77 69 74 68 20 61 20 63 6f  Select with a co
1c6a0 70 79 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  py of the SELECT
1c6b0 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20 20   statement.**   
1c6c0 20 20 20 20 20 20 74 68 61 74 20 69 6d 70 6c 65        that imple
1c6d0 6d 65 6e 74 73 20 74 68 65 20 76 69 65 77 2e 20  ments the view. 
1c6e0 20 41 20 63 6f 70 79 20 69 73 20 6d 61 64 65 20   A copy is made 
1c6f0 6f 66 20 74 68 65 20 76 69 65 77 27 73 20 53 45  of the view's SE
1c700 4c 45 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 20  LECT.**         
1c710 73 74 61 74 65 6d 65 6e 74 20 73 6f 20 74 68 61  statement so tha
1c720 74 20 77 65 20 63 61 6e 20 66 72 65 65 6c 79 20  t we can freely 
1c730 6d 6f 64 69 66 79 20 6f 72 20 64 65 6c 65 74 65  modify or delete
1c740 20 74 68 61 74 20 73 74 61 74 65 6d 65 6e 74 0a   that statement.
1c750 2a 2a 20 20 20 20 20 20 20 20 20 77 69 74 68 6f  **         witho
1c760 75 74 20 77 6f 72 72 79 69 6e 67 20 61 62 6f 75  ut worrying abou
1c770 74 20 6d 65 73 73 69 6e 67 20 75 70 20 74 68 65  t messing up the
1c780 20 70 72 65 73 69 73 74 65 6e 74 20 72 65 70 72   presistent repr
1c790 65 73 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 20 20  esentation.**   
1c7a0 20 20 20 20 20 20 6f 66 20 74 68 65 20 76 69 65        of the vie
1c7b0 77 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 33 29 20  w..**.**    (3) 
1c7c0 20 41 64 64 20 74 65 72 6d 73 20 74 6f 20 74 68   Add terms to th
1c7d0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
1c7e0 6f 20 61 63 63 6f 6d 6f 64 61 74 65 20 74 68 65  o accomodate the
1c7f0 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64   NATURAL keyword
1c800 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f 6e 20 6a  .**         on j
1c810 6f 69 6e 73 20 61 6e 64 20 74 68 65 20 4f 4e 20  oins and the ON 
1c820 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65  and USING clause
1c830 20 6f 66 20 6a 6f 69 6e 73 2e 0a 2a 2a 0a 2a 2a   of joins..**.**
1c840 20 20 20 20 28 34 29 20 20 53 63 61 6e 20 74 68      (4)  Scan th
1c850 65 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e  e list of column
1c860 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  s in the result 
1c870 73 65 74 20 28 70 45 4c 69 73 74 29 20 6c 6f 6f  set (pEList) loo
1c880 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20  king.**         
1c890 66 6f 72 20 69 6e 73 74 61 6e 63 65 73 20 6f 66  for instances of
1c8a0 20 74 68 65 20 22 2a 22 20 6f 70 65 72 61 74 6f   the "*" operato
1c8b0 72 20 6f 72 20 74 68 65 20 54 41 42 4c 45 2e 2a  r or the TABLE.*
1c8c0 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 20 20 20   operator..**   
1c8d0 20 20 20 20 20 20 49 66 20 66 6f 75 6e 64 2c 20        If found, 
1c8e0 65 78 70 61 6e 64 20 65 61 63 68 20 22 2a 22 20  expand each "*" 
1c8f0 74 6f 20 62 65 20 65 76 65 72 79 20 63 6f 6c 75  to be every colu
1c900 6d 6e 20 69 6e 20 65 76 65 72 79 20 74 61 62 6c  mn in every tabl
1c910 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 61 6e 64  e.**         and
1c920 20 54 41 42 4c 45 2e 2a 20 74 6f 20 62 65 20 65   TABLE.* to be e
1c930 76 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 54  very column in T
1c940 41 42 4c 45 2e 0a 2a 2a 0a 2a 2f 0a 73 74 61 74  ABLE..**.*/.stat
1c950 69 63 20 69 6e 74 20 73 65 6c 65 63 74 45 78 70  ic int selectExp
1c960 61 6e 64 65 72 28 57 61 6c 6b 65 72 20 2a 70 57  ander(Walker *pW
1c970 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70  alker, Select *p
1c980 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  ){.  Parse *pPar
1c990 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50  se = pWalker->pP
1c9a0 61 72 73 65 3b 0a 20 20 69 6e 74 20 69 2c 20 6a  arse;.  int i, j
1c9b0 2c 20 6b 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a  , k;.  SrcList *
1c9c0 70 54 61 62 4c 69 73 74 3b 0a 20 20 45 78 70 72  pTabList;.  Expr
1c9d0 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20  List *pEList;.  
1c9e0 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
1c9f0 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a 20 20 73 71  tem *pFrom;.  sq
1ca00 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
1ca10 73 65 2d 3e 64 62 3b 0a 20 20 45 78 70 72 20 2a  se->db;.  Expr *
1ca20 70 45 2c 20 2a 70 52 69 67 68 74 2c 20 2a 70 45  pE, *pRight, *pE
1ca30 78 70 72 3b 0a 20 20 75 31 36 20 73 65 6c 46 6c  xpr;.  u16 selFl
1ca40 61 67 73 20 3d 20 70 2d 3e 73 65 6c 46 6c 61 67  ags = p->selFlag
1ca50 73 3b 0a 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67  s;..  p->selFlag
1ca60 73 20 7c 3d 20 53 46 5f 45 78 70 61 6e 64 65 64  s |= SF_Expanded
1ca70 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
1ca80 6f 63 46 61 69 6c 65 64 20 20 29 7b 0a 20 20 20  ocFailed  ){.   
1ca90 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
1caa0 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 4e 45 56  t;.  }.  if( NEV
1cab0 45 52 28 70 2d 3e 70 53 72 63 3d 3d 30 29 20 7c  ER(p->pSrc==0) |
1cac0 7c 20 28 73 65 6c 46 6c 61 67 73 20 26 20 53 46  | (selFlags & SF
1cad0 5f 45 78 70 61 6e 64 65 64 29 21 3d 30 20 29 7b  _Expanded)!=0 ){
1cae0 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f  .    return WRC_
1caf0 50 72 75 6e 65 3b 0a 20 20 7d 0a 20 20 70 54 61  Prune;.  }.  pTa
1cb00 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b  bList = p->pSrc;
1cb10 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70  .  pEList = p->p
1cb20 45 4c 69 73 74 3b 0a 0a 20 20 2f 2a 20 4d 61 6b  EList;..  /* Mak
1cb30 65 20 73 75 72 65 20 63 75 72 73 6f 72 20 6e 75  e sure cursor nu
1cb40 6d 62 65 72 73 20 68 61 76 65 20 62 65 65 6e 20  mbers have been 
1cb50 61 73 73 69 67 6e 65 64 20 74 6f 20 61 6c 6c 20  assigned to all 
1cb60 65 6e 74 72 69 65 73 20 69 6e 0a 20 20 2a 2a 20  entries in.  ** 
1cb70 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
1cb80 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  of the SELECT st
1cb90 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20  atement..  */.  
1cba0 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73  sqlite3SrcListAs
1cbb0 73 69 67 6e 43 75 72 73 6f 72 73 28 70 50 61 72  signCursors(pPar
1cbc0 73 65 2c 20 70 54 61 62 4c 69 73 74 29 3b 0a 0a  se, pTabList);..
1cbd0 20 20 2f 2a 20 4c 6f 6f 6b 20 75 70 20 65 76 65    /* Look up eve
1cbe0 72 79 20 74 61 62 6c 65 20 6e 61 6d 65 64 20 69  ry table named i
1cbf0 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
1cc00 65 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2e  e of the select.
1cc10 20 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65 6e 74    If.  ** an ent
1cc20 72 79 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63  ry of the FROM c
1cc30 6c 61 75 73 65 20 69 73 20 61 20 73 75 62 71 75  lause is a subqu
1cc40 65 72 79 20 69 6e 73 74 65 61 64 20 6f 66 20 61  ery instead of a
1cc50 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 2c 0a   table or view,.
1cc60 20 20 2a 2a 20 74 68 65 6e 20 63 72 65 61 74 65    ** then create
1cc70 20 61 20 74 72 61 6e 73 69 65 6e 74 20 74 61 62   a transient tab
1cc80 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 6f 20  le structure to 
1cc90 64 65 73 63 72 69 62 65 20 74 68 65 20 73 75 62  describe the sub
1cca0 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f  query..  */.  fo
1ccb0 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61  r(i=0, pFrom=pTa
1ccc0 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62  bList->a; i<pTab
1ccd0 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c  List->nSrc; i++,
1cce0 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 54   pFrom++){.    T
1ccf0 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20  able *pTab;.    
1cd00 69 66 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 21  if( pFrom->pTab!
1cd10 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  =0 ){.      /* T
1cd20 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 68 61  his statement ha
1cd30 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 70  s already been p
1cd40 72 65 70 61 72 65 64 2e 20 20 54 68 65 72 65 20  repared.  There 
1cd50 69 73 20 6e 6f 20 6e 65 65 64 0a 20 20 20 20 20  is no need.     
1cd60 20 2a 2a 20 74 6f 20 67 6f 20 66 75 72 74 68 65   ** to go furthe
1cd70 72 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  r. */.      asse
1cd80 72 74 28 20 69 3d 3d 30 20 29 3b 0a 20 20 20 20  rt( i==0 );.    
1cd90 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75    return WRC_Pru
1cda0 6e 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ne;.    }.    if
1cdb0 28 20 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 3d 3d  ( pFrom->zName==
1cdc0 30 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  0 ){.#ifndef SQL
1cdd0 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
1cde0 59 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a  Y.      Select *
1cdf0 70 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53  pSel = pFrom->pS
1ce00 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 2f 2a 20  elect;.      /* 
1ce10 41 20 73 75 62 2d 71 75 65 72 79 20 69 6e 20 74  A sub-query in t
1ce20 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
1ce30 66 20 61 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20  f a SELECT */.  
1ce40 20 20 20 20 61 73 73 65 72 74 28 20 70 53 65 6c      assert( pSel
1ce50 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73  !=0 );.      ass
1ce60 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62  ert( pFrom->pTab
1ce70 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ==0 );.      sql
1ce80 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70  ite3WalkSelect(p
1ce90 57 61 6c 6b 65 72 2c 20 70 53 65 6c 29 3b 0a 20  Walker, pSel);. 
1cea0 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62       pFrom->pTab
1ceb0 20 3d 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65   = pTab = sqlite
1cec0 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
1ced0 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 29  , sizeof(Table))
1cee0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62  ;.      if( pTab
1cef0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43  ==0 ) return WRC
1cf00 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 70 54  _Abort;.      pT
1cf10 61 62 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20  ab->nRef = 1;.  
1cf20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20      pTab->zName 
1cf30 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
1cf40 28 64 62 2c 20 22 73 71 6c 69 74 65 5f 73 75 62  (db, "sqlite_sub
1cf50 71 75 65 72 79 5f 25 70 5f 22 2c 20 28 76 6f 69  query_%p_", (voi
1cf60 64 2a 29 70 54 61 62 29 3b 0a 20 20 20 20 20 20  d*)pTab);.      
1cf70 77 68 69 6c 65 28 20 70 53 65 6c 2d 3e 70 50 72  while( pSel->pPr
1cf80 69 6f 72 20 29 7b 20 70 53 65 6c 20 3d 20 70 53  ior ){ pSel = pS
1cf90 65 6c 2d 3e 70 50 72 69 6f 72 3b 20 7d 0a 20 20  el->pPrior; }.  
1cfa0 20 20 20 20 73 65 6c 65 63 74 43 6f 6c 75 6d 6e      selectColumn
1cfb0 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50  sFromExprList(pP
1cfc0 61 72 73 65 2c 20 70 53 65 6c 2d 3e 70 45 4c 69  arse, pSel->pELi
1cfd0 73 74 2c 20 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c  st, &pTab->nCol,
1cfe0 20 26 70 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20   &pTab->aCol);. 
1cff0 20 20 20 20 20 70 54 61 62 2d 3e 69 50 4b 65 79       pTab->iPKey
1d000 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 70 54 61   = -1;.      pTa
1d010 62 2d 3e 6e 52 6f 77 45 73 74 20 3d 20 31 30 30  b->nRowEst = 100
1d020 30 30 30 30 3b 0a 20 20 20 20 20 20 70 54 61 62  0000;.      pTab
1d030 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46  ->tabFlags |= TF
1d040 5f 45 70 68 65 6d 65 72 61 6c 3b 0a 23 65 6e 64  _Ephemeral;.#end
1d050 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  if.    }else{.  
1d060 20 20 20 20 2f 2a 20 41 6e 20 6f 72 64 69 6e 61      /* An ordina
1d070 72 79 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77  ry table or view
1d080 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 46 52 4f   name in the FRO
1d090 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20  M clause */.    
1d0a0 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d    assert( pFrom-
1d0b0 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20  >pTab==0 );.    
1d0c0 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20    pFrom->pTab = 
1d0d0 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f  pTab = sqlite3Lo
1d0e0 63 61 74 65 54 61 62 6c 65 49 74 65 6d 28 70 50  cateTableItem(pP
1d0f0 61 72 73 65 2c 20 30 2c 20 70 46 72 6f 6d 29 3b  arse, 0, pFrom);
1d100 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62 3d  .      if( pTab=
1d110 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f  =0 ) return WRC_
1d120 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 69 66 28  Abort;.      if(
1d130 20 70 54 61 62 2d 3e 6e 52 65 66 3d 3d 30 78 66   pTab->nRef==0xf
1d140 66 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20 73  fff ){.        s
1d150 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
1d160 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79  Parse, "too many
1d170 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 5c   references to \
1d180 22 25 73 5c 22 3a 20 6d 61 78 20 36 35 35 33 35  "%s\": max 65535
1d190 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 54  ",.           pT
1d1a0 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
1d1b0 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20      pFrom->pTab 
1d1c0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74  = 0;.        ret
1d1d0 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
1d1e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 54 61       }.      pTa
1d1f0 62 2d 3e 6e 52 65 66 2b 2b 3b 0a 23 69 66 20 21  b->nRef++;.#if !
1d200 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
1d210 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65  MIT_VIEW) || !de
1d220 66 69 6e 65 64 20 28 53 51 4c 49 54 45 5f 4f 4d  fined (SQLITE_OM
1d230 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  IT_VIRTUALTABLE)
1d240 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62 2d  .      if( pTab-
1d250 3e 70 53 65 6c 65 63 74 20 7c 7c 20 49 73 56 69  >pSelect || IsVi
1d260 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20  rtual(pTab) ){. 
1d270 20 20 20 20 20 20 20 2f 2a 20 57 65 20 72 65 61         /* We rea
1d280 63 68 20 68 65 72 65 20 69 66 20 74 68 65 20 6e  ch here if the n
1d290 61 6d 65 64 20 74 61 62 6c 65 20 69 73 20 61 20  amed table is a 
1d2a0 72 65 61 6c 6c 79 20 61 20 76 69 65 77 20 2a 2f  really a view */
1d2b0 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
1d2c0 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d  ite3ViewGetColum
1d2d0 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70  nNames(pParse, p
1d2e0 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 57 52  Tab) ) return WR
1d2f0 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 20  C_Abort;.       
1d300 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e   assert( pFrom->
1d310 70 53 65 6c 65 63 74 3d 3d 30 20 29 3b 0a 20 20  pSelect==0 );.  
1d320 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 53 65        pFrom->pSe
1d330 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65  lect = sqlite3Se
1d340 6c 65 63 74 44 75 70 28 64 62 2c 20 70 54 61 62  lectDup(db, pTab
1d350 2d 3e 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20  ->pSelect, 0);. 
1d360 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 61         sqlite3Wa
1d370 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72  lkSelect(pWalker
1d380 2c 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74  , pFrom->pSelect
1d390 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
1d3a0 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  f.    }..    /* 
1d3b0 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 64 65 78  Locate the index
1d3c0 20 6e 61 6d 65 64 20 62 79 20 74 68 65 20 49 4e   named by the IN
1d3d0 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 2c  DEXED BY clause,
1d3e0 20 69 66 20 61 6e 79 2e 20 2a 2f 0a 20 20 20 20   if any. */.    
1d3f0 69 66 28 20 73 71 6c 69 74 65 33 49 6e 64 65 78  if( sqlite3Index
1d400 65 64 42 79 4c 6f 6f 6b 75 70 28 70 50 61 72 73  edByLookup(pPars
1d410 65 2c 20 70 46 72 6f 6d 29 20 29 7b 0a 20 20 20  e, pFrom) ){.   
1d420 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62     return WRC_Ab
1d430 6f 72 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ort;.    }.  }..
1d440 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 4e 41 54    /* Process NAT
1d450 55 52 41 4c 20 6b 65 79 77 6f 72 64 73 2c 20 61  URAL keywords, a
1d460 6e 64 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20  nd ON and USING 
1d470 63 6c 61 75 73 65 73 20 6f 66 20 6a 6f 69 6e 73  clauses of joins
1d480 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d  ..  */.  if( db-
1d490 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c  >mallocFailed ||
1d4a0 20 73 71 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f   sqliteProcessJo
1d4b0 69 6e 28 70 50 61 72 73 65 2c 20 70 29 20 29 7b  in(pParse, p) ){
1d4c0 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f  .    return WRC_
1d4d0 41 62 6f 72 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Abort;.  }..  /*
1d4e0 20 46 6f 72 20 65 76 65 72 79 20 22 2a 22 20 74   For every "*" t
1d4f0 68 61 74 20 6f 63 63 75 72 73 20 69 6e 20 74 68  hat occurs in th
1d500 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2c 20 69  e column list, i
1d510 6e 73 65 72 74 20 74 68 65 20 6e 61 6d 65 73 20  nsert the names 
1d520 6f 66 0a 20 20 2a 2a 20 61 6c 6c 20 63 6f 6c 75  of.  ** all colu
1d530 6d 6e 73 20 69 6e 20 61 6c 6c 20 74 61 62 6c 65  mns in all table
1d540 73 2e 20 20 41 6e 64 20 66 6f 72 20 65 76 65 72  s.  And for ever
1d550 79 20 54 41 42 4c 45 2e 2a 20 69 6e 73 65 72 74  y TABLE.* insert
1d560 20 74 68 65 20 6e 61 6d 65 73 0a 20 20 2a 2a 20   the names.  ** 
1d570 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69  of all columns i
1d580 6e 20 54 41 42 4c 45 2e 20 20 54 68 65 20 70 61  n TABLE.  The pa
1d590 72 73 65 72 20 69 6e 73 65 72 74 65 64 20 61 20  rser inserted a 
1d5a0 73 70 65 63 69 61 6c 20 65 78 70 72 65 73 73 69  special expressi
1d5b0 6f 6e 0a 20 20 2a 2a 20 77 69 74 68 20 74 68 65  on.  ** with the
1d5c0 20 54 4b 5f 41 4c 4c 20 6f 70 65 72 61 74 6f 72   TK_ALL operator
1d5d0 20 66 6f 72 20 65 61 63 68 20 22 2a 22 20 74 68   for each "*" th
1d5e0 61 74 20 69 74 20 66 6f 75 6e 64 20 69 6e 20 74  at it found in t
1d5f0 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2e 0a  he column list..
1d600 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    ** The followi
1d610 6e 67 20 63 6f 64 65 20 6a 75 73 74 20 68 61 73  ng code just has
1d620 20 74 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 54   to locate the T
1d630 4b 5f 41 4c 4c 20 65 78 70 72 65 73 73 69 6f 6e  K_ALL expression
1d640 73 20 61 6e 64 20 65 78 70 61 6e 64 0a 20 20 2a  s and expand.  *
1d650 2a 20 65 61 63 68 20 6f 6e 65 20 74 6f 20 74 68  * each one to th
1d660 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 63 6f  e list of all co
1d670 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c 20 74 61 62  lumns in all tab
1d680 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  les..  **.  ** T
1d690 68 65 20 66 69 72 73 74 20 6c 6f 6f 70 20 6a 75  he first loop ju
1d6a0 73 74 20 63 68 65 63 6b 73 20 74 6f 20 73 65 65  st checks to see
1d6b0 20 69 66 20 74 68 65 72 65 20 61 72 65 20 61 6e   if there are an
1d6c0 79 20 22 2a 22 20 6f 70 65 72 61 74 6f 72 73 0a  y "*" operators.
1d6d0 20 20 2a 2a 20 74 68 61 74 20 6e 65 65 64 20 65    ** that need e
1d6e0 78 70 61 6e 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20  xpanding..  */. 
1d6f0 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69   for(k=0; k<pELi
1d700 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b  st->nExpr; k++){
1d710 0a 20 20 20 20 70 45 20 3d 20 70 45 4c 69 73 74  .    pE = pEList
1d720 2d 3e 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[k].pExpr;.  
1d730 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b    if( pE->op==TK
1d740 5f 41 4c 4c 20 29 20 62 72 65 61 6b 3b 0a 20 20  _ALL ) break;.  
1d750 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e 6f 70    assert( pE->op
1d760 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 45 2d 3e  !=TK_DOT || pE->
1d770 70 52 69 67 68 74 21 3d 30 20 29 3b 0a 20 20 20  pRight!=0 );.   
1d780 20 61 73 73 65 72 74 28 20 70 45 2d 3e 6f 70 21   assert( pE->op!
1d790 3d 54 4b 5f 44 4f 54 20 7c 7c 20 28 70 45 2d 3e  =TK_DOT || (pE->
1d7a0 70 4c 65 66 74 21 3d 30 20 26 26 20 70 45 2d 3e  pLeft!=0 && pE->
1d7b0 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 44  pLeft->op==TK_ID
1d7c0 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 45 2d  ) );.    if( pE-
1d7d0 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 26 26 20 70  >op==TK_DOT && p
1d7e0 45 2d 3e 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54  E->pRight->op==T
1d7f0 4b 5f 41 4c 4c 20 29 20 62 72 65 61 6b 3b 0a 20  K_ALL ) break;. 
1d800 20 7d 0a 20 20 69 66 28 20 6b 3c 70 45 4c 69 73   }.  if( k<pELis
1d810 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  t->nExpr ){.    
1d820 2f 2a 0a 20 20 20 20 2a 2a 20 49 66 20 77 65 20  /*.    ** If we 
1d830 67 65 74 20 68 65 72 65 20 69 74 20 6d 65 61 6e  get here it mean
1d840 73 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  s the result set
1d850 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72   contains one or
1d860 20 6d 6f 72 65 20 22 2a 22 0a 20 20 20 20 2a 2a   more "*".    **
1d870 20 6f 70 65 72 61 74 6f 72 73 20 74 68 61 74 20   operators that 
1d880 6e 65 65 64 20 74 6f 20 62 65 20 65 78 70 61 6e  need to be expan
1d890 64 65 64 2e 20 20 4c 6f 6f 70 20 74 68 72 6f 75  ded.  Loop throu
1d8a0 67 68 20 65 61 63 68 20 65 78 70 72 65 73 73 69  gh each expressi
1d8b0 6f 6e 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65  on.    ** in the
1d8c0 20 72 65 73 75 6c 74 20 73 65 74 20 61 6e 64 20   result set and 
1d8d0 65 78 70 61 6e 64 20 74 68 65 6d 20 6f 6e 65 20  expand them one 
1d8e0 62 79 20 6f 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20  by one..    */. 
1d8f0 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
1d900 73 74 5f 69 74 65 6d 20 2a 61 20 3d 20 70 45 4c  st_item *a = pEL
1d910 69 73 74 2d 3e 61 3b 0a 20 20 20 20 45 78 70 72  ist->a;.    Expr
1d920 4c 69 73 74 20 2a 70 4e 65 77 20 3d 20 30 3b 0a  List *pNew = 0;.
1d930 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20      int flags = 
1d940 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67  pParse->db->flag
1d950 73 3b 0a 20 20 20 20 69 6e 74 20 6c 6f 6e 67 4e  s;.    int longN
1d960 61 6d 65 73 20 3d 20 28 66 6c 61 67 73 20 26 20  ames = (flags & 
1d970 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61  SQLITE_FullColNa
1d980 6d 65 73 29 21 3d 30 0a 20 20 20 20 20 20 20 20  mes)!=0.        
1d990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26                &&
1d9a0 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
1d9b0 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 29 3d  _ShortColNames)=
1d9c0 3d 30 3b 0a 0a 20 20 20 20 2f 2a 20 57 68 65 6e  =0;..    /* When
1d9d0 20 70 72 6f 63 65 73 73 69 6e 67 20 46 52 4f 4d   processing FROM
1d9e0 2d 63 6c 61 75 73 65 20 73 75 62 71 75 65 72 69  -clause subqueri
1d9f0 65 73 2c 20 69 74 20 69 73 20 61 6c 77 61 79 73  es, it is always
1da00 20 74 68 65 20 63 61 73 65 0a 20 20 20 20 2a 2a   the case.    **
1da10 20 74 68 61 74 20 66 75 6c 6c 5f 63 6f 6c 75 6d   that full_colum
1da20 6e 5f 6e 61 6d 65 73 3d 4f 46 46 20 61 6e 64 20  n_names=OFF and 
1da30 73 68 6f 72 74 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d  short_column_nam
1da40 65 73 3d 4f 4e 2e 20 20 54 68 65 0a 20 20 20 20  es=ON.  The.    
1da50 2a 2a 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74  ** sqlite3Result
1da60 53 65 74 4f 66 53 65 6c 65 63 74 28 29 20 72 6f  SetOfSelect() ro
1da70 75 74 69 6e 65 20 6d 61 6b 65 73 20 69 74 20 73  utine makes it s
1da80 6f 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  o. */.    assert
1da90 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  ( (p->selFlags &
1daa0 20 53 46 5f 4e 65 73 74 65 64 46 72 6f 6d 29 3d   SF_NestedFrom)=
1dab0 3d 30 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20  =0.          || 
1dac0 28 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ((flags & SQLITE
1dad0 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 3d 3d  _FullColNames)==
1dae0 30 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20  0 &&.           
1daf0 20 20 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49     (flags & SQLI
1db00 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73  TE_ShortColNames
1db10 29 21 3d 30 29 20 29 3b 0a 0a 20 20 20 20 66 6f  )!=0) );..    fo
1db20 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d  r(k=0; k<pEList-
1db30 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20  >nExpr; k++){.  
1db40 20 20 20 20 70 45 20 3d 20 61 5b 6b 5d 2e 70 45      pE = a[k].pE
1db50 78 70 72 3b 0a 20 20 20 20 20 20 70 52 69 67 68  xpr;.      pRigh
1db60 74 20 3d 20 70 45 2d 3e 70 52 69 67 68 74 3b 0a  t = pE->pRight;.
1db70 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
1db80 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20  ->op!=TK_DOT || 
1db90 70 52 69 67 68 74 21 3d 30 20 29 3b 0a 20 20 20  pRight!=0 );.   
1dba0 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 21 3d 54     if( pE->op!=T
1dbb0 4b 5f 41 4c 4c 20 26 26 20 28 70 45 2d 3e 6f 70  K_ALL && (pE->op
1dbc0 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 52 69 67  !=TK_DOT || pRig
1dbd0 68 74 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29 20  ht->op!=TK_ALL) 
1dbe0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
1dbf0 69 73 20 70 61 72 74 69 63 75 6c 61 72 20 65 78  is particular ex
1dc00 70 72 65 73 73 69 6f 6e 20 64 6f 65 73 20 6e 6f  pression does no
1dc10 74 20 6e 65 65 64 20 74 6f 20 62 65 20 65 78 70  t need to be exp
1dc20 61 6e 64 65 64 2e 0a 20 20 20 20 20 20 20 20 2a  anded..        *
1dc30 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d  /.        pNew =
1dc40 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
1dc50 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70  Append(pParse, p
1dc60 4e 65 77 2c 20 61 5b 6b 5d 2e 70 45 78 70 72 29  New, a[k].pExpr)
1dc70 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e  ;.        if( pN
1dc80 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ew ){.          
1dc90 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45  pNew->a[pNew->nE
1dca0 78 70 72 2d 31 5d 2e 7a 4e 61 6d 65 20 3d 20 61  xpr-1].zName = a
1dcb0 5b 6b 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  [k].zName;.     
1dcc0 20 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65       pNew->a[pNe
1dcd0 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a 53 70 61  w->nExpr-1].zSpa
1dce0 6e 20 3d 20 61 5b 6b 5d 2e 7a 53 70 61 6e 3b 0a  n = a[k].zSpan;.
1dcf0 20 20 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 7a            a[k].z
1dd00 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Name = 0;.      
1dd10 20 20 20 20 61 5b 6b 5d 2e 7a 53 70 61 6e 20 3d      a[k].zSpan =
1dd20 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   0;.        }.  
1dd30 20 20 20 20 20 20 61 5b 6b 5d 2e 70 45 78 70 72        a[k].pExpr
1dd40 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 0;.      }els
1dd50 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  e{.        /* Th
1dd60 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  is expression is
1dd70 20 61 20 22 2a 22 20 6f 72 20 61 20 22 54 41 42   a "*" or a "TAB
1dd80 4c 45 2e 2a 22 20 61 6e 64 20 6e 65 65 64 73 20  LE.*" and needs 
1dd90 74 6f 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a  to be.        **
1dda0 20 65 78 70 61 6e 64 65 64 2e 20 2a 2f 0a 20 20   expanded. */.  
1ddb0 20 20 20 20 20 20 69 6e 74 20 74 61 62 6c 65 53        int tableS
1ddc0 65 65 6e 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a  een = 0;      /*
1ddd0 20 53 65 74 20 74 6f 20 31 20 77 68 65 6e 20 54   Set to 1 when T
1dde0 41 42 4c 45 20 6d 61 74 63 68 65 73 20 2a 2f 0a  ABLE matches */.
1ddf0 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54          char *zT
1de00 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 20 20  Name = 0;       
1de10 2f 2a 20 74 65 78 74 20 6f 66 20 6e 61 6d 65 20  /* text of name 
1de20 6f 66 20 54 41 42 4c 45 20 2a 2f 0a 20 20 20 20  of TABLE */.    
1de30 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d      if( pE->op==
1de40 54 4b 5f 44 4f 54 20 29 7b 0a 20 20 20 20 20 20  TK_DOT ){.      
1de50 20 20 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e      assert( pE->
1de60 70 4c 65 66 74 21 3d 30 20 29 3b 0a 20 20 20 20  pLeft!=0 );.    
1de70 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
1de80 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
1de90 45 2d 3e 70 4c 65 66 74 2c 20 45 50 5f 49 6e 74  E->pLeft, EP_Int
1dea0 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20  Value) );.      
1deb0 20 20 20 20 7a 54 4e 61 6d 65 20 3d 20 70 45 2d      zTName = pE-
1dec0 3e 70 4c 65 66 74 2d 3e 75 2e 7a 54 6f 6b 65 6e  >pLeft->u.zToken
1ded0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1dee0 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 72      for(i=0, pFr
1def0 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20  om=pTabList->a; 
1df00 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  i<pTabList->nSrc
1df10 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b  ; i++, pFrom++){
1df20 0a 20 20 20 20 20 20 20 20 20 20 54 61 62 6c 65  .          Table
1df30 20 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e   *pTab = pFrom->
1df40 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20  pTab;.          
1df50 53 65 6c 65 63 74 20 2a 70 53 75 62 20 3d 20 70  Select *pSub = p
1df60 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20  From->pSelect;. 
1df70 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a           char *z
1df80 54 61 62 4e 61 6d 65 20 3d 20 70 46 72 6f 6d 2d  TabName = pFrom-
1df90 3e 7a 41 6c 69 61 73 3b 0a 20 20 20 20 20 20 20  >zAlias;.       
1dfa0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
1dfb0 53 63 68 65 6d 61 4e 61 6d 65 20 3d 20 30 3b 0a  SchemaName = 0;.
1dfc0 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 44            int iD
1dfd0 62 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  b;.          if(
1dfe0 20 7a 54 61 62 4e 61 6d 65 3d 3d 30 20 29 7b 0a   zTabName==0 ){.
1dff0 20 20 20 20 20 20 20 20 20 20 20 20 7a 54 61 62              zTab
1e000 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 7a 4e 61  Name = pTab->zNa
1e010 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  me;.          }.
1e020 20 20 20 20 20 20 20 20 20 20 69 66 28 20 64 62            if( db
1e030 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
1e040 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
1e050 20 20 69 66 28 20 70 53 75 62 3d 3d 30 20 7c 7c    if( pSub==0 ||
1e060 20 28 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73   (pSub->selFlags
1e070 20 26 20 53 46 5f 4e 65 73 74 65 64 46 72 6f 6d   & SF_NestedFrom
1e080 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
1e090 20 20 20 20 70 53 75 62 20 3d 20 30 3b 0a 20 20      pSub = 0;.  
1e0a0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 54            if( zT
1e0b0 4e 61 6d 65 20 26 26 20 73 71 6c 69 74 65 33 53  Name && sqlite3S
1e0c0 74 72 49 43 6d 70 28 7a 54 4e 61 6d 65 2c 20 7a  trICmp(zTName, z
1e0d0 54 61 62 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20  TabName)!=0 ){. 
1e0e0 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
1e0f0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
1e100 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
1e110 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
1e120 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20  hemaToIndex(db, 
1e130 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  pTab->pSchema);.
1e140 20 20 20 20 20 20 20 20 20 20 20 20 7a 53 63 68              zSch
1e150 65 6d 61 4e 61 6d 65 20 3d 20 69 44 62 3e 3d 30  emaName = iDb>=0
1e160 20 3f 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   ? db->aDb[iDb].
1e170 7a 4e 61 6d 65 20 3a 20 22 2a 22 3b 0a 20 20 20  zName : "*";.   
1e180 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1e190 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54     for(j=0; j<pT
1e1a0 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a  ab->nCol; j++){.
1e1b0 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72              char
1e1c0 20 2a 7a 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e   *zName = pTab->
1e1d0 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20  aCol[j].zName;. 
1e1e0 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20             char 
1e1f0 2a 7a 43 6f 6c 6e 61 6d 65 3b 20 20 2f 2a 20 54  *zColname;  /* T
1e200 68 65 20 63 6f 6d 70 75 74 65 64 20 63 6f 6c 75  he computed colu
1e210 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20  mn name */.     
1e220 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 6f         char *zTo
1e230 46 72 65 65 3b 20 20 20 2f 2a 20 4d 61 6c 6c 6f  Free;   /* Mallo
1e240 63 65 64 20 73 74 72 69 6e 67 20 74 68 61 74 20  ced string that 
1e250 6e 65 65 64 73 20 74 6f 20 62 65 20 66 72 65 65  needs to be free
1e260 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  d */.           
1e270 20 54 6f 6b 65 6e 20 73 43 6f 6c 6e 61 6d 65 3b   Token sColname;
1e280 20 20 2f 2a 20 43 6f 6d 70 75 74 65 64 20 63 6f    /* Computed co
1e290 6c 75 6d 6e 20 6e 61 6d 65 20 61 73 20 61 20 74  lumn name as a t
1e2a0 6f 6b 65 6e 20 2a 2f 0a 0a 20 20 20 20 20 20 20  oken */..       
1e2b0 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 4e 61       assert( zNa
1e2c0 6d 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  me );.          
1e2d0 20 20 69 66 28 20 7a 54 4e 61 6d 65 20 26 26 20    if( zTName && 
1e2e0 70 53 75 62 0a 20 20 20 20 20 20 20 20 20 20 20  pSub.           
1e2f0 20 20 26 26 20 73 71 6c 69 74 65 33 4d 61 74 63    && sqlite3Matc
1e300 68 53 70 61 6e 4e 61 6d 65 28 70 53 75 62 2d 3e  hSpanName(pSub->
1e310 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 53 70  pEList->a[j].zSp
1e320 61 6e 2c 20 30 2c 20 7a 54 4e 61 6d 65 2c 20 30  an, 0, zTName, 0
1e330 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  )==0.           
1e340 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1e350 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
1e360 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
1e370 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 20 63         /* If a c
1e380 6f 6c 75 6d 6e 20 69 73 20 6d 61 72 6b 65 64 20  olumn is marked 
1e390 61 73 20 27 68 69 64 64 65 6e 27 20 28 63 75 72  as 'hidden' (cur
1e3a0 72 65 6e 74 6c 79 20 6f 6e 6c 79 20 70 6f 73 73  rently only poss
1e3b0 69 62 6c 65 0a 20 20 20 20 20 20 20 20 20 20 20  ible.           
1e3c0 20 2a 2a 20 66 6f 72 20 76 69 72 74 75 61 6c 20   ** for virtual 
1e3d0 74 61 62 6c 65 73 29 2c 20 64 6f 20 6e 6f 74 20  tables), do not 
1e3e0 69 6e 63 6c 75 64 65 20 69 74 20 69 6e 20 74 68  include it in th
1e3f0 65 20 65 78 70 61 6e 64 65 64 0a 20 20 20 20 20  e expanded.     
1e400 20 20 20 20 20 20 20 2a 2a 20 72 65 73 75 6c 74         ** result
1e410 2d 73 65 74 20 6c 69 73 74 2e 0a 20 20 20 20 20  -set list..     
1e420 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
1e430 20 20 20 20 20 20 69 66 28 20 49 73 48 69 64 64        if( IsHidd
1e440 65 6e 43 6f 6c 75 6d 6e 28 26 70 54 61 62 2d 3e  enColumn(&pTab->
1e450 61 43 6f 6c 5b 6a 5d 29 20 29 7b 0a 20 20 20 20  aCol[j]) ){.    
1e460 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
1e470 28 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29  (IsVirtual(pTab)
1e480 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
1e490 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
1e4a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1e4b0 20 20 20 20 20 74 61 62 6c 65 53 65 65 6e 20 3d       tableSeen =
1e4c0 20 31 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20   1;..           
1e4d0 20 69 66 28 20 69 3e 30 20 26 26 20 7a 54 4e 61   if( i>0 && zTNa
1e4e0 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  me==0 ){.       
1e4f0 20 20 20 20 20 20 20 69 66 28 20 28 70 46 72 6f         if( (pFro
1e500 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54  m->jointype & JT
1e510 5f 4e 41 54 55 52 41 4c 29 21 3d 30 0a 20 20 20  _NATURAL)!=0.   
1e520 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
1e530 74 61 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e  tableAndColumnIn
1e540 64 65 78 28 70 54 61 62 4c 69 73 74 2c 20 69 2c  dex(pTabList, i,
1e550 20 7a 4e 61 6d 65 2c 20 30 2c 20 30 29 0a 20 20   zName, 0, 0).  
1e560 20 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20              ){. 
1e570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1e580 2a 20 49 6e 20 61 20 4e 41 54 55 52 41 4c 20 6a  * In a NATURAL j
1e590 6f 69 6e 2c 20 6f 6d 69 74 20 74 68 65 20 6a 6f  oin, omit the jo
1e5a0 69 6e 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20  in columns from 
1e5b0 74 68 65 20 0a 20 20 20 20 20 20 20 20 20 20 20  the .           
1e5c0 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 74 6f       ** table to
1e5d0 20 74 68 65 20 72 69 67 68 74 20 6f 66 20 74 68   the right of th
1e5e0 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20 20 20 20 20  e join */.      
1e5f0 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
1e600 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
1e610 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
1e620 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 64 4c    if( sqlite3IdL
1e630 69 73 74 49 6e 64 65 78 28 70 46 72 6f 6d 2d 3e  istIndex(pFrom->
1e640 70 55 73 69 6e 67 2c 20 7a 4e 61 6d 65 29 3e 3d  pUsing, zName)>=
1e650 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
1e660 20 20 20 20 20 2f 2a 20 49 6e 20 61 20 6a 6f 69       /* In a joi
1e670 6e 20 77 69 74 68 20 61 20 55 53 49 4e 47 20 63  n with a USING c
1e680 6c 61 75 73 65 2c 20 6f 6d 69 74 20 63 6f 6c 75  lause, omit colu
1e690 6d 6e 73 20 69 6e 20 74 68 65 0a 20 20 20 20 20  mns in the.     
1e6a0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75 73             ** us
1e6b0 69 6e 67 20 63 6c 61 75 73 65 20 66 72 6f 6d 20  ing clause from 
1e6c0 74 68 65 20 74 61 62 6c 65 20 6f 6e 20 74 68 65  the table on the
1e6d0 20 72 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20 20   right. */.     
1e6e0 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
1e6f0 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nue;.           
1e700 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
1e710 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70   }.            p
1e720 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45  Right = sqlite3E
1e730 78 70 72 28 64 62 2c 20 54 4b 5f 49 44 2c 20 7a  xpr(db, TK_ID, z
1e740 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Name);.         
1e750 20 20 20 7a 43 6f 6c 6e 61 6d 65 20 3d 20 7a 4e     zColname = zN
1e760 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ame;.           
1e770 20 7a 54 6f 46 72 65 65 20 3d 20 30 3b 0a 20 20   zToFree = 0;.  
1e780 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6c 6f            if( lo
1e790 6e 67 4e 61 6d 65 73 20 7c 7c 20 70 54 61 62 4c  ngNames || pTabL
1e7a0 69 73 74 2d 3e 6e 53 72 63 3e 31 20 29 7b 0a 20  ist->nSrc>1 ){. 
1e7b0 20 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70               Exp
1e7c0 72 20 2a 70 4c 65 66 74 3b 0a 20 20 20 20 20 20  r *pLeft;.      
1e7d0 20 20 20 20 20 20 20 20 70 4c 65 66 74 20 3d 20          pLeft = 
1e7e0 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20  sqlite3Expr(db, 
1e7f0 54 4b 5f 49 44 2c 20 7a 54 61 62 4e 61 6d 65 29  TK_ID, zTabName)
1e800 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1e810 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50  pExpr = sqlite3P
1e820 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f  Expr(pParse, TK_
1e830 44 4f 54 2c 20 70 4c 65 66 74 2c 20 70 52 69 67  DOT, pLeft, pRig
1e840 68 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ht, 0);.        
1e850 20 20 20 20 20 20 69 66 28 20 7a 53 63 68 65 6d        if( zSchem
1e860 61 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20  aName ){.       
1e870 20 20 20 20 20 20 20 20 20 70 4c 65 66 74 20 3d           pLeft =
1e880 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c   sqlite3Expr(db,
1e890 20 54 4b 5f 49 44 2c 20 7a 53 63 68 65 6d 61 4e   TK_ID, zSchemaN
1e8a0 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
1e8b0 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 73 71        pExpr = sq
1e8c0 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
1e8d0 65 2c 20 54 4b 5f 44 4f 54 2c 20 70 4c 65 66 74  e, TK_DOT, pLeft
1e8e0 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20  , pExpr, 0);.   
1e8f0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
1e900 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6c             if( l
1e910 6f 6e 67 4e 61 6d 65 73 20 29 7b 0a 20 20 20 20  ongNames ){.    
1e920 20 20 20 20 20 20 20 20 20 20 20 20 7a 43 6f 6c              zCol
1e930 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50  name = sqlite3MP
1e940 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2e 25 73  rintf(db, "%s.%s
1e950 22 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 7a 4e 61  ", zTabName, zNa
1e960 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  me);.           
1e970 20 20 20 20 20 7a 54 6f 46 72 65 65 20 3d 20 7a       zToFree = z
1e980 43 6f 6c 6e 61 6d 65 3b 0a 20 20 20 20 20 20 20  Colname;.       
1e990 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1e9a0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1e9b0 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 20            pExpr 
1e9c0 3d 20 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  = pRight;.      
1e9d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1e9e0 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74      pNew = sqlit
1e9f0 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
1ea00 28 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 70  (pParse, pNew, p
1ea10 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20  Expr);.         
1ea20 20 20 20 73 43 6f 6c 6e 61 6d 65 2e 7a 20 3d 20     sColname.z = 
1ea30 7a 43 6f 6c 6e 61 6d 65 3b 0a 20 20 20 20 20 20  zColname;.      
1ea40 20 20 20 20 20 20 73 43 6f 6c 6e 61 6d 65 2e 6e        sColname.n
1ea50 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
1ea60 33 30 28 7a 43 6f 6c 6e 61 6d 65 29 3b 0a 20 20  30(zColname);.  
1ea70 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1ea80 33 45 78 70 72 4c 69 73 74 53 65 74 4e 61 6d 65  3ExprListSetName
1ea90 28 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 26  (pParse, pNew, &
1eaa0 73 43 6f 6c 6e 61 6d 65 2c 20 30 29 3b 0a 20 20  sColname, 0);.  
1eab0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4e            if( pN
1eac0 65 77 20 26 26 20 28 70 2d 3e 73 65 6c 46 6c 61  ew && (p->selFla
1ead0 67 73 20 26 20 53 46 5f 4e 65 73 74 65 64 46 72  gs & SF_NestedFr
1eae0 6f 6d 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  om)!=0 ){.      
1eaf0 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 45          struct E
1eb00 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 58  xprList_item *pX
1eb10 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 70 4e 65 77   = &pNew->a[pNew
1eb20 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20 20 20  ->nExpr-1];.    
1eb30 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 53            if( pS
1eb40 75 62 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ub ){.          
1eb50 20 20 20 20 20 20 70 58 2d 3e 7a 53 70 61 6e 20        pX->zSpan 
1eb60 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
1eb70 70 28 64 62 2c 20 70 53 75 62 2d 3e 70 45 4c 69  p(db, pSub->pELi
1eb80 73 74 2d 3e 61 5b 6a 5d 2e 7a 53 70 61 6e 29 3b  st->a[j].zSpan);
1eb90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1eba0 20 74 65 73 74 63 61 73 65 28 20 70 58 2d 3e 7a   testcase( pX->z
1ebb0 53 70 61 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Span==0 );.     
1ebc0 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
1ebd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ebe0 70 58 2d 3e 7a 53 70 61 6e 20 3d 20 73 71 6c 69  pX->zSpan = sqli
1ebf0 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
1ec00 25 73 2e 25 73 2e 25 73 22 2c 0a 20 20 20 20 20  %s.%s.%s",.     
1ec10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec30 20 20 20 20 20 20 7a 53 63 68 65 6d 61 4e 61 6d        zSchemaNam
1ec40 65 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 7a 43 6f  e, zTabName, zCo
1ec50 6c 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  lname);.        
1ec60 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
1ec70 28 20 70 58 2d 3e 7a 53 70 61 6e 3d 3d 30 20 29  ( pX->zSpan==0 )
1ec80 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1ec90 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
1eca0 70 58 2d 3e 62 53 70 61 6e 49 73 54 61 62 20 3d  pX->bSpanIsTab =
1ecb0 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   1;.            
1ecc0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  }.            sq
1ecd0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
1ece0 7a 54 6f 46 72 65 65 29 3b 0a 20 20 20 20 20 20  zToFree);.      
1ecf0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
1ed00 20 20 20 20 20 20 20 20 69 66 28 20 21 74 61 62          if( !tab
1ed10 6c 65 53 65 65 6e 20 29 7b 0a 20 20 20 20 20 20  leSeen ){.      
1ed20 20 20 20 20 69 66 28 20 7a 54 4e 61 6d 65 20 29      if( zTName )
1ed30 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
1ed40 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
1ed50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 74  arse, "no such t
1ed60 61 62 6c 65 3a 20 25 73 22 2c 20 7a 54 4e 61 6d  able: %s", zTNam
1ed70 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  e);.          }e
1ed80 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
1ed90 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
1eda0 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 74 61 62  (pParse, "no tab
1edb0 6c 65 73 20 73 70 65 63 69 66 69 65 64 22 29 3b  les specified");
1edc0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1edd0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1ede0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
1edf0 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
1ee00 62 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  b, pEList);.    
1ee10 70 2d 3e 70 45 4c 69 73 74 20 3d 20 70 4e 65 77  p->pEList = pNew
1ee20 3b 0a 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45  ;.  }.#if SQLITE
1ee30 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 0a 20 20 69 66  _MAX_COLUMN.  if
1ee40 28 20 70 2d 3e 70 45 4c 69 73 74 20 26 26 20 70  ( p->pEList && p
1ee50 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e  ->pEList->nExpr>
1ee60 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54  db->aLimit[SQLIT
1ee70 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20  E_LIMIT_COLUMN] 
1ee80 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
1ee90 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
1eea0 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73  too many columns
1eeb0 20 69 6e 20 72 65 73 75 6c 74 20 73 65 74 22 29   in result set")
1eec0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72  ;.  }.#endif.  r
1eed0 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
1eee0 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4e 6f 2d  ue;.}../*.** No-
1eef0 6f 70 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 74  op routine for t
1ef00 68 65 20 70 61 72 73 65 2d 74 72 65 65 20 77 61  he parse-tree wa
1ef10 6c 6b 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  lker..**.** When
1ef20 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
1ef30 20 74 68 65 20 57 61 6c 6b 65 72 2e 78 45 78 70   the Walker.xExp
1ef40 72 43 61 6c 6c 62 61 63 6b 20 74 68 65 6e 20 65  rCallback then e
1ef50 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 73 0a  xpression trees.
1ef60 2a 2a 20 61 72 65 20 77 61 6c 6b 65 64 20 77 69  ** are walked wi
1ef70 74 68 6f 75 74 20 61 6e 79 20 61 63 74 69 6f 6e  thout any action
1ef80 73 20 62 65 69 6e 67 20 74 61 6b 65 6e 20 61 74  s being taken at
1ef90 20 65 61 63 68 20 6e 6f 64 65 2e 20 20 50 72 65   each node.  Pre
1efa0 73 75 6d 61 62 6c 79 2c 0a 2a 2a 20 77 68 65 6e  sumably,.** when
1efb0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
1efc0 20 75 73 65 64 20 66 6f 72 20 57 61 6c 6b 65 72   used for Walker
1efd0 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 74  .xExprCallback t
1efe0 68 65 6e 20 0a 2a 2a 20 57 61 6c 6b 65 72 2e 78  hen .** Walker.x
1eff0 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 69  SelectCallback i
1f000 73 20 73 65 74 20 74 6f 20 64 6f 20 73 6f 6d 65  s set to do some
1f010 74 68 69 6e 67 20 75 73 65 66 75 6c 20 66 6f 72  thing useful for
1f020 20 65 76 65 72 79 20 0a 2a 2a 20 73 75 62 71 75   every .** subqu
1f030 65 72 79 20 69 6e 20 74 68 65 20 70 61 72 73 65  ery in the parse
1f040 72 20 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69  r tree..*/.stati
1f050 63 20 69 6e 74 20 65 78 70 72 57 61 6c 6b 4e 6f  c int exprWalkNo
1f060 6f 70 28 57 61 6c 6b 65 72 20 2a 4e 6f 74 55 73  op(Walker *NotUs
1f070 65 64 2c 20 45 78 70 72 20 2a 4e 6f 74 55 73 65  ed, Expr *NotUse
1f080 64 32 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  d2){.  UNUSED_PA
1f090 52 41 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64  RAMETER2(NotUsed
1f0a0 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 72  , NotUsed2);.  r
1f0b0 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
1f0c0 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ue;.}../*.** Thi
1f0d0 73 20 72 6f 75 74 69 6e 65 20 22 65 78 70 61 6e  s routine "expan
1f0e0 64 73 22 20 61 20 53 45 4c 45 43 54 20 73 74 61  ds" a SELECT sta
1f0f0 74 65 6d 65 6e 74 20 61 6e 64 20 61 6c 6c 20 6f  tement and all o
1f100 66 20 69 74 73 20 73 75 62 71 75 65 72 69 65 73  f its subqueries
1f110 2e 0a 2a 2a 20 46 6f 72 20 61 64 64 69 74 69 6f  ..** For additio
1f120 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  nal information 
1f130 6f 6e 20 77 68 61 74 20 69 74 20 6d 65 61 6e 73  on what it means
1f140 20 74 6f 20 22 65 78 70 61 6e 64 22 20 61 20 53   to "expand" a S
1f150 45 4c 45 43 54 0a 2a 2a 20 73 74 61 74 65 6d 65  ELECT.** stateme
1f160 6e 74 2c 20 73 65 65 20 74 68 65 20 63 6f 6d 6d  nt, see the comm
1f170 65 6e 74 20 6f 6e 20 74 68 65 20 73 65 6c 65 63  ent on the selec
1f180 74 45 78 70 61 6e 64 20 77 6f 72 6b 65 72 20 63  tExpand worker c
1f190 61 6c 6c 62 61 63 6b 20 61 62 6f 76 65 2e 0a 2a  allback above..*
1f1a0 2a 0a 2a 2a 20 45 78 70 61 6e 64 69 6e 67 20 61  *.** Expanding a
1f1b0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
1f1c0 74 20 69 73 20 74 68 65 20 66 69 72 73 74 20 73  t is the first s
1f1d0 74 65 70 20 69 6e 20 70 72 6f 63 65 73 73 69 6e  tep in processin
1f1e0 67 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74  g a.** SELECT st
1f1f0 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 53 45  atement.  The SE
1f200 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 6d  LECT statement m
1f210 75 73 74 20 62 65 20 65 78 70 61 6e 64 65 64 20  ust be expanded 
1f220 62 65 66 6f 72 65 0a 2a 2a 20 6e 61 6d 65 20 72  before.** name r
1f230 65 73 6f 6c 75 74 69 6f 6e 20 69 73 20 70 65 72  esolution is per
1f240 66 6f 72 6d 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  formed..**.** If
1f250 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20 77   anything goes w
1f260 72 6f 6e 67 2c 20 61 6e 20 65 72 72 6f 72 20 6d  rong, an error m
1f270 65 73 73 61 67 65 20 69 73 20 77 72 69 74 74 65  essage is writte
1f280 6e 20 69 6e 74 6f 20 70 50 61 72 73 65 2e 0a 2a  n into pParse..*
1f290 2a 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75  * The calling fu
1f2a0 6e 63 74 69 6f 6e 20 63 61 6e 20 64 65 74 65 63  nction can detec
1f2b0 74 20 74 68 65 20 70 72 6f 62 6c 65 6d 20 62 79  t the problem by
1f2c0 20 6c 6f 6f 6b 69 6e 67 20 61 74 20 70 50 61 72   looking at pPar
1f2d0 73 65 2d 3e 6e 45 72 72 0a 2a 2a 20 61 6e 64 2f  se->nErr.** and/
1f2e0 6f 72 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  or pParse->db->m
1f2f0 61 6c 6c 6f 63 46 61 69 6c 65 64 2e 0a 2a 2f 0a  allocFailed..*/.
1f300 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69  static void sqli
1f310 74 65 33 53 65 6c 65 63 74 45 78 70 61 6e 64 28  te3SelectExpand(
1f320 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
1f330 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b  elect *pSelect){
1f340 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 77  .  Walker w;.  w
1f350 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
1f360 20 3d 20 73 65 6c 65 63 74 45 78 70 61 6e 64 65   = selectExpande
1f370 72 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c  r;.  w.xExprCall
1f380 62 61 63 6b 20 3d 20 65 78 70 72 57 61 6c 6b 4e  back = exprWalkN
1f390 6f 6f 70 3b 0a 20 20 77 2e 70 50 61 72 73 65 20  oop;.  w.pParse 
1f3a0 3d 20 70 50 61 72 73 65 3b 0a 20 20 73 71 6c 69  = pParse;.  sqli
1f3b0 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 26 77  te3WalkSelect(&w
1f3c0 2c 20 70 53 65 6c 65 63 74 29 3b 0a 7d 0a 0a 0a  , pSelect);.}...
1f3d0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1f3e0 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a  MIT_SUBQUERY./*.
1f3f0 2a 2a 20 54 68 69 73 20 69 73 20 61 20 57 61 6c  ** This is a Wal
1f400 6b 65 72 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62  ker.xSelectCallb
1f410 61 63 6b 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72  ack callback for
1f420 20 74 68 65 20 73 71 6c 69 74 65 33 53 65 6c 65   the sqlite3Sele
1f430 63 74 54 79 70 65 49 6e 66 6f 28 29 0a 2a 2a 20  ctTypeInfo().** 
1f440 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2a 0a 2a 2a  interface..**.**
1f450 20 46 6f 72 20 65 61 63 68 20 46 52 4f 4d 2d 63   For each FROM-c
1f460 6c 61 75 73 65 20 73 75 62 71 75 65 72 79 2c 20  lause subquery, 
1f470 61 64 64 20 43 6f 6c 75 6d 6e 2e 7a 54 79 70 65  add Column.zType
1f480 20 61 6e 64 20 43 6f 6c 75 6d 6e 2e 7a 43 6f 6c   and Column.zCol
1f490 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  l.** information
1f4a0 20 74 6f 20 74 68 65 20 54 61 62 6c 65 20 73 74   to the Table st
1f4b0 72 75 63 74 75 72 65 20 74 68 61 74 20 72 65 70  ructure that rep
1f4c0 72 65 73 65 6e 74 73 20 74 68 65 20 72 65 73 75  resents the resu
1f4d0 6c 74 20 73 65 74 0a 2a 2a 20 6f 66 20 74 68 61  lt set.** of tha
1f4e0 74 20 73 75 62 71 75 65 72 79 2e 0a 2a 2a 0a 2a  t subquery..**.*
1f4f0 2a 20 54 68 65 20 54 61 62 6c 65 20 73 74 72 75  * The Table stru
1f500 63 74 75 72 65 20 74 68 61 74 20 72 65 70 72 65  cture that repre
1f510 73 65 6e 74 73 20 74 68 65 20 72 65 73 75 6c 74  sents the result
1f520 20 73 65 74 20 77 61 73 20 63 6f 6e 73 74 72 75   set was constru
1f530 63 74 65 64 0a 2a 2a 20 62 79 20 73 65 6c 65 63  cted.** by selec
1f540 74 45 78 70 61 6e 64 65 72 28 29 20 62 75 74 20  tExpander() but 
1f550 74 68 65 20 74 79 70 65 20 61 6e 64 20 63 6f 6c  the type and col
1f560 6c 61 74 69 6f 6e 20 69 6e 66 6f 72 6d 61 74 69  lation informati
1f570 6f 6e 20 77 61 73 20 6f 6d 69 74 74 65 64 0a 2a  on was omitted.*
1f580 2a 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74 20  * at that point 
1f590 62 65 63 61 75 73 65 20 69 64 65 6e 74 69 66 69  because identifi
1f5a0 65 72 73 20 68 61 64 20 6e 6f 74 20 79 65 74 20  ers had not yet 
1f5b0 62 65 65 6e 20 72 65 73 6f 6c 76 65 64 2e 20 20  been resolved.  
1f5c0 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  This.** routine 
1f5d0 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20  is called after 
1f5e0 69 64 65 6e 74 69 66 69 65 72 20 72 65 73 6f 6c  identifier resol
1f5f0 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ution..*/.static
1f600 20 69 6e 74 20 73 65 6c 65 63 74 41 64 64 53 75   int selectAddSu
1f610 62 71 75 65 72 79 54 79 70 65 49 6e 66 6f 28 57  bqueryTypeInfo(W
1f620 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
1f630 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 50 61  Select *p){.  Pa
1f640 72 73 65 20 2a 70 50 61 72 73 65 3b 0a 20 20 69  rse *pParse;.  i
1f650 6e 74 20 69 3b 0a 20 20 53 72 63 4c 69 73 74 20  nt i;.  SrcList 
1f660 2a 70 54 61 62 4c 69 73 74 3b 0a 20 20 73 74 72  *pTabList;.  str
1f670 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
1f680 20 2a 70 46 72 6f 6d 3b 0a 0a 20 20 61 73 73 65   *pFrom;..  asse
1f690 72 74 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  rt( p->selFlags 
1f6a0 26 20 53 46 5f 52 65 73 6f 6c 76 65 64 20 29 3b  & SF_Resolved );
1f6b0 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c  .  if( (p->selFl
1f6c0 61 67 73 20 26 20 53 46 5f 48 61 73 54 79 70 65  ags & SF_HasType
1f6d0 49 6e 66 6f 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Info)==0 ){.    
1f6e0 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53  p->selFlags |= S
1f6f0 46 5f 48 61 73 54 79 70 65 49 6e 66 6f 3b 0a 20  F_HasTypeInfo;. 
1f700 20 20 20 70 50 61 72 73 65 20 3d 20 70 57 61 6c     pParse = pWal
1f710 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20  ker->pParse;.   
1f720 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70   pTabList = p->p
1f730 53 72 63 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  Src;.    for(i=0
1f740 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74  , pFrom=pTabList
1f750 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d  ->a; i<pTabList-
1f760 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f  >nSrc; i++, pFro
1f770 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 54 61 62 6c  m++){.      Tabl
1f780 65 20 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d  e *pTab = pFrom-
1f790 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 69 66 28  >pTab;.      if(
1f7a0 20 41 4c 57 41 59 53 28 70 54 61 62 21 3d 30 29   ALWAYS(pTab!=0)
1f7b0 20 26 26 20 28 70 54 61 62 2d 3e 74 61 62 46 6c   && (pTab->tabFl
1f7c0 61 67 73 20 26 20 54 46 5f 45 70 68 65 6d 65 72  ags & TF_Ephemer
1f7d0 61 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  al)!=0 ){.      
1f7e0 20 20 2f 2a 20 41 20 73 75 62 2d 71 75 65 72 79    /* A sub-query
1f7f0 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
1f800 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20  use of a SELECT 
1f810 2a 2f 0a 20 20 20 20 20 20 20 20 53 65 6c 65 63  */.        Selec
1f820 74 20 2a 70 53 65 6c 20 3d 20 70 46 72 6f 6d 2d  t *pSel = pFrom-
1f830 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20  >pSelect;.      
1f840 20 20 61 73 73 65 72 74 28 20 70 53 65 6c 20 29    assert( pSel )
1f850 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  ;.        while(
1f860 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 20 29 20   pSel->pPrior ) 
1f870 70 53 65 6c 20 3d 20 70 53 65 6c 2d 3e 70 50 72  pSel = pSel->pPr
1f880 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 73 65 6c  ior;.        sel
1f890 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65  ectAddColumnType
1f8a0 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 70 50 61  AndCollation(pPa
1f8b0 72 73 65 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c 2c  rse, pTab->nCol,
1f8c0 20 70 54 61 62 2d 3e 61 43 6f 6c 2c 20 70 53 65   pTab->aCol, pSe
1f8d0 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  l);.      }.    
1f8e0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 57  }.  }.  return W
1f8f0 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 23  RC_Continue;.}.#
1f900 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  endif.../*.** Th
1f910 69 73 20 72 6f 75 74 69 6e 65 20 61 64 64 73 20  is routine adds 
1f920 64 61 74 61 74 79 70 65 20 61 6e 64 20 63 6f 6c  datatype and col
1f930 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
1f940 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 0a 2a  information to.*
1f950 2a 20 74 68 65 20 54 61 62 6c 65 20 73 74 72 75  * the Table stru
1f960 63 74 75 72 65 73 20 6f 66 20 61 6c 6c 20 46 52  ctures of all FR
1f970 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62 71 75 65  OM-clause subque
1f980 72 69 65 73 20 69 6e 20 61 0a 2a 2a 20 53 45 4c  ries in a.** SEL
1f990 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  ECT statement..*
1f9a0 2a 0a 2a 2a 20 55 73 65 20 74 68 69 73 20 72 6f  *.** Use this ro
1f9b0 75 74 69 6e 65 20 61 66 74 65 72 20 6e 61 6d 65  utine after name
1f9c0 20 72 65 73 6f 6c 75 74 69 6f 6e 2e 0a 2a 2f 0a   resolution..*/.
1f9d0 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69  static void sqli
1f9e0 74 65 33 53 65 6c 65 63 74 41 64 64 54 79 70 65  te3SelectAddType
1f9f0 49 6e 66 6f 28 50 61 72 73 65 20 2a 70 50 61 72  Info(Parse *pPar
1fa00 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  se, Select *pSel
1fa10 65 63 74 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  ect){.#ifndef SQ
1fa20 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
1fa30 52 59 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20  RY.  Walker w;. 
1fa40 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61   w.xSelectCallba
1fa50 63 6b 20 3d 20 73 65 6c 65 63 74 41 64 64 53 75  ck = selectAddSu
1fa60 62 71 75 65 72 79 54 79 70 65 49 6e 66 6f 3b 0a  bqueryTypeInfo;.
1fa70 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63    w.xExprCallbac
1fa80 6b 20 3d 20 65 78 70 72 57 61 6c 6b 4e 6f 6f 70  k = exprWalkNoop
1fa90 3b 0a 20 20 77 2e 70 50 61 72 73 65 20 3d 20 70  ;.  w.pParse = p
1faa0 50 61 72 73 65 3b 0a 20 20 73 71 6c 69 74 65 33  Parse;.  sqlite3
1fab0 57 61 6c 6b 53 65 6c 65 63 74 28 26 77 2c 20 70  WalkSelect(&w, p
1fac0 53 65 6c 65 63 74 29 3b 0a 23 65 6e 64 69 66 0a  Select);.#endif.
1fad0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  }.../*.** This r
1fae0 6f 75 74 69 6e 65 20 73 65 74 73 20 75 70 20 61  outine sets up a
1faf0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
1fb00 74 20 66 6f 72 20 70 72 6f 63 65 73 73 69 6e 67  t for processing
1fb10 2e 20 20 54 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77  .  The.** follow
1fb20 69 6e 67 20 69 73 20 61 63 63 6f 6d 70 6c 69 73  ing is accomplis
1fb30 68 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a  hed:.**.**     *
1fb40 20 20 56 44 42 45 20 43 75 72 73 6f 72 20 6e 75    VDBE Cursor nu
1fb50 6d 62 65 72 73 20 61 72 65 20 61 73 73 69 67 6e  mbers are assign
1fb60 65 64 20 74 6f 20 61 6c 6c 20 46 52 4f 4d 2d 63  ed to all FROM-c
1fb70 6c 61 75 73 65 20 74 65 72 6d 73 2e 0a 2a 2a 20  lause terms..** 
1fb80 20 20 20 20 2a 20 20 45 70 68 65 6d 65 72 61 6c      *  Ephemeral
1fb90 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 73 20 61   Table objects a
1fba0 72 65 20 63 72 65 61 74 65 64 20 66 6f 72 20 61  re created for a
1fbb0 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73  ll FROM-clause s
1fbc0 75 62 71 75 65 72 69 65 73 2e 0a 2a 2a 20 20 20  ubqueries..**   
1fbd0 20 20 2a 20 20 4f 4e 20 61 6e 64 20 55 53 49 4e    *  ON and USIN
1fbe0 47 20 63 6c 61 75 73 65 73 20 61 72 65 20 73 68  G clauses are sh
1fbf0 69 66 74 65 64 20 69 6e 74 6f 20 57 48 45 52 45  ifted into WHERE
1fc00 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 20   statements.**  
1fc10 20 20 20 2a 20 20 57 69 6c 64 63 61 72 64 73 20     *  Wildcards 
1fc20 22 2a 22 20 61 6e 64 20 22 54 41 42 4c 45 2e 2a  "*" and "TABLE.*
1fc30 22 20 69 6e 20 72 65 73 75 6c 74 20 73 65 74 73  " in result sets
1fc40 20 61 72 65 20 65 78 70 61 6e 64 65 64 2e 0a 2a   are expanded..*
1fc50 2a 20 20 20 20 20 2a 20 20 49 64 65 6e 74 69 66  *     *  Identif
1fc60 69 65 72 73 20 69 6e 20 65 78 70 72 65 73 73 69  iers in expressi
1fc70 6f 6e 20 61 72 65 20 6d 61 74 63 68 65 64 20 74  on are matched t
1fc80 6f 20 74 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  o tables..**.** 
1fc90 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 63 74  This routine act
1fca0 73 20 72 65 63 75 72 73 69 76 65 6c 79 20 6f 6e  s recursively on
1fcb0 20 61 6c 6c 20 73 75 62 71 75 65 72 69 65 73 20   all subqueries 
1fcc0 77 69 74 68 69 6e 20 74 68 65 20 53 45 4c 45 43  within the SELEC
1fcd0 54 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  T..*/.void sqlit
1fce0 65 33 53 65 6c 65 63 74 50 72 65 70 28 0a 20 20  e3SelectPrep(.  
1fcf0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
1fd00 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
1fd10 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
1fd20 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
1fd30 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1fd40 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
1fd50 20 62 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a 2f   being coded. */
1fd60 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a  .  NameContext *
1fd70 70 4f 75 74 65 72 4e 43 20 20 2f 2a 20 4e 61 6d  pOuterNC  /* Nam
1fd80 65 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 63 6f  e context for co
1fd90 6e 74 61 69 6e 65 72 20 2a 2f 0a 29 7b 0a 20 20  ntainer */.){.  
1fda0 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69  sqlite3 *db;.  i
1fdb0 66 28 20 4e 45 56 45 52 28 70 3d 3d 30 29 20 29  f( NEVER(p==0) )
1fdc0 20 72 65 74 75 72 6e 3b 0a 20 20 64 62 20 3d 20   return;.  db = 
1fdd0 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66  pParse->db;.  if
1fde0 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
1fdf0 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  ed ) return;.  i
1fe00 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  f( p->selFlags &
1fe10 20 53 46 5f 48 61 73 54 79 70 65 49 6e 66 6f 20   SF_HasTypeInfo 
1fe20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69  ) return;.  sqli
1fe30 74 65 33 53 65 6c 65 63 74 45 78 70 61 6e 64 28  te3SelectExpand(
1fe40 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 69 66  pParse, p);.  if
1fe50 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  ( pParse->nErr |
1fe60 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
1fe70 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73  ed ) return;.  s
1fe80 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 53 65 6c  qlite3ResolveSel
1fe90 65 63 74 4e 61 6d 65 73 28 70 50 61 72 73 65 2c  ectNames(pParse,
1fea0 20 70 2c 20 70 4f 75 74 65 72 4e 43 29 3b 0a 20   p, pOuterNC);. 
1feb0 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
1fec0 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  r || db->mallocF
1fed0 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a  ailed ) return;.
1fee0 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41    sqlite3SelectA
1fef0 64 64 54 79 70 65 49 6e 66 6f 28 70 50 61 72 73  ddTypeInfo(pPars
1ff00 65 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  e, p);.}../*.** 
1ff10 52 65 73 65 74 20 74 68 65 20 61 67 67 72 65 67  Reset the aggreg
1ff20 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 2e  ate accumulator.
1ff30 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 67 67 72 65  .**.** The aggre
1ff40 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72  gate accumulator
1ff50 20 69 73 20 61 20 73 65 74 20 6f 66 20 6d 65 6d   is a set of mem
1ff60 6f 72 79 20 63 65 6c 6c 73 20 74 68 61 74 20 68  ory cells that h
1ff70 6f 6c 64 0a 2a 2a 20 69 6e 74 65 72 6d 65 64 69  old.** intermedi
1ff80 61 74 65 20 72 65 73 75 6c 74 73 20 77 68 69 6c  ate results whil
1ff90 65 20 63 61 6c 63 75 6c 61 74 69 6e 67 20 61 6e  e calculating an
1ffa0 20 61 67 67 72 65 67 61 74 65 2e 20 20 54 68 69   aggregate.  Thi
1ffb0 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67 65 6e  s.** routine gen
1ffc0 65 72 61 74 65 73 20 63 6f 64 65 20 74 68 61 74  erates code that
1ffd0 20 73 74 6f 72 65 73 20 4e 55 4c 4c 73 20 69 6e   stores NULLs in
1ffe0 20 61 6c 6c 20 6f 66 20 74 68 6f 73 65 20 6d 65   all of those me
1fff0 6d 6f 72 79 0a 2a 2a 20 63 65 6c 6c 73 2e 0a 2a  mory.** cells..*
20000 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  /.static void re
20010 73 65 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 50  setAccumulator(P
20020 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67  arse *pParse, Ag
20030 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29  gInfo *pAggInfo)
20040 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
20050 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
20060 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 41  nt i;.  struct A
20070 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 75  ggInfo_func *pFu
20080 6e 63 3b 0a 20 20 69 66 28 20 70 41 67 67 49 6e  nc;.  if( pAggIn
20090 66 6f 2d 3e 6e 46 75 6e 63 2b 70 41 67 67 49 6e  fo->nFunc+pAggIn
200a0 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 30 20 29  fo->nColumn==0 )
200b0 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
200c0 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  }.  for(i=0; i<p
200d0 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e  AggInfo->nColumn
200e0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; i++){.    sqli
200f0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
20100 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 41 67   OP_Null, 0, pAg
20110 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e 69  gInfo->aCol[i].i
20120 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  Mem);.  }.  for(
20130 70 46 75 6e 63 3d 70 41 67 67 49 6e 66 6f 2d 3e  pFunc=pAggInfo->
20140 61 46 75 6e 63 2c 20 69 3d 30 3b 20 69 3c 70 41  aFunc, i=0; i<pA
20150 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69  ggInfo->nFunc; i
20160 2b 2b 2c 20 70 46 75 6e 63 2b 2b 29 7b 0a 20 20  ++, pFunc++){.  
20170 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
20180 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  Op2(v, OP_Null, 
20190 30 2c 20 70 46 75 6e 63 2d 3e 69 4d 65 6d 29 3b  0, pFunc->iMem);
201a0 0a 20 20 20 20 69 66 28 20 70 46 75 6e 63 2d 3e  .    if( pFunc->
201b0 69 44 69 73 74 69 6e 63 74 3e 3d 30 20 29 7b 0a  iDistinct>=0 ){.
201c0 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d        Expr *pE =
201d0 20 70 46 75 6e 63 2d 3e 70 45 78 70 72 3b 0a 20   pFunc->pExpr;. 
201e0 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
201f0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
20200 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
20210 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 2d  );.      if( pE-
20220 3e 78 2e 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70  >x.pList==0 || p
20230 45 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70  E->x.pList->nExp
20240 72 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  r!=1 ){.        
20250 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
20260 70 50 61 72 73 65 2c 20 22 44 49 53 54 49 4e 43  pParse, "DISTINC
20270 54 20 61 67 67 72 65 67 61 74 65 73 20 6d 75 73  T aggregates mus
20280 74 20 68 61 76 65 20 65 78 61 63 74 6c 79 20 6f  t have exactly o
20290 6e 65 20 22 0a 20 20 20 20 20 20 20 20 20 20 20  ne ".           
202a0 22 61 72 67 75 6d 65 6e 74 22 29 3b 0a 20 20 20  "argument");.   
202b0 20 20 20 20 20 70 46 75 6e 63 2d 3e 69 44 69 73       pFunc->iDis
202c0 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 20 20  tinct = -1;.    
202d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
202e0 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
202f0 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d  fo = keyInfoFrom
20300 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
20310 20 70 45 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20   pE->x.pList);. 
20320 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
20330 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f  beAddOp4(v, OP_O
20340 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70 46  penEphemeral, pF
20350 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74 2c 20  unc->iDistinct, 
20360 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  0, 0,.          
20370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20380 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c  (char*)pKeyInfo,
20390 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44   P4_KEYINFO_HAND
203a0 4f 46 46 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OFF);.      }.  
203b0 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
203c0 20 49 6e 76 6f 6b 65 20 74 68 65 20 4f 50 5f 41   Invoke the OP_A
203d0 67 67 46 69 6e 61 6c 69 7a 65 20 6f 70 63 6f 64  ggFinalize opcod
203e0 65 20 66 6f 72 20 65 76 65 72 79 20 61 67 67 72  e for every aggr
203f0 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 0a 2a  egate function.*
20400 2a 20 69 6e 20 74 68 65 20 41 67 67 49 6e 66 6f  * in the AggInfo
20410 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73   structure..*/.s
20420 74 61 74 69 63 20 76 6f 69 64 20 66 69 6e 61 6c  tatic void final
20430 69 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e 73 28  izeAggFunctions(
20440 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41  Parse *pParse, A
20450 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f  ggInfo *pAggInfo
20460 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
20470 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
20480 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
20490 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46  AggInfo_func *pF
204a0 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 3d  ;.  for(i=0, pF=
204b0 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b  pAggInfo->aFunc;
204c0 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75   i<pAggInfo->nFu
204d0 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a  nc; i++, pF++){.
204e0 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c      ExprList *pL
204f0 69 73 74 20 3d 20 70 46 2d 3e 70 45 78 70 72 2d  ist = pF->pExpr-
20500 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 61 73  >x.pList;.    as
20510 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
20520 6f 70 65 72 74 79 28 70 46 2d 3e 70 45 78 70 72  operty(pF->pExpr
20530 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
20540 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
20550 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 41  beAddOp4(v, OP_A
20560 67 67 46 69 6e 61 6c 2c 20 70 46 2d 3e 69 4d 65  ggFinal, pF->iMe
20570 6d 2c 20 70 4c 69 73 74 20 3f 20 70 4c 69 73 74  m, pList ? pList
20580 2d 3e 6e 45 78 70 72 20 3a 20 30 2c 20 30 2c 0a  ->nExpr : 0, 0,.
20590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
205a0 20 20 20 20 20 20 28 76 6f 69 64 2a 29 70 46 2d        (void*)pF-
205b0 3e 70 46 75 6e 63 2c 20 50 34 5f 46 55 4e 43 44  >pFunc, P4_FUNCD
205c0 45 46 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  EF);.  }.}../*.*
205d0 2a 20 55 70 64 61 74 65 20 74 68 65 20 61 63 63  * Update the acc
205e0 75 6d 75 6c 61 74 6f 72 20 6d 65 6d 6f 72 79 20  umulator memory 
205f0 63 65 6c 6c 73 20 66 6f 72 20 61 6e 20 61 67 67  cells for an agg
20600 72 65 67 61 74 65 20 62 61 73 65 64 20 6f 6e 0a  regate based on.
20610 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  ** the current c
20620 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2e 0a  ursor position..
20630 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75  */.static void u
20640 70 64 61 74 65 41 63 63 75 6d 75 6c 61 74 6f 72  pdateAccumulator
20650 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
20660 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66  AggInfo *pAggInf
20670 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  o){.  Vdbe *v = 
20680 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
20690 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 65   int i;.  int re
206a0 67 48 69 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20  gHit = 0;.  int 
206b0 61 64 64 72 48 69 74 54 65 73 74 20 3d 20 30 3b  addrHitTest = 0;
206c0 0a 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66  .  struct AggInf
206d0 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a 20 20 73 74  o_func *pF;.  st
206e0 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c  ruct AggInfo_col
206f0 20 2a 70 43 3b 0a 0a 20 20 70 41 67 67 49 6e 66   *pC;..  pAggInf
20700 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20 3d 20  o->directMode = 
20710 31 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  1;.  sqlite3Expr
20720 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73  CacheClear(pPars
20730 65 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70  e);.  for(i=0, p
20740 46 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e  F=pAggInfo->aFun
20750 63 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e  c; i<pAggInfo->n
20760 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29  Func; i++, pF++)
20770 7b 0a 20 20 20 20 69 6e 74 20 6e 41 72 67 3b 0a  {.    int nArg;.
20780 20 20 20 20 69 6e 74 20 61 64 64 72 4e 65 78 74      int addrNext
20790 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 72 65   = 0;.    int re
207a0 67 41 67 67 3b 0a 20 20 20 20 45 78 70 72 4c 69  gAgg;.    ExprLi
207b0 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 46 2d 3e  st *pList = pF->
207c0 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a  pExpr->x.pList;.
207d0 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
207e0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 46 2d  rHasProperty(pF-
207f0 3e 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  >pExpr, EP_xIsSe
20800 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 69 66 28  lect) );.    if(
20810 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20   pList ){.      
20820 6e 41 72 67 20 3d 20 70 4c 69 73 74 2d 3e 6e 45  nArg = pList->nE
20830 78 70 72 3b 0a 20 20 20 20 20 20 72 65 67 41 67  xpr;.      regAg
20840 67 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  g = sqlite3GetTe
20850 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
20860 6e 41 72 67 29 3b 0a 20 20 20 20 20 20 73 71 6c  nArg);.      sql
20870 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72  ite3ExprCodeExpr
20880 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 4c 69  List(pParse, pLi
20890 73 74 2c 20 72 65 67 41 67 67 2c 20 31 29 3b 0a  st, regAgg, 1);.
208a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
208b0 20 6e 41 72 67 20 3d 20 30 3b 0a 20 20 20 20 20   nArg = 0;.     
208c0 20 72 65 67 41 67 67 20 3d 20 30 3b 0a 20 20 20   regAgg = 0;.   
208d0 20 7d 0a 20 20 20 20 69 66 28 20 70 46 2d 3e 69   }.    if( pF->i
208e0 44 69 73 74 69 6e 63 74 3e 3d 30 20 29 7b 0a 20  Distinct>=0 ){. 
208f0 20 20 20 20 20 61 64 64 72 4e 65 78 74 20 3d 20       addrNext = 
20900 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
20910 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 61  abel(v);.      a
20920 73 73 65 72 74 28 20 6e 41 72 67 3d 3d 31 20 29  ssert( nArg==1 )
20930 3b 0a 20 20 20 20 20 20 63 6f 64 65 44 69 73 74  ;.      codeDist
20940 69 6e 63 74 28 70 50 61 72 73 65 2c 20 70 46 2d  inct(pParse, pF-
20950 3e 69 44 69 73 74 69 6e 63 74 2c 20 61 64 64 72  >iDistinct, addr
20960 4e 65 78 74 2c 20 31 2c 20 72 65 67 41 67 67 29  Next, 1, regAgg)
20970 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
20980 70 46 2d 3e 70 46 75 6e 63 2d 3e 66 6c 61 67 73  pF->pFunc->flags
20990 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e   & SQLITE_FUNC_N
209a0 45 45 44 43 4f 4c 4c 20 29 7b 0a 20 20 20 20 20  EEDCOLL ){.     
209b0 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20   CollSeq *pColl 
209c0 3d 20 30 3b 0a 20 20 20 20 20 20 73 74 72 75 63  = 0;.      struc
209d0 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
209e0 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 69 6e  *pItem;.      in
209f0 74 20 6a 3b 0a 20 20 20 20 20 20 61 73 73 65 72  t j;.      asser
20a00 74 28 20 70 4c 69 73 74 21 3d 30 20 29 3b 20 20  t( pList!=0 );  
20a10 2f 2a 20 70 4c 69 73 74 21 3d 30 20 69 66 20 70  /* pList!=0 if p
20a20 46 2d 3e 70 46 75 6e 63 20 68 61 73 20 4e 45 45  F->pFunc has NEE
20a30 44 43 4f 4c 4c 20 2a 2f 0a 20 20 20 20 20 20 66  DCOLL */.      f
20a40 6f 72 28 6a 3d 30 2c 20 70 49 74 65 6d 3d 70 4c  or(j=0, pItem=pL
20a50 69 73 74 2d 3e 61 3b 20 21 70 43 6f 6c 6c 20 26  ist->a; !pColl &
20a60 26 20 6a 3c 6e 41 72 67 3b 20 6a 2b 2b 2c 20 70  & j<nArg; j++, p
20a70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Item++){.       
20a80 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
20a90 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
20aa0 73 65 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72  se, pItem->pExpr
20ab0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
20ac0 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20   if( !pColl ){. 
20ad0 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 70         pColl = p
20ae0 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74  Parse->db->pDflt
20af0 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Coll;.      }.  
20b00 20 20 20 20 69 66 28 20 72 65 67 48 69 74 3d 3d      if( regHit==
20b10 30 20 26 26 20 70 41 67 67 49 6e 66 6f 2d 3e 6e  0 && pAggInfo->n
20b20 41 63 63 75 6d 75 6c 61 74 6f 72 20 29 20 72 65  Accumulator ) re
20b30 67 48 69 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d  gHit = ++pParse-
20b40 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c  >nMem;.      sql
20b50 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
20b60 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20 72 65  , OP_CollSeq, re
20b70 67 48 69 74 2c 20 30 2c 20 30 2c 20 28 63 68 61  gHit, 0, 0, (cha
20b80 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f  r *)pColl, P4_CO
20b90 4c 4c 53 45 51 29 3b 0a 20 20 20 20 7d 0a 20 20  LLSEQ);.    }.  
20ba0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
20bb0 4f 70 34 28 76 2c 20 4f 50 5f 41 67 67 53 74 65  Op4(v, OP_AggSte
20bc0 70 2c 20 30 2c 20 72 65 67 41 67 67 2c 20 70 46  p, 0, regAgg, pF
20bd0 2d 3e 69 4d 65 6d 2c 0a 20 20 20 20 20 20 20 20  ->iMem,.        
20be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 76                (v
20bf0 6f 69 64 2a 29 70 46 2d 3e 70 46 75 6e 63 2c 20  oid*)pF->pFunc, 
20c00 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 20  P4_FUNCDEF);.   
20c10 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
20c20 67 65 50 35 28 76 2c 20 28 75 38 29 6e 41 72 67  geP5(v, (u8)nArg
20c30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
20c40 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43  prCacheAffinityC
20c50 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65  hange(pParse, re
20c60 67 41 67 67 2c 20 6e 41 72 67 29 3b 0a 20 20 20  gAgg, nArg);.   
20c70 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
20c80 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
20c90 20 72 65 67 41 67 67 2c 20 6e 41 72 67 29 3b 0a   regAgg, nArg);.
20ca0 20 20 20 20 69 66 28 20 61 64 64 72 4e 65 78 74      if( addrNext
20cb0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
20cc0 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
20cd0 6c 28 76 2c 20 61 64 64 72 4e 65 78 74 29 3b 0a  l(v, addrNext);.
20ce0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
20cf0 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72  rCacheClear(pPar
20d00 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  se);.    }.  }..
20d10 20 20 2f 2a 20 42 65 66 6f 72 65 20 70 6f 70 75    /* Before popu
20d20 6c 61 74 69 6e 67 20 74 68 65 20 61 63 63 75 6d  lating the accum
20d30 75 6c 61 74 6f 72 20 72 65 67 69 73 74 65 72 73  ulator registers
20d40 2c 20 63 6c 65 61 72 20 74 68 65 20 63 6f 6c 75  , clear the colu
20d50 6d 6e 20 63 61 63 68 65 2e 0a 20 20 2a 2a 20 4f  mn cache..  ** O
20d60 74 68 65 72 77 69 73 65 2c 20 69 66 20 61 6e 79  therwise, if any
20d70 20 6f 66 20 74 68 65 20 72 65 71 75 69 72 65 64   of the required
20d80 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 73 20 61   column values a
20d90 72 65 20 61 6c 72 65 61 64 79 20 70 72 65 73 65  re already prese
20da0 6e 74 20 0a 20 20 2a 2a 20 69 6e 20 72 65 67 69  nt .  ** in regi
20db0 73 74 65 72 73 2c 20 73 71 6c 69 74 65 33 45 78  sters, sqlite3Ex
20dc0 70 72 43 6f 64 65 28 29 20 6d 61 79 20 75 73 65  prCode() may use
20dd0 20 4f 50 5f 53 43 6f 70 79 20 74 6f 20 63 6f 70   OP_SCopy to cop
20de0 79 20 74 68 65 20 76 61 6c 75 65 0a 20 20 2a 2a  y the value.  **
20df0 20 74 6f 20 70 43 2d 3e 69 4d 65 6d 2e 20 42 75   to pC->iMem. Bu
20e00 74 20 62 79 20 74 68 65 20 74 69 6d 65 20 74 68  t by the time th
20e10 65 20 76 61 6c 75 65 20 69 73 20 75 73 65 64 2c  e value is used,
20e20 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 72 65   the original re
20e30 67 69 73 74 65 72 0a 20 20 2a 2a 20 6d 61 79 20  gister.  ** may 
20e40 68 61 76 65 20 62 65 65 6e 20 75 73 65 64 2c 20  have been used, 
20e50 69 6e 76 61 6c 69 64 61 74 69 6e 67 20 74 68 65  invalidating the
20e60 20 75 6e 64 65 72 6c 79 69 6e 67 20 62 75 66 66   underlying buff
20e70 65 72 20 68 6f 6c 64 69 6e 67 20 74 68 65 0a 20  er holding the. 
20e80 20 2a 2a 20 74 65 78 74 20 6f 72 20 62 6c 6f 62   ** text or blob
20e90 20 76 61 6c 75 65 2e 20 53 65 65 20 74 69 63 6b   value. See tick
20ea0 65 74 20 5b 38 38 33 30 33 34 64 63 62 35 5d 2e  et [883034dcb5].
20eb0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 6f 74 68  .  **.  ** Anoth
20ec0 65 72 20 73 6f 6c 75 74 69 6f 6e 20 77 6f 75 6c  er solution woul
20ed0 64 20 62 65 20 74 6f 20 63 68 61 6e 67 65 20 74  d be to change t
20ee0 68 65 20 4f 50 5f 53 43 6f 70 79 20 75 73 65 64  he OP_SCopy used
20ef0 20 74 6f 20 63 6f 70 79 20 63 61 63 68 65 64 0a   to copy cached.
20f00 20 20 2a 2a 20 76 61 6c 75 65 73 20 74 6f 20 61    ** values to a
20f10 6e 20 4f 50 5f 43 6f 70 79 2e 0a 20 20 2a 2f 0a  n OP_Copy..  */.
20f20 20 20 69 66 28 20 72 65 67 48 69 74 20 29 7b 0a    if( regHit ){.
20f30 20 20 20 20 61 64 64 72 48 69 74 54 65 73 74 20      addrHitTest 
20f40 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
20f50 4f 70 31 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65  Op1(v, OP_If, re
20f60 67 48 69 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  gHit);.  }.  sql
20f70 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65  ite3ExprCacheCle
20f80 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 66 6f  ar(pParse);.  fo
20f90 72 28 69 3d 30 2c 20 70 43 3d 70 41 67 67 49 6e  r(i=0, pC=pAggIn
20fa0 66 6f 2d 3e 61 43 6f 6c 3b 20 69 3c 70 41 67 67  fo->aCol; i<pAgg
20fb0 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61 74  Info->nAccumulat
20fc0 6f 72 3b 20 69 2b 2b 2c 20 70 43 2b 2b 29 7b 0a  or; i++, pC++){.
20fd0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
20fe0 6f 64 65 28 70 50 61 72 73 65 2c 20 70 43 2d 3e  ode(pParse, pC->
20ff0 70 45 78 70 72 2c 20 70 43 2d 3e 69 4d 65 6d 29  pExpr, pC->iMem)
21000 3b 0a 20 20 7d 0a 20 20 70 41 67 67 49 6e 66 6f  ;.  }.  pAggInfo
21010 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20 3d 20 30  ->directMode = 0
21020 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43  ;.  sqlite3ExprC
21030 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65  acheClear(pParse
21040 29 3b 0a 20 20 69 66 28 20 61 64 64 72 48 69 74  );.  if( addrHit
21050 54 65 73 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  Test ){.    sqli
21060 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
21070 76 2c 20 61 64 64 72 48 69 74 54 65 73 74 29 3b  v, addrHitTest);
21080 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  .  }.}../*.** Ad
21090 64 20 61 20 73 69 6e 67 6c 65 20 4f 50 5f 45 78  d a single OP_Ex
210a0 70 6c 61 69 6e 20 69 6e 73 74 72 75 63 74 69 6f  plain instructio
210b0 6e 20 74 6f 20 74 68 65 20 56 44 42 45 20 74 6f  n to the VDBE to
210c0 20 65 78 70 6c 61 69 6e 20 61 20 73 69 6d 70 6c   explain a simpl
210d0 65 0a 2a 2a 20 63 6f 75 6e 74 28 2a 29 20 71 75  e.** count(*) qu
210e0 65 72 79 20 28 22 53 45 4c 45 43 54 20 63 6f 75  ery ("SELECT cou
210f0 6e 74 28 2a 29 20 46 52 4f 4d 20 70 54 61 62 22  nt(*) FROM pTab"
21100 29 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  )..*/.#ifndef SQ
21110 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
21120 4e 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78  N.static void ex
21130 70 6c 61 69 6e 53 69 6d 70 6c 65 43 6f 75 6e 74  plainSimpleCount
21140 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
21150 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
21160 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e      /* Parse con
21170 74 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20  text */.  Table 
21180 2a 70 54 61 62 2c 20 20 20 20 20 20 20 20 20 20  *pTab,          
21190 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62            /* Tab
211a0 6c 65 20 62 65 69 6e 67 20 71 75 65 72 69 65 64  le being queried
211b0 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64   */.  Index *pId
211c0 78 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x               
211d0 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 75        /* Index u
211e0 73 65 64 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20  sed to optimize 
211f0 73 63 61 6e 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f  scan, or NULL */
21200 0a 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65  .){.  if( pParse
21210 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a  ->explain==2 ){.
21220 20 20 20 20 63 68 61 72 20 2a 7a 45 71 70 20 3d      char *zEqp =
21230 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
21240 70 50 61 72 73 65 2d 3e 64 62 2c 20 22 53 43 41  pParse->db, "SCA
21250 4e 20 54 41 42 4c 45 20 25 73 20 25 73 25 73 28  N TABLE %s %s%s(
21260 7e 25 64 20 72 6f 77 73 29 22 2c 0a 20 20 20 20  ~%d rows)",.    
21270 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c      pTab->zName,
21280 20 0a 20 20 20 20 20 20 20 20 70 49 64 78 20 3f   .        pIdx ?
21290 20 22 55 53 49 4e 47 20 43 4f 56 45 52 49 4e 47   "USING COVERING
212a0 20 49 4e 44 45 58 20 22 20 3a 20 22 22 2c 0a 20   INDEX " : "",. 
212b0 20 20 20 20 20 20 20 70 49 64 78 20 3f 20 70 49         pIdx ? pI
212c0 64 78 2d 3e 7a 4e 61 6d 65 20 3a 20 22 22 2c 0a  dx->zName : "",.
212d0 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 52          pTab->nR
212e0 6f 77 45 73 74 0a 20 20 20 20 29 3b 0a 20 20 20  owEst.    );.   
212f0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
21300 70 34 28 0a 20 20 20 20 20 20 20 20 70 50 61 72  p4(.        pPar
21310 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 45 78  se->pVdbe, OP_Ex
21320 70 6c 61 69 6e 2c 20 70 50 61 72 73 65 2d 3e 69  plain, pParse->i
21330 53 65 6c 65 63 74 49 64 2c 20 30 2c 20 30 2c 20  SelectId, 0, 0, 
21340 7a 45 71 70 2c 20 50 34 5f 44 59 4e 41 4d 49 43  zEqp, P4_DYNAMIC
21350 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65  .    );.  }.}.#e
21360 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 65 78 70  lse.# define exp
21370 6c 61 69 6e 53 69 6d 70 6c 65 43 6f 75 6e 74 28  lainSimpleCount(
21380 61 2c 62 2c 63 29 0a 23 65 6e 64 69 66 0a 0a 2f  a,b,c).#endif../
21390 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
213a0 64 65 20 66 6f 72 20 74 68 65 20 53 45 4c 45 43  de for the SELEC
213b0 54 20 73 74 61 74 65 6d 65 6e 74 20 67 69 76 65  T statement give
213c0 6e 20 69 6e 20 74 68 65 20 70 20 61 72 67 75 6d  n in the p argum
213d0 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65  ent.  .**.** The
213e0 20 72 65 73 75 6c 74 73 20 61 72 65 20 64 69 73   results are dis
213f0 74 72 69 62 75 74 65 64 20 69 6e 20 76 61 72 69  tributed in vari
21400 6f 75 73 20 77 61 79 73 20 64 65 70 65 6e 64 69  ous ways dependi
21410 6e 67 20 6f 6e 20 74 68 65 0a 2a 2a 20 63 6f 6e  ng on the.** con
21420 74 65 6e 74 73 20 6f 66 20 74 68 65 20 53 65 6c  tents of the Sel
21430 65 63 74 44 65 73 74 20 73 74 72 75 63 74 75 72  ectDest structur
21440 65 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  e pointed to by 
21450 61 72 67 75 6d 65 6e 74 20 70 44 65 73 74 0a 2a  argument pDest.*
21460 2a 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  * as follows:.**
21470 0a 2a 2a 20 20 20 20 20 70 44 65 73 74 2d 3e 65  .**     pDest->e
21480 44 65 73 74 20 20 20 20 52 65 73 75 6c 74 0a 2a  Dest    Result.*
21490 2a 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *     ----------
214a0 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  --    ----------
214b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
214c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
214d0 2d 0a 2a 2a 20 20 20 20 20 53 52 54 5f 4f 75 74  -.**     SRT_Out
214e0 70 75 74 20 20 20 20 20 20 47 65 6e 65 72 61 74  put      Generat
214f0 65 20 61 20 72 6f 77 20 6f 66 20 6f 75 74 70 75  e a row of outpu
21500 74 20 28 75 73 69 6e 67 20 74 68 65 20 4f 50 5f  t (using the OP_
21510 52 65 73 75 6c 74 52 6f 77 0a 2a 2a 20 20 20 20  ResultRow.**    
21520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21530 20 6f 70 63 6f 64 65 29 20 66 6f 72 20 65 61 63   opcode) for eac
21540 68 20 72 6f 77 20 69 6e 20 74 68 65 20 72 65 73  h row in the res
21550 75 6c 74 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 20  ult set..**.**  
21560 20 20 20 53 52 54 5f 4d 65 6d 20 20 20 20 20 20     SRT_Mem      
21570 20 20 20 4f 6e 6c 79 20 76 61 6c 69 64 20 69 66     Only valid if
21580 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 61   the result is a
21590 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 2e 0a   single column..
215a0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
215b0 20 20 20 20 20 20 20 53 74 6f 72 65 20 74 68 65         Store the
215c0 20 66 69 72 73 74 20 63 6f 6c 75 6d 6e 20 6f 66   first column of
215d0 20 74 68 65 20 66 69 72 73 74 20 72 65 73 75 6c   the first resul
215e0 74 20 72 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20  t row.**        
215f0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 20               in 
21600 72 65 67 69 73 74 65 72 20 70 44 65 73 74 2d 3e  register pDest->
21610 69 53 44 50 61 72 6d 20 74 68 65 6e 20 61 62 61  iSDParm then aba
21620 6e 64 6f 6e 20 74 68 65 20 72 65 73 74 0a 2a 2a  ndon the rest.**
21630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21640 20 20 20 20 20 6f 66 20 74 68 65 20 71 75 65 72       of the quer
21650 79 2e 20 20 54 68 69 73 20 64 65 73 74 69 6e 61  y.  This destina
21660 74 69 6f 6e 20 69 6d 70 6c 69 65 73 20 22 4c 49  tion implies "LI
21670 4d 49 54 20 31 22 2e 0a 2a 2a 0a 2a 2a 20 20 20  MIT 1"..**.**   
21680 20 20 53 52 54 5f 53 65 74 20 20 20 20 20 20 20    SRT_Set       
21690 20 20 54 68 65 20 72 65 73 75 6c 74 20 6d 75 73    The result mus
216a0 74 20 62 65 20 61 20 73 69 6e 67 6c 65 20 63 6f  t be a single co
216b0 6c 75 6d 6e 2e 20 20 53 74 6f 72 65 20 65 61 63  lumn.  Store eac
216c0 68 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  h.**            
216d0 20 20 20 20 20 20 20 20 20 72 6f 77 20 6f 66 20           row of 
216e0 72 65 73 75 6c 74 20 61 73 20 74 68 65 20 6b 65  result as the ke
216f0 79 20 69 6e 20 74 61 62 6c 65 20 70 44 65 73 74  y in table pDest
21700 2d 3e 69 53 44 50 61 72 6d 2e 20 0a 2a 2a 20 20  ->iSDParm. .**  
21710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21720 20 20 20 41 70 70 6c 79 20 74 68 65 20 61 66 66     Apply the aff
21730 69 6e 69 74 79 20 70 44 65 73 74 2d 3e 61 66 66  inity pDest->aff
21740 53 64 73 74 20 62 65 66 6f 72 65 20 73 74 6f 72  Sdst before stor
21750 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ing.**          
21760 20 20 20 20 20 20 20 20 20 20 20 72 65 73 75 6c             resul
21770 74 73 2e 20 20 55 73 65 64 20 74 6f 20 69 6d 70  ts.  Used to imp
21780 6c 65 6d 65 6e 74 20 22 49 4e 20 28 53 45 4c 45  lement "IN (SELE
21790 43 54 20 2e 2e 2e 29 22 2e 0a 2a 2a 0a 2a 2a 20  CT ...)"..**.** 
217a0 20 20 20 20 53 52 54 5f 55 6e 69 6f 6e 20 20 20      SRT_Union   
217b0 20 20 20 20 53 74 6f 72 65 20 72 65 73 75 6c 74      Store result
217c0 73 20 61 73 20 61 20 6b 65 79 20 69 6e 20 61 20  s as a key in a 
217d0 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
217e0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
217f0 20 20 20 20 20 20 20 20 69 64 65 6e 74 69 66 69          identifi
21800 65 64 20 62 79 20 70 44 65 73 74 2d 3e 69 53 44  ed by pDest->iSD
21810 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  Parm..**.**     
21820 53 52 54 5f 45 78 63 65 70 74 20 20 20 20 20 20  SRT_Except      
21830 52 65 6d 6f 76 65 20 72 65 73 75 6c 74 73 20 66  Remove results f
21840 72 6f 6d 20 74 68 65 20 74 65 6d 70 6f 72 61 72  rom the temporar
21850 79 20 74 61 62 6c 65 20 70 44 65 73 74 2d 3e 69  y table pDest->i
21860 53 44 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20  SDParm..**.**   
21870 20 20 53 52 54 5f 54 61 62 6c 65 20 20 20 20 20    SRT_Table     
21880 20 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20    Store results 
21890 69 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  in temporary tab
218a0 6c 65 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72  le pDest->iSDPar
218b0 6d 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  m..**           
218c0 20 20 20 20 20 20 20 20 20 20 54 68 69 73 20 69            This i
218d0 73 20 6c 69 6b 65 20 53 52 54 5f 45 70 68 65 6d  s like SRT_Ephem
218e0 54 61 62 20 65 78 63 65 70 74 20 74 68 61 74 20  Tab except that 
218f0 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20 20 20 20  the table.**    
21900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21910 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20 61   is assumed to a
21920 6c 72 65 61 64 79 20 62 65 20 6f 70 65 6e 2e 0a  lready be open..
21930 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 45 70  **.**     SRT_Ep
21940 68 65 6d 54 61 62 20 20 20 20 43 72 65 61 74 65  hemTab    Create
21950 20 61 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61   an temporary ta
21960 62 6c 65 20 70 44 65 73 74 2d 3e 69 53 44 50 61  ble pDest->iSDPa
21970 72 6d 20 61 6e 64 20 73 74 6f 72 65 0a 2a 2a 20  rm and store.** 
21980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21990 20 20 20 20 74 68 65 20 72 65 73 75 6c 74 20 74      the result t
219a0 68 65 72 65 2e 20 54 68 65 20 63 75 72 73 6f 72  here. The cursor
219b0 20 69 73 20 6c 65 66 74 20 6f 70 65 6e 20 61 66   is left open af
219c0 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ter.**          
219d0 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
219e0 6e 69 6e 67 2e 20 20 54 68 69 73 20 69 73 20 6c  ning.  This is l
219f0 69 6b 65 20 53 52 54 5f 54 61 62 6c 65 20 65 78  ike SRT_Table ex
21a00 63 65 70 74 20 74 68 61 74 0a 2a 2a 20 20 20 20  cept that.**    
21a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a20 20 74 68 69 73 20 64 65 73 74 69 6e 61 74 69 6f   this destinatio
21a30 6e 20 75 73 65 73 20 4f 50 5f 4f 70 65 6e 45 70  n uses OP_OpenEp
21a40 68 65 6d 65 72 61 6c 20 74 6f 20 63 72 65 61 74  hemeral to creat
21a50 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
21a60 20 20 20 20 20 20 20 20 20 74 68 65 20 74 61 62           the tab
21a70 6c 65 20 66 69 72 73 74 2e 0a 2a 2a 0a 2a 2a 20  le first..**.** 
21a80 20 20 20 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e      SRT_Coroutin
21a90 65 20 20 20 47 65 6e 65 72 61 74 65 20 61 20 63  e   Generate a c
21aa0 6f 2d 72 6f 75 74 69 6e 65 20 74 68 61 74 20 72  o-routine that r
21ab0 65 74 75 72 6e 73 20 61 20 6e 65 77 20 72 6f 77  eturns a new row
21ac0 20 6f 66 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   of.**          
21ad0 20 20 20 20 20 20 20 20 20 20 20 72 65 73 75 6c             resul
21ae0 74 73 20 65 61 63 68 20 74 69 6d 65 20 69 74 20  ts each time it 
21af0 69 73 20 69 6e 76 6f 6b 65 64 2e 20 20 54 68 65  is invoked.  The
21b00 20 65 6e 74 72 79 20 70 6f 69 6e 74 0a 2a 2a 20   entry point.** 
21b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21b20 20 20 20 20 6f 66 20 74 68 65 20 63 6f 2d 72 6f      of the co-ro
21b30 75 74 69 6e 65 20 69 73 20 73 74 6f 72 65 64 20  utine is stored 
21b40 69 6e 20 72 65 67 69 73 74 65 72 20 70 44 65 73  in register pDes
21b50 74 2d 3e 69 53 44 50 61 72 6d 2e 0a 2a 2a 0a 2a  t->iSDParm..**.*
21b60 2a 20 20 20 20 20 53 52 54 5f 45 78 69 73 74 73  *     SRT_Exists
21b70 20 20 20 20 20 20 53 74 6f 72 65 20 61 20 31 20        Store a 1 
21b80 69 6e 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 70  in memory cell p
21b90 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 20 69 66  Dest->iSDParm if
21ba0 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 20   the result.**  
21bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21bc0 20 20 20 73 65 74 20 69 73 20 6e 6f 74 20 65 6d     set is not em
21bd0 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  pty..**.**     S
21be0 52 54 5f 44 69 73 63 61 72 64 20 20 20 20 20 54  RT_Discard     T
21bf0 68 72 6f 77 20 74 68 65 20 72 65 73 75 6c 74 73  hrow the results
21c00 20 61 77 61 79 2e 20 20 54 68 69 73 20 69 73 20   away.  This is 
21c10 75 73 65 64 20 62 79 20 53 45 4c 45 43 54 0a 2a  used by SELECT.*
21c20 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
21c30 20 20 20 20 20 20 73 74 61 74 65 6d 65 6e 74 73        statements
21c40 20 77 69 74 68 69 6e 20 74 72 69 67 67 65 72 73   within triggers
21c50 20 77 68 6f 73 65 20 6f 6e 6c 79 20 70 75 72 70   whose only purp
21c60 6f 73 65 20 69 73 0a 2a 2a 20 20 20 20 20 20 20  ose is.**       
21c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68                th
21c80 65 20 73 69 64 65 2d 65 66 66 65 63 74 73 20 6f  e side-effects o
21c90 66 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2a 0a  f functions..**.
21ca0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
21cb0 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62  returns the numb
21cc0 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 49  er of errors.  I
21cd0 66 20 61 6e 79 20 65 72 72 6f 72 73 20 61 72 65  f any errors are
21ce0 0a 2a 2a 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c  .** encountered,
21cf0 20 74 68 65 6e 20 61 6e 20 61 70 70 72 6f 70 72   then an appropr
21d00 69 61 74 65 20 65 72 72 6f 72 20 6d 65 73 73 61  iate error messa
21d10 67 65 20 69 73 20 6c 65 66 74 20 69 6e 0a 2a 2a  ge is left in.**
21d20 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67   pParse->zErrMsg
21d30 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
21d40 74 69 6e 65 20 64 6f 65 73 20 4e 4f 54 20 66 72  tine does NOT fr
21d50 65 65 20 74 68 65 20 53 65 6c 65 63 74 20 73 74  ee the Select st
21d60 72 75 63 74 75 72 65 20 70 61 73 73 65 64 20 69  ructure passed i
21d70 6e 2e 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 69  n.  The.** calli
21d80 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6e 65 65 64  ng function need
21d90 73 20 74 6f 20 64 6f 20 74 68 61 74 2e 0a 2a 2f  s to do that..*/
21da0 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 65 6c 65  .int sqlite3Sele
21db0 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ct(.  Parse *pPa
21dc0 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  rse,         /* 
21dd0 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65  The parser conte
21de0 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  xt */.  Select *
21df0 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  p,             /
21e00 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61  * The SELECT sta
21e10 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64  tement being cod
21e20 65 64 2e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  ed. */.  SelectD
21e30 65 73 74 20 2a 70 44 65 73 74 20 20 20 20 20 20  est *pDest      
21e40 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69  /* What to do wi
21e50 74 68 20 74 68 65 20 71 75 65 72 79 20 72 65 73  th the query res
21e60 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ults */.){.  int
21e70 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20   i, j;          
21e80 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
21e90 74 65 72 73 20 2a 2f 0a 20 20 57 68 65 72 65 49  ters */.  WhereI
21ea0 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20  nfo *pWInfo;    
21eb0 20 2f 2a 20 52 65 74 75 72 6e 20 66 72 6f 6d 20   /* Return from 
21ec0 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
21ed0 6e 28 29 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  n() */.  Vdbe *v
21ee0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
21ef0 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20 6d  /* The virtual m
21f00 61 63 68 69 6e 65 20 75 6e 64 65 72 20 63 6f 6e  achine under con
21f10 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69  struction */.  i
21f20 6e 74 20 69 73 41 67 67 3b 20 20 20 20 20 20 20  nt isAgg;       
21f30 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
21f40 72 20 73 65 6c 65 63 74 20 6c 69 73 74 73 20 6c  r select lists l
21f50 69 6b 65 20 22 63 6f 75 6e 74 28 2a 29 22 20 2a  ike "count(*)" *
21f60 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  /.  ExprList *pE
21f70 4c 69 73 74 3b 20 20 20 20 20 20 2f 2a 20 4c 69  List;      /* Li
21f80 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f  st of columns to
21f90 20 65 78 74 72 61 63 74 2e 20 2a 2f 0a 20 20 53   extract. */.  S
21fa0 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
21fb0 3b 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66  ;     /* List of
21fc0 20 74 61 62 6c 65 73 20 74 6f 20 73 65 6c 65 63   tables to selec
21fd0 74 20 66 72 6f 6d 20 2a 2f 0a 20 20 45 78 70 72  t from */.  Expr
21fe0 20 2a 70 57 68 65 72 65 3b 20 20 20 20 20 20 20   *pWhere;       
21ff0 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
22000 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20  clause.  May be 
22010 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69  NULL */.  ExprLi
22020 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 20  st *pOrderBy;   
22030 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59   /* The ORDER BY
22040 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65   clause.  May be
22050 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c   NULL */.  ExprL
22060 69 73 74 20 2a 70 47 72 6f 75 70 42 79 3b 20 20  ist *pGroupBy;  
22070 20 20 2f 2a 20 54 68 65 20 47 52 4f 55 50 20 42    /* The GROUP B
22080 59 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62  Y clause.  May b
22090 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72  e NULL */.  Expr
220a0 20 2a 70 48 61 76 69 6e 67 3b 20 20 20 20 20 20   *pHaving;      
220b0 20 20 20 2f 2a 20 54 68 65 20 48 41 56 49 4e 47     /* The HAVING
220c0 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65   clause.  May be
220d0 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 72   NULL */.  int r
220e0 63 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20  c = 1;          
220f0 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72 65    /* Value to re
22100 74 75 72 6e 20 66 72 6f 6d 20 74 68 69 73 20 66  turn from this f
22110 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  unction */.  int
22120 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78 3b 20   addrSortIndex; 
22130 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
22140 66 20 61 6e 20 4f 50 5f 4f 70 65 6e 45 70 68 65  f an OP_OpenEphe
22150 6d 65 72 61 6c 20 69 6e 73 74 72 75 63 74 69 6f  meral instructio
22160 6e 20 2a 2f 0a 20 20 44 69 73 74 69 6e 63 74 43  n */.  DistinctC
22170 74 78 20 73 44 69 73 74 69 6e 63 74 3b 20 2f 2a  tx sDistinct; /*
22180 20 49 6e 66 6f 20 6f 6e 20 68 6f 77 20 74 6f 20   Info on how to 
22190 63 6f 64 65 20 74 68 65 20 44 49 53 54 49 4e 43  code the DISTINC
221a0 54 20 6b 65 79 77 6f 72 64 20 2a 2f 0a 20 20 41  T keyword */.  A
221b0 67 67 49 6e 66 6f 20 73 41 67 67 49 6e 66 6f 3b  ggInfo sAggInfo;
221c0 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61        /* Informa
221d0 74 69 6f 6e 20 75 73 65 64 20 62 79 20 61 67 67  tion used by agg
221e0 72 65 67 61 74 65 20 71 75 65 72 69 65 73 20 2a  regate queries *
221f0 2f 0a 20 20 69 6e 74 20 69 45 6e 64 3b 20 20 20  /.  int iEnd;   
22200 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
22210 64 72 65 73 73 20 6f 66 20 74 68 65 20 65 6e 64  dress of the end
22220 20 6f 66 20 74 68 65 20 71 75 65 72 79 20 2a 2f   of the query */
22230 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20  .  sqlite3 *db; 
22240 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
22250 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
22260 74 69 6f 6e 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  tion */..#ifndef
22270 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50   SQLITE_OMIT_EXP
22280 4c 41 49 4e 0a 20 20 69 6e 74 20 69 52 65 73 74  LAIN.  int iRest
22290 6f 72 65 53 65 6c 65 63 74 49 64 20 3d 20 70 50  oreSelectId = pP
222a0 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 3b  arse->iSelectId;
222b0 0a 20 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65  .  pParse->iSele
222c0 63 74 49 64 20 3d 20 70 50 61 72 73 65 2d 3e 69  ctId = pParse->i
222d0 4e 65 78 74 53 65 6c 65 63 74 49 64 2b 2b 3b 0a  NextSelectId++;.
222e0 23 65 6e 64 69 66 0a 0a 20 20 64 62 20 3d 20 70  #endif..  db = p
222f0 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28  Parse->db;.  if(
22300 20 70 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c   p==0 || db->mal
22310 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70 50 61  locFailed || pPa
22320 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20  rse->nErr ){.   
22330 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
22340 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
22350 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
22360 4c 49 54 45 5f 53 45 4c 45 43 54 2c 20 30 2c 20  LITE_SELECT, 0, 
22370 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e 20 31  0, 0) ) return 1
22380 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 41 67 67  ;.  memset(&sAgg
22390 49 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Info, 0, sizeof(
223a0 73 41 67 67 49 6e 66 6f 29 29 3b 0a 0a 20 20 69  sAggInfo));..  i
223b0 66 28 20 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65  f( IgnorableOrde
223c0 72 62 79 28 70 44 65 73 74 29 20 29 7b 0a 20 20  rby(pDest) ){.  
223d0 20 20 61 73 73 65 72 74 28 70 44 65 73 74 2d 3e    assert(pDest->
223e0 65 44 65 73 74 3d 3d 53 52 54 5f 45 78 69 73 74  eDest==SRT_Exist
223f0 73 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73  s || pDest->eDes
22400 74 3d 3d 53 52 54 5f 55 6e 69 6f 6e 20 7c 7c 20  t==SRT_Union || 
22410 0a 20 20 20 20 20 20 20 20 20 20 20 70 44 65 73  .           pDes
22420 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45 78  t->eDest==SRT_Ex
22430 63 65 70 74 20 7c 7c 20 70 44 65 73 74 2d 3e 65  cept || pDest->e
22440 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 63 61 72  Dest==SRT_Discar
22450 64 29 3b 0a 20 20 20 20 2f 2a 20 49 66 20 4f 52  d);.    /* If OR
22460 44 45 52 20 42 59 20 6d 61 6b 65 73 20 6e 6f 20  DER BY makes no 
22470 64 69 66 66 65 72 65 6e 63 65 20 69 6e 20 74 68  difference in th
22480 65 20 6f 75 74 70 75 74 20 74 68 65 6e 20 6e 65  e output then ne
22490 69 74 68 65 72 20 64 6f 65 73 0a 20 20 20 20 2a  ither does.    *
224a0 2a 20 44 49 53 54 49 4e 43 54 20 73 6f 20 69 74  * DISTINCT so it
224b0 20 63 61 6e 20 62 65 20 72 65 6d 6f 76 65 64 20   can be removed 
224c0 74 6f 6f 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69  too. */.    sqli
224d0 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
224e0 65 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42  e(db, p->pOrderB
224f0 79 29 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65  y);.    p->pOrde
22500 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e  rBy = 0;.    p->
22510 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f  selFlags &= ~SF_
22520 44 69 73 74 69 6e 63 74 3b 0a 20 20 7d 0a 20 20  Distinct;.  }.  
22530 73 71 6c 69 74 65 33 53 65 6c 65 63 74 50 72 65  sqlite3SelectPre
22540 70 28 70 50 61 72 73 65 2c 20 70 2c 20 30 29 3b  p(pParse, p, 0);
22550 0a 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d  .  pOrderBy = p-
22560 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 70 54 61  >pOrderBy;.  pTa
22570 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b  bList = p->pSrc;
22580 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70  .  pEList = p->p
22590 45 4c 69 73 74 3b 0a 20 20 69 66 28 20 70 50 61  EList;.  if( pPa
225a0 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d  rse->nErr || db-
225b0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
225c0 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74  .    goto select
225d0 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 69 73 41 67  _end;.  }.  isAg
225e0 67 20 3d 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73  g = (p->selFlags
225f0 20 26 20 53 46 5f 41 67 67 72 65 67 61 74 65 29   & SF_Aggregate)
22600 21 3d 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70  !=0;.  assert( p
22610 45 4c 69 73 74 21 3d 30 20 29 3b 0a 0a 20 20 2f  EList!=0 );..  /
22620 2a 20 42 65 67 69 6e 20 67 65 6e 65 72 61 74 69  * Begin generati
22630 6e 67 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20  ng code..  */.  
22640 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
22650 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
22660 28 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65  ( v==0 ) goto se
22670 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20  lect_end;..  /* 
22680 49 66 20 77 72 69 74 69 6e 67 20 74 6f 20 6d 65  If writing to me
22690 6d 6f 72 79 20 6f 72 20 67 65 6e 65 72 61 74 69  mory or generati
226a0 6e 67 20 61 20 73 65 74 0a 20 20 2a 2a 20 6f 6e  ng a set.  ** on
226b0 6c 79 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75  ly a single colu
226c0 6d 6e 20 6d 61 79 20 62 65 20 6f 75 74 70 75 74  mn may be output
226d0 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ..  */.#ifndef S
226e0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
226f0 45 52 59 0a 20 20 69 66 28 20 63 68 65 63 6b 46  ERY.  if( checkF
22700 6f 72 4d 75 6c 74 69 43 6f 6c 75 6d 6e 53 65 6c  orMultiColumnSel
22710 65 63 74 45 72 72 6f 72 28 70 50 61 72 73 65 2c  ectError(pParse,
22720 20 70 44 65 73 74 2c 20 70 45 4c 69 73 74 2d 3e   pDest, pEList->
22730 6e 45 78 70 72 29 20 29 7b 0a 20 20 20 20 67 6f  nExpr) ){.    go
22740 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
22750 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
22760 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
22770 72 20 61 6c 6c 20 73 75 62 2d 71 75 65 72 69 65  r all sub-querie
22780 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  s in the FROM cl
22790 61 75 73 65 0a 20 20 2a 2f 0a 23 69 66 20 21 64  ause.  */.#if !d
227a0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
227b0 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20  IT_SUBQUERY) || 
227c0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
227d0 4f 4d 49 54 5f 56 49 45 57 29 0a 20 20 66 6f 72  OMIT_VIEW).  for
227e0 28 69 3d 30 3b 20 21 70 2d 3e 70 50 72 69 6f 72  (i=0; !p->pPrior
227f0 20 26 26 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e   && i<pTabList->
22800 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nSrc; i++){.    
22810 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
22820 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 54  tem *pItem = &pT
22830 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 3b 0a 20 20  abList->a[i];.  
22840 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73    SelectDest des
22850 74 3b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70  t;.    Select *p
22860 53 75 62 20 3d 20 70 49 74 65 6d 2d 3e 70 53 65  Sub = pItem->pSe
22870 6c 65 63 74 3b 0a 20 20 20 20 69 6e 74 20 69 73  lect;.    int is
22880 41 67 67 53 75 62 3b 0a 0a 20 20 20 20 69 66 28  AggSub;..    if(
22890 20 70 53 75 62 3d 3d 30 20 29 20 63 6f 6e 74 69   pSub==0 ) conti
228a0 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 53 6f 6d  nue;..    /* Som
228b0 65 74 69 6d 65 73 20 74 68 65 20 63 6f 64 65 20  etimes the code 
228c0 66 6f 72 20 61 20 73 75 62 71 75 65 72 79 20 77  for a subquery w
228d0 69 6c 6c 20 62 65 20 67 65 6e 65 72 61 74 65 64  ill be generated
228e0 20 6d 6f 72 65 20 74 68 61 6e 0a 20 20 20 20 2a   more than.    *
228f0 2a 20 6f 6e 63 65 2c 20 69 66 20 74 68 65 20 73  * once, if the s
22900 75 62 71 75 65 72 79 20 69 73 20 70 61 72 74 20  ubquery is part 
22910 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
22920 75 73 65 20 69 6e 20 61 20 4c 45 46 54 20 4a 4f  use in a LEFT JO
22930 49 4e 2c 0a 20 20 20 20 2a 2a 20 66 6f 72 20 65  IN,.    ** for e
22940 78 61 6d 70 6c 65 2e 20 20 49 6e 20 74 68 61 74  xample.  In that
22950 20 63 61 73 65 2c 20 64 6f 20 6e 6f 74 20 72 65   case, do not re
22960 67 65 6e 65 72 61 74 65 20 74 68 65 20 63 6f 64  generate the cod
22970 65 20 74 6f 20 6d 61 6e 69 66 65 73 74 0a 20 20  e to manifest.  
22980 20 20 2a 2a 20 61 20 76 69 65 77 20 6f 72 20 74    ** a view or t
22990 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20 74 6f  he co-routine to
229a0 20 69 6d 70 6c 65 6d 65 6e 74 20 61 20 76 69 65   implement a vie
229b0 77 2e 20 20 54 68 65 20 66 69 72 73 74 20 69 6e  w.  The first in
229c0 73 74 61 6e 63 65 0a 20 20 20 20 2a 2a 20 69 73  stance.    ** is
229d0 20 73 75 66 66 69 63 69 65 6e 74 2c 20 74 68 6f   sufficient, tho
229e0 75 67 68 20 74 68 65 20 73 75 62 72 6f 75 74 69  ugh the subrouti
229f0 6e 65 20 74 6f 20 6d 61 6e 69 66 65 73 74 20 74  ne to manifest t
22a00 68 65 20 76 69 65 77 20 64 6f 65 73 20 6e 65 65  he view does nee
22a10 64 0a 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 69  d.    ** to be i
22a20 6e 76 6f 6b 65 64 20 61 67 61 69 6e 2e 20 2a 2f  nvoked again. */
22a30 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e  .    if( pItem->
22a40 61 64 64 72 46 69 6c 6c 53 75 62 20 29 7b 0a 20  addrFillSub ){. 
22a50 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
22a60 76 69 61 43 6f 72 6f 75 74 69 6e 65 3d 3d 30 20  viaCoroutine==0 
22a70 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
22a80 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
22a90 4f 50 5f 47 6f 73 75 62 2c 20 70 49 74 65 6d 2d  OP_Gosub, pItem-
22aa0 3e 72 65 67 52 65 74 75 72 6e 2c 20 70 49 74 65  >regReturn, pIte
22ab0 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 29 3b  m->addrFillSub);
22ac0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63  .      }.      c
22ad0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 0a  ontinue;.    }..
22ae0 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74      /* Increment
22af0 20 50 61 72 73 65 2e 6e 48 65 69 67 68 74 20 62   Parse.nHeight b
22b00 79 20 74 68 65 20 68 65 69 67 68 74 20 6f 66 20  y the height of 
22b10 74 68 65 20 6c 61 72 67 65 73 74 20 65 78 70 72  the largest expr
22b20 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2a 20 74 72  ession.    ** tr
22b30 65 65 20 72 65 66 65 72 65 64 20 74 6f 20 62 79  ee refered to by
22b40 20 74 68 69 73 2c 20 74 68 65 20 70 61 72 65 6e   this, the paren
22b50 74 20 73 65 6c 65 63 74 2e 20 54 68 65 20 63 68  t select. The ch
22b60 69 6c 64 20 73 65 6c 65 63 74 0a 20 20 20 20 2a  ild select.    *
22b70 2a 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 65 78  * may contain ex
22b80 70 72 65 73 73 69 6f 6e 20 74 72 65 65 73 20 6f  pression trees o
22b90 66 20 61 74 20 6d 6f 73 74 0a 20 20 20 20 2a 2a  f at most.    **
22ba0 20 28 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50   (SQLITE_MAX_EXP
22bb0 52 5f 44 45 50 54 48 2d 50 61 72 73 65 2e 6e 48  R_DEPTH-Parse.nH
22bc0 65 69 67 68 74 29 20 68 65 69 67 68 74 2e 20 54  eight) height. T
22bd0 68 69 73 20 69 73 20 61 20 62 69 74 0a 20 20 20  his is a bit.   
22be0 20 2a 2a 20 6d 6f 72 65 20 63 6f 6e 73 65 72 76   ** more conserv
22bf0 61 74 69 76 65 20 74 68 61 6e 20 6e 65 63 65 73  ative than neces
22c00 73 61 72 79 2c 20 62 75 74 20 6d 75 63 68 20 65  sary, but much e
22c10 61 73 69 65 72 20 74 68 61 6e 20 65 6e 66 6f 72  asier than enfor
22c20 63 69 6e 67 0a 20 20 20 20 2a 2a 20 61 6e 20 65  cing.    ** an e
22c30 78 61 63 74 20 6c 69 6d 69 74 2e 0a 20 20 20 20  xact limit..    
22c40 2a 2f 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  */.    pParse->n
22c50 48 65 69 67 68 74 20 2b 3d 20 73 71 6c 69 74 65  Height += sqlite
22c60 33 53 65 6c 65 63 74 45 78 70 72 48 65 69 67 68  3SelectExprHeigh
22c70 74 28 70 29 3b 0a 0a 20 20 20 20 69 73 41 67 67  t(p);..    isAgg
22c80 53 75 62 20 3d 20 28 70 53 75 62 2d 3e 73 65 6c  Sub = (pSub->sel
22c90 46 6c 61 67 73 20 26 20 53 46 5f 41 67 67 72 65  Flags & SF_Aggre
22ca0 67 61 74 65 29 21 3d 30 3b 0a 20 20 20 20 69 66  gate)!=0;.    if
22cb0 28 20 66 6c 61 74 74 65 6e 53 75 62 71 75 65 72  ( flattenSubquer
22cc0 79 28 70 50 61 72 73 65 2c 20 70 2c 20 69 2c 20  y(pParse, p, i, 
22cd0 69 73 41 67 67 2c 20 69 73 41 67 67 53 75 62 29  isAgg, isAggSub)
22ce0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69   ){.      /* Thi
22cf0 73 20 73 75 62 71 75 65 72 79 20 63 61 6e 20 62  s subquery can b
22d00 65 20 61 62 73 6f 72 62 65 64 20 69 6e 74 6f 20  e absorbed into 
22d10 69 74 73 20 70 61 72 65 6e 74 2e 20 2a 2f 0a 20  its parent. */. 
22d20 20 20 20 20 20 69 66 28 20 69 73 41 67 67 53 75       if( isAggSu
22d30 62 20 29 7b 0a 20 20 20 20 20 20 20 20 69 73 41  b ){.        isA
22d40 67 67 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  gg = 1;.        
22d50 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53  p->selFlags |= S
22d60 46 5f 41 67 67 72 65 67 61 74 65 3b 0a 20 20 20  F_Aggregate;.   
22d70 20 20 20 7d 0a 20 20 20 20 20 20 69 20 3d 20 2d     }.      i = -
22d80 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  1;.    }else if(
22d90 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3d   pTabList->nSrc=
22da0 3d 31 20 26 26 20 28 70 2d 3e 73 65 6c 46 6c 61  =1 && (p->selFla
22db0 67 73 20 26 20 53 46 5f 4d 61 74 65 72 69 61 6c  gs & SF_Material
22dc0 69 7a 65 29 3d 3d 30 0a 20 20 20 20 20 20 26 26  ize)==0.      &&
22dd0 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61   OptimizationEna
22de0 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f  bled(db, SQLITE_
22df0 53 75 62 71 43 6f 72 6f 75 74 69 6e 65 29 0a 20  SubqCoroutine). 
22e00 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49     ){.      /* I
22e10 6d 70 6c 65 6d 65 6e 74 20 61 20 63 6f 2d 72 6f  mplement a co-ro
22e20 75 74 69 6e 65 20 74 68 61 74 20 77 69 6c 6c 20  utine that will 
22e30 72 65 74 75 72 6e 20 61 20 73 69 6e 67 6c 65 20  return a single 
22e40 72 6f 77 20 6f 66 20 74 68 65 20 72 65 73 75 6c  row of the resul
22e50 74 0a 20 20 20 20 20 20 2a 2a 20 73 65 74 20 6f  t.      ** set o
22e60 6e 20 65 61 63 68 20 69 6e 76 6f 63 61 74 69 6f  n each invocatio
22e70 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  n..      */.    
22e80 20 20 69 6e 74 20 61 64 64 72 54 6f 70 3b 0a 20    int addrTop;. 
22e90 20 20 20 20 20 69 6e 74 20 61 64 64 72 45 6f 66       int addrEof
22ea0 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 72  ;.      pItem->r
22eb0 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50 61  egReturn = ++pPa
22ec0 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
22ed0 20 61 64 64 72 45 6f 66 20 3d 20 2b 2b 70 50 61   addrEof = ++pPa
22ee0 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
22ef0 20 2f 2a 20 42 65 66 6f 72 65 20 63 6f 64 69 6e   /* Before codin
22f00 67 20 74 68 65 20 4f 50 5f 47 6f 74 6f 20 74 6f  g the OP_Goto to
22f10 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 73 74 61   jump to the sta
22f20 72 74 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 72  rt of the main r
22f30 6f 75 74 69 6e 65 2c 0a 20 20 20 20 20 20 2a 2a  outine,.      **
22f40 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65   ensure that the
22f50 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 76 65 72   jump to the ver
22f60 69 66 79 2d 73 63 68 65 6d 61 20 72 6f 75 74 69  ify-schema routi
22f70 6e 65 20 68 61 73 20 61 6c 72 65 61 64 79 0a 20  ne has already. 
22f80 20 20 20 20 20 2a 2a 20 62 65 65 6e 20 63 6f 64       ** been cod
22f90 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74  ed. Otherwise, t
22fa0 68 65 20 76 65 72 69 66 79 2d 73 63 68 65 6d 61  he verify-schema
22fb0 20 77 6f 75 6c 64 20 6c 69 6b 65 6c 79 20 62 65   would likely be
22fc0 20 63 6f 64 65 64 20 61 73 20 0a 20 20 20 20 20   coded as .     
22fd0 20 2a 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20   ** part of the 
22fe0 63 6f 2d 72 6f 75 74 69 6e 65 2e 20 49 66 20 74  co-routine. If t
22ff0 68 65 20 6d 61 69 6e 20 72 6f 75 74 69 6e 65 20  he main routine 
23000 74 68 65 6e 20 61 63 63 65 73 73 65 64 20 74 68  then accessed th
23010 65 20 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61  e .      ** data
23020 62 61 73 65 20 62 65 66 6f 72 65 20 69 6e 76 6f  base before invo
23030 6b 69 6e 67 20 74 68 65 20 63 6f 2d 72 6f 75 74  king the co-rout
23040 69 6e 65 20 66 6f 72 20 74 68 65 20 66 69 72 73  ine for the firs
23050 74 20 74 69 6d 65 20 28 66 6f 72 20 0a 20 20 20  t time (for .   
23060 20 20 20 2a 2a 20 65 78 61 6d 70 6c 65 20 74 6f     ** example to
23070 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 20 4c 49   initialize a LI
23080 4d 49 54 20 72 65 67 69 73 74 65 72 20 66 72 6f  MIT register fro
23090 6d 20 61 20 73 75 62 2d 73 65 6c 65 63 74 29 2c  m a sub-select),
230a0 20 69 74 20 77 6f 75 6c 64 20 0a 20 20 20 20 20   it would .     
230b0 20 2a 2a 20 62 65 20 64 6f 69 6e 67 20 73 6f 20   ** be doing so 
230c0 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 76  without having v
230d0 65 72 69 66 69 65 64 20 74 68 65 20 73 63 68 65  erified the sche
230e0 6d 61 20 76 65 72 73 69 6f 6e 20 61 6e 64 20 6f  ma version and o
230f0 62 74 61 69 6e 65 64 20 0a 20 20 20 20 20 20 2a  btained .      *
23100 2a 20 74 68 65 20 72 65 71 75 69 72 65 64 20 64  * the required d
23110 62 20 6c 6f 63 6b 73 2e 20 53 65 65 20 74 69 63  b locks. See tic
23120 6b 65 74 20 64 36 62 33 36 62 65 33 38 2e 20 20  ket d6b36be38.  
23130 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
23140 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61  CodeVerifySchema
23150 28 70 50 61 72 73 65 2c 20 2d 31 29 3b 0a 20 20  (pParse, -1);.  
23160 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
23170 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp0(v, OP_Goto
23180 29 3b 0a 20 20 20 20 20 20 61 64 64 72 54 6f 70  );.      addrTop
23190 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
231a0 64 4f 70 31 28 76 2c 20 4f 50 5f 4f 70 65 6e 50  dOp1(v, OP_OpenP
231b0 73 65 75 64 6f 2c 20 70 49 74 65 6d 2d 3e 69 43  seudo, pItem->iC
231c0 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 73 71  ursor);.      sq
231d0 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
231e0 35 28 76 2c 20 31 29 3b 0a 20 20 20 20 20 20 56  5(v, 1);.      V
231f0 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
23200 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20 25 73  coroutine for %s
23210 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e  ", pItem->pTab->
23220 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 70  zName));.      p
23230 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75  Item->addrFillSu
23240 62 20 3d 20 61 64 64 72 54 6f 70 3b 0a 20 20 20  b = addrTop;.   
23250 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
23260 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
23270 65 72 2c 20 30 2c 20 61 64 64 72 45 6f 66 29 3b  er, 0, addrEof);
23280 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
23290 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 31 29  beChangeP5(v, 1)
232a0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  ;.      sqlite3S
232b0 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64  electDestInit(&d
232c0 65 73 74 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69  est, SRT_Corouti
232d0 6e 65 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65  ne, pItem->regRe
232e0 74 75 72 6e 29 3b 0a 20 20 20 20 20 20 65 78 70  turn);.      exp
232f0 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 70  lainSetInteger(p
23300 49 74 65 6d 2d 3e 69 53 65 6c 65 63 74 49 64 2c  Item->iSelectId,
23310 20 28 75 38 29 70 50 61 72 73 65 2d 3e 69 4e 65   (u8)pParse->iNe
23320 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20  xtSelectId);.   
23330 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
23340 28 70 50 61 72 73 65 2c 20 70 53 75 62 2c 20 26  (pParse, pSub, &
23350 64 65 73 74 29 3b 0a 20 20 20 20 20 20 70 49 74  dest);.      pIt
23360 65 6d 2d 3e 70 54 61 62 2d 3e 6e 52 6f 77 45 73  em->pTab->nRowEs
23370 74 20 3d 20 28 75 6e 73 69 67 6e 65 64 29 70 53  t = (unsigned)pS
23380 75 62 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a  ub->nSelectRow;.
23390 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 76 69 61        pItem->via
233a0 43 6f 72 6f 75 74 69 6e 65 20 3d 20 31 3b 0a 20  Coroutine = 1;. 
233b0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
233c0 43 68 61 6e 67 65 50 32 28 76 2c 20 61 64 64 72  ChangeP2(v, addr
233d0 54 6f 70 2c 20 64 65 73 74 2e 69 53 64 73 74 29  Top, dest.iSdst)
233e0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
233f0 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 61  dbeChangeP3(v, a
23400 64 64 72 54 6f 70 2c 20 64 65 73 74 2e 6e 53 64  ddrTop, dest.nSd
23410 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  st);.      sqlit
23420 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
23430 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 61  OP_Integer, 1, a
23440 64 64 72 45 6f 66 29 3b 0a 20 20 20 20 20 20 73  ddrEof);.      s
23450 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
23460 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 70 49  (v, OP_Yield, pI
23470 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b  tem->regReturn);
23480 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
23490 6e 74 28 28 76 2c 20 22 65 6e 64 20 25 73 22 2c  nt((v, "end %s",
234a0 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e   pItem->pTab->zN
234b0 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  ame));.      sql
234c0 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
234d0 28 76 2c 20 61 64 64 72 54 6f 70 2d 31 29 3b 0a  (v, addrTop-1);.
234e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c 65        sqlite3Cle
234f0 61 72 54 65 6d 70 52 65 67 43 61 63 68 65 28 70  arTempRegCache(p
23500 50 61 72 73 65 29 3b 0a 20 20 20 20 7d 65 6c 73  Parse);.    }els
23510 65 7b 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65  e{.      /* Gene
23520 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e  rate a subroutin
23530 65 20 74 68 61 74 20 77 69 6c 6c 20 66 69 6c 6c  e that will fill
23540 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61   an ephemeral ta
23550 62 6c 65 20 77 69 74 68 0a 20 20 20 20 20 20 2a  ble with.      *
23560 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  * the content of
23570 20 74 68 69 73 20 73 75 62 71 75 65 72 79 2e 20   this subquery. 
23580 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c   pItem->addrFill
23590 53 75 62 20 77 69 6c 6c 20 70 6f 69 6e 74 0a 20  Sub will point. 
235a0 20 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 61       ** to the a
235b0 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 67 65  ddress of the ge
235c0 6e 65 72 61 74 65 64 20 73 75 62 72 6f 75 74 69  nerated subrouti
235d0 6e 65 2e 20 20 70 49 74 65 6d 2d 3e 72 65 67 52  ne.  pItem->regR
235e0 65 74 75 72 6e 0a 20 20 20 20 20 20 2a 2a 20 69  eturn.      ** i
235f0 73 20 61 20 72 65 67 69 73 74 65 72 20 61 6c 6c  s a register all
23600 6f 63 61 74 65 64 20 74 6f 20 68 6f 6c 64 20 74  ocated to hold t
23610 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20 72 65  he subroutine re
23620 74 75 72 6e 20 61 64 64 72 65 73 73 0a 20 20 20  turn address.   
23630 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20     */.      int 
23640 74 6f 70 41 64 64 72 3b 0a 20 20 20 20 20 20 69  topAddr;.      i
23650 6e 74 20 6f 6e 63 65 41 64 64 72 20 3d 20 30 3b  nt onceAddr = 0;
23660 0a 20 20 20 20 20 20 69 6e 74 20 72 65 74 41 64  .      int retAd
23670 64 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  dr;.      assert
23680 28 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c  ( pItem->addrFil
23690 6c 53 75 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20  lSub==0 );.     
236a0 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72   pItem->regRetur
236b0 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  n = ++pParse->nM
236c0 65 6d 3b 0a 20 20 20 20 20 20 74 6f 70 41 64 64  em;.      topAdd
236d0 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
236e0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
236f0 67 65 72 2c 20 30 2c 20 70 49 74 65 6d 2d 3e 72  ger, 0, pItem->r
23700 65 67 52 65 74 75 72 6e 29 3b 0a 20 20 20 20 20  egReturn);.     
23710 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c   pItem->addrFill
23720 53 75 62 20 3d 20 74 6f 70 41 64 64 72 2b 31 3b  Sub = topAddr+1;
23730 0a 20 20 20 20 20 20 56 64 62 65 4e 6f 6f 70 43  .      VdbeNoopC
23740 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6d 61 74 65  omment((v, "mate
23750 72 69 61 6c 69 7a 65 20 25 73 22 2c 20 70 49 74  rialize %s", pIt
23760 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  em->pTab->zName)
23770 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74  );.      if( pIt
23780 65 6d 2d 3e 69 73 43 6f 72 72 65 6c 61 74 65 64  em->isCorrelated
23790 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ==0 ){.        /
237a0 2a 20 49 66 20 74 68 65 20 73 75 62 71 75 65 72  * If the subquer
237b0 79 20 69 73 20 6e 6f 20 63 6f 72 72 65 6c 61 74  y is no correlat
237c0 65 64 20 61 6e 64 20 69 66 20 77 65 20 61 72 65  ed and if we are
237d0 20 6e 6f 74 20 69 6e 73 69 64 65 20 6f 66 0a 20   not inside of. 
237e0 20 20 20 20 20 20 20 2a 2a 20 61 20 74 72 69 67         ** a trig
237f0 67 65 72 2c 20 74 68 65 6e 20 77 65 20 6f 6e 6c  ger, then we onl
23800 79 20 6e 65 65 64 20 74 6f 20 63 6f 6d 70 75 74  y need to comput
23810 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  e the value of t
23820 68 65 20 73 75 62 71 75 65 72 79 0a 20 20 20 20  he subquery.    
23830 20 20 20 20 2a 2a 20 6f 6e 63 65 2e 20 2a 2f 0a      ** once. */.
23840 20 20 20 20 20 20 20 20 6f 6e 63 65 41 64 64 72          onceAddr
23850 20 3d 20 73 71 6c 69 74 65 33 43 6f 64 65 4f 6e   = sqlite3CodeOn
23860 63 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  ce(pParse);.    
23870 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
23880 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28  3SelectDestInit(
23890 26 64 65 73 74 2c 20 53 52 54 5f 45 70 68 65 6d  &dest, SRT_Ephem
238a0 54 61 62 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72  Tab, pItem->iCur
238b0 73 6f 72 29 3b 0a 20 20 20 20 20 20 65 78 70 6c  sor);.      expl
238c0 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 70 49  ainSetInteger(pI
238d0 74 65 6d 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20  tem->iSelectId, 
238e0 28 75 38 29 70 50 61 72 73 65 2d 3e 69 4e 65 78  (u8)pParse->iNex
238f0 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20  tSelectId);.    
23900 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28    sqlite3Select(
23910 70 50 61 72 73 65 2c 20 70 53 75 62 2c 20 26 64  pParse, pSub, &d
23920 65 73 74 29 3b 0a 20 20 20 20 20 20 70 49 74 65  est);.      pIte
23930 6d 2d 3e 70 54 61 62 2d 3e 6e 52 6f 77 45 73 74  m->pTab->nRowEst
23940 20 3d 20 28 75 6e 73 69 67 6e 65 64 29 70 53 75   = (unsigned)pSu
23950 62 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20  b->nSelectRow;. 
23960 20 20 20 20 20 69 66 28 20 6f 6e 63 65 41 64 64       if( onceAdd
23970 72 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 4a  r ) sqlite3VdbeJ
23980 75 6d 70 48 65 72 65 28 76 2c 20 6f 6e 63 65 41  umpHere(v, onceA
23990 64 64 72 29 3b 0a 20 20 20 20 20 20 72 65 74 41  ddr);.      retA
239a0 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
239b0 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65  eAddOp1(v, OP_Re
239c0 74 75 72 6e 2c 20 70 49 74 65 6d 2d 3e 72 65 67  turn, pItem->reg
239d0 52 65 74 75 72 6e 29 3b 0a 20 20 20 20 20 20 56  Return);.      V
239e0 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
239f0 65 6e 64 20 25 73 22 2c 20 70 49 74 65 6d 2d 3e  end %s", pItem->
23a00 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20  pTab->zName));. 
23a10 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
23a20 43 68 61 6e 67 65 50 31 28 76 2c 20 74 6f 70 41  ChangeP1(v, topA
23a30 64 64 72 2c 20 72 65 74 41 64 64 72 29 3b 0a 20  ddr, retAddr);. 
23a40 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c 65 61       sqlite3Clea
23a50 72 54 65 6d 70 52 65 67 43 61 63 68 65 28 70 50  rTempRegCache(pP
23a60 61 72 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  arse);.    }.   
23a70 20 69 66 28 20 2f 2a 70 50 61 72 73 65 2d 3e 6e   if( /*pParse->n
23a80 45 72 72 20 7c 7c 2a 2f 20 64 62 2d 3e 6d 61 6c  Err ||*/ db->mal
23a90 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
23aa0 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
23ab0 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  nd;.    }.    pP
23ac0 61 72 73 65 2d 3e 6e 48 65 69 67 68 74 20 2d 3d  arse->nHeight -=
23ad0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78   sqlite3SelectEx
23ae0 70 72 48 65 69 67 68 74 28 70 29 3b 0a 20 20 20  prHeight(p);.   
23af0 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70   pTabList = p->p
23b00 53 72 63 3b 0a 20 20 20 20 69 66 28 20 21 49 67  Src;.    if( !Ig
23b10 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62 79 28 70  norableOrderby(p
23b20 44 65 73 74 29 20 29 7b 0a 20 20 20 20 20 20 70  Dest) ){.      p
23b30 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72  OrderBy = p->pOr
23b40 64 65 72 42 79 3b 0a 20 20 20 20 7d 0a 20 20 7d  derBy;.    }.  }
23b50 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70  .  pEList = p->p
23b60 45 4c 69 73 74 3b 0a 23 65 6e 64 69 66 0a 20 20  EList;.#endif.  
23b70 70 57 68 65 72 65 20 3d 20 70 2d 3e 70 57 68 65  pWhere = p->pWhe
23b80 72 65 3b 0a 20 20 70 47 72 6f 75 70 42 79 20 3d  re;.  pGroupBy =
23b90 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20   p->pGroupBy;.  
23ba0 70 48 61 76 69 6e 67 20 3d 20 70 2d 3e 70 48 61  pHaving = p->pHa
23bb0 76 69 6e 67 3b 0a 20 20 73 44 69 73 74 69 6e 63  ving;.  sDistinc
23bc0 74 2e 69 73 54 6e 63 74 20 3d 20 28 70 2d 3e 73  t.isTnct = (p->s
23bd0 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73  elFlags & SF_Dis
23be0 74 69 6e 63 74 29 21 3d 30 3b 0a 0a 23 69 66 6e  tinct)!=0;..#ifn
23bf0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
23c00 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a  COMPOUND_SELECT.
23c10 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
23c20 20 61 72 65 20 61 20 73 65 71 75 65 6e 63 65 20   are a sequence 
23c30 6f 66 20 71 75 65 72 69 65 73 2c 20 64 6f 20 74  of queries, do t
23c40 68 65 20 65 61 72 6c 69 65 72 20 6f 6e 65 73 20  he earlier ones 
23c50 66 69 72 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  first..  */.  if
23c60 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20  ( p->pPrior ){. 
23c70 20 20 20 69 66 28 20 70 2d 3e 70 52 69 67 68 74     if( p->pRight
23c80 6d 6f 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  most==0 ){.     
23c90 20 53 65 6c 65 63 74 20 2a 70 4c 6f 6f 70 2c 20   Select *pLoop, 
23ca0 2a 70 52 69 67 68 74 20 3d 20 30 3b 0a 20 20 20  *pRight = 0;.   
23cb0 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a     int cnt = 0;.
23cc0 20 20 20 20 20 20 69 6e 74 20 6d 78 53 65 6c 65        int mxSele
23cd0 63 74 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 4c  ct;.      for(pL
23ce0 6f 6f 70 3d 70 3b 20 70 4c 6f 6f 70 3b 20 70 4c  oop=p; pLoop; pL
23cf0 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 50 72 69 6f  oop=pLoop->pPrio
23d00 72 2c 20 63 6e 74 2b 2b 29 7b 0a 20 20 20 20 20  r, cnt++){.     
23d10 20 20 20 70 4c 6f 6f 70 2d 3e 70 52 69 67 68 74     pLoop->pRight
23d20 6d 6f 73 74 20 3d 20 70 3b 0a 20 20 20 20 20 20  most = p;.      
23d30 20 20 70 4c 6f 6f 70 2d 3e 70 4e 65 78 74 20 3d    pLoop->pNext =
23d40 20 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20   pRight;.       
23d50 20 70 52 69 67 68 74 20 3d 20 70 4c 6f 6f 70 3b   pRight = pLoop;
23d60 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d  .      }.      m
23d70 78 53 65 6c 65 63 74 20 3d 20 64 62 2d 3e 61 4c  xSelect = db->aL
23d80 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
23d90 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
23da0 54 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 6d 78  T];.      if( mx
23db0 53 65 6c 65 63 74 20 26 26 20 63 6e 74 3e 6d 78  Select && cnt>mx
23dc0 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Select ){.      
23dd0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
23de0 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d  g(pParse, "too m
23df0 61 6e 79 20 74 65 72 6d 73 20 69 6e 20 63 6f 6d  any terms in com
23e00 70 6f 75 6e 64 20 53 45 4c 45 43 54 22 29 3b 0a  pound SELECT");.
23e10 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c          goto sel
23e20 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d  ect_end;.      }
23e30 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
23e40 6d 75 6c 74 69 53 65 6c 65 63 74 28 70 50 61 72  multiSelect(pPar
23e50 73 65 2c 20 70 2c 20 70 44 65 73 74 29 3b 0a 20  se, p, pDest);. 
23e60 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74     explainSetInt
23e70 65 67 65 72 28 70 50 61 72 73 65 2d 3e 69 53 65  eger(pParse->iSe
23e80 6c 65 63 74 49 64 2c 20 69 52 65 73 74 6f 72 65  lectId, iRestore
23e90 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 72  SelectId);.    r
23ea0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65  eturn rc;.  }.#e
23eb0 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ndif..  /* If th
23ec0 65 72 65 20 69 73 20 62 6f 74 68 20 61 20 47 52  ere is both a GR
23ed0 4f 55 50 20 42 59 20 61 6e 64 20 61 6e 20 4f 52  OUP BY and an OR
23ee0 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 6e  DER BY clause an
23ef0 64 20 74 68 65 79 20 61 72 65 0a 20 20 2a 2a 20  d they are.  ** 
23f00 69 64 65 6e 74 69 63 61 6c 2c 20 74 68 65 6e 20  identical, then 
23f10 64 69 73 61 62 6c 65 20 74 68 65 20 4f 52 44 45  disable the ORDE
23f20 52 20 42 59 20 63 6c 61 75 73 65 20 73 69 6e 63  R BY clause sinc
23f30 65 20 74 68 65 20 47 52 4f 55 50 20 42 59 0a 20  e the GROUP BY. 
23f40 20 2a 2a 20 77 69 6c 6c 20 63 61 75 73 65 20 65   ** will cause e
23f50 6c 65 6d 65 6e 74 73 20 74 6f 20 63 6f 6d 65 20  lements to come 
23f60 6f 75 74 20 69 6e 20 74 68 65 20 63 6f 72 72 65  out in the corre
23f70 63 74 20 6f 72 64 65 72 2e 20 20 54 68 69 73 20  ct order.  This 
23f80 69 73 0a 20 20 2a 2a 20 61 6e 20 6f 70 74 69 6d  is.  ** an optim
23f90 69 7a 61 74 69 6f 6e 20 2d 20 74 68 65 20 63 6f  ization - the co
23fa0 72 72 65 63 74 20 61 6e 73 77 65 72 20 73 68 6f  rrect answer sho
23fb0 75 6c 64 20 72 65 73 75 6c 74 20 72 65 67 61 72  uld result regar
23fc0 64 6c 65 73 73 2e 0a 20 20 2a 2a 20 55 73 65 20  dless..  ** Use 
23fd0 74 68 65 20 53 51 4c 49 54 45 5f 47 72 6f 75 70  the SQLITE_Group
23fe0 42 79 4f 72 64 65 72 20 66 6c 61 67 20 77 69 74  ByOrder flag wit
23ff0 68 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  h SQLITE_TESTCTR
24000 4c 5f 4f 50 54 49 4d 49 5a 45 52 0a 20 20 2a 2a  L_OPTIMIZER.  **
24010 20 74 6f 20 64 69 73 61 62 6c 65 20 74 68 69 73   to disable this
24020 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 66 6f   optimization fo
24030 72 20 74 65 73 74 69 6e 67 20 70 75 72 70 6f 73  r testing purpos
24040 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73  es..  */.  if( s
24050 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43 6f  qlite3ExprListCo
24060 6d 70 61 72 65 28 70 2d 3e 70 47 72 6f 75 70 42  mpare(p->pGroupB
24070 79 2c 20 70 4f 72 64 65 72 42 79 29 3d 3d 30 0a  y, pOrderBy)==0.
24080 20 20 20 20 20 20 20 20 20 26 26 20 4f 70 74 69           && Opti
24090 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28  mizationEnabled(
240a0 64 62 2c 20 53 51 4c 49 54 45 5f 47 72 6f 75 70  db, SQLITE_Group
240b0 42 79 4f 72 64 65 72 29 20 29 7b 0a 20 20 20 20  ByOrder) ){.    
240c0 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  pOrderBy = 0;.  
240d0 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 71  }..  /* If the q
240e0 75 65 72 79 20 69 73 20 44 49 53 54 49 4e 43 54  uery is DISTINCT
240f0 20 77 69 74 68 20 61 6e 20 4f 52 44 45 52 20 42   with an ORDER B
24100 59 20 62 75 74 20 69 73 20 6e 6f 74 20 61 6e 20  Y but is not an 
24110 61 67 67 72 65 67 61 74 65 2c 20 61 6e 64 20 0a  aggregate, and .
24120 20 20 2a 2a 20 69 66 20 74 68 65 20 73 65 6c 65    ** if the sele
24130 63 74 2d 6c 69 73 74 20 69 73 20 74 68 65 20 73  ct-list is the s
24140 61 6d 65 20 61 73 20 74 68 65 20 4f 52 44 45 52  ame as the ORDER
24150 20 42 59 20 6c 69 73 74 2c 20 74 68 65 6e 20 74   BY list, then t
24160 68 69 73 20 71 75 65 72 79 0a 20 20 2a 2a 20 63  his query.  ** c
24170 61 6e 20 62 65 20 72 65 77 72 69 74 74 65 6e 20  an be rewritten 
24180 61 73 20 61 20 47 52 4f 55 50 20 42 59 2e 20 49  as a GROUP BY. I
24190 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74  n other words, t
241a0 68 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  his:.  **.  **  
241b0 20 20 20 53 45 4c 45 43 54 20 44 49 53 54 49 4e     SELECT DISTIN
241c0 43 54 20 78 79 7a 20 46 52 4f 4d 20 2e 2e 2e 20  CT xyz FROM ... 
241d0 4f 52 44 45 52 20 42 59 20 78 79 7a 0a 20 20 2a  ORDER BY xyz.  *
241e0 2a 0a 20 20 2a 2a 20 69 73 20 74 72 61 6e 73 66  *.  ** is transf
241f0 6f 72 6d 65 64 20 74 6f 3a 0a 20 20 2a 2a 0a 20  ormed to:.  **. 
24200 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 78   **     SELECT x
24210 79 7a 20 46 52 4f 4d 20 2e 2e 2e 20 47 52 4f 55  yz FROM ... GROU
24220 50 20 42 59 20 78 79 7a 0a 20 20 2a 2a 0a 20 20  P BY xyz.  **.  
24230 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 66 6f  ** The second fo
24240 72 6d 20 69 73 20 70 72 65 66 65 72 72 65 64 20  rm is preferred 
24250 61 73 20 61 20 73 69 6e 67 6c 65 20 69 6e 64 65  as a single inde
24260 78 20 28 6f 72 20 74 65 6d 70 2d 74 61 62 6c 65  x (or temp-table
24270 29 20 6d 61 79 20 62 65 20 0a 20 20 2a 2a 20 75  ) may be .  ** u
24280 73 65 64 20 66 6f 72 20 62 6f 74 68 20 74 68 65  sed for both the
24290 20 4f 52 44 45 52 20 42 59 20 61 6e 64 20 44 49   ORDER BY and DI
242a0 53 54 49 4e 43 54 20 70 72 6f 63 65 73 73 69 6e  STINCT processin
242b0 67 2e 20 41 73 20 6f 72 69 67 69 6e 61 6c 6c 79  g. As originally
242c0 20 0a 20 20 2a 2a 20 77 72 69 74 74 65 6e 20 74   .  ** written t
242d0 68 65 20 71 75 65 72 79 20 6d 75 73 74 20 75 73  he query must us
242e0 65 20 61 20 74 65 6d 70 2d 74 61 62 6c 65 20 66  e a temp-table f
242f0 6f 72 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  or at least one 
24300 6f 66 20 74 68 65 20 4f 52 44 45 52 20 0a 20 20  of the ORDER .  
24310 2a 2a 20 42 59 20 61 6e 64 20 44 49 53 54 49 4e  ** BY and DISTIN
24320 43 54 2c 20 61 6e 64 20 61 6e 20 69 6e 64 65 78  CT, and an index
24330 20 6f 72 20 73 65 70 61 72 61 74 65 20 74 65 6d   or separate tem
24340 70 2d 74 61 62 6c 65 20 66 6f 72 20 74 68 65 20  p-table for the 
24350 6f 74 68 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66  other..  */.  if
24360 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  ( (p->selFlags &
24370 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46   (SF_Distinct|SF
24380 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46  _Aggregate))==SF
24390 5f 44 69 73 74 69 6e 63 74 20 0a 20 20 20 26 26  _Distinct .   &&
243a0 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
243b0 43 6f 6d 70 61 72 65 28 70 4f 72 64 65 72 42 79  Compare(pOrderBy
243c0 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3d 3d 30 0a  , p->pEList)==0.
243d0 20 20 29 7b 0a 20 20 20 20 70 2d 3e 73 65 6c 46    ){.    p->selF
243e0 6c 61 67 73 20 26 3d 20 7e 53 46 5f 44 69 73 74  lags &= ~SF_Dist
243f0 69 6e 63 74 3b 0a 20 20 20 20 70 2d 3e 70 47 72  inct;.    p->pGr
24400 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65 33 45  oupBy = sqlite3E
24410 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70  xprListDup(db, p
24420 2d 3e 70 45 4c 69 73 74 2c 20 30 29 3b 0a 20 20  ->pEList, 0);.  
24430 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e    pGroupBy = p->
24440 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 70 4f  pGroupBy;.    pO
24450 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20  rderBy = 0;.    
24460 2f 2a 20 4e 6f 74 69 63 65 20 74 68 61 74 20 65  /* Notice that e
24470 76 65 6e 20 74 68 6f 75 67 68 74 20 53 46 5f 44  ven thought SF_D
24480 69 73 74 69 6e 63 74 20 68 61 73 20 62 65 65 6e  istinct has been
24490 20 63 6c 65 61 72 65 64 20 66 72 6f 6d 20 70 2d   cleared from p-
244a0 3e 73 65 6c 46 6c 61 67 73 2c 0a 20 20 20 20 2a  >selFlags,.    *
244b0 2a 20 74 68 65 20 73 44 69 73 74 69 6e 63 74 2e  * the sDistinct.
244c0 69 73 54 6e 63 74 20 69 73 20 73 74 69 6c 6c 20  isTnct is still 
244d0 73 65 74 2e 20 20 48 65 6e 63 65 2c 20 69 73 54  set.  Hence, isT
244e0 6e 63 74 20 72 65 70 72 65 73 65 6e 74 73 20 74  nct represents t
244f0 68 65 0a 20 20 20 20 2a 2a 20 6f 72 69 67 69 6e  he.    ** origin
24500 61 6c 20 73 65 74 74 69 6e 67 20 6f 66 20 74 68  al setting of th
24510 65 20 53 46 5f 44 69 73 74 69 6e 63 74 20 66 6c  e SF_Distinct fl
24520 61 67 2c 20 6e 6f 74 20 74 68 65 20 63 75 72 72  ag, not the curr
24530 65 6e 74 20 73 65 74 74 69 6e 67 20 2a 2f 0a 20  ent setting */. 
24540 20 20 20 61 73 73 65 72 74 28 20 73 44 69 73 74     assert( sDist
24550 69 6e 63 74 2e 69 73 54 6e 63 74 20 29 3b 0a 20  inct.isTnct );. 
24560 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72   }..  /* If ther
24570 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59  e is an ORDER BY
24580 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 74 68   clause, then th
24590 69 73 20 73 6f 72 74 69 6e 67 0a 20 20 2a 2a 20  is sorting.  ** 
245a0 69 6e 64 65 78 20 6d 69 67 68 74 20 65 6e 64 20  index might end 
245b0 75 70 20 62 65 69 6e 67 20 75 6e 75 73 65 64 20  up being unused 
245c0 69 66 20 74 68 65 20 64 61 74 61 20 63 61 6e 20  if the data can 
245d0 62 65 20 0a 20 20 2a 2a 20 65 78 74 72 61 63 74  be .  ** extract
245e0 65 64 20 69 6e 20 70 72 65 2d 73 6f 72 74 65 64  ed in pre-sorted
245f0 20 6f 72 64 65 72 2e 20 20 49 66 20 74 68 61 74   order.  If that
24600 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68   is the case, th
24610 65 6e 20 74 68 65 0a 20 20 2a 2a 20 4f 50 5f 4f  en the.  ** OP_O
24620 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e 73  penEphemeral ins
24630 74 72 75 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65  truction will be
24640 20 63 68 61 6e 67 65 64 20 74 6f 20 61 6e 20 4f   changed to an O
24650 50 5f 4e 6f 6f 70 20 6f 6e 63 65 0a 20 20 2a 2a  P_Noop once.  **
24660 20 77 65 20 66 69 67 75 72 65 20 6f 75 74 20 74   we figure out t
24670 68 61 74 20 74 68 65 20 73 6f 72 74 69 6e 67 20  hat the sorting 
24680 69 6e 64 65 78 20 69 73 20 6e 6f 74 20 6e 65 65  index is not nee
24690 64 65 64 2e 20 20 54 68 65 20 61 64 64 72 53 6f  ded.  The addrSo
246a0 72 74 49 6e 64 65 78 0a 20 20 2a 2a 20 76 61 72  rtIndex.  ** var
246b0 69 61 62 6c 65 20 69 73 20 75 73 65 64 20 74 6f  iable is used to
246c0 20 66 61 63 69 6c 69 74 61 74 65 20 74 68 61 74   facilitate that
246d0 20 63 68 61 6e 67 65 2e 0a 20 20 2a 2f 0a 20 20   change..  */.  
246e0 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a  if( pOrderBy ){.
246f0 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65      KeyInfo *pKe
24700 79 49 6e 66 6f 3b 0a 20 20 20 20 70 4b 65 79 49  yInfo;.    pKeyI
24710 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f  nfo = keyInfoFro
24720 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  mExprList(pParse
24730 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20  , pOrderBy);.   
24740 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72   pOrderBy->iECur
24750 73 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  sor = pParse->nT
24760 61 62 2b 2b 3b 0a 20 20 20 20 70 2d 3e 61 64 64  ab++;.    p->add
24770 72 4f 70 65 6e 45 70 68 6d 5b 32 5d 20 3d 20 61  rOpenEphm[2] = a
24780 64 64 72 53 6f 72 74 49 6e 64 65 78 20 3d 0a 20  ddrSortIndex =. 
24790 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
247a0 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65  AddOp4(v, OP_Ope
247b0 6e 45 70 68 65 6d 65 72 61 6c 2c 0a 20 20 20 20  nEphemeral,.    
247c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
247d0 20 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 2d         pOrderBy-
247e0 3e 69 45 43 75 72 73 6f 72 2c 20 70 4f 72 64 65  >iECursor, pOrde
247f0 72 42 79 2d 3e 6e 45 78 70 72 2b 32 2c 20 30 2c  rBy->nExpr+2, 0,
24800 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
24810 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
24820 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f  r*)pKeyInfo, P4_
24830 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29  KEYINFO_HANDOFF)
24840 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
24850 64 64 72 53 6f 72 74 49 6e 64 65 78 20 3d 20 2d  ddrSortIndex = -
24860 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  1;.  }..  /* If 
24870 74 68 65 20 6f 75 74 70 75 74 20 69 73 20 64 65  the output is de
24880 73 74 69 6e 65 64 20 66 6f 72 20 61 20 74 65 6d  stined for a tem
24890 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 6f 70  porary table, op
248a0 65 6e 20 74 68 61 74 20 74 61 62 6c 65 2e 0a 20  en that table.. 
248b0 20 2a 2f 0a 20 20 69 66 28 20 70 44 65 73 74 2d   */.  if( pDest-
248c0 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45 70 68 65  >eDest==SRT_Ephe
248d0 6d 54 61 62 20 29 7b 0a 20 20 20 20 73 71 6c 69  mTab ){.    sqli
248e0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
248f0 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
24900 6c 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72  l, pDest->iSDPar
24910 6d 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  m, pEList->nExpr
24920 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74  );.  }..  /* Set
24930 20 74 68 65 20 6c 69 6d 69 74 65 72 2e 0a 20 20   the limiter..  
24940 2a 2f 0a 20 20 69 45 6e 64 20 3d 20 73 71 6c 69  */.  iEnd = sqli
24950 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
24960 28 76 29 3b 0a 20 20 70 2d 3e 6e 53 65 6c 65 63  (v);.  p->nSelec
24970 74 52 6f 77 20 3d 20 28 64 6f 75 62 6c 65 29 4c  tRow = (double)L
24980 41 52 47 45 53 54 5f 49 4e 54 36 34 3b 0a 20 20  ARGEST_INT64;.  
24990 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69  computeLimitRegi
249a0 73 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c  sters(pParse, p,
249b0 20 69 45 6e 64 29 3b 0a 20 20 69 66 28 20 70 2d   iEnd);.  if( p-
249c0 3e 69 4c 69 6d 69 74 3d 3d 30 20 26 26 20 61 64  >iLimit==0 && ad
249d0 64 72 53 6f 72 74 49 6e 64 65 78 3e 3d 30 20 29  drSortIndex>=0 )
249e0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
249f0 65 47 65 74 4f 70 28 76 2c 20 61 64 64 72 53 6f  eGetOp(v, addrSo
24a00 72 74 49 6e 64 65 78 29 2d 3e 6f 70 63 6f 64 65  rtIndex)->opcode
24a10 20 3d 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e   = OP_SorterOpen
24a20 3b 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67  ;.    p->selFlag
24a30 73 20 7c 3d 20 53 46 5f 55 73 65 53 6f 72 74 65  s |= SF_UseSorte
24a40 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65  r;.  }..  /* Ope
24a50 6e 20 61 20 76 69 72 74 75 61 6c 20 69 6e 64 65  n a virtual inde
24a60 78 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68 65  x to use for the
24a70 20 64 69 73 74 69 6e 63 74 20 73 65 74 2e 0a 20   distinct set.. 
24a80 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c   */.  if( p->sel
24a90 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69  Flags & SF_Disti
24aa0 6e 63 74 20 29 7b 0a 20 20 20 20 73 44 69 73 74  nct ){.    sDist
24ab0 69 6e 63 74 2e 74 61 62 54 6e 63 74 20 3d 20 70  inct.tabTnct = p
24ac0 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
24ad0 20 20 20 73 44 69 73 74 69 6e 63 74 2e 61 64 64     sDistinct.add
24ae0 72 54 6e 63 74 20 3d 20 73 71 6c 69 74 65 33 56  rTnct = sqlite3V
24af0 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
24b00 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 0a 20  OpenEphemeral,. 
24b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
24b30 44 69 73 74 69 6e 63 74 2e 74 61 62 54 6e 63 74  Distinct.tabTnct
24b40 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  , 0, 0,.        
24b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24b60 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 6b          (char*)k
24b70 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69  eyInfoFromExprLi
24b80 73 74 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 45  st(pParse, p->pE
24b90 4c 69 73 74 29 2c 0a 20 20 20 20 20 20 20 20 20  List),.         
24ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24bb0 20 20 20 20 20 20 20 50 34 5f 4b 45 59 49 4e 46         P4_KEYINF
24bc0 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 20 20  O_HANDOFF);.    
24bd0 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
24be0 65 50 35 28 76 2c 20 42 54 52 45 45 5f 55 4e 4f  eP5(v, BTREE_UNO
24bf0 52 44 45 52 45 44 29 3b 0a 20 20 20 20 73 44 69  RDERED);.    sDi
24c00 73 74 69 6e 63 74 2e 65 54 6e 63 74 54 79 70 65  stinct.eTnctType
24c10 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43   = WHERE_DISTINC
24c20 54 5f 55 4e 4f 52 44 45 52 45 44 3b 0a 20 20 7d  T_UNORDERED;.  }
24c30 65 6c 73 65 7b 0a 20 20 20 20 73 44 69 73 74 69  else{.    sDisti
24c40 6e 63 74 2e 65 54 6e 63 74 54 79 70 65 20 3d 20  nct.eTnctType = 
24c50 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4e  WHERE_DISTINCT_N
24c60 4f 4f 50 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  OOP;.  }..  if( 
24c70 21 69 73 41 67 67 20 26 26 20 70 47 72 6f 75 70  !isAgg && pGroup
24c80 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  By==0 ){.    /* 
24c90 4e 6f 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  No aggregate fun
24ca0 63 74 69 6f 6e 73 20 61 6e 64 20 6e 6f 20 47 52  ctions and no GR
24cb0 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  OUP BY clause */
24cc0 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70  .    ExprList *p
24cd0 44 69 73 74 20 3d 20 28 73 44 69 73 74 69 6e 63  Dist = (sDistinc
24ce0 74 2e 69 73 54 6e 63 74 20 3f 20 70 2d 3e 70 45  t.isTnct ? p->pE
24cf0 4c 69 73 74 20 3a 20 30 29 3b 0a 0a 20 20 20 20  List : 0);..    
24d00 2f 2a 20 42 65 67 69 6e 20 74 68 65 20 64 61 74  /* Begin the dat
24d10 61 62 61 73 65 20 73 63 61 6e 2e 20 2a 2f 0a 20  abase scan. */. 
24d20 20 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69     pWInfo = sqli
24d30 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 70 50  te3WhereBegin(pP
24d40 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20  arse, pTabList, 
24d50 70 57 68 65 72 65 2c 20 70 4f 72 64 65 72 42 79  pWhere, pOrderBy
24d60 2c 20 70 44 69 73 74 2c 20 30 2c 30 29 3b 0a 20  , pDist, 0,0);. 
24d70 20 20 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30     if( pWInfo==0
24d80 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65   ) goto select_e
24d90 6e 64 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e  nd;.    if( pWIn
24da0 66 6f 2d 3e 6e 52 6f 77 4f 75 74 20 3c 20 70 2d  fo->nRowOut < p-
24db0 3e 6e 53 65 6c 65 63 74 52 6f 77 20 29 20 70 2d  >nSelectRow ) p-
24dc0 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 70 57  >nSelectRow = pW
24dd0 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 3b 0a 20  Info->nRowOut;. 
24de0 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 65     if( pWInfo->e
24df0 44 69 73 74 69 6e 63 74 20 29 20 73 44 69 73 74  Distinct ) sDist
24e00 69 6e 63 74 2e 65 54 6e 63 74 54 79 70 65 20 3d  inct.eTnctType =
24e10 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e   pWInfo->eDistin
24e20 63 74 3b 0a 20 20 20 20 69 66 28 20 70 4f 72 64  ct;.    if( pOrd
24e30 65 72 42 79 20 26 26 20 70 57 49 6e 66 6f 2d 3e  erBy && pWInfo->
24e40 6e 4f 42 53 61 74 3d 3d 70 4f 72 64 65 72 42 79  nOBSat==pOrderBy
24e50 2d 3e 6e 45 78 70 72 20 29 20 70 4f 72 64 65 72  ->nExpr ) pOrder
24e60 42 79 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20  By = 0;..    /* 
24e70 49 66 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78  If sorting index
24e80 20 74 68 61 74 20 77 61 73 20 63 72 65 61 74 65   that was create
24e90 64 20 62 79 20 61 20 70 72 69 6f 72 20 4f 50 5f  d by a prior OP_
24ea0 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 0a 20  OpenEphemeral . 
24eb0 20 20 20 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f     ** instructio
24ec0 6e 20 65 6e 64 65 64 20 75 70 20 6e 6f 74 20 62  n ended up not b
24ed0 65 69 6e 67 20 6e 65 65 64 65 64 2c 20 74 68 65  eing needed, the
24ee0 6e 20 63 68 61 6e 67 65 20 74 68 65 20 4f 50 5f  n change the OP_
24ef0 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 0a 20 20  OpenEphemeral.  
24f00 20 20 2a 2a 20 69 6e 74 6f 20 61 6e 20 4f 50 5f    ** into an OP_
24f10 4e 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  Noop..    */.   
24f20 20 69 66 28 20 61 64 64 72 53 6f 72 74 49 6e 64   if( addrSortInd
24f30 65 78 3e 3d 30 20 26 26 20 70 4f 72 64 65 72 42  ex>=0 && pOrderB
24f40 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  y==0 ){.      sq
24f50 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54  lite3VdbeChangeT
24f60 6f 4e 6f 6f 70 28 76 2c 20 61 64 64 72 53 6f 72  oNoop(v, addrSor
24f70 74 49 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 70  tIndex);.      p
24f80 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 32  ->addrOpenEphm[2
24f90 5d 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 0a 20  ] = -1;.    }.. 
24fa0 20 20 20 2f 2a 20 55 73 65 20 74 68 65 20 73 74     /* Use the st
24fb0 61 6e 64 61 72 64 20 69 6e 6e 65 72 20 6c 6f 6f  andard inner loo
24fc0 70 2e 20 2a 2f 0a 20 20 20 20 73 65 6c 65 63 74  p. */.    select
24fd0 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65  InnerLoop(pParse
24fe0 2c 20 70 2c 20 70 45 4c 69 73 74 2c 20 30 2c 20  , p, pEList, 0, 
24ff0 30 2c 20 70 4f 72 64 65 72 42 79 2c 20 26 73 44  0, pOrderBy, &sD
25000 69 73 74 69 6e 63 74 2c 20 70 44 65 73 74 2c 0a  istinct, pDest,.
25010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25020 20 20 20 20 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e      pWInfo->iCon
25030 74 69 6e 75 65 2c 20 70 57 49 6e 66 6f 2d 3e 69  tinue, pWInfo->i
25040 42 72 65 61 6b 29 3b 0a 0a 20 20 20 20 2f 2a 20  Break);..    /* 
25050 45 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65  End the database
25060 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20   scan loop..    
25070 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 57 68  */.    sqlite3Wh
25080 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a  ereEnd(pWInfo);.
25090 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
250a0 54 68 69 73 20 63 61 73 65 20 77 68 65 6e 20 74  This case when t
250b0 68 65 72 65 20 65 78 69 73 74 20 61 67 67 72 65  here exist aggre
250c0 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 6f  gate functions o
250d0 72 20 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61  r a GROUP BY cla
250e0 75 73 65 0a 20 20 20 20 2a 2a 20 6f 72 20 62 6f  use.    ** or bo
250f0 74 68 20 2a 2f 0a 20 20 20 20 4e 61 6d 65 43 6f  th */.    NameCo
25100 6e 74 65 78 74 20 73 4e 43 3b 20 20 20 20 2f 2a  ntext sNC;    /*
25110 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20 66 6f   Name context fo
25120 72 20 70 72 6f 63 65 73 73 69 6e 67 20 61 67 67  r processing agg
25130 72 65 67 61 74 65 20 69 6e 66 6f 72 6d 61 74 69  regate informati
25140 6f 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 41  on */.    int iA
25150 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  Mem;          /*
25160 20 46 69 72 73 74 20 4d 65 6d 20 61 64 64 72 65   First Mem addre
25170 73 73 20 66 6f 72 20 73 74 6f 72 69 6e 67 20 63  ss for storing c
25180 75 72 72 65 6e 74 20 47 52 4f 55 50 20 42 59 20  urrent GROUP BY 
25190 2a 2f 0a 20 20 20 20 69 6e 74 20 69 42 4d 65 6d  */.    int iBMem
251a0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  ;          /* Fi
251b0 72 73 74 20 4d 65 6d 20 61 64 64 72 65 73 73 20  rst Mem address 
251c0 66 6f 72 20 70 72 65 76 69 6f 75 73 20 47 52 4f  for previous GRO
251d0 55 50 20 42 59 20 2a 2f 0a 20 20 20 20 69 6e 74  UP BY */.    int
251e0 20 69 55 73 65 46 6c 61 67 3b 20 20 20 20 20 20   iUseFlag;      
251f0 20 2f 2a 20 4d 65 6d 20 61 64 64 72 65 73 73 20   /* Mem address 
25200 68 6f 6c 64 69 6e 67 20 66 6c 61 67 20 69 6e 64  holding flag ind
25210 69 63 61 74 69 6e 67 20 74 68 61 74 20 61 74 20  icating that at 
25220 6c 65 61 73 74 0a 20 20 20 20 20 20 20 20 20 20  least.          
25230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
25240 20 6f 6e 65 20 72 6f 77 20 6f 66 20 74 68 65 20   one row of the 
25250 69 6e 70 75 74 20 74 6f 20 74 68 65 20 61 67 67  input to the agg
25260 72 65 67 61 74 6f 72 20 68 61 73 20 62 65 65 6e  regator has been
25270 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
25280 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63           ** proc
25290 65 73 73 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74  essed */.    int
252a0 20 69 41 62 6f 72 74 46 6c 61 67 3b 20 20 20 20   iAbortFlag;    
252b0 20 2f 2a 20 4d 65 6d 20 61 64 64 72 65 73 73 20   /* Mem address 
252c0 77 68 69 63 68 20 63 61 75 73 65 73 20 71 75 65  which causes que
252d0 72 79 20 61 62 6f 72 74 20 69 66 20 70 6f 73 69  ry abort if posi
252e0 74 69 76 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20  tive */.    int 
252f0 67 72 6f 75 70 42 79 53 6f 72 74 3b 20 20 20 20  groupBySort;    
25300 2f 2a 20 52 6f 77 73 20 63 6f 6d 65 20 66 72 6f  /* Rows come fro
25310 6d 20 73 6f 75 72 63 65 20 69 6e 20 47 52 4f 55  m source in GROU
25320 50 20 42 59 20 6f 72 64 65 72 20 2a 2f 0a 20 20  P BY order */.  
25330 20 20 69 6e 74 20 61 64 64 72 45 6e 64 3b 20 20    int addrEnd;  
25340 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20        /* End of 
25350 70 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 74  processing for t
25360 68 69 73 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20  his SELECT */.  
25370 20 20 69 6e 74 20 73 6f 72 74 50 54 61 62 20 3d    int sortPTab =
25380 20 30 3b 20 20 20 2f 2a 20 50 73 65 75 64 6f 74   0;   /* Pseudot
25390 61 62 6c 65 20 75 73 65 64 20 74 6f 20 64 65 63  able used to dec
253a0 6f 64 65 20 73 6f 72 74 69 6e 67 20 72 65 73 75  ode sorting resu
253b0 6c 74 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73  lts */.    int s
253c0 6f 72 74 4f 75 74 20 3d 20 30 3b 20 20 20 20 2f  ortOut = 0;    /
253d0 2a 20 4f 75 74 70 75 74 20 72 65 67 69 73 74 65  * Output registe
253e0 72 20 66 72 6f 6d 20 74 68 65 20 73 6f 72 74 65  r from the sorte
253f0 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 65 6d  r */..    /* Rem
25400 6f 76 65 20 61 6e 79 20 61 6e 64 20 61 6c 6c 20  ove any and all 
25410 61 6c 69 61 73 65 73 20 62 65 74 77 65 65 6e 20  aliases between 
25420 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 61  the result set a
25430 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20 47 52  nd the.    ** GR
25440 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e 0a 20  OUP BY clause.. 
25450 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 47     */.    if( pG
25460 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20  roupBy ){.      
25470 69 6e 74 20 6b 3b 20 20 20 20 20 20 20 20 20 20  int k;          
25480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25490 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
254a0 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78  .      struct Ex
254b0 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
254c0 65 6d 3b 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70  em;  /* For loop
254d0 69 6e 67 20 6f 76 65 72 20 65 78 70 72 65 73 73  ing over express
254e0 69 6f 6e 20 69 6e 20 61 20 6c 69 73 74 20 2a 2f  ion in a list */
254f0 0a 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 70 2d  ..      for(k=p-
25500 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20  >pEList->nExpr, 
25510 70 49 74 65 6d 3d 70 2d 3e 70 45 4c 69 73 74 2d  pItem=p->pEList-
25520 3e 61 3b 20 6b 3e 30 3b 20 6b 2d 2d 2c 20 70 49  >a; k>0; k--, pI
25530 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  tem++){.        
25540 70 49 74 65 6d 2d 3e 69 41 6c 69 61 73 20 3d 20  pItem->iAlias = 
25550 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
25560 20 66 6f 72 28 6b 3d 70 47 72 6f 75 70 42 79 2d   for(k=pGroupBy-
25570 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d 70 47  >nExpr, pItem=pG
25580 72 6f 75 70 42 79 2d 3e 61 3b 20 6b 3e 30 3b 20  roupBy->a; k>0; 
25590 6b 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  k--, pItem++){. 
255a0 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 41         pItem->iA
255b0 6c 69 61 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  lias = 0;.      
255c0 7d 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e  }.      if( p->n
255d0 53 65 6c 65 63 74 52 6f 77 3e 28 64 6f 75 62 6c  SelectRow>(doubl
255e0 65 29 31 30 30 20 29 20 70 2d 3e 6e 53 65 6c 65  e)100 ) p->nSele
255f0 63 74 52 6f 77 20 3d 20 28 64 6f 75 62 6c 65 29  ctRow = (double)
25600 31 30 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  100;.    }else{.
25610 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74        p->nSelect
25620 52 6f 77 20 3d 20 28 64 6f 75 62 6c 65 29 31 3b  Row = (double)1;
25630 0a 20 20 20 20 7d 0a 0a 20 0a 20 20 20 20 2f 2a  .    }.. .    /*
25640 20 43 72 65 61 74 65 20 61 20 6c 61 62 65 6c 20   Create a label 
25650 74 6f 20 6a 75 6d 70 20 74 6f 20 77 68 65 6e 20  to jump to when 
25660 77 65 20 77 61 6e 74 20 74 6f 20 61 62 6f 72 74  we want to abort
25670 20 74 68 65 20 71 75 65 72 79 20 2a 2f 0a 20 20   the query */.  
25680 20 20 61 64 64 72 45 6e 64 20 3d 20 73 71 6c 69    addrEnd = sqli
25690 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
256a0 28 76 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e  (v);..    /* Con
256b0 76 65 72 74 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6e  vert TK_COLUMN n
256c0 6f 64 65 73 20 69 6e 74 6f 20 54 4b 5f 41 47 47  odes into TK_AGG
256d0 5f 43 4f 4c 55 4d 4e 20 61 6e 64 20 6d 61 6b 65  _COLUMN and make
256e0 20 65 6e 74 72 69 65 73 20 69 6e 0a 20 20 20 20   entries in.    
256f0 2a 2a 20 73 41 67 67 49 6e 66 6f 20 66 6f 72 20  ** sAggInfo for 
25700 61 6c 6c 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54  all TK_AGG_FUNCT
25710 49 4f 4e 20 6e 6f 64 65 73 20 69 6e 20 65 78 70  ION nodes in exp
25720 72 65 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 0a  ressions of the.
25730 20 20 20 20 2a 2a 20 53 45 4c 45 43 54 20 73 74      ** SELECT st
25740 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20 2a 2f 0a  atement..    */.
25750 20 20 20 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c      memset(&sNC,
25760 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29 29   0, sizeof(sNC))
25770 3b 0a 20 20 20 20 73 4e 43 2e 70 50 61 72 73 65  ;.    sNC.pParse
25780 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 20 20 73   = pParse;.    s
25790 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 54  NC.pSrcList = pT
257a0 61 62 4c 69 73 74 3b 0a 20 20 20 20 73 4e 43 2e  abList;.    sNC.
257b0 70 41 67 67 49 6e 66 6f 20 3d 20 26 73 41 67 67  pAggInfo = &sAgg
257c0 49 6e 66 6f 3b 0a 20 20 20 20 73 41 67 67 49 6e  Info;.    sAggIn
257d0 66 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d  fo.nSortingColum
257e0 6e 20 3d 20 70 47 72 6f 75 70 42 79 20 3f 20 70  n = pGroupBy ? p
257f0 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2b 31  GroupBy->nExpr+1
25800 20 3a 20 30 3b 0a 20 20 20 20 73 41 67 67 49 6e   : 0;.    sAggIn
25810 66 6f 2e 70 47 72 6f 75 70 42 79 20 3d 20 70 47  fo.pGroupBy = pG
25820 72 6f 75 70 42 79 3b 0a 20 20 20 20 73 71 6c 69  roupBy;.    sqli
25830 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
25840 67 4c 69 73 74 28 26 73 4e 43 2c 20 70 45 4c 69  gList(&sNC, pELi
25850 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  st);.    sqlite3
25860 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69  ExprAnalyzeAggLi
25870 73 74 28 26 73 4e 43 2c 20 70 4f 72 64 65 72 42  st(&sNC, pOrderB
25880 79 29 3b 0a 20 20 20 20 69 66 28 20 70 48 61 76  y);.    if( pHav
25890 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ing ){.      sql
258a0 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
258b0 67 67 72 65 67 61 74 65 73 28 26 73 4e 43 2c 20  ggregates(&sNC, 
258c0 70 48 61 76 69 6e 67 29 3b 0a 20 20 20 20 7d 0a  pHaving);.    }.
258d0 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6e 41 63      sAggInfo.nAc
258e0 63 75 6d 75 6c 61 74 6f 72 20 3d 20 73 41 67 67  cumulator = sAgg
258f0 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20  Info.nColumn;.  
25900 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67    for(i=0; i<sAg
25910 67 49 6e 66 6f 2e 6e 46 75 6e 63 3b 20 69 2b 2b  gInfo.nFunc; i++
25920 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
25930 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
25940 79 28 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63  y(sAggInfo.aFunc
25950 5b 69 5d 2e 70 45 78 70 72 2c 20 45 50 5f 78 49  [i].pExpr, EP_xI
25960 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20  sSelect) );.    
25970 20 20 73 4e 43 2e 6e 63 46 6c 61 67 73 20 7c 3d    sNC.ncFlags |=
25980 20 4e 43 5f 49 6e 41 67 67 46 75 6e 63 3b 0a 20   NC_InAggFunc;. 
25990 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
259a0 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 26  AnalyzeAggList(&
259b0 73 4e 43 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46  sNC, sAggInfo.aF
259c0 75 6e 63 5b 69 5d 2e 70 45 78 70 72 2d 3e 78 2e  unc[i].pExpr->x.
259d0 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 73 4e  pList);.      sN
259e0 43 2e 6e 63 46 6c 61 67 73 20 26 3d 20 7e 4e 43  C.ncFlags &= ~NC
259f0 5f 49 6e 41 67 67 46 75 6e 63 3b 0a 20 20 20 20  _InAggFunc;.    
25a00 7d 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61  }.    if( db->ma
25a10 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74  llocFailed ) got
25a20 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20  o select_end;.. 
25a30 20 20 20 2f 2a 20 50 72 6f 63 65 73 73 69 6e 67     /* Processing
25a40 20 66 6f 72 20 61 67 67 72 65 67 61 74 65 73 20   for aggregates 
25a50 77 69 74 68 20 47 52 4f 55 50 20 42 59 20 69 73  with GROUP BY is
25a60 20 76 65 72 79 20 64 69 66 66 65 72 65 6e 74 20   very different 
25a70 61 6e 64 0a 20 20 20 20 2a 2a 20 6d 75 63 68 20  and.    ** much 
25a80 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20 74 68 61  more complex tha
25a90 6e 20 61 67 67 72 65 67 61 74 65 73 20 77 69 74  n aggregates wit
25aa0 68 6f 75 74 20 61 20 47 52 4f 55 50 20 42 59 2e  hout a GROUP BY.
25ab0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
25ac0 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20  pGroupBy ){.    
25ad0 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
25ae0 6e 66 6f 3b 20 20 2f 2a 20 4b 65 79 69 6e 67 20  nfo;  /* Keying 
25af0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20  information for 
25b00 74 68 65 20 67 72 6f 75 70 20 62 79 20 63 6c 61  the group by cla
25b10 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  use */.      int
25b20 20 6a 31 3b 20 20 20 20 20 20 20 20 20 20 20 20   j1;            
25b30 20 2f 2a 20 41 2d 76 73 2d 42 20 63 6f 6d 70 61   /* A-vs-B compa
25b40 72 69 73 69 6f 6e 20 6a 75 6d 70 20 2a 2f 0a 20  rision jump */. 
25b50 20 20 20 20 20 69 6e 74 20 61 64 64 72 4f 75 74       int addrOut
25b60 70 75 74 52 6f 77 3b 20 20 2f 2a 20 53 74 61 72  putRow;  /* Star
25b70 74 20 6f 66 20 73 75 62 72 6f 75 74 69 6e 65 20  t of subroutine 
25b80 74 68 61 74 20 6f 75 74 70 75 74 73 20 61 20 72  that outputs a r
25b90 65 73 75 6c 74 20 72 6f 77 20 2a 2f 0a 20 20 20  esult row */.   
25ba0 20 20 20 69 6e 74 20 72 65 67 4f 75 74 70 75 74     int regOutput
25bb0 52 6f 77 3b 20 20 20 2f 2a 20 52 65 74 75 72 6e  Row;   /* Return
25bc0 20 61 64 64 72 65 73 73 20 72 65 67 69 73 74 65   address registe
25bd0 72 20 66 6f 72 20 6f 75 74 70 75 74 20 73 75 62  r for output sub
25be0 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 20 20 20  routine */.     
25bf0 20 69 6e 74 20 61 64 64 72 53 65 74 41 62 6f 72   int addrSetAbor
25c00 74 3b 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20  t;   /* Set the 
25c10 61 62 6f 72 74 20 66 6c 61 67 20 61 6e 64 20 72  abort flag and r
25c20 65 74 75 72 6e 20 2a 2f 0a 20 20 20 20 20 20 69  eturn */.      i
25c30 6e 74 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70  nt addrTopOfLoop
25c40 3b 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65  ;  /* Top of the
25c50 20 69 6e 70 75 74 20 6c 6f 6f 70 20 2a 2f 0a 20   input loop */. 
25c60 20 20 20 20 20 69 6e 74 20 61 64 64 72 53 6f 72       int addrSor
25c70 74 69 6e 67 49 64 78 3b 20 2f 2a 20 54 68 65 20  tingIdx; /* The 
25c80 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
25c90 20 66 6f 72 20 74 68 65 20 73 6f 72 74 69 6e 67   for the sorting
25ca0 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20   index */.      
25cb0 69 6e 74 20 61 64 64 72 52 65 73 65 74 3b 20 20  int addrReset;  
25cc0 20 20 20 20 2f 2a 20 53 75 62 72 6f 75 74 69 6e      /* Subroutin
25cd0 65 20 66 6f 72 20 72 65 73 65 74 74 69 6e 67 20  e for resetting 
25ce0 74 68 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20  the accumulator 
25cf0 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67  */.      int reg
25d00 52 65 73 65 74 3b 20 20 20 20 20 20 20 2f 2a 20  Reset;       /* 
25d10 52 65 74 75 72 6e 20 61 64 64 72 65 73 73 20 72  Return address r
25d20 65 67 69 73 74 65 72 20 66 6f 72 20 72 65 73 65  egister for rese
25d30 74 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  t subroutine */.
25d40 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
25d50 72 65 20 69 73 20 61 20 47 52 4f 55 50 20 42 59  re is a GROUP BY
25d60 20 63 6c 61 75 73 65 20 77 65 20 6d 69 67 68 74   clause we might
25d70 20 6e 65 65 64 20 61 20 73 6f 72 74 69 6e 67 20   need a sorting 
25d80 69 6e 64 65 78 20 74 6f 0a 20 20 20 20 20 20 2a  index to.      *
25d90 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 69 74 2e 20  * implement it. 
25da0 20 41 6c 6c 6f 63 61 74 65 20 74 68 61 74 20 73   Allocate that s
25db0 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 6e 6f 77  orting index now
25dc0 2e 20 20 49 66 20 69 74 20 74 75 72 6e 73 20 6f  .  If it turns o
25dd0 75 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74  ut.      ** that
25de0 20 77 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20   we do not need 
25df0 69 74 20 61 66 74 65 72 20 61 6c 6c 2c 20 74 68  it after all, th
25e00 65 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e 20  e OP_SorterOpen 
25e10 69 6e 73 74 72 75 63 74 69 6f 6e 0a 20 20 20 20  instruction.    
25e20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 63 6f 6e    ** will be con
25e30 76 65 72 74 65 64 20 69 6e 74 6f 20 61 20 4e 6f  verted into a No
25e40 6f 70 2e 20 20 0a 20 20 20 20 20 20 2a 2f 0a 20  op.  .      */. 
25e50 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 73 6f       sAggInfo.so
25e60 72 74 69 6e 67 49 64 78 20 3d 20 70 50 61 72 73  rtingIdx = pPars
25e70 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20  e->nTab++;.     
25e80 20 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49   pKeyInfo = keyI
25e90 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28  nfoFromExprList(
25ea0 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79  pParse, pGroupBy
25eb0 29 3b 0a 20 20 20 20 20 20 61 64 64 72 53 6f 72  );.      addrSor
25ec0 74 69 6e 67 49 64 78 20 3d 20 73 71 6c 69 74 65  tingIdx = sqlite
25ed0 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
25ee0 50 5f 53 6f 72 74 65 72 4f 70 65 6e 2c 20 0a 20  P_SorterOpen, . 
25ef0 20 20 20 20 20 20 20 20 20 73 41 67 67 49 6e 66           sAggInf
25f00 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 73 41  o.sortingIdx, sA
25f10 67 67 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67 43  ggInfo.nSortingC
25f20 6f 6c 75 6d 6e 2c 20 0a 20 20 20 20 20 20 20 20  olumn, .        
25f30 20 20 30 2c 20 28 63 68 61 72 2a 29 70 4b 65 79    0, (char*)pKey
25f40 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  Info, P4_KEYINFO
25f50 5f 48 41 4e 44 4f 46 46 29 3b 0a 0a 20 20 20 20  _HANDOFF);..    
25f60 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
25f70 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 73  memory locations
25f80 20 75 73 65 64 20 62 79 20 47 52 4f 55 50 20 42   used by GROUP B
25f90 59 20 61 67 67 72 65 67 61 74 65 20 70 72 6f 63  Y aggregate proc
25fa0 65 73 73 69 6e 67 0a 20 20 20 20 20 20 2a 2f 0a  essing.      */.
25fb0 20 20 20 20 20 20 69 55 73 65 46 6c 61 67 20 3d        iUseFlag =
25fc0 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
25fd0 0a 20 20 20 20 20 20 69 41 62 6f 72 74 46 6c 61  .      iAbortFla
25fe0 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  g = ++pParse->nM
25ff0 65 6d 3b 0a 20 20 20 20 20 20 72 65 67 4f 75 74  em;.      regOut
26000 70 75 74 52 6f 77 20 3d 20 2b 2b 70 50 61 72 73  putRow = ++pPars
26010 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 61  e->nMem;.      a
26020 64 64 72 4f 75 74 70 75 74 52 6f 77 20 3d 20 73  ddrOutputRow = s
26030 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
26040 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 72 65  bel(v);.      re
26050 67 52 65 73 65 74 20 3d 20 2b 2b 70 50 61 72 73  gReset = ++pPars
26060 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 61  e->nMem;.      a
26070 64 64 72 52 65 73 65 74 20 3d 20 73 71 6c 69 74  ddrReset = sqlit
26080 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
26090 76 29 3b 0a 20 20 20 20 20 20 69 41 4d 65 6d 20  v);.      iAMem 
260a0 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b  = pParse->nMem +
260b0 20 31 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65   1;.      pParse
260c0 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f 75 70  ->nMem += pGroup
260d0 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20  By->nExpr;.     
260e0 20 69 42 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d   iBMem = pParse-
260f0 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 20 20 20  >nMem + 1;.     
26100 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
26110 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72   pGroupBy->nExpr
26120 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
26130 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
26140 49 6e 74 65 67 65 72 2c 20 30 2c 20 69 41 62 6f  Integer, 0, iAbo
26150 72 74 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56  rtFlag);.      V
26160 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
26170 63 6c 65 61 72 20 61 62 6f 72 74 20 66 6c 61 67  clear abort flag
26180 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  "));.      sqlit
26190 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
261a0 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 69  OP_Integer, 0, i
261b0 55 73 65 46 6c 61 67 29 3b 0a 20 20 20 20 20 20  UseFlag);.      
261c0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
261d0 22 69 6e 64 69 63 61 74 65 20 61 63 63 75 6d 75  "indicate accumu
261e0 6c 61 74 6f 72 20 65 6d 70 74 79 22 29 29 3b 0a  lator empty"));.
261f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
26200 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 75  eAddOp3(v, OP_Nu
26210 6c 6c 2c 20 30 2c 20 69 41 4d 65 6d 2c 20 69 41  ll, 0, iAMem, iA
26220 4d 65 6d 2b 70 47 72 6f 75 70 42 79 2d 3e 6e 45  Mem+pGroupBy->nE
26230 78 70 72 2d 31 29 3b 0a 0a 20 20 20 20 20 20 2f  xpr-1);..      /
26240 2a 20 42 65 67 69 6e 20 61 20 6c 6f 6f 70 20 74  * Begin a loop t
26250 68 61 74 20 77 69 6c 6c 20 65 78 74 72 61 63 74  hat will extract
26260 20 61 6c 6c 20 73 6f 75 72 63 65 20 72 6f 77 73   all source rows
26270 20 69 6e 20 47 52 4f 55 50 20 42 59 20 6f 72 64   in GROUP BY ord
26280 65 72 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 69  er..      ** Thi
26290 73 20 6d 69 67 68 74 20 69 6e 76 6f 6c 76 65 20  s might involve 
262a0 74 77 6f 20 73 65 70 61 72 61 74 65 20 6c 6f 6f  two separate loo
262b0 70 73 20 77 69 74 68 20 61 6e 20 4f 50 5f 53 6f  ps with an OP_So
262c0 72 74 20 69 6e 20 62 65 74 77 65 65 6e 2c 20 6f  rt in between, o
262d0 72 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 6d 69  r.      ** it mi
262e0 67 68 74 20 62 65 20 61 20 73 69 6e 67 6c 65 20  ght be a single 
262f0 6c 6f 6f 70 20 74 68 61 74 20 75 73 65 73 20 61  loop that uses a
26300 6e 20 69 6e 64 65 78 20 74 6f 20 65 78 74 72 61  n index to extra
26310 63 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 20  ct information. 
26320 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 72       ** in the r
26330 69 67 68 74 20 6f 72 64 65 72 20 74 6f 20 62 65  ight order to be
26340 67 69 6e 20 77 69 74 68 2e 0a 20 20 20 20 20 20  gin with..      
26350 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
26360 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
26370 5f 47 6f 73 75 62 2c 20 72 65 67 52 65 73 65 74  _Gosub, regReset
26380 2c 20 61 64 64 72 52 65 73 65 74 29 3b 0a 20 20  , addrReset);.  
26390 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c      pWInfo = sql
263a0 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 70  ite3WhereBegin(p
263b0 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c  Parse, pTabList,
263c0 20 70 57 68 65 72 65 2c 20 70 47 72 6f 75 70 42   pWhere, pGroupB
263d0 79 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  y, 0, 0, 0);.   
263e0 20 20 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30     if( pWInfo==0
263f0 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65   ) goto select_e
26400 6e 64 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57  nd;.      if( pW
26410 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 3d 3d 70 47  Info->nOBSat==pG
26420 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 20 29 7b  roupBy->nExpr ){
26430 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
26440 6f 70 74 69 6d 69 7a 65 72 20 69 73 20 61 62 6c  optimizer is abl
26450 65 20 74 6f 20 64 65 6c 69 76 65 72 20 72 6f 77  e to deliver row
26460 73 20 69 6e 20 67 72 6f 75 70 20 62 79 20 6f 72  s in group by or
26470 64 65 72 20 73 6f 0a 20 20 20 20 20 20 20 20 2a  der so.        *
26480 2a 20 77 65 20 64 6f 20 6e 6f 74 20 68 61 76 65  * we do not have
26490 20 74 6f 20 73 6f 72 74 2e 20 20 54 68 65 20 4f   to sort.  The O
264a0 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20  P_OpenEphemeral 
264b0 74 61 62 6c 65 20 77 69 6c 6c 20 62 65 0a 20 20  table will be.  
264c0 20 20 20 20 20 20 2a 2a 20 63 61 6e 63 65 6c 6c        ** cancell
264d0 65 64 20 6c 61 74 65 72 20 62 65 63 61 75 73 65  ed later because
264e0 20 77 65 20 73 74 69 6c 6c 20 6e 65 65 64 20 74   we still need t
264f0 6f 20 75 73 65 20 74 68 65 20 70 4b 65 79 49 6e  o use the pKeyIn
26500 66 6f 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  fo.        */.  
26510 20 20 20 20 20 20 67 72 6f 75 70 42 79 53 6f 72        groupBySor
26520 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c  t = 0;.      }el
26530 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 52  se{.        /* R
26540 6f 77 73 20 61 72 65 20 63 6f 6d 69 6e 67 20 6f  ows are coming o
26550 75 74 20 69 6e 20 75 6e 64 65 74 65 72 6d 69 6e  ut in undetermin
26560 65 64 20 6f 72 64 65 72 2e 20 20 57 65 20 68 61  ed order.  We ha
26570 76 65 20 74 6f 20 70 75 73 68 0a 20 20 20 20 20  ve to push.     
26580 20 20 20 2a 2a 20 65 61 63 68 20 72 6f 77 20 69     ** each row i
26590 6e 74 6f 20 61 20 73 6f 72 74 69 6e 67 20 69 6e  nto a sorting in
265a0 64 65 78 2c 20 74 65 72 6d 69 6e 61 74 65 20 74  dex, terminate t
265b0 68 65 20 66 69 72 73 74 20 6c 6f 6f 70 2c 0a 20  he first loop,. 
265c0 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 6c         ** then l
265d0 6f 6f 70 20 6f 76 65 72 20 74 68 65 20 73 6f 72  oop over the sor
265e0 74 69 6e 67 20 69 6e 64 65 78 20 69 6e 20 6f 72  ting index in or
265f0 64 65 72 20 74 6f 20 67 65 74 20 74 68 65 20 6f  der to get the o
26600 75 74 70 75 74 0a 20 20 20 20 20 20 20 20 2a 2a  utput.        **
26610 20 69 6e 20 73 6f 72 74 65 64 20 6f 72 64 65 72   in sorted order
26620 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
26630 20 20 20 20 69 6e 74 20 72 65 67 42 61 73 65 3b      int regBase;
26640 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 65 67  .        int reg
26650 52 65 63 6f 72 64 3b 0a 20 20 20 20 20 20 20 20  Record;.        
26660 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 20 20 20 20  int nCol;.      
26670 20 20 69 6e 74 20 6e 47 72 6f 75 70 42 79 3b 0a    int nGroupBy;.
26680 0a 20 20 20 20 20 20 20 20 65 78 70 6c 61 69 6e  .        explain
26690 54 65 6d 70 54 61 62 6c 65 28 70 50 61 72 73 65  TempTable(pParse
266a0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 28  , .            (
266b0 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74  sDistinct.isTnct
266c0 20 26 26 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73   && (p->selFlags
266d0 26 53 46 5f 44 69 73 74 69 6e 63 74 29 3d 3d 30  &SF_Distinct)==0
266e0 29 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) ?.            
266f0 20 20 20 20 20 20 20 20 22 44 49 53 54 49 4e 43          "DISTINC
26700 54 22 20 3a 20 22 47 52 4f 55 50 20 42 59 22 29  T" : "GROUP BY")
26710 3b 0a 0a 20 20 20 20 20 20 20 20 67 72 6f 75 70  ;..        group
26720 42 79 53 6f 72 74 20 3d 20 31 3b 0a 20 20 20 20  BySort = 1;.    
26730 20 20 20 20 6e 47 72 6f 75 70 42 79 20 3d 20 70      nGroupBy = p
26740 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a  GroupBy->nExpr;.
26750 20 20 20 20 20 20 20 20 6e 43 6f 6c 20 3d 20 6e          nCol = n
26760 47 72 6f 75 70 42 79 20 2b 20 31 3b 0a 20 20 20  GroupBy + 1;.   
26770 20 20 20 20 20 6a 20 3d 20 6e 47 72 6f 75 70 42       j = nGroupB
26780 79 2b 31 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  y+1;.        for
26790 28 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f  (i=0; i<sAggInfo
267a0 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a  .nColumn; i++){.
267b0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 41            if( sA
267c0 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69 5d 2e 69  ggInfo.aCol[i].i
267d0 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3e 3d 6a 20  SorterColumn>=j 
267e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e  ){.            n
267f0 43 6f 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  Col++;.         
26800 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 20 20     j++;.        
26810 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
26820 20 20 20 20 20 20 72 65 67 42 61 73 65 20 3d 20        regBase = 
26830 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61  sqlite3GetTempRa
26840 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 43 6f 6c  nge(pParse, nCol
26850 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
26860 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72  e3ExprCacheClear
26870 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
26880 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
26890 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  eExprList(pParse
268a0 2c 20 70 47 72 6f 75 70 42 79 2c 20 72 65 67 42  , pGroupBy, regB
268b0 61 73 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ase, 0);.       
268c0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
268d0 70 32 28 76 2c 20 4f 50 5f 53 65 71 75 65 6e 63  p2(v, OP_Sequenc
268e0 65 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74  e, sAggInfo.sort
268f0 69 6e 67 49 64 78 2c 72 65 67 42 61 73 65 2b 6e  ingIdx,regBase+n
26900 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 20 20  GroupBy);.      
26910 20 20 6a 20 3d 20 6e 47 72 6f 75 70 42 79 2b 31    j = nGroupBy+1
26920 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
26930 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 43  0; i<sAggInfo.nC
26940 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  olumn; i++){.   
26950 20 20 20 20 20 20 20 73 74 72 75 63 74 20 41 67         struct Ag
26960 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20  gInfo_col *pCol 
26970 3d 20 26 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c  = &sAggInfo.aCol
26980 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69  [i];.          i
26990 66 28 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72  f( pCol->iSorter
269a0 43 6f 6c 75 6d 6e 3e 3d 6a 20 29 7b 0a 20 20 20  Column>=j ){.   
269b0 20 20 20 20 20 20 20 20 20 69 6e 74 20 72 31 20           int r1 
269c0 3d 20 6a 20 2b 20 72 65 67 42 61 73 65 3b 0a 20  = j + regBase;. 
269d0 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 72             int r
269e0 32 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20  2;..            
269f0 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r2 = sqlite3Expr
26a00 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28 70 50  CodeGetColumn(pP
26a10 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20  arse, .         
26a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26a30 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 54 61 62        pCol->pTab
26a40 2c 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 2c  , pCol->iColumn,
26a50 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 2c 20 72   pCol->iTable, r
26a60 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  1, 0);.         
26a70 20 20 20 69 66 28 20 72 31 21 3d 72 32 20 29 7b     if( r1!=r2 ){
26a80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
26a90 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
26aa0 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 72 32  (v, OP_SCopy, r2
26ab0 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 20  , r1);.         
26ac0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
26ad0 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20   j++;.          
26ae0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
26af0 20 20 20 20 72 65 67 52 65 63 6f 72 64 20 3d 20      regRecord = 
26b00 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
26b10 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
26b20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
26b30 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp3(v, OP_MakeR
26b40 65 63 6f 72 64 2c 20 72 65 67 42 61 73 65 2c 20  ecord, regBase, 
26b50 6e 43 6f 6c 2c 20 72 65 67 52 65 63 6f 72 64 29  nCol, regRecord)
26b60 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
26b70 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
26b80 50 5f 53 6f 72 74 65 72 49 6e 73 65 72 74 2c 20  P_SorterInsert, 
26b90 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67  sAggInfo.sorting
26ba0 49 64 78 2c 20 72 65 67 52 65 63 6f 72 64 29 3b  Idx, regRecord);
26bb0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
26bc0 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
26bd0 50 61 72 73 65 2c 20 72 65 67 52 65 63 6f 72 64  Parse, regRecord
26be0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
26bf0 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e  e3ReleaseTempRan
26c00 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 42 61  ge(pParse, regBa
26c10 73 65 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20  se, nCol);.     
26c20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45     sqlite3WhereE
26c30 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20  nd(pWInfo);.    
26c40 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72      sAggInfo.sor
26c50 74 69 6e 67 49 64 78 50 54 61 62 20 3d 20 73 6f  tingIdxPTab = so
26c60 72 74 50 54 61 62 20 3d 20 70 50 61 72 73 65 2d  rtPTab = pParse-
26c70 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20  >nTab++;.       
26c80 20 73 6f 72 74 4f 75 74 20 3d 20 73 71 6c 69 74   sortOut = sqlit
26c90 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
26ca0 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71  rse);.        sq
26cb0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
26cc0 76 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f  v, OP_OpenPseudo
26cd0 2c 20 73 6f 72 74 50 54 61 62 2c 20 73 6f 72 74  , sortPTab, sort
26ce0 4f 75 74 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20  Out, nCol);.    
26cf0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
26d00 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74  ddOp2(v, OP_Sort
26d10 65 72 53 6f 72 74 2c 20 73 41 67 67 49 6e 66 6f  erSort, sAggInfo
26d20 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 61 64 64  .sortingIdx, add
26d30 72 45 6e 64 29 3b 0a 20 20 20 20 20 20 20 20 56  rEnd);.        V
26d40 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
26d50 47 52 4f 55 50 20 42 59 20 73 6f 72 74 22 29 29  GROUP BY sort"))
26d60 3b 0a 20 20 20 20 20 20 20 20 73 41 67 67 49 6e  ;.        sAggIn
26d70 66 6f 2e 75 73 65 53 6f 72 74 69 6e 67 49 64 78  fo.useSortingIdx
26d80 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 73 71   = 1;.        sq
26d90 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c  lite3ExprCacheCl
26da0 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 20  ear(pParse);.   
26db0 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 45     }..      /* E
26dc0 76 61 6c 75 61 74 65 20 74 68 65 20 63 75 72 72  valuate the curr
26dd0 65 6e 74 20 47 52 4f 55 50 20 42 59 20 74 65 72  ent GROUP BY ter
26de0 6d 73 20 61 6e 64 20 73 74 6f 72 65 20 69 6e 20  ms and store in 
26df0 62 30 2c 20 62 31 2c 20 62 32 2e 2e 2e 0a 20 20  b0, b1, b2....  
26e00 20 20 20 20 2a 2a 20 28 62 30 20 69 73 20 6d 65      ** (b0 is me
26e10 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20 69 42  mory location iB
26e20 4d 65 6d 2b 30 2c 20 62 31 20 69 73 20 69 42 4d  Mem+0, b1 is iBM
26e30 65 6d 2b 31 2c 20 61 6e 64 20 73 6f 20 66 6f 72  em+1, and so for
26e40 74 68 29 0a 20 20 20 20 20 20 2a 2a 20 54 68 65  th).      ** The
26e50 6e 20 63 6f 6d 70 61 72 65 20 74 68 65 20 63 75  n compare the cu
26e60 72 72 65 6e 74 20 47 52 4f 55 50 20 42 59 20 74  rrent GROUP BY t
26e70 65 72 6d 73 20 61 67 61 69 6e 73 74 20 74 68 65  erms against the
26e80 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d 73 0a   GROUP BY terms.
26e90 20 20 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68        ** from th
26ea0 65 20 70 72 65 76 69 6f 75 73 20 72 6f 77 20 63  e previous row c
26eb0 75 72 72 65 6e 74 6c 79 20 73 74 6f 72 65 64 20  urrently stored 
26ec0 69 6e 20 61 30 2c 20 61 31 2c 20 61 32 2e 2e 2e  in a0, a1, a2...
26ed0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
26ee0 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 20 3d 20  addrTopOfLoop = 
26ef0 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
26f00 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20  ntAddr(v);.     
26f10 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
26f20 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a  eClear(pParse);.
26f30 20 20 20 20 20 20 69 66 28 20 67 72 6f 75 70 42        if( groupB
26f40 79 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20  ySort ){.       
26f50 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
26f60 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 44  p2(v, OP_SorterD
26f70 61 74 61 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f  ata, sAggInfo.so
26f80 72 74 69 6e 67 49 64 78 2c 20 73 6f 72 74 4f 75  rtingIdx, sortOu
26f90 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
26fa0 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 47 72    for(j=0; j<pGr
26fb0 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20 6a 2b  oupBy->nExpr; j+
26fc0 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
26fd0 67 72 6f 75 70 42 79 53 6f 72 74 20 29 7b 0a 20  groupBySort ){. 
26fe0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
26ff0 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
27000 5f 43 6f 6c 75 6d 6e 2c 20 73 6f 72 74 50 54 61  _Column, sortPTa
27010 62 2c 20 6a 2c 20 69 42 4d 65 6d 2b 6a 29 3b 0a  b, j, iBMem+j);.
27020 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6a 3d            if( j=
27030 3d 30 20 29 20 73 71 6c 69 74 65 33 56 64 62 65  =0 ) sqlite3Vdbe
27040 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
27050 41 47 5f 43 4c 45 41 52 43 41 43 48 45 29 3b 0a  AG_CLEARCACHE);.
27060 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
27070 20 20 20 20 20 20 20 20 20 73 41 67 67 49 6e 66           sAggInf
27080 6f 2e 64 69 72 65 63 74 4d 6f 64 65 20 3d 20 31  o.directMode = 1
27090 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
270a0 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
270b0 73 65 2c 20 70 47 72 6f 75 70 42 79 2d 3e 61 5b  se, pGroupBy->a[
270c0 6a 5d 2e 70 45 78 70 72 2c 20 69 42 4d 65 6d 2b  j].pExpr, iBMem+
270d0 6a 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  j);.        }.  
270e0 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
270f0 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
27100 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 69 41 4d   OP_Compare, iAM
27110 65 6d 2c 20 69 42 4d 65 6d 2c 20 70 47 72 6f 75  em, iBMem, pGrou
27120 70 42 79 2d 3e 6e 45 78 70 72 2c 0a 20 20 20 20  pBy->nExpr,.    
27130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27140 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65        (char*)pKe
27150 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46  yInfo, P4_KEYINF
27160 4f 29 3b 0a 20 20 20 20 20 20 6a 31 20 3d 20 73  O);.      j1 = s
27170 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
27180 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20  tAddr(v);.      
27190 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
271a0 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 6a 31  3(v, OP_Jump, j1
271b0 2b 31 2c 20 30 2c 20 6a 31 2b 31 29 3b 0a 0a 20  +1, 0, j1+1);.. 
271c0 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
271d0 20 63 6f 64 65 20 74 68 61 74 20 72 75 6e 73 20   code that runs 
271e0 77 68 65 6e 65 76 65 72 20 74 68 65 20 47 52 4f  whenever the GRO
271f0 55 50 20 42 59 20 63 68 61 6e 67 65 73 2e 0a 20  UP BY changes.. 
27200 20 20 20 20 20 2a 2a 20 43 68 61 6e 67 65 73 20       ** Changes 
27210 69 6e 20 74 68 65 20 47 52 4f 55 50 20 42 59 20  in the GROUP BY 
27220 61 72 65 20 64 65 74 65 63 74 65 64 20 62 79 20  are detected by 
27230 74 68 65 20 70 72 65 76 69 6f 75 73 20 63 6f 64  the previous cod
27240 65 0a 20 20 20 20 20 20 2a 2a 20 62 6c 6f 63 6b  e.      ** block
27250 2e 20 20 49 66 20 74 68 65 72 65 20 77 65 72 65  .  If there were
27260 20 6e 6f 20 63 68 61 6e 67 65 73 2c 20 74 68 69   no changes, thi
27270 73 20 62 6c 6f 63 6b 20 69 73 20 73 6b 69 70 70  s block is skipp
27280 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  ed..      **.   
27290 20 20 20 2a 2a 20 54 68 69 73 20 63 6f 64 65 20     ** This code 
272a0 63 6f 70 69 65 73 20 63 75 72 72 65 6e 74 20 67  copies current g
272b0 72 6f 75 70 20 62 79 20 74 65 72 6d 73 20 69 6e  roup by terms in
272c0 20 62 30 2c 62 31 2c 62 32 2c 2e 2e 2e 0a 20 20   b0,b1,b2,....  
272d0 20 20 20 20 2a 2a 20 6f 76 65 72 20 74 6f 20 61      ** over to a
272e0 30 2c 61 31 2c 61 32 2e 20 20 49 74 20 74 68 65  0,a1,a2.  It the
272f0 6e 20 63 61 6c 6c 73 20 74 68 65 20 6f 75 74 70  n calls the outp
27300 75 74 20 73 75 62 72 6f 75 74 69 6e 65 0a 20 20  ut subroutine.  
27310 20 20 20 20 2a 2a 20 61 6e 64 20 72 65 73 65 74      ** and reset
27320 73 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20  s the aggregate 
27330 61 63 63 75 6d 75 6c 61 74 6f 72 20 72 65 67 69  accumulator regi
27340 73 74 65 72 73 20 69 6e 20 70 72 65 70 61 72 61  sters in prepara
27350 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 66 6f  tion.      ** fo
27360 72 20 74 68 65 20 6e 65 78 74 20 47 52 4f 55 50  r the next GROUP
27370 20 42 59 20 62 61 74 63 68 2e 0a 20 20 20 20 20   BY batch..     
27380 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
27390 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50  3ExprCodeMove(pP
273a0 61 72 73 65 2c 20 69 42 4d 65 6d 2c 20 69 41 4d  arse, iBMem, iAM
273b0 65 6d 2c 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45  em, pGroupBy->nE
273c0 78 70 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  xpr);.      sqli
273d0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
273e0 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75   OP_Gosub, regOu
273f0 74 70 75 74 52 6f 77 2c 20 61 64 64 72 4f 75 74  tputRow, addrOut
27400 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 56  putRow);.      V
27410 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
27420 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f 77 22 29  output one row")
27430 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
27440 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
27450 5f 49 66 50 6f 73 2c 20 69 41 62 6f 72 74 46 6c  _IfPos, iAbortFl
27460 61 67 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20 20  ag, addrEnd);.  
27470 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
27480 28 76 2c 20 22 63 68 65 63 6b 20 61 62 6f 72 74  (v, "check abort
27490 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20 20 20   flag"));.      
274a0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
274b0 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72  2(v, OP_Gosub, r
274c0 65 67 52 65 73 65 74 2c 20 61 64 64 72 52 65 73  egReset, addrRes
274d0 65 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  et);.      VdbeC
274e0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72 65 73 65  omment((v, "rese
274f0 74 20 61 63 63 75 6d 75 6c 61 74 6f 72 22 29 29  t accumulator"))
27500 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 55 70 64 61  ;..      /* Upda
27510 74 65 20 74 68 65 20 61 67 67 72 65 67 61 74 65  te the aggregate
27520 20 61 63 63 75 6d 75 6c 61 74 6f 72 73 20 62 61   accumulators ba
27530 73 65 64 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65  sed on the conte
27540 6e 74 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74  nt of.      ** t
27550 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 0a 20  he current row. 
27560 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
27570 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
27580 65 28 76 2c 20 6a 31 29 3b 0a 20 20 20 20 20 20  e(v, j1);.      
27590 75 70 64 61 74 65 41 63 63 75 6d 75 6c 61 74 6f  updateAccumulato
275a0 72 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49  r(pParse, &sAggI
275b0 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  nfo);.      sqli
275c0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
275d0 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20   OP_Integer, 1, 
275e0 69 55 73 65 46 6c 61 67 29 3b 0a 20 20 20 20 20  iUseFlag);.     
275f0 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
27600 20 22 69 6e 64 69 63 61 74 65 20 64 61 74 61 20   "indicate data 
27610 69 6e 20 61 63 63 75 6d 75 6c 61 74 6f 72 22 29  in accumulator")
27620 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 45 6e 64  );..      /* End
27630 20 6f 66 20 74 68 65 20 6c 6f 6f 70 0a 20 20 20   of the loop.   
27640 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
27650 67 72 6f 75 70 42 79 53 6f 72 74 20 29 7b 0a 20  groupBySort ){. 
27660 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
27670 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
27680 6f 72 74 65 72 4e 65 78 74 2c 20 73 41 67 67 49  orterNext, sAggI
27690 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20  nfo.sortingIdx, 
276a0 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 29 3b 0a  addrTopOfLoop);.
276b0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
276c0 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72       sqlite3Wher
276d0 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20  eEnd(pWInfo);.  
276e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
276f0 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c  eChangeToNoop(v,
27700 20 61 64 64 72 53 6f 72 74 69 6e 67 49 64 78 29   addrSortingIdx)
27710 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
27720 20 2f 2a 20 4f 75 74 70 75 74 20 74 68 65 20 66   /* Output the f
27730 69 6e 61 6c 20 72 6f 77 20 6f 66 20 72 65 73 75  inal row of resu
27740 6c 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  lt.      */.    
27750 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
27760 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
27770 20 72 65 67 4f 75 74 70 75 74 52 6f 77 2c 20 61   regOutputRow, a
27780 64 64 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20  ddrOutputRow);. 
27790 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
277a0 28 28 76 2c 20 22 6f 75 74 70 75 74 20 66 69 6e  ((v, "output fin
277b0 61 6c 20 72 6f 77 22 29 29 3b 0a 0a 20 20 20 20  al row"));..    
277c0 20 20 2f 2a 20 4a 75 6d 70 20 6f 76 65 72 20 74    /* Jump over t
277d0 68 65 20 73 75 62 72 6f 75 74 69 6e 65 73 0a 20  he subroutines. 
277e0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
277f0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
27800 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61  v, OP_Goto, 0, a
27810 64 64 72 45 6e 64 29 3b 0a 0a 20 20 20 20 20 20  ddrEnd);..      
27820 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75  /* Generate a su
27830 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75  broutine that ou
27840 74 70 75 74 73 20 61 20 73 69 6e 67 6c 65 20 72  tputs a single r
27850 6f 77 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74  ow of the result
27860 0a 20 20 20 20 20 20 2a 2a 20 73 65 74 2e 20 20  .      ** set.  
27870 54 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65 20  This subroutine 
27880 66 69 72 73 74 20 6c 6f 6f 6b 73 20 61 74 20 74  first looks at t
27890 68 65 20 69 55 73 65 46 6c 61 67 2e 20 20 49 66  he iUseFlag.  If
278a0 20 69 55 73 65 46 6c 61 67 0a 20 20 20 20 20 20   iUseFlag.      
278b0 2a 2a 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  ** is less than 
278c0 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f  or equal to zero
278d0 2c 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65  , the subroutine
278e0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 49 66   is a no-op.  If
278f0 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70 72  .      ** the pr
27900 6f 63 65 73 73 69 6e 67 20 63 61 6c 6c 73 20 66  ocessing calls f
27910 6f 72 20 74 68 65 20 71 75 65 72 79 20 74 6f 20  or the query to 
27920 61 62 6f 72 74 2c 20 74 68 69 73 20 73 75 62 72  abort, this subr
27930 6f 75 74 69 6e 65 0a 20 20 20 20 20 20 2a 2a 20  outine.      ** 
27940 69 6e 63 72 65 6d 65 6e 74 73 20 74 68 65 20 69  increments the i
27950 41 62 6f 72 74 46 6c 61 67 20 6d 65 6d 6f 72 79  AbortFlag memory
27960 20 6c 6f 63 61 74 69 6f 6e 20 62 65 66 6f 72 65   location before
27970 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 0a 20 20   returning in.  
27980 20 20 20 20 2a 2a 20 6f 72 64 65 72 20 74 6f 20      ** order to 
27990 73 69 67 6e 61 6c 20 74 68 65 20 63 61 6c 6c 65  signal the calle
279a0 72 20 74 6f 20 61 62 6f 72 74 2e 0a 20 20 20 20  r to abort..    
279b0 20 20 2a 2f 0a 20 20 20 20 20 20 61 64 64 72 53    */.      addrS
279c0 65 74 41 62 6f 72 74 20 3d 20 73 71 6c 69 74 65  etAbort = sqlite
279d0 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
279e0 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
279f0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
27a00 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 69  OP_Integer, 1, i
27a10 41 62 6f 72 74 46 6c 61 67 29 3b 0a 20 20 20 20  AbortFlag);.    
27a20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
27a30 2c 20 22 73 65 74 20 61 62 6f 72 74 20 66 6c 61  , "set abort fla
27a40 67 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  g"));.      sqli
27a50 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
27a60 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 4f   OP_Return, regO
27a70 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20  utputRow);.     
27a80 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
27a90 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72  lveLabel(v, addr
27aa0 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20  OutputRow);.    
27ab0 20 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 20    addrOutputRow 
27ac0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
27ad0 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
27ae0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
27af0 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 50 6f 73  dOp2(v, OP_IfPos
27b00 2c 20 69 55 73 65 46 6c 61 67 2c 20 61 64 64 72  , iUseFlag, addr
27b10 4f 75 74 70 75 74 52 6f 77 2b 32 29 3b 0a 20 20  OutputRow+2);.  
27b20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
27b30 28 76 2c 20 22 47 72 6f 75 70 62 79 20 72 65 73  (v, "Groupby res
27b40 75 6c 74 20 67 65 6e 65 72 61 74 6f 72 20 65 6e  ult generator en
27b50 74 72 79 20 70 6f 69 6e 74 22 29 29 3b 0a 20 20  try point"));.  
27b60 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
27b70 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75  ddOp1(v, OP_Retu
27b80 72 6e 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77  rn, regOutputRow
27b90 29 3b 0a 20 20 20 20 20 20 66 69 6e 61 6c 69 7a  );.      finaliz
27ba0 65 41 67 67 46 75 6e 63 74 69 6f 6e 73 28 70 50  eAggFunctions(pP
27bb0 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29  arse, &sAggInfo)
27bc0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
27bd0 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
27be0 65 2c 20 70 48 61 76 69 6e 67 2c 20 61 64 64 72  e, pHaving, addr
27bf0 4f 75 74 70 75 74 52 6f 77 2b 31 2c 20 53 51 4c  OutputRow+1, SQL
27c00 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b  ITE_JUMPIFNULL);
27c10 0a 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e  .      selectInn
27c20 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70  erLoop(pParse, p
27c30 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 30 2c 20  , p->pEList, 0, 
27c40 30 2c 20 70 4f 72 64 65 72 42 79 2c 0a 20 20 20  0, pOrderBy,.   
27c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27c60 20 20 20 26 73 44 69 73 74 69 6e 63 74 2c 20 70     &sDistinct, p
27c70 44 65 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20  Dest,.          
27c80 20 20 20 20 20 20 20 20 20 20 20 20 61 64 64 72              addr
27c90 4f 75 74 70 75 74 52 6f 77 2b 31 2c 20 61 64 64  OutputRow+1, add
27ca0 72 53 65 74 41 62 6f 72 74 29 3b 0a 20 20 20 20  rSetAbort);.    
27cb0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
27cc0 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e  Op1(v, OP_Return
27cd0 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77 29 3b  , regOutputRow);
27ce0 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
27cf0 6e 74 28 28 76 2c 20 22 65 6e 64 20 67 72 6f 75  nt((v, "end grou
27d00 70 62 79 20 72 65 73 75 6c 74 20 67 65 6e 65 72  pby result gener
27d10 61 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20 20  ator"));..      
27d20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75  /* Generate a su
27d30 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 77 69  broutine that wi
27d40 6c 6c 20 72 65 73 65 74 20 74 68 65 20 67 72 6f  ll reset the gro
27d50 75 70 2d 62 79 20 61 63 63 75 6d 75 6c 61 74 6f  up-by accumulato
27d60 72 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  r.      */.     
27d70 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
27d80 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72  lveLabel(v, addr
27d90 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20 72 65  Reset);.      re
27da0 73 65 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 70  setAccumulator(p
27db0 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f  Parse, &sAggInfo
27dc0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
27dd0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
27de0 5f 52 65 74 75 72 6e 2c 20 72 65 67 52 65 73 65  _Return, regRese
27df0 74 29 3b 0a 20 20 20 20 20 0a 20 20 20 20 7d 20  t);.     .    } 
27e00 2f 2a 20 65 6e 64 69 66 20 70 47 72 6f 75 70 42  /* endif pGroupB
27e10 79 2e 20 20 42 65 67 69 6e 20 61 67 67 72 65 67  y.  Begin aggreg
27e20 61 74 65 20 71 75 65 72 69 65 73 20 77 69 74 68  ate queries with
27e30 6f 75 74 20 47 52 4f 55 50 20 42 59 3a 20 2a 2f  out GROUP BY: */
27e40 0a 20 20 20 20 65 6c 73 65 20 7b 0a 20 20 20 20  .    else {.    
27e50 20 20 45 78 70 72 4c 69 73 74 20 2a 70 44 65 6c    ExprList *pDel
27e60 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51   = 0;.#ifndef SQ
27e70 4c 49 54 45 5f 4f 4d 49 54 5f 42 54 52 45 45 43  LITE_OMIT_BTREEC
27e80 4f 55 4e 54 0a 20 20 20 20 20 20 54 61 62 6c 65  OUNT.      Table
27e90 20 2a 70 54 61 62 3b 0a 20 20 20 20 20 20 69 66   *pTab;.      if
27ea0 28 20 28 70 54 61 62 20 3d 20 69 73 53 69 6d 70  ( (pTab = isSimp
27eb0 6c 65 43 6f 75 6e 74 28 70 2c 20 26 73 41 67 67  leCount(p, &sAgg
27ec0 49 6e 66 6f 29 29 21 3d 30 20 29 7b 0a 20 20 20  Info))!=0 ){.   
27ed0 20 20 20 20 20 2f 2a 20 49 66 20 69 73 53 69 6d       /* If isSim
27ee0 70 6c 65 43 6f 75 6e 74 28 29 20 72 65 74 75 72  pleCount() retur
27ef0 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ns a pointer to 
27f00 61 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72  a Table structur
27f10 65 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 20 20  e, then.        
27f20 2a 2a 20 74 68 65 20 53 51 4c 20 73 74 61 74 65  ** the SQL state
27f30 6d 65 6e 74 20 69 73 20 6f 66 20 74 68 65 20 66  ment is of the f
27f40 6f 72 6d 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a  orm:.        **.
27f50 20 20 20 20 20 20 20 20 2a 2a 20 20 20 53 45 4c          **   SEL
27f60 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  ECT count(*) FRO
27f70 4d 20 3c 74 62 6c 3e 0a 20 20 20 20 20 20 20 20  M <tbl>.        
27f80 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 68  **.        ** wh
27f90 65 72 65 20 74 68 65 20 54 61 62 6c 65 20 73 74  ere the Table st
27fa0 72 75 63 74 75 72 65 20 72 65 74 75 72 6e 65 64  ructure returned
27fb0 20 72 65 70 72 65 73 65 6e 74 73 20 74 61 62 6c   represents tabl
27fc0 65 20 3c 74 62 6c 3e 2e 0a 20 20 20 20 20 20 20  e <tbl>..       
27fd0 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54   **.        ** T
27fe0 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 69 73  his statement is
27ff0 20 73 6f 20 63 6f 6d 6d 6f 6e 20 74 68 61 74 20   so common that 
28000 69 74 20 69 73 20 6f 70 74 69 6d 69 7a 65 64 20  it is optimized 
28010 73 70 65 63 69 61 6c 6c 79 2e 20 54 68 65 0a 20  specially. The. 
28020 20 20 20 20 20 20 20 2a 2a 20 4f 50 5f 43 6f 75         ** OP_Cou
28030 6e 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69  nt instruction i
28040 73 20 65 78 65 63 75 74 65 64 20 65 69 74 68 65  s executed eithe
28050 72 20 6f 6e 20 74 68 65 20 69 6e 74 6b 65 79 20  r on the intkey 
28060 74 61 62 6c 65 20 74 68 61 74 0a 20 20 20 20 20  table that.     
28070 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74     ** contains t
28080 68 65 20 64 61 74 61 20 66 6f 72 20 74 61 62 6c  he data for tabl
28090 65 20 3c 74 62 6c 3e 20 6f 72 20 6f 6e 20 6f 6e  e <tbl> or on on
280a0 65 20 6f 66 20 69 74 73 20 69 6e 64 65 78 65 73  e of its indexes
280b0 2e 20 49 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  . It.        ** 
280c0 69 73 20 62 65 74 74 65 72 20 74 6f 20 65 78 65  is better to exe
280d0 63 75 74 65 20 74 68 65 20 6f 70 20 6f 6e 20 61  cute the op on a
280e0 6e 20 69 6e 64 65 78 2c 20 61 73 20 69 6e 64 65  n index, as inde
280f0 78 65 73 20 61 72 65 20 61 6c 6d 6f 73 74 0a 20  xes are almost. 
28100 20 20 20 20 20 20 20 2a 2a 20 61 6c 77 61 79 73         ** always
28110 20 73 70 72 65 61 64 20 61 63 72 6f 73 73 20 6c   spread across l
28120 65 73 73 20 70 61 67 65 73 20 74 68 61 6e 20 74  ess pages than t
28130 68 65 69 72 20 63 6f 72 72 65 73 70 6f 6e 64 69  heir correspondi
28140 6e 67 20 74 61 62 6c 65 73 2e 0a 20 20 20 20 20  ng tables..     
28150 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f     */.        co
28160 6e 73 74 20 69 6e 74 20 69 44 62 20 3d 20 73 71  nst int iDb = sq
28170 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
28180 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  ex(pParse->db, p
28190 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  Tab->pSchema);. 
281a0 20 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74         const int
281b0 20 69 43 73 72 20 3d 20 70 50 61 72 73 65 2d 3e   iCsr = pParse->
281c0 6e 54 61 62 2b 2b 3b 20 20 20 20 20 2f 2a 20 43  nTab++;     /* C
281d0 75 72 73 6f 72 20 74 6f 20 73 63 61 6e 20 62 2d  ursor to scan b-
281e0 74 72 65 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  tree */.        
281f0 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20  Index *pIdx;    
28200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28210 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72       /* Iterator
28220 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20   variable */.   
28230 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b       KeyInfo *pK
28240 65 79 49 6e 66 6f 20 3d 20 30 3b 20 20 20 20 20  eyInfo = 0;     
28250 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4b 65 79            /* Key
28260 69 6e 66 6f 20 66 6f 72 20 73 63 61 6e 6e 65 64  info for scanned
28270 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20   index */.      
28280 20 20 49 6e 64 65 78 20 2a 70 42 65 73 74 20 3d    Index *pBest =
28290 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
282a0 20 20 20 20 20 20 20 2f 2a 20 42 65 73 74 20 69         /* Best i
282b0 6e 64 65 78 20 66 6f 75 6e 64 20 73 6f 20 66 61  ndex found so fa
282c0 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74  r */.        int
282d0 20 69 52 6f 6f 74 20 3d 20 70 54 61 62 2d 3e 74   iRoot = pTab->t
282e0 6e 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  num;            
282f0 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f    /* Root page o
28300 66 20 73 63 61 6e 6e 65 64 20 62 2d 74 72 65 65  f scanned b-tree
28310 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 73 71 6c   */..        sql
28320 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63  ite3CodeVerifySc
28330 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62  hema(pParse, iDb
28340 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
28350 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72  e3TableLock(pPar
28360 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e 74  se, iDb, pTab->t
28370 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e  num, 0, pTab->zN
28380 61 6d 65 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f  ame);..        /
28390 2a 20 53 65 61 72 63 68 20 66 6f 72 20 74 68 65  * Search for the
283a0 20 69 6e 64 65 78 20 74 68 61 74 20 68 61 73 20   index that has 
283b0 74 68 65 20 6c 65 61 73 74 20 61 6d 6f 75 6e 74  the least amount
283c0 20 6f 66 20 63 6f 6c 75 6d 6e 73 2e 20 49 66 0a   of columns. If.
283d0 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 72 65          ** there
283e0 20 69 73 20 73 75 63 68 20 61 6e 20 69 6e 64 65   is such an inde
283f0 78 2c 20 61 6e 64 20 69 74 20 68 61 73 20 6c 65  x, and it has le
28400 73 73 20 63 6f 6c 75 6d 6e 73 20 74 68 61 6e 20  ss columns than 
28410 74 68 65 20 74 61 62 6c 65 0a 20 20 20 20 20 20  the table.      
28420 20 20 2a 2a 20 64 6f 65 73 2c 20 74 68 65 6e 20    ** does, then 
28430 77 65 20 63 61 6e 20 61 73 73 75 6d 65 20 74 68  we can assume th
28440 61 74 20 69 74 20 63 6f 6e 73 75 6d 65 73 20 6c  at it consumes l
28450 65 73 73 20 73 70 61 63 65 20 6f 6e 20 64 69 73  ess space on dis
28460 6b 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a  k and.        **
28470 20 77 69 6c 6c 20 74 68 65 72 65 66 6f 72 65 20   will therefore 
28480 62 65 20 63 68 65 61 70 65 72 20 74 6f 20 73 63  be cheaper to sc
28490 61 6e 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  an to determine 
284a0 74 68 65 20 71 75 65 72 79 20 72 65 73 75 6c 74  the query result
284b0 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 6e 20  ..        ** In 
284c0 74 68 69 73 20 63 61 73 65 20 73 65 74 20 69 52  this case set iR
284d0 6f 6f 74 20 74 6f 20 74 68 65 20 72 6f 6f 74 20  oot to the root 
284e0 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
284f0 68 65 20 69 6e 64 65 78 20 62 2d 74 72 65 65 0a  he index b-tree.
28500 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 70          ** and p
28510 4b 65 79 49 6e 66 6f 20 74 6f 20 74 68 65 20 4b  KeyInfo to the K
28520 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
28530 20 72 65 71 75 69 72 65 64 20 74 6f 20 6e 61 76   required to nav
28540 69 67 61 74 65 20 74 68 65 0a 20 20 20 20 20 20  igate the.      
28550 20 20 2a 2a 20 69 6e 64 65 78 2e 0a 20 20 20 20    ** index..    
28560 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
28570 2a 20 28 32 30 31 31 2d 30 34 2d 31 35 29 20 44  * (2011-04-15) D
28580 6f 20 6e 6f 74 20 64 6f 20 61 20 66 75 6c 6c 20  o not do a full 
28590 73 63 61 6e 20 6f 66 20 61 6e 20 75 6e 6f 72 64  scan of an unord
285a0 65 72 65 64 20 69 6e 64 65 78 2e 0a 20 20 20 20  ered index..    
285b0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
285c0 2a 20 49 6e 20 70 72 61 63 74 69 63 65 20 74 68  * In practice th
285d0 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74  e KeyInfo struct
285e0 75 72 65 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  ure will not be 
285f0 75 73 65 64 2e 20 49 74 20 69 73 20 6f 6e 6c 79  used. It is only
28600 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 73   .        ** pas
28610 73 65 64 20 74 6f 20 6b 65 65 70 20 4f 50 5f 4f  sed to keep OP_O
28620 70 65 6e 52 65 61 64 20 68 61 70 70 79 2e 0a 20  penRead happy.. 
28630 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
28640 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d    for(pIdx=pTab-
28650 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70  >pIndex; pIdx; p
28660 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29  Idx=pIdx->pNext)
28670 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
28680 70 49 64 78 2d 3e 62 55 6e 6f 72 64 65 72 65 64  pIdx->bUnordered
28690 3d 3d 30 20 26 26 20 28 21 70 42 65 73 74 20 7c  ==0 && (!pBest |
286a0 7c 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3c  | pIdx->nColumn<
286b0 70 42 65 73 74 2d 3e 6e 43 6f 6c 75 6d 6e 29 20  pBest->nColumn) 
286c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
286d0 42 65 73 74 20 3d 20 70 49 64 78 3b 0a 20 20 20  Best = pIdx;.   
286e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
286f0 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70   }.        if( p
28700 42 65 73 74 20 26 26 20 70 42 65 73 74 2d 3e 6e  Best && pBest->n
28710 43 6f 6c 75 6d 6e 3c 70 54 61 62 2d 3e 6e 43 6f  Column<pTab->nCo
28720 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  l ){.          i
28730 52 6f 6f 74 20 3d 20 70 42 65 73 74 2d 3e 74 6e  Root = pBest->tn
28740 75 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4b  um;.          pK
28750 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33  eyInfo = sqlite3
28760 49 6e 64 65 78 4b 65 79 69 6e 66 6f 28 70 50 61  IndexKeyinfo(pPa
28770 72 73 65 2c 20 70 42 65 73 74 29 3b 0a 20 20 20  rse, pBest);.   
28780 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
28790 2f 2a 20 4f 70 65 6e 20 61 20 72 65 61 64 2d 6f  /* Open a read-o
287a0 6e 6c 79 20 63 75 72 73 6f 72 2c 20 65 78 65 63  nly cursor, exec
287b0 75 74 65 20 74 68 65 20 4f 50 5f 43 6f 75 6e 74  ute the OP_Count
287c0 2c 20 63 6c 6f 73 65 20 74 68 65 20 63 75 72 73  , close the curs
287d0 6f 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 73  or. */.        s
287e0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
287f0 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c  (v, OP_OpenRead,
28800 20 69 43 73 72 2c 20 69 52 6f 6f 74 2c 20 69 44   iCsr, iRoot, iD
28810 62 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  b);.        if( 
28820 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20  pKeyInfo ){.    
28830 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
28840 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c  eChangeP4(v, -1,
28850 20 28 63 68 61 72 20 2a 29 70 4b 65 79 49 6e 66   (char *)pKeyInf
28860 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41  o, P4_KEYINFO_HA
28870 4e 44 4f 46 46 29 3b 0a 20 20 20 20 20 20 20 20  NDOFF);.        
28880 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
28890 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
288a0 50 5f 43 6f 75 6e 74 2c 20 69 43 73 72 2c 20 73  P_Count, iCsr, s
288b0 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 30 5d  AggInfo.aFunc[0]
288c0 2e 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20 20  .iMem);.        
288d0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
288e0 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69  1(v, OP_Close, i
288f0 43 73 72 29 3b 0a 20 20 20 20 20 20 20 20 65 78  Csr);.        ex
28900 70 6c 61 69 6e 53 69 6d 70 6c 65 43 6f 75 6e 74  plainSimpleCount
28910 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 70  (pParse, pTab, p
28920 42 65 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c  Best);.      }el
28930 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  se.#endif /* SQL
28940 49 54 45 5f 4f 4d 49 54 5f 42 54 52 45 45 43 4f  ITE_OMIT_BTREECO
28950 55 4e 54 20 2a 2f 0a 20 20 20 20 20 20 7b 0a 20  UNT */.      {. 
28960 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20         /* Check 
28970 69 66 20 74 68 65 20 71 75 65 72 79 20 69 73 20  if the query is 
28980 6f 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f  of one of the fo
28990 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d 73 3a 0a 20  llowing forms:. 
289a0 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
289b0 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 6d 69    **   SELECT mi
289c0 6e 28 78 29 20 46 52 4f 4d 20 2e 2e 2e 0a 20 20  n(x) FROM ....  
289d0 20 20 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43        **   SELEC
289e0 54 20 6d 61 78 28 78 29 20 46 52 4f 4d 20 2e 2e  T max(x) FROM ..
289f0 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
28a00 20 20 20 20 20 2a 2a 20 49 66 20 69 74 20 69 73       ** If it is
28a10 2c 20 74 68 65 6e 20 61 73 6b 20 74 68 65 20 63  , then ask the c
28a20 6f 64 65 20 69 6e 20 77 68 65 72 65 2e 63 20 74  ode in where.c t
28a30 6f 20 61 74 74 65 6d 70 74 20 74 6f 20 73 6f 72  o attempt to sor
28a40 74 20 72 65 73 75 6c 74 73 0a 20 20 20 20 20 20  t results.      
28a50 20 20 2a 2a 20 61 73 20 69 66 20 74 68 65 72 65    ** as if there
28a60 20 77 61 73 20 61 6e 20 22 4f 52 44 45 52 20 4f   was an "ORDER O
28a70 4e 20 78 22 20 6f 72 20 22 4f 52 44 45 52 20 4f  N x" or "ORDER O
28a80 4e 20 78 20 44 45 53 43 22 20 63 6c 61 75 73 65  N x DESC" clause
28a90 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 66  . .        ** If
28aa0 20 77 68 65 72 65 2e 63 20 69 73 20 61 62 6c 65   where.c is able
28ab0 20 74 6f 20 70 72 6f 64 75 63 65 20 72 65 73 75   to produce resu
28ac0 6c 74 73 20 73 6f 72 74 65 64 20 69 6e 20 74 68  lts sorted in th
28ad0 69 73 20 6f 72 64 65 72 2c 20 74 68 65 6e 0a 20  is order, then. 
28ae0 20 20 20 20 20 20 20 2a 2a 20 61 64 64 20 76 64         ** add vd
28af0 62 65 20 63 6f 64 65 20 74 6f 20 62 72 65 61 6b  be code to break
28b00 20 6f 75 74 20 6f 66 20 74 68 65 20 70 72 6f 63   out of the proc
28b10 65 73 73 69 6e 67 20 6c 6f 6f 70 20 61 66 74 65  essing loop afte
28b20 72 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a  r the .        *
28b30 2a 20 66 69 72 73 74 20 69 74 65 72 61 74 69 6f  * first iteratio
28b40 6e 20 28 73 69 6e 63 65 20 74 68 65 20 66 69 72  n (since the fir
28b50 73 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20  st iteration of 
28b60 74 68 65 20 6c 6f 6f 70 20 69 73 20 0a 20 20 20  the loop is .   
28b70 20 20 20 20 20 2a 2a 20 67 75 61 72 61 6e 74 65       ** guarante
28b80 65 64 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e  ed to operate on
28b90 20 74 68 65 20 72 6f 77 20 77 69 74 68 20 74 68   the row with th
28ba0 65 20 6d 69 6e 69 6d 75 6d 20 6f 72 20 6d 61 78  e minimum or max
28bb0 69 6d 75 6d 20 0a 20 20 20 20 20 20 20 20 2a 2a  imum .        **
28bc0 20 76 61 6c 75 65 20 6f 66 20 78 2c 20 74 68 65   value of x, the
28bd0 20 6f 6e 6c 79 20 72 6f 77 20 72 65 71 75 69 72   only row requir
28be0 65 64 29 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ed)..        **.
28bf0 20 20 20 20 20 20 20 20 2a 2a 20 41 20 73 70 65          ** A spe
28c00 63 69 61 6c 20 66 6c 61 67 20 6d 75 73 74 20 62  cial flag must b
28c10 65 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c 69  e passed to sqli
28c20 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20  te3WhereBegin() 
28c30 74 6f 20 73 6c 69 67 68 74 6c 79 0a 20 20 20 20  to slightly.    
28c40 20 20 20 20 2a 2a 20 6d 6f 64 69 66 79 20 62 65      ** modify be
28c50 68 61 76 69 6f 72 20 61 73 20 66 6f 6c 6c 6f 77  havior as follow
28c60 73 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  s:.        **.  
28c70 20 20 20 20 20 20 2a 2a 20 20 20 2b 20 49 66 20        **   + If 
28c80 74 68 65 20 71 75 65 72 79 20 69 73 20 61 20 22  the query is a "
28c90 53 45 4c 45 43 54 20 6d 69 6e 28 78 29 22 2c 20  SELECT min(x)", 
28ca0 74 68 65 6e 20 74 68 65 20 6c 6f 6f 70 20 63 6f  then the loop co
28cb0 64 65 64 20 62 79 0a 20 20 20 20 20 20 20 20 2a  ded by.        *
28cc0 2a 20 20 20 20 20 77 68 65 72 65 2e 63 20 73 68  *     where.c sh
28cd0 6f 75 6c 64 20 6e 6f 74 20 69 74 65 72 61 74 65  ould not iterate
28ce0 20 6f 76 65 72 20 61 6e 79 20 76 61 6c 75 65 73   over any values
28cf0 20 77 69 74 68 20 61 20 4e 55 4c 4c 20 76 61 6c   with a NULL val
28d00 75 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  ue.        **   
28d10 20 20 66 6f 72 20 78 2e 0a 20 20 20 20 20 20 20    for x..       
28d20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20   **.        **  
28d30 20 2b 20 54 68 65 20 6f 70 74 69 6d 69 7a 65 72   + The optimizer
28d40 20 63 6f 64 65 20 69 6e 20 77 68 65 72 65 2e 63   code in where.c
28d50 20 28 74 68 65 20 74 68 69 6e 67 20 74 68 61 74   (the thing that
28d60 20 64 65 63 69 64 65 73 20 77 68 69 63 68 0a 20   decides which. 
28d70 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 69 6e         **     in
28d80 64 65 78 20 6f 72 20 69 6e 64 69 63 65 73 20 74  dex or indices t
28d90 6f 20 75 73 65 29 20 73 68 6f 75 6c 64 20 70 6c  o use) should pl
28da0 61 63 65 20 61 20 64 69 66 66 65 72 65 6e 74 20  ace a different 
28db0 70 72 69 6f 72 69 74 79 20 6f 6e 20 0a 20 20 20  priority on .   
28dc0 20 20 20 20 20 2a 2a 20 20 20 20 20 73 61 74 69       **     sati
28dd0 73 66 79 69 6e 67 20 74 68 65 20 27 4f 52 44 45  sfying the 'ORDE
28de0 52 20 42 59 27 20 63 6c 61 75 73 65 20 74 68 61  R BY' clause tha
28df0 6e 20 69 74 20 64 6f 65 73 20 69 6e 20 6f 74 68  n it does in oth
28e00 65 72 20 63 61 73 65 73 2e 0a 20 20 20 20 20 20  er cases..      
28e10 20 20 2a 2a 20 20 20 20 20 52 65 66 65 72 20 74    **     Refer t
28e20 6f 20 63 6f 64 65 20 61 6e 64 20 63 6f 6d 6d 65  o code and comme
28e30 6e 74 73 20 69 6e 20 77 68 65 72 65 2e 63 20 66  nts in where.c f
28e40 6f 72 20 64 65 74 61 69 6c 73 2e 0a 20 20 20 20  or details..    
28e50 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 45      */.        E
28e60 78 70 72 4c 69 73 74 20 2a 70 4d 69 6e 4d 61 78  xprList *pMinMax
28e70 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 75 38   = 0;.        u8
28e80 20 66 6c 61 67 20 3d 20 57 48 45 52 45 5f 4f 52   flag = WHERE_OR
28e90 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b 0a 20 20  DERBY_NORMAL;.  
28ea0 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 61        .        a
28eb0 73 73 65 72 74 28 20 70 2d 3e 70 47 72 6f 75 70  ssert( p->pGroup
28ec0 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  By==0 );.       
28ed0 20 61 73 73 65 72 74 28 20 66 6c 61 67 3d 3d 30   assert( flag==0
28ee0 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
28ef0 70 2d 3e 70 48 61 76 69 6e 67 3d 3d 30 20 29 7b  p->pHaving==0 ){
28f00 0a 20 20 20 20 20 20 20 20 20 20 66 6c 61 67 20  .          flag 
28f10 3d 20 6d 69 6e 4d 61 78 51 75 65 72 79 28 26 73  = minMaxQuery(&s
28f20 41 67 67 49 6e 66 6f 2c 20 26 70 4d 69 6e 4d 61  AggInfo, &pMinMa
28f30 78 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  x);.        }.  
28f40 20 20 20 20 20 20 61 73 73 65 72 74 28 20 66 6c        assert( fl
28f50 61 67 3d 3d 30 20 7c 7c 20 28 70 4d 69 6e 4d 61  ag==0 || (pMinMa
28f60 78 21 3d 30 20 26 26 20 70 4d 69 6e 4d 61 78 2d  x!=0 && pMinMax-
28f70 3e 6e 45 78 70 72 3d 3d 31 29 20 29 3b 0a 0a 20  >nExpr==1) );.. 
28f80 20 20 20 20 20 20 20 69 66 28 20 66 6c 61 67 20         if( flag 
28f90 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4d 69  ){.          pMi
28fa0 6e 4d 61 78 20 3d 20 73 71 6c 69 74 65 33 45 78  nMax = sqlite3Ex
28fb0 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 4d  prListDup(db, pM
28fc0 69 6e 4d 61 78 2c 20 30 29 3b 0a 20 20 20 20 20  inMax, 0);.     
28fd0 20 20 20 20 20 70 44 65 6c 20 3d 20 70 4d 69 6e       pDel = pMin
28fe0 4d 61 78 3b 0a 20 20 20 20 20 20 20 20 20 20 69  Max;.          i
28ff0 66 28 20 70 4d 69 6e 4d 61 78 20 26 26 20 21 64  f( pMinMax && !d
29000 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
29010 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
29020 4d 69 6e 4d 61 78 2d 3e 61 5b 30 5d 2e 73 6f 72  MinMax->a[0].sor
29030 74 4f 72 64 65 72 20 3d 20 66 6c 61 67 21 3d 57  tOrder = flag!=W
29040 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e  HERE_ORDERBY_MIN
29050 20 3f 31 3a 30 3b 0a 20 20 20 20 20 20 20 20 20   ?1:0;.         
29060 20 20 20 70 4d 69 6e 4d 61 78 2d 3e 61 5b 30 5d     pMinMax->a[0]
29070 2e 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f  .pExpr->op = TK_
29080 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 20 20  COLUMN;.        
29090 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
290a0 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73  .        /* This
290b0 20 63 61 73 65 20 72 75 6e 73 20 69 66 20 74 68   case runs if th
290c0 65 20 61 67 67 72 65 67 61 74 65 20 68 61 73 20  e aggregate has 
290d0 6e 6f 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75  no GROUP BY clau
290e0 73 65 2e 20 20 54 68 65 0a 20 20 20 20 20 20 20  se.  The.       
290f0 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 20 69   ** processing i
29100 73 20 6d 75 63 68 20 73 69 6d 70 6c 65 72 20 73  s much simpler s
29110 69 6e 63 65 20 74 68 65 72 65 20 69 73 20 6f 6e  ince there is on
29120 6c 79 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 0a  ly a single row.
29130 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 6f 75          ** of ou
29140 74 70 75 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f  tput..        */
29150 0a 20 20 20 20 20 20 20 20 72 65 73 65 74 41 63  .        resetAc
29160 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65  cumulator(pParse
29170 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20  , &sAggInfo);.  
29180 20 20 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 73        pWInfo = s
29190 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
291a0 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73  (pParse, pTabLis
291b0 74 2c 20 70 57 68 65 72 65 2c 20 70 4d 69 6e 4d  t, pWhere, pMinM
291c0 61 78 2c 30 2c 66 6c 61 67 2c 30 29 3b 0a 20 20  ax,0,flag,0);.  
291d0 20 20 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f        if( pWInfo
291e0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
291f0 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
29200 44 65 6c 65 74 65 28 64 62 2c 20 70 44 65 6c 29  Delete(db, pDel)
29210 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
29220 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
29230 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 75       }.        u
29240 70 64 61 74 65 41 63 63 75 6d 75 6c 61 74 6f 72  pdateAccumulator
29250 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e  (pParse, &sAggIn
29260 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  fo);.        ass
29270 65 72 74 28 20 70 4d 69 6e 4d 61 78 3d 3d 30 20  ert( pMinMax==0 
29280 7c 7c 20 70 4d 69 6e 4d 61 78 2d 3e 6e 45 78 70  || pMinMax->nExp
29290 72 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20  r==1 );.        
292a0 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53  if( pWInfo->nOBS
292b0 61 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  at>0 ){.        
292c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
292d0 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
292e0 30 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61  0, pWInfo->iBrea
292f0 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 56 64  k);.          Vd
29300 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25  beComment((v, "%
29310 73 28 29 20 62 79 20 69 6e 64 65 78 22 2c 0a 20  s() by index",. 
29320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
29330 66 6c 61 67 3d 3d 57 48 45 52 45 5f 4f 52 44 45  flag==WHERE_ORDE
29340 52 42 59 5f 4d 49 4e 3f 22 6d 69 6e 22 3a 22 6d  RBY_MIN?"min":"m
29350 61 78 22 29 29 29 3b 0a 20 20 20 20 20 20 20 20  ax")));.        
29360 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
29370 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f  3WhereEnd(pWInfo
29380 29 3b 0a 20 20 20 20 20 20 20 20 66 69 6e 61 6c  );.        final
29390 69 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e 73 28  izeAggFunctions(
293a0 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66  pParse, &sAggInf
293b0 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  o);.      }..   
293c0 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20 30 3b     pOrderBy = 0;
293d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
293e0 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
293f0 2c 20 70 48 61 76 69 6e 67 2c 20 61 64 64 72 45  , pHaving, addrE
29400 6e 64 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49  nd, SQLITE_JUMPI
29410 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 65  FNULL);.      se
29420 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50  lectInnerLoop(pP
29430 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69  arse, p, p->pELi
29440 73 74 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20  st, 0, 0, 0, 0, 
29450 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
29460 20 20 20 20 20 20 20 70 44 65 73 74 2c 20 61 64         pDest, ad
29470 64 72 45 6e 64 2c 20 61 64 64 72 45 6e 64 29 3b  drEnd, addrEnd);
29480 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
29490 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
294a0 20 70 44 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20   pDel);.    }.  
294b0 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
294c0 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64  olveLabel(v, add
294d0 72 45 6e 64 29 3b 0a 20 20 20 20 0a 20 20 7d 20  rEnd);.    .  } 
294e0 2f 2a 20 65 6e 64 69 66 20 61 67 67 72 65 67 61  /* endif aggrega
294f0 74 65 20 71 75 65 72 79 20 2a 2f 0a 0a 20 20 69  te query */..  i
29500 66 28 20 73 44 69 73 74 69 6e 63 74 2e 65 54 6e  f( sDistinct.eTn
29510 63 74 54 79 70 65 3d 3d 57 48 45 52 45 5f 44 49  ctType==WHERE_DI
29520 53 54 49 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44  STINCT_UNORDERED
29530 20 29 7b 0a 20 20 20 20 65 78 70 6c 61 69 6e 54   ){.    explainT
29540 65 6d 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c  empTable(pParse,
29550 20 22 44 49 53 54 49 4e 43 54 22 29 3b 0a 20 20   "DISTINCT");.  
29560 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  }..  /* If there
29570 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20   is an ORDER BY 
29580 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 77 65 20  clause, then we 
29590 6e 65 65 64 20 74 6f 20 73 6f 72 74 20 74 68 65  need to sort the
295a0 20 72 65 73 75 6c 74 73 0a 20 20 2a 2a 20 61 6e   results.  ** an
295b0 64 20 73 65 6e 64 20 74 68 65 6d 20 74 6f 20 74  d send them to t
295c0 68 65 20 63 61 6c 6c 62 61 63 6b 20 6f 6e 65 20  he callback one 
295d0 62 79 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69  by one..  */.  i
295e0 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  f( pOrderBy ){. 
295f0 20 20 20 65 78 70 6c 61 69 6e 54 65 6d 70 54 61     explainTempTa
29600 62 6c 65 28 70 50 61 72 73 65 2c 20 22 4f 52 44  ble(pParse, "ORD
29610 45 52 20 42 59 22 29 3b 0a 20 20 20 20 67 65 6e  ER BY");.    gen
29620 65 72 61 74 65 53 6f 72 74 54 61 69 6c 28 70 50  erateSortTail(pP
29630 61 72 73 65 2c 20 70 2c 20 76 2c 20 70 45 4c 69  arse, p, v, pELi
29640 73 74 2d 3e 6e 45 78 70 72 2c 20 70 44 65 73 74  st->nExpr, pDest
29650 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d  );.  }..  /* Jum
29660 70 20 68 65 72 65 20 74 6f 20 73 6b 69 70 20 74  p here to skip t
29670 68 69 73 20 71 75 65 72 79 0a 20 20 2a 2f 0a 20  his query.  */. 
29680 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
29690 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 45 6e 64  lveLabel(v, iEnd
296a0 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 53 45 4c  );..  /* The SEL
296b0 45 43 54 20 77 61 73 20 73 75 63 63 65 73 73 66  ECT was successf
296c0 75 6c 6c 79 20 63 6f 64 65 64 2e 20 20 20 53 65  ully coded.   Se
296d0 74 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64  t the return cod
296e0 65 20 74 6f 20 30 0a 20 20 2a 2a 20 74 6f 20 69  e to 0.  ** to i
296f0 6e 64 69 63 61 74 65 20 6e 6f 20 65 72 72 6f 72  ndicate no error
29700 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 30  s..  */.  rc = 0
29710 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20  ;..  /* Control 
29720 6a 75 6d 70 73 20 74 6f 20 68 65 72 65 20 69 66  jumps to here if
29730 20 61 6e 20 65 72 72 6f 72 20 69 73 20 65 6e 63   an error is enc
29740 6f 75 6e 74 65 72 65 64 20 61 62 6f 76 65 2c 20  ountered above, 
29750 6f 72 20 75 70 6f 6e 0a 20 20 2a 2a 20 73 75 63  or upon.  ** suc
29760 63 65 73 73 66 75 6c 20 63 6f 64 69 6e 67 20 6f  cessful coding o
29770 66 20 74 68 65 20 53 45 4c 45 43 54 2e 0a 20 20  f the SELECT..  
29780 2a 2f 0a 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 20  */.select_end:. 
29790 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67   explainSetInteg
297a0 65 72 28 70 50 61 72 73 65 2d 3e 69 53 65 6c 65  er(pParse->iSele
297b0 63 74 49 64 2c 20 69 52 65 73 74 6f 72 65 53 65  ctId, iRestoreSe
297c0 6c 65 63 74 49 64 29 3b 0a 0a 20 20 2f 2a 20 49  lectId);..  /* I
297d0 64 65 6e 74 69 66 79 20 63 6f 6c 75 6d 6e 20 6e  dentify column n
297e0 61 6d 65 73 20 69 66 20 72 65 73 75 6c 74 73 20  ames if results 
297f0 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 61 72  of the SELECT ar
29800 65 20 74 6f 20 62 65 20 6f 75 74 70 75 74 2e 0a  e to be output..
29810 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53    */.  if( rc==S
29820 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 44 65 73  QLITE_OK && pDes
29830 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75  t->eDest==SRT_Ou
29840 74 70 75 74 20 29 7b 0a 20 20 20 20 67 65 6e 65  tput ){.    gene
29850 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  rateColumnNames(
29860 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74  pParse, pTabList
29870 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a  , pEList);.  }..
29880 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
29890 64 62 2c 20 73 41 67 67 49 6e 66 6f 2e 61 43 6f  db, sAggInfo.aCo
298a0 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  l);.  sqlite3DbF
298b0 72 65 65 28 64 62 2c 20 73 41 67 67 49 6e 66 6f  ree(db, sAggInfo
298c0 2e 61 46 75 6e 63 29 3b 0a 20 20 72 65 74 75 72  .aFunc);.  retur
298d0 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 20 64 65 66  n rc;.}..#if def
298e0 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
298f0 4c 45 5f 54 52 45 45 5f 45 58 50 4c 41 49 4e 29  LE_TREE_EXPLAIN)
29900 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
29910 61 20 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65  a human-readable
29920 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20   description of 
29930 61 20 74 68 65 20 53 65 6c 65 63 74 20 6f 62 6a  a the Select obj
29940 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ect..*/.static v
29950 6f 69 64 20 65 78 70 6c 61 69 6e 4f 6e 65 53 65  oid explainOneSe
29960 6c 65 63 74 28 56 64 62 65 20 2a 70 56 64 62 65  lect(Vdbe *pVdbe
29970 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  , Select *p){.  
29980 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
29990 69 6e 74 66 28 70 56 64 62 65 2c 20 22 53 45 4c  intf(pVdbe, "SEL
299a0 45 43 54 20 22 29 3b 0a 20 20 69 66 28 20 70 2d  ECT ");.  if( p-
299b0 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f  >selFlags & (SF_
299c0 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72  Distinct|SF_Aggr
299d0 65 67 61 74 65 29 20 29 7b 0a 20 20 20 20 69 66  egate) ){.    if
299e0 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ( p->selFlags & 
299f0 53 46 5f 44 69 73 74 69 6e 63 74 20 29 7b 0a 20  SF_Distinct ){. 
29a00 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
29a10 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c  ainPrintf(pVdbe,
29a20 20 22 44 49 53 54 49 4e 43 54 20 22 29 3b 0a 20   "DISTINCT ");. 
29a30 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e     }.    if( p->
29a40 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67  selFlags & SF_Ag
29a50 67 72 65 67 61 74 65 20 29 7b 0a 20 20 20 20 20  gregate ){.     
29a60 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
29a70 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22 61 67  rintf(pVdbe, "ag
29a80 67 5f 66 6c 61 67 20 22 29 3b 0a 20 20 20 20 7d  g_flag ");.    }
29a90 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c  .    sqlite3Expl
29aa0 61 69 6e 4e 4c 28 70 56 64 62 65 29 3b 0a 20 20  ainNL(pVdbe);.  
29ab0 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
29ac0 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22 20  Printf(pVdbe, " 
29ad0 20 20 22 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69    ");.  }.  sqli
29ae0 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72 4c 69  te3ExplainExprLi
29af0 73 74 28 70 56 64 62 65 2c 20 70 2d 3e 70 45 4c  st(pVdbe, p->pEL
29b00 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  ist);.  sqlite3E
29b10 78 70 6c 61 69 6e 4e 4c 28 70 56 64 62 65 29 3b  xplainNL(pVdbe);
29b20 0a 20 20 69 66 28 20 70 2d 3e 70 53 72 63 20 26  .  if( p->pSrc &
29b30 26 20 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 20  & p->pSrc->nSrc 
29b40 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
29b50 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
29b60 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22 46  Printf(pVdbe, "F
29b70 52 4f 4d 20 22 29 3b 0a 20 20 20 20 73 71 6c 69  ROM ");.    sqli
29b80 74 65 33 45 78 70 6c 61 69 6e 50 75 73 68 28 70  te3ExplainPush(p
29b90 56 64 62 65 29 3b 0a 20 20 20 20 66 6f 72 28 69  Vdbe);.    for(i
29ba0 3d 30 3b 20 69 3c 70 2d 3e 70 53 72 63 2d 3e 6e  =0; i<p->pSrc->n
29bb0 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Src; i++){.     
29bc0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
29bd0 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70  item *pItem = &p
29be0 2d 3e 70 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20  ->pSrc->a[i];.  
29bf0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
29c00 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20  inPrintf(pVdbe, 
29c10 22 7b 25 64 2c 2a 7d 20 3d 20 22 2c 20 70 49 74  "{%d,*} = ", pIt
29c20 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20  em->iCursor);.  
29c30 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70      if( pItem->p
29c40 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Select ){.      
29c50 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
29c60 53 65 6c 65 63 74 28 70 56 64 62 65 2c 20 70 49  Select(pVdbe, pI
29c70 74 65 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20  tem->pSelect);. 
29c80 20 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d         if( pItem
29c90 2d 3e 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20  ->pTab ){.      
29ca0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
29cb0 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20  inPrintf(pVdbe, 
29cc0 22 20 28 74 61 62 6e 61 6d 65 3d 25 73 29 22 2c  " (tabname=%s)",
29cd0 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e   pItem->pTab->zN
29ce0 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ame);.        }.
29cf0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
29d00 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 29 7b 0a  pItem->zName ){.
29d10 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
29d20 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64  xplainPrintf(pVd
29d30 62 65 2c 20 22 25 73 22 2c 20 70 49 74 65 6d 2d  be, "%s", pItem-
29d40 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d  >zName);.      }
29d50 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d  .      if( pItem
29d60 2d 3e 7a 41 6c 69 61 73 20 29 7b 0a 20 20 20 20  ->zAlias ){.    
29d70 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
29d80 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20  inPrintf(pVdbe, 
29d90 22 20 28 41 53 20 25 73 29 22 2c 20 70 49 74 65  " (AS %s)", pIte
29da0 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20  m->zAlias);.    
29db0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 49    }.      if( pI
29dc0 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20  tem->jointype & 
29dd0 4a 54 5f 4c 45 46 54 20 29 7b 0a 20 20 20 20 20  JT_LEFT ){.     
29de0 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
29df0 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22  nPrintf(pVdbe, "
29e00 20 4c 45 46 54 2d 4a 4f 49 4e 22 29 3b 0a 20 20   LEFT-JOIN");.  
29e10 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
29e20 74 65 33 45 78 70 6c 61 69 6e 4e 4c 28 70 56 64  te3ExplainNL(pVd
29e30 62 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  be);.    }.    s
29e40 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 6f 70  qlite3ExplainPop
29e50 28 70 56 64 62 65 29 3b 0a 20 20 7d 0a 20 20 69  (pVdbe);.  }.  i
29e60 66 28 20 70 2d 3e 70 57 68 65 72 65 20 29 7b 0a  f( p->pWhere ){.
29e70 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
29e80 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20  inPrintf(pVdbe, 
29e90 22 57 48 45 52 45 20 22 29 3b 0a 20 20 20 20 73  "WHERE ");.    s
29ea0 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70  qlite3ExplainExp
29eb0 72 28 70 56 64 62 65 2c 20 70 2d 3e 70 57 68 65  r(pVdbe, p->pWhe
29ec0 72 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  re);.    sqlite3
29ed0 45 78 70 6c 61 69 6e 4e 4c 28 70 56 64 62 65 29  ExplainNL(pVdbe)
29ee0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70  ;.  }.  if( p->p
29ef0 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 73  GroupBy ){.    s
29f00 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69  qlite3ExplainPri
29f10 6e 74 66 28 70 56 64 62 65 2c 20 22 47 52 4f 55  ntf(pVdbe, "GROU
29f20 50 42 59 20 22 29 3b 0a 20 20 20 20 73 71 6c 69  PBY ");.    sqli
29f30 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72 4c 69  te3ExplainExprLi
29f40 73 74 28 70 56 64 62 65 2c 20 70 2d 3e 70 47 72  st(pVdbe, p->pGr
29f50 6f 75 70 42 79 29 3b 0a 20 20 20 20 73 71 6c 69  oupBy);.    sqli
29f60 74 65 33 45 78 70 6c 61 69 6e 4e 4c 28 70 56 64  te3ExplainNL(pVd
29f70 62 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  be);.  }.  if( p
29f80 2d 3e 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20  ->pHaving ){.   
29f90 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
29fa0 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22 48 41  rintf(pVdbe, "HA
29fb0 56 49 4e 47 20 22 29 3b 0a 20 20 20 20 73 71 6c  VING ");.    sql
29fc0 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72 28  ite3ExplainExpr(
29fd0 70 56 64 62 65 2c 20 70 2d 3e 70 48 61 76 69 6e  pVdbe, p->pHavin
29fe0 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  g);.    sqlite3E
29ff0 78 70 6c 61 69 6e 4e 4c 28 70 56 64 62 65 29 3b  xplainNL(pVdbe);
2a000 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4f  .  }.  if( p->pO
2a010 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 73 71  rderBy ){.    sq
2a020 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e  lite3ExplainPrin
2a030 74 66 28 70 56 64 62 65 2c 20 22 4f 52 44 45 52  tf(pVdbe, "ORDER
2a040 42 59 20 22 29 3b 0a 20 20 20 20 73 71 6c 69 74  BY ");.    sqlit
2a050 65 33 45 78 70 6c 61 69 6e 45 78 70 72 4c 69 73  e3ExplainExprLis
2a060 74 28 70 56 64 62 65 2c 20 70 2d 3e 70 4f 72 64  t(pVdbe, p->pOrd
2a070 65 72 42 79 29 3b 0a 20 20 20 20 73 71 6c 69 74  erBy);.    sqlit
2a080 65 33 45 78 70 6c 61 69 6e 4e 4c 28 70 56 64 62  e3ExplainNL(pVdb
2a090 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d  e);.  }.  if( p-
2a0a0 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73  >pLimit ){.    s
2a0b0 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69  qlite3ExplainPri
2a0c0 6e 74 66 28 70 56 64 62 65 2c 20 22 4c 49 4d 49  ntf(pVdbe, "LIMI
2a0d0 54 20 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  T ");.    sqlite
2a0e0 33 45 78 70 6c 61 69 6e 45 78 70 72 28 70 56 64  3ExplainExpr(pVd
2a0f0 62 65 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a  be, p->pLimit);.
2a100 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
2a110 69 6e 4e 4c 28 70 56 64 62 65 29 3b 0a 20 20 7d  inNL(pVdbe);.  }
2a120 0a 20 20 69 66 28 20 70 2d 3e 70 4f 66 66 73 65  .  if( p->pOffse
2a130 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
2a140 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56  ExplainPrintf(pV
2a150 64 62 65 2c 20 22 4f 46 46 53 45 54 20 22 29 3b  dbe, "OFFSET ");
2a160 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c  .    sqlite3Expl
2a170 61 69 6e 45 78 70 72 28 70 56 64 62 65 2c 20 70  ainExpr(pVdbe, p
2a180 2d 3e 70 4f 66 66 73 65 74 29 3b 0a 20 20 20 20  ->pOffset);.    
2a190 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 4e 4c  sqlite3ExplainNL
2a1a0 28 70 56 64 62 65 29 3b 0a 20 20 7d 0a 7d 0a 76  (pVdbe);.  }.}.v
2a1b0 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 6c 61  oid sqlite3Expla
2a1c0 69 6e 53 65 6c 65 63 74 28 56 64 62 65 20 2a 70  inSelect(Vdbe *p
2a1d0 56 64 62 65 2c 20 53 65 6c 65 63 74 20 2a 70 29  Vdbe, Select *p)
2a1e0 7b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a  {.  if( p==0 ){.
2a1f0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
2a200 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20  inPrintf(pVdbe, 
2a210 22 28 6e 75 6c 6c 2d 73 65 6c 65 63 74 29 22 29  "(null-select)")
2a220 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
2a230 7d 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 70 50  }.  while( p->pP
2a240 72 69 6f 72 20 29 7b 0a 20 20 20 20 70 2d 3e 70  rior ){.    p->p
2a250 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 70  Prior->pNext = p
2a260 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 50 72  ;.    p = p->pPr
2a270 69 6f 72 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ior;.  }.  sqlit
2a280 65 33 45 78 70 6c 61 69 6e 50 75 73 68 28 70 56  e3ExplainPush(pV
2a290 64 62 65 29 3b 0a 20 20 77 68 69 6c 65 28 20 70  dbe);.  while( p
2a2a0 20 29 7b 0a 20 20 20 20 65 78 70 6c 61 69 6e 4f   ){.    explainO
2a2b0 6e 65 53 65 6c 65 63 74 28 70 56 64 62 65 2c 20  neSelect(pVdbe, 
2a2c0 70 29 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70  p);.    p = p->p
2a2d0 4e 65 78 74 3b 0a 20 20 20 20 69 66 28 20 70 3d  Next;.    if( p=
2a2e0 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
2a2f0 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 4e 4c  sqlite3ExplainNL
2a300 28 70 56 64 62 65 29 3b 0a 20 20 20 20 73 71 6c  (pVdbe);.    sql
2a310 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74  ite3ExplainPrint
2a320 66 28 70 56 64 62 65 2c 20 22 25 73 5c 6e 22 2c  f(pVdbe, "%s\n",
2a330 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d   selectOpName(p-
2a340 3e 6f 70 29 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  >op));.  }.  sql
2a350 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74  ite3ExplainPrint
2a360 66 28 70 56 64 62 65 2c 20 22 45 4e 44 22 29 3b  f(pVdbe, "END");
2a370 0a 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69  .  sqlite3Explai
2a380 6e 50 6f 70 28 70 56 64 62 65 29 3b 0a 7d 0a 0a  nPop(pVdbe);.}..
2a390 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 73 74  /* End of the st
2a3a0 72 75 63 74 75 72 65 20 64 65 62 75 67 20 70 72  ructure debug pr
2a3b0 69 6e 74 69 6e 67 20 63 6f 64 65 0a 2a 2a 2a 2a  inting code.****
2a3c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a3d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a3e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a3f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a400 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 23 65 6e 64 69  *********/.#endi
2a410 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 53 51 4c  f /* defined(SQL
2a420 49 54 45 5f 45 4e 41 42 4c 45 5f 54 52 45 45 5f  ITE_ENABLE_TREE_
2a430 45 58 50 4c 41 49 4e 29 20 2a 2f 0a              EXPLAIN) */.