/ Hex Artifact Content
Login

Artifact 819bb090c9a348d17f69f136cad2bfa9ee9cbb41:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 70 61 72 73 65 72 0a 2a 2a 20 74 6f  the parser.** to
01c0: 20 68 61 6e 64 6c 65 20 53 45 4c 45 43 54 20 73   handle SELECT s
01d0: 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 53 51 4c  tatements in SQL
01e0: 69 74 65 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65  ite..*/.#include
01f0: 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a   "sqliteInt.h"..
0200: 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6c  ./*.** Delete al
0210: 6c 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  l the content of
0220: 20 61 20 53 65 6c 65 63 74 20 73 74 72 75 63 74   a Select struct
0230: 75 72 65 20 62 75 74 20 64 6f 20 6e 6f 74 20 64  ure but do not d
0240: 65 61 6c 6c 6f 63 61 74 65 0a 2a 2a 20 74 68 65  eallocate.** the
0250: 20 73 65 6c 65 63 74 20 73 74 72 75 63 74 75 72   select structur
0260: 65 20 69 74 73 65 6c 66 2e 0a 2a 2f 0a 73 74 61  e itself..*/.sta
0270: 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72 53 65  tic void clearSe
0280: 6c 65 63 74 28 73 71 6c 69 74 65 33 20 2a 64 62  lect(sqlite3 *db
0290: 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  , Select *p){.  
02a0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
02b0: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 45 4c  elete(db, p->pEL
02c0: 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  ist);.  sqlite3S
02d0: 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  rcListDelete(db,
02e0: 20 70 2d 3e 70 53 72 63 29 3b 0a 20 20 73 71 6c   p->pSrc);.  sql
02f0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
0300: 62 2c 20 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20  b, p->pWhere);. 
0310: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
0320: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 47  Delete(db, p->pG
0330: 72 6f 75 70 42 79 29 3b 0a 20 20 73 71 6c 69 74  roupBy);.  sqlit
0340: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
0350: 20 70 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20   p->pHaving);.  
0360: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
0370: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 72  elete(db, p->pOr
0380: 64 65 72 42 79 29 3b 0a 20 20 73 71 6c 69 74 65  derBy);.  sqlite
0390: 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
03a0: 2c 20 70 2d 3e 70 50 72 69 6f 72 29 3b 0a 20 20  , p->pPrior);.  
03b0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
03c0: 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29  e(db, p->pLimit)
03d0: 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  ;.  sqlite3ExprD
03e0: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 66  elete(db, p->pOf
03f0: 66 73 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  fset);.}../*.** 
0400: 49 6e 69 74 69 61 6c 69 7a 65 20 61 20 53 65 6c  Initialize a Sel
0410: 65 63 74 44 65 73 74 20 73 74 72 75 63 74 75 72  ectDest structur
0420: 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
0430: 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74  e3SelectDestInit
0440: 28 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65  (SelectDest *pDe
0450: 73 74 2c 20 69 6e 74 20 65 44 65 73 74 2c 20 69  st, int eDest, i
0460: 6e 74 20 69 50 61 72 6d 29 7b 0a 20 20 70 44 65  nt iParm){.  pDe
0470: 73 74 2d 3e 65 44 65 73 74 20 3d 20 28 75 38 29  st->eDest = (u8)
0480: 65 44 65 73 74 3b 0a 20 20 70 44 65 73 74 2d 3e  eDest;.  pDest->
0490: 69 53 44 50 61 72 6d 20 3d 20 69 50 61 72 6d 3b  iSDParm = iParm;
04a0: 0a 20 20 70 44 65 73 74 2d 3e 61 66 66 53 64 73  .  pDest->affSds
04b0: 74 20 3d 20 30 3b 0a 20 20 70 44 65 73 74 2d 3e  t = 0;.  pDest->
04c0: 69 53 64 73 74 20 3d 20 30 3b 0a 20 20 70 44 65  iSdst = 0;.  pDe
04d0: 73 74 2d 3e 6e 53 64 73 74 20 3d 20 30 3b 0a 7d  st->nSdst = 0;.}
04e0: 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  .../*.** Allocat
04f0: 65 20 61 20 6e 65 77 20 53 65 6c 65 63 74 20 73  e a new Select s
0500: 74 72 75 63 74 75 72 65 20 61 6e 64 20 72 65 74  tructure and ret
0510: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
0520: 20 74 68 61 74 0a 2a 2a 20 73 74 72 75 63 74 75   that.** structu
0530: 72 65 2e 0a 2a 2f 0a 53 65 6c 65 63 74 20 2a 73  re..*/.Select *s
0540: 71 6c 69 74 65 33 53 65 6c 65 63 74 4e 65 77 28  qlite3SelectNew(
0550: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
0560: 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  ,        /* Pars
0570: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
0580: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
0590: 74 2c 20 20 20 20 20 2f 2a 20 77 68 69 63 68 20  t,     /* which 
05a0: 63 6f 6c 75 6d 6e 73 20 74 6f 20 69 6e 63 6c 75  columns to inclu
05b0: 64 65 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  de in the result
05c0: 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
05d0: 53 72 63 2c 20 20 20 20 20 20 20 20 2f 2a 20 74  Src,        /* t
05e0: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2d  he FROM clause -
05f0: 2d 20 77 68 69 63 68 20 74 61 62 6c 65 73 20 74  - which tables t
0600: 6f 20 73 63 61 6e 20 2a 2f 0a 20 20 45 78 70 72  o scan */.  Expr
0610: 20 2a 70 57 68 65 72 65 2c 20 20 20 20 20 20 20   *pWhere,       
0620: 20 20 2f 2a 20 74 68 65 20 57 48 45 52 45 20 63    /* the WHERE c
0630: 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c  lause */.  ExprL
0640: 69 73 74 20 2a 70 47 72 6f 75 70 42 79 2c 20 20  ist *pGroupBy,  
0650: 20 2f 2a 20 74 68 65 20 47 52 4f 55 50 20 42 59   /* the GROUP BY
0660: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70   clause */.  Exp
0670: 72 20 2a 70 48 61 76 69 6e 67 2c 20 20 20 20 20  r *pHaving,     
0680: 20 20 20 2f 2a 20 74 68 65 20 48 41 56 49 4e 47     /* the HAVING
0690: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70   clause */.  Exp
06a0: 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c  rList *pOrderBy,
06b0: 20 20 20 2f 2a 20 74 68 65 20 4f 52 44 45 52 20     /* the ORDER 
06c0: 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 75  BY clause */.  u
06d0: 31 36 20 73 65 6c 46 6c 61 67 73 2c 20 20 20 20  16 selFlags,    
06e0: 20 20 20 20 20 2f 2a 20 46 6c 61 67 20 70 61 72       /* Flag par
06f0: 61 6d 65 74 65 72 73 2c 20 73 75 63 68 20 61 73  ameters, such as
0700: 20 53 46 5f 44 69 73 74 69 6e 63 74 20 2a 2f 0a   SF_Distinct */.
0710: 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20    Expr *pLimit, 
0720: 20 20 20 20 20 20 20 20 2f 2a 20 4c 49 4d 49 54          /* LIMIT
0730: 20 76 61 6c 75 65 2e 20 20 4e 55 4c 4c 20 6d 65   value.  NULL me
0740: 61 6e 73 20 6e 6f 74 20 75 73 65 64 20 2a 2f 0a  ans not used */.
0750: 20 20 45 78 70 72 20 2a 70 4f 66 66 73 65 74 20    Expr *pOffset 
0760: 20 20 20 20 20 20 20 20 2f 2a 20 4f 46 46 53 45          /* OFFSE
0770: 54 20 76 61 6c 75 65 2e 20 20 4e 55 4c 4c 20 6d  T value.  NULL m
0780: 65 61 6e 73 20 6e 6f 20 6f 66 66 73 65 74 20 2a  eans no offset *
0790: 2f 0a 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70  /.){.  Select *p
07a0: 4e 65 77 3b 0a 20 20 53 65 6c 65 63 74 20 73 74  New;.  Select st
07b0: 61 6e 64 69 6e 3b 0a 20 20 73 71 6c 69 74 65 33  andin;.  sqlite3
07c0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
07d0: 62 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  b;.  pNew = sqli
07e0: 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
07f0: 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77  db, sizeof(*pNew
0800: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64  ) );.  assert( d
0810: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
0820: 7c 7c 20 21 70 4f 66 66 73 65 74 20 7c 7c 20 70  || !pOffset || p
0830: 4c 69 6d 69 74 20 29 3b 20 2f 2a 20 4f 46 46 53  Limit ); /* OFFS
0840: 45 54 20 69 6d 70 6c 69 65 73 20 4c 49 4d 49 54  ET implies LIMIT
0850: 20 2a 2f 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d   */.  if( pNew==
0860: 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
0870: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
0880: 64 20 29 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20  d );.    pNew = 
0890: 26 73 74 61 6e 64 69 6e 3b 0a 20 20 20 20 6d 65  &standin;.    me
08a0: 6d 73 65 74 28 70 4e 65 77 2c 20 30 2c 20 73 69  mset(pNew, 0, si
08b0: 7a 65 6f 66 28 2a 70 4e 65 77 29 29 3b 0a 20 20  zeof(*pNew));.  
08c0: 7d 0a 20 20 69 66 28 20 70 45 4c 69 73 74 3d 3d  }.  if( pEList==
08d0: 30 20 29 7b 0a 20 20 20 20 70 45 4c 69 73 74 20  0 ){.    pEList 
08e0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
08f0: 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20  tAppend(pParse, 
0900: 30 2c 20 73 71 6c 69 74 65 33 45 78 70 72 28 64  0, sqlite3Expr(d
0910: 62 2c 54 4b 5f 41 4c 4c 2c 30 29 29 3b 0a 20 20  b,TK_ALL,0));.  
0920: 7d 0a 20 20 70 4e 65 77 2d 3e 70 45 4c 69 73 74  }.  pNew->pEList
0930: 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20 69 66 28   = pEList;.  if(
0940: 20 70 53 72 63 3d 3d 30 20 29 20 70 53 72 63 20   pSrc==0 ) pSrc 
0950: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
0960: 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66  cZero(db, sizeof
0970: 28 2a 70 53 72 63 29 29 3b 0a 20 20 70 4e 65 77  (*pSrc));.  pNew
0980: 2d 3e 70 53 72 63 20 3d 20 70 53 72 63 3b 0a 20  ->pSrc = pSrc;. 
0990: 20 70 4e 65 77 2d 3e 70 57 68 65 72 65 20 3d 20   pNew->pWhere = 
09a0: 70 57 68 65 72 65 3b 0a 20 20 70 4e 65 77 2d 3e  pWhere;.  pNew->
09b0: 70 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f 75  pGroupBy = pGrou
09c0: 70 42 79 3b 0a 20 20 70 4e 65 77 2d 3e 70 48 61  pBy;.  pNew->pHa
09d0: 76 69 6e 67 20 3d 20 70 48 61 76 69 6e 67 3b 0a  ving = pHaving;.
09e0: 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79    pNew->pOrderBy
09f0: 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 70   = pOrderBy;.  p
0a00: 4e 65 77 2d 3e 73 65 6c 46 6c 61 67 73 20 3d 20  New->selFlags = 
0a10: 73 65 6c 46 6c 61 67 73 3b 0a 20 20 70 4e 65 77  selFlags;.  pNew
0a20: 2d 3e 6f 70 20 3d 20 54 4b 5f 53 45 4c 45 43 54  ->op = TK_SELECT
0a30: 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 6d 69 74  ;.  pNew->pLimit
0a40: 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 70 4e 65   = pLimit;.  pNe
0a50: 77 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f 66  w->pOffset = pOf
0a60: 66 73 65 74 3b 0a 20 20 61 73 73 65 72 74 28 20  fset;.  assert( 
0a70: 70 4f 66 66 73 65 74 3d 3d 30 20 7c 7c 20 70 4c  pOffset==0 || pL
0a80: 69 6d 69 74 21 3d 30 20 29 3b 0a 20 20 70 4e 65  imit!=0 );.  pNe
0a90: 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  w->addrOpenEphm[
0aa0: 30 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d  0] = -1;.  pNew-
0ab0: 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d  >addrOpenEphm[1]
0ac0: 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 61   = -1;.  pNew->a
0ad0: 64 64 72 4f 70 65 6e 45 70 68 6d 5b 32 5d 20 3d  ddrOpenEphm[2] =
0ae0: 20 2d 31 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d   -1;.  if( db->m
0af0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 7b 0a  allocFailed ) {.
0b00: 20 20 20 20 63 6c 65 61 72 53 65 6c 65 63 74 28      clearSelect(
0b10: 64 62 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 69  db, pNew);.    i
0b20: 66 28 20 70 4e 65 77 21 3d 26 73 74 61 6e 64 69  f( pNew!=&standi
0b30: 6e 20 29 20 73 71 6c 69 74 65 33 44 62 46 72 65  n ) sqlite3DbFre
0b40: 65 28 64 62 2c 20 70 4e 65 77 29 3b 0a 20 20 20  e(db, pNew);.   
0b50: 20 70 4e 65 77 20 3d 20 30 3b 0a 20 20 7d 65 6c   pNew = 0;.  }el
0b60: 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
0b70: 70 4e 65 77 2d 3e 70 53 72 63 21 3d 30 20 7c 7c  pNew->pSrc!=0 ||
0b80: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20   pParse->nErr>0 
0b90: 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
0ba0: 20 70 4e 65 77 21 3d 26 73 74 61 6e 64 69 6e 20   pNew!=&standin 
0bb0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77  );.  return pNew
0bc0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  ;.}../*.** Delet
0bd0: 65 20 74 68 65 20 67 69 76 65 6e 20 53 65 6c 65  e the given Sele
0be0: 63 74 20 73 74 72 75 63 74 75 72 65 20 61 6e 64  ct structure and
0bf0: 20 61 6c 6c 20 6f 66 20 69 74 73 20 73 75 62 73   all of its subs
0c00: 74 72 75 63 74 75 72 65 73 2e 0a 2a 2f 0a 76 6f  tructures..*/.vo
0c10: 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  id sqlite3Select
0c20: 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a  Delete(sqlite3 *
0c30: 64 62 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a  db, Select *p){.
0c40: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 63    if( p ){.    c
0c50: 6c 65 61 72 53 65 6c 65 63 74 28 64 62 2c 20 70  learSelect(db, p
0c60: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
0c70: 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 20 20 7d  Free(db, p);.  }
0c80: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  .}../*.** Given 
0c90: 31 20 74 6f 20 33 20 69 64 65 6e 74 69 66 69 65  1 to 3 identifie
0ca0: 72 73 20 70 72 65 63 65 64 69 6e 67 20 74 68 65  rs preceding the
0cb0: 20 4a 4f 49 4e 20 6b 65 79 77 6f 72 64 2c 20 64   JOIN keyword, d
0cc0: 65 74 65 72 6d 69 6e 65 20 74 68 65 0a 2a 2a 20  etermine the.** 
0cd0: 74 79 70 65 20 6f 66 20 6a 6f 69 6e 2e 20 20 52  type of join.  R
0ce0: 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72  eturn an integer
0cf0: 20 63 6f 6e 73 74 61 6e 74 20 74 68 61 74 20 65   constant that e
0d00: 78 70 72 65 73 73 65 73 20 74 68 61 74 20 74 79  xpresses that ty
0d10: 70 65 0a 2a 2a 20 69 6e 20 74 65 72 6d 73 20 6f  pe.** in terms o
0d20: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
0d30: 62 69 74 20 76 61 6c 75 65 73 3a 0a 2a 2a 0a 2a  bit values:.**.*
0d40: 2a 20 20 20 20 20 4a 54 5f 49 4e 4e 45 52 0a 2a  *     JT_INNER.*
0d50: 2a 20 20 20 20 20 4a 54 5f 43 52 4f 53 53 0a 2a  *     JT_CROSS.*
0d60: 2a 20 20 20 20 20 4a 54 5f 4f 55 54 45 52 0a 2a  *     JT_OUTER.*
0d70: 2a 20 20 20 20 20 4a 54 5f 4e 41 54 55 52 41 4c  *     JT_NATURAL
0d80: 0a 2a 2a 20 20 20 20 20 4a 54 5f 4c 45 46 54 0a  .**     JT_LEFT.
0d90: 2a 2a 20 20 20 20 20 4a 54 5f 52 49 47 48 54 0a  **     JT_RIGHT.
0da0: 2a 2a 0a 2a 2a 20 41 20 66 75 6c 6c 20 6f 75 74  **.** A full out
0db0: 65 72 20 6a 6f 69 6e 20 69 73 20 74 68 65 20 63  er join is the c
0dc0: 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20 4a 54  ombination of JT
0dd0: 5f 4c 45 46 54 20 61 6e 64 20 4a 54 5f 52 49 47  _LEFT and JT_RIG
0de0: 48 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  HT..**.** If an 
0df0: 69 6c 6c 65 67 61 6c 20 6f 72 20 75 6e 73 75 70  illegal or unsup
0e00: 70 6f 72 74 65 64 20 6a 6f 69 6e 20 74 79 70 65  ported join type
0e10: 20 69 73 20 73 65 65 6e 2c 20 74 68 65 6e 20 73   is seen, then s
0e20: 74 69 6c 6c 20 72 65 74 75 72 6e 0a 2a 2a 20 61  till return.** a
0e30: 20 6a 6f 69 6e 20 74 79 70 65 2c 20 62 75 74 20   join type, but 
0e40: 70 75 74 20 61 6e 20 65 72 72 6f 72 20 69 6e 20  put an error in 
0e50: 74 68 65 20 70 50 61 72 73 65 20 73 74 72 75 63  the pParse struc
0e60: 74 75 72 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ture..*/.int sql
0e70: 69 74 65 33 4a 6f 69 6e 54 79 70 65 28 50 61 72  ite3JoinType(Par
0e80: 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65  se *pParse, Toke
0e90: 6e 20 2a 70 41 2c 20 54 6f 6b 65 6e 20 2a 70 42  n *pA, Token *pB
0ea0: 2c 20 54 6f 6b 65 6e 20 2a 70 43 29 7b 0a 20 20  , Token *pC){.  
0eb0: 69 6e 74 20 6a 6f 69 6e 74 79 70 65 20 3d 20 30  int jointype = 0
0ec0: 3b 0a 20 20 54 6f 6b 65 6e 20 2a 61 70 41 6c 6c  ;.  Token *apAll
0ed0: 5b 33 5d 3b 0a 20 20 54 6f 6b 65 6e 20 2a 70 3b  [3];.  Token *p;
0ee0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
0ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
0f00: 20 20 20 30 31 32 33 34 35 36 37 38 39 20 31 32     0123456789 12
0f10: 33 34 35 36 37 38 39 20 31 32 33 34 35 36 37 38  3456789 12345678
0f20: 39 20 31 32 33 20 2a 2f 0a 20 20 73 74 61 74 69  9 123 */.  stati
0f30: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 4b 65  c const char zKe
0f40: 79 54 65 78 74 5b 5d 20 3d 20 22 6e 61 74 75 72  yText[] = "natur
0f50: 61 6c 65 66 74 6f 75 74 65 72 69 67 68 74 66 75  aleftouterightfu
0f60: 6c 6c 69 6e 6e 65 72 63 72 6f 73 73 22 3b 0a 20  llinnercross";. 
0f70: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74   static const st
0f80: 72 75 63 74 20 7b 0a 20 20 20 20 75 38 20 69 3b  ruct {.    u8 i;
0f90: 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e          /* Begin
0fa0: 6e 69 6e 67 20 6f 66 20 6b 65 79 77 6f 72 64 20  ning of keyword 
0fb0: 74 65 78 74 20 69 6e 20 7a 4b 65 79 54 65 78 74  text in zKeyText
0fc0: 5b 5d 20 2a 2f 0a 20 20 20 20 75 38 20 6e 43 68  [] */.    u8 nCh
0fd0: 61 72 3b 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68  ar;    /* Length
0fe0: 20 6f 66 20 74 68 65 20 6b 65 79 77 6f 72 64 20   of the keyword 
0ff0: 69 6e 20 63 68 61 72 61 63 74 65 72 73 20 2a 2f  in characters */
1000: 0a 20 20 20 20 75 38 20 63 6f 64 65 3b 20 20 20  .    u8 code;   
1010: 20 20 2f 2a 20 4a 6f 69 6e 20 74 79 70 65 20 6d    /* Join type m
1020: 61 73 6b 20 2a 2f 0a 20 20 7d 20 61 4b 65 79 77  ask */.  } aKeyw
1030: 6f 72 64 5b 5d 20 3d 20 7b 0a 20 20 20 20 2f 2a  ord[] = {.    /*
1040: 20 6e 61 74 75 72 61 6c 20 2a 2f 20 7b 20 30 2c   natural */ { 0,
1050: 20 20 37 2c 20 4a 54 5f 4e 41 54 55 52 41 4c 20    7, JT_NATURAL 
1060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
1070: 2c 0a 20 20 20 20 2f 2a 20 6c 65 66 74 20 20 20  ,.    /* left   
1080: 20 2a 2f 20 7b 20 36 2c 20 20 34 2c 20 4a 54 5f   */ { 6,  4, JT_
1090: 4c 45 46 54 7c 4a 54 5f 4f 55 54 45 52 20 20 20  LEFT|JT_OUTER   
10a0: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a         },.    /*
10b0: 20 6f 75 74 65 72 20 20 20 2a 2f 20 7b 20 31 30   outer   */ { 10
10c0: 2c 20 35 2c 20 4a 54 5f 4f 55 54 45 52 20 20 20  , 5, JT_OUTER   
10d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
10e0: 2c 0a 20 20 20 20 2f 2a 20 72 69 67 68 74 20 20  ,.    /* right  
10f0: 20 2a 2f 20 7b 20 31 34 2c 20 35 2c 20 4a 54 5f   */ { 14, 5, JT_
1100: 52 49 47 48 54 7c 4a 54 5f 4f 55 54 45 52 20 20  RIGHT|JT_OUTER  
1110: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a         },.    /*
1120: 20 66 75 6c 6c 20 20 20 20 2a 2f 20 7b 20 31 39   full    */ { 19
1130: 2c 20 34 2c 20 4a 54 5f 4c 45 46 54 7c 4a 54 5f  , 4, JT_LEFT|JT_
1140: 52 49 47 48 54 7c 4a 54 5f 4f 55 54 45 52 20 7d  RIGHT|JT_OUTER }
1150: 2c 0a 20 20 20 20 2f 2a 20 69 6e 6e 65 72 20 20  ,.    /* inner  
1160: 20 2a 2f 20 7b 20 32 33 2c 20 35 2c 20 4a 54 5f   */ { 23, 5, JT_
1170: 49 4e 4e 45 52 20 20 20 20 20 20 20 20 20 20 20  INNER           
1180: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a         },.    /*
1190: 20 63 72 6f 73 73 20 20 20 2a 2f 20 7b 20 32 38   cross   */ { 28
11a0: 2c 20 35 2c 20 4a 54 5f 49 4e 4e 45 52 7c 4a 54  , 5, JT_INNER|JT
11b0: 5f 43 52 4f 53 53 20 20 20 20 20 20 20 20 20 7d  _CROSS         }
11c0: 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 2c 20  ,.  };.  int i, 
11d0: 6a 3b 0a 20 20 61 70 41 6c 6c 5b 30 5d 20 3d 20  j;.  apAll[0] = 
11e0: 70 41 3b 0a 20 20 61 70 41 6c 6c 5b 31 5d 20 3d  pA;.  apAll[1] =
11f0: 20 70 42 3b 0a 20 20 61 70 41 6c 6c 5b 32 5d 20   pB;.  apAll[2] 
1200: 3d 20 70 43 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  = pC;.  for(i=0;
1210: 20 69 3c 33 20 26 26 20 61 70 41 6c 6c 5b 69 5d   i<3 && apAll[i]
1220: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20  ; i++){.    p = 
1230: 61 70 41 6c 6c 5b 69 5d 3b 0a 20 20 20 20 66 6f  apAll[i];.    fo
1240: 72 28 6a 3d 30 3b 20 6a 3c 41 72 72 61 79 53 69  r(j=0; j<ArraySi
1250: 7a 65 28 61 4b 65 79 77 6f 72 64 29 3b 20 6a 2b  ze(aKeyword); j+
1260: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  +){.      if( p-
1270: 3e 6e 3d 3d 61 4b 65 79 77 6f 72 64 5b 6a 5d 2e  >n==aKeyword[j].
1280: 6e 43 68 61 72 20 0a 20 20 20 20 20 20 20 20 20  nChar .         
1290: 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 4e 49   && sqlite3StrNI
12a0: 43 6d 70 28 28 63 68 61 72 2a 29 70 2d 3e 7a 2c  Cmp((char*)p->z,
12b0: 20 26 7a 4b 65 79 54 65 78 74 5b 61 4b 65 79 77   &zKeyText[aKeyw
12c0: 6f 72 64 5b 6a 5d 2e 69 5d 2c 20 70 2d 3e 6e 29  ord[j].i], p->n)
12d0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6a  ==0 ){.        j
12e0: 6f 69 6e 74 79 70 65 20 7c 3d 20 61 4b 65 79 77  ointype |= aKeyw
12f0: 6f 72 64 5b 6a 5d 2e 63 6f 64 65 3b 0a 20 20 20  ord[j].code;.   
1300: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1310: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 74 65    }.    }.    te
1320: 73 74 63 61 73 65 28 20 6a 3d 3d 30 20 7c 7c 20  stcase( j==0 || 
1330: 6a 3d 3d 31 20 7c 7c 20 6a 3d 3d 32 20 7c 7c 20  j==1 || j==2 || 
1340: 6a 3d 3d 33 20 7c 7c 20 6a 3d 3d 34 20 7c 7c 20  j==3 || j==4 || 
1350: 6a 3d 3d 35 20 7c 7c 20 6a 3d 3d 36 20 29 3b 0a  j==5 || j==6 );.
1360: 20 20 20 20 69 66 28 20 6a 3e 3d 41 72 72 61 79      if( j>=Array
1370: 53 69 7a 65 28 61 4b 65 79 77 6f 72 64 29 20 29  Size(aKeyword) )
1380: 7b 0a 20 20 20 20 20 20 6a 6f 69 6e 74 79 70 65  {.      jointype
1390: 20 7c 3d 20 4a 54 5f 45 52 52 4f 52 3b 0a 20 20   |= JT_ERROR;.  
13a0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
13b0: 0a 20 20 7d 0a 20 20 69 66 28 0a 20 20 20 20 20  .  }.  if(.     
13c0: 28 6a 6f 69 6e 74 79 70 65 20 26 20 28 4a 54 5f  (jointype & (JT_
13d0: 49 4e 4e 45 52 7c 4a 54 5f 4f 55 54 45 52 29 29  INNER|JT_OUTER))
13e0: 3d 3d 28 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f 4f  ==(JT_INNER|JT_O
13f0: 55 54 45 52 29 20 7c 7c 0a 20 20 20 20 20 28 6a  UTER) ||.     (j
1400: 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 45 52 52  ointype & JT_ERR
1410: 4f 52 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20  OR)!=0.  ){.    
1420: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 70 20  const char *zSp 
1430: 3d 20 22 20 22 3b 0a 20 20 20 20 61 73 73 65 72  = " ";.    asser
1440: 74 28 20 70 42 21 3d 30 20 29 3b 0a 20 20 20 20  t( pB!=0 );.    
1450: 69 66 28 20 70 43 3d 3d 30 20 29 7b 20 7a 53 70  if( pC==0 ){ zSp
1460: 2b 2b 3b 20 7d 0a 20 20 20 20 73 71 6c 69 74 65  ++; }.    sqlite
1470: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
1480: 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6f 72 20 75 6e  , "unknown or un
1490: 73 75 70 70 6f 72 74 65 64 20 6a 6f 69 6e 20 74  supported join t
14a0: 79 70 65 3a 20 22 0a 20 20 20 20 20 20 20 22 25  ype: ".       "%
14b0: 54 20 25 54 25 73 25 54 22 2c 20 70 41 2c 20 70  T %T%s%T", pA, p
14c0: 42 2c 20 7a 53 70 2c 20 70 43 29 3b 0a 20 20 20  B, zSp, pC);.   
14d0: 20 6a 6f 69 6e 74 79 70 65 20 3d 20 4a 54 5f 49   jointype = JT_I
14e0: 4e 4e 45 52 3b 0a 20 20 7d 65 6c 73 65 20 69 66  NNER;.  }else if
14f0: 28 20 28 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54  ( (jointype & JT
1500: 5f 4f 55 54 45 52 29 21 3d 30 20 0a 20 20 20 20  _OUTER)!=0 .    
1510: 20 20 20 20 20 26 26 20 28 6a 6f 69 6e 74 79 70       && (jointyp
1520: 65 20 26 20 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f  e & (JT_LEFT|JT_
1530: 52 49 47 48 54 29 29 21 3d 4a 54 5f 4c 45 46 54  RIGHT))!=JT_LEFT
1540: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
1550: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
1560: 0a 20 20 20 20 20 20 22 52 49 47 48 54 20 61 6e  .      "RIGHT an
1570: 64 20 46 55 4c 4c 20 4f 55 54 45 52 20 4a 4f 49  d FULL OUTER JOI
1580: 4e 73 20 61 72 65 20 6e 6f 74 20 63 75 72 72 65  Ns are not curre
1590: 6e 74 6c 79 20 73 75 70 70 6f 72 74 65 64 22 29  ntly supported")
15a0: 3b 0a 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d  ;.    jointype =
15b0: 20 4a 54 5f 49 4e 4e 45 52 3b 0a 20 20 7d 0a 20   JT_INNER;.  }. 
15c0: 20 72 65 74 75 72 6e 20 6a 6f 69 6e 74 79 70 65   return jointype
15d0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
15e0: 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61  n the index of a
15f0: 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 20 74 61 62   column in a tab
1600: 6c 65 2e 20 20 52 65 74 75 72 6e 20 2d 31 20 69  le.  Return -1 i
1610: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20  f the column.** 
1620: 69 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64  is not contained
1630: 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a   in the table..*
1640: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 6c  /.static int col
1650: 75 6d 6e 49 6e 64 65 78 28 54 61 62 6c 65 20 2a  umnIndex(Table *
1660: 70 54 61 62 2c 20 63 6f 6e 73 74 20 63 68 61 72  pTab, const char
1670: 20 2a 7a 43 6f 6c 29 7b 0a 20 20 69 6e 74 20 69   *zCol){.  int i
1680: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
1690: 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  Tab->nCol; i++){
16a0: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
16b0: 53 74 72 49 43 6d 70 28 70 54 61 62 2d 3e 61 43  StrICmp(pTab->aC
16c0: 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 43 6f  ol[i].zName, zCo
16d0: 6c 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 69  l)==0 ) return i
16e0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d  ;.  }.  return -
16f0: 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72  1;.}../*.** Sear
1700: 63 68 20 74 68 65 20 66 69 72 73 74 20 4e 20 74  ch the first N t
1710: 61 62 6c 65 73 20 69 6e 20 70 53 72 63 2c 20 66  ables in pSrc, f
1720: 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68  rom left to righ
1730: 74 2c 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61  t, looking for a
1740: 0a 2a 2a 20 74 61 62 6c 65 20 74 68 61 74 20 68  .** table that h
1750: 61 73 20 61 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  as a column name
1760: 64 20 7a 43 6f 6c 2e 20 20 0a 2a 2a 0a 2a 2a 20  d zCol.  .**.** 
1770: 57 68 65 6e 20 66 6f 75 6e 64 2c 20 73 65 74 20  When found, set 
1780: 2a 70 69 54 61 62 20 61 6e 64 20 2a 70 69 43 6f  *piTab and *piCo
1790: 6c 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 69  l to the table i
17a0: 6e 64 65 78 20 61 6e 64 20 63 6f 6c 75 6d 6e 20  ndex and column 
17b0: 69 6e 64 65 78 0a 2a 2a 20 6f 66 20 74 68 65 20  index.** of the 
17c0: 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20  matching column 
17d0: 61 6e 64 20 72 65 74 75 72 6e 20 54 52 55 45 2e  and return TRUE.
17e0: 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 74 20 66 6f  .**.** If not fo
17f0: 75 6e 64 2c 20 72 65 74 75 72 6e 20 46 41 4c 53  und, return FALS
1800: 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  E..*/.static int
1810: 20 74 61 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49   tableAndColumnI
1820: 6e 64 65 78 28 0a 20 20 53 72 63 4c 69 73 74 20  ndex(.  SrcList 
1830: 2a 70 53 72 63 2c 20 20 20 20 20 20 20 2f 2a 20  *pSrc,       /* 
1840: 41 72 72 61 79 20 6f 66 20 74 61 62 6c 65 73 20  Array of tables 
1850: 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 69  to search */.  i
1860: 6e 74 20 4e 2c 20 20 20 20 20 20 20 20 20 20 20  nt N,           
1870: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1880: 20 74 61 62 6c 65 73 20 69 6e 20 70 53 72 63 2d   tables in pSrc-
1890: 3e 61 5b 5d 20 74 6f 20 73 65 61 72 63 68 20 2a  >a[] to search *
18a0: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
18b0: 7a 43 6f 6c 2c 20 20 20 20 2f 2a 20 4e 61 6d 65  zCol,    /* Name
18c0: 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 77   of the column w
18d0: 65 20 61 72 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f  e are looking fo
18e0: 72 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 54 61  r */.  int *piTa
18f0: 62 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  b,          /* W
1900: 72 69 74 65 20 69 6e 64 65 78 20 6f 66 20 70 53  rite index of pS
1910: 72 63 2d 3e 61 5b 5d 20 68 65 72 65 20 2a 2f 0a  rc->a[] here */.
1920: 20 20 69 6e 74 20 2a 70 69 43 6f 6c 20 20 20 20    int *piCol    
1930: 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
1940: 69 6e 64 65 78 20 6f 66 20 70 53 72 63 2d 3e 61  index of pSrc->a
1950: 5b 2a 70 69 54 61 62 5d 2e 70 54 61 62 2d 3e 61  [*piTab].pTab->a
1960: 43 6f 6c 5b 5d 20 68 65 72 65 20 2a 2f 0a 29 7b  Col[] here */.){
1970: 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
1980: 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c          /* For l
1990: 6f 6f 70 69 6e 67 20 6f 76 65 72 20 74 61 62 6c  ooping over tabl
19a0: 65 73 20 69 6e 20 70 53 72 63 20 2a 2f 0a 20 20  es in pSrc */.  
19b0: 69 6e 74 20 69 43 6f 6c 3b 20 20 20 20 20 20 20  int iCol;       
19c0: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
19d0: 20 63 6f 6c 75 6d 6e 20 6d 61 74 63 68 69 6e 67   column matching
19e0: 20 7a 43 6f 6c 20 2a 2f 0a 0a 20 20 61 73 73 65   zCol */..  asse
19f0: 72 74 28 20 28 70 69 54 61 62 3d 3d 30 29 3d 3d  rt( (piTab==0)==
1a00: 28 70 69 43 6f 6c 3d 3d 30 29 20 29 3b 20 20 2f  (piCol==0) );  /
1a10: 2a 20 42 6f 74 68 20 6f 72 20 6e 65 69 74 68 65  * Both or neithe
1a20: 72 20 61 72 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  r are NULL */.  
1a30: 66 6f 72 28 69 3d 30 3b 20 69 3c 4e 3b 20 69 2b  for(i=0; i<N; i+
1a40: 2b 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20 63  +){.    iCol = c
1a50: 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 53 72 63 2d  olumnIndex(pSrc-
1a60: 3e 61 5b 69 5d 2e 70 54 61 62 2c 20 7a 43 6f 6c  >a[i].pTab, zCol
1a70: 29 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3e  );.    if( iCol>
1a80: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
1a90: 70 69 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20  piTab ){.       
1aa0: 20 2a 70 69 54 61 62 20 3d 20 69 3b 0a 20 20 20   *piTab = i;.   
1ab0: 20 20 20 20 20 2a 70 69 43 6f 6c 20 3d 20 69 43       *piCol = iC
1ac0: 6f 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ol;.      }.    
1ad0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
1ae0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
1af0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
1b00: 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
1b10: 20 74 6f 20 61 64 64 20 74 65 72 6d 73 20 69 6d   to add terms im
1b20: 70 6c 69 65 64 20 62 79 20 4a 4f 49 4e 20 73 79  plied by JOIN sy
1b30: 6e 74 61 78 20 74 6f 20 74 68 65 0a 2a 2a 20 57  ntax to the.** W
1b40: 48 45 52 45 20 63 6c 61 75 73 65 20 65 78 70 72  HERE clause expr
1b50: 65 73 73 69 6f 6e 20 6f 66 20 61 20 53 45 4c 45  ession of a SELE
1b60: 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 54 68  CT statement. Th
1b70: 65 20 6e 65 77 20 74 65 72 6d 2c 20 77 68 69 63  e new term, whic
1b80: 68 0a 2a 2a 20 69 73 20 41 4e 44 65 64 20 77 69  h.** is ANDed wi
1b90: 74 68 20 74 68 65 20 65 78 69 73 74 69 6e 67 20  th the existing 
1ba0: 57 48 45 52 45 20 63 6c 61 75 73 65 2c 20 69 73  WHERE clause, is
1bb0: 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a   of the form:.**
1bc0: 0a 2a 2a 20 20 20 20 28 74 61 62 31 2e 63 6f 6c  .**    (tab1.col
1bd0: 31 20 3d 20 74 61 62 32 2e 63 6f 6c 32 29 0a 2a  1 = tab2.col2).*
1be0: 2a 0a 2a 2a 20 77 68 65 72 65 20 74 61 62 31 20  *.** where tab1 
1bf0: 69 73 20 74 68 65 20 69 53 72 63 27 74 68 20 74  is the iSrc'th t
1c00: 61 62 6c 65 20 69 6e 20 53 72 63 4c 69 73 74 20  able in SrcList 
1c10: 70 53 72 63 20 61 6e 64 20 74 61 62 32 20 69 73  pSrc and tab2 is
1c20: 20 74 68 65 20 0a 2a 2a 20 28 69 53 72 63 2b 31   the .** (iSrc+1
1c30: 29 27 74 68 2e 20 43 6f 6c 75 6d 6e 20 63 6f 6c  )'th. Column col
1c40: 31 20 69 73 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c  1 is column iCol
1c50: 4c 65 66 74 20 6f 66 20 74 61 62 31 2c 20 61 6e  Left of tab1, an
1c60: 64 20 63 6f 6c 32 20 69 73 0a 2a 2a 20 63 6f 6c  d col2 is.** col
1c70: 75 6d 6e 20 69 43 6f 6c 52 69 67 68 74 20 6f 66  umn iColRight of
1c80: 20 74 61 62 32 2e 0a 2a 2f 0a 73 74 61 74 69 63   tab2..*/.static
1c90: 20 76 6f 69 64 20 61 64 64 57 68 65 72 65 54 65   void addWhereTe
1ca0: 72 6d 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  rm(.  Parse *pPa
1cb0: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  rse,            
1cc0: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
1cd0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72   context */.  Sr
1ce0: 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20  cList *pSrc,    
1cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d00: 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20   List of tables 
1d10: 69 6e 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a  in FROM clause *
1d20: 2f 0a 20 20 69 6e 74 20 69 4c 65 66 74 2c 20 20  /.  int iLeft,  
1d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d40: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
1d50: 66 69 72 73 74 20 74 61 62 6c 65 20 74 6f 20 6a  first table to j
1d60: 6f 69 6e 20 69 6e 20 70 53 72 63 20 2a 2f 0a 20  oin in pSrc */. 
1d70: 20 69 6e 74 20 69 43 6f 6c 4c 65 66 74 2c 20 20   int iColLeft,  
1d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d90: 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c   /* Index of col
1da0: 75 6d 6e 20 69 6e 20 66 69 72 73 74 20 74 61 62  umn in first tab
1db0: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 69 67  le */.  int iRig
1dc0: 68 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ht,             
1dd0: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
1de0: 20 6f 66 20 73 65 63 6f 6e 64 20 74 61 62 6c 65   of second table
1df0: 20 69 6e 20 70 53 72 63 20 2a 2f 0a 20 20 69 6e   in pSrc */.  in
1e00: 74 20 69 43 6f 6c 52 69 67 68 74 2c 20 20 20 20  t iColRight,    
1e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e20: 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e   Index of column
1e30: 20 69 6e 20 73 65 63 6f 6e 64 20 74 61 62 6c 65   in second table
1e40: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4f 75 74 65   */.  int isOute
1e50: 72 4a 6f 69 6e 2c 20 20 20 20 20 20 20 20 20 20  rJoin,          
1e60: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
1e70: 20 74 68 69 73 20 69 73 20 61 6e 20 4f 55 54 45   this is an OUTE
1e80: 52 20 6a 6f 69 6e 20 2a 2f 0a 20 20 45 78 70 72  R join */.  Expr
1e90: 20 2a 2a 70 70 57 68 65 72 65 20 20 20 20 20 20   **ppWhere      
1ea0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
1eb0: 4e 2f 4f 55 54 3a 20 54 68 65 20 57 48 45 52 45  N/OUT: The WHERE
1ec0: 20 63 6c 61 75 73 65 20 74 6f 20 61 64 64 20 74   clause to add t
1ed0: 6f 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  o */.){.  sqlite
1ee0: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
1ef0: 64 62 3b 0a 20 20 45 78 70 72 20 2a 70 45 31 3b  db;.  Expr *pE1;
1f00: 0a 20 20 45 78 70 72 20 2a 70 45 32 3b 0a 20 20  .  Expr *pE2;.  
1f10: 45 78 70 72 20 2a 70 45 71 3b 0a 0a 20 20 61 73  Expr *pEq;..  as
1f20: 73 65 72 74 28 20 69 4c 65 66 74 3c 69 52 69 67  sert( iLeft<iRig
1f30: 68 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ht );.  assert( 
1f40: 70 53 72 63 2d 3e 6e 53 72 63 3e 69 52 69 67 68  pSrc->nSrc>iRigh
1f50: 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  t );.  assert( p
1f60: 53 72 63 2d 3e 61 5b 69 4c 65 66 74 5d 2e 70 54  Src->a[iLeft].pT
1f70: 61 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ab );.  assert( 
1f80: 70 53 72 63 2d 3e 61 5b 69 52 69 67 68 74 5d 2e  pSrc->a[iRight].
1f90: 70 54 61 62 20 29 3b 0a 0a 20 20 70 45 31 20 3d  pTab );..  pE1 =
1fa0: 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 43 6f   sqlite3CreateCo
1fb0: 6c 75 6d 6e 45 78 70 72 28 64 62 2c 20 70 53 72  lumnExpr(db, pSr
1fc0: 63 2c 20 69 4c 65 66 74 2c 20 69 43 6f 6c 4c 65  c, iLeft, iColLe
1fd0: 66 74 29 3b 0a 20 20 70 45 32 20 3d 20 73 71 6c  ft);.  pE2 = sql
1fe0: 69 74 65 33 43 72 65 61 74 65 43 6f 6c 75 6d 6e  ite3CreateColumn
1ff0: 45 78 70 72 28 64 62 2c 20 70 53 72 63 2c 20 69  Expr(db, pSrc, i
2000: 52 69 67 68 74 2c 20 69 43 6f 6c 52 69 67 68 74  Right, iColRight
2010: 29 3b 0a 0a 20 20 70 45 71 20 3d 20 73 71 6c 69  );..  pEq = sqli
2020: 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
2030: 20 54 4b 5f 45 51 2c 20 70 45 31 2c 20 70 45 32   TK_EQ, pE1, pE2
2040: 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 45 71 20  , 0);.  if( pEq 
2050: 26 26 20 69 73 4f 75 74 65 72 4a 6f 69 6e 20 29  && isOuterJoin )
2060: 7b 0a 20 20 20 20 45 78 70 72 53 65 74 50 72 6f  {.    ExprSetPro
2070: 70 65 72 74 79 28 70 45 71 2c 20 45 50 5f 46 72  perty(pEq, EP_Fr
2080: 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20 61 73 73  omJoin);.    ass
2090: 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
20a0: 70 65 72 74 79 28 70 45 71 2c 20 45 50 5f 54 6f  perty(pEq, EP_To
20b0: 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63  kenOnly|EP_Reduc
20c0: 65 64 29 20 29 3b 0a 20 20 20 20 45 78 70 72 53  ed) );.    ExprS
20d0: 65 74 56 56 41 50 72 6f 70 65 72 74 79 28 70 45  etVVAProperty(pE
20e0: 71 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b  q, EP_NoReduce);
20f0: 0a 20 20 20 20 70 45 71 2d 3e 69 52 69 67 68 74  .    pEq->iRight
2100: 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 28 69 31 36  JoinTable = (i16
2110: 29 70 45 32 2d 3e 69 54 61 62 6c 65 3b 0a 20 20  )pE2->iTable;.  
2120: 7d 0a 20 20 2a 70 70 57 68 65 72 65 20 3d 20 73  }.  *ppWhere = s
2130: 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 64 62  qlite3ExprAnd(db
2140: 2c 20 2a 70 70 57 68 65 72 65 2c 20 70 45 71 29  , *ppWhere, pEq)
2150: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
2160: 68 65 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 70  he EP_FromJoin p
2170: 72 6f 70 65 72 74 79 20 6f 6e 20 61 6c 6c 20 74  roperty on all t
2180: 65 72 6d 73 20 6f 66 20 74 68 65 20 67 69 76 65  erms of the give
2190: 6e 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a  n expression..**
21a0: 20 41 6e 64 20 73 65 74 20 74 68 65 20 45 78 70   And set the Exp
21b0: 72 2e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c  r.iRightJoinTabl
21c0: 65 20 74 6f 20 69 54 61 62 6c 65 20 66 6f 72 20  e to iTable for 
21d0: 65 76 65 72 79 20 74 65 72 6d 20 69 6e 20 74 68  every term in th
21e0: 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 2e  e.** expression.
21f0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 50 5f 46 72  .**.** The EP_Fr
2200: 6f 6d 4a 6f 69 6e 20 70 72 6f 70 65 72 74 79 20  omJoin property 
2210: 69 73 20 75 73 65 64 20 6f 6e 20 74 65 72 6d 73  is used on terms
2220: 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f   of an expressio
2230: 6e 20 74 6f 20 74 65 6c 6c 0a 2a 2a 20 74 68 65  n to tell.** the
2240: 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e   LEFT OUTER JOIN
2250: 20 70 72 6f 63 65 73 73 69 6e 67 20 6c 6f 67 69   processing logi
2260: 63 20 74 68 61 74 20 74 68 69 73 20 74 65 72 6d  c that this term
2270: 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 0a   is part of the.
2280: 2a 2a 20 6a 6f 69 6e 20 72 65 73 74 72 69 63 74  ** join restrict
2290: 69 6f 6e 20 73 70 65 63 69 66 69 65 64 20 69 6e  ion specified in
22a0: 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47   the ON or USING
22b0: 20 63 6c 61 75 73 65 20 61 6e 64 20 6e 6f 74 20   clause and not 
22c0: 61 20 70 61 72 74 0a 2a 2a 20 6f 66 20 74 68 65  a part.** of the
22d0: 20 6d 6f 72 65 20 67 65 6e 65 72 61 6c 20 57 48   more general WH
22e0: 45 52 45 20 63 6c 61 75 73 65 2e 20 20 54 68 65  ERE clause.  The
22f0: 73 65 20 74 65 72 6d 73 20 61 72 65 20 6d 6f 76  se terms are mov
2300: 65 64 20 6f 76 65 72 20 74 6f 20 74 68 65 0a 2a  ed over to the.*
2310: 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 64  * WHERE clause d
2320: 75 72 69 6e 67 20 6a 6f 69 6e 20 70 72 6f 63 65  uring join proce
2330: 73 73 69 6e 67 20 62 75 74 20 77 65 20 6e 65 65  ssing but we nee
2340: 64 20 74 6f 20 72 65 6d 65 6d 62 65 72 20 74 68  d to remember th
2350: 61 74 20 74 68 65 79 0a 2a 2a 20 6f 72 69 67 69  at they.** origi
2360: 6e 61 74 65 64 20 69 6e 20 74 68 65 20 4f 4e 20  nated in the ON 
2370: 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2e  or USING clause.
2380: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 78 70 72 2e  .**.** The Expr.
2390: 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20  iRightJoinTable 
23a0: 74 65 6c 6c 73 20 74 68 65 20 57 48 45 52 45 20  tells the WHERE 
23b0: 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e  clause processin
23c0: 67 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 65 78  g that the.** ex
23d0: 70 72 65 73 73 69 6f 6e 20 64 65 70 65 6e 64 73  pression depends
23e0: 20 6f 6e 20 74 61 62 6c 65 20 69 52 69 67 68 74   on table iRight
23f0: 4a 6f 69 6e 54 61 62 6c 65 20 65 76 65 6e 20 69  JoinTable even i
2400: 66 20 74 68 61 74 20 74 61 62 6c 65 20 69 73 20  f that table is 
2410: 6e 6f 74 0a 2a 2a 20 65 78 70 6c 69 63 69 74 6c  not.** explicitl
2420: 79 20 6d 65 6e 74 69 6f 6e 65 64 20 69 6e 20 74  y mentioned in t
2430: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20  he expression.  
2440: 54 68 61 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  That information
2450: 20 69 73 20 6e 65 65 64 65 64 0a 2a 2a 20 66 6f   is needed.** fo
2460: 72 20 63 61 73 65 73 20 6c 69 6b 65 20 74 68 69  r cases like thi
2470: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45  s:.**.**    SELE
2480: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4c 45 46  CT * FROM t1 LEF
2490: 54 20 4a 4f 49 4e 20 74 32 20 4f 4e 20 74 31 2e  T JOIN t2 ON t1.
24a0: 61 3d 74 32 2e 62 20 41 4e 44 20 74 31 2e 78 3d  a=t2.b AND t1.x=
24b0: 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 77 68 65 72  5.**.** The wher
24c0: 65 20 63 6c 61 75 73 65 20 6e 65 65 64 73 20 74  e clause needs t
24d0: 6f 20 64 65 66 65 72 20 74 68 65 20 68 61 6e 64  o defer the hand
24e0: 6c 69 6e 67 20 6f 66 20 74 68 65 20 74 31 2e 78  ling of the t1.x
24f0: 3d 35 0a 2a 2a 20 74 65 72 6d 20 75 6e 74 69 6c  =5.** term until
2500: 20 61 66 74 65 72 20 74 68 65 20 74 32 20 6c 6f   after the t2 lo
2510: 6f 70 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20  op of the join. 
2520: 20 49 6e 20 74 68 61 74 20 77 61 79 2c 20 61 0a   In that way, a.
2530: 2a 2a 20 4e 55 4c 4c 20 74 32 20 72 6f 77 20 77  ** NULL t2 row w
2540: 69 6c 6c 20 62 65 20 69 6e 73 65 72 74 65 64 20  ill be inserted 
2550: 77 68 65 6e 65 76 65 72 20 74 31 2e 78 21 3d 35  whenever t1.x!=5
2560: 2e 20 20 49 66 20 77 65 20 64 6f 20 6e 6f 74 0a  .  If we do not.
2570: 2a 2a 20 64 65 66 65 72 20 74 68 65 20 68 61 6e  ** defer the han
2580: 64 6c 69 6e 67 20 6f 66 20 74 31 2e 78 3d 35 2c  dling of t1.x=5,
2590: 20 69 74 20 77 69 6c 6c 20 62 65 20 70 72 6f 63   it will be proc
25a0: 65 73 73 65 64 20 69 6d 6d 65 64 69 61 74 65 6c  essed immediatel
25b0: 79 0a 2a 2a 20 61 66 74 65 72 20 74 68 65 20 74  y.** after the t
25c0: 31 20 6c 6f 6f 70 20 61 6e 64 20 72 6f 77 73 20  1 loop and rows 
25d0: 77 69 74 68 20 74 31 2e 78 21 3d 35 20 77 69 6c  with t1.x!=5 wil
25e0: 6c 20 6e 65 76 65 72 20 61 70 70 65 61 72 20 69  l never appear i
25f0: 6e 0a 2a 2a 20 74 68 65 20 6f 75 74 70 75 74 2c  n.** the output,
2600: 20 77 68 69 63 68 20 69 73 20 69 6e 63 6f 72 72   which is incorr
2610: 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ect..*/.static v
2620: 6f 69 64 20 73 65 74 4a 6f 69 6e 45 78 70 72 28  oid setJoinExpr(
2630: 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 69 54 61  Expr *p, int iTa
2640: 62 6c 65 29 7b 0a 20 20 77 68 69 6c 65 28 20 70  ble){.  while( p
2650: 20 29 7b 0a 20 20 20 20 45 78 70 72 53 65 74 50   ){.    ExprSetP
2660: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 46 72  roperty(p, EP_Fr
2670: 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20 61 73 73  omJoin);.    ass
2680: 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
2690: 70 65 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65  perty(p, EP_Toke
26a0: 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64  nOnly|EP_Reduced
26b0: 29 20 29 3b 0a 20 20 20 20 45 78 70 72 53 65 74  ) );.    ExprSet
26c0: 56 56 41 50 72 6f 70 65 72 74 79 28 70 2c 20 45  VVAProperty(p, E
26d0: 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a 20 20 20  P_NoReduce);.   
26e0: 20 70 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61   p->iRightJoinTa
26f0: 62 6c 65 20 3d 20 28 69 31 36 29 69 54 61 62 6c  ble = (i16)iTabl
2700: 65 3b 0a 20 20 20 20 73 65 74 4a 6f 69 6e 45 78  e;.    setJoinEx
2710: 70 72 28 70 2d 3e 70 4c 65 66 74 2c 20 69 54 61  pr(p->pLeft, iTa
2720: 62 6c 65 29 3b 0a 20 20 20 20 70 20 3d 20 70 2d  ble);.    p = p-
2730: 3e 70 52 69 67 68 74 3b 0a 20 20 7d 20 0a 7d 0a  >pRight;.  } .}.
2740: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
2750: 69 6e 65 20 70 72 6f 63 65 73 73 65 73 20 74 68  ine processes th
2760: 65 20 6a 6f 69 6e 20 69 6e 66 6f 72 6d 61 74 69  e join informati
2770: 6f 6e 20 66 6f 72 20 61 20 53 45 4c 45 43 54 20  on for a SELECT 
2780: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4f 4e  statement..** ON
2790: 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73   and USING claus
27a0: 65 73 20 61 72 65 20 63 6f 6e 76 65 72 74 65 64  es are converted
27b0: 20 69 6e 74 6f 20 65 78 74 72 61 20 74 65 72 6d   into extra term
27c0: 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  s of the WHERE c
27d0: 6c 61 75 73 65 2e 0a 2a 2a 20 4e 41 54 55 52 41  lause..** NATURA
27e0: 4c 20 6a 6f 69 6e 73 20 61 6c 73 6f 20 63 72 65  L joins also cre
27f0: 61 74 65 20 65 78 74 72 61 20 57 48 45 52 45 20  ate extra WHERE 
2800: 63 6c 61 75 73 65 20 74 65 72 6d 73 2e 0a 2a 2a  clause terms..**
2810: 0a 2a 2a 20 54 68 65 20 74 65 72 6d 73 20 6f 66  .** The terms of
2820: 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 61   a FROM clause a
2830: 72 65 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20  re contained in 
2840: 74 68 65 20 53 65 6c 65 63 74 2e 70 53 72 63 20  the Select.pSrc 
2850: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 20 54 68  structure..** Th
2860: 65 20 6c 65 66 74 20 6d 6f 73 74 20 74 61 62 6c  e left most tabl
2870: 65 20 69 73 20 74 68 65 20 66 69 72 73 74 20 65  e is the first e
2880: 6e 74 72 79 20 69 6e 20 53 65 6c 65 63 74 2e 70  ntry in Select.p
2890: 53 72 63 2e 20 20 54 68 65 20 72 69 67 68 74 2d  Src.  The right-
28a0: 6d 6f 73 74 0a 2a 2a 20 74 61 62 6c 65 20 69 73  most.** table is
28b0: 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 2e   the last entry.
28c0: 20 20 54 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61    The join opera
28d0: 74 6f 72 20 69 73 20 68 65 6c 64 20 69 6e 20 74  tor is held in t
28e0: 68 65 20 65 6e 74 72 79 20 74 6f 0a 2a 2a 20 74  he entry to.** t
28f0: 68 65 20 6c 65 66 74 2e 20 20 54 68 75 73 20 65  he left.  Thus e
2900: 6e 74 72 79 20 30 20 63 6f 6e 74 61 69 6e 73 20  ntry 0 contains 
2910: 74 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f  the join operato
2920: 72 20 66 6f 72 20 74 68 65 20 6a 6f 69 6e 20 62  r for the join b
2930: 65 74 77 65 65 6e 0a 2a 2a 20 65 6e 74 72 69 65  etween.** entrie
2940: 73 20 30 20 61 6e 64 20 31 2e 20 20 41 6e 79 20  s 0 and 1.  Any 
2950: 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75  ON or USING clau
2960: 73 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ses associated w
2970: 69 74 68 20 74 68 65 20 6a 6f 69 6e 20 61 72 65  ith the join are
2980: 0a 2a 2a 20 61 6c 73 6f 20 61 74 74 61 63 68 65  .** also attache
2990: 64 20 74 6f 20 74 68 65 20 6c 65 66 74 20 65 6e  d to the left en
29a0: 74 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  try..**.** This 
29b0: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
29c0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72  the number of er
29d0: 72 6f 72 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  rors encountered
29e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
29f0: 73 71 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f 69  sqliteProcessJoi
2a00: 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  n(Parse *pParse,
2a10: 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 53   Select *p){.  S
2a20: 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 20 20 20  rcList *pSrc;   
2a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a40: 2a 20 41 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20  * All tables in 
2a50: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
2a60: 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20  */.  int i, j;  
2a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a80: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
2a90: 6e 74 65 72 73 20 2a 2f 0a 20 20 73 74 72 75 63  nters */.  struc
2aa0: 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
2ab0: 70 4c 65 66 74 3b 20 20 20 20 20 2f 2a 20 4c 65  pLeft;     /* Le
2ac0: 66 74 20 74 61 62 6c 65 20 62 65 69 6e 67 20 6a  ft table being j
2ad0: 6f 69 6e 65 64 20 2a 2f 0a 20 20 73 74 72 75 63  oined */.  struc
2ae0: 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
2af0: 70 52 69 67 68 74 3b 20 20 20 20 2f 2a 20 52 69  pRight;    /* Ri
2b00: 67 68 74 20 74 61 62 6c 65 20 62 65 69 6e 67 20  ght table being 
2b10: 6a 6f 69 6e 65 64 20 2a 2f 0a 0a 20 20 70 53 72  joined */..  pSr
2b20: 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70  c = p->pSrc;.  p
2b30: 4c 65 66 74 20 3d 20 26 70 53 72 63 2d 3e 61 5b  Left = &pSrc->a[
2b40: 30 5d 3b 0a 20 20 70 52 69 67 68 74 20 3d 20 26  0];.  pRight = &
2b50: 70 4c 65 66 74 5b 31 5d 3b 0a 20 20 66 6f 72 28  pLeft[1];.  for(
2b60: 69 3d 30 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72  i=0; i<pSrc->nSr
2b70: 63 2d 31 3b 20 69 2b 2b 2c 20 70 52 69 67 68 74  c-1; i++, pRight
2b80: 2b 2b 2c 20 70 4c 65 66 74 2b 2b 29 7b 0a 20 20  ++, pLeft++){.  
2b90: 20 20 54 61 62 6c 65 20 2a 70 4c 65 66 74 54 61    Table *pLeftTa
2ba0: 62 20 3d 20 70 4c 65 66 74 2d 3e 70 54 61 62 3b  b = pLeft->pTab;
2bb0: 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 52 69 67  .    Table *pRig
2bc0: 68 74 54 61 62 20 3d 20 70 52 69 67 68 74 2d 3e  htTab = pRight->
2bd0: 70 54 61 62 3b 0a 20 20 20 20 69 6e 74 20 69 73  pTab;.    int is
2be0: 4f 75 74 65 72 3b 0a 0a 20 20 20 20 69 66 28 20  Outer;..    if( 
2bf0: 4e 45 56 45 52 28 70 4c 65 66 74 54 61 62 3d 3d  NEVER(pLeftTab==
2c00: 30 20 7c 7c 20 70 52 69 67 68 74 54 61 62 3d 3d  0 || pRightTab==
2c10: 30 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  0) ) continue;. 
2c20: 20 20 20 69 73 4f 75 74 65 72 20 3d 20 28 70 52     isOuter = (pR
2c30: 69 67 68 74 2d 3e 6a 6f 69 6e 74 79 70 65 20 26  ight->jointype &
2c40: 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30 3b 0a 0a   JT_OUTER)!=0;..
2c50: 20 20 20 20 2f 2a 20 57 68 65 6e 20 74 68 65 20      /* When the 
2c60: 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 20  NATURAL keyword 
2c70: 69 73 20 70 72 65 73 65 6e 74 2c 20 61 64 64 20  is present, add 
2c80: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
2c90: 6d 73 20 66 6f 72 0a 20 20 20 20 2a 2a 20 65 76  ms for.    ** ev
2ca0: 65 72 79 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20  ery column that 
2cb0: 74 68 65 20 74 77 6f 20 74 61 62 6c 65 73 20 68  the two tables h
2cc0: 61 76 65 20 69 6e 20 63 6f 6d 6d 6f 6e 2e 0a 20  ave in common.. 
2cd0: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52     */.    if( pR
2ce0: 69 67 68 74 2d 3e 6a 6f 69 6e 74 79 70 65 20 26  ight->jointype &
2cf0: 20 4a 54 5f 4e 41 54 55 52 41 4c 20 29 7b 0a 20   JT_NATURAL ){. 
2d00: 20 20 20 20 20 69 66 28 20 70 52 69 67 68 74 2d       if( pRight-
2d10: 3e 70 4f 6e 20 7c 7c 20 70 52 69 67 68 74 2d 3e  >pOn || pRight->
2d20: 70 55 73 69 6e 67 20 29 7b 0a 20 20 20 20 20 20  pUsing ){.      
2d30: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
2d40: 67 28 70 50 61 72 73 65 2c 20 22 61 20 4e 41 54  g(pParse, "a NAT
2d50: 55 52 41 4c 20 6a 6f 69 6e 20 6d 61 79 20 6e 6f  URAL join may no
2d60: 74 20 68 61 76 65 20 22 0a 20 20 20 20 20 20 20  t have ".       
2d70: 20 20 20 20 22 61 6e 20 4f 4e 20 6f 72 20 55 53      "an ON or US
2d80: 49 4e 47 20 63 6c 61 75 73 65 22 2c 20 30 29 3b  ING clause", 0);
2d90: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2da0: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
2db0: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 52 69 67   for(j=0; j<pRig
2dc0: 68 74 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b  htTab->nCol; j++
2dd0: 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
2de0: 2a 7a 4e 61 6d 65 3b 20 20 20 2f 2a 20 4e 61 6d  *zName;   /* Nam
2df0: 65 20 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 74  e of column in t
2e00: 68 65 20 72 69 67 68 74 20 74 61 62 6c 65 20 2a  he right table *
2e10: 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4c  /.        int iL
2e20: 65 66 74 3b 20 20 20 20 20 2f 2a 20 4d 61 74 63  eft;     /* Matc
2e30: 68 69 6e 67 20 6c 65 66 74 20 74 61 62 6c 65 20  hing left table 
2e40: 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  */.        int i
2e50: 4c 65 66 74 43 6f 6c 3b 20 20 2f 2a 20 4d 61 74  LeftCol;  /* Mat
2e60: 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 69 6e 20  ching column in 
2e70: 74 68 65 20 6c 65 66 74 20 74 61 62 6c 65 20 2a  the left table *
2e80: 2f 0a 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65  /..        zName
2e90: 20 3d 20 70 52 69 67 68 74 54 61 62 2d 3e 61 43   = pRightTab->aC
2ea0: 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  ol[j].zName;.   
2eb0: 20 20 20 20 20 69 66 28 20 74 61 62 6c 65 41 6e       if( tableAn
2ec0: 64 43 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 53 72  dColumnIndex(pSr
2ed0: 63 2c 20 69 2b 31 2c 20 7a 4e 61 6d 65 2c 20 26  c, i+1, zName, &
2ee0: 69 4c 65 66 74 2c 20 26 69 4c 65 66 74 43 6f 6c  iLeft, &iLeftCol
2ef0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  ) ){.          a
2f00: 64 64 57 68 65 72 65 54 65 72 6d 28 70 50 61 72  ddWhereTerm(pPar
2f10: 73 65 2c 20 70 53 72 63 2c 20 69 4c 65 66 74 2c  se, pSrc, iLeft,
2f20: 20 69 4c 65 66 74 43 6f 6c 2c 20 69 2b 31 2c 20   iLeftCol, i+1, 
2f30: 6a 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  j,.             
2f40: 20 20 20 20 20 20 20 20 20 20 69 73 4f 75 74 65            isOute
2f50: 72 2c 20 26 70 2d 3e 70 57 68 65 72 65 29 3b 0a  r, &p->pWhere);.
2f60: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2f70: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
2f80: 44 69 73 61 6c 6c 6f 77 20 62 6f 74 68 20 4f 4e  Disallow both ON
2f90: 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73   and USING claus
2fa0: 65 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20 6a  es in the same j
2fb0: 6f 69 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  oin.    */.    i
2fc0: 66 28 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20 26  f( pRight->pOn &
2fd0: 26 20 70 52 69 67 68 74 2d 3e 70 55 73 69 6e 67  & pRight->pUsing
2fe0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2ff0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
3000: 2c 20 22 63 61 6e 6e 6f 74 20 68 61 76 65 20 62  , "cannot have b
3010: 6f 74 68 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47  oth ON and USING
3020: 20 22 0a 20 20 20 20 20 20 20 20 22 63 6c 61 75   ".        "clau
3030: 73 65 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20  ses in the same 
3040: 6a 6f 69 6e 22 29 3b 0a 20 20 20 20 20 20 72 65  join");.      re
3050: 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 0a 20  turn 1;.    }.. 
3060: 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 4f 4e     /* Add the ON
3070: 20 63 6c 61 75 73 65 20 74 6f 20 74 68 65 20 65   clause to the e
3080: 6e 64 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  nd of the WHERE 
3090: 63 6c 61 75 73 65 2c 20 63 6f 6e 6e 65 63 74 65  clause, connecte
30a0: 64 20 62 79 0a 20 20 20 20 2a 2a 20 61 6e 20 41  d by.    ** an A
30b0: 4e 44 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 20  ND operator..   
30c0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 69 67   */.    if( pRig
30d0: 68 74 2d 3e 70 4f 6e 20 29 7b 0a 20 20 20 20 20  ht->pOn ){.     
30e0: 20 69 66 28 20 69 73 4f 75 74 65 72 20 29 20 73   if( isOuter ) s
30f0: 65 74 4a 6f 69 6e 45 78 70 72 28 70 52 69 67 68  etJoinExpr(pRigh
3100: 74 2d 3e 70 4f 6e 2c 20 70 52 69 67 68 74 2d 3e  t->pOn, pRight->
3110: 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20  iCursor);.      
3120: 70 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69  p->pWhere = sqli
3130: 74 65 33 45 78 70 72 41 6e 64 28 70 50 61 72 73  te3ExprAnd(pPars
3140: 65 2d 3e 64 62 2c 20 70 2d 3e 70 57 68 65 72 65  e->db, p->pWhere
3150: 2c 20 70 52 69 67 68 74 2d 3e 70 4f 6e 29 3b 0a  , pRight->pOn);.
3160: 20 20 20 20 20 20 70 52 69 67 68 74 2d 3e 70 4f        pRight->pO
3170: 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20  n = 0;.    }..  
3180: 20 20 2f 2a 20 43 72 65 61 74 65 20 65 78 74 72    /* Create extr
3190: 61 20 74 65 72 6d 73 20 6f 6e 20 74 68 65 20 57  a terms on the W
31a0: 48 45 52 45 20 63 6c 61 75 73 65 20 66 6f 72 20  HERE clause for 
31b0: 65 61 63 68 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  each column name
31c0: 64 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20  d.    ** in the 
31d0: 55 53 49 4e 47 20 63 6c 61 75 73 65 2e 20 20 45  USING clause.  E
31e0: 78 61 6d 70 6c 65 3a 20 49 66 20 74 68 65 20 74  xample: If the t
31f0: 77 6f 20 74 61 62 6c 65 73 20 74 6f 20 62 65 20  wo tables to be 
3200: 6a 6f 69 6e 65 64 20 61 72 65 20 0a 20 20 20 20  joined are .    
3210: 2a 2a 20 41 20 61 6e 64 20 42 20 61 6e 64 20 74  ** A and B and t
3220: 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20  he USING clause 
3230: 6e 61 6d 65 73 20 58 2c 20 59 2c 20 61 6e 64 20  names X, Y, and 
3240: 5a 2c 20 74 68 65 6e 20 61 64 64 20 74 68 69 73  Z, then add this
3250: 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 57  .    ** to the W
3260: 48 45 52 45 20 63 6c 61 75 73 65 3a 20 20 20 20  HERE clause:    
3270: 41 2e 58 3d 42 2e 58 20 41 4e 44 20 41 2e 59 3d  A.X=B.X AND A.Y=
3280: 42 2e 59 20 41 4e 44 20 41 2e 5a 3d 42 2e 5a 0a  B.Y AND A.Z=B.Z.
3290: 20 20 20 20 2a 2a 20 52 65 70 6f 72 74 20 61 6e      ** Report an
32a0: 20 65 72 72 6f 72 20 69 66 20 61 6e 79 20 63 6f   error if any co
32b0: 6c 75 6d 6e 20 6d 65 6e 74 69 6f 6e 65 64 20 69  lumn mentioned i
32c0: 6e 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75  n the USING clau
32d0: 73 65 20 69 73 0a 20 20 20 20 2a 2a 20 6e 6f 74  se is.    ** not
32e0: 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 62 6f   contained in bo
32f0: 74 68 20 74 61 62 6c 65 73 20 74 6f 20 62 65 20  th tables to be 
3300: 6a 6f 69 6e 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  joined..    */. 
3310: 20 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 70     if( pRight->p
3320: 55 73 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 49  Using ){.      I
3330: 64 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70  dList *pList = p
3340: 52 69 67 68 74 2d 3e 70 55 73 69 6e 67 3b 0a 20  Right->pUsing;. 
3350: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
3360: 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 6a 2b 2b 29  pList->nId; j++)
3370: 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  {.        char *
3380: 7a 4e 61 6d 65 3b 20 20 20 20 20 2f 2a 20 4e 61  zName;     /* Na
3390: 6d 65 20 6f 66 20 74 68 65 20 74 65 72 6d 20 69  me of the term i
33a0: 6e 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75  n the USING clau
33b0: 73 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  se */.        in
33c0: 74 20 69 4c 65 66 74 3b 20 20 20 20 20 20 20 2f  t iLeft;       /
33d0: 2a 20 54 61 62 6c 65 20 6f 6e 20 74 68 65 20 6c  * Table on the l
33e0: 65 66 74 20 77 69 74 68 20 6d 61 74 63 68 69 6e  eft with matchin
33f0: 67 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f  g column name */
3400: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4c 65  .        int iLe
3410: 66 74 43 6f 6c 3b 20 20 20 20 2f 2a 20 43 6f 6c  ftCol;    /* Col
3420: 75 6d 6e 20 6e 75 6d 62 65 72 20 6f 66 20 6d 61  umn number of ma
3430: 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 6f 6e  tching column on
3440: 20 74 68 65 20 6c 65 66 74 20 2a 2f 0a 20 20 20   the left */.   
3450: 20 20 20 20 20 69 6e 74 20 69 52 69 67 68 74 43       int iRightC
3460: 6f 6c 3b 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20  ol;   /* Column 
3470: 6e 75 6d 62 65 72 20 6f 66 20 6d 61 74 63 68 69  number of matchi
3480: 6e 67 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74 68 65  ng column on the
3490: 20 72 69 67 68 74 20 2a 2f 0a 0a 20 20 20 20 20   right */..     
34a0: 20 20 20 7a 4e 61 6d 65 20 3d 20 70 4c 69 73 74     zName = pList
34b0: 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  ->a[j].zName;.  
34c0: 20 20 20 20 20 20 69 52 69 67 68 74 43 6f 6c 20        iRightCol 
34d0: 3d 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 52  = columnIndex(pR
34e0: 69 67 68 74 54 61 62 2c 20 7a 4e 61 6d 65 29 3b  ightTab, zName);
34f0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 52 69  .        if( iRi
3500: 67 68 74 43 6f 6c 3c 30 0a 20 20 20 20 20 20 20  ghtCol<0.       
3510: 20 20 7c 7c 20 21 74 61 62 6c 65 41 6e 64 43 6f    || !tableAndCo
3520: 6c 75 6d 6e 49 6e 64 65 78 28 70 53 72 63 2c 20  lumnIndex(pSrc, 
3530: 69 2b 31 2c 20 7a 4e 61 6d 65 2c 20 26 69 4c 65  i+1, zName, &iLe
3540: 66 74 2c 20 26 69 4c 65 66 74 43 6f 6c 29 0a 20  ft, &iLeftCol). 
3550: 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
3560: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
3570: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63 61 6e  Msg(pParse, "can
3580: 6e 6f 74 20 6a 6f 69 6e 20 75 73 69 6e 67 20 63  not join using c
3590: 6f 6c 75 6d 6e 20 25 73 20 2d 20 63 6f 6c 75 6d  olumn %s - colum
35a0: 6e 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  n ".            
35b0: 22 6e 6f 74 20 70 72 65 73 65 6e 74 20 69 6e 20  "not present in 
35c0: 62 6f 74 68 20 74 61 62 6c 65 73 22 2c 20 7a 4e  both tables", zN
35d0: 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
35e0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
35f0: 20 20 7d 0a 20 20 20 20 20 20 20 20 61 64 64 57    }.        addW
3600: 68 65 72 65 54 65 72 6d 28 70 50 61 72 73 65 2c  hereTerm(pParse,
3610: 20 70 53 72 63 2c 20 69 4c 65 66 74 2c 20 69 4c   pSrc, iLeft, iL
3620: 65 66 74 43 6f 6c 2c 20 69 2b 31 2c 20 69 52 69  eftCol, i+1, iRi
3630: 67 68 74 43 6f 6c 2c 0a 20 20 20 20 20 20 20 20  ghtCol,.        
3640: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f               isO
3650: 75 74 65 72 2c 20 26 70 2d 3e 70 57 68 65 72 65  uter, &p->pWhere
3660: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
3670: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
3680: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74  .}../*.** Insert
3690: 20 63 6f 64 65 20 69 6e 74 6f 20 22 76 22 20 74   code into "v" t
36a0: 68 61 74 20 77 69 6c 6c 20 70 75 73 68 20 74 68  hat will push th
36b0: 65 20 72 65 63 6f 72 64 20 6f 6e 20 74 68 65 20  e record on the 
36c0: 74 6f 70 20 6f 66 20 74 68 65 0a 2a 2a 20 73 74  top of the.** st
36d0: 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 73 6f 72  ack into the sor
36e0: 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ter..*/.static v
36f0: 6f 69 64 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74  oid pushOntoSort
3700: 65 72 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  er(.  Parse *pPa
3710: 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  rse,         /* 
3720: 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  Parser context *
3730: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  /.  ExprList *pO
3740: 72 64 65 72 42 79 2c 20 20 20 20 2f 2a 20 54 68  rderBy,    /* Th
3750: 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
3760: 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  e */.  Select *p
3770: 53 65 6c 65 63 74 2c 20 20 20 20 20 20 20 2f 2a  Select,       /*
3780: 20 54 68 65 20 77 68 6f 6c 65 20 53 45 4c 45 43   The whole SELEC
3790: 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  T statement */. 
37a0: 20 69 6e 74 20 72 65 67 44 61 74 61 20 20 20 20   int regData    
37b0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73          /* Regis
37c0: 74 65 72 20 68 6f 6c 64 69 6e 67 20 64 61 74 61  ter holding data
37d0: 20 74 6f 20 62 65 20 73 6f 72 74 65 64 20 2a 2f   to be sorted */
37e0: 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  .){.  Vdbe *v = 
37f0: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
3800: 20 69 6e 74 20 6e 45 78 70 72 20 3d 20 70 4f 72   int nExpr = pOr
3810: 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20  derBy->nExpr;.  
3820: 69 6e 74 20 72 65 67 42 61 73 65 20 3d 20 73 71  int regBase = sq
3830: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67  lite3GetTempRang
3840: 65 28 70 50 61 72 73 65 2c 20 6e 45 78 70 72 2b  e(pParse, nExpr+
3850: 32 29 3b 0a 20 20 69 6e 74 20 72 65 67 52 65 63  2);.  int regRec
3860: 6f 72 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74  ord = sqlite3Get
3870: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
3880: 0a 20 20 69 6e 74 20 6f 70 3b 0a 20 20 73 71 6c  .  int op;.  sql
3890: 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65  ite3ExprCacheCle
38a0: 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71  ar(pParse);.  sq
38b0: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70  lite3ExprCodeExp
38c0: 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 4f  rList(pParse, pO
38d0: 72 64 65 72 42 79 2c 20 72 65 67 42 61 73 65 2c  rderBy, regBase,
38e0: 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64   0);.  sqlite3Vd
38f0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
3900: 65 71 75 65 6e 63 65 2c 20 70 4f 72 64 65 72 42  equence, pOrderB
3910: 79 2d 3e 69 45 43 75 72 73 6f 72 2c 20 72 65 67  y->iECursor, reg
3920: 42 61 73 65 2b 6e 45 78 70 72 29 3b 0a 20 20 73  Base+nExpr);.  s
3930: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f  qlite3ExprCodeMo
3940: 76 65 28 70 50 61 72 73 65 2c 20 72 65 67 44 61  ve(pParse, regDa
3950: 74 61 2c 20 72 65 67 42 61 73 65 2b 6e 45 78 70  ta, regBase+nExp
3960: 72 2b 31 2c 20 31 29 3b 0a 20 20 73 71 6c 69 74  r+1, 1);.  sqlit
3970: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
3980: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72  OP_MakeRecord, r
3990: 65 67 42 61 73 65 2c 20 6e 45 78 70 72 20 2b 20  egBase, nExpr + 
39a0: 32 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20  2, regRecord);. 
39b0: 20 69 66 28 20 70 53 65 6c 65 63 74 2d 3e 73 65   if( pSelect->se
39c0: 6c 46 6c 61 67 73 20 26 20 53 46 5f 55 73 65 53  lFlags & SF_UseS
39d0: 6f 72 74 65 72 20 29 7b 0a 20 20 20 20 6f 70 20  orter ){.    op 
39e0: 3d 20 4f 50 5f 53 6f 72 74 65 72 49 6e 73 65 72  = OP_SorterInser
39f0: 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  t;.  }else{.    
3a00: 6f 70 20 3d 20 4f 50 5f 49 64 78 49 6e 73 65 72  op = OP_IdxInser
3a10: 74 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  t;.  }.  sqlite3
3a20: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 6f 70  VdbeAddOp2(v, op
3a30: 2c 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75  , pOrderBy->iECu
3a40: 72 73 6f 72 2c 20 72 65 67 52 65 63 6f 72 64 29  rsor, regRecord)
3a50: 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  ;.  sqlite3Relea
3a60: 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
3a70: 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20  , regRecord);.  
3a80: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
3a90: 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
3aa0: 72 65 67 42 61 73 65 2c 20 6e 45 78 70 72 2b 32  regBase, nExpr+2
3ab0: 29 3b 0a 20 20 69 66 28 20 70 53 65 6c 65 63 74  );.  if( pSelect
3ac0: 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20  ->iLimit ){.    
3ad0: 69 6e 74 20 61 64 64 72 31 2c 20 61 64 64 72 32  int addr1, addr2
3ae0: 3b 0a 20 20 20 20 69 6e 74 20 69 4c 69 6d 69 74  ;.    int iLimit
3af0: 3b 0a 20 20 20 20 69 66 28 20 70 53 65 6c 65 63  ;.    if( pSelec
3b00: 74 2d 3e 69 4f 66 66 73 65 74 20 29 7b 0a 20 20  t->iOffset ){.  
3b10: 20 20 20 20 69 4c 69 6d 69 74 20 3d 20 70 53 65      iLimit = pSe
3b20: 6c 65 63 74 2d 3e 69 4f 66 66 73 65 74 2b 31 3b  lect->iOffset+1;
3b30: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
3b40: 20 20 69 4c 69 6d 69 74 20 3d 20 70 53 65 6c 65    iLimit = pSele
3b50: 63 74 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 20 20  ct->iLimit;.    
3b60: 7d 0a 20 20 20 20 61 64 64 72 31 20 3d 20 73 71  }.    addr1 = sq
3b70: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
3b80: 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c 20 69 4c  v, OP_IfZero, iL
3b90: 69 6d 69 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  imit);.    sqlit
3ba0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
3bb0: 4f 50 5f 41 64 64 49 6d 6d 2c 20 69 4c 69 6d 69  OP_AddImm, iLimi
3bc0: 74 2c 20 2d 31 29 3b 0a 20 20 20 20 61 64 64 72  t, -1);.    addr
3bd0: 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  2 = sqlite3VdbeA
3be0: 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp0(v, OP_Goto
3bf0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
3c00: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
3c10: 64 72 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  dr1);.    sqlite
3c20: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
3c30: 50 5f 4c 61 73 74 2c 20 70 4f 72 64 65 72 42 79  P_Last, pOrderBy
3c40: 2d 3e 69 45 43 75 72 73 6f 72 29 3b 0a 20 20 20  ->iECursor);.   
3c50: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
3c60: 70 31 28 76 2c 20 4f 50 5f 44 65 6c 65 74 65 2c  p1(v, OP_Delete,
3c70: 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72   pOrderBy->iECur
3c80: 73 6f 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  sor);.    sqlite
3c90: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
3ca0: 20 61 64 64 72 32 29 3b 0a 20 20 7d 0a 7d 0a 0a   addr2);.  }.}..
3cb0: 2f 2a 0a 2a 2a 20 41 64 64 20 63 6f 64 65 20 74  /*.** Add code t
3cc0: 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  o implement the 
3cd0: 4f 46 46 53 45 54 0a 2a 2f 0a 73 74 61 74 69 63  OFFSET.*/.static
3ce0: 20 76 6f 69 64 20 63 6f 64 65 4f 66 66 73 65 74   void codeOffset
3cf0: 28 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20  (.  Vdbe *v,    
3d00: 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
3d10: 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 69 73  e code into this
3d20: 20 56 4d 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20   VM */.  Select 
3d30: 2a 70 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68  *p,        /* Th
3d40: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
3d50: 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a  nt being coded *
3d60: 2f 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75  /.  int iContinu
3d70: 65 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65  e     /* Jump he
3d80: 72 65 20 74 6f 20 73 6b 69 70 20 74 68 65 20 63  re to skip the c
3d90: 75 72 72 65 6e 74 20 72 65 63 6f 72 64 20 2a 2f  urrent record */
3da0: 0a 29 7b 0a 20 20 69 66 28 20 70 2d 3e 69 4f 66  .){.  if( p->iOf
3db0: 66 73 65 74 20 26 26 20 69 43 6f 6e 74 69 6e 75  fset && iContinu
3dc0: 65 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  e!=0 ){.    int 
3dd0: 61 64 64 72 3b 0a 20 20 20 20 73 71 6c 69 74 65  addr;.    sqlite
3de0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
3df0: 50 5f 41 64 64 49 6d 6d 2c 20 70 2d 3e 69 4f 66  P_AddImm, p->iOf
3e00: 66 73 65 74 2c 20 2d 31 29 3b 0a 20 20 20 20 61  fset, -1);.    a
3e10: 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
3e20: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66  eAddOp1(v, OP_If
3e30: 4e 65 67 2c 20 70 2d 3e 69 4f 66 66 73 65 74 29  Neg, p->iOffset)
3e40: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
3e50: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
3e60: 74 6f 2c 20 30 2c 20 69 43 6f 6e 74 69 6e 75 65  to, 0, iContinue
3e70: 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  );.    VdbeComme
3e80: 6e 74 28 28 76 2c 20 22 73 6b 69 70 20 4f 46 46  nt((v, "skip OFF
3e90: 53 45 54 20 72 65 63 6f 72 64 73 22 29 29 3b 0a  SET records"));.
3ea0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
3eb0: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 29  umpHere(v, addr)
3ec0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ;.  }.}../*.** A
3ed0: 64 64 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c  dd code that wil
3ee0: 6c 20 63 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20  l check to make 
3ef0: 73 75 72 65 20 74 68 65 20 4e 20 72 65 67 69 73  sure the N regis
3f00: 74 65 72 73 20 73 74 61 72 74 69 6e 67 20 61 74  ters starting at
3f10: 20 69 4d 65 6d 0a 2a 2a 20 66 6f 72 6d 20 61 20   iMem.** form a 
3f20: 64 69 73 74 69 6e 63 74 20 65 6e 74 72 79 2e 20  distinct entry. 
3f30: 20 69 54 61 62 20 69 73 20 61 20 73 6f 72 74 69   iTab is a sorti
3f40: 6e 67 20 69 6e 64 65 78 20 74 68 61 74 20 68 6f  ng index that ho
3f50: 6c 64 73 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a  lds previously.*
3f60: 2a 20 73 65 65 6e 20 63 6f 6d 62 69 6e 61 74 69  * seen combinati
3f70: 6f 6e 73 20 6f 66 20 74 68 65 20 4e 20 76 61 6c  ons of the N val
3f80: 75 65 73 2e 20 20 41 20 6e 65 77 20 65 6e 74 72  ues.  A new entr
3f90: 79 20 69 73 20 6d 61 64 65 20 69 6e 20 69 54 61  y is made in iTa
3fa0: 62 0a 2a 2a 20 69 66 20 74 68 65 20 63 75 72 72  b.** if the curr
3fb0: 65 6e 74 20 4e 20 76 61 6c 75 65 73 20 61 72 65  ent N values are
3fc0: 20 6e 65 77 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a 75   new..**.** A ju
3fd0: 6d 70 20 74 6f 20 61 64 64 72 52 65 70 65 61 74  mp to addrRepeat
3fe0: 20 69 73 20 6d 61 64 65 20 61 6e 64 20 74 68 65   is made and the
3ff0: 20 4e 2b 31 20 76 61 6c 75 65 73 20 61 72 65 20   N+1 values are 
4000: 70 6f 70 70 65 64 20 66 72 6f 6d 20 74 68 65 0a  popped from the.
4010: 2a 2a 20 73 74 61 63 6b 20 69 66 20 74 68 65 20  ** stack if the 
4020: 74 6f 70 20 4e 20 65 6c 65 6d 65 6e 74 73 20 61  top N elements a
4030: 72 65 20 6e 6f 74 20 64 69 73 74 69 6e 63 74 2e  re not distinct.
4040: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
4050: 63 6f 64 65 44 69 73 74 69 6e 63 74 28 0a 20 20  codeDistinct(.  
4060: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
4070: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e     /* Parsing an
4080: 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e  d code generatin
4090: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69  g context */.  i
40a0: 6e 74 20 69 54 61 62 2c 20 20 20 20 20 20 20 20  nt iTab,        
40b0: 20 20 2f 2a 20 41 20 73 6f 72 74 69 6e 67 20 69    /* A sorting i
40c0: 6e 64 65 78 20 75 73 65 64 20 74 6f 20 74 65 73  ndex used to tes
40d0: 74 20 66 6f 72 20 64 69 73 74 69 6e 63 74 6e 65  t for distinctne
40e0: 73 73 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ss */.  int addr
40f0: 52 65 70 65 61 74 2c 20 20 20 20 2f 2a 20 4a 75  Repeat,    /* Ju
4100: 6d 70 20 74 6f 20 68 65 72 65 20 69 66 20 6e 6f  mp to here if no
4110: 74 20 64 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20  t distinct */.  
4120: 69 6e 74 20 4e 2c 20 20 20 20 20 20 20 20 20 20  int N,          
4130: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
4140: 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 6e  elements */.  in
4150: 74 20 69 4d 65 6d 20 20 20 20 20 20 20 20 20 20  t iMem          
4160: 20 2f 2a 20 46 69 72 73 74 20 65 6c 65 6d 65 6e   /* First elemen
4170: 74 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a  t */.){.  Vdbe *
4180: 76 3b 0a 20 20 69 6e 74 20 72 31 3b 0a 0a 20 20  v;.  int r1;..  
4190: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
41a0: 65 3b 0a 20 20 72 31 20 3d 20 73 71 6c 69 74 65  e;.  r1 = sqlite
41b0: 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
41c0: 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  se);.  sqlite3Vd
41d0: 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f  beAddOp4Int(v, O
41e0: 50 5f 46 6f 75 6e 64 2c 20 69 54 61 62 2c 20 61  P_Found, iTab, a
41f0: 64 64 72 52 65 70 65 61 74 2c 20 69 4d 65 6d 2c  ddrRepeat, iMem,
4200: 20 4e 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64   N);.  sqlite3Vd
4210: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d  beAddOp3(v, OP_M
4220: 61 6b 65 52 65 63 6f 72 64 2c 20 69 4d 65 6d 2c  akeRecord, iMem,
4230: 20 4e 2c 20 72 31 29 3b 0a 20 20 73 71 6c 69 74   N, r1);.  sqlit
4240: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
4250: 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 54  OP_IdxInsert, iT
4260: 61 62 2c 20 72 31 29 3b 0a 20 20 73 71 6c 69 74  ab, r1);.  sqlit
4270: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
4280: 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 7d 0a  (pParse, r1);.}.
4290: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
42a0: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a  OMIT_SUBQUERY./*
42b0: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 6e 20  .** Generate an 
42c0: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 77 68  error message wh
42d0: 65 6e 20 61 20 53 45 4c 45 43 54 20 69 73 20 75  en a SELECT is u
42e0: 73 65 64 20 77 69 74 68 69 6e 20 61 20 73 75 62  sed within a sub
42f0: 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 28 65  expression.** (e
4300: 78 61 6d 70 6c 65 3a 20 20 22 61 20 49 4e 20 28  xample:  "a IN (
4310: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 61  SELECT * FROM ta
4320: 62 6c 65 29 22 29 20 62 75 74 20 69 74 20 68 61  ble)") but it ha
4330: 73 20 6d 6f 72 65 20 74 68 61 6e 20 31 20 72 65  s more than 1 re
4340: 73 75 6c 74 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e 20  sult.** column. 
4350: 20 57 65 20 64 6f 20 74 68 69 73 20 69 6e 20 61   We do this in a
4360: 20 73 75 62 72 6f 75 74 69 6e 65 20 62 65 63 61   subroutine beca
4370: 75 73 65 20 74 68 65 20 65 72 72 6f 72 20 75 73  use the error us
4380: 65 64 20 74 6f 20 6f 63 63 75 72 0a 2a 2a 20 69  ed to occur.** i
4390: 6e 20 6d 75 6c 74 69 70 6c 65 20 70 6c 61 63 65  n multiple place
43a0: 73 2e 20 20 28 54 68 65 20 65 72 72 6f 72 20 6f  s.  (The error o
43b0: 6e 6c 79 20 6f 63 63 75 72 73 20 69 6e 20 6f 6e  nly occurs in on
43c0: 65 20 70 6c 61 63 65 20 6e 6f 77 2c 20 62 75 74  e place now, but
43d0: 20 77 65 0a 2a 2a 20 72 65 74 61 69 6e 20 74 68   we.** retain th
43e0: 65 20 73 75 62 72 6f 75 74 69 6e 65 20 74 6f 20  e subroutine to 
43f0: 6d 69 6e 69 6d 69 7a 65 20 63 6f 64 65 20 64 69  minimize code di
4400: 73 72 75 70 74 69 6f 6e 2e 29 0a 2a 2f 0a 73 74  sruption.).*/.st
4410: 61 74 69 63 20 69 6e 74 20 63 68 65 63 6b 46 6f  atic int checkFo
4420: 72 4d 75 6c 74 69 43 6f 6c 75 6d 6e 53 65 6c 65  rMultiColumnSele
4430: 63 74 45 72 72 6f 72 28 0a 20 20 50 61 72 73 65  ctError(.  Parse
4440: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
4450: 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74  /* Parse context
4460: 2e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  . */.  SelectDes
4470: 74 20 2a 70 44 65 73 74 2c 20 20 20 2f 2a 20 44  t *pDest,   /* D
4480: 65 73 74 69 6e 61 74 69 6f 6e 20 6f 66 20 53 45  estination of SE
4490: 4c 45 43 54 20 72 65 73 75 6c 74 73 20 2a 2f 0a  LECT results */.
44a0: 20 20 69 6e 74 20 6e 45 78 70 72 20 20 20 20 20    int nExpr     
44b0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
44c0: 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d   of result colum
44d0: 6e 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 53  ns returned by S
44e0: 45 4c 45 43 54 20 2a 2f 0a 29 7b 0a 20 20 69 6e  ELECT */.){.  in
44f0: 74 20 65 44 65 73 74 20 3d 20 70 44 65 73 74 2d  t eDest = pDest-
4500: 3e 65 44 65 73 74 3b 0a 20 20 69 66 28 20 6e 45  >eDest;.  if( nE
4510: 78 70 72 3e 31 20 26 26 20 28 65 44 65 73 74 3d  xpr>1 && (eDest=
4520: 3d 53 52 54 5f 4d 65 6d 20 7c 7c 20 65 44 65 73  =SRT_Mem || eDes
4530: 74 3d 3d 53 52 54 5f 53 65 74 29 20 29 7b 0a 20  t==SRT_Set) ){. 
4540: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
4550: 73 67 28 70 50 61 72 73 65 2c 20 22 6f 6e 6c 79  sg(pParse, "only
4560: 20 61 20 73 69 6e 67 6c 65 20 72 65 73 75 6c 74   a single result
4570: 20 61 6c 6c 6f 77 65 64 20 66 6f 72 20 22 0a 20   allowed for ". 
4580: 20 20 20 20 20 20 22 61 20 53 45 4c 45 43 54 20        "a SELECT 
4590: 74 68 61 74 20 69 73 20 70 61 72 74 20 6f 66 20  that is part of 
45a0: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 22 29 3b  an expression");
45b0: 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
45c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
45d0: 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  rn 0;.  }.}.#end
45e0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73  if../*.** An ins
45f0: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
4600: 6c 6f 77 69 6e 67 20 6f 62 6a 65 63 74 20 69 73  lowing object is
4610: 20 75 73 65 64 20 74 6f 20 72 65 63 6f 72 64 20   used to record 
4620: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  information abou
4630: 74 0a 2a 2a 20 68 6f 77 20 74 6f 20 70 72 6f 63  t.** how to proc
4640: 65 73 73 20 74 68 65 20 44 49 53 54 49 4e 43 54  ess the DISTINCT
4650: 20 6b 65 79 77 6f 72 64 2c 20 74 6f 20 73 69 6d   keyword, to sim
4660: 70 6c 69 66 79 20 70 61 73 73 69 6e 67 20 74 68  plify passing th
4670: 61 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a  at information.*
4680: 2a 20 69 6e 74 6f 20 74 68 65 20 73 65 6c 65 63  * into the selec
4690: 74 49 6e 6e 65 72 4c 6f 6f 70 28 29 20 72 6f 75  tInnerLoop() rou
46a0: 74 69 6e 65 2e 0a 2a 2f 0a 74 79 70 65 64 65 66  tine..*/.typedef
46b0: 20 73 74 72 75 63 74 20 44 69 73 74 69 6e 63 74   struct Distinct
46c0: 43 74 78 20 44 69 73 74 69 6e 63 74 43 74 78 3b  Ctx DistinctCtx;
46d0: 0a 73 74 72 75 63 74 20 44 69 73 74 69 6e 63 74  .struct Distinct
46e0: 43 74 78 20 7b 0a 20 20 75 38 20 69 73 54 6e 63  Ctx {.  u8 isTnc
46f0: 74 3b 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20  t;      /* True 
4700: 69 66 20 74 68 65 20 44 49 53 54 49 4e 43 54 20  if the DISTINCT 
4710: 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65 73 65  keyword is prese
4720: 6e 74 20 2a 2f 0a 20 20 75 38 20 65 54 6e 63 74  nt */.  u8 eTnct
4730: 54 79 70 65 3b 20 20 20 2f 2a 20 4f 6e 65 20 6f  Type;   /* One o
4740: 66 20 74 68 65 20 57 48 45 52 45 5f 44 49 53 54  f the WHERE_DIST
4750: 49 4e 43 54 5f 2a 20 6f 70 65 72 61 74 6f 72 73  INCT_* operators
4760: 20 2a 2f 0a 20 20 69 6e 74 20 74 61 62 54 6e 63   */.  int tabTnc
4770: 74 3b 20 20 20 20 2f 2a 20 45 70 68 65 6d 65 72  t;    /* Ephemer
4780: 61 6c 20 74 61 62 6c 65 20 75 73 65 64 20 66 6f  al table used fo
4790: 72 20 44 49 53 54 49 4e 43 54 20 70 72 6f 63 65  r DISTINCT proce
47a0: 73 73 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 61  ssing */.  int a
47b0: 64 64 72 54 6e 63 74 3b 20 20 20 2f 2a 20 41 64  ddrTnct;   /* Ad
47c0: 64 72 65 73 73 20 6f 66 20 4f 50 5f 4f 70 65 6e  dress of OP_Open
47d0: 45 70 68 65 6d 65 72 61 6c 20 6f 70 63 6f 64 65  Ephemeral opcode
47e0: 20 66 6f 72 20 74 61 62 54 6e 63 74 20 2a 2f 0a   for tabTnct */.
47f0: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  };../*.** This r
4800: 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73  outine generates
4810: 20 74 68 65 20 63 6f 64 65 20 66 6f 72 20 74 68   the code for th
4820: 65 20 69 6e 73 69 64 65 20 6f 66 20 74 68 65 20  e inside of the 
4830: 69 6e 6e 65 72 20 6c 6f 6f 70 0a 2a 2a 20 6f 66  inner loop.** of
4840: 20 61 20 53 45 4c 45 43 54 2e 0a 2a 2a 0a 2a 2a   a SELECT..**.**
4850: 20 49 66 20 73 72 63 54 61 62 20 61 6e 64 20 6e   If srcTab and n
4860: 43 6f 6c 75 6d 6e 20 61 72 65 20 62 6f 74 68 20  Column are both 
4870: 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 70  zero, then the p
4880: 45 4c 69 73 74 20 65 78 70 72 65 73 73 69 6f 6e  EList expression
4890: 73 0a 2a 2a 20 61 72 65 20 65 76 61 6c 75 61 74  s.** are evaluat
48a0: 65 64 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67  ed in order to g
48b0: 65 74 20 74 68 65 20 64 61 74 61 20 66 6f 72 20  et the data for 
48c0: 74 68 69 73 20 72 6f 77 2e 20 20 49 66 20 6e 43  this row.  If nC
48d0: 6f 6c 75 6d 6e 3e 30 0a 2a 2a 20 74 68 65 6e 20  olumn>0.** then 
48e0: 64 61 74 61 20 69 73 20 70 75 6c 6c 65 64 20 66  data is pulled f
48f0: 72 6f 6d 20 73 72 63 54 61 62 20 61 6e 64 20 70  rom srcTab and p
4900: 45 4c 69 73 74 20 69 73 20 75 73 65 64 20 6f 6e  EList is used on
4910: 6c 79 20 74 6f 20 67 65 74 20 74 68 65 0a 2a 2a  ly to get the.**
4920: 20 64 61 74 61 74 79 70 65 73 20 66 6f 72 20 65   datatypes for e
4930: 61 63 68 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 73  ach column..*/.s
4940: 74 61 74 69 63 20 76 6f 69 64 20 73 65 6c 65 63  tatic void selec
4950: 74 49 6e 6e 65 72 4c 6f 6f 70 28 0a 20 20 50 61  tInnerLoop(.  Pa
4960: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
4970: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
4980: 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ser context */. 
4990: 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
49a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
49b0: 63 6f 6d 70 6c 65 74 65 20 73 65 6c 65 63 74 20  complete select 
49c0: 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20  statement being 
49d0: 63 6f 64 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c  coded */.  ExprL
49e0: 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20  ist *pEList,    
49f0: 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 76 61     /* List of va
4a00: 6c 75 65 73 20 62 65 69 6e 67 20 65 78 74 72 61  lues being extra
4a10: 63 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 73 72  cted */.  int sr
4a20: 63 54 61 62 2c 20 20 20 20 20 20 20 20 20 20 20  cTab,           
4a30: 20 20 2f 2a 20 50 75 6c 6c 20 64 61 74 61 20 66    /* Pull data f
4a40: 72 6f 6d 20 74 68 69 73 20 74 61 62 6c 65 20 2a  rom this table *
4a50: 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e 2c  /.  int nColumn,
4a60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
4a70: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
4a80: 20 69 6e 20 74 68 65 20 73 6f 75 72 63 65 20 74   in the source t
4a90: 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69  able */.  ExprLi
4aa0: 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20  st *pOrderBy,   
4ab0: 20 20 2f 2a 20 49 66 20 6e 6f 74 20 4e 55 4c 4c    /* If not NULL
4ac0: 2c 20 73 6f 72 74 20 72 65 73 75 6c 74 73 20 75  , sort results u
4ad0: 73 69 6e 67 20 74 68 69 73 20 6b 65 79 20 2a 2f  sing this key */
4ae0: 0a 20 20 44 69 73 74 69 6e 63 74 43 74 78 20 2a  .  DistinctCtx *
4af0: 70 44 69 73 74 69 6e 63 74 2c 20 2f 2a 20 49 66  pDistinct, /* If
4b00: 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 6e 66 6f 20   not NULL, info 
4b10: 6f 6e 20 68 6f 77 20 74 6f 20 70 72 6f 63 65 73  on how to proces
4b20: 73 20 44 49 53 54 49 4e 43 54 20 2a 2f 0a 20 20  s DISTINCT */.  
4b30: 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73  SelectDest *pDes
4b40: 74 2c 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 74  t,      /* How t
4b50: 6f 20 64 69 73 70 6f 73 65 20 6f 66 20 74 68 65  o dispose of the
4b60: 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e   results */.  in
4b70: 74 20 69 43 6f 6e 74 69 6e 75 65 2c 20 20 20 20  t iContinue,    
4b80: 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
4b90: 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77  re to continue w
4ba0: 69 74 68 20 6e 65 78 74 20 72 6f 77 20 2a 2f 0a  ith next row */.
4bb0: 20 20 69 6e 74 20 69 42 72 65 61 6b 20 20 20 20    int iBreak    
4bc0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d            /* Jum
4bd0: 70 20 68 65 72 65 20 74 6f 20 62 72 65 61 6b 20  p here to break 
4be0: 6f 75 74 20 6f 66 20 74 68 65 20 69 6e 6e 65 72  out of the inner
4bf0: 20 6c 6f 6f 70 20 2a 2f 0a 29 7b 0a 20 20 56 64   loop */.){.  Vd
4c00: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
4c10: 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a  pVdbe;.  int i;.
4c20: 20 20 69 6e 74 20 68 61 73 44 69 73 74 69 6e 63    int hasDistinc
4c30: 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75  t;        /* Tru
4c40: 65 20 69 66 20 74 68 65 20 44 49 53 54 49 4e 43  e if the DISTINC
4c50: 54 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65  T keyword is pre
4c60: 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 72 65  sent */.  int re
4c70: 67 52 65 73 75 6c 74 3b 20 20 20 20 20 20 20 20  gResult;        
4c80: 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f        /* Start o
4c90: 66 20 6d 65 6d 6f 72 79 20 68 6f 6c 64 69 6e 67  f memory holding
4ca0: 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20   result set */. 
4cb0: 20 69 6e 74 20 65 44 65 73 74 20 3d 20 70 44 65   int eDest = pDe
4cc0: 73 74 2d 3e 65 44 65 73 74 3b 20 20 20 2f 2a 20  st->eDest;   /* 
4cd0: 48 6f 77 20 74 6f 20 64 69 73 70 6f 73 65 20 6f  How to dispose o
4ce0: 66 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69  f results */.  i
4cf0: 6e 74 20 69 50 61 72 6d 20 3d 20 70 44 65 73 74  nt iParm = pDest
4d00: 2d 3e 69 53 44 50 61 72 6d 3b 20 2f 2a 20 46 69  ->iSDParm; /* Fi
4d10: 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  rst argument to 
4d20: 64 69 73 70 6f 73 61 6c 20 6d 65 74 68 6f 64 20  disposal method 
4d30: 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 73 75 6c 74  */.  int nResult
4d40: 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Col;            
4d50: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65   /* Number of re
4d60: 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a  sult columns */.
4d70: 0a 20 20 61 73 73 65 72 74 28 20 76 20 29 3b 0a  .  assert( v );.
4d80: 20 20 69 66 28 20 4e 45 56 45 52 28 76 3d 3d 30    if( NEVER(v==0
4d90: 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73  ) ) return;.  as
4da0: 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20  sert( pEList!=0 
4db0: 29 3b 0a 20 20 68 61 73 44 69 73 74 69 6e 63 74  );.  hasDistinct
4dc0: 20 3d 20 70 44 69 73 74 69 6e 63 74 20 3f 20 70   = pDistinct ? p
4dd0: 44 69 73 74 69 6e 63 74 2d 3e 65 54 6e 63 74 54  Distinct->eTnctT
4de0: 79 70 65 20 3a 20 57 48 45 52 45 5f 44 49 53 54  ype : WHERE_DIST
4df0: 49 4e 43 54 5f 4e 4f 4f 50 3b 0a 20 20 69 66 28  INCT_NOOP;.  if(
4e00: 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 26 26 20   pOrderBy==0 && 
4e10: 21 68 61 73 44 69 73 74 69 6e 63 74 20 29 7b 0a  !hasDistinct ){.
4e20: 20 20 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76      codeOffset(v
4e30: 2c 20 70 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b  , p, iContinue);
4e40: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 75 6c 6c 20  .  }..  /* Pull 
4e50: 74 68 65 20 72 65 71 75 65 73 74 65 64 20 63 6f  the requested co
4e60: 6c 75 6d 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  lumns..  */.  if
4e70: 28 20 6e 43 6f 6c 75 6d 6e 3e 30 20 29 7b 0a 20  ( nColumn>0 ){. 
4e80: 20 20 20 6e 52 65 73 75 6c 74 43 6f 6c 20 3d 20     nResultCol = 
4e90: 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 7d 65 6c 73 65  nColumn;.  }else
4ea0: 7b 0a 20 20 20 20 6e 52 65 73 75 6c 74 43 6f 6c  {.    nResultCol
4eb0: 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   = pEList->nExpr
4ec0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 65 73  ;.  }.  if( pDes
4ed0: 74 2d 3e 69 53 64 73 74 3d 3d 30 20 29 7b 0a 20  t->iSdst==0 ){. 
4ee0: 20 20 20 70 44 65 73 74 2d 3e 69 53 64 73 74 20     pDest->iSdst 
4ef0: 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31  = pParse->nMem+1
4f00: 3b 0a 20 20 20 20 70 44 65 73 74 2d 3e 6e 53 64  ;.    pDest->nSd
4f10: 73 74 20 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b  st = nResultCol;
4f20: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65  .    pParse->nMe
4f30: 6d 20 2b 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b  m += nResultCol;
4f40: 0a 20 20 7d 65 6c 73 65 7b 20 0a 20 20 20 20 61  .  }else{ .    a
4f50: 73 73 65 72 74 28 20 70 44 65 73 74 2d 3e 6e 53  ssert( pDest->nS
4f60: 64 73 74 3d 3d 6e 52 65 73 75 6c 74 43 6f 6c 20  dst==nResultCol 
4f70: 29 3b 0a 20 20 7d 0a 20 20 72 65 67 52 65 73 75  );.  }.  regResu
4f80: 6c 74 20 3d 20 70 44 65 73 74 2d 3e 69 53 64 73  lt = pDest->iSds
4f90: 74 3b 0a 20 20 69 66 28 20 6e 43 6f 6c 75 6d 6e  t;.  if( nColumn
4fa0: 3e 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  >0 ){.    for(i=
4fb0: 30 3b 20 69 3c 6e 43 6f 6c 75 6d 6e 3b 20 69 2b  0; i<nColumn; i+
4fc0: 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
4fd0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
4fe0: 50 5f 43 6f 6c 75 6d 6e 2c 20 73 72 63 54 61 62  P_Column, srcTab
4ff0: 2c 20 69 2c 20 72 65 67 52 65 73 75 6c 74 2b 69  , i, regResult+i
5000: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
5010: 20 69 66 28 20 65 44 65 73 74 21 3d 53 52 54 5f   if( eDest!=SRT_
5020: 45 78 69 73 74 73 20 29 7b 0a 20 20 20 20 2f 2a  Exists ){.    /*
5030: 20 49 66 20 74 68 65 20 64 65 73 74 69 6e 61 74   If the destinat
5040: 69 6f 6e 20 69 73 20 61 6e 20 45 58 49 53 54 53  ion is an EXISTS
5050: 28 2e 2e 2e 29 20 65 78 70 72 65 73 73 69 6f 6e  (...) expression
5060: 2c 20 74 68 65 20 61 63 74 75 61 6c 0a 20 20 20  , the actual.   
5070: 20 2a 2a 20 76 61 6c 75 65 73 20 72 65 74 75 72   ** values retur
5080: 6e 65 64 20 62 79 20 74 68 65 20 53 45 4c 45 43  ned by the SELEC
5090: 54 20 61 72 65 20 6e 6f 74 20 72 65 71 75 69 72  T are not requir
50a0: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  ed..    */.    s
50b0: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78  qlite3ExprCodeEx
50c0: 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
50d0: 45 4c 69 73 74 2c 20 72 65 67 52 65 73 75 6c 74  EList, regResult
50e0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
50f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 65                (e
5100: 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74  Dest==SRT_Output
5110: 29 3f 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55  )?SQLITE_ECEL_DU
5120: 50 3a 30 29 3b 0a 20 20 7d 0a 20 20 6e 43 6f 6c  P:0);.  }.  nCol
5130: 75 6d 6e 20 3d 20 6e 52 65 73 75 6c 74 43 6f 6c  umn = nResultCol
5140: 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 44  ;..  /* If the D
5150: 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20  ISTINCT keyword 
5160: 77 61 73 20 70 72 65 73 65 6e 74 20 6f 6e 20 74  was present on t
5170: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
5180: 65 6e 74 0a 20 20 2a 2a 20 61 6e 64 20 74 68 69  ent.  ** and thi
5190: 73 20 72 6f 77 20 68 61 73 20 62 65 65 6e 20 73  s row has been s
51a0: 65 65 6e 20 62 65 66 6f 72 65 2c 20 74 68 65 6e  een before, then
51b0: 20 64 6f 20 6e 6f 74 20 6d 61 6b 65 20 74 68 69   do not make thi
51c0: 73 20 72 6f 77 0a 20 20 2a 2a 20 70 61 72 74 20  s row.  ** part 
51d0: 6f 66 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 20  of the result.. 
51e0: 20 2a 2f 0a 20 20 69 66 28 20 68 61 73 44 69 73   */.  if( hasDis
51f0: 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 61 73 73  tinct ){.    ass
5200: 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20 29  ert( pEList!=0 )
5210: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45  ;.    assert( pE
5220: 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 6e 43 6f  List->nExpr==nCo
5230: 6c 75 6d 6e 20 29 3b 0a 20 20 20 20 73 77 69 74  lumn );.    swit
5240: 63 68 28 20 70 44 69 73 74 69 6e 63 74 2d 3e 65  ch( pDistinct->e
5250: 54 6e 63 74 54 79 70 65 20 29 7b 0a 20 20 20 20  TnctType ){.    
5260: 20 20 63 61 73 65 20 57 48 45 52 45 5f 44 49 53    case WHERE_DIS
5270: 54 49 4e 43 54 5f 4f 52 44 45 52 45 44 3a 20 7b  TINCT_ORDERED: {
5280: 0a 20 20 20 20 20 20 20 20 56 64 62 65 4f 70 20  .        VdbeOp 
5290: 2a 70 4f 70 3b 20 20 20 20 20 20 20 20 20 20 20  *pOp;           
52a0: 20 2f 2a 20 4e 6f 20 6c 6f 6e 67 65 72 20 72 65   /* No longer re
52b0: 71 75 69 72 65 64 20 4f 70 65 6e 45 70 68 65 6d  quired OpenEphem
52c0: 65 72 61 6c 20 69 6e 73 74 72 2e 20 2a 2f 0a 20  eral instr. */. 
52d0: 20 20 20 20 20 20 20 69 6e 74 20 69 4a 75 6d 70         int iJump
52e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
52f0: 2a 20 4a 75 6d 70 20 64 65 73 74 69 6e 61 74 69  * Jump destinati
5300: 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  on */.        in
5310: 74 20 72 65 67 50 72 65 76 3b 20 20 20 20 20 20  t regPrev;      
5320: 20 20 20 20 20 20 2f 2a 20 50 72 65 76 69 6f 75        /* Previou
5330: 73 20 72 6f 77 20 63 6f 6e 74 65 6e 74 20 2a 2f  s row content */
5340: 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c  ..        /* All
5350: 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20  ocate space for 
5360: 74 68 65 20 70 72 65 76 69 6f 75 73 20 72 6f 77  the previous row
5370: 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 67 50   */.        regP
5380: 72 65 76 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  rev = pParse->nM
5390: 65 6d 2b 31 3b 0a 20 20 20 20 20 20 20 20 70 50  em+1;.        pP
53a0: 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 43  arse->nMem += nC
53b0: 6f 6c 75 6d 6e 3b 0a 0a 20 20 20 20 20 20 20 20  olumn;..        
53c0: 2f 2a 20 43 68 61 6e 67 65 20 74 68 65 20 4f 50  /* Change the OP
53d0: 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 63  _OpenEphemeral c
53e0: 6f 64 65 64 20 65 61 72 6c 69 65 72 20 74 6f 20  oded earlier to 
53f0: 61 6e 20 4f 50 5f 4e 75 6c 6c 0a 20 20 20 20 20  an OP_Null.     
5400: 20 20 20 2a 2a 20 73 65 74 73 20 74 68 65 20 4d     ** sets the M
5410: 45 4d 5f 43 6c 65 61 72 65 64 20 62 69 74 20 6f  EM_Cleared bit o
5420: 6e 20 74 68 65 20 66 69 72 73 74 20 72 65 67 69  n the first regi
5430: 73 74 65 72 20 6f 66 20 74 68 65 0a 20 20 20 20  ster of the.    
5440: 20 20 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 20      ** previous 
5450: 76 61 6c 75 65 2e 20 20 54 68 69 73 20 77 69 6c  value.  This wil
5460: 6c 20 63 61 75 73 65 20 74 68 65 20 4f 50 5f 4e  l cause the OP_N
5470: 65 20 62 65 6c 6f 77 20 74 6f 20 61 6c 77 61 79  e below to alway
5480: 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 61 69  s.        ** fai
5490: 6c 20 6f 6e 20 74 68 65 20 66 69 72 73 74 20 69  l on the first i
54a0: 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  teration of the 
54b0: 6c 6f 6f 70 20 65 76 65 6e 20 69 66 20 74 68 65  loop even if the
54c0: 20 66 69 72 73 74 0a 20 20 20 20 20 20 20 20 2a   first.        *
54d0: 2a 20 72 6f 77 20 69 73 20 61 6c 6c 20 4e 55 4c  * row is all NUL
54e0: 4c 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  Ls..        */. 
54f0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
5500: 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76  beChangeToNoop(v
5510: 2c 20 70 44 69 73 74 69 6e 63 74 2d 3e 61 64 64  , pDistinct->add
5520: 72 54 6e 63 74 29 3b 0a 20 20 20 20 20 20 20 20  rTnct);.        
5530: 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  pOp = sqlite3Vdb
5540: 65 47 65 74 4f 70 28 76 2c 20 70 44 69 73 74 69  eGetOp(v, pDisti
5550: 6e 63 74 2d 3e 61 64 64 72 54 6e 63 74 29 3b 0a  nct->addrTnct);.
5560: 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63          pOp->opc
5570: 6f 64 65 20 3d 20 4f 50 5f 4e 75 6c 6c 3b 0a 20  ode = OP_Null;. 
5580: 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d         pOp->p1 =
5590: 20 31 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d   1;.        pOp-
55a0: 3e 70 32 20 3d 20 72 65 67 50 72 65 76 3b 0a 0a  >p2 = regPrev;..
55b0: 20 20 20 20 20 20 20 20 69 4a 75 6d 70 20 3d 20          iJump = 
55c0: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
55d0: 6e 74 41 64 64 72 28 76 29 20 2b 20 6e 43 6f 6c  ntAddr(v) + nCol
55e0: 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  umn;.        for
55f0: 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 75 6d 6e 3b  (i=0; i<nColumn;
5600: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
5610: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20   CollSeq *pColl 
5620: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
5630: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 45 4c  lSeq(pParse, pEL
5640: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  ist->a[i].pExpr)
5650: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
5660: 69 3c 6e 43 6f 6c 75 6d 6e 2d 31 20 29 7b 0a 20  i<nColumn-1 ){. 
5670: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
5680: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
5690: 4f 50 5f 4e 65 2c 20 72 65 67 52 65 73 75 6c 74  OP_Ne, regResult
56a0: 2b 69 2c 20 69 4a 75 6d 70 2c 20 72 65 67 50 72  +i, iJump, regPr
56b0: 65 76 2b 69 29 3b 0a 20 20 20 20 20 20 20 20 20  ev+i);.         
56c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
56d0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
56e0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 45 71 2c 20  ddOp3(v, OP_Eq, 
56f0: 72 65 67 52 65 73 75 6c 74 2b 69 2c 20 69 43 6f  regResult+i, iCo
5700: 6e 74 69 6e 75 65 2c 20 72 65 67 50 72 65 76 2b  ntinue, regPrev+
5710: 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  i);.          }.
5720: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
5730: 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c  3VdbeChangeP4(v,
5740: 20 2d 31 2c 20 28 63 6f 6e 73 74 20 63 68 61 72   -1, (const char
5750: 20 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c   *)pColl, P4_COL
5760: 4c 53 45 51 29 3b 0a 20 20 20 20 20 20 20 20 20  LSEQ);.         
5770: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
5780: 67 65 50 35 28 76 2c 20 53 51 4c 49 54 45 5f 4e  geP5(v, SQLITE_N
5790: 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 20 20  ULLEQ);.        
57a0: 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  }.        assert
57b0: 28 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  ( sqlite3VdbeCur
57c0: 72 65 6e 74 41 64 64 72 28 76 29 3d 3d 69 4a 75  rentAddr(v)==iJu
57d0: 6d 70 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  mp );.        sq
57e0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
57f0: 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 65 67 52  v, OP_Copy, regR
5800: 65 73 75 6c 74 2c 20 72 65 67 50 72 65 76 2c 20  esult, regPrev, 
5810: 6e 43 6f 6c 75 6d 6e 2d 31 29 3b 0a 20 20 20 20  nColumn-1);.    
5820: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
5830: 20 7d 0a 0a 20 20 20 20 20 20 63 61 73 65 20 57   }..      case W
5840: 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e  HERE_DISTINCT_UN
5850: 49 51 55 45 3a 20 7b 0a 20 20 20 20 20 20 20 20  IQUE: {.        
5860: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
5870: 65 54 6f 4e 6f 6f 70 28 76 2c 20 70 44 69 73 74  eToNoop(v, pDist
5880: 69 6e 63 74 2d 3e 61 64 64 72 54 6e 63 74 29 3b  inct->addrTnct);
5890: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
58a0: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 64        }..      d
58b0: 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
58c0: 20 20 61 73 73 65 72 74 28 20 70 44 69 73 74 69    assert( pDisti
58d0: 6e 63 74 2d 3e 65 54 6e 63 74 54 79 70 65 3d 3d  nct->eTnctType==
58e0: 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55  WHERE_DISTINCT_U
58f0: 4e 4f 52 44 45 52 45 44 20 29 3b 0a 20 20 20 20  NORDERED );.    
5900: 20 20 20 20 63 6f 64 65 44 69 73 74 69 6e 63 74      codeDistinct
5910: 28 70 50 61 72 73 65 2c 20 70 44 69 73 74 69 6e  (pParse, pDistin
5920: 63 74 2d 3e 74 61 62 54 6e 63 74 2c 20 69 43 6f  ct->tabTnct, iCo
5930: 6e 74 69 6e 75 65 2c 20 6e 43 6f 6c 75 6d 6e 2c  ntinue, nColumn,
5940: 20 72 65 67 52 65 73 75 6c 74 29 3b 0a 20 20 20   regResult);.   
5950: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
5960: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
5970: 28 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b  ( pOrderBy==0 ){
5980: 0a 20 20 20 20 20 20 63 6f 64 65 4f 66 66 73 65  .      codeOffse
5990: 74 28 76 2c 20 70 2c 20 69 43 6f 6e 74 69 6e 75  t(v, p, iContinu
59a0: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  e);.    }.  }.. 
59b0: 20 73 77 69 74 63 68 28 20 65 44 65 73 74 20 29   switch( eDest )
59c0: 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73  {.    /* In this
59d0: 20 6d 6f 64 65 2c 20 77 72 69 74 65 20 65 61 63   mode, write eac
59e0: 68 20 71 75 65 72 79 20 72 65 73 75 6c 74 20 74  h query result t
59f0: 6f 20 74 68 65 20 6b 65 79 20 6f 66 20 74 68 65  o the key of the
5a00: 20 74 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 2a   temporary.    *
5a10: 2a 20 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a 20  * table iParm.. 
5a20: 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51     */.#ifndef SQ
5a30: 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
5a40: 4e 44 5f 53 45 4c 45 43 54 0a 20 20 20 20 63 61  ND_SELECT.    ca
5a50: 73 65 20 53 52 54 5f 55 6e 69 6f 6e 3a 20 7b 0a  se SRT_Union: {.
5a60: 20 20 20 20 20 20 69 6e 74 20 72 31 3b 0a 20 20        int r1;.  
5a70: 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
5a80: 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
5a90: 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
5aa0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
5ab0: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65  P_MakeRecord, re
5ac0: 67 52 65 73 75 6c 74 2c 20 6e 43 6f 6c 75 6d 6e  gResult, nColumn
5ad0: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  , r1);.      sql
5ae0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
5af0: 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20  , OP_IdxInsert, 
5b00: 69 50 61 72 6d 2c 20 72 31 29 3b 0a 20 20 20 20  iParm, r1);.    
5b10: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
5b20: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
5b30: 72 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  r1);.      break
5b40: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
5b50: 43 6f 6e 73 74 72 75 63 74 20 61 20 72 65 63 6f  Construct a reco
5b60: 72 64 20 66 72 6f 6d 20 74 68 65 20 71 75 65 72  rd from the quer
5b70: 79 20 72 65 73 75 6c 74 2c 20 62 75 74 20 69 6e  y result, but in
5b80: 73 74 65 61 64 20 6f 66 0a 20 20 20 20 2a 2a 20  stead of.    ** 
5b90: 73 61 76 69 6e 67 20 74 68 61 74 20 72 65 63 6f  saving that reco
5ba0: 72 64 2c 20 75 73 65 20 69 74 20 61 73 20 61 20  rd, use it as a 
5bb0: 6b 65 79 20 74 6f 20 64 65 6c 65 74 65 20 65 6c  key to delete el
5bc0: 65 6d 65 6e 74 73 20 66 72 6f 6d 0a 20 20 20 20  ements from.    
5bd0: 2a 2a 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  ** the temporary
5be0: 20 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a 20 20   table iParm..  
5bf0: 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52    */.    case SR
5c00: 54 5f 45 78 63 65 70 74 3a 20 7b 0a 20 20 20 20  T_Except: {.    
5c10: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
5c20: 4f 70 33 28 76 2c 20 4f 50 5f 49 64 78 44 65 6c  Op3(v, OP_IdxDel
5c30: 65 74 65 2c 20 69 50 61 72 6d 2c 20 72 65 67 52  ete, iParm, regR
5c40: 65 73 75 6c 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b  esult, nColumn);
5c50: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
5c60: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
5c70: 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 72 65 73  /* Store the res
5c80: 75 6c 74 20 61 73 20 64 61 74 61 20 75 73 69 6e  ult as data usin
5c90: 67 20 61 20 75 6e 69 71 75 65 20 6b 65 79 2e 0a  g a unique key..
5ca0: 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
5cb0: 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20 20 63  SRT_Table:.    c
5cc0: 61 73 65 20 53 52 54 5f 45 70 68 65 6d 54 61 62  ase SRT_EphemTab
5cd0: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31  : {.      int r1
5ce0: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
5cf0: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
5d00: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44      testcase( eD
5d10: 65 73 74 3d 3d 53 52 54 5f 54 61 62 6c 65 20 29  est==SRT_Table )
5d20: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
5d30: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 45 70 68  ( eDest==SRT_Eph
5d40: 65 6d 54 61 62 20 29 3b 0a 20 20 20 20 20 20 73  emTab );.      s
5d50: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
5d60: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
5d70: 64 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 43  d, regResult, nC
5d80: 6f 6c 75 6d 6e 2c 20 72 31 29 3b 0a 20 20 20 20  olumn, r1);.    
5d90: 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29    if( pOrderBy )
5da0: 7b 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e  {.        pushOn
5db0: 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c  toSorter(pParse,
5dc0: 20 70 4f 72 64 65 72 42 79 2c 20 70 2c 20 72 31   pOrderBy, p, r1
5dd0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
5de0: 20 20 20 20 20 20 20 20 69 6e 74 20 72 32 20 3d          int r2 =
5df0: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
5e00: 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
5e10: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
5e20: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52  ddOp2(v, OP_NewR
5e30: 6f 77 69 64 2c 20 69 50 61 72 6d 2c 20 72 32 29  owid, iParm, r2)
5e40: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
5e50: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
5e60: 50 5f 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c  P_Insert, iParm,
5e70: 20 72 31 2c 20 72 32 29 3b 0a 20 20 20 20 20 20   r1, r2);.      
5e80: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
5e90: 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f  ngeP5(v, OPFLAG_
5ea0: 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 20 20 20  APPEND);.       
5eb0: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
5ec0: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
5ed0: 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  2);.      }.    
5ee0: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
5ef0: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
5f00: 72 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  r1);.      break
5f10: 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66  ;.    }..#ifndef
5f20: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
5f30: 51 55 45 52 59 0a 20 20 20 20 2f 2a 20 49 66 20  QUERY.    /* If 
5f40: 77 65 20 61 72 65 20 63 72 65 61 74 69 6e 67 20  we are creating 
5f50: 61 20 73 65 74 20 66 6f 72 20 61 6e 20 22 65 78  a set for an "ex
5f60: 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e  pr IN (SELECT ..
5f70: 2e 29 22 20 63 6f 6e 73 74 72 75 63 74 2c 0a 20  .)" construct,. 
5f80: 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65     ** then there
5f90: 20 73 68 6f 75 6c 64 20 62 65 20 61 20 73 69 6e   should be a sin
5fa0: 67 6c 65 20 69 74 65 6d 20 6f 6e 20 74 68 65 20  gle item on the 
5fb0: 73 74 61 63 6b 2e 20 20 57 72 69 74 65 20 74 68  stack.  Write th
5fc0: 69 73 0a 20 20 20 20 2a 2a 20 69 74 65 6d 20 69  is.    ** item i
5fd0: 6e 74 6f 20 74 68 65 20 73 65 74 20 74 61 62 6c  nto the set tabl
5fe0: 65 20 77 69 74 68 20 62 6f 67 75 73 20 64 61 74  e with bogus dat
5ff0: 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  a..    */.    ca
6000: 73 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20  se SRT_Set: {.  
6010: 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c      assert( nCol
6020: 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  umn==1 );.      
6030: 70 44 65 73 74 2d 3e 61 66 66 53 64 73 74 20 3d  pDest->affSdst =
6040: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
6050: 20 20 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72     sqlite3Compar
6060: 65 41 66 66 69 6e 69 74 79 28 70 45 4c 69 73 74  eAffinity(pEList
6070: 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20 70 44  ->a[0].pExpr, pD
6080: 65 73 74 2d 3e 61 66 66 53 64 73 74 29 3b 0a 20  est->affSdst);. 
6090: 20 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42       if( pOrderB
60a0: 79 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  y ){.        /* 
60b0: 41 74 20 66 69 72 73 74 20 67 6c 61 6e 63 65 20  At first glance 
60c0: 79 6f 75 20 77 6f 75 6c 64 20 74 68 69 6e 6b 20  you would think 
60d0: 77 65 20 63 6f 75 6c 64 20 6f 70 74 69 6d 69 7a  we could optimiz
60e0: 65 20 6f 75 74 20 74 68 65 0a 20 20 20 20 20 20  e out the.      
60f0: 20 20 2a 2a 20 4f 52 44 45 52 20 42 59 20 69 6e    ** ORDER BY in
6100: 20 74 68 69 73 20 63 61 73 65 20 73 69 6e 63 65   this case since
6110: 20 74 68 65 20 6f 72 64 65 72 20 6f 66 20 65 6e   the order of en
6120: 74 72 69 65 73 20 69 6e 20 74 68 65 20 73 65 74  tries in the set
6130: 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 6f 65 73  .        ** does
6140: 20 6e 6f 74 20 6d 61 74 74 65 72 2e 20 20 42 75   not matter.  Bu
6150: 74 20 74 68 65 72 65 20 6d 69 67 68 74 20 62 65  t there might be
6160: 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 2c   a LIMIT clause,
6170: 20 69 6e 20 77 68 69 63 68 0a 20 20 20 20 20 20   in which.      
6180: 20 20 2a 2a 20 63 61 73 65 20 74 68 65 20 6f 72    ** case the or
6190: 64 65 72 20 64 6f 65 73 20 6d 61 74 74 65 72 20  der does matter 
61a0: 2a 2f 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f  */.        pushO
61b0: 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65  ntoSorter(pParse
61c0: 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 2c 20 72  , pOrderBy, p, r
61d0: 65 67 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 20  egResult);.     
61e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
61f0: 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33  int r1 = sqlite3
6200: 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
6210: 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  e);.        sqli
6220: 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
6230: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
6240: 72 65 67 52 65 73 75 6c 74 2c 31 2c 72 31 2c 20  regResult,1,r1, 
6250: 26 70 44 65 73 74 2d 3e 61 66 66 53 64 73 74 2c  &pDest->affSdst,
6260: 20 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   1);.        sql
6270: 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66  ite3ExprCacheAff
6280: 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72  inityChange(pPar
6290: 73 65 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 31  se, regResult, 1
62a0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
62b0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
62c0: 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50  OP_IdxInsert, iP
62d0: 61 72 6d 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  arm, r1);.      
62e0: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
62f0: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
6300: 72 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  r1);.      }.   
6310: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
6320: 0a 20 20 20 20 2f 2a 20 49 66 20 61 6e 79 20 72  .    /* If any r
6330: 6f 77 20 65 78 69 73 74 20 69 6e 20 74 68 65 20  ow exist in the 
6340: 72 65 73 75 6c 74 20 73 65 74 2c 20 72 65 63 6f  result set, reco
6350: 72 64 20 74 68 61 74 20 66 61 63 74 20 61 6e 64  rd that fact and
6360: 20 61 62 6f 72 74 2e 0a 20 20 20 20 2a 2f 0a 20   abort..    */. 
6370: 20 20 20 63 61 73 65 20 53 52 54 5f 45 78 69 73     case SRT_Exis
6380: 74 73 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  ts: {.      sqli
6390: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
63a0: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20   OP_Integer, 1, 
63b0: 69 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 2f 2a  iParm);.      /*
63c0: 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73   The LIMIT claus
63d0: 65 20 77 69 6c 6c 20 74 65 72 6d 69 6e 61 74 65  e will terminate
63e0: 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73   the loop for us
63f0: 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   */.      break;
6400: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
6410: 66 20 74 68 69 73 20 69 73 20 61 20 73 63 61 6c  f this is a scal
6420: 61 72 20 73 65 6c 65 63 74 20 74 68 61 74 20 69  ar select that i
6430: 73 20 70 61 72 74 20 6f 66 20 61 6e 20 65 78 70  s part of an exp
6440: 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e 0a 20 20  ression, then.  
6450: 20 20 2a 2a 20 73 74 6f 72 65 20 74 68 65 20 72    ** store the r
6460: 65 73 75 6c 74 73 20 69 6e 20 74 68 65 20 61 70  esults in the ap
6470: 70 72 6f 70 72 69 61 74 65 20 6d 65 6d 6f 72 79  propriate memory
6480: 20 63 65 6c 6c 20 61 6e 64 20 62 72 65 61 6b 20   cell and break 
6490: 6f 75 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68  out.    ** of th
64a0: 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20  e scan loop..   
64b0: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
64c0: 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73  _Mem: {.      as
64d0: 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31  sert( nColumn==1
64e0: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f   );.      if( pO
64f0: 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
6500: 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72    pushOntoSorter
6510: 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42  (pParse, pOrderB
6520: 79 2c 20 70 2c 20 72 65 67 52 65 73 75 6c 74 29  y, p, regResult)
6530: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
6540: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
6550: 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73  prCodeMove(pPars
6560: 65 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 69 50  e, regResult, iP
6570: 61 72 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  arm, 1);.       
6580: 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c   /* The LIMIT cl
6590: 61 75 73 65 20 77 69 6c 6c 20 6a 75 6d 70 20 6f  ause will jump o
65a0: 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 66  ut of the loop f
65b0: 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 7d  or us */.      }
65c0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
65d0: 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69    }.#endif /* #i
65e0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
65f0: 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 20  T_SUBQUERY */.. 
6600: 20 20 20 2f 2a 20 53 65 6e 64 20 74 68 65 20 64     /* Send the d
6610: 61 74 61 20 74 6f 20 74 68 65 20 63 61 6c 6c 62  ata to the callb
6620: 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 6f 72 20  ack function or 
6630: 74 6f 20 61 20 73 75 62 72 6f 75 74 69 6e 65 2e  to a subroutine.
6640: 20 20 49 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20    In the.    ** 
6650: 63 61 73 65 20 6f 66 20 61 20 73 75 62 72 6f 75  case of a subrou
6660: 74 69 6e 65 2c 20 74 68 65 20 73 75 62 72 6f 75  tine, the subrou
6670: 74 69 6e 65 20 69 74 73 65 6c 66 20 69 73 20 72  tine itself is r
6680: 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 0a 20  esponsible for. 
6690: 20 20 20 2a 2a 20 70 6f 70 70 69 6e 67 20 74 68     ** popping th
66a0: 65 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20  e data from the 
66b0: 73 74 61 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20  stack..    */.  
66c0: 20 20 63 61 73 65 20 53 52 54 5f 43 6f 72 6f 75    case SRT_Corou
66d0: 74 69 6e 65 3a 0a 20 20 20 20 63 61 73 65 20 53  tine:.    case S
66e0: 52 54 5f 4f 75 74 70 75 74 3a 20 7b 0a 20 20 20  RT_Output: {.   
66f0: 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65     testcase( eDe
6700: 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e  st==SRT_Coroutin
6710: 65 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  e );.      testc
6720: 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f  ase( eDest==SRT_
6730: 4f 75 74 70 75 74 20 29 3b 0a 20 20 20 20 20 20  Output );.      
6740: 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a  if( pOrderBy ){.
6750: 20 20 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d          int r1 =
6760: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
6770: 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
6780: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
6790: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp3(v, OP_Make
67a0: 52 65 63 6f 72 64 2c 20 72 65 67 52 65 73 75 6c  Record, regResul
67b0: 74 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 72 31 29 3b  t, nColumn, r1);
67c0: 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74  .        pushOnt
67d0: 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20  oSorter(pParse, 
67e0: 70 4f 72 64 65 72 42 79 2c 20 70 2c 20 72 31 29  pOrderBy, p, r1)
67f0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
6800: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
6810: 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20  pParse, r1);.   
6820: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 44 65     }else if( eDe
6830: 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e  st==SRT_Coroutin
6840: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  e ){.        sql
6850: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
6860: 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 70 44 65 73  , OP_Yield, pDes
6870: 74 2d 3e 69 53 44 50 61 72 6d 29 3b 0a 20 20 20  t->iSDParm);.   
6880: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
6890: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
68a0: 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74  Op2(v, OP_Result
68b0: 52 6f 77 2c 20 72 65 67 52 65 73 75 6c 74 2c 20  Row, regResult, 
68c0: 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20  nColumn);.      
68d0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
68e0: 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  heAffinityChange
68f0: 28 70 50 61 72 73 65 2c 20 72 65 67 52 65 73 75  (pParse, regResu
6900: 6c 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20  lt, nColumn);.  
6910: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
6920: 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20 21 64  k;.    }..#if !d
6930: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
6940: 49 54 5f 54 52 49 47 47 45 52 29 0a 20 20 20 20  IT_TRIGGER).    
6950: 2f 2a 20 44 69 73 63 61 72 64 20 74 68 65 20 72  /* Discard the r
6960: 65 73 75 6c 74 73 2e 20 20 54 68 69 73 20 69 73  esults.  This is
6970: 20 75 73 65 64 20 66 6f 72 20 53 45 4c 45 43 54   used for SELECT
6980: 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 73 69   statements insi
6990: 64 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 62 6f  de.    ** the bo
69a0: 64 79 20 6f 66 20 61 20 54 52 49 47 47 45 52 2e  dy of a TRIGGER.
69b0: 20 20 54 68 65 20 70 75 72 70 6f 73 65 20 6f 66    The purpose of
69c0: 20 73 75 63 68 20 73 65 6c 65 63 74 73 20 69 73   such selects is
69d0: 20 74 6f 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20   to call.    ** 
69e0: 75 73 65 72 2d 64 65 66 69 6e 65 64 20 66 75 6e  user-defined fun
69f0: 63 74 69 6f 6e 73 20 74 68 61 74 20 68 61 76 65  ctions that have
6a00: 20 73 69 64 65 20 65 66 66 65 63 74 73 2e 20 20   side effects.  
6a10: 57 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 0a 20  We do not care. 
6a20: 20 20 20 2a 2a 20 61 62 6f 75 74 20 74 68 65 20     ** about the 
6a30: 61 63 74 75 61 6c 20 72 65 73 75 6c 74 73 20 6f  actual results o
6a40: 66 20 74 68 65 20 73 65 6c 65 63 74 2e 0a 20 20  f the select..  
6a50: 20 20 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c 74    */.    default
6a60: 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
6a70: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73  ( eDest==SRT_Dis
6a80: 63 61 72 64 20 29 3b 0a 20 20 20 20 20 20 62 72  card );.      br
6a90: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
6aa0: 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70  f.  }..  /* Jump
6ab0: 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74   to the end of t
6ac0: 68 65 20 6c 6f 6f 70 20 69 66 20 74 68 65 20 4c  he loop if the L
6ad0: 49 4d 49 54 20 69 73 20 72 65 61 63 68 65 64 2e  IMIT is reached.
6ae0: 20 20 45 78 63 65 70 74 2c 20 69 66 0a 20 20 2a    Except, if.  *
6af0: 2a 20 74 68 65 72 65 20 69 73 20 61 20 73 6f 72  * there is a sor
6b00: 74 65 72 2c 20 69 6e 20 77 68 69 63 68 20 63 61  ter, in which ca
6b10: 73 65 20 74 68 65 20 73 6f 72 74 65 72 20 68 61  se the sorter ha
6b20: 73 20 61 6c 72 65 61 64 79 20 6c 69 6d 69 74 65  s already limite
6b30: 64 0a 20 20 2a 2a 20 74 68 65 20 6f 75 74 70 75  d.  ** the outpu
6b40: 74 20 66 6f 72 20 75 73 2e 0a 20 20 2a 2f 0a 20  t for us..  */. 
6b50: 20 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d 30   if( pOrderBy==0
6b60: 20 26 26 20 70 2d 3e 69 4c 69 6d 69 74 20 29 7b   && p->iLimit ){
6b70: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
6b80: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 5a  AddOp3(v, OP_IfZ
6b90: 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20  ero, p->iLimit, 
6ba0: 69 42 72 65 61 6b 2c 20 2d 31 29 3b 0a 20 20 7d  iBreak, -1);.  }
6bb0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  .}../*.** Alloca
6bc0: 74 65 20 61 20 4b 65 79 49 6e 66 6f 20 6f 62 6a  te a KeyInfo obj
6bd0: 65 63 74 20 73 75 66 66 69 63 69 65 6e 74 20 66  ect sufficient f
6be0: 6f 72 20 61 6e 20 69 6e 64 65 78 20 6f 66 20 4e  or an index of N
6bf0: 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 20 61 6e 64   key columns and
6c00: 0a 2a 2a 20 58 20 65 78 74 72 61 20 63 6f 6c 75  .** X extra colu
6c10: 6d 6e 73 2e 0a 2a 2f 0a 4b 65 79 49 6e 66 6f 20  mns..*/.KeyInfo 
6c20: 2a 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41  *sqlite3KeyInfoA
6c30: 6c 6c 6f 63 28 73 71 6c 69 74 65 33 20 2a 64 62  lloc(sqlite3 *db
6c40: 2c 20 69 6e 74 20 4e 2c 20 69 6e 74 20 58 29 7b  , int N, int X){
6c50: 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 20 3d 20  .  KeyInfo *p = 
6c60: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
6c70: 65 72 6f 28 30 2c 20 0a 20 20 20 20 20 20 20 20  ero(0, .        
6c80: 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f             sizeo
6c90: 66 28 4b 65 79 49 6e 66 6f 29 20 2b 20 28 4e 2b  f(KeyInfo) + (N+
6ca0: 58 29 2a 28 73 69 7a 65 6f 66 28 43 6f 6c 6c 53  X)*(sizeof(CollS
6cb0: 65 71 2a 29 2b 31 29 29 3b 0a 20 20 69 66 28 20  eq*)+1));.  if( 
6cc0: 70 20 29 7b 0a 20 20 20 20 70 2d 3e 61 53 6f 72  p ){.    p->aSor
6cd0: 74 4f 72 64 65 72 20 3d 20 28 75 38 2a 29 26 70  tOrder = (u8*)&p
6ce0: 2d 3e 61 43 6f 6c 6c 5b 4e 2b 58 5d 3b 0a 20 20  ->aColl[N+X];.  
6cf0: 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 28 75    p->nField = (u
6d00: 31 36 29 4e 3b 0a 20 20 20 20 70 2d 3e 6e 58 46  16)N;.    p->nXF
6d10: 69 65 6c 64 20 3d 20 28 75 31 36 29 58 3b 0a 20  ield = (u16)X;. 
6d20: 20 20 20 70 2d 3e 65 6e 63 20 3d 20 45 4e 43 28     p->enc = ENC(
6d30: 64 62 29 3b 0a 20 20 20 20 70 2d 3e 64 62 20 3d  db);.    p->db =
6d40: 20 64 62 3b 0a 20 20 20 20 70 2d 3e 6e 52 65 66   db;.    p->nRef
6d50: 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 1;.  }else{. 
6d60: 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69     db->mallocFai
6d70: 6c 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72  led = 1;.  }.  r
6d80: 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn p;.}../*.*
6d90: 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20 61 20 4b  * Deallocate a K
6da0: 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a 2f  eyInfo object.*/
6db0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4b 65 79  .void sqlite3Key
6dc0: 49 6e 66 6f 55 6e 72 65 66 28 4b 65 79 49 6e 66  InfoUnref(KeyInf
6dd0: 6f 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 29  o *p){.  if( p )
6de0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
6df0: 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20 20 70  >nRef>0 );.    p
6e00: 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 69 66  ->nRef--;.    if
6e10: 28 20 70 2d 3e 6e 52 65 66 3d 3d 30 20 29 20 73  ( p->nRef==0 ) s
6e20: 71 6c 69 74 65 33 44 62 46 72 65 65 28 30 2c 20  qlite3DbFree(0, 
6e30: 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  p);.  }.}../*.**
6e40: 20 4d 61 6b 65 20 61 20 6e 65 77 20 70 6f 69 6e   Make a new poin
6e50: 74 65 72 20 74 6f 20 61 20 4b 65 79 49 6e 66 6f  ter to a KeyInfo
6e60: 20 6f 62 6a 65 63 74 0a 2a 2f 0a 4b 65 79 49 6e   object.*/.KeyIn
6e70: 66 6f 20 2a 73 71 6c 69 74 65 33 4b 65 79 49 6e  fo *sqlite3KeyIn
6e80: 66 6f 52 65 66 28 4b 65 79 49 6e 66 6f 20 2a 70  foRef(KeyInfo *p
6e90: 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  ){.  if( p ){.  
6ea0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 52 65    assert( p->nRe
6eb0: 66 3e 30 20 29 3b 0a 20 20 20 20 70 2d 3e 6e 52  f>0 );.    p->nR
6ec0: 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ef++;.  }.  retu
6ed0: 72 6e 20 70 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  rn p;.}..#ifdef 
6ee0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a  SQLITE_DEBUG./*.
6ef0: 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
6f00: 66 20 61 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65  f a KeyInfo obje
6f10: 63 74 20 63 61 6e 20 62 65 20 63 68 61 6e 67 65  ct can be change
6f20: 2e 20 20 54 68 65 20 4b 65 79 49 6e 66 6f 20 6f  .  The KeyInfo o
6f30: 62 6a 65 63 74 0a 2a 2a 20 63 61 6e 20 6f 6e 6c  bject.** can onl
6f40: 79 20 62 65 20 63 68 61 6e 67 65 64 20 69 66 20  y be changed if 
6f50: 74 68 69 73 20 69 73 20 6a 75 73 74 20 61 20 73  this is just a s
6f60: 69 6e 67 6c 65 20 72 65 66 65 72 65 6e 63 65 20  ingle reference 
6f70: 74 6f 20 74 68 65 20 6f 62 6a 65 63 74 2e 0a 2a  to the object..*
6f80: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
6f90: 65 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 69  e is used only i
6fa0: 6e 73 69 64 65 20 6f 66 20 61 73 73 65 72 74 28  nside of assert(
6fb0: 29 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f  ) statements..*/
6fc0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 4b 65 79 49  .int sqlite3KeyI
6fd0: 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28 4b  nfoIsWriteable(K
6fe0: 65 79 49 6e 66 6f 20 2a 70 29 7b 20 72 65 74 75  eyInfo *p){ retu
6ff0: 72 6e 20 70 2d 3e 6e 52 65 66 3d 3d 31 3b 20 7d  rn p->nRef==1; }
7000: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
7010: 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a  E_DEBUG */../*.*
7020: 2a 20 47 69 76 65 6e 20 61 6e 20 65 78 70 72 65  * Given an expre
7030: 73 73 69 6f 6e 20 6c 69 73 74 2c 20 67 65 6e 65  ssion list, gene
7040: 72 61 74 65 20 61 20 4b 65 79 49 6e 66 6f 20 73  rate a KeyInfo s
7050: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 72 65  tructure that re
7060: 63 6f 72 64 73 0a 2a 2a 20 74 68 65 20 63 6f 6c  cords.** the col
7070: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
7080: 66 6f 72 20 65 61 63 68 20 65 78 70 72 65 73 73  for each express
7090: 69 6f 6e 20 69 6e 20 74 68 61 74 20 65 78 70 72  ion in that expr
70a0: 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a  ession list..**.
70b0: 2a 2a 20 49 66 20 74 68 65 20 45 78 70 72 4c 69  ** If the ExprLi
70c0: 73 74 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42  st is an ORDER B
70d0: 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20 63 6c  Y or GROUP BY cl
70e0: 61 75 73 65 20 74 68 65 6e 20 74 68 65 20 72 65  ause then the re
70f0: 73 75 6c 74 69 6e 67 0a 2a 2a 20 4b 65 79 49 6e  sulting.** KeyIn
7100: 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20  fo structure is 
7110: 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20  appropriate for 
7120: 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 61 20 76  initializing a v
7130: 69 72 74 75 61 6c 20 69 6e 64 65 78 20 74 6f 0a  irtual index to.
7140: 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 61  ** implement tha
7150: 74 20 63 6c 61 75 73 65 2e 20 20 49 66 20 74 68  t clause.  If th
7160: 65 20 45 78 70 72 4c 69 73 74 20 69 73 20 74 68  e ExprList is th
7170: 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20  e result set of 
7180: 61 20 53 45 4c 45 43 54 0a 2a 2a 20 74 68 65 6e  a SELECT.** then
7190: 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72   the KeyInfo str
71a0: 75 63 74 75 72 65 20 69 73 20 61 70 70 72 6f 70  ucture is approp
71b0: 72 69 61 74 65 20 66 6f 72 20 69 6e 69 74 69 61  riate for initia
71c0: 6c 69 7a 69 6e 67 20 61 20 76 69 72 74 75 61 6c  lizing a virtual
71d0: 0a 2a 2a 20 69 6e 64 65 78 20 74 6f 20 69 6d 70  .** index to imp
71e0: 6c 65 6d 65 6e 74 20 61 20 44 49 53 54 49 4e 43  lement a DISTINC
71f0: 54 20 74 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 53 70  T test..**.** Sp
7200: 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ace to hold the 
7210: 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
7220: 65 20 69 73 20 6f 62 74 61 69 6e 20 66 72 6f 6d  e is obtain from
7230: 20 6d 61 6c 6c 6f 63 2e 20 20 54 68 65 20 63 61   malloc.  The ca
7240: 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f  lling.** functio
7250: 6e 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65  n is responsible
7260: 20 66 6f 72 20 73 65 65 69 6e 67 20 74 68 61 74   for seeing that
7270: 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20   this structure 
7280: 69 73 20 65 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a  is eventually.**
7290: 20 66 72 65 65 64 2e 0a 2a 2f 0a 73 74 61 74 69   freed..*/.stati
72a0: 63 20 4b 65 79 49 6e 66 6f 20 2a 6b 65 79 49 6e  c KeyInfo *keyIn
72b0: 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 50  foFromExprList(P
72c0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
72d0: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a  prList *pList){.
72e0: 20 20 69 6e 74 20 6e 45 78 70 72 3b 0a 20 20 4b    int nExpr;.  K
72f0: 65 79 49 6e 66 6f 20 2a 70 49 6e 66 6f 3b 0a 20  eyInfo *pInfo;. 
7300: 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
7310: 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
7320: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
7330: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20  arse->db;.  int 
7340: 69 3b 0a 0a 20 20 6e 45 78 70 72 20 3d 20 70 4c  i;..  nExpr = pL
7350: 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 49  ist->nExpr;.  pI
7360: 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65 79  nfo = sqlite3Key
7370: 49 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e 45  InfoAlloc(db, nE
7380: 78 70 72 2c 20 31 29 3b 0a 20 20 69 66 28 20 70  xpr, 1);.  if( p
7390: 49 6e 66 6f 20 29 7b 0a 20 20 20 20 61 73 73 65  Info ){.    asse
73a0: 72 74 28 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  rt( sqlite3KeyIn
73b0: 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28 70 49  foIsWriteable(pI
73c0: 6e 66 6f 29 20 29 3b 0a 20 20 20 20 66 6f 72 28  nfo) );.    for(
73d0: 69 3d 30 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74  i=0, pItem=pList
73e0: 2d 3e 61 3b 20 69 3c 6e 45 78 70 72 3b 20 69 2b  ->a; i<nExpr; i+
73f0: 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
7400: 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
7410: 6c 3b 0a 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d  l;.      pColl =
7420: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
7430: 53 65 71 28 70 50 61 72 73 65 2c 20 70 49 74 65  Seq(pParse, pIte
7440: 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  m->pExpr);.     
7450: 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 20 70 43   if( !pColl ) pC
7460: 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43  oll = db->pDfltC
7470: 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 49 6e 66 6f  oll;.      pInfo
7480: 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 70 43 6f  ->aColl[i] = pCo
7490: 6c 6c 3b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d  ll;.      pInfo-
74a0: 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d  >aSortOrder[i] =
74b0: 20 70 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65   pItem->sortOrde
74c0: 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  r;.    }.  }.  r
74d0: 65 74 75 72 6e 20 70 49 6e 66 6f 3b 0a 7d 0a 0a  eturn pInfo;.}..
74e0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
74f0: 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
7500: 45 43 54 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65 20 6f  ECT./*.** Name o
7510: 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  f the connection
7520: 20 6f 70 65 72 61 74 6f 72 2c 20 75 73 65 64 20   operator, used 
7530: 66 6f 72 20 65 72 72 6f 72 20 6d 65 73 73 61 67  for error messag
7540: 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  es..*/.static co
7550: 6e 73 74 20 63 68 61 72 20 2a 73 65 6c 65 63 74  nst char *select
7560: 4f 70 4e 61 6d 65 28 69 6e 74 20 69 64 29 7b 0a  OpName(int id){.
7570: 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 73 77 69    char *z;.  swi
7580: 74 63 68 28 20 69 64 20 29 7b 0a 20 20 20 20 63  tch( id ){.    c
7590: 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 20 20 20 20  ase TK_ALL:     
75a0: 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 20 41 4c 4c    z = "UNION ALL
75b0: 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ";   break;.    
75c0: 63 61 73 65 20 54 4b 5f 49 4e 54 45 52 53 45 43  case TK_INTERSEC
75d0: 54 3a 20 7a 20 3d 20 22 49 4e 54 45 52 53 45 43  T: z = "INTERSEC
75e0: 54 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  T";   break;.   
75f0: 20 63 61 73 65 20 54 4b 5f 45 58 43 45 50 54 3a   case TK_EXCEPT:
7600: 20 20 20 20 7a 20 3d 20 22 45 58 43 45 50 54 22      z = "EXCEPT"
7610: 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ;      break;.  
7620: 20 20 64 65 66 61 75 6c 74 3a 20 20 20 20 20 20    default:      
7630: 20 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 22       z = "UNION"
7640: 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;       break;. 
7650: 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d   }.  return z;.}
7660: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
7670: 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
7680: 53 45 4c 45 43 54 20 2a 2f 0a 0a 23 69 66 6e 64  SELECT */..#ifnd
7690: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  ef SQLITE_OMIT_E
76a0: 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 55 6e 6c  XPLAIN./*.** Unl
76b0: 65 73 73 20 61 6e 20 22 45 58 50 4c 41 49 4e 20  ess an "EXPLAIN 
76c0: 51 55 45 52 59 20 50 4c 41 4e 22 20 63 6f 6d 6d  QUERY PLAN" comm
76d0: 61 6e 64 20 69 73 20 62 65 69 6e 67 20 70 72 6f  and is being pro
76e0: 63 65 73 73 65 64 2c 20 74 68 69 73 20 66 75 6e  cessed, this fun
76f0: 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 61 20 6e 6f  ction.** is a no
7700: 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  -op. Otherwise, 
7710: 69 74 20 61 64 64 73 20 61 20 73 69 6e 67 6c 65  it adds a single
7720: 20 72 6f 77 20 6f 66 20 6f 75 74 70 75 74 20 74   row of output t
7730: 6f 20 74 68 65 20 45 51 50 20 72 65 73 75 6c 74  o the EQP result
7740: 2c 0a 2a 2a 20 77 68 65 72 65 20 74 68 65 20 63  ,.** where the c
7750: 61 70 74 69 6f 6e 20 69 73 20 6f 66 20 74 68 65  aption is of the
7760: 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 22   form:.**.**   "
7770: 55 53 45 20 54 45 4d 50 20 42 2d 54 52 45 45 20  USE TEMP B-TREE 
7780: 46 4f 52 20 78 78 78 22 0a 2a 2a 0a 2a 2a 20 77  FOR xxx".**.** w
7790: 68 65 72 65 20 78 78 78 20 69 73 20 6f 6e 65 20  here xxx is one 
77a0: 6f 66 20 22 44 49 53 54 49 4e 43 54 22 2c 20 22  of "DISTINCT", "
77b0: 4f 52 44 45 52 20 42 59 22 20 6f 72 20 22 47 52  ORDER BY" or "GR
77c0: 4f 55 50 20 42 59 22 2e 20 45 78 61 63 74 6c 79  OUP BY". Exactly
77d0: 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 64 65 74   which.** is det
77e0: 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 7a  ermined by the z
77f0: 55 73 61 67 65 20 61 72 67 75 6d 65 6e 74 2e 0a  Usage argument..
7800: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
7810: 78 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65 28  xplainTempTable(
7820: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63  Parse *pParse, c
7830: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 73 61 67  onst char *zUsag
7840: 65 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65  e){.  if( pParse
7850: 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a  ->explain==2 ){.
7860: 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50      Vdbe *v = pP
7870: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 20  arse->pVdbe;.   
7880: 20 63 68 61 72 20 2a 7a 4d 73 67 20 3d 20 73 71   char *zMsg = sq
7890: 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 70 50 61  lite3MPrintf(pPa
78a0: 72 73 65 2d 3e 64 62 2c 20 22 55 53 45 20 54 45  rse->db, "USE TE
78b0: 4d 50 20 42 2d 54 52 45 45 20 46 4f 52 20 25 73  MP B-TREE FOR %s
78c0: 22 2c 20 7a 55 73 61 67 65 29 3b 0a 20 20 20 20  ", zUsage);.    
78d0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
78e0: 34 28 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c  4(v, OP_Explain,
78f0: 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74   pParse->iSelect
7900: 49 64 2c 20 30 2c 20 30 2c 20 7a 4d 73 67 2c 20  Id, 0, 0, zMsg, 
7910: 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d  P4_DYNAMIC);.  }
7920: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e  .}../*.** Assign
7930: 20 65 78 70 72 65 73 73 69 6f 6e 20 62 20 74 6f   expression b to
7940: 20 6c 76 61 6c 75 65 20 61 2e 20 41 20 73 65 63   lvalue a. A sec
7950: 6f 6e 64 2c 20 6e 6f 2d 6f 70 2c 20 76 65 72 73  ond, no-op, vers
7960: 69 6f 6e 20 6f 66 20 74 68 69 73 20 6d 61 63 72  ion of this macr
7970: 6f 0a 2a 2a 20 69 73 20 70 72 6f 76 69 64 65 64  o.** is provided
7980: 20 77 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4d 49   when SQLITE_OMI
7990: 54 5f 45 58 50 4c 41 49 4e 20 69 73 20 64 65 66  T_EXPLAIN is def
79a0: 69 6e 65 64 2e 20 54 68 69 73 20 61 6c 6c 6f 77  ined. This allow
79b0: 73 20 74 68 65 20 63 6f 64 65 0a 2a 2a 20 69 6e  s the code.** in
79c0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29   sqlite3Select()
79d0: 20 74 6f 20 61 73 73 69 67 6e 20 76 61 6c 75 65   to assign value
79e0: 73 20 74 6f 20 73 74 72 75 63 74 75 72 65 20 6d  s to structure m
79f0: 65 6d 62 65 72 20 76 61 72 69 61 62 6c 65 73 20  ember variables 
7a00: 74 68 61 74 0a 2a 2a 20 6f 6e 6c 79 20 65 78 69  that.** only exi
7a10: 73 74 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49  st if SQLITE_OMI
7a20: 54 5f 45 58 50 4c 41 49 4e 20 69 73 20 6e 6f 74  T_EXPLAIN is not
7a30: 20 64 65 66 69 6e 65 64 20 77 69 74 68 6f 75 74   defined without
7a40: 20 70 6f 6c 6c 75 74 69 6e 67 20 74 68 65 0a 2a   polluting the.*
7a50: 2a 20 63 6f 64 65 20 77 69 74 68 20 23 69 66 6e  * code with #ifn
7a60: 64 65 66 20 64 69 72 65 63 74 69 76 65 73 2e 0a  def directives..
7a70: 2a 2f 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c  */.# define expl
7a80: 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 61 2c  ainSetInteger(a,
7a90: 20 62 29 20 61 20 3d 20 62 0a 0a 23 65 6c 73 65   b) a = b..#else
7aa0: 0a 2f 2a 20 4e 6f 2d 6f 70 20 76 65 72 73 69 6f  ./* No-op versio
7ab0: 6e 73 20 6f 66 20 74 68 65 20 65 78 70 6c 61 69  ns of the explai
7ac0: 6e 58 58 58 28 29 20 66 75 6e 63 74 69 6f 6e 73  nXXX() functions
7ad0: 20 61 6e 64 20 6d 61 63 72 6f 73 2e 20 2a 2f 0a   and macros. */.
7ae0: 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69 6e  # define explain
7af0: 54 65 6d 70 54 61 62 6c 65 28 79 2c 7a 29 0a 23  TempTable(y,z).#
7b00: 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69 6e 53   define explainS
7b10: 65 74 49 6e 74 65 67 65 72 28 79 2c 7a 29 0a 23  etInteger(y,z).#
7b20: 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69  endif..#if !defi
7b30: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
7b40: 45 58 50 4c 41 49 4e 29 20 26 26 20 21 64 65 66  EXPLAIN) && !def
7b50: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
7b60: 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
7b70: 29 0a 2f 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 61  )./*.** Unless a
7b80: 6e 20 22 45 58 50 4c 41 49 4e 20 51 55 45 52 59  n "EXPLAIN QUERY
7b90: 20 50 4c 41 4e 22 20 63 6f 6d 6d 61 6e 64 20 69   PLAN" command i
7ba0: 73 20 62 65 69 6e 67 20 70 72 6f 63 65 73 73 65  s being processe
7bb0: 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  d, this function
7bc0: 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20  .** is a no-op. 
7bd0: 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 61 64  Otherwise, it ad
7be0: 64 73 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20  ds a single row 
7bf0: 6f 66 20 6f 75 74 70 75 74 20 74 6f 20 74 68 65  of output to the
7c00: 20 45 51 50 20 72 65 73 75 6c 74 2c 0a 2a 2a 20   EQP result,.** 
7c10: 77 68 65 72 65 20 74 68 65 20 63 61 70 74 69 6f  where the captio
7c20: 6e 20 69 73 20 6f 66 20 6f 6e 65 20 6f 66 20 74  n is of one of t
7c30: 68 65 20 74 77 6f 20 66 6f 72 6d 73 3a 0a 2a 2a  he two forms:.**
7c40: 0a 2a 2a 20 20 20 22 43 4f 4d 50 4f 53 49 54 45  .**   "COMPOSITE
7c50: 20 53 55 42 51 55 45 52 49 45 53 20 69 53 75 62   SUBQUERIES iSub
7c60: 31 20 61 6e 64 20 69 53 75 62 32 20 28 6f 70 29  1 and iSub2 (op)
7c70: 22 0a 2a 2a 20 20 20 22 43 4f 4d 50 4f 53 49 54  ".**   "COMPOSIT
7c80: 45 20 53 55 42 51 55 45 52 49 45 53 20 69 53 75  E SUBQUERIES iSu
7c90: 62 31 20 61 6e 64 20 69 53 75 62 32 20 55 53 49  b1 and iSub2 USI
7ca0: 4e 47 20 54 45 4d 50 20 42 2d 54 52 45 45 20 28  NG TEMP B-TREE (
7cb0: 6f 70 29 22 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65  op)".**.** where
7cc0: 20 69 53 75 62 31 20 61 6e 64 20 69 53 75 62 32   iSub1 and iSub2
7cd0: 20 61 72 65 20 74 68 65 20 69 6e 74 65 67 65 72   are the integer
7ce0: 73 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  s passed as the 
7cf0: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a  corresponding.**
7d00: 20 66 75 6e 63 74 69 6f 6e 20 70 61 72 61 6d 65   function parame
7d10: 74 65 72 73 2c 20 61 6e 64 20 6f 70 20 69 73 20  ters, and op is 
7d20: 74 68 65 20 74 65 78 74 20 72 65 70 72 65 73 65  the text represe
7d30: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 70  ntation of the p
7d40: 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 66 20 74  arameter.** of t
7d50: 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20 54 68  he same name. Th
7d60: 65 20 70 61 72 61 6d 65 74 65 72 20 22 6f 70 22  e parameter "op"
7d70: 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66 20   must be one of 
7d80: 54 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f 45 58 43  TK_UNION, TK_EXC
7d90: 45 50 54 2c 0a 2a 2a 20 54 4b 5f 49 4e 54 45 52  EPT,.** TK_INTER
7da0: 53 45 43 54 20 6f 72 20 54 4b 5f 41 4c 4c 2e 20  SECT or TK_ALL. 
7db0: 54 68 65 20 66 69 72 73 74 20 66 6f 72 6d 20 69  The first form i
7dc0: 73 20 75 73 65 64 20 69 66 20 61 72 67 75 6d 65  s used if argume
7dd0: 6e 74 20 62 55 73 65 54 6d 70 20 69 73 20 0a 2a  nt bUseTmp is .*
7de0: 2a 20 66 61 6c 73 65 2c 20 6f 72 20 74 68 65 20  * false, or the 
7df0: 73 65 63 6f 6e 64 20 66 6f 72 6d 20 69 66 20 69  second form if i
7e00: 74 20 69 73 20 74 72 75 65 2e 0a 2a 2f 0a 73 74  t is true..*/.st
7e10: 61 74 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69  atic void explai
7e20: 6e 43 6f 6d 70 6f 73 69 74 65 28 0a 20 20 50 61  nComposite(.  Pa
7e30: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
7e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7e50: 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a   Parse context *
7e60: 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20  /.  int op,     
7e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7e80: 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 54 4b      /* One of TK
7e90: 5f 55 4e 49 4f 4e 2c 20 54 4b 5f 45 58 43 45 50  _UNION, TK_EXCEP
7ea0: 54 20 65 74 63 2e 20 2a 2f 0a 20 20 69 6e 74 20  T etc. */.  int 
7eb0: 69 53 75 62 31 2c 20 20 20 20 20 20 20 20 20 20  iSub1,          
7ec0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
7ed0: 75 62 71 75 65 72 79 20 69 64 20 31 20 2a 2f 0a  ubquery id 1 */.
7ee0: 20 20 69 6e 74 20 69 53 75 62 32 2c 20 20 20 20    int iSub2,    
7ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f00: 20 20 2f 2a 20 53 75 62 71 75 65 72 79 20 69 64    /* Subquery id
7f10: 20 32 20 2a 2f 0a 20 20 69 6e 74 20 62 55 73 65   2 */.  int bUse
7f20: 54 6d 70 20 20 20 20 20 20 20 20 20 20 20 20 20  Tmp             
7f30: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
7f40: 69 66 20 61 20 74 65 6d 70 20 74 61 62 6c 65 20  if a temp table 
7f50: 77 61 73 20 75 73 65 64 20 2a 2f 0a 29 7b 0a 20  was used */.){. 
7f60: 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 54 4b 5f   assert( op==TK_
7f70: 55 4e 49 4f 4e 20 7c 7c 20 6f 70 3d 3d 54 4b 5f  UNION || op==TK_
7f80: 45 58 43 45 50 54 20 7c 7c 20 6f 70 3d 3d 54 4b  EXCEPT || op==TK
7f90: 5f 49 4e 54 45 52 53 45 43 54 20 7c 7c 20 6f 70  _INTERSECT || op
7fa0: 3d 3d 54 4b 5f 41 4c 4c 20 29 3b 0a 20 20 69 66  ==TK_ALL );.  if
7fb0: 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69  ( pParse->explai
7fc0: 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 56 64 62 65  n==2 ){.    Vdbe
7fd0: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
7fe0: 64 62 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  dbe;.    char *z
7ff0: 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  Msg = sqlite3MPr
8000: 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 70 50  intf(.        pP
8010: 61 72 73 65 2d 3e 64 62 2c 20 22 43 4f 4d 50 4f  arse->db, "COMPO
8020: 55 4e 44 20 53 55 42 51 55 45 52 49 45 53 20 25  UND SUBQUERIES %
8030: 64 20 41 4e 44 20 25 64 20 25 73 28 25 73 29 22  d AND %d %s(%s)"
8040: 2c 20 69 53 75 62 31 2c 20 69 53 75 62 32 2c 0a  , iSub1, iSub2,.
8050: 20 20 20 20 20 20 20 20 62 55 73 65 54 6d 70 3f          bUseTmp?
8060: 22 55 53 49 4e 47 20 54 45 4d 50 20 42 2d 54 52  "USING TEMP B-TR
8070: 45 45 20 22 3a 22 22 2c 20 73 65 6c 65 63 74 4f  EE ":"", selectO
8080: 70 4e 61 6d 65 28 6f 70 29 0a 20 20 20 20 29 3b  pName(op).    );
8090: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
80a0: 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45 78 70  AddOp4(v, OP_Exp
80b0: 6c 61 69 6e 2c 20 70 50 61 72 73 65 2d 3e 69 53  lain, pParse->iS
80c0: 65 6c 65 63 74 49 64 2c 20 30 2c 20 30 2c 20 7a  electId, 0, 0, z
80d0: 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29  Msg, P4_DYNAMIC)
80e0: 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 2f 2a  ;.  }.}.#else./*
80f0: 20 4e 6f 2d 6f 70 20 76 65 72 73 69 6f 6e 73 20   No-op versions 
8100: 6f 66 20 74 68 65 20 65 78 70 6c 61 69 6e 58 58  of the explainXX
8110: 58 28 29 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e  X() functions an
8120: 64 20 6d 61 63 72 6f 73 2e 20 2a 2f 0a 23 20 64  d macros. */.# d
8130: 65 66 69 6e 65 20 65 78 70 6c 61 69 6e 43 6f 6d  efine explainCom
8140: 70 6f 73 69 74 65 28 76 2c 77 2c 78 2c 79 2c 7a  posite(v,w,x,y,z
8150: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
8160: 49 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f  If the inner loo
8170: 70 20 77 61 73 20 67 65 6e 65 72 61 74 65 64 20  p was generated 
8180: 75 73 69 6e 67 20 61 20 6e 6f 6e 2d 6e 75 6c 6c  using a non-null
8190: 20 70 4f 72 64 65 72 42 79 20 61 72 67 75 6d 65   pOrderBy argume
81a0: 6e 74 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20  nt,.** then the 
81b0: 72 65 73 75 6c 74 73 20 77 65 72 65 20 70 6c 61  results were pla
81c0: 63 65 64 20 69 6e 20 61 20 73 6f 72 74 65 72 2e  ced in a sorter.
81d0: 20 20 41 66 74 65 72 20 74 68 65 20 6c 6f 6f 70    After the loop
81e0: 20 69 73 20 74 65 72 6d 69 6e 61 74 65 64 0a 2a   is terminated.*
81f0: 2a 20 77 65 20 6e 65 65 64 20 74 6f 20 72 75 6e  * we need to run
8200: 20 74 68 65 20 73 6f 72 74 65 72 20 61 6e 64 20   the sorter and 
8210: 6f 75 74 70 75 74 20 74 68 65 20 72 65 73 75 6c  output the resul
8220: 74 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  ts.  The followi
8230: 6e 67 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67 65  ng.** routine ge
8240: 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f 64 65  nerates the code
8250: 20 6e 65 65 64 65 64 20 74 6f 20 64 6f 20 74 68   needed to do th
8260: 61 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  at..*/.static vo
8270: 69 64 20 67 65 6e 65 72 61 74 65 53 6f 72 74 54  id generateSortT
8280: 61 69 6c 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ail(.  Parse *pP
8290: 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73  arse,    /* Pars
82a0: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
82b0: 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
82c0: 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54     /* The SELECT
82d0: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
82e0: 56 64 62 65 20 2a 76 2c 20 20 20 20 20 20 20 20  Vdbe *v,        
82f0: 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
8300: 64 65 20 69 6e 74 6f 20 74 68 69 73 20 56 44 42  de into this VDB
8310: 45 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 75  E */.  int nColu
8320: 6d 6e 2c 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62  mn,      /* Numb
8330: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 6f 66  er of columns of
8340: 20 64 61 74 61 20 2a 2f 0a 20 20 53 65 6c 65 63   data */.  Selec
8350: 74 44 65 73 74 20 2a 70 44 65 73 74 20 2f 2a 20  tDest *pDest /* 
8360: 57 72 69 74 65 20 74 68 65 20 73 6f 72 74 65 64  Write the sorted
8370: 20 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f   results here */
8380: 0a 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 42 72  .){.  int addrBr
8390: 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62  eak = sqlite3Vdb
83a0: 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 20 20  eMakeLabel(v);  
83b0: 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
83c0: 74 6f 20 65 78 69 74 20 6c 6f 6f 70 20 2a 2f 0a  to exit loop */.
83d0: 20 20 69 6e 74 20 61 64 64 72 43 6f 6e 74 69 6e    int addrContin
83e0: 75 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ue = sqlite3Vdbe
83f0: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 20 20 2f  MakeLabel(v);  /
8400: 2a 20 4a 75 6d 70 20 68 65 72 65 20 66 6f 72 20  * Jump here for 
8410: 6e 65 78 74 20 63 79 63 6c 65 20 2a 2f 0a 20 20  next cycle */.  
8420: 69 6e 74 20 61 64 64 72 3b 0a 20 20 69 6e 74 20  int addr;.  int 
8430: 69 54 61 62 3b 0a 20 20 69 6e 74 20 70 73 65 75  iTab;.  int pseu
8440: 64 6f 54 61 62 20 3d 20 30 3b 0a 20 20 45 78 70  doTab = 0;.  Exp
8450: 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20  rList *pOrderBy 
8460: 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 0a  = p->pOrderBy;..
8470: 20 20 69 6e 74 20 65 44 65 73 74 20 3d 20 70 44    int eDest = pD
8480: 65 73 74 2d 3e 65 44 65 73 74 3b 0a 20 20 69 6e  est->eDest;.  in
8490: 74 20 69 50 61 72 6d 20 3d 20 70 44 65 73 74 2d  t iParm = pDest-
84a0: 3e 69 53 44 50 61 72 6d 3b 0a 0a 20 20 69 6e 74  >iSDParm;..  int
84b0: 20 72 65 67 52 6f 77 3b 0a 20 20 69 6e 74 20 72   regRow;.  int r
84c0: 65 67 52 6f 77 69 64 3b 0a 0a 20 20 69 54 61 62  egRowid;..  iTab
84d0: 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43   = pOrderBy->iEC
84e0: 75 72 73 6f 72 3b 0a 20 20 72 65 67 52 6f 77 20  ursor;.  regRow 
84f0: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
8500: 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 69  Reg(pParse);.  i
8510: 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75  f( eDest==SRT_Ou
8520: 74 70 75 74 20 7c 7c 20 65 44 65 73 74 3d 3d 53  tput || eDest==S
8530: 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a  RT_Coroutine ){.
8540: 20 20 20 20 70 73 65 75 64 6f 54 61 62 20 3d 20      pseudoTab = 
8550: 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
8560: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
8570: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp3(v, OP_Open
8580: 50 73 65 75 64 6f 2c 20 70 73 65 75 64 6f 54 61  Pseudo, pseudoTa
8590: 62 2c 20 72 65 67 52 6f 77 2c 20 6e 43 6f 6c 75  b, regRow, nColu
85a0: 6d 6e 29 3b 0a 20 20 20 20 72 65 67 52 6f 77 69  mn);.    regRowi
85b0: 64 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  d = 0;.  }else{.
85c0: 20 20 20 20 72 65 67 52 6f 77 69 64 20 3d 20 73      regRowid = s
85d0: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
85e0: 28 70 50 61 72 73 65 29 3b 0a 20 20 7d 0a 20 20  (pParse);.  }.  
85f0: 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  if( p->selFlags 
8600: 26 20 53 46 5f 55 73 65 53 6f 72 74 65 72 20 29  & SF_UseSorter )
8610: 7b 0a 20 20 20 20 69 6e 74 20 72 65 67 53 6f 72  {.    int regSor
8620: 74 4f 75 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d  tOut = ++pParse-
8630: 3e 6e 4d 65 6d 3b 0a 20 20 20 20 69 6e 74 20 70  >nMem;.    int p
8640: 74 61 62 32 20 3d 20 70 50 61 72 73 65 2d 3e 6e  tab2 = pParse->n
8650: 54 61 62 2b 2b 3b 0a 20 20 20 20 73 71 6c 69 74  Tab++;.    sqlit
8660: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
8670: 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f 2c 20 70  OP_OpenPseudo, p
8680: 74 61 62 32 2c 20 72 65 67 53 6f 72 74 4f 75 74  tab2, regSortOut
8690: 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  , pOrderBy->nExp
86a0: 72 2b 32 29 3b 0a 20 20 20 20 61 64 64 72 20 3d  r+2);.    addr =
86b0: 20 31 20 2b 20 73 71 6c 69 74 65 33 56 64 62 65   1 + sqlite3Vdbe
86c0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72  AddOp2(v, OP_Sor
86d0: 74 65 72 53 6f 72 74 2c 20 69 54 61 62 2c 20 61  terSort, iTab, a
86e0: 64 64 72 42 72 65 61 6b 29 3b 0a 20 20 20 20 63  ddrBreak);.    c
86f0: 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2c 20  odeOffset(v, p, 
8700: 61 64 64 72 43 6f 6e 74 69 6e 75 65 29 3b 0a 20  addrContinue);. 
8710: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
8720: 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65  dOp2(v, OP_Sorte
8730: 72 44 61 74 61 2c 20 69 54 61 62 2c 20 72 65 67  rData, iTab, reg
8740: 53 6f 72 74 4f 75 74 29 3b 0a 20 20 20 20 73 71  SortOut);.    sq
8750: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
8760: 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 74  v, OP_Column, pt
8770: 61 62 32 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e  ab2, pOrderBy->n
8780: 45 78 70 72 2b 31 2c 20 72 65 67 52 6f 77 29 3b  Expr+1, regRow);
8790: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
87a0: 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
87b0: 41 47 5f 43 4c 45 41 52 43 41 43 48 45 29 3b 0a  AG_CLEARCACHE);.
87c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 64 64    }else{.    add
87d0: 72 20 3d 20 31 20 2b 20 73 71 6c 69 74 65 33 56  r = 1 + sqlite3V
87e0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
87f0: 53 6f 72 74 2c 20 69 54 61 62 2c 20 61 64 64 72  Sort, iTab, addr
8800: 42 72 65 61 6b 29 3b 0a 20 20 20 20 63 6f 64 65  Break);.    code
8810: 4f 66 66 73 65 74 28 76 2c 20 70 2c 20 61 64 64  Offset(v, p, add
8820: 72 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20  rContinue);.    
8830: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
8840: 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  3(v, OP_Column, 
8850: 69 54 61 62 2c 20 70 4f 72 64 65 72 42 79 2d 3e  iTab, pOrderBy->
8860: 6e 45 78 70 72 2b 31 2c 20 72 65 67 52 6f 77 29  nExpr+1, regRow)
8870: 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63 68 28 20  ;.  }.  switch( 
8880: 65 44 65 73 74 20 29 7b 0a 20 20 20 20 63 61 73  eDest ){.    cas
8890: 65 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20  e SRT_Table:.   
88a0: 20 63 61 73 65 20 53 52 54 5f 45 70 68 65 6d 54   case SRT_EphemT
88b0: 61 62 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74  ab: {.      test
88c0: 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54  case( eDest==SRT
88d0: 5f 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 20 20  _Table );.      
88e0: 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d  testcase( eDest=
88f0: 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29 3b  =SRT_EphemTab );
8900: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
8910: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
8920: 65 77 52 6f 77 69 64 2c 20 69 50 61 72 6d 2c 20  ewRowid, iParm, 
8930: 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  regRowid);.     
8940: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
8950: 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c  p3(v, OP_Insert,
8960: 20 69 50 61 72 6d 2c 20 72 65 67 52 6f 77 2c 20   iParm, regRow, 
8970: 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  regRowid);.     
8980: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
8990: 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41  geP5(v, OPFLAG_A
89a0: 50 50 45 4e 44 29 3b 0a 20 20 20 20 20 20 62 72  PPEND);.      br
89b0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  eak;.    }.#ifnd
89c0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
89d0: 55 42 51 55 45 52 59 0a 20 20 20 20 63 61 73 65  UBQUERY.    case
89e0: 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20   SRT_Set: {.    
89f0: 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d    assert( nColum
8a00: 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71  n==1 );.      sq
8a10: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
8a20: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
8a30: 2c 20 72 65 67 52 6f 77 2c 20 31 2c 20 72 65 67  , regRow, 1, reg
8a40: 52 6f 77 69 64 2c 0a 20 20 20 20 20 20 20 20 20  Rowid,.         
8a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
8a60: 70 44 65 73 74 2d 3e 61 66 66 53 64 73 74 2c 20  pDest->affSdst, 
8a70: 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
8a80: 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69  3ExprCacheAffini
8a90: 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c  tyChange(pParse,
8aa0: 20 72 65 67 52 6f 77 2c 20 31 29 3b 0a 20 20 20   regRow, 1);.   
8ab0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
8ac0: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e  dOp2(v, OP_IdxIn
8ad0: 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 65 67  sert, iParm, reg
8ae0: 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 62 72  Rowid);.      br
8af0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
8b00: 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20  ase SRT_Mem: {. 
8b10: 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f       assert( nCo
8b20: 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20  lumn==1 );.     
8b30: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
8b40: 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 72 65 67  Move(pParse, reg
8b50: 52 6f 77 2c 20 69 50 61 72 6d 2c 20 31 29 3b 0a  Row, iParm, 1);.
8b60: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d        /* The LIM
8b70: 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 74  IT clause will t
8b80: 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f  erminate the loo
8b90: 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20  p for us */.    
8ba0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
8bb0: 65 6e 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c  endif.    defaul
8bc0: 74 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  t: {.      int i
8bd0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
8be0: 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75  eDest==SRT_Outpu
8bf0: 74 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f  t || eDest==SRT_
8c00: 43 6f 72 6f 75 74 69 6e 65 20 29 3b 20 0a 20 20  Coroutine ); .  
8c10: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44      testcase( eD
8c20: 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20  est==SRT_Output 
8c30: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
8c40: 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f  e( eDest==SRT_Co
8c50: 72 6f 75 74 69 6e 65 20 29 3b 0a 20 20 20 20 20  routine );.     
8c60: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c   for(i=0; i<nCol
8c70: 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  umn; i++){.     
8c80: 20 20 20 61 73 73 65 72 74 28 20 72 65 67 52 6f     assert( regRo
8c90: 77 21 3d 70 44 65 73 74 2d 3e 69 53 64 73 74 2b  w!=pDest->iSdst+
8ca0: 69 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  i );.        sql
8cb0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
8cc0: 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 73 65  , OP_Column, pse
8cd0: 75 64 6f 54 61 62 2c 20 69 2c 20 70 44 65 73 74  udoTab, i, pDest
8ce0: 2d 3e 69 53 64 73 74 2b 69 29 3b 0a 20 20 20 20  ->iSdst+i);.    
8cf0: 20 20 20 20 69 66 28 20 69 3d 3d 30 20 29 7b 0a      if( i==0 ){.
8d00: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
8d10: 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
8d20: 20 4f 50 46 4c 41 47 5f 43 4c 45 41 52 43 41 43   OPFLAG_CLEARCAC
8d30: 48 45 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  HE);.        }. 
8d40: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
8d50: 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70   eDest==SRT_Outp
8d60: 75 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ut ){.        sq
8d70: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
8d80: 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c  v, OP_ResultRow,
8d90: 20 70 44 65 73 74 2d 3e 69 53 64 73 74 2c 20 6e   pDest->iSdst, n
8da0: 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20  Column);.       
8db0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
8dc0: 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  eAffinityChange(
8dd0: 70 50 61 72 73 65 2c 20 70 44 65 73 74 2d 3e 69  pParse, pDest->i
8de0: 53 64 73 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a  Sdst, nColumn);.
8df0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
8e00: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
8e10: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65  AddOp1(v, OP_Yie
8e20: 6c 64 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61  ld, pDest->iSDPa
8e30: 72 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rm);.      }.   
8e40: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
8e50: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c    }.  sqlite3Rel
8e60: 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
8e70: 73 65 2c 20 72 65 67 52 6f 77 29 3b 0a 20 20 73  se, regRow);.  s
8e80: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
8e90: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
8ea0: 52 6f 77 69 64 29 3b 0a 0a 20 20 2f 2a 20 54 68  Rowid);..  /* Th
8eb0: 65 20 62 6f 74 74 6f 6d 20 6f 66 20 74 68 65 20  e bottom of the 
8ec0: 6c 6f 6f 70 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  loop.  */.  sqli
8ed0: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
8ee0: 62 65 6c 28 76 2c 20 61 64 64 72 43 6f 6e 74 69  bel(v, addrConti
8ef0: 6e 75 65 29 3b 0a 20 20 69 66 28 20 70 2d 3e 73  nue);.  if( p->s
8f00: 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 55 73 65  elFlags & SF_Use
8f10: 53 6f 72 74 65 72 20 29 7b 0a 20 20 20 20 73 71  Sorter ){.    sq
8f20: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
8f30: 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4e 65 78 74  v, OP_SorterNext
8f40: 2c 20 69 54 61 62 2c 20 61 64 64 72 29 3b 0a 20  , iTab, addr);. 
8f50: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
8f60: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
8f70: 20 4f 50 5f 4e 65 78 74 2c 20 69 54 61 62 2c 20   OP_Next, iTab, 
8f80: 61 64 64 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  addr);.  }.  sql
8f90: 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
8fa0: 61 62 65 6c 28 76 2c 20 61 64 64 72 42 72 65 61  abel(v, addrBrea
8fb0: 6b 29 3b 0a 20 20 69 66 28 20 65 44 65 73 74 3d  k);.  if( eDest=
8fc0: 3d 53 52 54 5f 4f 75 74 70 75 74 20 7c 7c 20 65  =SRT_Output || e
8fd0: 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74  Dest==SRT_Corout
8fe0: 69 6e 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ine ){.    sqlit
8ff0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
9000: 4f 50 5f 43 6c 6f 73 65 2c 20 70 73 65 75 64 6f  OP_Close, pseudo
9010: 54 61 62 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a  Tab, 0);.  }.}..
9020: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  /*.** Return a p
9030: 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74 72 69  ointer to a stri
9040: 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ng containing th
9050: 65 20 27 64 65 63 6c 61 72 61 74 69 6f 6e 20 74  e 'declaration t
9060: 79 70 65 27 20 6f 66 20 74 68 65 0a 2a 2a 20 65  ype' of the.** e
9070: 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e  xpression pExpr.
9080: 20 54 68 65 20 73 74 72 69 6e 67 20 6d 61 79 20   The string may 
9090: 62 65 20 74 72 65 61 74 65 64 20 61 73 20 73 74  be treated as st
90a0: 61 74 69 63 20 62 79 20 74 68 65 20 63 61 6c 6c  atic by the call
90b0: 65 72 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 74  er..**.** Also t
90c0: 72 79 20 74 6f 20 65 73 74 69 6d 61 74 65 20 74  ry to estimate t
90d0: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 72  he size of the r
90e0: 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20 61 6e  eturned value an
90f0: 64 20 72 65 74 75 72 6e 20 74 68 61 74 0a 2a 2a  d return that.**
9100: 20 72 65 73 75 6c 74 20 69 6e 20 2a 70 45 73 74   result in *pEst
9110: 57 69 64 74 68 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  Width..**.** The
9120: 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70   declaration typ
9130: 65 20 69 73 20 74 68 65 20 65 78 61 63 74 20 64  e is the exact d
9140: 61 74 61 74 79 70 65 20 64 65 66 69 6e 69 74 69  atatype definiti
9150: 6f 6e 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  on extracted fro
9160: 6d 20 74 68 65 0a 2a 2a 20 6f 72 69 67 69 6e 61  m the.** origina
9170: 6c 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  l CREATE TABLE s
9180: 74 61 74 65 6d 65 6e 74 20 69 66 20 74 68 65 20  tatement if the 
9190: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20  expression is a 
91a0: 63 6f 6c 75 6d 6e 2e 20 54 68 65 0a 2a 2a 20 64  column. The.** d
91b0: 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20  eclaration type 
91c0: 66 6f 72 20 61 20 52 4f 57 49 44 20 66 69 65 6c  for a ROWID fiel
91d0: 64 20 69 73 20 49 4e 54 45 47 45 52 2e 20 45 78  d is INTEGER. Ex
91e0: 61 63 74 6c 79 20 77 68 65 6e 20 61 6e 20 65 78  actly when an ex
91f0: 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 63  pression.** is c
9200: 6f 6e 73 69 64 65 72 65 64 20 61 20 63 6f 6c 75  onsidered a colu
9210: 6d 6e 20 63 61 6e 20 62 65 20 63 6f 6d 70 6c 65  mn can be comple
9220: 78 20 69 6e 20 74 68 65 20 70 72 65 73 65 6e 63  x in the presenc
9230: 65 20 6f 66 20 73 75 62 71 75 65 72 69 65 73 2e  e of subqueries.
9240: 20 54 68 65 0a 2a 2a 20 72 65 73 75 6c 74 2d 73   The.** result-s
9250: 65 74 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e  et expression in
9260: 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c   all of the foll
9270: 6f 77 69 6e 67 20 53 45 4c 45 43 54 20 73 74 61  owing SELECT sta
9280: 74 65 6d 65 6e 74 73 20 69 73 20 0a 2a 2a 20 63  tements is .** c
9290: 6f 6e 73 69 64 65 72 65 64 20 61 20 63 6f 6c 75  onsidered a colu
92a0: 6d 6e 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  mn by this funct
92b0: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c  ion..**.**   SEL
92c0: 45 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c  ECT col FROM tbl
92d0: 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 28 53  ;.**   SELECT (S
92e0: 45 4c 45 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74  ELECT col FROM t
92f0: 62 6c 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20  bl;.**   SELECT 
9300: 28 53 45 4c 45 43 54 20 63 6f 6c 20 46 52 4f 4d  (SELECT col FROM
9310: 20 74 62 6c 29 3b 0a 2a 2a 20 20 20 53 45 4c 45   tbl);.**   SELE
9320: 43 54 20 61 62 63 20 46 52 4f 4d 20 28 53 45 4c  CT abc FROM (SEL
9330: 45 43 54 20 63 6f 6c 20 41 53 20 61 62 63 20 46  ECT col AS abc F
9340: 52 4f 4d 20 74 62 6c 29 3b 0a 2a 2a 20 0a 2a 2a  ROM tbl);.** .**
9350: 20 54 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e   The declaration
9360: 20 74 79 70 65 20 66 6f 72 20 61 6e 79 20 65 78   type for any ex
9370: 70 72 65 73 73 69 6f 6e 20 6f 74 68 65 72 20 74  pression other t
9380: 68 61 6e 20 61 20 63 6f 6c 75 6d 6e 20 69 73 20  han a column is 
9390: 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  NULL..**.** This
93a0: 20 72 6f 75 74 69 6e 65 20 68 61 73 20 65 69 74   routine has eit
93b0: 68 65 72 20 33 20 6f 72 20 36 20 70 61 72 61 6d  her 3 or 6 param
93c0: 65 74 65 72 73 20 64 65 70 65 6e 64 69 6e 67 20  eters depending 
93d0: 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  on whether or no
93e0: 74 0a 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f  t.** the SQLITE_
93f0: 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45  ENABLE_COLUMN_ME
9400: 54 41 44 41 54 41 20 63 6f 6d 70 69 6c 65 2d 74  TADATA compile-t
9410: 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20 75 73  ime option is us
9420: 65 64 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  ed..*/.#ifdef SQ
9430: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55  LITE_ENABLE_COLU
9440: 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 23 20 64 65  MN_METADATA.# de
9450: 66 69 6e 65 20 63 6f 6c 75 6d 6e 54 79 70 65 28  fine columnType(
9460: 41 2c 42 2c 43 2c 44 2c 45 2c 46 29 20 63 6f 6c  A,B,C,D,E,F) col
9470: 75 6d 6e 54 79 70 65 49 6d 70 6c 28 41 2c 42 2c  umnTypeImpl(A,B,
9480: 43 2c 44 2c 45 2c 46 29 0a 73 74 61 74 69 63 20  C,D,E,F).static 
9490: 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6c 75  const char *colu
94a0: 6d 6e 54 79 70 65 49 6d 70 6c 28 0a 20 20 4e 61  mnTypeImpl(.  Na
94b0: 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20  meContext *pNC, 
94c0: 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 0a  .  Expr *pExpr,.
94d0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70    const char **p
94e0: 7a 4f 72 69 67 44 62 2c 0a 20 20 63 6f 6e 73 74  zOrigDb,.  const
94f0: 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67 54 61   char **pzOrigTa
9500: 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  b,.  const char 
9510: 2a 2a 70 7a 4f 72 69 67 43 6f 6c 2c 0a 20 20 75  **pzOrigCol,.  u
9520: 38 20 2a 70 45 73 74 57 69 64 74 68 0a 29 7b 0a  8 *pEstWidth.){.
9530: 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f    char const *zO
9540: 72 69 67 44 62 20 3d 20 30 3b 0a 20 20 63 68 61  rigDb = 0;.  cha
9550: 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67 54 61  r const *zOrigTa
9560: 62 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 63 6f  b = 0;.  char co
9570: 6e 73 74 20 2a 7a 4f 72 69 67 43 6f 6c 20 3d 20  nst *zOrigCol = 
9580: 30 3b 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 21  0;.#else /* if !
9590: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
95a0: 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54  NABLE_COLUMN_MET
95b0: 41 44 41 54 41 29 20 2a 2f 0a 23 20 64 65 66 69  ADATA) */.# defi
95c0: 6e 65 20 63 6f 6c 75 6d 6e 54 79 70 65 28 41 2c  ne columnType(A,
95d0: 42 2c 43 2c 44 2c 45 2c 46 29 20 63 6f 6c 75 6d  B,C,D,E,F) colum
95e0: 6e 54 79 70 65 49 6d 70 6c 28 41 2c 42 2c 46 29  nTypeImpl(A,B,F)
95f0: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
9600: 61 72 20 2a 63 6f 6c 75 6d 6e 54 79 70 65 49 6d  ar *columnTypeIm
9610: 70 6c 28 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78  pl(.  NameContex
9620: 74 20 2a 70 4e 43 2c 20 0a 20 20 45 78 70 72 20  t *pNC, .  Expr 
9630: 2a 70 45 78 70 72 2c 0a 20 20 75 38 20 2a 70 45  *pExpr,.  u8 *pE
9640: 73 74 57 69 64 74 68 0a 29 7b 0a 23 65 6e 64 69  stWidth.){.#endi
9650: 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51  f /* !defined(SQ
9660: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55  LITE_ENABLE_COLU
9670: 4d 4e 5f 4d 45 54 41 44 41 54 41 29 20 2a 2f 0a  MN_METADATA) */.
9680: 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 54    char const *zT
9690: 79 70 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6a  ype = 0;.  int j
96a0: 3b 0a 20 20 75 38 20 65 73 74 57 69 64 74 68 20  ;.  u8 estWidth 
96b0: 3d 20 31 3b 0a 0a 20 20 69 66 28 20 4e 45 56 45  = 1;..  if( NEVE
96c0: 52 28 70 45 78 70 72 3d 3d 30 29 20 7c 7c 20 70  R(pExpr==0) || p
96d0: 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3d 3d 30 20  NC->pSrcList==0 
96e0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 77  ) return 0;.  sw
96f0: 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20  itch( pExpr->op 
9700: 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  ){.    case TK_A
9710: 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63  GG_COLUMN:.    c
9720: 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b  ase TK_COLUMN: {
9730: 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78  .      /* The ex
9740: 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f  pression is a co
9750: 6c 75 6d 6e 2e 20 4c 6f 63 61 74 65 20 74 68 65  lumn. Locate the
9760: 20 74 61 62 6c 65 20 74 68 65 20 63 6f 6c 75 6d   table the colum
9770: 6e 20 69 73 20 62 65 69 6e 67 0a 20 20 20 20 20  n is being.     
9780: 20 2a 2a 20 65 78 74 72 61 63 74 65 64 20 66 72   ** extracted fr
9790: 6f 6d 20 69 6e 20 4e 61 6d 65 43 6f 6e 74 65 78  om in NameContex
97a0: 74 2e 70 53 72 63 4c 69 73 74 2e 20 54 68 69 73  t.pSrcList. This
97b0: 20 74 61 62 6c 65 20 6d 61 79 20 62 65 20 72 65   table may be re
97c0: 61 6c 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61  al.      ** data
97d0: 62 61 73 65 20 74 61 62 6c 65 20 6f 72 20 61 20  base table or a 
97e0: 73 75 62 71 75 65 72 79 2e 0a 20 20 20 20 20 20  subquery..      
97f0: 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a  */.      Table *
9800: 70 54 61 62 20 3d 20 30 3b 20 20 20 20 20 20 20  pTab = 0;       
9810: 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 73 74       /* Table st
9820: 72 75 63 74 75 72 65 20 63 6f 6c 75 6d 6e 20 69  ructure column i
9830: 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  s extracted from
9840: 20 2a 2f 0a 20 20 20 20 20 20 53 65 6c 65 63 74   */.      Select
9850: 20 2a 70 53 20 3d 20 30 3b 20 20 20 20 20 20 20   *pS = 0;       
9860: 20 20 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 20        /* Select 
9870: 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 65 78  the column is ex
9880: 74 72 61 63 74 65 64 20 66 72 6f 6d 20 2a 2f 0a  tracted from */.
9890: 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d        int iCol =
98a0: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b   pExpr->iColumn;
98b0: 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f    /* Index of co
98c0: 6c 75 6d 6e 20 69 6e 20 70 54 61 62 20 2a 2f 0a  lumn in pTab */.
98d0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
98e0: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47  pExpr->op==TK_AG
98f0: 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20  G_COLUMN );.    
9900: 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
9910: 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op==TK_COLUMN
9920: 20 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28   );.      while(
9930: 20 70 4e 43 20 26 26 20 21 70 54 61 62 20 29 7b   pNC && !pTab ){
9940: 0a 20 20 20 20 20 20 20 20 53 72 63 4c 69 73 74  .        SrcList
9950: 20 2a 70 54 61 62 4c 69 73 74 20 3d 20 70 4e 43   *pTabList = pNC
9960: 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20 20 20  ->pSrcList;.    
9970: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 6a 3c 70 54      for(j=0;j<pT
9980: 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 26 26 20  abList->nSrc && 
9990: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69  pTabList->a[j].i
99a0: 43 75 72 73 6f 72 21 3d 70 45 78 70 72 2d 3e 69  Cursor!=pExpr->i
99b0: 54 61 62 6c 65 3b 6a 2b 2b 29 3b 0a 20 20 20 20  Table;j++);.    
99c0: 20 20 20 20 69 66 28 20 6a 3c 70 54 61 62 4c 69      if( j<pTabLi
99d0: 73 74 2d 3e 6e 53 72 63 20 29 7b 0a 20 20 20 20  st->nSrc ){.    
99e0: 20 20 20 20 20 20 70 54 61 62 20 3d 20 70 54 61        pTab = pTa
99f0: 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 54 61 62  bList->a[j].pTab
9a00: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53 20 3d  ;.          pS =
9a10: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e   pTabList->a[j].
9a20: 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 20  pSelect;.       
9a30: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
9a40: 20 20 70 4e 43 20 3d 20 70 4e 43 2d 3e 70 4e 65    pNC = pNC->pNe
9a50: 78 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  xt;.        }.  
9a60: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28      }..      if(
9a70: 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20   pTab==0 ){.    
9a80: 20 20 20 20 2f 2a 20 41 74 20 6f 6e 65 20 74 69      /* At one ti
9a90: 6d 65 2c 20 63 6f 64 65 20 73 75 63 68 20 61 73  me, code such as
9aa0: 20 22 53 45 4c 45 43 54 20 6e 65 77 2e 78 22 20   "SELECT new.x" 
9ab0: 77 69 74 68 69 6e 20 61 20 74 72 69 67 67 65 72  within a trigger
9ac0: 20 77 6f 75 6c 64 0a 20 20 20 20 20 20 20 20 2a   would.        *
9ad0: 2a 20 63 61 75 73 65 20 74 68 69 73 20 63 6f 6e  * cause this con
9ae0: 64 69 74 69 6f 6e 20 74 6f 20 72 75 6e 2e 20 20  dition to run.  
9af0: 53 69 6e 63 65 20 74 68 65 6e 2c 20 77 65 20 68  Since then, we h
9b00: 61 76 65 20 72 65 73 74 72 75 63 74 75 72 65 64  ave restructured
9b10: 20 68 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a 20   how.        ** 
9b20: 74 72 69 67 67 65 72 20 63 6f 64 65 20 69 73 20  trigger code is 
9b30: 67 65 6e 65 72 61 74 65 64 20 61 6e 64 20 73 6f  generated and so
9b40: 20 74 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e 20   this condition 
9b50: 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 0a 20 20  is no longer .  
9b60: 20 20 20 20 20 20 2a 2a 20 70 6f 73 73 69 62 6c        ** possibl
9b70: 65 2e 20 48 6f 77 65 76 65 72 2c 20 69 74 20 63  e. However, it c
9b80: 61 6e 20 73 74 69 6c 6c 20 62 65 20 74 72 75 65  an still be true
9b90: 20 66 6f 72 20 73 74 61 74 65 6d 65 6e 74 73 20   for statements 
9ba0: 6c 69 6b 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  like.        ** 
9bb0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20  the following:. 
9bc0: 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
9bd0: 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41    **   CREATE TA
9be0: 42 4c 45 20 74 31 28 63 6f 6c 20 49 4e 54 45 47  BLE t1(col INTEG
9bf0: 45 52 29 3b 0a 20 20 20 20 20 20 20 20 2a 2a 20  ER);.        ** 
9c00: 20 20 53 45 4c 45 43 54 20 28 53 45 4c 45 43 54    SELECT (SELECT
9c10: 20 74 31 2e 63 6f 6c 29 20 46 52 4f 4d 20 46 52   t1.col) FROM FR
9c20: 4f 4d 20 74 31 3b 0a 20 20 20 20 20 20 20 20 2a  OM t1;.        *
9c30: 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 68 65  *.        ** whe
9c40: 6e 20 63 6f 6c 75 6d 6e 54 79 70 65 28 29 20 69  n columnType() i
9c50: 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20  s called on the 
9c60: 65 78 70 72 65 73 73 69 6f 6e 20 22 74 31 2e 63  expression "t1.c
9c70: 6f 6c 22 20 69 6e 20 74 68 65 20 0a 20 20 20 20  ol" in the .    
9c80: 20 20 20 20 2a 2a 20 73 75 62 2d 73 65 6c 65 63      ** sub-selec
9c90: 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c  t. In this case,
9ca0: 20 73 65 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20   set the column 
9cb0: 74 79 70 65 20 74 6f 20 4e 55 4c 4c 2c 20 65 76  type to NULL, ev
9cc0: 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  en.        ** th
9cd0: 6f 75 67 68 20 69 74 20 73 68 6f 75 6c 64 20 72  ough it should r
9ce0: 65 61 6c 6c 79 20 62 65 20 22 49 4e 54 45 47 45  eally be "INTEGE
9cf0: 52 22 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  R"..        **. 
9d00: 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69         ** This i
9d10: 73 20 6e 6f 74 20 61 20 70 72 6f 62 6c 65 6d 2c  s not a problem,
9d20: 20 61 73 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74   as the column t
9d30: 79 70 65 20 6f 66 20 22 74 31 2e 63 6f 6c 22 20  ype of "t1.col" 
9d40: 69 73 20 6e 65 76 65 72 0a 20 20 20 20 20 20 20  is never.       
9d50: 20 2a 2a 20 75 73 65 64 2e 20 57 68 65 6e 20 63   ** used. When c
9d60: 6f 6c 75 6d 6e 54 79 70 65 28 29 20 69 73 20 63  olumnType() is c
9d70: 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 65 78 70  alled on the exp
9d80: 72 65 73 73 69 6f 6e 20 0a 20 20 20 20 20 20 20  ression .       
9d90: 20 2a 2a 20 22 28 53 45 4c 45 43 54 20 74 31 2e   ** "(SELECT t1.
9da0: 63 6f 6c 29 22 2c 20 74 68 65 20 63 6f 72 72 65  col)", the corre
9db0: 63 74 20 74 79 70 65 20 69 73 20 72 65 74 75 72  ct type is retur
9dc0: 6e 65 64 20 28 73 65 65 20 74 68 65 20 54 4b 5f  ned (see the TK_
9dd0: 53 45 4c 45 43 54 0a 20 20 20 20 20 20 20 20 2a  SELECT.        *
9de0: 2a 20 62 72 61 6e 63 68 20 62 65 6c 6f 77 2e 20  * branch below. 
9df0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61   */.        brea
9e00: 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  k;.      }..    
9e10: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 20 26    assert( pTab &
9e20: 26 20 70 45 78 70 72 2d 3e 70 54 61 62 3d 3d 70  & pExpr->pTab==p
9e30: 54 61 62 20 29 3b 0a 20 20 20 20 20 20 69 66 28  Tab );.      if(
9e40: 20 70 53 20 29 7b 0a 20 20 20 20 20 20 20 20 2f   pS ){.        /
9e50: 2a 20 54 68 65 20 22 74 61 62 6c 65 22 20 69 73  * The "table" is
9e60: 20 61 63 74 75 61 6c 6c 79 20 61 20 73 75 62 2d   actually a sub-
9e70: 73 65 6c 65 63 74 20 6f 72 20 61 20 76 69 65 77  select or a view
9e80: 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
9e90: 75 73 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  use.        ** o
9ea0: 66 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  f the SELECT sta
9eb0: 74 65 6d 65 6e 74 2e 20 52 65 74 75 72 6e 20 74  tement. Return t
9ec0: 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74  he declaration t
9ed0: 79 70 65 20 61 6e 64 20 6f 72 69 67 69 6e 0a 20  ype and origin. 
9ee0: 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61 20 66         ** data f
9ef0: 6f 72 20 74 68 65 20 72 65 73 75 6c 74 2d 73 65  or the result-se
9f00: 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  t column of the 
9f10: 73 75 62 2d 73 65 6c 65 63 74 2e 0a 20 20 20 20  sub-select..    
9f20: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
9f30: 66 28 20 69 43 6f 6c 3e 3d 30 20 26 26 20 41 4c  f( iCol>=0 && AL
9f40: 57 41 59 53 28 69 43 6f 6c 3c 70 53 2d 3e 70 45  WAYS(iCol<pS->pE
9f50: 4c 69 73 74 2d 3e 6e 45 78 70 72 29 20 29 7b 0a  List->nExpr) ){.
9f60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
9f70: 69 43 6f 6c 20 69 73 20 6c 65 73 73 20 74 68 61  iCol is less tha
9f80: 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  n zero, then the
9f90: 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65 71 75   expression requ
9fa0: 65 73 74 73 20 74 68 65 0a 20 20 20 20 20 20 20  ests the.       
9fb0: 20 20 20 2a 2a 20 72 6f 77 69 64 20 6f 66 20 74     ** rowid of t
9fc0: 68 65 20 73 75 62 2d 73 65 6c 65 63 74 20 6f 72  he sub-select or
9fd0: 20 76 69 65 77 2e 20 54 68 69 73 20 65 78 70 72   view. This expr
9fe0: 65 73 73 69 6f 6e 20 69 73 20 6c 65 67 61 6c 20  ession is legal 
9ff0: 28 73 65 65 20 0a 20 20 20 20 20 20 20 20 20 20  (see .          
a000: 2a 2a 20 74 65 73 74 20 63 61 73 65 20 6d 69 73  ** test case mis
a010: 63 32 2e 32 2e 32 29 20 2d 20 69 74 20 61 6c 77  c2.2.2) - it alw
a020: 61 79 73 20 65 76 61 6c 75 61 74 65 73 20 74 6f  ays evaluates to
a030: 20 4e 55 4c 4c 2e 0a 20 20 20 20 20 20 20 20 20   NULL..         
a040: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 4e 61   */.          Na
a050: 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20  meContext sNC;. 
a060: 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70           Expr *p
a070: 20 3d 20 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 61   = pS->pEList->a
a080: 5b 69 43 6f 6c 5d 2e 70 45 78 70 72 3b 0a 20 20  [iCol].pExpr;.  
a090: 20 20 20 20 20 20 20 20 73 4e 43 2e 70 53 72 63          sNC.pSrc
a0a0: 4c 69 73 74 20 3d 20 70 53 2d 3e 70 53 72 63 3b  List = pS->pSrc;
a0b0: 0a 20 20 20 20 20 20 20 20 20 20 73 4e 43 2e 70  .          sNC.p
a0c0: 4e 65 78 74 20 3d 20 70 4e 43 3b 0a 20 20 20 20  Next = pNC;.    
a0d0: 20 20 20 20 20 20 73 4e 43 2e 70 50 61 72 73 65        sNC.pParse
a0e0: 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a   = pNC->pParse;.
a0f0: 20 20 20 20 20 20 20 20 20 20 7a 54 79 70 65 20            zType 
a100: 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e  = columnType(&sN
a110: 43 2c 20 70 2c 26 7a 4f 72 69 67 44 62 2c 26 7a  C, p,&zOrigDb,&z
a120: 4f 72 69 67 54 61 62 2c 26 7a 4f 72 69 67 43 6f  OrigTab,&zOrigCo
a130: 6c 2c 20 26 65 73 74 57 69 64 74 68 29 3b 20 0a  l, &estWidth); .
a140: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
a150: 7d 65 6c 73 65 20 69 66 28 20 41 4c 57 41 59 53  }else if( ALWAYS
a160: 28 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 20  (pTab->pSchema) 
a170: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 20  ){.        /* A 
a180: 72 65 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20  real table */.  
a190: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
a1a0: 53 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  S );.        if(
a1b0: 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d   iCol<0 ) iCol =
a1c0: 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20   pTab->iPKey;.  
a1d0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 43        assert( iC
a1e0: 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e  ol==-1 || (iCol>
a1f0: 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d  =0 && iCol<pTab-
a200: 3e 6e 43 6f 6c 29 20 29 3b 0a 23 69 66 64 65 66  >nCol) );.#ifdef
a210: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
a220: 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20  OLUMN_METADATA. 
a230: 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c         if( iCol<
a240: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  0 ){.          z
a250: 54 79 70 65 20 3d 20 22 49 4e 54 45 47 45 52 22  Type = "INTEGER"
a260: 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 72 69  ;.          zOri
a270: 67 43 6f 6c 20 3d 20 22 72 6f 77 69 64 22 3b 0a  gCol = "rowid";.
a280: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
a290: 20 20 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d           zType =
a2a0: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
a2b0: 5d 2e 7a 54 79 70 65 3b 0a 20 20 20 20 20 20 20  ].zType;.       
a2c0: 20 20 20 7a 4f 72 69 67 43 6f 6c 20 3d 20 70 54     zOrigCol = pT
a2d0: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a  ab->aCol[iCol].z
a2e0: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Name;.          
a2f0: 65 73 74 57 69 64 74 68 20 3d 20 70 54 61 62 2d  estWidth = pTab-
a300: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 73 7a 45 73  >aCol[iCol].szEs
a310: 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
a320: 20 20 20 20 20 7a 4f 72 69 67 54 61 62 20 3d 20       zOrigTab = 
a330: 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20  pTab->zName;.   
a340: 20 20 20 20 20 69 66 28 20 70 4e 43 2d 3e 70 50       if( pNC->pP
a350: 61 72 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20  arse ){.        
a360: 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69    int iDb = sqli
a370: 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
a380: 28 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62  (pNC->pParse->db
a390: 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29  , pTab->pSchema)
a3a0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 72 69  ;.          zOri
a3b0: 67 44 62 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73  gDb = pNC->pPars
a3c0: 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e  e->db->aDb[iDb].
a3d0: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 7d  zName;.        }
a3e0: 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 20 20 69  .#else.        i
a3f0: 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20  f( iCol<0 ){.   
a400: 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22         zType = "
a410: 49 4e 54 45 47 45 52 22 3b 0a 20 20 20 20 20 20  INTEGER";.      
a420: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
a430: 20 20 20 7a 54 79 70 65 20 3d 20 70 54 61 62 2d     zType = pTab-
a440: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70  >aCol[iCol].zTyp
a450: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 65 73 74  e;.          est
a460: 57 69 64 74 68 20 3d 20 70 54 61 62 2d 3e 61 43  Width = pTab->aC
a470: 6f 6c 5b 69 43 6f 6c 5d 2e 73 7a 45 73 74 3b 0a  ol[iCol].szEst;.
a480: 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66          }.#endif
a490: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
a4a0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  reak;.    }.#ifn
a4b0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
a4c0: 53 55 42 51 55 45 52 59 0a 20 20 20 20 63 61 73  SUBQUERY.    cas
a4d0: 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20  e TK_SELECT: {. 
a4e0: 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72       /* The expr
a4f0: 65 73 73 69 6f 6e 20 69 73 20 61 20 73 75 62 2d  ession is a sub-
a500: 73 65 6c 65 63 74 2e 20 52 65 74 75 72 6e 20 74  select. Return t
a510: 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74  he declaration t
a520: 79 70 65 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a  ype and.      **
a530: 20 6f 72 69 67 69 6e 20 69 6e 66 6f 20 66 6f 72   origin info for
a540: 20 74 68 65 20 73 69 6e 67 6c 65 20 63 6f 6c 75   the single colu
a550: 6d 6e 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  mn in the result
a560: 20 73 65 74 20 6f 66 20 74 68 65 20 53 45 4c 45   set of the SELE
a570: 43 54 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74  CT.      ** stat
a580: 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a  ement..      */.
a590: 20 20 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78        NameContex
a5a0: 74 20 73 4e 43 3b 0a 20 20 20 20 20 20 53 65 6c  t sNC;.      Sel
a5b0: 65 63 74 20 2a 70 53 20 3d 20 70 45 78 70 72 2d  ect *pS = pExpr-
a5c0: 3e 78 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20  >x.pSelect;.    
a5d0: 20 20 45 78 70 72 20 2a 70 20 3d 20 70 53 2d 3e    Expr *p = pS->
a5e0: 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  pEList->a[0].pEx
a5f0: 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  pr;.      assert
a600: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
a610: 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
a620: 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20  elect) );.      
a630: 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70  sNC.pSrcList = p
a640: 53 2d 3e 70 53 72 63 3b 0a 20 20 20 20 20 20 73  S->pSrc;.      s
a650: 4e 43 2e 70 4e 65 78 74 20 3d 20 70 4e 43 3b 0a  NC.pNext = pNC;.
a660: 20 20 20 20 20 20 73 4e 43 2e 70 50 61 72 73 65        sNC.pParse
a670: 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a   = pNC->pParse;.
a680: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f        zType = co
a690: 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70  lumnType(&sNC, p
a6a0: 2c 20 26 7a 4f 72 69 67 44 62 2c 20 26 7a 4f 72  , &zOrigDb, &zOr
a6b0: 69 67 54 61 62 2c 20 26 7a 4f 72 69 67 43 6f 6c  igTab, &zOrigCol
a6c0: 2c 20 26 65 73 74 57 69 64 74 68 29 3b 20 0a 20  , &estWidth); . 
a6d0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
a6e0: 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 23 69  }.#endif.  }..#i
a6f0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
a700: 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41  LE_COLUMN_METADA
a710: 54 41 20 20 0a 20 20 69 66 28 20 70 7a 4f 72 69  TA  .  if( pzOri
a720: 67 44 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72  gDb ){.    asser
a730: 74 28 20 70 7a 4f 72 69 67 54 61 62 20 26 26 20  t( pzOrigTab && 
a740: 70 7a 4f 72 69 67 43 6f 6c 20 29 3b 0a 20 20 20  pzOrigCol );.   
a750: 20 2a 70 7a 4f 72 69 67 44 62 20 3d 20 7a 4f 72   *pzOrigDb = zOr
a760: 69 67 44 62 3b 0a 20 20 20 20 2a 70 7a 4f 72 69  igDb;.    *pzOri
a770: 67 54 61 62 20 3d 20 7a 4f 72 69 67 54 61 62 3b  gTab = zOrigTab;
a780: 0a 20 20 20 20 2a 70 7a 4f 72 69 67 43 6f 6c 20  .    *pzOrigCol 
a790: 3d 20 7a 4f 72 69 67 43 6f 6c 3b 0a 20 20 7d 0a  = zOrigCol;.  }.
a7a0: 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 45 73  #endif.  if( pEs
a7b0: 74 57 69 64 74 68 20 29 20 2a 70 45 73 74 57 69  tWidth ) *pEstWi
a7c0: 64 74 68 20 3d 20 65 73 74 57 69 64 74 68 3b 0a  dth = estWidth;.
a7d0: 20 20 72 65 74 75 72 6e 20 7a 54 79 70 65 3b 0a    return zType;.
a7e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
a7f0: 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
a800: 20 74 65 6c 6c 20 74 68 65 20 56 44 42 45 20 74   tell the VDBE t
a810: 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74  he declaration t
a820: 79 70 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a  ypes of columns.
a830: 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ** in the result
a840: 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   set..*/.static 
a850: 76 6f 69 64 20 67 65 6e 65 72 61 74 65 43 6f 6c  void generateCol
a860: 75 6d 6e 54 79 70 65 73 28 0a 20 20 50 61 72 73  umnTypes(.  Pars
a870: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
a880: 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78  /* Parser contex
a890: 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  t */.  SrcList *
a8a0: 70 54 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69  pTabList,  /* Li
a8b0: 73 74 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a  st of tables */.
a8c0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
a8d0: 73 74 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73  st    /* Express
a8e0: 69 6f 6e 73 20 64 65 66 69 6e 69 6e 67 20 74 68  ions defining th
a8f0: 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a  e result set */.
a900: 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
a910: 45 5f 4f 4d 49 54 5f 44 45 43 4c 54 59 50 45 0a  E_OMIT_DECLTYPE.
a920: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
a930: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
a940: 20 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78   i;.  NameContex
a950: 74 20 73 4e 43 3b 0a 20 20 73 4e 43 2e 70 53 72  t sNC;.  sNC.pSr
a960: 63 4c 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74  cList = pTabList
a970: 3b 0a 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d  ;.  sNC.pParse =
a980: 20 70 50 61 72 73 65 3b 0a 20 20 66 6f 72 28 69   pParse;.  for(i
a990: 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45  =0; i<pEList->nE
a9a0: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45  xpr; i++){.    E
a9b0: 78 70 72 20 2a 70 20 3d 20 70 45 4c 69 73 74 2d  xpr *p = pEList-
a9c0: 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
a9d0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79   const char *zTy
a9e0: 70 65 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  pe;.#ifdef SQLIT
a9f0: 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f  E_ENABLE_COLUMN_
aa00: 4d 45 54 41 44 41 54 41 0a 20 20 20 20 63 6f 6e  METADATA.    con
aa10: 73 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 44 62  st char *zOrigDb
aa20: 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20   = 0;.    const 
aa30: 63 68 61 72 20 2a 7a 4f 72 69 67 54 61 62 20 3d  char *zOrigTab =
aa40: 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   0;.    const ch
aa50: 61 72 20 2a 7a 4f 72 69 67 43 6f 6c 20 3d 20 30  ar *zOrigCol = 0
aa60: 3b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f  ;.    zType = co
aa70: 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70  lumnType(&sNC, p
aa80: 2c 20 26 7a 4f 72 69 67 44 62 2c 20 26 7a 4f 72  , &zOrigDb, &zOr
aa90: 69 67 54 61 62 2c 20 26 7a 4f 72 69 67 43 6f 6c  igTab, &zOrigCol
aaa0: 2c 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68  , 0);..    /* Th
aab0: 65 20 76 64 62 65 20 6d 75 73 74 20 6d 61 6b 65  e vdbe must make
aac0: 20 69 74 73 20 6f 77 6e 20 63 6f 70 79 20 6f 66   its own copy of
aad0: 20 74 68 65 20 63 6f 6c 75 6d 6e 2d 74 79 70 65   the column-type
aae0: 20 61 6e 64 20 6f 74 68 65 72 20 0a 20 20 20 20   and other .    
aaf0: 2a 2a 20 63 6f 6c 75 6d 6e 20 73 70 65 63 69 66  ** column specif
ab00: 69 63 20 73 74 72 69 6e 67 73 2c 20 69 6e 20 63  ic strings, in c
ab10: 61 73 65 20 74 68 65 20 73 63 68 65 6d 61 20 69  ase the schema i
ab20: 73 20 72 65 73 65 74 20 62 65 66 6f 72 65 20 74  s reset before t
ab30: 68 69 73 0a 20 20 20 20 2a 2a 20 76 69 72 74 75  his.    ** virtu
ab40: 61 6c 20 6d 61 63 68 69 6e 65 20 69 73 20 64 65  al machine is de
ab50: 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  leted..    */.  
ab60: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
ab70: 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f  ColName(v, i, CO
ab80: 4c 4e 41 4d 45 5f 44 41 54 41 42 41 53 45 2c 20  LNAME_DATABASE, 
ab90: 7a 4f 72 69 67 44 62 2c 20 53 51 4c 49 54 45 5f  zOrigDb, SQLITE_
aba0: 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20  TRANSIENT);.    
abb0: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
abc0: 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e  lName(v, i, COLN
abd0: 41 4d 45 5f 54 41 42 4c 45 2c 20 7a 4f 72 69 67  AME_TABLE, zOrig
abe0: 54 61 62 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  Tab, SQLITE_TRAN
abf0: 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69  SIENT);.    sqli
ac00: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
ac10: 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f  e(v, i, COLNAME_
ac20: 43 4f 4c 55 4d 4e 2c 20 7a 4f 72 69 67 43 6f 6c  COLUMN, zOrigCol
ac30: 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
ac40: 4e 54 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 7a  NT);.#else.    z
ac50: 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70  Type = columnTyp
ac60: 65 28 26 73 4e 43 2c 20 70 2c 20 30 2c 20 30 2c  e(&sNC, p, 0, 0,
ac70: 20 30 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20   0, 0);.#endif. 
ac80: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
ac90: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
aca0: 4f 4c 4e 41 4d 45 5f 44 45 43 4c 54 59 50 45 2c  OLNAME_DECLTYPE,
acb0: 20 7a 54 79 70 65 2c 20 53 51 4c 49 54 45 5f 54   zType, SQLITE_T
acc0: 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 0a 23  RANSIENT);.  }.#
acd0: 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
ace0: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45  d(SQLITE_OMIT_DE
acf0: 43 4c 54 59 50 45 29 20 2a 2f 0a 7d 0a 0a 2f 2a  CLTYPE) */.}../*
ad00: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
ad10: 65 20 74 68 61 74 20 77 69 6c 6c 20 74 65 6c 6c  e that will tell
ad20: 20 74 68 65 20 56 44 42 45 20 74 68 65 20 6e 61   the VDBE the na
ad30: 6d 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a  mes of columns.*
ad40: 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  * in the result 
ad50: 73 65 74 2e 20 20 54 68 69 73 20 69 6e 66 6f 72  set.  This infor
ad60: 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  mation is used t
ad70: 6f 20 70 72 6f 76 69 64 65 20 74 68 65 0a 2a 2a  o provide the.**
ad80: 20 61 7a 43 6f 6c 5b 5d 20 76 61 6c 75 65 73 20   azCol[] values 
ad90: 69 6e 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 2e  in the callback.
ada0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
adb0: 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61  generateColumnNa
adc0: 6d 65 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50  mes(.  Parse *pP
add0: 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61  arse,      /* Pa
ade0: 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
adf0: 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
ae00: 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66  ist,  /* List of
ae10: 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 45 78 70   tables */.  Exp
ae20: 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20  rList *pEList   
ae30: 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73 20   /* Expressions 
ae40: 64 65 66 69 6e 69 6e 67 20 74 68 65 20 72 65 73  defining the res
ae50: 75 6c 74 20 73 65 74 20 2a 2f 0a 29 7b 0a 20 20  ult set */.){.  
ae60: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
ae70: 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
ae80: 2c 20 6a 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  , j;.  sqlite3 *
ae90: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
aea0: 0a 20 20 69 6e 74 20 66 75 6c 6c 4e 61 6d 65 73  .  int fullNames
aeb0: 2c 20 73 68 6f 72 74 4e 61 6d 65 73 3b 0a 0a 23  , shortNames;..#
aec0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
aed0: 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 2f 2a 20  IT_EXPLAIN.  /* 
aee0: 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 45 58  If this is an EX
aef0: 50 4c 41 49 4e 2c 20 73 6b 69 70 20 74 68 69 73  PLAIN, skip this
af00: 20 73 74 65 70 20 2a 2f 0a 20 20 69 66 28 20 70   step */.  if( p
af10: 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29  Parse->explain )
af20: 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
af30: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20  }.#endif..  if( 
af40: 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73  pParse->colNames
af50: 53 65 74 20 7c 7c 20 4e 45 56 45 52 28 76 3d 3d  Set || NEVER(v==
af60: 30 29 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  0) || db->malloc
af70: 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b  Failed ) return;
af80: 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61  .  pParse->colNa
af90: 6d 65 73 53 65 74 20 3d 20 31 3b 0a 20 20 66 75  mesSet = 1;.  fu
afa0: 6c 6c 4e 61 6d 65 73 20 3d 20 28 64 62 2d 3e 66  llNames = (db->f
afb0: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 75  lags & SQLITE_Fu
afc0: 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a  llColNames)!=0;.
afd0: 20 20 73 68 6f 72 74 4e 61 6d 65 73 20 3d 20 28    shortNames = (
afe0: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
aff0: 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73  TE_ShortColNames
b000: 29 21 3d 30 3b 0a 20 20 73 71 6c 69 74 65 33 56  )!=0;.  sqlite3V
b010: 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 76 2c  dbeSetNumCols(v,
b020: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b   pEList->nExpr);
b030: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45  .  for(i=0; i<pE
b040: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
b050: 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 3b 0a  ){.    Expr *p;.
b060: 20 20 20 20 70 20 3d 20 70 45 4c 69 73 74 2d 3e      p = pEList->
b070: 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
b080: 69 66 28 20 4e 45 56 45 52 28 70 3d 3d 30 29 20  if( NEVER(p==0) 
b090: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
b0a0: 69 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  if( pEList->a[i]
b0b0: 2e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  .zName ){.      
b0c0: 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 45  char *zName = pE
b0d0: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
b0e0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
b0f0: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
b100: 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45   i, COLNAME_NAME
b110: 2c 20 7a 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f  , zName, SQLITE_
b120: 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20  TRANSIENT);.    
b130: 7d 65 6c 73 65 20 69 66 28 20 28 70 2d 3e 6f 70  }else if( (p->op
b140: 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70  ==TK_COLUMN || p
b150: 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c  ->op==TK_AGG_COL
b160: 55 4d 4e 29 20 26 26 20 70 54 61 62 4c 69 73 74  UMN) && pTabList
b170: 20 29 7b 0a 20 20 20 20 20 20 54 61 62 6c 65 20   ){.      Table 
b180: 2a 70 54 61 62 3b 0a 20 20 20 20 20 20 63 68 61  *pTab;.      cha
b190: 72 20 2a 7a 43 6f 6c 3b 0a 20 20 20 20 20 20 69  r *zCol;.      i
b1a0: 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 69 43 6f  nt iCol = p->iCo
b1b0: 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 66 6f 72 28  lumn;.      for(
b1c0: 6a 3d 30 3b 20 41 4c 57 41 59 53 28 6a 3c 70 54  j=0; ALWAYS(j<pT
b1d0: 61 62 4c 69 73 74 2d 3e 6e 53 72 63 29 3b 20 6a  abList->nSrc); j
b1e0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
b1f0: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e   pTabList->a[j].
b200: 69 43 75 72 73 6f 72 3d 3d 70 2d 3e 69 54 61 62  iCursor==p->iTab
b210: 6c 65 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  le ) break;.    
b220: 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
b230: 28 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  ( j<pTabList->nS
b240: 72 63 20 29 3b 0a 20 20 20 20 20 20 70 54 61 62  rc );.      pTab
b250: 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a   = pTabList->a[j
b260: 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 69 66  ].pTab;.      if
b270: 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20  ( iCol<0 ) iCol 
b280: 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20  = pTab->iPKey;. 
b290: 20 20 20 20 20 61 73 73 65 72 74 28 20 69 43 6f       assert( iCo
b2a0: 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d  l==-1 || (iCol>=
b2b0: 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e  0 && iCol<pTab->
b2c0: 6e 43 6f 6c 29 20 29 3b 0a 20 20 20 20 20 20 69  nCol) );.      i
b2d0: 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20  f( iCol<0 ){.   
b2e0: 20 20 20 20 20 7a 43 6f 6c 20 3d 20 22 72 6f 77       zCol = "row
b2f0: 69 64 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  id";.      }else
b300: 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d  {.        zCol =
b310: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
b320: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 7d  ].zName;.      }
b330: 0a 20 20 20 20 20 20 69 66 28 20 21 73 68 6f 72  .      if( !shor
b340: 74 4e 61 6d 65 73 20 26 26 20 21 66 75 6c 6c 4e  tNames && !fullN
b350: 61 6d 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20  ames ){.        
b360: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
b370: 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e  lName(v, i, COLN
b380: 41 4d 45 5f 4e 41 4d 45 2c 20 0a 20 20 20 20 20  AME_NAME, .     
b390: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
b3a0: 53 74 72 44 75 70 28 64 62 2c 20 70 45 4c 69 73  StrDup(db, pELis
b3b0: 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 29 2c 20  t->a[i].zSpan), 
b3c0: 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b  SQLITE_DYNAMIC);
b3d0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
b3e0: 20 66 75 6c 6c 4e 61 6d 65 73 20 29 7b 0a 20 20   fullNames ){.  
b3f0: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d        char *zNam
b400: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7a  e = 0;.        z
b410: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50  Name = sqlite3MP
b420: 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2e 25 73  rintf(db, "%s.%s
b430: 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  ", pTab->zName, 
b440: 7a 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73  zCol);.        s
b450: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
b460: 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41  Name(v, i, COLNA
b470: 4d 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20  ME_NAME, zName, 
b480: 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b  SQLITE_DYNAMIC);
b490: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
b4a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
b4b0: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69  eSetColName(v, i
b4c0: 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20  , COLNAME_NAME, 
b4d0: 7a 43 6f 6c 2c 20 53 51 4c 49 54 45 5f 54 52 41  zCol, SQLITE_TRA
b4e0: 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 20 20 7d  NSIENT);.      }
b4f0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
b500: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
b510: 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f  ColName(v, i, CO
b520: 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 0a 20 20 20  LNAME_NAME, .   
b530: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
b540: 53 74 72 44 75 70 28 64 62 2c 20 70 45 4c 69 73  StrDup(db, pELis
b550: 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 29 2c 20  t->a[i].zSpan), 
b560: 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b  SQLITE_DYNAMIC);
b570: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 67 65 6e  .    }.  }.  gen
b580: 65 72 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73  erateColumnTypes
b590: 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73  (pParse, pTabLis
b5a0: 74 2c 20 70 45 4c 69 73 74 29 3b 0a 7d 0a 0a 2f  t, pEList);.}../
b5b0: 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 61 6e 20  *.** Given a an 
b5c0: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20  expression list 
b5d0: 28 77 68 69 63 68 20 69 73 20 72 65 61 6c 6c 79  (which is really
b5e0: 20 74 68 65 20 6c 69 73 74 20 6f 66 20 65 78 70   the list of exp
b5f0: 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 74 68 61 74  ressions.** that
b600: 20 66 6f 72 6d 20 74 68 65 20 72 65 73 75 6c 74   form the result
b610: 20 73 65 74 20 6f 66 20 61 20 53 45 4c 45 43 54   set of a SELECT
b620: 20 73 74 61 74 65 6d 65 6e 74 29 20 63 6f 6d 70   statement) comp
b630: 75 74 65 20 61 70 70 72 6f 70 72 69 61 74 65 0a  ute appropriate.
b640: 2a 2a 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  ** column names 
b650: 66 6f 72 20 61 20 74 61 62 6c 65 20 74 68 61 74  for a table that
b660: 20 77 6f 75 6c 64 20 68 6f 6c 64 20 74 68 65 20   would hold the 
b670: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e  expression list.
b680: 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 63 6f 6c 75 6d  .**.** All colum
b690: 6e 20 6e 61 6d 65 73 20 77 69 6c 6c 20 62 65 20  n names will be 
b6a0: 75 6e 69 71 75 65 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  unique..**.** On
b6b0: 6c 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  ly the column na
b6c0: 6d 65 73 20 61 72 65 20 63 6f 6d 70 75 74 65 64  mes are computed
b6d0: 2e 20 20 43 6f 6c 75 6d 6e 2e 7a 54 79 70 65 2c  .  Column.zType,
b6e0: 20 43 6f 6c 75 6d 6e 2e 7a 43 6f 6c 6c 2c 0a 2a   Column.zColl,.*
b6f0: 2a 20 61 6e 64 20 6f 74 68 65 72 20 66 69 65 6c  * and other fiel
b700: 64 73 20 6f 66 20 43 6f 6c 75 6d 6e 20 61 72 65  ds of Column are
b710: 20 7a 65 72 6f 65 64 2e 0a 2a 2a 0a 2a 2a 20 52   zeroed..**.** R
b720: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
b730: 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66 20  on success.  If 
b740: 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  a memory allocat
b750: 69 6f 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73  ion error occurs
b760: 2c 0a 2a 2a 20 73 74 6f 72 65 20 4e 55 4c 4c 20  ,.** store NULL 
b770: 69 6e 20 2a 70 61 43 6f 6c 20 61 6e 64 20 30 20  in *paCol and 0 
b780: 69 6e 20 2a 70 6e 43 6f 6c 20 61 6e 64 20 72 65  in *pnCol and re
b790: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
b7a0: 4d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  M..*/.static int
b7b0: 20 73 65 6c 65 63 74 43 6f 6c 75 6d 6e 73 46 72   selectColumnsFr
b7c0: 6f 6d 45 78 70 72 4c 69 73 74 28 0a 20 20 50 61  omExprList(.  Pa
b7d0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
b7e0: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
b7f0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
b800: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20  prList *pEList, 
b810: 20 20 20 20 20 20 2f 2a 20 45 78 70 72 20 6c 69        /* Expr li
b820: 73 74 20 66 72 6f 6d 20 77 68 69 63 68 20 74 6f  st from which to
b830: 20 64 65 72 69 76 65 20 63 6f 6c 75 6d 6e 20 6e   derive column n
b840: 61 6d 65 73 20 2a 2f 0a 20 20 69 31 36 20 2a 70  ames */.  i16 *p
b850: 6e 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20  nCol,           
b860: 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e    /* Write the n
b870: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
b880: 20 68 65 72 65 20 2a 2f 0a 20 20 43 6f 6c 75 6d   here */.  Colum
b890: 6e 20 2a 2a 70 61 43 6f 6c 20 20 20 20 20 20 20  n **paCol       
b8a0: 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
b8b0: 6e 65 77 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20  new column list 
b8c0: 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  here */.){.  sql
b8d0: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
b8e0: 65 2d 3e 64 62 3b 20 20 20 2f 2a 20 44 61 74 61  e->db;   /* Data
b8f0: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
b900: 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20  */.  int i, j;  
b910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b920: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
b930: 73 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 3b 20  s */.  int cnt; 
b940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b950: 20 20 20 2f 2a 20 49 6e 64 65 78 20 61 64 64 65     /* Index adde
b960: 64 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 6e 61  d to make the na
b970: 6d 65 20 75 6e 69 71 75 65 20 2a 2f 0a 20 20 43  me unique */.  C
b980: 6f 6c 75 6d 6e 20 2a 61 43 6f 6c 2c 20 2a 70 43  olumn *aCol, *pC
b990: 6f 6c 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 6f  ol;        /* Fo
b9a0: 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 72  r looping over r
b9b0: 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f  esult columns */
b9c0: 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20  .  int nCol;    
b9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
b9e0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  * Number of colu
b9f0: 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c  mns in the resul
ba00: 74 20 73 65 74 20 2a 2f 0a 20 20 45 78 70 72 20  t set */.  Expr 
ba10: 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *p;             
ba20: 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73         /* Expres
ba30: 73 69 6f 6e 20 66 6f 72 20 61 20 73 69 6e 67 6c  sion for a singl
ba40: 65 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 20  e result column 
ba50: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65  */.  char *zName
ba60: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
ba70: 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65 20   /* Column name 
ba80: 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 20  */.  int nName; 
ba90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
baa0: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6e 61 6d 65   /* Size of name
bab0: 20 69 6e 20 7a 4e 61 6d 65 5b 5d 20 2a 2f 0a 0a   in zName[] */..
bac0: 20 20 69 66 28 20 70 45 4c 69 73 74 20 29 7b 0a    if( pEList ){.
bad0: 20 20 20 20 6e 43 6f 6c 20 3d 20 70 45 4c 69 73      nCol = pELis
bae0: 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 61 43  t->nExpr;.    aC
baf0: 6f 6c 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ol = sqlite3DbMa
bb00: 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
bb10: 65 6f 66 28 61 43 6f 6c 5b 30 5d 29 2a 6e 43 6f  eof(aCol[0])*nCo
bb20: 6c 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  l);.    testcase
bb30: 28 20 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 7d  ( aCol==0 );.  }
bb40: 65 6c 73 65 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d  else{.    nCol =
bb50: 20 30 3b 0a 20 20 20 20 61 43 6f 6c 20 3d 20 30   0;.    aCol = 0
bb60: 3b 0a 20 20 7d 0a 20 20 2a 70 6e 43 6f 6c 20 3d  ;.  }.  *pnCol =
bb70: 20 6e 43 6f 6c 3b 0a 20 20 2a 70 61 43 6f 6c 20   nCol;.  *paCol 
bb80: 3d 20 61 43 6f 6c 3b 0a 0a 20 20 66 6f 72 28 69  = aCol;..  for(i
bb90: 3d 30 2c 20 70 43 6f 6c 3d 61 43 6f 6c 3b 20 69  =0, pCol=aCol; i
bba0: 3c 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c  <nCol; i++, pCol
bbb0: 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20 47 65 74 20  ++){.    /* Get 
bbc0: 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 6e  an appropriate n
bbd0: 61 6d 65 20 66 6f 72 20 74 68 65 20 63 6f 6c 75  ame for the colu
bbe0: 6d 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 20  mn.    */.    p 
bbf0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69  = sqlite3ExprSki
bc00: 70 43 6f 6c 6c 61 74 65 28 70 45 4c 69 73 74 2d  pCollate(pEList-
bc10: 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[i].pExpr);.  
bc20: 20 20 69 66 28 20 28 7a 4e 61 6d 65 20 3d 20 70    if( (zName = p
bc30: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  EList->a[i].zNam
bc40: 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  e)!=0 ){.      /
bc50: 2a 20 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  * If the column 
bc60: 63 6f 6e 74 61 69 6e 73 20 61 6e 20 22 41 53 20  contains an "AS 
bc70: 3c 6e 61 6d 65 3e 22 20 70 68 72 61 73 65 2c 20  <name>" phrase, 
bc80: 75 73 65 20 3c 6e 61 6d 65 3e 20 61 73 20 74 68  use <name> as th
bc90: 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20  e name */.      
bca0: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44  zName = sqlite3D
bcb0: 62 53 74 72 44 75 70 28 64 62 2c 20 7a 4e 61 6d  bStrDup(db, zNam
bcc0: 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  e);.    }else{. 
bcd0: 20 20 20 20 20 45 78 70 72 20 2a 70 43 6f 6c 45       Expr *pColE
bce0: 78 70 72 20 3d 20 70 3b 20 20 2f 2a 20 54 68 65  xpr = p;  /* The
bcf0: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74   expression that
bd00: 20 69 73 20 74 68 65 20 72 65 73 75 6c 74 20 63   is the result c
bd10: 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  olumn name */.  
bd20: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b      Table *pTab;
bd30: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
bd40: 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  e associated wit
bd50: 68 20 74 68 69 73 20 65 78 70 72 65 73 73 69 6f  h this expressio
bd60: 6e 20 2a 2f 0a 20 20 20 20 20 20 77 68 69 6c 65  n */.      while
bd70: 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f 70 3d 3d  ( pColExpr->op==
bd80: 54 4b 5f 44 4f 54 20 29 7b 0a 20 20 20 20 20 20  TK_DOT ){.      
bd90: 20 20 70 43 6f 6c 45 78 70 72 20 3d 20 70 43 6f    pColExpr = pCo
bda0: 6c 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20  lExpr->pRight;. 
bdb0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
bdc0: 43 6f 6c 45 78 70 72 21 3d 30 20 29 3b 0a 20 20  ColExpr!=0 );.  
bdd0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
bde0: 70 43 6f 6c 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  pColExpr->op==TK
bdf0: 5f 43 4f 4c 55 4d 4e 20 26 26 20 41 4c 57 41 59  _COLUMN && ALWAY
be00: 53 28 70 43 6f 6c 45 78 70 72 2d 3e 70 54 61 62  S(pColExpr->pTab
be10: 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  !=0) ){.        
be20: 2f 2a 20 46 6f 72 20 63 6f 6c 75 6d 6e 73 20 75  /* For columns u
be30: 73 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  se the column na
be40: 6d 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20  me name */.     
be50: 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 43     int iCol = pC
be60: 6f 6c 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b  olExpr->iColumn;
be70: 0a 20 20 20 20 20 20 20 20 70 54 61 62 20 3d 20  .        pTab = 
be80: 70 43 6f 6c 45 78 70 72 2d 3e 70 54 61 62 3b 0a  pColExpr->pTab;.
be90: 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c          if( iCol
bea0: 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70 54 61 62  <0 ) iCol = pTab
beb0: 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 20  ->iPKey;.       
bec0: 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
bed0: 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 22  MPrintf(db, "%s"
bee0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
bef0: 20 20 20 69 43 6f 6c 3e 3d 30 20 3f 20 70 54 61     iCol>=0 ? pTa
bf00: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e  b->aCol[iCol].zN
bf10: 61 6d 65 20 3a 20 22 72 6f 77 69 64 22 29 3b 0a  ame : "rowid");.
bf20: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
bf30: 70 43 6f 6c 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  pColExpr->op==TK
bf40: 5f 49 44 20 29 7b 0a 20 20 20 20 20 20 20 20 61  _ID ){.        a
bf50: 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
bf60: 72 6f 70 65 72 74 79 28 70 43 6f 6c 45 78 70 72  roperty(pColExpr
bf70: 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29  , EP_IntValue) )
bf80: 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  ;.        zName 
bf90: 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
bfa0: 28 64 62 2c 20 22 25 73 22 2c 20 70 43 6f 6c 45  (db, "%s", pColE
bfb0: 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a  xpr->u.zToken);.
bfc0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
bfd0: 20 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65 20       /* Use the 
bfe0: 6f 72 69 67 69 6e 61 6c 20 74 65 78 74 20 6f 66  original text of
bff0: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 65 78 70 72   the column expr
c000: 65 73 73 69 6f 6e 20 61 73 20 69 74 73 20 6e 61  ession as its na
c010: 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 7a 4e  me */.        zN
c020: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  ame = sqlite3MPr
c030: 69 6e 74 66 28 64 62 2c 20 22 25 73 22 2c 20 70  intf(db, "%s", p
c040: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61  EList->a[i].zSpa
c050: 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  n);.      }.    
c060: 7d 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61  }.    if( db->ma
c070: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
c080: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
c090: 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  e(db, zName);.  
c0a0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
c0b0: 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75  ..    /* Make su
c0c0: 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  re the column na
c0d0: 6d 65 20 69 73 20 75 6e 69 71 75 65 2e 20 20 49  me is unique.  I
c0e0: 66 20 74 68 65 20 6e 61 6d 65 20 69 73 20 6e 6f  f the name is no
c0f0: 74 20 75 6e 69 71 75 65 2c 0a 20 20 20 20 2a 2a  t unique,.    **
c100: 20 61 70 70 65 6e 64 20 61 20 69 6e 74 65 67 65   append a intege
c110: 72 20 74 6f 20 74 68 65 20 6e 61 6d 65 20 73 6f  r to the name so
c120: 20 74 68 61 74 20 69 74 20 62 65 63 6f 6d 65 73   that it becomes
c130: 20 75 6e 69 71 75 65 2e 0a 20 20 20 20 2a 2f 0a   unique..    */.
c140: 20 20 20 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69      nName = sqli
c150: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d  te3Strlen30(zNam
c160: 65 29 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 63 6e  e);.    for(j=cn
c170: 74 3d 30 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a  t=0; j<i; j++){.
c180: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
c190: 33 53 74 72 49 43 6d 70 28 61 43 6f 6c 5b 6a 5d  3StrICmp(aCol[j]
c1a0: 2e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d  .zName, zName)==
c1b0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  0 ){.        cha
c1c0: 72 20 2a 7a 4e 65 77 4e 61 6d 65 3b 0a 20 20 20  r *zNewName;.   
c1d0: 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20       int k;.    
c1e0: 20 20 20 20 66 6f 72 28 6b 3d 6e 4e 61 6d 65 2d      for(k=nName-
c1f0: 31 3b 20 6b 3e 31 20 26 26 20 73 71 6c 69 74 65  1; k>1 && sqlite
c200: 33 49 73 64 69 67 69 74 28 7a 4e 61 6d 65 5b 6b  3Isdigit(zName[k
c210: 5d 29 3b 20 6b 2d 2d 29 7b 7d 0a 20 20 20 20 20  ]); k--){}.     
c220: 20 20 20 69 66 28 20 7a 4e 61 6d 65 5b 6b 5d 3d     if( zName[k]=
c230: 3d 27 3a 27 20 29 20 6e 4e 61 6d 65 20 3d 20 6b  =':' ) nName = k
c240: 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 5b  ;.        zName[
c250: 6e 4e 61 6d 65 5d 20 3d 20 30 3b 0a 20 20 20 20  nName] = 0;.    
c260: 20 20 20 20 7a 4e 65 77 4e 61 6d 65 20 3d 20 73      zNewName = s
c270: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
c280: 2c 20 22 25 73 3a 25 64 22 2c 20 7a 4e 61 6d 65  , "%s:%d", zName
c290: 2c 20 2b 2b 63 6e 74 29 3b 0a 20 20 20 20 20 20  , ++cnt);.      
c2a0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
c2b0: 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  db, zName);.    
c2c0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 7a 4e 65 77      zName = zNew
c2d0: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 6a 20  Name;.        j 
c2e0: 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 69 66  = -1;.        if
c2f0: 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 62 72 65  ( zName==0 ) bre
c300: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
c310: 7d 0a 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d  }.    pCol->zNam
c320: 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 7d 0a 20  e = zName;.  }. 
c330: 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
c340: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 66 6f 72  ailed ){.    for
c350: 28 6a 3d 30 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 7b  (j=0; j<i; j++){
c360: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
c370: 46 72 65 65 28 64 62 2c 20 61 43 6f 6c 5b 6a 5d  Free(db, aCol[j]
c380: 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20  .zName);.    }. 
c390: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
c3a0: 28 64 62 2c 20 61 43 6f 6c 29 3b 0a 20 20 20 20  (db, aCol);.    
c3b0: 2a 70 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  *paCol = 0;.    
c3c0: 2a 70 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  *pnCol = 0;.    
c3d0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
c3e0: 4d 45 4d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  MEM;.  }.  retur
c3f0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
c400: 2f 2a 0a 2a 2a 20 41 64 64 20 74 79 70 65 20 61  /*.** Add type a
c410: 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 69 6e 66  nd collation inf
c420: 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 61 20 63 6f  ormation to a co
c430: 6c 75 6d 6e 20 6c 69 73 74 20 62 61 73 65 64 20  lumn list based 
c440: 6f 6e 0a 2a 2a 20 61 20 53 45 4c 45 43 54 20 73  on.** a SELECT s
c450: 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 0a 2a 2a  tatement..** .**
c460: 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74   The column list
c470: 20 70 72 65 73 75 6d 61 62 6c 79 20 63 61 6d 65   presumably came
c480: 20 66 72 6f 6d 20 73 65 6c 65 63 74 43 6f 6c 75   from selectColu
c490: 6d 6e 4e 61 6d 65 73 46 72 6f 6d 45 78 70 72 4c  mnNamesFromExprL
c4a0: 69 73 74 28 29 2e 0a 2a 2a 20 54 68 65 20 63 6f  ist()..** The co
c4b0: 6c 75 6d 6e 20 6c 69 73 74 20 68 61 73 20 6f 6e  lumn list has on
c4c0: 6c 79 20 6e 61 6d 65 73 2c 20 6e 6f 74 20 74 79  ly names, not ty
c4d0: 70 65 73 20 6f 72 20 63 6f 6c 6c 61 74 69 6f 6e  pes or collation
c4e0: 73 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74  s.  This.** rout
c4f0: 69 6e 65 20 67 6f 65 73 20 74 68 72 6f 75 67 68  ine goes through
c500: 20 61 6e 64 20 61 64 64 73 20 74 68 65 20 74 79   and adds the ty
c510: 70 65 73 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f  pes and collatio
c520: 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ns..**.** This r
c530: 6f 75 74 69 6e 65 20 72 65 71 75 69 72 65 73 20  outine requires 
c540: 74 68 61 74 20 61 6c 6c 20 69 64 65 6e 74 69 66  that all identif
c550: 69 65 72 73 20 69 6e 20 74 68 65 20 53 45 4c 45  iers in the SELE
c560: 43 54 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20  CT.** statement 
c570: 62 65 20 72 65 73 6f 6c 76 65 64 2e 0a 2a 2f 0a  be resolved..*/.
c580: 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 6c 65  static void sele
c590: 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41  ctAddColumnTypeA
c5a0: 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20 50  ndCollation(.  P
c5b0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
c5c0: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
c5d0: 63 6f 6e 74 65 78 74 73 20 2a 2f 0a 20 20 54 61  contexts */.  Ta
c5e0: 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20 20  ble *pTab,      
c5f0: 20 20 20 20 2f 2a 20 41 64 64 20 63 6f 6c 75 6d      /* Add colum
c600: 6e 20 74 79 70 65 20 69 6e 66 6f 72 6d 61 74 69  n type informati
c610: 6f 6e 20 74 6f 20 74 68 69 73 20 74 61 62 6c 65  on to this table
c620: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53   */.  Select *pS
c630: 65 6c 65 63 74 20 20 20 20 20 20 20 2f 2a 20 53  elect       /* S
c640: 45 4c 45 43 54 20 75 73 65 64 20 74 6f 20 64 65  ELECT used to de
c650: 74 65 72 6d 69 6e 65 20 74 79 70 65 73 20 61 6e  termine types an
c660: 64 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 2a 2f 0a  d collations */.
c670: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
c680: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
c690: 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43   NameContext sNC
c6a0: 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c  ;.  Column *pCol
c6b0: 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f  ;.  CollSeq *pCo
c6c0: 6c 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 45  ll;.  int i;.  E
c6d0: 78 70 72 20 2a 70 3b 0a 20 20 73 74 72 75 63 74  xpr *p;.  struct
c6e0: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
c6f0: 61 3b 0a 20 20 75 36 34 20 73 7a 41 6c 6c 20 3d  a;.  u64 szAll =
c700: 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   0;..  assert( p
c710: 53 65 6c 65 63 74 21 3d 30 20 29 3b 0a 20 20 61  Select!=0 );.  a
c720: 73 73 65 72 74 28 20 28 70 53 65 6c 65 63 74 2d  ssert( (pSelect-
c730: 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52  >selFlags & SF_R
c740: 65 73 6f 6c 76 65 64 29 21 3d 30 20 29 3b 0a 20  esolved)!=0 );. 
c750: 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 6e   assert( pTab->n
c760: 43 6f 6c 3d 3d 70 53 65 6c 65 63 74 2d 3e 70 45  Col==pSelect->pE
c770: 4c 69 73 74 2d 3e 6e 45 78 70 72 20 7c 7c 20 64  List->nExpr || d
c780: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
c790: 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  );.  if( db->mal
c7a0: 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75  locFailed ) retu
c7b0: 72 6e 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 4e  rn;.  memset(&sN
c7c0: 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43  C, 0, sizeof(sNC
c7d0: 29 29 3b 0a 20 20 73 4e 43 2e 70 53 72 63 4c 69  ));.  sNC.pSrcLi
c7e0: 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 53  st = pSelect->pS
c7f0: 72 63 3b 0a 20 20 61 20 3d 20 70 53 65 6c 65 63  rc;.  a = pSelec
c800: 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20  t->pEList->a;.  
c810: 66 6f 72 28 69 3d 30 2c 20 70 43 6f 6c 3d 70 54  for(i=0, pCol=pT
c820: 61 62 2d 3e 61 43 6f 6c 3b 20 69 3c 70 54 61 62  ab->aCol; i<pTab
c830: 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f  ->nCol; i++, pCo
c840: 6c 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20 61 5b  l++){.    p = a[
c850: 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 43  i].pExpr;.    pC
c860: 6f 6c 2d 3e 7a 54 79 70 65 20 3d 20 73 71 6c 69  ol->zType = sqli
c870: 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
c880: 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c  columnType(&sNC,
c890: 20 70 2c 30 2c 30 2c 30 2c 20 26 70 43 6f 6c 2d   p,0,0,0, &pCol-
c8a0: 3e 73 7a 45 73 74 29 29 3b 0a 20 20 20 20 73 7a  >szEst));.    sz
c8b0: 41 6c 6c 20 2b 3d 20 70 43 6f 6c 2d 3e 73 7a 45  All += pCol->szE
c8c0: 73 74 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 61 66  st;.    pCol->af
c8d0: 66 69 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33  finity = sqlite3
c8e0: 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 29 3b  ExprAffinity(p);
c8f0: 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 61  .    if( pCol->a
c900: 66 66 69 6e 69 74 79 3d 3d 30 20 29 20 70 43 6f  ffinity==0 ) pCo
c910: 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 53 51  l->affinity = SQ
c920: 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20  LITE_AFF_NONE;. 
c930: 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
c940: 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
c950: 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 69 66  arse, p);.    if
c960: 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20  ( pColl ){.     
c970: 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 20 3d 20 73   pCol->zColl = s
c980: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
c990: 62 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29  b, pColl->zName)
c9a0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 54  ;.    }.  }.  pT
c9b0: 61 62 2d 3e 73 7a 54 61 62 52 6f 77 20 3d 20 73  ab->szTabRow = s
c9c0: 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 73 7a 41  qlite3LogEst(szA
c9d0: 6c 6c 2a 34 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ll*4);.}../*.** 
c9e0: 47 69 76 65 6e 20 61 20 53 45 4c 45 43 54 20 73  Given a SELECT s
c9f0: 74 61 74 65 6d 65 6e 74 2c 20 67 65 6e 65 72 61  tatement, genera
ca00: 74 65 20 61 20 54 61 62 6c 65 20 73 74 72 75 63  te a Table struc
ca10: 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69  ture that descri
ca20: 62 65 73 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c  bes.** the resul
ca30: 74 20 73 65 74 20 6f 66 20 74 68 61 74 20 53 45  t set of that SE
ca40: 4c 45 43 54 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a  LECT..*/.Table *
ca50: 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74  sqlite3ResultSet
ca60: 4f 66 53 65 6c 65 63 74 28 50 61 72 73 65 20 2a  OfSelect(Parse *
ca70: 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a  pParse, Select *
ca80: 70 53 65 6c 65 63 74 29 7b 0a 20 20 54 61 62 6c  pSelect){.  Tabl
ca90: 65 20 2a 70 54 61 62 3b 0a 20 20 73 71 6c 69 74  e *pTab;.  sqlit
caa0: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
cab0: 3e 64 62 3b 0a 20 20 69 6e 74 20 73 61 76 65 64  >db;.  int saved
cac0: 46 6c 61 67 73 3b 0a 0a 20 20 73 61 76 65 64 46  Flags;..  savedF
cad0: 6c 61 67 73 20 3d 20 64 62 2d 3e 66 6c 61 67 73  lags = db->flags
cae0: 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d  ;.  db->flags &=
caf0: 20 7e 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c   ~SQLITE_FullCol
cb00: 4e 61 6d 65 73 3b 0a 20 20 64 62 2d 3e 66 6c 61  Names;.  db->fla
cb10: 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 53 68 6f  gs |= SQLITE_Sho
cb20: 72 74 43 6f 6c 4e 61 6d 65 73 3b 0a 20 20 73 71  rtColNames;.  sq
cb30: 6c 69 74 65 33 53 65 6c 65 63 74 50 72 65 70 28  lite3SelectPrep(
cb40: 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c  pParse, pSelect,
cb50: 20 30 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73   0);.  if( pPars
cb60: 65 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e  e->nErr ) return
cb70: 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 70 53 65   0;.  while( pSe
cb80: 6c 65 63 74 2d 3e 70 50 72 69 6f 72 20 29 20 70  lect->pPrior ) p
cb90: 53 65 6c 65 63 74 20 3d 20 70 53 65 6c 65 63 74  Select = pSelect
cba0: 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 64 62 2d 3e  ->pPrior;.  db->
cbb0: 66 6c 61 67 73 20 3d 20 73 61 76 65 64 46 6c 61  flags = savedFla
cbc0: 67 73 3b 0a 20 20 70 54 61 62 20 3d 20 73 71 6c  gs;.  pTab = sql
cbd0: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
cbe0: 28 64 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c  (db, sizeof(Tabl
cbf0: 65 29 20 29 3b 0a 20 20 69 66 28 20 70 54 61 62  e) );.  if( pTab
cc00: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
cc10: 6e 20 30 3b 0a 20 20 7d 0a 20 20 2f 2a 20 54 68  n 0;.  }.  /* Th
cc20: 65 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53  e sqlite3ResultS
cc30: 65 74 4f 66 53 65 6c 65 63 74 28 29 20 69 73 20  etOfSelect() is 
cc40: 6f 6e 6c 79 20 75 73 65 64 20 6e 20 63 6f 6e 74  only used n cont
cc50: 65 78 74 73 20 77 68 65 72 65 20 6c 6f 6f 6b 61  exts where looka
cc60: 73 69 64 65 0a 20 20 2a 2a 20 69 73 20 64 69 73  side.  ** is dis
cc70: 61 62 6c 65 64 20 2a 2f 0a 20 20 61 73 73 65 72  abled */.  asser
cc80: 74 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65  t( db->lookaside
cc90: 2e 62 45 6e 61 62 6c 65 64 3d 3d 30 20 29 3b 0a  .bEnabled==0 );.
cca0: 20 20 70 54 61 62 2d 3e 6e 52 65 66 20 3d 20 31    pTab->nRef = 1
ccb0: 3b 0a 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20  ;.  pTab->zName 
ccc0: 3d 20 30 3b 0a 20 20 70 54 61 62 2d 3e 6e 52 6f  = 0;.  pTab->nRo
ccd0: 77 45 73 74 20 3d 20 31 30 34 38 35 37 36 3b 0a  wEst = 1048576;.
cce0: 20 20 73 65 6c 65 63 74 43 6f 6c 75 6d 6e 73 46    selectColumnsF
ccf0: 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72  romExprList(pPar
cd00: 73 65 2c 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c  se, pSelect->pEL
cd10: 69 73 74 2c 20 26 70 54 61 62 2d 3e 6e 43 6f 6c  ist, &pTab->nCol
cd20: 2c 20 26 70 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a  , &pTab->aCol);.
cd30: 20 20 73 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d    selectAddColum
cd40: 6e 54 79 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f  nTypeAndCollatio
cd50: 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20  n(pParse, pTab, 
cd60: 70 53 65 6c 65 63 74 29 3b 0a 20 20 70 54 61 62  pSelect);.  pTab
cd70: 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20  ->iPKey = -1;.  
cd80: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
cd90: 69 6c 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69  iled ){.    sqli
cda0: 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64  te3DeleteTable(d
cdb0: 62 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 72 65  b, pTab);.    re
cdc0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65  turn 0;.  }.  re
cdd0: 74 75 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a  turn pTab;.}../*
cde0: 0a 2a 2a 20 47 65 74 20 61 20 56 44 42 45 20 66  .** Get a VDBE f
cdf0: 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70 61 72  or the given par
ce00: 73 65 72 20 63 6f 6e 74 65 78 74 2e 20 20 43 72  ser context.  Cr
ce10: 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 69  eate a new one i
ce20: 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20  f necessary..** 
ce30: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
ce40: 72 73 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20  rs, return NULL 
ce50: 61 6e 64 20 6c 65 61 76 65 20 61 20 6d 65 73 73  and leave a mess
ce60: 61 67 65 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a  age in pParse..*
ce70: 2f 0a 56 64 62 65 20 2a 73 71 6c 69 74 65 33 47  /.Vdbe *sqlite3G
ce80: 65 74 56 64 62 65 28 50 61 72 73 65 20 2a 70 50  etVdbe(Parse *pP
ce90: 61 72 73 65 29 7b 0a 20 20 56 64 62 65 20 2a 76  arse){.  Vdbe *v
cea0: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
ceb0: 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 7b 0a  ;.  if( v==0 ){.
cec0: 20 20 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e      v = pParse->
ced0: 70 56 64 62 65 20 3d 20 73 71 6c 69 74 65 33 56  pVdbe = sqlite3V
cee0: 64 62 65 43 72 65 61 74 65 28 70 50 61 72 73 65  dbeCreate(pParse
cef0: 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
cf00: 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a 20 20 20  E_OMIT_TRACE.   
cf10: 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 20 20   if( v ){.      
cf20: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
cf30: 30 28 76 2c 20 4f 50 5f 54 72 61 63 65 29 3b 0a  0(v, OP_Trace);.
cf40: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
cf50: 0a 20 20 72 65 74 75 72 6e 20 76 3b 0a 7d 0a 0a  .  return v;.}..
cf60: 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74  ./*.** Compute t
cf70: 68 65 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f  he iLimit and iO
cf80: 66 66 73 65 74 20 66 69 65 6c 64 73 20 6f 66 20  ffset fields of 
cf90: 74 68 65 20 53 45 4c 45 43 54 20 62 61 73 65 64  the SELECT based
cfa0: 20 6f 6e 20 74 68 65 0a 2a 2a 20 70 4c 69 6d 69   on the.** pLimi
cfb0: 74 20 61 6e 64 20 70 4f 66 66 73 65 74 20 65 78  t and pOffset ex
cfc0: 70 72 65 73 73 69 6f 6e 73 2e 20 20 70 4c 69 6d  pressions.  pLim
cfd0: 69 74 20 61 6e 64 20 70 4f 66 66 73 65 74 20 68  it and pOffset h
cfe0: 6f 6c 64 20 74 68 65 20 65 78 70 72 65 73 73 69  old the expressi
cff0: 6f 6e 73 0a 2a 2a 20 74 68 61 74 20 61 70 70 65  ons.** that appe
d000: 61 72 20 69 6e 20 74 68 65 20 6f 72 69 67 69 6e  ar in the origin
d010: 61 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  al SQL statement
d020: 20 61 66 74 65 72 20 74 68 65 20 4c 49 4d 49 54   after the LIMIT
d030: 20 61 6e 64 20 4f 46 46 53 45 54 0a 2a 2a 20 6b   and OFFSET.** k
d040: 65 79 77 6f 72 64 73 2e 20 20 4f 72 20 4e 55 4c  eywords.  Or NUL
d050: 4c 20 69 66 20 74 68 6f 73 65 20 6b 65 79 77 6f  L if those keywo
d060: 72 64 73 20 61 72 65 20 6f 6d 69 74 74 65 64 2e  rds are omitted.
d070: 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66   iLimit and iOff
d080: 73 65 74 20 0a 2a 2a 20 61 72 65 20 74 68 65 20  set .** are the 
d090: 69 6e 74 65 67 65 72 20 6d 65 6d 6f 72 79 20 72  integer memory r
d0a0: 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 73 20  egister numbers 
d0b0: 66 6f 72 20 63 6f 75 6e 74 65 72 73 20 75 73 65  for counters use
d0c0: 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 0a 2a 2a  d to compute .**
d0d0: 20 74 68 65 20 6c 69 6d 69 74 20 61 6e 64 20 6f   the limit and o
d0e0: 66 66 73 65 74 2e 20 20 49 66 20 74 68 65 72 65  ffset.  If there
d0f0: 20 69 73 20 6e 6f 20 6c 69 6d 69 74 20 61 6e 64   is no limit and
d100: 2f 6f 72 20 6f 66 66 73 65 74 2c 20 74 68 65 6e  /or offset, then
d110: 20 0a 2a 2a 20 69 4c 69 6d 69 74 20 61 6e 64 20   .** iLimit and 
d120: 69 4f 66 66 73 65 74 20 61 72 65 20 6e 65 67 61  iOffset are nega
d130: 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tive..**.** This
d140: 20 72 6f 75 74 69 6e 65 20 63 68 61 6e 67 65 73   routine changes
d150: 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66 20 69   the values of i
d160: 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65  Limit and iOffse
d170: 74 20 6f 6e 6c 79 20 69 66 0a 2a 2a 20 61 20 6c  t only if.** a l
d180: 69 6d 69 74 20 6f 72 20 6f 66 66 73 65 74 20 69  imit or offset i
d190: 73 20 64 65 66 69 6e 65 64 20 62 79 20 70 4c 69  s defined by pLi
d1a0: 6d 69 74 20 61 6e 64 20 70 4f 66 66 73 65 74 2e  mit and pOffset.
d1b0: 20 20 69 4c 69 6d 69 74 20 61 6e 64 0a 2a 2a 20    iLimit and.** 
d1c0: 69 4f 66 66 73 65 74 20 73 68 6f 75 6c 64 20 68  iOffset should h
d1d0: 61 76 65 20 62 65 65 6e 20 70 72 65 73 65 74 20  ave been preset 
d1e0: 74 6f 20 61 70 70 72 6f 70 72 69 61 74 65 20 64  to appropriate d
d1f0: 65 66 61 75 6c 74 20 76 61 6c 75 65 73 0a 2a 2a  efault values.**
d200: 20 28 75 73 75 61 6c 6c 79 20 62 75 74 20 6e 6f   (usually but no
d210: 74 20 61 6c 77 61 79 73 20 2d 31 29 20 70 72 69  t always -1) pri
d220: 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68  or to calling th
d230: 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 20 4f  is routine..** O
d240: 6e 6c 79 20 69 66 20 70 4c 69 6d 69 74 21 3d 30  nly if pLimit!=0
d250: 20 6f 72 20 70 4f 66 66 73 65 74 21 3d 30 20 64   or pOffset!=0 d
d260: 6f 20 74 68 65 20 6c 69 6d 69 74 20 72 65 67 69  o the limit regi
d270: 73 74 65 72 73 20 67 65 74 0a 2a 2a 20 72 65 64  sters get.** red
d280: 65 66 69 6e 65 64 2e 20 20 54 68 65 20 55 4e 49  efined.  The UNI
d290: 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72 20  ON ALL operator 
d2a0: 75 73 65 73 20 74 68 69 73 20 70 72 6f 70 65 72  uses this proper
d2b0: 74 79 20 74 6f 20 66 6f 72 63 65 0a 2a 2a 20 74  ty to force.** t
d2c0: 68 65 20 72 65 75 73 65 20 6f 66 20 74 68 65 20  he reuse of the 
d2d0: 73 61 6d 65 20 6c 69 6d 69 74 20 61 6e 64 20 6f  same limit and o
d2e0: 66 66 73 65 74 20 72 65 67 69 73 74 65 72 73 20  ffset registers 
d2f0: 61 63 72 6f 73 73 20 6d 75 6c 74 69 70 6c 65 0a  across multiple.
d300: 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  ** SELECT statem
d310: 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ents..*/.static 
d320: 76 6f 69 64 20 63 6f 6d 70 75 74 65 4c 69 6d 69  void computeLimi
d330: 74 52 65 67 69 73 74 65 72 73 28 50 61 72 73 65  tRegisters(Parse
d340: 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74   *pParse, Select
d350: 20 2a 70 2c 20 69 6e 74 20 69 42 72 65 61 6b 29   *p, int iBreak)
d360: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 30 3b  {.  Vdbe *v = 0;
d370: 0a 20 20 69 6e 74 20 69 4c 69 6d 69 74 20 3d 20  .  int iLimit = 
d380: 30 3b 0a 20 20 69 6e 74 20 69 4f 66 66 73 65 74  0;.  int iOffset
d390: 3b 0a 20 20 69 6e 74 20 61 64 64 72 31 2c 20 6e  ;.  int addr1, n
d3a0: 3b 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69  ;.  if( p->iLimi
d3b0: 74 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f  t ) return;..  /
d3c0: 2a 20 0a 20 20 2a 2a 20 22 4c 49 4d 49 54 20 2d  * .  ** "LIMIT -
d3d0: 31 22 20 61 6c 77 61 79 73 20 73 68 6f 77 73 20  1" always shows 
d3e0: 61 6c 6c 20 72 6f 77 73 2e 20 20 54 68 65 72 65  all rows.  There
d3f0: 20 69 73 20 73 6f 6d 65 0a 20 20 2a 2a 20 63 6f   is some.  ** co
d400: 6e 74 72 6f 76 65 72 73 79 20 61 62 6f 75 74 20  ntroversy about 
d410: 77 68 61 74 20 74 68 65 20 63 6f 72 72 65 63 74  what the correct
d420: 20 62 65 68 61 76 69 6f 72 20 73 68 6f 75 6c 64   behavior should
d430: 20 62 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63 75   be..  ** The cu
d440: 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61  rrent implementa
d450: 74 69 6f 6e 20 69 6e 74 65 72 70 72 65 74 73 20  tion interprets 
d460: 22 4c 49 4d 49 54 20 30 22 20 74 6f 20 6d 65 61  "LIMIT 0" to mea
d470: 6e 0a 20 20 2a 2a 20 6e 6f 20 72 6f 77 73 2e 0a  n.  ** no rows..
d480: 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 78    */.  sqlite3Ex
d490: 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61  prCacheClear(pPa
d4a0: 72 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20  rse);.  assert( 
d4b0: 70 2d 3e 70 4f 66 66 73 65 74 3d 3d 30 20 7c 7c  p->pOffset==0 ||
d4c0: 20 70 2d 3e 70 4c 69 6d 69 74 21 3d 30 20 29 3b   p->pLimit!=0 );
d4d0: 0a 20 20 69 66 28 20 70 2d 3e 70 4c 69 6d 69 74  .  if( p->pLimit
d4e0: 20 29 7b 0a 20 20 20 20 70 2d 3e 69 4c 69 6d 69   ){.    p->iLimi
d4f0: 74 20 3d 20 69 4c 69 6d 69 74 20 3d 20 2b 2b 70  t = iLimit = ++p
d500: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
d510: 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
d520: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20  dbe(pParse);.   
d530: 20 69 66 28 20 4e 45 56 45 52 28 76 3d 3d 30 29   if( NEVER(v==0)
d540: 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 56   ) return;  /* V
d550: 44 42 45 20 73 68 6f 75 6c 64 20 68 61 76 65 20  DBE should have 
d560: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c  already been all
d570: 6f 63 61 74 65 64 20 2a 2f 0a 20 20 20 20 69 66  ocated */.    if
d580: 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49  ( sqlite3ExprIsI
d590: 6e 74 65 67 65 72 28 70 2d 3e 70 4c 69 6d 69 74  nteger(p->pLimit
d5a0: 2c 20 26 6e 29 20 29 7b 0a 20 20 20 20 20 20 73  , &n) ){.      s
d5b0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
d5c0: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
d5d0: 6e 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20  n, iLimit);.    
d5e0: 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
d5f0: 2c 20 22 4c 49 4d 49 54 20 63 6f 75 6e 74 65 72  , "LIMIT counter
d600: 22 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  "));.      if( n
d610: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
d620: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
d630: 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
d640: 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 7d  iBreak);.      }
d650: 65 6c 73 65 20 69 66 28 20 6e 3e 3d 30 20 26 26  else if( n>=0 &&
d660: 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3e 28   p->nSelectRow>(
d670: 75 36 34 29 6e 20 29 7b 0a 20 20 20 20 20 20 20  u64)n ){.       
d680: 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d   p->nSelectRow =
d690: 20 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   n;.      }.    
d6a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
d6b0: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
d6c0: 72 73 65 2c 20 70 2d 3e 70 4c 69 6d 69 74 2c 20  rse, p->pLimit, 
d6d0: 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 73  iLimit);.      s
d6e0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
d6f0: 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74  (v, OP_MustBeInt
d700: 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20  , iLimit);.     
d710: 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
d720: 20 22 4c 49 4d 49 54 20 63 6f 75 6e 74 65 72 22   "LIMIT counter"
d730: 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
d740: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
d750: 50 5f 49 66 5a 65 72 6f 2c 20 69 4c 69 6d 69 74  P_IfZero, iLimit
d760: 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 7d  , iBreak);.    }
d770: 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 66 66  .    if( p->pOff
d780: 73 65 74 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  set ){.      p->
d790: 69 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 73 65  iOffset = iOffse
d7a0: 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  t = ++pParse->nM
d7b0: 65 6d 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  em;.      pParse
d7c0: 2d 3e 6e 4d 65 6d 2b 2b 3b 20 20 20 2f 2a 20 41  ->nMem++;   /* A
d7d0: 6c 6c 6f 63 61 74 65 20 61 6e 20 65 78 74 72 61  llocate an extra
d7e0: 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 6c 69   register for li
d7f0: 6d 69 74 2b 6f 66 66 73 65 74 20 2a 2f 0a 20 20  mit+offset */.  
d800: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
d810: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 2d 3e 70  ode(pParse, p->p
d820: 4f 66 66 73 65 74 2c 20 69 4f 66 66 73 65 74 29  Offset, iOffset)
d830: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
d840: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
d850: 4d 75 73 74 42 65 49 6e 74 2c 20 69 4f 66 66 73  MustBeInt, iOffs
d860: 65 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  et);.      VdbeC
d870: 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 46 46 53  omment((v, "OFFS
d880: 45 54 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20  ET counter"));. 
d890: 20 20 20 20 20 61 64 64 72 31 20 3d 20 73 71 6c       addr1 = sql
d8a0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
d8b0: 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69 4f 66 66  , OP_IfPos, iOff
d8c0: 73 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  set);.      sqli
d8d0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
d8e0: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
d8f0: 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20  iOffset);.      
d900: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
d910: 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20  ere(v, addr1);. 
d920: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
d930: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 41 64 64  AddOp3(v, OP_Add
d940: 2c 20 69 4c 69 6d 69 74 2c 20 69 4f 66 66 73 65  , iLimit, iOffse
d950: 74 2c 20 69 4f 66 66 73 65 74 2b 31 29 3b 0a 20  t, iOffset+1);. 
d960: 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
d970: 28 28 76 2c 20 22 4c 49 4d 49 54 2b 4f 46 46 53  ((v, "LIMIT+OFFS
d980: 45 54 22 29 29 3b 0a 20 20 20 20 20 20 61 64 64  ET"));.      add
d990: 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  r1 = sqlite3Vdbe
d9a0: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 50  AddOp1(v, OP_IfP
d9b0: 6f 73 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20  os, iLimit);.   
d9c0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
d9d0: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
d9e0: 65 72 2c 20 2d 31 2c 20 69 4f 66 66 73 65 74 2b  er, -1, iOffset+
d9f0: 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
da00: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
da10: 20 61 64 64 72 31 29 3b 0a 20 20 20 20 7d 0a 20   addr1);.    }. 
da20: 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51   }.}..#ifndef SQ
da30: 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
da40: 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20  ND_SELECT./*.** 
da50: 52 65 74 75 72 6e 20 74 68 65 20 61 70 70 72 6f  Return the appro
da60: 70 72 69 61 74 65 20 63 6f 6c 6c 61 74 69 6e 67  priate collating
da70: 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68   sequence for th
da80: 65 20 69 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e  e iCol-th column
da90: 20 6f 66 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c   of.** the resul
daa0: 74 20 73 65 74 20 66 6f 72 20 74 68 65 20 63 6f  t set for the co
dab0: 6d 70 6f 75 6e 64 2d 73 65 6c 65 63 74 20 73 74  mpound-select st
dac0: 61 74 65 6d 65 6e 74 20 22 70 22 2e 20 20 52 65  atement "p".  Re
dad0: 74 75 72 6e 20 4e 55 4c 4c 20 69 66 0a 2a 2a 20  turn NULL if.** 
dae0: 74 68 65 20 63 6f 6c 75 6d 6e 20 68 61 73 20 6e  the column has n
daf0: 6f 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74  o default collat
db00: 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2a  ing sequence..**
db10: 0a 2a 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69 6e  .** The collatin
db20: 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74  g sequence for t
db30: 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65  he compound sele
db40: 63 74 20 69 73 20 74 61 6b 65 6e 20 66 72 6f 6d  ct is taken from
db50: 20 74 68 65 0a 2a 2a 20 6c 65 66 74 2d 6d 6f 73   the.** left-mos
db60: 74 20 74 65 72 6d 20 6f 66 20 74 68 65 20 73 65  t term of the se
db70: 6c 65 63 74 20 74 68 61 74 20 68 61 73 20 61 20  lect that has a 
db80: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
db90: 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 43 6f  ce..*/.static Co
dba0: 6c 6c 53 65 71 20 2a 6d 75 6c 74 69 53 65 6c 65  llSeq *multiSele
dbb0: 63 74 43 6f 6c 6c 53 65 71 28 50 61 72 73 65 20  ctCollSeq(Parse 
dbc0: 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20  *pParse, Select 
dbd0: 2a 70 2c 20 69 6e 74 20 69 43 6f 6c 29 7b 0a 20  *p, int iCol){. 
dbe0: 20 43 6f 6c 6c 53 65 71 20 2a 70 52 65 74 3b 0a   CollSeq *pRet;.
dbf0: 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20    if( p->pPrior 
dc00: 29 7b 0a 20 20 20 20 70 52 65 74 20 3d 20 6d 75  ){.    pRet = mu
dc10: 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71  ltiSelectCollSeq
dc20: 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 50 72 69  (pParse, p->pPri
dc30: 6f 72 2c 20 69 43 6f 6c 29 3b 0a 20 20 7d 65 6c  or, iCol);.  }el
dc40: 73 65 7b 0a 20 20 20 20 70 52 65 74 20 3d 20 30  se{.    pRet = 0
dc50: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
dc60: 69 43 6f 6c 3e 3d 30 20 29 3b 0a 20 20 69 66 28  iCol>=0 );.  if(
dc70: 20 70 52 65 74 3d 3d 30 20 26 26 20 69 43 6f 6c   pRet==0 && iCol
dc80: 3c 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  <p->pEList->nExp
dc90: 72 20 29 7b 0a 20 20 20 20 70 52 65 74 20 3d 20  r ){.    pRet = 
dca0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
dcb0: 65 71 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 45  eq(pParse, p->pE
dcc0: 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45  List->a[iCol].pE
dcd0: 78 70 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  xpr);.  }.  retu
dce0: 72 6e 20 70 52 65 74 3b 0a 7d 0a 23 65 6e 64 69  rn pRet;.}.#endi
dcf0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
dd00: 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
dd10: 20 2a 2f 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20   */../* Forward 
dd20: 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61  reference */.sta
dd30: 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c  tic int multiSel
dd40: 65 63 74 4f 72 64 65 72 42 79 28 0a 20 20 50 61  ectOrderBy(.  Pa
dd50: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
dd60: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
dd70: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
dd80: 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
dd90: 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 6d    /* The right-m
dda0: 6f 73 74 20 6f 66 20 53 45 4c 45 43 54 73 20 74  ost of SELECTs t
ddb0: 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20  o be coded */.  
ddc0: 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73  SelectDest *pDes
ddd0: 74 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f  t     /* What to
dde0: 20 64 6f 20 77 69 74 68 20 71 75 65 72 79 20 72   do with query r
ddf0: 65 73 75 6c 74 73 20 2a 2f 0a 29 3b 0a 0a 0a 23  esults */.);...#
de00: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
de10: 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  IT_COMPOUND_SELE
de20: 43 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  CT./*.** This ro
de30: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
de40: 74 6f 20 70 72 6f 63 65 73 73 20 61 20 63 6f 6d  to process a com
de50: 70 6f 75 6e 64 20 71 75 65 72 79 20 66 6f 72 6d  pound query form
de60: 20 66 72 6f 6d 0a 2a 2a 20 74 77 6f 20 6f 72 20   from.** two or 
de70: 6d 6f 72 65 20 73 65 70 61 72 61 74 65 20 71 75  more separate qu
de80: 65 72 69 65 73 20 75 73 69 6e 67 20 55 4e 49 4f  eries using UNIO
de90: 4e 2c 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20 45 58  N, UNION ALL, EX
dea0: 43 45 50 54 2c 20 6f 72 0a 2a 2a 20 49 4e 54 45  CEPT, or.** INTE
deb0: 52 53 45 43 54 0a 2a 2a 0a 2a 2a 20 22 70 22 20  RSECT.**.** "p" 
dec0: 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 72 69  points to the ri
ded0: 67 68 74 2d 6d 6f 73 74 20 6f 66 20 74 68 65 20  ght-most of the 
dee0: 74 77 6f 20 71 75 65 72 69 65 73 2e 20 20 74 68  two queries.  th
def0: 65 20 71 75 65 72 79 20 6f 6e 20 74 68 65 0a 2a  e query on the.*
df00: 2a 20 6c 65 66 74 20 69 73 20 70 2d 3e 70 50 72  * left is p->pPr
df10: 69 6f 72 2e 20 20 54 68 65 20 6c 65 66 74 20 71  ior.  The left q
df20: 75 65 72 79 20 63 6f 75 6c 64 20 61 6c 73 6f 20  uery could also 
df30: 62 65 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75  be a compound qu
df40: 65 72 79 0a 2a 2a 20 69 6e 20 77 68 69 63 68 20  ery.** in which 
df50: 63 61 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e  case this routin
df60: 65 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64  e will be called
df70: 20 72 65 63 75 72 73 69 76 65 6c 79 2e 20 0a 2a   recursively. .*
df80: 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 73  *.** The results
df90: 20 6f 66 20 74 68 65 20 74 6f 74 61 6c 20 71 75   of the total qu
dfa0: 65 72 79 20 61 72 65 20 74 6f 20 62 65 20 77 72  ery are to be wr
dfb0: 69 74 74 65 6e 20 69 6e 74 6f 20 61 20 64 65 73  itten into a des
dfc0: 74 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74  tination.** of t
dfd0: 79 70 65 20 65 44 65 73 74 20 77 69 74 68 20 70  ype eDest with p
dfe0: 61 72 61 6d 65 74 65 72 20 69 50 61 72 6d 2e 0a  arameter iParm..
dff0: 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 20 31 3a  **.** Example 1:
e000: 20 20 43 6f 6e 73 69 64 65 72 20 61 20 74 68 72    Consider a thr
e010: 65 65 2d 77 61 79 20 63 6f 6d 70 6f 75 6e 64 20  ee-way compound 
e020: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  SQL statement..*
e030: 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20  *.**     SELECT 
e040: 61 20 46 52 4f 4d 20 74 31 20 55 4e 49 4f 4e 20  a FROM t1 UNION 
e050: 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 74 32  SELECT b FROM t2
e060: 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 63 20   UNION SELECT c 
e070: 46 52 4f 4d 20 74 33 0a 2a 2a 0a 2a 2a 20 54 68  FROM t3.**.** Th
e080: 69 73 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20  is statement is 
e090: 70 61 72 73 65 64 20 75 70 20 61 73 20 66 6f 6c  parsed up as fol
e0a0: 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  lows:.**.**     
e0b0: 53 45 4c 45 43 54 20 63 20 46 52 4f 4d 20 74 33  SELECT c FROM t3
e0c0: 0a 2a 2a 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20  .**      |.**   
e0d0: 20 20 20 60 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45     `----->  SELE
e0e0: 43 54 20 62 20 46 52 4f 4d 20 74 32 0a 2a 2a 20  CT b FROM t2.** 
e0f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
e100: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
e110: 20 20 20 60 2d 2d 2d 2d 2d 2d 3e 20 20 53 45 4c     `------>  SEL
e120: 45 43 54 20 61 20 46 52 4f 4d 20 74 31 0a 2a 2a  ECT a FROM t1.**
e130: 0a 2a 2a 20 54 68 65 20 61 72 72 6f 77 73 20 69  .** The arrows i
e140: 6e 20 74 68 65 20 64 69 61 67 72 61 6d 20 61 62  n the diagram ab
e150: 6f 76 65 20 72 65 70 72 65 73 65 6e 74 20 74 68  ove represent th
e160: 65 20 53 65 6c 65 63 74 2e 70 50 72 69 6f 72 20  e Select.pPrior 
e170: 70 6f 69 6e 74 65 72 2e 0a 2a 2a 20 53 6f 20 69  pointer..** So i
e180: 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  f this routine i
e190: 73 20 63 61 6c 6c 65 64 20 77 69 74 68 20 70 20  s called with p 
e1a0: 65 71 75 61 6c 20 74 6f 20 74 68 65 20 74 33 20  equal to the t3 
e1b0: 71 75 65 72 79 2c 20 74 68 65 6e 0a 2a 2a 20 70  query, then.** p
e1c0: 50 72 69 6f 72 20 77 69 6c 6c 20 62 65 20 74 68  Prior will be th
e1d0: 65 20 74 32 20 71 75 65 72 79 2e 20 20 70 2d 3e  e t2 query.  p->
e1e0: 6f 70 20 77 69 6c 6c 20 62 65 20 54 4b 5f 55 4e  op will be TK_UN
e1f0: 49 4f 4e 20 69 6e 20 74 68 69 73 20 63 61 73 65  ION in this case
e200: 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 69 63 65 20 74  ..**.** Notice t
e210: 68 61 74 20 62 65 63 61 75 73 65 20 6f 66 20 74  hat because of t
e220: 68 65 20 77 61 79 20 53 51 4c 69 74 65 20 70 61  he way SQLite pa
e230: 72 73 65 73 20 63 6f 6d 70 6f 75 6e 64 20 53 45  rses compound SE
e240: 4c 45 43 54 73 2c 20 74 68 65 0a 2a 2a 20 69 6e  LECTs, the.** in
e250: 64 69 76 69 64 75 61 6c 20 73 65 6c 65 63 74 73  dividual selects
e260: 20 61 6c 77 61 79 73 20 67 72 6f 75 70 20 66 72   always group fr
e270: 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74  om left to right
e280: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
e290: 6d 75 6c 74 69 53 65 6c 65 63 74 28 0a 20 20 50  multiSelect(.  P
e2a0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
e2b0: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
e2c0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
e2d0: 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
e2e0: 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d     /* The right-
e2f0: 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43 54 73 20  most of SELECTs 
e300: 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20  to be coded */. 
e310: 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65   SelectDest *pDe
e320: 73 74 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74  st     /* What t
e330: 6f 20 64 6f 20 77 69 74 68 20 71 75 65 72 79 20  o do with query 
e340: 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20  results */.){.  
e350: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
e360: 4f 4b 3b 20 20 20 2f 2a 20 53 75 63 63 65 73 73  OK;   /* Success
e370: 20 63 6f 64 65 20 66 72 6f 6d 20 61 20 73 75 62   code from a sub
e380: 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 53 65 6c  routine */.  Sel
e390: 65 63 74 20 2a 70 50 72 69 6f 72 3b 20 20 20 20  ect *pPrior;    
e3a0: 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20 53 45     /* Another SE
e3b0: 4c 45 43 54 20 69 6d 6d 65 64 69 61 74 65 6c 79  LECT immediately
e3c0: 20 74 6f 20 6f 75 72 20 6c 65 66 74 20 2a 2f 0a   to our left */.
e3d0: 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20    Vdbe *v;      
e3e0: 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72          /* Gener
e3f0: 61 74 65 20 63 6f 64 65 20 74 6f 20 74 68 69 73  ate code to this
e400: 20 56 44 42 45 20 2a 2f 0a 20 20 53 65 6c 65 63   VDBE */.  Selec
e410: 74 44 65 73 74 20 64 65 73 74 3b 20 20 20 20 20  tDest dest;     
e420: 20 2f 2a 20 41 6c 74 65 72 6e 61 74 69 76 65 20   /* Alternative 
e430: 64 61 74 61 20 64 65 73 74 69 6e 61 74 69 6f 6e  data destination
e440: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 44   */.  Select *pD
e450: 65 6c 65 74 65 20 3d 20 30 3b 20 20 2f 2a 20 43  elete = 0;  /* C
e460: 68 61 69 6e 20 6f 66 20 73 69 6d 70 6c 65 20 73  hain of simple s
e470: 65 6c 65 63 74 73 20 74 6f 20 64 65 6c 65 74 65  elects to delete
e480: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
e490: 62 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  b;          /* D
e4a0: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
e4b0: 6f 6e 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  on */.#ifndef SQ
e4c0: 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
e4d0: 4e 0a 20 20 69 6e 74 20 69 53 75 62 31 3b 20 20  N.  int iSub1;  
e4e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 51 50            /* EQP
e4f0: 20 69 64 20 6f 66 20 6c 65 66 74 2d 68 61 6e 64   id of left-hand
e500: 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20   query */.  int 
e510: 69 53 75 62 32 3b 20 20 20 20 20 20 20 20 20 20  iSub2;          
e520: 20 20 2f 2a 20 45 51 50 20 69 64 20 6f 66 20 72    /* EQP id of r
e530: 69 67 68 74 2d 68 61 6e 64 20 71 75 65 72 79 20  ight-hand query 
e540: 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  */.#endif..  /* 
e550: 4d 61 6b 65 20 73 75 72 65 20 74 68 65 72 65 20  Make sure there 
e560: 69 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 6f  is no ORDER BY o
e570: 72 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 6f  r LIMIT clause o
e580: 6e 20 70 72 69 6f 72 20 53 45 4c 45 43 54 73 2e  n prior SELECTs.
e590: 20 20 4f 6e 6c 79 0a 20 20 2a 2a 20 74 68 65 20    Only.  ** the 
e5a0: 6c 61 73 74 20 28 72 69 67 68 74 2d 6d 6f 73 74  last (right-most
e5b0: 29 20 53 45 4c 45 43 54 20 69 6e 20 74 68 65 20  ) SELECT in the 
e5c0: 73 65 72 69 65 73 20 6d 61 79 20 68 61 76 65 20  series may have 
e5d0: 61 6e 20 4f 52 44 45 52 20 42 59 20 6f 72 20 4c  an ORDER BY or L
e5e0: 49 4d 49 54 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  IMIT..  */.  ass
e5f0: 65 72 74 28 20 70 20 26 26 20 70 2d 3e 70 50 72  ert( p && p->pPr
e600: 69 6f 72 20 29 3b 20 20 2f 2a 20 43 61 6c 6c 69  ior );  /* Calli
e610: 6e 67 20 66 75 6e 63 74 69 6f 6e 20 67 75 61 72  ng function guar
e620: 61 6e 74 65 65 73 20 74 68 69 73 20 6d 75 63 68  antees this much
e630: 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61 72 73   */.  db = pPars
e640: 65 2d 3e 64 62 3b 0a 20 20 70 50 72 69 6f 72 20  e->db;.  pPrior 
e650: 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 61  = p->pPrior;.  a
e660: 73 73 65 72 74 28 20 70 50 72 69 6f 72 2d 3e 70  ssert( pPrior->p
e670: 52 69 67 68 74 6d 6f 73 74 21 3d 70 50 72 69 6f  Rightmost!=pPrio
e680: 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  r );.  assert( p
e690: 50 72 69 6f 72 2d 3e 70 52 69 67 68 74 6d 6f 73  Prior->pRightmos
e6a0: 74 3d 3d 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74  t==p->pRightmost
e6b0: 20 29 3b 0a 20 20 64 65 73 74 20 3d 20 2a 70 44   );.  dest = *pD
e6c0: 65 73 74 3b 0a 20 20 69 66 28 20 70 50 72 69 6f  est;.  if( pPrio
e6d0: 72 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  r->pOrderBy ){. 
e6e0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
e6f0: 73 67 28 70 50 61 72 73 65 2c 22 4f 52 44 45 52  sg(pParse,"ORDER
e700: 20 42 59 20 63 6c 61 75 73 65 20 73 68 6f 75 6c   BY clause shoul
e710: 64 20 63 6f 6d 65 20 61 66 74 65 72 20 25 73 20  d come after %s 
e720: 6e 6f 74 20 62 65 66 6f 72 65 22 2c 0a 20 20 20  not before",.   
e730: 20 20 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28     selectOpName(
e740: 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63 20  p->op));.    rc 
e750: 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75  = 1;.    goto mu
e760: 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
e770: 20 20 7d 0a 20 20 69 66 28 20 70 50 72 69 6f 72    }.  if( pPrior
e780: 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20  ->pLimit ){.    
e790: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
e7a0: 70 50 61 72 73 65 2c 22 4c 49 4d 49 54 20 63 6c  pParse,"LIMIT cl
e7b0: 61 75 73 65 20 73 68 6f 75 6c 64 20 63 6f 6d 65  ause should come
e7c0: 20 61 66 74 65 72 20 25 73 20 6e 6f 74 20 62 65   after %s not be
e7d0: 66 6f 72 65 22 2c 0a 20 20 20 20 20 20 73 65 6c  fore",.      sel
e7e0: 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29  ectOpName(p->op)
e7f0: 29 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  );.    rc = 1;. 
e800: 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
e810: 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20  lect_end;.  }.. 
e820: 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
e830: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 61  dbe(pParse);.  a
e840: 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 20 20  ssert( v!=0 );  
e850: 2f 2a 20 54 68 65 20 56 44 42 45 20 61 6c 72 65  /* The VDBE alre
e860: 61 64 79 20 63 72 65 61 74 65 64 20 62 79 20 63  ady created by c
e870: 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20  alling function 
e880: 2a 2f 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 20  */..  /* Create 
e890: 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20  the destination 
e8a0: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
e8b0: 69 66 20 6e 65 63 65 73 73 61 72 79 0a 20 20 2a  if necessary.  *
e8c0: 2f 0a 20 20 69 66 28 20 64 65 73 74 2e 65 44 65  /.  if( dest.eDe
e8d0: 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61 62  st==SRT_EphemTab
e8e0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
e8f0: 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20  p->pEList );.   
e900: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
e910: 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p2(v, OP_OpenEph
e920: 65 6d 65 72 61 6c 2c 20 64 65 73 74 2e 69 53 44  emeral, dest.iSD
e930: 50 61 72 6d 2c 20 70 2d 3e 70 45 4c 69 73 74 2d  Parm, p->pEList-
e940: 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 73 71 6c  >nExpr);.    sql
e950: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
e960: 28 76 2c 20 42 54 52 45 45 5f 55 4e 4f 52 44 45  (v, BTREE_UNORDE
e970: 52 45 44 29 3b 0a 20 20 20 20 64 65 73 74 2e 65  RED);.    dest.e
e980: 44 65 73 74 20 3d 20 53 52 54 5f 54 61 62 6c 65  Dest = SRT_Table
e990: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65  ;.  }..  /* Make
e9a0: 20 73 75 72 65 20 61 6c 6c 20 53 45 4c 45 43 54   sure all SELECT
e9b0: 73 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65  s in the stateme
e9c0: 6e 74 20 68 61 76 65 20 74 68 65 20 73 61 6d 65  nt have the same
e9d0: 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65   number of eleme
e9e0: 6e 74 73 0a 20 20 2a 2a 20 69 6e 20 74 68 65 69  nts.  ** in thei
e9f0: 72 20 72 65 73 75 6c 74 20 73 65 74 73 2e 0a 20  r result sets.. 
ea00: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d   */.  assert( p-
ea10: 3e 70 45 4c 69 73 74 20 26 26 20 70 50 72 69 6f  >pEList && pPrio
ea20: 72 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 69  r->pEList );.  i
ea30: 66 28 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  f( p->pEList->nE
ea40: 78 70 72 21 3d 70 50 72 69 6f 72 2d 3e 70 45 4c  xpr!=pPrior->pEL
ea50: 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  ist->nExpr ){.  
ea60: 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67    if( p->selFlag
ea70: 73 20 26 20 53 46 5f 56 61 6c 75 65 73 20 29 7b  s & SF_Values ){
ea80: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
ea90: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
eaa0: 61 6c 6c 20 56 41 4c 55 45 53 20 6d 75 73 74 20  all VALUES must 
eab0: 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e 75  have the same nu
eac0: 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 22 29 3b  mber of terms");
ead0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
eae0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
eaf0: 67 28 70 50 61 72 73 65 2c 20 22 53 45 4c 45 43  g(pParse, "SELEC
eb00: 54 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 61  Ts to the left a
eb10: 6e 64 20 72 69 67 68 74 20 6f 66 20 25 73 22 0a  nd right of %s".
eb20: 20 20 20 20 20 20 20 20 22 20 64 6f 20 6e 6f 74          " do not
eb30: 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e   have the same n
eb40: 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20  umber of result 
eb50: 63 6f 6c 75 6d 6e 73 22 2c 20 73 65 6c 65 63 74  columns", select
eb60: 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a  OpName(p->op));.
eb70: 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 31      }.    rc = 1
eb80: 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69  ;.    goto multi
eb90: 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d  _select_end;.  }
eba0: 0a 0a 20 20 2f 2a 20 43 6f 6d 70 6f 75 6e 64 20  ..  /* Compound 
ebb0: 53 45 4c 45 43 54 73 20 74 68 61 74 20 68 61 76  SELECTs that hav
ebc0: 65 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  e an ORDER BY cl
ebd0: 61 75 73 65 20 61 72 65 20 68 61 6e 64 6c 65 64  ause are handled
ebe0: 20 73 65 70 61 72 61 74 65 6c 79 2e 0a 20 20 2a   separately..  *
ebf0: 2f 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65  /.  if( p->pOrde
ec00: 72 42 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72  rBy ){.    retur
ec10: 6e 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64  n multiSelectOrd
ec20: 65 72 42 79 28 70 50 61 72 73 65 2c 20 70 2c 20  erBy(pParse, p, 
ec30: 70 44 65 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f  pDest);.  }..  /
ec40: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
ec50: 66 6f 72 20 74 68 65 20 6c 65 66 74 20 61 6e 64  for the left and
ec60: 20 72 69 67 68 74 20 53 45 4c 45 43 54 20 73 74   right SELECT st
ec70: 61 74 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20  atements..  */. 
ec80: 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29   switch( p->op )
ec90: 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4c  {.    case TK_AL
eca0: 4c 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 61  L: {.      int a
ecb0: 64 64 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  ddr = 0;.      i
ecc0: 6e 74 20 6e 4c 69 6d 69 74 3b 0a 20 20 20 20 20  nt nLimit;.     
ecd0: 20 61 73 73 65 72 74 28 20 21 70 50 72 69 6f 72   assert( !pPrior
ece0: 2d 3e 70 4c 69 6d 69 74 20 29 3b 0a 20 20 20 20  ->pLimit );.    
ecf0: 20 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74    pPrior->iLimit
ed00: 20 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20   = p->iLimit;.  
ed10: 20 20 20 20 70 50 72 69 6f 72 2d 3e 69 4f 66 66      pPrior->iOff
ed20: 73 65 74 20 3d 20 70 2d 3e 69 4f 66 66 73 65 74  set = p->iOffset
ed30: 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e  ;.      pPrior->
ed40: 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d  pLimit = p->pLim
ed50: 69 74 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72  it;.      pPrior
ed60: 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70  ->pOffset = p->p
ed70: 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 65 78  Offset;.      ex
ed80: 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28  plainSetInteger(
ed90: 69 53 75 62 31 2c 20 70 50 61 72 73 65 2d 3e 69  iSub1, pParse->i
eda0: 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20  NextSelectId);. 
edb0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
edc0: 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
edd0: 70 50 72 69 6f 72 2c 20 26 64 65 73 74 29 3b 0a  pPrior, &dest);.
ede0: 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20        p->pLimit 
edf0: 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f  = 0;.      p->pO
ee00: 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20  ffset = 0;.     
ee10: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
ee20: 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
ee30: 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
ee40: 7d 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f  }.      p->pPrio
ee50: 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e  r = 0;.      p->
ee60: 69 4c 69 6d 69 74 20 3d 20 70 50 72 69 6f 72 2d  iLimit = pPrior-
ee70: 3e 69 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70  >iLimit;.      p
ee80: 2d 3e 69 4f 66 66 73 65 74 20 3d 20 70 50 72 69  ->iOffset = pPri
ee90: 6f 72 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 20  or->iOffset;.   
eea0: 20 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74     if( p->iLimit
eeb0: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 64 64 72   ){.        addr
eec0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
eed0: 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 5a 65 72  dOp1(v, OP_IfZer
eee0: 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 29 3b 0a 20  o, p->iLimit);. 
eef0: 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65         VdbeComme
ef00: 6e 74 28 28 76 2c 20 22 4a 75 6d 70 20 61 68 65  nt((v, "Jump ahe
ef10: 61 64 20 69 66 20 4c 49 4d 49 54 20 72 65 61 63  ad if LIMIT reac
ef20: 68 65 64 22 29 29 3b 0a 20 20 20 20 20 20 7d 0a  hed"));.      }.
ef30: 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74        explainSet
ef40: 49 6e 74 65 67 65 72 28 69 53 75 62 32 2c 20 70  Integer(iSub2, p
ef50: 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65  Parse->iNextSele
ef60: 63 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20  ctId);.      rc 
ef70: 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  = sqlite3Select(
ef80: 70 50 61 72 73 65 2c 20 70 2c 20 26 64 65 73 74  pParse, p, &dest
ef90: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
efa0: 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc!=SQLITE_OK
efb0: 20 29 3b 0a 20 20 20 20 20 20 70 44 65 6c 65 74   );.      pDelet
efc0: 65 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20  e = p->pPrior;. 
efd0: 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d       p->pPrior =
efe0: 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70   pPrior;.      p
eff0: 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 2b 3d 20  ->nSelectRow += 
f000: 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52  pPrior->nSelectR
f010: 6f 77 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50  ow;.      if( pP
f020: 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 0a 20 20 20  rior->pLimit.   
f030: 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 45 78      && sqlite3Ex
f040: 70 72 49 73 49 6e 74 65 67 65 72 28 70 50 72 69  prIsInteger(pPri
f050: 6f 72 2d 3e 70 4c 69 6d 69 74 2c 20 26 6e 4c 69  or->pLimit, &nLi
f060: 6d 69 74 29 0a 20 20 20 20 20 20 20 26 26 20 6e  mit).       && n
f070: 4c 69 6d 69 74 3e 30 20 26 26 20 70 2d 3e 6e 53  Limit>0 && p->nS
f080: 65 6c 65 63 74 52 6f 77 20 3e 20 28 75 36 34 29  electRow > (u64)
f090: 6e 4c 69 6d 69 74 20 0a 20 20 20 20 20 20 29 7b  nLimit .      ){
f0a0: 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c  .        p->nSel
f0b0: 65 63 74 52 6f 77 20 3d 20 6e 4c 69 6d 69 74 3b  ectRow = nLimit;
f0c0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
f0d0: 66 28 20 61 64 64 72 20 29 7b 0a 20 20 20 20 20  f( addr ){.     
f0e0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
f0f0: 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b  mpHere(v, addr);
f100: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
f110: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
f120: 63 61 73 65 20 54 4b 5f 45 58 43 45 50 54 3a 0a  case TK_EXCEPT:.
f130: 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4e 49 4f      case TK_UNIO
f140: 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 75  N: {.      int u
f150: 6e 69 6f 6e 54 61 62 3b 20 20 20 20 2f 2a 20 43  nionTab;    /* C
f160: 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20  ursor number of 
f170: 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  the temporary ta
f180: 62 6c 65 20 68 6f 6c 64 69 6e 67 20 72 65 73 75  ble holding resu
f190: 6c 74 20 2a 2f 0a 20 20 20 20 20 20 75 38 20 6f  lt */.      u8 o
f1a0: 70 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  p = 0;       /* 
f1b0: 4f 6e 65 20 6f 66 20 74 68 65 20 53 52 54 5f 20  One of the SRT_ 
f1c0: 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f 20 61 70  operations to ap
f1d0: 70 6c 79 20 74 6f 20 73 65 6c 66 20 2a 2f 0a 20  ply to self */. 
f1e0: 20 20 20 20 20 69 6e 74 20 70 72 69 6f 72 4f 70       int priorOp
f1f0: 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 53 52 54  ;     /* The SRT
f200: 5f 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20 61  _ operation to a
f210: 70 70 6c 79 20 74 6f 20 70 72 69 6f 72 20 73 65  pply to prior se
f220: 6c 65 63 74 73 20 2a 2f 0a 20 20 20 20 20 20 45  lects */.      E
f230: 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f  xpr *pLimit, *pO
f240: 66 66 73 65 74 3b 20 2f 2a 20 53 61 76 65 64 20  ffset; /* Saved 
f250: 76 61 6c 75 65 73 20 6f 66 20 70 2d 3e 6e 4c 69  values of p->nLi
f260: 6d 69 74 20 61 6e 64 20 70 2d 3e 6e 4f 66 66 73  mit and p->nOffs
f270: 65 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  et */.      int 
f280: 61 64 64 72 3b 0a 20 20 20 20 20 20 53 65 6c 65  addr;.      Sele
f290: 63 74 44 65 73 74 20 75 6e 69 6f 6e 64 65 73 74  ctDest uniondest
f2a0: 3b 0a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  ;..      testcas
f2b0: 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 43  e( p->op==TK_EXC
f2c0: 45 50 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73  EPT );.      tes
f2d0: 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b  tcase( p->op==TK
f2e0: 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20  _UNION );.      
f2f0: 70 72 69 6f 72 4f 70 20 3d 20 53 52 54 5f 55 6e  priorOp = SRT_Un
f300: 69 6f 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 64  ion;.      if( d
f310: 65 73 74 2e 65 44 65 73 74 3d 3d 70 72 69 6f 72  est.eDest==prior
f320: 4f 70 20 26 26 20 41 4c 57 41 59 53 28 21 70 2d  Op && ALWAYS(!p-
f330: 3e 70 4c 69 6d 69 74 20 26 26 21 70 2d 3e 70 4f  >pLimit &&!p->pO
f340: 66 66 73 65 74 29 20 29 7b 0a 20 20 20 20 20 20  ffset) ){.      
f350: 20 20 2f 2a 20 57 65 20 63 61 6e 20 72 65 75 73    /* We can reus
f360: 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61  e a temporary ta
f370: 62 6c 65 20 67 65 6e 65 72 61 74 65 64 20 62 79  ble generated by
f380: 20 61 20 53 45 4c 45 43 54 20 74 6f 20 6f 75 72   a SELECT to our
f390: 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 69 67 68  .        ** righ
f3a0: 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  t..        */.  
f3b0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
f3c0: 3e 70 52 69 67 68 74 6d 6f 73 74 21 3d 70 20 29  >pRightmost!=p )
f3d0: 3b 20 20 2f 2a 20 43 61 6e 20 6f 6e 6c 79 20 68  ;  /* Can only h
f3e0: 61 70 70 65 6e 20 66 6f 72 20 6c 65 66 74 77 61  appen for leftwa
f3f0: 72 64 20 65 6c 65 6d 65 6e 74 73 0a 20 20 20 20  rd elements.    
f400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f420: 20 2a 2a 20 6f 66 20 61 20 33 2d 77 61 79 20 6f   ** of a 3-way o
f430: 72 20 6d 6f 72 65 20 63 6f 6d 70 6f 75 6e 64 20  r more compound 
f440: 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
f450: 74 28 20 70 2d 3e 70 4c 69 6d 69 74 3d 3d 30 20  t( p->pLimit==0 
f460: 29 3b 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 61  );      /* Not a
f470: 6c 6c 6f 77 65 64 20 6f 6e 20 6c 65 66 74 77 61  llowed on leftwa
f480: 72 64 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20  rd elements */. 
f490: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
f4a0: 2d 3e 70 4f 66 66 73 65 74 3d 3d 30 20 29 3b 20  ->pOffset==0 ); 
f4b0: 20 20 20 20 2f 2a 20 4e 6f 74 20 61 6c 6c 6f 77      /* Not allow
f4c0: 65 64 20 6f 6e 20 6c 65 66 74 77 61 72 64 20 65  ed on leftward e
f4d0: 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20  lements */.     
f4e0: 20 20 20 75 6e 69 6f 6e 54 61 62 20 3d 20 64 65     unionTab = de
f4f0: 73 74 2e 69 53 44 50 61 72 6d 3b 0a 20 20 20 20  st.iSDParm;.    
f500: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
f510: 20 2f 2a 20 57 65 20 77 69 6c 6c 20 6e 65 65 64   /* We will need
f520: 20 74 6f 20 63 72 65 61 74 65 20 6f 75 72 20 6f   to create our o
f530: 77 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  wn temporary tab
f540: 6c 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a 20  le to hold the. 
f550: 20 20 20 20 20 20 20 2a 2a 20 69 6e 74 65 72 6d         ** interm
f560: 65 64 69 61 74 65 20 72 65 73 75 6c 74 73 2e 0a  ediate results..
f570: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
f580: 20 20 20 75 6e 69 6f 6e 54 61 62 20 3d 20 70 50     unionTab = pP
f590: 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
f5a0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
f5b0: 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a  >pOrderBy==0 );.
f5c0: 20 20 20 20 20 20 20 20 61 64 64 72 20 3d 20 73          addr = s
f5d0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
f5e0: 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
f5f0: 65 72 61 6c 2c 20 75 6e 69 6f 6e 54 61 62 2c 20  eral, unionTab, 
f600: 30 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  0);.        asse
f610: 72 74 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45  rt( p->addrOpenE
f620: 70 68 6d 5b 30 5d 20 3d 3d 20 2d 31 20 29 3b 0a  phm[0] == -1 );.
f630: 20 20 20 20 20 20 20 20 70 2d 3e 61 64 64 72 4f          p->addrO
f640: 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 61 64 64  penEphm[0] = add
f650: 72 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 52  r;.        p->pR
f660: 69 67 68 74 6d 6f 73 74 2d 3e 73 65 6c 46 6c 61  ightmost->selFla
f670: 67 73 20 7c 3d 20 53 46 5f 55 73 65 73 45 70 68  gs |= SF_UsesEph
f680: 65 6d 65 72 61 6c 3b 0a 20 20 20 20 20 20 20 20  emeral;.        
f690: 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73  assert( p->pELis
f6a0: 74 20 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  t );.      }..  
f6b0: 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20      /* Code the 
f6c0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
f6d0: 73 20 74 6f 20 6f 75 72 20 6c 65 66 74 0a 20 20  s to our left.  
f6e0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73      */.      ass
f6f0: 65 72 74 28 20 21 70 50 72 69 6f 72 2d 3e 70 4f  ert( !pPrior->pO
f700: 72 64 65 72 42 79 20 29 3b 0a 20 20 20 20 20 20  rderBy );.      
f710: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73  sqlite3SelectDes
f720: 74 49 6e 69 74 28 26 75 6e 69 6f 6e 64 65 73 74  tInit(&uniondest
f730: 2c 20 70 72 69 6f 72 4f 70 2c 20 75 6e 69 6f 6e  , priorOp, union
f740: 54 61 62 29 3b 0a 20 20 20 20 20 20 65 78 70 6c  Tab);.      expl
f750: 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53  ainSetInteger(iS
f760: 75 62 31 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65  ub1, pParse->iNe
f770: 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20  xtSelectId);.   
f780: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53     rc = sqlite3S
f790: 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50  elect(pParse, pP
f7a0: 72 69 6f 72 2c 20 26 75 6e 69 6f 6e 64 65 73 74  rior, &uniondest
f7b0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
f7c0: 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
f7d0: 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
f7e0: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
f7f0: 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 63 75 72   /* Code the cur
f800: 72 65 6e 74 20 53 45 4c 45 43 54 20 73 74 61 74  rent SELECT stat
f810: 65 6d 65 6e 74 0a 20 20 20 20 20 20 2a 2f 0a 20  ement.      */. 
f820: 20 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d       if( p->op==
f830: 54 4b 5f 45 58 43 45 50 54 20 29 7b 0a 20 20 20  TK_EXCEPT ){.   
f840: 20 20 20 20 20 6f 70 20 3d 20 53 52 54 5f 45 78       op = SRT_Ex
f850: 63 65 70 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73  cept;.      }els
f860: 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  e{.        asser
f870: 74 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49  t( p->op==TK_UNI
f880: 4f 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 6f 70  ON );.        op
f890: 20 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20   = SRT_Union;.  
f8a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 70      }.      p->p
f8b0: 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20  Prior = 0;.     
f8c0: 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69   pLimit = p->pLi
f8d0: 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c  mit;.      p->pL
f8e0: 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  imit = 0;.      
f8f0: 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66  pOffset = p->pOf
f900: 66 73 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70  fset;.      p->p
f910: 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20  Offset = 0;.    
f920: 20 20 75 6e 69 6f 6e 64 65 73 74 2e 65 44 65 73    uniondest.eDes
f930: 74 20 3d 20 6f 70 3b 0a 20 20 20 20 20 20 65 78  t = op;.      ex
f940: 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28  plainSetInteger(
f950: 69 53 75 62 32 2c 20 70 50 61 72 73 65 2d 3e 69  iSub2, pParse->i
f960: 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20  NextSelectId);. 
f970: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
f980: 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
f990: 70 2c 20 26 75 6e 69 6f 6e 64 65 73 74 29 3b 0a  p, &uniondest);.
f9a0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
f9b0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc!=SQLITE_OK );
f9c0: 0a 20 20 20 20 20 20 2f 2a 20 51 75 65 72 79 20  .      /* Query 
f9d0: 66 6c 61 74 74 65 6e 69 6e 67 20 69 6e 20 73 71  flattening in sq
f9e0: 6c 69 74 65 33 53 65 6c 65 63 74 28 29 20 6d 69  lite3Select() mi
f9f0: 67 68 74 20 72 65 66 69 6c 6c 20 70 2d 3e 70 4f  ght refill p->pO
fa00: 72 64 65 72 42 79 2e 0a 20 20 20 20 20 20 2a 2a  rderBy..      **
fa10: 20 42 65 20 73 75 72 65 20 74 6f 20 64 65 6c 65   Be sure to dele
fa20: 74 65 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20  te p->pOrderBy, 
fa30: 74 68 65 72 65 66 6f 72 65 2c 20 74 6f 20 61 76  therefore, to av
fa40: 6f 69 64 20 61 20 6d 65 6d 6f 72 79 20 6c 65 61  oid a memory lea
fa50: 6b 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  k. */.      sqli
fa60: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
fa70: 65 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42  e(db, p->pOrderB
fa80: 79 29 3b 0a 20 20 20 20 20 20 70 44 65 6c 65 74  y);.      pDelet
fa90: 65 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20  e = p->pPrior;. 
faa0: 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d       p->pPrior =
fab0: 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70   pPrior;.      p
fac0: 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  ->pOrderBy = 0;.
fad0: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d        if( p->op=
fae0: 3d 54 4b 5f 55 4e 49 4f 4e 20 29 20 70 2d 3e 6e  =TK_UNION ) p->n
faf0: 53 65 6c 65 63 74 52 6f 77 20 2b 3d 20 70 50 72  SelectRow += pPr
fb00: 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b  ior->nSelectRow;
fb10: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
fb20: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  prDelete(db, p->
fb30: 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 70  pLimit);.      p
fb40: 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69  ->pLimit = pLimi
fb50: 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66  t;.      p->pOff
fb60: 73 65 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a 20  set = pOffset;. 
fb70: 20 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d       p->iLimit =
fb80: 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4f 66   0;.      p->iOf
fb90: 66 73 65 74 20 3d 20 30 3b 0a 0a 20 20 20 20 20  fset = 0;..     
fba0: 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20   /* Convert the 
fbb0: 64 61 74 61 20 69 6e 20 74 68 65 20 74 65 6d 70  data in the temp
fbc0: 6f 72 61 72 79 20 74 61 62 6c 65 20 69 6e 74 6f  orary table into
fbd0: 20 77 68 61 74 65 76 65 72 20 66 6f 72 6d 0a 20   whatever form. 
fbe0: 20 20 20 20 20 2a 2a 20 69 74 20 69 73 20 74 68       ** it is th
fbf0: 61 74 20 77 65 20 63 75 72 72 65 6e 74 6c 79 20  at we currently 
fc00: 6e 65 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  need..      */. 
fc10: 20 20 20 20 20 61 73 73 65 72 74 28 20 75 6e 69       assert( uni
fc20: 6f 6e 54 61 62 3d 3d 64 65 73 74 2e 69 53 44 50  onTab==dest.iSDP
fc30: 61 72 6d 20 7c 7c 20 64 65 73 74 2e 65 44 65 73  arm || dest.eDes
fc40: 74 21 3d 70 72 69 6f 72 4f 70 20 29 3b 0a 20 20  t!=priorOp );.  
fc50: 20 20 20 20 69 66 28 20 64 65 73 74 2e 65 44 65      if( dest.eDe
fc60: 73 74 21 3d 70 72 69 6f 72 4f 70 20 29 7b 0a 20  st!=priorOp ){. 
fc70: 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6e 74         int iCont
fc80: 2c 20 69 42 72 65 61 6b 2c 20 69 53 74 61 72 74  , iBreak, iStart
fc90: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
fca0: 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20  ( p->pEList );. 
fcb0: 20 20 20 20 20 20 20 69 66 28 20 64 65 73 74 2e         if( dest.
fcc0: 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75  eDest==SRT_Outpu
fcd0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 53  t ){.          S
fce0: 65 6c 65 63 74 20 2a 70 46 69 72 73 74 20 3d 20  elect *pFirst = 
fcf0: 70 3b 0a 20 20 20 20 20 20 20 20 20 20 77 68 69  p;.          whi
fd00: 6c 65 28 20 70 46 69 72 73 74 2d 3e 70 50 72 69  le( pFirst->pPri
fd10: 6f 72 20 29 20 70 46 69 72 73 74 20 3d 20 70 46  or ) pFirst = pF
fd20: 69 72 73 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20  irst->pPrior;.  
fd30: 20 20 20 20 20 20 20 20 67 65 6e 65 72 61 74 65          generate
fd40: 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72  ColumnNames(pPar
fd50: 73 65 2c 20 30 2c 20 70 46 69 72 73 74 2d 3e 70  se, 0, pFirst->p
fd60: 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20  EList);.        
fd70: 7d 0a 20 20 20 20 20 20 20 20 69 42 72 65 61 6b  }.        iBreak
fd80: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
fd90: 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
fda0: 20 20 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69      iCont = sqli
fdb0: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
fdc0: 28 76 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6d  (v);.        com
fdd0: 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65  puteLimitRegiste
fde0: 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20 69 42  rs(pParse, p, iB
fdf0: 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 73  reak);.        s
fe00: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
fe10: 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 75  (v, OP_Rewind, u
fe20: 6e 69 6f 6e 54 61 62 2c 20 69 42 72 65 61 6b 29  nionTab, iBreak)
fe30: 3b 0a 20 20 20 20 20 20 20 20 69 53 74 61 72 74  ;.        iStart
fe40: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
fe50: 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
fe60: 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65        selectInne
fe70: 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c  rLoop(pParse, p,
fe80: 20 70 2d 3e 70 45 4c 69 73 74 2c 20 75 6e 69 6f   p->pEList, unio
fe90: 6e 54 61 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2d  nTab, p->pEList-
fea0: 3e 6e 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20  >nExpr,.        
feb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fec0: 30 2c 20 30 2c 20 26 64 65 73 74 2c 20 69 43 6f  0, 0, &dest, iCo
fed0: 6e 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20  nt, iBreak);.   
fee0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
fef0: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
ff00: 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20 20 20  iCont);.        
ff10: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
ff20: 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 75 6e  2(v, OP_Next, un
ff30: 69 6f 6e 54 61 62 2c 20 69 53 74 61 72 74 29 3b  ionTab, iStart);
ff40: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
ff50: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
ff60: 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20  (v, iBreak);.   
ff70: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
ff80: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f  AddOp2(v, OP_Clo
ff90: 73 65 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29  se, unionTab, 0)
ffa0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
ffb0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
ffc0: 20 64 65 66 61 75 6c 74 3a 20 61 73 73 65 72 74   default: assert
ffd0: 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45  ( p->op==TK_INTE
ffe0: 52 53 45 43 54 20 29 3b 20 7b 0a 20 20 20 20 20  RSECT ); {.     
fff0: 20 69 6e 74 20 74 61 62 31 2c 20 74 61 62 32 3b   int tab1, tab2;
10000 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6e 74  .      int iCont
10010 2c 20 69 42 72 65 61 6b 2c 20 69 53 74 61 72 74  , iBreak, iStart
10020 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c  ;.      Expr *pL
10030 69 6d 69 74 2c 20 2a 70 4f 66 66 73 65 74 3b 0a  imit, *pOffset;.
10040 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a        int addr;.
10050 20 20 20 20 20 20 53 65 6c 65 63 74 44 65 73 74        SelectDest
10060 20 69 6e 74 65 72 73 65 63 74 64 65 73 74 3b 0a   intersectdest;.
10070 20 20 20 20 20 20 69 6e 74 20 72 31 3b 0a 0a 20        int r1;.. 
10080 20 20 20 20 20 2f 2a 20 49 4e 54 45 52 53 45 43       /* INTERSEC
10090 54 20 69 73 20 64 69 66 66 65 72 65 6e 74 20 66  T is different f
100a0 72 6f 6d 20 74 68 65 20 6f 74 68 65 72 73 20 73  rom the others s
100b0 69 6e 63 65 20 69 74 20 72 65 71 75 69 72 65 73  ince it requires
100c0 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f 20 74 65  .      ** two te
100d0 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 2e 20  mporary tables. 
100e0 20 48 65 6e 63 65 20 69 74 20 68 61 73 20 69 74   Hence it has it
100f0 73 20 6f 77 6e 20 63 61 73 65 2e 20 20 42 65 67  s own case.  Beg
10100 69 6e 0a 20 20 20 20 20 20 2a 2a 20 62 79 20 61  in.      ** by a
10110 6c 6c 6f 63 61 74 69 6e 67 20 74 68 65 20 74 61  llocating the ta
10120 62 6c 65 73 20 77 65 20 77 69 6c 6c 20 6e 65 65  bles we will nee
10130 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  d..      */.    
10140 20 20 74 61 62 31 20 3d 20 70 50 61 72 73 65 2d    tab1 = pParse-
10150 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 74  >nTab++;.      t
10160 61 62 32 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  ab2 = pParse->nT
10170 61 62 2b 2b 3b 0a 20 20 20 20 20 20 61 73 73 65  ab++;.      asse
10180 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d  rt( p->pOrderBy=
10190 3d 30 20 29 3b 0a 0a 20 20 20 20 20 20 61 64 64  =0 );..      add
101a0 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
101b0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp2(v, OP_Open
101c0 45 70 68 65 6d 65 72 61 6c 2c 20 74 61 62 31 2c  Ephemeral, tab1,
101d0 20 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72   0);.      asser
101e0 74 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70  t( p->addrOpenEp
101f0 68 6d 5b 30 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20  hm[0] == -1 );. 
10200 20 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e       p->addrOpen
10210 45 70 68 6d 5b 30 5d 20 3d 20 61 64 64 72 3b 0a  Ephm[0] = addr;.
10220 20 20 20 20 20 20 70 2d 3e 70 52 69 67 68 74 6d        p->pRightm
10230 6f 73 74 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d  ost->selFlags |=
10240 20 53 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61   SF_UsesEphemera
10250 6c 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  l;.      assert(
10260 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 0a 20   p->pEList );.. 
10270 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65       /* Code the
10280 20 53 45 4c 45 43 54 73 20 74 6f 20 6f 75 72 20   SELECTs to our 
10290 6c 65 66 74 20 69 6e 74 6f 20 74 65 6d 70 6f 72  left into tempor
102a0 61 72 79 20 74 61 62 6c 65 20 22 74 61 62 31 22  ary table "tab1"
102b0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
102c0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
102d0 73 74 49 6e 69 74 28 26 69 6e 74 65 72 73 65 63  stInit(&intersec
102e0 74 64 65 73 74 2c 20 53 52 54 5f 55 6e 69 6f 6e  tdest, SRT_Union
102f0 2c 20 74 61 62 31 29 3b 0a 20 20 20 20 20 20 65  , tab1);.      e
10300 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72  xplainSetInteger
10310 28 69 53 75 62 31 2c 20 70 50 61 72 73 65 2d 3e  (iSub1, pParse->
10320 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a  iNextSelectId);.
10330 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
10340 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
10350 20 70 50 72 69 6f 72 2c 20 26 69 6e 74 65 72 73   pPrior, &inters
10360 65 63 74 64 65 73 74 29 3b 0a 20 20 20 20 20 20  ectdest);.      
10370 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
10380 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
10390 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d  ect_end;.      }
103a0 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20  ..      /* Code 
103b0 74 68 65 20 63 75 72 72 65 6e 74 20 53 45 4c 45  the current SELE
103c0 43 54 20 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72  CT into temporar
103d0 79 20 74 61 62 6c 65 20 22 74 61 62 32 22 0a 20  y table "tab2". 
103e0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 64       */.      ad
103f0 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
10400 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65  AddOp2(v, OP_Ope
10410 6e 45 70 68 65 6d 65 72 61 6c 2c 20 74 61 62 32  nEphemeral, tab2
10420 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65  , 0);.      asse
10430 72 74 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45  rt( p->addrOpenE
10440 70 68 6d 5b 31 5d 20 3d 3d 20 2d 31 20 29 3b 0a  phm[1] == -1 );.
10450 20 20 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65        p->addrOpe
10460 6e 45 70 68 6d 5b 31 5d 20 3d 20 61 64 64 72 3b  nEphm[1] = addr;
10470 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72  .      p->pPrior
10480 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4c 69 6d   = 0;.      pLim
10490 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a  it = p->pLimit;.
104a0 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20        p->pLimit 
104b0 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f 66 66 73  = 0;.      pOffs
104c0 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b  et = p->pOffset;
104d0 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65  .      p->pOffse
104e0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74  t = 0;.      int
104f0 65 72 73 65 63 74 64 65 73 74 2e 69 53 44 50 61  ersectdest.iSDPa
10500 72 6d 20 3d 20 74 61 62 32 3b 0a 20 20 20 20 20  rm = tab2;.     
10510 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67   explainSetInteg
10520 65 72 28 69 53 75 62 32 2c 20 70 50 61 72 73 65  er(iSub2, pParse
10530 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29  ->iNextSelectId)
10540 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
10550 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
10560 65 2c 20 70 2c 20 26 69 6e 74 65 72 73 65 63 74  e, p, &intersect
10570 64 65 73 74 29 3b 0a 20 20 20 20 20 20 74 65 73  dest);.      tes
10580 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54  tcase( rc!=SQLIT
10590 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 70 44  E_OK );.      pD
105a0 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50 72 69 6f  elete = p->pPrio
105b0 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69  r;.      p->pPri
105c0 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20  or = pPrior;.   
105d0 20 20 20 69 66 28 20 70 2d 3e 6e 53 65 6c 65 63     if( p->nSelec
105e0 74 52 6f 77 3e 70 50 72 69 6f 72 2d 3e 6e 53 65  tRow>pPrior->nSe
105f0 6c 65 63 74 52 6f 77 20 29 20 70 2d 3e 6e 53 65  lectRow ) p->nSe
10600 6c 65 63 74 52 6f 77 20 3d 20 70 50 72 69 6f 72  lectRow = pPrior
10610 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20  ->nSelectRow;.  
10620 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
10630 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69  elete(db, p->pLi
10640 6d 69 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70  mit);.      p->p
10650 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a  Limit = pLimit;.
10660 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74        p->pOffset
10670 20 3d 20 70 4f 66 66 73 65 74 3b 0a 0a 20 20 20   = pOffset;..   
10680 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63     /* Generate c
10690 6f 64 65 20 74 6f 20 74 61 6b 65 20 74 68 65 20  ode to take the 
106a0 69 6e 74 65 72 73 65 63 74 69 6f 6e 20 6f 66 20  intersection of 
106b0 74 68 65 20 74 77 6f 20 74 65 6d 70 6f 72 61 72  the two temporar
106c0 79 0a 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65  y.      ** table
106d0 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  s..      */.    
106e0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c    assert( p->pEL
106f0 69 73 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ist );.      if(
10700 20 64 65 73 74 2e 65 44 65 73 74 3d 3d 53 52 54   dest.eDest==SRT
10710 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20 20  _Output ){.     
10720 20 20 20 53 65 6c 65 63 74 20 2a 70 46 69 72 73     Select *pFirs
10730 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 77  t = p;.        w
10740 68 69 6c 65 28 20 70 46 69 72 73 74 2d 3e 70 50  hile( pFirst->pP
10750 72 69 6f 72 20 29 20 70 46 69 72 73 74 20 3d 20  rior ) pFirst = 
10760 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 3b 0a  pFirst->pPrior;.
10770 20 20 20 20 20 20 20 20 67 65 6e 65 72 61 74 65          generate
10780 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72  ColumnNames(pPar
10790 73 65 2c 20 30 2c 20 70 46 69 72 73 74 2d 3e 70  se, 0, pFirst->p
107a0 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a  EList);.      }.
107b0 20 20 20 20 20 20 69 42 72 65 61 6b 20 3d 20 73        iBreak = s
107c0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
107d0 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 43  bel(v);.      iC
107e0 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ont = sqlite3Vdb
107f0 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
10800 20 20 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69       computeLimi
10810 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72 73  tRegisters(pPars
10820 65 2c 20 70 2c 20 69 42 72 65 61 6b 29 3b 0a 20  e, p, iBreak);. 
10830 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
10840 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77  AddOp2(v, OP_Rew
10850 69 6e 64 2c 20 74 61 62 31 2c 20 69 42 72 65 61  ind, tab1, iBrea
10860 6b 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73  k);.      r1 = s
10870 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
10880 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
10890 69 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33  iStart = sqlite3
108a0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
108b0 5f 52 6f 77 4b 65 79 2c 20 74 61 62 31 2c 20 72  _RowKey, tab1, r
108c0 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
108d0 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
108e0 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 74  , OP_NotFound, t
108f0 61 62 32 2c 20 69 43 6f 6e 74 2c 20 72 31 2c 20  ab2, iCont, r1, 
10900 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
10910 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
10920 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20  pParse, r1);.   
10930 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f     selectInnerLo
10940 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d  op(pParse, p, p-
10950 3e 70 45 4c 69 73 74 2c 20 74 61 62 31 2c 20 70  >pEList, tab1, p
10960 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c  ->pEList->nExpr,
10970 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
10980 20 20 20 20 20 20 20 30 2c 20 30 2c 20 26 64 65         0, 0, &de
10990 73 74 2c 20 69 43 6f 6e 74 2c 20 69 42 72 65 61  st, iCont, iBrea
109a0 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  k);.      sqlite
109b0 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
109c0 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20  l(v, iCont);.   
109d0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
109e0 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c  dOp2(v, OP_Next,
109f0 20 74 61 62 31 2c 20 69 53 74 61 72 74 29 3b 0a   tab1, iStart);.
10a00 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
10a10 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
10a20 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
10a30 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10a40 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74  2(v, OP_Close, t
10a50 61 62 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  ab2, 0);.      s
10a60 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
10a70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61  (v, OP_Close, ta
10a80 62 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72  b1, 0);.      br
10a90 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  eak;.    }.  }..
10aa0 20 20 65 78 70 6c 61 69 6e 43 6f 6d 70 6f 73 69    explainComposi
10ab0 74 65 28 70 50 61 72 73 65 2c 20 70 2d 3e 6f 70  te(pParse, p->op
10ac0 2c 20 69 53 75 62 31 2c 20 69 53 75 62 32 2c 20  , iSub1, iSub2, 
10ad0 70 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29 3b 0a  p->op!=TK_ALL);.
10ae0 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 63 6f  .  /* Compute co
10af0 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
10b00 73 20 75 73 65 64 20 62 79 20 0a 20 20 2a 2a 20  s used by .  ** 
10b10 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73  temporary tables
10b20 20 6e 65 65 64 65 64 20 74 6f 20 69 6d 70 6c 65   needed to imple
10b30 6d 65 6e 74 20 74 68 65 20 63 6f 6d 70 6f 75 6e  ment the compoun
10b40 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2a 20 41  d select..  ** A
10b50 74 74 61 63 68 20 74 68 65 20 4b 65 79 49 6e 66  ttach the KeyInf
10b60 6f 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 61  o structure to a
10b70 6c 6c 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  ll temporary tab
10b80 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  les..  **.  ** T
10b90 68 69 73 20 73 65 63 74 69 6f 6e 20 69 73 20 72  his section is r
10ba0 75 6e 20 62 79 20 74 68 65 20 72 69 67 68 74 2d  un by the right-
10bb0 6d 6f 73 74 20 53 45 4c 45 43 54 20 73 74 61 74  most SELECT stat
10bc0 65 6d 65 6e 74 20 6f 6e 6c 79 2e 0a 20 20 2a 2a  ement only..  **
10bd0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
10be0 74 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 61  ts to the left a
10bf0 6c 77 61 79 73 20 73 6b 69 70 20 74 68 69 73 20  lways skip this 
10c00 70 61 72 74 2e 20 20 54 68 65 20 72 69 67 68 74  part.  The right
10c10 2d 6d 6f 73 74 0a 20 20 2a 2a 20 53 45 4c 45 43  -most.  ** SELEC
10c20 54 20 6d 69 67 68 74 20 61 6c 73 6f 20 73 6b 69  T might also ski
10c30 70 20 74 68 69 73 20 70 61 72 74 20 69 66 20 69  p this part if i
10c40 74 20 68 61 73 20 6e 6f 20 4f 52 44 45 52 20 42  t has no ORDER B
10c50 59 20 63 6c 61 75 73 65 20 61 6e 64 0a 20 20 2a  Y clause and.  *
10c60 2a 20 6e 6f 20 74 65 6d 70 20 74 61 62 6c 65 73  * no temp tables
10c70 20 61 72 65 20 72 65 71 75 69 72 65 64 2e 0a 20   are required.. 
10c80 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c   */.  if( p->sel
10c90 46 6c 61 67 73 20 26 20 53 46 5f 55 73 65 73 45  Flags & SF_UsesE
10ca0 70 68 65 6d 65 72 61 6c 20 29 7b 0a 20 20 20 20  phemeral ){.    
10cb0 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
10cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10cd0 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
10ce0 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  .    KeyInfo *pK
10cf0 65 79 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20  eyInfo;         
10d00 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20     /* Collating 
10d10 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65  sequence for the
10d20 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20   result set */. 
10d30 20 20 20 53 65 6c 65 63 74 20 2a 70 4c 6f 6f 70     Select *pLoop
10d40 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10d50 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
10d60 74 68 72 6f 75 67 68 20 53 45 4c 45 43 54 20 73  through SELECT s
10d70 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 20  tatements */.   
10d80 20 43 6f 6c 6c 53 65 71 20 2a 2a 61 70 43 6f 6c   CollSeq **apCol
10d90 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  l;             /
10da0 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68  * For looping th
10db0 72 6f 75 67 68 20 70 4b 65 79 49 6e 66 6f 2d 3e  rough pKeyInfo->
10dc0 61 43 6f 6c 6c 5b 5d 20 2a 2f 0a 20 20 20 20 69  aColl[] */.    i
10dd0 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20  nt nCol;        
10de0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10df0 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  Number of column
10e00 73 20 69 6e 20 72 65 73 75 6c 74 20 73 65 74 20  s in result set 
10e10 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  */..    assert( 
10e20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 3d 3d 70  p->pRightmost==p
10e30 20 29 3b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70   );.    nCol = p
10e40 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  ->pEList->nExpr;
10e50 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20  .    pKeyInfo = 
10e60 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c  sqlite3KeyInfoAl
10e70 6c 6f 63 28 64 62 2c 20 6e 43 6f 6c 2c 20 31 29  loc(db, nCol, 1)
10e80 3b 0a 20 20 20 20 69 66 28 20 21 70 4b 65 79 49  ;.    if( !pKeyI
10e90 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 72 63 20  nfo ){.      rc 
10ea0 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
10eb0 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69        goto multi
10ec0 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20  _select_end;.   
10ed0 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20   }.    for(i=0, 
10ee0 61 70 43 6f 6c 6c 3d 70 4b 65 79 49 6e 66 6f 2d  apColl=pKeyInfo-
10ef0 3e 61 43 6f 6c 6c 3b 20 69 3c 6e 43 6f 6c 3b 20  >aColl; i<nCol; 
10f00 69 2b 2b 2c 20 61 70 43 6f 6c 6c 2b 2b 29 7b 0a  i++, apColl++){.
10f10 20 20 20 20 20 20 2a 61 70 43 6f 6c 6c 20 3d 20        *apColl = 
10f20 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53  multiSelectCollS
10f30 65 71 28 70 50 61 72 73 65 2c 20 70 2c 20 69 29  eq(pParse, p, i)
10f40 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 2a  ;.      if( 0==*
10f50 61 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20  apColl ){.      
10f60 20 20 2a 61 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e    *apColl = db->
10f70 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20  pDfltColl;.     
10f80 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f   }.    }..    fo
10f90 72 28 70 4c 6f 6f 70 3d 70 3b 20 70 4c 6f 6f 70  r(pLoop=p; pLoop
10fa0 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70  ; pLoop=pLoop->p
10fb0 50 72 69 6f 72 29 7b 0a 20 20 20 20 20 20 66 6f  Prior){.      fo
10fc0 72 28 69 3d 30 3b 20 69 3c 32 3b 20 69 2b 2b 29  r(i=0; i<2; i++)
10fd0 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 64  {.        int ad
10fe0 64 72 20 3d 20 70 4c 6f 6f 70 2d 3e 61 64 64 72  dr = pLoop->addr
10ff0 4f 70 65 6e 45 70 68 6d 5b 69 5d 3b 0a 20 20 20  OpenEphm[i];.   
11000 20 20 20 20 20 69 66 28 20 61 64 64 72 3c 30 20       if( addr<0 
11010 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
11020 49 66 20 5b 30 5d 20 69 73 20 75 6e 75 73 65 64  If [0] is unused
11030 20 74 68 65 6e 20 5b 31 5d 20 69 73 20 61 6c 73   then [1] is als
11040 6f 20 75 6e 75 73 65 64 2e 20 20 53 6f 20 77 65  o unused.  So we
11050 20 63 61 6e 0a 20 20 20 20 20 20 20 20 20 20 2a   can.          *
11060 2a 20 61 6c 77 61 79 73 20 73 61 66 65 6c 79 20  * always safely 
11070 61 62 6f 72 74 20 61 73 20 73 6f 6f 6e 20 61 73  abort as soon as
11080 20 74 68 65 20 66 69 72 73 74 20 75 6e 75 73 65   the first unuse
11090 64 20 73 6c 6f 74 20 69 73 20 66 6f 75 6e 64 20  d slot is found 
110a0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  */.          ass
110b0 65 72 74 28 20 70 4c 6f 6f 70 2d 3e 61 64 64 72  ert( pLoop->addr
110c0 4f 70 65 6e 45 70 68 6d 5b 31 5d 3c 30 20 29 3b  OpenEphm[1]<0 );
110d0 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
110e0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
110f0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
11100 68 61 6e 67 65 50 32 28 76 2c 20 61 64 64 72 2c  hangeP2(v, addr,
11110 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20   nCol);.        
11120 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
11130 65 50 34 28 76 2c 20 61 64 64 72 2c 20 28 63 68  eP4(v, addr, (ch
11140 61 72 2a 29 73 71 6c 69 74 65 33 4b 65 79 49 6e  ar*)sqlite3KeyIn
11150 66 6f 52 65 66 28 70 4b 65 79 49 6e 66 6f 29 2c  foRef(pKeyInfo),
11160 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
11170 20 20 20 20 20 20 20 20 20 20 20 20 20 50 34 5f               P4_
11180 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20  KEYINFO);.      
11190 20 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65    pLoop->addrOpe
111a0 6e 45 70 68 6d 5b 69 5d 20 3d 20 2d 31 3b 0a 20  nEphm[i] = -1;. 
111b0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
111c0 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55   sqlite3KeyInfoU
111d0 6e 72 65 66 28 70 4b 65 79 49 6e 66 6f 29 3b 0a  nref(pKeyInfo);.
111e0 20 20 7d 0a 0a 6d 75 6c 74 69 5f 73 65 6c 65 63    }..multi_selec
111f0 74 5f 65 6e 64 3a 0a 20 20 70 44 65 73 74 2d 3e  t_end:.  pDest->
11200 69 53 64 73 74 20 3d 20 64 65 73 74 2e 69 53 64  iSdst = dest.iSd
11210 73 74 3b 0a 20 20 70 44 65 73 74 2d 3e 6e 53 64  st;.  pDest->nSd
11220 73 74 20 3d 20 64 65 73 74 2e 6e 53 64 73 74 3b  st = dest.nSdst;
11230 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
11240 44 65 6c 65 74 65 28 64 62 2c 20 70 44 65 6c 65  Delete(db, pDele
11250 74 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  te);.  return rc
11260 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
11270 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
11280 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 2f 2a  ND_SELECT */../*
11290 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 6f 75 74 70  .** Code an outp
112a0 75 74 20 73 75 62 72 6f 75 74 69 6e 65 20 66 6f  ut subroutine fo
112b0 72 20 61 20 63 6f 72 6f 75 74 69 6e 65 20 69 6d  r a coroutine im
112c0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
112d0 61 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74  a.** SELECT stat
112e0 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ment..**.** The 
112f0 64 61 74 61 20 74 6f 20 62 65 20 6f 75 74 70 75  data to be outpu
11300 74 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20 69  t is contained i
11310 6e 20 70 49 6e 2d 3e 69 53 64 73 74 2e 20 20 54  n pIn->iSdst.  T
11320 68 65 72 65 20 61 72 65 0a 2a 2a 20 70 49 6e 2d  here are.** pIn-
11330 3e 6e 53 64 73 74 20 63 6f 6c 75 6d 6e 73 20 74  >nSdst columns t
11340 6f 20 62 65 20 6f 75 74 70 75 74 2e 20 20 70 44  o be output.  pD
11350 65 73 74 20 69 73 20 77 68 65 72 65 20 74 68 65  est is where the
11360 20 6f 75 74 70 75 74 20 73 68 6f 75 6c 64 0a 2a   output should.*
11370 2a 20 62 65 20 73 65 6e 74 2e 0a 2a 2a 0a 2a 2a  * be sent..**.**
11380 20 72 65 67 52 65 74 75 72 6e 20 69 73 20 74 68   regReturn is th
11390 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
113a0 72 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67  register holding
113b0 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 0a   the subroutine.
113c0 2a 2a 20 72 65 74 75 72 6e 20 61 64 64 72 65 73  ** return addres
113d0 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72 65 67 50  s..**.** If regP
113e0 72 65 76 3e 30 20 74 68 65 6e 20 69 74 20 69 73  rev>0 then it is
113f0 20 74 68 65 20 66 69 72 73 74 20 72 65 67 69 73   the first regis
11400 74 65 72 20 69 6e 20 61 20 76 65 63 74 6f 72 20  ter in a vector 
11410 74 68 61 74 0a 2a 2a 20 72 65 63 6f 72 64 73 20  that.** records 
11420 74 68 65 20 70 72 65 76 69 6f 75 73 20 6f 75 74  the previous out
11430 70 75 74 2e 20 20 6d 65 6d 5b 72 65 67 50 72 65  put.  mem[regPre
11440 76 5d 20 69 73 20 61 20 66 6c 61 67 20 74 68 61  v] is a flag tha
11450 74 20 69 73 20 66 61 6c 73 65 0a 2a 2a 20 69 66  t is false.** if
11460 20 74 68 65 72 65 20 68 61 73 20 62 65 65 6e 20   there has been 
11470 6e 6f 20 70 72 65 76 69 6f 75 73 20 6f 75 74 70  no previous outp
11480 75 74 2e 20 20 49 66 20 72 65 67 50 72 65 76 3e  ut.  If regPrev>
11490 30 20 74 68 65 6e 20 63 6f 64 65 20 69 73 0a 2a  0 then code is.*
114a0 2a 20 67 65 6e 65 72 61 74 65 64 20 74 6f 20 73  * generated to s
114b0 75 70 70 72 65 73 73 20 64 75 70 6c 69 63 61 74  uppress duplicat
114c0 65 73 2e 20 20 70 4b 65 79 49 6e 66 6f 20 69 73  es.  pKeyInfo is
114d0 20 75 73 65 64 20 66 6f 72 20 63 6f 6d 70 61 72   used for compar
114e0 69 6e 67 0a 2a 2a 20 6b 65 79 73 2e 0a 2a 2a 0a  ing.** keys..**.
114f0 2a 2a 20 49 66 20 74 68 65 20 4c 49 4d 49 54 20  ** If the LIMIT 
11500 66 6f 75 6e 64 20 69 6e 20 70 2d 3e 69 4c 69 6d  found in p->iLim
11510 69 74 20 69 73 20 72 65 61 63 68 65 64 2c 20 6a  it is reached, j
11520 75 6d 70 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ump immediately 
11530 74 6f 0a 2a 2a 20 69 42 72 65 61 6b 2e 0a 2a 2f  to.** iBreak..*/
11540 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 6e 65  .static int gene
11550 72 61 74 65 4f 75 74 70 75 74 53 75 62 72 6f 75  rateOutputSubrou
11560 74 69 6e 65 28 0a 20 20 50 61 72 73 65 20 2a 70  tine(.  Parse *p
11570 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
11580 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
11590 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  xt */.  Select *
115a0 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
115b0 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74  /* The SELECT st
115c0 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 53 65 6c  atement */.  Sel
115d0 65 63 74 44 65 73 74 20 2a 70 49 6e 2c 20 20 20  ectDest *pIn,   
115e0 20 20 20 20 20 2f 2a 20 43 6f 72 6f 75 74 69 6e       /* Coroutin
115f0 65 20 73 75 70 70 6c 79 69 6e 67 20 64 61 74 61  e supplying data
11600 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74   */.  SelectDest
11610 20 2a 70 44 65 73 74 2c 20 20 20 20 20 20 2f 2a   *pDest,      /*
11620 20 57 68 65 72 65 20 74 6f 20 73 65 6e 64 20 74   Where to send t
11630 68 65 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74  he data */.  int
11640 20 72 65 67 52 65 74 75 72 6e 2c 20 20 20 20 20   regReturn,     
11650 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 74 75       /* The retu
11660 72 6e 20 61 64 64 72 65 73 73 20 72 65 67 69 73  rn address regis
11670 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ter */.  int reg
11680 50 72 65 76 2c 20 20 20 20 20 20 20 20 20 20 20  Prev,           
11690 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 72 65 73   /* Previous res
116a0 75 6c 74 20 72 65 67 69 73 74 65 72 2e 20 20 4e  ult register.  N
116b0 6f 20 75 6e 69 71 75 65 6e 65 73 73 20 69 66 20  o uniqueness if 
116c0 30 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a  0 */.  KeyInfo *
116d0 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 2f  pKeyInfo,      /
116e0 2a 20 46 6f 72 20 63 6f 6d 70 61 72 69 6e 67 20  * For comparing 
116f0 77 69 74 68 20 70 72 65 76 69 6f 75 73 20 65 6e  with previous en
11700 74 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 42 72  try */.  int iBr
11710 65 61 6b 20 20 20 20 20 20 20 20 20 20 20 20 20  eak             
11720 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66   /* Jump here if
11730 20 77 65 20 68 69 74 20 74 68 65 20 4c 49 4d 49   we hit the LIMI
11740 54 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a  T */.){.  Vdbe *
11750 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
11760 65 3b 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e  e;.  int iContin
11770 75 65 3b 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a  ue;.  int addr;.
11780 0a 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65  .  addr = sqlite
11790 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
117a0 28 76 29 3b 0a 20 20 69 43 6f 6e 74 69 6e 75 65  (v);.  iContinue
117b0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
117c0 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 2f  keLabel(v);..  /
117d0 2a 20 53 75 70 70 72 65 73 73 20 64 75 70 6c 69  * Suppress dupli
117e0 63 61 74 65 73 20 66 6f 72 20 55 4e 49 4f 4e 2c  cates for UNION,
117f0 20 45 58 43 45 50 54 2c 20 61 6e 64 20 49 4e 54   EXCEPT, and INT
11800 45 52 53 45 43 54 20 0a 20 20 2a 2f 0a 20 20 69  ERSECT .  */.  i
11810 66 28 20 72 65 67 50 72 65 76 20 29 7b 0a 20 20  f( regPrev ){.  
11820 20 20 69 6e 74 20 6a 31 2c 20 6a 32 3b 0a 20 20    int j1, j2;.  
11830 20 20 6a 31 20 3d 20 73 71 6c 69 74 65 33 56 64    j1 = sqlite3Vd
11840 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49  beAddOp1(v, OP_I
11850 66 4e 6f 74 2c 20 72 65 67 50 72 65 76 29 3b 0a  fNot, regPrev);.
11860 20 20 20 20 6a 32 20 3d 20 73 71 6c 69 74 65 33      j2 = sqlite3
11870 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
11880 5f 43 6f 6d 70 61 72 65 2c 20 70 49 6e 2d 3e 69  _Compare, pIn->i
11890 53 64 73 74 2c 20 72 65 67 50 72 65 76 2b 31 2c  Sdst, regPrev+1,
118a0 20 70 49 6e 2d 3e 6e 53 64 73 74 2c 0a 20 20 20   pIn->nSdst,.   
118b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
118c0 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
118d0 2a 29 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  *)sqlite3KeyInfo
118e0 52 65 66 28 70 4b 65 79 49 6e 66 6f 29 2c 20 50  Ref(pKeyInfo), P
118f0 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20  4_KEYINFO);.    
11900 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
11910 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 6a 32  3(v, OP_Jump, j2
11920 2b 32 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20 6a  +2, iContinue, j
11930 32 2b 32 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  2+2);.    sqlite
11940 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
11950 20 6a 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65   j1);.    sqlite
11960 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
11970 50 5f 43 6f 70 79 2c 20 70 49 6e 2d 3e 69 53 64  P_Copy, pIn->iSd
11980 73 74 2c 20 72 65 67 50 72 65 76 2b 31 2c 20 70  st, regPrev+1, p
11990 49 6e 2d 3e 6e 53 64 73 74 2d 31 29 3b 0a 20 20  In->nSdst-1);.  
119a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
119b0 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
119c0 72 2c 20 31 2c 20 72 65 67 50 72 65 76 29 3b 0a  r, 1, regPrev);.
119d0 20 20 7d 0a 20 20 69 66 28 20 70 50 61 72 73 65    }.  if( pParse
119e0 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
119f0 65 64 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a  ed ) return 0;..
11a00 20 20 2f 2a 20 53 75 70 70 72 65 73 73 20 74 68    /* Suppress th
11a10 65 20 66 69 72 73 74 20 4f 46 46 53 45 54 20 65  e first OFFSET e
11a20 6e 74 72 69 65 73 20 69 66 20 74 68 65 72 65 20  ntries if there 
11a30 69 73 20 61 6e 20 4f 46 46 53 45 54 20 63 6c 61  is an OFFSET cla
11a40 75 73 65 0a 20 20 2a 2f 0a 20 20 63 6f 64 65 4f  use.  */.  codeO
11a50 66 66 73 65 74 28 76 2c 20 70 2c 20 69 43 6f 6e  ffset(v, p, iCon
11a60 74 69 6e 75 65 29 3b 0a 0a 20 20 73 77 69 74 63  tinue);..  switc
11a70 68 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74 20  h( pDest->eDest 
11a80 29 7b 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65 20  ){.    /* Store 
11a90 74 68 65 20 72 65 73 75 6c 74 20 61 73 20 64 61  the result as da
11aa0 74 61 20 75 73 69 6e 67 20 61 20 75 6e 69 71 75  ta using a uniqu
11ab0 65 20 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  e key..    */.  
11ac0 20 20 63 61 73 65 20 53 52 54 5f 54 61 62 6c 65    case SRT_Table
11ad0 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 45  :.    case SRT_E
11ae0 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20  phemTab: {.     
11af0 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65   int r1 = sqlite
11b00 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
11b10 73 65 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 72  se);.      int r
11b20 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  2 = sqlite3GetTe
11b30 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
11b40 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
11b50 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54  Dest->eDest==SRT
11b60 5f 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 20 20  _Table );.      
11b70 74 65 73 74 63 61 73 65 28 20 70 44 65 73 74 2d  testcase( pDest-
11b80 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45 70 68 65  >eDest==SRT_Ephe
11b90 6d 54 61 62 20 29 3b 0a 20 20 20 20 20 20 73 71  mTab );.      sq
11ba0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
11bb0 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
11bc0 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49  , pIn->iSdst, pI
11bd0 6e 2d 3e 6e 53 64 73 74 2c 20 72 31 29 3b 0a 20  n->nSdst, r1);. 
11be0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
11bf0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77  AddOp2(v, OP_New
11c00 52 6f 77 69 64 2c 20 70 44 65 73 74 2d 3e 69 53  Rowid, pDest->iS
11c10 44 50 61 72 6d 2c 20 72 32 29 3b 0a 20 20 20 20  DParm, r2);.    
11c20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
11c30 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74  Op3(v, OP_Insert
11c40 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d  , pDest->iSDParm
11c50 2c 20 72 31 2c 20 72 32 29 3b 0a 20 20 20 20 20  , r1, r2);.     
11c60 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
11c70 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41  geP5(v, OPFLAG_A
11c80 50 50 45 4e 44 29 3b 0a 20 20 20 20 20 20 73 71  PPEND);.      sq
11c90 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
11ca0 52 65 67 28 70 50 61 72 73 65 2c 20 72 32 29 3b  Reg(pParse, r2);
11cb0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
11cc0 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
11cd0 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  rse, r1);.      
11ce0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69  break;.    }..#i
11cf0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
11d00 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 2f  T_SUBQUERY.    /
11d10 2a 20 49 66 20 77 65 20 61 72 65 20 63 72 65 61  * If we are crea
11d20 74 69 6e 67 20 61 20 73 65 74 20 66 6f 72 20 61  ting a set for a
11d30 6e 20 22 65 78 70 72 20 49 4e 20 28 53 45 4c 45  n "expr IN (SELE
11d40 43 54 20 2e 2e 2e 29 22 20 63 6f 6e 73 74 72 75  CT ...)" constru
11d50 63 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20  ct,.    ** then 
11d60 74 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20  there should be 
11d70 61 20 73 69 6e 67 6c 65 20 69 74 65 6d 20 6f 6e  a single item on
11d80 20 74 68 65 20 73 74 61 63 6b 2e 20 20 57 72 69   the stack.  Wri
11d90 74 65 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 69  te this.    ** i
11da0 74 65 6d 20 69 6e 74 6f 20 74 68 65 20 73 65 74  tem into the set
11db0 20 74 61 62 6c 65 20 77 69 74 68 20 62 6f 67 75   table with bogu
11dc0 73 20 64 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20  s data..    */. 
11dd0 20 20 20 63 61 73 65 20 53 52 54 5f 53 65 74 3a     case SRT_Set:
11de0 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31 3b   {.      int r1;
11df0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
11e00 49 6e 2d 3e 6e 53 64 73 74 3d 3d 31 20 29 3b 0a  In->nSdst==1 );.
11e10 20 20 20 20 20 20 70 44 65 73 74 2d 3e 61 66 66        pDest->aff
11e20 53 64 73 74 20 3d 20 0a 20 20 20 20 20 20 20 20  Sdst = .        
11e30 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41   sqlite3CompareA
11e40 66 66 69 6e 69 74 79 28 70 2d 3e 70 45 4c 69 73  ffinity(p->pELis
11e50 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20 70  t->a[0].pExpr, p
11e60 44 65 73 74 2d 3e 61 66 66 53 64 73 74 29 3b 0a  Dest->affSdst);.
11e70 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
11e80 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
11e90 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  rse);.      sqli
11ea0 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
11eb0 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
11ec0 70 49 6e 2d 3e 69 53 64 73 74 2c 20 31 2c 20 72  pIn->iSdst, 1, r
11ed0 31 2c 20 26 70 44 65 73 74 2d 3e 61 66 66 53 64  1, &pDest->affSd
11ee0 73 74 2c 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  st,1);.      sql
11ef0 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66  ite3ExprCacheAff
11f00 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72  inityChange(pPar
11f10 73 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20  se, pIn->iSdst, 
11f20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
11f30 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
11f40 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 70 44 65  P_IdxInsert, pDe
11f50 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 72 31 29  st->iSDParm, r1)
11f60 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  ;.      sqlite3R
11f70 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
11f80 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20  arse, r1);.     
11f90 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23   break;.    }..#
11fa0 69 66 20 30 20 20 2f 2a 20 4e 65 76 65 72 20 6f  if 0  /* Never o
11fb0 63 63 75 72 73 20 6f 6e 20 61 6e 20 4f 52 44 45  ccurs on an ORDE
11fc0 52 20 42 59 20 71 75 65 72 79 20 2a 2f 0a 20 20  R BY query */.  
11fd0 20 20 2f 2a 20 49 66 20 61 6e 79 20 72 6f 77 20    /* If any row 
11fe0 65 78 69 73 74 20 69 6e 20 74 68 65 20 72 65 73  exist in the res
11ff0 75 6c 74 20 73 65 74 2c 20 72 65 63 6f 72 64 20  ult set, record 
12000 74 68 61 74 20 66 61 63 74 20 61 6e 64 20 61 62  that fact and ab
12010 6f 72 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ort..    */.    
12020 63 61 73 65 20 53 52 54 5f 45 78 69 73 74 73 3a  case SRT_Exists:
12030 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
12040 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
12050 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 70 44 65  _Integer, 1, pDe
12060 73 74 2d 3e 69 53 44 50 61 72 6d 29 3b 0a 20 20  st->iSDParm);.  
12070 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54      /* The LIMIT
12080 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 74 65 72   clause will ter
12090 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 20  minate the loop 
120a0 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20  for us */.      
120b0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
120c0 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  dif..    /* If t
120d0 68 69 73 20 69 73 20 61 20 73 63 61 6c 61 72 20  his is a scalar 
120e0 73 65 6c 65 63 74 20 74 68 61 74 20 69 73 20 70  select that is p
120f0 61 72 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73  art of an expres
12100 73 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a  sion, then.    *
12110 2a 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75  * store the resu
12120 6c 74 73 20 69 6e 20 74 68 65 20 61 70 70 72 6f  lts in the appro
12130 70 72 69 61 74 65 20 6d 65 6d 6f 72 79 20 63 65  priate memory ce
12140 6c 6c 20 61 6e 64 20 62 72 65 61 6b 20 6f 75 74  ll and break out
12150 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73  .    ** of the s
12160 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f  can loop..    */
12170 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 4d 65  .    case SRT_Me
12180 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  m: {.      asser
12190 74 28 20 70 49 6e 2d 3e 6e 53 64 73 74 3d 3d 31  t( pIn->nSdst==1
121a0 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
121b0 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50  3ExprCodeMove(pP
121c0 61 72 73 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74  arse, pIn->iSdst
121d0 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d  , pDest->iSDParm
121e0 2c 20 31 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54  , 1);.      /* T
121f0 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20  he LIMIT clause 
12200 77 69 6c 6c 20 6a 75 6d 70 20 6f 75 74 20 6f 66  will jump out of
12210 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73   the loop for us
12220 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   */.      break;
12230 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  .    }.#endif /*
12240 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f   #ifndef SQLITE_
12250 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f  OMIT_SUBQUERY */
12260 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 73  ..    /* The res
12270 75 6c 74 73 20 61 72 65 20 73 74 6f 72 65 64 20  ults are stored 
12280 69 6e 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66  in a sequence of
12290 20 72 65 67 69 73 74 65 72 73 0a 20 20 20 20 2a   registers.    *
122a0 2a 20 73 74 61 72 74 69 6e 67 20 61 74 20 70 44  * starting at pD
122b0 65 73 74 2d 3e 69 53 64 73 74 2e 20 20 54 68 65  est->iSdst.  The
122c0 6e 20 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65  n the co-routine
122d0 20 79 69 65 6c 64 73 2e 0a 20 20 20 20 2a 2f 0a   yields..    */.
122e0 20 20 20 20 63 61 73 65 20 53 52 54 5f 43 6f 72      case SRT_Cor
122f0 6f 75 74 69 6e 65 3a 20 7b 0a 20 20 20 20 20 20  outine: {.      
12300 69 66 28 20 70 44 65 73 74 2d 3e 69 53 64 73 74  if( pDest->iSdst
12310 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
12320 44 65 73 74 2d 3e 69 53 64 73 74 20 3d 20 73 71  Dest->iSdst = sq
12330 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67  lite3GetTempRang
12340 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 6e  e(pParse, pIn->n
12350 53 64 73 74 29 3b 0a 20 20 20 20 20 20 20 20 70  Sdst);.        p
12360 44 65 73 74 2d 3e 6e 53 64 73 74 20 3d 20 70 49  Dest->nSdst = pI
12370 6e 2d 3e 6e 53 64 73 74 3b 0a 20 20 20 20 20 20  n->nSdst;.      
12380 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  }.      sqlite3E
12390 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72  xprCodeMove(pPar
123a0 73 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20  se, pIn->iSdst, 
123b0 70 44 65 73 74 2d 3e 69 53 64 73 74 2c 20 70 44  pDest->iSdst, pD
123c0 65 73 74 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20  est->nSdst);.   
123d0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
123e0 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64  dOp1(v, OP_Yield
123f0 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d  , pDest->iSDParm
12400 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
12410 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
12420 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 61 62 6f   none of the abo
12430 76 65 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73  ve, then the res
12440 75 6c 74 20 64 65 73 74 69 6e 61 74 69 6f 6e 20  ult destination 
12450 6d 75 73 74 20 62 65 0a 20 20 20 20 2a 2a 20 53  must be.    ** S
12460 52 54 5f 4f 75 74 70 75 74 2e 20 20 54 68 69 73  RT_Output.  This
12470 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 76 65   routine is neve
12480 72 20 63 61 6c 6c 65 64 20 77 69 74 68 20 61 6e  r called with an
12490 79 20 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20 64  y other.    ** d
124a0 65 73 74 69 6e 61 74 69 6f 6e 20 6f 74 68 65 72  estination other
124b0 20 74 68 61 6e 20 74 68 65 20 6f 6e 65 73 20 68   than the ones h
124c0 61 6e 64 6c 65 64 20 61 62 6f 76 65 20 6f 72 20  andled above or 
124d0 53 52 54 5f 4f 75 74 70 75 74 2e 0a 20 20 20 20  SRT_Output..    
124e0 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 20 53 52  **.    ** For SR
124f0 54 5f 4f 75 74 70 75 74 2c 20 72 65 73 75 6c 74  T_Output, result
12500 73 20 61 72 65 20 73 74 6f 72 65 64 20 69 6e 20  s are stored in 
12510 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20 72 65  a sequence of re
12520 67 69 73 74 65 72 73 2e 20 20 0a 20 20 20 20 2a  gisters.  .    *
12530 2a 20 54 68 65 6e 20 74 68 65 20 4f 50 5f 52 65  * Then the OP_Re
12540 73 75 6c 74 52 6f 77 20 6f 70 63 6f 64 65 20 69  sultRow opcode i
12550 73 20 75 73 65 64 20 74 6f 20 63 61 75 73 65 20  s used to cause 
12560 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20 74  sqlite3_step() t
12570 6f 0a 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 20  o.    ** return 
12580 74 68 65 20 6e 65 78 74 20 72 6f 77 20 6f 66 20  the next row of 
12590 72 65 73 75 6c 74 2e 0a 20 20 20 20 2a 2f 0a 20  result..    */. 
125a0 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
125b0 20 20 20 20 61 73 73 65 72 74 28 20 70 44 65 73      assert( pDes
125c0 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75  t->eDest==SRT_Ou
125d0 74 70 75 74 20 29 3b 0a 20 20 20 20 20 20 73 71  tput );.      sq
125e0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
125f0 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c  v, OP_ResultRow,
12600 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e   pIn->iSdst, pIn
12610 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20 20 20  ->nSdst);.      
12620 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
12630 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70  AffinityChange(p
12640 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69 53 64 73  Parse, pIn->iSds
12650 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a  t, pIn->nSdst);.
12660 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
12670 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d   }.  }..  /* Jum
12680 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  p to the end of 
12690 74 68 65 20 6c 6f 6f 70 20 69 66 20 74 68 65 20  the loop if the 
126a0 4c 49 4d 49 54 20 69 73 20 72 65 61 63 68 65 64  LIMIT is reached
126b0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
126c0 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71  iLimit ){.    sq
126d0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
126e0 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c 20 70 2d  v, OP_IfZero, p-
126f0 3e 69 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b 2c  >iLimit, iBreak,
12700 20 2d 31 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   -1);.  }..  /* 
12710 47 65 6e 65 72 61 74 65 20 74 68 65 20 73 75 62  Generate the sub
12720 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 0a 20  routine return. 
12730 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
12740 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
12750 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 73   iContinue);.  s
12760 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
12770 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72  (v, OP_Return, r
12780 65 67 52 65 74 75 72 6e 29 3b 0a 0a 20 20 72 65  egReturn);..  re
12790 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a  turn addr;.}../*
127a0 0a 2a 2a 20 41 6c 74 65 72 6e 61 74 69 76 65 20  .** Alternative 
127b0 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20  compound select 
127c0 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20 66  code generator f
127d0 6f 72 20 63 61 73 65 73 20 77 68 65 6e 20 74 68  or cases when th
127e0 65 72 65 0a 2a 2a 20 69 73 20 61 6e 20 4f 52 44  ere.** is an ORD
127f0 45 52 20 42 59 20 63 6c 61 75 73 65 2e 0a 2a 2a  ER BY clause..**
12800 0a 2a 2a 20 57 65 20 61 73 73 75 6d 65 20 61 20  .** We assume a 
12810 71 75 65 72 79 20 6f 66 20 74 68 65 20 66 6f 6c  query of the fol
12820 6c 6f 77 69 6e 67 20 66 6f 72 6d 3a 0a 2a 2a 0a  lowing form:.**.
12830 2a 2a 20 20 20 20 20 20 3c 73 65 6c 65 63 74 41  **      <selectA
12840 3e 20 20 3c 6f 70 65 72 61 74 6f 72 3e 20 20 3c  >  <operator>  <
12850 73 65 6c 65 63 74 42 3e 20 20 4f 52 44 45 52 20  selectB>  ORDER 
12860 42 59 20 3c 6f 72 64 65 72 62 79 6c 69 73 74 3e  BY <orderbylist>
12870 0a 2a 2a 0a 2a 2a 20 3c 6f 70 65 72 61 74 6f 72  .**.** <operator
12880 3e 20 69 73 20 6f 6e 65 20 6f 66 20 55 4e 49 4f  > is one of UNIO
12890 4e 20 41 4c 4c 2c 20 55 4e 49 4f 4e 2c 20 45 58  N ALL, UNION, EX
128a0 43 45 50 54 2c 20 6f 72 20 49 4e 54 45 52 53 45  CEPT, or INTERSE
128b0 43 54 2e 20 20 54 68 65 20 69 64 65 61 0a 2a 2a  CT.  The idea.**
128c0 20 69 73 20 74 6f 20 63 6f 64 65 20 62 6f 74 68   is to code both
128d0 20 3c 73 65 6c 65 63 74 41 3e 20 61 6e 64 20 3c   <selectA> and <
128e0 73 65 6c 65 63 74 42 3e 20 77 69 74 68 20 74 68  selectB> with th
128f0 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
12900 65 20 61 73 0a 2a 2a 20 63 6f 2d 72 6f 75 74 69  e as.** co-routi
12910 6e 65 73 2e 20 20 54 68 65 6e 20 72 75 6e 20 74  nes.  Then run t
12920 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 73 20 69  he co-routines i
12930 6e 20 70 61 72 61 6c 6c 65 6c 20 61 6e 64 20 6d  n parallel and m
12940 65 72 67 65 20 74 68 65 20 72 65 73 75 6c 74 73  erge the results
12950 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6f 75 74  .** into the out
12960 70 75 74 2e 20 20 49 6e 20 61 64 64 69 74 69 6f  put.  In additio
12970 6e 20 74 6f 20 74 68 65 20 74 77 6f 20 63 6f 72  n to the two cor
12980 6f 75 74 69 6e 65 73 20 28 63 61 6c 6c 65 64 20  outines (called 
12990 73 65 6c 65 63 74 41 20 61 6e 64 0a 2a 2a 20 73  selectA and.** s
129a0 65 6c 65 63 74 42 29 20 74 68 65 72 65 20 61 72  electB) there ar
129b0 65 20 37 20 73 75 62 72 6f 75 74 69 6e 65 73 3a  e 7 subroutines:
129c0 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 75 74 41 3a 20  .**.**    outA: 
129d0 20 20 20 4d 6f 76 65 20 74 68 65 20 6f 75 74 70     Move the outp
129e0 75 74 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74  ut of the select
129f0 41 20 63 6f 72 6f 75 74 69 6e 65 20 69 6e 74 6f  A coroutine into
12a00 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 20   the output.**  
12a10 20 20 20 20 20 20 20 20 20 20 20 6f 66 20 74 68             of th
12a20 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79  e compound query
12a30 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 75 74 42 3a  ..**.**    outB:
12a40 20 20 20 20 4d 6f 76 65 20 74 68 65 20 6f 75 74      Move the out
12a50 70 75 74 20 6f 66 20 74 68 65 20 73 65 6c 65 63  put of the selec
12a60 74 42 20 63 6f 72 6f 75 74 69 6e 65 20 69 6e 74  tB coroutine int
12a70 6f 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20  o the output.** 
12a80 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 20 74              of t
12a90 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72  he compound quer
12aa0 79 2e 20 20 28 4f 6e 6c 79 20 67 65 6e 65 72 61  y.  (Only genera
12ab0 74 65 64 20 66 6f 72 20 55 4e 49 4f 4e 20 61 6e  ted for UNION an
12ac0 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  d.**            
12ad0 20 55 4e 49 4f 4e 20 41 4c 4c 2e 20 20 45 58 43   UNION ALL.  EXC
12ae0 45 50 54 20 61 6e 64 20 49 4e 53 45 52 54 53 45  EPT and INSERTSE
12af0 43 54 20 6e 65 76 65 72 20 6f 75 74 70 75 74 20  CT never output 
12b00 61 20 72 6f 77 20 74 68 61 74 0a 2a 2a 20 20 20  a row that.**   
12b10 20 20 20 20 20 20 20 20 20 20 61 70 70 65 61 72            appear
12b20 73 20 6f 6e 6c 79 20 69 6e 20 42 2e 29 0a 2a 2a  s only in B.).**
12b30 0a 2a 2a 20 20 20 20 41 6c 74 42 3a 20 20 20 20  .**    AltB:    
12b40 43 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 72  Called when ther
12b50 65 20 69 73 20 64 61 74 61 20 66 72 6f 6d 20 62  e is data from b
12b60 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65 73 20 61  oth coroutines a
12b70 6e 64 20 41 3c 42 2e 0a 2a 2a 0a 2a 2a 20 20 20  nd A<B..**.**   
12b80 20 41 65 71 42 3a 20 20 20 20 43 61 6c 6c 65 64   AeqB:    Called
12b90 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 64   when there is d
12ba0 61 74 61 20 66 72 6f 6d 20 62 6f 74 68 20 63 6f  ata from both co
12bb0 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 41 3d 3d  routines and A==
12bc0 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 67 74 42  B..**.**    AgtB
12bd0 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e  :    Called when
12be0 20 74 68 65 72 65 20 69 73 20 64 61 74 61 20 66   there is data f
12bf0 72 6f 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74 69  rom both corouti
12c00 6e 65 73 20 61 6e 64 20 41 3e 42 2e 0a 2a 2a 0a  nes and A>B..**.
12c10 2a 2a 20 20 20 20 45 6f 66 41 3a 20 20 20 20 43  **    EofA:    C
12c20 61 6c 6c 65 64 20 77 68 65 6e 20 64 61 74 61 20  alled when data 
12c30 69 73 20 65 78 68 61 75 73 74 65 64 20 66 72 6f  is exhausted fro
12c40 6d 20 73 65 6c 65 63 74 41 2e 0a 2a 2a 0a 2a 2a  m selectA..**.**
12c50 20 20 20 20 45 6f 66 42 3a 20 20 20 20 43 61 6c      EofB:    Cal
12c60 6c 65 64 20 77 68 65 6e 20 64 61 74 61 20 69 73  led when data is
12c70 20 65 78 68 61 75 73 74 65 64 20 66 72 6f 6d 20   exhausted from 
12c80 73 65 6c 65 63 74 42 2e 0a 2a 2a 0a 2a 2a 20 54  selectB..**.** T
12c90 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
12ca0 6e 20 6f 66 20 74 68 65 20 6c 61 74 74 65 72 20  n of the latter 
12cb0 66 69 76 65 20 73 75 62 72 6f 75 74 69 6e 65 73  five subroutines
12cc0 20 64 65 70 65 6e 64 20 6f 6e 20 77 68 69 63 68   depend on which
12cd0 20 0a 2a 2a 20 3c 6f 70 65 72 61 74 6f 72 3e 20   .** <operator> 
12ce0 69 73 20 75 73 65 64 3a 0a 2a 2a 0a 2a 2a 0a 2a  is used:.**.**.*
12cf0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 55 4e  *             UN
12d00 49 4f 4e 20 41 4c 4c 20 20 20 20 20 20 20 20 20  ION ALL         
12d10 55 4e 49 4f 4e 20 20 20 20 20 20 20 20 20 20 20  UNION           
12d20 20 45 58 43 45 50 54 20 20 20 20 20 20 20 20 20   EXCEPT         
12d30 20 49 4e 54 45 52 53 45 43 54 0a 2a 2a 20 20 20   INTERSECT.**   
12d40 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d         ---------
12d50 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----  ----------
12d60 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d  -------  -------
12d70 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d  -------  -------
12d80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20  ----------.**   
12d90 41 6c 74 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65  AltB:   outA, ne
12da0 78 74 41 20 20 20 20 20 20 6f 75 74 41 2c 20 6e  xtA      outA, n
12db0 65 78 74 41 20 20 20 20 20 20 20 6f 75 74 41 2c  extA       outA,
12dc0 20 6e 65 78 74 41 20 20 20 20 20 20 20 20 20 6e   nextA         n
12dd0 65 78 74 41 0a 2a 2a 0a 2a 2a 20 20 20 41 65 71  extA.**.**   Aeq
12de0 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41  B:   outA, nextA
12df0 20 20 20 20 20 20 20 20 20 6e 65 78 74 41 20 20           nextA  
12e00 20 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 41             nextA
12e10 20 20 20 20 20 20 20 20 20 6f 75 74 41 2c 20 6e           outA, n
12e20 65 78 74 41 0a 2a 2a 0a 2a 2a 20 20 20 41 67 74  extA.**.**   Agt
12e30 42 3a 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42  B:   outB, nextB
12e40 20 20 20 20 20 20 6f 75 74 42 2c 20 6e 65 78 74        outB, next
12e50 42 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 42  B          nextB
12e60 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 78 74              next
12e70 42 0a 2a 2a 0a 2a 2a 20 20 20 45 6f 66 41 3a 20  B.**.**   EofA: 
12e80 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20 20    outB, nextB   
12e90 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20     outB, nextB  
12ea0 20 20 20 20 20 20 20 20 68 61 6c 74 20 20 20 20          halt    
12eb0 20 20 20 20 20 20 20 20 20 68 61 6c 74 0a 2a 2a           halt.**
12ec0 0a 2a 2a 20 20 20 45 6f 66 42 3a 20 20 20 6f 75  .**   EofB:   ou
12ed0 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 6f  tA, nextA      o
12ee0 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20  utA, nextA      
12ef0 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20   outA, nextA    
12f00 20 20 20 20 20 68 61 6c 74 0a 2a 2a 0a 2a 2a 20       halt.**.** 
12f10 49 6e 20 74 68 65 20 41 6c 74 42 2c 20 41 65 71  In the AltB, Aeq
12f20 42 2c 20 61 6e 64 20 41 67 74 42 20 73 75 62 72  B, and AgtB subr
12f30 6f 75 74 69 6e 65 73 2c 20 61 6e 20 45 4f 46 20  outines, an EOF 
12f40 6f 6e 20 41 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e  on A following n
12f50 65 78 74 41 0a 2a 2a 20 63 61 75 73 65 73 20 61  extA.** causes a
12f60 6e 20 69 6d 6d 65 64 69 61 74 65 20 6a 75 6d 70  n immediate jump
12f70 20 74 6f 20 45 6f 66 41 20 61 6e 64 20 61 6e 20   to EofA and an 
12f80 45 4f 46 20 6f 6e 20 42 20 66 6f 6c 6c 6f 77 69  EOF on B followi
12f90 6e 67 20 6e 65 78 74 42 20 63 61 75 73 65 73 0a  ng nextB causes.
12fa0 2a 2a 20 61 6e 20 69 6d 6d 65 64 69 61 74 65 20  ** an immediate 
12fb0 6a 75 6d 70 20 74 6f 20 45 6f 66 42 2e 20 20 57  jump to EofB.  W
12fc0 69 74 68 69 6e 20 45 6f 66 41 20 61 6e 64 20 45  ithin EofA and E
12fd0 6f 66 42 2c 20 61 6e 64 20 45 4f 46 20 6f 6e 20  ofB, and EOF on 
12fe0 65 6e 74 72 79 20 6f 72 0a 2a 2a 20 66 6f 6c 6c  entry or.** foll
12ff0 6f 77 69 6e 67 20 6e 65 78 74 58 20 63 61 75 73  owing nextX caus
13000 65 73 20 61 20 6a 75 6d 70 20 74 6f 20 74 68 65  es a jump to the
13010 20 65 6e 64 20 6f 66 20 74 68 65 20 73 65 6c 65   end of the sele
13020 63 74 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a  ct processing..*
13030 2a 0a 2a 2a 20 44 75 70 6c 69 63 61 74 65 20 72  *.** Duplicate r
13040 65 6d 6f 76 61 6c 20 69 6e 20 74 68 65 20 55 4e  emoval in the UN
13050 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20 61 6e 64  ION, EXCEPT, and
13060 20 49 4e 54 45 52 53 45 43 54 20 63 61 73 65 73   INTERSECT cases
13070 20 69 73 20 68 61 6e 64 6c 65 64 0a 2a 2a 20 77   is handled.** w
13080 69 74 68 69 6e 20 74 68 65 20 6f 75 74 70 75 74  ithin the output
13090 20 73 75 62 72 6f 75 74 69 6e 65 2e 20 20 54 68   subroutine.  Th
130a0 65 20 72 65 67 50 72 65 76 20 72 65 67 69 73 74  e regPrev regist
130b0 65 72 20 73 65 74 20 68 6f 6c 64 73 20 74 68 65  er set holds the
130c0 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 6f   previously.** o
130d0 75 74 70 75 74 20 76 61 6c 75 65 2e 20 20 41 20  utput value.  A 
130e0 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 6d 61  comparison is ma
130f0 64 65 20 61 67 61 69 6e 73 74 20 74 68 69 73 20  de against this 
13100 76 61 6c 75 65 20 61 6e 64 20 74 68 65 20 6f 75  value and the ou
13110 74 70 75 74 0a 2a 2a 20 69 73 20 73 6b 69 70 70  tput.** is skipp
13120 65 64 20 69 66 20 74 68 65 20 6e 65 78 74 20 72  ed if the next r
13130 65 73 75 6c 74 73 20 77 6f 75 6c 64 20 62 65 20  esults would be 
13140 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20  the same as the 
13150 70 72 65 76 69 6f 75 73 2e 0a 2a 2a 0a 2a 2a 20  previous..**.** 
13160 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  The implementati
13170 6f 6e 20 70 6c 61 6e 20 69 73 20 74 6f 20 69 6d  on plan is to im
13180 70 6c 65 6d 65 6e 74 20 74 68 65 20 74 77 6f 20  plement the two 
13190 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 73  coroutines and s
131a0 65 76 65 6e 0a 2a 2a 20 73 75 62 72 6f 75 74 69  even.** subrouti
131b0 6e 65 73 20 66 69 72 73 74 2c 20 74 68 65 6e 20  nes first, then 
131c0 70 75 74 20 74 68 65 20 63 6f 6e 74 72 6f 6c 20  put the control 
131d0 6c 6f 67 69 63 20 61 74 20 74 68 65 20 62 6f 74  logic at the bot
131e0 74 6f 6d 2e 20 20 4c 69 6b 65 20 74 68 69 73 3a  tom.  Like this:
131f0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  .**.**          
13200 67 6f 74 6f 20 49 6e 69 74 0a 2a 2a 20 20 20 20  goto Init.**    
13210 20 63 6f 41 3a 20 63 6f 72 6f 75 74 69 6e 65 20   coA: coroutine 
13220 66 6f 72 20 6c 65 66 74 20 71 75 65 72 79 20 28  for left query (
13230 41 29 0a 2a 2a 20 20 20 20 20 63 6f 42 3a 20 63  A).**     coB: c
13240 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20 72 69 67  oroutine for rig
13250 68 74 20 71 75 65 72 79 20 28 42 29 0a 2a 2a 20  ht query (B).** 
13260 20 20 20 6f 75 74 41 3a 20 6f 75 74 70 75 74 20     outA: output 
13270 6f 6e 65 20 72 6f 77 20 6f 66 20 41 0a 2a 2a 20  one row of A.** 
13280 20 20 20 6f 75 74 42 3a 20 6f 75 74 70 75 74 20     outB: output 
13290 6f 6e 65 20 72 6f 77 20 6f 66 20 42 20 28 55 4e  one row of B (UN
132a0 49 4f 4e 20 61 6e 64 20 55 4e 49 4f 4e 20 41 4c  ION and UNION AL
132b0 4c 20 6f 6e 6c 79 29 0a 2a 2a 20 20 20 20 45 6f  L only).**    Eo
132c0 66 41 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 45 6f  fA: ....**    Eo
132d0 66 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 6c  fB: ....**    Al
132e0 74 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 65  tB: ....**    Ae
132f0 71 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 67  qB: ....**    Ag
13300 74 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 49 6e  tB: ....**    In
13310 69 74 3a 20 69 6e 69 74 69 61 6c 69 7a 65 20 63  it: initialize c
13320 6f 72 6f 75 74 69 6e 65 20 72 65 67 69 73 74 65  oroutine registe
13330 72 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 79  rs.**          y
13340 69 65 6c 64 20 63 6f 41 0a 2a 2a 20 20 20 20 20  ield coA.**     
13350 20 20 20 20 20 69 66 20 65 6f 66 28 41 29 20 67       if eof(A) g
13360 6f 74 6f 20 45 6f 66 41 0a 2a 2a 20 20 20 20 20  oto EofA.**     
13370 20 20 20 20 20 79 69 65 6c 64 20 63 6f 42 0a 2a       yield coB.*
13380 2a 20 20 20 20 20 20 20 20 20 20 69 66 20 65 6f  *          if eo
13390 66 28 42 29 20 67 6f 74 6f 20 45 6f 66 42 0a 2a  f(B) goto EofB.*
133a0 2a 20 20 20 20 43 6d 70 72 3a 20 43 6f 6d 70 61  *    Cmpr: Compa
133b0 72 65 20 41 2c 20 42 0a 2a 2a 20 20 20 20 20 20  re A, B.**      
133c0 20 20 20 20 4a 75 6d 70 20 41 6c 74 42 2c 20 41      Jump AltB, A
133d0 65 71 42 2c 20 41 67 74 42 0a 2a 2a 20 20 20 20  eqB, AgtB.**    
133e0 20 45 6e 64 3a 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20   End: ....**.** 
133f0 57 65 20 63 61 6c 6c 20 41 6c 74 42 2c 20 41 65  We call AltB, Ae
13400 71 42 2c 20 41 67 74 42 2c 20 45 6f 66 41 2c 20  qB, AgtB, EofA, 
13410 61 6e 64 20 45 6f 66 42 20 22 73 75 62 72 6f 75  and EofB "subrou
13420 74 69 6e 65 73 22 20 62 75 74 20 74 68 65 79 20  tines" but they 
13430 61 72 65 20 6e 6f 74 0a 2a 2a 20 61 63 74 75 61  are not.** actua
13440 6c 6c 79 20 63 61 6c 6c 65 64 20 75 73 69 6e 67  lly called using
13450 20 47 6f 73 75 62 20 61 6e 64 20 74 68 65 79 20   Gosub and they 
13460 64 6f 20 6e 6f 74 20 52 65 74 75 72 6e 2e 20 20  do not Return.  
13470 45 6f 66 41 20 61 6e 64 20 45 6f 66 42 20 6c 6f  EofA and EofB lo
13480 6f 70 0a 2a 2a 20 75 6e 74 69 6c 20 61 6c 6c 20  op.** until all 
13490 64 61 74 61 20 69 73 20 65 78 68 61 75 73 74 65  data is exhauste
134a0 64 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20 74  d then jump to t
134b0 68 65 20 22 65 6e 64 22 20 6c 61 62 65 2e 20 20  he "end" labe.  
134c0 41 6c 74 42 2c 20 41 65 71 42 2c 0a 2a 2a 20 61  AltB, AeqB,.** a
134d0 6e 64 20 41 67 74 42 20 6a 75 6d 70 20 74 6f 20  nd AgtB jump to 
134e0 65 69 74 68 65 72 20 4c 32 20 6f 72 20 74 6f 20  either L2 or to 
134f0 6f 6e 65 20 6f 66 20 45 6f 66 41 20 6f 72 20 45  one of EofA or E
13500 6f 66 42 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ofB..*/.#ifndef 
13510 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50  SQLITE_OMIT_COMP
13520 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 73 74 61 74  OUND_SELECT.stat
13530 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65  ic int multiSele
13540 63 74 4f 72 64 65 72 42 79 28 0a 20 20 50 61 72  ctOrderBy(.  Par
13550 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
13560 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
13570 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ntext */.  Selec
13580 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
13590 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f   /* The right-mo
135a0 73 74 20 6f 66 20 53 45 4c 45 43 54 73 20 74 6f  st of SELECTs to
135b0 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53   be coded */.  S
135c0 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74  electDest *pDest
135d0 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20       /* What to 
135e0 64 6f 20 77 69 74 68 20 71 75 65 72 79 20 72 65  do with query re
135f0 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  sults */.){.  in
13600 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20  t i, j;         
13610 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
13620 74 65 72 73 20 2a 2f 0a 20 20 53 65 6c 65 63 74  ters */.  Select
13630 20 2a 70 50 72 69 6f 72 3b 20 20 20 20 20 20 20   *pPrior;       
13640 2f 2a 20 41 6e 6f 74 68 65 72 20 53 45 4c 45 43  /* Another SELEC
13650 54 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f  T immediately to
13660 20 6f 75 72 20 6c 65 66 74 20 2a 2f 0a 20 20 56   our left */.  V
13670 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20  dbe *v;         
13680 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
13690 20 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56 44   code to this VD
136a0 42 45 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  BE */.  SelectDe
136b0 73 74 20 64 65 73 74 41 3b 20 20 20 20 20 2f 2a  st destA;     /*
136c0 20 44 65 73 74 69 6e 61 74 69 6f 6e 20 66 6f 72   Destination for
136d0 20 63 6f 72 6f 75 74 69 6e 65 20 41 20 2a 2f 0a   coroutine A */.
136e0 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73    SelectDest des
136f0 74 42 3b 20 20 20 20 20 2f 2a 20 44 65 73 74 69  tB;     /* Desti
13700 6e 61 74 69 6f 6e 20 66 6f 72 20 63 6f 72 6f 75  nation for corou
13710 74 69 6e 65 20 42 20 2a 2f 0a 20 20 69 6e 74 20  tine B */.  int 
13720 72 65 67 41 64 64 72 41 3b 20 20 20 20 20 20 20  regAddrA;       
13730 20 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67    /* Address reg
13740 69 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74  ister for select
13750 2d 41 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a  -A coroutine */.
13760 20 20 69 6e 74 20 72 65 67 45 6f 66 41 3b 20 20    int regEofA;  
13770 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 20          /* Flag 
13780 74 6f 20 69 6e 64 69 63 61 74 65 20 77 68 65 6e  to indicate when
13790 20 73 65 6c 65 63 74 2d 41 20 69 73 20 63 6f 6d   select-A is com
137a0 70 6c 65 74 65 20 2a 2f 0a 20 20 69 6e 74 20 72  plete */.  int r
137b0 65 67 41 64 64 72 42 3b 20 20 20 20 20 20 20 20  egAddrB;        
137c0 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67 69   /* Address regi
137d0 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d  ster for select-
137e0 42 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20  B coroutine */. 
137f0 20 69 6e 74 20 72 65 67 45 6f 66 42 3b 20 20 20   int regEofB;   
13800 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 20 74         /* Flag t
13810 6f 20 69 6e 64 69 63 61 74 65 20 77 68 65 6e 20  o indicate when 
13820 73 65 6c 65 63 74 2d 42 20 69 73 20 63 6f 6d 70  select-B is comp
13830 6c 65 74 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  lete */.  int ad
13840 64 72 53 65 6c 65 63 74 41 3b 20 20 20 20 20 20  drSelectA;      
13850 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
13860 65 20 73 65 6c 65 63 74 2d 41 20 63 6f 72 6f 75  e select-A corou
13870 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tine */.  int ad
13880 64 72 53 65 6c 65 63 74 42 3b 20 20 20 20 20 20  drSelectB;      
13890 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
138a0 65 20 73 65 6c 65 63 74 2d 42 20 63 6f 72 6f 75  e select-B corou
138b0 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65  tine */.  int re
138c0 67 4f 75 74 41 3b 20 20 20 20 20 20 20 20 20 20  gOutA;          
138d0 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67 69 73  /* Address regis
138e0 74 65 72 20 66 6f 72 20 74 68 65 20 6f 75 74 70  ter for the outp
138f0 75 74 2d 41 20 73 75 62 72 6f 75 74 69 6e 65 20  ut-A subroutine 
13900 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75 74 42  */.  int regOutB
13910 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64  ;          /* Ad
13920 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66  dress register f
13930 6f 72 20 74 68 65 20 6f 75 74 70 75 74 2d 42 20  or the output-B 
13940 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
13950 69 6e 74 20 61 64 64 72 4f 75 74 41 3b 20 20 20  int addrOutA;   
13960 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
13970 20 6f 66 20 74 68 65 20 6f 75 74 70 75 74 2d 41   of the output-A
13980 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
13990 20 69 6e 74 20 61 64 64 72 4f 75 74 42 20 3d 20   int addrOutB = 
139a0 30 3b 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73  0;     /* Addres
139b0 73 20 6f 66 20 74 68 65 20 6f 75 74 70 75 74 2d  s of the output-
139c0 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  B subroutine */.
139d0 20 20 69 6e 74 20 61 64 64 72 45 6f 66 41 3b 20    int addrEofA; 
139e0 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
139f0 73 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74  ss of the select
13a00 2d 41 2d 65 78 68 61 75 73 74 65 64 20 73 75 62  -A-exhausted sub
13a10 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
13a20 20 61 64 64 72 45 6f 66 42 3b 20 20 20 20 20 20   addrEofB;      
13a30 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
13a40 20 74 68 65 20 73 65 6c 65 63 74 2d 42 2d 65 78   the select-B-ex
13a50 68 61 75 73 74 65 64 20 73 75 62 72 6f 75 74 69  hausted subrouti
13a60 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ne */.  int addr
13a70 41 6c 74 42 3b 20 20 20 20 20 20 20 20 20 2f 2a  AltB;         /*
13a80 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
13a90 41 3c 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  A<B subroutine *
13aa0 2f 0a 20 20 69 6e 74 20 61 64 64 72 41 65 71 42  /.  int addrAeqB
13ab0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64  ;         /* Add
13ac0 72 65 73 73 20 6f 66 20 74 68 65 20 41 3d 3d 42  ress of the A==B
13ad0 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
13ae0 20 69 6e 74 20 61 64 64 72 41 67 74 42 3b 20 20   int addrAgtB;  
13af0 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
13b00 73 20 6f 66 20 74 68 65 20 41 3e 42 20 73 75 62  s of the A>B sub
13b10 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
13b20 20 72 65 67 4c 69 6d 69 74 41 3b 20 20 20 20 20   regLimitA;     
13b30 20 20 20 2f 2a 20 4c 69 6d 69 74 20 72 65 67 69     /* Limit regi
13b40 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d  ster for select-
13b50 41 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4c 69  A */.  int regLi
13b60 6d 69 74 42 3b 20 20 20 20 20 20 20 20 2f 2a 20  mitB;        /* 
13b70 4c 69 6d 69 74 20 72 65 67 69 73 74 65 72 20 66  Limit register f
13b80 6f 72 20 73 65 6c 65 63 74 2d 41 20 2a 2f 0a 20  or select-A */. 
13b90 20 69 6e 74 20 72 65 67 50 72 65 76 3b 20 20 20   int regPrev;   
13ba0 20 20 20 20 20 20 20 2f 2a 20 41 20 72 61 6e 67         /* A rang
13bb0 65 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 74  e of registers t
13bc0 6f 20 68 6f 6c 64 20 70 72 65 76 69 6f 75 73 20  o hold previous 
13bd0 6f 75 74 70 75 74 20 2a 2f 0a 20 20 69 6e 74 20  output */.  int 
13be0 73 61 76 65 64 4c 69 6d 69 74 3b 20 20 20 20 20  savedLimit;     
13bf0 20 20 2f 2a 20 53 61 76 65 64 20 76 61 6c 75 65    /* Saved value
13c00 20 6f 66 20 70 2d 3e 69 4c 69 6d 69 74 20 2a 2f   of p->iLimit */
13c10 0a 20 20 69 6e 74 20 73 61 76 65 64 4f 66 66 73  .  int savedOffs
13c20 65 74 3b 20 20 20 20 20 20 2f 2a 20 53 61 76 65  et;      /* Save
13c30 64 20 76 61 6c 75 65 20 6f 66 20 70 2d 3e 69 4f  d value of p->iO
13c40 66 66 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 6c  ffset */.  int l
13c50 61 62 65 6c 43 6d 70 72 3b 20 20 20 20 20 20 20  abelCmpr;       
13c60 20 2f 2a 20 4c 61 62 65 6c 20 66 6f 72 20 74 68   /* Label for th
13c70 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6d  e start of the m
13c80 65 72 67 65 20 61 6c 67 6f 72 69 74 68 6d 20 2a  erge algorithm *
13c90 2f 0a 20 20 69 6e 74 20 6c 61 62 65 6c 45 6e 64  /.  int labelEnd
13ca0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 62  ;         /* Lab
13cb0 65 6c 20 66 6f 72 20 74 68 65 20 65 6e 64 20 6f  el for the end o
13cc0 66 20 74 68 65 20 6f 76 65 72 61 6c 6c 20 53 45  f the overall SE
13cd0 4c 45 43 54 20 73 74 6d 74 20 2a 2f 0a 20 20 69  LECT stmt */.  i
13ce0 6e 74 20 6a 31 3b 20 20 20 20 20 20 20 20 20 20  nt j1;          
13cf0 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 69 6e 73       /* Jump ins
13d00 74 72 75 63 74 69 6f 6e 73 20 74 68 61 74 20 67  tructions that g
13d10 65 74 20 72 65 74 61 72 67 65 74 74 65 64 20 2a  et retargetted *
13d20 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20  /.  int op;     
13d30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65            /* One
13d40 20 6f 66 20 54 4b 5f 41 4c 4c 2c 20 54 4b 5f 55   of TK_ALL, TK_U
13d50 4e 49 4f 4e 2c 20 54 4b 5f 45 58 43 45 50 54 2c  NION, TK_EXCEPT,
13d60 20 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 2a 2f   TK_INTERSECT */
13d70 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  .  KeyInfo *pKey
13d80 44 75 70 20 3d 20 30 3b 20 2f 2a 20 43 6f 6d 70  Dup = 0; /* Comp
13d90 61 72 69 73 6f 6e 20 69 6e 66 6f 72 6d 61 74 69  arison informati
13da0 6f 6e 20 66 6f 72 20 64 75 70 6c 69 63 61 74 65  on for duplicate
13db0 20 72 65 6d 6f 76 61 6c 20 2a 2f 0a 20 20 4b 65   removal */.  Ke
13dc0 79 49 6e 66 6f 20 2a 70 4b 65 79 4d 65 72 67 65  yInfo *pKeyMerge
13dd0 3b 20 20 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f  ;   /* Compariso
13de0 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f  n information fo
13df0 72 20 6d 65 72 67 69 6e 67 20 72 6f 77 73 20 2a  r merging rows *
13e00 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  /.  sqlite3 *db;
13e10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
13e20 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
13e30 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
13e40 70 4f 72 64 65 72 42 79 3b 20 20 20 2f 2a 20 54  pOrderBy;   /* T
13e50 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
13e60 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 72 64  se */.  int nOrd
13e70 65 72 42 79 3b 20 20 20 20 20 20 20 20 20 2f 2a  erBy;         /*
13e80 20 4e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73   Number of terms
13e90 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59   in the ORDER BY
13ea0 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74   clause */.  int
13eb0 20 2a 61 50 65 72 6d 75 74 65 3b 20 20 20 20 20   *aPermute;     
13ec0 20 20 20 2f 2a 20 4d 61 70 70 69 6e 67 20 66 72     /* Mapping fr
13ed0 6f 6d 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  om ORDER BY term
13ee0 73 20 74 6f 20 72 65 73 75 6c 74 20 73 65 74 20  s to result set 
13ef0 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 23 69 66 6e 64  columns */.#ifnd
13f00 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  ef SQLITE_OMIT_E
13f10 58 50 4c 41 49 4e 0a 20 20 69 6e 74 20 69 53 75  XPLAIN.  int iSu
13f20 62 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  b1;            /
13f30 2a 20 45 51 50 20 69 64 20 6f 66 20 6c 65 66 74  * EQP id of left
13f40 2d 68 61 6e 64 20 71 75 65 72 79 20 2a 2f 0a 20  -hand query */. 
13f50 20 69 6e 74 20 69 53 75 62 32 3b 20 20 20 20 20   int iSub2;     
13f60 20 20 20 20 20 20 20 2f 2a 20 45 51 50 20 69 64         /* EQP id
13f70 20 6f 66 20 72 69 67 68 74 2d 68 61 6e 64 20 71   of right-hand q
13f80 75 65 72 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a  uery */.#endif..
13f90 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72    assert( p->pOr
13fa0 64 65 72 42 79 21 3d 30 20 29 3b 0a 20 20 61 73  derBy!=0 );.  as
13fb0 73 65 72 74 28 20 70 4b 65 79 44 75 70 3d 3d 30  sert( pKeyDup==0
13fc0 20 29 3b 20 2f 2a 20 22 4d 61 6e 61 67 65 64 22   ); /* "Managed"
13fd0 20 63 6f 64 65 20 6e 65 65 64 73 20 74 68 69 73   code needs this
13fe0 2e 20 20 54 69 63 6b 65 74 20 23 33 33 38 32 2e  .  Ticket #3382.
13ff0 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61 72 73   */.  db = pPars
14000 65 2d 3e 64 62 3b 0a 20 20 76 20 3d 20 70 50 61  e->db;.  v = pPa
14010 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73  rse->pVdbe;.  as
14020 73 65 72 74 28 20 76 21 3d 30 20 29 3b 20 20 20  sert( v!=0 );   
14030 20 20 20 20 2f 2a 20 41 6c 72 65 61 64 79 20 74      /* Already t
14040 68 72 6f 77 6e 20 74 68 65 20 65 72 72 6f 72 20  hrown the error 
14050 69 66 20 56 44 42 45 20 61 6c 6c 6f 63 20 66 61  if VDBE alloc fa
14060 69 6c 65 64 20 2a 2f 0a 20 20 6c 61 62 65 6c 45  iled */.  labelE
14070 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  nd = sqlite3Vdbe
14080 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
14090 6c 61 62 65 6c 43 6d 70 72 20 3d 20 73 71 6c 69  labelCmpr = sqli
140a0 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
140b0 28 76 29 3b 0a 0a 0a 20 20 2f 2a 20 50 61 74 63  (v);...  /* Patc
140c0 68 20 75 70 20 74 68 65 20 4f 52 44 45 52 20 42  h up the ORDER B
140d0 59 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20  Y clause.  */.  
140e0 6f 70 20 3d 20 70 2d 3e 6f 70 3b 20 20 0a 20 20  op = p->op;  .  
140f0 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69  pPrior = p->pPri
14100 6f 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  or;.  assert( pP
14110 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 3d 3d  rior->pOrderBy==
14120 30 20 29 3b 0a 20 20 70 4f 72 64 65 72 42 79 20  0 );.  pOrderBy 
14130 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20  = p->pOrderBy;. 
14140 20 61 73 73 65 72 74 28 20 70 4f 72 64 65 72 42   assert( pOrderB
14150 79 20 29 3b 0a 20 20 6e 4f 72 64 65 72 42 79 20  y );.  nOrderBy 
14160 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  = pOrderBy->nExp
14170 72 3b 0a 0a 20 20 2f 2a 20 46 6f 72 20 6f 70 65  r;..  /* For ope
14180 72 61 74 6f 72 73 20 6f 74 68 65 72 20 74 68 61  rators other tha
14190 6e 20 55 4e 49 4f 4e 20 41 4c 4c 20 77 65 20 68  n UNION ALL we h
141a0 61 76 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  ave to make sure
141b0 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 20 4f   that.  ** the O
141c0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 63  RDER BY clause c
141d0 6f 76 65 72 73 20 65 76 65 72 79 20 74 65 72 6d  overs every term
141e0 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 20 73   of the result s
141f0 65 74 2e 20 20 41 64 64 0a 20 20 2a 2a 20 74 65  et.  Add.  ** te
14200 72 6d 73 20 74 6f 20 74 68 65 20 4f 52 44 45 52  rms to the ORDER
14210 20 42 59 20 63 6c 61 75 73 65 20 61 73 20 6e 65   BY clause as ne
14220 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20  cessary..  */.  
14230 69 66 28 20 6f 70 21 3d 54 4b 5f 41 4c 4c 20 29  if( op!=TK_ALL )
14240 7b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 64  {.    for(i=1; d
14250 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d  b->mallocFailed=
14260 3d 30 20 26 26 20 69 3c 3d 70 2d 3e 70 45 4c 69  =0 && i<=p->pELi
14270 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
14280 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78  .      struct Ex
14290 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
142a0 65 6d 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d  em;.      for(j=
142b0 30 2c 20 70 49 74 65 6d 3d 70 4f 72 64 65 72 42  0, pItem=pOrderB
142c0 79 2d 3e 61 3b 20 6a 3c 6e 4f 72 64 65 72 42 79  y->a; j<nOrderBy
142d0 3b 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; j++, pItem++){
142e0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
142f0 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64   pItem->u.x.iOrd
14300 65 72 42 79 43 6f 6c 3e 30 20 29 3b 0a 20 20 20  erByCol>0 );.   
14310 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
14320 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3d  u.x.iOrderByCol=
14330 3d 69 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =i ) break;.    
14340 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3d    }.      if( j=
14350 3d 6e 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  =nOrderBy ){.   
14360 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 20       Expr *pNew 
14370 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62  = sqlite3Expr(db
14380 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20 30 29  , TK_INTEGER, 0)
14390 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e  ;.        if( pN
143a0 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  ew==0 ) return S
143b0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
143c0 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73       pNew->flags
143d0 20 7c 3d 20 45 50 5f 49 6e 74 56 61 6c 75 65 3b   |= EP_IntValue;
143e0 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75  .        pNew->u
143f0 2e 69 56 61 6c 75 65 20 3d 20 69 3b 0a 20 20 20  .iValue = i;.   
14400 20 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20       pOrderBy = 
14410 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
14420 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70 4f  ppend(pParse, pO
14430 72 64 65 72 42 79 2c 20 70 4e 65 77 29 3b 0a 20  rderBy, pNew);. 
14440 20 20 20 20 20 20 20 69 66 28 20 70 4f 72 64 65         if( pOrde
14450 72 42 79 20 29 20 70 4f 72 64 65 72 42 79 2d 3e  rBy ) pOrderBy->
14460 61 5b 6e 4f 72 64 65 72 42 79 2b 2b 5d 2e 75 2e  a[nOrderBy++].u.
14470 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20 3d 20  x.iOrderByCol = 
14480 28 75 31 36 29 69 3b 0a 20 20 20 20 20 20 7d 0a  (u16)i;.      }.
14490 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
144a0 43 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6d 70  Compute the comp
144b0 61 72 69 73 6f 6e 20 70 65 72 6d 75 74 61 74 69  arison permutati
144c0 6f 6e 20 61 6e 64 20 6b 65 79 69 6e 66 6f 20 74  on and keyinfo t
144d0 68 61 74 20 69 73 20 75 73 65 64 20 77 69 74 68  hat is used with
144e0 0a 20 20 2a 2a 20 74 68 65 20 70 65 72 6d 75 74  .  ** the permut
144f0 61 74 69 6f 6e 20 75 73 65 64 20 74 6f 20 64 65  ation used to de
14500 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20 6e  termine if the n
14510 65 78 74 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20  ext.  ** row of 
14520 72 65 73 75 6c 74 73 20 63 6f 6d 65 73 20 66 72  results comes fr
14530 6f 6d 20 73 65 6c 65 63 74 41 20 6f 72 20 73 65  om selectA or se
14540 6c 65 63 74 42 2e 20 20 41 6c 73 6f 20 61 64 64  lectB.  Also add
14550 20 65 78 70 6c 69 63 69 74 0a 20 20 2a 2a 20 63   explicit.  ** c
14560 6f 6c 6c 61 74 69 6f 6e 73 20 74 6f 20 74 68 65  ollations to the
14570 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
14580 20 74 65 72 6d 73 20 73 6f 20 74 68 61 74 20 77   terms so that w
14590 68 65 6e 20 74 68 65 20 73 75 62 71 75 65 72 69  hen the subqueri
145a0 65 73 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 72  es.  ** to the r
145b0 69 67 68 74 20 61 6e 64 20 74 68 65 20 6c 65 66  ight and the lef
145c0 74 20 61 72 65 20 65 76 61 6c 75 61 74 65 64 2c  t are evaluated,
145d0 20 74 68 65 79 20 75 73 65 20 74 68 65 20 63 6f   they use the co
145e0 72 72 65 63 74 0a 20 20 2a 2a 20 63 6f 6c 6c 61  rrect.  ** colla
145f0 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 61 50 65  tion..  */.  aPe
14600 72 6d 75 74 65 20 3d 20 73 71 6c 69 74 65 33 44  rmute = sqlite3D
14610 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73  bMallocRaw(db, s
14620 69 7a 65 6f 66 28 69 6e 74 29 2a 6e 4f 72 64 65  izeof(int)*nOrde
14630 72 42 79 29 3b 0a 20 20 69 66 28 20 61 50 65 72  rBy);.  if( aPer
14640 6d 75 74 65 20 29 7b 0a 20 20 20 20 73 74 72 75  mute ){.    stru
14650 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
14660 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 66 6f 72   *pItem;.    for
14670 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70 4f 72 64  (i=0, pItem=pOrd
14680 65 72 42 79 2d 3e 61 3b 20 69 3c 6e 4f 72 64 65  erBy->a; i<nOrde
14690 72 42 79 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  rBy; i++, pItem+
146a0 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  +){.      assert
146b0 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72  ( pItem->u.x.iOr
146c0 64 65 72 42 79 43 6f 6c 3e 30 0a 20 20 20 20 20  derByCol>0.     
146d0 20 20 20 20 20 26 26 20 70 49 74 65 6d 2d 3e 75       && pItem->u
146e0 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3c 3d  .x.iOrderByCol<=
146f0 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
14700 20 29 3b 0a 20 20 20 20 20 20 61 50 65 72 6d 75   );.      aPermu
14710 74 65 5b 69 5d 20 3d 20 70 49 74 65 6d 2d 3e 75  te[i] = pItem->u
14720 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20 2d  .x.iOrderByCol -
14730 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4b   1;.    }.    pK
14740 65 79 4d 65 72 67 65 20 3d 20 73 71 6c 69 74 65  eyMerge = sqlite
14750 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 64 62  3KeyInfoAlloc(db
14760 2c 20 6e 4f 72 64 65 72 42 79 2c 20 31 29 3b 0a  , nOrderBy, 1);.
14770 20 20 20 20 69 66 28 20 70 4b 65 79 4d 65 72 67      if( pKeyMerg
14780 65 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69  e ){.      for(i
14790 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20  =0; i<nOrderBy; 
147a0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 43 6f  i++){.        Co
147b0 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20  llSeq *pColl;.  
147c0 20 20 20 20 20 20 45 78 70 72 20 2a 70 54 65 72        Expr *pTer
147d0 6d 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  m = pOrderBy->a[
147e0 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  i].pExpr;.      
147f0 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 66 6c 61    if( pTerm->fla
14800 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 20  gs & EP_Collate 
14810 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f  ){.          pCo
14820 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
14830 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
14840 70 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 20 20  pTerm);.        
14850 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
14860 20 70 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69 53 65   pColl = multiSe
14870 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72  lectCollSeq(pPar
14880 73 65 2c 20 70 2c 20 61 50 65 72 6d 75 74 65 5b  se, p, aPermute[
14890 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  i]);.          i
148a0 66 28 20 70 43 6f 6c 6c 3d 3d 30 20 29 20 70 43  f( pColl==0 ) pC
148b0 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43  oll = db->pDfltC
148c0 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 70  oll;.          p
148d0 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45  OrderBy->a[i].pE
148e0 78 70 72 20 3d 0a 20 20 20 20 20 20 20 20 20 20  xpr =.          
148f0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 64     sqlite3ExprAd
14900 64 43 6f 6c 6c 61 74 65 53 74 72 69 6e 67 28 70  dCollateString(p
14910 50 61 72 73 65 2c 20 70 54 65 72 6d 2c 20 70 43  Parse, pTerm, pC
14920 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  oll->zName);.   
14930 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
14940 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 4b 65  ssert( sqlite3Ke
14950 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65  yInfoIsWriteable
14960 28 70 4b 65 79 4d 65 72 67 65 29 20 29 3b 0a 20  (pKeyMerge) );. 
14970 20 20 20 20 20 20 20 70 4b 65 79 4d 65 72 67 65         pKeyMerge
14980 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 70 43 6f  ->aColl[i] = pCo
14990 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70 4b 65 79  ll;.        pKey
149a0 4d 65 72 67 65 2d 3e 61 53 6f 72 74 4f 72 64 65  Merge->aSortOrde
149b0 72 5b 69 5d 20 3d 20 70 4f 72 64 65 72 42 79 2d  r[i] = pOrderBy-
149c0 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b  >a[i].sortOrder;
149d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
149e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4b 65 79   }else{.    pKey
149f0 4d 65 72 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a  Merge = 0;.  }..
14a00 20 20 2f 2a 20 52 65 61 74 74 61 63 68 20 74 68    /* Reattach th
14a10 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
14a20 65 20 74 6f 20 74 68 65 20 71 75 65 72 79 2e 0a  e to the query..
14a30 20 20 2a 2f 0a 20 20 70 2d 3e 70 4f 72 64 65 72    */.  p->pOrder
14a40 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20  By = pOrderBy;. 
14a50 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42   pPrior->pOrderB
14a60 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  y = sqlite3ExprL
14a70 69 73 74 44 75 70 28 70 50 61 72 73 65 2d 3e 64  istDup(pParse->d
14a80 62 2c 20 70 4f 72 64 65 72 42 79 2c 20 30 29 3b  b, pOrderBy, 0);
14a90 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
14aa0 61 20 72 61 6e 67 65 20 6f 66 20 74 65 6d 70 6f  a range of tempo
14ab0 72 61 72 79 20 72 65 67 69 73 74 65 72 73 20 61  rary registers a
14ac0 6e 64 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 6e  nd the KeyInfo n
14ad0 65 65 64 65 64 0a 20 20 2a 2a 20 66 6f 72 20 74  eeded.  ** for t
14ae0 68 65 20 6c 6f 67 69 63 20 74 68 61 74 20 72 65  he logic that re
14af0 6d 6f 76 65 73 20 64 75 70 6c 69 63 61 74 65 20  moves duplicate 
14b00 72 65 73 75 6c 74 20 72 6f 77 73 20 77 68 65 6e  result rows when
14b10 20 74 68 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74   the.  ** operat
14b20 6f 72 20 69 73 20 55 4e 49 4f 4e 2c 20 45 58 43  or is UNION, EXC
14b30 45 50 54 2c 20 6f 72 20 49 4e 54 45 52 53 45 43  EPT, or INTERSEC
14b40 54 20 28 62 75 74 20 6e 6f 74 20 55 4e 49 4f 4e  T (but not UNION
14b50 20 41 4c 4c 29 2e 0a 20 20 2a 2f 0a 20 20 69 66   ALL)..  */.  if
14b60 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a  ( op==TK_ALL ){.
14b70 20 20 20 20 72 65 67 50 72 65 76 20 3d 20 30 3b      regPrev = 0;
14b80 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
14b90 74 20 6e 45 78 70 72 20 3d 20 70 2d 3e 70 45 4c  t nExpr = p->pEL
14ba0 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  ist->nExpr;.    
14bb0 61 73 73 65 72 74 28 20 6e 4f 72 64 65 72 42 79  assert( nOrderBy
14bc0 3e 3d 6e 45 78 70 72 20 7c 7c 20 64 62 2d 3e 6d  >=nExpr || db->m
14bd0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
14be0 20 20 20 72 65 67 50 72 65 76 20 3d 20 70 50 61     regPrev = pPa
14bf0 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20  rse->nMem+1;.   
14c00 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
14c10 20 6e 45 78 70 72 2b 31 3b 0a 20 20 20 20 73 71   nExpr+1;.    sq
14c20 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
14c30 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
14c40 2c 20 72 65 67 50 72 65 76 29 3b 0a 20 20 20 20  , regPrev);.    
14c50 70 4b 65 79 44 75 70 20 3d 20 73 71 6c 69 74 65  pKeyDup = sqlite
14c60 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 64 62  3KeyInfoAlloc(db
14c70 2c 20 6e 45 78 70 72 2c 20 31 29 3b 0a 20 20 20  , nExpr, 1);.   
14c80 20 69 66 28 20 70 4b 65 79 44 75 70 20 29 7b 0a   if( pKeyDup ){.
14c90 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
14ca0 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57 72  lite3KeyInfoIsWr
14cb0 69 74 65 61 62 6c 65 28 70 4b 65 79 44 75 70 29  iteable(pKeyDup)
14cc0 20 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   );.      for(i=
14cd0 30 3b 20 69 3c 6e 45 78 70 72 3b 20 69 2b 2b 29  0; i<nExpr; i++)
14ce0 7b 0a 20 20 20 20 20 20 20 20 70 4b 65 79 44 75  {.        pKeyDu
14cf0 70 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 6d 75  p->aColl[i] = mu
14d00 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71  ltiSelectCollSeq
14d10 28 70 50 61 72 73 65 2c 20 70 2c 20 69 29 3b 0a  (pParse, p, i);.
14d20 20 20 20 20 20 20 20 20 70 4b 65 79 44 75 70 2d          pKeyDup-
14d30 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d  >aSortOrder[i] =
14d40 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
14d50 7d 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20 53 65 70  }.  }. .  /* Sep
14d60 61 72 61 74 65 20 74 68 65 20 6c 65 66 74 20 61  arate the left a
14d70 6e 64 20 74 68 65 20 72 69 67 68 74 20 71 75 65  nd the right que
14d80 72 79 20 66 72 6f 6d 20 6f 6e 65 20 61 6e 6f 74  ry from one anot
14d90 68 65 72 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 50  her.  */.  p->pP
14da0 72 69 6f 72 20 3d 20 30 3b 0a 20 20 73 71 6c 69  rior = 0;.  sqli
14db0 74 65 33 52 65 73 6f 6c 76 65 4f 72 64 65 72 47  te3ResolveOrderG
14dc0 72 6f 75 70 42 79 28 70 50 61 72 73 65 2c 20 70  roupBy(pParse, p
14dd0 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 22  , p->pOrderBy, "
14de0 4f 52 44 45 52 22 29 3b 0a 20 20 69 66 28 20 70  ORDER");.  if( p
14df0 50 72 69 6f 72 2d 3e 70 50 72 69 6f 72 3d 3d 30  Prior->pPrior==0
14e00 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52   ){.    sqlite3R
14e10 65 73 6f 6c 76 65 4f 72 64 65 72 47 72 6f 75 70  esolveOrderGroup
14e20 42 79 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f  By(pParse, pPrio
14e30 72 2c 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65  r, pPrior->pOrde
14e40 72 42 79 2c 20 22 4f 52 44 45 52 22 29 3b 0a 20  rBy, "ORDER");. 
14e50 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65   }..  /* Compute
14e60 20 74 68 65 20 6c 69 6d 69 74 20 72 65 67 69 73   the limit regis
14e70 74 65 72 73 20 2a 2f 0a 20 20 63 6f 6d 70 75 74  ters */.  comput
14e80 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28  eLimitRegisters(
14e90 70 50 61 72 73 65 2c 20 70 2c 20 6c 61 62 65 6c  pParse, p, label
14ea0 45 6e 64 29 3b 0a 20 20 69 66 28 20 70 2d 3e 69  End);.  if( p->i
14eb0 4c 69 6d 69 74 20 26 26 20 6f 70 3d 3d 54 4b 5f  Limit && op==TK_
14ec0 41 4c 4c 20 29 7b 0a 20 20 20 20 72 65 67 4c 69  ALL ){.    regLi
14ed0 6d 69 74 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d  mitA = ++pParse-
14ee0 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72 65 67 4c 69  >nMem;.    regLi
14ef0 6d 69 74 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d  mitB = ++pParse-
14f00 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74  >nMem;.    sqlit
14f10 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
14f20 4f 50 5f 43 6f 70 79 2c 20 70 2d 3e 69 4f 66 66  OP_Copy, p->iOff
14f30 73 65 74 20 3f 20 70 2d 3e 69 4f 66 66 73 65 74  set ? p->iOffset
14f40 2b 31 20 3a 20 70 2d 3e 69 4c 69 6d 69 74 2c 0a  +1 : p->iLimit,.
14f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14f70 20 20 72 65 67 4c 69 6d 69 74 41 29 3b 0a 20 20    regLimitA);.  
14f80 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
14f90 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20  Op2(v, OP_Copy, 
14fa0 72 65 67 4c 69 6d 69 74 41 2c 20 72 65 67 4c 69  regLimitA, regLi
14fb0 6d 69 74 42 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  mitB);.  }else{.
14fc0 20 20 20 20 72 65 67 4c 69 6d 69 74 41 20 3d 20      regLimitA = 
14fd0 72 65 67 4c 69 6d 69 74 42 20 3d 20 30 3b 0a 20  regLimitB = 0;. 
14fe0 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72   }.  sqlite3Expr
14ff0 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c  Delete(db, p->pL
15000 69 6d 69 74 29 3b 0a 20 20 70 2d 3e 70 4c 69 6d  imit);.  p->pLim
15010 69 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  it = 0;.  sqlite
15020 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
15030 70 2d 3e 70 4f 66 66 73 65 74 29 3b 0a 20 20 70  p->pOffset);.  p
15040 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 0a  ->pOffset = 0;..
15050 20 20 72 65 67 41 64 64 72 41 20 3d 20 2b 2b 70    regAddrA = ++p
15060 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72  Parse->nMem;.  r
15070 65 67 45 6f 66 41 20 3d 20 2b 2b 70 50 61 72 73  egEofA = ++pPars
15080 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 41 64  e->nMem;.  regAd
15090 64 72 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  drB = ++pParse->
150a0 6e 4d 65 6d 3b 0a 20 20 72 65 67 45 6f 66 42 20  nMem;.  regEofB 
150b0 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
150c0 3b 0a 20 20 72 65 67 4f 75 74 41 20 3d 20 2b 2b  ;.  regOutA = ++
150d0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
150e0 72 65 67 4f 75 74 42 20 3d 20 2b 2b 70 50 61 72  regOutB = ++pPar
150f0 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69  se->nMem;.  sqli
15100 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69  te3SelectDestIni
15110 74 28 26 64 65 73 74 41 2c 20 53 52 54 5f 43 6f  t(&destA, SRT_Co
15120 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72  routine, regAddr
15130 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c  A);.  sqlite3Sel
15140 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73  ectDestInit(&des
15150 74 42 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e  tB, SRT_Coroutin
15160 65 2c 20 72 65 67 41 64 64 72 42 29 3b 0a 0a 20  e, regAddrB);.. 
15170 20 2f 2a 20 4a 75 6d 70 20 70 61 73 74 20 74 68   /* Jump past th
15180 65 20 76 61 72 69 6f 75 73 20 73 75 62 72 6f 75  e various subrou
15190 74 69 6e 65 73 20 61 6e 64 20 63 6f 72 6f 75 74  tines and corout
151a0 69 6e 65 73 20 74 6f 20 74 68 65 20 6d 61 69 6e  ines to the main
151b0 0a 20 20 2a 2a 20 6d 65 72 67 65 20 6c 6f 6f 70  .  ** merge loop
151c0 0a 20 20 2a 2f 0a 20 20 6a 31 20 3d 20 73 71 6c  .  */.  j1 = sql
151d0 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76  ite3VdbeAddOp0(v
151e0 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20 61 64  , OP_Goto);.  ad
151f0 64 72 53 65 6c 65 63 74 41 20 3d 20 73 71 6c 69  drSelectA = sqli
15200 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
15210 64 72 28 76 29 3b 0a 0a 0a 20 20 2f 2a 20 47 65  dr(v);...  /* Ge
15220 6e 65 72 61 74 65 20 61 20 63 6f 72 6f 75 74 69  nerate a corouti
15230 6e 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74  ne to evaluate t
15240 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
15250 65 6e 74 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20  ent to the.  ** 
15260 6c 65 66 74 20 6f 66 20 74 68 65 20 63 6f 6d 70  left of the comp
15270 6f 75 6e 64 20 6f 70 65 72 61 74 6f 72 20 2d 20  ound operator - 
15280 74 68 65 20 22 41 22 20 73 65 6c 65 63 74 2e 0a  the "A" select..
15290 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43    */.  VdbeNoopC
152a0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 42 65 67 69  omment((v, "Begi
152b0 6e 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20  n coroutine for 
152c0 6c 65 66 74 20 53 45 4c 45 43 54 22 29 29 3b 0a  left SELECT"));.
152d0 20 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74    pPrior->iLimit
152e0 20 3d 20 72 65 67 4c 69 6d 69 74 41 3b 0a 20 20   = regLimitA;.  
152f0 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65  explainSetIntege
15300 72 28 69 53 75 62 31 2c 20 70 50 61 72 73 65 2d  r(iSub1, pParse-
15310 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b  >iNextSelectId);
15320 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
15330 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c  (pParse, pPrior,
15340 20 26 64 65 73 74 41 29 3b 0a 20 20 73 71 6c 69   &destA);.  sqli
15350 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
15360 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20   OP_Integer, 1, 
15370 72 65 67 45 6f 66 41 29 3b 0a 20 20 73 71 6c 69  regEofA);.  sqli
15380 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
15390 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64   OP_Yield, regAd
153a0 64 72 41 29 3b 0a 20 20 56 64 62 65 4e 6f 6f 70  drA);.  VdbeNoop
153b0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 45 6e 64  Comment((v, "End
153c0 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20 6c   coroutine for l
153d0 65 66 74 20 53 45 4c 45 43 54 22 29 29 3b 0a 0a  eft SELECT"));..
153e0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20    /* Generate a 
153f0 63 6f 72 6f 75 74 69 6e 65 20 74 6f 20 65 76 61  coroutine to eva
15400 6c 75 61 74 65 20 74 68 65 20 53 45 4c 45 43 54  luate the SELECT
15410 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 20 0a 20   statement on . 
15420 20 2a 2a 20 74 68 65 20 72 69 67 68 74 20 2d 20   ** the right - 
15430 74 68 65 20 22 42 22 20 73 65 6c 65 63 74 0a 20  the "B" select. 
15440 20 2a 2f 0a 20 20 61 64 64 72 53 65 6c 65 63 74   */.  addrSelect
15450 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  B = sqlite3VdbeC
15460 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
15470 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74   VdbeNoopComment
15480 28 28 76 2c 20 22 42 65 67 69 6e 20 63 6f 72 6f  ((v, "Begin coro
15490 75 74 69 6e 65 20 66 6f 72 20 72 69 67 68 74 20  utine for right 
154a0 53 45 4c 45 43 54 22 29 29 3b 0a 20 20 73 61 76  SELECT"));.  sav
154b0 65 64 4c 69 6d 69 74 20 3d 20 70 2d 3e 69 4c 69  edLimit = p->iLi
154c0 6d 69 74 3b 0a 20 20 73 61 76 65 64 4f 66 66 73  mit;.  savedOffs
154d0 65 74 20 3d 20 70 2d 3e 69 4f 66 66 73 65 74 3b  et = p->iOffset;
154e0 0a 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 72  .  p->iLimit = r
154f0 65 67 4c 69 6d 69 74 42 3b 0a 20 20 70 2d 3e 69  egLimitB;.  p->i
15500 4f 66 66 73 65 74 20 3d 20 30 3b 20 20 0a 20 20  Offset = 0;  .  
15510 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65  explainSetIntege
15520 72 28 69 53 75 62 32 2c 20 70 50 61 72 73 65 2d  r(iSub2, pParse-
15530 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b  >iNextSelectId);
15540 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
15550 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64 65 73  (pParse, p, &des
15560 74 42 29 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69 74  tB);.  p->iLimit
15570 20 3d 20 73 61 76 65 64 4c 69 6d 69 74 3b 0a 20   = savedLimit;. 
15580 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 73 61   p->iOffset = sa
15590 76 65 64 4f 66 66 73 65 74 3b 0a 20 20 73 71 6c  vedOffset;.  sql
155a0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
155b0 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c  , OP_Integer, 1,
155c0 20 72 65 67 45 6f 66 42 29 3b 0a 20 20 73 71 6c   regEofB);.  sql
155d0 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
155e0 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41  , OP_Yield, regA
155f0 64 64 72 42 29 3b 0a 20 20 56 64 62 65 4e 6f 6f  ddrB);.  VdbeNoo
15600 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 45 6e  pComment((v, "En
15610 64 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20  d coroutine for 
15620 72 69 67 68 74 20 53 45 4c 45 43 54 22 29 29 3b  right SELECT"));
15630 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
15640 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61  a subroutine tha
15650 74 20 6f 75 74 70 75 74 73 20 74 68 65 20 63 75  t outputs the cu
15660 72 72 65 6e 74 20 72 6f 77 20 6f 66 20 74 68 65  rrent row of the
15670 20 41 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20 61   A.  ** select a
15680 73 20 74 68 65 20 6e 65 78 74 20 6f 75 74 70 75  s the next outpu
15690 74 20 72 6f 77 20 6f 66 20 74 68 65 20 63 6f 6d  t row of the com
156a0 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20  pound select..  
156b0 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d  */.  VdbeNoopCom
156c0 6d 65 6e 74 28 28 76 2c 20 22 4f 75 74 70 75 74  ment((v, "Output
156d0 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 41 22 29   routine for A")
156e0 29 3b 0a 20 20 61 64 64 72 4f 75 74 41 20 3d 20  );.  addrOutA = 
156f0 67 65 6e 65 72 61 74 65 4f 75 74 70 75 74 53 75  generateOutputSu
15700 62 72 6f 75 74 69 6e 65 28 70 50 61 72 73 65 2c  broutine(pParse,
15710 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
15720 20 20 70 2c 20 26 64 65 73 74 41 2c 20 70 44 65    p, &destA, pDe
15730 73 74 2c 20 72 65 67 4f 75 74 41 2c 0a 20 20 20  st, regOutA,.   
15740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
15750 67 50 72 65 76 2c 20 70 4b 65 79 44 75 70 2c 20  gPrev, pKeyDup, 
15760 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 0a 20 20  labelEnd);.  .  
15770 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75  /* Generate a su
15780 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75  broutine that ou
15790 74 70 75 74 73 20 74 68 65 20 63 75 72 72 65 6e  tputs the curren
157a0 74 20 72 6f 77 20 6f 66 20 74 68 65 20 42 0a 20  t row of the B. 
157b0 20 2a 2a 20 73 65 6c 65 63 74 20 61 73 20 74 68   ** select as th
157c0 65 20 6e 65 78 74 20 6f 75 74 70 75 74 20 72 6f  e next output ro
157d0 77 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e  w of the compoun
157e0 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20  d select..  */. 
157f0 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20   if( op==TK_ALL 
15800 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20  || op==TK_UNION 
15810 29 7b 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70 43  ){.    VdbeNoopC
15820 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 75 74 70  omment((v, "Outp
15830 75 74 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 42  ut routine for B
15840 22 29 29 3b 0a 20 20 20 20 61 64 64 72 4f 75 74  "));.    addrOut
15850 42 20 3d 20 67 65 6e 65 72 61 74 65 4f 75 74 70  B = generateOutp
15860 75 74 53 75 62 72 6f 75 74 69 6e 65 28 70 50 61  utSubroutine(pPa
15870 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rse,.           
15880 20 20 20 20 20 20 70 2c 20 26 64 65 73 74 42 2c        p, &destB,
15890 20 70 44 65 73 74 2c 20 72 65 67 4f 75 74 42 2c   pDest, regOutB,
158a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
158b0 20 20 72 65 67 50 72 65 76 2c 20 70 4b 65 79 44    regPrev, pKeyD
158c0 75 70 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20  up, labelEnd);. 
158d0 20 7d 0a 20 20 73 71 6c 69 74 65 33 4b 65 79 49   }.  sqlite3KeyI
158e0 6e 66 6f 55 6e 72 65 66 28 70 4b 65 79 44 75 70  nfoUnref(pKeyDup
158f0 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  );..  /* Generat
15900 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74  e a subroutine t
15910 6f 20 72 75 6e 20 77 68 65 6e 20 74 68 65 20 72  o run when the r
15920 65 73 75 6c 74 73 20 66 72 6f 6d 20 73 65 6c 65  esults from sele
15930 63 74 20 41 0a 20 20 2a 2a 20 61 72 65 20 65 78  ct A.  ** are ex
15940 68 61 75 73 74 65 64 20 61 6e 64 20 6f 6e 6c 79  hausted and only
15950 20 64 61 74 61 20 69 6e 20 73 65 6c 65 63 74 20   data in select 
15960 42 20 72 65 6d 61 69 6e 73 2e 0a 20 20 2a 2f 0a  B remains..  */.
15970 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e    VdbeNoopCommen
15980 74 28 28 76 2c 20 22 65 6f 66 2d 41 20 73 75 62  t((v, "eof-A sub
15990 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 69 66  routine"));.  if
159a0 28 20 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20  ( op==TK_EXCEPT 
159b0 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53  || op==TK_INTERS
159c0 45 43 54 20 29 7b 0a 20 20 20 20 61 64 64 72 45  ECT ){.    addrE
159d0 6f 66 41 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ofA = sqlite3Vdb
159e0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
159f0 74 6f 2c 20 30 2c 20 6c 61 62 65 6c 45 6e 64 29  to, 0, labelEnd)
15a00 3b 0a 20 20 7d 65 6c 73 65 7b 20 20 0a 20 20 20  ;.  }else{  .   
15a10 20 61 64 64 72 45 6f 66 41 20 3d 20 73 71 6c 69   addrEofA = sqli
15a20 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
15a30 20 4f 50 5f 49 66 2c 20 72 65 67 45 6f 66 42 2c   OP_If, regEofB,
15a40 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 20 20   labelEnd);.    
15a50 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15a60 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72  2(v, OP_Gosub, r
15a70 65 67 4f 75 74 42 2c 20 61 64 64 72 4f 75 74 42  egOutB, addrOutB
15a80 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
15a90 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59  beAddOp1(v, OP_Y
15aa0 69 65 6c 64 2c 20 72 65 67 41 64 64 72 42 29 3b  ield, regAddrB);
15ab0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
15ac0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
15ad0 6f 2c 20 30 2c 20 61 64 64 72 45 6f 66 41 29 3b  o, 0, addrEofA);
15ae0 0a 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52  .    p->nSelectR
15af0 6f 77 20 2b 3d 20 70 50 72 69 6f 72 2d 3e 6e 53  ow += pPrior->nS
15b00 65 6c 65 63 74 52 6f 77 3b 0a 20 20 7d 0a 0a 20  electRow;.  }.. 
15b10 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73   /* Generate a s
15b20 75 62 72 6f 75 74 69 6e 65 20 74 6f 20 72 75 6e  ubroutine to run
15b30 20 77 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74   when the result
15b40 73 20 66 72 6f 6d 20 73 65 6c 65 63 74 20 42 0a  s from select B.
15b50 20 20 2a 2a 20 61 72 65 20 65 78 68 61 75 73 74    ** are exhaust
15b60 65 64 20 61 6e 64 20 6f 6e 6c 79 20 64 61 74 61  ed and only data
15b70 20 69 6e 20 73 65 6c 65 63 74 20 41 20 72 65 6d   in select A rem
15b80 61 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ains..  */.  if(
15b90 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43   op==TK_INTERSEC
15ba0 54 20 29 7b 0a 20 20 20 20 61 64 64 72 45 6f 66  T ){.    addrEof
15bb0 42 20 3d 20 61 64 64 72 45 6f 66 41 3b 0a 20 20  B = addrEofA;.  
15bc0 20 20 69 66 28 20 70 2d 3e 6e 53 65 6c 65 63 74    if( p->nSelect
15bd0 52 6f 77 20 3e 20 70 50 72 69 6f 72 2d 3e 6e 53  Row > pPrior->nS
15be0 65 6c 65 63 74 52 6f 77 20 29 20 70 2d 3e 6e 53  electRow ) p->nS
15bf0 65 6c 65 63 74 52 6f 77 20 3d 20 70 50 72 69 6f  electRow = pPrio
15c00 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20  r->nSelectRow;. 
15c10 20 7d 65 6c 73 65 7b 20 20 0a 20 20 20 20 56 64   }else{  .    Vd
15c20 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76  beNoopComment((v
15c30 2c 20 22 65 6f 66 2d 42 20 73 75 62 72 6f 75 74  , "eof-B subrout
15c40 69 6e 65 22 29 29 3b 0a 20 20 20 20 61 64 64 72  ine"));.    addr
15c50 45 6f 66 42 20 3d 20 73 71 6c 69 74 65 33 56 64  EofB = sqlite3Vd
15c60 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
15c70 66 2c 20 72 65 67 45 6f 66 41 2c 20 6c 61 62 65  f, regEofA, labe
15c80 6c 45 6e 64 29 3b 0a 20 20 20 20 73 71 6c 69 74  lEnd);.    sqlit
15c90 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
15ca0 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74  OP_Gosub, regOut
15cb0 41 2c 20 61 64 64 72 4f 75 74 41 29 3b 0a 20 20  A, addrOutA);.  
15cc0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15cd0 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c  Op1(v, OP_Yield,
15ce0 20 72 65 67 41 64 64 72 41 29 3b 0a 20 20 20 20   regAddrA);.    
15cf0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15d00 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
15d10 20 61 64 64 72 45 6f 66 42 29 3b 0a 20 20 7d 0a   addrEofB);.  }.
15d20 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63  .  /* Generate c
15d30 6f 64 65 20 74 6f 20 68 61 6e 64 6c 65 20 74 68  ode to handle th
15d40 65 20 63 61 73 65 20 6f 66 20 41 3c 42 0a 20 20  e case of A<B.  
15d50 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d  */.  VdbeNoopCom
15d60 6d 65 6e 74 28 28 76 2c 20 22 41 2d 6c 74 2d 42  ment((v, "A-lt-B
15d70 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a   subroutine"));.
15d80 20 20 61 64 64 72 41 6c 74 42 20 3d 20 73 71 6c    addrAltB = sql
15d90 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
15da0 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f  , OP_Gosub, regO
15db0 75 74 41 2c 20 61 64 64 72 4f 75 74 41 29 3b 0a  utA, addrOutA);.
15dc0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15dd0 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c  Op1(v, OP_Yield,
15de0 20 72 65 67 41 64 64 72 41 29 3b 0a 20 20 73 71   regAddrA);.  sq
15df0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
15e00 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 45 6f 66  v, OP_If, regEof
15e10 41 2c 20 61 64 64 72 45 6f 66 41 29 3b 0a 20 20  A, addrEofA);.  
15e20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15e30 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
15e40 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 0a 20 20   labelCmpr);..  
15e50 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
15e60 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 63   to handle the c
15e70 61 73 65 20 6f 66 20 41 3d 3d 42 0a 20 20 2a 2f  ase of A==B.  */
15e80 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c  .  if( op==TK_AL
15e90 4c 20 29 7b 0a 20 20 20 20 61 64 64 72 41 65 71  L ){.    addrAeq
15ea0 42 20 3d 20 61 64 64 72 41 6c 74 42 3b 0a 20 20  B = addrAltB;.  
15eb0 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b  }else if( op==TK
15ec0 5f 49 4e 54 45 52 53 45 43 54 20 29 7b 0a 20 20  _INTERSECT ){.  
15ed0 20 20 61 64 64 72 41 65 71 42 20 3d 20 61 64 64    addrAeqB = add
15ee0 72 41 6c 74 42 3b 0a 20 20 20 20 61 64 64 72 41  rAltB;.    addrA
15ef0 6c 74 42 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ltB++;.  }else{.
15f00 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d      VdbeNoopComm
15f10 65 6e 74 28 28 76 2c 20 22 41 2d 65 71 2d 42 20  ent((v, "A-eq-B 
15f20 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20  subroutine"));. 
15f30 20 20 20 61 64 64 72 41 65 71 42 20 3d 0a 20 20     addrAeqB =.  
15f40 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15f50 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c  Op1(v, OP_Yield,
15f60 20 72 65 67 41 64 64 72 41 29 3b 0a 20 20 20 20   regAddrA);.    
15f70 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15f80 32 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 45  2(v, OP_If, regE
15f90 6f 66 41 2c 20 61 64 64 72 45 6f 66 41 29 3b 0a  ofA, addrEofA);.
15fa0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
15fb0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
15fc0 2c 20 30 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b  , 0, labelCmpr);
15fd0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  .  }..  /* Gener
15fe0 61 74 65 20 63 6f 64 65 20 74 6f 20 68 61 6e 64  ate code to hand
15ff0 6c 65 20 74 68 65 20 63 61 73 65 20 6f 66 20 41  le the case of A
16000 3e 42 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f  >B.  */.  VdbeNo
16010 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 41  opComment((v, "A
16020 2d 67 74 2d 42 20 73 75 62 72 6f 75 74 69 6e 65  -gt-B subroutine
16030 22 29 29 3b 0a 20 20 61 64 64 72 41 67 74 42 20  "));.  addrAgtB 
16040 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
16050 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 69  rentAddr(v);.  i
16060 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c  f( op==TK_ALL ||
16070 20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b   op==TK_UNION ){
16080 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
16090 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
160a0 75 62 2c 20 72 65 67 4f 75 74 42 2c 20 61 64 64  ub, regOutB, add
160b0 72 4f 75 74 42 29 3b 0a 20 20 7d 0a 20 20 73 71  rOutB);.  }.  sq
160c0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
160d0 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67  v, OP_Yield, reg
160e0 41 64 64 72 42 29 3b 0a 20 20 73 71 6c 69 74 65  AddrB);.  sqlite
160f0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
16100 50 5f 49 66 2c 20 72 65 67 45 6f 66 42 2c 20 61  P_If, regEofB, a
16110 64 64 72 45 6f 66 42 29 3b 0a 20 20 73 71 6c 69  ddrEofB);.  sqli
16120 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
16130 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c 61 62   OP_Goto, 0, lab
16140 65 6c 43 6d 70 72 29 3b 0a 0a 20 20 2f 2a 20 54  elCmpr);..  /* T
16150 68 69 73 20 63 6f 64 65 20 72 75 6e 73 20 6f 6e  his code runs on
16160 63 65 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65  ce to initialize
16170 20 65 76 65 72 79 74 68 69 6e 67 2e 0a 20 20 2a   everything..  *
16180 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a  /.  sqlite3VdbeJ
16190 75 6d 70 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a  umpHere(v, j1);.
161a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
161b0 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
161c0 72 2c 20 30 2c 20 72 65 67 45 6f 66 41 29 3b 0a  r, 0, regEofA);.
161d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
161e0 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
161f0 72 2c 20 30 2c 20 72 65 67 45 6f 66 42 29 3b 0a  r, 0, regEofB);.
16200 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
16210 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
16220 20 72 65 67 41 64 64 72 41 2c 20 61 64 64 72 53   regAddrA, addrS
16230 65 6c 65 63 74 41 29 3b 0a 20 20 73 71 6c 69 74  electA);.  sqlit
16240 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
16250 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 41 64 64  OP_Gosub, regAdd
16260 72 42 2c 20 61 64 64 72 53 65 6c 65 63 74 42 29  rB, addrSelectB)
16270 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
16280 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20  ddOp2(v, OP_If, 
16290 72 65 67 45 6f 66 41 2c 20 61 64 64 72 45 6f 66  regEofA, addrEof
162a0 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  A);.  sqlite3Vdb
162b0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66  eAddOp2(v, OP_If
162c0 2c 20 72 65 67 45 6f 66 42 2c 20 61 64 64 72 45  , regEofB, addrE
162d0 6f 66 42 29 3b 0a 0a 20 20 2f 2a 20 49 6d 70 6c  ofB);..  /* Impl
162e0 65 6d 65 6e 74 20 74 68 65 20 6d 61 69 6e 20 6d  ement the main m
162f0 65 72 67 65 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20  erge loop.  */. 
16300 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
16310 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 61 62 65  lveLabel(v, labe
16320 6c 43 6d 70 72 29 3b 0a 20 20 73 71 6c 69 74 65  lCmpr);.  sqlite
16330 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
16340 50 5f 50 65 72 6d 75 74 61 74 69 6f 6e 2c 20 30  P_Permutation, 0
16350 2c 20 30 2c 20 30 2c 20 28 63 68 61 72 2a 29 61  , 0, 0, (char*)a
16360 50 65 72 6d 75 74 65 2c 20 50 34 5f 49 4e 54 41  Permute, P4_INTA
16370 52 52 41 59 29 3b 0a 20 20 73 71 6c 69 74 65 33  RRAY);.  sqlite3
16380 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
16390 5f 43 6f 6d 70 61 72 65 2c 20 64 65 73 74 41 2e  _Compare, destA.
163a0 69 53 64 73 74 2c 20 64 65 73 74 42 2e 69 53 64  iSdst, destB.iSd
163b0 73 74 2c 20 6e 4f 72 64 65 72 42 79 2c 0a 20 20  st, nOrderBy,.  
163c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
163d0 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b         (char*)pK
163e0 65 79 4d 65 72 67 65 2c 20 50 34 5f 4b 45 59 49  eyMerge, P4_KEYI
163f0 4e 46 4f 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  NFO);.  sqlite3V
16400 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f  dbeChangeP5(v, O
16410 50 46 4c 41 47 5f 50 45 52 4d 55 54 45 29 3b 0a  PFLAG_PERMUTE);.
16420 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
16430 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20  Op3(v, OP_Jump, 
16440 61 64 64 72 41 6c 74 42 2c 20 61 64 64 72 41 65  addrAltB, addrAe
16450 71 42 2c 20 61 64 64 72 41 67 74 42 29 3b 0a 0a  qB, addrAgtB);..
16460 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65    /* Jump to the
16470 20 74 68 69 73 20 70 6f 69 6e 74 20 69 6e 20 6f   this point in o
16480 72 64 65 72 20 74 6f 20 74 65 72 6d 69 6e 61 74  rder to terminat
16490 65 20 74 68 65 20 71 75 65 72 79 2e 0a 20 20 2a  e the query..  *
164a0 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  /.  sqlite3VdbeR
164b0 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c  esolveLabel(v, l
164c0 61 62 65 6c 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20  abelEnd);..  /* 
164d0 53 65 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  Set the number o
164e0 66 20 6f 75 74 70 75 74 20 63 6f 6c 75 6d 6e 73  f output columns
164f0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 44 65 73  .  */.  if( pDes
16500 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75  t->eDest==SRT_Ou
16510 74 70 75 74 20 29 7b 0a 20 20 20 20 53 65 6c 65  tput ){.    Sele
16520 63 74 20 2a 70 46 69 72 73 74 20 3d 20 70 50 72  ct *pFirst = pPr
16530 69 6f 72 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  ior;.    while( 
16540 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 20 29  pFirst->pPrior )
16550 20 70 46 69 72 73 74 20 3d 20 70 46 69 72 73 74   pFirst = pFirst
16560 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 67 65  ->pPrior;.    ge
16570 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65  nerateColumnName
16580 73 28 70 50 61 72 73 65 2c 20 30 2c 20 70 46 69  s(pParse, 0, pFi
16590 72 73 74 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  rst->pEList);.  
165a0 7d 0a 0a 20 20 2f 2a 20 52 65 61 73 73 65 6d 62  }..  /* Reassemb
165b0 6c 79 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  ly the compound 
165c0 71 75 65 72 79 20 73 6f 20 74 68 61 74 20 69 74  query so that it
165d0 20 77 69 6c 6c 20 62 65 20 66 72 65 65 64 20 63   will be freed c
165e0 6f 72 72 65 63 74 6c 79 0a 20 20 2a 2a 20 62 79  orrectly.  ** by
165f0 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e   the calling fun
16600 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 66 28 20 70  ction */.  if( p
16610 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20  ->pPrior ){.    
16620 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
16630 65 74 65 28 64 62 2c 20 70 2d 3e 70 50 72 69 6f  ete(db, p->pPrio
16640 72 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 50 72  r);.  }.  p->pPr
16650 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 0a 20  ior = pPrior;.. 
16660 20 2f 2a 2a 2a 20 54 42 44 3a 20 20 49 6e 73 65   /*** TBD:  Inse
16670 72 74 20 73 75 62 72 6f 75 74 69 6e 65 20 63 61  rt subroutine ca
16680 6c 6c 73 20 74 6f 20 63 6c 6f 73 65 20 63 75 72  lls to close cur
16690 73 6f 72 73 20 6f 6e 20 69 6e 63 6f 6d 70 6c 65  sors on incomple
166a0 74 65 0a 20 20 2a 2a 2a 2a 20 73 75 62 71 75 65  te.  **** subque
166b0 72 69 65 73 20 2a 2a 2a 2a 2f 0a 20 20 65 78 70  ries ****/.  exp
166c0 6c 61 69 6e 43 6f 6d 70 6f 73 69 74 65 28 70 50  lainComposite(pP
166d0 61 72 73 65 2c 20 70 2d 3e 6f 70 2c 20 69 53 75  arse, p->op, iSu
166e0 62 31 2c 20 69 53 75 62 32 2c 20 30 29 3b 0a 20  b1, iSub2, 0);. 
166f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
16700 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  K;.}.#endif..#if
16710 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
16720 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20  _OMIT_SUBQUERY) 
16730 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
16740 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 2f 2a  TE_OMIT_VIEW)./*
16750 20 46 6f 72 77 61 72 64 20 44 65 63 6c 61 72 61   Forward Declara
16760 74 69 6f 6e 73 20 2a 2f 0a 73 74 61 74 69 63 20  tions */.static 
16770 76 6f 69 64 20 73 75 62 73 74 45 78 70 72 4c 69  void substExprLi
16780 73 74 28 73 71 6c 69 74 65 33 2a 2c 20 45 78 70  st(sqlite3*, Exp
16790 72 4c 69 73 74 2a 2c 20 69 6e 74 2c 20 45 78 70  rList*, int, Exp
167a0 72 4c 69 73 74 2a 29 3b 0a 73 74 61 74 69 63 20  rList*);.static 
167b0 76 6f 69 64 20 73 75 62 73 74 53 65 6c 65 63 74  void substSelect
167c0 28 73 71 6c 69 74 65 33 2a 2c 20 53 65 6c 65 63  (sqlite3*, Selec
167d0 74 20 2a 2c 20 69 6e 74 2c 20 45 78 70 72 4c 69  t *, int, ExprLi
167e0 73 74 20 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 53 63  st *);../*.** Sc
167f0 61 6e 20 74 68 72 6f 75 67 68 20 74 68 65 20 65  an through the e
16800 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e  xpression pExpr.
16810 20 20 52 65 70 6c 61 63 65 20 65 76 65 72 79 20    Replace every 
16820 72 65 66 65 72 65 6e 63 65 20 74 6f 0a 2a 2a 20  reference to.** 
16830 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 61 62 6c  a column in tabl
16840 65 20 6e 75 6d 62 65 72 20 69 54 61 62 6c 65 20  e number iTable 
16850 77 69 74 68 20 61 20 63 6f 70 79 20 6f 66 20 74  with a copy of t
16860 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 0a 2a 2a  he iColumn-th.**
16870 20 65 6e 74 72 79 20 69 6e 20 70 45 4c 69 73 74   entry in pEList
16880 2e 20 20 28 42 75 74 20 6c 65 61 76 65 20 72 65  .  (But leave re
16890 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
168a0 52 4f 57 49 44 20 63 6f 6c 75 6d 6e 20 0a 2a 2a  ROWID column .**
168b0 20 75 6e 63 68 61 6e 67 65 64 2e 29 0a 2a 2a 0a   unchanged.).**.
168c0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
168d0 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 66  is part of the f
168e0 6c 61 74 74 65 6e 69 6e 67 20 70 72 6f 63 65 64  lattening proced
168f0 75 72 65 2e 20 20 41 20 73 75 62 71 75 65 72 79  ure.  A subquery
16900 0a 2a 2a 20 77 68 6f 73 65 20 72 65 73 75 6c 74  .** whose result
16910 20 73 65 74 20 69 73 20 64 65 66 69 6e 65 64 20   set is defined 
16920 62 79 20 70 45 4c 69 73 74 20 61 70 70 65 61 72  by pEList appear
16930 73 20 61 73 20 65 6e 74 72 79 20 69 6e 20 74 68  s as entry in th
16940 65 0a 2a 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65  e.** FROM clause
16950 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73 75 63   of a SELECT suc
16960 68 20 74 68 61 74 20 74 68 65 20 56 44 42 45 20  h that the VDBE 
16970 63 75 72 73 6f 72 20 61 73 73 69 67 6e 65 64 20  cursor assigned 
16980 74 6f 20 74 68 61 74 0a 2a 2a 20 46 4f 52 4d 20  to that.** FORM 
16990 63 6c 61 75 73 65 20 65 6e 74 72 79 20 69 73 20  clause entry is 
169a0 69 54 61 62 6c 65 2e 20 20 54 68 69 73 20 72 6f  iTable.  This ro
169b0 75 74 69 6e 65 20 6d 61 6b 65 20 74 68 65 20 6e  utine make the n
169c0 65 63 65 73 73 61 72 79 20 0a 2a 2a 20 63 68 61  ecessary .** cha
169d0 6e 67 65 73 20 74 6f 20 70 45 78 70 72 20 73 6f  nges to pExpr so
169e0 20 74 68 61 74 20 69 74 20 72 65 66 65 72 73 20   that it refers 
169f0 64 69 72 65 63 74 6c 79 20 74 6f 20 74 68 65 20  directly to the 
16a00 73 6f 75 72 63 65 20 74 61 62 6c 65 0a 2a 2a 20  source table.** 
16a10 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  of the subquery 
16a20 72 61 74 68 65 72 20 74 68 65 20 72 65 73 75 6c  rather the resul
16a30 74 20 73 65 74 20 6f 66 20 74 68 65 20 73 75 62  t set of the sub
16a40 71 75 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  query..*/.static
16a50 20 45 78 70 72 20 2a 73 75 62 73 74 45 78 70 72   Expr *substExpr
16a60 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
16a70 20 20 20 20 20 20 20 20 2f 2a 20 52 65 70 6f 72          /* Repor
16a80 74 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20  t malloc errors 
16a90 74 6f 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69  to this connecti
16aa0 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45  on */.  Expr *pE
16ab0 78 70 72 2c 20 20 20 20 20 20 20 20 2f 2a 20 45  xpr,        /* E
16ac0 78 70 72 20 69 6e 20 77 68 69 63 68 20 73 75 62  xpr in which sub
16ad0 73 74 69 74 75 74 69 6f 6e 20 6f 63 63 75 72 73  stitution occurs
16ae0 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65   */.  int iTable
16af0 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62  ,         /* Tab
16b00 6c 65 20 74 6f 20 62 65 20 73 75 62 73 74 69 74  le to be substit
16b10 75 74 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69  uted */.  ExprLi
16b20 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a  st *pEList    /*
16b30 20 53 75 62 73 74 69 74 75 74 65 20 65 78 70 72   Substitute expr
16b40 65 73 73 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20  essions */.){.  
16b50 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72  if( pExpr==0 ) r
16b60 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70  eturn 0;.  if( p
16b70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  Expr->op==TK_COL
16b80 55 4d 4e 20 26 26 20 70 45 78 70 72 2d 3e 69 54  UMN && pExpr->iT
16b90 61 62 6c 65 3d 3d 69 54 61 62 6c 65 20 29 7b 0a  able==iTable ){.
16ba0 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69      if( pExpr->i
16bb0 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20  Column<0 ){.    
16bc0 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b    pExpr->op = TK
16bd0 5f 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65  _NULL;.    }else
16be0 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e  {.      Expr *pN
16bf0 65 77 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ew;.      assert
16c00 28 20 70 45 4c 69 73 74 21 3d 30 20 26 26 20 70  ( pEList!=0 && p
16c10 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 45  Expr->iColumn<pE
16c20 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20  List->nExpr );. 
16c30 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
16c40 70 72 2d 3e 70 4c 65 66 74 3d 3d 30 20 26 26 20  pr->pLeft==0 && 
16c50 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30  pExpr->pRight==0
16c60 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d   );.      pNew =
16c70 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
16c80 64 62 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 70 45  db, pEList->a[pE
16c90 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 70 45  xpr->iColumn].pE
16ca0 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  xpr, 0);.      s
16cb0 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
16cc0 28 64 62 2c 20 70 45 78 70 72 29 3b 0a 20 20 20  (db, pExpr);.   
16cd0 20 20 20 70 45 78 70 72 20 3d 20 70 4e 65 77 3b     pExpr = pNew;
16ce0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
16cf0 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74      pExpr->pLeft
16d00 20 3d 20 73 75 62 73 74 45 78 70 72 28 64 62 2c   = substExpr(db,
16d10 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 69   pExpr->pLeft, i
16d20 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a  Table, pEList);.
16d30 20 20 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68      pExpr->pRigh
16d40 74 20 3d 20 73 75 62 73 74 45 78 70 72 28 64 62  t = substExpr(db
16d50 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
16d60 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
16d70 3b 0a 20 20 20 20 69 66 28 20 45 78 70 72 48 61  ;.    if( ExprHa
16d80 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
16d90 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
16da0 7b 0a 20 20 20 20 20 20 73 75 62 73 74 53 65 6c  {.      substSel
16db0 65 63 74 28 64 62 2c 20 70 45 78 70 72 2d 3e 78  ect(db, pExpr->x
16dc0 2e 70 53 65 6c 65 63 74 2c 20 69 54 61 62 6c 65  .pSelect, iTable
16dd0 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 7d  , pEList);.    }
16de0 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 75 62 73  else{.      subs
16df0 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70 45  tExprList(db, pE
16e00 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2c 20 69 54  xpr->x.pList, iT
16e10 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20  able, pEList);. 
16e20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
16e30 6e 20 70 45 78 70 72 3b 0a 7d 0a 73 74 61 74 69  n pExpr;.}.stati
16e40 63 20 76 6f 69 64 20 73 75 62 73 74 45 78 70 72  c void substExpr
16e50 4c 69 73 74 28 0a 20 20 73 71 6c 69 74 65 33 20  List(.  sqlite3 
16e60 2a 64 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  *db,         /* 
16e70 52 65 70 6f 72 74 20 6d 61 6c 6c 6f 63 20 65 72  Report malloc er
16e80 72 6f 72 73 20 68 65 72 65 20 2a 2f 0a 20 20 45  rors here */.  E
16e90 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
16ea0 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 73      /* List to s
16eb0 63 61 6e 20 61 6e 64 20 69 6e 20 77 68 69 63 68  can and in which
16ec0 20 74 6f 20 6d 61 6b 65 20 73 75 62 73 74 69 74   to make substit
16ed0 75 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54  utes */.  int iT
16ee0 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 2f  able,          /
16ef0 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20 73 75  * Table to be su
16f00 62 73 74 69 74 75 74 65 64 20 2a 2f 0a 20 20 45  bstituted */.  E
16f10 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20  xprList *pEList 
16f20 20 20 20 20 2f 2a 20 53 75 62 73 74 69 74 75 74      /* Substitut
16f30 65 20 76 61 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20  e values */.){. 
16f40 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c   int i;.  if( pL
16f50 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ist==0 ) return;
16f60 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c  .  for(i=0; i<pL
16f70 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
16f80 7b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 69  {.    pList->a[i
16f90 5d 2e 70 45 78 70 72 20 3d 20 73 75 62 73 74 45  ].pExpr = substE
16fa0 78 70 72 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61  xpr(db, pList->a
16fb0 5b 69 5d 2e 70 45 78 70 72 2c 20 69 54 61 62 6c  [i].pExpr, iTabl
16fc0 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a  e, pEList);.  }.
16fd0 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75  }.static void su
16fe0 62 73 74 53 65 6c 65 63 74 28 0a 20 20 73 71 6c  bstSelect(.  sql
16ff0 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
17000 20 20 2f 2a 20 52 65 70 6f 72 74 20 6d 61 6c 6c    /* Report mall
17010 6f 63 20 65 72 72 6f 72 73 20 68 65 72 65 20 2a  oc errors here *
17020 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
17030 20 20 20 20 20 20 20 20 20 2f 2a 20 53 45 4c 45           /* SELE
17040 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20  CT statement in 
17050 77 68 69 63 68 20 74 6f 20 6d 61 6b 65 20 73 75  which to make su
17060 62 73 74 69 74 75 74 69 6f 6e 73 20 2a 2f 0a 20  bstitutions */. 
17070 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20   int iTable,    
17080 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74        /* Table t
17090 6f 20 62 65 20 72 65 70 6c 61 63 65 64 20 2a 2f  o be replaced */
170a0 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
170b0 69 73 74 20 20 20 20 20 2f 2a 20 53 75 62 73 74  ist     /* Subst
170c0 69 74 75 74 65 20 76 61 6c 75 65 73 20 2a 2f 0a  itute values */.
170d0 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  ){.  SrcList *pS
170e0 72 63 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63  rc;.  struct Src
170f0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
17100 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  ;.  int i;.  if(
17110 20 21 70 20 29 20 72 65 74 75 72 6e 3b 0a 20 20   !p ) return;.  
17120 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 64 62  substExprList(db
17130 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 69 54 61  , p->pEList, iTa
17140 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ble, pEList);.  
17150 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 64 62  substExprList(db
17160 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 69  , p->pGroupBy, i
17170 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a  Table, pEList);.
17180 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28    substExprList(
17190 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c  db, p->pOrderBy,
171a0 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
171b0 3b 0a 20 20 70 2d 3e 70 48 61 76 69 6e 67 20 3d  ;.  p->pHaving =
171c0 20 73 75 62 73 74 45 78 70 72 28 64 62 2c 20 70   substExpr(db, p
171d0 2d 3e 70 48 61 76 69 6e 67 2c 20 69 54 61 62 6c  ->pHaving, iTabl
171e0 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 70 2d  e, pEList);.  p-
171f0 3e 70 57 68 65 72 65 20 3d 20 73 75 62 73 74 45  >pWhere = substE
17200 78 70 72 28 64 62 2c 20 70 2d 3e 70 57 68 65 72  xpr(db, p->pWher
17210 65 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  e, iTable, pELis
17220 74 29 3b 0a 20 20 73 75 62 73 74 53 65 6c 65 63  t);.  substSelec
17230 74 28 64 62 2c 20 70 2d 3e 70 50 72 69 6f 72 2c  t(db, p->pPrior,
17240 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
17250 3b 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53  ;.  pSrc = p->pS
17260 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53  rc;.  assert( pS
17270 72 63 20 29 3b 20 20 2f 2a 20 45 76 65 6e 20 66  rc );  /* Even f
17280 6f 72 20 28 53 45 4c 45 43 54 20 31 29 20 77 65  or (SELECT 1) we
17290 20 68 61 76 65 3a 20 70 53 72 63 21 3d 30 20 62   have: pSrc!=0 b
172a0 75 74 20 70 53 72 63 2d 3e 6e 53 72 63 3d 3d 30  ut pSrc->nSrc==0
172b0 20 2a 2f 0a 20 20 69 66 28 20 41 4c 57 41 59 53   */.  if( ALWAYS
172c0 28 70 53 72 63 29 20 29 7b 0a 20 20 20 20 66 6f  (pSrc) ){.    fo
172d0 72 28 69 3d 70 53 72 63 2d 3e 6e 53 72 63 2c 20  r(i=pSrc->nSrc, 
172e0 70 49 74 65 6d 3d 70 53 72 63 2d 3e 61 3b 20 69  pItem=pSrc->a; i
172f0 3e 30 3b 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b  >0; i--, pItem++
17300 29 7b 0a 20 20 20 20 20 20 73 75 62 73 74 53 65  ){.      substSe
17310 6c 65 63 74 28 64 62 2c 20 70 49 74 65 6d 2d 3e  lect(db, pItem->
17320 70 53 65 6c 65 63 74 2c 20 69 54 61 62 6c 65 2c  pSelect, iTable,
17330 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a   pEList);.    }.
17340 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20    }.}.#endif /* 
17350 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
17360 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c  OMIT_SUBQUERY) |
17370 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
17380 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 2a 2f 0a  E_OMIT_VIEW) */.
17390 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
173a0 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
173b0 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  RY) || !defined(
173c0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
173d0 29 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  )./*.** This rou
173e0 74 69 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f  tine attempts to
173f0 20 66 6c 61 74 74 65 6e 20 73 75 62 71 75 65 72   flatten subquer
17400 69 65 73 20 61 73 20 61 20 70 65 72 66 6f 72 6d  ies as a perform
17410 61 6e 63 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f  ance optimizatio
17420 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  n..** This routi
17430 6e 65 20 72 65 74 75 72 6e 73 20 31 20 69 66 20  ne returns 1 if 
17440 69 74 20 6d 61 6b 65 73 20 63 68 61 6e 67 65 73  it makes changes
17450 20 61 6e 64 20 30 20 69 66 20 6e 6f 20 66 6c 61   and 0 if no fla
17460 74 74 65 6e 69 6e 67 20 6f 63 63 75 72 73 2e 0a  ttening occurs..
17470 2a 2a 0a 2a 2a 20 54 6f 20 75 6e 64 65 72 73 74  **.** To underst
17480 61 6e 64 20 74 68 65 20 63 6f 6e 63 65 70 74 20  and the concept 
17490 6f 66 20 66 6c 61 74 74 65 6e 69 6e 67 2c 20 63  of flattening, c
174a0 6f 6e 73 69 64 65 72 20 74 68 65 20 66 6f 6c 6c  onsider the foll
174b0 6f 77 69 6e 67 0a 2a 2a 20 71 75 65 72 79 3a 0a  owing.** query:.
174c0 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  **.**     SELECT
174d0 20 61 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20   a FROM (SELECT 
174e0 78 2b 79 20 41 53 20 61 20 46 52 4f 4d 20 74 31  x+y AS a FROM t1
174f0 20 57 48 45 52 45 20 7a 3c 31 30 30 29 20 57 48   WHERE z<100) WH
17500 45 52 45 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68  ERE a>5.**.** Th
17510 65 20 64 65 66 61 75 6c 74 20 77 61 79 20 6f 66  e default way of
17520 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68   implementing th
17530 69 73 20 71 75 65 72 79 20 69 73 20 74 6f 20 65  is query is to e
17540 78 65 63 75 74 65 20 74 68 65 0a 2a 2a 20 73 75  xecute the.** su
17550 62 71 75 65 72 79 20 66 69 72 73 74 20 61 6e 64  bquery first and
17560 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   store the resul
17570 74 73 20 69 6e 20 61 20 74 65 6d 70 6f 72 61 72  ts in a temporar
17580 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 0a 2a 2a  y table, then.**
17590 20 72 75 6e 20 74 68 65 20 6f 75 74 65 72 20 71   run the outer q
175a0 75 65 72 79 20 6f 6e 20 74 68 61 74 20 74 65 6d  uery on that tem
175b0 70 6f 72 61 72 79 20 74 61 62 6c 65 2e 20 20 54  porary table.  T
175c0 68 69 73 20 72 65 71 75 69 72 65 73 20 74 77 6f  his requires two
175d0 0a 2a 2a 20 70 61 73 73 65 73 20 6f 76 65 72 20  .** passes over 
175e0 74 68 65 20 64 61 74 61 2e 20 20 46 75 72 74 68  the data.  Furth
175f0 65 72 6d 6f 72 65 2c 20 62 65 63 61 75 73 65 20  ermore, because 
17600 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  the temporary ta
17610 62 6c 65 0a 2a 2a 20 68 61 73 20 6e 6f 20 69 6e  ble.** has no in
17620 64 69 63 65 73 2c 20 74 68 65 20 57 48 45 52 45  dices, the WHERE
17630 20 63 6c 61 75 73 65 20 6f 6e 20 74 68 65 20 6f   clause on the o
17640 75 74 65 72 20 71 75 65 72 79 20 63 61 6e 6e 6f  uter query canno
17650 74 20 62 65 0a 2a 2a 20 6f 70 74 69 6d 69 7a 65  t be.** optimize
17660 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  d..**.** This ro
17670 75 74 69 6e 65 20 61 74 74 65 6d 70 74 73 20 74  utine attempts t
17680 6f 20 72 65 77 72 69 74 65 20 71 75 65 72 69 65  o rewrite querie
17690 73 20 73 75 63 68 20 61 73 20 74 68 65 20 61 62  s such as the ab
176a0 6f 76 65 20 69 6e 74 6f 0a 2a 2a 20 61 20 73 69  ove into.** a si
176b0 6e 67 6c 65 20 66 6c 61 74 20 73 65 6c 65 63 74  ngle flat select
176c0 2c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a  , like this:.**.
176d0 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 78 2b  **     SELECT x+
176e0 79 20 41 53 20 61 20 46 52 4f 4d 20 74 31 20 57  y AS a FROM t1 W
176f0 48 45 52 45 20 7a 3c 31 30 30 20 41 4e 44 20 61  HERE z<100 AND a
17700 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64  >5.**.** The cod
17710 65 20 67 65 6e 65 72 61 74 65 64 20 66 6f 72 20  e generated for 
17720 74 68 69 73 20 73 69 6d 70 69 66 69 63 61 74 69  this simpificati
17730 6f 6e 20 67 69 76 65 73 20 74 68 65 20 73 61 6d  on gives the sam
17740 65 20 72 65 73 75 6c 74 0a 2a 2a 20 62 75 74 20  e result.** but 
17750 6f 6e 6c 79 20 68 61 73 20 74 6f 20 73 63 61 6e  only has to scan
17760 20 74 68 65 20 64 61 74 61 20 6f 6e 63 65 2e 20   the data once. 
17770 20 41 6e 64 20 62 65 63 61 75 73 65 20 69 6e 64   And because ind
17780 69 63 65 73 20 6d 69 67 68 74 20 0a 2a 2a 20 65  ices might .** e
17790 78 69 73 74 20 6f 6e 20 74 68 65 20 74 61 62 6c  xist on the tabl
177a0 65 20 74 31 2c 20 61 20 63 6f 6d 70 6c 65 74 65  e t1, a complete
177b0 20 73 63 61 6e 20 6f 66 20 74 68 65 20 64 61 74   scan of the dat
177c0 61 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61 76  a might be.** av
177d0 6f 69 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6c 61  oided..**.** Fla
177e0 74 74 65 6e 69 6e 67 20 69 73 20 6f 6e 6c 79 20  ttening is only 
177f0 61 74 74 65 6d 70 74 65 64 20 69 66 20 61 6c 6c  attempted if all
17800 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
17810 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a  g are true:.**.*
17820 2a 20 20 20 28 31 29 20 20 54 68 65 20 73 75 62  *   (1)  The sub
17830 71 75 65 72 79 20 61 6e 64 20 74 68 65 20 6f 75  query and the ou
17840 74 65 72 20 71 75 65 72 79 20 64 6f 20 6e 6f 74  ter query do not
17850 20 62 6f 74 68 20 75 73 65 20 61 67 67 72 65 67   both use aggreg
17860 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 32  ates..**.**   (2
17870 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
17880 69 73 20 6e 6f 74 20 61 6e 20 61 67 67 72 65 67  is not an aggreg
17890 61 74 65 20 6f 72 20 74 68 65 20 6f 75 74 65 72  ate or the outer
178a0 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20   query is not a 
178b0 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 33  join..**.**   (3
178c0 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
178d0 69 73 20 6e 6f 74 20 74 68 65 20 72 69 67 68 74  is not the right
178e0 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 6c 65   operand of a le
178f0 66 74 20 6f 75 74 65 72 20 6a 6f 69 6e 0a 2a 2a  ft outer join.**
17900 20 20 20 20 20 20 20 20 28 4f 72 69 67 69 6e 61          (Origina
17910 6c 6c 79 20 74 69 63 6b 65 74 20 23 33 30 36 2e  lly ticket #306.
17920 20 20 53 74 72 65 6e 67 74 68 65 6e 65 64 20 62    Strengthened b
17930 79 20 74 69 63 6b 65 74 20 23 33 33 30 30 29 0a  y ticket #3300).
17940 2a 2a 0a 2a 2a 20 20 20 28 34 29 20 20 54 68 65  **.**   (4)  The
17950 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74   subquery is not
17960 20 44 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a   DISTINCT..**.**
17970 20 20 28 2a 2a 29 20 20 41 74 20 6f 6e 65 20 70    (**)  At one p
17980 6f 69 6e 74 20 72 65 73 74 72 69 63 74 69 6f 6e  oint restriction
17990 73 20 28 34 29 20 61 6e 64 20 28 35 29 20 64 65  s (4) and (5) de
179a0 66 69 6e 65 64 20 61 20 73 75 62 73 65 74 20 6f  fined a subset o
179b0 66 20 44 49 53 54 49 4e 43 54 0a 2a 2a 20 20 20  f DISTINCT.**   
179c0 20 20 20 20 20 73 75 62 2d 71 75 65 72 69 65 73       sub-queries
179d0 20 74 68 61 74 20 77 65 72 65 20 65 78 63 6c 75   that were exclu
179e0 64 65 64 20 66 72 6f 6d 20 74 68 69 73 20 6f 70  ded from this op
179f0 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 52 65 73 74  timization. Rest
17a00 72 69 63 74 69 6f 6e 20 0a 2a 2a 20 20 20 20 20  riction .**     
17a10 20 20 20 28 34 29 20 68 61 73 20 73 69 6e 63 65     (4) has since
17a20 20 62 65 65 6e 20 65 78 70 61 6e 64 65 64 20 74   been expanded t
17a30 6f 20 65 78 63 6c 75 64 65 20 61 6c 6c 20 44 49  o exclude all DI
17a40 53 54 49 4e 43 54 20 73 75 62 71 75 65 72 69 65  STINCT subquerie
17a50 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 36 29 20 20  s..**.**   (6)  
17a60 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65  The subquery doe
17a70 73 20 6e 6f 74 20 75 73 65 20 61 67 67 72 65 67  s not use aggreg
17a80 61 74 65 73 20 6f 72 20 74 68 65 20 6f 75 74 65  ates or the oute
17a90 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 0a 2a  r query is not.*
17aa0 2a 20 20 20 20 20 20 20 20 44 49 53 54 49 4e 43  *        DISTINC
17ab0 54 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 37 29 20 20  T..**.**   (7)  
17ac0 54 68 65 20 73 75 62 71 75 65 72 79 20 68 61 73  The subquery has
17ad0 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20   a FROM clause. 
17ae0 20 54 4f 44 4f 3a 20 20 46 6f 72 20 73 75 62 71   TODO:  For subq
17af0 75 65 72 69 65 73 20 77 69 74 68 6f 75 74 0a 2a  ueries without.*
17b00 2a 20 20 20 20 20 20 20 20 41 20 46 52 4f 4d 20  *        A FROM 
17b10 63 6c 61 75 73 65 2c 20 63 6f 6e 73 69 64 65 72  clause, consider
17b20 20 61 64 64 69 6e 67 20 61 20 46 52 4f 4d 20 63   adding a FROM c
17b30 6c 6f 73 65 20 77 69 74 68 20 74 68 65 20 73 70  lose with the sp
17b40 65 63 69 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20  ecial.**        
17b50 74 61 62 6c 65 20 73 71 6c 69 74 65 5f 6f 6e 63  table sqlite_onc
17b60 65 20 74 68 61 74 20 63 6f 6e 73 69 73 74 73 20  e that consists 
17b70 6f 66 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20  of a single row 
17b80 63 6f 6e 74 61 69 6e 69 6e 67 20 61 0a 2a 2a 20  containing a.** 
17b90 20 20 20 20 20 20 20 73 69 6e 67 6c 65 20 4e 55         single NU
17ba0 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 38 29 20  LL..**.**   (8) 
17bb0 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f   The subquery do
17bc0 65 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54  es not use LIMIT
17bd0 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75   or the outer qu
17be0 65 72 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69  ery is not a joi
17bf0 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 39 29 20 20  n..**.**   (9)  
17c00 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65  The subquery doe
17c10 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 20  s not use LIMIT 
17c20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  or the outer que
17c30 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 0a  ry does not use.
17c40 2a 2a 20 20 20 20 20 20 20 20 61 67 67 72 65 67  **        aggreg
17c50 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 30  ates..**.**  (10
17c60 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
17c70 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 61 67 67  does not use agg
17c80 72 65 67 61 74 65 73 20 6f 72 20 74 68 65 20 6f  regates or the o
17c90 75 74 65 72 20 71 75 65 72 79 20 64 6f 65 73 20  uter query does 
17ca0 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 75 73  not.**        us
17cb0 65 20 4c 49 4d 49 54 2e 0a 2a 2a 0a 2a 2a 20 20  e LIMIT..**.**  
17cc0 28 31 31 29 20 20 54 68 65 20 73 75 62 71 75 65  (11)  The subque
17cd0 72 79 20 61 6e 64 20 74 68 65 20 6f 75 74 65 72  ry and the outer
17ce0 20 71 75 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f   query do not bo
17cf0 74 68 20 68 61 76 65 20 4f 52 44 45 52 20 42 59  th have ORDER BY
17d00 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20   clauses..**.** 
17d10 20 28 2a 2a 29 20 20 4e 6f 74 20 69 6d 70 6c 65   (**)  Not imple
17d20 6d 65 6e 74 65 64 2e 20 20 53 75 62 73 75 6d 65  mented.  Subsume
17d30 64 20 69 6e 74 6f 20 72 65 73 74 72 69 63 74 69  d into restricti
17d40 6f 6e 20 28 33 29 2e 20 20 57 61 73 20 70 72 65  on (3).  Was pre
17d50 76 69 6f 75 73 6c 79 0a 2a 2a 20 20 20 20 20 20  viously.**      
17d60 20 20 61 20 73 65 70 61 72 61 74 65 20 72 65 73    a separate res
17d70 74 72 69 63 74 69 6f 6e 20 64 65 72 69 76 69 6e  triction derivin
17d80 67 20 66 72 6f 6d 20 74 69 63 6b 65 74 20 23 33  g from ticket #3
17d90 35 30 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 33 29 20  50..**.**  (13) 
17da0 20 54 68 65 20 73 75 62 71 75 65 72 79 20 61 6e   The subquery an
17db0 64 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f  d outer query do
17dc0 20 6e 6f 74 20 62 6f 74 68 20 75 73 65 20 4c 49   not both use LI
17dd0 4d 49 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 34 29  MIT..**.**  (14)
17de0 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64    The subquery d
17df0 6f 65 73 20 6e 6f 74 20 75 73 65 20 4f 46 46 53  oes not use OFFS
17e00 45 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 35 29 20  ET..**.**  (15) 
17e10 20 54 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   The outer query
17e20 20 69 73 20 6e 6f 74 20 70 61 72 74 20 6f 66 20   is not part of 
17e30 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63  a compound selec
17e40 74 20 6f 72 20 74 68 65 0a 2a 2a 20 20 20 20 20  t or the.**     
17e50 20 20 20 73 75 62 71 75 65 72 79 20 64 6f 65 73     subquery does
17e60 20 6e 6f 74 20 68 61 76 65 20 61 20 4c 49 4d 49   not have a LIMI
17e70 54 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 20 20 20  T clause..**    
17e80 20 20 20 20 28 53 65 65 20 74 69 63 6b 65 74 20      (See ticket 
17e90 23 32 33 33 39 20 61 6e 64 20 74 69 63 6b 65 74  #2339 and ticket
17ea0 20 5b 30 32 61 38 65 38 31 64 34 34 5d 29 2e 0a   [02a8e81d44])..
17eb0 2a 2a 0a 2a 2a 20 20 28 31 36 29 20 20 54 68 65  **.**  (16)  The
17ec0 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20   outer query is 
17ed0 6e 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74 65  not an aggregate
17ee0 20 6f 72 20 74 68 65 20 73 75 62 71 75 65 72 79   or the subquery
17ef0 20 64 6f 65 73 0a 2a 2a 20 20 20 20 20 20 20 20   does.**        
17f00 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 4f 52 44 45  not contain ORDE
17f10 52 20 42 59 2e 20 20 28 54 69 63 6b 65 74 20 23  R BY.  (Ticket #
17f20 32 39 34 32 29 20 20 54 68 69 73 20 75 73 65 64  2942)  This used
17f30 20 74 6f 20 6e 6f 74 20 6d 61 74 74 65 72 0a 2a   to not matter.*
17f40 2a 20 20 20 20 20 20 20 20 75 6e 74 69 6c 20 77  *        until w
17f50 65 20 69 6e 74 72 6f 64 75 63 65 64 20 74 68 65  e introduced the
17f60 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28 29 20   group_concat() 
17f70 66 75 6e 63 74 69 6f 6e 2e 20 20 0a 2a 2a 0a 2a  function.  .**.*
17f80 2a 20 20 28 31 37 29 20 20 54 68 65 20 73 75 62  *  (17)  The sub
17f90 2d 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20  -query is not a 
17fa0 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c  compound select,
17fb0 20 6f 72 20 69 74 20 69 73 20 61 20 55 4e 49 4f   or it is a UNIO
17fc0 4e 20 41 4c 4c 20 0a 2a 2a 20 20 20 20 20 20 20  N ALL .**       
17fd0 20 63 6f 6d 70 6f 75 6e 64 20 63 6c 61 75 73 65   compound clause
17fe0 20 6d 61 64 65 20 75 70 20 65 6e 74 69 72 65 6c   made up entirel
17ff0 79 20 6f 66 20 6e 6f 6e 2d 61 67 67 72 65 67 61  y of non-aggrega
18000 74 65 20 71 75 65 72 69 65 73 2c 20 61 6e 64 20  te queries, and 
18010 0a 2a 2a 20 20 20 20 20 20 20 20 74 68 65 20 70  .**        the p
18020 61 72 65 6e 74 20 71 75 65 72 79 3a 0a 2a 2a 0a  arent query:.**.
18030 2a 2a 20 20 20 20 20 20 20 20 20 20 2a 20 69 73  **          * is
18040 20 6e 6f 74 20 69 74 73 65 6c 66 20 70 61 72 74   not itself part
18050 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73   of a compound s
18060 65 6c 65 63 74 2c 0a 2a 2a 20 20 20 20 20 20 20  elect,.**       
18070 20 20 20 2a 20 69 73 20 6e 6f 74 20 61 6e 20 61     * is not an a
18080 67 67 72 65 67 61 74 65 20 6f 72 20 44 49 53 54  ggregate or DIST
18090 49 4e 43 54 20 71 75 65 72 79 2c 20 61 6e 64 0a  INCT query, and.
180a0 2a 2a 20 20 20 20 20 20 20 20 20 20 2a 20 69 73  **          * is
180b0 20 6e 6f 74 20 61 20 6a 6f 69 6e 0a 2a 2a 0a 2a   not a join.**.*
180c0 2a 20 20 20 20 20 20 20 20 54 68 65 20 70 61 72  *        The par
180d0 65 6e 74 20 61 6e 64 20 73 75 62 2d 71 75 65 72  ent and sub-quer
180e0 79 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 57 48  y may contain WH
180f0 45 52 45 20 63 6c 61 75 73 65 73 2e 20 53 75 62  ERE clauses. Sub
18100 6a 65 63 74 20 74 6f 0a 2a 2a 20 20 20 20 20 20  ject to.**      
18110 20 20 72 75 6c 65 73 20 28 31 31 29 2c 20 28 31    rules (11), (1
18120 33 29 20 61 6e 64 20 28 31 34 29 2c 20 74 68 65  3) and (14), the
18130 79 20 6d 61 79 20 61 6c 73 6f 20 63 6f 6e 74 61  y may also conta
18140 69 6e 20 4f 52 44 45 52 20 42 59 2c 0a 2a 2a 20  in ORDER BY,.** 
18150 20 20 20 20 20 20 20 4c 49 4d 49 54 20 61 6e 64         LIMIT and
18160 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73 2e   OFFSET clauses.
18170 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 63    The subquery c
18180 61 6e 6e 6f 74 20 75 73 65 20 61 6e 79 20 63 6f  annot use any co
18190 6d 70 6f 75 6e 64 0a 2a 2a 20 20 20 20 20 20 20  mpound.**       
181a0 20 6f 70 65 72 61 74 6f 72 20 6f 74 68 65 72 20   operator other 
181b0 74 68 61 6e 20 55 4e 49 4f 4e 20 41 4c 4c 20 62  than UNION ALL b
181c0 65 63 61 75 73 65 20 61 6c 6c 20 74 68 65 20 6f  ecause all the o
181d0 74 68 65 72 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a  ther compound.**
181e0 20 20 20 20 20 20 20 20 6f 70 65 72 61 74 6f 72          operator
181f0 73 20 68 61 76 65 20 61 6e 20 69 6d 70 6c 69 65  s have an implie
18200 64 20 44 49 53 54 49 4e 43 54 20 77 68 69 63 68  d DISTINCT which
18210 20 69 73 20 64 69 73 61 6c 6c 6f 77 65 64 20 62   is disallowed b
18220 79 0a 2a 2a 20 20 20 20 20 20 20 20 72 65 73 74  y.**        rest
18230 72 69 63 74 69 6f 6e 20 28 34 29 2e 0a 2a 2a 0a  riction (4)..**.
18240 2a 2a 20 20 20 20 20 20 20 20 41 6c 73 6f 2c 20  **        Also, 
18250 65 61 63 68 20 63 6f 6d 70 6f 6e 65 6e 74 20 6f  each component o
18260 66 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20  f the sub-query 
18270 6d 75 73 74 20 72 65 74 75 72 6e 20 74 68 65 20  must return the 
18280 73 61 6d 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 20  same number.**  
18290 20 20 20 20 20 20 6f 66 20 72 65 73 75 6c 74 20        of result 
182a0 63 6f 6c 75 6d 6e 73 2e 20 54 68 69 73 20 69 73  columns. This is
182b0 20 61 63 74 75 61 6c 6c 79 20 61 20 72 65 71 75   actually a requ
182c0 69 72 65 6d 65 6e 74 20 66 6f 72 20 61 6e 79 20  irement for any 
182d0 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20 20 20 20  compound.**     
182e0 20 20 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d     SELECT statem
182f0 65 6e 74 2c 20 62 75 74 20 61 6c 6c 20 74 68 65  ent, but all the
18300 20 63 6f 64 65 20 68 65 72 65 20 64 6f 65 73 20   code here does 
18310 69 73 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  is make sure tha
18320 74 20 6e 6f 0a 2a 2a 20 20 20 20 20 20 20 20 73  t no.**        s
18330 75 63 68 20 28 69 6c 6c 65 67 61 6c 29 20 73 75  uch (illegal) su
18340 62 2d 71 75 65 72 79 20 69 73 20 66 6c 61 74 74  b-query is flatt
18350 65 6e 65 64 2e 20 54 68 65 20 63 61 6c 6c 65 72  ened. The caller
18360 20 77 69 6c 6c 20 64 65 74 65 63 74 20 74 68 65   will detect the
18370 0a 2a 2a 20 20 20 20 20 20 20 20 73 79 6e 74 61  .**        synta
18380 78 20 65 72 72 6f 72 20 61 6e 64 20 72 65 74 75  x error and retu
18390 72 6e 20 61 20 64 65 74 61 69 6c 65 64 20 6d 65  rn a detailed me
183a0 73 73 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 31  ssage..**.**  (1
183b0 38 29 20 20 49 66 20 74 68 65 20 73 75 62 2d 71  8)  If the sub-q
183c0 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75  uery is a compou
183d0 6e 64 20 73 65 6c 65 63 74 2c 20 74 68 65 6e 20  nd select, then 
183e0 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65  all terms of the
183f0 0a 2a 2a 20 20 20 20 20 20 20 20 4f 52 44 45 52  .**        ORDER
18400 20 62 79 20 63 6c 61 75 73 65 20 6f 66 20 74 68   by clause of th
18410 65 20 70 61 72 65 6e 74 20 6d 75 73 74 20 62 65  e parent must be
18420 20 73 69 6d 70 6c 65 20 72 65 66 65 72 65 6e 63   simple referenc
18430 65 73 20 74 6f 20 0a 2a 2a 20 20 20 20 20 20 20  es to .**       
18440 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20   columns of the 
18450 73 75 62 2d 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a  sub-query..**.**
18460 20 20 28 31 39 29 20 20 54 68 65 20 73 75 62 71    (19)  The subq
18470 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73  uery does not us
18480 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65 20 6f  e LIMIT or the o
18490 75 74 65 72 20 71 75 65 72 79 20 64 6f 65 73 20  uter query does 
184a0 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 68 61  not.**        ha
184b0 76 65 20 61 20 57 48 45 52 45 20 63 6c 61 75 73  ve a WHERE claus
184c0 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 30 29 20 20  e..**.**  (20)  
184d0 49 66 20 74 68 65 20 73 75 62 2d 71 75 65 72 79  If the sub-query
184e0 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73   is a compound s
184f0 65 6c 65 63 74 2c 20 74 68 65 6e 20 69 74 20 6d  elect, then it m
18500 75 73 74 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 20  ust not use.**  
18510 20 20 20 20 20 20 61 6e 20 4f 52 44 45 52 20 42        an ORDER B
18520 59 20 63 6c 61 75 73 65 2e 20 20 54 69 63 6b 65  Y clause.  Ticke
18530 74 20 23 33 37 37 33 2e 20 20 57 65 20 63 6f 75  t #3773.  We cou
18540 6c 64 20 72 65 6c 61 78 20 74 68 69 73 20 63 6f  ld relax this co
18550 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 20 20 20 20  nstraint.**     
18560 20 20 20 73 6f 6d 65 77 68 61 74 20 62 79 20 73     somewhat by s
18570 61 79 69 6e 67 20 74 68 61 74 20 74 68 65 20 74  aying that the t
18580 65 72 6d 73 20 6f 66 20 74 68 65 20 4f 52 44 45  erms of the ORDE
18590 52 20 42 59 20 63 6c 61 75 73 65 20 6d 75 73 74  R BY clause must
185a0 0a 2a 2a 20 20 20 20 20 20 20 20 61 70 70 65 61  .**        appea
185b0 72 20 61 73 20 75 6e 6d 6f 64 69 66 69 65 64 20  r as unmodified 
185c0 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 69  result columns i
185d0 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  n the outer quer
185e0 79 2e 20 20 42 75 74 20 77 65 0a 2a 2a 20 20 20  y.  But we.**   
185f0 20 20 20 20 20 68 61 76 65 20 6f 74 68 65 72 20       have other 
18600 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 69 6e  optimizations in
18610 20 6d 69 6e 64 20 74 6f 20 64 65 61 6c 20 77 69   mind to deal wi
18620 74 68 20 74 68 61 74 20 63 61 73 65 2e 0a 2a 2a  th that case..**
18630 0a 2a 2a 20 20 28 32 31 29 20 20 54 68 65 20 73  .**  (21)  The s
18640 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  ubquery does not
18650 20 75 73 65 20 4c 49 4d 49 54 20 6f 72 20 74 68   use LIMIT or th
18660 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73  e outer query is
18670 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 44   not.**        D
18680 49 53 54 49 4e 43 54 2e 20 20 28 53 65 65 20 74  ISTINCT.  (See t
18690 69 63 6b 65 74 20 5b 37 35 32 65 31 36 34 36 66  icket [752e1646f
186a0 63 5d 29 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68  c])..**.** In th
186b0 69 73 20 72 6f 75 74 69 6e 65 2c 20 74 68 65 20  is routine, the 
186c0 22 70 22 20 70 61 72 61 6d 65 74 65 72 20 69 73  "p" parameter is
186d0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
186e0 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 2a  e outer query..*
186f0 2a 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69  * The subquery i
18700 73 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 69 46 72  s p->pSrc->a[iFr
18710 6f 6d 5d 2e 20 20 69 73 41 67 67 20 69 73 20 74  om].  isAgg is t
18720 72 75 65 20 69 66 20 74 68 65 20 6f 75 74 65 72  rue if the outer
18730 20 71 75 65 72 79 0a 2a 2a 20 75 73 65 73 20 61   query.** uses a
18740 67 67 72 65 67 61 74 65 73 20 61 6e 64 20 73 75  ggregates and su
18750 62 71 75 65 72 79 49 73 41 67 67 20 69 73 20 74  bqueryIsAgg is t
18760 72 75 65 20 69 66 20 74 68 65 20 73 75 62 71 75  rue if the subqu
18770 65 72 79 20 75 73 65 73 20 61 67 67 72 65 67 61  ery uses aggrega
18780 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 66 6c  tes..**.** If fl
18790 61 74 74 65 6e 69 6e 67 20 69 73 20 6e 6f 74 20  attening is not 
187a0 61 74 74 65 6d 70 74 65 64 2c 20 74 68 69 73 20  attempted, this 
187b0 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
187c0 6f 70 20 61 6e 64 20 72 65 74 75 72 6e 73 20 30  op and returns 0
187d0 2e 0a 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e 69  ..** If flatteni
187e0 6e 67 20 69 73 20 61 74 74 65 6d 70 74 65 64 20  ng is attempted 
187f0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
18800 75 72 6e 73 20 31 2e 0a 2a 2a 0a 2a 2a 20 41 6c  urns 1..**.** Al
18810 6c 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  l of the express
18820 69 6f 6e 20 61 6e 61 6c 79 73 69 73 20 6d 75 73  ion analysis mus
18830 74 20 6f 63 63 75 72 20 6f 6e 20 62 6f 74 68 20  t occur on both 
18840 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
18850 61 6e 64 0a 2a 2a 20 74 68 65 20 73 75 62 71 75  and.** the subqu
18860 65 72 79 20 62 65 66 6f 72 65 20 74 68 69 73 20  ery before this 
18870 72 6f 75 74 69 6e 65 20 72 75 6e 73 2e 0a 2a 2f  routine runs..*/
18880 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c 61 74  .static int flat
18890 74 65 6e 53 75 62 71 75 65 72 79 28 0a 20 20 50  tenSubquery(.  P
188a0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
188b0 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
188c0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
188d0 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
188e0 20 2f 2a 20 54 68 65 20 70 61 72 65 6e 74 20 6f   /* The parent o
188f0 72 20 6f 75 74 65 72 20 53 45 4c 45 43 54 20 73  r outer SELECT s
18900 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e  tatement */.  in
18910 74 20 69 46 72 6f 6d 2c 20 20 20 20 20 20 20 20  t iFrom,        
18920 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70     /* Index in p
18930 2d 3e 70 53 72 63 2d 3e 61 5b 5d 20 6f 66 20 74  ->pSrc->a[] of t
18940 68 65 20 69 6e 6e 65 72 20 73 75 62 71 75 65 72  he inner subquer
18950 79 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41 67 67  y */.  int isAgg
18960 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ,           /* T
18970 72 75 65 20 69 66 20 6f 75 74 65 72 20 53 45 4c  rue if outer SEL
18980 45 43 54 20 75 73 65 73 20 61 67 67 72 65 67 61  ECT uses aggrega
18990 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a  te functions */.
189a0 20 20 69 6e 74 20 73 75 62 71 75 65 72 79 49 73    int subqueryIs
189b0 41 67 67 20 20 20 20 2f 2a 20 54 72 75 65 20 69  Agg    /* True i
189c0 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 75  f the subquery u
189d0 73 65 73 20 61 67 67 72 65 67 61 74 65 20 66 75  ses aggregate fu
189e0 6e 63 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20  nctions */.){.  
189f0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 61 76  const char *zSav
18a00 65 64 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20  edAuthContext = 
18a10 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e  pParse->zAuthCon
18a20 74 65 78 74 3b 0a 20 20 53 65 6c 65 63 74 20 2a  text;.  Select *
18a30 70 50 61 72 65 6e 74 3b 0a 20 20 53 65 6c 65 63  pParent;.  Selec
18a40 74 20 2a 70 53 75 62 3b 20 20 20 20 20 20 20 2f  t *pSub;       /
18a50 2a 20 54 68 65 20 69 6e 6e 65 72 20 71 75 65 72  * The inner quer
18a60 79 20 6f 72 20 22 73 75 62 71 75 65 72 79 22 20  y or "subquery" 
18a70 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75  */.  Select *pSu
18a80 62 31 3b 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e  b1;      /* Poin
18a90 74 65 72 20 74 6f 20 74 68 65 20 72 69 67 68 74  ter to the right
18aa0 6d 6f 73 74 20 73 65 6c 65 63 74 20 69 6e 20 73  most select in s
18ab0 75 62 2d 71 75 65 72 79 20 2a 2f 0a 20 20 53 72  ub-query */.  Sr
18ac0 63 4c 69 73 74 20 2a 70 53 72 63 3b 20 20 20 20  cList *pSrc;    
18ad0 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c    /* The FROM cl
18ae0 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65  ause of the oute
18af0 72 20 71 75 65 72 79 20 2a 2f 0a 20 20 53 72 63  r query */.  Src
18b00 4c 69 73 74 20 2a 70 53 75 62 53 72 63 3b 20 20  List *pSubSrc;  
18b10 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61   /* The FROM cla
18b20 75 73 65 20 6f 66 20 74 68 65 20 73 75 62 71 75  use of the subqu
18b30 65 72 79 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ery */.  ExprLis
18b40 74 20 2a 70 4c 69 73 74 3b 20 20 20 20 2f 2a 20  t *pList;    /* 
18b50 54 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f  The result set o
18b60 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  f the outer quer
18b70 79 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 65  y */.  int iPare
18b80 6e 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 56 44  nt;        /* VD
18b90 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  BE cursor number
18ba0 20 6f 66 20 74 68 65 20 70 53 75 62 20 72 65 73   of the pSub res
18bb0 75 6c 74 20 73 65 74 20 74 65 6d 70 20 74 61 62  ult set temp tab
18bc0 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  le */.  int i;  
18bd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
18be0 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
18bf0 20 45 78 70 72 20 2a 70 57 68 65 72 65 3b 20 20   Expr *pWhere;  
18c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18c10 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63    /* The WHERE c
18c20 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63  lause */.  struc
18c30 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
18c40 70 53 75 62 69 74 65 6d 3b 20 20 20 2f 2a 20 54  pSubitem;   /* T
18c50 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20  he subquery */. 
18c60 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
18c70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a  Parse->db;..  /*
18c80 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
18c90 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 70   flattening is p
18ca0 65 72 6d 69 74 74 65 64 2e 20 20 52 65 74 75 72  ermitted.  Retur
18cb0 6e 20 30 20 69 66 20 6e 6f 74 2e 0a 20 20 2a 2f  n 0 if not..  */
18cc0 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20  .  assert( p!=0 
18cd0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
18ce0 70 50 72 69 6f 72 3d 3d 30 20 29 3b 20 20 2f 2a  pPrior==0 );  /*
18cf0 20 55 6e 61 62 6c 65 20 74 6f 20 66 6c 61 74 74   Unable to flatt
18d00 65 6e 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72  en compound quer
18d10 69 65 73 20 2a 2f 0a 20 20 69 66 28 20 4f 70 74  ies */.  if( Opt
18d20 69 6d 69 7a 61 74 69 6f 6e 44 69 73 61 62 6c 65  imizationDisable
18d30 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 51 75 65  d(db, SQLITE_Que
18d40 72 79 46 6c 61 74 74 65 6e 65 72 29 20 29 20 72  ryFlattener) ) r
18d50 65 74 75 72 6e 20 30 3b 0a 20 20 70 53 72 63 20  eturn 0;.  pSrc 
18d60 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73  = p->pSrc;.  ass
18d70 65 72 74 28 20 70 53 72 63 20 26 26 20 69 46 72  ert( pSrc && iFr
18d80 6f 6d 3e 3d 30 20 26 26 20 69 46 72 6f 6d 3c 70  om>=0 && iFrom<p
18d90 53 72 63 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 70  Src->nSrc );.  p
18da0 53 75 62 69 74 65 6d 20 3d 20 26 70 53 72 63 2d  Subitem = &pSrc-
18db0 3e 61 5b 69 46 72 6f 6d 5d 3b 0a 20 20 69 50 61  >a[iFrom];.  iPa
18dc0 72 65 6e 74 20 3d 20 70 53 75 62 69 74 65 6d 2d  rent = pSubitem-
18dd0 3e 69 43 75 72 73 6f 72 3b 0a 20 20 70 53 75 62  >iCursor;.  pSub
18de0 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70 53 65   = pSubitem->pSe
18df0 6c 65 63 74 3b 0a 20 20 61 73 73 65 72 74 28 20  lect;.  assert( 
18e00 70 53 75 62 21 3d 30 20 29 3b 0a 20 20 69 66 28  pSub!=0 );.  if(
18e10 20 69 73 41 67 67 20 26 26 20 73 75 62 71 75 65   isAgg && subque
18e20 72 79 49 73 41 67 67 20 29 20 72 65 74 75 72 6e  ryIsAgg ) return
18e30 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
18e40 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
18e50 6f 6e 20 28 31 29 20 20 2a 2f 0a 20 20 69 66 28  on (1)  */.  if(
18e60 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20 26   subqueryIsAgg &
18e70 26 20 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20 29  & pSrc->nSrc>1 )
18e80 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
18e90 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
18ea0 6f 6e 20 28 32 29 20 20 2a 2f 0a 20 20 70 53 75  on (2)  */.  pSu
18eb0 62 53 72 63 20 3d 20 70 53 75 62 2d 3e 70 53 72  bSrc = pSub->pSr
18ec0 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 75  c;.  assert( pSu
18ed0 62 53 72 63 20 29 3b 0a 20 20 2f 2a 20 50 72 69  bSrc );.  /* Pri
18ee0 6f 72 20 74 6f 20 76 65 72 73 69 6f 6e 20 33 2e  or to version 3.
18ef0 31 2e 32 2c 20 77 68 65 6e 20 4c 49 4d 49 54 20  1.2, when LIMIT 
18f00 61 6e 64 20 4f 46 46 53 45 54 20 68 61 64 20 74  and OFFSET had t
18f10 6f 20 62 65 20 73 69 6d 70 6c 65 20 63 6f 6e 73  o be simple cons
18f20 74 61 6e 74 73 2c 0a 20 20 2a 2a 20 6e 6f 74 20  tants,.  ** not 
18f30 61 72 62 69 74 72 61 72 79 20 65 78 70 72 65 73  arbitrary expres
18f40 73 73 69 6f 6e 73 2c 20 77 65 20 61 6c 6c 6f 77  ssions, we allow
18f50 65 64 20 73 6f 6d 65 20 63 6f 6d 62 69 6e 69 6e  ed some combinin
18f60 67 20 6f 66 20 4c 49 4d 49 54 20 61 6e 64 20 4f  g of LIMIT and O
18f70 46 46 53 45 54 0a 20 20 2a 2a 20 62 65 63 61 75  FFSET.  ** becau
18f80 73 65 20 74 68 65 79 20 63 6f 75 6c 64 20 62 65  se they could be
18f90 20 63 6f 6d 70 75 74 65 64 20 61 74 20 63 6f 6d   computed at com
18fa0 70 69 6c 65 2d 74 69 6d 65 2e 20 20 42 75 74 20  pile-time.  But 
18fb0 77 68 65 6e 20 4c 49 4d 49 54 20 61 6e 64 20 4f  when LIMIT and O
18fc0 46 46 53 45 54 0a 20 20 2a 2a 20 62 65 63 61 6d  FFSET.  ** becam
18fd0 65 20 61 72 62 69 74 72 61 72 79 20 65 78 70 72  e arbitrary expr
18fe0 65 73 73 69 6f 6e 73 2c 20 77 65 20 77 65 72 65  essions, we were
18ff0 20 66 6f 72 63 65 64 20 74 6f 20 61 64 64 20 72   forced to add r
19000 65 73 74 72 69 63 74 69 6f 6e 73 20 28 31 33 29  estrictions (13)
19010 0a 20 20 2a 2a 20 61 6e 64 20 28 31 34 29 2e 20  .  ** and (14). 
19020 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70  */.  if( pSub->p
19030 4c 69 6d 69 74 20 26 26 20 70 2d 3e 70 4c 69 6d  Limit && p->pLim
19040 69 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  it ) return 0;  
19050 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
19060 65 73 74 72 69 63 74 69 6f 6e 20 28 31 33 29 20  estriction (13) 
19070 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70  */.  if( pSub->p
19080 4f 66 66 73 65 74 20 29 20 72 65 74 75 72 6e 20  Offset ) return 
19090 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
190a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
190b0 65 73 74 72 69 63 74 69 6f 6e 20 28 31 34 29 20  estriction (14) 
190c0 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 52 69 67  */.  if( p->pRig
190d0 68 74 6d 6f 73 74 20 26 26 20 70 53 75 62 2d 3e  htmost && pSub->
190e0 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 72 65  pLimit ){.    re
190f0 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
19100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19120 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
19130 6e 20 28 31 35 29 20 2a 2f 0a 20 20 7d 0a 20 20  n (15) */.  }.  
19140 69 66 28 20 70 53 75 62 53 72 63 2d 3e 6e 53 72  if( pSubSrc->nSr
19150 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  c==0 ) return 0;
19160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19170 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
19180 63 74 69 6f 6e 20 28 37 29 20 20 2a 2f 0a 20 20  ction (7)  */.  
19190 69 66 28 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61  if( pSub->selFla
191a0 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74  gs & SF_Distinct
191b0 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
191c0 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
191d0 63 74 69 6f 6e 20 28 35 29 20 20 2a 2f 0a 20 20  ction (5)  */.  
191e0 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74  if( pSub->pLimit
191f0 20 26 26 20 28 70 53 72 63 2d 3e 6e 53 72 63 3e   && (pSrc->nSrc>
19200 31 20 7c 7c 20 69 73 41 67 67 29 20 29 7b 0a 20  1 || isAgg) ){. 
19210 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20      return 0;   
19220 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
19230 74 69 6f 6e 73 20 28 38 29 28 39 29 20 2a 2f 0a  tions (8)(9) */.
19240 20 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e 73 65    }.  if( (p->se
19250 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74  lFlags & SF_Dist
19260 69 6e 63 74 29 21 3d 30 20 26 26 20 73 75 62 71  inct)!=0 && subq
19270 75 65 72 79 49 73 41 67 67 20 29 7b 0a 20 20 20  ueryIsAgg ){.   
19280 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20    return 0;     
19290 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
192a0 6f 6e 20 28 36 29 20 20 2a 2f 0a 20 20 7d 0a 20  on (6)  */.  }. 
192b0 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79   if( p->pOrderBy
192c0 20 26 26 20 70 53 75 62 2d 3e 70 4f 72 64 65 72   && pSub->pOrder
192d0 42 79 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72  By ){.     retur
192e0 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
192f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
19310 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31  * Restriction (1
19320 31 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20  1) */.  }.  if( 
19330 69 73 41 67 67 20 26 26 20 70 53 75 62 2d 3e 70  isAgg && pSub->p
19340 4f 72 64 65 72 42 79 20 29 20 72 65 74 75 72 6e  OrderBy ) return
19350 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
19360 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
19370 6e 20 28 31 36 29 20 2a 2f 0a 20 20 69 66 28 20  n (16) */.  if( 
19380 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20  pSub->pLimit && 
19390 70 2d 3e 70 57 68 65 72 65 20 29 20 72 65 74 75  p->pWhere ) retu
193a0 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
193b0 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
193c0 6e 20 28 31 39 29 20 2a 2f 0a 20 20 69 66 28 20  n (19) */.  if( 
193d0 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20  pSub->pLimit && 
193e0 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  (p->selFlags & S
193f0 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30 20 29  F_Distinct)!=0 )
19400 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  {.     return 0;
19410 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
19420 72 69 63 74 69 6f 6e 20 28 32 31 29 20 2a 2f 0a  riction (21) */.
19430 20 20 7d 0a 0a 20 20 2f 2a 20 4f 42 53 4f 4c 45    }..  /* OBSOLE
19440 54 45 20 43 4f 4d 4d 45 4e 54 20 31 3a 0a 20 20  TE COMMENT 1:.  
19450 2a 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 33  ** Restriction 3
19460 3a 20 20 49 66 20 74 68 65 20 73 75 62 71 75 65  :  If the subque
19470 72 79 20 69 73 20 61 20 6a 6f 69 6e 2c 20 6d 61  ry is a join, ma
19480 6b 65 20 73 75 72 65 20 74 68 65 20 73 75 62 71  ke sure the subq
19490 75 65 72 79 20 69 73 20 0a 20 20 2a 2a 20 6e 6f  uery is .  ** no
194a0 74 20 75 73 65 64 20 61 73 20 74 68 65 20 72 69  t used as the ri
194b0 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61  ght operand of a
194c0 6e 20 6f 75 74 65 72 20 6a 6f 69 6e 2e 20 20 45  n outer join.  E
194d0 78 61 6d 70 6c 65 73 20 6f 66 20 77 68 79 20 74  xamples of why t
194e0 68 69 73 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20  his.  ** is not 
194f0 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20 20  allowed:.  **.  
19500 2a 2a 20 20 20 20 20 20 20 20 20 74 31 20 4c 45  **         t1 LE
19510 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 28 74  FT OUTER JOIN (t
19520 32 20 4a 4f 49 4e 20 74 33 29 0a 20 20 2a 2a 0a  2 JOIN t3).  **.
19530 20 20 2a 2a 20 49 66 20 77 65 20 66 6c 61 74 74    ** If we flatt
19540 65 6e 20 74 68 65 20 61 62 6f 76 65 2c 20 77 65  en the above, we
19550 20 77 6f 75 6c 64 20 67 65 74 0a 20 20 2a 2a 0a   would get.  **.
19560 20 20 2a 2a 20 20 20 20 20 20 20 20 20 28 74 31    **         (t1
19570 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e   LEFT OUTER JOIN
19580 20 74 32 29 20 4a 4f 49 4e 20 74 33 0a 20 20 2a   t2) JOIN t3.  *
19590 2a 0a 20 20 2a 2a 20 77 68 69 63 68 20 69 73 20  *.  ** which is 
195a0 6e 6f 74 20 61 74 20 61 6c 6c 20 74 68 65 20 73  not at all the s
195b0 61 6d 65 20 74 68 69 6e 67 2e 0a 20 20 2a 2a 0a  ame thing..  **.
195c0 20 20 2a 2a 20 4f 42 53 4f 4c 45 54 45 20 43 4f    ** OBSOLETE CO
195d0 4d 4d 45 4e 54 20 32 3a 0a 20 20 2a 2a 20 52 65  MMENT 2:.  ** Re
195e0 73 74 72 69 63 74 69 6f 6e 20 31 32 3a 20 20 49  striction 12:  I
195f0 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69  f the subquery i
19600 73 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72  s the right oper
19610 61 6e 64 20 6f 66 20 61 20 6c 65 66 74 20 6f 75  and of a left ou
19620 74 65 72 0a 20 20 2a 2a 20 6a 6f 69 6e 2c 20 6d  ter.  ** join, m
19630 61 6b 65 20 73 75 72 65 20 74 68 65 20 73 75 62  ake sure the sub
19640 71 75 65 72 79 20 68 61 73 20 6e 6f 20 57 48 45  query has no WHE
19650 52 45 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 20  RE clause..  ** 
19660 41 6e 20 65 78 61 6d 70 6c 65 73 20 6f 66 20 77  An examples of w
19670 68 79 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61  hy this is not a
19680 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a  llowed:.  **.  *
19690 2a 20 20 20 20 20 20 20 20 20 74 31 20 4c 45 46  *         t1 LEF
196a0 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 28 53 45  T OUTER JOIN (SE
196b0 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 20 57  LECT * FROM t2 W
196c0 48 45 52 45 20 74 32 2e 78 3e 30 29 0a 20 20 2a  HERE t2.x>0).  *
196d0 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20 66 6c 61  *.  ** If we fla
196e0 74 74 65 6e 20 74 68 65 20 61 62 6f 76 65 2c 20  tten the above, 
196f0 77 65 20 77 6f 75 6c 64 20 67 65 74 0a 20 20 2a  we would get.  *
19700 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 28  *.  **         (
19710 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f  t1 LEFT OUTER JO
19720 49 4e 20 74 32 29 20 57 48 45 52 45 20 74 32 2e  IN t2) WHERE t2.
19730 78 3e 30 0a 20 20 2a 2a 0a 20 20 2a 2a 20 42 75  x>0.  **.  ** Bu
19740 74 20 74 68 65 20 74 32 2e 78 3e 30 20 74 65 73  t the t2.x>0 tes
19750 74 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 66 61  t will always fa
19760 69 6c 20 6f 6e 20 61 20 4e 55 4c 4c 20 72 6f 77  il on a NULL row
19770 20 6f 66 20 74 32 2c 20 77 68 69 63 68 0a 20 20   of t2, which.  
19780 2a 2a 20 65 66 66 65 63 74 69 76 65 6c 79 20 63  ** effectively c
19790 6f 6e 76 65 72 74 73 20 74 68 65 20 4f 55 54 45  onverts the OUTE
197a0 52 20 4a 4f 49 4e 20 69 6e 74 6f 20 61 6e 20 49  R JOIN into an I
197b0 4e 4e 45 52 20 4a 4f 49 4e 2e 0a 20 20 2a 2a 0a  NNER JOIN..  **.
197c0 20 20 2a 2a 20 54 48 49 53 20 4f 56 45 52 52 49    ** THIS OVERRI
197d0 44 45 53 20 4f 42 53 4f 4c 45 54 45 20 43 4f 4d  DES OBSOLETE COM
197e0 4d 45 4e 54 53 20 31 20 41 4e 44 20 32 20 41 42  MENTS 1 AND 2 AB
197f0 4f 56 45 3a 0a 20 20 2a 2a 20 54 69 63 6b 65 74  OVE:.  ** Ticket
19800 20 23 33 33 30 30 20 73 68 6f 77 73 20 74 68 61   #3300 shows tha
19810 74 20 66 6c 61 74 74 65 6e 69 6e 67 20 74 68 65  t flattening the
19820 20 72 69 67 68 74 20 74 65 72 6d 20 6f 66 20 61   right term of a
19830 20 4c 45 46 54 20 4a 4f 49 4e 0a 20 20 2a 2a 20   LEFT JOIN.  ** 
19840 69 73 20 66 72 61 75 67 68 74 20 77 69 74 68 20  is fraught with 
19850 64 61 6e 67 65 72 2e 20 20 42 65 73 74 20 74 6f  danger.  Best to
19860 20 61 76 6f 69 64 20 74 68 65 20 77 68 6f 6c 65   avoid the whole
19870 20 74 68 69 6e 67 2e 20 20 49 66 20 74 68 65 0a   thing.  If the.
19880 20 20 2a 2a 20 73 75 62 71 75 65 72 79 20 69 73    ** subquery is
19890 20 74 68 65 20 72 69 67 68 74 20 74 65 72 6d 20   the right term 
198a0 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2c 20  of a LEFT JOIN, 
198b0 74 68 65 6e 20 64 6f 20 6e 6f 74 20 66 6c 61 74  then do not flat
198c0 74 65 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ten..  */.  if( 
198d0 28 70 53 75 62 69 74 65 6d 2d 3e 6a 6f 69 6e 74  (pSubitem->joint
198e0 79 70 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21  ype & JT_OUTER)!
198f0 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
19900 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65   0;.  }..  /* Re
19910 73 74 72 69 63 74 69 6f 6e 20 31 37 3a 20 49 66  striction 17: If
19920 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 69   the sub-query i
19930 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c  s a compound SEL
19940 45 43 54 2c 20 74 68 65 6e 20 69 74 20 6d 75 73  ECT, then it mus
19950 74 0a 20 20 2a 2a 20 75 73 65 20 6f 6e 6c 79 20  t.  ** use only 
19960 74 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70  the UNION ALL op
19970 65 72 61 74 6f 72 2e 20 41 6e 64 20 6e 6f 6e 65  erator. And none
19980 20 6f 66 20 74 68 65 20 73 69 6d 70 6c 65 20 73   of the simple s
19990 65 6c 65 63 74 20 71 75 65 72 69 65 73 0a 20 20  elect queries.  
199a0 2a 2a 20 74 68 61 74 20 6d 61 6b 65 20 75 70 20  ** that make up 
199b0 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c  the compound SEL
199c0 45 43 54 20 61 72 65 20 61 6c 6c 6f 77 65 64 20  ECT are allowed 
199d0 74 6f 20 62 65 20 61 67 67 72 65 67 61 74 65 20  to be aggregate 
199e0 6f 72 20 64 69 73 74 69 6e 63 74 0a 20 20 2a 2a  or distinct.  **
199f0 20 71 75 65 72 69 65 73 2e 0a 20 20 2a 2f 0a 20   queries..  */. 
19a00 20 69 66 28 20 70 53 75 62 2d 3e 70 50 72 69 6f   if( pSub->pPrio
19a10 72 20 29 7b 0a 20 20 20 20 69 66 28 20 70 53 75  r ){.    if( pSu
19a20 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  b->pOrderBy ){. 
19a30 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20       return 0;  
19a40 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 32  /* Restriction 2
19a50 30 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 69  0 */.    }.    i
19a60 66 28 20 69 73 41 67 67 20 7c 7c 20 28 70 2d 3e  f( isAgg || (p->
19a70 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69  selFlags & SF_Di
19a80 73 74 69 6e 63 74 29 21 3d 30 20 7c 7c 20 70 53  stinct)!=0 || pS
19a90 72 63 2d 3e 6e 53 72 63 21 3d 31 20 29 7b 0a 20  rc->nSrc!=1 ){. 
19aa0 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
19ab0 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 70 53 75     }.    for(pSu
19ac0 62 31 3d 70 53 75 62 3b 20 70 53 75 62 31 3b 20  b1=pSub; pSub1; 
19ad0 70 53 75 62 31 3d 70 53 75 62 31 2d 3e 70 50 72  pSub1=pSub1->pPr
19ae0 69 6f 72 29 7b 0a 20 20 20 20 20 20 74 65 73 74  ior){.      test
19af0 63 61 73 65 28 20 28 70 53 75 62 31 2d 3e 73 65  case( (pSub1->se
19b00 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73  lFlags & (SF_Dis
19b10 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61  tinct|SF_Aggrega
19b20 74 65 29 29 3d 3d 53 46 5f 44 69 73 74 69 6e 63  te))==SF_Distinc
19b30 74 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  t );.      testc
19b40 61 73 65 28 20 28 70 53 75 62 31 2d 3e 73 65 6c  ase( (pSub1->sel
19b50 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74  Flags & (SF_Dist
19b60 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74  inct|SF_Aggregat
19b70 65 29 29 3d 3d 53 46 5f 41 67 67 72 65 67 61 74  e))==SF_Aggregat
19b80 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  e );.      asser
19b90 74 28 20 70 53 75 62 2d 3e 70 53 72 63 21 3d 30  t( pSub->pSrc!=0
19ba0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70   );.      if( (p
19bb0 53 75 62 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26  Sub1->selFlags &
19bc0 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46   (SF_Distinct|SF
19bd0 5f 41 67 67 72 65 67 61 74 65 29 29 21 3d 30 0a  _Aggregate))!=0.
19be0 20 20 20 20 20 20 20 7c 7c 20 28 70 53 75 62 31         || (pSub1
19bf0 2d 3e 70 50 72 69 6f 72 20 26 26 20 70 53 75 62  ->pPrior && pSub
19c00 31 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29 20 0a  1->op!=TK_ALL) .
19c10 20 20 20 20 20 20 20 7c 7c 20 70 53 75 62 31 2d         || pSub1-
19c20 3e 70 53 72 63 2d 3e 6e 53 72 63 3c 31 0a 20 20  >pSrc->nSrc<1.  
19c30 20 20 20 20 20 7c 7c 20 70 53 75 62 2d 3e 70 45       || pSub->pE
19c40 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 70 53 75  List->nExpr!=pSu
19c50 62 31 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  b1->pEList->nExp
19c60 72 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  r.      ){.     
19c70 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
19c80 20 20 20 7d 0a 20 20 20 20 20 20 74 65 73 74 63     }.      testc
19c90 61 73 65 28 20 70 53 75 62 31 2d 3e 70 53 72 63  ase( pSub1->pSrc
19ca0 2d 3e 6e 53 72 63 3e 31 20 29 3b 0a 20 20 20 20  ->nSrc>1 );.    
19cb0 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 73 74 72 69  }..    /* Restri
19cc0 63 74 69 6f 6e 20 31 38 2e 20 2a 2f 0a 20 20 20  ction 18. */.   
19cd0 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79   if( p->pOrderBy
19ce0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 69   ){.      int ii
19cf0 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30  ;.      for(ii=0
19d00 3b 20 69 69 3c 70 2d 3e 70 4f 72 64 65 72 42 79  ; ii<p->pOrderBy
19d10 2d 3e 6e 45 78 70 72 3b 20 69 69 2b 2b 29 7b 0a  ->nExpr; ii++){.
19d20 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70          if( p->p
19d30 4f 72 64 65 72 42 79 2d 3e 61 5b 69 69 5d 2e 75  OrderBy->a[ii].u
19d40 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3d 3d  .x.iOrderByCol==
19d50 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
19d60 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
19d70 0a 20 20 2f 2a 2a 2a 2a 2a 20 49 66 20 77 65 20  .  /***** If we 
19d80 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74  reach this point
19d90 2c 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20  , flattening is 
19da0 70 65 72 6d 69 74 74 65 64 2e 20 2a 2a 2a 2a 2a  permitted. *****
19db0 2f 0a 0a 20 20 2f 2a 20 41 75 74 68 6f 72 69 7a  /..  /* Authoriz
19dc0 65 20 74 68 65 20 73 75 62 71 75 65 72 79 20 2a  e the subquery *
19dd0 2f 0a 20 20 70 50 61 72 73 65 2d 3e 7a 41 75 74  /.  pParse->zAut
19de0 68 43 6f 6e 74 65 78 74 20 3d 20 70 53 75 62 69  hContext = pSubi
19df0 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 54 45  tem->zName;.  TE
19e00 53 54 4f 4e 4c 59 28 69 20 3d 29 20 73 71 6c 69  STONLY(i =) sqli
19e10 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
19e20 72 73 65 2c 20 53 51 4c 49 54 45 5f 53 45 4c 45  rse, SQLITE_SELE
19e30 43 54 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  CT, 0, 0, 0);.  
19e40 74 65 73 74 63 61 73 65 28 20 69 3d 3d 53 51 4c  testcase( i==SQL
19e50 49 54 45 5f 44 45 4e 59 20 29 3b 0a 20 20 70 50  ITE_DENY );.  pP
19e60 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65  arse->zAuthConte
19e70 78 74 20 3d 20 7a 53 61 76 65 64 41 75 74 68 43  xt = zSavedAuthC
19e80 6f 6e 74 65 78 74 3b 0a 0a 20 20 2f 2a 20 49 66  ontext;..  /* If
19e90 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 69   the sub-query i
19ea0 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c  s a compound SEL
19eb0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 74  ECT statement, t
19ec0 68 65 6e 20 28 62 79 20 72 65 73 74 72 69 63 74  hen (by restrict
19ed0 69 6f 6e 73 0a 20 20 2a 2a 20 31 37 20 61 6e 64  ions.  ** 17 and
19ee0 20 31 38 20 61 62 6f 76 65 29 20 69 74 20 6d 75   18 above) it mu
19ef0 73 74 20 62 65 20 61 20 55 4e 49 4f 4e 20 41 4c  st be a UNION AL
19f00 4c 20 61 6e 64 20 74 68 65 20 70 61 72 65 6e 74  L and the parent
19f10 20 71 75 65 72 79 20 6d 75 73 74 20 0a 20 20 2a   query must .  *
19f20 2a 20 62 65 20 6f 66 20 74 68 65 20 66 6f 72 6d  * be of the form
19f30 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
19f40 53 45 4c 45 43 54 20 3c 65 78 70 72 2d 6c 69 73  SELECT <expr-lis
19f50 74 3e 20 46 52 4f 4d 20 28 3c 73 75 62 2d 71 75  t> FROM (<sub-qu
19f60 65 72 79 3e 29 20 3c 77 68 65 72 65 2d 63 6c 61  ery>) <where-cla
19f70 75 73 65 3e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  use> .  **.  ** 
19f80 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61 6e 79 20  followed by any 
19f90 4f 52 44 45 52 20 42 59 2c 20 4c 49 4d 49 54 20  ORDER BY, LIMIT 
19fa0 61 6e 64 2f 6f 72 20 4f 46 46 53 45 54 20 63 6c  and/or OFFSET cl
19fb0 61 75 73 65 73 2e 20 54 68 69 73 20 62 6c 6f 63  auses. This bloc
19fc0 6b 0a 20 20 2a 2a 20 63 72 65 61 74 65 73 20 4e  k.  ** creates N
19fd0 2d 31 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65  -1 copies of the
19fe0 20 70 61 72 65 6e 74 20 71 75 65 72 79 20 77 69   parent query wi
19ff0 74 68 6f 75 74 20 61 6e 79 20 4f 52 44 45 52 20  thout any ORDER 
1a000 42 59 2c 20 4c 49 4d 49 54 20 6f 72 20 0a 20 20  BY, LIMIT or .  
1a010 2a 2a 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65  ** OFFSET clause
1a020 73 20 61 6e 64 20 6a 6f 69 6e 73 20 74 68 65 6d  s and joins them
1a030 20 74 6f 20 74 68 65 20 6c 65 66 74 2d 68 61 6e   to the left-han
1a040 64 2d 73 69 64 65 20 6f 66 20 74 68 65 20 6f 72  d-side of the or
1a050 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 75 73 69 6e  iginal.  ** usin
1a060 67 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72  g UNION ALL oper
1a070 61 74 6f 72 73 2e 20 49 6e 20 74 68 69 73 20 63  ators. In this c
1a080 61 73 65 20 4e 20 69 73 20 74 68 65 20 6e 75 6d  ase N is the num
1a090 62 65 72 20 6f 66 20 73 69 6d 70 6c 65 0a 20 20  ber of simple.  
1a0a0 2a 2a 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d  ** select statem
1a0b0 65 6e 74 73 20 69 6e 20 74 68 65 20 63 6f 6d 70  ents in the comp
1a0c0 6f 75 6e 64 20 73 75 62 2d 71 75 65 72 79 2e 0a  ound sub-query..
1a0d0 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 61 6d 70 6c    **.  ** Exampl
1a0e0 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  e:.  **.  **    
1a0f0 20 53 45 4c 45 43 54 20 61 2b 31 20 46 52 4f 4d   SELECT a+1 FROM
1a100 20 28 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 53   (.  **        S
1a110 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 61 62  ELECT x FROM tab
1a120 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 55 4e 49  .  **        UNI
1a130 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20  ON ALL.  **     
1a140 20 20 20 53 45 4c 45 43 54 20 79 20 46 52 4f 4d     SELECT y FROM
1a150 20 74 61 62 0a 20 20 2a 2a 20 20 20 20 20 20 20   tab.  **       
1a160 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20   UNION ALL.  ** 
1a170 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 61 62         SELECT ab
1a180 73 28 7a 2a 32 29 20 46 52 4f 4d 20 74 61 62 32  s(z*2) FROM tab2
1a190 0a 20 20 2a 2a 20 20 20 20 20 29 20 57 48 45 52  .  **     ) WHER
1a1a0 45 20 61 21 3d 35 20 4f 52 44 45 52 20 42 59 20  E a!=5 ORDER BY 
1a1b0 31 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 72 61 6e  1.  **.  ** Tran
1a1c0 73 66 6f 72 6d 65 64 20 69 6e 74 6f 3a 0a 20 20  sformed into:.  
1a1d0 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45  **.  **     SELE
1a1e0 43 54 20 78 2b 31 20 46 52 4f 4d 20 74 61 62 20  CT x+1 FROM tab 
1a1f0 57 48 45 52 45 20 78 2b 31 21 3d 35 0a 20 20 2a  WHERE x+1!=5.  *
1a200 2a 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a  *     UNION ALL.
1a210 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20    **     SELECT 
1a220 79 2b 31 20 46 52 4f 4d 20 74 61 62 20 57 48 45  y+1 FROM tab WHE
1a230 52 45 20 79 2b 31 21 3d 35 0a 20 20 2a 2a 20 20  RE y+1!=5.  **  
1a240 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a     UNION ALL.  *
1a250 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61 62 73  *     SELECT abs
1a260 28 7a 2a 32 29 2b 31 20 46 52 4f 4d 20 74 61 62  (z*2)+1 FROM tab
1a270 32 20 57 48 45 52 45 20 61 62 73 28 7a 2a 32 29  2 WHERE abs(z*2)
1a280 2b 31 21 3d 35 0a 20 20 2a 2a 20 20 20 20 20 4f  +1!=5.  **     O
1a290 52 44 45 52 20 42 59 20 31 0a 20 20 2a 2a 0a 20  RDER BY 1.  **. 
1a2a0 20 2a 2a 20 57 65 20 63 61 6c 6c 20 74 68 69 73   ** We call this
1a2b0 20 74 68 65 20 22 63 6f 6d 70 6f 75 6e 64 2d 73   the "compound-s
1a2c0 75 62 71 75 65 72 79 20 66 6c 61 74 74 65 6e 69  ubquery flatteni
1a2d0 6e 67 22 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ng"..  */.  for(
1a2e0 70 53 75 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f  pSub=pSub->pPrio
1a2f0 72 3b 20 70 53 75 62 3b 20 70 53 75 62 3d 70 53  r; pSub; pSub=pS
1a300 75 62 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20  ub->pPrior){.   
1a310 20 53 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20   Select *pNew;. 
1a320 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72     ExprList *pOr
1a330 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65  derBy = p->pOrde
1a340 72 42 79 3b 0a 20 20 20 20 45 78 70 72 20 2a 70  rBy;.    Expr *p
1a350 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69  Limit = p->pLimi
1a360 74 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 4f 66  t;.    Expr *pOf
1a370 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65  fset = p->pOffse
1a380 74 3b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70  t;.    Select *p
1a390 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f  Prior = p->pPrio
1a3a0 72 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65 72  r;.    p->pOrder
1a3b0 42 79 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70  By = 0;.    p->p
1a3c0 53 72 63 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e  Src = 0;.    p->
1a3d0 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20  pPrior = 0;.    
1a3e0 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  p->pLimit = 0;. 
1a3f0 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20     p->pOffset = 
1a400 30 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71  0;.    pNew = sq
1a410 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64  lite3SelectDup(d
1a420 62 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20 70 2d  b, p, 0);.    p-
1a430 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f 66 66 73  >pOffset = pOffs
1a440 65 74 3b 0a 20 20 20 20 70 2d 3e 70 4c 69 6d 69  et;.    p->pLimi
1a450 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20  t = pLimit;.    
1a460 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f  p->pOrderBy = pO
1a470 72 64 65 72 42 79 3b 0a 20 20 20 20 70 2d 3e 70  rderBy;.    p->p
1a480 53 72 63 20 3d 20 70 53 72 63 3b 0a 20 20 20 20  Src = pSrc;.    
1a490 70 2d 3e 6f 70 20 3d 20 54 4b 5f 41 4c 4c 3b 0a  p->op = TK_ALL;.
1a4a0 20 20 20 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73      p->pRightmos
1a4b0 74 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70  t = 0;.    if( p
1a4c0 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  New==0 ){.      
1a4d0 70 4e 65 77 20 3d 20 70 50 72 69 6f 72 3b 0a 20  pNew = pPrior;. 
1a4e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1a4f0 70 4e 65 77 2d 3e 70 50 72 69 6f 72 20 3d 20 70  pNew->pPrior = p
1a500 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 4e 65  Prior;.      pNe
1a510 77 2d 3e 70 52 69 67 68 74 6d 6f 73 74 20 3d 20  w->pRightmost = 
1a520 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e  0;.    }.    p->
1a530 70 50 72 69 6f 72 20 3d 20 70 4e 65 77 3b 0a 20  pPrior = pNew;. 
1a540 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f     if( db->mallo
1a550 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
1a560 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65   1;.  }..  /* Be
1a570 67 69 6e 20 66 6c 61 74 74 65 6e 69 6e 67 20 74  gin flattening t
1a580 68 65 20 69 46 72 6f 6d 2d 74 68 20 65 6e 74 72  he iFrom-th entr
1a590 79 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  y of the FROM cl
1a5a0 61 75 73 65 20 0a 20 20 2a 2a 20 69 6e 20 74 68  ause .  ** in th
1a5b0 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20  e outer query.. 
1a5c0 20 2a 2f 0a 20 20 70 53 75 62 20 3d 20 70 53 75   */.  pSub = pSu
1a5d0 62 31 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70  b1 = pSubitem->p
1a5e0 53 65 6c 65 63 74 3b 0a 0a 20 20 2f 2a 20 44 65  Select;..  /* De
1a5f0 6c 65 74 65 20 74 68 65 20 74 72 61 6e 73 69 65  lete the transie
1a600 6e 74 20 74 61 62 6c 65 20 73 74 72 75 63 74 75  nt table structu
1a610 72 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  re associated wi
1a620 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 75 62 71  th the.  ** subq
1a630 75 65 72 79 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  uery.  */.  sqli
1a640 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 53  te3DbFree(db, pS
1a650 75 62 69 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73  ubitem->zDatabas
1a660 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  e);.  sqlite3DbF
1a670 72 65 65 28 64 62 2c 20 70 53 75 62 69 74 65 6d  ree(db, pSubitem
1a680 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69  ->zName);.  sqli
1a690 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 53  te3DbFree(db, pS
1a6a0 75 62 69 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b  ubitem->zAlias);
1a6b0 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a 44 61  .  pSubitem->zDa
1a6c0 74 61 62 61 73 65 20 3d 20 30 3b 0a 20 20 70 53  tabase = 0;.  pS
1a6d0 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20  ubitem->zName = 
1a6e0 30 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a  0;.  pSubitem->z
1a6f0 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20 70 53 75  Alias = 0;.  pSu
1a700 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 3d  bitem->pSelect =
1a710 20 30 3b 0a 0a 20 20 2f 2a 20 44 65 66 65 72 20   0;..  /* Defer 
1a720 64 65 6c 65 74 69 6e 67 20 74 68 65 20 54 61 62  deleting the Tab
1a730 6c 65 20 6f 62 6a 65 63 74 20 61 73 73 6f 63 69  le object associ
1a740 61 74 65 64 20 77 69 74 68 20 74 68 65 0a 20 20  ated with the.  
1a750 2a 2a 20 73 75 62 71 75 65 72 79 20 75 6e 74 69  ** subquery unti
1a760 6c 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6f  l code generatio
1a770 6e 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 70 6c 65  n is.  ** comple
1a780 74 65 2c 20 73 69 6e 63 65 20 74 68 65 72 65 20  te, since there 
1a790 6d 61 79 20 73 74 69 6c 6c 20 65 78 69 73 74 20  may still exist 
1a7a0 45 78 70 72 2e 70 54 61 62 20 65 6e 74 72 69 65  Expr.pTab entrie
1a7b0 73 20 74 68 61 74 0a 20 20 2a 2a 20 72 65 66 65  s that.  ** refe
1a7c0 72 20 74 6f 20 74 68 65 20 73 75 62 71 75 65 72  r to the subquer
1a7d0 79 20 65 76 65 6e 20 61 66 74 65 72 20 66 6c 61  y even after fla
1a7e0 74 74 65 6e 69 6e 67 2e 20 20 54 69 63 6b 65 74  ttening.  Ticket
1a7f0 20 23 33 33 34 36 2e 0a 20 20 2a 2a 0a 20 20 2a   #3346..  **.  *
1a800 2a 20 70 53 75 62 69 74 65 6d 2d 3e 70 54 61 62  * pSubitem->pTab
1a810 20 69 73 20 61 6c 77 61 79 73 20 6e 6f 6e 2d 4e   is always non-N
1a820 55 4c 4c 20 62 79 20 74 65 73 74 20 72 65 73 74  ULL by test rest
1a830 72 69 63 74 69 6f 6e 73 20 61 6e 64 20 74 65 73  rictions and tes
1a840 74 73 20 61 62 6f 76 65 2e 0a 20 20 2a 2f 0a 20  ts above..  */. 
1a850 20 69 66 28 20 41 4c 57 41 59 53 28 70 53 75 62   if( ALWAYS(pSub
1a860 69 74 65 6d 2d 3e 70 54 61 62 21 3d 30 29 20 29  item->pTab!=0) )
1a870 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  {.    Table *pTa
1a880 62 54 6f 44 65 6c 20 3d 20 70 53 75 62 69 74 65  bToDel = pSubite
1a890 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 66 28  m->pTab;.    if(
1a8a0 20 70 54 61 62 54 6f 44 65 6c 2d 3e 6e 52 65 66   pTabToDel->nRef
1a8b0 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 50 61 72  ==1 ){.      Par
1a8c0 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20  se *pToplevel = 
1a8d0 73 71 6c 69 74 65 33 50 61 72 73 65 54 6f 70 6c  sqlite3ParseTopl
1a8e0 65 76 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20  evel(pParse);.  
1a8f0 20 20 20 20 70 54 61 62 54 6f 44 65 6c 2d 3e 70      pTabToDel->p
1a900 4e 65 78 74 5a 6f 6d 62 69 65 20 3d 20 70 54 6f  NextZombie = pTo
1a910 70 6c 65 76 65 6c 2d 3e 70 5a 6f 6d 62 69 65 54  plevel->pZombieT
1a920 61 62 3b 0a 20 20 20 20 20 20 70 54 6f 70 6c 65  ab;.      pTople
1a930 76 65 6c 2d 3e 70 5a 6f 6d 62 69 65 54 61 62 20  vel->pZombieTab 
1a940 3d 20 70 54 61 62 54 6f 44 65 6c 3b 0a 20 20 20  = pTabToDel;.   
1a950 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 54   }else{.      pT
1a960 61 62 54 6f 44 65 6c 2d 3e 6e 52 65 66 2d 2d 3b  abToDel->nRef--;
1a970 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 75 62 69  .    }.    pSubi
1a980 74 65 6d 2d 3e 70 54 61 62 20 3d 20 30 3b 0a 20  tem->pTab = 0;. 
1a990 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c   }..  /* The fol
1a9a0 6c 6f 77 69 6e 67 20 6c 6f 6f 70 20 72 75 6e 73  lowing loop runs
1a9b0 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 74   once for each t
1a9c0 65 72 6d 20 69 6e 20 61 20 63 6f 6d 70 6f 75 6e  erm in a compoun
1a9d0 64 2d 73 75 62 71 75 65 72 79 0a 20 20 2a 2a 20  d-subquery.  ** 
1a9e0 66 6c 61 74 74 65 6e 69 6e 67 20 28 61 73 20 64  flattening (as d
1a9f0 65 73 63 72 69 62 65 64 20 61 62 6f 76 65 29 2e  escribed above).
1aa00 20 20 49 66 20 77 65 20 61 72 65 20 64 6f 69 6e    If we are doin
1aa10 67 20 61 20 64 69 66 66 65 72 65 6e 74 20 6b 69  g a different ki
1aa20 6e 64 0a 20 20 2a 2a 20 6f 66 20 66 6c 61 74 74  nd.  ** of flatt
1aa30 65 6e 69 6e 67 20 2d 20 61 20 66 6c 61 74 74 65  ening - a flatte
1aa40 6e 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20  ning other than 
1aa50 61 20 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75  a compound-subqu
1aa60 65 72 79 20 66 6c 61 74 74 65 6e 69 6e 67 20 2d  ery flattening -
1aa70 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68 69 73 20  .  ** then this 
1aa80 6c 6f 6f 70 20 6f 6e 6c 79 20 72 75 6e 73 20 6f  loop only runs o
1aa90 6e 63 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  nce..  **.  ** T
1aaa0 68 69 73 20 6c 6f 6f 70 20 6d 6f 76 65 73 20 61  his loop moves a
1aab0 6c 6c 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 65  ll of the FROM e
1aac0 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 73  lements of the s
1aad0 75 62 71 75 65 72 79 20 69 6e 74 6f 20 74 68 65  ubquery into the
1aae0 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63  .  ** the FROM c
1aaf0 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74  lause of the out
1ab00 65 72 20 71 75 65 72 79 2e 20 20 42 65 66 6f 72  er query.  Befor
1ab10 65 20 64 6f 69 6e 67 20 74 68 69 73 2c 20 72 65  e doing this, re
1ab20 6d 65 6d 62 65 72 0a 20 20 2a 2a 20 74 68 65 20  member.  ** the 
1ab30 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f  cursor number fo
1ab40 72 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 6f  r the original o
1ab50 75 74 65 72 20 71 75 65 72 79 20 46 52 4f 4d 20  uter query FROM 
1ab60 65 6c 65 6d 65 6e 74 20 69 6e 0a 20 20 2a 2a 20  element in.  ** 
1ab70 69 50 61 72 65 6e 74 2e 20 20 54 68 65 20 69 50  iParent.  The iP
1ab80 61 72 65 6e 74 20 63 75 72 73 6f 72 20 77 69 6c  arent cursor wil
1ab90 6c 20 6e 65 76 65 72 20 62 65 20 75 73 65 64 2e  l never be used.
1aba0 20 20 53 75 62 73 65 71 75 65 6e 74 20 63 6f 64    Subsequent cod
1abb0 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 73 63 61 6e  e.  ** will scan
1abc0 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6c 6f 6f   expressions loo
1abd0 6b 69 6e 67 20 66 6f 72 20 69 50 61 72 65 6e 74  king for iParent
1abe0 20 72 65 66 65 72 65 6e 63 65 73 20 61 6e 64 20   references and 
1abf0 72 65 70 6c 61 63 65 0a 20 20 2a 2a 20 74 68 6f  replace.  ** tho
1ac00 73 65 20 72 65 66 65 72 65 6e 63 65 73 20 77 69  se references wi
1ac10 74 68 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74  th expressions t
1ac20 68 61 74 20 72 65 73 6f 6c 76 65 20 74 6f 20 74  hat resolve to t
1ac30 68 65 20 73 75 62 71 75 65 72 79 20 46 52 4f 4d  he subquery FROM
1ac40 0a 20 20 2a 2a 20 65 6c 65 6d 65 6e 74 73 20 77  .  ** elements w
1ac50 65 20 61 72 65 20 6e 6f 77 20 63 6f 70 79 69 6e  e are now copyin
1ac60 67 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  g in..  */.  for
1ac70 28 70 50 61 72 65 6e 74 3d 70 3b 20 70 50 61 72  (pParent=p; pPar
1ac80 65 6e 74 3b 20 70 50 61 72 65 6e 74 3d 70 50 61  ent; pParent=pPa
1ac90 72 65 6e 74 2d 3e 70 50 72 69 6f 72 2c 20 70 53  rent->pPrior, pS
1aca0 75 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72 29  ub=pSub->pPrior)
1acb0 7b 0a 20 20 20 20 69 6e 74 20 6e 53 75 62 53 72  {.    int nSubSr
1acc0 63 3b 0a 20 20 20 20 75 38 20 6a 6f 69 6e 74 79  c;.    u8 jointy
1acd0 70 65 20 3d 20 30 3b 0a 20 20 20 20 70 53 75 62  pe = 0;.    pSub
1ace0 53 72 63 20 3d 20 70 53 75 62 2d 3e 70 53 72 63  Src = pSub->pSrc
1acf0 3b 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c  ;     /* FROM cl
1ad00 61 75 73 65 20 6f 66 20 73 75 62 71 75 65 72 79  ause of subquery
1ad10 20 2a 2f 0a 20 20 20 20 6e 53 75 62 53 72 63 20   */.    nSubSrc 
1ad20 3d 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63 3b  = pSubSrc->nSrc;
1ad30 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74    /* Number of t
1ad40 65 72 6d 73 20 69 6e 20 73 75 62 71 75 65 72 79  erms in subquery
1ad50 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a   FROM clause */.
1ad60 20 20 20 20 70 53 72 63 20 3d 20 70 50 61 72 65      pSrc = pPare
1ad70 6e 74 2d 3e 70 53 72 63 3b 20 20 20 20 20 2f 2a  nt->pSrc;     /*
1ad80 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
1ad90 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
1ada0 2a 2f 0a 0a 20 20 20 20 69 66 28 20 70 53 72 63  */..    if( pSrc
1adb0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
1adc0 28 20 70 50 61 72 65 6e 74 3d 3d 70 20 29 3b 20  ( pParent==p ); 
1add0 20 2f 2a 20 46 69 72 73 74 20 74 69 6d 65 20 74   /* First time t
1ade0 68 72 6f 75 67 68 20 74 68 65 20 6c 6f 6f 70 20  hrough the loop 
1adf0 2a 2f 0a 20 20 20 20 20 20 6a 6f 69 6e 74 79 70  */.      jointyp
1ae00 65 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 6a 6f  e = pSubitem->jo
1ae10 69 6e 74 79 70 65 3b 0a 20 20 20 20 7d 65 6c 73  intype;.    }els
1ae20 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
1ae30 20 70 50 61 72 65 6e 74 21 3d 70 20 29 3b 20 20   pParent!=p );  
1ae40 2f 2a 20 32 6e 64 20 61 6e 64 20 73 75 62 73 65  /* 2nd and subse
1ae50 71 75 65 6e 74 20 74 69 6d 65 73 20 74 68 72 6f  quent times thro
1ae60 75 67 68 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a  ugh the loop */.
1ae70 20 20 20 20 20 20 70 53 72 63 20 3d 20 70 50 61        pSrc = pPa
1ae80 72 65 6e 74 2d 3e 70 53 72 63 20 3d 20 73 71 6c  rent->pSrc = sql
1ae90 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e  ite3SrcListAppen
1aea0 64 28 64 62 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  d(db, 0, 0, 0);.
1aeb0 20 20 20 20 20 20 69 66 28 20 70 53 72 63 3d 3d        if( pSrc==
1aec0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  0 ){.        ass
1aed0 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ert( db->mallocF
1aee0 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20  ailed );.       
1aef0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
1af00 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68      }..    /* Th
1af10 65 20 73 75 62 71 75 65 72 79 20 75 73 65 73 20  e subquery uses 
1af20 61 20 73 69 6e 67 6c 65 20 73 6c 6f 74 20 6f 66  a single slot of
1af30 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
1af40 20 6f 66 20 74 68 65 20 6f 75 74 65 72 0a 20 20   of the outer.  
1af50 20 20 2a 2a 20 71 75 65 72 79 2e 20 20 49 66 20    ** query.  If 
1af60 74 68 65 20 73 75 62 71 75 65 72 79 20 68 61 73  the subquery has
1af70 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 65   more than one e
1af80 6c 65 6d 65 6e 74 20 69 6e 20 69 74 73 20 46 52  lement in its FR
1af90 4f 4d 20 63 6c 61 75 73 65 2c 0a 20 20 20 20 2a  OM clause,.    *
1afa0 2a 20 74 68 65 6e 20 65 78 70 61 6e 64 20 74 68  * then expand th
1afb0 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 74 6f  e outer query to
1afc0 20 6d 61 6b 65 20 73 70 61 63 65 20 66 6f 72 20   make space for 
1afd0 69 74 20 74 6f 20 68 6f 6c 64 20 61 6c 6c 20 65  it to hold all e
1afe0 6c 65 6d 65 6e 74 73 0a 20 20 20 20 2a 2a 20 6f  lements.    ** o
1aff0 66 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a  f the subquery..
1b000 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 78      **.    ** Ex
1b010 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20  ample:.    **.  
1b020 20 20 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a    **    SELECT *
1b030 20 46 52 4f 4d 20 74 61 62 41 2c 20 28 53 45 4c   FROM tabA, (SEL
1b040 45 43 54 20 2a 20 46 52 4f 4d 20 73 75 62 31 2c  ECT * FROM sub1,
1b050 20 73 75 62 32 29 2c 20 74 61 62 42 3b 0a 20 20   sub2), tabB;.  
1b060 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
1b070 6f 75 74 65 72 20 71 75 65 72 79 20 68 61 73 20  outer query has 
1b080 33 20 73 6c 6f 74 73 20 69 6e 20 69 74 73 20 46  3 slots in its F
1b090 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 4f 6e 65  ROM clause.  One
1b0a0 20 73 6c 6f 74 20 6f 66 20 74 68 65 0a 20 20 20   slot of the.   
1b0b0 20 2a 2a 20 6f 75 74 65 72 20 71 75 65 72 79 20   ** outer query 
1b0c0 28 74 68 65 20 6d 69 64 64 6c 65 20 73 6c 6f 74  (the middle slot
1b0d0 29 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65  ) is used by the
1b0e0 20 73 75 62 71 75 65 72 79 2e 20 20 54 68 65 20   subquery.  The 
1b0f0 6e 65 78 74 0a 20 20 20 20 2a 2a 20 62 6c 6f 63  next.    ** bloc
1b100 6b 20 6f 66 20 63 6f 64 65 20 77 69 6c 6c 20 65  k of code will e
1b110 78 70 61 6e 64 20 74 68 65 20 6f 75 74 20 71 75  xpand the out qu
1b120 65 72 79 20 74 6f 20 34 20 73 6c 6f 74 73 2e 20  ery to 4 slots. 
1b130 20 54 68 65 20 6d 69 64 64 6c 65 0a 20 20 20 20   The middle.    
1b140 2a 2a 20 73 6c 6f 74 20 69 73 20 65 78 70 61 6e  ** slot is expan
1b150 64 65 64 20 74 6f 20 74 77 6f 20 73 6c 6f 74 73  ded to two slots
1b160 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6d 61 6b   in order to mak
1b170 65 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 0a  e space for the.
1b180 20 20 20 20 2a 2a 20 74 77 6f 20 65 6c 65 6d 65      ** two eleme
1b190 6e 74 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  nts in the FROM 
1b1a0 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 73 75  clause of the su
1b1b0 62 71 75 65 72 79 2e 0a 20 20 20 20 2a 2f 0a 20  bquery..    */. 
1b1c0 20 20 20 69 66 28 20 6e 53 75 62 53 72 63 3e 31     if( nSubSrc>1
1b1d0 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 65 6e   ){.      pParen
1b1e0 74 2d 3e 70 53 72 63 20 3d 20 70 53 72 63 20 3d  t->pSrc = pSrc =
1b1f0 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 45   sqlite3SrcListE
1b200 6e 6c 61 72 67 65 28 64 62 2c 20 70 53 72 63 2c  nlarge(db, pSrc,
1b210 20 6e 53 75 62 53 72 63 2d 31 2c 69 46 72 6f 6d   nSubSrc-1,iFrom
1b220 2b 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64  +1);.      if( d
1b230 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
1b240 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  ){.        break
1b250 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1b260 0a 20 20 20 20 2f 2a 20 54 72 61 6e 73 66 65 72  .    /* Transfer
1b270 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
1b280 20 74 65 72 6d 73 20 66 72 6f 6d 20 74 68 65 20   terms from the 
1b290 73 75 62 71 75 65 72 79 20 69 6e 74 6f 20 74 68  subquery into th
1b2a0 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72 20 71  e.    ** outer q
1b2b0 75 65 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  uery..    */.   
1b2c0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 75 62   for(i=0; i<nSub
1b2d0 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Src; i++){.     
1b2e0 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65   sqlite3IdListDe
1b2f0 6c 65 74 65 28 64 62 2c 20 70 53 72 63 2d 3e 61  lete(db, pSrc->a
1b300 5b 69 2b 69 46 72 6f 6d 5d 2e 70 55 73 69 6e 67  [i+iFrom].pUsing
1b310 29 3b 0a 20 20 20 20 20 20 70 53 72 63 2d 3e 61  );.      pSrc->a
1b320 5b 69 2b 69 46 72 6f 6d 5d 20 3d 20 70 53 75 62  [i+iFrom] = pSub
1b330 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20  Src->a[i];.     
1b340 20 6d 65 6d 73 65 74 28 26 70 53 75 62 53 72 63   memset(&pSubSrc
1b350 2d 3e 61 5b 69 5d 2c 20 30 2c 20 73 69 7a 65 6f  ->a[i], 0, sizeo
1b360 66 28 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 29  f(pSubSrc->a[i])
1b370 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 72  );.    }.    pSr
1b380 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 6a 6f 69 6e  c->a[iFrom].join
1b390 74 79 70 65 20 3d 20 6a 6f 69 6e 74 79 70 65 3b  type = jointype;
1b3a0 0a 20 20 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 62  .  .    /* Now b
1b3b0 65 67 69 6e 20 73 75 62 73 74 69 74 75 74 69 6e  egin substitutin
1b3c0 67 20 73 75 62 71 75 65 72 79 20 72 65 73 75 6c  g subquery resul
1b3d0 74 20 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e  t set expression
1b3e0 73 20 66 6f 72 20 0a 20 20 20 20 2a 2a 20 72 65  s for .    ** re
1b3f0 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
1b400 69 50 61 72 65 6e 74 20 69 6e 20 74 68 65 20 6f  iParent in the o
1b410 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20 20 20  uter query..    
1b420 2a 2a 20 0a 20 20 20 20 2a 2a 20 45 78 61 6d 70  ** .    ** Examp
1b430 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  le:.    **.    *
1b440 2a 20 20 20 53 45 4c 45 43 54 20 61 2b 35 2c 20  *   SELECT a+5, 
1b450 62 2a 31 30 20 46 52 4f 4d 20 28 53 45 4c 45 43  b*10 FROM (SELEC
1b460 54 20 78 2a 33 20 41 53 20 61 2c 20 79 2b 31 30  T x*3 AS a, y+10
1b470 20 41 53 20 62 20 46 52 4f 4d 20 74 31 29 20 57   AS b FROM t1) W
1b480 48 45 52 45 20 61 3e 62 3b 0a 20 20 20 20 2a 2a  HERE a>b;.    **
1b490 20 20 20 5c 20 20 20 20 20 20 20 20 20 20 20 20     \            
1b4a0 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f           \______
1b4b0 5f 5f 5f 5f 5f 5f 5f 20 73 75 62 71 75 65 72 79  _______ subquery
1b4c0 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20   __________/    
1b4d0 20 20 20 20 20 20 2f 0a 20 20 20 20 2a 2a 20 20        /.    **  
1b4e0 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f    \_____________
1b4f0 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65 72 20 71  ________ outer q
1b500 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  uery ___________
1b510 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
1b520 5f 5f 5f 2f 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ___/.    **.    
1b530 2a 2a 20 57 65 20 6c 6f 6f 6b 20 61 74 20 65 76  ** We look at ev
1b540 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20 69  ery expression i
1b550 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  n the outer quer
1b560 79 20 61 6e 64 20 65 76 65 72 79 20 70 6c 61 63  y and every plac
1b570 65 20 77 65 20 73 65 65 0a 20 20 20 20 2a 2a 20  e we see.    ** 
1b580 22 61 22 20 77 65 20 73 75 62 73 74 69 74 75 74  "a" we substitut
1b590 65 20 22 78 2a 33 22 20 61 6e 64 20 65 76 65 72  e "x*3" and ever
1b5a0 79 20 70 6c 61 63 65 20 77 65 20 73 65 65 20 22  y place we see "
1b5b0 62 22 20 77 65 20 73 75 62 73 74 69 74 75 74 65  b" we substitute
1b5c0 20 22 79 2b 31 30 22 2e 0a 20 20 20 20 2a 2f 0a   "y+10"..    */.
1b5d0 20 20 20 20 70 4c 69 73 74 20 3d 20 70 50 61 72      pList = pPar
1b5e0 65 6e 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20  ent->pEList;.   
1b5f0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73   for(i=0; i<pLis
1b600 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
1b610 20 20 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d        if( pList-
1b620 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3d 3d 30 20 29  >a[i].zName==0 )
1b630 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  {.        char *
1b640 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44  zName = sqlite3D
1b650 62 53 74 72 44 75 70 28 64 62 2c 20 70 4c 69 73  bStrDup(db, pLis
1b660 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 29 3b 0a  t->a[i].zSpan);.
1b670 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
1b680 65 71 75 6f 74 65 28 7a 4e 61 6d 65 29 3b 0a 20  equote(zName);. 
1b690 20 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b         pList->a[
1b6a0 69 5d 2e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65  i].zName = zName
1b6b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1b6c0 20 20 20 20 73 75 62 73 74 45 78 70 72 4c 69 73      substExprLis
1b6d0 74 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70  t(db, pParent->p
1b6e0 45 4c 69 73 74 2c 20 69 50 61 72 65 6e 74 2c 20  EList, iParent, 
1b6f0 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  pSub->pEList);. 
1b700 20 20 20 69 66 28 20 69 73 41 67 67 20 29 7b 0a     if( isAgg ){.
1b710 20 20 20 20 20 20 73 75 62 73 74 45 78 70 72 4c        substExprL
1b720 69 73 74 28 64 62 2c 20 70 50 61 72 65 6e 74 2d  ist(db, pParent-
1b730 3e 70 47 72 6f 75 70 42 79 2c 20 69 50 61 72 65  >pGroupBy, iPare
1b740 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74  nt, pSub->pEList
1b750 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74  );.      pParent
1b760 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 75 62 73  ->pHaving = subs
1b770 74 45 78 70 72 28 64 62 2c 20 70 50 61 72 65 6e  tExpr(db, pParen
1b780 74 2d 3e 70 48 61 76 69 6e 67 2c 20 69 50 61 72  t->pHaving, iPar
1b790 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73  ent, pSub->pELis
1b7a0 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  t);.    }.    if
1b7b0 28 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79  ( pSub->pOrderBy
1b7c0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
1b7d0 28 20 70 50 61 72 65 6e 74 2d 3e 70 4f 72 64 65  ( pParent->pOrde
1b7e0 72 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  rBy==0 );.      
1b7f0 70 50 61 72 65 6e 74 2d 3e 70 4f 72 64 65 72 42  pParent->pOrderB
1b800 79 20 3d 20 70 53 75 62 2d 3e 70 4f 72 64 65 72  y = pSub->pOrder
1b810 42 79 3b 0a 20 20 20 20 20 20 70 53 75 62 2d 3e  By;.      pSub->
1b820 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  pOrderBy = 0;.  
1b830 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 72    }else if( pPar
1b840 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b  ent->pOrderBy ){
1b850 0a 20 20 20 20 20 20 73 75 62 73 74 45 78 70 72  .      substExpr
1b860 4c 69 73 74 28 64 62 2c 20 70 50 61 72 65 6e 74  List(db, pParent
1b870 2d 3e 70 4f 72 64 65 72 42 79 2c 20 69 50 61 72  ->pOrderBy, iPar
1b880 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73  ent, pSub->pELis
1b890 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  t);.    }.    if
1b8a0 28 20 70 53 75 62 2d 3e 70 57 68 65 72 65 20 29  ( pSub->pWhere )
1b8b0 7b 0a 20 20 20 20 20 20 70 57 68 65 72 65 20 3d  {.      pWhere =
1b8c0 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
1b8d0 64 62 2c 20 70 53 75 62 2d 3e 70 57 68 65 72 65  db, pSub->pWhere
1b8e0 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , 0);.    }else{
1b8f0 0a 20 20 20 20 20 20 70 57 68 65 72 65 20 3d 20  .      pWhere = 
1b900 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  0;.    }.    if(
1b910 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20 29   subqueryIsAgg )
1b920 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
1b930 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67  pParent->pHaving
1b940 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50 61  ==0 );.      pPa
1b950 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 20 3d 20  rent->pHaving = 
1b960 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 3b  pParent->pWhere;
1b970 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e  .      pParent->
1b980 70 57 68 65 72 65 20 3d 20 70 57 68 65 72 65 3b  pWhere = pWhere;
1b990 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e  .      pParent->
1b9a0 70 48 61 76 69 6e 67 20 3d 20 73 75 62 73 74 45  pHaving = substE
1b9b0 78 70 72 28 64 62 2c 20 70 50 61 72 65 6e 74 2d  xpr(db, pParent-
1b9c0 3e 70 48 61 76 69 6e 67 2c 20 69 50 61 72 65 6e  >pHaving, iParen
1b9d0 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29  t, pSub->pEList)
1b9e0 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d  ;.      pParent-
1b9f0 3e 70 48 61 76 69 6e 67 20 3d 20 73 71 6c 69 74  >pHaving = sqlit
1ba00 65 33 45 78 70 72 41 6e 64 28 64 62 2c 20 70 50  e3ExprAnd(db, pP
1ba10 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 2c 20  arent->pHaving, 
1ba20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1ba30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba40 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 75     sqlite3ExprDu
1ba50 70 28 64 62 2c 20 70 53 75 62 2d 3e 70 48 61 76  p(db, pSub->pHav
1ba60 69 6e 67 2c 20 30 29 29 3b 0a 20 20 20 20 20 20  ing, 0));.      
1ba70 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d  assert( pParent-
1ba80 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b 0a  >pGroupBy==0 );.
1ba90 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70        pParent->p
1baa0 47 72 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65  GroupBy = sqlite
1bab0 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c  3ExprListDup(db,
1bac0 20 70 53 75 62 2d 3e 70 47 72 6f 75 70 42 79 2c   pSub->pGroupBy,
1bad0 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   0);.    }else{.
1bae0 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70        pParent->p
1baf0 57 68 65 72 65 20 3d 20 73 75 62 73 74 45 78 70  Where = substExp
1bb00 72 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70  r(db, pParent->p
1bb10 57 68 65 72 65 2c 20 69 50 61 72 65 6e 74 2c 20  Where, iParent, 
1bb20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  pSub->pEList);. 
1bb30 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 57       pParent->pW
1bb40 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78  here = sqlite3Ex
1bb50 70 72 41 6e 64 28 64 62 2c 20 70 50 61 72 65 6e  prAnd(db, pParen
1bb60 74 2d 3e 70 57 68 65 72 65 2c 20 70 57 68 65 72  t->pWhere, pWher
1bb70 65 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20  e);.    }.  .   
1bb80 20 2f 2a 20 54 68 65 20 66 6c 61 74 74 65 6e 65   /* The flattene
1bb90 64 20 71 75 65 72 79 20 69 73 20 64 69 73 74 69  d query is disti
1bba0 6e 63 74 20 69 66 20 65 69 74 68 65 72 20 74 68  nct if either th
1bbb0 65 20 69 6e 6e 65 72 20 6f 72 20 74 68 65 0a 20  e inner or the. 
1bbc0 20 20 20 2a 2a 20 6f 75 74 65 72 20 71 75 65 72     ** outer quer
1bbd0 79 20 69 73 20 64 69 73 74 69 6e 63 74 2e 20 0a  y is distinct. .
1bbe0 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 72 65      */.    pPare
1bbf0 6e 74 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20  nt->selFlags |= 
1bc00 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26  pSub->selFlags &
1bc10 20 53 46 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20   SF_Distinct;.  
1bc20 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 53  .    /*.    ** S
1bc30 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 28  ELECT ... FROM (
1bc40 53 45 4c 45 43 54 20 2e 2e 2e 20 4c 49 4d 49 54  SELECT ... LIMIT
1bc50 20 61 20 4f 46 46 53 45 54 20 62 29 20 4c 49 4d   a OFFSET b) LIM
1bc60 49 54 20 78 20 4f 46 46 53 45 54 20 79 3b 0a 20  IT x OFFSET y;. 
1bc70 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f 6e 65     **.    ** One
1bc80 20 69 73 20 74 65 6d 70 74 65 64 20 74 6f 20 74   is tempted to t
1bc90 72 79 20 74 6f 20 61 64 64 20 61 20 61 6e 64 20  ry to add a and 
1bca0 62 20 74 6f 20 63 6f 6d 62 69 6e 65 20 74 68 65  b to combine the
1bcb0 20 6c 69 6d 69 74 73 2e 20 20 42 75 74 20 74 68   limits.  But th
1bcc0 69 73 0a 20 20 20 20 2a 2a 20 64 6f 65 73 20 6e  is.    ** does n
1bcd0 6f 74 20 77 6f 72 6b 20 69 66 20 65 69 74 68 65  ot work if eithe
1bce0 72 20 6c 69 6d 69 74 20 69 73 20 6e 65 67 61 74  r limit is negat
1bcf0 69 76 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ive..    */.    
1bd00 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74  if( pSub->pLimit
1bd10 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 65 6e   ){.      pParen
1bd20 74 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 53 75 62  t->pLimit = pSub
1bd30 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  ->pLimit;.      
1bd40 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 3d 20 30  pSub->pLimit = 0
1bd50 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
1bd60 2a 20 46 69 6e 69 61 6c 6c 79 2c 20 64 65 6c 65  * Finially, dele
1bd70 74 65 20 77 68 61 74 20 69 73 20 6c 65 66 74 20  te what is left 
1bd80 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  of the subquery 
1bd90 61 6e 64 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20  and return.  ** 
1bda0 73 75 63 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20  success..  */.  
1bdb0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
1bdc0 65 74 65 28 64 62 2c 20 70 53 75 62 31 29 3b 0a  ete(db, pSub1);.
1bdd0 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23  .  return 1;.}.#
1bde0 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
1bdf0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  d(SQLITE_OMIT_SU
1be00 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69  BQUERY) || !defi
1be10 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
1be20 56 49 45 57 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  VIEW) */../*.** 
1be30 42 61 73 65 64 20 6f 6e 20 74 68 65 20 63 6f 6e  Based on the con
1be40 74 65 6e 74 73 20 6f 66 20 74 68 65 20 41 67 67  tents of the Agg
1be50 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69  Info structure i
1be60 6e 64 69 63 61 74 65 64 20 62 79 20 74 68 65 20  ndicated by the 
1be70 66 69 72 73 74 0a 2a 2a 20 61 72 67 75 6d 65 6e  first.** argumen
1be80 74 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  t, this function
1be90 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 20 66   checks if the f
1bea0 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75  ollowing are tru
1beb0 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 74 68  e:.**.**    * th
1bec0 65 20 71 75 65 72 79 20 63 6f 6e 74 61 69 6e 73  e query contains
1bed0 20 6a 75 73 74 20 61 20 73 69 6e 67 6c 65 20 61   just a single a
1bee0 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
1bef0 6e 2c 0a 2a 2a 20 20 20 20 2a 20 74 68 65 20 61  n,.**    * the a
1bf00 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
1bf10 6e 20 69 73 20 65 69 74 68 65 72 20 6d 69 6e 28  n is either min(
1bf20 29 20 6f 72 20 6d 61 78 28 29 2c 20 61 6e 64 0a  ) or max(), and.
1bf30 2a 2a 20 20 20 20 2a 20 74 68 65 20 61 72 67 75  **    * the argu
1bf40 6d 65 6e 74 20 74 6f 20 74 68 65 20 61 67 67 72  ment to the aggr
1bf50 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 69  egate function i
1bf60 73 20 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65  s a column value
1bf70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6c 6c 20 6f  ..**.** If all o
1bf80 66 20 74 68 65 20 61 62 6f 76 65 20 61 72 65 20  f the above are 
1bf90 74 72 75 65 2c 20 74 68 65 6e 20 57 48 45 52 45  true, then WHERE
1bfa0 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 20 6f 72 20  _ORDERBY_MIN or 
1bfb0 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 41  WHERE_ORDERBY_MA
1bfc0 58 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64  X.** is returned
1bfd0 20 61 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e   as appropriate.
1bfe0 20 41 6c 73 6f 2c 20 2a 70 70 4d 69 6e 4d 61 78   Also, *ppMinMax
1bff0 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74   is set to point
1c000 20 74 6f 20 74 68 65 20 0a 2a 2a 20 6c 69 73 74   to the .** list
1c010 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 70 61   of arguments pa
1c020 73 73 65 64 20 74 6f 20 74 68 65 20 61 67 67 72  ssed to the aggr
1c030 65 67 61 74 65 20 62 65 66 6f 72 65 20 72 65 74  egate before ret
1c040 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 4f 72  urning..**.** Or
1c050 2c 20 69 66 20 74 68 65 20 63 6f 6e 64 69 74 69  , if the conditi
1c060 6f 6e 73 20 61 62 6f 76 65 20 61 72 65 20 6e 6f  ons above are no
1c070 74 20 6d 65 74 2c 20 2a 70 70 4d 69 6e 4d 61 78  t met, *ppMinMax
1c080 20 69 73 20 73 65 74 20 74 6f 20 30 20 61 6e 64   is set to 0 and
1c090 0a 2a 2a 20 57 48 45 52 45 5f 4f 52 44 45 52 42  .** WHERE_ORDERB
1c0a0 59 5f 4e 4f 52 4d 41 4c 20 69 73 20 72 65 74 75  Y_NORMAL is retu
1c0b0 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
1c0c0 75 38 20 6d 69 6e 4d 61 78 51 75 65 72 79 28 41  u8 minMaxQuery(A
1c0d0 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f  ggInfo *pAggInfo
1c0e0 2c 20 45 78 70 72 4c 69 73 74 20 2a 2a 70 70 4d  , ExprList **ppM
1c0f0 69 6e 4d 61 78 29 7b 0a 20 20 69 6e 74 20 65 52  inMax){.  int eR
1c100 65 74 20 3d 20 57 48 45 52 45 5f 4f 52 44 45 52  et = WHERE_ORDER
1c110 42 59 5f 4e 4f 52 4d 41 4c 3b 20 20 20 20 20 20  BY_NORMAL;      
1c120 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61      /* Return va
1c130 6c 75 65 20 2a 2f 0a 0a 20 20 2a 70 70 4d 69 6e  lue */..  *ppMin
1c140 4d 61 78 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  Max = 0;.  if( p
1c150 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3d 3d  AggInfo->nFunc==
1c160 31 20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  1 ){.    Expr *p
1c170 45 78 70 72 20 3d 20 70 41 67 67 49 6e 66 6f 2d  Expr = pAggInfo-
1c180 3e 61 46 75 6e 63 5b 30 5d 2e 70 45 78 70 72 3b  >aFunc[0].pExpr;
1c190 20 2f 2a 20 41 67 67 72 65 67 61 74 65 20 66 75   /* Aggregate fu
1c1a0 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 45 78  nction */.    Ex
1c1b0 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 3d  prList *pEList =
1c1c0 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b   pExpr->x.pList;
1c1d0 20 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e        /* Argumen
1c1e0 74 73 20 74 6f 20 61 67 67 20 66 75 6e 63 74 69  ts to agg functi
1c1f0 6f 6e 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72  on */..    asser
1c200 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  t( pExpr->op==TK
1c210 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 3b  _AGG_FUNCTION );
1c220 0a 20 20 20 20 69 66 28 20 70 45 4c 69 73 74 20  .    if( pEList 
1c230 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  && pEList->nExpr
1c240 3d 3d 31 20 26 26 20 70 45 4c 69 73 74 2d 3e 61  ==1 && pEList->a
1c250 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  [0].pExpr->op==T
1c260 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 7b 0a  K_AGG_COLUMN ){.
1c270 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
1c280 20 2a 7a 46 75 6e 63 20 3d 20 70 45 78 70 72 2d   *zFunc = pExpr-
1c290 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20  >u.zToken;.     
1c2a0 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
1c2b0 43 6d 70 28 7a 46 75 6e 63 2c 20 22 6d 69 6e 22  Cmp(zFunc, "min"
1c2c0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
1c2d0 65 52 65 74 20 3d 20 57 48 45 52 45 5f 4f 52 44  eRet = WHERE_ORD
1c2e0 45 52 42 59 5f 4d 49 4e 3b 0a 20 20 20 20 20 20  ERBY_MIN;.      
1c2f0 20 20 2a 70 70 4d 69 6e 4d 61 78 20 3d 20 70 45    *ppMinMax = pE
1c300 4c 69 73 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73  List;.      }els
1c310 65 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72  e if( sqlite3Str
1c320 49 43 6d 70 28 7a 46 75 6e 63 2c 20 22 6d 61 78  ICmp(zFunc, "max
1c330 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
1c340 20 65 52 65 74 20 3d 20 57 48 45 52 45 5f 4f 52   eRet = WHERE_OR
1c350 44 45 52 42 59 5f 4d 41 58 3b 0a 20 20 20 20 20  DERBY_MAX;.     
1c360 20 20 20 2a 70 70 4d 69 6e 4d 61 78 20 3d 20 70     *ppMinMax = p
1c370 45 4c 69 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20  EList;.      }. 
1c380 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65     }.  }..  asse
1c390 72 74 28 20 2a 70 70 4d 69 6e 4d 61 78 3d 3d 30  rt( *ppMinMax==0
1c3a0 20 7c 7c 20 28 2a 70 70 4d 69 6e 4d 61 78 29 2d   || (*ppMinMax)-
1c3b0 3e 6e 45 78 70 72 3d 3d 31 20 29 3b 0a 20 20 72  >nExpr==1 );.  r
1c3c0 65 74 75 72 6e 20 65 52 65 74 3b 0a 7d 0a 0a 2f  eturn eRet;.}../
1c3d0 2a 0a 2a 2a 20 54 68 65 20 73 65 6c 65 63 74 20  *.** The select 
1c3e0 73 74 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64  statement passed
1c3f0 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
1c400 67 75 6d 65 6e 74 20 69 73 20 61 6e 20 61 67 67  gument is an agg
1c410 72 65 67 61 74 65 20 71 75 65 72 79 2e 0a 2a 2a  regate query..**
1c420 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 6d   The second argm
1c430 65 6e 74 20 69 73 20 74 68 65 20 61 73 73 6f 63  ent is the assoc
1c440 69 61 74 65 64 20 61 67 67 72 65 67 61 74 65 2d  iated aggregate-
1c450 69 6e 66 6f 20 6f 62 6a 65 63 74 2e 20 54 68 69  info object. Thi
1c460 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 74  s .** function t
1c470 65 73 74 73 20 69 66 20 74 68 65 20 53 45 4c 45  ests if the SELE
1c480 43 54 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72  CT is of the for
1c490 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43  m:.**.**   SELEC
1c4a0 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
1c4b0 3c 74 62 6c 3e 0a 2a 2a 0a 2a 2a 20 77 68 65 72  <tbl>.**.** wher
1c4c0 65 20 74 61 62 6c 65 20 69 73 20 61 20 64 61 74  e table is a dat
1c4d0 61 62 61 73 65 20 74 61 62 6c 65 2c 20 6e 6f 74  abase table, not
1c4e0 20 61 20 73 75 62 2d 73 65 6c 65 63 74 20 6f 72   a sub-select or
1c4f0 20 76 69 65 77 2e 20 49 66 20 74 68 65 20 71 75   view. If the qu
1c500 65 72 79 0a 2a 2a 20 64 6f 65 73 20 6d 61 74 63  ery.** does matc
1c510 68 20 74 68 69 73 20 70 61 74 74 65 72 6e 2c 20  h this pattern, 
1c520 74 68 65 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  then a pointer t
1c530 6f 20 74 68 65 20 54 61 62 6c 65 20 6f 62 6a 65  o the Table obje
1c540 63 74 20 72 65 70 72 65 73 65 6e 74 69 6e 67 0a  ct representing.
1c550 2a 2a 20 3c 74 62 6c 3e 20 69 73 20 72 65 74 75  ** <tbl> is retu
1c560 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  rned. Otherwise,
1c570 20 30 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a   0 is returned..
1c580 2a 2f 0a 73 74 61 74 69 63 20 54 61 62 6c 65 20  */.static Table 
1c590 2a 69 73 53 69 6d 70 6c 65 43 6f 75 6e 74 28 53  *isSimpleCount(S
1c5a0 65 6c 65 63 74 20 2a 70 2c 20 41 67 67 49 6e 66  elect *p, AggInf
1c5b0 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20  o *pAggInfo){.  
1c5c0 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 45  Table *pTab;.  E
1c5d0 78 70 72 20 2a 70 45 78 70 72 3b 0a 0a 20 20 61  xpr *pExpr;..  a
1c5e0 73 73 65 72 74 28 20 21 70 2d 3e 70 47 72 6f 75  ssert( !p->pGrou
1c5f0 70 42 79 20 29 3b 0a 0a 20 20 69 66 28 20 70 2d  pBy );..  if( p-
1c600 3e 70 57 68 65 72 65 20 7c 7c 20 70 2d 3e 70 45  >pWhere || p->pE
1c610 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 0a  List->nExpr!=1 .
1c620 20 20 20 7c 7c 20 70 2d 3e 70 53 72 63 2d 3e 6e     || p->pSrc->n
1c630 53 72 63 21 3d 31 20 7c 7c 20 70 2d 3e 70 53 72  Src!=1 || p->pSr
1c640 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 0a  c->a[0].pSelect.
1c650 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
1c660 30 3b 0a 20 20 7d 0a 20 20 70 54 61 62 20 3d 20  0;.  }.  pTab = 
1c670 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54  p->pSrc->a[0].pT
1c680 61 62 3b 0a 20 20 70 45 78 70 72 20 3d 20 70 2d  ab;.  pExpr = p-
1c690 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  >pEList->a[0].pE
1c6a0 78 70 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70  xpr;.  assert( p
1c6b0 54 61 62 20 26 26 20 21 70 54 61 62 2d 3e 70 53  Tab && !pTab->pS
1c6c0 65 6c 65 63 74 20 26 26 20 70 45 78 70 72 20 29  elect && pExpr )
1c6d0 3b 0a 0a 20 20 69 66 28 20 49 73 56 69 72 74 75  ;..  if( IsVirtu
1c6e0 61 6c 28 70 54 61 62 29 20 29 20 72 65 74 75 72  al(pTab) ) retur
1c6f0 6e 20 30 3b 0a 20 20 69 66 28 20 70 45 78 70 72  n 0;.  if( pExpr
1c700 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 46 55 4e  ->op!=TK_AGG_FUN
1c710 43 54 49 4f 4e 20 29 20 72 65 74 75 72 6e 20 30  CTION ) return 0
1c720 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 41  ;.  if( NEVER(pA
1c730 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3d 3d 30  ggInfo->nFunc==0
1c740 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
1c750 69 66 28 20 28 70 41 67 67 49 6e 66 6f 2d 3e 61  if( (pAggInfo->a
1c760 46 75 6e 63 5b 30 5d 2e 70 46 75 6e 63 2d 3e 66  Func[0].pFunc->f
1c770 75 6e 63 46 6c 61 67 73 26 53 51 4c 49 54 45 5f  uncFlags&SQLITE_
1c780 46 55 4e 43 5f 43 4f 55 4e 54 29 3d 3d 30 20 29  FUNC_COUNT)==0 )
1c790 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
1c7a0 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 26 45 50   pExpr->flags&EP
1c7b0 5f 44 69 73 74 69 6e 63 74 20 29 20 72 65 74 75  _Distinct ) retu
1c7c0 72 6e 20 30 3b 0a 0a 20 20 72 65 74 75 72 6e 20  rn 0;..  return 
1c7d0 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  pTab;.}../*.** I
1c7e0 66 20 74 68 65 20 73 6f 75 72 63 65 2d 6c 69 73  f the source-lis
1c7f0 74 20 69 74 65 6d 20 70 61 73 73 65 64 20 61 73  t item passed as
1c800 20 61 6e 20 61 72 67 75 6d 65 6e 74 20 77 61 73   an argument was
1c810 20 61 75 67 6d 65 6e 74 65 64 20 77 69 74 68 20   augmented with 
1c820 61 6e 0a 2a 2a 20 49 4e 44 45 58 45 44 20 42 59  an.** INDEXED BY
1c830 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 74 72   clause, then tr
1c840 79 20 74 6f 20 6c 6f 63 61 74 65 20 74 68 65 20  y to locate the 
1c850 73 70 65 63 69 66 69 65 64 20 69 6e 64 65 78 2e  specified index.
1c860 20 49 66 20 74 68 65 72 65 0a 2a 2a 20 77 61 73   If there.** was
1c870 20 73 75 63 68 20 61 20 63 6c 61 75 73 65 20 61   such a clause a
1c880 6e 64 20 74 68 65 20 6e 61 6d 65 64 20 69 6e 64  nd the named ind
1c890 65 78 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75  ex cannot be fou
1c8a0 6e 64 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53  nd, return .** S
1c8b0 51 4c 49 54 45 5f 45 52 52 4f 52 20 61 6e 64 20  QLITE_ERROR and 
1c8c0 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 69  leave an error i
1c8d0 6e 20 70 50 61 72 73 65 2e 20 4f 74 68 65 72 77  n pParse. Otherw
1c8e0 69 73 65 2c 20 70 6f 70 75 6c 61 74 65 20 0a 2a  ise, populate .*
1c8f0 2a 20 70 46 72 6f 6d 2d 3e 70 49 6e 64 65 78 20  * pFrom->pIndex 
1c900 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54  and return SQLIT
1c910 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  E_OK..*/.int sql
1c920 69 74 65 33 49 6e 64 65 78 65 64 42 79 4c 6f 6f  ite3IndexedByLoo
1c930 6b 75 70 28 50 61 72 73 65 20 2a 70 50 61 72 73  kup(Parse *pPars
1c940 65 2c 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  e, struct SrcLis
1c950 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 29 7b 0a  t_item *pFrom){.
1c960 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 70 54 61    if( pFrom->pTa
1c970 62 20 26 26 20 70 46 72 6f 6d 2d 3e 7a 49 6e 64  b && pFrom->zInd
1c980 65 78 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20  ex ){.    Table 
1c990 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70  *pTab = pFrom->p
1c9a0 54 61 62 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  Tab;.    char *z
1c9b0 49 6e 64 65 78 20 3d 20 70 46 72 6f 6d 2d 3e 7a  Index = pFrom->z
1c9c0 49 6e 64 65 78 3b 0a 20 20 20 20 49 6e 64 65 78  Index;.    Index
1c9d0 20 2a 70 49 64 78 3b 0a 20 20 20 20 66 6f 72 28   *pIdx;.    for(
1c9e0 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  pIdx=pTab->pInde
1c9f0 78 3b 20 0a 20 20 20 20 20 20 20 20 70 49 64 78  x; .        pIdx
1ca00 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43   && sqlite3StrIC
1ca10 6d 70 28 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20  mp(pIdx->zName, 
1ca20 7a 49 6e 64 65 78 29 3b 20 0a 20 20 20 20 20 20  zIndex); .      
1ca30 20 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65    pIdx=pIdx->pNe
1ca40 78 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66  xt.    );.    if
1ca50 28 20 21 70 49 64 78 20 29 7b 0a 20 20 20 20 20  ( !pIdx ){.     
1ca60 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
1ca70 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63  (pParse, "no suc
1ca80 68 20 69 6e 64 65 78 3a 20 25 73 22 2c 20 7a 49  h index: %s", zI
1ca90 6e 64 65 78 2c 20 30 29 3b 0a 20 20 20 20 20 20  ndex, 0);.      
1caa0 70 50 61 72 73 65 2d 3e 63 68 65 63 6b 53 63 68  pParse->checkSch
1cab0 65 6d 61 20 3d 20 31 3b 0a 20 20 20 20 20 20 72  ema = 1;.      r
1cac0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
1cad0 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 46  OR;.    }.    pF
1cae0 72 6f 6d 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49  rom->pIndex = pI
1caf0 64 78 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  dx;.  }.  return
1cb00 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 2f 2a   SQLITE_OK;.}./*
1cb10 0a 2a 2a 20 44 65 74 65 63 74 20 63 6f 6d 70 6f  .** Detect compo
1cb20 75 6e 64 20 53 45 4c 45 43 54 20 73 74 61 74 65  und SELECT state
1cb30 6d 65 6e 74 73 20 74 68 61 74 20 75 73 65 20 61  ments that use a
1cb40 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
1cb50 65 20 77 69 74 68 20 0a 2a 2a 20 61 6e 20 61 6c  e with .** an al
1cb60 74 65 72 6e 61 74 69 76 65 20 63 6f 6c 6c 61 74  ternative collat
1cb70 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2a  ing sequence..**
1cb80 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2e 2e  .**    SELECT ..
1cb90 2e 20 46 52 4f 4d 20 74 31 20 45 58 43 45 50 54  . FROM t1 EXCEPT
1cba0 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d   SELECT ... FROM
1cbb0 20 74 32 20 4f 52 44 45 52 20 42 59 20 2e 2e 20   t2 ORDER BY .. 
1cbc0 43 4f 4c 4c 41 54 45 20 2e 2e 2e 0a 2a 2a 0a 2a  COLLATE ....**.*
1cbd0 2a 20 54 68 65 73 65 20 61 72 65 20 72 65 77 72  * These are rewr
1cbe0 69 74 74 65 6e 20 61 73 20 61 20 73 75 62 71 75  itten as a subqu
1cbf0 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45  ery:.**.**    SE
1cc00 4c 45 43 54 20 2a 20 46 52 4f 4d 20 28 53 45 4c  LECT * FROM (SEL
1cc10 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20  ECT ... FROM t1 
1cc20 45 58 43 45 50 54 20 53 45 4c 45 43 54 20 2e 2e  EXCEPT SELECT ..
1cc30 2e 20 46 52 4f 4d 20 74 32 29 0a 2a 2a 20 20 20  . FROM t2).**   
1cc40 20 20 4f 52 44 45 52 20 42 59 20 2e 2e 2e 20 43    ORDER BY ... C
1cc50 4f 4c 4c 41 54 45 20 2e 2e 2e 0a 2a 2a 0a 2a 2a  OLLATE ....**.**
1cc60 20 54 68 69 73 20 74 72 61 6e 73 66 6f 72 6d 61   This transforma
1cc70 74 69 6f 6e 20 69 73 20 6e 65 63 65 73 73 61 72  tion is necessar
1cc80 79 20 62 65 63 61 75 73 65 20 74 68 65 20 6d 75  y because the mu
1cc90 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79  ltiSelectOrderBy
1cca0 28 29 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 62  () routine.** ab
1ccb0 6f 76 65 20 74 68 61 74 20 67 65 6e 65 72 61 74  ove that generat
1ccc0 65 73 20 74 68 65 20 63 6f 64 65 20 66 6f 72 20  es the code for 
1ccd0 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43  a compound SELEC
1cce0 54 20 77 69 74 68 20 61 6e 20 4f 52 44 45 52 20  T with an ORDER 
1ccf0 42 59 20 63 6c 61 75 73 65 0a 2a 2a 20 75 73 65  BY clause.** use
1cd00 73 20 61 20 6d 65 72 67 65 20 61 6c 67 6f 72 69  s a merge algori
1cd10 74 68 6d 20 74 68 61 74 20 72 65 71 75 69 72 65  thm that require
1cd20 73 20 74 68 65 20 73 61 6d 65 20 63 6f 6c 6c 61  s the same colla
1cd30 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 6f 6e  ting sequence on
1cd40 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 20 63   the.** result c
1cd50 6f 6c 75 6d 6e 73 20 61 73 20 6f 6e 20 74 68 65  olumns as on the
1cd60 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
1cd70 2e 20 20 53 65 65 20 74 69 63 6b 65 74 0a 2a 2a  .  See ticket.**
1cd80 20 68 74 74 70 3a 2f 2f 77 77 77 2e 73 71 6c 69   http://www.sqli
1cd90 74 65 2e 6f 72 67 2f 73 72 63 2f 69 6e 66 6f 2f  te.org/src/info/
1cda0 36 37 30 39 35 37 34 64 32 61 0a 2a 2a 0a 2a 2a  6709574d2a.**.**
1cdb0 20 54 68 69 73 20 74 72 61 6e 73 66 6f 72 6d 61   This transforma
1cdc0 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 6e 65 65  tion is only nee
1cdd0 64 65 64 20 66 6f 72 20 45 58 43 45 50 54 2c 20  ded for EXCEPT, 
1cde0 49 4e 54 45 52 53 45 43 54 2c 20 61 6e 64 20 55  INTERSECT, and U
1cdf0 4e 49 4f 4e 2e 0a 2a 2a 20 54 68 65 20 55 4e 49  NION..** The UNI
1ce00 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72 20  ON ALL operator 
1ce10 77 6f 72 6b 73 20 66 69 6e 65 20 77 69 74 68 20  works fine with 
1ce20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72  multiSelectOrder
1ce30 42 79 28 29 20 65 76 65 6e 20 77 68 65 6e 0a 2a  By() even when.*
1ce40 2a 20 74 68 65 72 65 20 61 72 65 20 43 4f 4c 4c  * there are COLL
1ce50 41 54 45 20 74 65 72 6d 73 20 69 6e 20 74 68 65  ATE terms in the
1ce60 20 4f 52 44 45 52 20 42 59 2e 0a 2a 2f 0a 73 74   ORDER BY..*/.st
1ce70 61 74 69 63 20 69 6e 74 20 63 6f 6e 76 65 72 74  atic int convert
1ce80 43 6f 6d 70 6f 75 6e 64 53 65 6c 65 63 74 54 6f  CompoundSelectTo
1ce90 53 75 62 71 75 65 72 79 28 57 61 6c 6b 65 72 20  Subquery(Walker 
1cea0 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74  *pWalker, Select
1ceb0 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   *p){.  int i;. 
1cec0 20 53 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20   Select *pNew;. 
1ced0 20 53 65 6c 65 63 74 20 2a 70 58 3b 0a 20 20 73   Select *pX;.  s
1cee0 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 73 74  qlite3 *db;.  st
1cef0 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
1cf00 65 6d 20 2a 61 3b 0a 20 20 53 72 63 4c 69 73 74  em *a;.  SrcList
1cf10 20 2a 70 4e 65 77 53 72 63 3b 0a 20 20 50 61 72   *pNewSrc;.  Par
1cf20 73 65 20 2a 70 50 61 72 73 65 3b 0a 20 20 54 6f  se *pParse;.  To
1cf30 6b 65 6e 20 64 75 6d 6d 79 3b 0a 0a 20 20 69 66  ken dummy;..  if
1cf40 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29  ( p->pPrior==0 )
1cf50 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
1cf60 69 6e 75 65 3b 0a 20 20 69 66 28 20 70 2d 3e 70  inue;.  if( p->p
1cf70 4f 72 64 65 72 42 79 3d 3d 30 20 29 20 72 65 74  OrderBy==0 ) ret
1cf80 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
1cf90 3b 0a 20 20 66 6f 72 28 70 58 3d 70 3b 20 70 58  ;.  for(pX=p; pX
1cfa0 20 26 26 20 28 70 58 2d 3e 6f 70 3d 3d 54 4b 5f   && (pX->op==TK_
1cfb0 41 4c 4c 20 7c 7c 20 70 58 2d 3e 6f 70 3d 3d 54  ALL || pX->op==T
1cfc0 4b 5f 53 45 4c 45 43 54 29 3b 20 70 58 3d 70 58  K_SELECT); pX=pX
1cfd0 2d 3e 70 50 72 69 6f 72 29 7b 7d 0a 20 20 69 66  ->pPrior){}.  if
1cfe0 28 20 70 58 3d 3d 30 20 29 20 72 65 74 75 72 6e  ( pX==0 ) return
1cff0 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20   WRC_Continue;. 
1d000 20 61 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79   a = p->pOrderBy
1d010 2d 3e 61 3b 0a 20 20 66 6f 72 28 69 3d 70 2d 3e  ->a;.  for(i=p->
1d020 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2d  pOrderBy->nExpr-
1d030 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20  1; i>=0; i--){. 
1d040 20 20 20 69 66 28 20 61 5b 69 5d 2e 70 45 78 70     if( a[i].pExp
1d050 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 43 6f  r->flags & EP_Co
1d060 6c 6c 61 74 65 20 29 20 62 72 65 61 6b 3b 0a 20  llate ) break;. 
1d070 20 7d 0a 20 20 69 66 28 20 69 3c 30 20 29 20 72   }.  if( i<0 ) r
1d080 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
1d090 75 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20  ue;..  /* If we 
1d0a0 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74  reach this point
1d0b0 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 65  , that means the
1d0c0 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20   transformation 
1d0d0 69 73 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a  is required. */.
1d0e0 0a 20 20 70 50 61 72 73 65 20 3d 20 70 57 61 6c  .  pParse = pWal
1d0f0 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 64  ker->pParse;.  d
1d100 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
1d110 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
1d120 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
1d130 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29   sizeof(*pNew) )
1d140 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20  ;.  if( pNew==0 
1d150 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f  ) return WRC_Abo
1d160 72 74 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 75  rt;.  memset(&du
1d170 6d 6d 79 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64  mmy, 0, sizeof(d
1d180 75 6d 6d 79 29 29 3b 0a 20 20 70 4e 65 77 53 72  ummy));.  pNewSr
1d190 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69  c = sqlite3SrcLi
1d1a0 73 74 41 70 70 65 6e 64 46 72 6f 6d 54 65 72 6d  stAppendFromTerm
1d1b0 28 70 50 61 72 73 65 2c 30 2c 30 2c 30 2c 26 64  (pParse,0,0,0,&d
1d1c0 75 6d 6d 79 2c 70 4e 65 77 2c 30 2c 30 29 3b 0a  ummy,pNew,0,0);.
1d1d0 20 20 69 66 28 20 70 4e 65 77 53 72 63 3d 3d 30    if( pNewSrc==0
1d1e0 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62   ) return WRC_Ab
1d1f0 6f 72 74 3b 0a 20 20 2a 70 4e 65 77 20 3d 20 2a  ort;.  *pNew = *
1d200 70 3b 0a 20 20 70 2d 3e 70 53 72 63 20 3d 20 70  p;.  p->pSrc = p
1d210 4e 65 77 53 72 63 3b 0a 20 20 70 2d 3e 70 45 4c  NewSrc;.  p->pEL
1d220 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ist = sqlite3Exp
1d230 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72  rListAppend(pPar
1d240 73 65 2c 20 30 2c 20 73 71 6c 69 74 65 33 45 78  se, 0, sqlite3Ex
1d250 70 72 28 64 62 2c 20 54 4b 5f 41 4c 4c 2c 20 30  pr(db, TK_ALL, 0
1d260 29 29 3b 0a 20 20 70 2d 3e 6f 70 20 3d 20 54 4b  ));.  p->op = TK
1d270 5f 53 45 4c 45 43 54 3b 0a 20 20 70 2d 3e 70 57  _SELECT;.  p->pW
1d280 68 65 72 65 20 3d 20 30 3b 0a 20 20 70 4e 65 77  here = 0;.  pNew
1d290 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 30 3b 0a  ->pGroupBy = 0;.
1d2a0 20 20 70 4e 65 77 2d 3e 70 48 61 76 69 6e 67 20    pNew->pHaving 
1d2b0 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 72  = 0;.  pNew->pOr
1d2c0 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 70 2d 3e  derBy = 0;.  p->
1d2d0 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 70 4e  pPrior = 0;.  pN
1d2e0 65 77 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a  ew->pLimit = 0;.
1d2f0 20 20 70 4e 65 77 2d 3e 70 4f 66 66 73 65 74 20    pNew->pOffset 
1d300 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 57 52  = 0;.  return WR
1d310 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f  C_Continue;.}../
1d320 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1d330 65 20 69 73 20 61 20 57 61 6c 6b 65 72 20 63 61  e is a Walker ca
1d340 6c 6c 62 61 63 6b 20 66 6f 72 20 22 65 78 70 61  llback for "expa
1d350 6e 64 69 6e 67 22 20 61 20 53 45 4c 45 43 54 20  nding" a SELECT 
1d360 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 22 45  statement..** "E
1d370 78 70 61 6e 64 69 6e 67 22 20 6d 65 61 6e 73 20  xpanding" means 
1d380 74 6f 20 64 6f 20 74 68 65 20 66 6f 6c 6c 6f 77  to do the follow
1d390 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31  ing:.**.**    (1
1d3a0 29 20 20 4d 61 6b 65 20 73 75 72 65 20 56 44 42  )  Make sure VDB
1d3b0 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73  E cursor numbers
1d3c0 20 68 61 76 65 20 62 65 65 6e 20 61 73 73 69 67   have been assig
1d3d0 6e 65 64 20 74 6f 20 65 76 65 72 79 0a 2a 2a 20  ned to every.** 
1d3e0 20 20 20 20 20 20 20 20 65 6c 65 6d 65 6e 74 20          element 
1d3f0 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  of the FROM clau
1d400 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29  se..**.**    (2)
1d410 20 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70 54    Fill in the pT
1d420 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70 54 61 62  abList->a[].pTab
1d430 20 66 69 65 6c 64 73 20 69 6e 20 74 68 65 20 53   fields in the S
1d440 72 63 4c 69 73 74 20 74 68 61 74 20 0a 2a 2a 20  rcList that .** 
1d450 20 20 20 20 20 20 20 20 64 65 66 69 6e 65 73 20          defines 
1d460 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 57 68  FROM clause.  Wh
1d470 65 6e 20 76 69 65 77 73 20 61 70 70 65 61 72 20  en views appear 
1d480 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
1d490 73 65 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 66  se,.**         f
1d4a0 69 6c 6c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  ill pTabList->a[
1d4b0 5d 2e 70 53 65 6c 65 63 74 20 77 69 74 68 20 61  ].pSelect with a
1d4c0 20 63 6f 70 79 20 6f 66 20 74 68 65 20 53 45 4c   copy of the SEL
1d4d0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a  ECT statement.**
1d4e0 20 20 20 20 20 20 20 20 20 74 68 61 74 20 69 6d           that im
1d4f0 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 76 69 65  plements the vie
1d500 77 2e 20 20 41 20 63 6f 70 79 20 69 73 20 6d 61  w.  A copy is ma
1d510 64 65 20 6f 66 20 74 68 65 20 76 69 65 77 27 73  de of the view's
1d520 20 53 45 4c 45 43 54 0a 2a 2a 20 20 20 20 20 20   SELECT.**      
1d530 20 20 20 73 74 61 74 65 6d 65 6e 74 20 73 6f 20     statement so 
1d540 74 68 61 74 20 77 65 20 63 61 6e 20 66 72 65 65  that we can free
1d550 6c 79 20 6d 6f 64 69 66 79 20 6f 72 20 64 65 6c  ly modify or del
1d560 65 74 65 20 74 68 61 74 20 73 74 61 74 65 6d 65  ete that stateme
1d570 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 77 69  nt.**         wi
1d580 74 68 6f 75 74 20 77 6f 72 72 79 69 6e 67 20 61  thout worrying a
1d590 62 6f 75 74 20 6d 65 73 73 69 6e 67 20 75 70 20  bout messing up 
1d5a0 74 68 65 20 70 72 65 73 69 73 74 65 6e 74 20 72  the presistent r
1d5b0 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 0a 2a 2a  epresentation.**
1d5c0 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20           of the 
1d5d0 76 69 65 77 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28  view..**.**    (
1d5e0 33 29 20 20 41 64 64 20 74 65 72 6d 73 20 74 6f  3)  Add terms to
1d5f0 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
1d600 65 20 74 6f 20 61 63 63 6f 6d 6f 64 61 74 65 20  e to accomodate 
1d610 74 68 65 20 4e 41 54 55 52 41 4c 20 6b 65 79 77  the NATURAL keyw
1d620 6f 72 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f  ord.**         o
1d630 6e 20 6a 6f 69 6e 73 20 61 6e 64 20 74 68 65 20  n joins and the 
1d640 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61  ON and USING cla
1d650 75 73 65 20 6f 66 20 6a 6f 69 6e 73 2e 0a 2a 2a  use of joins..**
1d660 0a 2a 2a 20 20 20 20 28 34 29 20 20 53 63 61 6e  .**    (4)  Scan
1d670 20 74 68 65 20 6c 69 73 74 20 6f 66 20 63 6f 6c   the list of col
1d680 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75  umns in the resu
1d690 6c 74 20 73 65 74 20 28 70 45 4c 69 73 74 29 20  lt set (pEList) 
1d6a0 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20  looking.**      
1d6b0 20 20 20 66 6f 72 20 69 6e 73 74 61 6e 63 65 73     for instances
1d6c0 20 6f 66 20 74 68 65 20 22 2a 22 20 6f 70 65 72   of the "*" oper
1d6d0 61 74 6f 72 20 6f 72 20 74 68 65 20 54 41 42 4c  ator or the TABL
1d6e0 45 2e 2a 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a  E.* operator..**
1d6f0 20 20 20 20 20 20 20 20 20 49 66 20 66 6f 75 6e           If foun
1d700 64 2c 20 65 78 70 61 6e 64 20 65 61 63 68 20 22  d, expand each "
1d710 2a 22 20 74 6f 20 62 65 20 65 76 65 72 79 20 63  *" to be every c
1d720 6f 6c 75 6d 6e 20 69 6e 20 65 76 65 72 79 20 74  olumn in every t
1d730 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  able.**         
1d740 61 6e 64 20 54 41 42 4c 45 2e 2a 20 74 6f 20 62  and TABLE.* to b
1d750 65 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 69  e every column i
1d760 6e 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2f 0a 73  n TABLE..**.*/.s
1d770 74 61 74 69 63 20 69 6e 74 20 73 65 6c 65 63 74  tatic int select
1d780 45 78 70 61 6e 64 65 72 28 57 61 6c 6b 65 72 20  Expander(Walker 
1d790 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74  *pWalker, Select
1d7a0 20 2a 70 29 7b 0a 20 20 50 61 72 73 65 20 2a 70   *p){.  Parse *p
1d7b0 50 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d  Parse = pWalker-
1d7c0 3e 70 50 61 72 73 65 3b 0a 20 20 69 6e 74 20 69  >pParse;.  int i
1d7d0 2c 20 6a 2c 20 6b 3b 0a 20 20 53 72 63 4c 69 73  , j, k;.  SrcLis
1d7e0 74 20 2a 70 54 61 62 4c 69 73 74 3b 0a 20 20 45  t *pTabList;.  E
1d7f0 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b  xprList *pEList;
1d800 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
1d810 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a 20  t_item *pFrom;. 
1d820 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
1d830 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 45 78 70  Parse->db;.  Exp
1d840 72 20 2a 70 45 2c 20 2a 70 52 69 67 68 74 2c 20  r *pE, *pRight, 
1d850 2a 70 45 78 70 72 3b 0a 20 20 75 31 36 20 73 65  *pExpr;.  u16 se
1d860 6c 46 6c 61 67 73 20 3d 20 70 2d 3e 73 65 6c 46  lFlags = p->selF
1d870 6c 61 67 73 3b 0a 0a 20 20 70 2d 3e 73 65 6c 46  lags;..  p->selF
1d880 6c 61 67 73 20 7c 3d 20 53 46 5f 45 78 70 61 6e  lags |= SF_Expan
1d890 64 65 64 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d  ded;.  if( db->m
1d8a0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 20 29 7b 0a  allocFailed  ){.
1d8b0 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41      return WRC_A
1d8c0 62 6f 72 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20  bort;.  }.  if( 
1d8d0 4e 45 56 45 52 28 70 2d 3e 70 53 72 63 3d 3d 30  NEVER(p->pSrc==0
1d8e0 29 20 7c 7c 20 28 73 65 6c 46 6c 61 67 73 20 26  ) || (selFlags &
1d8f0 20 53 46 5f 45 78 70 61 6e 64 65 64 29 21 3d 30   SF_Expanded)!=0
1d900 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57   ){.    return W
1d910 52 43 5f 50 72 75 6e 65 3b 0a 20 20 7d 0a 20 20  RC_Prune;.  }.  
1d920 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53  pTabList = p->pS
1d930 72 63 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70  rc;.  pEList = p
1d940 2d 3e 70 45 4c 69 73 74 3b 0a 0a 20 20 2f 2a 20  ->pEList;..  /* 
1d950 4d 61 6b 65 20 73 75 72 65 20 63 75 72 73 6f 72  Make sure cursor
1d960 20 6e 75 6d 62 65 72 73 20 68 61 76 65 20 62 65   numbers have be
1d970 65 6e 20 61 73 73 69 67 6e 65 64 20 74 6f 20 61  en assigned to a
1d980 6c 6c 20 65 6e 74 72 69 65 73 20 69 6e 0a 20 20  ll entries in.  
1d990 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  ** the FROM clau
1d9a0 73 65 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  se of the SELECT
1d9b0 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f   statement..  */
1d9c0 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  .  sqlite3SrcLis
1d9d0 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28 70  tAssignCursors(p
1d9e0 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 29  Parse, pTabList)
1d9f0 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 75 70 20  ;..  /* Look up 
1da00 65 76 65 72 79 20 74 61 62 6c 65 20 6e 61 6d 65  every table name
1da10 64 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  d in the FROM cl
1da20 61 75 73 65 20 6f 66 20 74 68 65 20 73 65 6c 65  ause of the sele
1da30 63 74 2e 20 20 49 66 0a 20 20 2a 2a 20 61 6e 20  ct.  If.  ** an 
1da40 65 6e 74 72 79 20 6f 66 20 74 68 65 20 46 52 4f  entry of the FRO
1da50 4d 20 63 6c 61 75 73 65 20 69 73 20 61 20 73 75  M clause is a su
1da60 62 71 75 65 72 79 20 69 6e 73 74 65 61 64 20 6f  bquery instead o
1da70 66 20 61 20 74 61 62 6c 65 20 6f 72 20 76 69 65  f a table or vie
1da80 77 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 63 72 65  w,.  ** then cre
1da90 61 74 65 20 61 20 74 72 61 6e 73 69 65 6e 74 20  ate a transient 
1daa0 74 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  table structure 
1dab0 74 6f 20 64 65 73 63 72 69 62 65 20 74 68 65 20  to describe the 
1dac0 73 75 62 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20  subquery..  */. 
1dad0 20 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d   for(i=0, pFrom=
1dae0 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70  pTabList->a; i<p
1daf0 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  TabList->nSrc; i
1db00 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20  ++, pFrom++){.  
1db10 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
1db20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 70 54     if( pFrom->pT
1db30 61 62 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  ab!=0 ){.      /
1db40 2a 20 54 68 69 73 20 73 74 61 74 65 6d 65 6e 74  * This statement
1db50 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
1db60 6e 20 70 72 65 70 61 72 65 64 2e 20 20 54 68 65  n prepared.  The
1db70 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 0a 20 20  re is no need.  
1db80 20 20 20 20 2a 2a 20 74 6f 20 67 6f 20 66 75 72      ** to go fur
1db90 74 68 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 61  ther. */.      a
1dba0 73 73 65 72 74 28 20 69 3d 3d 30 20 29 3b 0a 20  ssert( i==0 );. 
1dbb0 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f       return WRC_
1dbc0 50 72 75 6e 65 3b 0a 20 20 20 20 7d 0a 20 20 20  Prune;.    }.   
1dbd0 20 69 66 28 20 70 46 72 6f 6d 2d 3e 7a 4e 61 6d   if( pFrom->zNam
1dbe0 65 3d 3d 30 20 29 7b 0a 23 69 66 6e 64 65 66 20  e==0 ){.#ifndef 
1dbf0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
1dc00 55 45 52 59 0a 20 20 20 20 20 20 53 65 6c 65 63  UERY.      Selec
1dc10 74 20 2a 70 53 65 6c 20 3d 20 70 46 72 6f 6d 2d  t *pSel = pFrom-
1dc20 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20  >pSelect;.      
1dc30 2f 2a 20 41 20 73 75 62 2d 71 75 65 72 79 20 69  /* A sub-query i
1dc40 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
1dc50 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20 2a 2f  e of a SELECT */
1dc60 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1dc70 53 65 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  Sel!=0 );.      
1dc80 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70  assert( pFrom->p
1dc90 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  Tab==0 );.      
1dca0 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63  sqlite3WalkSelec
1dcb0 74 28 70 57 61 6c 6b 65 72 2c 20 70 53 65 6c 29  t(pWalker, pSel)
1dcc0 3b 0a 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70  ;.      pFrom->p
1dcd0 54 61 62 20 3d 20 70 54 61 62 20 3d 20 73 71 6c  Tab = pTab = sql
1dce0 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
1dcf0 28 64 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c  (db, sizeof(Tabl
1dd00 65 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  e));.      if( p
1dd10 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Tab==0 ) return 
1dd20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20  WRC_Abort;.     
1dd30 20 70 54 61 62 2d 3e 6e 52 65 66 20 3d 20 31 3b   pTab->nRef = 1;
1dd40 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61  .      pTab->zNa
1dd50 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  me = sqlite3MPri
1dd60 6e 74 66 28 64 62 2c 20 22 73 71 6c 69 74 65 5f  ntf(db, "sqlite_
1dd70 73 71 5f 25 70 22 2c 20 28 76 6f 69 64 2a 29 70  sq_%p", (void*)p
1dd80 54 61 62 29 3b 0a 20 20 20 20 20 20 77 68 69 6c  Tab);.      whil
1dd90 65 28 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 20  e( pSel->pPrior 
1dda0 29 7b 20 70 53 65 6c 20 3d 20 70 53 65 6c 2d 3e  ){ pSel = pSel->
1ddb0 70 50 72 69 6f 72 3b 20 7d 0a 20 20 20 20 20 20  pPrior; }.      
1ddc0 73 65 6c 65 63 74 43 6f 6c 75 6d 6e 73 46 72 6f  selectColumnsFro
1ddd0 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  mExprList(pParse
1dde0 2c 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74 2c 20  , pSel->pEList, 
1ddf0 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 26 70 54  &pTab->nCol, &pT
1de00 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20 20 20 20 20  ab->aCol);.     
1de10 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d   pTab->iPKey = -
1de20 31 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e  1;.      pTab->n
1de30 52 6f 77 45 73 74 20 3d 20 31 30 34 38 35 37 36  RowEst = 1048576
1de40 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 74 61  ;.      pTab->ta
1de50 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 45 70 68  bFlags |= TF_Eph
1de60 65 6d 65 72 61 6c 3b 0a 23 65 6e 64 69 66 0a 20  emeral;.#endif. 
1de70 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1de80 2f 2a 20 41 6e 20 6f 72 64 69 6e 61 72 79 20 74  /* An ordinary t
1de90 61 62 6c 65 20 6f 72 20 76 69 65 77 20 6e 61 6d  able or view nam
1dea0 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  e in the FROM cl
1deb0 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 61 73  ause */.      as
1dec0 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61  sert( pFrom->pTa
1ded0 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 46  b==0 );.      pF
1dee0 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62  rom->pTab = pTab
1def0 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65   = sqlite3Locate
1df00 54 61 62 6c 65 49 74 65 6d 28 70 50 61 72 73 65  TableItem(pParse
1df10 2c 20 30 2c 20 70 46 72 6f 6d 29 3b 0a 20 20 20  , 0, pFrom);.   
1df20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29     if( pTab==0 )
1df30 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
1df40 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61  t;.      if( pTa
1df50 62 2d 3e 6e 52 65 66 3d 3d 30 78 66 66 66 66 20  b->nRef==0xffff 
1df60 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1df70 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
1df80 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 72 65 66  e, "too many ref
1df90 65 72 65 6e 63 65 73 20 74 6f 20 5c 22 25 73 5c  erences to \"%s\
1dfa0 22 3a 20 6d 61 78 20 36 35 35 33 35 22 2c 0a 20  ": max 65535",. 
1dfb0 20 20 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e            pTab->
1dfc0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
1dfd0 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 30 3b  pFrom->pTab = 0;
1dfe0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1dff0 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20  WRC_Abort;.     
1e000 20 7d 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e   }.      pTab->n
1e010 52 65 66 2b 2b 3b 0a 23 69 66 20 21 64 65 66 69  Ref++;.#if !defi
1e020 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
1e030 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65  VIEW) || !define
1e040 64 20 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  d (SQLITE_OMIT_V
1e050 49 52 54 55 41 4c 54 41 42 4c 45 29 0a 20 20 20  IRTUALTABLE).   
1e060 20 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65     if( pTab->pSe
1e070 6c 65 63 74 20 7c 7c 20 49 73 56 69 72 74 75 61  lect || IsVirtua
1e080 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20  l(pTab) ){.     
1e090 20 20 20 2f 2a 20 57 65 20 72 65 61 63 68 20 68     /* We reach h
1e0a0 65 72 65 20 69 66 20 74 68 65 20 6e 61 6d 65 64  ere if the named
1e0b0 20 74 61 62 6c 65 20 69 73 20 61 20 72 65 61 6c   table is a real
1e0c0 6c 79 20 61 20 76 69 65 77 20 2a 2f 0a 20 20 20  ly a view */.   
1e0d0 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
1e0e0 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d  ViewGetColumnNam
1e0f0 65 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 29  es(pParse, pTab)
1e100 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62   ) return WRC_Ab
1e110 6f 72 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73  ort;.        ass
1e120 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 53 65 6c  ert( pFrom->pSel
1e130 65 63 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ect==0 );.      
1e140 20 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74    pFrom->pSelect
1e150 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
1e160 44 75 70 28 64 62 2c 20 70 54 61 62 2d 3e 70 53  Dup(db, pTab->pS
1e170 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20 20 20  elect, 0);.     
1e180 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65     sqlite3WalkSe
1e190 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c 20 70 46  lect(pWalker, pF
1e1a0 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20  rom->pSelect);. 
1e1b0 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
1e1c0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4c 6f 63 61    }..    /* Loca
1e1d0 74 65 20 74 68 65 20 69 6e 64 65 78 20 6e 61 6d  te the index nam
1e1e0 65 64 20 62 79 20 74 68 65 20 49 4e 44 45 58 45  ed by the INDEXE
1e1f0 44 20 42 59 20 63 6c 61 75 73 65 2c 20 69 66 20  D BY clause, if 
1e200 61 6e 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  any. */.    if( 
1e210 73 71 6c 69 74 65 33 49 6e 64 65 78 65 64 42 79  sqlite3IndexedBy
1e220 4c 6f 6f 6b 75 70 28 70 50 61 72 73 65 2c 20 70  Lookup(pParse, p
1e230 46 72 6f 6d 29 20 29 7b 0a 20 20 20 20 20 20 72  From) ){.      r
1e240 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
1e250 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
1e260 20 50 72 6f 63 65 73 73 20 4e 41 54 55 52 41 4c   Process NATURAL
1e270 20 6b 65 79 77 6f 72 64 73 2c 20 61 6e 64 20 4f   keywords, and O
1e280 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75  N and USING clau
1e290 73 65 73 20 6f 66 20 6a 6f 69 6e 73 2e 0a 20 20  ses of joins..  
1e2a0 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  */.  if( db->mal
1e2b0 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 73 71 6c  locFailed || sql
1e2c0 69 74 65 50 72 6f 63 65 73 73 4a 6f 69 6e 28 70  iteProcessJoin(p
1e2d0 50 61 72 73 65 2c 20 70 29 20 29 7b 0a 20 20 20  Parse, p) ){.   
1e2e0 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
1e2f0 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 6f 72  t;.  }..  /* For
1e300 20 65 76 65 72 79 20 22 2a 22 20 74 68 61 74 20   every "*" that 
1e310 6f 63 63 75 72 73 20 69 6e 20 74 68 65 20 63 6f  occurs in the co
1e320 6c 75 6d 6e 20 6c 69 73 74 2c 20 69 6e 73 65 72  lumn list, inser
1e330 74 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 0a 20  t the names of. 
1e340 20 2a 2a 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20   ** all columns 
1e350 69 6e 20 61 6c 6c 20 74 61 62 6c 65 73 2e 20 20  in all tables.  
1e360 41 6e 64 20 66 6f 72 20 65 76 65 72 79 20 54 41  And for every TA
1e370 42 4c 45 2e 2a 20 69 6e 73 65 72 74 20 74 68 65  BLE.* insert the
1e380 20 6e 61 6d 65 73 0a 20 20 2a 2a 20 6f 66 20 61   names.  ** of a
1e390 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 54 41  ll columns in TA
1e3a0 42 4c 45 2e 20 20 54 68 65 20 70 61 72 73 65 72  BLE.  The parser
1e3b0 20 69 6e 73 65 72 74 65 64 20 61 20 73 70 65 63   inserted a spec
1e3c0 69 61 6c 20 65 78 70 72 65 73 73 69 6f 6e 0a 20  ial expression. 
1e3d0 20 2a 2a 20 77 69 74 68 20 74 68 65 20 54 4b 5f   ** with the TK_
1e3e0 41 4c 4c 20 6f 70 65 72 61 74 6f 72 20 66 6f 72  ALL operator for
1e3f0 20 65 61 63 68 20 22 2a 22 20 74 68 61 74 20 69   each "*" that i
1e400 74 20 66 6f 75 6e 64 20 69 6e 20 74 68 65 20 63  t found in the c
1e410 6f 6c 75 6d 6e 20 6c 69 73 74 2e 0a 20 20 2a 2a  olumn list..  **
1e420 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   The following c
1e430 6f 64 65 20 6a 75 73 74 20 68 61 73 20 74 6f 20  ode just has to 
1e440 6c 6f 63 61 74 65 20 74 68 65 20 54 4b 5f 41 4c  locate the TK_AL
1e450 4c 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 6e  L expressions an
1e460 64 20 65 78 70 61 6e 64 0a 20 20 2a 2a 20 65 61  d expand.  ** ea
1e470 63 68 20 6f 6e 65 20 74 6f 20 74 68 65 20 6c 69  ch one to the li
1e480 73 74 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e  st of all column
1e490 73 20 69 6e 20 61 6c 6c 20 74 61 62 6c 65 73 2e  s in all tables.
1e4a0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66  .  **.  ** The f
1e4b0 69 72 73 74 20 6c 6f 6f 70 20 6a 75 73 74 20 63  irst loop just c
1e4c0 68 65 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20  hecks to see if 
1e4d0 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 22 2a  there are any "*
1e4e0 22 20 6f 70 65 72 61 74 6f 72 73 0a 20 20 2a 2a  " operators.  **
1e4f0 20 74 68 61 74 20 6e 65 65 64 20 65 78 70 61 6e   that need expan
1e500 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  ding..  */.  for
1e510 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e  (k=0; k<pEList->
1e520 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20  nExpr; k++){.   
1e530 20 70 45 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b   pE = pEList->a[
1e540 6b 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66  k].pExpr;.    if
1e550 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c  ( pE->op==TK_ALL
1e560 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 61 73   ) break;.    as
1e570 73 65 72 74 28 20 70 45 2d 3e 6f 70 21 3d 54 4b  sert( pE->op!=TK
1e580 5f 44 4f 54 20 7c 7c 20 70 45 2d 3e 70 52 69 67  _DOT || pE->pRig
1e590 68 74 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  ht!=0 );.    ass
1e5a0 65 72 74 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f  ert( pE->op!=TK_
1e5b0 44 4f 54 20 7c 7c 20 28 70 45 2d 3e 70 4c 65 66  DOT || (pE->pLef
1e5c0 74 21 3d 30 20 26 26 20 70 45 2d 3e 70 4c 65 66  t!=0 && pE->pLef
1e5d0 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 29 20 29 3b  t->op==TK_ID) );
1e5e0 0a 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d  .    if( pE->op=
1e5f0 3d 54 4b 5f 44 4f 54 20 26 26 20 70 45 2d 3e 70  =TK_DOT && pE->p
1e600 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c  Right->op==TK_AL
1e610 4c 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20  L ) break;.  }. 
1e620 20 69 66 28 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e   if( k<pEList->n
1e630 45 78 70 72 20 29 7b 0a 20 20 20 20 2f 2a 0a 20  Expr ){.    /*. 
1e640 20 20 20 2a 2a 20 49 66 20 77 65 20 67 65 74 20     ** If we get 
1e650 68 65 72 65 20 69 74 20 6d 65 61 6e 73 20 74 68  here it means th
1e660 65 20 72 65 73 75 6c 74 20 73 65 74 20 63 6f 6e  e result set con
1e670 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72  tains one or mor
1e680 65 20 22 2a 22 0a 20 20 20 20 2a 2a 20 6f 70 65  e "*".    ** ope
1e690 72 61 74 6f 72 73 20 74 68 61 74 20 6e 65 65 64  rators that need
1e6a0 20 74 6f 20 62 65 20 65 78 70 61 6e 64 65 64 2e   to be expanded.
1e6b0 20 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 65    Loop through e
1e6c0 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e 0a 20  ach expression. 
1e6d0 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 72 65 73     ** in the res
1e6e0 75 6c 74 20 73 65 74 20 61 6e 64 20 65 78 70 61  ult set and expa
1e6f0 6e 64 20 74 68 65 6d 20 6f 6e 65 20 62 79 20 6f  nd them one by o
1e700 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  ne..    */.    s
1e710 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
1e720 74 65 6d 20 2a 61 20 3d 20 70 45 4c 69 73 74 2d  tem *a = pEList-
1e730 3e 61 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74  >a;.    ExprList
1e740 20 2a 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20   *pNew = 0;.    
1e750 69 6e 74 20 66 6c 61 67 73 20 3d 20 70 50 61 72  int flags = pPar
1e760 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 3b 0a 20  se->db->flags;. 
1e770 20 20 20 69 6e 74 20 6c 6f 6e 67 4e 61 6d 65 73     int longNames
1e780 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49   = (flags & SQLI
1e790 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29  TE_FullColNames)
1e7a0 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20  !=0.            
1e7b0 20 20 20 20 20 20 20 20 20 20 26 26 20 28 66 6c            && (fl
1e7c0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 68 6f  ags & SQLITE_Sho
1e7d0 72 74 43 6f 6c 4e 61 6d 65 73 29 3d 3d 30 3b 0a  rtColNames)==0;.
1e7e0 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 70 72 6f  .    /* When pro
1e7f0 63 65 73 73 69 6e 67 20 46 52 4f 4d 2d 63 6c 61  cessing FROM-cla
1e800 75 73 65 20 73 75 62 71 75 65 72 69 65 73 2c 20  use subqueries, 
1e810 69 74 20 69 73 20 61 6c 77 61 79 73 20 74 68 65  it is always the
1e820 20 63 61 73 65 0a 20 20 20 20 2a 2a 20 74 68 61   case.    ** tha
1e830 74 20 66 75 6c 6c 5f 63 6f 6c 75 6d 6e 5f 6e 61  t full_column_na
1e840 6d 65 73 3d 4f 46 46 20 61 6e 64 20 73 68 6f 72  mes=OFF and shor
1e850 74 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 73 3d 4f  t_column_names=O
1e860 4e 2e 20 20 54 68 65 0a 20 20 20 20 2a 2a 20 73  N.  The.    ** s
1e870 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f  qlite3ResultSetO
1e880 66 53 65 6c 65 63 74 28 29 20 72 6f 75 74 69 6e  fSelect() routin
1e890 65 20 6d 61 6b 65 73 20 69 74 20 73 6f 2e 20 2a  e makes it so. *
1e8a0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  /.    assert( (p
1e8b0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
1e8c0 4e 65 73 74 65 64 46 72 6f 6d 29 3d 3d 30 0a 20  NestedFrom)==0. 
1e8d0 20 20 20 20 20 20 20 20 20 7c 7c 20 28 28 66 6c           || ((fl
1e8e0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 75 6c  ags & SQLITE_Ful
1e8f0 6c 43 6f 6c 4e 61 6d 65 73 29 3d 3d 30 20 26 26  lColNames)==0 &&
1e900 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28  .              (
1e910 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53  flags & SQLITE_S
1e920 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 29 21 3d 30  hortColNames)!=0
1e930 29 20 29 3b 0a 0a 20 20 20 20 66 6f 72 28 6b 3d  ) );..    for(k=
1e940 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  0; k<pEList->nEx
1e950 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; k++){.      
1e960 70 45 20 3d 20 61 5b 6b 5d 2e 70 45 78 70 72 3b  pE = a[k].pExpr;
1e970 0a 20 20 20 20 20 20 70 52 69 67 68 74 20 3d 20  .      pRight = 
1e980 70 45 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20  pE->pRight;.    
1e990 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e 6f 70    assert( pE->op
1e9a0 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 52 69 67  !=TK_DOT || pRig
1e9b0 68 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  ht!=0 );.      i
1e9c0 66 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 41 4c  f( pE->op!=TK_AL
1e9d0 4c 20 26 26 20 28 70 45 2d 3e 6f 70 21 3d 54 4b  L && (pE->op!=TK
1e9e0 5f 44 4f 54 20 7c 7c 20 70 52 69 67 68 74 2d 3e  _DOT || pRight->
1e9f0 6f 70 21 3d 54 4b 5f 41 4c 4c 29 20 29 7b 0a 20  op!=TK_ALL) ){. 
1ea00 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 70         /* This p
1ea10 61 72 74 69 63 75 6c 61 72 20 65 78 70 72 65 73  articular expres
1ea20 73 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 6e 65  sion does not ne
1ea30 65 64 20 74 6f 20 62 65 20 65 78 70 61 6e 64 65  ed to be expande
1ea40 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  d..        */.  
1ea50 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c        pNew = sql
1ea60 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
1ea70 6e 64 28 70 50 61 72 73 65 2c 20 70 4e 65 77 2c  nd(pParse, pNew,
1ea80 20 61 5b 6b 5d 2e 70 45 78 70 72 29 3b 0a 20 20   a[k].pExpr);.  
1ea90 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 20 29        if( pNew )
1eaa0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77  {.          pNew
1eab0 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d  ->a[pNew->nExpr-
1eac0 31 5d 2e 7a 4e 61 6d 65 20 3d 20 61 5b 6b 5d 2e  1].zName = a[k].
1ead0 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20  zName;.         
1eae0 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e   pNew->a[pNew->n
1eaf0 45 78 70 72 2d 31 5d 2e 7a 53 70 61 6e 20 3d 20  Expr-1].zSpan = 
1eb00 61 5b 6b 5d 2e 7a 53 70 61 6e 3b 0a 20 20 20 20  a[k].zSpan;.    
1eb10 20 20 20 20 20 20 61 5b 6b 5d 2e 7a 4e 61 6d 65        a[k].zName
1eb20 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
1eb30 61 5b 6b 5d 2e 7a 53 70 61 6e 20 3d 20 30 3b 0a  a[k].zSpan = 0;.
1eb40 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1eb50 20 20 61 5b 6b 5d 2e 70 45 78 70 72 20 3d 20 30    a[k].pExpr = 0
1eb60 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1eb70 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 65         /* This e
1eb80 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 22  xpression is a "
1eb90 2a 22 20 6f 72 20 61 20 22 54 41 42 4c 45 2e 2a  *" or a "TABLE.*
1eba0 22 20 61 6e 64 20 6e 65 65 64 73 20 74 6f 20 62  " and needs to b
1ebb0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70  e.        ** exp
1ebc0 61 6e 64 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20  anded. */.      
1ebd0 20 20 69 6e 74 20 74 61 62 6c 65 53 65 65 6e 20    int tableSeen 
1ebe0 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 53 65 74  = 0;      /* Set
1ebf0 20 74 6f 20 31 20 77 68 65 6e 20 54 41 42 4c 45   to 1 when TABLE
1ec00 20 6d 61 74 63 68 65 73 20 2a 2f 0a 20 20 20 20   matches */.    
1ec10 20 20 20 20 63 68 61 72 20 2a 7a 54 4e 61 6d 65      char *zTName
1ec20 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 74   = 0;       /* t
1ec30 65 78 74 20 6f 66 20 6e 61 6d 65 20 6f 66 20 54  ext of name of T
1ec40 41 42 4c 45 20 2a 2f 0a 20 20 20 20 20 20 20 20  ABLE */.        
1ec50 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44  if( pE->op==TK_D
1ec60 4f 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OT ){.          
1ec70 61 73 73 65 72 74 28 20 70 45 2d 3e 70 4c 65 66  assert( pE->pLef
1ec80 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  t!=0 );.        
1ec90 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
1eca0 61 73 50 72 6f 70 65 72 74 79 28 70 45 2d 3e 70  asProperty(pE->p
1ecb0 4c 65 66 74 2c 20 45 50 5f 49 6e 74 56 61 6c 75  Left, EP_IntValu
1ecc0 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e) );.          
1ecd0 7a 54 4e 61 6d 65 20 3d 20 70 45 2d 3e 70 4c 65  zTName = pE->pLe
1ece0 66 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20  ft->u.zToken;.  
1ecf0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1ed00 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70  for(i=0, pFrom=p
1ed10 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54  TabList->a; i<pT
1ed20 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  abList->nSrc; i+
1ed30 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20  +, pFrom++){.   
1ed40 20 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54         Table *pT
1ed50 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62  ab = pFrom->pTab
1ed60 3b 0a 20 20 20 20 20 20 20 20 20 20 53 65 6c 65  ;.          Sele
1ed70 63 74 20 2a 70 53 75 62 20 3d 20 70 46 72 6f 6d  ct *pSub = pFrom
1ed80 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20  ->pSelect;.     
1ed90 20 20 20 20 20 63 68 61 72 20 2a 7a 54 61 62 4e       char *zTabN
1eda0 61 6d 65 20 3d 20 70 46 72 6f 6d 2d 3e 7a 41 6c  ame = pFrom->zAl
1edb0 69 61 73 3b 0a 20 20 20 20 20 20 20 20 20 20 63  ias;.          c
1edc0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 63 68 65  onst char *zSche
1edd0 6d 61 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20  maName = 0;.    
1ede0 20 20 20 20 20 20 69 6e 74 20 69 44 62 3b 0a 20        int iDb;. 
1edf0 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 61           if( zTa
1ee00 62 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  bName==0 ){.    
1ee10 20 20 20 20 20 20 20 20 7a 54 61 62 4e 61 6d 65          zTabName
1ee20 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a   = pTab->zName;.
1ee30 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1ee40 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61        if( db->ma
1ee50 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 62 72 65  llocFailed ) bre
1ee60 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ak;.          if
1ee70 28 20 70 53 75 62 3d 3d 30 20 7c 7c 20 28 70 53  ( pSub==0 || (pS
1ee80 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  ub->selFlags & S
1ee90 46 5f 4e 65 73 74 65 64 46 72 6f 6d 29 3d 3d 30  F_NestedFrom)==0
1eea0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1eeb0 70 53 75 62 20 3d 20 30 3b 0a 20 20 20 20 20 20  pSub = 0;.      
1eec0 20 20 20 20 20 20 69 66 28 20 7a 54 4e 61 6d 65        if( zTName
1eed0 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43   && sqlite3StrIC
1eee0 6d 70 28 7a 54 4e 61 6d 65 2c 20 7a 54 61 62 4e  mp(zTName, zTabN
1eef0 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ame)!=0 ){.     
1ef00 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
1ef10 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  e;.            }
1ef20 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 44 62  .            iDb
1ef30 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
1ef40 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62  ToIndex(db, pTab
1ef50 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
1ef60 20 20 20 20 20 20 20 20 7a 53 63 68 65 6d 61 4e          zSchemaN
1ef70 61 6d 65 20 3d 20 69 44 62 3e 3d 30 20 3f 20 64  ame = iDb>=0 ? d
1ef80 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d  b->aDb[iDb].zNam
1ef90 65 20 3a 20 22 2a 22 3b 0a 20 20 20 20 20 20 20  e : "*";.       
1efa0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 66     }.          f
1efb0 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e  or(j=0; j<pTab->
1efc0 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  nCol; j++){.    
1efd0 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e          char *zN
1efe0 61 6d 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c  ame = pTab->aCol
1eff0 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  [j].zName;.     
1f000 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f         char *zCo
1f010 6c 6e 61 6d 65 3b 20 20 2f 2a 20 54 68 65 20 63  lname;  /* The c
1f020 6f 6d 70 75 74 65 64 20 63 6f 6c 75 6d 6e 20 6e  omputed column n
1f030 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ame */.         
1f040 20 20 20 63 68 61 72 20 2a 7a 54 6f 46 72 65 65     char *zToFree
1f050 3b 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 65 64 20  ;   /* Malloced 
1f060 73 74 72 69 6e 67 20 74 68 61 74 20 6e 65 65 64  string that need
1f070 73 20 74 6f 20 62 65 20 66 72 65 65 64 20 2a 2f  s to be freed */
1f080 0a 20 20 20 20 20 20 20 20 20 20 20 20 54 6f 6b  .            Tok
1f090 65 6e 20 73 43 6f 6c 6e 61 6d 65 3b 20 20 2f 2a  en sColname;  /*
1f0a0 20 43 6f 6d 70 75 74 65 64 20 63 6f 6c 75 6d 6e   Computed column
1f0b0 20 6e 61 6d 65 20 61 73 20 61 20 74 6f 6b 65 6e   name as a token
1f0c0 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 20 20 20   */..           
1f0d0 20 61 73 73 65 72 74 28 20 7a 4e 61 6d 65 20 29   assert( zName )
1f0e0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
1f0f0 28 20 7a 54 4e 61 6d 65 20 26 26 20 70 53 75 62  ( zTName && pSub
1f100 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26  .             &&
1f110 20 73 71 6c 69 74 65 33 4d 61 74 63 68 53 70 61   sqlite3MatchSpa
1f120 6e 4e 61 6d 65 28 70 53 75 62 2d 3e 70 45 4c 69  nName(pSub->pELi
1f130 73 74 2d 3e 61 5b 6a 5d 2e 7a 53 70 61 6e 2c 20  st->a[j].zSpan, 
1f140 30 2c 20 7a 54 4e 61 6d 65 2c 20 30 29 3d 3d 30  0, zTName, 0)==0
1f150 0a 20 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a  .            ){.
1f160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
1f170 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
1f180 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20      }..         
1f190 20 20 20 2f 2a 20 49 66 20 61 20 63 6f 6c 75 6d     /* If a colum
1f1a0 6e 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 27  n is marked as '
1f1b0 68 69 64 64 65 6e 27 20 28 63 75 72 72 65 6e 74  hidden' (current
1f1c0 6c 79 20 6f 6e 6c 79 20 70 6f 73 73 69 62 6c 65  ly only possible
1f1d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
1f1e0 66 6f 72 20 76 69 72 74 75 61 6c 20 74 61 62 6c  for virtual tabl
1f1f0 65 73 29 2c 20 64 6f 20 6e 6f 74 20 69 6e 63 6c  es), do not incl
1f200 75 64 65 20 69 74 20 69 6e 20 74 68 65 20 65 78  ude it in the ex
1f210 70 61 6e 64 65 64 0a 20 20 20 20 20 20 20 20 20  panded.         
1f220 20 20 20 2a 2a 20 72 65 73 75 6c 74 2d 73 65 74     ** result-set
1f230 20 6c 69 73 74 2e 0a 20 20 20 20 20 20 20 20 20   list..         
1f240 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
1f250 20 20 69 66 28 20 49 73 48 69 64 64 65 6e 43 6f    if( IsHiddenCo
1f260 6c 75 6d 6e 28 26 70 54 61 62 2d 3e 61 43 6f 6c  lumn(&pTab->aCol
1f270 5b 6a 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  [j]) ){.        
1f280 20 20 20 20 20 20 61 73 73 65 72 74 28 49 73 56        assert(IsV
1f290 69 72 74 75 61 6c 28 70 54 61 62 29 29 3b 0a 20  irtual(pTab));. 
1f2a0 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
1f2b0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
1f2c0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
1f2d0 20 74 61 62 6c 65 53 65 65 6e 20 3d 20 31 3b 0a   tableSeen = 1;.
1f2e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
1f2f0 20 69 3e 30 20 26 26 20 7a 54 4e 61 6d 65 3d 3d   i>0 && zTName==
1f300 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
1f310 20 20 20 69 66 28 20 28 70 46 72 6f 6d 2d 3e 6a     if( (pFrom->j
1f320 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4e 41 54  ointype & JT_NAT
1f330 55 52 41 4c 29 21 3d 30 0a 20 20 20 20 20 20 20  URAL)!=0.       
1f340 20 20 20 20 20 20 20 20 20 26 26 20 74 61 62 6c           && tabl
1f350 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65 78 28  eAndColumnIndex(
1f360 70 54 61 62 4c 69 73 74 2c 20 69 2c 20 7a 4e 61  pTabList, i, zNa
1f370 6d 65 2c 20 30 2c 20 30 29 0a 20 20 20 20 20 20  me, 0, 0).      
1f380 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
1f390 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
1f3a0 20 61 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 2c   a NATURAL join,
1f3b0 20 6f 6d 69 74 20 74 68 65 20 6a 6f 69 6e 20 63   omit the join c
1f3c0 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20 74 68 65 20  olumns from the 
1f3d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1f3e0 20 2a 2a 20 74 61 62 6c 65 20 74 6f 20 74 68 65   ** table to the
1f3f0 20 72 69 67 68 74 20 6f 66 20 74 68 65 20 6a 6f   right of the jo
1f400 69 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  in */.          
1f410 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
1f420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
1f430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
1f440 28 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 49  ( sqlite3IdListI
1f450 6e 64 65 78 28 70 46 72 6f 6d 2d 3e 70 55 73 69  ndex(pFrom->pUsi
1f460 6e 67 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b  ng, zName)>=0 ){
1f470 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1f480 20 2f 2a 20 49 6e 20 61 20 6a 6f 69 6e 20 77 69   /* In a join wi
1f490 74 68 20 61 20 55 53 49 4e 47 20 63 6c 61 75 73  th a USING claus
1f4a0 65 2c 20 6f 6d 69 74 20 63 6f 6c 75 6d 6e 73 20  e, omit columns 
1f4b0 69 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20 20  in the.         
1f4c0 20 20 20 20 20 20 20 2a 2a 20 75 73 69 6e 67 20         ** using 
1f4d0 63 6c 61 75 73 65 20 66 72 6f 6d 20 74 68 65 20  clause from the 
1f4e0 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 72 69 67  table on the rig
1f4f0 68 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ht. */.         
1f500 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
1f510 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
1f520 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
1f530 20 20 20 20 20 20 20 20 20 20 20 70 52 69 67 68             pRigh
1f540 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28  t = sqlite3Expr(
1f550 64 62 2c 20 54 4b 5f 49 44 2c 20 7a 4e 61 6d 65  db, TK_ID, zName
1f560 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a  );.            z
1f570 43 6f 6c 6e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b  Colname = zName;
1f580 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 54 6f  .            zTo
1f590 46 72 65 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Free = 0;.      
1f5a0 20 20 20 20 20 20 69 66 28 20 6c 6f 6e 67 4e 61        if( longNa
1f5b0 6d 65 73 20 7c 7c 20 70 54 61 62 4c 69 73 74 2d  mes || pTabList-
1f5c0 3e 6e 53 72 63 3e 31 20 29 7b 0a 20 20 20 20 20  >nSrc>1 ){.     
1f5d0 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70           Expr *p
1f5e0 4c 65 66 74 3b 0a 20 20 20 20 20 20 20 20 20 20  Left;.          
1f5f0 20 20 20 20 70 4c 65 66 74 20 3d 20 73 71 6c 69      pLeft = sqli
1f600 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 49  te3Expr(db, TK_I
1f610 44 2c 20 7a 54 61 62 4e 61 6d 65 29 3b 0a 20 20  D, zTabName);.  
1f620 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
1f630 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  r = sqlite3PExpr
1f640 28 70 50 61 72 73 65 2c 20 54 4b 5f 44 4f 54 2c  (pParse, TK_DOT,
1f650 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20   pLeft, pRight, 
1f660 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
1f670 20 20 69 66 28 20 7a 53 63 68 65 6d 61 4e 61 6d    if( zSchemaNam
1f680 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  e ){.           
1f690 20 20 20 20 20 70 4c 65 66 74 20 3d 20 73 71 6c       pLeft = sql
1f6a0 69 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f  ite3Expr(db, TK_
1f6b0 49 44 2c 20 7a 53 63 68 65 6d 61 4e 61 6d 65 29  ID, zSchemaName)
1f6c0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1f6d0 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65    pExpr = sqlite
1f6e0 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
1f6f0 4b 5f 44 4f 54 2c 20 70 4c 65 66 74 2c 20 70 45  K_DOT, pLeft, pE
1f700 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  xpr, 0);.       
1f710 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1f720 20 20 20 20 20 20 20 69 66 28 20 6c 6f 6e 67 4e         if( longN
1f730 61 6d 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20  ames ){.        
1f740 20 20 20 20 20 20 20 20 7a 43 6f 6c 6e 61 6d 65          zColname
1f750 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
1f760 66 28 64 62 2c 20 22 25 73 2e 25 73 22 2c 20 7a  f(db, "%s.%s", z
1f770 54 61 62 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3b  TabName, zName);
1f780 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1f790 20 7a 54 6f 46 72 65 65 20 3d 20 7a 43 6f 6c 6e   zToFree = zColn
1f7a0 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ame;.           
1f7b0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
1f7c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1f7d0 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 70 52        pExpr = pR
1f7e0 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 20 20  ight;.          
1f7f0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
1f800 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78  pNew = sqlite3Ex
1f810 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61  prListAppend(pPa
1f820 72 73 65 2c 20 70 4e 65 77 2c 20 70 45 78 70 72  rse, pNew, pExpr
1f830 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
1f840 43 6f 6c 6e 61 6d 65 2e 7a 20 3d 20 7a 43 6f 6c  Colname.z = zCol
1f850 6e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20  name;.          
1f860 20 20 73 43 6f 6c 6e 61 6d 65 2e 6e 20 3d 20 73    sColname.n = s
1f870 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
1f880 43 6f 6c 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  Colname);.      
1f890 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1f8a0 72 4c 69 73 74 53 65 74 4e 61 6d 65 28 70 50 61  rListSetName(pPa
1f8b0 72 73 65 2c 20 70 4e 65 77 2c 20 26 73 43 6f 6c  rse, pNew, &sCol
1f8c0 6e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  name, 0);.      
1f8d0 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 20 26        if( pNew &
1f8e0 26 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  & (p->selFlags &
1f8f0 20 53 46 5f 4e 65 73 74 65 64 46 72 6f 6d 29 21   SF_NestedFrom)!
1f900 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
1f910 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
1f920 69 73 74 5f 69 74 65 6d 20 2a 70 58 20 3d 20 26  ist_item *pX = &
1f930 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45  pNew->a[pNew->nE
1f940 78 70 72 2d 31 5d 3b 0a 20 20 20 20 20 20 20 20  xpr-1];.        
1f950 20 20 20 20 20 20 69 66 28 20 70 53 75 62 20 29        if( pSub )
1f960 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1f970 20 20 70 58 2d 3e 7a 53 70 61 6e 20 3d 20 73 71    pX->zSpan = sq
1f980 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
1f990 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 2d 3e  , pSub->pEList->
1f9a0 61 5b 6a 5d 2e 7a 53 70 61 6e 29 3b 0a 20 20 20  a[j].zSpan);.   
1f9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73               tes
1f9c0 74 63 61 73 65 28 20 70 58 2d 3e 7a 53 70 61 6e  tcase( pX->zSpan
1f9d0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ==0 );.         
1f9e0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1f9f0 20 20 20 20 20 20 20 20 20 20 20 20 70 58 2d 3e              pX->
1fa00 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74 65 33 4d  zSpan = sqlite3M
1fa10 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2e 25  Printf(db, "%s.%
1fa20 73 2e 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20  s.%s",.         
1fa30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fa40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fa50 20 20 7a 53 63 68 65 6d 61 4e 61 6d 65 2c 20 7a    zSchemaName, z
1fa60 54 61 62 4e 61 6d 65 2c 20 7a 43 6f 6c 6e 61 6d  TabName, zColnam
1fa70 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
1fa80 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 58      testcase( pX
1fa90 2d 3e 7a 53 70 61 6e 3d 3d 30 20 29 3b 0a 20 20  ->zSpan==0 );.  
1faa0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
1fab0 20 20 20 20 20 20 20 20 20 20 20 20 70 58 2d 3e              pX->
1fac0 62 53 70 61 6e 49 73 54 61 62 20 3d 20 31 3b 0a  bSpanIsTab = 1;.
1fad0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
1fae0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1faf0 33 44 62 46 72 65 65 28 64 62 2c 20 7a 54 6f 46  3DbFree(db, zToF
1fb00 72 65 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ree);.          
1fb10 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
1fb20 20 20 20 20 69 66 28 20 21 74 61 62 6c 65 53 65      if( !tableSe
1fb30 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  en ){.          
1fb40 69 66 28 20 7a 54 4e 61 6d 65 20 29 7b 0a 20 20  if( zTName ){.  
1fb50 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1fb60 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
1fb70 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65  , "no such table
1fb80 3a 20 25 73 22 2c 20 7a 54 4e 61 6d 65 29 3b 0a  : %s", zTName);.
1fb90 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
1fba0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
1fbb0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
1fbc0 72 73 65 2c 20 22 6e 6f 20 74 61 62 6c 65 73 20  rse, "no tables 
1fbd0 73 70 65 63 69 66 69 65 64 22 29 3b 0a 20 20 20  specified");.   
1fbe0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1fbf0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
1fc00 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
1fc10 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
1fc20 45 4c 69 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70  EList);.    p->p
1fc30 45 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20  EList = pNew;.  
1fc40 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  }.#if SQLITE_MAX
1fc50 5f 43 4f 4c 55 4d 4e 0a 20 20 69 66 28 20 70 2d  _COLUMN.  if( p-
1fc60 3e 70 45 4c 69 73 74 20 26 26 20 70 2d 3e 70 45  >pEList && p->pE
1fc70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 64 62 2d 3e  List->nExpr>db->
1fc80 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
1fc90 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20 29 7b 0a 20  MIT_COLUMN] ){. 
1fca0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
1fcb0 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20  sg(pParse, "too 
1fcc0 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  many columns in 
1fcd0 72 65 73 75 6c 74 20 73 65 74 22 29 3b 0a 20 20  result set");.  
1fce0 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  }.#endif.  retur
1fcf0 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
1fd00 7d 0a 0a 2f 2a 0a 2a 2a 20 4e 6f 2d 6f 70 20 72  }../*.** No-op r
1fd10 6f 75 74 69 6e 65 20 66 6f 72 20 74 68 65 20 70  outine for the p
1fd20 61 72 73 65 2d 74 72 65 65 20 77 61 6c 6b 65 72  arse-tree walker
1fd30 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69  ..**.** When thi
1fd40 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65  s routine is the
1fd50 20 57 61 6c 6b 65 72 2e 78 45 78 70 72 43 61 6c   Walker.xExprCal
1fd60 6c 62 61 63 6b 20 74 68 65 6e 20 65 78 70 72 65  lback then expre
1fd70 73 73 69 6f 6e 20 74 72 65 65 73 0a 2a 2a 20 61  ssion trees.** a
1fd80 72 65 20 77 61 6c 6b 65 64 20 77 69 74 68 6f 75  re walked withou
1fd90 74 20 61 6e 79 20 61 63 74 69 6f 6e 73 20 62 65  t any actions be
1fda0 69 6e 67 20 74 61 6b 65 6e 20 61 74 20 65 61 63  ing taken at eac
1fdb0 68 20 6e 6f 64 65 2e 20 20 50 72 65 73 75 6d 61  h node.  Presuma
1fdc0 62 6c 79 2c 0a 2a 2a 20 77 68 65 6e 20 74 68 69  bly,.** when thi
1fdd0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
1fde0 64 20 66 6f 72 20 57 61 6c 6b 65 72 2e 78 45 78  d for Walker.xEx
1fdf0 70 72 43 61 6c 6c 62 61 63 6b 20 74 68 65 6e 20  prCallback then 
1fe00 0a 2a 2a 20 57 61 6c 6b 65 72 2e 78 53 65 6c 65  .** Walker.xSele
1fe10 63 74 43 61 6c 6c 62 61 63 6b 20 69 73 20 73 65  ctCallback is se
1fe20 74 20 74 6f 20 64 6f 20 73 6f 6d 65 74 68 69 6e  t to do somethin
1fe30 67 20 75 73 65 66 75 6c 20 66 6f 72 20 65 76 65  g useful for eve
1fe40 72 79 20 0a 2a 2a 20 73 75 62 71 75 65 72 79 20  ry .** subquery 
1fe50 69 6e 20 74 68 65 20 70 61 72 73 65 72 20 74 72  in the parser tr
1fe60 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ee..*/.static in
1fe70 74 20 65 78 70 72 57 61 6c 6b 4e 6f 6f 70 28 57  t exprWalkNoop(W
1fe80 61 6c 6b 65 72 20 2a 4e 6f 74 55 73 65 64 2c 20  alker *NotUsed, 
1fe90 45 78 70 72 20 2a 4e 6f 74 55 73 65 64 32 29 7b  Expr *NotUsed2){
1fea0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
1feb0 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f  TER2(NotUsed, No
1fec0 74 55 73 65 64 32 29 3b 0a 20 20 72 65 74 75 72  tUsed2);.  retur
1fed0 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
1fee0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
1fef0 75 74 69 6e 65 20 22 65 78 70 61 6e 64 73 22 20  utine "expands" 
1ff00 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
1ff10 6e 74 20 61 6e 64 20 61 6c 6c 20 6f 66 20 69 74  nt and all of it
1ff20 73 20 73 75 62 71 75 65 72 69 65 73 2e 0a 2a 2a  s subqueries..**
1ff30 20 46 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20   For additional 
1ff40 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 77  information on w
1ff50 68 61 74 20 69 74 20 6d 65 61 6e 73 20 74 6f 20  hat it means to 
1ff60 22 65 78 70 61 6e 64 22 20 61 20 53 45 4c 45 43  "expand" a SELEC
1ff70 54 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2c 20  T.** statement, 
1ff80 73 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20  see the comment 
1ff90 6f 6e 20 74 68 65 20 73 65 6c 65 63 74 45 78 70  on the selectExp
1ffa0 61 6e 64 20 77 6f 72 6b 65 72 20 63 61 6c 6c 62  and worker callb
1ffb0 61 63 6b 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a  ack above..**.**
1ffc0 20 45 78 70 61 6e 64 69 6e 67 20 61 20 53 45 4c   Expanding a SEL
1ffd0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69 73  ECT statement is
1ffe0 20 74 68 65 20 66 69 72 73 74 20 73 74 65 70 20   the first step 
1fff0 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 61 0a  in processing a.
20000 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  ** SELECT statem
20010 65 6e 74 2e 20 20 54 68 65 20 53 45 4c 45 43 54  ent.  The SELECT
20020 20 73 74 61 74 65 6d 65 6e 74 20 6d 75 73 74 20   statement must 
20030 62 65 20 65 78 70 61 6e 64 65 64 20 62 65 66 6f  be expanded befo
20040 72 65 0a 2a 2a 20 6e 61 6d 65 20 72 65 73 6f 6c  re.** name resol
20050 75 74 69 6f 6e 20 69 73 20 70 65 72 66 6f 72 6d  ution is perform
20060 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79  ed..**.** If any
20070 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67  thing goes wrong
20080 2c 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  , an error messa
20090 67 65 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e  ge is written in
200a0 74 6f 20 70 50 61 72 73 65 2e 0a 2a 2a 20 54 68  to pParse..** Th
200b0 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
200c0 6f 6e 20 63 61 6e 20 64 65 74 65 63 74 20 74 68  on can detect th
200d0 65 20 70 72 6f 62 6c 65 6d 20 62 79 20 6c 6f 6f  e problem by loo
200e0 6b 69 6e 67 20 61 74 20 70 50 61 72 73 65 2d 3e  king at pParse->
200f0 6e 45 72 72 0a 2a 2a 20 61 6e 64 2f 6f 72 20 70  nErr.** and/or p
20100 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
20110 63 46 61 69 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74  cFailed..*/.stat
20120 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 53  ic void sqlite3S
20130 65 6c 65 63 74 45 78 70 61 6e 64 28 50 61 72 73  electExpand(Pars
20140 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63  e *pParse, Selec
20150 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 57  t *pSelect){.  W
20160 61 6c 6b 65 72 20 77 3b 0a 20 20 6d 65 6d 73 65  alker w;.  memse
20170 74 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28  t(&w, 0, sizeof(
20180 77 29 29 3b 0a 20 20 77 2e 78 45 78 70 72 43 61  w));.  w.xExprCa
20190 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72 57 61 6c  llback = exprWal
201a0 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 70 50 61 72 73  kNoop;.  w.pPars
201b0 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 69 66  e = pParse;.  if
201c0 28 20 70 50 61 72 73 65 2d 3e 68 61 73 43 6f 6d  ( pParse->hasCom
201d0 70 6f 75 6e 64 20 29 7b 0a 20 20 20 20 77 2e 78  pound ){.    w.x
201e0 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d  SelectCallback =
201f0 20 63 6f 6e 76 65 72 74 43 6f 6d 70 6f 75 6e 64   convertCompound
20200 53 65 6c 65 63 74 54 6f 53 75 62 71 75 65 72 79  SelectToSubquery
20210 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c  ;.    sqlite3Wal
20220 6b 53 65 6c 65 63 74 28 26 77 2c 20 70 53 65 6c  kSelect(&w, pSel
20230 65 63 74 29 3b 0a 20 20 7d 0a 20 20 77 2e 78 53  ect);.  }.  w.xS
20240 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20  electCallback = 
20250 73 65 6c 65 63 74 45 78 70 61 6e 64 65 72 3b 0a  selectExpander;.
20260 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c    sqlite3WalkSel
20270 65 63 74 28 26 77 2c 20 70 53 65 6c 65 63 74 29  ect(&w, pSelect)
20280 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51  ;.}...#ifndef SQ
20290 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
202a0 52 59 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73  RY./*.** This is
202b0 20 61 20 57 61 6c 6b 65 72 2e 78 53 65 6c 65 63   a Walker.xSelec
202c0 74 43 61 6c 6c 62 61 63 6b 20 63 61 6c 6c 62 61  tCallback callba
202d0 63 6b 20 66 6f 72 20 74 68 65 20 73 71 6c 69 74  ck for the sqlit
202e0 65 33 53 65 6c 65 63 74 54 79 70 65 49 6e 66 6f  e3SelectTypeInfo
202f0 28 29 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65 2e  ().** interface.
20300 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 61 63 68 20  .**.** For each 
20310 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62 71  FROM-clause subq
20320 75 65 72 79 2c 20 61 64 64 20 43 6f 6c 75 6d 6e  uery, add Column
20330 2e 7a 54 79 70 65 20 61 6e 64 20 43 6f 6c 75 6d  .zType and Colum
20340 6e 2e 7a 43 6f 6c 6c 0a 2a 2a 20 69 6e 66 6f 72  n.zColl.** infor
20350 6d 61 74 69 6f 6e 20 74 6f 20 74 68 65 20 54 61  mation to the Ta
20360 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 68  ble structure th
20370 61 74 20 72 65 70 72 65 73 65 6e 74 73 20 74 68  at represents th
20380 65 20 72 65 73 75 6c 74 20 73 65 74 0a 2a 2a 20  e result set.** 
20390 6f 66 20 74 68 61 74 20 73 75 62 71 75 65 72 79  of that subquery
203a0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 54 61 62 6c  ..**.** The Tabl
203b0 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  e structure that
203c0 20 72 65 70 72 65 73 65 6e 74 73 20 74 68 65 20   represents the 
203d0 72 65 73 75 6c 74 20 73 65 74 20 77 61 73 20 63  result set was c
203e0 6f 6e 73 74 72 75 63 74 65 64 0a 2a 2a 20 62 79  onstructed.** by
203f0 20 73 65 6c 65 63 74 45 78 70 61 6e 64 65 72 28   selectExpander(
20400 29 20 62 75 74 20 74 68 65 20 74 79 70 65 20 61  ) but the type a
20410 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 69 6e 66  nd collation inf
20420 6f 72 6d 61 74 69 6f 6e 20 77 61 73 20 6f 6d 69  ormation was omi
20430 74 74 65 64 0a 2a 2a 20 61 74 20 74 68 61 74 20  tted.** at that 
20440 70 6f 69 6e 74 20 62 65 63 61 75 73 65 20 69 64  point because id
20450 65 6e 74 69 66 69 65 72 73 20 68 61 64 20 6e 6f  entifiers had no
20460 74 20 79 65 74 20 62 65 65 6e 20 72 65 73 6f 6c  t yet been resol
20470 76 65 64 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f  ved.  This.** ro
20480 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
20490 61 66 74 65 72 20 69 64 65 6e 74 69 66 69 65 72  after identifier
204a0 20 72 65 73 6f 6c 75 74 69 6f 6e 2e 0a 2a 2f 0a   resolution..*/.
204b0 73 74 61 74 69 63 20 69 6e 74 20 73 65 6c 65 63  static int selec
204c0 74 41 64 64 53 75 62 71 75 65 72 79 54 79 70 65  tAddSubqueryType
204d0 49 6e 66 6f 28 57 61 6c 6b 65 72 20 2a 70 57 61  Info(Walker *pWa
204e0 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 29  lker, Select *p)
204f0 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  {.  Parse *pPars
20500 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 53 72  e;.  int i;.  Sr
20510 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b  cList *pTabList;
20520 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
20530 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a 0a  t_item *pFrom;..
20540 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73 65 6c    assert( p->sel
20550 46 6c 61 67 73 20 26 20 53 46 5f 52 65 73 6f 6c  Flags & SF_Resol
20560 76 65 64 20 29 3b 0a 20 20 69 66 28 20 28 70 2d  ved );.  if( (p-
20570 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 48  >selFlags & SF_H
20580 61 73 54 79 70 65 49 6e 66 6f 29 3d 3d 30 20 29  asTypeInfo)==0 )
20590 7b 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67  {.    p->selFlag
205a0 73 20 7c 3d 20 53 46 5f 48 61 73 54 79 70 65 49  s |= SF_HasTypeI
205b0 6e 66 6f 3b 0a 20 20 20 20 70 50 61 72 73 65 20  nfo;.    pParse 
205c0 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73  = pWalker->pPars
205d0 65 3b 0a 20 20 20 20 70 54 61 62 4c 69 73 74 20  e;.    pTabList 
205e0 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20 66  = p->pSrc;.    f
205f0 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54  or(i=0, pFrom=pT
20600 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61  abList->a; i<pTa
20610 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  bList->nSrc; i++
20620 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20  , pFrom++){.    
20630 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
20640 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20 20  pFrom->pTab;.   
20650 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 54     if( ALWAYS(pT
20660 61 62 21 3d 30 29 20 26 26 20 28 70 54 61 62 2d  ab!=0) && (pTab-
20670 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 45  >tabFlags & TF_E
20680 70 68 65 6d 65 72 61 6c 29 21 3d 30 20 29 7b 0a  phemeral)!=0 ){.
20690 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 75 62          /* A sub
206a0 2d 71 75 65 72 79 20 69 6e 20 74 68 65 20 46 52  -query in the FR
206b0 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53  OM clause of a S
206c0 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20 20 20 20  ELECT */.       
206d0 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 20 3d 20   Select *pSel = 
206e0 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a  pFrom->pSelect;.
206f0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
20700 70 53 65 6c 20 29 3b 0a 20 20 20 20 20 20 20 20  pSel );.        
20710 77 68 69 6c 65 28 20 70 53 65 6c 2d 3e 70 50 72  while( pSel->pPr
20720 69 6f 72 20 29 20 70 53 65 6c 20 3d 20 70 53 65  ior ) pSel = pSe
20730 6c 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20  l->pPrior;.     
20740 20 20 20 73 65 6c 65 63 74 41 64 64 43 6f 6c 75     selectAddColu
20750 6d 6e 54 79 70 65 41 6e 64 43 6f 6c 6c 61 74 69  mnTypeAndCollati
20760 6f 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c  on(pParse, pTab,
20770 20 70 53 65 6c 29 3b 0a 20 20 20 20 20 20 7d 0a   pSel);.      }.
20780 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
20790 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
207a0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  .}.#endif.../*.*
207b0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61  * This routine a
207c0 64 64 73 20 64 61 74 61 74 79 70 65 20 61 6e 64  dds datatype and
207d0 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
207e0 6e 63 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  nce information 
207f0 74 6f 0a 2a 2a 20 74 68 65 20 54 61 62 6c 65 20  to.** the Table 
20800 73 74 72 75 63 74 75 72 65 73 20 6f 66 20 61 6c  structures of al
20810 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75  l FROM-clause su
20820 62 71 75 65 72 69 65 73 20 69 6e 20 61 0a 2a 2a  bqueries in a.**
20830 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
20840 74 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 69  t..**.** Use thi
20850 73 20 72 6f 75 74 69 6e 65 20 61 66 74 65 72 20  s routine after 
20860 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 2e  name resolution.
20870 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
20880 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41 64 64  sqlite3SelectAdd
20890 54 79 70 65 49 6e 66 6f 28 50 61 72 73 65 20 2a  TypeInfo(Parse *
208a0 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a  pParse, Select *
208b0 70 53 65 6c 65 63 74 29 7b 0a 23 69 66 6e 64 65  pSelect){.#ifnde
208c0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
208d0 42 51 55 45 52 59 0a 20 20 57 61 6c 6b 65 72 20  BQUERY.  Walker 
208e0 77 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c 20  w;.  memset(&w, 
208f0 30 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20  0, sizeof(w));. 
20900 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61   w.xSelectCallba
20910 63 6b 20 3d 20 73 65 6c 65 63 74 41 64 64 53 75  ck = selectAddSu
20920 62 71 75 65 72 79 54 79 70 65 49 6e 66 6f 3b 0a  bqueryTypeInfo;.
20930 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63    w.xExprCallbac
20940 6b 20 3d 20 65 78 70 72 57 61 6c 6b 4e 6f 6f 70  k = exprWalkNoop
20950 3b 0a 20 20 77 2e 70 50 61 72 73 65 20 3d 20 70  ;.  w.pParse = p
20960 50 61 72 73 65 3b 0a 20 20 77 2e 62 53 65 6c 65  Parse;.  w.bSele
20970 63 74 44 65 70 74 68 46 69 72 73 74 20 3d 20 31  ctDepthFirst = 1
20980 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53  ;.  sqlite3WalkS
20990 65 6c 65 63 74 28 26 77 2c 20 70 53 65 6c 65 63  elect(&w, pSelec
209a0 74 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f  t);.#endif.}.../
209b0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
209c0 65 20 73 65 74 73 20 75 70 20 61 20 53 45 4c 45  e sets up a SELE
209d0 43 54 20 73 74 61 74 65 6d 65 6e 74 20 66 6f 72  CT statement for
209e0 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 54 68   processing.  Th
209f0 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 69  e.** following i
20a00 73 20 61 63 63 6f 6d 70 6c 69 73 68 65 64 3a 0a  s accomplished:.
20a10 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 20 56 44 42  **.**     *  VDB
20a20 45 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 73  E Cursor numbers
20a30 20 61 72 65 20 61 73 73 69 67 6e 65 64 20 74 6f   are assigned to
20a40 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65   all FROM-clause
20a50 20 74 65 72 6d 73 2e 0a 2a 2a 20 20 20 20 20 2a   terms..**     *
20a60 20 20 45 70 68 65 6d 65 72 61 6c 20 54 61 62 6c    Ephemeral Tabl
20a70 65 20 6f 62 6a 65 63 74 73 20 61 72 65 20 63 72  e objects are cr
20a80 65 61 74 65 64 20 66 6f 72 20 61 6c 6c 20 46 52  eated for all FR
20a90 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62 71 75 65  OM-clause subque
20aa0 72 69 65 73 2e 0a 2a 2a 20 20 20 20 20 2a 20 20  ries..**     *  
20ab0 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61  ON and USING cla
20ac0 75 73 65 73 20 61 72 65 20 73 68 69 66 74 65 64  uses are shifted
20ad0 20 69 6e 74 6f 20 57 48 45 52 45 20 73 74 61 74   into WHERE stat
20ae0 65 6d 65 6e 74 73 0a 2a 2a 20 20 20 20 20 2a 20  ements.**     * 
20af0 20 57 69 6c 64 63 61 72 64 73 20 22 2a 22 20 61   Wildcards "*" a
20b00 6e 64 20 22 54 41 42 4c 45 2e 2a 22 20 69 6e 20  nd "TABLE.*" in 
20b10 72 65 73 75 6c 74 20 73 65 74 73 20 61 72 65 20  result sets are 
20b20 65 78 70 61 6e 64 65 64 2e 0a 2a 2a 20 20 20 20  expanded..**    
20b30 20 2a 20 20 49 64 65 6e 74 69 66 69 65 72 73 20   *  Identifiers 
20b40 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61 72  in expression ar
20b50 65 20 6d 61 74 63 68 65 64 20 74 6f 20 74 61 62  e matched to tab
20b60 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  les..**.** This 
20b70 72 6f 75 74 69 6e 65 20 61 63 74 73 20 72 65 63  routine acts rec
20b80 75 72 73 69 76 65 6c 79 20 6f 6e 20 61 6c 6c 20  ursively on all 
20b90 73 75 62 71 75 65 72 69 65 73 20 77 69 74 68 69  subqueries withi
20ba0 6e 20 74 68 65 20 53 45 4c 45 43 54 2e 0a 2a 2f  n the SELECT..*/
20bb0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c  .void sqlite3Sel
20bc0 65 63 74 50 72 65 70 28 0a 20 20 50 61 72 73 65  ectPrep(.  Parse
20bd0 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
20be0 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20    /* The parser 
20bf0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
20c00 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
20c10 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43      /* The SELEC
20c20 54 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e  T statement bein
20c30 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 4e 61  g coded. */.  Na
20c40 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4f 75 74 65  meContext *pOute
20c50 72 4e 43 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e  rNC  /* Name con
20c60 74 65 78 74 20 66 6f 72 20 63 6f 6e 74 61 69 6e  text for contain
20c70 65 72 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  er */.){.  sqlit
20c80 65 33 20 2a 64 62 3b 0a 20 20 69 66 28 20 4e 45  e3 *db;.  if( NE
20c90 56 45 52 28 70 3d 3d 30 29 20 29 20 72 65 74 75  VER(p==0) ) retu
20ca0 72 6e 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73  rn;.  db = pPars
20cb0 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 64 62 2d  e->db;.  if( db-
20cc0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
20cd0 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 2d  return;.  if( p-
20ce0 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 48  >selFlags & SF_H
20cf0 61 73 54 79 70 65 49 6e 66 6f 20 29 20 72 65 74  asTypeInfo ) ret
20d00 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  urn;.  sqlite3Se
20d10 6c 65 63 74 45 78 70 61 6e 64 28 70 50 61 72 73  lectExpand(pPars
20d20 65 2c 20 70 29 3b 0a 20 20 69 66 28 20 70 50 61  e, p);.  if( pPa
20d30 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d  rse->nErr || db-
20d40 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
20d50 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65  return;.  sqlite
20d60 33 52 65 73 6f 6c 76 65 53 65 6c 65 63 74 4e 61  3ResolveSelectNa
20d70 6d 65 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70  mes(pParse, p, p
20d80 4f 75 74 65 72 4e 43 29 3b 0a 20 20 69 66 28 20  OuterNC);.  if( 
20d90 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
20da0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
20db0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c   ) return;.  sql
20dc0 69 74 65 33 53 65 6c 65 63 74 41 64 64 54 79 70  ite3SelectAddTyp
20dd0 65 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 29  eInfo(pParse, p)
20de0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 65 74  ;.}../*.** Reset
20df0 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20 61   the aggregate a
20e00 63 63 75 6d 75 6c 61 74 6f 72 2e 0a 2a 2a 0a 2a  ccumulator..**.*
20e10 2a 20 54 68 65 20 61 67 67 72 65 67 61 74 65 20  * The aggregate 
20e20 61 63 63 75 6d 75 6c 61 74 6f 72 20 69 73 20 61  accumulator is a
20e30 20 73 65 74 20 6f 66 20 6d 65 6d 6f 72 79 20 63   set of memory c
20e40 65 6c 6c 73 20 74 68 61 74 20 68 6f 6c 64 0a 2a  ells that hold.*
20e50 2a 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 72  * intermediate r
20e60 65 73 75 6c 74 73 20 77 68 69 6c 65 20 63 61 6c  esults while cal
20e70 63 75 6c 61 74 69 6e 67 20 61 6e 20 61 67 67 72  culating an aggr
20e80 65 67 61 74 65 2e 20 20 54 68 69 73 0a 2a 2a 20  egate.  This.** 
20e90 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65  routine generate
20ea0 73 20 63 6f 64 65 20 74 68 61 74 20 73 74 6f 72  s code that stor
20eb0 65 73 20 4e 55 4c 4c 73 20 69 6e 20 61 6c 6c 20  es NULLs in all 
20ec0 6f 66 20 74 68 6f 73 65 20 6d 65 6d 6f 72 79 0a  of those memory.
20ed0 2a 2a 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 73 74 61  ** cells..*/.sta
20ee0 74 69 63 20 76 6f 69 64 20 72 65 73 65 74 41 63  tic void resetAc
20ef0 63 75 6d 75 6c 61 74 6f 72 28 50 61 72 73 65 20  cumulator(Parse 
20f00 2a 70 50 61 72 73 65 2c 20 41 67 67 49 6e 66 6f  *pParse, AggInfo
20f10 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56   *pAggInfo){.  V
20f20 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
20f30 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b  >pVdbe;.  int i;
20f40 0a 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66  .  struct AggInf
20f50 6f 5f 66 75 6e 63 20 2a 70 46 75 6e 63 3b 0a 20  o_func *pFunc;. 
20f60 20 69 6e 74 20 6e 52 65 67 20 3d 20 70 41 67 67   int nReg = pAgg
20f70 49 6e 66 6f 2d 3e 6e 46 75 6e 63 20 2b 20 70 41  Info->nFunc + pA
20f80 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b  ggInfo->nColumn;
20f90 0a 20 20 69 66 28 20 6e 52 65 67 3d 3d 30 20 29  .  if( nReg==0 )
20fa0 20 72 65 74 75 72 6e 3b 0a 23 69 66 64 65 66 20   return;.#ifdef 
20fb0 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f  SQLITE_DEBUG.  /
20fc0 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 61 6c  * Verify that al
20fd0 6c 20 41 67 67 49 6e 66 6f 20 72 65 67 69 73 74  l AggInfo regist
20fe0 65 72 73 20 61 72 65 20 77 69 74 68 69 6e 20 74  ers are within t
20ff0 68 65 20 72 61 6e 67 65 20 73 70 65 63 69 66 69  he range specifi
21000 65 64 20 62 79 0a 20 20 2a 2a 20 41 67 67 49 6e  ed by.  ** AggIn
21010 66 6f 2e 6d 6e 52 65 67 2e 2e 41 67 67 49 6e 66  fo.mnReg..AggInf
21020 6f 2e 6d 78 52 65 67 20 2a 2f 0a 20 20 61 73 73  o.mxReg */.  ass
21030 65 72 74 28 20 6e 52 65 67 3d 3d 70 41 67 67 49  ert( nReg==pAggI
21040 6e 66 6f 2d 3e 6d 78 52 65 67 2d 70 41 67 67 49  nfo->mxReg-pAggI
21050 6e 66 6f 2d 3e 6d 6e 52 65 67 2b 31 20 29 3b 0a  nfo->mnReg+1 );.
21060 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 67    for(i=0; i<pAg
21070 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20  gInfo->nColumn; 
21080 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74  i++){.    assert
21090 28 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c  ( pAggInfo->aCol
210a0 5b 69 5d 2e 69 4d 65 6d 3e 3d 70 41 67 67 49 6e  [i].iMem>=pAggIn
210b0 66 6f 2d 3e 6d 6e 52 65 67 0a 20 20 20 20 20 20  fo->mnReg.      
210c0 20 20 20 26 26 20 70 41 67 67 49 6e 66 6f 2d 3e     && pAggInfo->
210d0 61 43 6f 6c 5b 69 5d 2e 69 4d 65 6d 3c 3d 70 41  aCol[i].iMem<=pA
210e0 67 67 49 6e 66 6f 2d 3e 6d 78 52 65 67 20 29 3b  ggInfo->mxReg );
210f0 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20  .  }.  for(i=0; 
21100 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e  i<pAggInfo->nFun
21110 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73  c; i++){.    ass
21120 65 72 74 28 20 70 41 67 67 49 6e 66 6f 2d 3e 61  ert( pAggInfo->a
21130 46 75 6e 63 5b 69 5d 2e 69 4d 65 6d 3e 3d 70 41  Func[i].iMem>=pA
21140 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67 0a 20 20  ggInfo->mnReg.  
21150 20 20 20 20 20 20 20 26 26 20 70 41 67 67 49 6e         && pAggIn
21160 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d 2e 69 4d 65  fo->aFunc[i].iMe
21170 6d 3c 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 78 52  m<=pAggInfo->mxR
21180 65 67 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  eg );.  }.#endif
21190 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
211a0 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  dOp3(v, OP_Null,
211b0 20 30 2c 20 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e   0, pAggInfo->mn
211c0 52 65 67 2c 20 70 41 67 67 49 6e 66 6f 2d 3e 6d  Reg, pAggInfo->m
211d0 78 52 65 67 29 3b 0a 20 20 66 6f 72 28 70 46 75  xReg);.  for(pFu
211e0 6e 63 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75  nc=pAggInfo->aFu
211f0 6e 63 2c 20 69 3d 30 3b 20 69 3c 70 41 67 67 49  nc, i=0; i<pAggI
21200 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c  nfo->nFunc; i++,
21210 20 70 46 75 6e 63 2b 2b 29 7b 0a 20 20 20 20 69   pFunc++){.    i
21220 66 28 20 70 46 75 6e 63 2d 3e 69 44 69 73 74 69  f( pFunc->iDisti
21230 6e 63 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  nct>=0 ){.      
21240 45 78 70 72 20 2a 70 45 20 3d 20 70 46 75 6e 63  Expr *pE = pFunc
21250 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61  ->pExpr;.      a
21260 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
21270 72 6f 70 65 72 74 79 28 70 45 2c 20 45 50 5f 78  roperty(pE, EP_x
21280 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20  IsSelect) );.   
21290 20 20 20 69 66 28 20 70 45 2d 3e 78 2e 70 4c 69     if( pE->x.pLi
212a0 73 74 3d 3d 30 20 7c 7c 20 70 45 2d 3e 78 2e 70  st==0 || pE->x.p
212b0 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29  List->nExpr!=1 )
212c0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
212d0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
212e0 2c 20 22 44 49 53 54 49 4e 43 54 20 61 67 67 72  , "DISTINCT aggr
212f0 65 67 61 74 65 73 20 6d 75 73 74 20 68 61 76 65  egates must have
21300 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 22 0a 20   exactly one ". 
21310 20 20 20 20 20 20 20 20 20 20 22 61 72 67 75 6d            "argum
21320 65 6e 74 22 29 3b 0a 20 20 20 20 20 20 20 20 70  ent");.        p
21330 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74 20  Func->iDistinct 
21340 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73  = -1;.      }els
21350 65 7b 0a 20 20 20 20 20 20 20 20 4b 65 79 49 6e  e{.        KeyIn
21360 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 6b  fo *pKeyInfo = k
21370 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69  eyInfoFromExprLi
21380 73 74 28 70 50 61 72 73 65 2c 20 70 45 2d 3e 78  st(pParse, pE->x
21390 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 20  .pList);.       
213a0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
213b0 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p4(v, OP_OpenEph
213c0 65 6d 65 72 61 6c 2c 20 70 46 75 6e 63 2d 3e 69  emeral, pFunc->i
213d0 44 69 73 74 69 6e 63 74 2c 20 30 2c 20 30 2c 0a  Distinct, 0, 0,.
213e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
213f0 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
21400 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45  )pKeyInfo, P4_KE
21410 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 7d 0a  YINFO);.      }.
21420 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
21430 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 4f 50  ** Invoke the OP
21440 5f 41 67 67 46 69 6e 61 6c 69 7a 65 20 6f 70 63  _AggFinalize opc
21450 6f 64 65 20 66 6f 72 20 65 76 65 72 79 20 61 67  ode for every ag
21460 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
21470 0a 2a 2a 20 69 6e 20 74 68 65 20 41 67 67 49 6e  .** in the AggIn
21480 66 6f 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f  fo structure..*/
21490 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 69 6e  .static void fin
214a0 61 6c 69 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e  alizeAggFunction
214b0 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  s(Parse *pParse,
214c0 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e   AggInfo *pAggIn
214d0 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  fo){.  Vdbe *v =
214e0 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
214f0 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63    int i;.  struc
21500 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a  t AggInfo_func *
21510 70 46 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70  pF;.  for(i=0, p
21520 46 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e  F=pAggInfo->aFun
21530 63 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e  c; i<pAggInfo->n
21540 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29  Func; i++, pF++)
21550 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a  {.    ExprList *
21560 70 4c 69 73 74 20 3d 20 70 46 2d 3e 70 45 78 70  pList = pF->pExp
21570 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20  r->x.pList;.    
21580 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
21590 50 72 6f 70 65 72 74 79 28 70 46 2d 3e 70 45 78  Property(pF->pEx
215a0 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
215b0 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) );.    sqlite3
215c0 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
215d0 5f 41 67 67 46 69 6e 61 6c 2c 20 70 46 2d 3e 69  _AggFinal, pF->i
215e0 4d 65 6d 2c 20 70 4c 69 73 74 20 3f 20 70 4c 69  Mem, pList ? pLi
215f0 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 2c 20 30  st->nExpr : 0, 0
21600 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
21610 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 70          (void*)p
21620 46 2d 3e 70 46 75 6e 63 2c 20 50 34 5f 46 55 4e  F->pFunc, P4_FUN
21630 43 44 45 46 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  CDEF);.  }.}../*
21640 0a 2a 2a 20 55 70 64 61 74 65 20 74 68 65 20 61  .** Update the a
21650 63 63 75 6d 75 6c 61 74 6f 72 20 6d 65 6d 6f 72  ccumulator memor
21660 79 20 63 65 6c 6c 73 20 66 6f 72 20 61 6e 20 61  y cells for an a
21670 67 67 72 65 67 61 74 65 20 62 61 73 65 64 20 6f  ggregate based o
21680 6e 0a 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74  n.** the current
21690 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e   cursor position
216a0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
216b0 20 75 70 64 61 74 65 41 63 63 75 6d 75 6c 61 74   updateAccumulat
216c0 6f 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  or(Parse *pParse
216d0 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49  , AggInfo *pAggI
216e0 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  nfo){.  Vdbe *v 
216f0 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
21700 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
21710 72 65 67 48 69 74 20 3d 20 30 3b 0a 20 20 69 6e  regHit = 0;.  in
21720 74 20 61 64 64 72 48 69 74 54 65 73 74 20 3d 20  t addrHitTest = 
21730 30 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67 49  0;.  struct AggI
21740 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a 20 20  nfo_func *pF;.  
21750 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63  struct AggInfo_c
21760 6f 6c 20 2a 70 43 3b 0a 0a 20 20 70 41 67 67 49  ol *pC;..  pAggI
21770 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20  nfo->directMode 
21780 3d 20 31 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20  = 1;.  for(i=0, 
21790 70 46 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75  pF=pAggInfo->aFu
217a0 6e 63 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e  nc; i<pAggInfo->
217b0 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b 2b  nFunc; i++, pF++
217c0 29 7b 0a 20 20 20 20 69 6e 74 20 6e 41 72 67 3b  ){.    int nArg;
217d0 0a 20 20 20 20 69 6e 74 20 61 64 64 72 4e 65 78  .    int addrNex
217e0 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 72  t = 0;.    int r
217f0 65 67 41 67 67 3b 0a 20 20 20 20 45 78 70 72 4c  egAgg;.    ExprL
21800 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 46 2d  ist *pList = pF-
21810 3e 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b  >pExpr->x.pList;
21820 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78  .    assert( !Ex
21830 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 46  prHasProperty(pF
21840 2d 3e 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  ->pExpr, EP_xIsS
21850 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 69 66  elect) );.    if
21860 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20  ( pList ){.     
21870 20 6e 41 72 67 20 3d 20 70 4c 69 73 74 2d 3e 6e   nArg = pList->n
21880 45 78 70 72 3b 0a 20 20 20 20 20 20 72 65 67 41  Expr;.      regA
21890 67 67 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  gg = sqlite3GetT
218a0 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
218b0 20 6e 41 72 67 29 3b 0a 20 20 20 20 20 20 73 71   nArg);.      sq
218c0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70  lite3ExprCodeExp
218d0 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 4c  rList(pParse, pL
218e0 69 73 74 2c 20 72 65 67 41 67 67 2c 20 53 51 4c  ist, regAgg, SQL
218f0 49 54 45 5f 45 43 45 4c 5f 44 55 50 29 3b 0a 20  ITE_ECEL_DUP);. 
21900 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
21910 6e 41 72 67 20 3d 20 30 3b 0a 20 20 20 20 20 20  nArg = 0;.      
21920 72 65 67 41 67 67 20 3d 20 30 3b 0a 20 20 20 20  regAgg = 0;.    
21930 7d 0a 20 20 20 20 69 66 28 20 70 46 2d 3e 69 44  }.    if( pF->iD
21940 69 73 74 69 6e 63 74 3e 3d 30 20 29 7b 0a 20 20  istinct>=0 ){.  
21950 20 20 20 20 61 64 64 72 4e 65 78 74 20 3d 20 73      addrNext = s
21960 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
21970 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 61 73  bel(v);.      as
21980 73 65 72 74 28 20 6e 41 72 67 3d 3d 31 20 29 3b  sert( nArg==1 );
21990 0a 20 20 20 20 20 20 63 6f 64 65 44 69 73 74 69  .      codeDisti
219a0 6e 63 74 28 70 50 61 72 73 65 2c 20 70 46 2d 3e  nct(pParse, pF->
219b0 69 44 69 73 74 69 6e 63 74 2c 20 61 64 64 72 4e  iDistinct, addrN
219c0 65 78 74 2c 20 31 2c 20 72 65 67 41 67 67 29 3b  ext, 1, regAgg);
219d0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
219e0 46 2d 3e 70 46 75 6e 63 2d 3e 66 75 6e 63 46 6c  F->pFunc->funcFl
219f0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e  ags & SQLITE_FUN
21a00 43 5f 4e 45 45 44 43 4f 4c 4c 20 29 7b 0a 20 20  C_NEEDCOLL ){.  
21a10 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
21a20 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 74  ll = 0;.      st
21a30 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
21a40 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20  em *pItem;.     
21a50 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 61 73   int j;.      as
21a60 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20 29  sert( pList!=0 )
21a70 3b 20 20 2f 2a 20 70 4c 69 73 74 21 3d 30 20 69  ;  /* pList!=0 i
21a80 66 20 70 46 2d 3e 70 46 75 6e 63 20 68 61 73 20  f pF->pFunc has 
21a90 4e 45 45 44 43 4f 4c 4c 20 2a 2f 0a 20 20 20 20  NEEDCOLL */.    
21aa0 20 20 66 6f 72 28 6a 3d 30 2c 20 70 49 74 65 6d    for(j=0, pItem
21ab0 3d 70 4c 69 73 74 2d 3e 61 3b 20 21 70 43 6f 6c  =pList->a; !pCol
21ac0 6c 20 26 26 20 6a 3c 6e 41 72 67 3b 20 6a 2b 2b  l && j<nArg; j++
21ad0 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
21ae0 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
21af0 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
21b00 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70 45  Parse, pItem->pE
21b10 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  xpr);.      }.  
21b20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29      if( !pColl )
21b30 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20  {.        pColl 
21b40 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44  = pParse->db->pD
21b50 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d  fltColl;.      }
21b60 0a 20 20 20 20 20 20 69 66 28 20 72 65 67 48 69  .      if( regHi
21b70 74 3d 3d 30 20 26 26 20 70 41 67 67 49 6e 66 6f  t==0 && pAggInfo
21b80 2d 3e 6e 41 63 63 75 6d 75 6c 61 74 6f 72 20 29  ->nAccumulator )
21b90 20 72 65 67 48 69 74 20 3d 20 2b 2b 70 50 61 72   regHit = ++pPar
21ba0 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
21bb0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
21bc0 34 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c  4(v, OP_CollSeq,
21bd0 20 72 65 67 48 69 74 2c 20 30 2c 20 30 2c 20 28   regHit, 0, 0, (
21be0 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 34  char *)pColl, P4
21bf0 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 7d  _COLLSEQ);.    }
21c00 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
21c10 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 41 67 67  AddOp4(v, OP_Agg
21c20 53 74 65 70 2c 20 30 2c 20 72 65 67 41 67 67 2c  Step, 0, regAgg,
21c30 20 70 46 2d 3e 69 4d 65 6d 2c 0a 20 20 20 20 20   pF->iMem,.     
21c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21c50 20 28 76 6f 69 64 2a 29 70 46 2d 3e 70 46 75 6e   (void*)pF->pFun
21c60 63 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a  c, P4_FUNCDEF);.
21c70 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
21c80 68 61 6e 67 65 50 35 28 76 2c 20 28 75 38 29 6e  hangeP5(v, (u8)n
21c90 41 72 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Arg);.    sqlite
21ca0 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69  3ExprCacheAffini
21cb0 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c  tyChange(pParse,
21cc0 20 72 65 67 41 67 67 2c 20 6e 41 72 67 29 3b 0a   regAgg, nArg);.
21cd0 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
21ce0 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  seTempRange(pPar
21cf0 73 65 2c 20 72 65 67 41 67 67 2c 20 6e 41 72 67  se, regAgg, nArg
21d00 29 3b 0a 20 20 20 20 69 66 28 20 61 64 64 72 4e  );.    if( addrN
21d10 65 78 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ext ){.      sql
21d20 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
21d30 61 62 65 6c 28 76 2c 20 61 64 64 72 4e 65 78 74  abel(v, addrNext
21d40 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
21d50 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70  ExprCacheClear(p
21d60 50 61 72 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20  Parse);.    }.  
21d70 7d 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65 20 70  }..  /* Before p
21d80 6f 70 75 6c 61 74 69 6e 67 20 74 68 65 20 61 63  opulating the ac
21d90 63 75 6d 75 6c 61 74 6f 72 20 72 65 67 69 73 74  cumulator regist
21da0 65 72 73 2c 20 63 6c 65 61 72 20 74 68 65 20 63  ers, clear the c
21db0 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 0a 20 20 2a  olumn cache..  *
21dc0 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  * Otherwise, if 
21dd0 61 6e 79 20 6f 66 20 74 68 65 20 72 65 71 75 69  any of the requi
21de0 72 65 64 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65  red column value
21df0 73 20 61 72 65 20 61 6c 72 65 61 64 79 20 70 72  s are already pr
21e00 65 73 65 6e 74 20 0a 20 20 2a 2a 20 69 6e 20 72  esent .  ** in r
21e10 65 67 69 73 74 65 72 73 2c 20 73 71 6c 69 74 65  egisters, sqlite
21e20 33 45 78 70 72 43 6f 64 65 28 29 20 6d 61 79 20  3ExprCode() may 
21e30 75 73 65 20 4f 50 5f 53 43 6f 70 79 20 74 6f 20  use OP_SCopy to 
21e40 63 6f 70 79 20 74 68 65 20 76 61 6c 75 65 0a 20  copy the value. 
21e50 20 2a 2a 20 74 6f 20 70 43 2d 3e 69 4d 65 6d 2e   ** to pC->iMem.
21e60 20 42 75 74 20 62 79 20 74 68 65 20 74 69 6d 65   But by the time
21e70 20 74 68 65 20 76 61 6c 75 65 20 69 73 20 75 73   the value is us
21e80 65 64 2c 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  ed, the original
21e90 20 72 65 67 69 73 74 65 72 0a 20 20 2a 2a 20 6d   register.  ** m
21ea0 61 79 20 68 61 76 65 20 62 65 65 6e 20 75 73 65  ay have been use
21eb0 64 2c 20 69 6e 76 61 6c 69 64 61 74 69 6e 67 20  d, invalidating 
21ec0 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 62  the underlying b
21ed0 75 66 66 65 72 20 68 6f 6c 64 69 6e 67 20 74 68  uffer holding th
21ee0 65 0a 20 20 2a 2a 20 74 65 78 74 20 6f 72 20 62  e.  ** text or b
21ef0 6c 6f 62 20 76 61 6c 75 65 2e 20 53 65 65 20 74  lob value. See t
21f00 69 63 6b 65 74 20 5b 38 38 33 30 33 34 64 63 62  icket [883034dcb
21f10 35 5d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e  5]..  **.  ** An
21f20 6f 74 68 65 72 20 73 6f 6c 75 74 69 6f 6e 20 77  other solution w
21f30 6f 75 6c 64 20 62 65 20 74 6f 20 63 68 61 6e 67  ould be to chang
21f40 65 20 74 68 65 20 4f 50 5f 53 43 6f 70 79 20 75  e the OP_SCopy u
21f50 73 65 64 20 74 6f 20 63 6f 70 79 20 63 61 63 68  sed to copy cach
21f60 65 64 0a 20 20 2a 2a 20 76 61 6c 75 65 73 20 74  ed.  ** values t
21f70 6f 20 61 6e 20 4f 50 5f 43 6f 70 79 2e 0a 20 20  o an OP_Copy..  
21f80 2a 2f 0a 20 20 69 66 28 20 72 65 67 48 69 74 20  */.  if( regHit 
21f90 29 7b 0a 20 20 20 20 61 64 64 72 48 69 74 54 65  ){.    addrHitTe
21fa0 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  st = sqlite3Vdbe
21fb0 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 2c  AddOp1(v, OP_If,
21fc0 20 72 65 67 48 69 74 29 3b 0a 20 20 7d 0a 20 20   regHit);.  }.  
21fd0 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
21fe0 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20  Clear(pParse);. 
21ff0 20 66 6f 72 28 69 3d 30 2c 20 70 43 3d 70 41 67   for(i=0, pC=pAg
22000 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b 20 69 3c 70  gInfo->aCol; i<p
22010 41 67 67 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d 75  AggInfo->nAccumu
22020 6c 61 74 6f 72 3b 20 69 2b 2b 2c 20 70 43 2b 2b  lator; i++, pC++
22030 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  ){.    sqlite3Ex
22040 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
22050 43 2d 3e 70 45 78 70 72 2c 20 70 43 2d 3e 69 4d  C->pExpr, pC->iM
22060 65 6d 29 3b 0a 20 20 7d 0a 20 20 70 41 67 67 49  em);.  }.  pAggI
22070 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20  nfo->directMode 
22080 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  = 0;.  sqlite3Ex
22090 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61  prCacheClear(pPa
220a0 72 73 65 29 3b 0a 20 20 69 66 28 20 61 64 64 72  rse);.  if( addr
220b0 48 69 74 54 65 73 74 20 29 7b 0a 20 20 20 20 73  HitTest ){.    s
220c0 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
220d0 72 65 28 76 2c 20 61 64 64 72 48 69 74 54 65 73  re(v, addrHitTes
220e0 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  t);.  }.}../*.**
220f0 20 41 64 64 20 61 20 73 69 6e 67 6c 65 20 4f 50   Add a single OP
22100 5f 45 78 70 6c 61 69 6e 20 69 6e 73 74 72 75 63  _Explain instruc
22110 74 69 6f 6e 20 74 6f 20 74 68 65 20 56 44 42 45  tion to the VDBE
22120 20 74 6f 20 65 78 70 6c 61 69 6e 20 61 20 73 69   to explain a si
22130 6d 70 6c 65 0a 2a 2a 20 63 6f 75 6e 74 28 2a 29  mple.** count(*)
22140 20 71 75 65 72 79 20 28 22 53 45 4c 45 43 54 20   query ("SELECT 
22150 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 70 54  count(*) FROM pT
22160 61 62 22 29 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  ab")..*/.#ifndef
22170 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50   SQLITE_OMIT_EXP
22180 4c 41 49 4e 0a 73 74 61 74 69 63 20 76 6f 69 64  LAIN.static void
22190 20 65 78 70 6c 61 69 6e 53 69 6d 70 6c 65 43 6f   explainSimpleCo
221a0 75 6e 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  unt(.  Parse *pP
221b0 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  arse,           
221c0 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20         /* Parse 
221d0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 61 62  context */.  Tab
221e0 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20 20 20  le *pTab,       
221f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22200 54 61 62 6c 65 20 62 65 69 6e 67 20 71 75 65 72  Table being quer
22210 69 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  ied */.  Index *
22220 70 49 64 78 20 20 20 20 20 20 20 20 20 20 20 20  pIdx            
22230 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
22240 78 20 75 73 65 64 20 74 6f 20 6f 70 74 69 6d 69  x used to optimi
22250 7a 65 20 73 63 61 6e 2c 20 6f 72 20 4e 55 4c 4c  ze scan, or NULL
22260 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 50 61   */.){.  if( pPa
22270 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20  rse->explain==2 
22280 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 71  ){.    char *zEq
22290 70 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  p = sqlite3MPrin
222a0 74 66 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 22  tf(pParse->db, "
222b0 53 43 41 4e 20 54 41 42 4c 45 20 25 73 25 73 25  SCAN TABLE %s%s%
222c0 73 22 2c 0a 20 20 20 20 20 20 20 20 70 54 61 62  s",.        pTab
222d0 2d 3e 7a 4e 61 6d 65 2c 20 0a 20 20 20 20 20 20  ->zName, .      
222e0 20 20 70 49 64 78 20 3f 20 22 20 55 53 49 4e 47    pIdx ? " USING
222f0 20 43 4f 56 45 52 49 4e 47 20 49 4e 44 45 58 20   COVERING INDEX 
22300 22 20 3a 20 22 22 2c 0a 20 20 20 20 20 20 20 20  " : "",.        
22310 70 49 64 78 20 3f 20 70 49 64 78 2d 3e 7a 4e 61  pIdx ? pIdx->zNa
22320 6d 65 20 3a 20 22 22 0a 20 20 20 20 29 3b 0a 20  me : "".    );. 
22330 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
22340 64 4f 70 34 28 0a 20 20 20 20 20 20 20 20 70 50  dOp4(.        pP
22350 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f  arse->pVdbe, OP_
22360 45 78 70 6c 61 69 6e 2c 20 70 50 61 72 73 65 2d  Explain, pParse-
22370 3e 69 53 65 6c 65 63 74 49 64 2c 20 30 2c 20 30  >iSelectId, 0, 0
22380 2c 20 7a 45 71 70 2c 20 50 34 5f 44 59 4e 41 4d  , zEqp, P4_DYNAM
22390 49 43 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 7d 0a  IC.    );.  }.}.
223a0 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 65  #else.# define e
223b0 78 70 6c 61 69 6e 53 69 6d 70 6c 65 43 6f 75 6e  xplainSimpleCoun
223c0 74 28 61 2c 62 2c 63 29 0a 23 65 6e 64 69 66 0a  t(a,b,c).#endif.
223d0 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
223e0 63 6f 64 65 20 66 6f 72 20 74 68 65 20 53 45 4c  code for the SEL
223f0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 67 69  ECT statement gi
22400 76 65 6e 20 69 6e 20 74 68 65 20 70 20 61 72 67  ven in the p arg
22410 75 6d 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 54  ument.  .**.** T
22420 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 64  he results are d
22430 69 73 74 72 69 62 75 74 65 64 20 69 6e 20 76 61  istributed in va
22440 72 69 6f 75 73 20 77 61 79 73 20 64 65 70 65 6e  rious ways depen
22450 64 69 6e 67 20 6f 6e 20 74 68 65 0a 2a 2a 20 63  ding on the.** c
22460 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 53  ontents of the S
22470 65 6c 65 63 74 44 65 73 74 20 73 74 72 75 63 74  electDest struct
22480 75 72 65 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  ure pointed to b
22490 79 20 61 72 67 75 6d 65 6e 74 20 70 44 65 73 74  y argument pDest
224a0 0a 2a 2a 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  .** as follows:.
224b0 2a 2a 0a 2a 2a 20 20 20 20 20 70 44 65 73 74 2d  **.**     pDest-
224c0 3e 65 44 65 73 74 20 20 20 20 52 65 73 75 6c 74  >eDest    Result
224d0 0a 2a 2a 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d  .**     --------
224e0 2d 2d 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d  ----    --------
224f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
22500 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
22510 2d 2d 2d 0a 2a 2a 20 20 20 20 20 53 52 54 5f 4f  ---.**     SRT_O
22520 75 74 70 75 74 20 20 20 20 20 20 47 65 6e 65 72  utput      Gener
22530 61 74 65 20 61 20 72 6f 77 20 6f 66 20 6f 75 74  ate a row of out
22540 70 75 74 20 28 75 73 69 6e 67 20 74 68 65 20 4f  put (using the O
22550 50 5f 52 65 73 75 6c 74 52 6f 77 0a 2a 2a 20 20  P_ResultRow.**  
22560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22570 20 20 20 6f 70 63 6f 64 65 29 20 66 6f 72 20 65     opcode) for e
22580 61 63 68 20 72 6f 77 20 69 6e 20 74 68 65 20 72  ach row in the r
22590 65 73 75 6c 74 20 73 65 74 2e 0a 2a 2a 0a 2a 2a  esult set..**.**
225a0 20 20 20 20 20 53 52 54 5f 4d 65 6d 20 20 20 20       SRT_Mem    
225b0 20 20 20 20 20 4f 6e 6c 79 20 76 61 6c 69 64 20       Only valid 
225c0 69 66 20 74 68 65 20 72 65 73 75 6c 74 20 69 73  if the result is
225d0 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e   a single column
225e0 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  ..**            
225f0 20 20 20 20 20 20 20 20 20 53 74 6f 72 65 20 74           Store t
22600 68 65 20 66 69 72 73 74 20 63 6f 6c 75 6d 6e 20  he first column 
22610 6f 66 20 74 68 65 20 66 69 72 73 74 20 72 65 73  of the first res
22620 75 6c 74 20 72 6f 77 0a 2a 2a 20 20 20 20 20 20  ult row.**      
22630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
22640 6e 20 72 65 67 69 73 74 65 72 20 70 44 65 73 74  n register pDest
22650 2d 3e 69 53 44 50 61 72 6d 20 74 68 65 6e 20 61  ->iSDParm then a
22660 62 61 6e 64 6f 6e 20 74 68 65 20 72 65 73 74 0a  bandon the rest.
22670 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
22680 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 71 75         of the qu
22690 65 72 79 2e 20 20 54 68 69 73 20 64 65 73 74 69  ery.  This desti
226a0 6e 61 74 69 6f 6e 20 69 6d 70 6c 69 65 73 20 22  nation implies "
226b0 4c 49 4d 49 54 20 31 22 2e 0a 2a 2a 0a 2a 2a 20  LIMIT 1"..**.** 
226c0 20 20 20 20 53 52 54 5f 53 65 74 20 20 20 20 20      SRT_Set     
226d0 20 20 20 20 54 68 65 20 72 65 73 75 6c 74 20 6d      The result m
226e0 75 73 74 20 62 65 20 61 20 73 69 6e 67 6c 65 20  ust be a single 
226f0 63 6f 6c 75 6d 6e 2e 20 20 53 74 6f 72 65 20 65  column.  Store e
22700 61 63 68 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ach.**          
22710 20 20 20 20 20 20 20 20 20 20 20 72 6f 77 20 6f             row o
22720 66 20 72 65 73 75 6c 74 20 61 73 20 74 68 65 20  f result as the 
22730 6b 65 79 20 69 6e 20 74 61 62 6c 65 20 70 44 65  key in table pDe
22740 73 74 2d 3e 69 53 44 50 61 72 6d 2e 20 0a 2a 2a  st->iSDParm. .**
22750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22760 20 20 20 20 20 41 70 70 6c 79 20 74 68 65 20 61       Apply the a
22770 66 66 69 6e 69 74 79 20 70 44 65 73 74 2d 3e 61  ffinity pDest->a
22780 66 66 53 64 73 74 20 62 65 66 6f 72 65 20 73 74  ffSdst before st
22790 6f 72 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20  oring.**        
227a0 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 73               res
227b0 75 6c 74 73 2e 20 20 55 73 65 64 20 74 6f 20 69  ults.  Used to i
227c0 6d 70 6c 65 6d 65 6e 74 20 22 49 4e 20 28 53 45  mplement "IN (SE
227d0 4c 45 43 54 20 2e 2e 2e 29 22 2e 0a 2a 2a 0a 2a  LECT ...)"..**.*
227e0 2a 20 20 20 20 20 53 52 54 5f 55 6e 69 6f 6e 20  *     SRT_Union 
227f0 20 20 20 20 20 20 53 74 6f 72 65 20 72 65 73 75        Store resu
22800 6c 74 73 20 61 73 20 61 20 6b 65 79 20 69 6e 20  lts as a key in 
22810 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  a temporary tabl
22820 65 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  e .**           
22830 20 20 20 20 20 20 20 20 20 20 69 64 65 6e 74 69            identi
22840 66 69 65 64 20 62 79 20 70 44 65 73 74 2d 3e 69  fied by pDest->i
22850 53 44 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20  SDParm..**.**   
22860 20 20 53 52 54 5f 45 78 63 65 70 74 20 20 20 20    SRT_Except    
22870 20 20 52 65 6d 6f 76 65 20 72 65 73 75 6c 74 73    Remove results
22880 20 66 72 6f 6d 20 74 68 65 20 74 65 6d 70 6f 72   from the tempor
22890 61 72 79 20 74 61 62 6c 65 20 70 44 65 73 74 2d  ary table pDest-
228a0 3e 69 53 44 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20  >iSDParm..**.** 
228b0 20 20 20 20 53 52 54 5f 54 61 62 6c 65 20 20 20      SRT_Table   
228c0 20 20 20 20 53 74 6f 72 65 20 72 65 73 75 6c 74      Store result
228d0 73 20 69 6e 20 74 65 6d 70 6f 72 61 72 79 20 74  s in temporary t
228e0 61 62 6c 65 20 70 44 65 73 74 2d 3e 69 53 44 50  able pDest->iSDP
228f0 61 72 6d 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20  arm..**         
22900 20 20 20 20 20 20 20 20 20 20 20 20 54 68 69 73              This
22910 20 69 73 20 6c 69 6b 65 20 53 52 54 5f 45 70 68   is like SRT_Eph
22920 65 6d 54 61 62 20 65 78 63 65 70 74 20 74 68 61  emTab except tha
22930 74 20 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20 20  t the table.**  
22940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22950 20 20 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f     is assumed to
22960 20 61 6c 72 65 61 64 79 20 62 65 20 6f 70 65 6e   already be open
22970 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f  ..**.**     SRT_
22980 45 70 68 65 6d 54 61 62 20 20 20 20 43 72 65 61  EphemTab    Crea
22990 74 65 20 61 6e 20 74 65 6d 70 6f 72 61 72 79 20  te an temporary 
229a0 74 61 62 6c 65 20 70 44 65 73 74 2d 3e 69 53 44  table pDest->iSD
229b0 50 61 72 6d 20 61 6e 64 20 73 74 6f 72 65 0a 2a  Parm and store.*
229c0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
229d0 20 20 20 20 20 20 74 68 65 20 72 65 73 75 6c 74        the result
229e0 20 74 68 65 72 65 2e 20 54 68 65 20 63 75 72 73   there. The curs
229f0 6f 72 20 69 73 20 6c 65 66 74 20 6f 70 65 6e 20  or is left open 
22a00 61 66 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 20  after.**        
22a10 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74               ret
22a20 75 72 6e 69 6e 67 2e 20 20 54 68 69 73 20 69 73  urning.  This is
22a30 20 6c 69 6b 65 20 53 52 54 5f 54 61 62 6c 65 20   like SRT_Table 
22a40 65 78 63 65 70 74 20 74 68 61 74 0a 2a 2a 20 20  except that.**  
22a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22a60 20 20 20 74 68 69 73 20 64 65 73 74 69 6e 61 74     this destinat
22a70 69 6f 6e 20 75 73 65 73 20 4f 50 5f 4f 70 65 6e  ion uses OP_Open
22a80 45 70 68 65 6d 65 72 61 6c 20 74 6f 20 63 72 65  Ephemeral to cre
22a90 61 74 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ate.**          
22aa0 20 20 20 20 20 20 20 20 20 20 20 74 68 65 20 74             the t
22ab0 61 62 6c 65 20 66 69 72 73 74 2e 0a 2a 2a 0a 2a  able first..**.*
22ac0 2a 20 20 20 20 20 53 52 54 5f 43 6f 72 6f 75 74  *     SRT_Corout
22ad0 69 6e 65 20 20 20 47 65 6e 65 72 61 74 65 20 61  ine   Generate a
22ae0 20 63 6f 2d 72 6f 75 74 69 6e 65 20 74 68 61 74   co-routine that
22af0 20 72 65 74 75 72 6e 73 20 61 20 6e 65 77 20 72   returns a new r
22b00 6f 77 20 6f 66 0a 2a 2a 20 20 20 20 20 20 20 20  ow of.**        
22b10 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 73               res
22b20 75 6c 74 73 20 65 61 63 68 20 74 69 6d 65 20 69  ults each time i
22b30 74 20 69 73 20 69 6e 76 6f 6b 65 64 2e 20 20 54  t is invoked.  T
22b40 68 65 20 65 6e 74 72 79 20 70 6f 69 6e 74 0a 2a  he entry point.*
22b50 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
22b60 20 20 20 20 20 20 6f 66 20 74 68 65 20 63 6f 2d        of the co-
22b70 72 6f 75 74 69 6e 65 20 69 73 20 73 74 6f 72 65  routine is store
22b80 64 20 69 6e 20 72 65 67 69 73 74 65 72 20 70 44  d in register pD
22b90 65 73 74 2d 3e 69 53 44 50 61 72 6d 2e 0a 2a 2a  est->iSDParm..**
22ba0 0a 2a 2a 20 20 20 20 20 53 52 54 5f 45 78 69 73  .**     SRT_Exis
22bb0 74 73 20 20 20 20 20 20 53 74 6f 72 65 20 61 20  ts      Store a 
22bc0 31 20 69 6e 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  1 in memory cell
22bd0 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 20   pDest->iSDParm 
22be0 69 66 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a  if the result.**
22bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22c00 20 20 20 20 20 73 65 74 20 69 73 20 6e 6f 74 20       set is not 
22c10 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  empty..**.**    
22c20 20 53 52 54 5f 44 69 73 63 61 72 64 20 20 20 20   SRT_Discard    
22c30 20 54 68 72 6f 77 20 74 68 65 20 72 65 73 75 6c   Throw the resul
22c40 74 73 20 61 77 61 79 2e 20 20 54 68 69 73 20 69  ts away.  This i
22c50 73 20 75 73 65 64 20 62 79 20 53 45 4c 45 43 54  s used by SELECT
22c60 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
22c70 20 20 20 20 20 20 20 20 73 74 61 74 65 6d 65 6e          statemen
22c80 74 73 20 77 69 74 68 69 6e 20 74 72 69 67 67 65  ts within trigge
22c90 72 73 20 77 68 6f 73 65 20 6f 6e 6c 79 20 70 75  rs whose only pu
22ca0 72 70 6f 73 65 20 69 73 0a 2a 2a 20 20 20 20 20  rpose is.**     
22cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22cc0 74 68 65 20 73 69 64 65 2d 65 66 66 65 63 74 73  the side-effects
22cd0 20 6f 66 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a   of functions..*
22ce0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
22cf0 65 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75  e returns the nu
22d00 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 20  mber of errors. 
22d10 20 49 66 20 61 6e 79 20 65 72 72 6f 72 73 20 61   If any errors a
22d20 72 65 0a 2a 2a 20 65 6e 63 6f 75 6e 74 65 72 65  re.** encountere
22d30 64 2c 20 74 68 65 6e 20 61 6e 20 61 70 70 72 6f  d, then an appro
22d40 70 72 69 61 74 65 20 65 72 72 6f 72 20 6d 65 73  priate error mes
22d50 73 61 67 65 20 69 73 20 6c 65 66 74 20 69 6e 0a  sage is left in.
22d60 2a 2a 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  ** pParse->zErrM
22d70 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  sg..**.** This r
22d80 6f 75 74 69 6e 65 20 64 6f 65 73 20 4e 4f 54 20  outine does NOT 
22d90 66 72 65 65 20 74 68 65 20 53 65 6c 65 63 74 20  free the Select 
22da0 73 74 72 75 63 74 75 72 65 20 70 61 73 73 65 64  structure passed
22db0 20 69 6e 2e 20 20 54 68 65 0a 2a 2a 20 63 61 6c   in.  The.** cal
22dc0 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6e 65  ling function ne
22dd0 65 64 73 20 74 6f 20 64 6f 20 74 68 61 74 2e 0a  eds to do that..
22de0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 65  */.int sqlite3Se
22df0 6c 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70  lect(.  Parse *p
22e00 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f  Parse,         /
22e10 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e  * The parser con
22e20 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
22e30 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
22e40 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73   /* The SELECT s
22e50 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63  tatement being c
22e60 6f 64 65 64 2e 20 2a 2f 0a 20 20 53 65 6c 65 63  oded. */.  Selec
22e70 74 44 65 73 74 20 2a 70 44 65 73 74 20 20 20 20  tDest *pDest    
22e80 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20    /* What to do 
22e90 77 69 74 68 20 74 68 65 20 71 75 65 72 79 20 72  with the query r
22ea0 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69  esults */.){.  i
22eb0 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20  nt i, j;        
22ec0 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
22ed0 75 6e 74 65 72 73 20 2a 2f 0a 20 20 57 68 65 72  unters */.  Wher
22ee0 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20  eInfo *pWInfo;  
22ef0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 66 72 6f     /* Return fro
22f00 6d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  m sqlite3WhereBe
22f10 67 69 6e 28 29 20 2a 2f 0a 20 20 56 64 62 65 20  gin() */.  Vdbe 
22f20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *v;             
22f30 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c    /* The virtual
22f40 20 6d 61 63 68 69 6e 65 20 75 6e 64 65 72 20 63   machine under c
22f50 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20  onstruction */. 
22f60 20 69 6e 74 20 69 73 41 67 67 3b 20 20 20 20 20   int isAgg;     
22f70 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
22f80 66 6f 72 20 73 65 6c 65 63 74 20 6c 69 73 74 73  for select lists
22f90 20 6c 69 6b 65 20 22 63 6f 75 6e 74 28 2a 29 22   like "count(*)"
22fa0 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
22fb0 70 45 4c 69 73 74 3b 20 20 20 20 20 20 2f 2a 20  pEList;      /* 
22fc0 4c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  List of columns 
22fd0 74 6f 20 65 78 74 72 61 63 74 2e 20 2a 2f 0a 20  to extract. */. 
22fe0 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
22ff0 73 74 3b 20 20 20 20 20 2f 2a 20 4c 69 73 74 20  st;     /* List 
23000 6f 66 20 74 61 62 6c 65 73 20 74 6f 20 73 65 6c  of tables to sel
23010 65 63 74 20 66 72 6f 6d 20 2a 2f 0a 20 20 45 78  ect from */.  Ex
23020 70 72 20 2a 70 57 68 65 72 65 3b 20 20 20 20 20  pr *pWhere;     
23030 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
23040 45 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62  E clause.  May b
23050 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72  e NULL */.  Expr
23060 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 20  List *pOrderBy; 
23070 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20     /* The ORDER 
23080 42 59 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20  BY clause.  May 
23090 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70  be NULL */.  Exp
230a0 72 4c 69 73 74 20 2a 70 47 72 6f 75 70 42 79 3b  rList *pGroupBy;
230b0 20 20 20 20 2f 2a 20 54 68 65 20 47 52 4f 55 50      /* The GROUP
230c0 20 42 59 20 63 6c 61 75 73 65 2e 20 20 4d 61 79   BY clause.  May
230d0 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78   be NULL */.  Ex
230e0 70 72 20 2a 70 48 61 76 69 6e 67 3b 20 20 20 20  pr *pHaving;    
230f0 20 20 20 20 20 2f 2a 20 54 68 65 20 48 41 56 49       /* The HAVI
23100 4e 47 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20  NG clause.  May 
23110 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74  be NULL */.  int
23120 20 72 63 20 3d 20 31 3b 20 20 20 20 20 20 20 20   rc = 1;        
23130 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20      /* Value to 
23140 72 65 74 75 72 6e 20 66 72 6f 6d 20 74 68 69 73  return from this
23150 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 69   function */.  i
23160 6e 74 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78  nt addrSortIndex
23170 3b 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73  ;     /* Address
23180 20 6f 66 20 61 6e 20 4f 50 5f 4f 70 65 6e 45 70   of an OP_OpenEp
23190 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 75 63 74  hemeral instruct
231a0 69 6f 6e 20 2a 2f 0a 20 20 44 69 73 74 69 6e 63  ion */.  Distinc
231b0 74 43 74 78 20 73 44 69 73 74 69 6e 63 74 3b 20  tCtx sDistinct; 
231c0 2f 2a 20 49 6e 66 6f 20 6f 6e 20 68 6f 77 20 74  /* Info on how t
231d0 6f 20 63 6f 64 65 20 74 68 65 20 44 49 53 54 49  o code the DISTI
231e0 4e 43 54 20 6b 65 79 77 6f 72 64 20 2a 2f 0a 20  NCT keyword */. 
231f0 20 41 67 67 49 6e 66 6f 20 73 41 67 67 49 6e 66   AggInfo sAggInf
23200 6f 3b 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72  o;      /* Infor
23210 6d 61 74 69 6f 6e 20 75 73 65 64 20 62 79 20 61  mation used by a
23220 67 67 72 65 67 61 74 65 20 71 75 65 72 69 65 73  ggregate queries
23230 20 2a 2f 0a 20 20 69 6e 74 20 69 45 6e 64 3b 20   */.  int iEnd; 
23240 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23250 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 65  Address of the e
23260 6e 64 20 6f 66 20 74 68 65 20 71 75 65 72 79 20  nd of the query 
23270 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
23280 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ;           /* T
23290 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
232a0 65 63 74 69 6f 6e 20 2a 2f 0a 0a 23 69 66 6e 64  ection */..#ifnd
232b0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  ef SQLITE_OMIT_E
232c0 58 50 4c 41 49 4e 0a 20 20 69 6e 74 20 69 52 65  XPLAIN.  int iRe
232d0 73 74 6f 72 65 53 65 6c 65 63 74 49 64 20 3d 20  storeSelectId = 
232e0 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49  pParse->iSelectI
232f0 64 3b 0a 20 20 70 50 61 72 73 65 2d 3e 69 53 65  d;.  pParse->iSe
23300 6c 65 63 74 49 64 20 3d 20 70 50 61 72 73 65 2d  lectId = pParse-
23310 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 2b 2b  >iNextSelectId++
23320 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 64 62 20 3d  ;.#endif..  db =
23330 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
23340 66 28 20 70 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6d  f( p==0 || db->m
23350 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70  allocFailed || p
23360 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20  Parse->nErr ){. 
23370 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
23380 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75  .  if( sqlite3Au
23390 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
233a0 53 51 4c 49 54 45 5f 53 45 4c 45 43 54 2c 20 30  SQLITE_SELECT, 0
233b0 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e  , 0, 0) ) return
233c0 20 31 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 41   1;.  memset(&sA
233d0 67 67 49 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f  ggInfo, 0, sizeo
233e0 66 28 73 41 67 67 49 6e 66 6f 29 29 3b 0a 0a 20  f(sAggInfo));.. 
233f0 20 69 66 28 20 49 67 6e 6f 72 61 62 6c 65 4f 72   if( IgnorableOr
23400 64 65 72 62 79 28 70 44 65 73 74 29 20 29 7b 0a  derby(pDest) ){.
23410 20 20 20 20 61 73 73 65 72 74 28 70 44 65 73 74      assert(pDest
23420 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45 78 69  ->eDest==SRT_Exi
23430 73 74 73 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44  sts || pDest->eD
23440 65 73 74 3d 3d 53 52 54 5f 55 6e 69 6f 6e 20 7c  est==SRT_Union |
23450 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 70 44  | .           pD
23460 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
23470 45 78 63 65 70 74 20 7c 7c 20 70 44 65 73 74 2d  Except || pDest-
23480 3e 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 63  >eDest==SRT_Disc
23490 61 72 64 29 3b 0a 20 20 20 20 2f 2a 20 49 66 20  ard);.    /* If 
234a0 4f 52 44 45 52 20 42 59 20 6d 61 6b 65 73 20 6e  ORDER BY makes n
234b0 6f 20 64 69 66 66 65 72 65 6e 63 65 20 69 6e 20  o difference in 
234c0 74 68 65 20 6f 75 74 70 75 74 20 74 68 65 6e 20  the output then 
234d0 6e 65 69 74 68 65 72 20 64 6f 65 73 0a 20 20 20  neither does.   
234e0 20 2a 2a 20 44 49 53 54 49 4e 43 54 20 73 6f 20   ** DISTINCT so 
234f0 69 74 20 63 61 6e 20 62 65 20 72 65 6d 6f 76 65  it can be remove
23500 64 20 74 6f 6f 2e 20 2a 2f 0a 20 20 20 20 73 71  d too. */.    sq
23510 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
23520 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65  ete(db, p->pOrde
23530 72 42 79 29 3b 0a 20 20 20 20 70 2d 3e 70 4f 72  rBy);.    p->pOr
23540 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 70  derBy = 0;.    p
23550 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53  ->selFlags &= ~S
23560 46 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20 7d 0a  F_Distinct;.  }.
23570 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 50    sqlite3SelectP
23580 72 65 70 28 70 50 61 72 73 65 2c 20 70 2c 20 30  rep(pParse, p, 0
23590 29 3b 0a 20 20 70 4f 72 64 65 72 42 79 20 3d 20  );.  pOrderBy = 
235a0 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 70  p->pOrderBy;.  p
235b0 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72  TabList = p->pSr
235c0 63 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d  c;.  pEList = p-
235d0 3e 70 45 4c 69 73 74 3b 0a 20 20 69 66 28 20 70  >pEList;.  if( p
235e0 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64  Parse->nErr || d
235f0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
23600 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65  ){.    goto sele
23610 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 69 73  ct_end;.  }.  is
23620 41 67 67 20 3d 20 28 70 2d 3e 73 65 6c 46 6c 61  Agg = (p->selFla
23630 67 73 20 26 20 53 46 5f 41 67 67 72 65 67 61 74  gs & SF_Aggregat
23640 65 29 21 3d 30 3b 0a 20 20 61 73 73 65 72 74 28  e)!=0;.  assert(
23650 20 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 0a 20   pEList!=0 );.. 
23660 20 2f 2a 20 42 65 67 69 6e 20 67 65 6e 65 72 61   /* Begin genera
23670 74 69 6e 67 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a  ting code..  */.
23680 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
23690 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
236a0 69 66 28 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20  if( v==0 ) goto 
236b0 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f  select_end;..  /
236c0 2a 20 49 66 20 77 72 69 74 69 6e 67 20 74 6f 20  * If writing to 
236d0 6d 65 6d 6f 72 79 20 6f 72 20 67 65 6e 65 72 61  memory or genera
236e0 74 69 6e 67 20 61 20 73 65 74 0a 20 20 2a 2a 20  ting a set.  ** 
236f0 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 63 6f  only a single co
23700 6c 75 6d 6e 20 6d 61 79 20 62 65 20 6f 75 74 70  lumn may be outp
23710 75 74 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66  ut..  */.#ifndef
23720 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
23730 51 55 45 52 59 0a 20 20 69 66 28 20 63 68 65 63  QUERY.  if( chec
23740 6b 46 6f 72 4d 75 6c 74 69 43 6f 6c 75 6d 6e 53  kForMultiColumnS
23750 65 6c 65 63 74 45 72 72 6f 72 28 70 50 61 72 73  electError(pPars
23760 65 2c 20 70 44 65 73 74 2c 20 70 45 4c 69 73 74  e, pDest, pEList
23770 2d 3e 6e 45 78 70 72 29 20 29 7b 0a 20 20 20 20  ->nExpr) ){.    
23780 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
23790 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
237a0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
237b0 66 6f 72 20 61 6c 6c 20 73 75 62 2d 71 75 65 72  for all sub-quer
237c0 69 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ies in the FROM 
237d0 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 23 69 66 20  clause.  */.#if 
237e0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
237f0 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c  OMIT_SUBQUERY) |
23800 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
23810 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 20 20 66  E_OMIT_VIEW).  f
23820 6f 72 28 69 3d 30 3b 20 21 70 2d 3e 70 50 72 69  or(i=0; !p->pPri
23830 6f 72 20 26 26 20 69 3c 70 54 61 62 4c 69 73 74  or && i<pTabList
23840 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20  ->nSrc; i++){.  
23850 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
23860 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26  _item *pItem = &
23870 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 3b 0a  pTabList->a[i];.
23880 20 20 20 20 53 65 6c 65 63 74 44 65 73 74 20 64      SelectDest d
23890 65 73 74 3b 0a 20 20 20 20 53 65 6c 65 63 74 20  est;.    Select 
238a0 2a 70 53 75 62 20 3d 20 70 49 74 65 6d 2d 3e 70  *pSub = pItem->p
238b0 53 65 6c 65 63 74 3b 0a 20 20 20 20 69 6e 74 20  Select;.    int 
238c0 69 73 41 67 67 53 75 62 3b 0a 0a 20 20 20 20 69  isAggSub;..    i
238d0 66 28 20 70 53 75 62 3d 3d 30 20 29 20 63 6f 6e  f( pSub==0 ) con
238e0 74 69 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 53  tinue;..    /* S
238f0 6f 6d 65 74 69 6d 65 73 20 74 68 65 20 63 6f 64  ometimes the cod
23900 65 20 66 6f 72 20 61 20 73 75 62 71 75 65 72 79  e for a subquery
23910 20 77 69 6c 6c 20 62 65 20 67 65 6e 65 72 61 74   will be generat
23920 65 64 20 6d 6f 72 65 20 74 68 61 6e 0a 20 20 20  ed more than.   
23930 20 2a 2a 20 6f 6e 63 65 2c 20 69 66 20 74 68 65   ** once, if the
23940 20 73 75 62 71 75 65 72 79 20 69 73 20 70 61 72   subquery is par
23950 74 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  t of the WHERE c
23960 6c 61 75 73 65 20 69 6e 20 61 20 4c 45 46 54 20  lause in a LEFT 
23970 4a 4f 49 4e 2c 0a 20 20 20 20 2a 2a 20 66 6f 72  JOIN,.    ** for
23980 20 65 78 61 6d 70 6c 65 2e 20 20 49 6e 20 74 68   example.  In th
23990 61 74 20 63 61 73 65 2c 20 64 6f 20 6e 6f 74 20  at case, do not 
239a0 72 65 67 65 6e 65 72 61 74 65 20 74 68 65 20 63  regenerate the c
239b0 6f 64 65 20 74 6f 20 6d 61 6e 69 66 65 73 74 0a  ode to manifest.
239c0 20 20 20 20 2a 2a 20 61 20 76 69 65 77 20 6f 72      ** a view or
239d0 20 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20   the co-routine 
239e0 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 20 76  to implement a v
239f0 69 65 77 2e 20 20 54 68 65 20 66 69 72 73 74 20  iew.  The first 
23a00 69 6e 73 74 61 6e 63 65 0a 20 20 20 20 2a 2a 20  instance.    ** 
23a10 69 73 20 73 75 66 66 69 63 69 65 6e 74 2c 20 74  is sufficient, t
23a20 68 6f 75 67 68 20 74 68 65 20 73 75 62 72 6f 75  hough the subrou
23a30 74 69 6e 65 20 74 6f 20 6d 61 6e 69 66 65 73 74  tine to manifest
23a40 20 74 68 65 20 76 69 65 77 20 64 6f 65 73 20 6e   the view does n
23a50 65 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20 62 65  eed.    ** to be
23a60 20 69 6e 76 6f 6b 65 64 20 61 67 61 69 6e 2e 20   invoked again. 
23a70 2a 2f 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d  */.    if( pItem
23a80 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 29 7b  ->addrFillSub ){
23a90 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d  .      if( pItem
23aa0 2d 3e 76 69 61 43 6f 72 6f 75 74 69 6e 65 3d 3d  ->viaCoroutine==
23ab0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
23ac0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
23ad0 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70 49 74 65  , OP_Gosub, pIte
23ae0 6d 2d 3e 72 65 67 52 65 74 75 72 6e 2c 20 70 49  m->regReturn, pI
23af0 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62  tem->addrFillSub
23b00 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
23b10 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d   continue;.    }
23b20 0a 0a 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65  ..    /* Increme
23b30 6e 74 20 50 61 72 73 65 2e 6e 48 65 69 67 68 74  nt Parse.nHeight
23b40 20 62 79 20 74 68 65 20 68 65 69 67 68 74 20 6f   by the height o
23b50 66 20 74 68 65 20 6c 61 72 67 65 73 74 20 65 78  f the largest ex
23b60 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2a 20  pression.    ** 
23b70 74 72 65 65 20 72 65 66 65 72 72 65 64 20 74 6f  tree referred to
23b80 20 62 79 20 74 68 69 73 2c 20 74 68 65 20 70 61   by this, the pa
23b90 72 65 6e 74 20 73 65 6c 65 63 74 2e 20 54 68 65  rent select. The
23ba0 20 63 68 69 6c 64 20 73 65 6c 65 63 74 0a 20 20   child select.  
23bb0 20 20 2a 2a 20 6d 61 79 20 63 6f 6e 74 61 69 6e    ** may contain
23bc0 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
23bd0 73 20 6f 66 20 61 74 20 6d 6f 73 74 0a 20 20 20  s of at most.   
23be0 20 2a 2a 20 28 53 51 4c 49 54 45 5f 4d 41 58 5f   ** (SQLITE_MAX_
23bf0 45 58 50 52 5f 44 45 50 54 48 2d 50 61 72 73 65  EXPR_DEPTH-Parse
23c00 2e 6e 48 65 69 67 68 74 29 20 68 65 69 67 68 74  .nHeight) height
23c10 2e 20 54 68 69 73 20 69 73 20 61 20 62 69 74 0a  . This is a bit.
23c20 20 20 20 20 2a 2a 20 6d 6f 72 65 20 63 6f 6e 73      ** more cons
23c30 65 72 76 61 74 69 76 65 20 74 68 61 6e 20 6e 65  ervative than ne
23c40 63 65 73 73 61 72 79 2c 20 62 75 74 20 6d 75 63  cessary, but muc
23c50 68 20 65 61 73 69 65 72 20 74 68 61 6e 20 65 6e  h easier than en
23c60 66 6f 72 63 69 6e 67 0a 20 20 20 20 2a 2a 20 61  forcing.    ** a
23c70 6e 20 65 78 61 63 74 20 6c 69 6d 69 74 2e 0a 20  n exact limit.. 
23c80 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 72 73 65     */.    pParse
23c90 2d 3e 6e 48 65 69 67 68 74 20 2b 3d 20 73 71 6c  ->nHeight += sql
23ca0 69 74 65 33 53 65 6c 65 63 74 45 78 70 72 48 65  ite3SelectExprHe
23cb0 69 67 68 74 28 70 29 3b 0a 0a 20 20 20 20 69 73  ight(p);..    is
23cc0 41 67 67 53 75 62 20 3d 20 28 70 53 75 62 2d 3e  AggSub = (pSub->
23cd0 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67  selFlags & SF_Ag
23ce0 67 72 65 67 61 74 65 29 21 3d 30 3b 0a 20 20 20  gregate)!=0;.   
23cf0 20 69 66 28 20 66 6c 61 74 74 65 6e 53 75 62 71   if( flattenSubq
23d00 75 65 72 79 28 70 50 61 72 73 65 2c 20 70 2c 20  uery(pParse, p, 
23d10 69 2c 20 69 73 41 67 67 2c 20 69 73 41 67 67 53  i, isAgg, isAggS
23d20 75 62 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ub) ){.      /* 
23d30 54 68 69 73 20 73 75 62 71 75 65 72 79 20 63 61  This subquery ca
23d40 6e 20 62 65 20 61 62 73 6f 72 62 65 64 20 69 6e  n be absorbed in
23d50 74 6f 20 69 74 73 20 70 61 72 65 6e 74 2e 20 2a  to its parent. *
23d60 2f 0a 20 20 20 20 20 20 69 66 28 20 69 73 41 67  /.      if( isAg
23d70 67 53 75 62 20 29 7b 0a 20 20 20 20 20 20 20 20  gSub ){.        
23d80 69 73 41 67 67 20 3d 20 31 3b 0a 20 20 20 20 20  isAgg = 1;.     
23d90 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c     p->selFlags |
23da0 3d 20 53 46 5f 41 67 67 72 65 67 61 74 65 3b 0a  = SF_Aggregate;.
23db0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 20        }.      i 
23dc0 3d 20 2d 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20  = -1;.    }else 
23dd0 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53  if( pTabList->nS
23de0 72 63 3d 3d 31 20 26 26 20 28 70 2d 3e 73 65 6c  rc==1 && (p->sel
23df0 46 6c 61 67 73 20 26 20 53 46 5f 4d 61 74 65 72  Flags & SF_Mater
23e00 69 61 6c 69 7a 65 29 3d 3d 30 0a 20 20 20 20 20  ialize)==0.     
23e10 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e   && Optimization
23e20 45 6e 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49  Enabled(db, SQLI
23e30 54 45 5f 53 75 62 71 43 6f 72 6f 75 74 69 6e 65  TE_SubqCoroutine
23e40 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f  ).    ){.      /
23e50 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 61 20 63 6f  * Implement a co
23e60 2d 72 6f 75 74 69 6e 65 20 74 68 61 74 20 77 69  -routine that wi
23e70 6c 6c 20 72 65 74 75 72 6e 20 61 20 73 69 6e 67  ll return a sing
23e80 6c 65 20 72 6f 77 20 6f 66 20 74 68 65 20 72 65  le row of the re
23e90 73 75 6c 74 0a 20 20 20 20 20 20 2a 2a 20 73 65  sult.      ** se
23ea0 74 20 6f 6e 20 65 61 63 68 20 69 6e 76 6f 63 61  t on each invoca
23eb0 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  tion..      */. 
23ec0 20 20 20 20 20 69 6e 74 20 61 64 64 72 54 6f 70       int addrTop
23ed0 3b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  ;.      int addr
23ee0 45 6f 66 3b 0a 20 20 20 20 20 20 70 49 74 65 6d  Eof;.      pItem
23ef0 2d 3e 72 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b  ->regReturn = ++
23f00 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
23f10 20 20 20 20 61 64 64 72 45 6f 66 20 3d 20 2b 2b      addrEof = ++
23f20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
23f30 20 20 20 20 2f 2a 20 42 65 66 6f 72 65 20 63 6f      /* Before co
23f40 64 69 6e 67 20 74 68 65 20 4f 50 5f 47 6f 74 6f  ding the OP_Goto
23f50 20 74 6f 20 6a 75 6d 70 20 74 6f 20 74 68 65 20   to jump to the 
23f60 73 74 61 72 74 20 6f 66 20 74 68 65 20 6d 61 69  start of the mai
23f70 6e 20 72 6f 75 74 69 6e 65 2c 0a 20 20 20 20 20  n routine,.     
23f80 20 2a 2a 20 65 6e 73 75 72 65 20 74 68 61 74 20   ** ensure that 
23f90 74 68 65 20 6a 75 6d 70 20 74 6f 20 74 68 65 20  the jump to the 
23fa0 76 65 72 69 66 79 2d 73 63 68 65 6d 61 20 72 6f  verify-schema ro
23fb0 75 74 69 6e 65 20 68 61 73 20 61 6c 72 65 61 64  utine has alread
23fc0 79 0a 20 20 20 20 20 20 2a 2a 20 62 65 65 6e 20  y.      ** been 
23fd0 63 6f 64 65 64 2e 20 4f 74 68 65 72 77 69 73 65  coded. Otherwise
23fe0 2c 20 74 68 65 20 76 65 72 69 66 79 2d 73 63 68  , the verify-sch
23ff0 65 6d 61 20 77 6f 75 6c 64 20 6c 69 6b 65 6c 79  ema would likely
24000 20 62 65 20 63 6f 64 65 64 20 61 73 20 0a 20 20   be coded as .  
24010 20 20 20 20 2a 2a 20 70 61 72 74 20 6f 66 20 74      ** part of t
24020 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 2e 20 49  he co-routine. I
24030 66 20 74 68 65 20 6d 61 69 6e 20 72 6f 75 74 69  f the main routi
24040 6e 65 20 74 68 65 6e 20 61 63 63 65 73 73 65 64  ne then accessed
24050 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 64   the .      ** d
24060 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 20 69  atabase before i
24070 6e 76 6f 6b 69 6e 67 20 74 68 65 20 63 6f 2d 72  nvoking the co-r
24080 6f 75 74 69 6e 65 20 66 6f 72 20 74 68 65 20 66  outine for the f
24090 69 72 73 74 20 74 69 6d 65 20 28 66 6f 72 20 0a  irst time (for .
240a0 20 20 20 20 20 20 2a 2a 20 65 78 61 6d 70 6c 65        ** example
240b0 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 61   to initialize a
240c0 20 4c 49 4d 49 54 20 72 65 67 69 73 74 65 72 20   LIMIT register 
240d0 66 72 6f 6d 20 61 20 73 75 62 2d 73 65 6c 65 63  from a sub-selec
240e0 74 29 2c 20 69 74 20 77 6f 75 6c 64 20 0a 20 20  t), it would .  
240f0 20 20 20 20 2a 2a 20 62 65 20 64 6f 69 6e 67 20      ** be doing 
24100 73 6f 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e  so without havin
24110 67 20 76 65 72 69 66 69 65 64 20 74 68 65 20 73  g verified the s
24120 63 68 65 6d 61 20 76 65 72 73 69 6f 6e 20 61 6e  chema version an
24130 64 20 6f 62 74 61 69 6e 65 64 20 0a 20 20 20 20  d obtained .    
24140 20 20 2a 2a 20 74 68 65 20 72 65 71 75 69 72 65    ** the require
24150 64 20 64 62 20 6c 6f 63 6b 73 2e 20 53 65 65 20  d db locks. See 
24160 74 69 63 6b 65 74 20 64 36 62 33 36 62 65 33 38  ticket d6b36be38
24170 2e 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  .  */.      sqli
24180 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68  te3CodeVerifySch
24190 65 6d 61 28 70 50 61 72 73 65 2c 20 2d 31 29 3b  ema(pParse, -1);
241a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
241b0 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47  beAddOp0(v, OP_G
241c0 6f 74 6f 29 3b 0a 20 20 20 20 20 20 61 64 64 72  oto);.      addr
241d0 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Top = sqlite3Vdb
241e0 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4f 70  eAddOp1(v, OP_Op
241f0 65 6e 50 73 65 75 64 6f 2c 20 70 49 74 65 6d 2d  enPseudo, pItem-
24200 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20  >iCursor);.     
24210 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
24220 67 65 50 35 28 76 2c 20 31 29 3b 0a 20 20 20 20  geP5(v, 1);.    
24230 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
24240 2c 20 22 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72  , "coroutine for
24250 20 25 73 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61   %s", pItem->pTa
24260 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20  b->zName));.    
24270 20 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c    pItem->addrFil
24280 6c 53 75 62 20 3d 20 61 64 64 72 54 6f 70 3b 0a  lSub = addrTop;.
24290 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
242a0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
242b0 74 65 67 65 72 2c 20 30 2c 20 61 64 64 72 45 6f  teger, 0, addrEo
242c0 66 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  f);.      sqlite
242d0 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
242e0 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   1);.      sqlit
242f0 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74  e3SelectDestInit
24300 28 26 64 65 73 74 2c 20 53 52 54 5f 43 6f 72 6f  (&dest, SRT_Coro
24310 75 74 69 6e 65 2c 20 70 49 74 65 6d 2d 3e 72 65  utine, pItem->re
24320 67 52 65 74 75 72 6e 29 3b 0a 20 20 20 20 20 20  gReturn);.      
24330 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65  explainSetIntege
24340 72 28 70 49 74 65 6d 2d 3e 69 53 65 6c 65 63 74  r(pItem->iSelect
24350 49 64 2c 20 28 75 38 29 70 50 61 72 73 65 2d 3e  Id, (u8)pParse->
24360 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a  iNextSelectId);.
24370 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
24380 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 75 62  ect(pParse, pSub
24390 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20 20  , &dest);.      
243a0 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 6e 52 6f  pItem->pTab->nRo
243b0 77 45 73 74 20 3d 20 28 75 6e 73 69 67 6e 65 64  wEst = (unsigned
243c0 29 70 53 75 62 2d 3e 6e 53 65 6c 65 63 74 52 6f  )pSub->nSelectRo
243d0 77 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  w;.      pItem->
243e0 76 69 61 43 6f 72 6f 75 74 69 6e 65 20 3d 20 31  viaCoroutine = 1
243f0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
24400 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20 61  dbeChangeP2(v, a
24410 64 64 72 54 6f 70 2c 20 64 65 73 74 2e 69 53 64  ddrTop, dest.iSd
24420 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  st);.      sqlit
24430 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  e3VdbeChangeP3(v
24440 2c 20 61 64 64 72 54 6f 70 2c 20 64 65 73 74 2e  , addrTop, dest.
24450 6e 53 64 73 74 29 3b 0a 20 20 20 20 20 20 73 71  nSdst);.      sq
24460 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
24470 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31  v, OP_Integer, 1
24480 2c 20 61 64 64 72 45 6f 66 29 3b 0a 20 20 20 20  , addrEof);.    
24490 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
244a0 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c  Op1(v, OP_Yield,
244b0 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72   pItem->regRetur
244c0 6e 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  n);.      VdbeCo
244d0 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6e 64 20 25  mment((v, "end %
244e0 73 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d  s", pItem->pTab-
244f0 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20  >zName));.      
24500 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
24510 65 72 65 28 76 2c 20 61 64 64 72 54 6f 70 2d 31  ere(v, addrTop-1
24520 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
24530 43 6c 65 61 72 54 65 6d 70 52 65 67 43 61 63 68  ClearTempRegCach
24540 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 7d  e(pParse);.    }
24550 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 47  else{.      /* G
24560 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75  enerate a subrou
24570 74 69 6e 65 20 74 68 61 74 20 77 69 6c 6c 20 66  tine that will f
24580 69 6c 6c 20 61 6e 20 65 70 68 65 6d 65 72 61 6c  ill an ephemeral
24590 20 74 61 62 6c 65 20 77 69 74 68 0a 20 20 20 20   table with.    
245a0 20 20 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74    ** the content
245b0 20 6f 66 20 74 68 69 73 20 73 75 62 71 75 65 72   of this subquer
245c0 79 2e 20 20 70 49 74 65 6d 2d 3e 61 64 64 72 46  y.  pItem->addrF
245d0 69 6c 6c 53 75 62 20 77 69 6c 6c 20 70 6f 69 6e  illSub will poin
245e0 74 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 68  t.      ** to th
245f0 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65  e address of the
24600 20 67 65 6e 65 72 61 74 65 64 20 73 75 62 72 6f   generated subro
24610 75 74 69 6e 65 2e 20 20 70 49 74 65 6d 2d 3e 72  utine.  pItem->r
24620 65 67 52 65 74 75 72 6e 0a 20 20 20 20 20 20 2a  egReturn.      *
24630 2a 20 69 73 20 61 20 72 65 67 69 73 74 65 72 20  * is a register 
24640 61 6c 6c 6f 63 61 74 65 64 20 74 6f 20 68 6f 6c  allocated to hol
24650 64 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65  d the subroutine
24660 20 72 65 74 75 72 6e 20 61 64 64 72 65 73 73 0a   return address.
24670 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
24680 6e 74 20 74 6f 70 41 64 64 72 3b 0a 20 20 20 20  nt topAddr;.    
24690 20 20 69 6e 74 20 6f 6e 63 65 41 64 64 72 20 3d    int onceAddr =
246a0 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 65   0;.      int re
246b0 74 41 64 64 72 3b 0a 20 20 20 20 20 20 61 73 73  tAddr;.      ass
246c0 65 72 74 28 20 70 49 74 65 6d 2d 3e 61 64 64 72  ert( pItem->addr
246d0 46 69 6c 6c 53 75 62 3d 3d 30 20 29 3b 0a 20 20  FillSub==0 );.  
246e0 20 20 20 20 70 49 74 65 6d 2d 3e 72 65 67 52 65      pItem->regRe
246f0 74 75 72 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d  turn = ++pParse-
24700 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 74 6f 70  >nMem;.      top
24710 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  Addr = sqlite3Vd
24720 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
24730 6e 74 65 67 65 72 2c 20 30 2c 20 70 49 74 65 6d  nteger, 0, pItem
24740 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a 20 20  ->regReturn);.  
24750 20 20 20 20 70 49 74 65 6d 2d 3e 61 64 64 72 46      pItem->addrF
24760 69 6c 6c 53 75 62 20 3d 20 74 6f 70 41 64 64 72  illSub = topAddr
24770 2b 31 3b 0a 20 20 20 20 20 20 56 64 62 65 4e 6f  +1;.      VdbeNo
24780 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6d  opComment((v, "m
24790 61 74 65 72 69 61 6c 69 7a 65 20 25 73 22 2c 20  aterialize %s", 
247a0 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61  pItem->pTab->zNa
247b0 6d 65 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  me));.      if( 
247c0 70 49 74 65 6d 2d 3e 69 73 43 6f 72 72 65 6c 61  pItem->isCorrela
247d0 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ted==0 ){.      
247e0 20 20 2f 2a 20 49 66 20 74 68 65 20 73 75 62 71    /* If the subq
247f0 75 65 72 79 20 69 73 20 6e 6f 74 20 63 6f 72 72  uery is not corr
24800 65 6c 61 74 65 64 20 61 6e 64 20 69 66 20 77 65  elated and if we
24810 20 61 72 65 20 6e 6f 74 20 69 6e 73 69 64 65 20   are not inside 
24820 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20  of.        ** a 
24830 74 72 69 67 67 65 72 2c 20 74 68 65 6e 20 77 65  trigger, then we
24840 20 6f 6e 6c 79 20 6e 65 65 64 20 74 6f 20 63 6f   only need to co
24850 6d 70 75 74 65 20 74 68 65 20 76 61 6c 75 65 20  mpute the value 
24860 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79 0a  of the subquery.
24870 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 63 65 2e          ** once.
24880 20 2a 2f 0a 20 20 20 20 20 20 20 20 6f 6e 63 65   */.        once
24890 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33 43 6f  Addr = sqlite3Co
248a0 64 65 4f 6e 63 65 28 70 50 61 72 73 65 29 3b 0a  deOnce(pParse);.
248b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
248c0 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49  lite3SelectDestI
248d0 6e 69 74 28 26 64 65 73 74 2c 20 53 52 54 5f 45  nit(&dest, SRT_E
248e0 70 68 65 6d 54 61 62 2c 20 70 49 74 65 6d 2d 3e  phemTab, pItem->
248f0 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20  iCursor);.      
24900 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65  explainSetIntege
24910 72 28 70 49 74 65 6d 2d 3e 69 53 65 6c 65 63 74  r(pItem->iSelect
24920 49 64 2c 20 28 75 38 29 70 50 61 72 73 65 2d 3e  Id, (u8)pParse->
24930 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a  iNextSelectId);.
24940 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
24950 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 75 62  ect(pParse, pSub
24960 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20 20  , &dest);.      
24970 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 6e 52 6f  pItem->pTab->nRo
24980 77 45 73 74 20 3d 20 28 75 6e 73 69 67 6e 65 64  wEst = (unsigned
24990 29 70 53 75 62 2d 3e 6e 53 65 6c 65 63 74 52 6f  )pSub->nSelectRo
249a0 77 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 6e 63  w;.      if( onc
249b0 65 41 64 64 72 20 29 20 73 71 6c 69 74 65 33 56  eAddr ) sqlite3V
249c0 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6f  dbeJumpHere(v, o
249d0 6e 63 65 41 64 64 72 29 3b 0a 20 20 20 20 20 20  nceAddr);.      
249e0 72 65 74 41 64 64 72 20 3d 20 73 71 6c 69 74 65  retAddr = sqlite
249f0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
24a00 50 5f 52 65 74 75 72 6e 2c 20 70 49 74 65 6d 2d  P_Return, pItem-
24a10 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a 20 20 20  >regReturn);.   
24a20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
24a30 76 2c 20 22 65 6e 64 20 25 73 22 2c 20 70 49 74  v, "end %s", pIt
24a40 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  em->pTab->zName)
24a50 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
24a60 56 64 62 65 43 68 61 6e 67 65 50 31 28 76 2c 20  VdbeChangeP1(v, 
24a70 74 6f 70 41 64 64 72 2c 20 72 65 74 41 64 64 72  topAddr, retAddr
24a80 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
24a90 43 6c 65 61 72 54 65 6d 70 52 65 67 43 61 63 68  ClearTempRegCach
24aa0 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 7d  e(pParse);.    }
24ab0 0a 20 20 20 20 69 66 28 20 2f 2a 70 50 61 72 73  .    if( /*pPars
24ac0 65 2d 3e 6e 45 72 72 20 7c 7c 2a 2f 20 64 62 2d  e->nErr ||*/ db-
24ad0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
24ae0 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65  .      goto sele
24af0 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20  ct_end;.    }.  
24b00 20 20 70 50 61 72 73 65 2d 3e 6e 48 65 69 67 68    pParse->nHeigh
24b10 74 20 2d 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  t -= sqlite3Sele
24b20 63 74 45 78 70 72 48 65 69 67 68 74 28 70 29 3b  ctExprHeight(p);
24b30 0a 20 20 20 20 70 54 61 62 4c 69 73 74 20 3d 20  .    pTabList = 
24b40 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20 69 66 28  p->pSrc;.    if(
24b50 20 21 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72   !IgnorableOrder
24b60 62 79 28 70 44 65 73 74 29 20 29 7b 0a 20 20 20  by(pDest) ){.   
24b70 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d     pOrderBy = p-
24b80 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 7d  >pOrderBy;.    }
24b90 0a 20 20 7d 0a 20 20 70 45 4c 69 73 74 20 3d 20  .  }.  pEList = 
24ba0 70 2d 3e 70 45 4c 69 73 74 3b 0a 23 65 6e 64 69  p->pEList;.#endi
24bb0 66 0a 20 20 70 57 68 65 72 65 20 3d 20 70 2d 3e  f.  pWhere = p->
24bc0 70 57 68 65 72 65 3b 0a 20 20 70 47 72 6f 75 70  pWhere;.  pGroup
24bd0 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79  By = p->pGroupBy
24be0 3b 0a 20 20 70 48 61 76 69 6e 67 20 3d 20 70 2d  ;.  pHaving = p-
24bf0 3e 70 48 61 76 69 6e 67 3b 0a 20 20 73 44 69 73  >pHaving;.  sDis
24c00 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 3d 20 28  tinct.isTnct = (
24c10 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
24c20 5f 44 69 73 74 69 6e 63 74 29 21 3d 30 3b 0a 0a  _Distinct)!=0;..
24c30 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
24c40 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
24c50 45 43 54 0a 20 20 2f 2a 20 49 66 20 74 68 65 72  ECT.  /* If ther
24c60 65 20 69 73 20 61 72 65 20 61 20 73 65 71 75 65  e is are a seque
24c70 6e 63 65 20 6f 66 20 71 75 65 72 69 65 73 2c 20  nce of queries, 
24c80 64 6f 20 74 68 65 20 65 61 72 6c 69 65 72 20 6f  do the earlier o
24c90 6e 65 73 20 66 69 72 73 74 2e 0a 20 20 2a 2f 0a  nes first..  */.
24ca0 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20    if( p->pPrior 
24cb0 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 52  ){.    if( p->pR
24cc0 69 67 68 74 6d 6f 73 74 3d 3d 30 20 29 7b 0a 20  ightmost==0 ){. 
24cd0 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 4c 6f       Select *pLo
24ce0 6f 70 2c 20 2a 70 52 69 67 68 74 20 3d 20 30 3b  op, *pRight = 0;
24cf0 0a 20 20 20 20 20 20 69 6e 74 20 63 6e 74 20 3d  .      int cnt =
24d00 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 6d 78   0;.      int mx
24d10 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 66 6f  Select;.      fo
24d20 72 28 70 4c 6f 6f 70 3d 70 3b 20 70 4c 6f 6f 70  r(pLoop=p; pLoop
24d30 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70  ; pLoop=pLoop->p
24d40 50 72 69 6f 72 2c 20 63 6e 74 2b 2b 29 7b 0a 20  Prior, cnt++){. 
24d50 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 70 52         pLoop->pR
24d60 69 67 68 74 6d 6f 73 74 20 3d 20 70 3b 0a 20 20  ightmost = p;.  
24d70 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 70 4e 65        pLoop->pNe
24d80 78 74 20 3d 20 70 52 69 67 68 74 3b 0a 20 20 20  xt = pRight;.   
24d90 20 20 20 20 20 70 52 69 67 68 74 20 3d 20 70 4c       pRight = pL
24da0 6f 6f 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  oop;.      }.   
24db0 20 20 20 6d 78 53 65 6c 65 63 74 20 3d 20 64 62     mxSelect = db
24dc0 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ->aLimit[SQLITE_
24dd0 4c 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  LIMIT_COMPOUND_S
24de0 45 4c 45 43 54 5d 3b 0a 20 20 20 20 20 20 69 66  ELECT];.      if
24df0 28 20 6d 78 53 65 6c 65 63 74 20 26 26 20 63 6e  ( mxSelect && cn
24e00 74 3e 6d 78 53 65 6c 65 63 74 20 29 7b 0a 20 20  t>mxSelect ){.  
24e10 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
24e20 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
24e30 6f 6f 20 6d 61 6e 79 20 74 65 72 6d 73 20 69 6e  oo many terms in
24e40 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   compound SELECT
24e50 22 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  ");.        goto
24e60 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
24e70 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72     }.    }.    r
24e80 63 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 28  c = multiSelect(
24e90 70 50 61 72 73 65 2c 20 70 2c 20 70 44 65 73 74  pParse, p, pDest
24ea0 29 3b 0a 20 20 20 20 65 78 70 6c 61 69 6e 53 65  );.    explainSe
24eb0 74 49 6e 74 65 67 65 72 28 70 50 61 72 73 65 2d  tInteger(pParse-
24ec0 3e 69 53 65 6c 65 63 74 49 64 2c 20 69 52 65 73  >iSelectId, iRes
24ed0 74 6f 72 65 53 65 6c 65 63 74 49 64 29 3b 0a 20  toreSelectId);. 
24ee0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
24ef0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49  }.#endif..  /* I
24f00 66 20 74 68 65 72 65 20 69 73 20 62 6f 74 68 20  f there is both 
24f10 61 20 47 52 4f 55 50 20 42 59 20 61 6e 64 20 61  a GROUP BY and a
24f20 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
24f30 65 20 61 6e 64 20 74 68 65 79 20 61 72 65 0a 20  e and they are. 
24f40 20 2a 2a 20 69 64 65 6e 74 69 63 61 6c 2c 20 74   ** identical, t
24f50 68 65 6e 20 64 69 73 61 62 6c 65 20 74 68 65 20  hen disable the 
24f60 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
24f70 73 69 6e 63 65 20 74 68 65 20 47 52 4f 55 50 20  since the GROUP 
24f80 42 59 0a 20 20 2a 2a 20 77 69 6c 6c 20 63 61 75  BY.  ** will cau
24f90 73 65 20 65 6c 65 6d 65 6e 74 73 20 74 6f 20 63  se elements to c
24fa0 6f 6d 65 20 6f 75 74 20 69 6e 20 74 68 65 20 63  ome out in the c
24fb0 6f 72 72 65 63 74 20 6f 72 64 65 72 2e 20 20 54  orrect order.  T
24fc0 68 69 73 20 69 73 0a 20 20 2a 2a 20 61 6e 20 6f  his is.  ** an o
24fd0 70 74 69 6d 69 7a 61 74 69 6f 6e 20 2d 20 74 68  ptimization - th
24fe0 65 20 63 6f 72 72 65 63 74 20 61 6e 73 77 65 72  e correct answer
24ff0 20 73 68 6f 75 6c 64 20 72 65 73 75 6c 74 20 72   should result r
25000 65 67 61 72 64 6c 65 73 73 2e 0a 20 20 2a 2a 20  egardless..  ** 
25010 55 73 65 20 74 68 65 20 53 51 4c 49 54 45 5f 47  Use the SQLITE_G
25020 72 6f 75 70 42 79 4f 72 64 65 72 20 66 6c 61 67  roupByOrder flag
25030 20 77 69 74 68 20 53 51 4c 49 54 45 5f 54 45 53   with SQLITE_TES
25040 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 45 52 0a  TCTRL_OPTIMIZER.
25050 20 20 2a 2a 20 74 6f 20 64 69 73 61 62 6c 65 20    ** to disable 
25060 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f  this optimizatio
25070 6e 20 66 6f 72 20 74 65 73 74 69 6e 67 20 70 75  n for testing pu
25080 72 70 6f 73 65 73 2e 0a 20 20 2a 2f 0a 20 20 69  rposes..  */.  i
25090 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  f( sqlite3ExprLi
250a0 73 74 43 6f 6d 70 61 72 65 28 70 2d 3e 70 47 72  stCompare(p->pGr
250b0 6f 75 70 42 79 2c 20 70 4f 72 64 65 72 42 79 2c  oupBy, pOrderBy,
250c0 20 2d 31 29 3d 3d 30 0a 20 20 20 20 20 20 20 20   -1)==0.        
250d0 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e   && Optimization
250e0 45 6e 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49  Enabled(db, SQLI
250f0 54 45 5f 47 72 6f 75 70 42 79 4f 72 64 65 72 29  TE_GroupByOrder)
25100 20 29 7b 0a 20 20 20 20 70 4f 72 64 65 72 42 79   ){.    pOrderBy
25110 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 0;.  }..  /* 
25120 49 66 20 74 68 65 20 71 75 65 72 79 20 69 73 20  If the query is 
25130 44 49 53 54 49 4e 43 54 20 77 69 74 68 20 61 6e  DISTINCT with an
25140 20 4f 52 44 45 52 20 42 59 20 62 75 74 20 69 73   ORDER BY but is
25150 20 6e 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74   not an aggregat
25160 65 2c 20 61 6e 64 20 0a 20 20 2a 2a 20 69 66 20  e, and .  ** if 
25170 74 68 65 20 73 65 6c 65 63 74 2d 6c 69 73 74 20  the select-list 
25180 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 74  is the same as t
25190 68 65 20 4f 52 44 45 52 20 42 59 20 6c 69 73 74  he ORDER BY list
251a0 2c 20 74 68 65 6e 20 74 68 69 73 20 71 75 65 72  , then this quer
251b0 79 0a 20 20 2a 2a 20 63 61 6e 20 62 65 20 72 65  y.  ** can be re
251c0 77 72 69 74 74 65 6e 20 61 73 20 61 20 47 52 4f  written as a GRO
251d0 55 50 20 42 59 2e 20 49 6e 20 6f 74 68 65 72 20  UP BY. In other 
251e0 77 6f 72 64 73 2c 20 74 68 69 73 3a 0a 20 20 2a  words, this:.  *
251f0 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43  *.  **     SELEC
25200 54 20 44 49 53 54 49 4e 43 54 20 78 79 7a 20 46  T DISTINCT xyz F
25210 52 4f 4d 20 2e 2e 2e 20 4f 52 44 45 52 20 42 59  ROM ... ORDER BY
25220 20 78 79 7a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 69   xyz.  **.  ** i
25230 73 20 74 72 61 6e 73 66 6f 72 6d 65 64 20 74 6f  s transformed to
25240 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
25250 53 45 4c 45 43 54 20 78 79 7a 20 46 52 4f 4d 20  SELECT xyz FROM 
25260 2e 2e 2e 20 47 52 4f 55 50 20 42 59 20 78 79 7a  ... GROUP BY xyz
25270 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 73  .  **.  ** The s
25280 65 63 6f 6e 64 20 66 6f 72 6d 20 69 73 20 70 72  econd form is pr
25290 65 66 65 72 72 65 64 20 61 73 20 61 20 73 69 6e  eferred as a sin
252a0 67 6c 65 20 69 6e 64 65 78 20 28 6f 72 20 74 65  gle index (or te
252b0 6d 70 2d 74 61 62 6c 65 29 20 6d 61 79 20 62 65  mp-table) may be
252c0 20 0a 20 20 2a 2a 20 75 73 65 64 20 66 6f 72 20   .  ** used for 
252d0 62 6f 74 68 20 74 68 65 20 4f 52 44 45 52 20 42  both the ORDER B
252e0 59 20 61 6e 64 20 44 49 53 54 49 4e 43 54 20 70  Y and DISTINCT p
252f0 72 6f 63 65 73 73 69 6e 67 2e 20 41 73 20 6f 72  rocessing. As or
25300 69 67 69 6e 61 6c 6c 79 20 0a 20 20 2a 2a 20 77  iginally .  ** w
25310 72 69 74 74 65 6e 20 74 68 65 20 71 75 65 72 79  ritten the query
25320 20 6d 75 73 74 20 75 73 65 20 61 20 74 65 6d 70   must use a temp
25330 2d 74 61 62 6c 65 20 66 6f 72 20 61 74 20 6c 65  -table for at le
25340 61 73 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 4f  ast one of the O
25350 52 44 45 52 20 0a 20 20 2a 2a 20 42 59 20 61 6e  RDER .  ** BY an
25360 64 20 44 49 53 54 49 4e 43 54 2c 20 61 6e 64 20  d DISTINCT, and 
25370 61 6e 20 69 6e 64 65 78 20 6f 72 20 73 65 70 61  an index or sepa
25380 72 61 74 65 20 74 65 6d 70 2d 74 61 62 6c 65 20  rate temp-table 
25390 66 6f 72 20 74 68 65 20 6f 74 68 65 72 2e 0a 20  for the other.. 
253a0 20 2a 2f 0a 20 20 69 66 28 20 28 70 2d 3e 73 65   */.  if( (p->se
253b0 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73  lFlags & (SF_Dis
253c0 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61  tinct|SF_Aggrega
253d0 74 65 29 29 3d 3d 53 46 5f 44 69 73 74 69 6e 63  te))==SF_Distinc
253e0 74 20 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33  t .   && sqlite3
253f0 45 78 70 72 4c 69 73 74 43 6f 6d 70 61 72 65 28  ExprListCompare(
25400 70 4f 72 64 65 72 42 79 2c 20 70 2d 3e 70 45 4c  pOrderBy, p->pEL
25410 69 73 74 2c 20 2d 31 29 3d 3d 30 0a 20 20 29 7b  ist, -1)==0.  ){
25420 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73  .    p->selFlags
25430 20 26 3d 20 7e 53 46 5f 44 69 73 74 69 6e 63 74   &= ~SF_Distinct
25440 3b 0a 20 20 20 20 70 2d 3e 70 47 72 6f 75 70 42  ;.    p->pGroupB
25450 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  y = sqlite3ExprL
25460 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 45  istDup(db, p->pE
25470 4c 69 73 74 2c 20 30 29 3b 0a 20 20 20 20 70 47  List, 0);.    pG
25480 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f  roupBy = p->pGro
25490 75 70 42 79 3b 0a 20 20 20 20 70 4f 72 64 65 72  upBy;.    pOrder
254a0 42 79 20 3d 20 30 3b 0a 20 20 20 20 2f 2a 20 4e  By = 0;.    /* N
254b0 6f 74 69 63 65 20 74 68 61 74 20 65 76 65 6e 20  otice that even 
254c0 74 68 6f 75 67 68 74 20 53 46 5f 44 69 73 74 69  thought SF_Disti
254d0 6e 63 74 20 68 61 73 20 62 65 65 6e 20 63 6c 65  nct has been cle
254e0 61 72 65 64 20 66 72 6f 6d 20 70 2d 3e 73 65 6c  ared from p->sel
254f0 46 6c 61 67 73 2c 0a 20 20 20 20 2a 2a 20 74 68  Flags,.    ** th
25500 65 20 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e  e sDistinct.isTn
25510 63 74 20 69 73 20 73 74 69 6c 6c 20 73 65 74 2e  ct is still set.
25520 20 20 48 65 6e 63 65 2c 20 69 73 54 6e 63 74 20    Hence, isTnct 
25530 72 65 70 72 65 73 65 6e 74 73 20 74 68 65 0a 20  represents the. 
25540 20 20 20 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 73     ** original s
25550 65 74 74 69 6e 67 20 6f 66 20 74 68 65 20 53 46  etting of the SF
25560 5f 44 69 73 74 69 6e 63 74 20 66 6c 61 67 2c 20  _Distinct flag, 
25570 6e 6f 74 20 74 68 65 20 63 75 72 72 65 6e 74 20  not the current 
25580 73 65 74 74 69 6e 67 20 2a 2f 0a 20 20 20 20 61  setting */.    a
25590 73 73 65 72 74 28 20 73 44 69 73 74 69 6e 63 74  ssert( sDistinct
255a0 2e 69 73 54 6e 63 74 20 29 3b 0a 20 20 7d 0a 0a  .isTnct );.  }..
255b0 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
255c0 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
255d0 75 73 65 2c 20 74 68 65 6e 20 74 68 69 73 20 73  use, then this s
255e0 6f 72 74 69 6e 67 0a 20 20 2a 2a 20 69 6e 64 65  orting.  ** inde
255f0 78 20 6d 69 67 68 74 20 65 6e 64 20 75 70 20 62  x might end up b
25600 65 69 6e 67 20 75 6e 75 73 65 64 20 69 66 20 74  eing unused if t
25610 68 65 20 64 61 74 61 20 63 61 6e 20 62 65 20 0a  he data can be .
25620 20 20 2a 2a 20 65 78 74 72 61 63 74 65 64 20 69    ** extracted i
25630 6e 20 70 72 65 2d 73 6f 72 74 65 64 20 6f 72 64  n pre-sorted ord
25640 65 72 2e 20 20 49 66 20 74 68 61 74 20 69 73 20  er.  If that is 
25650 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e 20 74  the case, then t
25660 68 65 0a 20 20 2a 2a 20 4f 50 5f 4f 70 65 6e 45  he.  ** OP_OpenE
25670 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 75 63  phemeral instruc
25680 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 63 68 61  tion will be cha
25690 6e 67 65 64 20 74 6f 20 61 6e 20 4f 50 5f 4e 6f  nged to an OP_No
256a0 6f 70 20 6f 6e 63 65 0a 20 20 2a 2a 20 77 65 20  op once.  ** we 
256b0 66 69 67 75 72 65 20 6f 75 74 20 74 68 61 74 20  figure out that 
256c0 74 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65  the sorting inde
256d0 78 20 69 73 20 6e 6f 74 20 6e 65 65 64 65 64 2e  x is not needed.
256e0 20 20 54 68 65 20 61 64 64 72 53 6f 72 74 49 6e    The addrSortIn
256f0 64 65 78 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c  dex.  ** variabl
25700 65 20 69 73 20 75 73 65 64 20 74 6f 20 66 61 63  e is used to fac
25710 69 6c 69 74 61 74 65 20 74 68 61 74 20 63 68 61  ilitate that cha
25720 6e 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  nge..  */.  if( 
25730 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
25740 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
25750 6f 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 20  o;.    pKeyInfo 
25760 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70  = keyInfoFromExp
25770 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 4f  rList(pParse, pO
25780 72 64 65 72 42 79 29 3b 0a 20 20 20 20 70 4f 72  rderBy);.    pOr
25790 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 20  derBy->iECursor 
257a0 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
257b0 3b 0a 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65  ;.    p->addrOpe
257c0 6e 45 70 68 6d 5b 32 5d 20 3d 20 61 64 64 72 53  nEphm[2] = addrS
257d0 6f 72 74 49 6e 64 65 78 20 3d 0a 20 20 20 20 20  ortIndex =.     
257e0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
257f0 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p4(v, OP_OpenEph
25800 65 6d 65 72 61 6c 2c 0a 20 20 20 20 20 20 20 20  emeral,.        
25810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25820 20 20 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43     pOrderBy->iEC
25830 75 72 73 6f 72 2c 20 70 4f 72 64 65 72 42 79 2d  ursor, pOrderBy-
25840 3e 6e 45 78 70 72 2b 32 2c 20 30 2c 0a 20 20 20  >nExpr+2, 0,.   
25850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25860 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70          (char*)p
25870 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49  KeyInfo, P4_KEYI
25880 4e 46 4f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  NFO);.  }else{. 
25890 20 20 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78     addrSortIndex
258a0 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a   = -1;.  }..  /*
258b0 20 49 66 20 74 68 65 20 6f 75 74 70 75 74 20 69   If the output i
258c0 73 20 64 65 73 74 69 6e 65 64 20 66 6f 72 20 61  s destined for a
258d0 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
258e0 2c 20 6f 70 65 6e 20 74 68 61 74 20 74 61 62 6c  , open that tabl
258f0 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 44  e..  */.  if( pD
25900 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
25910 45 70 68 65 6d 54 61 62 20 29 7b 0a 20 20 20 20  EphemTab ){.    
25920 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
25930 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65  2(v, OP_OpenEphe
25940 6d 65 72 61 6c 2c 20 70 44 65 73 74 2d 3e 69 53  meral, pDest->iS
25950 44 50 61 72 6d 2c 20 70 45 4c 69 73 74 2d 3e 6e  DParm, pEList->n
25960 45 78 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Expr);.  }..  /*
25970 20 53 65 74 20 74 68 65 20 6c 69 6d 69 74 65 72   Set the limiter
25980 2e 0a 20 20 2a 2f 0a 20 20 69 45 6e 64 20 3d 20  ..  */.  iEnd = 
25990 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
259a0 61 62 65 6c 28 76 29 3b 0a 20 20 70 2d 3e 6e 53  abel(v);.  p->nS
259b0 65 6c 65 63 74 52 6f 77 20 3d 20 4c 41 52 47 45  electRow = LARGE
259c0 53 54 5f 49 4e 54 36 34 3b 0a 20 20 63 6f 6d 70  ST_INT64;.  comp
259d0 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72  uteLimitRegister
259e0 73 28 70 50 61 72 73 65 2c 20 70 2c 20 69 45 6e  s(pParse, p, iEn
259f0 64 29 3b 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69  d);.  if( p->iLi
25a00 6d 69 74 3d 3d 30 20 26 26 20 61 64 64 72 53 6f  mit==0 && addrSo
25a10 72 74 49 6e 64 65 78 3e 3d 30 20 29 7b 0a 20 20  rtIndex>=0 ){.  
25a20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74    sqlite3VdbeGet
25a30 4f 70 28 76 2c 20 61 64 64 72 53 6f 72 74 49 6e  Op(v, addrSortIn
25a40 64 65 78 29 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f  dex)->opcode = O
25a50 50 5f 53 6f 72 74 65 72 4f 70 65 6e 3b 0a 20 20  P_SorterOpen;.  
25a60 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d    p->selFlags |=
25a70 20 53 46 5f 55 73 65 53 6f 72 74 65 72 3b 0a 20   SF_UseSorter;. 
25a80 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 20   }..  /* Open a 
25a90 76 69 72 74 75 61 6c 20 69 6e 64 65 78 20 74 6f  virtual index to
25aa0 20 75 73 65 20 66 6f 72 20 74 68 65 20 64 69 73   use for the dis
25ab0 74 69 6e 63 74 20 73 65 74 2e 0a 20 20 2a 2f 0a  tinct set..  */.
25ac0 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67    if( p->selFlag
25ad0 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 20  s & SF_Distinct 
25ae0 29 7b 0a 20 20 20 20 73 44 69 73 74 69 6e 63 74  ){.    sDistinct
25af0 2e 74 61 62 54 6e 63 74 20 3d 20 70 50 61 72 73  .tabTnct = pPars
25b00 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 73  e->nTab++;.    s
25b10 44 69 73 74 69 6e 63 74 2e 61 64 64 72 54 6e 63  Distinct.addrTnc
25b20 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  t = sqlite3VdbeA
25b30 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp4(v, OP_Open
25b40 45 70 68 65 6d 65 72 61 6c 2c 0a 20 20 20 20 20  Ephemeral,.     
25b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25b60 20 20 20 20 20 20 20 20 20 20 20 73 44 69 73 74             sDist
25b70 69 6e 63 74 2e 74 61 62 54 6e 63 74 2c 20 30 2c  inct.tabTnct, 0,
25b80 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
25b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25ba0 20 20 20 20 28 63 68 61 72 2a 29 6b 65 79 49 6e      (char*)keyIn
25bb0 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70  foFromExprList(p
25bc0 50 61 72 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74  Parse, p->pEList
25bd0 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
25be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25bf0 20 20 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a     P4_KEYINFO);.
25c00 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
25c10 68 61 6e 67 65 50 35 28 76 2c 20 42 54 52 45 45  hangeP5(v, BTREE
25c20 5f 55 4e 4f 52 44 45 52 45 44 29 3b 0a 20 20 20  _UNORDERED);.   
25c30 20 73 44 69 73 74 69 6e 63 74 2e 65 54 6e 63 74   sDistinct.eTnct
25c40 54 79 70 65 20 3d 20 57 48 45 52 45 5f 44 49 53  Type = WHERE_DIS
25c50 54 49 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44 3b  TINCT_UNORDERED;
25c60 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 44  .  }else{.    sD
25c70 69 73 74 69 6e 63 74 2e 65 54 6e 63 74 54 79 70  istinct.eTnctTyp
25c80 65 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e  e = WHERE_DISTIN
25c90 43 54 5f 4e 4f 4f 50 3b 0a 20 20 7d 0a 0a 20 20  CT_NOOP;.  }..  
25ca0 69 66 28 20 21 69 73 41 67 67 20 26 26 20 70 47  if( !isAgg && pG
25cb0 72 6f 75 70 42 79 3d 3d 30 20 29 7b 0a 20 20 20  roupBy==0 ){.   
25cc0 20 2f 2a 20 4e 6f 20 61 67 67 72 65 67 61 74 65   /* No aggregate
25cd0 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 20 6e   functions and n
25ce0 6f 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  o GROUP BY claus
25cf0 65 20 2a 2f 0a 20 20 20 20 75 31 36 20 77 63 74  e */.    u16 wct
25d00 72 6c 46 6c 61 67 73 20 3d 20 28 73 44 69 73 74  rlFlags = (sDist
25d10 69 6e 63 74 2e 69 73 54 6e 63 74 20 3f 20 57 48  inct.isTnct ? WH
25d20 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43  ERE_WANT_DISTINC
25d30 54 20 3a 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20  T : 0);..    /* 
25d40 42 65 67 69 6e 20 74 68 65 20 64 61 74 61 62 61  Begin the databa
25d50 73 65 20 73 63 61 6e 2e 20 2a 2f 0a 20 20 20 20  se scan. */.    
25d60 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33  pWInfo = sqlite3
25d70 57 68 65 72 65 42 65 67 69 6e 28 70 50 61 72 73  WhereBegin(pPars
25d80 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68  e, pTabList, pWh
25d90 65 72 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 70  ere, pOrderBy, p
25da0 2d 3e 70 45 4c 69 73 74 2c 0a 20 20 20 20 20 20  ->pEList,.      
25db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25dc0 20 20 20 20 20 20 20 20 20 77 63 74 72 6c 46 6c           wctrlFl
25dd0 61 67 73 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  ags, 0);.    if(
25de0 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74   pWInfo==0 ) got
25df0 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
25e00 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65    if( sqlite3Whe
25e10 72 65 4f 75 74 70 75 74 52 6f 77 43 6f 75 6e 74  reOutputRowCount
25e20 28 70 57 49 6e 66 6f 29 20 3c 20 70 2d 3e 6e 53  (pWInfo) < p->nS
25e30 65 6c 65 63 74 52 6f 77 20 29 7b 0a 20 20 20 20  electRow ){.    
25e40 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20    p->nSelectRow 
25e50 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 4f 75  = sqlite3WhereOu
25e60 74 70 75 74 52 6f 77 43 6f 75 6e 74 28 70 57 49  tputRowCount(pWI
25e70 6e 66 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  nfo);.    }.    
25e80 69 66 28 20 73 44 69 73 74 69 6e 63 74 2e 69 73  if( sDistinct.is
25e90 54 6e 63 74 20 26 26 20 73 71 6c 69 74 65 33 57  Tnct && sqlite3W
25ea0 68 65 72 65 49 73 44 69 73 74 69 6e 63 74 28 70  hereIsDistinct(p
25eb0 57 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20 20 20  WInfo) ){.      
25ec0 73 44 69 73 74 69 6e 63 74 2e 65 54 6e 63 74 54  sDistinct.eTnctT
25ed0 79 70 65 20 3d 20 73 71 6c 69 74 65 33 57 68 65  ype = sqlite3Whe
25ee0 72 65 49 73 44 69 73 74 69 6e 63 74 28 70 57 49  reIsDistinct(pWI
25ef0 6e 66 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  nfo);.    }.    
25f00 69 66 28 20 70 4f 72 64 65 72 42 79 20 26 26 20  if( pOrderBy && 
25f10 73 71 6c 69 74 65 33 57 68 65 72 65 49 73 4f 72  sqlite3WhereIsOr
25f20 64 65 72 65 64 28 70 57 49 6e 66 6f 29 20 29 20  dered(pWInfo) ) 
25f30 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 0a 20  pOrderBy = 0;.. 
25f40 20 20 20 2f 2a 20 49 66 20 73 6f 72 74 69 6e 67     /* If sorting
25f50 20 69 6e 64 65 78 20 74 68 61 74 20 77 61 73 20   index that was 
25f60 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72 69  created by a pri
25f70 6f 72 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  or OP_OpenEpheme
25f80 72 61 6c 20 0a 20 20 20 20 2a 2a 20 69 6e 73 74  ral .    ** inst
25f90 72 75 63 74 69 6f 6e 20 65 6e 64 65 64 20 75 70  ruction ended up
25fa0 20 6e 6f 74 20 62 65 69 6e 67 20 6e 65 65 64 65   not being neede
25fb0 64 2c 20 74 68 65 6e 20 63 68 61 6e 67 65 20 74  d, then change t
25fc0 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  he OP_OpenEpheme
25fd0 72 61 6c 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20  ral.    ** into 
25fe0 61 6e 20 4f 50 5f 4e 6f 6f 70 2e 0a 20 20 20 20  an OP_Noop..    
25ff0 2a 2f 0a 20 20 20 20 69 66 28 20 61 64 64 72 53  */.    if( addrS
26000 6f 72 74 49 6e 64 65 78 3e 3d 30 20 26 26 20 70  ortIndex>=0 && p
26010 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20  OrderBy==0 ){.  
26020 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
26030 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 61  hangeToNoop(v, a
26040 64 64 72 53 6f 72 74 49 6e 64 65 78 29 3b 0a 20  ddrSortIndex);. 
26050 20 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e       p->addrOpen
26060 45 70 68 6d 5b 32 5d 20 3d 20 2d 31 3b 0a 20 20  Ephm[2] = -1;.  
26070 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 73 65 20    }..    /* Use 
26080 74 68 65 20 73 74 61 6e 64 61 72 64 20 69 6e 6e  the standard inn
26090 65 72 20 6c 6f 6f 70 2e 20 2a 2f 0a 20 20 20 20  er loop. */.    
260a0 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28  selectInnerLoop(
260b0 70 50 61 72 73 65 2c 20 70 2c 20 70 45 4c 69 73  pParse, p, pELis
260c0 74 2c 20 30 2c 20 30 2c 20 70 4f 72 64 65 72 42  t, 0, 0, pOrderB
260d0 79 2c 20 26 73 44 69 73 74 69 6e 63 74 2c 20 70  y, &sDistinct, p
260e0 44 65 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20  Dest,.          
260f0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
26100 33 57 68 65 72 65 43 6f 6e 74 69 6e 75 65 4c 61  3WhereContinueLa
26110 62 65 6c 28 70 57 49 6e 66 6f 29 2c 0a 20 20 20  bel(pWInfo),.   
26120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26130 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 72 65   sqlite3WhereBre
26140 61 6b 4c 61 62 65 6c 28 70 57 49 6e 66 6f 29 29  akLabel(pWInfo))
26150 3b 0a 0a 20 20 20 20 2f 2a 20 45 6e 64 20 74 68  ;..    /* End th
26160 65 20 64 61 74 61 62 61 73 65 20 73 63 61 6e 20  e database scan 
26170 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  loop..    */.   
26180 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
26190 28 70 57 49 6e 66 6f 29 3b 0a 20 20 7d 65 6c 73  (pWInfo);.  }els
261a0 65 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 63  e{.    /* This c
261b0 61 73 65 20 77 68 65 6e 20 74 68 65 72 65 20 65  ase when there e
261c0 78 69 73 74 20 61 67 67 72 65 67 61 74 65 20 66  xist aggregate f
261d0 75 6e 63 74 69 6f 6e 73 20 6f 72 20 61 20 47 52  unctions or a GR
261e0 4f 55 50 20 42 59 20 63 6c 61 75 73 65 0a 20 20  OUP BY clause.  
261f0 20 20 2a 2a 20 6f 72 20 62 6f 74 68 20 2a 2f 0a    ** or both */.
26200 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20      NameContext 
26210 73 4e 43 3b 20 20 20 20 2f 2a 20 4e 61 6d 65 20  sNC;    /* Name 
26220 63 6f 6e 74 65 78 74 20 66 6f 72 20 70 72 6f 63  context for proc
26230 65 73 73 69 6e 67 20 61 67 67 72 65 67 61 74 65  essing aggregate
26240 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a   information */.
26250 20 20 20 20 69 6e 74 20 69 41 4d 65 6d 3b 20 20      int iAMem;  
26260 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
26270 20 4d 65 6d 20 61 64 64 72 65 73 73 20 66 6f 72   Mem address for
26280 20 73 74 6f 72 69 6e 67 20 63 75 72 72 65 6e 74   storing current
26290 20 47 52 4f 55 50 20 42 59 20 2a 2f 0a 20 20 20   GROUP BY */.   
262a0 20 69 6e 74 20 69 42 4d 65 6d 3b 20 20 20 20 20   int iBMem;     
262b0 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 4d 65       /* First Me
262c0 6d 20 61 64 64 72 65 73 73 20 66 6f 72 20 70 72  m address for pr
262d0 65 76 69 6f 75 73 20 47 52 4f 55 50 20 42 59 20  evious GROUP BY 
262e0 2a 2f 0a 20 20 20 20 69 6e 74 20 69 55 73 65 46  */.    int iUseF
262f0 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a 20 4d 65  lag;       /* Me
26300 6d 20 61 64 64 72 65 73 73 20 68 6f 6c 64 69 6e  m address holdin
26310 67 20 66 6c 61 67 20 69 6e 64 69 63 61 74 69 6e  g flag indicatin
26320 67 20 74 68 61 74 20 61 74 20 6c 65 61 73 74 0a  g that at least.
26330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26340 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 65 20 72          ** one r
26350 6f 77 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20  ow of the input 
26360 74 6f 20 74 68 65 20 61 67 67 72 65 67 61 74 6f  to the aggregato
26370 72 20 68 61 73 20 62 65 65 6e 0a 20 20 20 20 20  r has been.     
26380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26390 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 65 64 20     ** processed 
263a0 2a 2f 0a 20 20 20 20 69 6e 74 20 69 41 62 6f 72  */.    int iAbor
263b0 74 46 6c 61 67 3b 20 20 20 20 20 2f 2a 20 4d 65  tFlag;     /* Me
263c0 6d 20 61 64 64 72 65 73 73 20 77 68 69 63 68 20  m address which 
263d0 63 61 75 73 65 73 20 71 75 65 72 79 20 61 62 6f  causes query abo
263e0 72 74 20 69 66 20 70 6f 73 69 74 69 76 65 20 2a  rt if positive *
263f0 2f 0a 20 20 20 20 69 6e 74 20 67 72 6f 75 70 42  /.    int groupB
26400 79 53 6f 72 74 3b 20 20 20 20 2f 2a 20 52 6f 77  ySort;    /* Row
26410 73 20 63 6f 6d 65 20 66 72 6f 6d 20 73 6f 75 72  s come from sour
26420 63 65 20 69 6e 20 47 52 4f 55 50 20 42 59 20 6f  ce in GROUP BY o
26430 72 64 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20  rder */.    int 
26440 61 64 64 72 45 6e 64 3b 20 20 20 20 20 20 20 20  addrEnd;        
26450 2f 2a 20 45 6e 64 20 6f 66 20 70 72 6f 63 65 73  /* End of proces
26460 73 69 6e 67 20 66 6f 72 20 74 68 69 73 20 53 45  sing for this SE
26470 4c 45 43 54 20 2a 2f 0a 20 20 20 20 69 6e 74 20  LECT */.    int 
26480 73 6f 72 74 50 54 61 62 20 3d 20 30 3b 20 20 20  sortPTab = 0;   
26490 2f 2a 20 50 73 65 75 64 6f 74 61 62 6c 65 20 75  /* Pseudotable u
264a0 73 65 64 20 74 6f 20 64 65 63 6f 64 65 20 73 6f  sed to decode so
264b0 72 74 69 6e 67 20 72 65 73 75 6c 74 73 20 2a 2f  rting results */
264c0 0a 20 20 20 20 69 6e 74 20 73 6f 72 74 4f 75 74  .    int sortOut
264d0 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4f 75 74 70   = 0;    /* Outp
264e0 75 74 20 72 65 67 69 73 74 65 72 20 66 72 6f 6d  ut register from
264f0 20 74 68 65 20 73 6f 72 74 65 72 20 2a 2f 0a 0a   the sorter */..
26500 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 61 6e      /* Remove an
26510 79 20 61 6e 64 20 61 6c 6c 20 61 6c 69 61 73 65  y and all aliase
26520 73 20 62 65 74 77 65 65 6e 20 74 68 65 20 72 65  s between the re
26530 73 75 6c 74 20 73 65 74 20 61 6e 64 20 74 68 65  sult set and the
26540 0a 20 20 20 20 2a 2a 20 47 52 4f 55 50 20 42 59  .    ** GROUP BY
26550 20 63 6c 61 75 73 65 2e 0a 20 20 20 20 2a 2f 0a   clause..    */.
26560 20 20 20 20 69 66 28 20 70 47 72 6f 75 70 42 79      if( pGroupBy
26570 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6b 3b   ){.      int k;
26580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26590 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
265a0 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20  counter */.     
265b0 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
265c0 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 20 20 2f  _item *pItem;  /
265d0 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76  * For looping ov
265e0 65 72 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e  er expression in
265f0 20 61 20 6c 69 73 74 20 2a 2f 0a 0a 20 20 20 20   a list */..    
26600 20 20 66 6f 72 28 6b 3d 70 2d 3e 70 45 4c 69 73    for(k=p->pELis
26610 74 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d  t->nExpr, pItem=
26620 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b 20 6b 3e  p->pEList->a; k>
26630 30 3b 20 6b 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29  0; k--, pItem++)
26640 7b 0a 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d  {.        pItem-
26650 3e 75 2e 78 2e 69 41 6c 69 61 73 20 3d 20 30 3b  >u.x.iAlias = 0;
26660 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
26670 6f 72 28 6b 3d 70 47 72 6f 75 70 42 79 2d 3e 6e  or(k=pGroupBy->n
26680 45 78 70 72 2c 20 70 49 74 65 6d 3d 70 47 72 6f  Expr, pItem=pGro
26690 75 70 42 79 2d 3e 61 3b 20 6b 3e 30 3b 20 6b 2d  upBy->a; k>0; k-
266a0 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  -, pItem++){.   
266b0 20 20 20 20 20 70 49 74 65 6d 2d 3e 75 2e 78 2e       pItem->u.x.
266c0 69 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20 20 20  iAlias = 0;.    
266d0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 2d    }.      if( p-
266e0 3e 6e 53 65 6c 65 63 74 52 6f 77 3e 31 30 30 20  >nSelectRow>100 
266f0 29 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20  ) p->nSelectRow 
26700 3d 20 31 30 30 3b 0a 20 20 20 20 7d 65 6c 73 65  = 100;.    }else
26710 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65  {.      p->nSele
26720 63 74 52 6f 77 20 3d 20 31 3b 0a 20 20 20 20 7d  ctRow = 1;.    }
26730 0a 0a 20 0a 20 20 20 20 2f 2a 20 43 72 65 61 74  .. .    /* Creat
26740 65 20 61 20 6c 61 62 65 6c 20 74 6f 20 6a 75 6d  e a label to jum
26750 70 20 74 6f 20 77 68 65 6e 20 77 65 20 77 61 6e  p to when we wan
26760 74 20 74 6f 20 61 62 6f 72 74 20 74 68 65 20 71  t to abort the q
26770 75 65 72 79 20 2a 2f 0a 20 20 20 20 61 64 64 72  uery */.    addr
26780 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62  End = sqlite3Vdb
26790 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a  eMakeLabel(v);..
267a0 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 54      /* Convert T
267b0 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73 20 69  K_COLUMN nodes i
267c0 6e 74 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  nto TK_AGG_COLUM
267d0 4e 20 61 6e 64 20 6d 61 6b 65 20 65 6e 74 72 69  N and make entri
267e0 65 73 20 69 6e 0a 20 20 20 20 2a 2a 20 73 41 67  es in.    ** sAg
267f0 67 49 6e 66 6f 20 66 6f 72 20 61 6c 6c 20 54 4b  gInfo for all TK
26800 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 6e 6f  _AGG_FUNCTION no
26810 64 65 73 20 69 6e 20 65 78 70 72 65 73 73 69 6f  des in expressio
26820 6e 73 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a  ns of the.    **
26830 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
26840 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6d 65  t..    */.    me
26850 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c 20 73 69  mset(&sNC, 0, si
26860 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20 20 20  zeof(sNC));.    
26870 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 50 61  sNC.pParse = pPa
26880 72 73 65 3b 0a 20 20 20 20 73 4e 43 2e 70 53 72  rse;.    sNC.pSr
26890 63 4c 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74  cList = pTabList
268a0 3b 0a 20 20 20 20 73 4e 43 2e 70 41 67 67 49 6e  ;.    sNC.pAggIn
268b0 66 6f 20 3d 20 26 73 41 67 67 49 6e 66 6f 3b 0a  fo = &sAggInfo;.
268c0 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6d 6e 52      sAggInfo.mnR
268d0 65 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  eg = pParse->nMe
268e0 6d 2b 31 3b 0a 20 20 20 20 73 41 67 67 49 6e 66  m+1;.    sAggInf
268f0 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e  o.nSortingColumn
26900 20 3d 20 70 47 72 6f 75 70 42 79 20 3f 20 70 47   = pGroupBy ? pG
26910 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2b 31 20  roupBy->nExpr+1 
26920 3a 20 30 3b 0a 20 20 20 20 73 41 67 67 49 6e 66  : 0;.    sAggInf
26930 6f 2e 70 47 72 6f 75 70 42 79 20 3d 20 70 47 72  o.pGroupBy = pGr
26940 6f 75 70 42 79 3b 0a 20 20 20 20 73 71 6c 69 74  oupBy;.    sqlit
26950 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
26960 4c 69 73 74 28 26 73 4e 43 2c 20 70 45 4c 69 73  List(&sNC, pELis
26970 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  t);.    sqlite3E
26980 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73  xprAnalyzeAggLis
26990 74 28 26 73 4e 43 2c 20 70 4f 72 64 65 72 42 79  t(&sNC, pOrderBy
269a0 29 3b 0a 20 20 20 20 69 66 28 20 70 48 61 76 69  );.    if( pHavi
269b0 6e 67 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ng ){.      sqli
269c0 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
269d0 67 72 65 67 61 74 65 73 28 26 73 4e 43 2c 20 70  gregates(&sNC, p
269e0 48 61 76 69 6e 67 29 3b 0a 20 20 20 20 7d 0a 20  Having);.    }. 
269f0 20 20 20 73 41 67 67 49 6e 66 6f 2e 6e 41 63 63     sAggInfo.nAcc
26a00 75 6d 75 6c 61 74 6f 72 20 3d 20 73 41 67 67 49  umulator = sAggI
26a10 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20  nfo.nColumn;.   
26a20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67 67   for(i=0; i<sAgg
26a30 49 6e 66 6f 2e 6e 46 75 6e 63 3b 20 69 2b 2b 29  Info.nFunc; i++)
26a40 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
26a50 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
26a60 28 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b  (sAggInfo.aFunc[
26a70 69 5d 2e 70 45 78 70 72 2c 20 45 50 5f 78 49 73  i].pExpr, EP_xIs
26a80 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20  Select) );.     
26a90 20 73 4e 43 2e 6e 63 46 6c 61 67 73 20 7c 3d 20   sNC.ncFlags |= 
26aa0 4e 43 5f 49 6e 41 67 67 46 75 6e 63 3b 0a 20 20  NC_InAggFunc;.  
26ab0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41      sqlite3ExprA
26ac0 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 26 73  nalyzeAggList(&s
26ad0 4e 43 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46 75  NC, sAggInfo.aFu
26ae0 6e 63 5b 69 5d 2e 70 45 78 70 72 2d 3e 78 2e 70  nc[i].pExpr->x.p
26af0 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 73 4e 43  List);.      sNC
26b00 2e 6e 63 46 6c 61 67 73 20 26 3d 20 7e 4e 43 5f  .ncFlags &= ~NC_
26b10 49 6e 41 67 67 46 75 6e 63 3b 0a 20 20 20 20 7d  InAggFunc;.    }
26b20 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6d 78  .    sAggInfo.mx
26b30 52 65 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  Reg = pParse->nM
26b40 65 6d 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e  em;.    if( db->
26b50 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67  mallocFailed ) g
26b60 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
26b70 0a 20 20 20 20 2f 2a 20 50 72 6f 63 65 73 73 69  .    /* Processi
26b80 6e 67 20 66 6f 72 20 61 67 67 72 65 67 61 74 65  ng for aggregate
26b90 73 20 77 69 74 68 20 47 52 4f 55 50 20 42 59 20  s with GROUP BY 
26ba0 69 73 20 76 65 72 79 20 64 69 66 66 65 72 65 6e  is very differen
26bb0 74 20 61 6e 64 0a 20 20 20 20 2a 2a 20 6d 75 63  t and.    ** muc
26bc0 68 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20 74  h more complex t
26bd0 68 61 6e 20 61 67 67 72 65 67 61 74 65 73 20 77  han aggregates w
26be0 69 74 68 6f 75 74 20 61 20 47 52 4f 55 50 20 42  ithout a GROUP B
26bf0 59 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  Y..    */.    if
26c00 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20  ( pGroupBy ){.  
26c10 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65      KeyInfo *pKe
26c20 79 49 6e 66 6f 3b 20 20 2f 2a 20 4b 65 79 69 6e  yInfo;  /* Keyin
26c30 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f  g information fo
26c40 72 20 74 68 65 20 67 72 6f 75 70 20 62 79 20 63  r the group by c
26c50 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 69  lause */.      i
26c60 6e 74 20 6a 31 3b 20 20 20 20 20 20 20 20 20 20  nt j1;          
26c70 20 20 20 2f 2a 20 41 2d 76 73 2d 42 20 63 6f 6d     /* A-vs-B com
26c80 70 61 72 69 73 69 6f 6e 20 6a 75 6d 70 20 2a 2f  parision jump */
26c90 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 4f  .      int addrO
26ca0 75 74 70 75 74 52 6f 77 3b 20 20 2f 2a 20 53 74  utputRow;  /* St
26cb0 61 72 74 20 6f 66 20 73 75 62 72 6f 75 74 69 6e  art of subroutin
26cc0 65 20 74 68 61 74 20 6f 75 74 70 75 74 73 20 61  e that outputs a
26cd0 20 72 65 73 75 6c 74 20 72 6f 77 20 2a 2f 0a 20   result row */. 
26ce0 20 20 20 20 20 69 6e 74 20 72 65 67 4f 75 74 70       int regOutp
26cf0 75 74 52 6f 77 3b 20 20 20 2f 2a 20 52 65 74 75  utRow;   /* Retu
26d00 72 6e 20 61 64 64 72 65 73 73 20 72 65 67 69 73  rn address regis
26d10 74 65 72 20 66 6f 72 20 6f 75 74 70 75 74 20 73  ter for output s
26d20 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 20  ubroutine */.   
26d30 20 20 20 69 6e 74 20 61 64 64 72 53 65 74 41 62     int addrSetAb
26d40 6f 72 74 3b 20 20 20 2f 2a 20 53 65 74 20 74 68  ort;   /* Set th
26d50 65 20 61 62 6f 72 74 20 66 6c 61 67 20 61 6e 64  e abort flag and
26d60 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 20 20 20   return */.     
26d70 20 69 6e 74 20 61 64 64 72 54 6f 70 4f 66 4c 6f   int addrTopOfLo
26d80 6f 70 3b 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74  op;  /* Top of t
26d90 68 65 20 69 6e 70 75 74 20 6c 6f 6f 70 20 2a 2f  he input loop */
26da0 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 53  .      int addrS
26db0 6f 72 74 69 6e 67 49 64 78 3b 20 2f 2a 20 54 68  ortingIdx; /* Th
26dc0 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  e OP_OpenEphemer
26dd0 61 6c 20 66 6f 72 20 74 68 65 20 73 6f 72 74 69  al for the sorti
26de0 6e 67 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20  ng index */.    
26df0 20 20 69 6e 74 20 61 64 64 72 52 65 73 65 74 3b    int addrReset;
26e00 20 20 20 20 20 20 2f 2a 20 53 75 62 72 6f 75 74        /* Subrout
26e10 69 6e 65 20 66 6f 72 20 72 65 73 65 74 74 69 6e  ine for resettin
26e20 67 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74 6f  g the accumulato
26e30 72 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72  r */.      int r
26e40 65 67 52 65 73 65 74 3b 20 20 20 20 20 20 20 2f  egReset;       /
26e50 2a 20 52 65 74 75 72 6e 20 61 64 64 72 65 73 73  * Return address
26e60 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 72 65   register for re
26e70 73 65 74 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  set subroutine *
26e80 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  /..      /* If t
26e90 68 65 72 65 20 69 73 20 61 20 47 52 4f 55 50 20  here is a GROUP 
26ea0 42 59 20 63 6c 61 75 73 65 20 77 65 20 6d 69 67  BY clause we mig
26eb0 68 74 20 6e 65 65 64 20 61 20 73 6f 72 74 69 6e  ht need a sortin
26ec0 67 20 69 6e 64 65 78 20 74 6f 0a 20 20 20 20 20  g index to.     
26ed0 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 69 74   ** implement it
26ee0 2e 20 20 41 6c 6c 6f 63 61 74 65 20 74 68 61 74  .  Allocate that
26ef0 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 6e   sorting index n
26f00 6f 77 2e 20 20 49 66 20 69 74 20 74 75 72 6e 73  ow.  If it turns
26f10 20 6f 75 74 0a 20 20 20 20 20 20 2a 2a 20 74 68   out.      ** th
26f20 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 6e 65 65  at we do not nee
26f30 64 20 69 74 20 61 66 74 65 72 20 61 6c 6c 2c 20  d it after all, 
26f40 74 68 65 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65  the OP_SorterOpe
26f50 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a 20 20  n instruction.  
26f60 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 63      ** will be c
26f70 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61 20  onverted into a 
26f80 4e 6f 6f 70 2e 20 20 0a 20 20 20 20 20 20 2a 2f  Noop.  .      */
26f90 0a 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e  .      sAggInfo.
26fa0 73 6f 72 74 69 6e 67 49 64 78 20 3d 20 70 50 61  sortingIdx = pPa
26fb0 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
26fc0 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65     pKeyInfo = ke
26fd0 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73  yInfoFromExprLis
26fe0 74 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70  t(pParse, pGroup
26ff0 42 79 29 3b 0a 20 20 20 20 20 20 61 64 64 72 53  By);.      addrS
27000 6f 72 74 69 6e 67 49 64 78 20 3d 20 73 71 6c 69  ortingIdx = sqli
27010 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
27020 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e 2c 20   OP_SorterOpen, 
27030 0a 20 20 20 20 20 20 20 20 20 20 73 41 67 67 49  .          sAggI
27040 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20  nfo.sortingIdx, 
27050 73 41 67 67 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e  sAggInfo.nSortin
27060 67 43 6f 6c 75 6d 6e 2c 20 0a 20 20 20 20 20 20  gColumn, .      
27070 20 20 20 20 30 2c 20 28 63 68 61 72 2a 29 70 4b      0, (char*)pK
27080 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e  eyInfo, P4_KEYIN
27090 46 4f 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49  FO);..      /* I
270a0 6e 69 74 69 61 6c 69 7a 65 20 6d 65 6d 6f 72 79  nitialize memory
270b0 20 6c 6f 63 61 74 69 6f 6e 73 20 75 73 65 64 20   locations used 
270c0 62 79 20 47 52 4f 55 50 20 42 59 20 61 67 67 72  by GROUP BY aggr
270d0 65 67 61 74 65 20 70 72 6f 63 65 73 73 69 6e 67  egate processing
270e0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
270f0 69 55 73 65 46 6c 61 67 20 3d 20 2b 2b 70 50 61  iUseFlag = ++pPa
27100 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
27110 20 69 41 62 6f 72 74 46 6c 61 67 20 3d 20 2b 2b   iAbortFlag = ++
27120 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
27130 20 20 20 20 72 65 67 4f 75 74 70 75 74 52 6f 77      regOutputRow
27140 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
27150 6d 3b 0a 20 20 20 20 20 20 61 64 64 72 4f 75 74  m;.      addrOut
27160 70 75 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33  putRow = sqlite3
27170 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
27180 3b 0a 20 20 20 20 20 20 72 65 67 52 65 73 65 74  ;.      regReset
27190 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
271a0 6d 3b 0a 20 20 20 20 20 20 61 64 64 72 52 65 73  m;.      addrRes
271b0 65 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  et = sqlite3Vdbe
271c0 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
271d0 20 20 20 20 69 41 4d 65 6d 20 3d 20 70 50 61 72      iAMem = pPar
271e0 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20  se->nMem + 1;.  
271f0 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
27200 20 2b 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45   += pGroupBy->nE
27210 78 70 72 3b 0a 20 20 20 20 20 20 69 42 4d 65 6d  xpr;.      iBMem
27220 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20   = pParse->nMem 
27230 2b 20 31 3b 0a 20 20 20 20 20 20 70 50 61 72 73  + 1;.      pPars
27240 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f 75  e->nMem += pGrou
27250 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  pBy->nExpr;.    
27260 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
27270 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
27280 72 2c 20 30 2c 20 69 41 62 6f 72 74 46 6c 61 67  r, 0, iAbortFlag
27290 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
272a0 6d 65 6e 74 28 28 76 2c 20 22 63 6c 65 61 72 20  ment((v, "clear 
272b0 61 62 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a 20  abort flag"));. 
272c0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
272d0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
272e0 65 67 65 72 2c 20 30 2c 20 69 55 73 65 46 6c 61  eger, 0, iUseFla
272f0 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  g);.      VdbeCo
27300 6d 6d 65 6e 74 28 28 76 2c 20 22 69 6e 64 69 63  mment((v, "indic
27310 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20  ate accumulator 
27320 65 6d 70 74 79 22 29 29 3b 0a 20 20 20 20 20 20  empty"));.      
27330 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
27340 33 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  3(v, OP_Null, 0,
27350 20 69 41 4d 65 6d 2c 20 69 41 4d 65 6d 2b 70 47   iAMem, iAMem+pG
27360 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2d 31 29  roupBy->nExpr-1)
27370 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 42 65 67 69  ;..      /* Begi
27380 6e 20 61 20 6c 6f 6f 70 20 74 68 61 74 20 77 69  n a loop that wi
27390 6c 6c 20 65 78 74 72 61 63 74 20 61 6c 6c 20 73  ll extract all s
273a0 6f 75 72 63 65 20 72 6f 77 73 20 69 6e 20 47 52  ource rows in GR
273b0 4f 55 50 20 42 59 20 6f 72 64 65 72 2e 0a 20 20  OUP BY order..  
273c0 20 20 20 20 2a 2a 20 54 68 69 73 20 6d 69 67 68      ** This migh
273d0 74 20 69 6e 76 6f 6c 76 65 20 74 77 6f 20 73 65  t involve two se
273e0 70 61 72 61 74 65 20 6c 6f 6f 70 73 20 77 69 74  parate loops wit
273f0 68 20 61 6e 20 4f 50 5f 53 6f 72 74 20 69 6e 20  h an OP_Sort in 
27400 62 65 74 77 65 65 6e 2c 20 6f 72 0a 20 20 20 20  between, or.    
27410 20 20 2a 2a 20 69 74 20 6d 69 67 68 74 20 62 65    ** it might be
27420 20 61 20 73 69 6e 67 6c 65 20 6c 6f 6f 70 20 74   a single loop t
27430 68 61 74 20 75 73 65 73 20 61 6e 20 69 6e 64 65  hat uses an inde
27440 78 20 74 6f 20 65 78 74 72 61 63 74 20 69 6e 66  x to extract inf
27450 6f 72 6d 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a  ormation.      *
27460 2a 20 69 6e 20 74 68 65 20 72 69 67 68 74 20 6f  * in the right o
27470 72 64 65 72 20 74 6f 20 62 65 67 69 6e 20 77 69  rder to begin wi
27480 74 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  th..      */.   
27490 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
274a0 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
274b0 2c 20 72 65 67 52 65 73 65 74 2c 20 61 64 64 72  , regReset, addr
274c0 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20 70 57  Reset);.      pW
274d0 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68  Info = sqlite3Wh
274e0 65 72 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c  ereBegin(pParse,
274f0 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72   pTabList, pWher
27500 65 2c 20 70 47 72 6f 75 70 42 79 2c 20 30 2c 20  e, pGroupBy, 0, 
27510 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
27520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27530 20 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59 2c    WHERE_GROUPBY,
27540 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70   0);.      if( p
27550 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20  WInfo==0 ) goto 
27560 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
27570 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65    if( sqlite3Whe
27580 72 65 49 73 4f 72 64 65 72 65 64 28 70 57 49 6e  reIsOrdered(pWIn
27590 66 6f 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  fo) ){.        /
275a0 2a 20 54 68 65 20 6f 70 74 69 6d 69 7a 65 72 20  * The optimizer 
275b0 69 73 20 61 62 6c 65 20 74 6f 20 64 65 6c 69 76  is able to deliv
275c0 65 72 20 72 6f 77 73 20 69 6e 20 67 72 6f 75 70  er rows in group
275d0 20 62 79 20 6f 72 64 65 72 20 73 6f 0a 20 20 20   by order so.   
275e0 20 20 20 20 20 2a 2a 20 77 65 20 64 6f 20 6e 6f       ** we do no
275f0 74 20 68 61 76 65 20 74 6f 20 73 6f 72 74 2e 20  t have to sort. 
27600 20 54 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65   The OP_OpenEphe
27610 6d 65 72 61 6c 20 74 61 62 6c 65 20 77 69 6c 6c  meral table will
27620 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 63   be.        ** c
27630 61 6e 63 65 6c 6c 65 64 20 6c 61 74 65 72 20 62  ancelled later b
27640 65 63 61 75 73 65 20 77 65 20 73 74 69 6c 6c 20  ecause we still 
27650 6e 65 65 64 20 74 6f 20 75 73 65 20 74 68 65 20  need to use the 
27660 70 4b 65 79 49 6e 66 6f 0a 20 20 20 20 20 20 20  pKeyInfo.       
27670 20 2a 2f 0a 20 20 20 20 20 20 20 20 67 72 6f 75   */.        grou
27680 70 42 79 53 6f 72 74 20 3d 20 30 3b 0a 20 20 20  pBySort = 0;.   
27690 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
276a0 20 20 2f 2a 20 52 6f 77 73 20 61 72 65 20 63 6f    /* Rows are co
276b0 6d 69 6e 67 20 6f 75 74 20 69 6e 20 75 6e 64 65  ming out in unde
276c0 74 65 72 6d 69 6e 65 64 20 6f 72 64 65 72 2e 20  termined order. 
276d0 20 57 65 20 68 61 76 65 20 74 6f 20 70 75 73 68   We have to push
276e0 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 61 63 68  .        ** each
276f0 20 72 6f 77 20 69 6e 74 6f 20 61 20 73 6f 72 74   row into a sort
27700 69 6e 67 20 69 6e 64 65 78 2c 20 74 65 72 6d 69  ing index, termi
27710 6e 61 74 65 20 74 68 65 20 66 69 72 73 74 20 6c  nate the first l
27720 6f 6f 70 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20  oop,.        ** 
27730 74 68 65 6e 20 6c 6f 6f 70 20 6f 76 65 72 20 74  then loop over t
27740 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78  he sorting index
27750 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 74   in order to get
27760 20 74 68 65 20 6f 75 74 70 75 74 0a 20 20 20 20   the output.    
27770 20 20 20 20 2a 2a 20 69 6e 20 73 6f 72 74 65 64      ** in sorted
27780 20 6f 72 64 65 72 0a 20 20 20 20 20 20 20 20 2a   order.        *
27790 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 65  /.        int re
277a0 67 42 61 73 65 3b 0a 20 20 20 20 20 20 20 20 69  gBase;.        i
277b0 6e 74 20 72 65 67 52 65 63 6f 72 64 3b 0a 20 20  nt regRecord;.  
277c0 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a        int nCol;.
277d0 20 20 20 20 20 20 20 20 69 6e 74 20 6e 47 72 6f          int nGro
277e0 75 70 42 79 3b 0a 0a 20 20 20 20 20 20 20 20 65  upBy;..        e
277f0 78 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65 28  xplainTempTable(
27800 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20  pParse, .       
27810 20 20 20 20 20 28 73 44 69 73 74 69 6e 63 74 2e       (sDistinct.
27820 69 73 54 6e 63 74 20 26 26 20 28 70 2d 3e 73 65  isTnct && (p->se
27830 6c 46 6c 61 67 73 26 53 46 5f 44 69 73 74 69 6e  lFlags&SF_Distin
27840 63 74 29 3d 3d 30 29 20 3f 0a 20 20 20 20 20 20  ct)==0) ?.      
27850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 44                "D
27860 49 53 54 49 4e 43 54 22 20 3a 20 22 47 52 4f 55  ISTINCT" : "GROU
27870 50 20 42 59 22 29 3b 0a 0a 20 20 20 20 20 20 20  P BY");..       
27880 20 67 72 6f 75 70 42 79 53 6f 72 74 20 3d 20 31   groupBySort = 1
27890 3b 0a 20 20 20 20 20 20 20 20 6e 47 72 6f 75 70  ;.        nGroup
278a0 42 79 20 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e  By = pGroupBy->n
278b0 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 6e 43  Expr;.        nC
278c0 6f 6c 20 3d 20 6e 47 72 6f 75 70 42 79 20 2b 20  ol = nGroupBy + 
278d0 31 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 6e  1;.        j = n
278e0 47 72 6f 75 70 42 79 2b 31 3b 0a 20 20 20 20 20  GroupBy+1;.     
278f0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41     for(i=0; i<sA
27900 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20  ggInfo.nColumn; 
27910 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
27920 69 66 28 20 73 41 67 67 49 6e 66 6f 2e 61 43 6f  if( sAggInfo.aCo
27930 6c 5b 69 5d 2e 69 53 6f 72 74 65 72 43 6f 6c 75  l[i].iSorterColu
27940 6d 6e 3e 3d 6a 20 29 7b 0a 20 20 20 20 20 20 20  mn>=j ){.       
27950 20 20 20 20 20 6e 43 6f 6c 2b 2b 3b 0a 20 20 20       nCol++;.   
27960 20 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20           j++;.  
27970 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
27980 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 67 42    }.        regB
27990 61 73 65 20 3d 20 73 71 6c 69 74 65 33 47 65 74  ase = sqlite3Get
279a0 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
279b0 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20  , nCol);.       
279c0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
279d0 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a  eClear(pParse);.
279e0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
279f0 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28  xprCodeExprList(
27a00 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79  pParse, pGroupBy
27a10 2c 20 72 65 67 42 61 73 65 2c 20 30 29 3b 0a 20  , regBase, 0);. 
27a20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
27a30 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
27a40 65 71 75 65 6e 63 65 2c 20 73 41 67 67 49 6e 66  equence, sAggInf
27a50 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 72 65 67  o.sortingIdx,reg
27a60 42 61 73 65 2b 6e 47 72 6f 75 70 42 79 29 3b 0a  Base+nGroupBy);.
27a70 20 20 20 20 20 20 20 20 6a 20 3d 20 6e 47 72 6f          j = nGro
27a80 75 70 42 79 2b 31 3b 0a 20 20 20 20 20 20 20 20  upBy+1;.        
27a90 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67 67 49  for(i=0; i<sAggI
27aa0 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b  nfo.nColumn; i++
27ab0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 72  ){.          str
27ac0 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20  uct AggInfo_col 
27ad0 2a 70 43 6f 6c 20 3d 20 26 73 41 67 67 49 6e 66  *pCol = &sAggInf
27ae0 6f 2e 61 43 6f 6c 5b 69 5d 3b 0a 20 20 20 20 20  o.aCol[i];.     
27af0 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69       if( pCol->i
27b00 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3e 3d 6a 20  SorterColumn>=j 
27b10 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
27b20 6e 74 20 72 31 20 3d 20 6a 20 2b 20 72 65 67 42  nt r1 = j + regB
27b30 61 73 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ase;.           
27b40 20 69 6e 74 20 72 32 3b 0a 0a 20 20 20 20 20 20   int r2;..      
27b50 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74        r2 = sqlit
27b60 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c  e3ExprCodeGetCol
27b70 75 6d 6e 28 70 50 61 72 73 65 2c 20 0a 20 20 20  umn(pParse, .   
27b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27b90 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
27ba0 2d 3e 70 54 61 62 2c 20 70 43 6f 6c 2d 3e 69 43  ->pTab, pCol->iC
27bb0 6f 6c 75 6d 6e 2c 20 70 43 6f 6c 2d 3e 69 54 61  olumn, pCol->iTa
27bc0 62 6c 65 2c 20 72 31 2c 20 30 29 3b 0a 20 20 20  ble, r1, 0);.   
27bd0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 31 21           if( r1!
27be0 3d 72 32 20 29 7b 0a 20 20 20 20 20 20 20 20 20  =r2 ){.         
27bf0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
27c00 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f  AddOp2(v, OP_SCo
27c10 70 79 2c 20 72 32 2c 20 72 31 29 3b 0a 20 20 20  py, r2, r1);.   
27c20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
27c30 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20         j++;.    
27c40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
27c50 7d 0a 20 20 20 20 20 20 20 20 72 65 67 52 65 63  }.        regRec
27c60 6f 72 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74  ord = sqlite3Get
27c70 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
27c80 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
27c90 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
27ca0 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67  _MakeRecord, reg
27cb0 42 61 73 65 2c 20 6e 43 6f 6c 2c 20 72 65 67 52  Base, nCol, regR
27cc0 65 63 6f 72 64 29 3b 0a 20 20 20 20 20 20 20 20  ecord);.        
27cd0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
27ce0 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 49 6e  2(v, OP_SorterIn
27cf0 73 65 72 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73  sert, sAggInfo.s
27d00 6f 72 74 69 6e 67 49 64 78 2c 20 72 65 67 52 65  ortingIdx, regRe
27d10 63 6f 72 64 29 3b 0a 20 20 20 20 20 20 20 20 73  cord);.        s
27d20 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
27d30 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
27d40 52 65 63 6f 72 64 29 3b 0a 20 20 20 20 20 20 20  Record);.       
27d50 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
27d60 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
27d70 20 72 65 67 42 61 73 65 2c 20 6e 43 6f 6c 29 3b   regBase, nCol);
27d80 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
27d90 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29  WhereEnd(pWInfo)
27da0 3b 0a 20 20 20 20 20 20 20 20 73 41 67 67 49 6e  ;.        sAggIn
27db0 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 50 54 61  fo.sortingIdxPTa
27dc0 62 20 3d 20 73 6f 72 74 50 54 61 62 20 3d 20 70  b = sortPTab = p
27dd0 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
27de0 20 20 20 20 20 20 20 73 6f 72 74 4f 75 74 20 3d         sortOut =
27df0 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
27e00 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
27e10 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
27e20 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp3(v, OP_Open
27e30 50 73 65 75 64 6f 2c 20 73 6f 72 74 50 54 61 62  Pseudo, sortPTab
27e40 2c 20 73 6f 72 74 4f 75 74 2c 20 6e 43 6f 6c 29  , sortOut, nCol)
27e50 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
27e60 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
27e70 50 5f 53 6f 72 74 65 72 53 6f 72 74 2c 20 73 41  P_SorterSort, sA
27e80 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64  ggInfo.sortingId
27e90 78 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20 20 20  x, addrEnd);.   
27ea0 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
27eb0 28 28 76 2c 20 22 47 52 4f 55 50 20 42 59 20 73  ((v, "GROUP BY s
27ec0 6f 72 74 22 29 29 3b 0a 20 20 20 20 20 20 20 20  ort"));.        
27ed0 73 41 67 67 49 6e 66 6f 2e 75 73 65 53 6f 72 74  sAggInfo.useSort
27ee0 69 6e 67 49 64 78 20 3d 20 31 3b 0a 20 20 20 20  ingIdx = 1;.    
27ef0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
27f00 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65  acheClear(pParse
27f10 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
27f20 20 20 2f 2a 20 45 76 61 6c 75 61 74 65 20 74 68    /* Evaluate th
27f30 65 20 63 75 72 72 65 6e 74 20 47 52 4f 55 50 20  e current GROUP 
27f40 42 59 20 74 65 72 6d 73 20 61 6e 64 20 73 74 6f  BY terms and sto
27f50 72 65 20 69 6e 20 62 30 2c 20 62 31 2c 20 62 32  re in b0, b1, b2
27f60 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 28 62 30  ....      ** (b0
27f70 20 69 73 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74   is memory locat
27f80 69 6f 6e 20 69 42 4d 65 6d 2b 30 2c 20 62 31 20  ion iBMem+0, b1 
27f90 69 73 20 69 42 4d 65 6d 2b 31 2c 20 61 6e 64 20  is iBMem+1, and 
27fa0 73 6f 20 66 6f 72 74 68 29 0a 20 20 20 20 20 20  so forth).      
27fb0 2a 2a 20 54 68 65 6e 20 63 6f 6d 70 61 72 65 20  ** Then compare 
27fc0 74 68 65 20 63 75 72 72 65 6e 74 20 47 52 4f 55  the current GROU
27fd0 50 20 42 59 20 74 65 72 6d 73 20 61 67 61 69 6e  P BY terms again
27fe0 73 74 20 74 68 65 20 47 52 4f 55 50 20 42 59 20  st the GROUP BY 
27ff0 74 65 72 6d 73 0a 20 20 20 20 20 20 2a 2a 20 66  terms.      ** f
28000 72 6f 6d 20 74 68 65 20 70 72 65 76 69 6f 75 73  rom the previous
28010 20 72 6f 77 20 63 75 72 72 65 6e 74 6c 79 20 73   row currently s
28020 74 6f 72 65 64 20 69 6e 20 61 30 2c 20 61 31 2c  tored in a0, a1,
28030 20 61 32 2e 2e 2e 0a 20 20 20 20 20 20 2a 2f 0a   a2....      */.
28040 20 20 20 20 20 20 61 64 64 72 54 6f 70 4f 66 4c        addrTopOfL
28050 6f 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  oop = sqlite3Vdb
28060 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
28070 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
28080 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61  prCacheClear(pPa
28090 72 73 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  rse);.      if( 
280a0 67 72 6f 75 70 42 79 53 6f 72 74 20 29 7b 0a 20  groupBySort ){. 
280b0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
280c0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
280d0 6f 72 74 65 72 44 61 74 61 2c 20 73 41 67 67 49  orterData, sAggI
280e0 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20  nfo.sortingIdx, 
280f0 73 6f 72 74 4f 75 74 29 3b 0a 20 20 20 20 20 20  sortOut);.      
28100 7d 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  }.      for(j=0;
28110 20 6a 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78   j<pGroupBy->nEx
28120 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; j++){.      
28130 20 20 69 66 28 20 67 72 6f 75 70 42 79 53 6f 72    if( groupBySor
28140 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  t ){.          s
28150 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
28160 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73  (v, OP_Column, s
28170 6f 72 74 50 54 61 62 2c 20 6a 2c 20 69 42 4d 65  ortPTab, j, iBMe
28180 6d 2b 6a 29 3b 0a 20 20 20 20 20 20 20 20 20 20  m+j);.          
28190 69 66 28 20 6a 3d 3d 30 20 29 20 73 71 6c 69 74  if( j==0 ) sqlit
281a0 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
281b0 2c 20 4f 50 46 4c 41 47 5f 43 4c 45 41 52 43 41  , OPFLAG_CLEARCA
281c0 43 48 45 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  CHE);.        }e
281d0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73  lse{.          s
281e0 41 67 67 49 6e 66 6f 2e 64 69 72 65 63 74 4d 6f  AggInfo.directMo
281f0 64 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  de = 1;.        
28200 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
28210 65 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70  e(pParse, pGroup
28220 42 79 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72 2c 20  By->a[j].pExpr, 
28230 69 42 4d 65 6d 2b 6a 29 3b 0a 20 20 20 20 20 20  iBMem+j);.      
28240 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
28250 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
28260 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72  Op4(v, OP_Compar
28270 65 2c 20 69 41 4d 65 6d 2c 20 69 42 4d 65 6d 2c  e, iAMem, iBMem,
28280 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72   pGroupBy->nExpr
28290 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
282a0 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
282b0 72 2a 29 73 71 6c 69 74 65 33 4b 65 79 49 6e 66  r*)sqlite3KeyInf
282c0 6f 52 65 66 28 70 4b 65 79 49 6e 66 6f 29 2c 20  oRef(pKeyInfo), 
282d0 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20  P4_KEYINFO);.   
282e0 20 20 20 6a 31 20 3d 20 73 71 6c 69 74 65 33 56     j1 = sqlite3V
282f0 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
28300 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
28310 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
28320 5f 4a 75 6d 70 2c 20 6a 31 2b 31 2c 20 30 2c 20  _Jump, j1+1, 0, 
28330 6a 31 2b 31 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  j1+1);..      /*
28340 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
28350 68 61 74 20 72 75 6e 73 20 77 68 65 6e 65 76 65  hat runs wheneve
28360 72 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 63  r the GROUP BY c
28370 68 61 6e 67 65 73 2e 0a 20 20 20 20 20 20 2a 2a  hanges..      **
28380 20 43 68 61 6e 67 65 73 20 69 6e 20 74 68 65 20   Changes in the 
28390 47 52 4f 55 50 20 42 59 20 61 72 65 20 64 65 74  GROUP BY are det
283a0 65 63 74 65 64 20 62 79 20 74 68 65 20 70 72 65  ected by the pre
283b0 76 69 6f 75 73 20 63 6f 64 65 0a 20 20 20 20 20  vious code.     
283c0 20 2a 2a 20 62 6c 6f 63 6b 2e 20 20 49 66 20 74   ** block.  If t
283d0 68 65 72 65 20 77 65 72 65 20 6e 6f 20 63 68 61  here were no cha
283e0 6e 67 65 73 2c 20 74 68 69 73 20 62 6c 6f 63 6b  nges, this block
283f0 20 69 73 20 73 6b 69 70 70 65 64 2e 0a 20 20 20   is skipped..   
28400 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54     **.      ** T
28410 68 69 73 20 63 6f 64 65 20 63 6f 70 69 65 73 20  his code copies 
28420 63 75 72 72 65 6e 74 20 67 72 6f 75 70 20 62 79  current group by
28430 20 74 65 72 6d 73 20 69 6e 20 62 30 2c 62 31 2c   terms in b0,b1,
28440 62 32 2c 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20  b2,....      ** 
28450 6f 76 65 72 20 74 6f 20 61 30 2c 61 31 2c 61 32  over to a0,a1,a2
28460 2e 20 20 49 74 20 74 68 65 6e 20 63 61 6c 6c 73  .  It then calls
28470 20 74 68 65 20 6f 75 74 70 75 74 20 73 75 62 72   the output subr
28480 6f 75 74 69 6e 65 0a 20 20 20 20 20 20 2a 2a 20  outine.      ** 
28490 61 6e 64 20 72 65 73 65 74 73 20 74 68 65 20 61  and resets the a
284a0 67 67 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c  ggregate accumul
284b0 61 74 6f 72 20 72 65 67 69 73 74 65 72 73 20 69  ator registers i
284c0 6e 20 70 72 65 70 61 72 61 74 69 6f 6e 0a 20 20  n preparation.  
284d0 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 6e      ** for the n
284e0 65 78 74 20 47 52 4f 55 50 20 42 59 20 62 61 74  ext GROUP BY bat
284f0 63 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ch..      */.   
28500 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
28510 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 69  deMove(pParse, i
28520 42 4d 65 6d 2c 20 69 41 4d 65 6d 2c 20 70 47 72  BMem, iAMem, pGr
28530 6f 75 70 42 79 2d 3e 6e 45 78 70 72 29 3b 0a 20  oupBy->nExpr);. 
28540 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
28550 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
28560 75 62 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77  ub, regOutputRow
28570 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 29  , addrOutputRow)
28580 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
28590 65 6e 74 28 28 76 2c 20 22 6f 75 74 70 75 74 20  ent((v, "output 
285a0 6f 6e 65 20 72 6f 77 22 29 29 3b 0a 20 20 20 20  one row"));.    
285b0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
285c0 4f 70 32 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c  Op2(v, OP_IfPos,
285d0 20 69 41 62 6f 72 74 46 6c 61 67 2c 20 61 64 64   iAbortFlag, add
285e0 72 45 6e 64 29 3b 0a 20 20 20 20 20 20 56 64 62  rEnd);.      Vdb
285f0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 63 68  eComment((v, "ch
28600 65 63 6b 20 61 62 6f 72 74 20 66 6c 61 67 22 29  eck abort flag")
28610 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
28620 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
28630 5f 47 6f 73 75 62 2c 20 72 65 67 52 65 73 65 74  _Gosub, regReset
28640 2c 20 61 64 64 72 52 65 73 65 74 29 3b 0a 20 20  , addrReset);.  
28650 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
28660 28 76 2c 20 22 72 65 73 65 74 20 61 63 63 75 6d  (v, "reset accum
28670 75 6c 61 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20  ulator"));..    
28680 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20    /* Update the 
28690 61 67 67 72 65 67 61 74 65 20 61 63 63 75 6d 75  aggregate accumu
286a0 6c 61 74 6f 72 73 20 62 61 73 65 64 20 6f 6e 20  lators based on 
286b0 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 0a 20  the content of. 
286c0 20 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72 72       ** the curr
286d0 65 6e 74 20 72 6f 77 0a 20 20 20 20 20 20 2a 2f  ent row.      */
286e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
286f0 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 31  beJumpHere(v, j1
28700 29 3b 0a 20 20 20 20 20 20 75 70 64 61 74 65 41  );.      updateA
28710 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73  ccumulator(pPars
28720 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20  e, &sAggInfo);. 
28730 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
28740 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
28750 65 67 65 72 2c 20 31 2c 20 69 55 73 65 46 6c 61  eger, 1, iUseFla
28760 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  g);.      VdbeCo
28770 6d 6d 65 6e 74 28 28 76 2c 20 22 69 6e 64 69 63  mment((v, "indic
28780 61 74 65 20 64 61 74 61 20 69 6e 20 61 63 63 75  ate data in accu
28790 6d 75 6c 61 74 6f 72 22 29 29 3b 0a 0a 20 20 20  mulator"));..   
287a0 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65     /* End of the
287b0 20 6c 6f 6f 70 0a 20 20 20 20 20 20 2a 2f 0a 20   loop.      */. 
287c0 20 20 20 20 20 69 66 28 20 67 72 6f 75 70 42 79       if( groupBy
287d0 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Sort ){.        
287e0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
287f0 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4e 65  2(v, OP_SorterNe
28800 78 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72  xt, sAggInfo.sor
28810 74 69 6e 67 49 64 78 2c 20 61 64 64 72 54 6f 70  tingIdx, addrTop
28820 4f 66 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 7d  OfLoop);.      }
28830 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
28840 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70 57  lite3WhereEnd(pW
28850 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 73  Info);.        s
28860 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
28870 54 6f 4e 6f 6f 70 28 76 2c 20 61 64 64 72 53 6f  ToNoop(v, addrSo
28880 72 74 69 6e 67 49 64 78 29 3b 0a 20 20 20 20 20  rtingIdx);.     
28890 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 4f 75 74   }..      /* Out
288a0 70 75 74 20 74 68 65 20 66 69 6e 61 6c 20 72 6f  put the final ro
288b0 77 20 6f 66 20 72 65 73 75 6c 74 0a 20 20 20 20  w of result.    
288c0 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74    */.      sqlit
288d0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
288e0 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74  OP_Gosub, regOut
288f0 70 75 74 52 6f 77 2c 20 61 64 64 72 4f 75 74 70  putRow, addrOutp
28900 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 56 64  utRow);.      Vd
28910 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6f  beComment((v, "o
28920 75 74 70 75 74 20 66 69 6e 61 6c 20 72 6f 77 22  utput final row"
28930 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 4a 75  ));..      /* Ju
28940 6d 70 20 6f 76 65 72 20 74 68 65 20 73 75 62 72  mp over the subr
28950 6f 75 74 69 6e 65 73 0a 20 20 20 20 20 20 2a 2f  outines.      */
28960 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
28970 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
28980 6f 74 6f 2c 20 30 2c 20 61 64 64 72 45 6e 64 29  oto, 0, addrEnd)
28990 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65  ;..      /* Gene
289a0 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e  rate a subroutin
289b0 65 20 74 68 61 74 20 6f 75 74 70 75 74 73 20 61  e that outputs a
289c0 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 74   single row of t
289d0 68 65 20 72 65 73 75 6c 74 0a 20 20 20 20 20 20  he result.      
289e0 2a 2a 20 73 65 74 2e 20 20 54 68 69 73 20 73 75  ** set.  This su
289f0 62 72 6f 75 74 69 6e 65 20 66 69 72 73 74 20 6c  broutine first l
28a00 6f 6f 6b 73 20 61 74 20 74 68 65 20 69 55 73 65  ooks at the iUse
28a10 46 6c 61 67 2e 20 20 49 66 20 69 55 73 65 46 6c  Flag.  If iUseFl
28a20 61 67 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 6c  ag.      ** is l
28a30 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ess than or equa
28a40 6c 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 20 73  l to zero, the s
28a50 75 62 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  ubroutine is a n
28a60 6f 2d 6f 70 2e 20 20 49 66 0a 20 20 20 20 20 20  o-op.  If.      
28a70 2a 2a 20 74 68 65 20 70 72 6f 63 65 73 73 69 6e  ** the processin
28a80 67 20 63 61 6c 6c 73 20 66 6f 72 20 74 68 65 20  g calls for the 
28a90 71 75 65 72 79 20 74 6f 20 61 62 6f 72 74 2c 20  query to abort, 
28aa0 74 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65 0a  this subroutine.
28ab0 20 20 20 20 20 20 2a 2a 20 69 6e 63 72 65 6d 65        ** increme
28ac0 6e 74 73 20 74 68 65 20 69 41 62 6f 72 74 46 6c  nts the iAbortFl
28ad0 61 67 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69  ag memory locati
28ae0 6f 6e 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  on before return
28af0 69 6e 67 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20  ing in.      ** 
28b00 6f 72 64 65 72 20 74 6f 20 73 69 67 6e 61 6c 20  order to signal 
28b10 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 61 62  the caller to ab
28b20 6f 72 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ort..      */.  
28b30 20 20 20 20 61 64 64 72 53 65 74 41 62 6f 72 74      addrSetAbort
28b40 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
28b50 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
28b60 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
28b70 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
28b80 67 65 72 2c 20 31 2c 20 69 41 62 6f 72 74 46 6c  ger, 1, iAbortFl
28b90 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  ag);.      VdbeC
28ba0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 73 65 74 20  omment((v, "set 
28bb0 61 62 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a 20  abort flag"));. 
28bc0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
28bd0 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74  AddOp1(v, OP_Ret
28be0 75 72 6e 2c 20 72 65 67 4f 75 74 70 75 74 52 6f  urn, regOutputRo
28bf0 77 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  w);.      sqlite
28c00 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
28c10 6c 28 76 2c 20 61 64 64 72 4f 75 74 70 75 74 52  l(v, addrOutputR
28c20 6f 77 29 3b 0a 20 20 20 20 20 20 61 64 64 72 4f  ow);.      addrO
28c30 75 74 70 75 74 52 6f 77 20 3d 20 73 71 6c 69 74  utputRow = sqlit
28c40 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
28c50 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  r(v);.      sqli
28c60 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
28c70 20 4f 50 5f 49 66 50 6f 73 2c 20 69 55 73 65 46   OP_IfPos, iUseF
28c80 6c 61 67 2c 20 61 64 64 72 4f 75 74 70 75 74 52  lag, addrOutputR
28c90 6f 77 2b 32 29 3b 0a 20 20 20 20 20 20 56 64 62  ow+2);.      Vdb
28ca0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 47 72  eComment((v, "Gr
28cb0 6f 75 70 62 79 20 72 65 73 75 6c 74 20 67 65 6e  oupby result gen
28cc0 65 72 61 74 6f 72 20 65 6e 74 72 79 20 70 6f 69  erator entry poi
28cd0 6e 74 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  nt"));.      sql
28ce0 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
28cf0 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67  , OP_Return, reg
28d00 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20  OutputRow);.    
28d10 20 20 66 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e    finalizeAggFun
28d20 63 74 69 6f 6e 73 28 70 50 61 72 73 65 2c 20 26  ctions(pParse, &
28d30 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20  sAggInfo);.     
28d40 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
28d50 6c 73 65 28 70 50 61 72 73 65 2c 20 70 48 61 76  lse(pParse, pHav
28d60 69 6e 67 2c 20 61 64 64 72 4f 75 74 70 75 74 52  ing, addrOutputR
28d70 6f 77 2b 31 2c 20 53 51 4c 49 54 45 5f 4a 55 4d  ow+1, SQLITE_JUM
28d80 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20  PIFNULL);.      
28d90 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28  selectInnerLoop(
28da0 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45  pParse, p, p->pE
28db0 4c 69 73 74 2c 20 30 2c 20 30 2c 20 70 4f 72 64  List, 0, 0, pOrd
28dc0 65 72 42 79 2c 0a 20 20 20 20 20 20 20 20 20 20  erBy,.          
28dd0 20 20 20 20 20 20 20 20 20 20 20 20 26 73 44 69              &sDi
28de0 73 74 69 6e 63 74 2c 20 70 44 65 73 74 2c 0a 20  stinct, pDest,. 
28df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28e00 20 20 20 20 20 61 64 64 72 4f 75 74 70 75 74 52       addrOutputR
28e10 6f 77 2b 31 2c 20 61 64 64 72 53 65 74 41 62 6f  ow+1, addrSetAbo
28e20 72 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  rt);.      sqlit
28e30 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
28e40 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 4f 75  OP_Return, regOu
28e50 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20  tputRow);.      
28e60 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
28e70 22 65 6e 64 20 67 72 6f 75 70 62 79 20 72 65 73  "end groupby res
28e80 75 6c 74 20 67 65 6e 65 72 61 74 6f 72 22 29 29  ult generator"))
28e90 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65  ;..      /* Gene
28ea0 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e  rate a subroutin
28eb0 65 20 74 68 61 74 20 77 69 6c 6c 20 72 65 73 65  e that will rese
28ec0 74 20 74 68 65 20 67 72 6f 75 70 2d 62 79 20 61  t the group-by a
28ed0 63 63 75 6d 75 6c 61 74 6f 72 0a 20 20 20 20 20  ccumulator.     
28ee0 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
28ef0 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
28f00 6c 28 76 2c 20 61 64 64 72 52 65 73 65 74 29 3b  l(v, addrReset);
28f10 0a 20 20 20 20 20 20 72 65 73 65 74 41 63 63 75  .      resetAccu
28f20 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20  mulator(pParse, 
28f30 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20  &sAggInfo);.    
28f40 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
28f50 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e  Op1(v, OP_Return
28f60 2c 20 72 65 67 52 65 73 65 74 29 3b 0a 20 20 20  , regReset);.   
28f70 20 20 0a 20 20 20 20 7d 20 2f 2a 20 65 6e 64 69    .    } /* endi
28f80 66 20 70 47 72 6f 75 70 42 79 2e 20 20 42 65 67  f pGroupBy.  Beg
28f90 69 6e 20 61 67 67 72 65 67 61 74 65 20 71 75 65  in aggregate que
28fa0 72 69 65 73 20 77 69 74 68 6f 75 74 20 47 52 4f  ries without GRO
28fb0 55 50 20 42 59 3a 20 2a 2f 0a 20 20 20 20 65 6c  UP BY: */.    el
28fc0 73 65 20 7b 0a 20 20 20 20 20 20 45 78 70 72 4c  se {.      ExprL
28fd0 69 73 74 20 2a 70 44 65 6c 20 3d 20 30 3b 0a 23  ist *pDel = 0;.#
28fe0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
28ff0 49 54 5f 42 54 52 45 45 43 4f 55 4e 54 0a 20 20  IT_BTREECOUNT.  
29000 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b      Table *pTab;
29010 0a 20 20 20 20 20 20 69 66 28 20 28 70 54 61 62  .      if( (pTab
29020 20 3d 20 69 73 53 69 6d 70 6c 65 43 6f 75 6e 74   = isSimpleCount
29030 28 70 2c 20 26 73 41 67 67 49 6e 66 6f 29 29 21  (p, &sAggInfo))!
29040 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  =0 ){.        /*
29050 20 49 66 20 69 73 53 69 6d 70 6c 65 43 6f 75 6e   If isSimpleCoun
29060 74 28 29 20 72 65 74 75 72 6e 73 20 61 20 70 6f  t() returns a po
29070 69 6e 74 65 72 20 74 6f 20 61 20 54 61 62 6c 65  inter to a Table
29080 20 73 74 72 75 63 74 75 72 65 2c 20 74 68 65 6e   structure, then
29090 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
290a0 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 69 73  SQL statement is
290b0 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 20 20   of the form:.  
290c0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
290d0 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 63 6f 75   **   SELECT cou
290e0 6e 74 28 2a 29 20 46 52 4f 4d 20 3c 74 62 6c 3e  nt(*) FROM <tbl>
290f0 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
29100 20 20 20 20 2a 2a 20 77 68 65 72 65 20 74 68 65      ** where the
29110 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   Table structure
29120 20 72 65 74 75 72 6e 65 64 20 72 65 70 72 65 73   returned repres
29130 65 6e 74 73 20 74 61 62 6c 65 20 3c 74 62 6c 3e  ents table <tbl>
29140 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
29150 20 20 20 20 20 2a 2a 20 54 68 69 73 20 73 74 61       ** This sta
29160 74 65 6d 65 6e 74 20 69 73 20 73 6f 20 63 6f 6d  tement is so com
29170 6d 6f 6e 20 74 68 61 74 20 69 74 20 69 73 20 6f  mon that it is o
29180 70 74 69 6d 69 7a 65 64 20 73 70 65 63 69 61 6c  ptimized special
29190 6c 79 2e 20 54 68 65 0a 20 20 20 20 20 20 20 20  ly. The.        
291a0 2a 2a 20 4f 50 5f 43 6f 75 6e 74 20 69 6e 73 74  ** OP_Count inst
291b0 72 75 63 74 69 6f 6e 20 69 73 20 65 78 65 63 75  ruction is execu
291c0 74 65 64 20 65 69 74 68 65 72 20 6f 6e 20 74 68  ted either on th
291d0 65 20 69 6e 74 6b 65 79 20 74 61 62 6c 65 20 74  e intkey table t
291e0 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 63  hat.        ** c
291f0 6f 6e 74 61 69 6e 73 20 74 68 65 20 64 61 74 61  ontains the data
29200 20 66 6f 72 20 74 61 62 6c 65 20 3c 74 62 6c 3e   for table <tbl>
29210 20 6f 72 20 6f 6e 20 6f 6e 65 20 6f 66 20 69 74   or on one of it
29220 73 20 69 6e 64 65 78 65 73 2e 20 49 74 0a 20 20  s indexes. It.  
29230 20 20 20 20 20 20 2a 2a 20 69 73 20 62 65 74 74        ** is bett
29240 65 72 20 74 6f 20 65 78 65 63 75 74 65 20 74 68  er to execute th
29250 65 20 6f 70 20 6f 6e 20 61 6e 20 69 6e 64 65 78  e op on an index
29260 2c 20 61 73 20 69 6e 64 65 78 65 73 20 61 72 65  , as indexes are
29270 20 61 6c 6d 6f 73 74 0a 20 20 20 20 20 20 20 20   almost.        
29280 2a 2a 20 61 6c 77 61 79 73 20 73 70 72 65 61 64  ** always spread
29290 20 61 63 72 6f 73 73 20 6c 65 73 73 20 70 61 67   across less pag
292a0 65 73 20 74 68 61 6e 20 74 68 65 69 72 20 63 6f  es than their co
292b0 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c  rresponding tabl
292c0 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  es..        */. 
292d0 20 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74         const int
292e0 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
292f0 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72  hemaToIndex(pPar
29300 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53  se->db, pTab->pS
29310 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 20 20  chema);.        
29320 63 6f 6e 73 74 20 69 6e 74 20 69 43 73 72 20 3d  const int iCsr =
29330 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
29340 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 74       /* Cursor t
29350 6f 20 73 63 61 6e 20 62 2d 74 72 65 65 20 2a 2f  o scan b-tree */
29360 0a 20 20 20 20 20 20 20 20 49 6e 64 65 78 20 2a  .        Index *
29370 70 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20  pIdx;           
29380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29390 20 49 74 65 72 61 74 6f 72 20 76 61 72 69 61 62   Iterator variab
293a0 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 4b 65  le */.        Ke
293b0 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20  yInfo *pKeyInfo 
293c0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
293d0 20 20 20 2f 2a 20 4b 65 79 69 6e 66 6f 20 66 6f     /* Keyinfo fo
293e0 72 20 73 63 61 6e 6e 65 64 20 69 6e 64 65 78 20  r scanned index 
293f0 2a 2f 0a 20 20 20 20 20 20 20 20 49 6e 64 65 78  */.        Index
29400 20 2a 70 42 65 73 74 20 3d 20 30 3b 20 20 20 20   *pBest = 0;    
29410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29420 2f 2a 20 42 65 73 74 20 69 6e 64 65 78 20 66 6f  /* Best index fo
29430 75 6e 64 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20  und so far */.  
29440 20 20 20 20 20 20 69 6e 74 20 69 52 6f 6f 74 20        int iRoot 
29450 3d 20 70 54 61 62 2d 3e 74 6e 75 6d 3b 20 20 20  = pTab->tnum;   
29460 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f             /* Ro
29470 6f 74 20 70 61 67 65 20 6f 66 20 73 63 61 6e 6e  ot page of scann
29480 65 64 20 62 2d 74 72 65 65 20 2a 2f 0a 0a 20 20  ed b-tree */..  
29490 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64        sqlite3Cod
294a0 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50  eVerifySchema(pP
294b0 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20  arse, iDb);.    
294c0 20 20 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65      sqlite3Table
294d0 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62  Lock(pParse, iDb
294e0 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c  , pTab->tnum, 0,
294f0 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a   pTab->zName);..
29500 20 20 20 20 20 20 20 20 2f 2a 20 53 65 61 72 63          /* Searc
29510 68 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78 20  h for the index 
29520 74 68 61 74 20 68 61 73 20 74 68 65 20 6c 6f 77  that has the low
29530 65 73 74 20 73 63 61 6e 20 63 6f 73 74 2e 0a 20  est scan cost.. 
29540 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
29550 20 20 2a 2a 20 28 32 30 31 31 2d 30 34 2d 31 35    ** (2011-04-15
29560 29 20 44 6f 20 6e 6f 74 20 64 6f 20 61 20 66 75  ) Do not do a fu
29570 6c 6c 20 73 63 61 6e 20 6f 66 20 61 6e 20 75 6e  ll scan of an un
29580 6f 72 64 65 72 65 64 20 69 6e 64 65 78 2e 0a 20  ordered index.. 
29590 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
295a0 20 20 2a 2a 20 28 32 30 31 33 2d 31 30 2d 30 33    ** (2013-10-03
295b0 29 20 44 6f 20 6e 6f 74 20 63 6f 75 6e 74 20 74  ) Do not count t
295c0 68 65 20 65 6e 74 72 69 65 73 20 69 6e 20 61 20  he entries in a 
295d0 70 61 72 74 69 61 6c 20 69 6e 64 65 78 2e 0a 20  partial index.. 
295e0 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
295f0 20 20 2a 2a 20 49 6e 20 70 72 61 63 74 69 63 65    ** In practice
29600 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72   the KeyInfo str
29610 75 63 74 75 72 65 20 77 69 6c 6c 20 6e 6f 74 20  ucture will not 
29620 62 65 20 75 73 65 64 2e 20 49 74 20 69 73 20 6f  be used. It is o
29630 6e 6c 79 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  nly .        ** 
29640 70 61 73 73 65 64 20 74 6f 20 6b 65 65 70 20 4f  passed to keep O
29650 50 5f 4f 70 65 6e 52 65 61 64 20 68 61 70 70 79  P_OpenRead happy
29660 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
29670 20 20 20 20 20 69 66 28 20 21 48 61 73 52 6f 77       if( !HasRow
29680 69 64 28 70 54 61 62 29 20 29 20 70 42 65 73 74  id(pTab) ) pBest
29690 20 3d 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72   = sqlite3Primar
296a0 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29 3b  yKeyIndex(pTab);
296b0 0a 20 20 20 20 20 20 20 20 66 6f 72 28 70 49 64  .        for(pId
296c0 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20  x=pTab->pIndex; 
296d0 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d  pIdx; pIdx=pIdx-
296e0 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20  >pNext){.       
296f0 20 20 20 69 66 28 20 70 49 64 78 2d 3e 62 55 6e     if( pIdx->bUn
29700 6f 72 64 65 72 65 64 3d 3d 30 0a 20 20 20 20 20  ordered==0.     
29710 20 20 20 20 20 20 26 26 20 70 49 64 78 2d 3e 73        && pIdx->s
29720 7a 49 64 78 52 6f 77 3c 70 54 61 62 2d 3e 73 7a  zIdxRow<pTab->sz
29730 54 61 62 52 6f 77 0a 20 20 20 20 20 20 20 20 20  TabRow.         
29740 20 20 26 26 20 70 49 64 78 2d 3e 70 50 61 72 74    && pIdx->pPart
29750 49 64 78 57 68 65 72 65 3d 3d 30 0a 20 20 20 20  IdxWhere==0.    
29760 20 20 20 20 20 20 20 26 26 20 28 21 70 42 65 73         && (!pBes
29770 74 20 7c 7c 20 70 49 64 78 2d 3e 73 7a 49 64 78  t || pIdx->szIdx
29780 52 6f 77 3c 70 42 65 73 74 2d 3e 73 7a 49 64 78  Row<pBest->szIdx
29790 52 6f 77 29 0a 20 20 20 20 20 20 20 20 20 20 29  Row).          )
297a0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 42  {.            pB
297b0 65 73 74 20 3d 20 70 49 64 78 3b 0a 20 20 20 20  est = pIdx;.    
297c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
297d0 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 42  }.        if( pB
297e0 65 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  est ){.         
297f0 20 69 52 6f 6f 74 20 3d 20 70 42 65 73 74 2d 3e   iRoot = pBest->
29800 74 6e 75 6d 3b 0a 20 20 20 20 20 20 20 20 20 20  tnum;.          
29810 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74  pKeyInfo = sqlit
29820 65 33 4b 65 79 49 6e 66 6f 4f 66 49 6e 64 65 78  e3KeyInfoOfIndex
29830 28 70 50 61 72 73 65 2c 20 70 42 65 73 74 29 3b  (pParse, pBest);
29840 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
29850 20 20 20 20 2f 2a 20 4f 70 65 6e 20 61 20 72 65      /* Open a re
29860 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 2c 20  ad-only cursor, 
29870 65 78 65 63 75 74 65 20 74 68 65 20 4f 50 5f 43  execute the OP_C
29880 6f 75 6e 74 2c 20 63 6c 6f 73 65 20 74 68 65 20  ount, close the 
29890 63 75 72 73 6f 72 2e 20 2a 2f 0a 20 20 20 20 20  cursor. */.     
298a0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
298b0 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 4f 70  dOp4Int(v, OP_Op
298c0 65 6e 52 65 61 64 2c 20 69 43 73 72 2c 20 69 52  enRead, iCsr, iR
298d0 6f 6f 74 2c 20 69 44 62 2c 20 31 29 3b 0a 20 20  oot, iDb, 1);.  
298e0 20 20 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e        if( pKeyIn
298f0 66 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  fo ){.          
29900 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
29910 65 50 34 28 76 2c 20 2d 31 2c 20 28 63 68 61 72  eP4(v, -1, (char
29920 20 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f   *)pKeyInfo, P4_
29930 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20  KEYINFO);.      
29940 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
29950 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
29960 20 4f 50 5f 43 6f 75 6e 74 2c 20 69 43 73 72 2c   OP_Count, iCsr,
29970 20 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b   sAggInfo.aFunc[
29980 30 5d 2e 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20  0].iMem);.      
29990 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
299a0 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  Op1(v, OP_Close,
299b0 20 69 43 73 72 29 3b 0a 20 20 20 20 20 20 20 20   iCsr);.        
299c0 65 78 70 6c 61 69 6e 53 69 6d 70 6c 65 43 6f 75  explainSimpleCou
299d0 6e 74 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c  nt(pParse, pTab,
299e0 20 70 42 65 73 74 29 3b 0a 20 20 20 20 20 20 7d   pBest);.      }
299f0 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53  else.#endif /* S
29a00 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 54 52 45 45  QLITE_OMIT_BTREE
29a10 43 4f 55 4e 54 20 2a 2f 0a 20 20 20 20 20 20 7b  COUNT */.      {
29a20 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63  .        /* Chec
29a30 6b 20 69 66 20 74 68 65 20 71 75 65 72 79 20 69  k if the query i
29a40 73 20 6f 66 20 6f 6e 65 20 6f 66 20 74 68 65 20  s of one of the 
29a50 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d 73 3a  following forms:
29a60 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
29a70 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20      **   SELECT 
29a80 6d 69 6e 28 78 29 20 46 52 4f 4d 20 2e 2e 2e 0a  min(x) FROM ....
29a90 20 20 20 20 20 20 20 20 2a 2a 20 20 20 53 45 4c          **   SEL
29aa0 45 43 54 20 6d 61 78 28 78 29 20 46 52 4f 4d 20  ECT max(x) FROM 
29ab0 2e 2e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ....        **. 
29ac0 20 20 20 20 20 20 20 2a 2a 20 49 66 20 69 74 20         ** If it 
29ad0 69 73 2c 20 74 68 65 6e 20 61 73 6b 20 74 68 65  is, then ask the
29ae0 20 63 6f 64 65 20 69 6e 20 77 68 65 72 65 2e 63   code in where.c
29af0 20 74 6f 20 61 74 74 65 6d 70 74 20 74 6f 20 73   to attempt to s
29b00 6f 72 74 20 72 65 73 75 6c 74 73 0a 20 20 20 20  ort results.    
29b10 20 20 20 20 2a 2a 20 61 73 20 69 66 20 74 68 65      ** as if the
29b20 72 65 20 77 61 73 20 61 6e 20 22 4f 52 44 45 52  re was an "ORDER
29b30 20 4f 4e 20 78 22 20 6f 72 20 22 4f 52 44 45 52   ON x" or "ORDER
29b40 20 4f 4e 20 78 20 44 45 53 43 22 20 63 6c 61 75   ON x DESC" clau
29b50 73 65 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  se. .        ** 
29b60 49 66 20 77 68 65 72 65 2e 63 20 69 73 20 61 62  If where.c is ab
29b70 6c 65 20 74 6f 20 70 72 6f 64 75 63 65 20 72 65  le to produce re
29b80 73 75 6c 74 73 20 73 6f 72 74 65 64 20 69 6e 20  sults sorted in 
29b90 74 68 69 73 20 6f 72 64 65 72 2c 20 74 68 65 6e  this order, then
29ba0 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 64 64 20  .        ** add 
29bb0 76 64 62 65 20 63 6f 64 65 20 74 6f 20 62 72 65  vdbe code to bre
29bc0 61 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 70 72  ak out of the pr
29bd0 6f 63 65 73 73 69 6e 67 20 6c 6f 6f 70 20 61 66  ocessing loop af
29be0 74 65 72 20 74 68 65 20 0a 20 20 20 20 20 20 20  ter the .       
29bf0 20 2a 2a 20 66 69 72 73 74 20 69 74 65 72 61 74   ** first iterat
29c00 69 6f 6e 20 28 73 69 6e 63 65 20 74 68 65 20 66  ion (since the f
29c10 69 72 73 74 20 69 74 65 72 61 74 69 6f 6e 20 6f  irst iteration o
29c20 66 20 74 68 65 20 6c 6f 6f 70 20 69 73 20 0a 20  f the loop is . 
29c30 20 20 20 20 20 20 20 2a 2a 20 67 75 61 72 61 6e         ** guaran
29c40 74 65 65 64 20 74 6f 20 6f 70 65 72 61 74 65 20  teed to operate 
29c50 6f 6e 20 74 68 65 20 72 6f 77 20 77 69 74 68 20  on the row with 
29c60 74 68 65 20 6d 69 6e 69 6d 75 6d 20 6f 72 20 6d  the minimum or m
29c70 61 78 69 6d 75 6d 20 0a 20 20 20 20 20 20 20 20  aximum .        
29c80 2a 2a 20 76 61 6c 75 65 20 6f 66 20 78 2c 20 74  ** value of x, t
29c90 68 65 20 6f 6e 6c 79 20 72 6f 77 20 72 65 71 75  he only row requ
29ca0 69 72 65 64 29 2e 0a 20 20 20 20 20 20 20 20 2a  ired)..        *
29cb0 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 41 20 73  *.        ** A s
29cc0 70 65 63 69 61 6c 20 66 6c 61 67 20 6d 75 73 74  pecial flag must
29cd0 20 62 65 20 70 61 73 73 65 64 20 74 6f 20 73 71   be passed to sq
29ce0 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
29cf0 29 20 74 6f 20 73 6c 69 67 68 74 6c 79 0a 20 20  ) to slightly.  
29d00 20 20 20 20 20 20 2a 2a 20 6d 6f 64 69 66 79 20        ** modify 
29d10 62 65 68 61 76 69 6f 72 20 61 73 20 66 6f 6c 6c  behavior as foll
29d20 6f 77 73 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ows:.        **.
29d30 20 20 20 20 20 20 20 20 2a 2a 20 20 20 2b 20 49          **   + I
29d40 66 20 74 68 65 20 71 75 65 72 79 20 69 73 20 61  f the query is a
29d50 20 22 53 45 4c 45 43 54 20 6d 69 6e 28 78 29 22   "SELECT min(x)"
29d60 2c 20 74 68 65 6e 20 74 68 65 20 6c 6f 6f 70 20  , then the loop 
29d70 63 6f 64 65 64 20 62 79 0a 20 20 20 20 20 20 20  coded by.       
29d80 20 2a 2a 20 20 20 20 20 77 68 65 72 65 2e 63 20   **     where.c 
29d90 73 68 6f 75 6c 64 20 6e 6f 74 20 69 74 65 72 61  should not itera
29da0 74 65 20 6f 76 65 72 20 61 6e 79 20 76 61 6c 75  te over any valu
29db0 65 73 20 77 69 74 68 20 61 20 4e 55 4c 4c 20 76  es with a NULL v
29dc0 61 6c 75 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  alue.        ** 
29dd0 20 20 20 20 66 6f 72 20 78 2e 0a 20 20 20 20 20      for x..     
29de0 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
29df0 20 20 20 2b 20 54 68 65 20 6f 70 74 69 6d 69 7a     + The optimiz
29e00 65 72 20 63 6f 64 65 20 69 6e 20 77 68 65 72 65  er code in where
29e10 2e 63 20 28 74 68 65 20 74 68 69 6e 67 20 74 68  .c (the thing th
29e20 61 74 20 64 65 63 69 64 65 73 20 77 68 69 63 68  at decides which
29e30 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20  .        **     
29e40 69 6e 64 65 78 20 6f 72 20 69 6e 64 69 63 65 73  index or indices
29e50 20 74 6f 20 75 73 65 29 20 73 68 6f 75 6c 64 20   to use) should 
29e60 70 6c 61 63 65 20 61 20 64 69 66 66 65 72 65 6e  place a differen
29e70 74 20 70 72 69 6f 72 69 74 79 20 6f 6e 20 0a 20  t priority on . 
29e80 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 73 61         **     sa
29e90 74 69 73 66 79 69 6e 67 20 74 68 65 20 27 4f 52  tisfying the 'OR
29ea0 44 45 52 20 42 59 27 20 63 6c 61 75 73 65 20 74  DER BY' clause t
29eb0 68 61 6e 20 69 74 20 64 6f 65 73 20 69 6e 20 6f  han it does in o
29ec0 74 68 65 72 20 63 61 73 65 73 2e 0a 20 20 20 20  ther cases..    
29ed0 20 20 20 20 2a 2a 20 20 20 20 20 52 65 66 65 72      **     Refer
29ee0 20 74 6f 20 63 6f 64 65 20 61 6e 64 20 63 6f 6d   to code and com
29ef0 6d 65 6e 74 73 20 69 6e 20 77 68 65 72 65 2e 63  ments in where.c
29f00 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 20 20   for details..  
29f10 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
29f20 20 45 78 70 72 4c 69 73 74 20 2a 70 4d 69 6e 4d   ExprList *pMinM
29f30 61 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ax = 0;.        
29f40 75 38 20 66 6c 61 67 20 3d 20 57 48 45 52 45 5f  u8 flag = WHERE_
29f50 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b 0a  ORDERBY_NORMAL;.
29f60 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20          .       
29f70 20 61 73 73 65 72 74 28 20 70 2d 3e 70 47 72 6f   assert( p->pGro
29f80 75 70 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20  upBy==0 );.     
29f90 20 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 3d     assert( flag=
29fa0 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  =0 );.        if
29fb0 28 20 70 2d 3e 70 48 61 76 69 6e 67 3d 3d 30 20  ( p->pHaving==0 
29fc0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6c 61  ){.          fla
29fd0 67 20 3d 20 6d 69 6e 4d 61 78 51 75 65 72 79 28  g = minMaxQuery(
29fe0 26 73 41 67 67 49 6e 66 6f 2c 20 26 70 4d 69 6e  &sAggInfo, &pMin
29ff0 4d 61 78 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Max);.        }.
2a000 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2a010 66 6c 61 67 3d 3d 30 20 7c 7c 20 28 70 4d 69 6e  flag==0 || (pMin
2a020 4d 61 78 21 3d 30 20 26 26 20 70 4d 69 6e 4d 61  Max!=0 && pMinMa
2a030 78 2d 3e 6e 45 78 70 72 3d 3d 31 29 20 29 3b 0a  x->nExpr==1) );.
2a040 0a 20 20 20 20 20 20 20 20 69 66 28 20 66 6c 61  .        if( fla
2a050 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  g ){.          p
2a060 4d 69 6e 4d 61 78 20 3d 20 73 71 6c 69 74 65 33  MinMax = sqlite3
2a070 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20  ExprListDup(db, 
2a080 70 4d 69 6e 4d 61 78 2c 20 30 29 3b 0a 20 20 20  pMinMax, 0);.   
2a090 20 20 20 20 20 20 20 70 44 65 6c 20 3d 20 70 4d         pDel = pM
2a0a0 69 6e 4d 61 78 3b 0a 20 20 20 20 20 20 20 20 20  inMax;.         
2a0b0 20 69 66 28 20 70 4d 69 6e 4d 61 78 20 26 26 20   if( pMinMax && 
2a0c0 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
2a0d0 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  d ){.           
2a0e0 20 70 4d 69 6e 4d 61 78 2d 3e 61 5b 30 5d 2e 73   pMinMax->a[0].s
2a0f0 6f 72 74 4f 72 64 65 72 20 3d 20 66 6c 61 67 21  ortOrder = flag!
2a100 3d 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d  =WHERE_ORDERBY_M
2a110 49 4e 20 3f 31 3a 30 3b 0a 20 20 20 20 20 20 20  IN ?1:0;.       
2a120 20 20 20 20 20 70 4d 69 6e 4d 61 78 2d 3e 61 5b       pMinMax->a[
2a130 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54  0].pExpr->op = T
2a140 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20  K_COLUMN;.      
2a150 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
2a160 20 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68    .        /* Th
2a170 69 73 20 63 61 73 65 20 72 75 6e 73 20 69 66 20  is case runs if 
2a180 74 68 65 20 61 67 67 72 65 67 61 74 65 20 68 61  the aggregate ha
2a190 73 20 6e 6f 20 47 52 4f 55 50 20 42 59 20 63 6c  s no GROUP BY cl
2a1a0 61 75 73 65 2e 20 20 54 68 65 0a 20 20 20 20 20  ause.  The.     
2a1b0 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67     ** processing
2a1c0 20 69 73 20 6d 75 63 68 20 73 69 6d 70 6c 65 72   is much simpler
2a1d0 20 73 69 6e 63 65 20 74 68 65 72 65 20 69 73 20   since there is 
2a1e0 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 72 6f  only a single ro
2a1f0 77 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20  w.        ** of 
2a200 6f 75 74 70 75 74 2e 0a 20 20 20 20 20 20 20 20  output..        
2a210 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 73 65 74  */.        reset
2a220 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72  Accumulator(pPar
2a230 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a  se, &sAggInfo);.
2a240 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f 20 3d          pWInfo =
2a250 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
2a260 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c  in(pParse, pTabL
2a270 69 73 74 2c 20 70 57 68 65 72 65 2c 20 70 4d 69  ist, pWhere, pMi
2a280 6e 4d 61 78 2c 30 2c 66 6c 61 67 2c 30 29 3b 0a  nMax,0,flag,0);.
2a290 20 20 20 20 20 20 20 20 69 66 28 20 70 57 49 6e          if( pWIn
2a2a0 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  fo==0 ){.       
2a2b0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
2a2c0 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 44 65  stDelete(db, pDe
2a2d0 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  l);.          go
2a2e0 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
2a2f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2a300 20 75 70 64 61 74 65 41 63 63 75 6d 75 6c 61 74   updateAccumulat
2a310 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41 67 67  or(pParse, &sAgg
2a320 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 61  Info);.        a
2a330 73 73 65 72 74 28 20 70 4d 69 6e 4d 61 78 3d 3d  ssert( pMinMax==
2a340 30 20 7c 7c 20 70 4d 69 6e 4d 61 78 2d 3e 6e 45  0 || pMinMax->nE
2a350 78 70 72 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  xpr==1 );.      
2a360 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65    if( sqlite3Whe
2a370 72 65 49 73 4f 72 64 65 72 65 64 28 70 57 49 6e  reIsOrdered(pWIn
2a380 66 6f 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  fo) ){.         
2a390 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2a3a0 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
2a3b0 2c 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 72  , sqlite3WhereBr
2a3c0 65 61 6b 4c 61 62 65 6c 28 70 57 49 6e 66 6f 29  eakLabel(pWInfo)
2a3d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 56 64 62  );.          Vdb
2a3e0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73  eComment((v, "%s
2a3f0 28 29 20 62 79 20 69 6e 64 65 78 22 2c 0a 20 20  () by index",.  
2a400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 66                (f
2a410 6c 61 67 3d 3d 57 48 45 52 45 5f 4f 52 44 45 52  lag==WHERE_ORDER
2a420 42 59 5f 4d 49 4e 3f 22 6d 69 6e 22 3a 22 6d 61  BY_MIN?"min":"ma
2a430 78 22 29 29 29 3b 0a 20 20 20 20 20 20 20 20 7d  x")));.        }
2a440 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2a450 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29  WhereEnd(pWInfo)
2a460 3b 0a 20 20 20 20 20 20 20 20 66 69 6e 61 6c 69  ;.        finali
2a470 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e 73 28 70  zeAggFunctions(p
2a480 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f  Parse, &sAggInfo
2a490 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
2a4a0 20 20 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a    pOrderBy = 0;.
2a4b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
2a4c0 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
2a4d0 20 70 48 61 76 69 6e 67 2c 20 61 64 64 72 45 6e   pHaving, addrEn
2a4e0 64 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  d, SQLITE_JUMPIF
2a4f0 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 65 6c  NULL);.      sel
2a500 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61  ectInnerLoop(pPa
2a510 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73  rse, p, p->pELis
2a520 74 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 0a  t, 0, 0, 0, 0, .
2a530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a540 20 20 20 20 20 20 70 44 65 73 74 2c 20 61 64 64        pDest, add
2a550 72 45 6e 64 2c 20 61 64 64 72 45 6e 64 29 3b 0a  rEnd, addrEnd);.
2a560 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
2a570 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
2a580 70 44 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20  pDel);.    }.   
2a590 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
2a5a0 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72  lveLabel(v, addr
2a5b0 45 6e 64 29 3b 0a 20 20 20 20 0a 20 20 7d 20 2f  End);.    .  } /
2a5c0 2a 20 65 6e 64 69 66 20 61 67 67 72 65 67 61 74  * endif aggregat
2a5d0 65 20 71 75 65 72 79 20 2a 2f 0a 0a 20 20 69 66  e query */..  if
2a5e0 28 20 73 44 69 73 74 69 6e 63 74 2e 65 54 6e 63  ( sDistinct.eTnc
2a5f0 74 54 79 70 65 3d 3d 57 48 45 52 45 5f 44 49 53  tType==WHERE_DIS
2a600 54 49 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44 20  TINCT_UNORDERED 
2a610 29 7b 0a 20 20 20 20 65 78 70 6c 61 69 6e 54 65  ){.    explainTe
2a620 6d 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  mpTable(pParse, 
2a630 22 44 49 53 54 49 4e 43 54 22 29 3b 0a 20 20 7d  "DISTINCT");.  }
2a640 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
2a650 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  is an ORDER BY c
2a660 6c 61 75 73 65 2c 20 74 68 65 6e 20 77 65 20 6e  lause, then we n
2a670 65 65 64 20 74 6f 20 73 6f 72 74 20 74 68 65 20  eed to sort the 
2a680 72 65 73 75 6c 74 73 0a 20 20 2a 2a 20 61 6e 64  results.  ** and
2a690 20 73 65 6e 64 20 74 68 65 6d 20 74 6f 20 74 68   send them to th
2a6a0 65 20 63 61 6c 6c 62 61 63 6b 20 6f 6e 65 20 62  e callback one b
2a6b0 79 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  y one..  */.  if
2a6c0 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ( pOrderBy ){.  
2a6d0 20 20 65 78 70 6c 61 69 6e 54 65 6d 70 54 61 62    explainTempTab
2a6e0 6c 65 28 70 50 61 72 73 65 2c 20 22 4f 52 44 45  le(pParse, "ORDE
2a6f0 52 20 42 59 22 29 3b 0a 20 20 20 20 67 65 6e 65  R BY");.    gene
2a700 72 61 74 65 53 6f 72 74 54 61 69 6c 28 70 50 61  rateSortTail(pPa
2a710 72 73 65 2c 20 70 2c 20 76 2c 20 70 45 4c 69 73  rse, p, v, pELis
2a720 74 2d 3e 6e 45 78 70 72 2c 20 70 44 65 73 74 29  t->nExpr, pDest)
2a730 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70  ;.  }..  /* Jump
2a740 20 68 65 72 65 20 74 6f 20 73 6b 69 70 20 74 68   here to skip th
2a750 69 73 20 71 75 65 72 79 0a 20 20 2a 2f 0a 20 20  is query.  */.  
2a760 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
2a770 76 65 4c 61 62 65 6c 28 76 2c 20 69 45 6e 64 29  veLabel(v, iEnd)
2a780 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 53 45 4c 45  ;..  /* The SELE
2a790 43 54 20 77 61 73 20 73 75 63 63 65 73 73 66 75  CT was successfu
2a7a0 6c 6c 79 20 63 6f 64 65 64 2e 20 20 20 53 65 74  lly coded.   Set
2a7b0 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65   the return code
2a7c0 20 74 6f 20 30 0a 20 20 2a 2a 20 74 6f 20 69 6e   to 0.  ** to in
2a7d0 64 69 63 61 74 65 20 6e 6f 20 65 72 72 6f 72 73  dicate no errors
2a7e0 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 30 3b  ..  */.  rc = 0;
2a7f0 0a 0a 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20 6a  ..  /* Control j
2a800 75 6d 70 73 20 74 6f 20 68 65 72 65 20 69 66 20  umps to here if 
2a810 61 6e 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f  an error is enco
2a820 75 6e 74 65 72 65 64 20 61 62 6f 76 65 2c 20 6f  untered above, o
2a830 72 20 75 70 6f 6e 0a 20 20 2a 2a 20 73 75 63 63  r upon.  ** succ
2a840 65 73 73 66 75 6c 20 63 6f 64 69 6e 67 20 6f 66  essful coding of
2a850 20 74 68 65 20 53 45 4c 45 43 54 2e 0a 20 20 2a   the SELECT..  *
2a860 2f 0a 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 20 20  /.select_end:.  
2a870 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65  explainSetIntege
2a880 72 28 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63  r(pParse->iSelec
2a890 74 49 64 2c 20 69 52 65 73 74 6f 72 65 53 65 6c  tId, iRestoreSel
2a8a0 65 63 74 49 64 29 3b 0a 0a 20 20 2f 2a 20 49 64  ectId);..  /* Id
2a8b0 65 6e 74 69 66 79 20 63 6f 6c 75 6d 6e 20 6e 61  entify column na
2a8c0 6d 65 73 20 69 66 20 72 65 73 75 6c 74 73 20 6f  mes if results o
2a8d0 66 20 74 68 65 20 53 45 4c 45 43 54 20 61 72 65  f the SELECT are
2a8e0 20 74 6f 20 62 65 20 6f 75 74 70 75 74 2e 0a 20   to be output.. 
2a8f0 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   */.  if( rc==SQ
2a900 4c 49 54 45 5f 4f 4b 20 26 26 20 70 44 65 73 74  LITE_OK && pDest
2a910 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74  ->eDest==SRT_Out
2a920 70 75 74 20 29 7b 0a 20 20 20 20 67 65 6e 65 72  put ){.    gener
2a930 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70  ateColumnNames(p
2a940 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c  Parse, pTabList,
2a950 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a 20   pEList);.  }.. 
2a960 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
2a970 62 2c 20 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c  b, sAggInfo.aCol
2a980 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
2a990 65 65 28 64 62 2c 20 73 41 67 67 49 6e 66 6f 2e  ee(db, sAggInfo.
2a9a0 61 46 75 6e 63 29 3b 0a 20 20 72 65 74 75 72 6e  aFunc);.  return
2a9b0 20 72 63 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69   rc;.}..#if defi
2a9c0 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
2a9d0 45 5f 54 52 45 45 5f 45 58 50 4c 41 49 4e 29 0a  E_TREE_EXPLAIN).
2a9e0 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61  /*.** Generate a
2a9f0 20 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20   human-readable 
2aa00 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 61  description of a
2aa10 20 74 68 65 20 53 65 6c 65 63 74 20 6f 62 6a 65   the Select obje
2aa20 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ct..*/.static vo
2aa30 69 64 20 65 78 70 6c 61 69 6e 4f 6e 65 53 65 6c  id explainOneSel
2aa40 65 63 74 28 56 64 62 65 20 2a 70 56 64 62 65 2c  ect(Vdbe *pVdbe,
2aa50 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 73   Select *p){.  s
2aa60 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69  qlite3ExplainPri
2aa70 6e 74 66 28 70 56 64 62 65 2c 20 22 53 45 4c 45  ntf(pVdbe, "SELE
2aa80 43 54 20 22 29 3b 0a 20 20 69 66 28 20 70 2d 3e  CT ");.  if( p->
2aa90 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44  selFlags & (SF_D
2aaa0 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65  istinct|SF_Aggre
2aab0 67 61 74 65 29 20 29 7b 0a 20 20 20 20 69 66 28  gate) ){.    if(
2aac0 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53   p->selFlags & S
2aad0 46 5f 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20  F_Distinct ){.  
2aae0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
2aaf0 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20  inPrintf(pVdbe, 
2ab00 22 44 49 53 54 49 4e 43 54 20 22 29 3b 0a 20 20  "DISTINCT ");.  
2ab10 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 73    }.    if( p->s
2ab20 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67 67  elFlags & SF_Agg
2ab30 72 65 67 61 74 65 20 29 7b 0a 20 20 20 20 20 20  regate ){.      
2ab40 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
2ab50 69 6e 74 66 28 70 56 64 62 65 2c 20 22 61 67 67  intf(pVdbe, "agg
2ab60 5f 66 6c 61 67 20 22 29 3b 0a 20 20 20 20 7d 0a  _flag ");.    }.
2ab70 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
2ab80 69 6e 4e 4c 28 70 56 64 62 65 29 3b 0a 20 20 20  inNL(pVdbe);.   
2ab90 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
2aba0 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22 20 20  rintf(pVdbe, "  
2abb0 20 22 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74   ");.  }.  sqlit
2abc0 65 33 45 78 70 6c 61 69 6e 45 78 70 72 4c 69 73  e3ExplainExprLis
2abd0 74 28 70 56 64 62 65 2c 20 70 2d 3e 70 45 4c 69  t(pVdbe, p->pELi
2abe0 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  st);.  sqlite3Ex
2abf0 70 6c 61 69 6e 4e 4c 28 70 56 64 62 65 29 3b 0a  plainNL(pVdbe);.
2ac00 20 20 69 66 28 20 70 2d 3e 70 53 72 63 20 26 26    if( p->pSrc &&
2ac10 20 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 20 29   p->pSrc->nSrc )
2ac20 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
2ac30 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
2ac40 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22 46 52  rintf(pVdbe, "FR
2ac50 4f 4d 20 22 29 3b 0a 20 20 20 20 73 71 6c 69 74  OM ");.    sqlit
2ac60 65 33 45 78 70 6c 61 69 6e 50 75 73 68 28 70 56  e3ExplainPush(pV
2ac70 64 62 65 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  dbe);.    for(i=
2ac80 30 3b 20 69 3c 70 2d 3e 70 53 72 63 2d 3e 6e 53  0; i<p->pSrc->nS
2ac90 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rc; i++){.      
2aca0 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
2acb0 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 2d  tem *pItem = &p-
2acc0 3e 70 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20  >pSrc->a[i];.   
2acd0 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
2ace0 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22  nPrintf(pVdbe, "
2acf0 7b 25 64 2c 2a 7d 20 3d 20 22 2c 20 70 49 74 65  {%d,*} = ", pIte
2ad00 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20  m->iCursor);.   
2ad10 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 53     if( pItem->pS
2ad20 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20  elect ){.       
2ad30 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 53   sqlite3ExplainS
2ad40 65 6c 65 63 74 28 70 56 64 62 65 2c 20 70 49 74  elect(pVdbe, pIt
2ad50 65 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20  em->pSelect);.  
2ad60 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d        if( pItem-
2ad70 3e 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20  >pTab ){.       
2ad80 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
2ad90 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22  nPrintf(pVdbe, "
2ada0 20 28 74 61 62 6e 61 6d 65 3d 25 73 29 22 2c 20   (tabname=%s)", 
2adb0 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61  pItem->pTab->zNa
2adc0 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  me);.        }. 
2add0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
2ade0 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 29 7b 0a 20  Item->zName ){. 
2adf0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
2ae00 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62  plainPrintf(pVdb
2ae10 65 2c 20 22 25 73 22 2c 20 70 49 74 65 6d 2d 3e  e, "%s", pItem->
2ae20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a  zName);.      }.
2ae30 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d        if( pItem-
2ae40 3e 7a 41 6c 69 61 73 20 29 7b 0a 20 20 20 20 20  >zAlias ){.     
2ae50 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
2ae60 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22  nPrintf(pVdbe, "
2ae70 20 28 41 53 20 25 73 29 22 2c 20 70 49 74 65 6d   (AS %s)", pItem
2ae80 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 20  ->zAlias);.     
2ae90 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 49 74   }.      if( pIt
2aea0 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a  em->jointype & J
2aeb0 54 5f 4c 45 46 54 20 29 7b 0a 20 20 20 20 20 20  T_LEFT ){.      
2aec0 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
2aed0 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22 20  Printf(pVdbe, " 
2aee0 4c 45 46 54 2d 4a 4f 49 4e 22 29 3b 0a 20 20 20  LEFT-JOIN");.   
2aef0 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
2af00 65 33 45 78 70 6c 61 69 6e 4e 4c 28 70 56 64 62  e3ExplainNL(pVdb
2af10 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  e);.    }.    sq
2af20 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 6f 70 28  lite3ExplainPop(
2af30 70 56 64 62 65 29 3b 0a 20 20 7d 0a 20 20 69 66  pVdbe);.  }.  if
2af40 28 20 70 2d 3e 70 57 68 65 72 65 20 29 7b 0a 20  ( p->pWhere ){. 
2af50 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
2af60 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22  nPrintf(pVdbe, "
2af70 57 48 45 52 45 20 22 29 3b 0a 20 20 20 20 73 71  WHERE ");.    sq
2af80 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72  lite3ExplainExpr
2af90 28 70 56 64 62 65 2c 20 70 2d 3e 70 57 68 65 72  (pVdbe, p->pWher
2afa0 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  e);.    sqlite3E
2afb0 78 70 6c 61 69 6e 4e 4c 28 70 56 64 62 65 29 3b  xplainNL(pVdbe);
2afc0 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 47  .  }.  if( p->pG
2afd0 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 73 71  roupBy ){.    sq
2afe0 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e  lite3ExplainPrin
2aff0 74 66 28 70 56 64 62 65 2c 20 22 47 52 4f 55 50  tf(pVdbe, "GROUP
2b000 42 59 20 22 29 3b 0a 20 20 20 20 73 71 6c 69 74  BY ");.    sqlit
2b010 65 33 45 78 70 6c 61 69 6e 45 78 70 72 4c 69 73  e3ExplainExprLis
2b020 74 28 70 56 64 62 65 2c 20 70 2d 3e 70 47 72 6f  t(pVdbe, p->pGro
2b030 75 70 42 79 29 3b 0a 20 20 20 20 73 71 6c 69 74  upBy);.    sqlit
2b040 65 33 45 78 70 6c 61 69 6e 4e 4c 28 70 56 64 62  e3ExplainNL(pVdb
2b050 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d  e);.  }.  if( p-
2b060 3e 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20  >pHaving ){.    
2b070 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
2b080 69 6e 74 66 28 70 56 64 62 65 2c 20 22 48 41 56  intf(pVdbe, "HAV
2b090 49 4e 47 20 22 29 3b 0a 20 20 20 20 73 71 6c 69  ING ");.    sqli
2b0a0 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72 28 70  te3ExplainExpr(p
2b0b0 56 64 62 65 2c 20 70 2d 3e 70 48 61 76 69 6e 67  Vdbe, p->pHaving
2b0c0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
2b0d0 70 6c 61 69 6e 4e 4c 28 70 56 64 62 65 29 3b 0a  plainNL(pVdbe);.
2b0e0 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72    }.  if( p->pOr
2b0f0 64 65 72 42 79 20 29 7b 0a 20 20 20 20 73 71 6c  derBy ){.    sql
2b100 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74  ite3ExplainPrint
2b110 66 28 70 56 64 62 65 2c 20 22 4f 52 44 45 52 42  f(pVdbe, "ORDERB
2b120 59 20 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Y ");.    sqlite
2b130 33 45 78 70 6c 61 69 6e 45 78 70 72 4c 69 73 74  3ExplainExprList
2b140 28 70 56 64 62 65 2c 20 70 2d 3e 70 4f 72 64 65  (pVdbe, p->pOrde
2b150 72 42 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  rBy);.    sqlite
2b160 33 45 78 70 6c 61 69 6e 4e 4c 28 70 56 64 62 65  3ExplainNL(pVdbe
2b170 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  );.  }.  if( p->
2b180 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71  pLimit ){.    sq
2b190 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e  lite3ExplainPrin
2b1a0 74 66 28 70 56 64 62 65 2c 20 22 4c 49 4d 49 54  tf(pVdbe, "LIMIT
2b1b0 20 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   ");.    sqlite3
2b1c0 45 78 70 6c 61 69 6e 45 78 70 72 28 70 56 64 62  ExplainExpr(pVdb
2b1d0 65 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20  e, p->pLimit);. 
2b1e0 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
2b1f0 6e 4e 4c 28 70 56 64 62 65 29 3b 0a 20 20 7d 0a  nNL(pVdbe);.  }.
2b200 20 20 69 66 28 20 70 2d 3e 70 4f 66 66 73 65 74    if( p->pOffset
2b210 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
2b220 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64  xplainPrintf(pVd
2b230 62 65 2c 20 22 4f 46 46 53 45 54 20 22 29 3b 0a  be, "OFFSET ");.
2b240 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
2b250 69 6e 45 78 70 72 28 70 56 64 62 65 2c 20 70 2d  inExpr(pVdbe, p-
2b260 3e 70 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 73  >pOffset);.    s
2b270 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 4e 4c 28  qlite3ExplainNL(
2b280 70 56 64 62 65 29 3b 0a 20 20 7d 0a 7d 0a 76 6f  pVdbe);.  }.}.vo
2b290 69 64 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69  id sqlite3Explai
2b2a0 6e 53 65 6c 65 63 74 28 56 64 62 65 20 2a 70 56  nSelect(Vdbe *pV
2b2b0 64 62 65 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b  dbe, Select *p){
2b2c0 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20  .  if( p==0 ){. 
2b2d0 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
2b2e0 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22  nPrintf(pVdbe, "
2b2f0 28 6e 75 6c 6c 2d 73 65 6c 65 63 74 29 22 29 3b  (null-select)");
2b300 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
2b310 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 70 50 72  .  while( p->pPr
2b320 69 6f 72 20 29 7b 0a 20 20 20 20 70 2d 3e 70 50  ior ){.    p->pP
2b330 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 70 3b  rior->pNext = p;
2b340 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 50 72 69  .    p = p->pPri
2b350 6f 72 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  or;.  }.  sqlite
2b360 33 45 78 70 6c 61 69 6e 50 75 73 68 28 70 56 64  3ExplainPush(pVd
2b370 62 65 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 20  be);.  while( p 
2b380 29 7b 0a 20 20 20 20 65 78 70 6c 61 69 6e 4f 6e  ){.    explainOn
2b390 65 53 65 6c 65 63 74 28 70 56 64 62 65 2c 20 70  eSelect(pVdbe, p
2b3a0 29 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e  );.    p = p->pN
2b3b0 65 78 74 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d  ext;.    if( p==
2b3c0 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 73  0 ) break;.    s
2b3d0 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 4e 4c 28  qlite3ExplainNL(
2b3e0 70 56 64 62 65 29 3b 0a 20 20 20 20 73 71 6c 69  pVdbe);.    sqli
2b3f0 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
2b400 28 70 56 64 62 65 2c 20 22 25 73 5c 6e 22 2c 20  (pVdbe, "%s\n", 
2b410 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e  selectOpName(p->
2b420 6f 70 29 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  op));.  }.  sqli
2b430 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
2b440 28 70 56 64 62 65 2c 20 22 45 4e 44 22 29 3b 0a  (pVdbe, "END");.
2b450 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
2b460 50 6f 70 28 70 56 64 62 65 29 3b 0a 7d 0a 0a 2f  Pop(pVdbe);.}../
2b470 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 73 74 72  * End of the str
2b480 75 63 74 75 72 65 20 64 65 62 75 67 20 70 72 69  ucture debug pri
2b490 6e 74 69 6e 67 20 63 6f 64 65 0a 2a 2a 2a 2a 2a  nting code.*****
2b4a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b4b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b4c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b4d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b4e0 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 23 65 6e 64 69 66  ********/.#endif
2b4f0 20 2f 2a 20 64 65 66 69 6e 65 64 28 53 51 4c 49   /* defined(SQLI
2b500 54 45 5f 45 4e 41 42 4c 45 5f 54 52 45 45 5f 45  TE_ENABLE_TREE_E
2b510 58 50 4c 41 49 4e 29 20 2a 2f 0a                 XPLAIN) */.