/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact 9b759521f805e25e97baa2dd64037157fe365817:


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 69  BY clause */.  i
06d0: 6e 74 20 69 73 44 69 73 74 69 6e 63 74 2c 20 20  nt isDistinct,  
06e0: 20 20 20 20 20 2f 2a 20 74 72 75 65 20 69 66 20       /* true if 
06f0: 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79  the DISTINCT key
0700: 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74 20  word is present 
0710: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 69 6d 69  */.  Expr *pLimi
0720: 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 49  t,         /* LI
0730: 4d 49 54 20 76 61 6c 75 65 2e 20 20 4e 55 4c 4c  MIT value.  NULL
0740: 20 6d 65 61 6e 73 20 6e 6f 74 20 75 73 65 64 20   means not used 
0750: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4f 66 66 73  */.  Expr *pOffs
0760: 65 74 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 46  et         /* OF
0770: 46 53 45 54 20 76 61 6c 75 65 2e 20 20 4e 55 4c  FSET value.  NUL
0780: 4c 20 6d 65 61 6e 73 20 6e 6f 20 6f 66 66 73 65  L means no offse
0790: 74 20 2a 2f 0a 29 7b 0a 20 20 53 65 6c 65 63 74  t */.){.  Select
07a0: 20 2a 70 4e 65 77 3b 0a 20 20 53 65 6c 65 63 74   *pNew;.  Select
07b0: 20 73 74 61 6e 64 69 6e 3b 0a 20 20 73 71 6c 69   standin;.  sqli
07c0: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
07d0: 2d 3e 64 62 3b 0a 20 20 70 4e 65 77 20 3d 20 73  ->db;.  pNew = s
07e0: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
07f0: 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70  ro(db, sizeof(*p
0800: 4e 65 77 29 20 29 3b 0a 20 20 61 73 73 65 72 74  New) );.  assert
0810: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
0820: 65 64 20 7c 7c 20 21 70 4f 66 66 73 65 74 20 7c  ed || !pOffset |
0830: 7c 20 70 4c 69 6d 69 74 20 29 3b 20 2f 2a 20 4f  | pLimit ); /* O
0840: 46 46 53 45 54 20 69 6d 70 6c 69 65 73 20 4c 49  FFSET implies LI
0850: 4d 49 54 20 2a 2f 0a 20 20 69 66 28 20 70 4e 65  MIT */.  if( pNe
0860: 77 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65  w==0 ){.    asse
0870: 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  rt( db->mallocFa
0880: 69 6c 65 64 20 29 3b 0a 20 20 20 20 70 4e 65 77  iled );.    pNew
0890: 20 3d 20 26 73 74 61 6e 64 69 6e 3b 0a 20 20 20   = &standin;.   
08a0: 20 6d 65 6d 73 65 74 28 70 4e 65 77 2c 20 30 2c   memset(pNew, 0,
08b0: 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 29 3b   sizeof(*pNew));
08c0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 45 4c 69 73  .  }.  if( pELis
08d0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 45 4c 69  t==0 ){.    pELi
08e0: 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  st = sqlite3Expr
08f0: 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73  ListAppend(pPars
0900: 65 2c 20 30 2c 20 73 71 6c 69 74 65 33 45 78 70  e, 0, sqlite3Exp
0910: 72 28 64 62 2c 54 4b 5f 41 4c 4c 2c 30 29 29 3b  r(db,TK_ALL,0));
0920: 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 70 45 4c  .  }.  pNew->pEL
0930: 69 73 74 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20  ist = pEList;.  
0940: 69 66 28 20 70 53 72 63 3d 3d 30 20 29 20 70 53  if( pSrc==0 ) pS
0950: 72 63 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  rc = sqlite3DbMa
0960: 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
0970: 65 6f 66 28 2a 70 53 72 63 29 29 3b 0a 20 20 70  eof(*pSrc));.  p
0980: 4e 65 77 2d 3e 70 53 72 63 20 3d 20 70 53 72 63  New->pSrc = pSrc
0990: 3b 0a 20 20 70 4e 65 77 2d 3e 70 57 68 65 72 65  ;.  pNew->pWhere
09a0: 20 3d 20 70 57 68 65 72 65 3b 0a 20 20 70 4e 65   = pWhere;.  pNe
09b0: 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 70 47  w->pGroupBy = pG
09c0: 72 6f 75 70 42 79 3b 0a 20 20 70 4e 65 77 2d 3e  roupBy;.  pNew->
09d0: 70 48 61 76 69 6e 67 20 3d 20 70 48 61 76 69 6e  pHaving = pHavin
09e0: 67 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65  g;.  pNew->pOrde
09f0: 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a  rBy = pOrderBy;.
0a00: 20 20 70 4e 65 77 2d 3e 73 65 6c 46 6c 61 67 73    pNew->selFlags
0a10: 20 3d 20 69 73 44 69 73 74 69 6e 63 74 20 3f 20   = isDistinct ? 
0a20: 53 46 5f 44 69 73 74 69 6e 63 74 20 3a 20 30 3b  SF_Distinct : 0;
0a30: 0a 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 54 4b  .  pNew->op = TK
0a40: 5f 53 45 4c 45 43 54 3b 0a 20 20 70 4e 65 77 2d  _SELECT;.  pNew-
0a50: 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74  >pLimit = pLimit
0a60: 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 66 66 73 65  ;.  pNew->pOffse
0a70: 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a 20 20 61  t = pOffset;.  a
0a80: 73 73 65 72 74 28 20 70 4f 66 66 73 65 74 3d 3d  ssert( pOffset==
0a90: 30 20 7c 7c 20 70 4c 69 6d 69 74 21 3d 30 20 29  0 || pLimit!=0 )
0aa0: 3b 0a 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70  ;.  pNew->addrOp
0ab0: 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 2d 31 3b 0a  enEphm[0] = -1;.
0ac0: 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e    pNew->addrOpen
0ad0: 45 70 68 6d 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20  Ephm[1] = -1;.  
0ae0: 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70  pNew->addrOpenEp
0af0: 68 6d 5b 32 5d 20 3d 20 2d 31 3b 0a 20 20 69 66  hm[2] = -1;.  if
0b00: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
0b10: 65 64 20 29 20 7b 0a 20 20 20 20 63 6c 65 61 72  ed ) {.    clear
0b20: 53 65 6c 65 63 74 28 64 62 2c 20 70 4e 65 77 29  Select(db, pNew)
0b30: 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 21 3d  ;.    if( pNew!=
0b40: 26 73 74 61 6e 64 69 6e 20 29 20 73 71 6c 69 74  &standin ) sqlit
0b50: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4e 65  e3DbFree(db, pNe
0b60: 77 29 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 30  w);.    pNew = 0
0b70: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
0b80: 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 70 53 72  ssert( pNew->pSr
0b90: 63 21 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e  c!=0 || pParse->
0ba0: 6e 45 72 72 3e 30 20 29 3b 0a 20 20 7d 0a 20 20  nErr>0 );.  }.  
0bb0: 61 73 73 65 72 74 28 20 70 4e 65 77 21 3d 26 73  assert( pNew!=&s
0bc0: 74 61 6e 64 69 6e 20 29 3b 0a 20 20 72 65 74 75  tandin );.  retu
0bd0: 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pNew;.}../*.*
0be0: 2a 20 44 65 6c 65 74 65 20 74 68 65 20 67 69 76  * Delete the giv
0bf0: 65 6e 20 53 65 6c 65 63 74 20 73 74 72 75 63 74  en Select struct
0c00: 75 72 65 20 61 6e 64 20 61 6c 6c 20 6f 66 20 69  ure and all of i
0c10: 74 73 20 73 75 62 73 74 72 75 63 74 75 72 65 73  ts substructures
0c20: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
0c30: 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 73 71  3SelectDelete(sq
0c40: 6c 69 74 65 33 20 2a 64 62 2c 20 53 65 6c 65 63  lite3 *db, Selec
0c50: 74 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 29  t *p){.  if( p )
0c60: 7b 0a 20 20 20 20 63 6c 65 61 72 53 65 6c 65 63  {.    clearSelec
0c70: 74 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 73 71  t(db, p);.    sq
0c80: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
0c90: 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  p);.  }.}../*.**
0ca0: 20 47 69 76 65 6e 20 31 20 74 6f 20 33 20 69 64   Given 1 to 3 id
0cb0: 65 6e 74 69 66 69 65 72 73 20 70 72 65 63 65 65  entifiers precee
0cc0: 64 69 6e 67 20 74 68 65 20 4a 4f 49 4e 20 6b 65  ding the JOIN ke
0cd0: 79 77 6f 72 64 2c 20 64 65 74 65 72 6d 69 6e 65  yword, determine
0ce0: 20 74 68 65 0a 2a 2a 20 74 79 70 65 20 6f 66 20   the.** type of 
0cf0: 6a 6f 69 6e 2e 20 20 52 65 74 75 72 6e 20 61 6e  join.  Return an
0d00: 20 69 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e   integer constan
0d10: 74 20 74 68 61 74 20 65 78 70 72 65 73 73 65 73  t that expresses
0d20: 20 74 68 61 74 20 74 79 70 65 0a 2a 2a 20 69 6e   that type.** in
0d30: 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 66 6f   terms of the fo
0d40: 6c 6c 6f 77 69 6e 67 20 62 69 74 20 76 61 6c 75  llowing bit valu
0d50: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 4a 54  es:.**.**     JT
0d60: 5f 49 4e 4e 45 52 0a 2a 2a 20 20 20 20 20 4a 54  _INNER.**     JT
0d70: 5f 43 52 4f 53 53 0a 2a 2a 20 20 20 20 20 4a 54  _CROSS.**     JT
0d80: 5f 4f 55 54 45 52 0a 2a 2a 20 20 20 20 20 4a 54  _OUTER.**     JT
0d90: 5f 4e 41 54 55 52 41 4c 0a 2a 2a 20 20 20 20 20  _NATURAL.**     
0da0: 4a 54 5f 4c 45 46 54 0a 2a 2a 20 20 20 20 20 4a  JT_LEFT.**     J
0db0: 54 5f 52 49 47 48 54 0a 2a 2a 0a 2a 2a 20 41 20  T_RIGHT.**.** A 
0dc0: 66 75 6c 6c 20 6f 75 74 65 72 20 6a 6f 69 6e 20  full outer join 
0dd0: 69 73 20 74 68 65 20 63 6f 6d 62 69 6e 61 74 69  is the combinati
0de0: 6f 6e 20 6f 66 20 4a 54 5f 4c 45 46 54 20 61 6e  on of JT_LEFT an
0df0: 64 20 4a 54 5f 52 49 47 48 54 2e 0a 2a 2a 0a 2a  d JT_RIGHT..**.*
0e00: 2a 20 49 66 20 61 6e 20 69 6c 6c 65 67 61 6c 20  * If an illegal 
0e10: 6f 72 20 75 6e 73 75 70 70 6f 72 74 65 64 20 6a  or unsupported j
0e20: 6f 69 6e 20 74 79 70 65 20 69 73 20 73 65 65 6e  oin type is seen
0e30: 2c 20 74 68 65 6e 20 73 74 69 6c 6c 20 72 65 74  , then still ret
0e40: 75 72 6e 0a 2a 2a 20 61 20 6a 6f 69 6e 20 74 79  urn.** a join ty
0e50: 70 65 2c 20 62 75 74 20 70 75 74 20 61 6e 20 65  pe, but put an e
0e60: 72 72 6f 72 20 69 6e 20 74 68 65 20 70 50 61 72  rror in the pPar
0e70: 73 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f  se structure..*/
0e80: 0a 69 6e 74 20 73 71 6c 69 74 65 33 4a 6f 69 6e  .int sqlite3Join
0e90: 54 79 70 65 28 50 61 72 73 65 20 2a 70 50 61 72  Type(Parse *pPar
0ea0: 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 41 2c 20 54  se, Token *pA, T
0eb0: 6f 6b 65 6e 20 2a 70 42 2c 20 54 6f 6b 65 6e 20  oken *pB, Token 
0ec0: 2a 70 43 29 7b 0a 20 20 69 6e 74 20 6a 6f 69 6e  *pC){.  int join
0ed0: 74 79 70 65 20 3d 20 30 3b 0a 20 20 54 6f 6b 65  type = 0;.  Toke
0ee0: 6e 20 2a 61 70 41 6c 6c 5b 33 5d 3b 0a 20 20 54  n *apAll[3];.  T
0ef0: 6f 6b 65 6e 20 2a 70 3b 0a 20 20 20 20 20 20 20  oken *p;.       
0f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0f10: 20 20 20 20 20 20 2f 2a 20 20 20 30 31 32 33 34        /*   01234
0f20: 35 36 37 38 39 20 31 32 33 34 35 36 37 38 39 20  56789 123456789 
0f30: 31 32 33 34 35 36 37 38 39 20 31 32 33 20 2a 2f  123456789 123 */
0f40: 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
0f50: 63 68 61 72 20 7a 4b 65 79 54 65 78 74 5b 5d 20  char zKeyText[] 
0f60: 3d 20 22 6e 61 74 75 72 61 6c 65 66 74 6f 75 74  = "naturaleftout
0f70: 65 72 69 67 68 74 66 75 6c 6c 69 6e 6e 65 72 63  erightfullinnerc
0f80: 72 6f 73 73 22 3b 0a 20 20 73 74 61 74 69 63 20  ross";.  static 
0f90: 63 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 0a 20  const struct {. 
0fa0: 20 20 20 75 38 20 69 3b 20 20 20 20 20 20 20 20     u8 i;        
0fb0: 2f 2a 20 42 65 67 69 6e 6e 69 6e 67 20 6f 66 20  /* Beginning of 
0fc0: 6b 65 79 77 6f 72 64 20 74 65 78 74 20 69 6e 20  keyword text in 
0fd0: 7a 4b 65 79 54 65 78 74 5b 5d 20 2a 2f 0a 20 20  zKeyText[] */.  
0fe0: 20 20 75 38 20 6e 43 68 61 72 3b 20 20 20 20 2f    u8 nChar;    /
0ff0: 2a 20 4c 65 6e 67 74 68 20 6f 66 20 74 68 65 20  * Length of the 
1000: 6b 65 79 77 6f 72 64 20 69 6e 20 63 68 61 72 61  keyword in chara
1010: 63 74 65 72 73 20 2a 2f 0a 20 20 20 20 75 38 20  cters */.    u8 
1020: 63 6f 64 65 3b 20 20 20 20 20 2f 2a 20 4a 6f 69  code;     /* Joi
1030: 6e 20 74 79 70 65 20 6d 61 73 6b 20 2a 2f 0a 20  n type mask */. 
1040: 20 7d 20 61 4b 65 79 77 6f 72 64 5b 5d 20 3d 20   } aKeyword[] = 
1050: 7b 0a 20 20 20 20 2f 2a 20 6e 61 74 75 72 61 6c  {.    /* natural
1060: 20 2a 2f 20 7b 20 30 2c 20 20 37 2c 20 4a 54 5f   */ { 0,  7, JT_
1070: 4e 41 54 55 52 41 4c 20 20 20 20 20 20 20 20 20  NATURAL         
1080: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a         },.    /*
1090: 20 6c 65 66 74 20 20 20 20 2a 2f 20 7b 20 36 2c   left    */ { 6,
10a0: 20 20 34 2c 20 4a 54 5f 4c 45 46 54 7c 4a 54 5f    4, JT_LEFT|JT_
10b0: 4f 55 54 45 52 20 20 20 20 20 20 20 20 20 20 7d  OUTER          }
10c0: 2c 0a 20 20 20 20 2f 2a 20 6f 75 74 65 72 20 20  ,.    /* outer  
10d0: 20 2a 2f 20 7b 20 31 30 2c 20 35 2c 20 4a 54 5f   */ { 10, 5, JT_
10e0: 4f 55 54 45 52 20 20 20 20 20 20 20 20 20 20 20  OUTER           
10f0: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a         },.    /*
1100: 20 72 69 67 68 74 20 20 20 2a 2f 20 7b 20 31 34   right   */ { 14
1110: 2c 20 35 2c 20 4a 54 5f 52 49 47 48 54 7c 4a 54  , 5, JT_RIGHT|JT
1120: 5f 4f 55 54 45 52 20 20 20 20 20 20 20 20 20 7d  _OUTER         }
1130: 2c 0a 20 20 20 20 2f 2a 20 66 75 6c 6c 20 20 20  ,.    /* full   
1140: 20 2a 2f 20 7b 20 31 39 2c 20 34 2c 20 4a 54 5f   */ { 19, 4, JT_
1150: 4c 45 46 54 7c 4a 54 5f 52 49 47 48 54 7c 4a 54  LEFT|JT_RIGHT|JT
1160: 5f 4f 55 54 45 52 20 7d 2c 0a 20 20 20 20 2f 2a  _OUTER },.    /*
1170: 20 69 6e 6e 65 72 20 20 20 2a 2f 20 7b 20 32 33   inner   */ { 23
1180: 2c 20 35 2c 20 4a 54 5f 49 4e 4e 45 52 20 20 20  , 5, JT_INNER   
1190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
11a0: 2c 0a 20 20 20 20 2f 2a 20 63 72 6f 73 73 20 20  ,.    /* cross  
11b0: 20 2a 2f 20 7b 20 32 38 2c 20 35 2c 20 4a 54 5f   */ { 28, 5, JT_
11c0: 49 4e 4e 45 52 7c 4a 54 5f 43 52 4f 53 53 20 20  INNER|JT_CROSS  
11d0: 20 20 20 20 20 20 20 7d 2c 0a 20 20 7d 3b 0a 20         },.  };. 
11e0: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 61 70 41   int i, j;.  apA
11f0: 6c 6c 5b 30 5d 20 3d 20 70 41 3b 0a 20 20 61 70  ll[0] = pA;.  ap
1200: 41 6c 6c 5b 31 5d 20 3d 20 70 42 3b 0a 20 20 61  All[1] = pB;.  a
1210: 70 41 6c 6c 5b 32 5d 20 3d 20 70 43 3b 0a 20 20  pAll[2] = pC;.  
1220: 66 6f 72 28 69 3d 30 3b 20 69 3c 33 20 26 26 20  for(i=0; i<3 && 
1230: 61 70 41 6c 6c 5b 69 5d 3b 20 69 2b 2b 29 7b 0a  apAll[i]; i++){.
1240: 20 20 20 20 70 20 3d 20 61 70 41 6c 6c 5b 69 5d      p = apAll[i]
1250: 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  ;.    for(j=0; j
1260: 3c 41 72 72 61 79 53 69 7a 65 28 61 4b 65 79 77  <ArraySize(aKeyw
1270: 6f 72 64 29 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  ord); j++){.    
1280: 20 20 69 66 28 20 70 2d 3e 6e 3d 3d 61 4b 65 79    if( p->n==aKey
1290: 77 6f 72 64 5b 6a 5d 2e 6e 43 68 61 72 20 0a 20  word[j].nChar . 
12a0: 20 20 20 20 20 20 20 20 20 26 26 20 73 71 6c 69           && sqli
12b0: 74 65 33 53 74 72 4e 49 43 6d 70 28 28 63 68 61  te3StrNICmp((cha
12c0: 72 2a 29 70 2d 3e 7a 2c 20 26 7a 4b 65 79 54 65  r*)p->z, &zKeyTe
12d0: 78 74 5b 61 4b 65 79 77 6f 72 64 5b 6a 5d 2e 69  xt[aKeyword[j].i
12e0: 5d 2c 20 70 2d 3e 6e 29 3d 3d 30 20 29 7b 0a 20  ], p->n)==0 ){. 
12f0: 20 20 20 20 20 20 20 6a 6f 69 6e 74 79 70 65 20         jointype 
1300: 7c 3d 20 61 4b 65 79 77 6f 72 64 5b 6a 5d 2e 63  |= aKeyword[j].c
1310: 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 62 72 65  ode;.        bre
1320: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
1330: 7d 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  }.    testcase( 
1340: 6a 3d 3d 30 20 7c 7c 20 6a 3d 3d 31 20 7c 7c 20  j==0 || j==1 || 
1350: 6a 3d 3d 32 20 7c 7c 20 6a 3d 3d 33 20 7c 7c 20  j==2 || j==3 || 
1360: 6a 3d 3d 34 20 7c 7c 20 6a 3d 3d 35 20 7c 7c 20  j==4 || j==5 || 
1370: 6a 3d 3d 36 20 29 3b 0a 20 20 20 20 69 66 28 20  j==6 );.    if( 
1380: 6a 3e 3d 41 72 72 61 79 53 69 7a 65 28 61 4b 65  j>=ArraySize(aKe
1390: 79 77 6f 72 64 29 20 29 7b 0a 20 20 20 20 20 20  yword) ){.      
13a0: 6a 6f 69 6e 74 79 70 65 20 7c 3d 20 4a 54 5f 45  jointype |= JT_E
13b0: 52 52 4f 52 3b 0a 20 20 20 20 20 20 62 72 65 61  RROR;.      brea
13c0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  k;.    }.  }.  i
13d0: 66 28 0a 20 20 20 20 20 28 6a 6f 69 6e 74 79 70  f(.     (jointyp
13e0: 65 20 26 20 28 4a 54 5f 49 4e 4e 45 52 7c 4a 54  e & (JT_INNER|JT
13f0: 5f 4f 55 54 45 52 29 29 3d 3d 28 4a 54 5f 49 4e  _OUTER))==(JT_IN
1400: 4e 45 52 7c 4a 54 5f 4f 55 54 45 52 29 20 7c 7c  NER|JT_OUTER) ||
1410: 0a 20 20 20 20 20 28 6a 6f 69 6e 74 79 70 65 20  .     (jointype 
1420: 26 20 4a 54 5f 45 52 52 4f 52 29 21 3d 30 0a 20  & JT_ERROR)!=0. 
1430: 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   ){.    const ch
1440: 61 72 20 2a 7a 53 70 20 3d 20 22 20 22 3b 0a 20  ar *zSp = " ";. 
1450: 20 20 20 61 73 73 65 72 74 28 20 70 42 21 3d 30     assert( pB!=0
1460: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43 3d 3d   );.    if( pC==
1470: 30 20 29 7b 20 7a 53 70 2b 2b 3b 20 7d 0a 20 20  0 ){ zSp++; }.  
1480: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
1490: 67 28 70 50 61 72 73 65 2c 20 22 75 6e 6b 6e 6f  g(pParse, "unkno
14a0: 77 6e 20 6f 72 20 75 6e 73 75 70 70 6f 72 74 65  wn or unsupporte
14b0: 64 20 6a 6f 69 6e 20 74 79 70 65 3a 20 22 0a 20  d join type: ". 
14c0: 20 20 20 20 20 20 22 25 54 20 25 54 25 73 25 54        "%T %T%s%T
14d0: 22 2c 20 70 41 2c 20 70 42 2c 20 7a 53 70 2c 20  ", pA, pB, zSp, 
14e0: 70 43 29 3b 0a 20 20 20 20 6a 6f 69 6e 74 79 70  pC);.    jointyp
14f0: 65 20 3d 20 4a 54 5f 49 4e 4e 45 52 3b 0a 20 20  e = JT_INNER;.  
1500: 7d 65 6c 73 65 20 69 66 28 20 28 6a 6f 69 6e 74  }else if( (joint
1510: 79 70 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21  ype & JT_OUTER)!
1520: 3d 30 20 0a 20 20 20 20 20 20 20 20 20 26 26 20  =0 .         && 
1530: 28 6a 6f 69 6e 74 79 70 65 20 26 20 28 4a 54 5f  (jointype & (JT_
1540: 4c 45 46 54 7c 4a 54 5f 52 49 47 48 54 29 29 21  LEFT|JT_RIGHT))!
1550: 3d 4a 54 5f 4c 45 46 54 20 29 7b 0a 20 20 20 20  =JT_LEFT ){.    
1560: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
1570: 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 22  pParse, .      "
1580: 52 49 47 48 54 20 61 6e 64 20 46 55 4c 4c 20 4f  RIGHT and FULL O
1590: 55 54 45 52 20 4a 4f 49 4e 73 20 61 72 65 20 6e  UTER JOINs are n
15a0: 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 73 75 70  ot currently sup
15b0: 70 6f 72 74 65 64 22 29 3b 0a 20 20 20 20 6a 6f  ported");.    jo
15c0: 69 6e 74 79 70 65 20 3d 20 4a 54 5f 49 4e 4e 45  intype = JT_INNE
15d0: 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  R;.  }.  return 
15e0: 6a 6f 69 6e 74 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a  jointype;.}../*.
15f0: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e  ** Return the in
1600: 64 65 78 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20  dex of a column 
1610: 69 6e 20 61 20 74 61 62 6c 65 2e 20 20 52 65 74  in a table.  Ret
1620: 75 72 6e 20 2d 31 20 69 66 20 74 68 65 20 63 6f  urn -1 if the co
1630: 6c 75 6d 6e 0a 2a 2a 20 69 73 20 6e 6f 74 20 63  lumn.** is not c
1640: 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20  ontained in the 
1650: 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  table..*/.static
1660: 20 69 6e 74 20 63 6f 6c 75 6d 6e 49 6e 64 65 78   int columnIndex
1670: 28 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 63 6f  (Table *pTab, co
1680: 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 29 7b  nst char *zCol){
1690: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
16a0: 69 3d 30 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f  i=0; i<pTab->nCo
16b0: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  l; i++){.    if(
16c0: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
16d0: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e  pTab->aCol[i].zN
16e0: 61 6d 65 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 20  ame, zCol)==0 ) 
16f0: 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20  return i;.  }.  
1700: 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a  return -1;.}../*
1710: 0a 2a 2a 20 53 65 61 72 63 68 20 74 68 65 20 66  .** Search the f
1720: 69 72 73 74 20 4e 20 74 61 62 6c 65 73 20 69 6e  irst N tables in
1730: 20 70 53 72 63 2c 20 66 72 6f 6d 20 6c 65 66 74   pSrc, from left
1740: 20 74 6f 20 72 69 67 68 74 2c 20 6c 6f 6f 6b 69   to right, looki
1750: 6e 67 20 66 6f 72 20 61 0a 2a 2a 20 74 61 62 6c  ng for a.** tabl
1760: 65 20 74 68 61 74 20 68 61 73 20 61 20 63 6f 6c  e that has a col
1770: 75 6d 6e 20 6e 61 6d 65 64 20 7a 43 6f 6c 2e 20  umn named zCol. 
1780: 20 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 66 6f 75   .**.** When fou
1790: 6e 64 2c 20 73 65 74 20 2a 70 69 54 61 62 20 61  nd, set *piTab a
17a0: 6e 64 20 2a 70 69 43 6f 6c 20 74 6f 20 74 68 65  nd *piCol to the
17b0: 20 74 61 62 6c 65 20 69 6e 64 65 78 20 61 6e 64   table index and
17c0: 20 63 6f 6c 75 6d 6e 20 69 6e 64 65 78 0a 2a 2a   column index.**
17d0: 20 6f 66 20 74 68 65 20 6d 61 74 63 68 69 6e 67   of the matching
17e0: 20 63 6f 6c 75 6d 6e 20 61 6e 64 20 72 65 74 75   column and retu
17f0: 72 6e 20 54 52 55 45 2e 0a 2a 2a 0a 2a 2a 20 49  rn TRUE..**.** I
1800: 66 20 6e 6f 74 20 66 6f 75 6e 64 2c 20 72 65 74  f not found, ret
1810: 75 72 6e 20 46 41 4c 53 45 2e 0a 2a 2f 0a 73 74  urn FALSE..*/.st
1820: 61 74 69 63 20 69 6e 74 20 74 61 62 6c 65 41 6e  atic int tableAn
1830: 64 43 6f 6c 75 6d 6e 49 6e 64 65 78 28 0a 20 20  dColumnIndex(.  
1840: 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20  SrcList *pSrc,  
1850: 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66       /* Array of
1860: 20 74 61 62 6c 65 73 20 74 6f 20 73 65 61 72 63   tables to searc
1870: 68 20 2a 2f 0a 20 20 69 6e 74 20 4e 2c 20 20 20  h */.  int N,   
1880: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1890: 75 6d 62 65 72 20 6f 66 20 74 61 62 6c 65 73 20  umber of tables 
18a0: 69 6e 20 70 53 72 63 2d 3e 61 5b 5d 20 74 6f 20  in pSrc->a[] to 
18b0: 73 65 61 72 63 68 20 2a 2f 0a 20 20 63 6f 6e 73  search */.  cons
18c0: 74 20 63 68 61 72 20 2a 7a 43 6f 6c 2c 20 20 20  t char *zCol,   
18d0: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
18e0: 63 6f 6c 75 6d 6e 20 77 65 20 61 72 65 20 6c 6f  column we are lo
18f0: 6f 6b 69 6e 67 20 66 6f 72 20 2a 2f 0a 20 20 69  oking for */.  i
1900: 6e 74 20 2a 70 69 54 61 62 2c 20 20 20 20 20 20  nt *piTab,      
1910: 20 20 20 20 2f 2a 20 57 72 69 74 65 20 69 6e 64      /* Write ind
1920: 65 78 20 6f 66 20 70 53 72 63 2d 3e 61 5b 5d 20  ex of pSrc->a[] 
1930: 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  here */.  int *p
1940: 69 43 6f 6c 20 20 20 20 20 20 20 20 20 20 20 2f  iCol           /
1950: 2a 20 57 72 69 74 65 20 69 6e 64 65 78 20 6f 66  * Write index of
1960: 20 70 53 72 63 2d 3e 61 5b 2a 70 69 54 61 62 5d   pSrc->a[*piTab]
1970: 2e 70 54 61 62 2d 3e 61 43 6f 6c 5b 5d 20 68 65  .pTab->aCol[] he
1980: 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  re */.){.  int i
1990: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
19a0: 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f  /* For looping o
19b0: 76 65 72 20 74 61 62 6c 65 73 20 69 6e 20 70 53  ver tables in pS
19c0: 72 63 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c  rc */.  int iCol
19d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
19e0: 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20  Index of column 
19f0: 6d 61 74 63 68 69 6e 67 20 7a 43 6f 6c 20 2a 2f  matching zCol */
1a00: 0a 0a 20 20 61 73 73 65 72 74 28 20 28 70 69 54  ..  assert( (piT
1a10: 61 62 3d 3d 30 29 3d 3d 28 70 69 43 6f 6c 3d 3d  ab==0)==(piCol==
1a20: 30 29 20 29 3b 20 20 2f 2a 20 42 6f 74 68 20 6f  0) );  /* Both o
1a30: 72 20 6e 65 69 74 68 65 72 20 61 72 65 20 4e 55  r neither are NU
1a40: 4c 4c 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  LL */.  for(i=0;
1a50: 20 69 3c 4e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<N; i++){.    
1a60: 69 43 6f 6c 20 3d 20 63 6f 6c 75 6d 6e 49 6e 64  iCol = columnInd
1a70: 65 78 28 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 54  ex(pSrc->a[i].pT
1a80: 61 62 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 69  ab, zCol);.    i
1a90: 66 28 20 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20  f( iCol>=0 ){.  
1aa0: 20 20 20 20 69 66 28 20 70 69 54 61 62 20 29 7b      if( piTab ){
1ab0: 0a 20 20 20 20 20 20 20 20 2a 70 69 54 61 62 20  .        *piTab 
1ac0: 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 2a 70 69  = i;.        *pi
1ad0: 43 6f 6c 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20  Col = iCol;.    
1ae0: 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
1af0: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   1;.    }.  }.  
1b00: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
1b10: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
1b20: 20 69 73 20 75 73 65 64 20 74 6f 20 61 64 64 20   is used to add 
1b30: 74 65 72 6d 73 20 69 6d 70 6c 69 65 64 20 62 79  terms implied by
1b40: 20 4a 4f 49 4e 20 73 79 6e 74 61 78 20 74 6f 20   JOIN syntax to 
1b50: 74 68 65 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61  the.** WHERE cla
1b60: 75 73 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6f  use expression o
1b70: 66 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  f a SELECT state
1b80: 6d 65 6e 74 2e 20 54 68 65 20 6e 65 77 20 74 65  ment. The new te
1b90: 72 6d 2c 20 77 68 69 63 68 0a 2a 2a 20 69 73 20  rm, which.** is 
1ba0: 41 4e 44 65 64 20 77 69 74 68 20 74 68 65 20 65  ANDed with the e
1bb0: 78 69 73 74 69 6e 67 20 57 48 45 52 45 20 63 6c  xisting WHERE cl
1bc0: 61 75 73 65 2c 20 69 73 20 6f 66 20 74 68 65 20  ause, is of the 
1bd0: 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28  form:.**.**    (
1be0: 74 61 62 31 2e 63 6f 6c 31 20 3d 20 74 61 62 32  tab1.col1 = tab2
1bf0: 2e 63 6f 6c 32 29 0a 2a 2a 0a 2a 2a 20 77 68 65  .col2).**.** whe
1c00: 72 65 20 74 61 62 31 20 69 73 20 74 68 65 20 69  re tab1 is the i
1c10: 53 72 63 27 74 68 20 74 61 62 6c 65 20 69 6e 20  Src'th table in 
1c20: 53 72 63 4c 69 73 74 20 70 53 72 63 20 61 6e 64  SrcList pSrc and
1c30: 20 74 61 62 32 20 69 73 20 74 68 65 20 0a 2a 2a   tab2 is the .**
1c40: 20 28 69 53 72 63 2b 31 29 27 74 68 2e 20 43 6f   (iSrc+1)'th. Co
1c50: 6c 75 6d 6e 20 63 6f 6c 31 20 69 73 20 63 6f 6c  lumn col1 is col
1c60: 75 6d 6e 20 69 43 6f 6c 4c 65 66 74 20 6f 66 20  umn iColLeft of 
1c70: 74 61 62 31 2c 20 61 6e 64 20 63 6f 6c 32 20 69  tab1, and col2 i
1c80: 73 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c  s.** column iCol
1c90: 52 69 67 68 74 20 6f 66 20 74 61 62 32 2e 0a 2a  Right of tab2..*
1ca0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 64  /.static void ad
1cb0: 64 57 68 65 72 65 54 65 72 6d 28 0a 20 20 50 61  dWhereTerm(.  Pa
1cc0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
1cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ce0: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
1cf0: 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
1d00: 53 72 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  Src,            
1d10: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
1d20: 20 74 61 62 6c 65 73 20 69 6e 20 46 52 4f 4d 20   tables in FROM 
1d30: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20  clause */.  int 
1d40: 69 4c 65 66 74 2c 20 20 20 20 20 20 20 20 20 20  iLeft,          
1d50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
1d60: 6e 64 65 78 20 6f 66 20 66 69 72 73 74 20 74 61  ndex of first ta
1d70: 62 6c 65 20 74 6f 20 6a 6f 69 6e 20 69 6e 20 70  ble to join in p
1d80: 53 72 63 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f  Src */.  int iCo
1d90: 6c 4c 65 66 74 2c 20 20 20 20 20 20 20 20 20 20  lLeft,          
1da0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
1db0: 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 66  x of column in f
1dc0: 69 72 73 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20  irst table */.  
1dd0: 69 6e 74 20 69 52 69 67 68 74 2c 20 20 20 20 20  int iRight,     
1de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1df0: 2f 2a 20 49 6e 64 65 78 20 6f 66 20 73 65 63 6f  /* Index of seco
1e00: 6e 64 20 74 61 62 6c 65 20 69 6e 20 70 53 72 63  nd table in pSrc
1e10: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 52 69   */.  int iColRi
1e20: 67 68 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  ght,            
1e30: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
1e40: 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 73 65 63 6f  f column in seco
1e50: 6e 64 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  nd table */.  in
1e60: 74 20 69 73 4f 75 74 65 72 4a 6f 69 6e 2c 20 20  t isOuterJoin,  
1e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e80: 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73   True if this is
1e90: 20 61 6e 20 4f 55 54 45 52 20 6a 6f 69 6e 20 2a   an OUTER join *
1ea0: 2f 0a 20 20 45 78 70 72 20 2a 2a 70 70 57 68 65  /.  Expr **ppWhe
1eb0: 72 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  re              
1ec0: 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 54      /* IN/OUT: T
1ed0: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
1ee0: 74 6f 20 61 64 64 20 74 6f 20 2a 2f 0a 29 7b 0a  to add to */.){.
1ef0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
1f00: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 45 78  pParse->db;.  Ex
1f10: 70 72 20 2a 70 45 31 3b 0a 20 20 45 78 70 72 20  pr *pE1;.  Expr 
1f20: 2a 70 45 32 3b 0a 20 20 45 78 70 72 20 2a 70 45  *pE2;.  Expr *pE
1f30: 71 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 4c  q;..  assert( iL
1f40: 65 66 74 3c 69 52 69 67 68 74 20 29 3b 0a 20 20  eft<iRight );.  
1f50: 61 73 73 65 72 74 28 20 70 53 72 63 2d 3e 6e 53  assert( pSrc->nS
1f60: 72 63 3e 69 52 69 67 68 74 20 29 3b 0a 20 20 61  rc>iRight );.  a
1f70: 73 73 65 72 74 28 20 70 53 72 63 2d 3e 61 5b 69  ssert( pSrc->a[i
1f80: 4c 65 66 74 5d 2e 70 54 61 62 20 29 3b 0a 20 20  Left].pTab );.  
1f90: 61 73 73 65 72 74 28 20 70 53 72 63 2d 3e 61 5b  assert( pSrc->a[
1fa0: 69 52 69 67 68 74 5d 2e 70 54 61 62 20 29 3b 0a  iRight].pTab );.
1fb0: 0a 20 20 70 45 31 20 3d 20 73 71 6c 69 74 65 33  .  pE1 = sqlite3
1fc0: 43 72 65 61 74 65 43 6f 6c 75 6d 6e 45 78 70 72  CreateColumnExpr
1fd0: 28 64 62 2c 20 70 53 72 63 2c 20 69 4c 65 66 74  (db, pSrc, iLeft
1fe0: 2c 20 69 43 6f 6c 4c 65 66 74 29 3b 0a 20 20 70  , iColLeft);.  p
1ff0: 45 32 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61  E2 = sqlite3Crea
2000: 74 65 43 6f 6c 75 6d 6e 45 78 70 72 28 64 62 2c  teColumnExpr(db,
2010: 20 70 53 72 63 2c 20 69 52 69 67 68 74 2c 20 69   pSrc, iRight, i
2020: 43 6f 6c 52 69 67 68 74 29 3b 0a 0a 20 20 70 45  ColRight);..  pE
2030: 71 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  q = sqlite3PExpr
2040: 28 70 50 61 72 73 65 2c 20 54 4b 5f 45 51 2c 20  (pParse, TK_EQ, 
2050: 70 45 31 2c 20 70 45 32 2c 20 30 29 3b 0a 20 20  pE1, pE2, 0);.  
2060: 69 66 28 20 70 45 71 20 26 26 20 69 73 4f 75 74  if( pEq && isOut
2070: 65 72 4a 6f 69 6e 20 29 7b 0a 20 20 20 20 45 78  erJoin ){.    Ex
2080: 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 45  prSetProperty(pE
2090: 71 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3b  q, EP_FromJoin);
20a0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78  .    assert( !Ex
20b0: 70 72 48 61 73 41 6e 79 50 72 6f 70 65 72 74 79  prHasAnyProperty
20c0: 28 70 45 71 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e  (pEq, EP_TokenOn
20d0: 6c 79 7c 45 50 5f 52 65 64 75 63 65 64 29 20 29  ly|EP_Reduced) )
20e0: 3b 0a 20 20 20 20 45 78 70 72 53 65 74 49 72 72  ;.    ExprSetIrr
20f0: 65 64 75 63 69 62 6c 65 28 70 45 71 29 3b 0a 20  educible(pEq);. 
2100: 20 20 20 70 45 71 2d 3e 69 52 69 67 68 74 4a 6f     pEq->iRightJo
2110: 69 6e 54 61 62 6c 65 20 3d 20 28 69 31 36 29 70  inTable = (i16)p
2120: 45 32 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 7d 0a  E2->iTable;.  }.
2130: 20 20 2a 70 70 57 68 65 72 65 20 3d 20 73 71 6c    *ppWhere = sql
2140: 69 74 65 33 45 78 70 72 41 6e 64 28 64 62 2c 20  ite3ExprAnd(db, 
2150: 2a 70 70 57 68 65 72 65 2c 20 70 45 71 29 3b 0a  *ppWhere, pEq);.
2160: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
2170: 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 70 72 6f   EP_FromJoin pro
2180: 70 65 72 74 79 20 6f 6e 20 61 6c 6c 20 74 65 72  perty on all ter
2190: 6d 73 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20  ms of the given 
21a0: 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 20 41  expression..** A
21b0: 6e 64 20 73 65 74 20 74 68 65 20 45 78 70 72 2e  nd set the Expr.
21c0: 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20  iRightJoinTable 
21d0: 74 6f 20 69 54 61 62 6c 65 20 66 6f 72 20 65 76  to iTable for ev
21e0: 65 72 79 20 74 65 72 6d 20 69 6e 20 74 68 65 0a  ery term in the.
21f0: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a  ** expression..*
2200: 2a 0a 2a 2a 20 54 68 65 20 45 50 5f 46 72 6f 6d  *.** The EP_From
2210: 4a 6f 69 6e 20 70 72 6f 70 65 72 74 79 20 69 73  Join property is
2220: 20 75 73 65 64 20 6f 6e 20 74 65 72 6d 73 20 6f   used on terms o
2230: 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  f an expression 
2240: 74 6f 20 74 65 6c 6c 0a 2a 2a 20 74 68 65 20 4c  to tell.** the L
2250: 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 70  EFT OUTER JOIN p
2260: 72 6f 63 65 73 73 69 6e 67 20 6c 6f 67 69 63 20  rocessing logic 
2270: 74 68 61 74 20 74 68 69 73 20 74 65 72 6d 20 69  that this term i
2280: 73 20 70 61 72 74 20 6f 66 20 74 68 65 0a 2a 2a  s part of the.**
2290: 20 6a 6f 69 6e 20 72 65 73 74 72 69 63 74 69 6f   join restrictio
22a0: 6e 20 73 70 65 63 69 66 69 65 64 20 69 6e 20 74  n specified in t
22b0: 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63  he ON or USING c
22c0: 6c 61 75 73 65 20 61 6e 64 20 6e 6f 74 20 61 20  lause and not a 
22d0: 70 61 72 74 0a 2a 2a 20 6f 66 20 74 68 65 20 6d  part.** of the m
22e0: 6f 72 65 20 67 65 6e 65 72 61 6c 20 57 48 45 52  ore general WHER
22f0: 45 20 63 6c 61 75 73 65 2e 20 20 54 68 65 73 65  E clause.  These
2300: 20 74 65 72 6d 73 20 61 72 65 20 6d 6f 76 65 64   terms are moved
2310: 20 6f 76 65 72 20 74 6f 20 74 68 65 0a 2a 2a 20   over to the.** 
2320: 57 48 45 52 45 20 63 6c 61 75 73 65 20 64 75 72  WHERE clause dur
2330: 69 6e 67 20 6a 6f 69 6e 20 70 72 6f 63 65 73 73  ing join process
2340: 69 6e 67 20 62 75 74 20 77 65 20 6e 65 65 64 20  ing but we need 
2350: 74 6f 20 72 65 6d 65 6d 62 65 72 20 74 68 61 74  to remember that
2360: 20 74 68 65 79 0a 2a 2a 20 6f 72 69 67 69 6e 61   they.** origina
2370: 74 65 64 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72  ted in the ON or
2380: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2e 0a 2a   USING clause..*
2390: 2a 0a 2a 2a 20 54 68 65 20 45 78 70 72 2e 69 52  *.** The Expr.iR
23a0: 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 74 65  ightJoinTable te
23b0: 6c 6c 73 20 74 68 65 20 57 48 45 52 45 20 63 6c  lls the WHERE cl
23c0: 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 20  ause processing 
23d0: 74 68 61 74 20 74 68 65 0a 2a 2a 20 65 78 70 72  that the.** expr
23e0: 65 73 73 69 6f 6e 20 64 65 70 65 6e 64 73 20 6f  ession depends o
23f0: 6e 20 74 61 62 6c 65 20 69 52 69 67 68 74 4a 6f  n table iRightJo
2400: 69 6e 54 61 62 6c 65 20 65 76 65 6e 20 69 66 20  inTable even if 
2410: 74 68 61 74 20 74 61 62 6c 65 20 69 73 20 6e 6f  that table is no
2420: 74 0a 2a 2a 20 65 78 70 6c 69 63 69 74 6c 79 20  t.** explicitly 
2430: 6d 65 6e 74 69 6f 6e 65 64 20 69 6e 20 74 68 65  mentioned in the
2440: 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 54 68   expression.  Th
2450: 61 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  at information i
2460: 73 20 6e 65 65 64 65 64 0a 2a 2a 20 66 6f 72 20  s needed.** for 
2470: 63 61 73 65 73 20 6c 69 6b 65 20 74 68 69 73 3a  cases like this:
2480: 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54  .**.**    SELECT
2490: 20 2a 20 46 52 4f 4d 20 74 31 20 4c 45 46 54 20   * FROM t1 LEFT 
24a0: 4a 4f 49 4e 20 74 32 20 4f 4e 20 74 31 2e 61 3d  JOIN t2 ON t1.a=
24b0: 74 32 2e 62 20 41 4e 44 20 74 31 2e 78 3d 35 0a  t2.b AND t1.x=5.
24c0: 2a 2a 0a 2a 2a 20 54 68 65 20 77 68 65 72 65 20  **.** The where 
24d0: 63 6c 61 75 73 65 20 6e 65 65 64 73 20 74 6f 20  clause needs to 
24e0: 64 65 66 65 72 20 74 68 65 20 68 61 6e 64 6c 69  defer the handli
24f0: 6e 67 20 6f 66 20 74 68 65 20 74 31 2e 78 3d 35  ng of the t1.x=5
2500: 0a 2a 2a 20 74 65 72 6d 20 75 6e 74 69 6c 20 61  .** term until a
2510: 66 74 65 72 20 74 68 65 20 74 32 20 6c 6f 6f 70  fter the t2 loop
2520: 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20 20 49   of the join.  I
2530: 6e 20 74 68 61 74 20 77 61 79 2c 20 61 0a 2a 2a  n that way, a.**
2540: 20 4e 55 4c 4c 20 74 32 20 72 6f 77 20 77 69 6c   NULL t2 row wil
2550: 6c 20 62 65 20 69 6e 73 65 72 74 65 64 20 77 68  l be inserted wh
2560: 65 6e 65 76 65 72 20 74 31 2e 78 21 3d 35 2e 20  enever t1.x!=5. 
2570: 20 49 66 20 77 65 20 64 6f 20 6e 6f 74 0a 2a 2a   If we do not.**
2580: 20 64 65 66 65 72 20 74 68 65 20 68 61 6e 64 6c   defer the handl
2590: 69 6e 67 20 6f 66 20 74 31 2e 78 3d 35 2c 20 69  ing of t1.x=5, i
25a0: 74 20 77 69 6c 6c 20 62 65 20 70 72 6f 63 65 73  t will be proces
25b0: 73 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a  sed immediately.
25c0: 2a 2a 20 61 66 74 65 72 20 74 68 65 20 74 31 20  ** after the t1 
25d0: 6c 6f 6f 70 20 61 6e 64 20 72 6f 77 73 20 77 69  loop and rows wi
25e0: 74 68 20 74 31 2e 78 21 3d 35 20 77 69 6c 6c 20  th t1.x!=5 will 
25f0: 6e 65 76 65 72 20 61 70 70 65 61 72 20 69 6e 0a  never appear in.
2600: 2a 2a 20 74 68 65 20 6f 75 74 70 75 74 2c 20 77  ** the output, w
2610: 68 69 63 68 20 69 73 20 69 6e 63 6f 72 72 65 63  hich is incorrec
2620: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
2630: 64 20 73 65 74 4a 6f 69 6e 45 78 70 72 28 45 78  d setJoinExpr(Ex
2640: 70 72 20 2a 70 2c 20 69 6e 74 20 69 54 61 62 6c  pr *p, int iTabl
2650: 65 29 7b 0a 20 20 77 68 69 6c 65 28 20 70 20 29  e){.  while( p )
2660: 7b 0a 20 20 20 20 45 78 70 72 53 65 74 50 72 6f  {.    ExprSetPro
2670: 70 65 72 74 79 28 70 2c 20 45 50 5f 46 72 6f 6d  perty(p, EP_From
2680: 4a 6f 69 6e 29 3b 0a 20 20 20 20 61 73 73 65 72  Join);.    asser
2690: 74 28 20 21 45 78 70 72 48 61 73 41 6e 79 50 72  t( !ExprHasAnyPr
26a0: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b  operty(p, EP_Tok
26b0: 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65  enOnly|EP_Reduce
26c0: 64 29 20 29 3b 0a 20 20 20 20 45 78 70 72 53 65  d) );.    ExprSe
26d0: 74 49 72 72 65 64 75 63 69 62 6c 65 28 70 29 3b  tIrreducible(p);
26e0: 0a 20 20 20 20 70 2d 3e 69 52 69 67 68 74 4a 6f  .    p->iRightJo
26f0: 69 6e 54 61 62 6c 65 20 3d 20 28 69 31 36 29 69  inTable = (i16)i
2700: 54 61 62 6c 65 3b 0a 20 20 20 20 73 65 74 4a 6f  Table;.    setJo
2710: 69 6e 45 78 70 72 28 70 2d 3e 70 4c 65 66 74 2c  inExpr(p->pLeft,
2720: 20 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 70 20   iTable);.    p 
2730: 3d 20 70 2d 3e 70 52 69 67 68 74 3b 0a 20 20 7d  = p->pRight;.  }
2740: 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20   .}../*.** This 
2750: 72 6f 75 74 69 6e 65 20 70 72 6f 63 65 73 73 65  routine processe
2760: 73 20 74 68 65 20 6a 6f 69 6e 20 69 6e 66 6f 72  s the join infor
2770: 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20 53 45 4c  mation for a SEL
2780: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  ECT statement..*
2790: 2a 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63  * ON and USING c
27a0: 6c 61 75 73 65 73 20 61 72 65 20 63 6f 6e 76 65  lauses are conve
27b0: 72 74 65 64 20 69 6e 74 6f 20 65 78 74 72 61 20  rted into extra 
27c0: 74 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45  terms of the WHE
27d0: 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 4e 41  RE clause..** NA
27e0: 54 55 52 41 4c 20 6a 6f 69 6e 73 20 61 6c 73 6f  TURAL joins also
27f0: 20 63 72 65 61 74 65 20 65 78 74 72 61 20 57 48   create extra WH
2800: 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73  ERE clause terms
2810: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 65 72 6d  ..**.** The term
2820: 73 20 6f 66 20 61 20 46 52 4f 4d 20 63 6c 61 75  s of a FROM clau
2830: 73 65 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64  se are contained
2840: 20 69 6e 20 74 68 65 20 53 65 6c 65 63 74 2e 70   in the Select.p
2850: 53 72 63 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  Src structure..*
2860: 2a 20 54 68 65 20 6c 65 66 74 20 6d 6f 73 74 20  * The left most 
2870: 74 61 62 6c 65 20 69 73 20 74 68 65 20 66 69 72  table is the fir
2880: 73 74 20 65 6e 74 72 79 20 69 6e 20 53 65 6c 65  st entry in Sele
2890: 63 74 2e 70 53 72 63 2e 20 20 54 68 65 20 72 69  ct.pSrc.  The ri
28a0: 67 68 74 2d 6d 6f 73 74 0a 2a 2a 20 74 61 62 6c  ght-most.** tabl
28b0: 65 20 69 73 20 74 68 65 20 6c 61 73 74 20 65 6e  e is the last en
28c0: 74 72 79 2e 20 20 54 68 65 20 6a 6f 69 6e 20 6f  try.  The join o
28d0: 70 65 72 61 74 6f 72 20 69 73 20 68 65 6c 64 20  perator is held 
28e0: 69 6e 20 74 68 65 20 65 6e 74 72 79 20 74 6f 0a  in the entry to.
28f0: 2a 2a 20 74 68 65 20 6c 65 66 74 2e 20 20 54 68  ** the left.  Th
2900: 75 73 20 65 6e 74 72 79 20 30 20 63 6f 6e 74 61  us entry 0 conta
2910: 69 6e 73 20 74 68 65 20 6a 6f 69 6e 20 6f 70 65  ins the join ope
2920: 72 61 74 6f 72 20 66 6f 72 20 74 68 65 20 6a 6f  rator for the jo
2930: 69 6e 20 62 65 74 77 65 65 6e 0a 2a 2a 20 65 6e  in between.** en
2940: 74 72 69 65 73 20 30 20 61 6e 64 20 31 2e 20 20  tries 0 and 1.  
2950: 41 6e 79 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20  Any ON or USING 
2960: 63 6c 61 75 73 65 73 20 61 73 73 6f 63 69 61 74  clauses associat
2970: 65 64 20 77 69 74 68 20 74 68 65 20 6a 6f 69 6e  ed with the join
2980: 20 61 72 65 0a 2a 2a 20 61 6c 73 6f 20 61 74 74   are.** also att
2990: 61 63 68 65 64 20 74 6f 20 74 68 65 20 6c 65 66  ached to the lef
29a0: 74 20 65 6e 74 72 79 2e 0a 2a 2a 0a 2a 2a 20 54  t entry..**.** T
29b0: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
29c0: 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  rns the number o
29d0: 66 20 65 72 72 6f 72 73 20 65 6e 63 6f 75 6e 74  f errors encount
29e0: 65 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ered..*/.static 
29f0: 69 6e 74 20 73 71 6c 69 74 65 50 72 6f 63 65 73  int sqliteProces
2a00: 73 4a 6f 69 6e 28 50 61 72 73 65 20 2a 70 50 61  sJoin(Parse *pPa
2a10: 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b  rse, Select *p){
2a20: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
2a30: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2a40: 20 20 20 2f 2a 20 41 6c 6c 20 74 61 62 6c 65 73     /* All tables
2a50: 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
2a60: 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20  use */.  int i, 
2a70: 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  j;              
2a80: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
2a90: 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 73   counters */.  s
2aa0: 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
2ab0: 65 6d 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 2f  em *pLeft;     /
2ac0: 2a 20 4c 65 66 74 20 74 61 62 6c 65 20 62 65 69  * Left table bei
2ad0: 6e 67 20 6a 6f 69 6e 65 64 20 2a 2f 0a 20 20 73  ng joined */.  s
2ae0: 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
2af0: 65 6d 20 2a 70 52 69 67 68 74 3b 20 20 20 20 2f  em *pRight;    /
2b00: 2a 20 52 69 67 68 74 20 74 61 62 6c 65 20 62 65  * Right table be
2b10: 69 6e 67 20 6a 6f 69 6e 65 64 20 2a 2f 0a 0a 20  ing joined */.. 
2b20: 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b   pSrc = p->pSrc;
2b30: 0a 20 20 70 4c 65 66 74 20 3d 20 26 70 53 72 63  .  pLeft = &pSrc
2b40: 2d 3e 61 5b 30 5d 3b 0a 20 20 70 52 69 67 68 74  ->a[0];.  pRight
2b50: 20 3d 20 26 70 4c 65 66 74 5b 31 5d 3b 0a 20 20   = &pLeft[1];.  
2b60: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72 63 2d  for(i=0; i<pSrc-
2b70: 3e 6e 53 72 63 2d 31 3b 20 69 2b 2b 2c 20 70 52  >nSrc-1; i++, pR
2b80: 69 67 68 74 2b 2b 2c 20 70 4c 65 66 74 2b 2b 29  ight++, pLeft++)
2b90: 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 4c 65  {.    Table *pLe
2ba0: 66 74 54 61 62 20 3d 20 70 4c 65 66 74 2d 3e 70  ftTab = pLeft->p
2bb0: 54 61 62 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a  Tab;.    Table *
2bc0: 70 52 69 67 68 74 54 61 62 20 3d 20 70 52 69 67  pRightTab = pRig
2bd0: 68 74 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 6e  ht->pTab;.    in
2be0: 74 20 69 73 4f 75 74 65 72 3b 0a 0a 20 20 20 20  t isOuter;..    
2bf0: 69 66 28 20 4e 45 56 45 52 28 70 4c 65 66 74 54  if( NEVER(pLeftT
2c00: 61 62 3d 3d 30 20 7c 7c 20 70 52 69 67 68 74 54  ab==0 || pRightT
2c10: 61 62 3d 3d 30 29 20 29 20 63 6f 6e 74 69 6e 75  ab==0) ) continu
2c20: 65 3b 0a 20 20 20 20 69 73 4f 75 74 65 72 20 3d  e;.    isOuter =
2c30: 20 28 70 52 69 67 68 74 2d 3e 6a 6f 69 6e 74 79   (pRight->jointy
2c40: 70 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d  pe & JT_OUTER)!=
2c50: 30 3b 0a 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20  0;..    /* When 
2c60: 74 68 65 20 4e 41 54 55 52 41 4c 20 6b 65 79 77  the NATURAL keyw
2c70: 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74 2c 20  ord is present, 
2c80: 61 64 64 20 57 48 45 52 45 20 63 6c 61 75 73 65  add WHERE clause
2c90: 20 74 65 72 6d 73 20 66 6f 72 0a 20 20 20 20 2a   terms for.    *
2ca0: 2a 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 74  * every column t
2cb0: 68 61 74 20 74 68 65 20 74 77 6f 20 74 61 62 6c  hat the two tabl
2cc0: 65 73 20 68 61 76 65 20 69 6e 20 63 6f 6d 6d 6f  es have in commo
2cd0: 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  n..    */.    if
2ce0: 28 20 70 52 69 67 68 74 2d 3e 6a 6f 69 6e 74 79  ( pRight->jointy
2cf0: 70 65 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c 20  pe & JT_NATURAL 
2d00: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 52 69  ){.      if( pRi
2d10: 67 68 74 2d 3e 70 4f 6e 20 7c 7c 20 70 52 69 67  ght->pOn || pRig
2d20: 68 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20  ht->pUsing ){.  
2d30: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
2d40: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61  orMsg(pParse, "a
2d50: 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 20 6d 61   NATURAL join ma
2d60: 79 20 6e 6f 74 20 68 61 76 65 20 22 0a 20 20 20  y not have ".   
2d70: 20 20 20 20 20 20 20 20 22 61 6e 20 4f 4e 20 6f          "an ON o
2d80: 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 22 2c  r USING clause",
2d90: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74   0);.        ret
2da0: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 1;.      }. 
2db0: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
2dc0: 70 52 69 67 68 74 54 61 62 2d 3e 6e 43 6f 6c 3b  pRightTab->nCol;
2dd0: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63   j++){.        c
2de0: 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 2f 2a  har *zName;   /*
2df0: 20 4e 61 6d 65 20 6f 66 20 63 6f 6c 75 6d 6e 20   Name of column 
2e00: 69 6e 20 74 68 65 20 72 69 67 68 74 20 74 61 62  in the right tab
2e10: 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  le */.        in
2e20: 74 20 69 4c 65 66 74 3b 20 20 20 20 20 2f 2a 20  t iLeft;     /* 
2e30: 4d 61 74 63 68 69 6e 67 20 6c 65 66 74 20 74 61  Matching left ta
2e40: 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  ble */.        i
2e50: 6e 74 20 69 4c 65 66 74 43 6f 6c 3b 20 20 2f 2a  nt iLeftCol;  /*
2e60: 20 4d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e   Matching column
2e70: 20 69 6e 20 74 68 65 20 6c 65 66 74 20 74 61 62   in the left tab
2e80: 6c 65 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 7a  le */..        z
2e90: 4e 61 6d 65 20 3d 20 70 52 69 67 68 74 54 61 62  Name = pRightTab
2ea0: 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b  ->aCol[j].zName;
2eb0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 74 61 62  .        if( tab
2ec0: 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65 78  leAndColumnIndex
2ed0: 28 70 53 72 63 2c 20 69 2b 31 2c 20 7a 4e 61 6d  (pSrc, i+1, zNam
2ee0: 65 2c 20 26 69 4c 65 66 74 2c 20 26 69 4c 65 66  e, &iLeft, &iLef
2ef0: 74 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20 20 20  tCol) ){.       
2f00: 20 20 20 61 64 64 57 68 65 72 65 54 65 72 6d 28     addWhereTerm(
2f10: 70 50 61 72 73 65 2c 20 70 53 72 63 2c 20 69 4c  pParse, pSrc, iL
2f20: 65 66 74 2c 20 69 4c 65 66 74 43 6f 6c 2c 20 69  eft, iLeftCol, i
2f30: 2b 31 2c 20 6a 2c 0a 20 20 20 20 20 20 20 20 20  +1, j,.         
2f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73                is
2f50: 4f 75 74 65 72 2c 20 26 70 2d 3e 70 57 68 65 72  Outer, &p->pWher
2f60: 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e);.        }.  
2f70: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
2f80: 20 2f 2a 20 44 69 73 61 6c 6c 6f 77 20 62 6f 74   /* Disallow bot
2f90: 68 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63  h ON and USING c
2fa0: 6c 61 75 73 65 73 20 69 6e 20 74 68 65 20 73 61  lauses in the sa
2fb0: 6d 65 20 6a 6f 69 6e 0a 20 20 20 20 2a 2f 0a 20  me join.    */. 
2fc0: 20 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 70     if( pRight->p
2fd0: 4f 6e 20 26 26 20 70 52 69 67 68 74 2d 3e 70 55  On && pRight->pU
2fe0: 73 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 73 71  sing ){.      sq
2ff0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
3000: 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20 68 61  arse, "cannot ha
3010: 76 65 20 62 6f 74 68 20 4f 4e 20 61 6e 64 20 55  ve both ON and U
3020: 53 49 4e 47 20 22 0a 20 20 20 20 20 20 20 20 22  SING ".        "
3030: 63 6c 61 75 73 65 73 20 69 6e 20 74 68 65 20 73  clauses in the s
3040: 61 6d 65 20 6a 6f 69 6e 22 29 3b 0a 20 20 20 20  ame join");.    
3050: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
3060: 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68  }..    /* Add th
3070: 65 20 4f 4e 20 63 6c 61 75 73 65 20 74 6f 20 74  e ON clause to t
3080: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 57 48  he end of the WH
3090: 45 52 45 20 63 6c 61 75 73 65 2c 20 63 6f 6e 6e  ERE clause, conn
30a0: 65 63 74 65 64 20 62 79 0a 20 20 20 20 2a 2a 20  ected by.    ** 
30b0: 61 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 2e  an AND operator.
30c0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
30d0: 70 52 69 67 68 74 2d 3e 70 4f 6e 20 29 7b 0a 20  pRight->pOn ){. 
30e0: 20 20 20 20 20 69 66 28 20 69 73 4f 75 74 65 72       if( isOuter
30f0: 20 29 20 73 65 74 4a 6f 69 6e 45 78 70 72 28 70   ) setJoinExpr(p
3100: 52 69 67 68 74 2d 3e 70 4f 6e 2c 20 70 52 69 67  Right->pOn, pRig
3110: 68 74 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20  ht->iCursor);.  
3120: 20 20 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20      p->pWhere = 
3130: 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 70  sqlite3ExprAnd(p
3140: 50 61 72 73 65 2d 3e 64 62 2c 20 70 2d 3e 70 57  Parse->db, p->pW
3150: 68 65 72 65 2c 20 70 52 69 67 68 74 2d 3e 70 4f  here, pRight->pO
3160: 6e 29 3b 0a 20 20 20 20 20 20 70 52 69 67 68 74  n);.      pRight
3170: 2d 3e 70 4f 6e 20 3d 20 30 3b 0a 20 20 20 20 7d  ->pOn = 0;.    }
3180: 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20  ..    /* Create 
3190: 65 78 74 72 61 20 74 65 72 6d 73 20 6f 6e 20 74  extra terms on t
31a0: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
31b0: 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20  for each column 
31c0: 6e 61 6d 65 64 0a 20 20 20 20 2a 2a 20 69 6e 20  named.    ** in 
31d0: 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65  the USING clause
31e0: 2e 20 20 45 78 61 6d 70 6c 65 3a 20 49 66 20 74  .  Example: If t
31f0: 68 65 20 74 77 6f 20 74 61 62 6c 65 73 20 74 6f  he two tables to
3200: 20 62 65 20 6a 6f 69 6e 65 64 20 61 72 65 20 0a   be joined are .
3210: 20 20 20 20 2a 2a 20 41 20 61 6e 64 20 42 20 61      ** A and B a
3220: 6e 64 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61  nd the USING cla
3230: 75 73 65 20 6e 61 6d 65 73 20 58 2c 20 59 2c 20  use names X, Y, 
3240: 61 6e 64 20 5a 2c 20 74 68 65 6e 20 61 64 64 20  and Z, then add 
3250: 74 68 69 73 0a 20 20 20 20 2a 2a 20 74 6f 20 74  this.    ** to t
3260: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 3a  he WHERE clause:
3270: 20 20 20 20 41 2e 58 3d 42 2e 58 20 41 4e 44 20      A.X=B.X AND 
3280: 41 2e 59 3d 42 2e 59 20 41 4e 44 20 41 2e 5a 3d  A.Y=B.Y AND A.Z=
3290: 42 2e 5a 0a 20 20 20 20 2a 2a 20 52 65 70 6f 72  B.Z.    ** Repor
32a0: 74 20 61 6e 20 65 72 72 6f 72 20 69 66 20 61 6e  t an error if an
32b0: 79 20 63 6f 6c 75 6d 6e 20 6d 65 6e 74 69 6f 6e  y column mention
32c0: 65 64 20 69 6e 20 74 68 65 20 55 53 49 4e 47 20  ed in the USING 
32d0: 63 6c 61 75 73 65 20 69 73 0a 20 20 20 20 2a 2a  clause is.    **
32e0: 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 69   not contained i
32f0: 6e 20 62 6f 74 68 20 74 61 62 6c 65 73 20 74 6f  n both tables to
3300: 20 62 65 20 6a 6f 69 6e 65 64 2e 0a 20 20 20 20   be joined..    
3310: 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 69 67 68  */.    if( pRigh
3320: 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20 20  t->pUsing ){.   
3330: 20 20 20 49 64 4c 69 73 74 20 2a 70 4c 69 73 74     IdList *pList
3340: 20 3d 20 70 52 69 67 68 74 2d 3e 70 55 73 69 6e   = pRight->pUsin
3350: 67 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  g;.      for(j=0
3360: 3b 20 6a 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20  ; j<pList->nId; 
3370: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68  j++){.        ch
3380: 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 2f  ar *zName;     /
3390: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 65  * Name of the te
33a0: 72 6d 20 69 6e 20 74 68 65 20 55 53 49 4e 47 20  rm in the USING 
33b0: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20  clause */.      
33c0: 20 20 69 6e 74 20 69 4c 65 66 74 3b 20 20 20 20    int iLeft;    
33d0: 20 20 20 2f 2a 20 54 61 62 6c 65 20 6f 6e 20 74     /* Table on t
33e0: 68 65 20 6c 65 66 74 20 77 69 74 68 20 6d 61 74  he left with mat
33f0: 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 6e 61 6d  ching column nam
3400: 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74  e */.        int
3410: 20 69 4c 65 66 74 43 6f 6c 3b 20 20 20 20 2f 2a   iLeftCol;    /*
3420: 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 6f   Column number o
3430: 66 20 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d  f matching colum
3440: 6e 20 6f 6e 20 74 68 65 20 6c 65 66 74 20 2a 2f  n on the left */
3450: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 52 69  .        int iRi
3460: 67 68 74 43 6f 6c 3b 20 20 20 2f 2a 20 43 6f 6c  ghtCol;   /* Col
3470: 75 6d 6e 20 6e 75 6d 62 65 72 20 6f 66 20 6d 61  umn number of ma
3480: 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 6f 6e  tching column on
3490: 20 74 68 65 20 72 69 67 68 74 20 2a 2f 0a 0a 20   the right */.. 
34a0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 70         zName = p
34b0: 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65  List->a[j].zName
34c0: 3b 0a 20 20 20 20 20 20 20 20 69 52 69 67 68 74  ;.        iRight
34d0: 43 6f 6c 20 3d 20 63 6f 6c 75 6d 6e 49 6e 64 65  Col = columnInde
34e0: 78 28 70 52 69 67 68 74 54 61 62 2c 20 7a 4e 61  x(pRightTab, zNa
34f0: 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  me);.        if(
3500: 20 69 52 69 67 68 74 43 6f 6c 3c 30 0a 20 20 20   iRightCol<0.   
3510: 20 20 20 20 20 20 7c 7c 20 21 74 61 62 6c 65 41        || !tableA
3520: 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 53  ndColumnIndex(pS
3530: 72 63 2c 20 69 2b 31 2c 20 7a 4e 61 6d 65 2c 20  rc, i+1, zName, 
3540: 26 69 4c 65 66 74 2c 20 26 69 4c 65 66 74 43 6f  &iLeft, &iLeftCo
3550: 6c 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  l).        ){.  
3560: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
3570: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
3580: 22 63 61 6e 6e 6f 74 20 6a 6f 69 6e 20 75 73 69  "cannot join usi
3590: 6e 67 20 63 6f 6c 75 6d 6e 20 25 73 20 2d 20 63  ng column %s - c
35a0: 6f 6c 75 6d 6e 20 22 0a 20 20 20 20 20 20 20 20  olumn ".        
35b0: 20 20 20 20 22 6e 6f 74 20 70 72 65 73 65 6e 74      "not present
35c0: 20 69 6e 20 62 6f 74 68 20 74 61 62 6c 65 73 22   in both tables"
35d0: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
35e0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
35f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
3600: 61 64 64 57 68 65 72 65 54 65 72 6d 28 70 50 61  addWhereTerm(pPa
3610: 72 73 65 2c 20 70 53 72 63 2c 20 69 4c 65 66 74  rse, pSrc, iLeft
3620: 2c 20 69 4c 65 66 74 43 6f 6c 2c 20 69 2b 31 2c  , iLeftCol, i+1,
3630: 20 69 52 69 67 68 74 43 6f 6c 2c 0a 20 20 20 20   iRightCol,.    
3640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3650: 20 69 73 4f 75 74 65 72 2c 20 26 70 2d 3e 70 57   isOuter, &p->pW
3660: 68 65 72 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  here);.      }. 
3670: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
3680: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  n 0;.}../*.** In
3690: 73 65 72 74 20 63 6f 64 65 20 69 6e 74 6f 20 22  sert code into "
36a0: 76 22 20 74 68 61 74 20 77 69 6c 6c 20 70 75 73  v" that will pus
36b0: 68 20 74 68 65 20 72 65 63 6f 72 64 20 6f 6e 20  h the record on 
36c0: 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65 0a 2a  the top of the.*
36d0: 2a 20 73 74 61 63 6b 20 69 6e 74 6f 20 74 68 65  * stack into the
36e0: 20 73 6f 72 74 65 72 2e 0a 2a 2f 0a 73 74 61 74   sorter..*/.stat
36f0: 69 63 20 76 6f 69 64 20 70 75 73 68 4f 6e 74 6f  ic void pushOnto
3700: 53 6f 72 74 65 72 28 0a 20 20 50 61 72 73 65 20  Sorter(.  Parse 
3710: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
3720: 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65   /* Parser conte
3730: 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  xt */.  ExprList
3740: 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20 2f   *pOrderBy,    /
3750: 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 63  * The ORDER BY c
3760: 6c 61 75 73 65 20 2a 2f 0a 20 20 53 65 6c 65 63  lause */.  Selec
3770: 74 20 2a 70 53 65 6c 65 63 74 2c 20 20 20 20 20  t *pSelect,     
3780: 20 20 2f 2a 20 54 68 65 20 77 68 6f 6c 65 20 53    /* The whole S
3790: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
37a0: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 44 61 74 61  */.  int regData
37b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
37c0: 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20  egister holding 
37d0: 64 61 74 61 20 74 6f 20 62 65 20 73 6f 72 74 65  data to be sorte
37e0: 64 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a  d */.){.  Vdbe *
37f0: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
3800: 65 3b 0a 20 20 69 6e 74 20 6e 45 78 70 72 20 3d  e;.  int nExpr =
3810: 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72   pOrderBy->nExpr
3820: 3b 0a 20 20 69 6e 74 20 72 65 67 42 61 73 65 20  ;.  int regBase 
3830: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
3840: 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 45  Range(pParse, nE
3850: 78 70 72 2b 32 29 3b 0a 20 20 69 6e 74 20 72 65  xpr+2);.  int re
3860: 67 52 65 63 6f 72 64 20 3d 20 73 71 6c 69 74 65  gRecord = sqlite
3870: 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
3880: 73 65 29 3b 0a 20 20 69 6e 74 20 6f 70 3b 0a 20  se);.  int op;. 
3890: 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
38a0: 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a  eClear(pParse);.
38b0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
38c0: 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  eExprList(pParse
38d0: 2c 20 70 4f 72 64 65 72 42 79 2c 20 72 65 67 42  , pOrderBy, regB
38e0: 61 73 65 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  ase, 0);.  sqlit
38f0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
3900: 4f 50 5f 53 65 71 75 65 6e 63 65 2c 20 70 4f 72  OP_Sequence, pOr
3910: 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 2c  derBy->iECursor,
3920: 20 72 65 67 42 61 73 65 2b 6e 45 78 70 72 29 3b   regBase+nExpr);
3930: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  .  sqlite3ExprCo
3940: 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 72  deMove(pParse, r
3950: 65 67 44 61 74 61 2c 20 72 65 67 42 61 73 65 2b  egData, regBase+
3960: 6e 45 78 70 72 2b 31 2c 20 31 29 3b 0a 20 20 73  nExpr+1, 1);.  s
3970: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
3980: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
3990: 64 2c 20 72 65 67 42 61 73 65 2c 20 6e 45 78 70  d, regBase, nExp
39a0: 72 20 2b 20 32 2c 20 72 65 67 52 65 63 6f 72 64  r + 2, regRecord
39b0: 29 3b 0a 20 20 69 66 28 20 70 53 65 6c 65 63 74  );.  if( pSelect
39c0: 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
39d0: 55 73 65 53 6f 72 74 65 72 20 29 7b 0a 20 20 20  UseSorter ){.   
39e0: 20 6f 70 20 3d 20 4f 50 5f 53 6f 72 74 65 72 49   op = OP_SorterI
39f0: 6e 73 65 72 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a  nsert;.  }else{.
3a00: 20 20 20 20 6f 70 20 3d 20 4f 50 5f 49 64 78 49      op = OP_IdxI
3a10: 6e 73 65 72 74 3b 0a 20 20 7d 0a 20 20 73 71 6c  nsert;.  }.  sql
3a20: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
3a30: 2c 20 6f 70 2c 20 70 4f 72 64 65 72 42 79 2d 3e  , op, pOrderBy->
3a40: 69 45 43 75 72 73 6f 72 2c 20 72 65 67 52 65 63  iECursor, regRec
3a50: 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 52  ord);.  sqlite3R
3a60: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
3a70: 61 72 73 65 2c 20 72 65 67 52 65 63 6f 72 64 29  arse, regRecord)
3a80: 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  ;.  sqlite3Relea
3a90: 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  seTempRange(pPar
3aa0: 73 65 2c 20 72 65 67 42 61 73 65 2c 20 6e 45 78  se, regBase, nEx
3ab0: 70 72 2b 32 29 3b 0a 20 20 69 66 28 20 70 53 65  pr+2);.  if( pSe
3ac0: 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a  lect->iLimit ){.
3ad0: 20 20 20 20 69 6e 74 20 61 64 64 72 31 2c 20 61      int addr1, a
3ae0: 64 64 72 32 3b 0a 20 20 20 20 69 6e 74 20 69 4c  ddr2;.    int iL
3af0: 69 6d 69 74 3b 0a 20 20 20 20 69 66 28 20 70 53  imit;.    if( pS
3b00: 65 6c 65 63 74 2d 3e 69 4f 66 66 73 65 74 20 29  elect->iOffset )
3b10: 7b 0a 20 20 20 20 20 20 69 4c 69 6d 69 74 20 3d  {.      iLimit =
3b20: 20 70 53 65 6c 65 63 74 2d 3e 69 4f 66 66 73 65   pSelect->iOffse
3b30: 74 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  t+1;.    }else{.
3b40: 20 20 20 20 20 20 69 4c 69 6d 69 74 20 3d 20 70        iLimit = p
3b50: 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 3b 0a  Select->iLimit;.
3b60: 20 20 20 20 7d 0a 20 20 20 20 61 64 64 72 31 20      }.    addr1 
3b70: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
3b80: 4f 70 31 28 76 2c 20 4f 50 5f 49 66 5a 65 72 6f  Op1(v, OP_IfZero
3b90: 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 73  , iLimit);.    s
3ba0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
3bb0: 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 69  (v, OP_AddImm, i
3bc0: 4c 69 6d 69 74 2c 20 2d 31 29 3b 0a 20 20 20 20  Limit, -1);.    
3bd0: 61 64 64 72 32 20 3d 20 73 71 6c 69 74 65 33 56  addr2 = sqlite3V
3be0: 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f  dbeAddOp0(v, OP_
3bf0: 47 6f 74 6f 29 3b 0a 20 20 20 20 73 71 6c 69 74  Goto);.    sqlit
3c00: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
3c10: 2c 20 61 64 64 72 31 29 3b 0a 20 20 20 20 73 71  , addr1);.    sq
3c20: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
3c30: 76 2c 20 4f 50 5f 4c 61 73 74 2c 20 70 4f 72 64  v, OP_Last, pOrd
3c40: 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 29 3b  erBy->iECursor);
3c50: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
3c60: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 44 65 6c  AddOp1(v, OP_Del
3c70: 65 74 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 69  ete, pOrderBy->i
3c80: 45 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 73 71  ECursor);.    sq
3c90: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
3ca0: 65 28 76 2c 20 61 64 64 72 32 29 3b 0a 20 20 7d  e(v, addr2);.  }
3cb0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 63 6f  .}../*.** Add co
3cc0: 64 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  de to implement 
3cd0: 74 68 65 20 4f 46 46 53 45 54 0a 2a 2f 0a 73 74  the OFFSET.*/.st
3ce0: 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65 4f 66  atic void codeOf
3cf0: 66 73 65 74 28 0a 20 20 56 64 62 65 20 2a 76 2c  fset(.  Vdbe *v,
3d00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e            /* Gen
3d10: 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20  erate code into 
3d20: 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20 53 65 6c  this VM */.  Sel
3d30: 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 2f  ect *p,        /
3d40: 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61  * The SELECT sta
3d50: 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64  tement being cod
3d60: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6e  ed */.  int iCon
3d70: 74 69 6e 75 65 20 20 20 20 20 2f 2a 20 4a 75 6d  tinue     /* Jum
3d80: 70 20 68 65 72 65 20 74 6f 20 73 6b 69 70 20 74  p here to skip t
3d90: 68 65 20 63 75 72 72 65 6e 74 20 72 65 63 6f 72  he current recor
3da0: 64 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 2d  d */.){.  if( p-
3db0: 3e 69 4f 66 66 73 65 74 20 26 26 20 69 43 6f 6e  >iOffset && iCon
3dc0: 74 69 6e 75 65 21 3d 30 20 29 7b 0a 20 20 20 20  tinue!=0 ){.    
3dd0: 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 73 71  int addr;.    sq
3de0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
3df0: 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 70 2d  v, OP_AddImm, p-
3e00: 3e 69 4f 66 66 73 65 74 2c 20 2d 31 29 3b 0a 20  >iOffset, -1);. 
3e10: 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
3e20: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
3e30: 50 5f 49 66 4e 65 67 2c 20 70 2d 3e 69 4f 66 66  P_IfNeg, p->iOff
3e40: 73 65 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  set);.    sqlite
3e50: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
3e60: 50 5f 47 6f 74 6f 2c 20 30 2c 20 69 43 6f 6e 74  P_Goto, 0, iCont
3e70: 69 6e 75 65 29 3b 0a 20 20 20 20 56 64 62 65 43  inue);.    VdbeC
3e80: 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 73 6b 69 70  omment((v, "skip
3e90: 20 4f 46 46 53 45 54 20 72 65 63 6f 72 64 73 22   OFFSET records"
3ea0: 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  ));.    sqlite3V
3eb0: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
3ec0: 64 64 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ddr);.  }.}../*.
3ed0: 2a 2a 20 41 64 64 20 63 6f 64 65 20 74 68 61 74  ** Add code that
3ee0: 20 77 69 6c 6c 20 63 68 65 63 6b 20 74 6f 20 6d   will check to m
3ef0: 61 6b 65 20 73 75 72 65 20 74 68 65 20 4e 20 72  ake sure the N r
3f00: 65 67 69 73 74 65 72 73 20 73 74 61 72 74 69 6e  egisters startin
3f10: 67 20 61 74 20 69 4d 65 6d 0a 2a 2a 20 66 6f 72  g at iMem.** for
3f20: 6d 20 61 20 64 69 73 74 69 6e 63 74 20 65 6e 74  m a distinct ent
3f30: 72 79 2e 20 20 69 54 61 62 20 69 73 20 61 20 73  ry.  iTab is a s
3f40: 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74 68 61  orting index tha
3f50: 74 20 68 6f 6c 64 73 20 70 72 65 76 69 6f 75 73  t holds previous
3f60: 6c 79 0a 2a 2a 20 73 65 65 6e 20 63 6f 6d 62 69  ly.** seen combi
3f70: 6e 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 4e  nations of the N
3f80: 20 76 61 6c 75 65 73 2e 20 20 41 20 6e 65 77 20   values.  A new 
3f90: 65 6e 74 72 79 20 69 73 20 6d 61 64 65 20 69 6e  entry is made in
3fa0: 20 69 54 61 62 0a 2a 2a 20 69 66 20 74 68 65 20   iTab.** if the 
3fb0: 63 75 72 72 65 6e 74 20 4e 20 76 61 6c 75 65 73  current N values
3fc0: 20 61 72 65 20 6e 65 77 2e 0a 2a 2a 0a 2a 2a 20   are new..**.** 
3fd0: 41 20 6a 75 6d 70 20 74 6f 20 61 64 64 72 52 65  A jump to addrRe
3fe0: 70 65 61 74 20 69 73 20 6d 61 64 65 20 61 6e 64  peat is made and
3ff0: 20 74 68 65 20 4e 2b 31 20 76 61 6c 75 65 73 20   the N+1 values 
4000: 61 72 65 20 70 6f 70 70 65 64 20 66 72 6f 6d 20  are popped from 
4010: 74 68 65 0a 2a 2a 20 73 74 61 63 6b 20 69 66 20  the.** stack if 
4020: 74 68 65 20 74 6f 70 20 4e 20 65 6c 65 6d 65 6e  the top N elemen
4030: 74 73 20 61 72 65 20 6e 6f 74 20 64 69 73 74 69  ts are not disti
4040: 6e 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  nct..*/.static v
4050: 6f 69 64 20 63 6f 64 65 44 69 73 74 69 6e 63 74  oid codeDistinct
4060: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
4070: 65 2c 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  e,     /* Parsin
4080: 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72  g and code gener
4090: 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  ating context */
40a0: 0a 20 20 69 6e 74 20 69 54 61 62 2c 20 20 20 20  .  int iTab,    
40b0: 20 20 20 20 20 20 2f 2a 20 41 20 73 6f 72 74 69        /* A sorti
40c0: 6e 67 20 69 6e 64 65 78 20 75 73 65 64 20 74 6f  ng index used to
40d0: 20 74 65 73 74 20 66 6f 72 20 64 69 73 74 69 6e   test for distin
40e0: 63 74 6e 65 73 73 20 2a 2f 0a 20 20 69 6e 74 20  ctness */.  int 
40f0: 61 64 64 72 52 65 70 65 61 74 2c 20 20 20 20 2f  addrRepeat,    /
4100: 2a 20 4a 75 6d 70 20 74 6f 20 68 65 72 65 20 69  * Jump to here i
4110: 66 20 6e 6f 74 20 64 69 73 74 69 6e 63 74 20 2a  f not distinct *
4120: 2f 0a 20 20 69 6e 74 20 4e 2c 20 20 20 20 20 20  /.  int N,      
4130: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
4140: 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a   of elements */.
4150: 20 20 69 6e 74 20 69 4d 65 6d 20 20 20 20 20 20    int iMem      
4160: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 65 6c       /* First el
4170: 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 56 64  ement */.){.  Vd
4180: 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 72 31 3b  be *v;.  int r1;
4190: 0a 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e  ..  v = pParse->
41a0: 70 56 64 62 65 3b 0a 20 20 72 31 20 3d 20 73 71  pVdbe;.  r1 = sq
41b0: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
41c0: 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74  pParse);.  sqlit
41d0: 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
41e0: 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 69 54 61  v, OP_Found, iTa
41f0: 62 2c 20 61 64 64 72 52 65 70 65 61 74 2c 20 69  b, addrRepeat, i
4200: 4d 65 6d 2c 20 4e 29 3b 0a 20 20 73 71 6c 69 74  Mem, N);.  sqlit
4210: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
4220: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 69  OP_MakeRecord, i
4230: 4d 65 6d 2c 20 4e 2c 20 72 31 29 3b 0a 20 20 73  Mem, N, r1);.  s
4240: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
4250: 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74  (v, OP_IdxInsert
4260: 2c 20 69 54 61 62 2c 20 72 31 29 3b 0a 20 20 73  , iTab, r1);.  s
4270: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
4280: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
4290: 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
42a0: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
42b0: 59 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  Y./*.** Generate
42c0: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
42d0: 65 20 77 68 65 6e 20 61 20 53 45 4c 45 43 54 20  e when a SELECT 
42e0: 69 73 20 75 73 65 64 20 77 69 74 68 69 6e 20 61  is used within a
42f0: 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 0a 2a   subexpression.*
4300: 2a 20 28 65 78 61 6d 70 6c 65 3a 20 20 22 61 20  * (example:  "a 
4310: 49 4e 20 28 53 45 4c 45 43 54 20 2a 20 46 52 4f  IN (SELECT * FRO
4320: 4d 20 74 61 62 6c 65 29 22 29 20 62 75 74 20 69  M table)") but i
4330: 74 20 68 61 73 20 6d 6f 72 65 20 74 68 61 6e 20  t has more than 
4340: 31 20 72 65 73 75 6c 74 0a 2a 2a 20 63 6f 6c 75  1 result.** colu
4350: 6d 6e 2e 20 20 57 65 20 64 6f 20 74 68 69 73 20  mn.  We do this 
4360: 69 6e 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  in a subroutine 
4370: 62 65 63 61 75 73 65 20 74 68 65 20 65 72 72 6f  because the erro
4380: 72 20 75 73 65 64 20 74 6f 20 6f 63 63 75 72 0a  r used to occur.
4390: 2a 2a 20 69 6e 20 6d 75 6c 74 69 70 6c 65 20 70  ** in multiple p
43a0: 6c 61 63 65 73 2e 20 20 28 54 68 65 20 65 72 72  laces.  (The err
43b0: 6f 72 20 6f 6e 6c 79 20 6f 63 63 75 72 73 20 69  or only occurs i
43c0: 6e 20 6f 6e 65 20 70 6c 61 63 65 20 6e 6f 77 2c  n one place now,
43d0: 20 62 75 74 20 77 65 0a 2a 2a 20 72 65 74 61 69   but we.** retai
43e0: 6e 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65  n the subroutine
43f0: 20 74 6f 20 6d 69 6e 69 6d 69 7a 65 20 63 6f 64   to minimize cod
4400: 65 20 64 69 73 72 75 70 74 69 6f 6e 2e 29 0a 2a  e disruption.).*
4410: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 68 65  /.static int che
4420: 63 6b 46 6f 72 4d 75 6c 74 69 43 6f 6c 75 6d 6e  ckForMultiColumn
4430: 53 65 6c 65 63 74 45 72 72 6f 72 28 0a 20 20 50  SelectError(.  P
4440: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
4450: 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e      /* Parse con
4460: 74 65 78 74 2e 20 2a 2f 0a 20 20 53 65 6c 65 63  text. */.  Selec
4470: 74 44 65 73 74 20 2a 70 44 65 73 74 2c 20 20 20  tDest *pDest,   
4480: 2f 2a 20 44 65 73 74 69 6e 61 74 69 6f 6e 20 6f  /* Destination o
4490: 66 20 53 45 4c 45 43 54 20 72 65 73 75 6c 74 73  f SELECT results
44a0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 70 72 20   */.  int nExpr 
44b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
44c0: 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63  mber of result c
44d0: 6f 6c 75 6d 6e 73 20 72 65 74 75 72 6e 65 64 20  olumns returned 
44e0: 62 79 20 53 45 4c 45 43 54 20 2a 2f 0a 29 7b 0a  by SELECT */.){.
44f0: 20 20 69 6e 74 20 65 44 65 73 74 20 3d 20 70 44    int eDest = pD
4500: 65 73 74 2d 3e 65 44 65 73 74 3b 0a 20 20 69 66  est->eDest;.  if
4510: 28 20 6e 45 78 70 72 3e 31 20 26 26 20 28 65 44  ( nExpr>1 && (eD
4520: 65 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 7c 7c 20  est==SRT_Mem || 
4530: 65 44 65 73 74 3d 3d 53 52 54 5f 53 65 74 29 20  eDest==SRT_Set) 
4540: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
4550: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
4560: 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 72 65  only a single re
4570: 73 75 6c 74 20 61 6c 6c 6f 77 65 64 20 66 6f 72  sult allowed for
4580: 20 22 0a 20 20 20 20 20 20 20 22 61 20 53 45 4c   ".       "a SEL
4590: 45 43 54 20 74 68 61 74 20 69 73 20 70 61 72 74  ECT that is part
45a0: 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f   of an expressio
45b0: 6e 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  n");.    return 
45c0: 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
45d0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a  return 0;.  }.}.
45e0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 6e  #endif../*.** An
45f0: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
4600: 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f 62 6a 65 63   following objec
4610: 74 20 69 73 20 75 73 65 64 20 74 6f 20 72 65 63  t is used to rec
4620: 6f 72 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ord information 
4630: 61 62 6f 75 74 0a 2a 2a 20 68 6f 77 20 74 6f 20  about.** how to 
4640: 70 72 6f 63 65 73 73 20 74 68 65 20 44 49 53 54  process the DIST
4650: 49 4e 43 54 20 6b 65 79 77 6f 72 64 2c 20 74 6f  INCT keyword, to
4660: 20 73 69 6d 70 6c 69 66 79 20 70 61 73 73 69 6e   simplify passin
4670: 67 20 74 68 61 74 20 69 6e 66 6f 72 6d 61 74 69  g that informati
4680: 6f 6e 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20 73  on.** into the s
4690: 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 29  electInnerLoop()
46a0: 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 74 79 70   routine..*/.typ
46b0: 65 64 65 66 20 73 74 72 75 63 74 20 44 69 73 74  edef struct Dist
46c0: 69 6e 63 74 43 74 78 20 44 69 73 74 69 6e 63 74  inctCtx Distinct
46d0: 43 74 78 3b 0a 73 74 72 75 63 74 20 44 69 73 74  Ctx;.struct Dist
46e0: 69 6e 63 74 43 74 78 20 7b 0a 20 20 75 38 20 69  inctCtx {.  u8 i
46f0: 73 54 6e 63 74 3b 20 20 20 20 20 20 2f 2a 20 54  sTnct;      /* T
4700: 72 75 65 20 69 66 20 74 68 65 20 44 49 53 54 49  rue if the DISTI
4710: 4e 43 54 20 6b 65 79 77 6f 72 64 20 69 73 20 70  NCT keyword is p
4720: 72 65 73 65 6e 74 20 2a 2f 0a 20 20 75 38 20 65  resent */.  u8 e
4730: 54 6e 63 74 54 79 70 65 3b 20 20 20 2f 2a 20 4f  TnctType;   /* O
4740: 6e 65 20 6f 66 20 74 68 65 20 57 48 45 52 45 5f  ne of the WHERE_
4750: 44 49 53 54 49 4e 43 54 5f 2a 20 6f 70 65 72 61  DISTINCT_* opera
4760: 74 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20 74 61  tors */.  int ta
4770: 62 54 6e 63 74 3b 20 20 20 20 2f 2a 20 45 70 68  bTnct;    /* Eph
4780: 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 75 73 65  emeral table use
4790: 64 20 66 6f 72 20 44 49 53 54 49 4e 43 54 20 70  d for DISTINCT p
47a0: 72 6f 63 65 73 73 69 6e 67 20 2a 2f 0a 20 20 69  rocessing */.  i
47b0: 6e 74 20 61 64 64 72 54 6e 63 74 3b 20 20 20 2f  nt addrTnct;   /
47c0: 2a 20 41 64 64 72 65 73 73 20 6f 66 20 4f 50 5f  * Address of OP_
47d0: 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 6f 70  OpenEphemeral op
47e0: 63 6f 64 65 20 66 6f 72 20 74 61 62 54 6e 63 74  code for tabTnct
47f0: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68   */.};../*.** Th
4800: 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72  is routine gener
4810: 61 74 65 73 20 74 68 65 20 63 6f 64 65 20 66 6f  ates the code fo
4820: 72 20 74 68 65 20 69 6e 73 69 64 65 20 6f 66 20  r the inside of 
4830: 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a 2a  the inner loop.*
4840: 2a 20 6f 66 20 61 20 53 45 4c 45 43 54 2e 0a 2a  * of a SELECT..*
4850: 2a 0a 2a 2a 20 49 66 20 73 72 63 54 61 62 20 61  *.** If srcTab a
4860: 6e 64 20 6e 43 6f 6c 75 6d 6e 20 61 72 65 20 62  nd nColumn are b
4870: 6f 74 68 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74  oth zero, then t
4880: 68 65 20 70 45 4c 69 73 74 20 65 78 70 72 65 73  he pEList expres
4890: 73 69 6f 6e 73 0a 2a 2a 20 61 72 65 20 65 76 61  sions.** are eva
48a0: 6c 75 61 74 65 64 20 69 6e 20 6f 72 64 65 72 20  luated in order 
48b0: 74 6f 20 67 65 74 20 74 68 65 20 64 61 74 61 20  to get the data 
48c0: 66 6f 72 20 74 68 69 73 20 72 6f 77 2e 20 20 49  for this row.  I
48d0: 66 20 6e 43 6f 6c 75 6d 6e 3e 30 0a 2a 2a 20 74  f nColumn>0.** t
48e0: 68 65 6e 20 64 61 74 61 20 69 73 20 70 75 6c 6c  hen data is pull
48f0: 65 64 20 66 72 6f 6d 20 73 72 63 54 61 62 20 61  ed from srcTab a
4900: 6e 64 20 70 45 4c 69 73 74 20 69 73 20 75 73 65  nd pEList is use
4910: 64 20 6f 6e 6c 79 20 74 6f 20 67 65 74 20 74 68  d only to get th
4920: 65 0a 2a 2a 20 64 61 74 61 74 79 70 65 73 20 66  e.** datatypes f
4930: 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 2e 0a  or each column..
4940: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
4950: 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 0a  electInnerLoop(.
4960: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
4970: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
4980: 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20   parser context 
4990: 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
49a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
49b0: 54 68 65 20 63 6f 6d 70 6c 65 74 65 20 73 65 6c  The complete sel
49c0: 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20 62 65  ect statement be
49d0: 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 45  ing coded */.  E
49e0: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c  xprList *pEList,
49f0: 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f         /* List o
4a00: 66 20 76 61 6c 75 65 73 20 62 65 69 6e 67 20 65  f values being e
4a10: 78 74 72 61 63 74 65 64 20 2a 2f 0a 20 20 69 6e  xtracted */.  in
4a20: 74 20 73 72 63 54 61 62 2c 20 20 20 20 20 20 20  t srcTab,       
4a30: 20 20 20 20 20 20 2f 2a 20 50 75 6c 6c 20 64 61        /* Pull da
4a40: 74 61 20 66 72 6f 6d 20 74 68 69 73 20 74 61 62  ta from this tab
4a50: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c  le */.  int nCol
4a60: 75 6d 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  umn,            
4a70: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  /* Number of col
4a80: 75 6d 6e 73 20 69 6e 20 74 68 65 20 73 6f 75 72  umns in the sour
4a90: 63 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78  ce table */.  Ex
4aa0: 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
4ab0: 2c 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 74 20  ,     /* If not 
4ac0: 4e 55 4c 4c 2c 20 73 6f 72 74 20 72 65 73 75 6c  NULL, sort resul
4ad0: 74 73 20 75 73 69 6e 67 20 74 68 69 73 20 6b 65  ts using this ke
4ae0: 79 20 2a 2f 0a 20 20 44 69 73 74 69 6e 63 74 43  y */.  DistinctC
4af0: 74 78 20 2a 70 44 69 73 74 69 6e 63 74 2c 20 2f  tx *pDistinct, /
4b00: 2a 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69  * If not NULL, i
4b10: 6e 66 6f 20 6f 6e 20 68 6f 77 20 74 6f 20 70 72  nfo on how to pr
4b20: 6f 63 65 73 73 20 44 49 53 54 49 4e 43 54 20 2a  ocess DISTINCT *
4b30: 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a  /.  SelectDest *
4b40: 70 44 65 73 74 2c 20 20 20 20 20 20 2f 2a 20 48  pDest,      /* H
4b50: 6f 77 20 74 6f 20 64 69 73 70 6f 73 65 20 6f 66  ow to dispose of
4b60: 20 74 68 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a   the results */.
4b70: 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 2c    int iContinue,
4b80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d            /* Jum
4b90: 70 20 68 65 72 65 20 74 6f 20 63 6f 6e 74 69 6e  p here to contin
4ba0: 75 65 20 77 69 74 68 20 6e 65 78 74 20 72 6f 77  ue with next row
4bb0: 20 2a 2f 0a 20 20 69 6e 74 20 69 42 72 65 61 6b   */.  int iBreak
4bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4bd0: 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 62 72   Jump here to br
4be0: 65 61 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 69  eak out of the i
4bf0: 6e 6e 65 72 20 6c 6f 6f 70 20 2a 2f 0a 29 7b 0a  nner loop */.){.
4c00: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
4c10: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
4c20: 20 69 3b 0a 20 20 69 6e 74 20 68 61 73 44 69 73   i;.  int hasDis
4c30: 74 69 6e 63 74 3b 20 20 20 20 20 20 20 20 2f 2a  tinct;        /*
4c40: 20 54 72 75 65 20 69 66 20 74 68 65 20 44 49 53   True if the DIS
4c50: 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 69 73  TINCT keyword is
4c60: 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e   present */.  in
4c70: 74 20 72 65 67 52 65 73 75 6c 74 3b 20 20 20 20  t regResult;    
4c80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61            /* Sta
4c90: 72 74 20 6f 66 20 6d 65 6d 6f 72 79 20 68 6f 6c  rt of memory hol
4ca0: 64 69 6e 67 20 72 65 73 75 6c 74 20 73 65 74 20  ding result set 
4cb0: 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73 74 20 3d  */.  int eDest =
4cc0: 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3b 20 20   pDest->eDest;  
4cd0: 20 2f 2a 20 48 6f 77 20 74 6f 20 64 69 73 70 6f   /* How to dispo
4ce0: 73 65 20 6f 66 20 72 65 73 75 6c 74 73 20 2a 2f  se of results */
4cf0: 0a 20 20 69 6e 74 20 69 50 61 72 6d 20 3d 20 70  .  int iParm = p
4d00: 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 3b 20 2f  Dest->iSDParm; /
4d10: 2a 20 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74  * First argument
4d20: 20 74 6f 20 64 69 73 70 6f 73 61 6c 20 6d 65 74   to disposal met
4d30: 68 6f 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65  hod */.  int nRe
4d40: 73 75 6c 74 43 6f 6c 3b 20 20 20 20 20 20 20 20  sultCol;        
4d50: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
4d60: 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  f result columns
4d70: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 76   */..  assert( v
4d80: 20 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28   );.  if( NEVER(
4d90: 76 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 3b 0a  v==0) ) return;.
4da0: 20 20 61 73 73 65 72 74 28 20 70 45 4c 69 73 74    assert( pEList
4db0: 21 3d 30 20 29 3b 0a 20 20 68 61 73 44 69 73 74  !=0 );.  hasDist
4dc0: 69 6e 63 74 20 3d 20 70 44 69 73 74 69 6e 63 74  inct = pDistinct
4dd0: 20 3f 20 70 44 69 73 74 69 6e 63 74 2d 3e 65 54   ? pDistinct->eT
4de0: 6e 63 74 54 79 70 65 20 3a 20 57 48 45 52 45 5f  nctType : WHERE_
4df0: 44 49 53 54 49 4e 43 54 5f 4e 4f 4f 50 3b 0a 20  DISTINCT_NOOP;. 
4e00: 20 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d 30   if( pOrderBy==0
4e10: 20 26 26 20 21 68 61 73 44 69 73 74 69 6e 63 74   && !hasDistinct
4e20: 20 29 7b 0a 20 20 20 20 63 6f 64 65 4f 66 66 73   ){.    codeOffs
4e30: 65 74 28 76 2c 20 70 2c 20 69 43 6f 6e 74 69 6e  et(v, p, iContin
4e40: 75 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50  ue);.  }..  /* P
4e50: 75 6c 6c 20 74 68 65 20 72 65 71 75 65 73 74 65  ull the requeste
4e60: 64 20 63 6f 6c 75 6d 6e 73 2e 0a 20 20 2a 2f 0a  d columns..  */.
4e70: 20 20 69 66 28 20 6e 43 6f 6c 75 6d 6e 3e 30 20    if( nColumn>0 
4e80: 29 7b 0a 20 20 20 20 6e 52 65 73 75 6c 74 43 6f  ){.    nResultCo
4e90: 6c 20 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 7d  l = nColumn;.  }
4ea0: 65 6c 73 65 7b 0a 20 20 20 20 6e 52 65 73 75 6c  else{.    nResul
4eb0: 74 43 6f 6c 20 3d 20 70 45 4c 69 73 74 2d 3e 6e  tCol = pEList->n
4ec0: 45 78 70 72 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Expr;.  }.  if( 
4ed0: 70 44 65 73 74 2d 3e 69 53 64 73 74 3d 3d 30 20  pDest->iSdst==0 
4ee0: 29 7b 0a 20 20 20 20 70 44 65 73 74 2d 3e 69 53  ){.    pDest->iS
4ef0: 64 73 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  dst = pParse->nM
4f00: 65 6d 2b 31 3b 0a 20 20 20 20 70 44 65 73 74 2d  em+1;.    pDest-
4f10: 3e 6e 53 64 73 74 20 3d 20 6e 52 65 73 75 6c 74  >nSdst = nResult
4f20: 43 6f 6c 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  Col;.    pParse-
4f30: 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 73 75 6c 74  >nMem += nResult
4f40: 43 6f 6c 3b 0a 20 20 7d 65 6c 73 65 7b 20 0a 20  Col;.  }else{ . 
4f50: 20 20 20 61 73 73 65 72 74 28 20 70 44 65 73 74     assert( pDest
4f60: 2d 3e 6e 53 64 73 74 3d 3d 6e 52 65 73 75 6c 74  ->nSdst==nResult
4f70: 43 6f 6c 20 29 3b 0a 20 20 7d 0a 20 20 72 65 67  Col );.  }.  reg
4f80: 52 65 73 75 6c 74 20 3d 20 70 44 65 73 74 2d 3e  Result = pDest->
4f90: 69 53 64 73 74 3b 0a 20 20 69 66 28 20 6e 43 6f  iSdst;.  if( nCo
4fa0: 6c 75 6d 6e 3e 30 20 29 7b 0a 20 20 20 20 66 6f  lumn>0 ){.    fo
4fb0: 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 75 6d 6e  r(i=0; i<nColumn
4fc0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  ; i++){.      sq
4fd0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
4fe0: 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73 72  v, OP_Column, sr
4ff0: 63 54 61 62 2c 20 69 2c 20 72 65 67 52 65 73 75  cTab, i, regResu
5000: 6c 74 2b 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  lt+i);.    }.  }
5010: 65 6c 73 65 20 69 66 28 20 65 44 65 73 74 21 3d  else if( eDest!=
5020: 53 52 54 5f 45 78 69 73 74 73 20 29 7b 0a 20 20  SRT_Exists ){.  
5030: 20 20 2f 2a 20 49 66 20 74 68 65 20 64 65 73 74    /* If the dest
5040: 69 6e 61 74 69 6f 6e 20 69 73 20 61 6e 20 45 58  ination is an EX
5050: 49 53 54 53 28 2e 2e 2e 29 20 65 78 70 72 65 73  ISTS(...) expres
5060: 73 69 6f 6e 2c 20 74 68 65 20 61 63 74 75 61 6c  sion, the actual
5070: 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65 73 20 72  .    ** values r
5080: 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 53  eturned by the S
5090: 45 4c 45 43 54 20 61 72 65 20 6e 6f 74 20 72 65  ELECT are not re
50a0: 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  quired..    */. 
50b0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
50c0: 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29  cheClear(pParse)
50d0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
50e0: 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50  rCodeExprList(pP
50f0: 61 72 73 65 2c 20 70 45 4c 69 73 74 2c 20 72 65  arse, pEList, re
5100: 67 52 65 73 75 6c 74 2c 20 65 44 65 73 74 3d 3d  gResult, eDest==
5110: 53 52 54 5f 4f 75 74 70 75 74 29 3b 0a 20 20 7d  SRT_Output);.  }
5120: 0a 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 6e 52 65  .  nColumn = nRe
5130: 73 75 6c 74 43 6f 6c 3b 0a 0a 20 20 2f 2a 20 49  sultCol;..  /* I
5140: 66 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b  f the DISTINCT k
5150: 65 79 77 6f 72 64 20 77 61 73 20 70 72 65 73 65  eyword was prese
5160: 6e 74 20 6f 6e 20 74 68 65 20 53 45 4c 45 43 54  nt on the SELECT
5170: 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20   statement.  ** 
5180: 61 6e 64 20 74 68 69 73 20 72 6f 77 20 68 61 73  and this row has
5190: 20 62 65 65 6e 20 73 65 65 6e 20 62 65 66 6f 72   been seen befor
51a0: 65 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 6d  e, then do not m
51b0: 61 6b 65 20 74 68 69 73 20 72 6f 77 0a 20 20 2a  ake this row.  *
51c0: 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20 72 65  * part of the re
51d0: 73 75 6c 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  sult..  */.  if(
51e0: 20 68 61 73 44 69 73 74 69 6e 63 74 20 29 7b 0a   hasDistinct ){.
51f0: 20 20 20 20 61 73 73 65 72 74 28 20 70 45 4c 69      assert( pELi
5200: 73 74 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  st!=0 );.    ass
5210: 65 72 74 28 20 70 45 4c 69 73 74 2d 3e 6e 45 78  ert( pEList->nEx
5220: 70 72 3d 3d 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20  pr==nColumn );. 
5230: 20 20 20 73 77 69 74 63 68 28 20 70 44 69 73 74     switch( pDist
5240: 69 6e 63 74 2d 3e 65 54 6e 63 74 54 79 70 65 20  inct->eTnctType 
5250: 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 57 48  ){.      case WH
5260: 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44  ERE_DISTINCT_ORD
5270: 45 52 45 44 3a 20 7b 0a 20 20 20 20 20 20 20 20  ERED: {.        
5280: 56 64 62 65 4f 70 20 2a 70 4f 70 3b 20 20 20 20  VdbeOp *pOp;    
5290: 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20 6c 6f          /* No lo
52a0: 6e 67 65 72 20 72 65 71 75 69 72 65 64 20 4f 70  nger required Op
52b0: 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e 73 74  enEphemeral inst
52c0: 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  r. */.        in
52d0: 74 20 69 4a 75 6d 70 3b 20 20 20 20 20 20 20 20  t iJump;        
52e0: 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 64 65        /* Jump de
52f0: 73 74 69 6e 61 74 69 6f 6e 20 2a 2f 0a 20 20 20  stination */.   
5300: 20 20 20 20 20 69 6e 74 20 72 65 67 50 72 65 76       int regPrev
5310: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
5320: 50 72 65 76 69 6f 75 73 20 72 6f 77 20 63 6f 6e  Previous row con
5330: 74 65 6e 74 20 2a 2f 0a 0a 20 20 20 20 20 20 20  tent */..       
5340: 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61   /* Allocate spa
5350: 63 65 20 66 6f 72 20 74 68 65 20 70 72 65 76 69  ce for the previ
5360: 6f 75 73 20 72 6f 77 20 2a 2f 0a 20 20 20 20 20  ous row */.     
5370: 20 20 20 72 65 67 50 72 65 76 20 3d 20 70 50 61     regPrev = pPa
5380: 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20  rse->nMem+1;.   
5390: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65       pParse->nMe
53a0: 6d 20 2b 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a 0a 20  m += nColumn;.. 
53b0: 20 20 20 20 20 20 20 2f 2a 20 43 68 61 6e 67 65         /* Change
53c0: 20 74 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65   the OP_OpenEphe
53d0: 6d 65 72 61 6c 20 63 6f 64 65 64 20 65 61 72 6c  meral coded earl
53e0: 69 65 72 20 74 6f 20 61 6e 20 4f 50 5f 4e 75 6c  ier to an OP_Nul
53f0: 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 65 74  l.        ** set
5400: 73 20 74 68 65 20 4d 45 4d 5f 43 6c 65 61 72 65  s the MEM_Cleare
5410: 64 20 62 69 74 20 6f 6e 20 74 68 65 20 66 69 72  d bit on the fir
5420: 73 74 20 72 65 67 69 73 74 65 72 20 6f 66 20 74  st register of t
5430: 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72  he.        ** pr
5440: 65 76 69 6f 75 73 20 76 61 6c 75 65 2e 20 20 54  evious value.  T
5450: 68 69 73 20 77 69 6c 6c 20 63 61 75 73 65 20 74  his will cause t
5460: 68 65 20 4f 50 5f 4e 65 20 62 65 6c 6f 77 20 74  he OP_Ne below t
5470: 6f 20 61 6c 77 61 79 73 0a 20 20 20 20 20 20 20  o always.       
5480: 20 2a 2a 20 66 61 69 6c 20 6f 6e 20 74 68 65 20   ** fail on the 
5490: 66 69 72 73 74 20 69 74 65 72 61 74 69 6f 6e 20  first iteration 
54a0: 6f 66 20 74 68 65 20 6c 6f 6f 70 20 65 76 65 6e  of the loop even
54b0: 20 69 66 20 74 68 65 20 66 69 72 73 74 0a 20 20   if the first.  
54c0: 20 20 20 20 20 20 2a 2a 20 72 6f 77 20 69 73 20        ** row is 
54d0: 61 6c 6c 20 4e 55 4c 4c 73 2e 0a 20 20 20 20 20  all NULLs..     
54e0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71     */.        sq
54f0: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54  lite3VdbeChangeT
5500: 6f 4e 6f 6f 70 28 76 2c 20 70 44 69 73 74 69 6e  oNoop(v, pDistin
5510: 63 74 2d 3e 61 64 64 72 54 6e 63 74 29 3b 0a 20  ct->addrTnct);. 
5520: 20 20 20 20 20 20 20 70 4f 70 20 3d 20 73 71 6c         pOp = sql
5530: 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c  ite3VdbeGetOp(v,
5540: 20 70 44 69 73 74 69 6e 63 74 2d 3e 61 64 64 72   pDistinct->addr
5550: 54 6e 63 74 29 3b 0a 20 20 20 20 20 20 20 20 70  Tnct);.        p
5560: 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f  Op->opcode = OP_
5570: 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70 4f  Null;.        pO
5580: 70 2d 3e 70 31 20 3d 20 31 3b 0a 20 20 20 20 20  p->p1 = 1;.     
5590: 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20 72 65 67     pOp->p2 = reg
55a0: 50 72 65 76 3b 0a 0a 20 20 20 20 20 20 20 20 69  Prev;..        i
55b0: 4a 75 6d 70 20 3d 20 73 71 6c 69 74 65 33 56 64  Jump = sqlite3Vd
55c0: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
55d0: 20 2b 20 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20   + nColumn;.    
55e0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
55f0: 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Column; i++){.  
5600: 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20          CollSeq 
5610: 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33  *pColl = sqlite3
5620: 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
5630: 73 65 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  se, pEList->a[i]
5640: 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20  .pExpr);.       
5650: 20 20 20 69 66 28 20 69 3c 6e 43 6f 6c 75 6d 6e     if( i<nColumn
5660: 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  -1 ){.          
5670: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
5680: 4f 70 33 28 76 2c 20 4f 50 5f 4e 65 2c 20 72 65  Op3(v, OP_Ne, re
5690: 67 52 65 73 75 6c 74 2b 69 2c 20 69 4a 75 6d 70  gResult+i, iJump
56a0: 2c 20 72 65 67 50 72 65 76 2b 69 29 3b 0a 20 20  , regPrev+i);.  
56b0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
56c0: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
56d0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
56e0: 4f 50 5f 45 71 2c 20 72 65 67 52 65 73 75 6c 74  OP_Eq, regResult
56f0: 2b 69 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20 72  +i, iContinue, r
5700: 65 67 50 72 65 76 2b 69 29 3b 0a 20 20 20 20 20  egPrev+i);.     
5710: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
5720: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
5730: 67 65 50 34 28 76 2c 20 2d 31 2c 20 28 63 6f 6e  geP4(v, -1, (con
5740: 73 74 20 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c  st char *)pColl,
5750: 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20   P4_COLLSEQ);.  
5760: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
5770: 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 53  dbeChangeP5(v, S
5780: 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20  QLITE_NULLEQ);. 
5790: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
57a0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
57b0: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
57c0: 76 29 3d 3d 69 4a 75 6d 70 20 29 3b 0a 20 20 20  v)==iJump );.   
57d0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
57e0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 70  AddOp3(v, OP_Cop
57f0: 79 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 72 65  y, regResult, re
5800: 67 50 72 65 76 2c 20 6e 43 6f 6c 75 6d 6e 2d 31  gPrev, nColumn-1
5810: 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
5820: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
5830: 20 63 61 73 65 20 57 48 45 52 45 5f 44 49 53 54   case WHERE_DIST
5840: 49 4e 43 54 5f 55 4e 49 51 55 45 3a 20 7b 0a 20  INCT_UNIQUE: {. 
5850: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
5860: 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76  beChangeToNoop(v
5870: 2c 20 70 44 69 73 74 69 6e 63 74 2d 3e 61 64 64  , pDistinct->add
5880: 72 54 6e 63 74 29 3b 0a 20 20 20 20 20 20 20 20  rTnct);.        
5890: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a  break;.      }..
58a0: 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b        default: {
58b0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
58c0: 20 70 44 69 73 74 69 6e 63 74 2d 3e 65 54 6e 63   pDistinct->eTnc
58d0: 74 54 79 70 65 3d 3d 57 48 45 52 45 5f 44 49 53  tType==WHERE_DIS
58e0: 54 49 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44 20  TINCT_UNORDERED 
58f0: 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 44  );.        codeD
5900: 69 73 74 69 6e 63 74 28 70 50 61 72 73 65 2c 20  istinct(pParse, 
5910: 70 44 69 73 74 69 6e 63 74 2d 3e 74 61 62 54 6e  pDistinct->tabTn
5920: 63 74 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20 6e  ct, iContinue, n
5930: 43 6f 6c 75 6d 6e 2c 20 72 65 67 52 65 73 75 6c  Column, regResul
5940: 74 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  t);.        brea
5950: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
5960: 0a 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42  .    if( pOrderB
5970: 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6f  y==0 ){.      co
5980: 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2c 20 69  deOffset(v, p, i
5990: 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20 7d  Continue);.    }
59a0: 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63 68 28 20  .  }..  switch( 
59b0: 65 44 65 73 74 20 29 7b 0a 20 20 20 20 2f 2a 20  eDest ){.    /* 
59c0: 49 6e 20 74 68 69 73 20 6d 6f 64 65 2c 20 77 72  In this mode, wr
59d0: 69 74 65 20 65 61 63 68 20 71 75 65 72 79 20 72  ite each query r
59e0: 65 73 75 6c 74 20 74 6f 20 74 68 65 20 6b 65 79  esult to the key
59f0: 20 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61 72   of the temporar
5a00: 79 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 69  y.    ** table i
5a10: 50 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a 23 69 66  Parm..    */.#if
5a20: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
5a30: 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
5a40: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 55 6e  .    case SRT_Un
5a50: 69 6f 6e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  ion: {.      int
5a60: 20 72 31 3b 0a 20 20 20 20 20 20 72 31 20 3d 20   r1;.      r1 = 
5a70: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
5a80: 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
5a90: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5aa0: 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p3(v, OP_MakeRec
5ab0: 6f 72 64 2c 20 72 65 67 52 65 73 75 6c 74 2c 20  ord, regResult, 
5ac0: 6e 43 6f 6c 75 6d 6e 2c 20 72 31 29 3b 0a 20 20  nColumn, r1);.  
5ad0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
5ae0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49  ddOp2(v, OP_IdxI
5af0: 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 31  nsert, iParm, r1
5b00: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
5b10: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
5b20: 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20  Parse, r1);.    
5b30: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
5b40: 20 20 20 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74      /* Construct
5b50: 20 61 20 72 65 63 6f 72 64 20 66 72 6f 6d 20 74   a record from t
5b60: 68 65 20 71 75 65 72 79 20 72 65 73 75 6c 74 2c  he query result,
5b70: 20 62 75 74 20 69 6e 73 74 65 61 64 20 6f 66 0a   but instead of.
5b80: 20 20 20 20 2a 2a 20 73 61 76 69 6e 67 20 74 68      ** saving th
5b90: 61 74 20 72 65 63 6f 72 64 2c 20 75 73 65 20 69  at record, use i
5ba0: 74 20 61 73 20 61 20 6b 65 79 20 74 6f 20 64 65  t as a key to de
5bb0: 6c 65 74 65 20 65 6c 65 6d 65 6e 74 73 20 66 72  lete elements fr
5bc0: 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 65  om.    ** the te
5bd0: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 50  mporary table iP
5be0: 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  arm..    */.    
5bf0: 63 61 73 65 20 53 52 54 5f 45 78 63 65 70 74 3a  case SRT_Except:
5c00: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
5c10: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
5c20: 5f 49 64 78 44 65 6c 65 74 65 2c 20 69 50 61 72  _IdxDelete, iPar
5c30: 6d 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 43  m, regResult, nC
5c40: 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 62 72  olumn);.      br
5c50: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
5c60: 66 0a 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65 20  f..    /* Store 
5c70: 74 68 65 20 72 65 73 75 6c 74 20 61 73 20 64 61  the result as da
5c80: 74 61 20 75 73 69 6e 67 20 61 20 75 6e 69 71 75  ta using a uniqu
5c90: 65 20 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  e key..    */.  
5ca0: 20 20 63 61 73 65 20 53 52 54 5f 54 61 62 6c 65    case SRT_Table
5cb0: 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 45  :.    case SRT_E
5cc0: 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20  phemTab: {.     
5cd0: 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65   int r1 = sqlite
5ce0: 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
5cf0: 73 65 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  se);.      testc
5d00: 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f  ase( eDest==SRT_
5d10: 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 20 20 74  Table );.      t
5d20: 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d  estcase( eDest==
5d30: 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29 3b 0a  SRT_EphemTab );.
5d40: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
5d50: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61  eAddOp3(v, OP_Ma
5d60: 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52 65 73  keRecord, regRes
5d70: 75 6c 74 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 72 31  ult, nColumn, r1
5d80: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72  );.      if( pOr
5d90: 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20  derBy ){.       
5da0: 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28   pushOntoSorter(
5db0: 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79  pParse, pOrderBy
5dc0: 2c 20 70 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  , p, r1);.      
5dd0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
5de0: 6e 74 20 72 32 20 3d 20 73 71 6c 69 74 65 33 47  nt r2 = sqlite3G
5df0: 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
5e00: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
5e10: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
5e20: 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 69 50 61  OP_NewRowid, iPa
5e30: 72 6d 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 20  rm, r2);.       
5e40: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5e50: 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c  p3(v, OP_Insert,
5e60: 20 69 50 61 72 6d 2c 20 72 31 2c 20 72 32 29 3b   iParm, r1, r2);
5e70: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
5e80: 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
5e90: 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a  OPFLAG_APPEND);.
5ea0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
5eb0: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
5ec0: 61 72 73 65 2c 20 72 32 29 3b 0a 20 20 20 20 20  arse, r2);.     
5ed0: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
5ee0: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
5ef0: 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20  Parse, r1);.    
5f00: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
5f10: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
5f20: 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20  MIT_SUBQUERY.   
5f30: 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 63 72   /* If we are cr
5f40: 65 61 74 69 6e 67 20 61 20 73 65 74 20 66 6f 72  eating a set for
5f50: 20 61 6e 20 22 65 78 70 72 20 49 4e 20 28 53 45   an "expr IN (SE
5f60: 4c 45 43 54 20 2e 2e 2e 29 22 20 63 6f 6e 73 74  LECT ...)" const
5f70: 72 75 63 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65  ruct,.    ** the
5f80: 6e 20 74 68 65 72 65 20 73 68 6f 75 6c 64 20 62  n there should b
5f90: 65 20 61 20 73 69 6e 67 6c 65 20 69 74 65 6d 20  e a single item 
5fa0: 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20 57  on the stack.  W
5fb0: 72 69 74 65 20 74 68 69 73 0a 20 20 20 20 2a 2a  rite this.    **
5fc0: 20 69 74 65 6d 20 69 6e 74 6f 20 74 68 65 20 73   item into the s
5fd0: 65 74 20 74 61 62 6c 65 20 77 69 74 68 20 62 6f  et table with bo
5fe0: 67 75 73 20 64 61 74 61 2e 0a 20 20 20 20 2a 2f  gus data..    */
5ff0: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 53 65  .    case SRT_Se
6000: 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  t: {.      asser
6010: 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b  t( nColumn==1 );
6020: 0a 20 20 20 20 20 20 70 44 65 73 74 2d 3e 61 66  .      pDest->af
6030: 66 53 64 73 74 20 3d 0a 20 20 20 20 20 20 20 20  fSdst =.        
6040: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
6050: 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79  3CompareAffinity
6060: 28 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  (pEList->a[0].pE
6070: 78 70 72 2c 20 70 44 65 73 74 2d 3e 61 66 66 53  xpr, pDest->affS
6080: 64 73 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  dst);.      if( 
6090: 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
60a0: 20 20 20 20 2f 2a 20 41 74 20 66 69 72 73 74 20      /* At first 
60b0: 67 6c 61 6e 63 65 20 79 6f 75 20 77 6f 75 6c 64  glance you would
60c0: 20 74 68 69 6e 6b 20 77 65 20 63 6f 75 6c 64 20   think we could 
60d0: 6f 70 74 69 6d 69 7a 65 20 6f 75 74 20 74 68 65  optimize out the
60e0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 52 44 45  .        ** ORDE
60f0: 52 20 42 59 20 69 6e 20 74 68 69 73 20 63 61 73  R BY in this cas
6100: 65 20 73 69 6e 63 65 20 74 68 65 20 6f 72 64 65  e since the orde
6110: 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20  r of entries in 
6120: 74 68 65 20 73 65 74 0a 20 20 20 20 20 20 20 20  the set.        
6130: 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 74  ** does not matt
6140: 65 72 2e 20 20 42 75 74 20 74 68 65 72 65 20 6d  er.  But there m
6150: 69 67 68 74 20 62 65 20 61 20 4c 49 4d 49 54 20  ight be a LIMIT 
6160: 63 6c 61 75 73 65 2c 20 69 6e 20 77 68 69 63 68  clause, in which
6170: 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61 73 65  .        ** case
6180: 20 74 68 65 20 6f 72 64 65 72 20 64 6f 65 73 20   the order does 
6190: 6d 61 74 74 65 72 20 2a 2f 0a 20 20 20 20 20 20  matter */.      
61a0: 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72    pushOntoSorter
61b0: 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42  (pParse, pOrderB
61c0: 79 2c 20 70 2c 20 72 65 67 52 65 73 75 6c 74 29  y, p, regResult)
61d0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
61e0: 20 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20         int r1 = 
61f0: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
6200: 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
6210: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
6220: 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp4(v, OP_MakeR
6230: 65 63 6f 72 64 2c 20 72 65 67 52 65 73 75 6c 74  ecord, regResult
6240: 2c 31 2c 72 31 2c 20 26 70 44 65 73 74 2d 3e 61  ,1,r1, &pDest->a
6250: 66 66 53 64 73 74 2c 20 31 29 3b 0a 20 20 20 20  ffSdst, 1);.    
6260: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
6270: 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e  acheAffinityChan
6280: 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 52 65  ge(pParse, regRe
6290: 73 75 6c 74 2c 20 31 29 3b 0a 20 20 20 20 20 20  sult, 1);.      
62a0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
62b0: 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Op2(v, OP_IdxIns
62c0: 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 31 29 3b  ert, iParm, r1);
62d0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
62e0: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
62f0: 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20  Parse, r1);.    
6300: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
6310: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
6320: 66 20 61 6e 79 20 72 6f 77 20 65 78 69 73 74 20  f any row exist 
6330: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
6340: 74 2c 20 72 65 63 6f 72 64 20 74 68 61 74 20 66  t, record that f
6350: 61 63 74 20 61 6e 64 20 61 62 6f 72 74 2e 0a 20  act and abort.. 
6360: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
6370: 52 54 5f 45 78 69 73 74 73 3a 20 7b 0a 20 20 20  RT_Exists: {.   
6380: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
6390: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
63a0: 65 72 2c 20 31 2c 20 69 50 61 72 6d 29 3b 0a 20  er, 1, iParm);. 
63b0: 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49       /* The LIMI
63c0: 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 74 65  T clause will te
63d0: 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70  rminate the loop
63e0: 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20   for us */.     
63f0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
6400: 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
6410: 20 61 20 73 63 61 6c 61 72 20 73 65 6c 65 63 74   a scalar select
6420: 20 74 68 61 74 20 69 73 20 70 61 72 74 20 6f 66   that is part of
6430: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c 20   an expression, 
6440: 74 68 65 6e 0a 20 20 20 20 2a 2a 20 73 74 6f 72  then.    ** stor
6450: 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e  e the results in
6460: 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
6470: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64   memory cell and
6480: 20 62 72 65 61 6b 20 6f 75 74 0a 20 20 20 20 2a   break out.    *
6490: 2a 20 6f 66 20 74 68 65 20 73 63 61 6e 20 6c 6f  * of the scan lo
64a0: 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  op..    */.    c
64b0: 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20  ase SRT_Mem: {. 
64c0: 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f       assert( nCo
64d0: 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20  lumn==1 );.     
64e0: 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b   if( pOrderBy ){
64f0: 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74  .        pushOnt
6500: 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20  oSorter(pParse, 
6510: 70 4f 72 64 65 72 42 79 2c 20 70 2c 20 72 65 67  pOrderBy, p, reg
6520: 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 20 20 7d  Result);.      }
6530: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
6540: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76  lite3ExprCodeMov
6550: 65 28 70 50 61 72 73 65 2c 20 72 65 67 52 65 73  e(pParse, regRes
6560: 75 6c 74 2c 20 69 50 61 72 6d 2c 20 31 29 3b 0a  ult, iParm, 1);.
6570: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c          /* The L
6580: 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c  IMIT clause will
6590: 20 6a 75 6d 70 20 6f 75 74 20 6f 66 20 74 68 65   jump out of the
65a0: 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a   loop for us */.
65b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
65c0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
65d0: 66 20 2f 2a 20 23 69 66 6e 64 65 66 20 53 51 4c  f /* #ifndef SQL
65e0: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
65f0: 59 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 6e  Y */..    /* Sen
6600: 64 20 74 68 65 20 64 61 74 61 20 74 6f 20 74 68  d the data to th
6610: 65 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74  e callback funct
6620: 69 6f 6e 20 6f 72 20 74 6f 20 61 20 73 75 62 72  ion or to a subr
6630: 6f 75 74 69 6e 65 2e 20 20 49 6e 20 74 68 65 0a  outine.  In the.
6640: 20 20 20 20 2a 2a 20 63 61 73 65 20 6f 66 20 61      ** case of a
6650: 20 73 75 62 72 6f 75 74 69 6e 65 2c 20 74 68 65   subroutine, the
6660: 20 73 75 62 72 6f 75 74 69 6e 65 20 69 74 73 65   subroutine itse
6670: 6c 66 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  lf is responsibl
6680: 65 20 66 6f 72 0a 20 20 20 20 2a 2a 20 70 6f 70  e for.    ** pop
6690: 70 69 6e 67 20 74 68 65 20 64 61 74 61 20 66 72  ping the data fr
66a0: 6f 6d 20 74 68 65 20 73 74 61 63 6b 2e 0a 20 20  om the stack..  
66b0: 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52    */.    case SR
66c0: 54 5f 43 6f 72 6f 75 74 69 6e 65 3a 0a 20 20 20  T_Coroutine:.   
66d0: 20 63 61 73 65 20 53 52 54 5f 4f 75 74 70 75 74   case SRT_Output
66e0: 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61  : {.      testca
66f0: 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43  se( eDest==SRT_C
6700: 6f 72 6f 75 74 69 6e 65 20 29 3b 0a 20 20 20 20  oroutine );.    
6710: 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73    testcase( eDes
6720: 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 3b  t==SRT_Output );
6730: 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 64 65  .      if( pOrde
6740: 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 69  rBy ){.        i
6750: 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47  nt r1 = sqlite3G
6760: 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
6770: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
6780: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
6790: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72  OP_MakeRecord, r
67a0: 65 67 52 65 73 75 6c 74 2c 20 6e 43 6f 6c 75 6d  egResult, nColum
67b0: 6e 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20  n, r1);.        
67c0: 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70  pushOntoSorter(p
67d0: 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2c  Parse, pOrderBy,
67e0: 20 70 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20   p, r1);.       
67f0: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
6800: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
6810: 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  1);.      }else 
6820: 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43  if( eDest==SRT_C
6830: 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20  oroutine ){.    
6840: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
6850: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c  ddOp1(v, OP_Yiel
6860: 64 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72  d, pDest->iSDPar
6870: 6d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  m);.      }else{
6880: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
6890: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
68a0: 5f 52 65 73 75 6c 74 52 6f 77 2c 20 72 65 67 52  _ResultRow, regR
68b0: 65 73 75 6c 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b  esult, nColumn);
68c0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
68d0: 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74  ExprCacheAffinit
68e0: 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20  yChange(pParse, 
68f0: 72 65 67 52 65 73 75 6c 74 2c 20 6e 43 6f 6c 75  regResult, nColu
6900: 6d 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  mn);.      }.   
6910: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
6920: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
6930: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45  LITE_OMIT_TRIGGE
6940: 52 29 0a 20 20 20 20 2f 2a 20 44 69 73 63 61 72  R).    /* Discar
6950: 64 20 74 68 65 20 72 65 73 75 6c 74 73 2e 20 20  d the results.  
6960: 54 68 69 73 20 69 73 20 75 73 65 64 20 66 6f 72  This is used for
6970: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
6980: 74 73 20 69 6e 73 69 64 65 0a 20 20 20 20 2a 2a  ts inside.    **
6990: 20 74 68 65 20 62 6f 64 79 20 6f 66 20 61 20 54   the body of a T
69a0: 52 49 47 47 45 52 2e 20 20 54 68 65 20 70 75 72  RIGGER.  The pur
69b0: 70 6f 73 65 20 6f 66 20 73 75 63 68 20 73 65 6c  pose of such sel
69c0: 65 63 74 73 20 69 73 20 74 6f 20 63 61 6c 6c 0a  ects is to call.
69d0: 20 20 20 20 2a 2a 20 75 73 65 72 2d 64 65 66 69      ** user-defi
69e0: 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 74 68  ned functions th
69f0: 61 74 20 68 61 76 65 20 73 69 64 65 20 65 66 66  at have side eff
6a00: 65 63 74 73 2e 20 20 57 65 20 64 6f 20 6e 6f 74  ects.  We do not
6a10: 20 63 61 72 65 0a 20 20 20 20 2a 2a 20 61 62 6f   care.    ** abo
6a20: 75 74 20 74 68 65 20 61 63 74 75 61 6c 20 72 65  ut the actual re
6a30: 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73 65 6c  sults of the sel
6a40: 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ect..    */.    
6a50: 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
6a60: 20 61 73 73 65 72 74 28 20 65 44 65 73 74 3d 3d   assert( eDest==
6a70: 53 52 54 5f 44 69 73 63 61 72 64 20 29 3b 0a 20  SRT_Discard );. 
6a80: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
6a90: 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20  }.#endif.  }..  
6aa0: 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20 65  /* Jump to the e
6ab0: 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69  nd of the loop i
6ac0: 66 20 74 68 65 20 4c 49 4d 49 54 20 69 73 20 72  f the LIMIT is r
6ad0: 65 61 63 68 65 64 2e 20 20 45 78 63 65 70 74 2c  eached.  Except,
6ae0: 20 69 66 0a 20 20 2a 2a 20 74 68 65 72 65 20 69   if.  ** there i
6af0: 73 20 61 20 73 6f 72 74 65 72 2c 20 69 6e 20 77  s a sorter, in w
6b00: 68 69 63 68 20 63 61 73 65 20 74 68 65 20 73 6f  hich case the so
6b10: 72 74 65 72 20 68 61 73 20 61 6c 72 65 61 64 79  rter has already
6b20: 20 6c 69 6d 69 74 65 64 0a 20 20 2a 2a 20 74 68   limited.  ** th
6b30: 65 20 6f 75 74 70 75 74 20 66 6f 72 20 75 73 2e  e output for us.
6b40: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64  .  */.  if( pOrd
6b50: 65 72 42 79 3d 3d 30 20 26 26 20 70 2d 3e 69 4c  erBy==0 && p->iL
6b60: 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  imit ){.    sqli
6b70: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
6b80: 20 4f 50 5f 49 66 5a 65 72 6f 2c 20 70 2d 3e 69   OP_IfZero, p->i
6b90: 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b 2c 20 2d  Limit, iBreak, -
6ba0: 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  1);.  }.}../*.**
6bb0: 20 47 69 76 65 6e 20 61 6e 20 65 78 70 72 65 73   Given an expres
6bc0: 73 69 6f 6e 20 6c 69 73 74 2c 20 67 65 6e 65 72  sion list, gener
6bd0: 61 74 65 20 61 20 4b 65 79 49 6e 66 6f 20 73 74  ate a KeyInfo st
6be0: 72 75 63 74 75 72 65 20 74 68 61 74 20 72 65 63  ructure that rec
6bf0: 6f 72 64 73 0a 2a 2a 20 74 68 65 20 63 6f 6c 6c  ords.** the coll
6c00: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66  ating sequence f
6c10: 6f 72 20 65 61 63 68 20 65 78 70 72 65 73 73 69  or each expressi
6c20: 6f 6e 20 69 6e 20 74 68 61 74 20 65 78 70 72 65  on in that expre
6c30: 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a  ssion list..**.*
6c40: 2a 20 49 66 20 74 68 65 20 45 78 70 72 4c 69 73  * If the ExprLis
6c50: 74 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59  t is an ORDER BY
6c60: 20 6f 72 20 47 52 4f 55 50 20 42 59 20 63 6c 61   or GROUP BY cla
6c70: 75 73 65 20 74 68 65 6e 20 74 68 65 20 72 65 73  use then the res
6c80: 75 6c 74 69 6e 67 0a 2a 2a 20 4b 65 79 49 6e 66  ulting.** KeyInf
6c90: 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61  o structure is a
6ca0: 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 69  ppropriate for i
6cb0: 6e 69 74 69 61 6c 69 7a 69 6e 67 20 61 20 76 69  nitializing a vi
6cc0: 72 74 75 61 6c 20 69 6e 64 65 78 20 74 6f 0a 2a  rtual index to.*
6cd0: 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 61 74  * implement that
6ce0: 20 63 6c 61 75 73 65 2e 20 20 49 66 20 74 68 65   clause.  If the
6cf0: 20 45 78 70 72 4c 69 73 74 20 69 73 20 74 68 65   ExprList is the
6d00: 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 61   result set of a
6d10: 20 53 45 4c 45 43 54 0a 2a 2a 20 74 68 65 6e 20   SELECT.** then 
6d20: 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  the KeyInfo stru
6d30: 63 74 75 72 65 20 69 73 20 61 70 70 72 6f 70 72  cture is appropr
6d40: 69 61 74 65 20 66 6f 72 20 69 6e 69 74 69 61 6c  iate for initial
6d50: 69 7a 69 6e 67 20 61 20 76 69 72 74 75 61 6c 0a  izing a virtual.
6d60: 2a 2a 20 69 6e 64 65 78 20 74 6f 20 69 6d 70 6c  ** index to impl
6d70: 65 6d 65 6e 74 20 61 20 44 49 53 54 49 4e 43 54  ement a DISTINCT
6d80: 20 74 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 53 70 61   test..**.** Spa
6d90: 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 4b  ce to hold the K
6da0: 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
6db0: 20 69 73 20 6f 62 74 61 69 6e 20 66 72 6f 6d 20   is obtain from 
6dc0: 6d 61 6c 6c 6f 63 2e 20 20 54 68 65 20 63 61 6c  malloc.  The cal
6dd0: 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  ling.** function
6de0: 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20   is responsible 
6df0: 66 6f 72 20 73 65 65 69 6e 67 20 74 68 61 74 20  for seeing that 
6e00: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 69  this structure i
6e10: 73 20 65 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20  s eventually.** 
6e20: 66 72 65 65 64 2e 20 20 41 64 64 20 74 68 65 20  freed.  Add the 
6e30: 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
6e40: 65 20 74 6f 20 74 68 65 20 50 34 20 66 69 65 6c  e to the P4 fiel
6e50: 64 20 6f 66 20 61 6e 20 6f 70 63 6f 64 65 20 75  d of an opcode u
6e60: 73 69 6e 67 0a 2a 2a 20 50 34 5f 4b 45 59 49 4e  sing.** P4_KEYIN
6e70: 46 4f 5f 48 41 4e 44 4f 46 46 20 69 73 20 74 68  FO_HANDOFF is th
6e80: 65 20 75 73 75 61 6c 20 77 61 79 20 6f 66 20 64  e usual way of d
6e90: 65 61 6c 69 6e 67 20 77 69 74 68 20 74 68 69 73  ealing with this
6ea0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4b 65 79 49  ..*/.static KeyI
6eb0: 6e 66 6f 20 2a 6b 65 79 49 6e 66 6f 46 72 6f 6d  nfo *keyInfoFrom
6ec0: 45 78 70 72 4c 69 73 74 28 50 61 72 73 65 20 2a  ExprList(Parse *
6ed0: 70 50 61 72 73 65 2c 20 45 78 70 72 4c 69 73 74  pParse, ExprList
6ee0: 20 2a 70 4c 69 73 74 29 7b 0a 20 20 73 71 6c 69   *pList){.  sqli
6ef0: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
6f00: 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 6e 45 78 70  ->db;.  int nExp
6f10: 72 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 49  r;.  KeyInfo *pI
6f20: 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74 20 45 78  nfo;.  struct Ex
6f30: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
6f40: 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20  em;.  int i;..  
6f50: 6e 45 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 6e  nExpr = pList->n
6f60: 45 78 70 72 3b 0a 20 20 70 49 6e 66 6f 20 3d 20  Expr;.  pInfo = 
6f70: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
6f80: 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a  ero(db, sizeof(*
6f90: 70 49 6e 66 6f 29 20 2b 20 6e 45 78 70 72 2a 28  pInfo) + nExpr*(
6fa0: 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29  sizeof(CollSeq*)
6fb0: 2b 31 29 20 29 3b 0a 20 20 69 66 28 20 70 49 6e  +1) );.  if( pIn
6fc0: 66 6f 20 29 7b 0a 20 20 20 20 70 49 6e 66 6f 2d  fo ){.    pInfo-
6fd0: 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75  >aSortOrder = (u
6fe0: 38 2a 29 26 70 49 6e 66 6f 2d 3e 61 43 6f 6c 6c  8*)&pInfo->aColl
6ff0: 5b 6e 45 78 70 72 5d 3b 0a 20 20 20 20 70 49 6e  [nExpr];.    pIn
7000: 66 6f 2d 3e 6e 46 69 65 6c 64 20 3d 20 28 75 31  fo->nField = (u1
7010: 36 29 6e 45 78 70 72 3b 0a 20 20 20 20 70 49 6e  6)nExpr;.    pIn
7020: 66 6f 2d 3e 65 6e 63 20 3d 20 45 4e 43 28 64 62  fo->enc = ENC(db
7030: 29 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 64 62  );.    pInfo->db
7040: 20 3d 20 64 62 3b 0a 20 20 20 20 66 6f 72 28 69   = db;.    for(i
7050: 3d 30 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d  =0, pItem=pList-
7060: 3e 61 3b 20 69 3c 6e 45 78 70 72 3b 20 69 2b 2b  >a; i<nExpr; i++
7070: 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
7080: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
7090: 3b 0a 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20  ;.      pColl = 
70a0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
70b0: 65 71 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d  eq(pParse, pItem
70c0: 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ->pExpr);.      
70d0: 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20  if( !pColl ){.  
70e0: 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 64 62        pColl = db
70f0: 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20  ->pDfltColl;.   
7100: 20 20 20 7d 0a 20 20 20 20 20 20 70 49 6e 66 6f     }.      pInfo
7110: 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 70 43 6f  ->aColl[i] = pCo
7120: 6c 6c 3b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d  ll;.      pInfo-
7130: 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d  >aSortOrder[i] =
7140: 20 70 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65   pItem->sortOrde
7150: 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  r;.    }.  }.  r
7160: 65 74 75 72 6e 20 70 49 6e 66 6f 3b 0a 7d 0a 0a  eturn pInfo;.}..
7170: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
7180: 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
7190: 45 43 54 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65 20 6f  ECT./*.** Name o
71a0: 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  f the connection
71b0: 20 6f 70 65 72 61 74 6f 72 2c 20 75 73 65 64 20   operator, used 
71c0: 66 6f 72 20 65 72 72 6f 72 20 6d 65 73 73 61 67  for error messag
71d0: 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  es..*/.static co
71e0: 6e 73 74 20 63 68 61 72 20 2a 73 65 6c 65 63 74  nst char *select
71f0: 4f 70 4e 61 6d 65 28 69 6e 74 20 69 64 29 7b 0a  OpName(int id){.
7200: 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 73 77 69    char *z;.  swi
7210: 74 63 68 28 20 69 64 20 29 7b 0a 20 20 20 20 63  tch( id ){.    c
7220: 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 20 20 20 20  ase TK_ALL:     
7230: 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 20 41 4c 4c    z = "UNION ALL
7240: 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ";   break;.    
7250: 63 61 73 65 20 54 4b 5f 49 4e 54 45 52 53 45 43  case TK_INTERSEC
7260: 54 3a 20 7a 20 3d 20 22 49 4e 54 45 52 53 45 43  T: z = "INTERSEC
7270: 54 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  T";   break;.   
7280: 20 63 61 73 65 20 54 4b 5f 45 58 43 45 50 54 3a   case TK_EXCEPT:
7290: 20 20 20 20 7a 20 3d 20 22 45 58 43 45 50 54 22      z = "EXCEPT"
72a0: 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ;      break;.  
72b0: 20 20 64 65 66 61 75 6c 74 3a 20 20 20 20 20 20    default:      
72c0: 20 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 22       z = "UNION"
72d0: 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;       break;. 
72e0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d   }.  return z;.}
72f0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
7300: 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
7310: 53 45 4c 45 43 54 20 2a 2f 0a 0a 23 69 66 6e 64  SELECT */..#ifnd
7320: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  ef SQLITE_OMIT_E
7330: 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 55 6e 6c  XPLAIN./*.** Unl
7340: 65 73 73 20 61 6e 20 22 45 58 50 4c 41 49 4e 20  ess an "EXPLAIN 
7350: 51 55 45 52 59 20 50 4c 41 4e 22 20 63 6f 6d 6d  QUERY PLAN" comm
7360: 61 6e 64 20 69 73 20 62 65 69 6e 67 20 70 72 6f  and is being pro
7370: 63 65 73 73 65 64 2c 20 74 68 69 73 20 66 75 6e  cessed, this fun
7380: 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 61 20 6e 6f  ction.** is a no
7390: 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  -op. Otherwise, 
73a0: 69 74 20 61 64 64 73 20 61 20 73 69 6e 67 6c 65  it adds a single
73b0: 20 72 6f 77 20 6f 66 20 6f 75 74 70 75 74 20 74   row of output t
73c0: 6f 20 74 68 65 20 45 51 50 20 72 65 73 75 6c 74  o the EQP result
73d0: 2c 0a 2a 2a 20 77 68 65 72 65 20 74 68 65 20 63  ,.** where the c
73e0: 61 70 74 69 6f 6e 20 69 73 20 6f 66 20 74 68 65  aption is of the
73f0: 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 22   form:.**.**   "
7400: 55 53 45 20 54 45 4d 50 20 42 2d 54 52 45 45 20  USE TEMP B-TREE 
7410: 46 4f 52 20 78 78 78 22 0a 2a 2a 0a 2a 2a 20 77  FOR xxx".**.** w
7420: 68 65 72 65 20 78 78 78 20 69 73 20 6f 6e 65 20  here xxx is one 
7430: 6f 66 20 22 44 49 53 54 49 4e 43 54 22 2c 20 22  of "DISTINCT", "
7440: 4f 52 44 45 52 20 42 59 22 20 6f 72 20 22 47 52  ORDER BY" or "GR
7450: 4f 55 50 20 42 59 22 2e 20 45 78 61 63 74 6c 79  OUP BY". Exactly
7460: 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 64 65 74   which.** is det
7470: 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 7a  ermined by the z
7480: 55 73 61 67 65 20 61 72 67 75 6d 65 6e 74 2e 0a  Usage argument..
7490: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
74a0: 78 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65 28  xplainTempTable(
74b0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63  Parse *pParse, c
74c0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 73 61 67  onst char *zUsag
74d0: 65 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65  e){.  if( pParse
74e0: 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a  ->explain==2 ){.
74f0: 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50      Vdbe *v = pP
7500: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 20  arse->pVdbe;.   
7510: 20 63 68 61 72 20 2a 7a 4d 73 67 20 3d 20 73 71   char *zMsg = sq
7520: 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 70 50 61  lite3MPrintf(pPa
7530: 72 73 65 2d 3e 64 62 2c 20 22 55 53 45 20 54 45  rse->db, "USE TE
7540: 4d 50 20 42 2d 54 52 45 45 20 46 4f 52 20 25 73  MP B-TREE FOR %s
7550: 22 2c 20 7a 55 73 61 67 65 29 3b 0a 20 20 20 20  ", zUsage);.    
7560: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
7570: 34 28 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c  4(v, OP_Explain,
7580: 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74   pParse->iSelect
7590: 49 64 2c 20 30 2c 20 30 2c 20 7a 4d 73 67 2c 20  Id, 0, 0, zMsg, 
75a0: 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d  P4_DYNAMIC);.  }
75b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e  .}../*.** Assign
75c0: 20 65 78 70 72 65 73 73 69 6f 6e 20 62 20 74 6f   expression b to
75d0: 20 6c 76 61 6c 75 65 20 61 2e 20 41 20 73 65 63   lvalue a. A sec
75e0: 6f 6e 64 2c 20 6e 6f 2d 6f 70 2c 20 76 65 72 73  ond, no-op, vers
75f0: 69 6f 6e 20 6f 66 20 74 68 69 73 20 6d 61 63 72  ion of this macr
7600: 6f 0a 2a 2a 20 69 73 20 70 72 6f 76 69 64 65 64  o.** is provided
7610: 20 77 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4d 49   when SQLITE_OMI
7620: 54 5f 45 58 50 4c 41 49 4e 20 69 73 20 64 65 66  T_EXPLAIN is def
7630: 69 6e 65 64 2e 20 54 68 69 73 20 61 6c 6c 6f 77  ined. This allow
7640: 73 20 74 68 65 20 63 6f 64 65 0a 2a 2a 20 69 6e  s the code.** in
7650: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29   sqlite3Select()
7660: 20 74 6f 20 61 73 73 69 67 6e 20 76 61 6c 75 65   to assign value
7670: 73 20 74 6f 20 73 74 72 75 63 74 75 72 65 20 6d  s to structure m
7680: 65 6d 62 65 72 20 76 61 72 69 61 62 6c 65 73 20  ember variables 
7690: 74 68 61 74 0a 2a 2a 20 6f 6e 6c 79 20 65 78 69  that.** only exi
76a0: 73 74 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49  st if SQLITE_OMI
76b0: 54 5f 45 58 50 4c 41 49 4e 20 69 73 20 6e 6f 74  T_EXPLAIN is not
76c0: 20 64 65 66 69 6e 65 64 20 77 69 74 68 6f 75 74   defined without
76d0: 20 70 6f 6c 6c 75 74 69 6e 67 20 74 68 65 0a 2a   polluting the.*
76e0: 2a 20 63 6f 64 65 20 77 69 74 68 20 23 69 66 6e  * code with #ifn
76f0: 64 65 66 20 64 69 72 65 63 74 69 76 65 73 2e 0a  def directives..
7700: 2a 2f 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c  */.# define expl
7710: 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 61 2c  ainSetInteger(a,
7720: 20 62 29 20 61 20 3d 20 62 0a 0a 23 65 6c 73 65   b) a = b..#else
7730: 0a 2f 2a 20 4e 6f 2d 6f 70 20 76 65 72 73 69 6f  ./* No-op versio
7740: 6e 73 20 6f 66 20 74 68 65 20 65 78 70 6c 61 69  ns of the explai
7750: 6e 58 58 58 28 29 20 66 75 6e 63 74 69 6f 6e 73  nXXX() functions
7760: 20 61 6e 64 20 6d 61 63 72 6f 73 2e 20 2a 2f 0a   and macros. */.
7770: 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69 6e  # define explain
7780: 54 65 6d 70 54 61 62 6c 65 28 79 2c 7a 29 0a 23  TempTable(y,z).#
7790: 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69 6e 53   define explainS
77a0: 65 74 49 6e 74 65 67 65 72 28 79 2c 7a 29 0a 23  etInteger(y,z).#
77b0: 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69  endif..#if !defi
77c0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
77d0: 45 58 50 4c 41 49 4e 29 20 26 26 20 21 64 65 66  EXPLAIN) && !def
77e0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
77f0: 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
7800: 29 0a 2f 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 61  )./*.** Unless a
7810: 6e 20 22 45 58 50 4c 41 49 4e 20 51 55 45 52 59  n "EXPLAIN QUERY
7820: 20 50 4c 41 4e 22 20 63 6f 6d 6d 61 6e 64 20 69   PLAN" command i
7830: 73 20 62 65 69 6e 67 20 70 72 6f 63 65 73 73 65  s being processe
7840: 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  d, this function
7850: 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20  .** is a no-op. 
7860: 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 61 64  Otherwise, it ad
7870: 64 73 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20  ds a single row 
7880: 6f 66 20 6f 75 74 70 75 74 20 74 6f 20 74 68 65  of output to the
7890: 20 45 51 50 20 72 65 73 75 6c 74 2c 0a 2a 2a 20   EQP result,.** 
78a0: 77 68 65 72 65 20 74 68 65 20 63 61 70 74 69 6f  where the captio
78b0: 6e 20 69 73 20 6f 66 20 6f 6e 65 20 6f 66 20 74  n is of one of t
78c0: 68 65 20 74 77 6f 20 66 6f 72 6d 73 3a 0a 2a 2a  he two forms:.**
78d0: 0a 2a 2a 20 20 20 22 43 4f 4d 50 4f 53 49 54 45  .**   "COMPOSITE
78e0: 20 53 55 42 51 55 45 52 49 45 53 20 69 53 75 62   SUBQUERIES iSub
78f0: 31 20 61 6e 64 20 69 53 75 62 32 20 28 6f 70 29  1 and iSub2 (op)
7900: 22 0a 2a 2a 20 20 20 22 43 4f 4d 50 4f 53 49 54  ".**   "COMPOSIT
7910: 45 20 53 55 42 51 55 45 52 49 45 53 20 69 53 75  E SUBQUERIES iSu
7920: 62 31 20 61 6e 64 20 69 53 75 62 32 20 55 53 49  b1 and iSub2 USI
7930: 4e 47 20 54 45 4d 50 20 42 2d 54 52 45 45 20 28  NG TEMP B-TREE (
7940: 6f 70 29 22 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65  op)".**.** where
7950: 20 69 53 75 62 31 20 61 6e 64 20 69 53 75 62 32   iSub1 and iSub2
7960: 20 61 72 65 20 74 68 65 20 69 6e 74 65 67 65 72   are the integer
7970: 73 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  s passed as the 
7980: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a  corresponding.**
7990: 20 66 75 6e 63 74 69 6f 6e 20 70 61 72 61 6d 65   function parame
79a0: 74 65 72 73 2c 20 61 6e 64 20 6f 70 20 69 73 20  ters, and op is 
79b0: 74 68 65 20 74 65 78 74 20 72 65 70 72 65 73 65  the text represe
79c0: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 70  ntation of the p
79d0: 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 66 20 74  arameter.** of t
79e0: 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20 54 68  he same name. Th
79f0: 65 20 70 61 72 61 6d 65 74 65 72 20 22 6f 70 22  e parameter "op"
7a00: 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66 20   must be one of 
7a10: 54 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f 45 58 43  TK_UNION, TK_EXC
7a20: 45 50 54 2c 0a 2a 2a 20 54 4b 5f 49 4e 54 45 52  EPT,.** TK_INTER
7a30: 53 45 43 54 20 6f 72 20 54 4b 5f 41 4c 4c 2e 20  SECT or TK_ALL. 
7a40: 54 68 65 20 66 69 72 73 74 20 66 6f 72 6d 20 69  The first form i
7a50: 73 20 75 73 65 64 20 69 66 20 61 72 67 75 6d 65  s used if argume
7a60: 6e 74 20 62 55 73 65 54 6d 70 20 69 73 20 0a 2a  nt bUseTmp is .*
7a70: 2a 20 66 61 6c 73 65 2c 20 6f 72 20 74 68 65 20  * false, or the 
7a80: 73 65 63 6f 6e 64 20 66 6f 72 6d 20 69 66 20 69  second form if i
7a90: 74 20 69 73 20 74 72 75 65 2e 0a 2a 2f 0a 73 74  t is true..*/.st
7aa0: 61 74 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69  atic void explai
7ab0: 6e 43 6f 6d 70 6f 73 69 74 65 28 0a 20 20 50 61  nComposite(.  Pa
7ac0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
7ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7ae0: 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a   Parse context *
7af0: 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20  /.  int op,     
7b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7b10: 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 54 4b      /* One of TK
7b20: 5f 55 4e 49 4f 4e 2c 20 54 4b 5f 45 58 43 45 50  _UNION, TK_EXCEP
7b30: 54 20 65 74 63 2e 20 2a 2f 0a 20 20 69 6e 74 20  T etc. */.  int 
7b40: 69 53 75 62 31 2c 20 20 20 20 20 20 20 20 20 20  iSub1,          
7b50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
7b60: 75 62 71 75 65 72 79 20 69 64 20 31 20 2a 2f 0a  ubquery id 1 */.
7b70: 20 20 69 6e 74 20 69 53 75 62 32 2c 20 20 20 20    int iSub2,    
7b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7b90: 20 20 2f 2a 20 53 75 62 71 75 65 72 79 20 69 64    /* Subquery id
7ba0: 20 32 20 2a 2f 0a 20 20 69 6e 74 20 62 55 73 65   2 */.  int bUse
7bb0: 54 6d 70 20 20 20 20 20 20 20 20 20 20 20 20 20  Tmp             
7bc0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
7bd0: 69 66 20 61 20 74 65 6d 70 20 74 61 62 6c 65 20  if a temp table 
7be0: 77 61 73 20 75 73 65 64 20 2a 2f 0a 29 7b 0a 20  was used */.){. 
7bf0: 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 54 4b 5f   assert( op==TK_
7c00: 55 4e 49 4f 4e 20 7c 7c 20 6f 70 3d 3d 54 4b 5f  UNION || op==TK_
7c10: 45 58 43 45 50 54 20 7c 7c 20 6f 70 3d 3d 54 4b  EXCEPT || op==TK
7c20: 5f 49 4e 54 45 52 53 45 43 54 20 7c 7c 20 6f 70  _INTERSECT || op
7c30: 3d 3d 54 4b 5f 41 4c 4c 20 29 3b 0a 20 20 69 66  ==TK_ALL );.  if
7c40: 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69  ( pParse->explai
7c50: 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 56 64 62 65  n==2 ){.    Vdbe
7c60: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
7c70: 64 62 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  dbe;.    char *z
7c80: 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  Msg = sqlite3MPr
7c90: 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 70 50  intf(.        pP
7ca0: 61 72 73 65 2d 3e 64 62 2c 20 22 43 4f 4d 50 4f  arse->db, "COMPO
7cb0: 55 4e 44 20 53 55 42 51 55 45 52 49 45 53 20 25  UND SUBQUERIES %
7cc0: 64 20 41 4e 44 20 25 64 20 25 73 28 25 73 29 22  d AND %d %s(%s)"
7cd0: 2c 20 69 53 75 62 31 2c 20 69 53 75 62 32 2c 0a  , iSub1, iSub2,.
7ce0: 20 20 20 20 20 20 20 20 62 55 73 65 54 6d 70 3f          bUseTmp?
7cf0: 22 55 53 49 4e 47 20 54 45 4d 50 20 42 2d 54 52  "USING TEMP B-TR
7d00: 45 45 20 22 3a 22 22 2c 20 73 65 6c 65 63 74 4f  EE ":"", selectO
7d10: 70 4e 61 6d 65 28 6f 70 29 0a 20 20 20 20 29 3b  pName(op).    );
7d20: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
7d30: 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45 78 70  AddOp4(v, OP_Exp
7d40: 6c 61 69 6e 2c 20 70 50 61 72 73 65 2d 3e 69 53  lain, pParse->iS
7d50: 65 6c 65 63 74 49 64 2c 20 30 2c 20 30 2c 20 7a  electId, 0, 0, z
7d60: 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29  Msg, P4_DYNAMIC)
7d70: 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 2f 2a  ;.  }.}.#else./*
7d80: 20 4e 6f 2d 6f 70 20 76 65 72 73 69 6f 6e 73 20   No-op versions 
7d90: 6f 66 20 74 68 65 20 65 78 70 6c 61 69 6e 58 58  of the explainXX
7da0: 58 28 29 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e  X() functions an
7db0: 64 20 6d 61 63 72 6f 73 2e 20 2a 2f 0a 23 20 64  d macros. */.# d
7dc0: 65 66 69 6e 65 20 65 78 70 6c 61 69 6e 43 6f 6d  efine explainCom
7dd0: 70 6f 73 69 74 65 28 76 2c 77 2c 78 2c 79 2c 7a  posite(v,w,x,y,z
7de0: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
7df0: 49 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f  If the inner loo
7e00: 70 20 77 61 73 20 67 65 6e 65 72 61 74 65 64 20  p was generated 
7e10: 75 73 69 6e 67 20 61 20 6e 6f 6e 2d 6e 75 6c 6c  using a non-null
7e20: 20 70 4f 72 64 65 72 42 79 20 61 72 67 75 6d 65   pOrderBy argume
7e30: 6e 74 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20  nt,.** then the 
7e40: 72 65 73 75 6c 74 73 20 77 65 72 65 20 70 6c 61  results were pla
7e50: 63 65 64 20 69 6e 20 61 20 73 6f 72 74 65 72 2e  ced in a sorter.
7e60: 20 20 41 66 74 65 72 20 74 68 65 20 6c 6f 6f 70    After the loop
7e70: 20 69 73 20 74 65 72 6d 69 6e 61 74 65 64 0a 2a   is terminated.*
7e80: 2a 20 77 65 20 6e 65 65 64 20 74 6f 20 72 75 6e  * we need to run
7e90: 20 74 68 65 20 73 6f 72 74 65 72 20 61 6e 64 20   the sorter and 
7ea0: 6f 75 74 70 75 74 20 74 68 65 20 72 65 73 75 6c  output the resul
7eb0: 74 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  ts.  The followi
7ec0: 6e 67 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67 65  ng.** routine ge
7ed0: 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f 64 65  nerates the code
7ee0: 20 6e 65 65 64 65 64 20 74 6f 20 64 6f 20 74 68   needed to do th
7ef0: 61 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  at..*/.static vo
7f00: 69 64 20 67 65 6e 65 72 61 74 65 53 6f 72 74 54  id generateSortT
7f10: 61 69 6c 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ail(.  Parse *pP
7f20: 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73  arse,    /* Pars
7f30: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
7f40: 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
7f50: 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54     /* The SELECT
7f60: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
7f70: 56 64 62 65 20 2a 76 2c 20 20 20 20 20 20 20 20  Vdbe *v,        
7f80: 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
7f90: 64 65 20 69 6e 74 6f 20 74 68 69 73 20 56 44 42  de into this VDB
7fa0: 45 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 75  E */.  int nColu
7fb0: 6d 6e 2c 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62  mn,      /* Numb
7fc0: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 6f 66  er of columns of
7fd0: 20 64 61 74 61 20 2a 2f 0a 20 20 53 65 6c 65 63   data */.  Selec
7fe0: 74 44 65 73 74 20 2a 70 44 65 73 74 20 2f 2a 20  tDest *pDest /* 
7ff0: 57 72 69 74 65 20 74 68 65 20 73 6f 72 74 65 64  Write the sorted
8000: 20 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f   results here */
8010: 0a 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 42 72  .){.  int addrBr
8020: 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62  eak = sqlite3Vdb
8030: 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 20 20  eMakeLabel(v);  
8040: 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
8050: 74 6f 20 65 78 69 74 20 6c 6f 6f 70 20 2a 2f 0a  to exit loop */.
8060: 20 20 69 6e 74 20 61 64 64 72 43 6f 6e 74 69 6e    int addrContin
8070: 75 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ue = sqlite3Vdbe
8080: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 20 20 2f  MakeLabel(v);  /
8090: 2a 20 4a 75 6d 70 20 68 65 72 65 20 66 6f 72 20  * Jump here for 
80a0: 6e 65 78 74 20 63 79 63 6c 65 20 2a 2f 0a 20 20  next cycle */.  
80b0: 69 6e 74 20 61 64 64 72 3b 0a 20 20 69 6e 74 20  int addr;.  int 
80c0: 69 54 61 62 3b 0a 20 20 69 6e 74 20 70 73 65 75  iTab;.  int pseu
80d0: 64 6f 54 61 62 20 3d 20 30 3b 0a 20 20 45 78 70  doTab = 0;.  Exp
80e0: 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20  rList *pOrderBy 
80f0: 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 0a  = p->pOrderBy;..
8100: 20 20 69 6e 74 20 65 44 65 73 74 20 3d 20 70 44    int eDest = pD
8110: 65 73 74 2d 3e 65 44 65 73 74 3b 0a 20 20 69 6e  est->eDest;.  in
8120: 74 20 69 50 61 72 6d 20 3d 20 70 44 65 73 74 2d  t iParm = pDest-
8130: 3e 69 53 44 50 61 72 6d 3b 0a 0a 20 20 69 6e 74  >iSDParm;..  int
8140: 20 72 65 67 52 6f 77 3b 0a 20 20 69 6e 74 20 72   regRow;.  int r
8150: 65 67 52 6f 77 69 64 3b 0a 0a 20 20 69 54 61 62  egRowid;..  iTab
8160: 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43   = pOrderBy->iEC
8170: 75 72 73 6f 72 3b 0a 20 20 72 65 67 52 6f 77 20  ursor;.  regRow 
8180: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
8190: 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 69  Reg(pParse);.  i
81a0: 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75  f( eDest==SRT_Ou
81b0: 74 70 75 74 20 7c 7c 20 65 44 65 73 74 3d 3d 53  tput || eDest==S
81c0: 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a  RT_Coroutine ){.
81d0: 20 20 20 20 70 73 65 75 64 6f 54 61 62 20 3d 20      pseudoTab = 
81e0: 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
81f0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
8200: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp3(v, OP_Open
8210: 50 73 65 75 64 6f 2c 20 70 73 65 75 64 6f 54 61  Pseudo, pseudoTa
8220: 62 2c 20 72 65 67 52 6f 77 2c 20 6e 43 6f 6c 75  b, regRow, nColu
8230: 6d 6e 29 3b 0a 20 20 20 20 72 65 67 52 6f 77 69  mn);.    regRowi
8240: 64 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  d = 0;.  }else{.
8250: 20 20 20 20 72 65 67 52 6f 77 69 64 20 3d 20 73      regRowid = s
8260: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
8270: 28 70 50 61 72 73 65 29 3b 0a 20 20 7d 0a 20 20  (pParse);.  }.  
8280: 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  if( p->selFlags 
8290: 26 20 53 46 5f 55 73 65 53 6f 72 74 65 72 20 29  & SF_UseSorter )
82a0: 7b 0a 20 20 20 20 69 6e 74 20 72 65 67 53 6f 72  {.    int regSor
82b0: 74 4f 75 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d  tOut = ++pParse-
82c0: 3e 6e 4d 65 6d 3b 0a 20 20 20 20 69 6e 74 20 70  >nMem;.    int p
82d0: 74 61 62 32 20 3d 20 70 50 61 72 73 65 2d 3e 6e  tab2 = pParse->n
82e0: 54 61 62 2b 2b 3b 0a 20 20 20 20 73 71 6c 69 74  Tab++;.    sqlit
82f0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
8300: 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f 2c 20 70  OP_OpenPseudo, p
8310: 74 61 62 32 2c 20 72 65 67 53 6f 72 74 4f 75 74  tab2, regSortOut
8320: 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  , pOrderBy->nExp
8330: 72 2b 32 29 3b 0a 20 20 20 20 61 64 64 72 20 3d  r+2);.    addr =
8340: 20 31 20 2b 20 73 71 6c 69 74 65 33 56 64 62 65   1 + sqlite3Vdbe
8350: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72  AddOp2(v, OP_Sor
8360: 74 65 72 53 6f 72 74 2c 20 69 54 61 62 2c 20 61  terSort, iTab, a
8370: 64 64 72 42 72 65 61 6b 29 3b 0a 20 20 20 20 63  ddrBreak);.    c
8380: 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2c 20  odeOffset(v, p, 
8390: 61 64 64 72 43 6f 6e 74 69 6e 75 65 29 3b 0a 20  addrContinue);. 
83a0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
83b0: 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65  dOp2(v, OP_Sorte
83c0: 72 44 61 74 61 2c 20 69 54 61 62 2c 20 72 65 67  rData, iTab, reg
83d0: 53 6f 72 74 4f 75 74 29 3b 0a 20 20 20 20 73 71  SortOut);.    sq
83e0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
83f0: 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 74  v, OP_Column, pt
8400: 61 62 32 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e  ab2, pOrderBy->n
8410: 45 78 70 72 2b 31 2c 20 72 65 67 52 6f 77 29 3b  Expr+1, regRow);
8420: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
8430: 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
8440: 41 47 5f 43 4c 45 41 52 43 41 43 48 45 29 3b 0a  AG_CLEARCACHE);.
8450: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 64 64    }else{.    add
8460: 72 20 3d 20 31 20 2b 20 73 71 6c 69 74 65 33 56  r = 1 + sqlite3V
8470: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
8480: 53 6f 72 74 2c 20 69 54 61 62 2c 20 61 64 64 72  Sort, iTab, addr
8490: 42 72 65 61 6b 29 3b 0a 20 20 20 20 63 6f 64 65  Break);.    code
84a0: 4f 66 66 73 65 74 28 76 2c 20 70 2c 20 61 64 64  Offset(v, p, add
84b0: 72 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20  rContinue);.    
84c0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
84d0: 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  3(v, OP_Column, 
84e0: 69 54 61 62 2c 20 70 4f 72 64 65 72 42 79 2d 3e  iTab, pOrderBy->
84f0: 6e 45 78 70 72 2b 31 2c 20 72 65 67 52 6f 77 29  nExpr+1, regRow)
8500: 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63 68 28 20  ;.  }.  switch( 
8510: 65 44 65 73 74 20 29 7b 0a 20 20 20 20 63 61 73  eDest ){.    cas
8520: 65 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20  e SRT_Table:.   
8530: 20 63 61 73 65 20 53 52 54 5f 45 70 68 65 6d 54   case SRT_EphemT
8540: 61 62 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74  ab: {.      test
8550: 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54  case( eDest==SRT
8560: 5f 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 20 20  _Table );.      
8570: 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d  testcase( eDest=
8580: 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29 3b  =SRT_EphemTab );
8590: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
85a0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
85b0: 65 77 52 6f 77 69 64 2c 20 69 50 61 72 6d 2c 20  ewRowid, iParm, 
85c0: 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  regRowid);.     
85d0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
85e0: 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c  p3(v, OP_Insert,
85f0: 20 69 50 61 72 6d 2c 20 72 65 67 52 6f 77 2c 20   iParm, regRow, 
8600: 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  regRowid);.     
8610: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
8620: 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41  geP5(v, OPFLAG_A
8630: 50 50 45 4e 44 29 3b 0a 20 20 20 20 20 20 62 72  PPEND);.      br
8640: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  eak;.    }.#ifnd
8650: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
8660: 55 42 51 55 45 52 59 0a 20 20 20 20 63 61 73 65  UBQUERY.    case
8670: 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20   SRT_Set: {.    
8680: 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d    assert( nColum
8690: 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71  n==1 );.      sq
86a0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
86b0: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
86c0: 2c 20 72 65 67 52 6f 77 2c 20 31 2c 20 72 65 67  , regRow, 1, reg
86d0: 52 6f 77 69 64 2c 0a 20 20 20 20 20 20 20 20 20  Rowid,.         
86e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
86f0: 70 44 65 73 74 2d 3e 61 66 66 53 64 73 74 2c 20  pDest->affSdst, 
8700: 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
8710: 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69  3ExprCacheAffini
8720: 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c  tyChange(pParse,
8730: 20 72 65 67 52 6f 77 2c 20 31 29 3b 0a 20 20 20   regRow, 1);.   
8740: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
8750: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e  dOp2(v, OP_IdxIn
8760: 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 65 67  sert, iParm, reg
8770: 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 62 72  Rowid);.      br
8780: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
8790: 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20  ase SRT_Mem: {. 
87a0: 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f       assert( nCo
87b0: 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20  lumn==1 );.     
87c0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
87d0: 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 72 65 67  Move(pParse, reg
87e0: 52 6f 77 2c 20 69 50 61 72 6d 2c 20 31 29 3b 0a  Row, iParm, 1);.
87f0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d        /* The LIM
8800: 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 74  IT clause will t
8810: 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f  erminate the loo
8820: 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20  p for us */.    
8830: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
8840: 65 6e 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c  endif.    defaul
8850: 74 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  t: {.      int i
8860: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
8870: 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75  eDest==SRT_Outpu
8880: 74 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f  t || eDest==SRT_
8890: 43 6f 72 6f 75 74 69 6e 65 20 29 3b 20 0a 20 20  Coroutine ); .  
88a0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44      testcase( eD
88b0: 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20  est==SRT_Output 
88c0: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
88d0: 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f  e( eDest==SRT_Co
88e0: 72 6f 75 74 69 6e 65 20 29 3b 0a 20 20 20 20 20  routine );.     
88f0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c   for(i=0; i<nCol
8900: 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  umn; i++){.     
8910: 20 20 20 61 73 73 65 72 74 28 20 72 65 67 52 6f     assert( regRo
8920: 77 21 3d 70 44 65 73 74 2d 3e 69 53 64 73 74 2b  w!=pDest->iSdst+
8930: 69 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  i );.        sql
8940: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
8950: 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 73 65  , OP_Column, pse
8960: 75 64 6f 54 61 62 2c 20 69 2c 20 70 44 65 73 74  udoTab, i, pDest
8970: 2d 3e 69 53 64 73 74 2b 69 29 3b 0a 20 20 20 20  ->iSdst+i);.    
8980: 20 20 20 20 69 66 28 20 69 3d 3d 30 20 29 7b 0a      if( i==0 ){.
8990: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
89a0: 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
89b0: 20 4f 50 46 4c 41 47 5f 43 4c 45 41 52 43 41 43   OPFLAG_CLEARCAC
89c0: 48 45 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  HE);.        }. 
89d0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
89e0: 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70   eDest==SRT_Outp
89f0: 75 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ut ){.        sq
8a00: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
8a10: 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c  v, OP_ResultRow,
8a20: 20 70 44 65 73 74 2d 3e 69 53 64 73 74 2c 20 6e   pDest->iSdst, n
8a30: 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20  Column);.       
8a40: 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
8a50: 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  eAffinityChange(
8a60: 70 50 61 72 73 65 2c 20 70 44 65 73 74 2d 3e 69  pParse, pDest->i
8a70: 53 64 73 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a  Sdst, nColumn);.
8a80: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
8a90: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
8aa0: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65  AddOp1(v, OP_Yie
8ab0: 6c 64 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61  ld, pDest->iSDPa
8ac0: 72 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rm);.      }.   
8ad0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
8ae0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c    }.  sqlite3Rel
8af0: 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
8b00: 73 65 2c 20 72 65 67 52 6f 77 29 3b 0a 20 20 73  se, regRow);.  s
8b10: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
8b20: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
8b30: 52 6f 77 69 64 29 3b 0a 0a 20 20 2f 2a 20 54 68  Rowid);..  /* Th
8b40: 65 20 62 6f 74 74 6f 6d 20 6f 66 20 74 68 65 20  e bottom of the 
8b50: 6c 6f 6f 70 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  loop.  */.  sqli
8b60: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
8b70: 62 65 6c 28 76 2c 20 61 64 64 72 43 6f 6e 74 69  bel(v, addrConti
8b80: 6e 75 65 29 3b 0a 20 20 69 66 28 20 70 2d 3e 73  nue);.  if( p->s
8b90: 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 55 73 65  elFlags & SF_Use
8ba0: 53 6f 72 74 65 72 20 29 7b 0a 20 20 20 20 73 71  Sorter ){.    sq
8bb0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
8bc0: 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4e 65 78 74  v, OP_SorterNext
8bd0: 2c 20 69 54 61 62 2c 20 61 64 64 72 29 3b 0a 20  , iTab, addr);. 
8be0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
8bf0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
8c00: 20 4f 50 5f 4e 65 78 74 2c 20 69 54 61 62 2c 20   OP_Next, iTab, 
8c10: 61 64 64 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  addr);.  }.  sql
8c20: 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
8c30: 61 62 65 6c 28 76 2c 20 61 64 64 72 42 72 65 61  abel(v, addrBrea
8c40: 6b 29 3b 0a 20 20 69 66 28 20 65 44 65 73 74 3d  k);.  if( eDest=
8c50: 3d 53 52 54 5f 4f 75 74 70 75 74 20 7c 7c 20 65  =SRT_Output || e
8c60: 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74  Dest==SRT_Corout
8c70: 69 6e 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ine ){.    sqlit
8c80: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
8c90: 4f 50 5f 43 6c 6f 73 65 2c 20 70 73 65 75 64 6f  OP_Close, pseudo
8ca0: 54 61 62 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a  Tab, 0);.  }.}..
8cb0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  /*.** Return a p
8cc0: 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74 72 69  ointer to a stri
8cd0: 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ng containing th
8ce0: 65 20 27 64 65 63 6c 61 72 61 74 69 6f 6e 20 74  e 'declaration t
8cf0: 79 70 65 27 20 6f 66 20 74 68 65 0a 2a 2a 20 65  ype' of the.** e
8d00: 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e  xpression pExpr.
8d10: 20 54 68 65 20 73 74 72 69 6e 67 20 6d 61 79 20   The string may 
8d20: 62 65 20 74 72 65 61 74 65 64 20 61 73 20 73 74  be treated as st
8d30: 61 74 69 63 20 62 79 20 74 68 65 20 63 61 6c 6c  atic by the call
8d40: 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65  er..**.** The de
8d50: 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20 69  claration type i
8d60: 73 20 74 68 65 20 65 78 61 63 74 20 64 61 74 61  s the exact data
8d70: 74 79 70 65 20 64 65 66 69 6e 69 74 69 6f 6e 20  type definition 
8d80: 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74  extracted from t
8d90: 68 65 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 43  he.** original C
8da0: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
8db0: 65 6d 65 6e 74 20 69 66 20 74 68 65 20 65 78 70  ement if the exp
8dc0: 72 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c  ression is a col
8dd0: 75 6d 6e 2e 20 54 68 65 0a 2a 2a 20 64 65 63 6c  umn. The.** decl
8de0: 61 72 61 74 69 6f 6e 20 74 79 70 65 20 66 6f 72  aration type for
8df0: 20 61 20 52 4f 57 49 44 20 66 69 65 6c 64 20 69   a ROWID field i
8e00: 73 20 49 4e 54 45 47 45 52 2e 20 45 78 61 63 74  s INTEGER. Exact
8e10: 6c 79 20 77 68 65 6e 20 61 6e 20 65 78 70 72 65  ly when an expre
8e20: 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6e 73  ssion.** is cons
8e30: 69 64 65 72 65 64 20 61 20 63 6f 6c 75 6d 6e 20  idered a column 
8e40: 63 61 6e 20 62 65 20 63 6f 6d 70 6c 65 78 20 69  can be complex i
8e50: 6e 20 74 68 65 20 70 72 65 73 65 6e 63 65 20 6f  n the presence o
8e60: 66 20 73 75 62 71 75 65 72 69 65 73 2e 20 54 68  f subqueries. Th
8e70: 65 0a 2a 2a 20 72 65 73 75 6c 74 2d 73 65 74 20  e.** result-set 
8e80: 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 61 6c  expression in al
8e90: 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  l of the followi
8ea0: 6e 67 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  ng SELECT statem
8eb0: 65 6e 74 73 20 69 73 20 0a 2a 2a 20 63 6f 6e 73  ents is .** cons
8ec0: 69 64 65 72 65 64 20 61 20 63 6f 6c 75 6d 6e 20  idered a column 
8ed0: 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
8ee0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54  ..**.**   SELECT
8ef0: 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b 0a 2a   col FROM tbl;.*
8f00: 2a 20 20 20 53 45 4c 45 43 54 20 28 53 45 4c 45  *   SELECT (SELE
8f10: 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b  CT col FROM tbl;
8f20: 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 28 53 45  .**   SELECT (SE
8f30: 4c 45 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62  LECT col FROM tb
8f40: 6c 29 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20  l);.**   SELECT 
8f50: 61 62 63 20 46 52 4f 4d 20 28 53 45 4c 45 43 54  abc FROM (SELECT
8f60: 20 63 6f 6c 20 41 53 20 61 62 63 20 46 52 4f 4d   col AS abc FROM
8f70: 20 74 62 6c 29 3b 0a 2a 2a 20 0a 2a 2a 20 54 68   tbl);.** .** Th
8f80: 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79  e declaration ty
8f90: 70 65 20 66 6f 72 20 61 6e 79 20 65 78 70 72 65  pe for any expre
8fa0: 73 73 69 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e  ssion other than
8fb0: 20 61 20 63 6f 6c 75 6d 6e 20 69 73 20 4e 55 4c   a column is NUL
8fc0: 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  L..*/.static con
8fd0: 73 74 20 63 68 61 72 20 2a 63 6f 6c 75 6d 6e 54  st char *columnT
8fe0: 79 70 65 28 0a 20 20 4e 61 6d 65 43 6f 6e 74 65  ype(.  NameConte
8ff0: 78 74 20 2a 70 4e 43 2c 20 0a 20 20 45 78 70 72  xt *pNC, .  Expr
9000: 20 2a 70 45 78 70 72 2c 0a 20 20 63 6f 6e 73 74   *pExpr,.  const
9010: 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67 69 6e   char **pzOrigin
9020: 44 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  Db,.  const char
9030: 20 2a 2a 70 7a 4f 72 69 67 69 6e 54 61 62 2c 0a   **pzOriginTab,.
9040: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70    const char **p
9050: 7a 4f 72 69 67 69 6e 43 6f 6c 0a 29 7b 0a 20 20  zOriginCol.){.  
9060: 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 54 79 70  char const *zTyp
9070: 65 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 63 6f  e = 0;.  char co
9080: 6e 73 74 20 2a 7a 4f 72 69 67 69 6e 44 62 20 3d  nst *zOriginDb =
9090: 20 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74   0;.  char const
90a0: 20 2a 7a 4f 72 69 67 69 6e 54 61 62 20 3d 20 30   *zOriginTab = 0
90b0: 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a  ;.  char const *
90c0: 7a 4f 72 69 67 69 6e 43 6f 6c 20 3d 20 30 3b 0a  zOriginCol = 0;.
90d0: 20 20 69 6e 74 20 6a 3b 0a 20 20 69 66 28 20 4e    int j;.  if( N
90e0: 45 56 45 52 28 70 45 78 70 72 3d 3d 30 29 20 7c  EVER(pExpr==0) |
90f0: 7c 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3d  | pNC->pSrcList=
9100: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a  =0 ) return 0;..
9110: 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d    switch( pExpr-
9120: 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20  >op ){.    case 
9130: 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20  TK_AGG_COLUMN:. 
9140: 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d     case TK_COLUM
9150: 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  N: {.      /* Th
9160: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
9170: 61 20 63 6f 6c 75 6d 6e 2e 20 4c 6f 63 61 74 65  a column. Locate
9180: 20 74 68 65 20 74 61 62 6c 65 20 74 68 65 20 63   the table the c
9190: 6f 6c 75 6d 6e 20 69 73 20 62 65 69 6e 67 0a 20  olumn is being. 
91a0: 20 20 20 20 20 2a 2a 20 65 78 74 72 61 63 74 65       ** extracte
91b0: 64 20 66 72 6f 6d 20 69 6e 20 4e 61 6d 65 43 6f  d from in NameCo
91c0: 6e 74 65 78 74 2e 70 53 72 63 4c 69 73 74 2e 20  ntext.pSrcList. 
91d0: 54 68 69 73 20 74 61 62 6c 65 20 6d 61 79 20 62  This table may b
91e0: 65 20 72 65 61 6c 0a 20 20 20 20 20 20 2a 2a 20  e real.      ** 
91f0: 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 20 6f  database table o
9200: 72 20 61 20 73 75 62 71 75 65 72 79 2e 0a 20 20  r a subquery..  
9210: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 54 61 62      */.      Tab
9220: 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b 20 20 20  le *pTab = 0;   
9230: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
9240: 65 20 73 74 72 75 63 74 75 72 65 20 63 6f 6c 75  e structure colu
9250: 6d 6e 20 69 73 20 65 78 74 72 61 63 74 65 64 20  mn is extracted 
9260: 66 72 6f 6d 20 2a 2f 0a 20 20 20 20 20 20 53 65  from */.      Se
9270: 6c 65 63 74 20 2a 70 53 20 3d 20 30 3b 20 20 20  lect *pS = 0;   
9280: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 6c            /* Sel
9290: 65 63 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69  ect the column i
92a0: 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  s extracted from
92b0: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 43   */.      int iC
92c0: 6f 6c 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c  ol = pExpr->iCol
92d0: 75 6d 6e 3b 20 20 2f 2a 20 49 6e 64 65 78 20 6f  umn;  /* Index o
92e0: 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 54 61 62  f column in pTab
92f0: 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61   */.      testca
9300: 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
9310: 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a  K_AGG_COLUMN );.
9320: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
9330: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pExpr->op==TK_CO
9340: 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 77 68  LUMN );.      wh
9350: 69 6c 65 28 20 70 4e 43 20 26 26 20 21 70 54 61  ile( pNC && !pTa
9360: 62 20 29 7b 0a 20 20 20 20 20 20 20 20 53 72 63  b ){.        Src
9370: 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 20 3d  List *pTabList =
9380: 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a   pNC->pSrcList;.
9390: 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b          for(j=0;
93a0: 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  j<pTabList->nSrc
93b0: 20 26 26 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b   && pTabList->a[
93c0: 6a 5d 2e 69 43 75 72 73 6f 72 21 3d 70 45 78 70  j].iCursor!=pExp
93d0: 72 2d 3e 69 54 61 62 6c 65 3b 6a 2b 2b 29 3b 0a  r->iTable;j++);.
93e0: 20 20 20 20 20 20 20 20 69 66 28 20 6a 3c 70 54          if( j<pT
93f0: 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 7b 0a  abList->nSrc ){.
9400: 20 20 20 20 20 20 20 20 20 20 70 54 61 62 20 3d            pTab =
9410: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e   pTabList->a[j].
9420: 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20  pTab;.          
9430: 70 53 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61  pS = pTabList->a
9440: 5b 6a 5d 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20  [j].pSelect;.   
9450: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
9460: 20 20 20 20 20 20 70 4e 43 20 3d 20 70 4e 43 2d        pNC = pNC-
9470: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20  >pNext;.        
9480: 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  }.      }..     
9490: 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a   if( pTab==0 ){.
94a0: 20 20 20 20 20 20 20 20 2f 2a 20 41 74 20 6f 6e          /* At on
94b0: 65 20 74 69 6d 65 2c 20 63 6f 64 65 20 73 75 63  e time, code suc
94c0: 68 20 61 73 20 22 53 45 4c 45 43 54 20 6e 65 77  h as "SELECT new
94d0: 2e 78 22 20 77 69 74 68 69 6e 20 61 20 74 72 69  .x" within a tri
94e0: 67 67 65 72 20 77 6f 75 6c 64 0a 20 20 20 20 20  gger would.     
94f0: 20 20 20 2a 2a 20 63 61 75 73 65 20 74 68 69 73     ** cause this
9500: 20 63 6f 6e 64 69 74 69 6f 6e 20 74 6f 20 72 75   condition to ru
9510: 6e 2e 20 20 53 69 6e 63 65 20 74 68 65 6e 2c 20  n.  Since then, 
9520: 77 65 20 68 61 76 65 20 72 65 73 74 72 75 63 74  we have restruct
9530: 75 72 65 64 20 68 6f 77 0a 20 20 20 20 20 20 20  ured how.       
9540: 20 2a 2a 20 74 72 69 67 67 65 72 20 63 6f 64 65   ** trigger code
9550: 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 61 6e   is generated an
9560: 64 20 73 6f 20 74 68 69 73 20 63 6f 6e 64 69 74  d so this condit
9570: 69 6f 6e 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72  ion is no longer
9580: 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 73   .        ** pos
9590: 73 69 62 6c 65 2e 20 48 6f 77 65 76 65 72 2c 20  sible. However, 
95a0: 69 74 20 63 61 6e 20 73 74 69 6c 6c 20 62 65 20  it can still be 
95b0: 74 72 75 65 20 66 6f 72 20 73 74 61 74 65 6d 65  true for stateme
95c0: 6e 74 73 20 6c 69 6b 65 0a 20 20 20 20 20 20 20  nts like.       
95d0: 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   ** the followin
95e0: 67 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  g:.        **.  
95f0: 20 20 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54        **   CREAT
9600: 45 20 54 41 42 4c 45 20 74 31 28 63 6f 6c 20 49  E TABLE t1(col I
9610: 4e 54 45 47 45 52 29 3b 0a 20 20 20 20 20 20 20  NTEGER);.       
9620: 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 28 53 45   **   SELECT (SE
9630: 4c 45 43 54 20 74 31 2e 63 6f 6c 29 20 46 52 4f  LECT t1.col) FRO
9640: 4d 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 20  M FROM t1;.     
9650: 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
9660: 20 77 68 65 6e 20 63 6f 6c 75 6d 6e 54 79 70 65   when columnType
9670: 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20  () is called on 
9680: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 22  the expression "
9690: 74 31 2e 63 6f 6c 22 20 69 6e 20 74 68 65 20 0a  t1.col" in the .
96a0: 20 20 20 20 20 20 20 20 2a 2a 20 73 75 62 2d 73          ** sub-s
96b0: 65 6c 65 63 74 2e 20 49 6e 20 74 68 69 73 20 63  elect. In this c
96c0: 61 73 65 2c 20 73 65 74 20 74 68 65 20 63 6f 6c  ase, set the col
96d0: 75 6d 6e 20 74 79 70 65 20 74 6f 20 4e 55 4c 4c  umn type to NULL
96e0: 2c 20 65 76 65 6e 0a 20 20 20 20 20 20 20 20 2a  , even.        *
96f0: 2a 20 74 68 6f 75 67 68 20 69 74 20 73 68 6f 75  * though it shou
9700: 6c 64 20 72 65 61 6c 6c 79 20 62 65 20 22 49 4e  ld really be "IN
9710: 54 45 47 45 52 22 2e 0a 20 20 20 20 20 20 20 20  TEGER"..        
9720: 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68  **.        ** Th
9730: 69 73 20 69 73 20 6e 6f 74 20 61 20 70 72 6f 62  is is not a prob
9740: 6c 65 6d 2c 20 61 73 20 74 68 65 20 63 6f 6c 75  lem, as the colu
9750: 6d 6e 20 74 79 70 65 20 6f 66 20 22 74 31 2e 63  mn type of "t1.c
9760: 6f 6c 22 20 69 73 20 6e 65 76 65 72 0a 20 20 20  ol" is never.   
9770: 20 20 20 20 20 2a 2a 20 75 73 65 64 2e 20 57 68       ** used. Wh
9780: 65 6e 20 63 6f 6c 75 6d 6e 54 79 70 65 28 29 20  en columnType() 
9790: 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65  is called on the
97a0: 20 65 78 70 72 65 73 73 69 6f 6e 20 0a 20 20 20   expression .   
97b0: 20 20 20 20 20 2a 2a 20 22 28 53 45 4c 45 43 54       ** "(SELECT
97c0: 20 74 31 2e 63 6f 6c 29 22 2c 20 74 68 65 20 63   t1.col)", the c
97d0: 6f 72 72 65 63 74 20 74 79 70 65 20 69 73 20 72  orrect type is r
97e0: 65 74 75 72 6e 65 64 20 28 73 65 65 20 74 68 65  eturned (see the
97f0: 20 54 4b 5f 53 45 4c 45 43 54 0a 20 20 20 20 20   TK_SELECT.     
9800: 20 20 20 2a 2a 20 62 72 61 6e 63 68 20 62 65 6c     ** branch bel
9810: 6f 77 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  ow.  */.        
9820: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a  break;.      }..
9830: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
9840: 61 62 20 26 26 20 70 45 78 70 72 2d 3e 70 54 61  ab && pExpr->pTa
9850: 62 3d 3d 70 54 61 62 20 29 3b 0a 20 20 20 20 20  b==pTab );.     
9860: 20 69 66 28 20 70 53 20 29 7b 0a 20 20 20 20 20   if( pS ){.     
9870: 20 20 20 2f 2a 20 54 68 65 20 22 74 61 62 6c 65     /* The "table
9880: 22 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61 20  " is actually a 
9890: 73 75 62 2d 73 65 6c 65 63 74 20 6f 72 20 61 20  sub-select or a 
98a0: 76 69 65 77 20 69 6e 20 74 68 65 20 46 52 4f 4d  view in the FROM
98b0: 20 63 6c 61 75 73 65 0a 20 20 20 20 20 20 20 20   clause.        
98c0: 2a 2a 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  ** of the SELECT
98d0: 20 73 74 61 74 65 6d 65 6e 74 2e 20 52 65 74 75   statement. Retu
98e0: 72 6e 20 74 68 65 20 64 65 63 6c 61 72 61 74 69  rn the declarati
98f0: 6f 6e 20 74 79 70 65 20 61 6e 64 20 6f 72 69 67  on type and orig
9900: 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 61  in.        ** da
9910: 74 61 20 66 6f 72 20 74 68 65 20 72 65 73 75 6c  ta for the resul
9920: 74 2d 73 65 74 20 63 6f 6c 75 6d 6e 20 6f 66 20  t-set column of 
9930: 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74 2e 0a  the sub-select..
9940: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
9950: 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 26     if( iCol>=0 &
9960: 26 20 41 4c 57 41 59 53 28 69 43 6f 6c 3c 70 53  & ALWAYS(iCol<pS
9970: 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29  ->pEList->nExpr)
9980: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
9990: 20 49 66 20 69 43 6f 6c 20 69 73 20 6c 65 73 73   If iCol is less
99a0: 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e   than zero, then
99b0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
99c0: 72 65 71 75 65 73 74 73 20 74 68 65 0a 20 20 20  requests the.   
99d0: 20 20 20 20 20 20 20 2a 2a 20 72 6f 77 69 64 20         ** rowid 
99e0: 6f 66 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63  of the sub-selec
99f0: 74 20 6f 72 20 76 69 65 77 2e 20 54 68 69 73 20  t or view. This 
9a00: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6c 65  expression is le
9a10: 67 61 6c 20 28 73 65 65 20 0a 20 20 20 20 20 20  gal (see .      
9a20: 20 20 20 20 2a 2a 20 74 65 73 74 20 63 61 73 65      ** test case
9a30: 20 6d 69 73 63 32 2e 32 2e 32 29 20 2d 20 69 74   misc2.2.2) - it
9a40: 20 61 6c 77 61 79 73 20 65 76 61 6c 75 61 74 65   always evaluate
9a50: 73 20 74 6f 20 4e 55 4c 4c 2e 0a 20 20 20 20 20  s to NULL..     
9a60: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
9a70: 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e    NameContext sN
9a80: 43 3b 0a 20 20 20 20 20 20 20 20 20 20 45 78 70  C;.          Exp
9a90: 72 20 2a 70 20 3d 20 70 53 2d 3e 70 45 4c 69 73  r *p = pS->pELis
9aa0: 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78 70 72  t->a[iCol].pExpr
9ab0: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 4e 43 2e  ;.          sNC.
9ac0: 70 53 72 63 4c 69 73 74 20 3d 20 70 53 2d 3e 70  pSrcList = pS->p
9ad0: 53 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73  Src;.          s
9ae0: 4e 43 2e 70 4e 65 78 74 20 3d 20 70 4e 43 3b 0a  NC.pNext = pNC;.
9af0: 20 20 20 20 20 20 20 20 20 20 73 4e 43 2e 70 50            sNC.pP
9b00: 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72  arse = pNC->pPar
9b10: 73 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 54  se;.          zT
9b20: 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65  ype = columnType
9b30: 28 26 73 4e 43 2c 20 70 2c 20 26 7a 4f 72 69 67  (&sNC, p, &zOrig
9b40: 69 6e 44 62 2c 20 26 7a 4f 72 69 67 69 6e 54 61  inDb, &zOriginTa
9b50: 62 2c 20 26 7a 4f 72 69 67 69 6e 43 6f 6c 29 3b  b, &zOriginCol);
9b60: 20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20   .        }.    
9b70: 20 20 7d 65 6c 73 65 20 69 66 28 20 41 4c 57 41    }else if( ALWA
9b80: 59 53 28 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  YS(pTab->pSchema
9b90: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
9ba0: 41 20 72 65 61 6c 20 74 61 62 6c 65 20 2a 2f 0a  A real table */.
9bb0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
9bc0: 21 70 53 20 29 3b 0a 20 20 20 20 20 20 20 20 69  !pS );.        i
9bd0: 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c  f( iCol<0 ) iCol
9be0: 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a   = pTab->iPKey;.
9bf0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
9c00: 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f  iCol==-1 || (iCo
9c10: 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61  l>=0 && iCol<pTa
9c20: 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20 20 20  b->nCol) );.    
9c30: 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29      if( iCol<0 )
9c40: 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79 70  {.          zTyp
9c50: 65 20 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a 20  e = "INTEGER";. 
9c60: 20 20 20 20 20 20 20 20 20 7a 4f 72 69 67 69 6e           zOrigin
9c70: 43 6f 6c 20 3d 20 22 72 6f 77 69 64 22 3b 0a 20  Col = "rowid";. 
9c80: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
9c90: 20 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20          zType = 
9ca0: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
9cb0: 2e 7a 54 79 70 65 3b 0a 20 20 20 20 20 20 20 20  .zType;.        
9cc0: 20 20 7a 4f 72 69 67 69 6e 43 6f 6c 20 3d 20 70    zOriginCol = p
9cd0: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
9ce0: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 7d  zName;.        }
9cf0: 0a 20 20 20 20 20 20 20 20 7a 4f 72 69 67 69 6e  .        zOrigin
9d00: 54 61 62 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d  Tab = pTab->zNam
9d10: 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  e;.        if( p
9d20: 4e 43 2d 3e 70 50 61 72 73 65 20 29 7b 0a 20 20  NC->pParse ){.  
9d30: 20 20 20 20 20 20 20 20 69 6e 74 20 69 44 62 20          int iDb 
9d40: 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
9d50: 6f 49 6e 64 65 78 28 70 4e 43 2d 3e 70 50 61 72  oIndex(pNC->pPar
9d60: 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53  se->db, pTab->pS
9d70: 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 20 20  chema);.        
9d80: 20 20 7a 4f 72 69 67 69 6e 44 62 20 3d 20 70 4e    zOriginDb = pN
9d90: 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61  C->pParse->db->a
9da0: 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20  Db[iDb].zName;. 
9db0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
9dc0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
9dd0: 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
9de0: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
9df0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c  .    case TK_SEL
9e00: 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  ECT: {.      /* 
9e10: 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  The expression i
9e20: 73 20 61 20 73 75 62 2d 73 65 6c 65 63 74 2e 20  s a sub-select. 
9e30: 52 65 74 75 72 6e 20 74 68 65 20 64 65 63 6c 61  Return the decla
9e40: 72 61 74 69 6f 6e 20 74 79 70 65 20 61 6e 64 0a  ration type and.
9e50: 20 20 20 20 20 20 2a 2a 20 6f 72 69 67 69 6e 20        ** origin 
9e60: 69 6e 66 6f 20 66 6f 72 20 74 68 65 20 73 69 6e  info for the sin
9e70: 67 6c 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68  gle column in th
9e80: 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20  e result set of 
9e90: 74 68 65 20 53 45 4c 45 43 54 0a 20 20 20 20 20  the SELECT.     
9ea0: 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20   ** statement.. 
9eb0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 4e 61       */.      Na
9ec0: 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20  meContext sNC;. 
9ed0: 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 20       Select *pS 
9ee0: 3d 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65  = pExpr->x.pSele
9ef0: 63 74 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  ct;.      Expr *
9f00: 70 20 3d 20 70 53 2d 3e 70 45 4c 69 73 74 2d 3e  p = pS->pEList->
9f10: 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[0].pExpr;.    
9f20: 20 20 61 73 73 65 72 74 28 20 45 78 70 72 48 61    assert( ExprHa
9f30: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
9f40: 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
9f50: 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70 53 72 63  ;.      sNC.pSrc
9f60: 4c 69 73 74 20 3d 20 70 53 2d 3e 70 53 72 63 3b  List = pS->pSrc;
9f70: 0a 20 20 20 20 20 20 73 4e 43 2e 70 4e 65 78 74  .      sNC.pNext
9f80: 20 3d 20 70 4e 43 3b 0a 20 20 20 20 20 20 73 4e   = pNC;.      sN
9f90: 43 2e 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e  C.pParse = pNC->
9fa0: 70 50 61 72 73 65 3b 0a 20 20 20 20 20 20 7a 54  pParse;.      zT
9fb0: 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65  ype = columnType
9fc0: 28 26 73 4e 43 2c 20 70 2c 20 26 7a 4f 72 69 67  (&sNC, p, &zOrig
9fd0: 69 6e 44 62 2c 20 26 7a 4f 72 69 67 69 6e 54 61  inDb, &zOriginTa
9fe0: 62 2c 20 26 7a 4f 72 69 67 69 6e 43 6f 6c 29 3b  b, &zOriginCol);
9ff0: 20 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20   .      break;. 
a000: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
a010: 20 20 0a 20 20 69 66 28 20 70 7a 4f 72 69 67 69    .  if( pzOrigi
a020: 6e 44 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72  nDb ){.    asser
a030: 74 28 20 70 7a 4f 72 69 67 69 6e 54 61 62 20 26  t( pzOriginTab &
a040: 26 20 70 7a 4f 72 69 67 69 6e 43 6f 6c 20 29 3b  & pzOriginCol );
a050: 0a 20 20 20 20 2a 70 7a 4f 72 69 67 69 6e 44 62  .    *pzOriginDb
a060: 20 3d 20 7a 4f 72 69 67 69 6e 44 62 3b 0a 20 20   = zOriginDb;.  
a070: 20 20 2a 70 7a 4f 72 69 67 69 6e 54 61 62 20 3d    *pzOriginTab =
a080: 20 7a 4f 72 69 67 69 6e 54 61 62 3b 0a 20 20 20   zOriginTab;.   
a090: 20 2a 70 7a 4f 72 69 67 69 6e 43 6f 6c 20 3d 20   *pzOriginCol = 
a0a0: 7a 4f 72 69 67 69 6e 43 6f 6c 3b 0a 20 20 7d 0a  zOriginCol;.  }.
a0b0: 20 20 72 65 74 75 72 6e 20 7a 54 79 70 65 3b 0a    return zType;.
a0c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
a0d0: 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
a0e0: 20 74 65 6c 6c 20 74 68 65 20 56 44 42 45 20 74   tell the VDBE t
a0f0: 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74  he declaration t
a100: 79 70 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a  ypes of columns.
a110: 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ** in the result
a120: 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   set..*/.static 
a130: 76 6f 69 64 20 67 65 6e 65 72 61 74 65 43 6f 6c  void generateCol
a140: 75 6d 6e 54 79 70 65 73 28 0a 20 20 50 61 72 73  umnTypes(.  Pars
a150: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
a160: 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78  /* Parser contex
a170: 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  t */.  SrcList *
a180: 70 54 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69  pTabList,  /* Li
a190: 73 74 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a  st of tables */.
a1a0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
a1b0: 73 74 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73  st    /* Express
a1c0: 69 6f 6e 73 20 64 65 66 69 6e 69 6e 67 20 74 68  ions defining th
a1d0: 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a  e result set */.
a1e0: 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
a1f0: 45 5f 4f 4d 49 54 5f 44 45 43 4c 54 59 50 45 0a  E_OMIT_DECLTYPE.
a200: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
a210: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
a220: 20 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78   i;.  NameContex
a230: 74 20 73 4e 43 3b 0a 20 20 73 4e 43 2e 70 53 72  t sNC;.  sNC.pSr
a240: 63 4c 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74  cList = pTabList
a250: 3b 0a 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d  ;.  sNC.pParse =
a260: 20 70 50 61 72 73 65 3b 0a 20 20 66 6f 72 28 69   pParse;.  for(i
a270: 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45  =0; i<pEList->nE
a280: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45  xpr; i++){.    E
a290: 78 70 72 20 2a 70 20 3d 20 70 45 4c 69 73 74 2d  xpr *p = pEList-
a2a0: 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
a2b0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79   const char *zTy
a2c0: 70 65 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  pe;.#ifdef SQLIT
a2d0: 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f  E_ENABLE_COLUMN_
a2e0: 4d 45 54 41 44 41 54 41 0a 20 20 20 20 63 6f 6e  METADATA.    con
a2f0: 73 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 44 62  st char *zOrigDb
a300: 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20   = 0;.    const 
a310: 63 68 61 72 20 2a 7a 4f 72 69 67 54 61 62 20 3d  char *zOrigTab =
a320: 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   0;.    const ch
a330: 61 72 20 2a 7a 4f 72 69 67 43 6f 6c 20 3d 20 30  ar *zOrigCol = 0
a340: 3b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f  ;.    zType = co
a350: 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70  lumnType(&sNC, p
a360: 2c 20 26 7a 4f 72 69 67 44 62 2c 20 26 7a 4f 72  , &zOrigDb, &zOr
a370: 69 67 54 61 62 2c 20 26 7a 4f 72 69 67 43 6f 6c  igTab, &zOrigCol
a380: 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 76  );..    /* The v
a390: 64 62 65 20 6d 75 73 74 20 6d 61 6b 65 20 69 74  dbe must make it
a3a0: 73 20 6f 77 6e 20 63 6f 70 79 20 6f 66 20 74 68  s own copy of th
a3b0: 65 20 63 6f 6c 75 6d 6e 2d 74 79 70 65 20 61 6e  e column-type an
a3c0: 64 20 6f 74 68 65 72 20 0a 20 20 20 20 2a 2a 20  d other .    ** 
a3d0: 63 6f 6c 75 6d 6e 20 73 70 65 63 69 66 69 63 20  column specific 
a3e0: 73 74 72 69 6e 67 73 2c 20 69 6e 20 63 61 73 65  strings, in case
a3f0: 20 74 68 65 20 73 63 68 65 6d 61 20 69 73 20 72   the schema is r
a400: 65 73 65 74 20 62 65 66 6f 72 65 20 74 68 69 73  eset before this
a410: 0a 20 20 20 20 2a 2a 20 76 69 72 74 75 61 6c 20  .    ** virtual 
a420: 6d 61 63 68 69 6e 65 20 69 73 20 64 65 6c 65 74  machine is delet
a430: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  ed..    */.    s
a440: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
a450: 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41  Name(v, i, COLNA
a460: 4d 45 5f 44 41 54 41 42 41 53 45 2c 20 7a 4f 72  ME_DATABASE, zOr
a470: 69 67 44 62 2c 20 53 51 4c 49 54 45 5f 54 52 41  igDb, SQLITE_TRA
a480: 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c  NSIENT);.    sql
a490: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
a4a0: 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45  me(v, i, COLNAME
a4b0: 5f 54 41 42 4c 45 2c 20 7a 4f 72 69 67 54 61 62  _TABLE, zOrigTab
a4c0: 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
a4d0: 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  NT);.    sqlite3
a4e0: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76  VdbeSetColName(v
a4f0: 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 43 4f 4c  , i, COLNAME_COL
a500: 55 4d 4e 2c 20 7a 4f 72 69 67 43 6f 6c 2c 20 53  UMN, zOrigCol, S
a510: 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
a520: 3b 0a 23 65 6c 73 65 0a 20 20 20 20 7a 54 79 70  ;.#else.    zTyp
a530: 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26  e = columnType(&
a540: 73 4e 43 2c 20 70 2c 20 30 2c 20 30 2c 20 30 29  sNC, p, 0, 0, 0)
a550: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71 6c  ;.#endif.    sql
a560: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
a570: 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45  me(v, i, COLNAME
a580: 5f 44 45 43 4c 54 59 50 45 2c 20 7a 54 79 70 65  _DECLTYPE, zType
a590: 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
a5a0: 4e 54 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20  NT);.  }.#endif 
a5b0: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  /* SQLITE_OMIT_D
a5c0: 45 43 4c 54 59 50 45 20 2a 2f 0a 7d 0a 0a 2f 2a  ECLTYPE */.}../*
a5d0: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
a5e0: 65 20 74 68 61 74 20 77 69 6c 6c 20 74 65 6c 6c  e that will tell
a5f0: 20 74 68 65 20 56 44 42 45 20 74 68 65 20 6e 61   the VDBE the na
a600: 6d 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a  mes of columns.*
a610: 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  * in the result 
a620: 73 65 74 2e 20 20 54 68 69 73 20 69 6e 66 6f 72  set.  This infor
a630: 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  mation is used t
a640: 6f 20 70 72 6f 76 69 64 65 20 74 68 65 0a 2a 2a  o provide the.**
a650: 20 61 7a 43 6f 6c 5b 5d 20 76 61 6c 75 65 73 20   azCol[] values 
a660: 69 6e 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 2e  in the callback.
a670: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
a680: 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61  generateColumnNa
a690: 6d 65 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50  mes(.  Parse *pP
a6a0: 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61  arse,      /* Pa
a6b0: 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
a6c0: 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
a6d0: 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66  ist,  /* List of
a6e0: 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 45 78 70   tables */.  Exp
a6f0: 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20  rList *pEList   
a700: 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73 20   /* Expressions 
a710: 64 65 66 69 6e 69 6e 67 20 74 68 65 20 72 65 73  defining the res
a720: 75 6c 74 20 73 65 74 20 2a 2f 0a 29 7b 0a 20 20  ult set */.){.  
a730: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
a740: 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
a750: 2c 20 6a 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  , j;.  sqlite3 *
a760: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
a770: 0a 20 20 69 6e 74 20 66 75 6c 6c 4e 61 6d 65 73  .  int fullNames
a780: 2c 20 73 68 6f 72 74 4e 61 6d 65 73 3b 0a 0a 23  , shortNames;..#
a790: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
a7a0: 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 2f 2a 20  IT_EXPLAIN.  /* 
a7b0: 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 45 58  If this is an EX
a7c0: 50 4c 41 49 4e 2c 20 73 6b 69 70 20 74 68 69 73  PLAIN, skip this
a7d0: 20 73 74 65 70 20 2a 2f 0a 20 20 69 66 28 20 70   step */.  if( p
a7e0: 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29  Parse->explain )
a7f0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
a800: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20  }.#endif..  if( 
a810: 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73  pParse->colNames
a820: 53 65 74 20 7c 7c 20 4e 45 56 45 52 28 76 3d 3d  Set || NEVER(v==
a830: 30 29 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  0) || db->malloc
a840: 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b  Failed ) return;
a850: 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61  .  pParse->colNa
a860: 6d 65 73 53 65 74 20 3d 20 31 3b 0a 20 20 66 75  mesSet = 1;.  fu
a870: 6c 6c 4e 61 6d 65 73 20 3d 20 28 64 62 2d 3e 66  llNames = (db->f
a880: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 75  lags & SQLITE_Fu
a890: 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a  llColNames)!=0;.
a8a0: 20 20 73 68 6f 72 74 4e 61 6d 65 73 20 3d 20 28    shortNames = (
a8b0: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
a8c0: 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73  TE_ShortColNames
a8d0: 29 21 3d 30 3b 0a 20 20 73 71 6c 69 74 65 33 56  )!=0;.  sqlite3V
a8e0: 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 76 2c  dbeSetNumCols(v,
a8f0: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b   pEList->nExpr);
a900: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45  .  for(i=0; i<pE
a910: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
a920: 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 3b 0a  ){.    Expr *p;.
a930: 20 20 20 20 70 20 3d 20 70 45 4c 69 73 74 2d 3e      p = pEList->
a940: 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
a950: 69 66 28 20 4e 45 56 45 52 28 70 3d 3d 30 29 20  if( NEVER(p==0) 
a960: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
a970: 69 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  if( pEList->a[i]
a980: 2e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  .zName ){.      
a990: 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 45  char *zName = pE
a9a0: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
a9b0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
a9c0: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
a9d0: 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45   i, COLNAME_NAME
a9e0: 2c 20 7a 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f  , zName, SQLITE_
a9f0: 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20  TRANSIENT);.    
aa00: 7d 65 6c 73 65 20 69 66 28 20 28 70 2d 3e 6f 70  }else if( (p->op
aa10: 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70  ==TK_COLUMN || p
aa20: 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c  ->op==TK_AGG_COL
aa30: 55 4d 4e 29 20 26 26 20 70 54 61 62 4c 69 73 74  UMN) && pTabList
aa40: 20 29 7b 0a 20 20 20 20 20 20 54 61 62 6c 65 20   ){.      Table 
aa50: 2a 70 54 61 62 3b 0a 20 20 20 20 20 20 63 68 61  *pTab;.      cha
aa60: 72 20 2a 7a 43 6f 6c 3b 0a 20 20 20 20 20 20 69  r *zCol;.      i
aa70: 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 69 43 6f  nt iCol = p->iCo
aa80: 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 66 6f 72 28  lumn;.      for(
aa90: 6a 3d 30 3b 20 41 4c 57 41 59 53 28 6a 3c 70 54  j=0; ALWAYS(j<pT
aaa0: 61 62 4c 69 73 74 2d 3e 6e 53 72 63 29 3b 20 6a  abList->nSrc); j
aab0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
aac0: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e   pTabList->a[j].
aad0: 69 43 75 72 73 6f 72 3d 3d 70 2d 3e 69 54 61 62  iCursor==p->iTab
aae0: 6c 65 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  le ) break;.    
aaf0: 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
ab00: 28 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  ( j<pTabList->nS
ab10: 72 63 20 29 3b 0a 20 20 20 20 20 20 70 54 61 62  rc );.      pTab
ab20: 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a   = pTabList->a[j
ab30: 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 69 66  ].pTab;.      if
ab40: 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20  ( iCol<0 ) iCol 
ab50: 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20  = pTab->iPKey;. 
ab60: 20 20 20 20 20 61 73 73 65 72 74 28 20 69 43 6f       assert( iCo
ab70: 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d  l==-1 || (iCol>=
ab80: 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e  0 && iCol<pTab->
ab90: 6e 43 6f 6c 29 20 29 3b 0a 20 20 20 20 20 20 69  nCol) );.      i
aba0: 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20  f( iCol<0 ){.   
abb0: 20 20 20 20 20 7a 43 6f 6c 20 3d 20 22 72 6f 77       zCol = "row
abc0: 69 64 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  id";.      }else
abd0: 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d  {.        zCol =
abe0: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
abf0: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 7d  ].zName;.      }
ac00: 0a 20 20 20 20 20 20 69 66 28 20 21 73 68 6f 72  .      if( !shor
ac10: 74 4e 61 6d 65 73 20 26 26 20 21 66 75 6c 6c 4e  tNames && !fullN
ac20: 61 6d 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20  ames ){.        
ac30: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
ac40: 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e  lName(v, i, COLN
ac50: 41 4d 45 5f 4e 41 4d 45 2c 20 0a 20 20 20 20 20  AME_NAME, .     
ac60: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
ac70: 53 74 72 44 75 70 28 64 62 2c 20 70 45 4c 69 73  StrDup(db, pELis
ac80: 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 29 2c 20  t->a[i].zSpan), 
ac90: 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b  SQLITE_DYNAMIC);
aca0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
acb0: 20 66 75 6c 6c 4e 61 6d 65 73 20 29 7b 0a 20 20   fullNames ){.  
acc0: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d        char *zNam
acd0: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7a  e = 0;.        z
ace0: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50  Name = sqlite3MP
acf0: 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2e 25 73  rintf(db, "%s.%s
ad00: 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  ", pTab->zName, 
ad10: 7a 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73  zCol);.        s
ad20: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
ad30: 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41  Name(v, i, COLNA
ad40: 4d 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20  ME_NAME, zName, 
ad50: 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b  SQLITE_DYNAMIC);
ad60: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
ad70: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
ad80: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69  eSetColName(v, i
ad90: 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20  , COLNAME_NAME, 
ada0: 7a 43 6f 6c 2c 20 53 51 4c 49 54 45 5f 54 52 41  zCol, SQLITE_TRA
adb0: 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 20 20 7d  NSIENT);.      }
adc0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
add0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
ade0: 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f  ColName(v, i, CO
adf0: 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 0a 20 20 20  LNAME_NAME, .   
ae00: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
ae10: 53 74 72 44 75 70 28 64 62 2c 20 70 45 4c 69 73  StrDup(db, pELis
ae20: 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 29 2c 20  t->a[i].zSpan), 
ae30: 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b  SQLITE_DYNAMIC);
ae40: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 67 65 6e  .    }.  }.  gen
ae50: 65 72 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73  erateColumnTypes
ae60: 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73  (pParse, pTabLis
ae70: 74 2c 20 70 45 4c 69 73 74 29 3b 0a 7d 0a 0a 2f  t, pEList);.}../
ae80: 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 61 6e 20  *.** Given a an 
ae90: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20  expression list 
aea0: 28 77 68 69 63 68 20 69 73 20 72 65 61 6c 6c 79  (which is really
aeb0: 20 74 68 65 20 6c 69 73 74 20 6f 66 20 65 78 70   the list of exp
aec0: 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 74 68 61 74  ressions.** that
aed0: 20 66 6f 72 6d 20 74 68 65 20 72 65 73 75 6c 74   form the result
aee0: 20 73 65 74 20 6f 66 20 61 20 53 45 4c 45 43 54   set of a SELECT
aef0: 20 73 74 61 74 65 6d 65 6e 74 29 20 63 6f 6d 70   statement) comp
af00: 75 74 65 20 61 70 70 72 6f 70 72 69 61 74 65 0a  ute appropriate.
af10: 2a 2a 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  ** column names 
af20: 66 6f 72 20 61 20 74 61 62 6c 65 20 74 68 61 74  for a table that
af30: 20 77 6f 75 6c 64 20 68 6f 6c 64 20 74 68 65 20   would hold the 
af40: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e  expression list.
af50: 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 63 6f 6c 75 6d  .**.** All colum
af60: 6e 20 6e 61 6d 65 73 20 77 69 6c 6c 20 62 65 20  n names will be 
af70: 75 6e 69 71 75 65 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  unique..**.** On
af80: 6c 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  ly the column na
af90: 6d 65 73 20 61 72 65 20 63 6f 6d 70 75 74 65 64  mes are computed
afa0: 2e 20 20 43 6f 6c 75 6d 6e 2e 7a 54 79 70 65 2c  .  Column.zType,
afb0: 20 43 6f 6c 75 6d 6e 2e 7a 43 6f 6c 6c 2c 0a 2a   Column.zColl,.*
afc0: 2a 20 61 6e 64 20 6f 74 68 65 72 20 66 69 65 6c  * and other fiel
afd0: 64 73 20 6f 66 20 43 6f 6c 75 6d 6e 20 61 72 65  ds of Column are
afe0: 20 7a 65 72 6f 65 64 2e 0a 2a 2a 0a 2a 2a 20 52   zeroed..**.** R
aff0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
b000: 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66 20  on success.  If 
b010: 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  a memory allocat
b020: 69 6f 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73  ion error occurs
b030: 2c 0a 2a 2a 20 73 74 6f 72 65 20 4e 55 4c 4c 20  ,.** store NULL 
b040: 69 6e 20 2a 70 61 43 6f 6c 20 61 6e 64 20 30 20  in *paCol and 0 
b050: 69 6e 20 2a 70 6e 43 6f 6c 20 61 6e 64 20 72 65  in *pnCol and re
b060: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
b070: 4d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  M..*/.static int
b080: 20 73 65 6c 65 63 74 43 6f 6c 75 6d 6e 73 46 72   selectColumnsFr
b090: 6f 6d 45 78 70 72 4c 69 73 74 28 0a 20 20 50 61  omExprList(.  Pa
b0a0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
b0b0: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
b0c0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
b0d0: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20  prList *pEList, 
b0e0: 20 20 20 20 20 20 2f 2a 20 45 78 70 72 20 6c 69        /* Expr li
b0f0: 73 74 20 66 72 6f 6d 20 77 68 69 63 68 20 74 6f  st from which to
b100: 20 64 65 72 69 76 65 20 63 6f 6c 75 6d 6e 20 6e   derive column n
b110: 61 6d 65 73 20 2a 2f 0a 20 20 69 31 36 20 2a 70  ames */.  i16 *p
b120: 6e 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20  nCol,           
b130: 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e    /* Write the n
b140: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
b150: 20 68 65 72 65 20 2a 2f 0a 20 20 43 6f 6c 75 6d   here */.  Colum
b160: 6e 20 2a 2a 70 61 43 6f 6c 20 20 20 20 20 20 20  n **paCol       
b170: 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
b180: 6e 65 77 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20  new column list 
b190: 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  here */.){.  sql
b1a0: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
b1b0: 65 2d 3e 64 62 3b 20 20 20 2f 2a 20 44 61 74 61  e->db;   /* Data
b1c0: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
b1d0: 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20  */.  int i, j;  
b1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b1f0: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
b200: 73 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 3b 20  s */.  int cnt; 
b210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b220: 20 20 20 2f 2a 20 49 6e 64 65 78 20 61 64 64 65     /* Index adde
b230: 64 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 6e 61  d to make the na
b240: 6d 65 20 75 6e 69 71 75 65 20 2a 2f 0a 20 20 43  me unique */.  C
b250: 6f 6c 75 6d 6e 20 2a 61 43 6f 6c 2c 20 2a 70 43  olumn *aCol, *pC
b260: 6f 6c 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 6f  ol;        /* Fo
b270: 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 72  r looping over r
b280: 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f  esult columns */
b290: 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20  .  int nCol;    
b2a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
b2b0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  * Number of colu
b2c0: 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c  mns in the resul
b2d0: 74 20 73 65 74 20 2a 2f 0a 20 20 45 78 70 72 20  t set */.  Expr 
b2e0: 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *p;             
b2f0: 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73         /* Expres
b300: 73 69 6f 6e 20 66 6f 72 20 61 20 73 69 6e 67 6c  sion for a singl
b310: 65 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 20  e result column 
b320: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65  */.  char *zName
b330: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
b340: 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65 20   /* Column name 
b350: 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 20  */.  int nName; 
b360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b370: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6e 61 6d 65   /* Size of name
b380: 20 69 6e 20 7a 4e 61 6d 65 5b 5d 20 2a 2f 0a 0a   in zName[] */..
b390: 20 20 69 66 28 20 70 45 4c 69 73 74 20 29 7b 0a    if( pEList ){.
b3a0: 20 20 20 20 6e 43 6f 6c 20 3d 20 70 45 4c 69 73      nCol = pELis
b3b0: 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 61 43  t->nExpr;.    aC
b3c0: 6f 6c 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ol = sqlite3DbMa
b3d0: 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
b3e0: 65 6f 66 28 61 43 6f 6c 5b 30 5d 29 2a 6e 43 6f  eof(aCol[0])*nCo
b3f0: 6c 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  l);.    testcase
b400: 28 20 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 7d  ( aCol==0 );.  }
b410: 65 6c 73 65 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d  else{.    nCol =
b420: 20 30 3b 0a 20 20 20 20 61 43 6f 6c 20 3d 20 30   0;.    aCol = 0
b430: 3b 0a 20 20 7d 0a 20 20 2a 70 6e 43 6f 6c 20 3d  ;.  }.  *pnCol =
b440: 20 6e 43 6f 6c 3b 0a 20 20 2a 70 61 43 6f 6c 20   nCol;.  *paCol 
b450: 3d 20 61 43 6f 6c 3b 0a 0a 20 20 66 6f 72 28 69  = aCol;..  for(i
b460: 3d 30 2c 20 70 43 6f 6c 3d 61 43 6f 6c 3b 20 69  =0, pCol=aCol; i
b470: 3c 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c  <nCol; i++, pCol
b480: 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20 47 65 74 20  ++){.    /* Get 
b490: 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 6e  an appropriate n
b4a0: 61 6d 65 20 66 6f 72 20 74 68 65 20 63 6f 6c 75  ame for the colu
b4b0: 6d 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 20  mn.    */.    p 
b4c0: 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  = pEList->a[i].p
b4d0: 45 78 70 72 3b 0a 20 20 20 20 61 73 73 65 72 74  Expr;.    assert
b4e0: 28 20 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20 7c  ( p->pRight==0 |
b4f0: 7c 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  | ExprHasPropert
b500: 79 28 70 2d 3e 70 52 69 67 68 74 2c 20 45 50 5f  y(p->pRight, EP_
b510: 49 6e 74 56 61 6c 75 65 29 0a 20 20 20 20 20 20  IntValue).      
b520: 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 70           || p->p
b530: 52 69 67 68 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 3d  Right->u.zToken=
b540: 3d 30 20 7c 7c 20 70 2d 3e 70 52 69 67 68 74 2d  =0 || p->pRight-
b550: 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 21 3d 30 20  >u.zToken[0]!=0 
b560: 29 3b 0a 20 20 20 20 69 66 28 20 28 7a 4e 61 6d  );.    if( (zNam
b570: 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  e = pEList->a[i]
b580: 2e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20  .zName)!=0 ){.  
b590: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f      /* If the co
b5a0: 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 73 20 61 6e  lumn contains an
b5b0: 20 22 41 53 20 3c 6e 61 6d 65 3e 22 20 70 68 72   "AS <name>" phr
b5c0: 61 73 65 2c 20 75 73 65 20 3c 6e 61 6d 65 3e 20  ase, use <name> 
b5d0: 61 73 20 74 68 65 20 6e 61 6d 65 20 2a 2f 0a 20  as the name */. 
b5e0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c       zName = sql
b5f0: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
b600: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c   zName);.    }el
b610: 73 65 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  se{.      Expr *
b620: 70 43 6f 6c 45 78 70 72 20 3d 20 70 3b 20 20 2f  pColExpr = p;  /
b630: 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
b640: 20 74 68 61 74 20 69 73 20 74 68 65 20 72 65 73   that is the res
b650: 75 6c 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20  ult column name 
b660: 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a  */.      Table *
b670: 70 54 61 62 3b 20 20 20 20 20 20 20 20 20 2f 2a  pTab;         /*
b680: 20 54 61 62 6c 65 20 61 73 73 6f 63 69 61 74 65   Table associate
b690: 64 20 77 69 74 68 20 74 68 69 73 20 65 78 70 72  d with this expr
b6a0: 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  ession */.      
b6b0: 77 68 69 6c 65 28 20 70 43 6f 6c 45 78 70 72 2d  while( pColExpr-
b6c0: 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29 7b 0a 20  >op==TK_DOT ){. 
b6d0: 20 20 20 20 20 20 20 70 43 6f 6c 45 78 70 72 20         pColExpr 
b6e0: 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 70 52 69 67  = pColExpr->pRig
b6f0: 68 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ht;.        asse
b700: 72 74 28 20 70 43 6f 6c 45 78 70 72 21 3d 30 20  rt( pColExpr!=0 
b710: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
b720: 20 69 66 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f   if( pColExpr->o
b730: 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20  p==TK_COLUMN && 
b740: 41 4c 57 41 59 53 28 70 43 6f 6c 45 78 70 72 2d  ALWAYS(pColExpr-
b750: 3e 70 54 61 62 21 3d 30 29 20 29 7b 0a 20 20 20  >pTab!=0) ){.   
b760: 20 20 20 20 20 2f 2a 20 46 6f 72 20 63 6f 6c 75       /* For colu
b770: 6d 6e 73 20 75 73 65 20 74 68 65 20 63 6f 6c 75  mns use the colu
b780: 6d 6e 20 6e 61 6d 65 20 6e 61 6d 65 20 2a 2f 0a  mn name name */.
b790: 20 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c          int iCol
b7a0: 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 69 43 6f   = pColExpr->iCo
b7b0: 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 70 54  lumn;.        pT
b7c0: 61 62 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 70  ab = pColExpr->p
b7d0: 54 61 62 3b 0a 20 20 20 20 20 20 20 20 69 66 28  Tab;.        if(
b7e0: 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d   iCol<0 ) iCol =
b7f0: 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20   pTab->iPKey;.  
b800: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71        zName = sq
b810: 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
b820: 20 22 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20   "%s",.         
b830: 20 20 20 20 20 20 20 20 69 43 6f 6c 3e 3d 30 20          iCol>=0 
b840: 3f 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f  ? pTab->aCol[iCo
b850: 6c 5d 2e 7a 4e 61 6d 65 20 3a 20 22 72 6f 77 69  l].zName : "rowi
b860: 64 22 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  d");.      }else
b870: 20 69 66 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f   if( pColExpr->o
b880: 70 3d 3d 54 4b 5f 49 44 20 29 7b 0a 20 20 20 20  p==TK_ID ){.    
b890: 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
b8a0: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 43 6f  rHasProperty(pCo
b8b0: 6c 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c  lExpr, EP_IntVal
b8c0: 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 7a  ue) );.        z
b8d0: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50  Name = sqlite3MP
b8e0: 72 69 6e 74 66 28 64 62 2c 20 22 25 73 22 2c 20  rintf(db, "%s", 
b8f0: 70 43 6f 6c 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  pColExpr->u.zTok
b900: 65 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  en);.      }else
b910: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65  {.        /* Use
b920: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 74 65   the original te
b930: 78 74 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  xt of the column
b940: 20 65 78 70 72 65 73 73 69 6f 6e 20 61 73 20 69   expression as i
b950: 74 73 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20  ts name */.     
b960: 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74     zName = sqlit
b970: 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25  e3MPrintf(db, "%
b980: 73 22 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  s", pEList->a[i]
b990: 2e 7a 53 70 61 6e 29 3b 0a 20 20 20 20 20 20 7d  .zSpan);.      }
b9a0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64  .    }.    if( d
b9b0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
b9c0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
b9d0: 44 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65  DbFree(db, zName
b9e0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
b9f0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61      }..    /* Ma
ba00: 6b 65 20 73 75 72 65 20 74 68 65 20 63 6f 6c 75  ke sure the colu
ba10: 6d 6e 20 6e 61 6d 65 20 69 73 20 75 6e 69 71 75  mn name is uniqu
ba20: 65 2e 20 20 49 66 20 74 68 65 20 6e 61 6d 65 20  e.  If the name 
ba30: 69 73 20 6e 6f 74 20 75 6e 69 71 75 65 2c 0a 20  is not unique,. 
ba40: 20 20 20 2a 2a 20 61 70 70 65 6e 64 20 61 20 69     ** append a i
ba50: 6e 74 65 67 65 72 20 74 6f 20 74 68 65 20 6e 61  nteger to the na
ba60: 6d 65 20 73 6f 20 74 68 61 74 20 69 74 20 62 65  me so that it be
ba70: 63 6f 6d 65 73 20 75 6e 69 71 75 65 2e 0a 20 20  comes unique..  
ba80: 20 20 2a 2f 0a 20 20 20 20 6e 4e 61 6d 65 20 3d    */.    nName =
ba90: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
baa0: 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 66 6f 72  (zName);.    for
bab0: 28 6a 3d 63 6e 74 3d 30 3b 20 6a 3c 69 3b 20 6a  (j=cnt=0; j<i; j
bac0: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  ++){.      if( s
bad0: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 61 43  qlite3StrICmp(aC
bae0: 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e 61  ol[j].zName, zNa
baf0: 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)==0 ){.      
bb00: 20 20 63 68 61 72 20 2a 7a 4e 65 77 4e 61 6d 65    char *zNewName
bb10: 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 5b  ;.        zName[
bb20: 6e 4e 61 6d 65 5d 20 3d 20 30 3b 0a 20 20 20 20  nName] = 0;.    
bb30: 20 20 20 20 7a 4e 65 77 4e 61 6d 65 20 3d 20 73      zNewName = s
bb40: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
bb50: 2c 20 22 25 73 3a 25 64 22 2c 20 7a 4e 61 6d 65  , "%s:%d", zName
bb60: 2c 20 2b 2b 63 6e 74 29 3b 0a 20 20 20 20 20 20  , ++cnt);.      
bb70: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
bb80: 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  db, zName);.    
bb90: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 7a 4e 65 77      zName = zNew
bba0: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 6a 20  Name;.        j 
bbb0: 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 69 66  = -1;.        if
bbc0: 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 62 72 65  ( zName==0 ) bre
bbd0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
bbe0: 7d 0a 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d  }.    pCol->zNam
bbf0: 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 7d 0a 20  e = zName;.  }. 
bc00: 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
bc10: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 66 6f 72  ailed ){.    for
bc20: 28 6a 3d 30 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 7b  (j=0; j<i; j++){
bc30: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
bc40: 46 72 65 65 28 64 62 2c 20 61 43 6f 6c 5b 6a 5d  Free(db, aCol[j]
bc50: 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20  .zName);.    }. 
bc60: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
bc70: 28 64 62 2c 20 61 43 6f 6c 29 3b 0a 20 20 20 20  (db, aCol);.    
bc80: 2a 70 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  *paCol = 0;.    
bc90: 2a 70 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  *pnCol = 0;.    
bca0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
bcb0: 4d 45 4d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  MEM;.  }.  retur
bcc0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
bcd0: 2f 2a 0a 2a 2a 20 41 64 64 20 74 79 70 65 20 61  /*.** Add type a
bce0: 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 69 6e 66  nd collation inf
bcf0: 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 61 20 63 6f  ormation to a co
bd00: 6c 75 6d 6e 20 6c 69 73 74 20 62 61 73 65 64 20  lumn list based 
bd10: 6f 6e 0a 2a 2a 20 61 20 53 45 4c 45 43 54 20 73  on.** a SELECT s
bd20: 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 0a 2a 2a  tatement..** .**
bd30: 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74   The column list
bd40: 20 70 72 65 73 75 6d 61 62 6c 79 20 63 61 6d 65   presumably came
bd50: 20 66 72 6f 6d 20 73 65 6c 65 63 74 43 6f 6c 75   from selectColu
bd60: 6d 6e 4e 61 6d 65 73 46 72 6f 6d 45 78 70 72 4c  mnNamesFromExprL
bd70: 69 73 74 28 29 2e 0a 2a 2a 20 54 68 65 20 63 6f  ist()..** The co
bd80: 6c 75 6d 6e 20 6c 69 73 74 20 68 61 73 20 6f 6e  lumn list has on
bd90: 6c 79 20 6e 61 6d 65 73 2c 20 6e 6f 74 20 74 79  ly names, not ty
bda0: 70 65 73 20 6f 72 20 63 6f 6c 6c 61 74 69 6f 6e  pes or collation
bdb0: 73 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74  s.  This.** rout
bdc0: 69 6e 65 20 67 6f 65 73 20 74 68 72 6f 75 67 68  ine goes through
bdd0: 20 61 6e 64 20 61 64 64 73 20 74 68 65 20 74 79   and adds the ty
bde0: 70 65 73 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f  pes and collatio
bdf0: 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ns..**.** This r
be00: 6f 75 74 69 6e 65 20 72 65 71 75 69 72 65 73 20  outine requires 
be10: 74 68 61 74 20 61 6c 6c 20 69 64 65 6e 74 69 66  that all identif
be20: 69 65 72 73 20 69 6e 20 74 68 65 20 53 45 4c 45  iers in the SELE
be30: 43 54 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20  CT.** statement 
be40: 62 65 20 72 65 73 6f 6c 76 65 64 2e 0a 2a 2f 0a  be resolved..*/.
be50: 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 6c 65  static void sele
be60: 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41  ctAddColumnTypeA
be70: 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20 50  ndCollation(.  P
be80: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
be90: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
bea0: 63 6f 6e 74 65 78 74 73 20 2a 2f 0a 20 20 69 6e  contexts */.  in
beb0: 74 20 6e 43 6f 6c 2c 20 20 20 20 20 20 20 20 20  t nCol,         
bec0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
bed0: 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 43 6f   columns */.  Co
bee0: 6c 75 6d 6e 20 2a 61 43 6f 6c 2c 20 20 20 20 20  lumn *aCol,     
bef0: 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 63      /* List of c
bf00: 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 53 65 6c 65  olumns */.  Sele
bf10: 63 74 20 2a 70 53 65 6c 65 63 74 20 20 20 20 20  ct *pSelect     
bf20: 20 20 2f 2a 20 53 45 4c 45 43 54 20 75 73 65 64    /* SELECT used
bf30: 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 79   to determine ty
bf40: 70 65 73 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f  pes and collatio
bf50: 6e 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  ns */.){.  sqlit
bf60: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
bf70: 3e 64 62 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65  >db;.  NameConte
bf80: 78 74 20 73 4e 43 3b 0a 20 20 43 6f 6c 75 6d 6e  xt sNC;.  Column
bf90: 20 2a 70 43 6f 6c 3b 0a 20 20 43 6f 6c 6c 53 65   *pCol;.  CollSe
bfa0: 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 69 6e 74 20  q *pColl;.  int 
bfb0: 69 3b 0a 20 20 45 78 70 72 20 2a 70 3b 0a 20 20  i;.  Expr *p;.  
bfc0: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
bfd0: 69 74 65 6d 20 2a 61 3b 0a 0a 20 20 61 73 73 65  item *a;..  asse
bfe0: 72 74 28 20 70 53 65 6c 65 63 74 21 3d 30 20 29  rt( pSelect!=0 )
bff0: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 53 65  ;.  assert( (pSe
c000: 6c 65 63 74 2d 3e 73 65 6c 46 6c 61 67 73 20 26  lect->selFlags &
c010: 20 53 46 5f 52 65 73 6f 6c 76 65 64 29 21 3d 30   SF_Resolved)!=0
c020: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 43   );.  assert( nC
c030: 6f 6c 3d 3d 70 53 65 6c 65 63 74 2d 3e 70 45 4c  ol==pSelect->pEL
c040: 69 73 74 2d 3e 6e 45 78 70 72 20 7c 7c 20 64 62  ist->nExpr || db
c050: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
c060: 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
c070: 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72  ocFailed ) retur
c080: 6e 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 4e 43  n;.  memset(&sNC
c090: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29  , 0, sizeof(sNC)
c0a0: 29 3b 0a 20 20 73 4e 43 2e 70 53 72 63 4c 69 73  );.  sNC.pSrcLis
c0b0: 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 53 72  t = pSelect->pSr
c0c0: 63 3b 0a 20 20 61 20 3d 20 70 53 65 6c 65 63 74  c;.  a = pSelect
c0d0: 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 66  ->pEList->a;.  f
c0e0: 6f 72 28 69 3d 30 2c 20 70 43 6f 6c 3d 61 43 6f  or(i=0, pCol=aCo
c0f0: 6c 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 2c 20  l; i<nCol; i++, 
c100: 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 70 20 3d  pCol++){.    p =
c110: 20 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20   a[i].pExpr;.   
c120: 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 20 3d 20 73   pCol->zType = s
c130: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
c140: 62 2c 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73  b, columnType(&s
c150: 4e 43 2c 20 70 2c 20 30 2c 20 30 2c 20 30 29 29  NC, p, 0, 0, 0))
c160: 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 61 66 66 69  ;.    pCol->affi
c170: 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33 45 78  nity = sqlite3Ex
c180: 70 72 41 66 66 69 6e 69 74 79 28 70 29 3b 0a 20  prAffinity(p);. 
c190: 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 61 66 66     if( pCol->aff
c1a0: 69 6e 69 74 79 3d 3d 30 20 29 20 70 43 6f 6c 2d  inity==0 ) pCol-
c1b0: 3e 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c 49  >affinity = SQLI
c1c0: 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20  TE_AFF_NONE;.   
c1d0: 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
c1e0: 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
c1f0: 73 65 2c 20 70 29 3b 0a 20 20 20 20 69 66 28 20  se, p);.    if( 
c200: 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 70  pColl ){.      p
c210: 43 6f 6c 2d 3e 7a 43 6f 6c 6c 20 3d 20 73 71 6c  Col->zColl = sql
c220: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
c230: 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a   pColl->zName);.
c240: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
c250: 2a 2a 20 47 69 76 65 6e 20 61 20 53 45 4c 45 43  ** Given a SELEC
c260: 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 67 65 6e  T statement, gen
c270: 65 72 61 74 65 20 61 20 54 61 62 6c 65 20 73 74  erate a Table st
c280: 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65 73  ructure that des
c290: 63 72 69 62 65 73 0a 2a 2a 20 74 68 65 20 72 65  cribes.** the re
c2a0: 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 61 74  sult set of that
c2b0: 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 54 61 62 6c   SELECT..*/.Tabl
c2c0: 65 20 2a 73 71 6c 69 74 65 33 52 65 73 75 6c 74  e *sqlite3Result
c2d0: 53 65 74 4f 66 53 65 6c 65 63 74 28 50 61 72 73  SetOfSelect(Pars
c2e0: 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63  e *pParse, Selec
c2f0: 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 54  t *pSelect){.  T
c300: 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 73 71  able *pTab;.  sq
c310: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
c320: 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 73 61  se->db;.  int sa
c330: 76 65 64 46 6c 61 67 73 3b 0a 0a 20 20 73 61 76  vedFlags;..  sav
c340: 65 64 46 6c 61 67 73 20 3d 20 64 62 2d 3e 66 6c  edFlags = db->fl
c350: 61 67 73 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73  ags;.  db->flags
c360: 20 26 3d 20 7e 53 51 4c 49 54 45 5f 46 75 6c 6c   &= ~SQLITE_Full
c370: 43 6f 6c 4e 61 6d 65 73 3b 0a 20 20 64 62 2d 3e  ColNames;.  db->
c380: 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
c390: 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 3b 0a 20  ShortColNames;. 
c3a0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 50 72   sqlite3SelectPr
c3b0: 65 70 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65  ep(pParse, pSele
c3c0: 63 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 50  ct, 0);.  if( pP
c3d0: 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 72 65 74  arse->nErr ) ret
c3e0: 75 72 6e 20 30 3b 0a 20 20 77 68 69 6c 65 28 20  urn 0;.  while( 
c3f0: 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 20  pSelect->pPrior 
c400: 29 20 70 53 65 6c 65 63 74 20 3d 20 70 53 65 6c  ) pSelect = pSel
c410: 65 63 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 64  ect->pPrior;.  d
c420: 62 2d 3e 66 6c 61 67 73 20 3d 20 73 61 76 65 64  b->flags = saved
c430: 46 6c 61 67 73 3b 0a 20 20 70 54 61 62 20 3d 20  Flags;.  pTab = 
c440: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
c450: 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 54  ero(db, sizeof(T
c460: 61 62 6c 65 29 20 29 3b 0a 20 20 69 66 28 20 70  able) );.  if( p
c470: 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  Tab==0 ){.    re
c480: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 2f 2a  turn 0;.  }.  /*
c490: 20 54 68 65 20 73 71 6c 69 74 65 33 52 65 73 75   The sqlite3Resu
c4a0: 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 29 20  ltSetOfSelect() 
c4b0: 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 6e 20 63  is only used n c
c4c0: 6f 6e 74 65 78 74 73 20 77 68 65 72 65 20 6c 6f  ontexts where lo
c4d0: 6f 6b 61 73 69 64 65 0a 20 20 2a 2a 20 69 73 20  okaside.  ** is 
c4e0: 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 61 73  disabled */.  as
c4f0: 73 65 72 74 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73  sert( db->lookas
c500: 69 64 65 2e 62 45 6e 61 62 6c 65 64 3d 3d 30 20  ide.bEnabled==0 
c510: 29 3b 0a 20 20 70 54 61 62 2d 3e 6e 52 65 66 20  );.  pTab->nRef 
c520: 3d 20 31 3b 0a 20 20 70 54 61 62 2d 3e 7a 4e 61  = 1;.  pTab->zNa
c530: 6d 65 20 3d 20 30 3b 0a 20 20 70 54 61 62 2d 3e  me = 0;.  pTab->
c540: 6e 52 6f 77 45 73 74 20 3d 20 31 30 30 30 30 30  nRowEst = 100000
c550: 30 3b 0a 20 20 73 65 6c 65 63 74 43 6f 6c 75 6d  0;.  selectColum
c560: 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70  nsFromExprList(p
c570: 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2d 3e  Parse, pSelect->
c580: 70 45 4c 69 73 74 2c 20 26 70 54 61 62 2d 3e 6e  pEList, &pTab->n
c590: 43 6f 6c 2c 20 26 70 54 61 62 2d 3e 61 43 6f 6c  Col, &pTab->aCol
c5a0: 29 3b 0a 20 20 73 65 6c 65 63 74 41 64 64 43 6f  );.  selectAddCo
c5b0: 6c 75 6d 6e 54 79 70 65 41 6e 64 43 6f 6c 6c 61  lumnTypeAndColla
c5c0: 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 70 54 61  tion(pParse, pTa
c5d0: 62 2d 3e 6e 43 6f 6c 2c 20 70 54 61 62 2d 3e 61  b->nCol, pTab->a
c5e0: 43 6f 6c 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20  Col, pSelect);. 
c5f0: 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d   pTab->iPKey = -
c600: 31 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  1;.  if( db->mal
c610: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
c620: 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61   sqlite3DeleteTa
c630: 62 6c 65 28 64 62 2c 20 70 54 61 62 29 3b 0a 20  ble(db, pTab);. 
c640: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
c650: 0a 20 20 72 65 74 75 72 6e 20 70 54 61 62 3b 0a  .  return pTab;.
c660: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 56  }../*.** Get a V
c670: 44 42 45 20 66 6f 72 20 74 68 65 20 67 69 76 65  DBE for the give
c680: 6e 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74  n parser context
c690: 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  .  Create a new 
c6a0: 6f 6e 65 20 69 66 20 6e 65 63 65 73 73 61 72 79  one if necessary
c6b0: 2e 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  ..** If an error
c6c0: 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20   occurs, return 
c6d0: 4e 55 4c 4c 20 61 6e 64 20 6c 65 61 76 65 20 61  NULL and leave a
c6e0: 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72   message in pPar
c6f0: 73 65 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73 71 6c  se..*/.Vdbe *sql
c700: 69 74 65 33 47 65 74 56 64 62 65 28 50 61 72 73  ite3GetVdbe(Pars
c710: 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 56 64  e *pParse){.  Vd
c720: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
c730: 70 56 64 62 65 3b 0a 20 20 69 66 28 20 76 3d 3d  pVdbe;.  if( v==
c740: 30 20 29 7b 0a 20 20 20 20 76 20 3d 20 70 50 61  0 ){.    v = pPa
c750: 72 73 65 2d 3e 70 56 64 62 65 20 3d 20 73 71 6c  rse->pVdbe = sql
c760: 69 74 65 33 56 64 62 65 43 72 65 61 74 65 28 70  ite3VdbeCreate(p
c770: 50 61 72 73 65 2d 3e 64 62 29 3b 0a 23 69 66 6e  Parse->db);.#ifn
c780: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
c790: 54 52 41 43 45 0a 20 20 20 20 69 66 28 20 76 20  TRACE.    if( v 
c7a0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
c7b0: 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50  VdbeAddOp0(v, OP
c7c0: 5f 54 72 61 63 65 29 3b 0a 20 20 20 20 7d 0a 23  _Trace);.    }.#
c7d0: 65 6e 64 69 66 0a 20 20 7d 0a 20 20 72 65 74 75  endif.  }.  retu
c7e0: 72 6e 20 76 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  rn v;.}.../*.** 
c7f0: 43 6f 6d 70 75 74 65 20 74 68 65 20 69 4c 69 6d  Compute the iLim
c800: 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20 66  it and iOffset f
c810: 69 65 6c 64 73 20 6f 66 20 74 68 65 20 53 45 4c  ields of the SEL
c820: 45 43 54 20 62 61 73 65 64 20 6f 6e 20 74 68 65  ECT based on the
c830: 0a 2a 2a 20 70 4c 69 6d 69 74 20 61 6e 64 20 70  .** pLimit and p
c840: 4f 66 66 73 65 74 20 65 78 70 72 65 73 73 69 6f  Offset expressio
c850: 6e 73 2e 20 20 70 4c 69 6d 69 74 20 61 6e 64 20  ns.  pLimit and 
c860: 70 4f 66 66 73 65 74 20 68 6f 6c 64 20 74 68 65  pOffset hold the
c870: 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20   expressions.** 
c880: 74 68 61 74 20 61 70 70 65 61 72 20 69 6e 20 74  that appear in t
c890: 68 65 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20  he original SQL 
c8a0: 73 74 61 74 65 6d 65 6e 74 20 61 66 74 65 72 20  statement after 
c8b0: 74 68 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46  the LIMIT and OF
c8c0: 46 53 45 54 0a 2a 2a 20 6b 65 79 77 6f 72 64 73  FSET.** keywords
c8d0: 2e 20 20 4f 72 20 4e 55 4c 4c 20 69 66 20 74 68  .  Or NULL if th
c8e0: 6f 73 65 20 6b 65 79 77 6f 72 64 73 20 61 72 65  ose keywords are
c8f0: 20 6f 6d 69 74 74 65 64 2e 20 69 4c 69 6d 69 74   omitted. iLimit
c900: 20 61 6e 64 20 69 4f 66 66 73 65 74 20 0a 2a 2a   and iOffset .**
c910: 20 61 72 65 20 74 68 65 20 69 6e 74 65 67 65 72   are the integer
c920: 20 6d 65 6d 6f 72 79 20 72 65 67 69 73 74 65 72   memory register
c930: 20 6e 75 6d 62 65 72 73 20 66 6f 72 20 63 6f 75   numbers for cou
c940: 6e 74 65 72 73 20 75 73 65 64 20 74 6f 20 63 6f  nters used to co
c950: 6d 70 75 74 65 20 0a 2a 2a 20 74 68 65 20 6c 69  mpute .** the li
c960: 6d 69 74 20 61 6e 64 20 6f 66 66 73 65 74 2e 20  mit and offset. 
c970: 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   If there is no 
c980: 6c 69 6d 69 74 20 61 6e 64 2f 6f 72 20 6f 66 66  limit and/or off
c990: 73 65 74 2c 20 74 68 65 6e 20 0a 2a 2a 20 69 4c  set, then .** iL
c9a0: 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74  imit and iOffset
c9b0: 20 61 72 65 20 6e 65 67 61 74 69 76 65 2e 0a 2a   are negative..*
c9c0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
c9d0: 65 20 63 68 61 6e 67 65 73 20 74 68 65 20 76 61  e changes the va
c9e0: 6c 75 65 73 20 6f 66 20 69 4c 69 6d 69 74 20 61  lues of iLimit a
c9f0: 6e 64 20 69 4f 66 66 73 65 74 20 6f 6e 6c 79 20  nd iOffset only 
ca00: 69 66 0a 2a 2a 20 61 20 6c 69 6d 69 74 20 6f 72  if.** a limit or
ca10: 20 6f 66 66 73 65 74 20 69 73 20 64 65 66 69 6e   offset is defin
ca20: 65 64 20 62 79 20 70 4c 69 6d 69 74 20 61 6e 64  ed by pLimit and
ca30: 20 70 4f 66 66 73 65 74 2e 20 20 69 4c 69 6d 69   pOffset.  iLimi
ca40: 74 20 61 6e 64 0a 2a 2a 20 69 4f 66 66 73 65 74  t and.** iOffset
ca50: 20 73 68 6f 75 6c 64 20 68 61 76 65 20 62 65 65   should have bee
ca60: 6e 20 70 72 65 73 65 74 20 74 6f 20 61 70 70 72  n preset to appr
ca70: 6f 70 72 69 61 74 65 20 64 65 66 61 75 6c 74 20  opriate default 
ca80: 76 61 6c 75 65 73 0a 2a 2a 20 28 75 73 75 61 6c  values.** (usual
ca90: 6c 79 20 62 75 74 20 6e 6f 74 20 61 6c 77 61 79  ly but not alway
caa0: 73 20 2d 31 29 20 70 72 69 6f 72 20 74 6f 20 63  s -1) prior to c
cab0: 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74  alling this rout
cac0: 69 6e 65 2e 0a 2a 2a 20 4f 6e 6c 79 20 69 66 20  ine..** Only if 
cad0: 70 4c 69 6d 69 74 21 3d 30 20 6f 72 20 70 4f 66  pLimit!=0 or pOf
cae0: 66 73 65 74 21 3d 30 20 64 6f 20 74 68 65 20 6c  fset!=0 do the l
caf0: 69 6d 69 74 20 72 65 67 69 73 74 65 72 73 20 67  imit registers g
cb00: 65 74 0a 2a 2a 20 72 65 64 65 66 69 6e 65 64 2e  et.** redefined.
cb10: 20 20 54 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20    The UNION ALL 
cb20: 6f 70 65 72 61 74 6f 72 20 75 73 65 73 20 74 68  operator uses th
cb30: 69 73 20 70 72 6f 70 65 72 74 79 20 74 6f 20 66  is property to f
cb40: 6f 72 63 65 0a 2a 2a 20 74 68 65 20 72 65 75 73  orce.** the reus
cb50: 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6c 69  e of the same li
cb60: 6d 69 74 20 61 6e 64 20 6f 66 66 73 65 74 20 72  mit and offset r
cb70: 65 67 69 73 74 65 72 73 20 61 63 72 6f 73 73 20  egisters across 
cb80: 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 53 45 4c 45  multiple.** SELE
cb90: 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a  CT statements..*
cba0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f  /.static void co
cbb0: 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74  mputeLimitRegist
cbc0: 65 72 73 28 50 61 72 73 65 20 2a 70 50 61 72 73  ers(Parse *pPars
cbd0: 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e  e, Select *p, in
cbe0: 74 20 69 42 72 65 61 6b 29 7b 0a 20 20 56 64 62  t iBreak){.  Vdb
cbf0: 65 20 2a 76 20 3d 20 30 3b 0a 20 20 69 6e 74 20  e *v = 0;.  int 
cc00: 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 69 6e  iLimit = 0;.  in
cc10: 74 20 69 4f 66 66 73 65 74 3b 0a 20 20 69 6e 74  t iOffset;.  int
cc20: 20 61 64 64 72 31 2c 20 6e 3b 0a 20 20 69 66 28   addr1, n;.  if(
cc30: 20 70 2d 3e 69 4c 69 6d 69 74 20 29 20 72 65 74   p->iLimit ) ret
cc40: 75 72 6e 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a  urn;..  /* .  **
cc50: 20 22 4c 49 4d 49 54 20 2d 31 22 20 61 6c 77 61   "LIMIT -1" alwa
cc60: 79 73 20 73 68 6f 77 73 20 61 6c 6c 20 72 6f 77  ys shows all row
cc70: 73 2e 20 20 54 68 65 72 65 20 69 73 20 73 6f 6d  s.  There is som
cc80: 65 0a 20 20 2a 2a 20 63 6f 6e 74 72 61 76 65 72  e.  ** contraver
cc90: 73 79 20 61 62 6f 75 74 20 77 68 61 74 20 74 68  sy about what th
cca0: 65 20 63 6f 72 72 65 63 74 20 62 65 68 61 76 69  e correct behavi
ccb0: 6f 72 20 73 68 6f 75 6c 64 20 62 65 2e 0a 20 20  or should be..  
ccc0: 2a 2a 20 54 68 65 20 63 75 72 72 65 6e 74 20 69  ** The current i
ccd0: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 6e  mplementation in
cce0: 74 65 72 70 72 65 74 73 20 22 4c 49 4d 49 54 20  terprets "LIMIT 
ccf0: 30 22 20 74 6f 20 6d 65 61 6e 0a 20 20 2a 2a 20  0" to mean.  ** 
cd00: 6e 6f 20 72 6f 77 73 2e 0a 20 20 2a 2f 0a 20 20  no rows..  */.  
cd10: 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
cd20: 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20  Clear(pParse);. 
cd30: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 66 66   assert( p->pOff
cd40: 73 65 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70 4c 69  set==0 || p->pLi
cd50: 6d 69 74 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  mit!=0 );.  if( 
cd60: 70 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20  p->pLimit ){.   
cd70: 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 69 4c 69   p->iLimit = iLi
cd80: 6d 69 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  mit = ++pParse->
cd90: 6e 4d 65 6d 3b 0a 20 20 20 20 76 20 3d 20 73 71  nMem;.    v = sq
cda0: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
cdb0: 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20 4e 45  rse);.    if( NE
cdc0: 56 45 52 28 76 3d 3d 30 29 20 29 20 72 65 74 75  VER(v==0) ) retu
cdd0: 72 6e 3b 20 20 2f 2a 20 56 44 42 45 20 73 68 6f  rn;  /* VDBE sho
cde0: 75 6c 64 20 68 61 76 65 20 61 6c 72 65 61 64 79  uld have already
cdf0: 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20   been allocated 
ce00: 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  */.    if( sqlit
ce10: 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28  e3ExprIsInteger(
ce20: 70 2d 3e 70 4c 69 6d 69 74 2c 20 26 6e 29 20 29  p->pLimit, &n) )
ce30: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
ce40: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
ce50: 49 6e 74 65 67 65 72 2c 20 6e 2c 20 69 4c 69 6d  Integer, n, iLim
ce60: 69 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  it);.      VdbeC
ce70: 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c 49 4d 49  omment((v, "LIMI
ce80: 54 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20  T counter"));.  
ce90: 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a      if( n==0 ){.
cea0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
ceb0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
cec0: 47 6f 74 6f 2c 20 30 2c 20 69 42 72 65 61 6b 29  Goto, 0, iBreak)
ced0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
cee0: 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 53         if( p->nS
cef0: 65 6c 65 63 74 52 6f 77 20 3e 20 28 64 6f 75 62  electRow > (doub
cf00: 6c 65 29 6e 20 29 20 70 2d 3e 6e 53 65 6c 65 63  le)n ) p->nSelec
cf10: 74 52 6f 77 20 3d 20 28 64 6f 75 62 6c 65 29 6e  tRow = (double)n
cf20: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
cf30: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
cf40: 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
cf50: 65 2c 20 70 2d 3e 70 4c 69 6d 69 74 2c 20 69 4c  e, p->pLimit, iL
cf60: 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  imit);.      sql
cf70: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
cf80: 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20  , OP_MustBeInt, 
cf90: 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 56  iLimit);.      V
cfa0: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
cfb0: 4c 49 4d 49 54 20 63 6f 75 6e 74 65 72 22 29 29  LIMIT counter"))
cfc0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
cfd0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
cfe0: 49 66 5a 65 72 6f 2c 20 69 4c 69 6d 69 74 2c 20  IfZero, iLimit, 
cff0: 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 7d 0a 20  iBreak);.    }. 
d000: 20 20 20 69 66 28 20 70 2d 3e 70 4f 66 66 73 65     if( p->pOffse
d010: 74 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69 4f  t ){.      p->iO
d020: 66 66 73 65 74 20 3d 20 69 4f 66 66 73 65 74 20  ffset = iOffset 
d030: 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
d040: 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
d050: 6e 4d 65 6d 2b 2b 3b 20 20 20 2f 2a 20 41 6c 6c  nMem++;   /* All
d060: 6f 63 61 74 65 20 61 6e 20 65 78 74 72 61 20 72  ocate an extra r
d070: 65 67 69 73 74 65 72 20 66 6f 72 20 6c 69 6d 69  egister for limi
d080: 74 2b 6f 66 66 73 65 74 20 2a 2f 0a 20 20 20 20  t+offset */.    
d090: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
d0a0: 65 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 4f 66  e(pParse, p->pOf
d0b0: 66 73 65 74 2c 20 69 4f 66 66 73 65 74 29 3b 0a  fset, iOffset);.
d0c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
d0d0: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4d 75  eAddOp1(v, OP_Mu
d0e0: 73 74 42 65 49 6e 74 2c 20 69 4f 66 66 73 65 74  stBeInt, iOffset
d0f0: 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
d100: 6d 65 6e 74 28 28 76 2c 20 22 4f 46 46 53 45 54  ment((v, "OFFSET
d110: 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20 20   counter"));.   
d120: 20 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74     addr1 = sqlit
d130: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
d140: 4f 50 5f 49 66 50 6f 73 2c 20 69 4f 66 66 73 65  OP_IfPos, iOffse
d150: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
d160: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
d170: 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 69 4f  P_Integer, 0, iO
d180: 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 73 71  ffset);.      sq
d190: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
d1a0: 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 20  e(v, addr1);.   
d1b0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
d1c0: 64 4f 70 33 28 76 2c 20 4f 50 5f 41 64 64 2c 20  dOp3(v, OP_Add, 
d1d0: 69 4c 69 6d 69 74 2c 20 69 4f 66 66 73 65 74 2c  iLimit, iOffset,
d1e0: 20 69 4f 66 66 73 65 74 2b 31 29 3b 0a 20 20 20   iOffset+1);.   
d1f0: 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
d200: 76 2c 20 22 4c 49 4d 49 54 2b 4f 46 46 53 45 54  v, "LIMIT+OFFSET
d210: 22 29 29 3b 0a 20 20 20 20 20 20 61 64 64 72 31  "));.      addr1
d220: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
d230: 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 50 6f 73  dOp1(v, OP_IfPos
d240: 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20  , iLimit);.     
d250: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
d260: 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
d270: 2c 20 2d 31 2c 20 69 4f 66 66 73 65 74 2b 31 29  , -1, iOffset+1)
d280: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
d290: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
d2a0: 64 64 72 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ddr1);.    }.  }
d2b0: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
d2c0: 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  TE_OMIT_COMPOUND
d2d0: 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 52 65  _SELECT./*.** Re
d2e0: 74 75 72 6e 20 74 68 65 20 61 70 70 72 6f 70 72  turn the appropr
d2f0: 69 61 74 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73  iate collating s
d300: 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20  equence for the 
d310: 69 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f  iCol-th column o
d320: 66 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20  f.** the result 
d330: 73 65 74 20 66 6f 72 20 74 68 65 20 63 6f 6d 70  set for the comp
d340: 6f 75 6e 64 2d 73 65 6c 65 63 74 20 73 74 61 74  ound-select stat
d350: 65 6d 65 6e 74 20 22 70 22 2e 20 20 52 65 74 75  ement "p".  Retu
d360: 72 6e 20 4e 55 4c 4c 20 69 66 0a 2a 2a 20 74 68  rn NULL if.** th
d370: 65 20 63 6f 6c 75 6d 6e 20 68 61 73 20 6e 6f 20  e column has no 
d380: 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6e  default collatin
d390: 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a  g sequence..**.*
d3a0: 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20  * The collating 
d3b0: 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65  sequence for the
d3c0: 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74   compound select
d3d0: 20 69 73 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74   is taken from t
d3e0: 68 65 0a 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74 20  he.** left-most 
d3f0: 74 65 72 6d 20 6f 66 20 74 68 65 20 73 65 6c 65  term of the sele
d400: 63 74 20 74 68 61 74 20 68 61 73 20 61 20 63 6f  ct that has a co
d410: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
d420: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 43 6f 6c 6c  ..*/.static Coll
d430: 53 65 71 20 2a 6d 75 6c 74 69 53 65 6c 65 63 74  Seq *multiSelect
d440: 43 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70  CollSeq(Parse *p
d450: 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70  Parse, Select *p
d460: 2c 20 69 6e 74 20 69 43 6f 6c 29 7b 0a 20 20 43  , int iCol){.  C
d470: 6f 6c 6c 53 65 71 20 2a 70 52 65 74 3b 0a 20 20  ollSeq *pRet;.  
d480: 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b  if( p->pPrior ){
d490: 0a 20 20 20 20 70 52 65 74 20 3d 20 6d 75 6c 74  .    pRet = mult
d4a0: 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70  iSelectCollSeq(p
d4b0: 50 61 72 73 65 2c 20 70 2d 3e 70 50 72 69 6f 72  Parse, p->pPrior
d4c0: 2c 20 69 43 6f 6c 29 3b 0a 20 20 7d 65 6c 73 65  , iCol);.  }else
d4d0: 7b 0a 20 20 20 20 70 52 65 74 20 3d 20 30 3b 0a  {.    pRet = 0;.
d4e0: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 69 43    }.  assert( iC
d4f0: 6f 6c 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  ol>=0 );.  if( p
d500: 52 65 74 3d 3d 30 20 26 26 20 69 43 6f 6c 3c 70  Ret==0 && iCol<p
d510: 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  ->pEList->nExpr 
d520: 29 7b 0a 20 20 20 20 70 52 65 74 20 3d 20 73 71  ){.    pRet = sq
d530: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
d540: 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 45 4c 69  (pParse, p->pELi
d550: 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78 70  st->a[iCol].pExp
d560: 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  r);.  }.  return
d570: 20 70 52 65 74 3b 0a 7d 0a 23 65 6e 64 69 66 20   pRet;.}.#endif 
d580: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  /* SQLITE_OMIT_C
d590: 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a  OMPOUND_SELECT *
d5a0: 2f 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65  /../* Forward re
d5b0: 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69  ference */.stati
d5c0: 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63  c int multiSelec
d5d0: 74 4f 72 64 65 72 42 79 28 0a 20 20 50 61 72 73  tOrderBy(.  Pars
d5e0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
d5f0: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
d600: 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
d610: 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
d620: 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73  /* The right-mos
d630: 74 20 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20  t of SELECTs to 
d640: 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65  be coded */.  Se
d650: 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20  lectDest *pDest 
d660: 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64      /* What to d
d670: 6f 20 77 69 74 68 20 71 75 65 72 79 20 72 65 73  o with query res
d680: 75 6c 74 73 20 2a 2f 0a 29 3b 0a 0a 0a 23 69 66  ults */.);...#if
d690: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
d6a0: 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
d6b0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
d6c0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ine is called to
d6d0: 20 70 72 6f 63 65 73 73 20 61 20 63 6f 6d 70 6f   process a compo
d6e0: 75 6e 64 20 71 75 65 72 79 20 66 6f 72 6d 20 66  und query form f
d6f0: 72 6f 6d 0a 2a 2a 20 74 77 6f 20 6f 72 20 6d 6f  rom.** two or mo
d700: 72 65 20 73 65 70 61 72 61 74 65 20 71 75 65 72  re separate quer
d710: 69 65 73 20 75 73 69 6e 67 20 55 4e 49 4f 4e 2c  ies using UNION,
d720: 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20 45 58 43 45   UNION ALL, EXCE
d730: 50 54 2c 20 6f 72 0a 2a 2a 20 49 4e 54 45 52 53  PT, or.** INTERS
d740: 45 43 54 0a 2a 2a 0a 2a 2a 20 22 70 22 20 70 6f  ECT.**.** "p" po
d750: 69 6e 74 73 20 74 6f 20 74 68 65 20 72 69 67 68  ints to the righ
d760: 74 2d 6d 6f 73 74 20 6f 66 20 74 68 65 20 74 77  t-most of the tw
d770: 6f 20 71 75 65 72 69 65 73 2e 20 20 74 68 65 20  o queries.  the 
d780: 71 75 65 72 79 20 6f 6e 20 74 68 65 0a 2a 2a 20  query on the.** 
d790: 6c 65 66 74 20 69 73 20 70 2d 3e 70 50 72 69 6f  left is p->pPrio
d7a0: 72 2e 20 20 54 68 65 20 6c 65 66 74 20 71 75 65  r.  The left que
d7b0: 72 79 20 63 6f 75 6c 64 20 61 6c 73 6f 20 62 65  ry could also be
d7c0: 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72   a compound quer
d7d0: 79 0a 2a 2a 20 69 6e 20 77 68 69 63 68 20 63 61  y.** in which ca
d7e0: 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  se this routine 
d7f0: 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 72  will be called r
d800: 65 63 75 72 73 69 76 65 6c 79 2e 20 0a 2a 2a 0a  ecursively. .**.
d810: 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20 6f  ** The results o
d820: 66 20 74 68 65 20 74 6f 74 61 6c 20 71 75 65 72  f the total quer
d830: 79 20 61 72 65 20 74 6f 20 62 65 20 77 72 69 74  y are to be writ
d840: 74 65 6e 20 69 6e 74 6f 20 61 20 64 65 73 74 69  ten into a desti
d850: 6e 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74 79 70  nation.** of typ
d860: 65 20 65 44 65 73 74 20 77 69 74 68 20 70 61 72  e eDest with par
d870: 61 6d 65 74 65 72 20 69 50 61 72 6d 2e 0a 2a 2a  ameter iParm..**
d880: 0a 2a 2a 20 45 78 61 6d 70 6c 65 20 31 3a 20 20  .** Example 1:  
d890: 43 6f 6e 73 69 64 65 72 20 61 20 74 68 72 65 65  Consider a three
d8a0: 2d 77 61 79 20 63 6f 6d 70 6f 75 6e 64 20 53 51  -way compound SQ
d8b0: 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a  L statement..**.
d8c0: 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61 20  **     SELECT a 
d8d0: 46 52 4f 4d 20 74 31 20 55 4e 49 4f 4e 20 53 45  FROM t1 UNION SE
d8e0: 4c 45 43 54 20 62 20 46 52 4f 4d 20 74 32 20 55  LECT b FROM t2 U
d8f0: 4e 49 4f 4e 20 53 45 4c 45 43 54 20 63 20 46 52  NION SELECT c FR
d900: 4f 4d 20 74 33 0a 2a 2a 0a 2a 2a 20 54 68 69 73  OM t3.**.** This
d910: 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 70 61   statement is pa
d920: 72 73 65 64 20 75 70 20 61 73 20 66 6f 6c 6c 6f  rsed up as follo
d930: 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45  ws:.**.**     SE
d940: 4c 45 43 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a  LECT c FROM t3.*
d950: 2a 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20  *      |.**     
d960: 20 60 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54   `----->  SELECT
d970: 20 62 20 46 52 4f 4d 20 74 32 0a 2a 2a 20 20 20   b FROM t2.**   
d980: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a               |.*
d990: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
d9a0: 20 60 2d 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43   `------>  SELEC
d9b0: 54 20 61 20 46 52 4f 4d 20 74 31 0a 2a 2a 0a 2a  T a FROM t1.**.*
d9c0: 2a 20 54 68 65 20 61 72 72 6f 77 73 20 69 6e 20  * The arrows in 
d9d0: 74 68 65 20 64 69 61 67 72 61 6d 20 61 62 6f 76  the diagram abov
d9e0: 65 20 72 65 70 72 65 73 65 6e 74 20 74 68 65 20  e represent the 
d9f0: 53 65 6c 65 63 74 2e 70 50 72 69 6f 72 20 70 6f  Select.pPrior po
da00: 69 6e 74 65 72 2e 0a 2a 2a 20 53 6f 20 69 66 20  inter..** So if 
da10: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
da20: 63 61 6c 6c 65 64 20 77 69 74 68 20 70 20 65 71  called with p eq
da30: 75 61 6c 20 74 6f 20 74 68 65 20 74 33 20 71 75  ual to the t3 qu
da40: 65 72 79 2c 20 74 68 65 6e 0a 2a 2a 20 70 50 72  ery, then.** pPr
da50: 69 6f 72 20 77 69 6c 6c 20 62 65 20 74 68 65 20  ior will be the 
da60: 74 32 20 71 75 65 72 79 2e 20 20 70 2d 3e 6f 70  t2 query.  p->op
da70: 20 77 69 6c 6c 20 62 65 20 54 4b 5f 55 4e 49 4f   will be TK_UNIO
da80: 4e 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  N in this case..
da90: 2a 2a 0a 2a 2a 20 4e 6f 74 69 63 65 20 74 68 61  **.** Notice tha
daa0: 74 20 62 65 63 61 75 73 65 20 6f 66 20 74 68 65  t because of the
dab0: 20 77 61 79 20 53 51 4c 69 74 65 20 70 61 72 73   way SQLite pars
dac0: 65 73 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45  es compound SELE
dad0: 43 54 73 2c 20 74 68 65 0a 2a 2a 20 69 6e 64 69  CTs, the.** indi
dae0: 76 69 64 75 61 6c 20 73 65 6c 65 63 74 73 20 61  vidual selects a
daf0: 6c 77 61 79 73 20 67 72 6f 75 70 20 66 72 6f 6d  lways group from
db00: 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74 2e 0a   left to right..
db10: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 75  */.static int mu
db20: 6c 74 69 53 65 6c 65 63 74 28 0a 20 20 50 61 72  ltiSelect(.  Par
db30: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
db40: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
db50: 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ntext */.  Selec
db60: 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
db70: 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f   /* The right-mo
db80: 73 74 20 6f 66 20 53 45 4c 45 43 54 73 20 74 6f  st of SELECTs to
db90: 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53   be coded */.  S
dba0: 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74  electDest *pDest
dbb0: 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20       /* What to 
dbc0: 64 6f 20 77 69 74 68 20 71 75 65 72 79 20 72 65  do with query re
dbd0: 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  sults */.){.  in
dbe0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
dbf0: 3b 20 20 20 2f 2a 20 53 75 63 63 65 73 73 20 63  ;   /* Success c
dc00: 6f 64 65 20 66 72 6f 6d 20 61 20 73 75 62 72 6f  ode from a subro
dc10: 75 74 69 6e 65 20 2a 2f 0a 20 20 53 65 6c 65 63  utine */.  Selec
dc20: 74 20 2a 70 50 72 69 6f 72 3b 20 20 20 20 20 20  t *pPrior;      
dc30: 20 2f 2a 20 41 6e 6f 74 68 65 72 20 53 45 4c 45   /* Another SELE
dc40: 43 54 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74  CT immediately t
dc50: 6f 20 6f 75 72 20 6c 65 66 74 20 2a 2f 0a 20 20  o our left */.  
dc60: 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20  Vdbe *v;        
dc70: 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
dc80: 65 20 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56  e code to this V
dc90: 44 42 45 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  DBE */.  SelectD
dca0: 65 73 74 20 64 65 73 74 3b 20 20 20 20 20 20 2f  est dest;      /
dcb0: 2a 20 41 6c 74 65 72 6e 61 74 69 76 65 20 64 61  * Alternative da
dcc0: 74 61 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 2a  ta destination *
dcd0: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 44 65 6c  /.  Select *pDel
dce0: 65 74 65 20 3d 20 30 3b 20 20 2f 2a 20 43 68 61  ete = 0;  /* Cha
dcf0: 69 6e 20 6f 66 20 73 69 6d 70 6c 65 20 73 65 6c  in of simple sel
dd00: 65 63 74 73 20 74 6f 20 64 65 6c 65 74 65 20 2a  ects to delete *
dd10: 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  /.  sqlite3 *db;
dd20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
dd30: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
dd40: 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
dd50: 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a  TE_OMIT_EXPLAIN.
dd60: 20 20 69 6e 74 20 69 53 75 62 31 3b 20 20 20 20    int iSub1;    
dd70: 20 20 20 20 20 20 20 20 2f 2a 20 45 51 50 20 69          /* EQP i
dd80: 64 20 6f 66 20 6c 65 66 74 2d 68 61 6e 64 20 71  d of left-hand q
dd90: 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 53  uery */.  int iS
dda0: 75 62 32 3b 20 20 20 20 20 20 20 20 20 20 20 20  ub2;            
ddb0: 2f 2a 20 45 51 50 20 69 64 20 6f 66 20 72 69 67  /* EQP id of rig
ddc0: 68 74 2d 68 61 6e 64 20 71 75 65 72 79 20 2a 2f  ht-hand query */
ddd0: 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4d 61  .#endif..  /* Ma
dde0: 6b 65 20 73 75 72 65 20 74 68 65 72 65 20 69 73  ke sure there is
ddf0: 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 6f 72 20   no ORDER BY or 
de00: 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 6f 6e 20  LIMIT clause on 
de10: 70 72 69 6f 72 20 53 45 4c 45 43 54 73 2e 20 20  prior SELECTs.  
de20: 4f 6e 6c 79 0a 20 20 2a 2a 20 74 68 65 20 6c 61  Only.  ** the la
de30: 73 74 20 28 72 69 67 68 74 2d 6d 6f 73 74 29 20  st (right-most) 
de40: 53 45 4c 45 43 54 20 69 6e 20 74 68 65 20 73 65  SELECT in the se
de50: 72 69 65 73 20 6d 61 79 20 68 61 76 65 20 61 6e  ries may have an
de60: 20 4f 52 44 45 52 20 42 59 20 6f 72 20 4c 49 4d   ORDER BY or LIM
de70: 49 54 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  IT..  */.  asser
de80: 74 28 20 70 20 26 26 20 70 2d 3e 70 50 72 69 6f  t( p && p->pPrio
de90: 72 20 29 3b 20 20 2f 2a 20 43 61 6c 6c 69 6e 67  r );  /* Calling
dea0: 20 66 75 6e 63 74 69 6f 6e 20 67 75 61 72 61 6e   function guaran
deb0: 74 65 65 73 20 74 68 69 73 20 6d 75 63 68 20 2a  tees this much *
dec0: 2f 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d  /.  db = pParse-
ded0: 3e 64 62 3b 0a 20 20 70 50 72 69 6f 72 20 3d 20  >db;.  pPrior = 
dee0: 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 61 73 73  p->pPrior;.  ass
def0: 65 72 74 28 20 70 50 72 69 6f 72 2d 3e 70 52 69  ert( pPrior->pRi
df00: 67 68 74 6d 6f 73 74 21 3d 70 50 72 69 6f 72 20  ghtmost!=pPrior 
df10: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 72  );.  assert( pPr
df20: 69 6f 72 2d 3e 70 52 69 67 68 74 6d 6f 73 74 3d  ior->pRightmost=
df30: 3d 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 20 29  =p->pRightmost )
df40: 3b 0a 20 20 64 65 73 74 20 3d 20 2a 70 44 65 73  ;.  dest = *pDes
df50: 74 3b 0a 20 20 69 66 28 20 70 50 72 69 6f 72 2d  t;.  if( pPrior-
df60: 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  >pOrderBy ){.   
df70: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
df80: 28 70 50 61 72 73 65 2c 22 4f 52 44 45 52 20 42  (pParse,"ORDER B
df90: 59 20 63 6c 61 75 73 65 20 73 68 6f 75 6c 64 20  Y clause should 
dfa0: 63 6f 6d 65 20 61 66 74 65 72 20 25 73 20 6e 6f  come after %s no
dfb0: 74 20 62 65 66 6f 72 65 22 2c 0a 20 20 20 20 20  t before",.     
dfc0: 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d   selectOpName(p-
dfd0: 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63 20 3d 20  >op));.    rc = 
dfe0: 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74  1;.    goto mult
dff0: 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
e000: 7d 0a 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e  }.  if( pPrior->
e010: 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71  pLimit ){.    sq
e020: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
e030: 61 72 73 65 2c 22 4c 49 4d 49 54 20 63 6c 61 75  arse,"LIMIT clau
e040: 73 65 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20 61  se should come a
e050: 66 74 65 72 20 25 73 20 6e 6f 74 20 62 65 66 6f  fter %s not befo
e060: 72 65 22 2c 0a 20 20 20 20 20 20 73 65 6c 65 63  re",.      selec
e070: 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b  tOpName(p->op));
e080: 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20  .    rc = 1;.   
e090: 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
e0a0: 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 76  ct_end;.  }..  v
e0b0: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
e0c0: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73  e(pParse);.  ass
e0d0: 65 72 74 28 20 76 21 3d 30 20 29 3b 20 20 2f 2a  ert( v!=0 );  /*
e0e0: 20 54 68 65 20 56 44 42 45 20 61 6c 72 65 61 64   The VDBE alread
e0f0: 79 20 63 72 65 61 74 65 64 20 62 79 20 63 61 6c  y created by cal
e100: 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  ling function */
e110: 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68  ..  /* Create th
e120: 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 74 65  e destination te
e130: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 66  mporary table if
e140: 20 6e 65 63 65 73 73 61 72 79 0a 20 20 2a 2f 0a   necessary.  */.
e150: 20 20 69 66 28 20 64 65 73 74 2e 65 44 65 73 74    if( dest.eDest
e160: 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29  ==SRT_EphemTab )
e170: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
e180: 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 73  >pEList );.    s
e190: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
e1a0: 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
e1b0: 65 72 61 6c 2c 20 64 65 73 74 2e 69 53 44 50 61  eral, dest.iSDPa
e1c0: 72 6d 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  rm, p->pEList->n
e1d0: 45 78 70 72 29 3b 0a 20 20 20 20 73 71 6c 69 74  Expr);.    sqlit
e1e0: 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
e1f0: 2c 20 42 54 52 45 45 5f 55 4e 4f 52 44 45 52 45  , BTREE_UNORDERE
e200: 44 29 3b 0a 20 20 20 20 64 65 73 74 2e 65 44 65  D);.    dest.eDe
e210: 73 74 20 3d 20 53 52 54 5f 54 61 62 6c 65 3b 0a  st = SRT_Table;.
e220: 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73    }..  /* Make s
e230: 75 72 65 20 61 6c 6c 20 53 45 4c 45 43 54 73 20  ure all SELECTs 
e240: 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  in the statement
e250: 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e   have the same n
e260: 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74  umber of element
e270: 73 0a 20 20 2a 2a 20 69 6e 20 74 68 65 69 72 20  s.  ** in their 
e280: 72 65 73 75 6c 74 20 73 65 74 73 2e 0a 20 20 2a  result sets..  *
e290: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  /.  assert( p->p
e2a0: 45 4c 69 73 74 20 26 26 20 70 50 72 69 6f 72 2d  EList && pPrior-
e2b0: 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 69 66 28  >pEList );.  if(
e2c0: 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
e2d0: 72 21 3d 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73  r!=pPrior->pELis
e2e0: 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  t->nExpr ){.    
e2f0: 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  if( p->selFlags 
e300: 26 20 53 46 5f 56 61 6c 75 65 73 20 29 7b 0a 20  & SF_Values ){. 
e310: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
e320: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61 6c  rMsg(pParse, "al
e330: 6c 20 56 41 4c 55 45 53 20 6d 75 73 74 20 68 61  l VALUES must ha
e340: 76 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62  ve the same numb
e350: 65 72 20 6f 66 20 74 65 72 6d 73 22 29 3b 0a 20  er of terms");. 
e360: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
e370: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
e380: 70 50 61 72 73 65 2c 20 22 53 45 4c 45 43 54 73  pParse, "SELECTs
e390: 20 74 6f 20 74 68 65 20 6c 65 66 74 20 61 6e 64   to the left and
e3a0: 20 72 69 67 68 74 20 6f 66 20 25 73 22 0a 20 20   right of %s".  
e3b0: 20 20 20 20 20 20 22 20 64 6f 20 6e 6f 74 20 68        " do not h
e3c0: 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d  ave the same num
e3d0: 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f  ber of result co
e3e0: 6c 75 6d 6e 73 22 2c 20 73 65 6c 65 63 74 4f 70  lumns", selectOp
e3f0: 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20  Name(p->op));.  
e400: 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a    }.    rc = 1;.
e410: 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
e420: 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a  elect_end;.  }..
e430: 20 20 2f 2a 20 43 6f 6d 70 6f 75 6e 64 20 53 45    /* Compound SE
e440: 4c 45 43 54 73 20 74 68 61 74 20 68 61 76 65 20  LECTs that have 
e450: 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
e460: 73 65 20 61 72 65 20 68 61 6e 64 6c 65 64 20 73  se are handled s
e470: 65 70 61 72 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a  eparately..  */.
e480: 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42    if( p->pOrderB
e490: 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  y ){.    return 
e4a0: 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72  multiSelectOrder
e4b0: 42 79 28 70 50 61 72 73 65 2c 20 70 2c 20 70 44  By(pParse, p, pD
e4c0: 65 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  est);.  }..  /* 
e4d0: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
e4e0: 72 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20 72  r the left and r
e4f0: 69 67 68 74 20 53 45 4c 45 43 54 20 73 74 61 74  ight SELECT stat
e500: 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 73  ements..  */.  s
e510: 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a  witch( p->op ){.
e520: 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a      case TK_ALL:
e530: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64   {.      int add
e540: 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74  r = 0;.      int
e550: 20 6e 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 61   nLimit;.      a
e560: 73 73 65 72 74 28 20 21 70 50 72 69 6f 72 2d 3e  ssert( !pPrior->
e570: 70 4c 69 6d 69 74 20 29 3b 0a 20 20 20 20 20 20  pLimit );.      
e580: 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 3d  pPrior->pLimit =
e590: 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20   p->pLimit;.    
e5a0: 20 20 70 50 72 69 6f 72 2d 3e 70 4f 66 66 73 65    pPrior->pOffse
e5b0: 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a  t = p->pOffset;.
e5c0: 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74        explainSet
e5d0: 49 6e 74 65 67 65 72 28 69 53 75 62 31 2c 20 70  Integer(iSub1, p
e5e0: 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65  Parse->iNextSele
e5f0: 63 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20  ctId);.      rc 
e600: 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  = sqlite3Select(
e610: 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20  pParse, pPrior, 
e620: 26 64 65 73 74 29 3b 0a 20 20 20 20 20 20 70 2d  &dest);.      p-
e630: 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20  >pLimit = 0;.   
e640: 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20     p->pOffset = 
e650: 30 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  0;.      if( rc 
e660: 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
e670: 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
e680: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
e690: 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20  p->pPrior = 0;. 
e6a0: 20 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d       p->iLimit =
e6b0: 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 3b   pPrior->iLimit;
e6c0: 0a 20 20 20 20 20 20 70 2d 3e 69 4f 66 66 73 65  .      p->iOffse
e6d0: 74 20 3d 20 70 50 72 69 6f 72 2d 3e 69 4f 66 66  t = pPrior->iOff
e6e0: 73 65 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70  set;.      if( p
e6f0: 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20  ->iLimit ){.    
e700: 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
e710: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
e720: 4f 50 5f 49 66 5a 65 72 6f 2c 20 70 2d 3e 69 4c  OP_IfZero, p->iL
e730: 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 20 20 56  imit);.        V
e740: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
e750: 4a 75 6d 70 20 61 68 65 61 64 20 69 66 20 4c 49  Jump ahead if LI
e760: 4d 49 54 20 72 65 61 63 68 65 64 22 29 29 3b 0a  MIT reached"));.
e770: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 65 78        }.      ex
e780: 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28  plainSetInteger(
e790: 69 53 75 62 32 2c 20 70 50 61 72 73 65 2d 3e 69  iSub2, pParse->i
e7a0: 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20  NextSelectId);. 
e7b0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
e7c0: 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
e7d0: 70 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20  p, &dest);.     
e7e0: 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53   testcase( rc!=S
e7f0: 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
e800: 20 20 70 44 65 6c 65 74 65 20 3d 20 70 2d 3e 70    pDelete = p->p
e810: 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e  Prior;.      p->
e820: 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b  pPrior = pPrior;
e830: 0a 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63  .      p->nSelec
e840: 74 52 6f 77 20 2b 3d 20 70 50 72 69 6f 72 2d 3e  tRow += pPrior->
e850: 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20  nSelectRow;.    
e860: 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70 4c    if( pPrior->pL
e870: 69 6d 69 74 0a 20 20 20 20 20 20 20 26 26 20 73  imit.       && s
e880: 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65  qlite3ExprIsInte
e890: 67 65 72 28 70 50 72 69 6f 72 2d 3e 70 4c 69 6d  ger(pPrior->pLim
e8a0: 69 74 2c 20 26 6e 4c 69 6d 69 74 29 0a 20 20 20  it, &nLimit).   
e8b0: 20 20 20 20 26 26 20 70 2d 3e 6e 53 65 6c 65 63      && p->nSelec
e8c0: 74 52 6f 77 20 3e 20 28 64 6f 75 62 6c 65 29 6e  tRow > (double)n
e8d0: 4c 69 6d 69 74 20 0a 20 20 20 20 20 20 29 7b 0a  Limit .      ){.
e8e0: 20 20 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65          p->nSele
e8f0: 63 74 52 6f 77 20 3d 20 28 64 6f 75 62 6c 65 29  ctRow = (double)
e900: 6e 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 7d 0a  nLimit;.      }.
e910: 20 20 20 20 20 20 69 66 28 20 61 64 64 72 20 29        if( addr )
e920: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
e930: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
e940: 20 61 64 64 72 29 3b 0a 20 20 20 20 20 20 7d 0a   addr);.      }.
e950: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
e960: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45   }.    case TK_E
e970: 58 43 45 50 54 3a 0a 20 20 20 20 63 61 73 65 20  XCEPT:.    case 
e980: 54 4b 5f 55 4e 49 4f 4e 3a 20 7b 0a 20 20 20 20  TK_UNION: {.    
e990: 20 20 69 6e 74 20 75 6e 69 6f 6e 54 61 62 3b 20    int unionTab; 
e9a0: 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d     /* Cursor num
e9b0: 62 65 72 20 6f 66 20 74 68 65 20 74 65 6d 70 6f  ber of the tempo
e9c0: 72 61 72 79 20 74 61 62 6c 65 20 68 6f 6c 64 69  rary table holdi
e9d0: 6e 67 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 20  ng result */.   
e9e0: 20 20 20 75 38 20 6f 70 20 3d 20 30 3b 20 20 20     u8 op = 0;   
e9f0: 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68      /* One of th
ea00: 65 20 53 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e  e SRT_ operation
ea10: 73 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 73 65  s to apply to se
ea20: 6c 66 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  lf */.      int 
ea30: 70 72 69 6f 72 4f 70 3b 20 20 20 20 20 2f 2a 20  priorOp;     /* 
ea40: 54 68 65 20 53 52 54 5f 20 6f 70 65 72 61 74 69  The SRT_ operati
ea50: 6f 6e 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 70  on to apply to p
ea60: 72 69 6f 72 20 73 65 6c 65 63 74 73 20 2a 2f 0a  rior selects */.
ea70: 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 69 6d        Expr *pLim
ea80: 69 74 2c 20 2a 70 4f 66 66 73 65 74 3b 20 2f 2a  it, *pOffset; /*
ea90: 20 53 61 76 65 64 20 76 61 6c 75 65 73 20 6f 66   Saved values of
eaa0: 20 70 2d 3e 6e 4c 69 6d 69 74 20 61 6e 64 20 70   p->nLimit and p
eab0: 2d 3e 6e 4f 66 66 73 65 74 20 2a 2f 0a 20 20 20  ->nOffset */.   
eac0: 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20     int addr;.   
ead0: 20 20 20 53 65 6c 65 63 74 44 65 73 74 20 75 6e     SelectDest un
eae0: 69 6f 6e 64 65 73 74 3b 0a 0a 20 20 20 20 20 20  iondest;..      
eaf0: 74 65 73 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d  testcase( p->op=
eb00: 3d 54 4b 5f 45 58 43 45 50 54 20 29 3b 0a 20 20  =TK_EXCEPT );.  
eb10: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 2d      testcase( p-
eb20: 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b  >op==TK_UNION );
eb30: 0a 20 20 20 20 20 20 70 72 69 6f 72 4f 70 20 3d  .      priorOp =
eb40: 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20   SRT_Union;.    
eb50: 20 20 69 66 28 20 64 65 73 74 2e 65 44 65 73 74    if( dest.eDest
eb60: 3d 3d 70 72 69 6f 72 4f 70 20 26 26 20 41 4c 57  ==priorOp && ALW
eb70: 41 59 53 28 21 70 2d 3e 70 4c 69 6d 69 74 20 26  AYS(!p->pLimit &
eb80: 26 21 70 2d 3e 70 4f 66 66 73 65 74 29 20 29 7b  &!p->pOffset) ){
eb90: 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 63  .        /* We c
eba0: 61 6e 20 72 65 75 73 65 20 61 20 74 65 6d 70 6f  an reuse a tempo
ebb0: 72 61 72 79 20 74 61 62 6c 65 20 67 65 6e 65 72  rary table gener
ebc0: 61 74 65 64 20 62 79 20 61 20 53 45 4c 45 43 54  ated by a SELECT
ebd0: 20 74 6f 20 6f 75 72 0a 20 20 20 20 20 20 20 20   to our.        
ebe0: 2a 2a 20 72 69 67 68 74 2e 0a 20 20 20 20 20 20  ** right..      
ebf0: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73    */.        ass
ec00: 65 72 74 28 20 70 2d 3e 70 52 69 67 68 74 6d 6f  ert( p->pRightmo
ec10: 73 74 21 3d 70 20 29 3b 20 20 2f 2a 20 43 61 6e  st!=p );  /* Can
ec20: 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 66 6f 72   only happen for
ec30: 20 6c 65 66 74 77 61 72 64 20 65 6c 65 6d 65 6e   leftward elemen
ec40: 74 73 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ts.             
ec50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ec60: 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 61 20          ** of a 
ec70: 33 2d 77 61 79 20 6f 72 20 6d 6f 72 65 20 63 6f  3-way or more co
ec80: 6d 70 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20  mpound */.      
ec90: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4c 69    assert( p->pLi
eca0: 6d 69 74 3d 3d 30 20 29 3b 20 20 20 20 20 20 2f  mit==0 );      /
ecb0: 2a 20 4e 6f 74 20 61 6c 6c 6f 77 65 64 20 6f 6e  * Not allowed on
ecc0: 20 6c 65 66 74 77 61 72 64 20 65 6c 65 6d 65 6e   leftward elemen
ecd0: 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73  ts */.        as
ece0: 73 65 72 74 28 20 70 2d 3e 70 4f 66 66 73 65 74  sert( p->pOffset
ecf0: 3d 3d 30 20 29 3b 20 20 20 20 20 2f 2a 20 4e 6f  ==0 );     /* No
ed00: 74 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 6c 65 66  t allowed on lef
ed10: 74 77 61 72 64 20 65 6c 65 6d 65 6e 74 73 20 2a  tward elements *
ed20: 2f 0a 20 20 20 20 20 20 20 20 75 6e 69 6f 6e 54  /.        unionT
ed30: 61 62 20 3d 20 64 65 73 74 2e 69 53 44 50 61 72  ab = dest.iSDPar
ed40: 6d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  m;.      }else{.
ed50: 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 77 69          /* We wi
ed60: 6c 6c 20 6e 65 65 64 20 74 6f 20 63 72 65 61 74  ll need to creat
ed70: 65 20 6f 75 72 20 6f 77 6e 20 74 65 6d 70 6f 72  e our own tempor
ed80: 61 72 79 20 74 61 62 6c 65 20 74 6f 20 68 6f 6c  ary table to hol
ed90: 64 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  d the.        **
eda0: 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 72 65   intermediate re
edb0: 73 75 6c 74 73 2e 0a 20 20 20 20 20 20 20 20 2a  sults..        *
edc0: 2f 0a 20 20 20 20 20 20 20 20 75 6e 69 6f 6e 54  /.        unionT
edd0: 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ab = pParse->nTa
ede0: 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 61 73 73  b++;.        ass
edf0: 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79  ert( p->pOrderBy
ee00: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61  ==0 );.        a
ee10: 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
ee20: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70  eAddOp2(v, OP_Op
ee30: 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 75 6e 69  enEphemeral, uni
ee40: 6f 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20  onTab, 0);.     
ee50: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64     assert( p->ad
ee60: 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d  drOpenEphm[0] ==
ee70: 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 70   -1 );.        p
ee80: 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30  ->addrOpenEphm[0
ee90: 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20  ] = addr;.      
eea0: 20 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 2d    p->pRightmost-
eeb0: 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f  >selFlags |= SF_
eec0: 55 73 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20  UsesEphemeral;. 
eed0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
eee0: 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20  ->pEList );.    
eef0: 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f    }..      /* Co
ef00: 64 65 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  de the SELECT st
ef10: 61 74 65 6d 65 6e 74 73 20 74 6f 20 6f 75 72 20  atements to our 
ef20: 6c 65 66 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20  left.      */.  
ef30: 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50 72      assert( !pPr
ef40: 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 29 3b  ior->pOrderBy );
ef50: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65  .      sqlite3Se
ef60: 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 75 6e  lectDestInit(&un
ef70: 69 6f 6e 64 65 73 74 2c 20 70 72 69 6f 72 4f 70  iondest, priorOp
ef80: 2c 20 75 6e 69 6f 6e 54 61 62 29 3b 0a 20 20 20  , unionTab);.   
ef90: 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74     explainSetInt
efa0: 65 67 65 72 28 69 53 75 62 31 2c 20 70 50 61 72  eger(iSub1, pPar
efb0: 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49  se->iNextSelectI
efc0: 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  d);.      rc = s
efd0: 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
efe0: 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 75 6e  rse, pPrior, &un
eff0: 69 6f 6e 64 65 73 74 29 3b 0a 20 20 20 20 20 20  iondest);.      
f000: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
f010: 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
f020: 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d  ect_end;.      }
f030: 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20  ..      /* Code 
f040: 74 68 65 20 63 75 72 72 65 6e 74 20 53 45 4c 45  the current SELE
f050: 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 20  CT statement.   
f060: 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
f070: 70 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54  p->op==TK_EXCEPT
f080: 20 29 7b 0a 20 20 20 20 20 20 20 20 6f 70 20 3d   ){.        op =
f090: 20 53 52 54 5f 45 78 63 65 70 74 3b 0a 20 20 20   SRT_Except;.   
f0a0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
f0b0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 3d    assert( p->op=
f0c0: 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 20  =TK_UNION );.   
f0d0: 20 20 20 20 20 6f 70 20 3d 20 53 52 54 5f 55 6e       op = SRT_Un
f0e0: 69 6f 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ion;.      }.   
f0f0: 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30     p->pPrior = 0
f100: 3b 0a 20 20 20 20 20 20 70 4c 69 6d 69 74 20 3d  ;.      pLimit =
f110: 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20   p->pLimit;.    
f120: 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b    p->pLimit = 0;
f130: 0a 20 20 20 20 20 20 70 4f 66 66 73 65 74 20 3d  .      pOffset =
f140: 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20   p->pOffset;.   
f150: 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20     p->pOffset = 
f160: 30 3b 0a 20 20 20 20 20 20 75 6e 69 6f 6e 64 65  0;.      unionde
f170: 73 74 2e 65 44 65 73 74 20 3d 20 6f 70 3b 0a 20  st.eDest = op;. 
f180: 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49       explainSetI
f190: 6e 74 65 67 65 72 28 69 53 75 62 32 2c 20 70 50  nteger(iSub2, pP
f1a0: 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63  arse->iNextSelec
f1b0: 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  tId);.      rc =
f1c0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
f1d0: 50 61 72 73 65 2c 20 70 2c 20 26 75 6e 69 6f 6e  Parse, p, &union
f1e0: 64 65 73 74 29 3b 0a 20 20 20 20 20 20 74 65 73  dest);.      tes
f1f0: 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54  tcase( rc!=SQLIT
f200: 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 2f 2a  E_OK );.      /*
f210: 20 51 75 65 72 79 20 66 6c 61 74 74 65 6e 69 6e   Query flattenin
f220: 67 20 69 6e 20 73 71 6c 69 74 65 33 53 65 6c 65  g in sqlite3Sele
f230: 63 74 28 29 20 6d 69 67 68 74 20 72 65 66 69 6c  ct() might refil
f240: 6c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2e 0a 20  l p->pOrderBy.. 
f250: 20 20 20 20 20 2a 2a 20 42 65 20 73 75 72 65 20       ** Be sure 
f260: 74 6f 20 64 65 6c 65 74 65 20 70 2d 3e 70 4f 72  to delete p->pOr
f270: 64 65 72 42 79 2c 20 74 68 65 72 65 66 6f 72 65  derBy, therefore
f280: 2c 20 74 6f 20 61 76 6f 69 64 20 61 20 6d 65 6d  , to avoid a mem
f290: 6f 72 79 20 6c 65 61 6b 2e 20 2a 2f 0a 20 20 20  ory leak. */.   
f2a0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
f2b0: 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  stDelete(db, p->
f2c0: 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 20  pOrderBy);.     
f2d0: 20 70 44 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50   pDelete = p->pP
f2e0: 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70  rior;.      p->p
f2f0: 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a  Prior = pPrior;.
f300: 20 20 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42        p->pOrderB
f310: 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28  y = 0;.      if(
f320: 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e   p->op==TK_UNION
f330: 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77   ) p->nSelectRow
f340: 20 2b 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c   += pPrior->nSel
f350: 65 63 74 52 6f 77 3b 0a 20 20 20 20 20 20 73 71  ectRow;.      sq
f360: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
f370: 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a  db, p->pLimit);.
f380: 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20        p->pLimit 
f390: 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  = pLimit;.      
f3a0: 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f 66  p->pOffset = pOf
f3b0: 66 73 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e 69  fset;.      p->i
f3c0: 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20  Limit = 0;.     
f3d0: 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b   p->iOffset = 0;
f3e0: 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 6e 76 65  ..      /* Conve
f3f0: 72 74 20 74 68 65 20 64 61 74 61 20 69 6e 20 74  rt the data in t
f400: 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  he temporary tab
f410: 6c 65 20 69 6e 74 6f 20 77 68 61 74 65 76 65 72  le into whatever
f420: 20 66 6f 72 6d 0a 20 20 20 20 20 20 2a 2a 20 69   form.      ** i
f430: 74 20 69 73 20 74 68 61 74 20 77 65 20 63 75 72  t is that we cur
f440: 72 65 6e 74 6c 79 20 6e 65 65 64 2e 0a 20 20 20  rently need..   
f450: 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65     */.      asse
f460: 72 74 28 20 75 6e 69 6f 6e 54 61 62 3d 3d 64 65  rt( unionTab==de
f470: 73 74 2e 69 53 44 50 61 72 6d 20 7c 7c 20 64 65  st.iSDParm || de
f480: 73 74 2e 65 44 65 73 74 21 3d 70 72 69 6f 72 4f  st.eDest!=priorO
f490: 70 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64  p );.      if( d
f4a0: 65 73 74 2e 65 44 65 73 74 21 3d 70 72 69 6f 72  est.eDest!=prior
f4b0: 4f 70 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  Op ){.        in
f4c0: 74 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c  t iCont, iBreak,
f4d0: 20 69 53 74 61 72 74 3b 0a 20 20 20 20 20 20 20   iStart;.       
f4e0: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69   assert( p->pELi
f4f0: 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  st );.        if
f500: 28 20 64 65 73 74 2e 65 44 65 73 74 3d 3d 53 52  ( dest.eDest==SR
f510: 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20  T_Output ){.    
f520: 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 46        Select *pF
f530: 69 72 73 74 20 3d 20 70 3b 0a 20 20 20 20 20 20  irst = p;.      
f540: 20 20 20 20 77 68 69 6c 65 28 20 70 46 69 72 73      while( pFirs
f550: 74 2d 3e 70 50 72 69 6f 72 20 29 20 70 46 69 72  t->pPrior ) pFir
f560: 73 74 20 3d 20 70 46 69 72 73 74 2d 3e 70 50 72  st = pFirst->pPr
f570: 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 20 20 67  ior;.          g
f580: 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d  enerateColumnNam
f590: 65 73 28 70 50 61 72 73 65 2c 20 30 2c 20 70 46  es(pParse, 0, pF
f5a0: 69 72 73 74 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  irst->pEList);. 
f5b0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
f5c0: 20 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65   iBreak = sqlite
f5d0: 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
f5e0: 29 3b 0a 20 20 20 20 20 20 20 20 69 43 6f 6e 74  );.        iCont
f5f0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
f600: 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
f610: 20 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74      computeLimit
f620: 52 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65  Registers(pParse
f630: 2c 20 70 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20  , p, iBreak);.  
f640: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
f650: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65  eAddOp2(v, OP_Re
f660: 77 69 6e 64 2c 20 75 6e 69 6f 6e 54 61 62 2c 20  wind, unionTab, 
f670: 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20  iBreak);.       
f680: 20 69 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65   iStart = sqlite
f690: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
f6a0: 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73 65 6c  (v);.        sel
f6b0: 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61  ectInnerLoop(pPa
f6c0: 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73  rse, p, p->pELis
f6d0: 74 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 70 2d 3e  t, unionTab, p->
f6e0: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 0a 20  pEList->nExpr,. 
f6f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f700: 20 20 20 20 20 20 20 30 2c 20 30 2c 20 26 64 65         0, 0, &de
f710: 73 74 2c 20 69 43 6f 6e 74 2c 20 69 42 72 65 61  st, iCont, iBrea
f720: 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  k);.        sqli
f730: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
f740: 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20  bel(v, iCont);. 
f750: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
f760: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
f770: 65 78 74 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69  ext, unionTab, i
f780: 53 74 61 72 74 29 3b 0a 20 20 20 20 20 20 20 20  Start);.        
f790: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
f7a0: 76 65 4c 61 62 65 6c 28 76 2c 20 69 42 72 65 61  veLabel(v, iBrea
f7b0: 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  k);.        sqli
f7c0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
f7d0: 20 4f 50 5f 43 6c 6f 73 65 2c 20 75 6e 69 6f 6e   OP_Close, union
f7e0: 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  Tab, 0);.      }
f7f0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
f800: 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a    }.    default:
f810: 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 3d 3d   assert( p->op==
f820: 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 29 3b 20  TK_INTERSECT ); 
f830: 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 61 62 31  {.      int tab1
f840: 2c 20 74 61 62 32 3b 0a 20 20 20 20 20 20 69 6e  , tab2;.      in
f850: 74 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c  t iCont, iBreak,
f860: 20 69 53 74 61 72 74 3b 0a 20 20 20 20 20 20 45   iStart;.      E
f870: 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f  xpr *pLimit, *pO
f880: 66 66 73 65 74 3b 0a 20 20 20 20 20 20 69 6e 74  ffset;.      int
f890: 20 61 64 64 72 3b 0a 20 20 20 20 20 20 53 65 6c   addr;.      Sel
f8a0: 65 63 74 44 65 73 74 20 69 6e 74 65 72 73 65 63  ectDest intersec
f8b0: 74 64 65 73 74 3b 0a 20 20 20 20 20 20 69 6e 74  tdest;.      int
f8c0: 20 72 31 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49   r1;..      /* I
f8d0: 4e 54 45 52 53 45 43 54 20 69 73 20 64 69 66 66  NTERSECT is diff
f8e0: 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 6f  erent from the o
f8f0: 74 68 65 72 73 20 73 69 6e 63 65 20 69 74 20 72  thers since it r
f900: 65 71 75 69 72 65 73 0a 20 20 20 20 20 20 2a 2a  equires.      **
f910: 20 74 77 6f 20 74 65 6d 70 6f 72 61 72 79 20 74   two temporary t
f920: 61 62 6c 65 73 2e 20 20 48 65 6e 63 65 20 69 74  ables.  Hence it
f930: 20 68 61 73 20 69 74 73 20 6f 77 6e 20 63 61 73   has its own cas
f940: 65 2e 20 20 42 65 67 69 6e 0a 20 20 20 20 20 20  e.  Begin.      
f950: 2a 2a 20 62 79 20 61 6c 6c 6f 63 61 74 69 6e 67  ** by allocating
f960: 20 74 68 65 20 74 61 62 6c 65 73 20 77 65 20 77   the tables we w
f970: 69 6c 6c 20 6e 65 65 64 2e 0a 20 20 20 20 20 20  ill need..      
f980: 2a 2f 0a 20 20 20 20 20 20 74 61 62 31 20 3d 20  */.      tab1 = 
f990: 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
f9a0: 20 20 20 20 20 20 74 61 62 32 20 3d 20 70 50 61        tab2 = pPa
f9b0: 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
f9c0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f     assert( p->pO
f9d0: 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 0a 20 20  rderBy==0 );..  
f9e0: 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
f9f0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
fa00: 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
fa10: 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20 20 20 20  , tab1, 0);.    
fa20: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64    assert( p->add
fa30: 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20  rOpenEphm[0] == 
fa40: 2d 31 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61  -1 );.      p->a
fa50: 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d  ddrOpenEphm[0] =
fa60: 20 61 64 64 72 3b 0a 20 20 20 20 20 20 70 2d 3e   addr;.      p->
fa70: 70 52 69 67 68 74 6d 6f 73 74 2d 3e 73 65 6c 46  pRightmost->selF
fa80: 6c 61 67 73 20 7c 3d 20 53 46 5f 55 73 65 73 45  lags |= SF_UsesE
fa90: 70 68 65 6d 65 72 61 6c 3b 0a 20 20 20 20 20 20  phemeral;.      
faa0: 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73  assert( p->pELis
fab0: 74 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43  t );..      /* C
fac0: 6f 64 65 20 74 68 65 20 53 45 4c 45 43 54 73 20  ode the SELECTs 
fad0: 74 6f 20 6f 75 72 20 6c 65 66 74 20 69 6e 74 6f  to our left into
fae0: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
faf0: 20 22 74 61 62 31 22 2e 0a 20 20 20 20 20 20 2a   "tab1"..      *
fb00: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  /.      sqlite3S
fb10: 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 69  electDestInit(&i
fb20: 6e 74 65 72 73 65 63 74 64 65 73 74 2c 20 53 52  ntersectdest, SR
fb30: 54 5f 55 6e 69 6f 6e 2c 20 74 61 62 31 29 3b 0a  T_Union, tab1);.
fb40: 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74        explainSet
fb50: 49 6e 74 65 67 65 72 28 69 53 75 62 31 2c 20 70  Integer(iSub1, p
fb60: 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65  Parse->iNextSele
fb70: 63 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20  ctId);.      rc 
fb80: 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  = sqlite3Select(
fb90: 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20  pParse, pPrior, 
fba0: 26 69 6e 74 65 72 73 65 63 74 64 65 73 74 29 3b  &intersectdest);
fbb0: 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
fbc0: 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75  .        goto mu
fbd0: 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
fbe0: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
fbf0: 2a 20 43 6f 64 65 20 74 68 65 20 63 75 72 72 65  * Code the curre
fc00: 6e 74 20 53 45 4c 45 43 54 20 69 6e 74 6f 20 74  nt SELECT into t
fc10: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 22  emporary table "
fc20: 74 61 62 32 22 0a 20 20 20 20 20 20 2a 2f 0a 20  tab2".      */. 
fc30: 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69       addr = sqli
fc40: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
fc50: 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
fc60: 6c 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20 20 20  l, tab2, 0);.   
fc70: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64     assert( p->ad
fc80: 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 3d  drOpenEphm[1] ==
fc90: 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e   -1 );.      p->
fca0: 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20  addrOpenEphm[1] 
fcb0: 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20 70 2d  = addr;.      p-
fcc0: 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20  >pPrior = 0;.   
fcd0: 20 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70     pLimit = p->p
fce0: 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e  Limit;.      p->
fcf0: 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20  pLimit = 0;.    
fd00: 20 20 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70    pOffset = p->p
fd10: 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70 2d  Offset;.      p-
fd20: 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20  >pOffset = 0;.  
fd30: 20 20 20 20 69 6e 74 65 72 73 65 63 74 64 65 73      intersectdes
fd40: 74 2e 69 53 44 50 61 72 6d 20 3d 20 74 61 62 32  t.iSDParm = tab2
fd50: 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53  ;.      explainS
fd60: 65 74 49 6e 74 65 67 65 72 28 69 53 75 62 32 2c  etInteger(iSub2,
fd70: 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65   pParse->iNextSe
fd80: 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 72  lectId);.      r
fd90: 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  c = sqlite3Selec
fda0: 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26 69 6e  t(pParse, p, &in
fdb0: 74 65 72 73 65 63 74 64 65 73 74 29 3b 0a 20 20  tersectdest);.  
fdc0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
fdd0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
fde0: 20 20 20 20 20 70 44 65 6c 65 74 65 20 3d 20 70       pDelete = p
fdf0: 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20  ->pPrior;.      
fe00: 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69  p->pPrior = pPri
fe10: 6f 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  or;.      if( p-
fe20: 3e 6e 53 65 6c 65 63 74 52 6f 77 3e 70 50 72 69  >nSelectRow>pPri
fe30: 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 29  or->nSelectRow )
fe40: 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d   p->nSelectRow =
fe50: 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74   pPrior->nSelect
fe60: 52 6f 77 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Row;.      sqlit
fe70: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
fe80: 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20   p->pLimit);.   
fe90: 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70     p->pLimit = p
fea0: 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e  Limit;.      p->
feb0: 70 4f 66 66 73 65 74 20 3d 20 70 4f 66 66 73 65  pOffset = pOffse
fec0: 74 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e  t;..      /* Gen
fed0: 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 74 61  erate code to ta
fee0: 6b 65 20 74 68 65 20 69 6e 74 65 72 73 65 63 74  ke the intersect
fef0: 69 6f 6e 20 6f 66 20 74 68 65 20 74 77 6f 20 74  ion of the two t
ff00: 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 20 20 2a  emporary.      *
ff10: 2a 20 74 61 62 6c 65 73 2e 0a 20 20 20 20 20 20  * tables..      
ff20: 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
ff30: 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20   p->pEList );.  
ff40: 20 20 20 20 69 66 28 20 64 65 73 74 2e 65 44 65      if( dest.eDe
ff50: 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29  st==SRT_Output )
ff60: 7b 0a 20 20 20 20 20 20 20 20 53 65 6c 65 63 74  {.        Select
ff70: 20 2a 70 46 69 72 73 74 20 3d 20 70 3b 0a 20 20   *pFirst = p;.  
ff80: 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 46 69        while( pFi
ff90: 72 73 74 2d 3e 70 50 72 69 6f 72 20 29 20 70 46  rst->pPrior ) pF
ffa0: 69 72 73 74 20 3d 20 70 46 69 72 73 74 2d 3e 70  irst = pFirst->p
ffb0: 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 67  Prior;.        g
ffc0: 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d  enerateColumnNam
ffd0: 65 73 28 70 50 61 72 73 65 2c 20 30 2c 20 70 46  es(pParse, 0, pF
ffe0: 69 72 73 74 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  irst->pEList);. 
fff0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 42 72       }.      iBr
10000 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62  eak = sqlite3Vdb
10010 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
10020 20 20 20 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c       iCont = sql
10030 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
10040 6c 28 76 29 3b 0a 20 20 20 20 20 20 63 6f 6d 70  l(v);.      comp
10050 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72  uteLimitRegister
10060 73 28 70 50 61 72 73 65 2c 20 70 2c 20 69 42 72  s(pParse, p, iBr
10070 65 61 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  eak);.      sqli
10080 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
10090 20 4f 50 5f 52 65 77 69 6e 64 2c 20 74 61 62 31   OP_Rewind, tab1
100a0 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20  , iBreak);.     
100b0 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
100c0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
100d0 0a 20 20 20 20 20 20 69 53 74 61 72 74 20 3d 20  .      iStart = 
100e0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
100f0 32 28 76 2c 20 4f 50 5f 52 6f 77 4b 65 79 2c 20  2(v, OP_RowKey, 
10100 74 61 62 31 2c 20 72 31 29 3b 0a 20 20 20 20 20  tab1, r1);.     
10110 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10120 70 34 49 6e 74 28 76 2c 20 4f 50 5f 4e 6f 74 46  p4Int(v, OP_NotF
10130 6f 75 6e 64 2c 20 74 61 62 32 2c 20 69 43 6f 6e  ound, tab2, iCon
10140 74 2c 20 72 31 2c 20 30 29 3b 0a 20 20 20 20 20  t, r1, 0);.     
10150 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
10160 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
10170 31 29 3b 0a 20 20 20 20 20 20 73 65 6c 65 63 74  1);.      select
10180 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65  InnerLoop(pParse
10190 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20  , p, p->pEList, 
101a0 74 61 62 31 2c 20 70 2d 3e 70 45 4c 69 73 74 2d  tab1, p->pEList-
101b0 3e 6e 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20  >nExpr,.        
101c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c                0,
101d0 20 30 2c 20 26 64 65 73 74 2c 20 69 43 6f 6e 74   0, &dest, iCont
101e0 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20  , iBreak);.     
101f0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
10200 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e  lveLabel(v, iCon
10210 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
10220 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
10230 50 5f 4e 65 78 74 2c 20 74 61 62 31 2c 20 69 53  P_Next, tab1, iS
10240 74 61 72 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  tart);.      sql
10250 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
10260 61 62 65 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b  abel(v, iBreak);
10270 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
10280 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43  beAddOp2(v, OP_C
10290 6c 6f 73 65 2c 20 74 61 62 32 2c 20 30 29 3b 0a  lose, tab2, 0);.
102a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
102b0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c  eAddOp2(v, OP_Cl
102c0 6f 73 65 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20  ose, tab1, 0);. 
102d0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
102e0 7d 0a 20 20 7d 0a 0a 20 20 65 78 70 6c 61 69 6e  }.  }..  explain
102f0 43 6f 6d 70 6f 73 69 74 65 28 70 50 61 72 73 65  Composite(pParse
10300 2c 20 70 2d 3e 6f 70 2c 20 69 53 75 62 31 2c 20  , p->op, iSub1, 
10310 69 53 75 62 32 2c 20 70 2d 3e 6f 70 21 3d 54 4b  iSub2, p->op!=TK
10320 5f 41 4c 4c 29 3b 0a 0a 20 20 2f 2a 20 43 6f 6d  _ALL);..  /* Com
10330 70 75 74 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73  pute collating s
10340 65 71 75 65 6e 63 65 73 20 75 73 65 64 20 62 79  equences used by
10350 20 0a 20 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79   .  ** temporary
10360 20 74 61 62 6c 65 73 20 6e 65 65 64 65 64 20 74   tables needed t
10370 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  o implement the 
10380 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e  compound select.
10390 0a 20 20 2a 2a 20 41 74 74 61 63 68 20 74 68 65  .  ** Attach the
103a0 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75   KeyInfo structu
103b0 72 65 20 74 6f 20 61 6c 6c 20 74 65 6d 70 6f 72  re to all tempor
103c0 61 72 79 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a  ary tables..  **
103d0 0a 20 20 2a 2a 20 54 68 69 73 20 73 65 63 74 69  .  ** This secti
103e0 6f 6e 20 69 73 20 72 75 6e 20 62 79 20 74 68 65  on is run by the
103f0 20 72 69 67 68 74 2d 6d 6f 73 74 20 53 45 4c 45   right-most SELE
10400 43 54 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 6c  CT statement onl
10410 79 2e 0a 20 20 2a 2a 20 53 45 4c 45 43 54 20 73  y..  ** SELECT s
10420 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 74 68 65  tatements to the
10430 20 6c 65 66 74 20 61 6c 77 61 79 73 20 73 6b 69   left always ski
10440 70 20 74 68 69 73 20 70 61 72 74 2e 20 20 54 68  p this part.  Th
10450 65 20 72 69 67 68 74 2d 6d 6f 73 74 0a 20 20 2a  e right-most.  *
10460 2a 20 53 45 4c 45 43 54 20 6d 69 67 68 74 20 61  * SELECT might a
10470 6c 73 6f 20 73 6b 69 70 20 74 68 69 73 20 70 61  lso skip this pa
10480 72 74 20 69 66 20 69 74 20 68 61 73 20 6e 6f 20  rt if it has no 
10490 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
104a0 61 6e 64 0a 20 20 2a 2a 20 6e 6f 20 74 65 6d 70  and.  ** no temp
104b0 20 74 61 62 6c 65 73 20 61 72 65 20 72 65 71 75   tables are requ
104c0 69 72 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ired..  */.  if(
104d0 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53   p->selFlags & S
104e0 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c 20  F_UsesEphemeral 
104f0 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 20 20 20  ){.    int i;   
10500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10510 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
10520 6e 74 65 72 20 2a 2f 0a 20 20 20 20 4b 65 79 49  nter */.    KeyI
10530 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 20 20  nfo *pKeyInfo;  
10540 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
10550 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
10560 66 6f 72 20 74 68 65 20 72 65 73 75 6c 74 20 73  for the result s
10570 65 74 20 2a 2f 0a 20 20 20 20 53 65 6c 65 63 74  et */.    Select
10580 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20   *pLoop;        
10590 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c          /* For l
105a0 6f 6f 70 69 6e 67 20 74 68 72 6f 75 67 68 20 53  ooping through S
105b0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73  ELECT statements
105c0 20 2a 2f 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20   */.    CollSeq 
105d0 2a 2a 61 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20  **apColl;       
105e0 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f        /* For loo
105f0 70 69 6e 67 20 74 68 72 6f 75 67 68 20 70 4b 65  ping through pKe
10600 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 5d 20 2a  yInfo->aColl[] *
10610 2f 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 20  /.    int nCol; 
10620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10630 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
10640 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 72 65 73 75   columns in resu
10650 6c 74 20 73 65 74 20 2a 2f 0a 0a 20 20 20 20 61  lt set */..    a
10660 73 73 65 72 74 28 20 70 2d 3e 70 52 69 67 68 74  ssert( p->pRight
10670 6d 6f 73 74 3d 3d 70 20 29 3b 0a 20 20 20 20 6e  most==p );.    n
10680 43 6f 6c 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d  Col = p->pEList-
10690 3e 6e 45 78 70 72 3b 0a 20 20 20 20 70 4b 65 79  >nExpr;.    pKey
106a0 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62  Info = sqlite3Db
106b0 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 0a 20  MallocZero(db,. 
106c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
106d0 20 20 20 20 20 20 73 69 7a 65 6f 66 28 2a 70 4b        sizeof(*pK
106e0 65 79 49 6e 66 6f 29 2b 6e 43 6f 6c 2a 28 73 69  eyInfo)+nCol*(si
106f0 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 20 2b  zeof(CollSeq*) +
10700 20 31 29 29 3b 0a 20 20 20 20 69 66 28 20 21 70   1));.    if( !p
10710 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20  KeyInfo ){.     
10720 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
10730 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d  EM;.      goto m
10740 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
10750 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 4b 65 79  .    }..    pKey
10760 49 6e 66 6f 2d 3e 65 6e 63 20 3d 20 45 4e 43 28  Info->enc = ENC(
10770 64 62 29 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66  db);.    pKeyInf
10780 6f 2d 3e 6e 46 69 65 6c 64 20 3d 20 28 75 31 36  o->nField = (u16
10790 29 6e 43 6f 6c 3b 0a 0a 20 20 20 20 66 6f 72 28  )nCol;..    for(
107a0 69 3d 30 2c 20 61 70 43 6f 6c 6c 3d 70 4b 65 79  i=0, apColl=pKey
107b0 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 3b 20 69 3c 6e  Info->aColl; i<n
107c0 43 6f 6c 3b 20 69 2b 2b 2c 20 61 70 43 6f 6c 6c  Col; i++, apColl
107d0 2b 2b 29 7b 0a 20 20 20 20 20 20 2a 61 70 43 6f  ++){.      *apCo
107e0 6c 6c 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74  ll = multiSelect
107f0 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
10800 70 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28  p, i);.      if(
10810 20 30 3d 3d 2a 61 70 43 6f 6c 6c 20 29 7b 0a 20   0==*apColl ){. 
10820 20 20 20 20 20 20 20 2a 61 70 43 6f 6c 6c 20 3d         *apColl =
10830 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a   db->pDfltColl;.
10840 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
10850 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72    pKeyInfo->aSor
10860 74 4f 72 64 65 72 20 3d 20 28 75 38 2a 29 61 70  tOrder = (u8*)ap
10870 43 6f 6c 6c 3b 0a 0a 20 20 20 20 66 6f 72 28 70  Coll;..    for(p
10880 4c 6f 6f 70 3d 70 3b 20 70 4c 6f 6f 70 3b 20 70  Loop=p; pLoop; p
10890 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 50 72 69  Loop=pLoop->pPri
108a0 6f 72 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69  or){.      for(i
108b0 3d 30 3b 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20  =0; i<2; i++){. 
108c0 20 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 20         int addr 
108d0 3d 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65  = pLoop->addrOpe
108e0 6e 45 70 68 6d 5b 69 5d 3b 0a 20 20 20 20 20 20  nEphm[i];.      
108f0 20 20 69 66 28 20 61 64 64 72 3c 30 20 29 7b 0a    if( addr<0 ){.
10900 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
10910 5b 30 5d 20 69 73 20 75 6e 75 73 65 64 20 74 68  [0] is unused th
10920 65 6e 20 5b 31 5d 20 69 73 20 61 6c 73 6f 20 75  en [1] is also u
10930 6e 75 73 65 64 2e 20 20 53 6f 20 77 65 20 63 61  nused.  So we ca
10940 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61  n.          ** a
10950 6c 77 61 79 73 20 73 61 66 65 6c 79 20 61 62 6f  lways safely abo
10960 72 74 20 61 73 20 73 6f 6f 6e 20 61 73 20 74 68  rt as soon as th
10970 65 20 66 69 72 73 74 20 75 6e 75 73 65 64 20 73  e first unused s
10980 6c 6f 74 20 69 73 20 66 6f 75 6e 64 20 2a 2f 0a  lot is found */.
10990 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
109a0 28 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65  ( pLoop->addrOpe
109b0 6e 45 70 68 6d 5b 31 5d 3c 30 20 29 3b 0a 20 20  nEphm[1]<0 );.  
109c0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
109d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
109e0 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
109f0 67 65 50 32 28 76 2c 20 61 64 64 72 2c 20 6e 43  geP2(v, addr, nC
10a00 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ol);.        sql
10a10 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
10a20 28 76 2c 20 61 64 64 72 2c 20 28 63 68 61 72 2a  (v, addr, (char*
10a30 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45  )pKeyInfo, P4_KE
10a40 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 20 20  YINFO);.        
10a50 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45  pLoop->addrOpenE
10a60 70 68 6d 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20 20  phm[i] = -1;.   
10a70 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
10a80 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
10a90 20 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 7d 0a   pKeyInfo);.  }.
10aa0 0a 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e  .multi_select_en
10ab0 64 3a 0a 20 20 70 44 65 73 74 2d 3e 69 53 64 73  d:.  pDest->iSds
10ac0 74 20 3d 20 64 65 73 74 2e 69 53 64 73 74 3b 0a  t = dest.iSdst;.
10ad0 20 20 70 44 65 73 74 2d 3e 6e 53 64 73 74 20 3d    pDest->nSdst =
10ae0 20 64 65 73 74 2e 6e 53 64 73 74 3b 0a 20 20 73   dest.nSdst;.  s
10af0 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
10b00 74 65 28 64 62 2c 20 70 44 65 6c 65 74 65 29 3b  te(db, pDelete);
10b10 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
10b20 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
10b30 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  _OMIT_COMPOUND_S
10b40 45 4c 45 43 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  ELECT */../*.** 
10b50 43 6f 64 65 20 61 6e 20 6f 75 74 70 75 74 20 73  Code an output s
10b60 75 62 72 6f 75 74 69 6e 65 20 66 6f 72 20 61 20  ubroutine for a 
10b70 63 6f 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d  coroutine implem
10b80 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61 0a 2a 2a  entation of a.**
10b90 20 53 45 4c 45 43 54 20 73 74 61 74 6d 65 6e 74   SELECT statment
10ba0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 61 74 61  ..**.** The data
10bb0 20 74 6f 20 62 65 20 6f 75 74 70 75 74 20 69 73   to be output is
10bc0 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 70 49   contained in pI
10bd0 6e 2d 3e 69 53 64 73 74 2e 20 20 54 68 65 72 65  n->iSdst.  There
10be0 20 61 72 65 0a 2a 2a 20 70 49 6e 2d 3e 6e 53 64   are.** pIn->nSd
10bf0 73 74 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65  st columns to be
10c00 20 6f 75 74 70 75 74 2e 20 20 70 44 65 73 74 20   output.  pDest 
10c10 69 73 20 77 68 65 72 65 20 74 68 65 20 6f 75 74  is where the out
10c20 70 75 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65  put should.** be
10c30 20 73 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 72 65 67   sent..**.** reg
10c40 52 65 74 75 72 6e 20 69 73 20 74 68 65 20 6e 75  Return is the nu
10c50 6d 62 65 72 20 6f 66 20 74 68 65 20 72 65 67 69  mber of the regi
10c60 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 74 68 65  ster holding the
10c70 20 73 75 62 72 6f 75 74 69 6e 65 0a 2a 2a 20 72   subroutine.** r
10c80 65 74 75 72 6e 20 61 64 64 72 65 73 73 2e 0a 2a  eturn address..*
10c90 2a 0a 2a 2a 20 49 66 20 72 65 67 50 72 65 76 3e  *.** If regPrev>
10ca0 30 20 74 68 65 6e 20 69 74 20 69 73 20 74 68 65  0 then it is the
10cb0 20 66 69 72 73 74 20 72 65 67 69 73 74 65 72 20   first register 
10cc0 69 6e 20 61 20 76 65 63 74 6f 72 20 74 68 61 74  in a vector that
10cd0 0a 2a 2a 20 72 65 63 6f 72 64 73 20 74 68 65 20  .** records the 
10ce0 70 72 65 76 69 6f 75 73 20 6f 75 74 70 75 74 2e  previous output.
10cf0 20 20 6d 65 6d 5b 72 65 67 50 72 65 76 5d 20 69    mem[regPrev] i
10d00 73 20 61 20 66 6c 61 67 20 74 68 61 74 20 69 73  s a flag that is
10d10 20 66 61 6c 73 65 0a 2a 2a 20 69 66 20 74 68 65   false.** if the
10d20 72 65 20 68 61 73 20 62 65 65 6e 20 6e 6f 20 70  re has been no p
10d30 72 65 76 69 6f 75 73 20 6f 75 74 70 75 74 2e 20  revious output. 
10d40 20 49 66 20 72 65 67 50 72 65 76 3e 30 20 74 68   If regPrev>0 th
10d50 65 6e 20 63 6f 64 65 20 69 73 0a 2a 2a 20 67 65  en code is.** ge
10d60 6e 65 72 61 74 65 64 20 74 6f 20 73 75 70 70 72  nerated to suppr
10d70 65 73 73 20 64 75 70 6c 69 63 61 74 65 73 2e 20  ess duplicates. 
10d80 20 70 4b 65 79 49 6e 66 6f 20 69 73 20 75 73 65   pKeyInfo is use
10d90 64 20 66 6f 72 20 63 6f 6d 70 61 72 69 6e 67 0a  d for comparing.
10da0 2a 2a 20 6b 65 79 73 2e 0a 2a 2a 0a 2a 2a 20 49  ** keys..**.** I
10db0 66 20 74 68 65 20 4c 49 4d 49 54 20 66 6f 75 6e  f the LIMIT foun
10dc0 64 20 69 6e 20 70 2d 3e 69 4c 69 6d 69 74 20 69  d in p->iLimit i
10dd0 73 20 72 65 61 63 68 65 64 2c 20 6a 75 6d 70 20  s reached, jump 
10de0 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 0a 2a  immediately to.*
10df0 2a 20 69 42 72 65 61 6b 2e 0a 2a 2f 0a 73 74 61  * iBreak..*/.sta
10e00 74 69 63 20 69 6e 74 20 67 65 6e 65 72 61 74 65  tic int generate
10e10 4f 75 74 70 75 74 53 75 62 72 6f 75 74 69 6e 65  OutputSubroutine
10e20 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
10e30 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e,          /* P
10e40 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
10e50 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
10e60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
10e70 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
10e80 65 6e 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  ent */.  SelectD
10e90 65 73 74 20 2a 70 49 6e 2c 20 20 20 20 20 20 20  est *pIn,       
10ea0 20 2f 2a 20 43 6f 72 6f 75 74 69 6e 65 20 73 75   /* Coroutine su
10eb0 70 70 6c 79 69 6e 67 20 64 61 74 61 20 2a 2f 0a  pplying data */.
10ec0 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44    SelectDest *pD
10ed0 65 73 74 2c 20 20 20 20 20 20 2f 2a 20 57 68 65  est,      /* Whe
10ee0 72 65 20 74 6f 20 73 65 6e 64 20 74 68 65 20 64  re to send the d
10ef0 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ata */.  int reg
10f00 52 65 74 75 72 6e 2c 20 20 20 20 20 20 20 20 20  Return,         
10f10 20 2f 2a 20 54 68 65 20 72 65 74 75 72 6e 20 61   /* The return a
10f20 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20  ddress register 
10f30 2a 2f 0a 20 20 69 6e 74 20 72 65 67 50 72 65 76  */.  int regPrev
10f40 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
10f50 50 72 65 76 69 6f 75 73 20 72 65 73 75 6c 74 20  Previous result 
10f60 72 65 67 69 73 74 65 72 2e 20 20 4e 6f 20 75 6e  register.  No un
10f70 69 71 75 65 6e 65 73 73 20 69 66 20 30 20 2a 2f  iqueness if 0 */
10f80 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  .  KeyInfo *pKey
10f90 49 6e 66 6f 2c 20 20 20 20 20 20 2f 2a 20 46 6f  Info,      /* Fo
10fa0 72 20 63 6f 6d 70 61 72 69 6e 67 20 77 69 74 68  r comparing with
10fb0 20 70 72 65 76 69 6f 75 73 20 65 6e 74 72 79 20   previous entry 
10fc0 2a 2f 0a 20 20 69 6e 74 20 70 34 74 79 70 65 2c  */.  int p4type,
10fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10fe0 54 68 65 20 70 34 20 74 79 70 65 20 66 6f 72 20  The p4 type for 
10ff0 70 4b 65 79 49 6e 66 6f 20 2a 2f 0a 20 20 69 6e  pKeyInfo */.  in
11000 74 20 69 42 72 65 61 6b 20 20 20 20 20 20 20 20  t iBreak        
11010 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
11020 72 65 20 69 66 20 77 65 20 68 69 74 20 74 68 65  re if we hit the
11030 20 4c 49 4d 49 54 20 2a 2f 0a 29 7b 0a 20 20 56   LIMIT */.){.  V
11040 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
11050 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 43  >pVdbe;.  int iC
11060 6f 6e 74 69 6e 75 65 3b 0a 20 20 69 6e 74 20 61  ontinue;.  int a
11070 64 64 72 3b 0a 0a 20 20 61 64 64 72 20 3d 20 73  ddr;..  addr = s
11080 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
11090 74 41 64 64 72 28 76 29 3b 0a 20 20 69 43 6f 6e  tAddr(v);.  iCon
110a0 74 69 6e 75 65 20 3d 20 73 71 6c 69 74 65 33 56  tinue = sqlite3V
110b0 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
110c0 0a 0a 20 20 2f 2a 20 53 75 70 70 72 65 73 73 20  ..  /* Suppress 
110d0 64 75 70 6c 69 63 61 74 65 73 20 66 6f 72 20 55  duplicates for U
110e0 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20 61 6e  NION, EXCEPT, an
110f0 64 20 49 4e 54 45 52 53 45 43 54 20 0a 20 20 2a  d INTERSECT .  *
11100 2f 0a 20 20 69 66 28 20 72 65 67 50 72 65 76 20  /.  if( regPrev 
11110 29 7b 0a 20 20 20 20 69 6e 74 20 6a 31 2c 20 6a  ){.    int j1, j
11120 32 3b 0a 20 20 20 20 6a 31 20 3d 20 73 71 6c 69  2;.    j1 = sqli
11130 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
11140 20 4f 50 5f 49 66 4e 6f 74 2c 20 72 65 67 50 72   OP_IfNot, regPr
11150 65 76 29 3b 0a 20 20 20 20 6a 32 20 3d 20 73 71  ev);.    j2 = sq
11160 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
11170 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 70  v, OP_Compare, p
11180 49 6e 2d 3e 69 53 64 73 74 2c 20 72 65 67 50 72  In->iSdst, regPr
11190 65 76 2b 31 2c 20 70 49 6e 2d 3e 6e 53 64 73 74  ev+1, pIn->nSdst
111a0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
111b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
111c0 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c  (char*)pKeyInfo,
111d0 20 70 34 74 79 70 65 29 3b 0a 20 20 20 20 73 71   p4type);.    sq
111e0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
111f0 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 6a 32 2b 32  v, OP_Jump, j2+2
11200 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20 6a 32 2b  , iContinue, j2+
11210 32 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  2);.    sqlite3V
11220 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a  dbeJumpHere(v, j
11230 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  1);.    sqlite3V
11240 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
11250 43 6f 70 79 2c 20 70 49 6e 2d 3e 69 53 64 73 74  Copy, pIn->iSdst
11260 2c 20 72 65 67 50 72 65 76 2b 31 2c 20 70 49 6e  , regPrev+1, pIn
11270 2d 3e 6e 53 64 73 74 2d 31 29 3b 0a 20 20 20 20  ->nSdst-1);.    
11280 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
11290 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
112a0 20 31 2c 20 72 65 67 50 72 65 76 29 3b 0a 20 20   1, regPrev);.  
112b0 7d 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  }.  if( pParse->
112c0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
112d0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20   ) return 0;..  
112e0 2f 2a 20 53 75 70 70 72 65 73 73 20 74 68 65 20  /* Suppress the 
112f0 66 69 72 73 74 20 4f 46 46 53 45 54 20 65 6e 74  first OFFSET ent
11300 72 69 65 73 20 69 66 20 74 68 65 72 65 20 69 73  ries if there is
11310 20 61 6e 20 4f 46 46 53 45 54 20 63 6c 61 75 73   an OFFSET claus
11320 65 0a 20 20 2a 2f 0a 20 20 63 6f 64 65 4f 66 66  e.  */.  codeOff
11330 73 65 74 28 76 2c 20 70 2c 20 69 43 6f 6e 74 69  set(v, p, iConti
11340 6e 75 65 29 3b 0a 0a 20 20 73 77 69 74 63 68 28  nue);..  switch(
11350 20 70 44 65 73 74 2d 3e 65 44 65 73 74 20 29 7b   pDest->eDest ){
11360 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68  .    /* Store th
11370 65 20 72 65 73 75 6c 74 20 61 73 20 64 61 74 61  e result as data
11380 20 75 73 69 6e 67 20 61 20 75 6e 69 71 75 65 20   using a unique 
11390 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  key..    */.    
113a0 63 61 73 65 20 53 52 54 5f 54 61 62 6c 65 3a 0a  case SRT_Table:.
113b0 20 20 20 20 63 61 73 65 20 53 52 54 5f 45 70 68      case SRT_Eph
113c0 65 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20 20 69  emTab: {.      i
113d0 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47  nt r1 = sqlite3G
113e0 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
113f0 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 32 20  );.      int r2 
11400 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
11410 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
11420 20 20 20 74 65 73 74 63 61 73 65 28 20 70 44 65     testcase( pDe
11430 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 54  st->eDest==SRT_T
11440 61 62 6c 65 20 29 3b 0a 20 20 20 20 20 20 74 65  able );.      te
11450 73 74 63 61 73 65 28 20 70 44 65 73 74 2d 3e 65  stcase( pDest->e
11460 44 65 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54  Dest==SRT_EphemT
11470 61 62 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ab );.      sqli
11480 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
11490 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
114a0 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d  pIn->iSdst, pIn-
114b0 3e 6e 53 64 73 74 2c 20 72 31 29 3b 0a 20 20 20  >nSdst, r1);.   
114c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
114d0 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f  dOp2(v, OP_NewRo
114e0 77 69 64 2c 20 70 44 65 73 74 2d 3e 69 53 44 50  wid, pDest->iSDP
114f0 61 72 6d 2c 20 72 32 29 3b 0a 20 20 20 20 20 20  arm, r2);.      
11500 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
11510 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20  3(v, OP_Insert, 
11520 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20  pDest->iSDParm, 
11530 72 31 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 73  r1, r2);.      s
11540 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
11550 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50  P5(v, OPFLAG_APP
11560 45 4e 44 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  END);.      sqli
11570 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
11580 67 28 70 50 61 72 73 65 2c 20 72 32 29 3b 0a 20  g(pParse, r2);. 
11590 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
115a0 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
115b0 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72  e, r1);.      br
115c0 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e  eak;.    }..#ifn
115d0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
115e0 53 55 42 51 55 45 52 59 0a 20 20 20 20 2f 2a 20  SUBQUERY.    /* 
115f0 49 66 20 77 65 20 61 72 65 20 63 72 65 61 74 69  If we are creati
11600 6e 67 20 61 20 73 65 74 20 66 6f 72 20 61 6e 20  ng a set for an 
11610 22 65 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54  "expr IN (SELECT
11620 20 2e 2e 2e 29 22 20 63 6f 6e 73 74 72 75 63 74   ...)" construct
11630 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68  ,.    ** then th
11640 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20 61 20  ere should be a 
11650 73 69 6e 67 6c 65 20 69 74 65 6d 20 6f 6e 20 74  single item on t
11660 68 65 20 73 74 61 63 6b 2e 20 20 57 72 69 74 65  he stack.  Write
11670 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 74 65   this.    ** ite
11680 6d 20 69 6e 74 6f 20 74 68 65 20 73 65 74 20 74  m into the set t
11690 61 62 6c 65 20 77 69 74 68 20 62 6f 67 75 73 20  able with bogus 
116a0 64 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  data..    */.   
116b0 20 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b   case SRT_Set: {
116c0 0a 20 20 20 20 20 20 69 6e 74 20 72 31 3b 0a 20  .      int r1;. 
116d0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e       assert( pIn
116e0 2d 3e 6e 53 64 73 74 3d 3d 31 20 29 3b 0a 20 20  ->nSdst==1 );.  
116f0 20 20 20 20 70 44 65 73 74 2d 3e 61 66 66 53 64      pDest->affSd
11700 73 74 20 3d 20 0a 20 20 20 20 20 20 20 20 20 73  st = .         s
11710 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66  qlite3CompareAff
11720 69 6e 69 74 79 28 70 2d 3e 70 45 4c 69 73 74 2d  inity(p->pEList-
11730 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20 70 44 65  >a[0].pExpr, pDe
11740 73 74 2d 3e 61 66 66 53 64 73 74 29 3b 0a 20 20  st->affSdst);.  
11750 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
11760 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
11770 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
11780 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
11790 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 70 49  P_MakeRecord, pI
117a0 6e 2d 3e 69 53 64 73 74 2c 20 31 2c 20 72 31 2c  n->iSdst, 1, r1,
117b0 20 26 70 44 65 73 74 2d 3e 61 66 66 53 64 73 74   &pDest->affSdst
117c0 2c 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ,1);.      sqlit
117d0 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e  e3ExprCacheAffin
117e0 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65  ityChange(pParse
117f0 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 31 29  , pIn->iSdst, 1)
11800 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
11810 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
11820 49 64 78 49 6e 73 65 72 74 2c 20 70 44 65 73 74  IdxInsert, pDest
11830 2d 3e 69 53 44 50 61 72 6d 2c 20 72 31 29 3b 0a  ->iSDParm, r1);.
11840 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
11850 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
11860 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 62  se, r1);.      b
11870 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66  reak;.    }..#if
11880 20 30 20 20 2f 2a 20 4e 65 76 65 72 20 6f 63 63   0  /* Never occ
11890 75 72 73 20 6f 6e 20 61 6e 20 4f 52 44 45 52 20  urs on an ORDER 
118a0 42 59 20 71 75 65 72 79 20 2a 2f 0a 20 20 20 20  BY query */.    
118b0 2f 2a 20 49 66 20 61 6e 79 20 72 6f 77 20 65 78  /* If any row ex
118c0 69 73 74 20 69 6e 20 74 68 65 20 72 65 73 75 6c  ist in the resul
118d0 74 20 73 65 74 2c 20 72 65 63 6f 72 64 20 74 68  t set, record th
118e0 61 74 20 66 61 63 74 20 61 6e 64 20 61 62 6f 72  at fact and abor
118f0 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  t..    */.    ca
11900 73 65 20 53 52 54 5f 45 78 69 73 74 73 3a 20 7b  se SRT_Exists: {
11910 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
11920 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
11930 6e 74 65 67 65 72 2c 20 31 2c 20 70 44 65 73 74  nteger, 1, pDest
11940 2d 3e 69 53 44 50 61 72 6d 29 3b 0a 20 20 20 20  ->iSDParm);.    
11950 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63    /* The LIMIT c
11960 6c 61 75 73 65 20 77 69 6c 6c 20 74 65 72 6d 69  lause will termi
11970 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 20 66 6f  nate the loop fo
11980 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 62 72  r us */.      br
11990 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
119a0 66 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  f..    /* If thi
119b0 73 20 69 73 20 61 20 73 63 61 6c 61 72 20 73 65  s is a scalar se
119c0 6c 65 63 74 20 74 68 61 74 20 69 73 20 70 61 72  lect that is par
119d0 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69  t of an expressi
119e0 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20  on, then.    ** 
119f0 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  store the result
11a00 73 20 69 6e 20 74 68 65 20 61 70 70 72 6f 70 72  s in the appropr
11a10 69 61 74 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  iate memory cell
11a20 20 61 6e 64 20 62 72 65 61 6b 20 6f 75 74 0a 20   and break out. 
11a30 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 63 61     ** of the sca
11a40 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20  n loop..    */. 
11a50 20 20 20 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a     case SRT_Mem:
11a60 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
11a70 20 70 49 6e 2d 3e 6e 53 64 73 74 3d 3d 31 20 29   pIn->nSdst==1 )
11a80 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
11a90 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72  xprCodeMove(pPar
11aa0 73 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20  se, pIn->iSdst, 
11ab0 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20  pDest->iSDParm, 
11ac0 31 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  1);.      /* The
11ad0 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69   LIMIT clause wi
11ae0 6c 6c 20 6a 75 6d 70 20 6f 75 74 20 6f 66 20 74  ll jump out of t
11af0 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a  he loop for us *
11b00 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  /.      break;. 
11b10 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 23     }.#endif /* #
11b20 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
11b30 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a  IT_SUBQUERY */..
11b40 20 20 20 20 2f 2a 20 54 68 65 20 72 65 73 75 6c      /* The resul
11b50 74 73 20 61 72 65 20 73 74 6f 72 65 64 20 69 6e  ts are stored in
11b60 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20 72   a sequence of r
11b70 65 67 69 73 74 65 72 73 0a 20 20 20 20 2a 2a 20  egisters.    ** 
11b80 73 74 61 72 74 69 6e 67 20 61 74 20 70 44 65 73  starting at pDes
11b90 74 2d 3e 69 53 64 73 74 2e 20 20 54 68 65 6e 20  t->iSdst.  Then 
11ba0 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20 79  the co-routine y
11bb0 69 65 6c 64 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  ields..    */.  
11bc0 20 20 63 61 73 65 20 53 52 54 5f 43 6f 72 6f 75    case SRT_Corou
11bd0 74 69 6e 65 3a 20 7b 0a 20 20 20 20 20 20 69 66  tine: {.      if
11be0 28 20 70 44 65 73 74 2d 3e 69 53 64 73 74 3d 3d  ( pDest->iSdst==
11bf0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65  0 ){.        pDe
11c00 73 74 2d 3e 69 53 64 73 74 20 3d 20 73 71 6c 69  st->iSdst = sqli
11c10 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28  te3GetTempRange(
11c20 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 6e 53 64  pParse, pIn->nSd
11c30 73 74 29 3b 0a 20 20 20 20 20 20 20 20 70 44 65  st);.        pDe
11c40 73 74 2d 3e 6e 53 64 73 74 20 3d 20 70 49 6e 2d  st->nSdst = pIn-
11c50 3e 6e 53 64 73 74 3b 0a 20 20 20 20 20 20 7d 0a  >nSdst;.      }.
11c60 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
11c70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65  rCodeMove(pParse
11c80 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 44  , pIn->iSdst, pD
11c90 65 73 74 2d 3e 69 53 64 73 74 2c 20 70 44 65 73  est->iSdst, pDes
11ca0 74 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20 20  t->nSdst);.     
11cb0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11cc0 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p1(v, OP_Yield, 
11cd0 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 29 3b  pDest->iSDParm);
11ce0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
11cf0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e    }..    /* If n
11d00 6f 6e 65 20 6f 66 20 74 68 65 20 61 62 6f 76 65  one of the above
11d10 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c  , then the resul
11d20 74 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 6d 75  t destination mu
11d30 73 74 20 62 65 0a 20 20 20 20 2a 2a 20 53 52 54  st be.    ** SRT
11d40 5f 4f 75 74 70 75 74 2e 20 20 54 68 69 73 20 72  _Output.  This r
11d50 6f 75 74 69 6e 65 20 69 73 20 6e 65 76 65 72 20  outine is never 
11d60 63 61 6c 6c 65 64 20 77 69 74 68 20 61 6e 79 20  called with any 
11d70 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20 64 65 73  other.    ** des
11d80 74 69 6e 61 74 69 6f 6e 20 6f 74 68 65 72 20 74  tination other t
11d90 68 61 6e 20 74 68 65 20 6f 6e 65 73 20 68 61 6e  han the ones han
11da0 64 6c 65 64 20 61 62 6f 76 65 20 6f 72 20 53 52  dled above or SR
11db0 54 5f 4f 75 74 70 75 74 2e 0a 20 20 20 20 2a 2a  T_Output..    **
11dc0 0a 20 20 20 20 2a 2a 20 46 6f 72 20 53 52 54 5f  .    ** For SRT_
11dd0 4f 75 74 70 75 74 2c 20 72 65 73 75 6c 74 73 20  Output, results 
11de0 61 72 65 20 73 74 6f 72 65 64 20 69 6e 20 61 20  are stored in a 
11df0 73 65 71 75 65 6e 63 65 20 6f 66 20 72 65 67 69  sequence of regi
11e00 73 74 65 72 73 2e 20 20 0a 20 20 20 20 2a 2a 20  sters.  .    ** 
11e10 54 68 65 6e 20 74 68 65 20 4f 50 5f 52 65 73 75  Then the OP_Resu
11e20 6c 74 52 6f 77 20 6f 70 63 6f 64 65 20 69 73 20  ltRow opcode is 
11e30 75 73 65 64 20 74 6f 20 63 61 75 73 65 20 73 71  used to cause sq
11e40 6c 69 74 65 33 5f 73 74 65 70 28 29 20 74 6f 0a  lite3_step() to.
11e50 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 20 74 68      ** return th
11e60 65 20 6e 65 78 74 20 72 6f 77 20 6f 66 20 72 65  e next row of re
11e70 73 75 6c 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  sult..    */.   
11e80 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
11e90 20 20 61 73 73 65 72 74 28 20 70 44 65 73 74 2d    assert( pDest-
11ea0 3e 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70  >eDest==SRT_Outp
11eb0 75 74 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ut );.      sqli
11ec0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
11ed0 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 70   OP_ResultRow, p
11ee0 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e  In->iSdst, pIn->
11ef0 6e 53 64 73 74 29 3b 0a 20 20 20 20 20 20 73 71  nSdst);.      sq
11f00 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66  lite3ExprCacheAf
11f10 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61  finityChange(pPa
11f20 72 73 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c  rse, pIn->iSdst,
11f30 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20   pIn->nSdst);.  
11f40 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
11f50 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20  .  }..  /* Jump 
11f60 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
11f70 65 20 6c 6f 6f 70 20 69 66 20 74 68 65 20 4c 49  e loop if the LI
11f80 4d 49 54 20 69 73 20 72 65 61 63 68 65 64 2e 0a  MIT is reached..
11f90 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 4c    */.  if( p->iL
11fa0 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  imit ){.    sqli
11fb0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
11fc0 20 4f 50 5f 49 66 5a 65 72 6f 2c 20 70 2d 3e 69   OP_IfZero, p->i
11fd0 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b 2c 20 2d  Limit, iBreak, -
11fe0 31 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65  1);.  }..  /* Ge
11ff0 6e 65 72 61 74 65 20 74 68 65 20 73 75 62 72 6f  nerate the subro
12000 75 74 69 6e 65 20 72 65 74 75 72 6e 0a 20 20 2a  utine return.  *
12010 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  /.  sqlite3VdbeR
12020 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69  esolveLabel(v, i
12030 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 73 71 6c  Continue);.  sql
12040 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
12050 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67  , OP_Return, reg
12060 52 65 74 75 72 6e 29 3b 0a 0a 20 20 72 65 74 75  Return);..  retu
12070 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn addr;.}../*.*
12080 2a 20 41 6c 74 65 72 6e 61 74 69 76 65 20 63 6f  * Alternative co
12090 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 63 6f  mpound select co
120a0 64 65 20 67 65 6e 65 72 61 74 6f 72 20 66 6f 72  de generator for
120b0 20 63 61 73 65 73 20 77 68 65 6e 20 74 68 65 72   cases when ther
120c0 65 0a 2a 2a 20 69 73 20 61 6e 20 4f 52 44 45 52  e.** is an ORDER
120d0 20 42 59 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a   BY clause..**.*
120e0 2a 20 57 65 20 61 73 73 75 6d 65 20 61 20 71 75  * We assume a qu
120f0 65 72 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  ery of the follo
12100 77 69 6e 67 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a  wing form:.**.**
12110 20 20 20 20 20 20 3c 73 65 6c 65 63 74 41 3e 20        <selectA> 
12120 20 3c 6f 70 65 72 61 74 6f 72 3e 20 20 3c 73 65   <operator>  <se
12130 6c 65 63 74 42 3e 20 20 4f 52 44 45 52 20 42 59  lectB>  ORDER BY
12140 20 3c 6f 72 64 65 72 62 79 6c 69 73 74 3e 0a 2a   <orderbylist>.*
12150 2a 0a 2a 2a 20 3c 6f 70 65 72 61 74 6f 72 3e 20  *.** <operator> 
12160 69 73 20 6f 6e 65 20 6f 66 20 55 4e 49 4f 4e 20  is one of UNION 
12170 41 4c 4c 2c 20 55 4e 49 4f 4e 2c 20 45 58 43 45  ALL, UNION, EXCE
12180 50 54 2c 20 6f 72 20 49 4e 54 45 52 53 45 43 54  PT, or INTERSECT
12190 2e 20 20 54 68 65 20 69 64 65 61 0a 2a 2a 20 69  .  The idea.** i
121a0 73 20 74 6f 20 63 6f 64 65 20 62 6f 74 68 20 3c  s to code both <
121b0 73 65 6c 65 63 74 41 3e 20 61 6e 64 20 3c 73 65  selectA> and <se
121c0 6c 65 63 74 42 3e 20 77 69 74 68 20 74 68 65 20  lectB> with the 
121d0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
121e0 61 73 0a 2a 2a 20 63 6f 2d 72 6f 75 74 69 6e 65  as.** co-routine
121f0 73 2e 20 20 54 68 65 6e 20 72 75 6e 20 74 68 65  s.  Then run the
12200 20 63 6f 2d 72 6f 75 74 69 6e 65 73 20 69 6e 20   co-routines in 
12210 70 61 72 61 6c 6c 65 6c 20 61 6e 64 20 6d 65 72  parallel and mer
12220 67 65 20 74 68 65 20 72 65 73 75 6c 74 73 0a 2a  ge the results.*
12230 2a 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75  * into the outpu
12240 74 2e 20 20 49 6e 20 61 64 64 69 74 69 6f 6e 20  t.  In addition 
12250 74 6f 20 74 68 65 20 74 77 6f 20 63 6f 72 6f 75  to the two corou
12260 74 69 6e 65 73 20 28 63 61 6c 6c 65 64 20 73 65  tines (called se
12270 6c 65 63 74 41 20 61 6e 64 0a 2a 2a 20 73 65 6c  lectA and.** sel
12280 65 63 74 42 29 20 74 68 65 72 65 20 61 72 65 20  ectB) there are 
12290 37 20 73 75 62 72 6f 75 74 69 6e 65 73 3a 0a 2a  7 subroutines:.*
122a0 2a 0a 2a 2a 20 20 20 20 6f 75 74 41 3a 20 20 20  *.**    outA:   
122b0 20 4d 6f 76 65 20 74 68 65 20 6f 75 74 70 75 74   Move the output
122c0 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 41 20   of the selectA 
122d0 63 6f 72 6f 75 74 69 6e 65 20 69 6e 74 6f 20 74  coroutine into t
122e0 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 20 20 20  he output.**    
122f0 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20           of the 
12300 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 2e 0a  compound query..
12310 2a 2a 0a 2a 2a 20 20 20 20 6f 75 74 42 3a 20 20  **.**    outB:  
12320 20 20 4d 6f 76 65 20 74 68 65 20 6f 75 74 70 75    Move the outpu
12330 74 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 42  t of the selectB
12340 20 63 6f 72 6f 75 74 69 6e 65 20 69 6e 74 6f 20   coroutine into 
12350 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 20 20  the output.**   
12360 20 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65            of the
12370 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 2e   compound query.
12380 20 20 28 4f 6e 6c 79 20 67 65 6e 65 72 61 74 65    (Only generate
12390 64 20 66 6f 72 20 55 4e 49 4f 4e 20 61 6e 64 0a  d for UNION and.
123a0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 55  **             U
123b0 4e 49 4f 4e 20 41 4c 4c 2e 20 20 45 58 43 45 50  NION ALL.  EXCEP
123c0 54 20 61 6e 64 20 49 4e 53 45 52 54 53 45 43 54  T and INSERTSECT
123d0 20 6e 65 76 65 72 20 6f 75 74 70 75 74 20 61 20   never output a 
123e0 72 6f 77 20 74 68 61 74 0a 2a 2a 20 20 20 20 20  row that.**     
123f0 20 20 20 20 20 20 20 20 61 70 70 65 61 72 73 20          appears 
12400 6f 6e 6c 79 20 69 6e 20 42 2e 29 0a 2a 2a 0a 2a  only in B.).**.*
12410 2a 20 20 20 20 41 6c 74 42 3a 20 20 20 20 43 61  *    AltB:    Ca
12420 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 72 65 20  lled when there 
12430 69 73 20 64 61 74 61 20 66 72 6f 6d 20 62 6f 74  is data from bot
12440 68 20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64  h coroutines and
12450 20 41 3c 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41   A<B..**.**    A
12460 65 71 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77  eqB:    Called w
12470 68 65 6e 20 74 68 65 72 65 20 69 73 20 64 61 74  hen there is dat
12480 61 20 66 72 6f 6d 20 62 6f 74 68 20 63 6f 72 6f  a from both coro
12490 75 74 69 6e 65 73 20 61 6e 64 20 41 3d 3d 42 2e  utines and A==B.
124a0 0a 2a 2a 0a 2a 2a 20 20 20 20 41 67 74 42 3a 20  .**.**    AgtB: 
124b0 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 74     Called when t
124c0 68 65 72 65 20 69 73 20 64 61 74 61 20 66 72 6f  here is data fro
124d0 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65  m both coroutine
124e0 73 20 61 6e 64 20 41 3e 42 2e 0a 2a 2a 0a 2a 2a  s and A>B..**.**
124f0 20 20 20 20 45 6f 66 41 3a 20 20 20 20 43 61 6c      EofA:    Cal
12500 6c 65 64 20 77 68 65 6e 20 64 61 74 61 20 69 73  led when data is
12510 20 65 78 68 61 75 73 74 65 64 20 66 72 6f 6d 20   exhausted from 
12520 73 65 6c 65 63 74 41 2e 0a 2a 2a 0a 2a 2a 20 20  selectA..**.**  
12530 20 20 45 6f 66 42 3a 20 20 20 20 43 61 6c 6c 65    EofB:    Calle
12540 64 20 77 68 65 6e 20 64 61 74 61 20 69 73 20 65  d when data is e
12550 78 68 61 75 73 74 65 64 20 66 72 6f 6d 20 73 65  xhausted from se
12560 6c 65 63 74 42 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  lectB..**.** The
12570 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
12580 6f 66 20 74 68 65 20 6c 61 74 74 65 72 20 66 69  of the latter fi
12590 76 65 20 73 75 62 72 6f 75 74 69 6e 65 73 20 64  ve subroutines d
125a0 65 70 65 6e 64 20 6f 6e 20 77 68 69 63 68 20 0a  epend on which .
125b0 2a 2a 20 3c 6f 70 65 72 61 74 6f 72 3e 20 69 73  ** <operator> is
125c0 20 75 73 65 64 3a 0a 2a 2a 0a 2a 2a 0a 2a 2a 20   used:.**.**.** 
125d0 20 20 20 20 20 20 20 20 20 20 20 20 55 4e 49 4f              UNIO
125e0 4e 20 41 4c 4c 20 20 20 20 20 20 20 20 20 55 4e  N ALL         UN
125f0 49 4f 4e 20 20 20 20 20 20 20 20 20 20 20 20 45  ION            E
12600 58 43 45 50 54 20 20 20 20 20 20 20 20 20 20 49  XCEPT          I
12610 4e 54 45 52 53 45 43 54 0a 2a 2a 20 20 20 20 20  NTERSECT.**     
12620 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d       -----------
12630 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  --  ------------
12640 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  -----  ---------
12650 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  -----  ---------
12660 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 41 6c  --------.**   Al
12670 74 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65 78 74  tB:   outA, next
12680 41 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78  A      outA, nex
12690 74 41 20 20 20 20 20 20 20 6f 75 74 41 2c 20 6e  tA       outA, n
126a0 65 78 74 41 20 20 20 20 20 20 20 20 20 6e 65 78  extA         nex
126b0 74 41 0a 2a 2a 0a 2a 2a 20 20 20 41 65 71 42 3a  tA.**.**   AeqB:
126c0 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20     outA, nextA  
126d0 20 20 20 20 20 20 20 6e 65 78 74 41 20 20 20 20         nextA    
126e0 20 20 20 20 20 20 20 20 20 6e 65 78 74 41 20 20           nextA  
126f0 20 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78         outA, nex
12700 74 41 0a 2a 2a 0a 2a 2a 20 20 20 41 67 74 42 3a  tA.**.**   AgtB:
12710 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20     outB, nextB  
12720 20 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20      outB, nextB 
12730 20 20 20 20 20 20 20 20 20 6e 65 78 74 42 20 20           nextB  
12740 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 42 0a            nextB.
12750 2a 2a 0a 2a 2a 20 20 20 45 6f 66 41 3a 20 20 20  **.**   EofA:   
12760 6f 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20  outB, nextB     
12770 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20   outB, nextB    
12780 20 20 20 20 20 20 68 61 6c 74 20 20 20 20 20 20        halt      
12790 20 20 20 20 20 20 20 68 61 6c 74 0a 2a 2a 0a 2a         halt.**.*
127a0 2a 20 20 20 45 6f 66 42 3a 20 20 20 6f 75 74 41  *   EofB:   outA
127b0 2c 20 6e 65 78 74 41 20 20 20 20 20 20 6f 75 74  , nextA      out
127c0 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20 6f  A, nextA       o
127d0 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20  utA, nextA      
127e0 20 20 20 68 61 6c 74 0a 2a 2a 0a 2a 2a 20 49 6e     halt.**.** In
127f0 20 74 68 65 20 41 6c 74 42 2c 20 41 65 71 42 2c   the AltB, AeqB,
12800 20 61 6e 64 20 41 67 74 42 20 73 75 62 72 6f 75   and AgtB subrou
12810 74 69 6e 65 73 2c 20 61 6e 20 45 4f 46 20 6f 6e  tines, an EOF on
12820 20 41 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78   A following nex
12830 74 41 0a 2a 2a 20 63 61 75 73 65 73 20 61 6e 20  tA.** causes an 
12840 69 6d 6d 65 64 69 61 74 65 20 6a 75 6d 70 20 74  immediate jump t
12850 6f 20 45 6f 66 41 20 61 6e 64 20 61 6e 20 45 4f  o EofA and an EO
12860 46 20 6f 6e 20 42 20 66 6f 6c 6c 6f 77 69 6e 67  F on B following
12870 20 6e 65 78 74 42 20 63 61 75 73 65 73 0a 2a 2a   nextB causes.**
12880 20 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 6a 75   an immediate ju
12890 6d 70 20 74 6f 20 45 6f 66 42 2e 20 20 57 69 74  mp to EofB.  Wit
128a0 68 69 6e 20 45 6f 66 41 20 61 6e 64 20 45 6f 66  hin EofA and Eof
128b0 42 2c 20 61 6e 64 20 45 4f 46 20 6f 6e 20 65 6e  B, and EOF on en
128c0 74 72 79 20 6f 72 0a 2a 2a 20 66 6f 6c 6c 6f 77  try or.** follow
128d0 69 6e 67 20 6e 65 78 74 58 20 63 61 75 73 65 73  ing nextX causes
128e0 20 61 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 65   a jump to the e
128f0 6e 64 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74  nd of the select
12900 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a   processing..**.
12910 2a 2a 20 44 75 70 6c 69 63 61 74 65 20 72 65 6d  ** Duplicate rem
12920 6f 76 61 6c 20 69 6e 20 74 68 65 20 55 4e 49 4f  oval in the UNIO
12930 4e 2c 20 45 58 43 45 50 54 2c 20 61 6e 64 20 49  N, EXCEPT, and I
12940 4e 54 45 52 53 45 43 54 20 63 61 73 65 73 20 69  NTERSECT cases i
12950 73 20 68 61 6e 64 6c 65 64 0a 2a 2a 20 77 69 74  s handled.** wit
12960 68 69 6e 20 74 68 65 20 6f 75 74 70 75 74 20 73  hin the output s
12970 75 62 72 6f 75 74 69 6e 65 2e 20 20 54 68 65 20  ubroutine.  The 
12980 72 65 67 50 72 65 76 20 72 65 67 69 73 74 65 72  regPrev register
12990 20 73 65 74 20 68 6f 6c 64 73 20 74 68 65 20 70   set holds the p
129a0 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 6f 75 74  reviously.** out
129b0 70 75 74 20 76 61 6c 75 65 2e 20 20 41 20 63 6f  put value.  A co
129c0 6d 70 61 72 69 73 6f 6e 20 69 73 20 6d 61 64 65  mparison is made
129d0 20 61 67 61 69 6e 73 74 20 74 68 69 73 20 76 61   against this va
129e0 6c 75 65 20 61 6e 64 20 74 68 65 20 6f 75 74 70  lue and the outp
129f0 75 74 0a 2a 2a 20 69 73 20 73 6b 69 70 70 65 64  ut.** is skipped
12a00 20 69 66 20 74 68 65 20 6e 65 78 74 20 72 65 73   if the next res
12a10 75 6c 74 73 20 77 6f 75 6c 64 20 62 65 20 74 68  ults would be th
12a20 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 70 72  e same as the pr
12a30 65 76 69 6f 75 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  evious..**.** Th
12a40 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
12a50 20 70 6c 61 6e 20 69 73 20 74 6f 20 69 6d 70 6c   plan is to impl
12a60 65 6d 65 6e 74 20 74 68 65 20 74 77 6f 20 63 6f  ement the two co
12a70 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 73 65 76  routines and sev
12a80 65 6e 0a 2a 2a 20 73 75 62 72 6f 75 74 69 6e 65  en.** subroutine
12a90 73 20 66 69 72 73 74 2c 20 74 68 65 6e 20 70 75  s first, then pu
12aa0 74 20 74 68 65 20 63 6f 6e 74 72 6f 6c 20 6c 6f  t the control lo
12ab0 67 69 63 20 61 74 20 74 68 65 20 62 6f 74 74 6f  gic at the botto
12ac0 6d 2e 20 20 4c 69 6b 65 20 74 68 69 73 3a 0a 2a  m.  Like this:.*
12ad0 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 67 6f  *.**          go
12ae0 74 6f 20 49 6e 69 74 0a 2a 2a 20 20 20 20 20 63  to Init.**     c
12af0 6f 41 3a 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f  oA: coroutine fo
12b00 72 20 6c 65 66 74 20 71 75 65 72 79 20 28 41 29  r left query (A)
12b10 0a 2a 2a 20 20 20 20 20 63 6f 42 3a 20 63 6f 72  .**     coB: cor
12b20 6f 75 74 69 6e 65 20 66 6f 72 20 72 69 67 68 74  outine for right
12b30 20 71 75 65 72 79 20 28 42 29 0a 2a 2a 20 20 20   query (B).**   
12b40 20 6f 75 74 41 3a 20 6f 75 74 70 75 74 20 6f 6e   outA: output on
12b50 65 20 72 6f 77 20 6f 66 20 41 0a 2a 2a 20 20 20  e row of A.**   
12b60 20 6f 75 74 42 3a 20 6f 75 74 70 75 74 20 6f 6e   outB: output on
12b70 65 20 72 6f 77 20 6f 66 20 42 20 28 55 4e 49 4f  e row of B (UNIO
12b80 4e 20 61 6e 64 20 55 4e 49 4f 4e 20 41 4c 4c 20  N and UNION ALL 
12b90 6f 6e 6c 79 29 0a 2a 2a 20 20 20 20 45 6f 66 41  only).**    EofA
12ba0 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 45 6f 66 42  : ....**    EofB
12bb0 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 6c 74 42  : ....**    AltB
12bc0 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 65 71 42  : ....**    AeqB
12bd0 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 67 74 42  : ....**    AgtB
12be0 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 49 6e 69 74  : ....**    Init
12bf0 3a 20 69 6e 69 74 69 61 6c 69 7a 65 20 63 6f 72  : initialize cor
12c00 6f 75 74 69 6e 65 20 72 65 67 69 73 74 65 72 73  outine registers
12c10 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 79 69 65  .**          yie
12c20 6c 64 20 63 6f 41 0a 2a 2a 20 20 20 20 20 20 20  ld coA.**       
12c30 20 20 20 69 66 20 65 6f 66 28 41 29 20 67 6f 74     if eof(A) got
12c40 6f 20 45 6f 66 41 0a 2a 2a 20 20 20 20 20 20 20  o EofA.**       
12c50 20 20 20 79 69 65 6c 64 20 63 6f 42 0a 2a 2a 20     yield coB.** 
12c60 20 20 20 20 20 20 20 20 20 69 66 20 65 6f 66 28           if eof(
12c70 42 29 20 67 6f 74 6f 20 45 6f 66 42 0a 2a 2a 20  B) goto EofB.** 
12c80 20 20 20 43 6d 70 72 3a 20 43 6f 6d 70 61 72 65     Cmpr: Compare
12c90 20 41 2c 20 42 0a 2a 2a 20 20 20 20 20 20 20 20   A, B.**        
12ca0 20 20 4a 75 6d 70 20 41 6c 74 42 2c 20 41 65 71    Jump AltB, Aeq
12cb0 42 2c 20 41 67 74 42 0a 2a 2a 20 20 20 20 20 45  B, AgtB.**     E
12cc0 6e 64 3a 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 57 65  nd: ....**.** We
12cd0 20 63 61 6c 6c 20 41 6c 74 42 2c 20 41 65 71 42   call AltB, AeqB
12ce0 2c 20 41 67 74 42 2c 20 45 6f 66 41 2c 20 61 6e  , AgtB, EofA, an
12cf0 64 20 45 6f 66 42 20 22 73 75 62 72 6f 75 74 69  d EofB "subrouti
12d00 6e 65 73 22 20 62 75 74 20 74 68 65 79 20 61 72  nes" but they ar
12d10 65 20 6e 6f 74 0a 2a 2a 20 61 63 74 75 61 6c 6c  e not.** actuall
12d20 79 20 63 61 6c 6c 65 64 20 75 73 69 6e 67 20 47  y called using G
12d30 6f 73 75 62 20 61 6e 64 20 74 68 65 79 20 64 6f  osub and they do
12d40 20 6e 6f 74 20 52 65 74 75 72 6e 2e 20 20 45 6f   not Return.  Eo
12d50 66 41 20 61 6e 64 20 45 6f 66 42 20 6c 6f 6f 70  fA and EofB loop
12d60 0a 2a 2a 20 75 6e 74 69 6c 20 61 6c 6c 20 64 61  .** until all da
12d70 74 61 20 69 73 20 65 78 68 61 75 73 74 65 64 20  ta is exhausted 
12d80 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20 74 68 65  then jump to the
12d90 20 22 65 6e 64 22 20 6c 61 62 65 2e 20 20 41 6c   "end" labe.  Al
12da0 74 42 2c 20 41 65 71 42 2c 0a 2a 2a 20 61 6e 64  tB, AeqB,.** and
12db0 20 41 67 74 42 20 6a 75 6d 70 20 74 6f 20 65 69   AgtB jump to ei
12dc0 74 68 65 72 20 4c 32 20 6f 72 20 74 6f 20 6f 6e  ther L2 or to on
12dd0 65 20 6f 66 20 45 6f 66 41 20 6f 72 20 45 6f 66  e of EofA or Eof
12de0 42 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  B..*/.#ifndef SQ
12df0 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
12e00 4e 44 5f 53 45 4c 45 43 54 0a 73 74 61 74 69 63  ND_SELECT.static
12e10 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74   int multiSelect
12e20 4f 72 64 65 72 42 79 28 0a 20 20 50 61 72 73 65  OrderBy(.  Parse
12e30 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
12e40 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
12e50 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
12e60 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  *p,            /
12e70 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  * The right-most
12e80 20 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62   of SELECTs to b
12e90 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c  e coded */.  Sel
12ea0 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 20  ectDest *pDest  
12eb0 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f     /* What to do
12ec0 20 77 69 74 68 20 71 75 65 72 79 20 72 65 73 75   with query resu
12ed0 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  lts */.){.  int 
12ee0 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20  i, j;           
12ef0 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
12f00 72 73 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  rs */.  Select *
12f10 70 50 72 69 6f 72 3b 20 20 20 20 20 20 20 2f 2a  pPrior;       /*
12f20 20 41 6e 6f 74 68 65 72 20 53 45 4c 45 43 54 20   Another SELECT 
12f30 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 6f  immediately to o
12f40 75 72 20 6c 65 66 74 20 2a 2f 0a 20 20 56 64 62  ur left */.  Vdb
12f50 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20  e *v;           
12f60 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63     /* Generate c
12f70 6f 64 65 20 74 6f 20 74 68 69 73 20 56 44 42 45  ode to this VDBE
12f80 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74   */.  SelectDest
12f90 20 64 65 73 74 41 3b 20 20 20 20 20 2f 2a 20 44   destA;     /* D
12fa0 65 73 74 69 6e 61 74 69 6f 6e 20 66 6f 72 20 63  estination for c
12fb0 6f 72 6f 75 74 69 6e 65 20 41 20 2a 2f 0a 20 20  oroutine A */.  
12fc0 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 42  SelectDest destB
12fd0 3b 20 20 20 20 20 2f 2a 20 44 65 73 74 69 6e 61  ;     /* Destina
12fe0 74 69 6f 6e 20 66 6f 72 20 63 6f 72 6f 75 74 69  tion for corouti
12ff0 6e 65 20 42 20 2a 2f 0a 20 20 69 6e 74 20 72 65  ne B */.  int re
13000 67 41 64 64 72 41 3b 20 20 20 20 20 20 20 20 20  gAddrA;         
13010 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67 69 73  /* Address regis
13020 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 41  ter for select-A
13030 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20   coroutine */.  
13040 69 6e 74 20 72 65 67 45 6f 66 41 3b 20 20 20 20  int regEofA;    
13050 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 20 74 6f        /* Flag to
13060 20 69 6e 64 69 63 61 74 65 20 77 68 65 6e 20 73   indicate when s
13070 65 6c 65 63 74 2d 41 20 69 73 20 63 6f 6d 70 6c  elect-A is compl
13080 65 74 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ete */.  int reg
13090 41 64 64 72 42 3b 20 20 20 20 20 20 20 20 20 2f  AddrB;         /
130a0 2a 20 41 64 64 72 65 73 73 20 72 65 67 69 73 74  * Address regist
130b0 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 42 20  er for select-B 
130c0 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  coroutine */.  i
130d0 6e 74 20 72 65 67 45 6f 66 42 3b 20 20 20 20 20  nt regEofB;     
130e0 20 20 20 20 20 2f 2a 20 46 6c 61 67 20 74 6f 20       /* Flag to 
130f0 69 6e 64 69 63 61 74 65 20 77 68 65 6e 20 73 65  indicate when se
13100 6c 65 63 74 2d 42 20 69 73 20 63 6f 6d 70 6c 65  lect-B is comple
13110 74 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  te */.  int addr
13120 53 65 6c 65 63 74 41 3b 20 20 20 20 20 20 2f 2a  SelectA;      /*
13130 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
13140 73 65 6c 65 63 74 2d 41 20 63 6f 72 6f 75 74 69  select-A corouti
13150 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ne */.  int addr
13160 53 65 6c 65 63 74 42 3b 20 20 20 20 20 20 2f 2a  SelectB;      /*
13170 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
13180 73 65 6c 65 63 74 2d 42 20 63 6f 72 6f 75 74 69  select-B corouti
13190 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f  ne */.  int regO
131a0 75 74 41 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  utA;          /*
131b0 20 41 64 64 72 65 73 73 20 72 65 67 69 73 74 65   Address registe
131c0 72 20 66 6f 72 20 74 68 65 20 6f 75 74 70 75 74  r for the output
131d0 2d 41 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f  -A subroutine */
131e0 0a 20 20 69 6e 74 20 72 65 67 4f 75 74 42 3b 20  .  int regOutB; 
131f0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
13200 65 73 73 20 72 65 67 69 73 74 65 72 20 66 6f 72  ess register for
13210 20 74 68 65 20 6f 75 74 70 75 74 2d 42 20 73 75   the output-B su
13220 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  broutine */.  in
13230 74 20 61 64 64 72 4f 75 74 41 3b 20 20 20 20 20  t addrOutA;     
13240 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
13250 66 20 74 68 65 20 6f 75 74 70 75 74 2d 41 20 73  f the output-A s
13260 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  ubroutine */.  i
13270 6e 74 20 61 64 64 72 4f 75 74 42 20 3d 20 30 3b  nt addrOutB = 0;
13280 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
13290 6f 66 20 74 68 65 20 6f 75 74 70 75 74 2d 42 20  of the output-B 
132a0 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
132b0 69 6e 74 20 61 64 64 72 45 6f 66 41 3b 20 20 20  int addrEofA;   
132c0 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
132d0 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d 41   of the select-A
132e0 2d 65 78 68 61 75 73 74 65 64 20 73 75 62 72 6f  -exhausted subro
132f0 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61  utine */.  int a
13300 64 64 72 45 6f 66 42 3b 20 20 20 20 20 20 20 20  ddrEofB;        
13310 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
13320 68 65 20 73 65 6c 65 63 74 2d 42 2d 65 78 68 61  he select-B-exha
13330 75 73 74 65 64 20 73 75 62 72 6f 75 74 69 6e 65  usted subroutine
13340 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 41 6c   */.  int addrAl
13350 74 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41  tB;         /* A
13360 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 41 3c  ddress of the A<
13370 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  B subroutine */.
13380 20 20 69 6e 74 20 61 64 64 72 41 65 71 42 3b 20    int addrAeqB; 
13390 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
133a0 73 73 20 6f 66 20 74 68 65 20 41 3d 3d 42 20 73  ss of the A==B s
133b0 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  ubroutine */.  i
133c0 6e 74 20 61 64 64 72 41 67 74 42 3b 20 20 20 20  nt addrAgtB;    
133d0 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
133e0 6f 66 20 74 68 65 20 41 3e 42 20 73 75 62 72 6f  of the A>B subro
133f0 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72  utine */.  int r
13400 65 67 4c 69 6d 69 74 41 3b 20 20 20 20 20 20 20  egLimitA;       
13410 20 2f 2a 20 4c 69 6d 69 74 20 72 65 67 69 73 74   /* Limit regist
13420 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 41 20  er for select-A 
13430 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4c 69 6d 69  */.  int regLimi
13440 74 42 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 69  tB;        /* Li
13450 6d 69 74 20 72 65 67 69 73 74 65 72 20 66 6f 72  mit register for
13460 20 73 65 6c 65 63 74 2d 41 20 2a 2f 0a 20 20 69   select-A */.  i
13470 6e 74 20 72 65 67 50 72 65 76 3b 20 20 20 20 20  nt regPrev;     
13480 20 20 20 20 20 2f 2a 20 41 20 72 61 6e 67 65 20       /* A range 
13490 6f 66 20 72 65 67 69 73 74 65 72 73 20 74 6f 20  of registers to 
134a0 68 6f 6c 64 20 70 72 65 76 69 6f 75 73 20 6f 75  hold previous ou
134b0 74 70 75 74 20 2a 2f 0a 20 20 69 6e 74 20 73 61  tput */.  int sa
134c0 76 65 64 4c 69 6d 69 74 3b 20 20 20 20 20 20 20  vedLimit;       
134d0 2f 2a 20 53 61 76 65 64 20 76 61 6c 75 65 20 6f  /* Saved value o
134e0 66 20 70 2d 3e 69 4c 69 6d 69 74 20 2a 2f 0a 20  f p->iLimit */. 
134f0 20 69 6e 74 20 73 61 76 65 64 4f 66 66 73 65 74   int savedOffset
13500 3b 20 20 20 20 20 20 2f 2a 20 53 61 76 65 64 20  ;      /* Saved 
13510 76 61 6c 75 65 20 6f 66 20 70 2d 3e 69 4f 66 66  value of p->iOff
13520 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 61 62  set */.  int lab
13530 65 6c 43 6d 70 72 3b 20 20 20 20 20 20 20 20 2f  elCmpr;        /
13540 2a 20 4c 61 62 65 6c 20 66 6f 72 20 74 68 65 20  * Label for the 
13550 73 74 61 72 74 20 6f 66 20 74 68 65 20 6d 65 72  start of the mer
13560 67 65 20 61 6c 67 6f 72 69 74 68 6d 20 2a 2f 0a  ge algorithm */.
13570 20 20 69 6e 74 20 6c 61 62 65 6c 45 6e 64 3b 20    int labelEnd; 
13580 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 62 65 6c          /* Label
13590 20 66 6f 72 20 74 68 65 20 65 6e 64 20 6f 66 20   for the end of 
135a0 74 68 65 20 6f 76 65 72 61 6c 6c 20 53 45 4c 45  the overall SELE
135b0 43 54 20 73 74 6d 74 20 2a 2f 0a 20 20 69 6e 74  CT stmt */.  int
135c0 20 6a 31 3b 20 20 20 20 20 20 20 20 20 20 20 20   j1;            
135d0 20 20 20 2f 2a 20 4a 75 6d 70 20 69 6e 73 74 72     /* Jump instr
135e0 75 63 74 69 6f 6e 73 20 74 68 61 74 20 67 65 74  uctions that get
135f0 20 72 65 74 61 72 67 65 74 74 65 64 20 2a 2f 0a   retargetted */.
13600 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20    int op;       
13610 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f          /* One o
13620 66 20 54 4b 5f 41 4c 4c 2c 20 54 4b 5f 55 4e 49  f TK_ALL, TK_UNI
13630 4f 4e 2c 20 54 4b 5f 45 58 43 45 50 54 2c 20 54  ON, TK_EXCEPT, T
13640 4b 5f 49 4e 54 45 52 53 45 43 54 20 2a 2f 0a 20  K_INTERSECT */. 
13650 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 44 75   KeyInfo *pKeyDu
13660 70 20 3d 20 30 3b 20 2f 2a 20 43 6f 6d 70 61 72  p = 0; /* Compar
13670 69 73 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ison information
13680 20 66 6f 72 20 64 75 70 6c 69 63 61 74 65 20 72   for duplicate r
13690 65 6d 6f 76 61 6c 20 2a 2f 0a 20 20 4b 65 79 49  emoval */.  KeyI
136a0 6e 66 6f 20 2a 70 4b 65 79 4d 65 72 67 65 3b 20  nfo *pKeyMerge; 
136b0 20 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20    /* Comparison 
136c0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20  information for 
136d0 6d 65 72 67 69 6e 67 20 72 6f 77 73 20 2a 2f 0a  merging rows */.
136e0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20    sqlite3 *db;  
136f0 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
13700 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
13710 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  /.  ExprList *pO
13720 72 64 65 72 42 79 3b 20 20 20 2f 2a 20 54 68 65  rderBy;   /* The
13730 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
13740 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72   */.  int nOrder
13750 42 79 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  By;         /* N
13760 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 20 69  umber of terms i
13770 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  n the ORDER BY c
13780 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 2a  lause */.  int *
13790 61 50 65 72 6d 75 74 65 3b 20 20 20 20 20 20 20  aPermute;       
137a0 20 2f 2a 20 4d 61 70 70 69 6e 67 20 66 72 6f 6d   /* Mapping from
137b0 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20   ORDER BY terms 
137c0 74 6f 20 72 65 73 75 6c 74 20 73 65 74 20 63 6f  to result set co
137d0 6c 75 6d 6e 73 20 2a 2f 0a 23 69 66 6e 64 65 66  lumns */.#ifndef
137e0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50   SQLITE_OMIT_EXP
137f0 4c 41 49 4e 0a 20 20 69 6e 74 20 69 53 75 62 31  LAIN.  int iSub1
13800 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
13810 45 51 50 20 69 64 20 6f 66 20 6c 65 66 74 2d 68  EQP id of left-h
13820 61 6e 64 20 71 75 65 72 79 20 2a 2f 0a 20 20 69  and query */.  i
13830 6e 74 20 69 53 75 62 32 3b 20 20 20 20 20 20 20  nt iSub2;       
13840 20 20 20 20 20 2f 2a 20 45 51 50 20 69 64 20 6f       /* EQP id o
13850 66 20 72 69 67 68 74 2d 68 61 6e 64 20 71 75 65  f right-hand que
13860 72 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20  ry */.#endif..  
13870 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65  assert( p->pOrde
13880 72 42 79 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  rBy!=0 );.  asse
13890 72 74 28 20 70 4b 65 79 44 75 70 3d 3d 30 20 29  rt( pKeyDup==0 )
138a0 3b 20 2f 2a 20 22 4d 61 6e 61 67 65 64 22 20 63  ; /* "Managed" c
138b0 6f 64 65 20 6e 65 65 64 73 20 74 68 69 73 2e 20  ode needs this. 
138c0 20 54 69 63 6b 65 74 20 23 33 33 38 32 2e 20 2a   Ticket #3382. *
138d0 2f 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d  /.  db = pParse-
138e0 3e 64 62 3b 0a 20 20 76 20 3d 20 70 50 61 72 73  >db;.  v = pPars
138f0 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65  e->pVdbe;.  asse
13900 72 74 28 20 76 21 3d 30 20 29 3b 20 20 20 20 20  rt( v!=0 );     
13910 20 20 2f 2a 20 41 6c 72 65 61 64 79 20 74 68 72    /* Already thr
13920 6f 77 6e 20 74 68 65 20 65 72 72 6f 72 20 69 66  own the error if
13930 20 56 44 42 45 20 61 6c 6c 6f 63 20 66 61 69 6c   VDBE alloc fail
13940 65 64 20 2a 2f 0a 20 20 6c 61 62 65 6c 45 6e 64  ed */.  labelEnd
13950 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
13960 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 6c 61  keLabel(v);.  la
13970 62 65 6c 43 6d 70 72 20 3d 20 73 71 6c 69 74 65  belCmpr = sqlite
13980 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
13990 29 3b 0a 0a 0a 20 20 2f 2a 20 50 61 74 63 68 20  );...  /* Patch 
139a0 75 70 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  up the ORDER BY 
139b0 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20 6f 70  clause.  */.  op
139c0 20 3d 20 70 2d 3e 6f 70 3b 20 20 0a 20 20 70 50   = p->op;  .  pP
139d0 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72  rior = p->pPrior
139e0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 72 69  ;.  assert( pPri
139f0 6f 72 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20  or->pOrderBy==0 
13a00 29 3b 0a 20 20 70 4f 72 64 65 72 42 79 20 3d 20  );.  pOrderBy = 
13a10 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 61  p->pOrderBy;.  a
13a20 73 73 65 72 74 28 20 70 4f 72 64 65 72 42 79 20  ssert( pOrderBy 
13a30 29 3b 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d 20  );.  nOrderBy = 
13a40 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
13a50 0a 0a 20 20 2f 2a 20 46 6f 72 20 6f 70 65 72 61  ..  /* For opera
13a60 74 6f 72 73 20 6f 74 68 65 72 20 74 68 61 6e 20  tors other than 
13a70 55 4e 49 4f 4e 20 41 4c 4c 20 77 65 20 68 61 76  UNION ALL we hav
13a80 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  e to make sure t
13a90 68 61 74 0a 20 20 2a 2a 20 74 68 65 20 4f 52 44  hat.  ** the ORD
13aa0 45 52 20 42 59 20 63 6c 61 75 73 65 20 63 6f 76  ER BY clause cov
13ab0 65 72 73 20 65 76 65 72 79 20 74 65 72 6d 20 6f  ers every term o
13ac0 66 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  f the result set
13ad0 2e 20 20 41 64 64 0a 20 20 2a 2a 20 74 65 72 6d  .  Add.  ** term
13ae0 73 20 74 6f 20 74 68 65 20 4f 52 44 45 52 20 42  s to the ORDER B
13af0 59 20 63 6c 61 75 73 65 20 61 73 20 6e 65 63 65  Y clause as nece
13b00 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 69 66  ssary..  */.  if
13b10 28 20 6f 70 21 3d 54 4b 5f 41 4c 4c 20 29 7b 0a  ( op!=TK_ALL ){.
13b20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 64 62 2d      for(i=1; db-
13b30 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30  >mallocFailed==0
13b40 20 26 26 20 69 3c 3d 70 2d 3e 70 45 4c 69 73 74   && i<=p->pEList
13b50 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
13b60 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72       struct Expr
13b70 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
13b80 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c  ;.      for(j=0,
13b90 20 70 49 74 65 6d 3d 70 4f 72 64 65 72 42 79 2d   pItem=pOrderBy-
13ba0 3e 61 3b 20 6a 3c 6e 4f 72 64 65 72 42 79 3b 20  >a; j<nOrderBy; 
13bb0 6a 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  j++, pItem++){. 
13bc0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
13bd0 49 74 65 6d 2d 3e 69 4f 72 64 65 72 42 79 43 6f  Item->iOrderByCo
13be0 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69  l>0 );.        i
13bf0 66 28 20 70 49 74 65 6d 2d 3e 69 4f 72 64 65 72  f( pItem->iOrder
13c00 42 79 43 6f 6c 3d 3d 69 20 29 20 62 72 65 61 6b  ByCol==i ) break
13c10 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
13c20 69 66 28 20 6a 3d 3d 6e 4f 72 64 65 72 42 79 20  if( j==nOrderBy 
13c30 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20  ){.        Expr 
13c40 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45  *pNew = sqlite3E
13c50 78 70 72 28 64 62 2c 20 54 4b 5f 49 4e 54 45 47  xpr(db, TK_INTEG
13c60 45 52 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ER, 0);.        
13c70 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65  if( pNew==0 ) re
13c80 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
13c90 4d 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  M;.        pNew-
13ca0 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 49 6e 74  >flags |= EP_Int
13cb0 56 61 6c 75 65 3b 0a 20 20 20 20 20 20 20 20 70  Value;.        p
13cc0 4e 65 77 2d 3e 75 2e 69 56 61 6c 75 65 20 3d 20  New->u.iValue = 
13cd0 69 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 64 65  i;.        pOrde
13ce0 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  rBy = sqlite3Exp
13cf0 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72  rListAppend(pPar
13d00 73 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 4e  se, pOrderBy, pN
13d10 65 77 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ew);.        if(
13d20 20 70 4f 72 64 65 72 42 79 20 29 20 70 4f 72 64   pOrderBy ) pOrd
13d30 65 72 42 79 2d 3e 61 5b 6e 4f 72 64 65 72 42 79  erBy->a[nOrderBy
13d40 2b 2b 5d 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20  ++].iOrderByCol 
13d50 3d 20 28 75 31 36 29 69 3b 0a 20 20 20 20 20 20  = (u16)i;.      
13d60 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
13d70 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 63 6f  * Compute the co
13d80 6d 70 61 72 69 73 6f 6e 20 70 65 72 6d 75 74 61  mparison permuta
13d90 74 69 6f 6e 20 61 6e 64 20 6b 65 79 69 6e 66 6f  tion and keyinfo
13da0 20 74 68 61 74 20 69 73 20 75 73 65 64 20 77 69   that is used wi
13db0 74 68 0a 20 20 2a 2a 20 74 68 65 20 70 65 72 6d  th.  ** the perm
13dc0 75 74 61 74 69 6f 6e 20 75 73 65 64 20 74 6f 20  utation used to 
13dd0 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65  determine if the
13de0 20 6e 65 78 74 0a 20 20 2a 2a 20 72 6f 77 20 6f   next.  ** row o
13df0 66 20 72 65 73 75 6c 74 73 20 63 6f 6d 65 73 20  f results comes 
13e00 66 72 6f 6d 20 73 65 6c 65 63 74 41 20 6f 72 20  from selectA or 
13e10 73 65 6c 65 63 74 42 2e 20 20 41 6c 73 6f 20 61  selectB.  Also a
13e20 64 64 20 65 78 70 6c 69 63 69 74 0a 20 20 2a 2a  dd explicit.  **
13e30 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 74 6f 20 74   collations to t
13e40 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
13e50 73 65 20 74 65 72 6d 73 20 73 6f 20 74 68 61 74  se terms so that
13e60 20 77 68 65 6e 20 74 68 65 20 73 75 62 71 75 65   when the subque
13e70 72 69 65 73 0a 20 20 2a 2a 20 74 6f 20 74 68 65  ries.  ** to the
13e80 20 72 69 67 68 74 20 61 6e 64 20 74 68 65 20 6c   right and the l
13e90 65 66 74 20 61 72 65 20 65 76 61 6c 75 61 74 65  eft are evaluate
13ea0 64 2c 20 74 68 65 79 20 75 73 65 20 74 68 65 20  d, they use the 
13eb0 63 6f 72 72 65 63 74 0a 20 20 2a 2a 20 63 6f 6c  correct.  ** col
13ec0 6c 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 61  lation..  */.  a
13ed0 50 65 72 6d 75 74 65 20 3d 20 73 71 6c 69 74 65  Permute = sqlite
13ee0 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c  3DbMallocRaw(db,
13ef0 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a 6e 4f 72   sizeof(int)*nOr
13f00 64 65 72 42 79 29 3b 0a 20 20 69 66 28 20 61 50  derBy);.  if( aP
13f10 65 72 6d 75 74 65 20 29 7b 0a 20 20 20 20 73 74  ermute ){.    st
13f20 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
13f30 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 66  em *pItem;.    f
13f40 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70 4f  or(i=0, pItem=pO
13f50 72 64 65 72 42 79 2d 3e 61 3b 20 69 3c 6e 4f 72  rderBy->a; i<nOr
13f60 64 65 72 42 79 3b 20 69 2b 2b 2c 20 70 49 74 65  derBy; i++, pIte
13f70 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65  m++){.      asse
13f80 72 74 28 20 70 49 74 65 6d 2d 3e 69 4f 72 64 65  rt( pItem->iOrde
13f90 72 42 79 43 6f 6c 3e 30 20 20 26 26 20 70 49 74  rByCol>0  && pIt
13fa0 65 6d 2d 3e 69 4f 72 64 65 72 42 79 43 6f 6c 3c  em->iOrderByCol<
13fb0 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  =p->pEList->nExp
13fc0 72 20 29 3b 0a 20 20 20 20 20 20 61 50 65 72 6d  r );.      aPerm
13fd0 75 74 65 5b 69 5d 20 3d 20 70 49 74 65 6d 2d 3e  ute[i] = pItem->
13fe0 69 4f 72 64 65 72 42 79 43 6f 6c 20 2d 20 31 3b  iOrderByCol - 1;
13ff0 0a 20 20 20 20 7d 0a 20 20 20 20 70 4b 65 79 4d  .    }.    pKeyM
14000 65 72 67 65 20 3d 0a 20 20 20 20 20 20 73 71 6c  erge =.      sql
14010 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
14020 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4b 65 79  db, sizeof(*pKey
14030 4d 65 72 67 65 29 2b 6e 4f 72 64 65 72 42 79 2a  Merge)+nOrderBy*
14040 28 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a  (sizeof(CollSeq*
14050 29 2b 31 29 29 3b 0a 20 20 20 20 69 66 28 20 70  )+1));.    if( p
14060 4b 65 79 4d 65 72 67 65 20 29 7b 0a 20 20 20 20  KeyMerge ){.    
14070 20 20 70 4b 65 79 4d 65 72 67 65 2d 3e 61 53 6f    pKeyMerge->aSo
14080 72 74 4f 72 64 65 72 20 3d 20 28 75 38 2a 29 26  rtOrder = (u8*)&
14090 70 4b 65 79 4d 65 72 67 65 2d 3e 61 43 6f 6c 6c  pKeyMerge->aColl
140a0 5b 6e 4f 72 64 65 72 42 79 5d 3b 0a 20 20 20 20  [nOrderBy];.    
140b0 20 20 70 4b 65 79 4d 65 72 67 65 2d 3e 6e 46 69    pKeyMerge->nFi
140c0 65 6c 64 20 3d 20 28 75 31 36 29 6e 4f 72 64 65  eld = (u16)nOrde
140d0 72 42 79 3b 0a 20 20 20 20 20 20 70 4b 65 79 4d  rBy;.      pKeyM
140e0 65 72 67 65 2d 3e 65 6e 63 20 3d 20 45 4e 43 28  erge->enc = ENC(
140f0 64 62 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  db);.      for(i
14100 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20  =0; i<nOrderBy; 
14110 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 43 6f  i++){.        Co
14120 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20  llSeq *pColl;.  
14130 20 20 20 20 20 20 45 78 70 72 20 2a 70 54 65 72        Expr *pTer
14140 6d 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  m = pOrderBy->a[
14150 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  i].pExpr;.      
14160 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 66 6c 61    if( pTerm->fla
14170 67 73 20 26 20 45 50 5f 45 78 70 43 6f 6c 6c 61  gs & EP_ExpColla
14180 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  te ){.          
14190 70 43 6f 6c 6c 20 3d 20 70 54 65 72 6d 2d 3e 70  pColl = pTerm->p
141a0 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7d 65  Coll;.        }e
141b0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70  lse{.          p
141c0 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69 53 65 6c 65  Coll = multiSele
141d0 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  ctCollSeq(pParse
141e0 2c 20 70 2c 20 61 50 65 72 6d 75 74 65 5b 69 5d  , p, aPermute[i]
141f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 54 65  );.          pTe
14200 72 6d 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f  rm->flags |= EP_
14210 45 78 70 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20  ExpCollate;.    
14220 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 70 43 6f        pTerm->pCo
14230 6c 6c 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20 20  ll = pColl;.    
14240 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 4b      }.        pK
14250 65 79 4d 65 72 67 65 2d 3e 61 43 6f 6c 6c 5b 69  eyMerge->aColl[i
14260 5d 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20 20 20  ] = pColl;.     
14270 20 20 20 70 4b 65 79 4d 65 72 67 65 2d 3e 61 53     pKeyMerge->aS
14280 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 70 4f  ortOrder[i] = pO
14290 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72  rderBy->a[i].sor
142a0 74 4f 72 64 65 72 3b 0a 20 20 20 20 20 20 7d 0a  tOrder;.      }.
142b0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
142c0 20 20 20 70 4b 65 79 4d 65 72 67 65 20 3d 20 30     pKeyMerge = 0
142d0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 74  ;.  }..  /* Reat
142e0 74 61 63 68 20 74 68 65 20 4f 52 44 45 52 20 42  tach the ORDER B
142f0 59 20 63 6c 61 75 73 65 20 74 6f 20 74 68 65 20  Y clause to the 
14300 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 70 2d  query..  */.  p-
14310 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64  >pOrderBy = pOrd
14320 65 72 42 79 3b 0a 20 20 70 50 72 69 6f 72 2d 3e  erBy;.  pPrior->
14330 70 4f 72 64 65 72 42 79 20 3d 20 73 71 6c 69 74  pOrderBy = sqlit
14340 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 70 50  e3ExprListDup(pP
14350 61 72 73 65 2d 3e 64 62 2c 20 70 4f 72 64 65 72  arse->db, pOrder
14360 42 79 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20 41 6c  By, 0);..  /* Al
14370 6c 6f 63 61 74 65 20 61 20 72 61 6e 67 65 20 6f  locate a range o
14380 66 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69  f temporary regi
14390 73 74 65 72 73 20 61 6e 64 20 74 68 65 20 4b 65  sters and the Ke
143a0 79 49 6e 66 6f 20 6e 65 65 64 65 64 0a 20 20 2a  yInfo needed.  *
143b0 2a 20 66 6f 72 20 74 68 65 20 6c 6f 67 69 63 20  * for the logic 
143c0 74 68 61 74 20 72 65 6d 6f 76 65 73 20 64 75 70  that removes dup
143d0 6c 69 63 61 74 65 20 72 65 73 75 6c 74 20 72 6f  licate result ro
143e0 77 73 20 77 68 65 6e 20 74 68 65 0a 20 20 2a 2a  ws when the.  **
143f0 20 6f 70 65 72 61 74 6f 72 20 69 73 20 55 4e 49   operator is UNI
14400 4f 4e 2c 20 45 58 43 45 50 54 2c 20 6f 72 20 49  ON, EXCEPT, or I
14410 4e 54 45 52 53 45 43 54 20 28 62 75 74 20 6e 6f  NTERSECT (but no
14420 74 20 55 4e 49 4f 4e 20 41 4c 4c 29 2e 0a 20 20  t UNION ALL)..  
14430 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  */.  if( op==TK_
14440 41 4c 4c 20 29 7b 0a 20 20 20 20 72 65 67 50 72  ALL ){.    regPr
14450 65 76 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  ev = 0;.  }else{
14460 0a 20 20 20 20 69 6e 74 20 6e 45 78 70 72 20 3d  .    int nExpr =
14470 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
14480 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  r;.    assert( n
14490 4f 72 64 65 72 42 79 3e 3d 6e 45 78 70 72 20 7c  OrderBy>=nExpr |
144a0 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
144b0 65 64 20 29 3b 0a 20 20 20 20 72 65 67 50 72 65  ed );.    regPre
144c0 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  v = sqlite3GetTe
144d0 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
144e0 6e 45 78 70 72 2b 31 29 3b 0a 20 20 20 20 73 71  nExpr+1);.    sq
144f0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
14500 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
14510 2c 20 72 65 67 50 72 65 76 29 3b 0a 20 20 20 20  , regPrev);.    
14520 70 4b 65 79 44 75 70 20 3d 20 73 71 6c 69 74 65  pKeyDup = sqlite
14530 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
14540 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
14550 20 20 20 20 73 69 7a 65 6f 66 28 2a 70 4b 65 79      sizeof(*pKey
14560 44 75 70 29 20 2b 20 6e 45 78 70 72 2a 28 73 69  Dup) + nExpr*(si
14570 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 2b 31  zeof(CollSeq*)+1
14580 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4b 65  ) );.    if( pKe
14590 79 44 75 70 20 29 7b 0a 20 20 20 20 20 20 70 4b  yDup ){.      pK
145a0 65 79 44 75 70 2d 3e 61 53 6f 72 74 4f 72 64 65  eyDup->aSortOrde
145b0 72 20 3d 20 28 75 38 2a 29 26 70 4b 65 79 44 75  r = (u8*)&pKeyDu
145c0 70 2d 3e 61 43 6f 6c 6c 5b 6e 45 78 70 72 5d 3b  p->aColl[nExpr];
145d0 0a 20 20 20 20 20 20 70 4b 65 79 44 75 70 2d 3e  .      pKeyDup->
145e0 6e 46 69 65 6c 64 20 3d 20 28 75 31 36 29 6e 45  nField = (u16)nE
145f0 78 70 72 3b 0a 20 20 20 20 20 20 70 4b 65 79 44  xpr;.      pKeyD
14600 75 70 2d 3e 65 6e 63 20 3d 20 45 4e 43 28 64 62  up->enc = ENC(db
14610 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  );.      for(i=0
14620 3b 20 69 3c 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  ; i<nExpr; i++){
14630 0a 20 20 20 20 20 20 20 20 70 4b 65 79 44 75 70  .        pKeyDup
14640 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 6d 75 6c  ->aColl[i] = mul
14650 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28  tiSelectCollSeq(
14660 70 50 61 72 73 65 2c 20 70 2c 20 69 29 3b 0a 20  pParse, p, i);. 
14670 20 20 20 20 20 20 20 70 4b 65 79 44 75 70 2d 3e         pKeyDup->
14680 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20  aSortOrder[i] = 
14690 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
146a0 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20 53 65 70 61  .  }. .  /* Sepa
146b0 72 61 74 65 20 74 68 65 20 6c 65 66 74 20 61 6e  rate the left an
146c0 64 20 74 68 65 20 72 69 67 68 74 20 71 75 65 72  d the right quer
146d0 79 20 66 72 6f 6d 20 6f 6e 65 20 61 6e 6f 74 68  y from one anoth
146e0 65 72 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 50 72  er.  */.  p->pPr
146f0 69 6f 72 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  ior = 0;.  sqlit
14700 65 33 52 65 73 6f 6c 76 65 4f 72 64 65 72 47 72  e3ResolveOrderGr
14710 6f 75 70 42 79 28 70 50 61 72 73 65 2c 20 70 2c  oupBy(pParse, p,
14720 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 22 4f   p->pOrderBy, "O
14730 52 44 45 52 22 29 3b 0a 20 20 69 66 28 20 70 50  RDER");.  if( pP
14740 72 69 6f 72 2d 3e 70 50 72 69 6f 72 3d 3d 30 20  rior->pPrior==0 
14750 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  ){.    sqlite3Re
14760 73 6f 6c 76 65 4f 72 64 65 72 47 72 6f 75 70 42  solveOrderGroupB
14770 79 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72  y(pParse, pPrior
14780 2c 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72  , pPrior->pOrder
14790 42 79 2c 20 22 4f 52 44 45 52 22 29 3b 0a 20 20  By, "ORDER");.  
147a0 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20  }..  /* Compute 
147b0 74 68 65 20 6c 69 6d 69 74 20 72 65 67 69 73 74  the limit regist
147c0 65 72 73 20 2a 2f 0a 20 20 63 6f 6d 70 75 74 65  ers */.  compute
147d0 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70  LimitRegisters(p
147e0 50 61 72 73 65 2c 20 70 2c 20 6c 61 62 65 6c 45  Parse, p, labelE
147f0 6e 64 29 3b 0a 20 20 69 66 28 20 70 2d 3e 69 4c  nd);.  if( p->iL
14800 69 6d 69 74 20 26 26 20 6f 70 3d 3d 54 4b 5f 41  imit && op==TK_A
14810 4c 4c 20 29 7b 0a 20 20 20 20 72 65 67 4c 69 6d  LL ){.    regLim
14820 69 74 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  itA = ++pParse->
14830 6e 4d 65 6d 3b 0a 20 20 20 20 72 65 67 4c 69 6d  nMem;.    regLim
14840 69 74 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  itB = ++pParse->
14850 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65  nMem;.    sqlite
14860 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
14870 50 5f 43 6f 70 79 2c 20 70 2d 3e 69 4f 66 66 73  P_Copy, p->iOffs
14880 65 74 20 3f 20 70 2d 3e 69 4f 66 66 73 65 74 2b  et ? p->iOffset+
14890 31 20 3a 20 70 2d 3e 69 4c 69 6d 69 74 2c 0a 20  1 : p->iLimit,. 
148a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
148b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
148c0 20 72 65 67 4c 69 6d 69 74 41 29 3b 0a 20 20 20   regLimitA);.   
148d0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
148e0 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72  p2(v, OP_Copy, r
148f0 65 67 4c 69 6d 69 74 41 2c 20 72 65 67 4c 69 6d  egLimitA, regLim
14900 69 74 42 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  itB);.  }else{. 
14910 20 20 20 72 65 67 4c 69 6d 69 74 41 20 3d 20 72     regLimitA = r
14920 65 67 4c 69 6d 69 74 42 20 3d 20 30 3b 0a 20 20  egLimitB = 0;.  
14930 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  }.  sqlite3ExprD
14940 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69  elete(db, p->pLi
14950 6d 69 74 29 3b 0a 20 20 70 2d 3e 70 4c 69 6d 69  mit);.  p->pLimi
14960 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  t = 0;.  sqlite3
14970 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
14980 2d 3e 70 4f 66 66 73 65 74 29 3b 0a 20 20 70 2d  ->pOffset);.  p-
14990 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 0a 20  >pOffset = 0;.. 
149a0 20 72 65 67 41 64 64 72 41 20 3d 20 2b 2b 70 50   regAddrA = ++pP
149b0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65  arse->nMem;.  re
149c0 67 45 6f 66 41 20 3d 20 2b 2b 70 50 61 72 73 65  gEofA = ++pParse
149d0 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 41 64 64  ->nMem;.  regAdd
149e0 72 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  rB = ++pParse->n
149f0 4d 65 6d 3b 0a 20 20 72 65 67 45 6f 66 42 20 3d  Mem;.  regEofB =
14a00 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
14a10 0a 20 20 72 65 67 4f 75 74 41 20 3d 20 2b 2b 70  .  regOutA = ++p
14a20 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72  Parse->nMem;.  r
14a30 65 67 4f 75 74 42 20 3d 20 2b 2b 70 50 61 72 73  egOutB = ++pPars
14a40 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69 74  e->nMem;.  sqlit
14a50 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74  e3SelectDestInit
14a60 28 26 64 65 73 74 41 2c 20 53 52 54 5f 43 6f 72  (&destA, SRT_Cor
14a70 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72 41  outine, regAddrA
14a80 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  );.  sqlite3Sele
14a90 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74  ctDestInit(&dest
14aa0 42 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65  B, SRT_Coroutine
14ab0 2c 20 72 65 67 41 64 64 72 42 29 3b 0a 0a 20 20  , regAddrB);..  
14ac0 2f 2a 20 4a 75 6d 70 20 70 61 73 74 20 74 68 65  /* Jump past the
14ad0 20 76 61 72 69 6f 75 73 20 73 75 62 72 6f 75 74   various subrout
14ae0 69 6e 65 73 20 61 6e 64 20 63 6f 72 6f 75 74 69  ines and corouti
14af0 6e 65 73 20 74 6f 20 74 68 65 20 6d 61 69 6e 0a  nes to the main.
14b00 20 20 2a 2a 20 6d 65 72 67 65 20 6c 6f 6f 70 0a    ** merge loop.
14b10 20 20 2a 2f 0a 20 20 6a 31 20 3d 20 73 71 6c 69    */.  j1 = sqli
14b20 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c  te3VdbeAddOp0(v,
14b30 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20 61 64 64   OP_Goto);.  add
14b40 72 53 65 6c 65 63 74 41 20 3d 20 73 71 6c 69 74  rSelectA = sqlit
14b50 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
14b60 72 28 76 29 3b 0a 0a 0a 20 20 2f 2a 20 47 65 6e  r(v);...  /* Gen
14b70 65 72 61 74 65 20 61 20 63 6f 72 6f 75 74 69 6e  erate a coroutin
14b80 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68  e to evaluate th
14b90 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
14ba0 6e 74 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 6c  nt to the.  ** l
14bb0 65 66 74 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f  eft of the compo
14bc0 75 6e 64 20 6f 70 65 72 61 74 6f 72 20 2d 20 74  und operator - t
14bd0 68 65 20 22 41 22 20 73 65 6c 65 63 74 2e 0a 20  he "A" select.. 
14be0 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f   */.  VdbeNoopCo
14bf0 6d 6d 65 6e 74 28 28 76 2c 20 22 42 65 67 69 6e  mment((v, "Begin
14c00 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20 6c   coroutine for l
14c10 65 66 74 20 53 45 4c 45 43 54 22 29 29 3b 0a 20  eft SELECT"));. 
14c20 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 20   pPrior->iLimit 
14c30 3d 20 72 65 67 4c 69 6d 69 74 41 3b 0a 20 20 65  = regLimitA;.  e
14c40 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72  xplainSetInteger
14c50 28 69 53 75 62 31 2c 20 70 50 61 72 73 65 2d 3e  (iSub1, pParse->
14c60 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a  iNextSelectId);.
14c70 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28    sqlite3Select(
14c80 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20  pParse, pPrior, 
14c90 26 64 65 73 74 41 29 3b 0a 20 20 73 71 6c 69 74  &destA);.  sqlit
14ca0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
14cb0 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 72  OP_Integer, 1, r
14cc0 65 67 45 6f 66 41 29 3b 0a 20 20 73 71 6c 69 74  egEofA);.  sqlit
14cd0 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
14ce0 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64  OP_Yield, regAdd
14cf0 72 41 29 3b 0a 20 20 56 64 62 65 4e 6f 6f 70 43  rA);.  VdbeNoopC
14d00 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 45 6e 64 20  omment((v, "End 
14d10 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20 6c 65  coroutine for le
14d20 66 74 20 53 45 4c 45 43 54 22 29 29 3b 0a 0a 20  ft SELECT"));.. 
14d30 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 63   /* Generate a c
14d40 6f 72 6f 75 74 69 6e 65 20 74 6f 20 65 76 61 6c  oroutine to eval
14d50 75 61 74 65 20 74 68 65 20 53 45 4c 45 43 54 20  uate the SELECT 
14d60 73 74 61 74 65 6d 65 6e 74 20 6f 6e 20 0a 20 20  statement on .  
14d70 2a 2a 20 74 68 65 20 72 69 67 68 74 20 2d 20 74  ** the right - t
14d80 68 65 20 22 42 22 20 73 65 6c 65 63 74 0a 20 20  he "B" select.  
14d90 2a 2f 0a 20 20 61 64 64 72 53 65 6c 65 63 74 42  */.  addrSelectB
14da0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
14db0 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
14dc0 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28  VdbeNoopComment(
14dd0 28 76 2c 20 22 42 65 67 69 6e 20 63 6f 72 6f 75  (v, "Begin corou
14de0 74 69 6e 65 20 66 6f 72 20 72 69 67 68 74 20 53  tine for right S
14df0 45 4c 45 43 54 22 29 29 3b 0a 20 20 73 61 76 65  ELECT"));.  save
14e00 64 4c 69 6d 69 74 20 3d 20 70 2d 3e 69 4c 69 6d  dLimit = p->iLim
14e10 69 74 3b 0a 20 20 73 61 76 65 64 4f 66 66 73 65  it;.  savedOffse
14e20 74 20 3d 20 70 2d 3e 69 4f 66 66 73 65 74 3b 0a  t = p->iOffset;.
14e30 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 72 65    p->iLimit = re
14e40 67 4c 69 6d 69 74 42 3b 0a 20 20 70 2d 3e 69 4f  gLimitB;.  p->iO
14e50 66 66 73 65 74 20 3d 20 30 3b 20 20 0a 20 20 65  ffset = 0;  .  e
14e60 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72  xplainSetInteger
14e70 28 69 53 75 62 32 2c 20 70 50 61 72 73 65 2d 3e  (iSub2, pParse->
14e80 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a  iNextSelectId);.
14e90 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28    sqlite3Select(
14ea0 70 50 61 72 73 65 2c 20 70 2c 20 26 64 65 73 74  pParse, p, &dest
14eb0 42 29 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69 74 20  B);.  p->iLimit 
14ec0 3d 20 73 61 76 65 64 4c 69 6d 69 74 3b 0a 20 20  = savedLimit;.  
14ed0 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 73 61 76  p->iOffset = sav
14ee0 65 64 4f 66 66 73 65 74 3b 0a 20 20 73 71 6c 69  edOffset;.  sqli
14ef0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
14f00 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20   OP_Integer, 1, 
14f10 72 65 67 45 6f 66 42 29 3b 0a 20 20 73 71 6c 69  regEofB);.  sqli
14f20 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
14f30 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64   OP_Yield, regAd
14f40 64 72 42 29 3b 0a 20 20 56 64 62 65 4e 6f 6f 70  drB);.  VdbeNoop
14f50 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 45 6e 64  Comment((v, "End
14f60 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20 72   coroutine for r
14f70 69 67 68 74 20 53 45 4c 45 43 54 22 29 29 3b 0a  ight SELECT"));.
14f80 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61  .  /* Generate a
14f90 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74   subroutine that
14fa0 20 6f 75 74 70 75 74 73 20 74 68 65 20 63 75 72   outputs the cur
14fb0 72 65 6e 74 20 72 6f 77 20 6f 66 20 74 68 65 20  rent row of the 
14fc0 41 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20 61 73  A.  ** select as
14fd0 20 74 68 65 20 6e 65 78 74 20 6f 75 74 70 75 74   the next output
14fe0 20 72 6f 77 20 6f 66 20 74 68 65 20 63 6f 6d 70   row of the comp
14ff0 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a  ound select..  *
15000 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d  /.  VdbeNoopComm
15010 65 6e 74 28 28 76 2c 20 22 4f 75 74 70 75 74 20  ent((v, "Output 
15020 72 6f 75 74 69 6e 65 20 66 6f 72 20 41 22 29 29  routine for A"))
15030 3b 0a 20 20 61 64 64 72 4f 75 74 41 20 3d 20 67  ;.  addrOutA = g
15040 65 6e 65 72 61 74 65 4f 75 74 70 75 74 53 75 62  enerateOutputSub
15050 72 6f 75 74 69 6e 65 28 70 50 61 72 73 65 2c 0a  routine(pParse,.
15060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15070 20 70 2c 20 26 64 65 73 74 41 2c 20 70 44 65 73   p, &destA, pDes
15080 74 2c 20 72 65 67 4f 75 74 41 2c 0a 20 20 20 20  t, regOutA,.    
15090 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 67               reg
150a0 50 72 65 76 2c 20 70 4b 65 79 44 75 70 2c 20 50  Prev, pKeyDup, P
150b0 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46  4_KEYINFO_HANDOF
150c0 46 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20  F, labelEnd);.  
150d0 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61  .  /* Generate a
150e0 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74   subroutine that
150f0 20 6f 75 74 70 75 74 73 20 74 68 65 20 63 75 72   outputs the cur
15100 72 65 6e 74 20 72 6f 77 20 6f 66 20 74 68 65 20  rent row of the 
15110 42 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20 61 73  B.  ** select as
15120 20 74 68 65 20 6e 65 78 74 20 6f 75 74 70 75 74   the next output
15130 20 72 6f 77 20 6f 66 20 74 68 65 20 63 6f 6d 70   row of the comp
15140 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a  ound select..  *
15150 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41  /.  if( op==TK_A
15160 4c 4c 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 4e 49  LL || op==TK_UNI
15170 4f 4e 20 29 7b 0a 20 20 20 20 56 64 62 65 4e 6f  ON ){.    VdbeNo
15180 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f  opComment((v, "O
15190 75 74 70 75 74 20 72 6f 75 74 69 6e 65 20 66 6f  utput routine fo
151a0 72 20 42 22 29 29 3b 0a 20 20 20 20 61 64 64 72  r B"));.    addr
151b0 4f 75 74 42 20 3d 20 67 65 6e 65 72 61 74 65 4f  OutB = generateO
151c0 75 74 70 75 74 53 75 62 72 6f 75 74 69 6e 65 28  utputSubroutine(
151d0 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20  pParse,.        
151e0 20 20 20 20 20 20 20 20 20 70 2c 20 26 64 65 73           p, &des
151f0 74 42 2c 20 70 44 65 73 74 2c 20 72 65 67 4f 75  tB, pDest, regOu
15200 74 42 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  tB,.            
15210 20 20 20 20 20 72 65 67 50 72 65 76 2c 20 70 4b       regPrev, pK
15220 65 79 44 75 70 2c 20 50 34 5f 4b 45 59 49 4e 46  eyDup, P4_KEYINF
15230 4f 5f 53 54 41 54 49 43 2c 20 6c 61 62 65 6c 45  O_STATIC, labelE
15240 6e 64 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47  nd);.  }..  /* G
15250 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75  enerate a subrou
15260 74 69 6e 65 20 74 6f 20 72 75 6e 20 77 68 65 6e  tine to run when
15270 20 74 68 65 20 72 65 73 75 6c 74 73 20 66 72 6f   the results fro
15280 6d 20 73 65 6c 65 63 74 20 41 0a 20 20 2a 2a 20  m select A.  ** 
15290 61 72 65 20 65 78 68 61 75 73 74 65 64 20 61 6e  are exhausted an
152a0 64 20 6f 6e 6c 79 20 64 61 74 61 20 69 6e 20 73  d only data in s
152b0 65 6c 65 63 74 20 42 20 72 65 6d 61 69 6e 73 2e  elect B remains.
152c0 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70  .  */.  VdbeNoop
152d0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6f 66  Comment((v, "eof
152e0 2d 41 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29  -A subroutine"))
152f0 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 45  ;.  if( op==TK_E
15300 58 43 45 50 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f  XCEPT || op==TK_
15310 49 4e 54 45 52 53 45 43 54 20 29 7b 0a 20 20 20  INTERSECT ){.   
15320 20 61 64 64 72 45 6f 66 41 20 3d 20 73 71 6c 69   addrEofA = sqli
15330 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
15340 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c 61 62   OP_Goto, 0, lab
15350 65 6c 45 6e 64 29 3b 0a 20 20 7d 65 6c 73 65 7b  elEnd);.  }else{
15360 20 20 0a 20 20 20 20 61 64 64 72 45 6f 66 41 20    .    addrEofA 
15370 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
15380 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65  Op2(v, OP_If, re
15390 67 45 6f 66 42 2c 20 6c 61 62 65 6c 45 6e 64 29  gEofB, labelEnd)
153a0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
153b0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
153c0 73 75 62 2c 20 72 65 67 4f 75 74 42 2c 20 61 64  sub, regOutB, ad
153d0 64 72 4f 75 74 42 29 3b 0a 20 20 20 20 73 71 6c  drOutB);.    sql
153e0 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
153f0 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41  , OP_Yield, regA
15400 64 64 72 42 29 3b 0a 20 20 20 20 73 71 6c 69 74  ddrB);.    sqlit
15410 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
15420 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72  OP_Goto, 0, addr
15430 45 6f 66 41 29 3b 0a 20 20 20 20 70 2d 3e 6e 53  EofA);.    p->nS
15440 65 6c 65 63 74 52 6f 77 20 2b 3d 20 70 50 72 69  electRow += pPri
15450 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a  or->nSelectRow;.
15460 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61    }..  /* Genera
15470 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  te a subroutine 
15480 74 6f 20 72 75 6e 20 77 68 65 6e 20 74 68 65 20  to run when the 
15490 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 73 65 6c  results from sel
154a0 65 63 74 20 42 0a 20 20 2a 2a 20 61 72 65 20 65  ect B.  ** are e
154b0 78 68 61 75 73 74 65 64 20 61 6e 64 20 6f 6e 6c  xhausted and onl
154c0 79 20 64 61 74 61 20 69 6e 20 73 65 6c 65 63 74  y data in select
154d0 20 41 20 72 65 6d 61 69 6e 73 2e 0a 20 20 2a 2f   A remains..  */
154e0 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e  .  if( op==TK_IN
154f0 54 45 52 53 45 43 54 20 29 7b 0a 20 20 20 20 61  TERSECT ){.    a
15500 64 64 72 45 6f 66 42 20 3d 20 61 64 64 72 45 6f  ddrEofB = addrEo
15510 66 41 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e  fA;.    if( p->n
15520 53 65 6c 65 63 74 52 6f 77 20 3e 20 70 50 72 69  SelectRow > pPri
15530 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 29  or->nSelectRow )
15540 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d   p->nSelectRow =
15550 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74   pPrior->nSelect
15560 52 6f 77 3b 0a 20 20 7d 65 6c 73 65 7b 20 20 0a  Row;.  }else{  .
15570 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d      VdbeNoopComm
15580 65 6e 74 28 28 76 2c 20 22 65 6f 66 2d 42 20 73  ent((v, "eof-B s
15590 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20  ubroutine"));.  
155a0 20 20 61 64 64 72 45 6f 66 42 20 3d 20 73 71 6c    addrEofB = sql
155b0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
155c0 2c 20 4f 50 5f 49 66 2c 20 72 65 67 45 6f 66 41  , OP_If, regEofA
155d0 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 20  , labelEnd);.   
155e0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
155f0 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
15600 72 65 67 4f 75 74 41 2c 20 61 64 64 72 4f 75 74  regOutA, addrOut
15610 41 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  A);.    sqlite3V
15620 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
15630 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41 29  Yield, regAddrA)
15640 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
15650 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
15660 74 6f 2c 20 30 2c 20 61 64 64 72 45 6f 66 42 29  to, 0, addrEofB)
15670 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65  ;.  }..  /* Gene
15680 72 61 74 65 20 63 6f 64 65 20 74 6f 20 68 61 6e  rate code to han
15690 64 6c 65 20 74 68 65 20 63 61 73 65 20 6f 66 20  dle the case of 
156a0 41 3c 42 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e  A<B.  */.  VdbeN
156b0 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  oopComment((v, "
156c0 41 2d 6c 74 2d 42 20 73 75 62 72 6f 75 74 69 6e  A-lt-B subroutin
156d0 65 22 29 29 3b 0a 20 20 61 64 64 72 41 6c 74 42  e"));.  addrAltB
156e0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
156f0 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
15700 2c 20 72 65 67 4f 75 74 41 2c 20 61 64 64 72 4f  , regOutA, addrO
15710 75 74 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  utA);.  sqlite3V
15720 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
15730 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41 29  Yield, regAddrA)
15740 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
15750 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20  ddOp2(v, OP_If, 
15760 72 65 67 45 6f 66 41 2c 20 61 64 64 72 45 6f 66  regEofA, addrEof
15770 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  A);.  sqlite3Vdb
15780 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
15790 74 6f 2c 20 30 2c 20 6c 61 62 65 6c 43 6d 70 72  to, 0, labelCmpr
157a0 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  );..  /* Generat
157b0 65 20 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c 65  e code to handle
157c0 20 74 68 65 20 63 61 73 65 20 6f 66 20 41 3d 3d   the case of A==
157d0 42 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d  B.  */.  if( op=
157e0 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 61  =TK_ALL ){.    a
157f0 64 64 72 41 65 71 42 20 3d 20 61 64 64 72 41 6c  ddrAeqB = addrAl
15800 74 42 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  tB;.  }else if( 
15810 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54  op==TK_INTERSECT
15820 20 29 7b 0a 20 20 20 20 61 64 64 72 41 65 71 42   ){.    addrAeqB
15830 20 3d 20 61 64 64 72 41 6c 74 42 3b 0a 20 20 20   = addrAltB;.   
15840 20 61 64 64 72 41 6c 74 42 2b 2b 3b 0a 20 20 7d   addrAltB++;.  }
15850 65 6c 73 65 7b 0a 20 20 20 20 56 64 62 65 4e 6f  else{.    VdbeNo
15860 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 41  opComment((v, "A
15870 2d 65 71 2d 42 20 73 75 62 72 6f 75 74 69 6e 65  -eq-B subroutine
15880 22 29 29 3b 0a 20 20 20 20 61 64 64 72 41 65 71  "));.    addrAeq
15890 42 20 3d 0a 20 20 20 20 73 71 6c 69 74 65 33 56  B =.    sqlite3V
158a0 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
158b0 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41 29  Yield, regAddrA)
158c0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
158d0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66  eAddOp2(v, OP_If
158e0 2c 20 72 65 67 45 6f 66 41 2c 20 61 64 64 72 45  , regEofA, addrE
158f0 6f 66 41 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ofA);.    sqlite
15900 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
15910 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c 61 62 65 6c  P_Goto, 0, label
15920 43 6d 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Cmpr);.  }..  /*
15930 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
15940 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 63 61 73  o handle the cas
15950 65 20 6f 66 20 41 3e 42 0a 20 20 2a 2f 0a 20 20  e of A>B.  */.  
15960 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28  VdbeNoopComment(
15970 28 76 2c 20 22 41 2d 67 74 2d 42 20 73 75 62 72  (v, "A-gt-B subr
15980 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 61 64 64  outine"));.  add
15990 72 41 67 74 42 20 3d 20 73 71 6c 69 74 65 33 56  rAgtB = sqlite3V
159a0 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
159b0 29 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  );.  if( op==TK_
159c0 41 4c 4c 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 4e  ALL || op==TK_UN
159d0 49 4f 4e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ION ){.    sqlit
159e0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
159f0 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74  OP_Gosub, regOut
15a00 42 2c 20 61 64 64 72 4f 75 74 42 29 3b 0a 20 20  B, addrOutB);.  
15a10 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  }.  sqlite3VdbeA
15a20 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c  ddOp1(v, OP_Yiel
15a30 64 2c 20 72 65 67 41 64 64 72 42 29 3b 0a 20 20  d, regAddrB);.  
15a40 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15a50 32 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 45  2(v, OP_If, regE
15a60 6f 66 42 2c 20 61 64 64 72 45 6f 66 42 29 3b 0a  ofB, addrEofB);.
15a70 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15a80 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
15a90 30 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 0a  0, labelCmpr);..
15aa0 20 20 2f 2a 20 54 68 69 73 20 63 6f 64 65 20 72    /* This code r
15ab0 75 6e 73 20 6f 6e 63 65 20 74 6f 20 69 6e 69 74  uns once to init
15ac0 69 61 6c 69 7a 65 20 65 76 65 72 79 74 68 69 6e  ialize everythin
15ad0 67 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  g..  */.  sqlite
15ae0 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
15af0 20 6a 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56   j1);.  sqlite3V
15b00 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
15b10 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67 45  Integer, 0, regE
15b20 6f 66 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ofA);.  sqlite3V
15b30 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
15b40 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67 45  Integer, 0, regE
15b50 6f 66 42 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ofB);.  sqlite3V
15b60 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
15b70 47 6f 73 75 62 2c 20 72 65 67 41 64 64 72 41 2c  Gosub, regAddrA,
15b80 20 61 64 64 72 53 65 6c 65 63 74 41 29 3b 0a 20   addrSelectA);. 
15b90 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15ba0 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
15bb0 72 65 67 41 64 64 72 42 2c 20 61 64 64 72 53 65  regAddrB, addrSe
15bc0 6c 65 63 74 42 29 3b 0a 20 20 73 71 6c 69 74 65  lectB);.  sqlite
15bd0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
15be0 50 5f 49 66 2c 20 72 65 67 45 6f 66 41 2c 20 61  P_If, regEofA, a
15bf0 64 64 72 45 6f 66 41 29 3b 0a 20 20 73 71 6c 69  ddrEofA);.  sqli
15c00 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
15c10 20 4f 50 5f 49 66 2c 20 72 65 67 45 6f 66 42 2c   OP_If, regEofB,
15c20 20 61 64 64 72 45 6f 66 42 29 3b 0a 0a 20 20 2f   addrEofB);..  /
15c30 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  * Implement the 
15c40 6d 61 69 6e 20 6d 65 72 67 65 20 6c 6f 6f 70 0a  main merge loop.
15c50 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64    */.  sqlite3Vd
15c60 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
15c70 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 20 20  , labelCmpr);.  
15c80 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15c90 34 28 76 2c 20 4f 50 5f 50 65 72 6d 75 74 61 74  4(v, OP_Permutat
15ca0 69 6f 6e 2c 20 30 2c 20 30 2c 20 30 2c 20 28 63  ion, 0, 0, 0, (c
15cb0 68 61 72 2a 29 61 50 65 72 6d 75 74 65 2c 20 50  har*)aPermute, P
15cc0 34 5f 49 4e 54 41 52 52 41 59 29 3b 0a 20 20 73  4_INTARRAY);.  s
15cd0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
15ce0 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20  (v, OP_Compare, 
15cf0 64 65 73 74 41 2e 69 53 64 73 74 2c 20 64 65 73  destA.iSdst, des
15d00 74 42 2e 69 53 64 73 74 2c 20 6e 4f 72 64 65 72  tB.iSdst, nOrder
15d10 42 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  By,.            
15d20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
15d30 61 72 2a 29 70 4b 65 79 4d 65 72 67 65 2c 20 50  ar*)pKeyMerge, P
15d40 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46  4_KEYINFO_HANDOF
15d50 46 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  F);.  sqlite3Vdb
15d60 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75  eAddOp3(v, OP_Ju
15d70 6d 70 2c 20 61 64 64 72 41 6c 74 42 2c 20 61 64  mp, addrAltB, ad
15d80 64 72 41 65 71 42 2c 20 61 64 64 72 41 67 74 42  drAeqB, addrAgtB
15d90 29 3b 0a 0a 20 20 2f 2a 20 52 65 6c 65 61 73 65  );..  /* Release
15da0 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73   temporary regis
15db0 74 65 72 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ters.  */.  if( 
15dc0 72 65 67 50 72 65 76 20 29 7b 0a 20 20 20 20 73  regPrev ){.    s
15dd0 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
15de0 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72  pRange(pParse, r
15df0 65 67 50 72 65 76 2c 20 6e 4f 72 64 65 72 42 79  egPrev, nOrderBy
15e00 2b 31 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a  +1);.  }..  /* J
15e10 75 6d 70 20 74 6f 20 74 68 65 20 74 68 69 73 20  ump to the this 
15e20 70 6f 69 6e 74 20 69 6e 20 6f 72 64 65 72 20 74  point in order t
15e30 6f 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20  o terminate the 
15e40 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 73 71  query..  */.  sq
15e50 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
15e60 4c 61 62 65 6c 28 76 2c 20 6c 61 62 65 6c 45 6e  Label(v, labelEn
15e70 64 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68  d);..  /* Set th
15e80 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70  e number of outp
15e90 75 74 20 63 6f 6c 75 6d 6e 73 0a 20 20 2a 2f 0a  ut columns.  */.
15ea0 20 20 69 66 28 20 70 44 65 73 74 2d 3e 65 44 65    if( pDest->eDe
15eb0 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29  st==SRT_Output )
15ec0 7b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 46  {.    Select *pF
15ed0 69 72 73 74 20 3d 20 70 50 72 69 6f 72 3b 0a 20  irst = pPrior;. 
15ee0 20 20 20 77 68 69 6c 65 28 20 70 46 69 72 73 74     while( pFirst
15ef0 2d 3e 70 50 72 69 6f 72 20 29 20 70 46 69 72 73  ->pPrior ) pFirs
15f00 74 20 3d 20 70 46 69 72 73 74 2d 3e 70 50 72 69  t = pFirst->pPri
15f10 6f 72 3b 0a 20 20 20 20 67 65 6e 65 72 61 74 65  or;.    generate
15f20 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72  ColumnNames(pPar
15f30 73 65 2c 20 30 2c 20 70 46 69 72 73 74 2d 3e 70  se, 0, pFirst->p
15f40 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f  EList);.  }..  /
15f50 2a 20 52 65 61 73 73 65 6d 62 6c 79 20 74 68 65  * Reassembly the
15f60 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 20   compound query 
15f70 73 6f 20 74 68 61 74 20 69 74 20 77 69 6c 6c 20  so that it will 
15f80 62 65 20 66 72 65 65 64 20 63 6f 72 72 65 63 74  be freed correct
15f90 6c 79 0a 20 20 2a 2a 20 62 79 20 74 68 65 20 63  ly.  ** by the c
15fa0 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20  alling function 
15fb0 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69  */.  if( p->pPri
15fc0 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  or ){.    sqlite
15fd0 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
15fe0 2c 20 70 2d 3e 70 50 72 69 6f 72 29 3b 0a 20 20  , p->pPrior);.  
15ff0 7d 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20  }.  p->pPrior = 
16000 70 50 72 69 6f 72 3b 0a 0a 20 20 2f 2a 2a 2a 20  pPrior;..  /*** 
16010 54 42 44 3a 20 20 49 6e 73 65 72 74 20 73 75 62  TBD:  Insert sub
16020 72 6f 75 74 69 6e 65 20 63 61 6c 6c 73 20 74 6f  routine calls to
16030 20 63 6c 6f 73 65 20 63 75 72 73 6f 72 73 20 6f   close cursors o
16040 6e 20 69 6e 63 6f 6d 70 6c 65 74 65 0a 20 20 2a  n incomplete.  *
16050 2a 2a 2a 20 73 75 62 71 75 65 72 69 65 73 20 2a  *** subqueries *
16060 2a 2a 2a 2f 0a 20 20 65 78 70 6c 61 69 6e 43 6f  ***/.  explainCo
16070 6d 70 6f 73 69 74 65 28 70 50 61 72 73 65 2c 20  mposite(pParse, 
16080 70 2d 3e 6f 70 2c 20 69 53 75 62 31 2c 20 69 53  p->op, iSub1, iS
16090 75 62 32 2c 20 30 29 3b 0a 20 20 72 65 74 75 72  ub2, 0);.  retur
160a0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
160b0 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69  endif..#if !defi
160c0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
160d0 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65  SUBQUERY) || !de
160e0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
160f0 54 5f 56 49 45 57 29 0a 2f 2a 20 46 6f 72 77 61  T_VIEW)./* Forwa
16100 72 64 20 44 65 63 6c 61 72 61 74 69 6f 6e 73 20  rd Declarations 
16110 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
16120 75 62 73 74 45 78 70 72 4c 69 73 74 28 73 71 6c  ubstExprList(sql
16130 69 74 65 33 2a 2c 20 45 78 70 72 4c 69 73 74 2a  ite3*, ExprList*
16140 2c 20 69 6e 74 2c 20 45 78 70 72 4c 69 73 74 2a  , int, ExprList*
16150 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  );.static void s
16160 75 62 73 74 53 65 6c 65 63 74 28 73 71 6c 69 74  ubstSelect(sqlit
16170 65 33 2a 2c 20 53 65 6c 65 63 74 20 2a 2c 20 69  e3*, Select *, i
16180 6e 74 2c 20 45 78 70 72 4c 69 73 74 20 2a 29 3b  nt, ExprList *);
16190 0a 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74 68 72  ../*.** Scan thr
161a0 6f 75 67 68 20 74 68 65 20 65 78 70 72 65 73 73  ough the express
161b0 69 6f 6e 20 70 45 78 70 72 2e 20 20 52 65 70 6c  ion pExpr.  Repl
161c0 61 63 65 20 65 76 65 72 79 20 72 65 66 65 72 65  ace every refere
161d0 6e 63 65 20 74 6f 0a 2a 2a 20 61 20 63 6f 6c 75  nce to.** a colu
161e0 6d 6e 20 69 6e 20 74 61 62 6c 65 20 6e 75 6d 62  mn in table numb
161f0 65 72 20 69 54 61 62 6c 65 20 77 69 74 68 20 61  er iTable with a
16200 20 63 6f 70 79 20 6f 66 20 74 68 65 20 69 43 6f   copy of the iCo
16210 6c 75 6d 6e 2d 74 68 0a 2a 2a 20 65 6e 74 72 79  lumn-th.** entry
16220 20 69 6e 20 70 45 4c 69 73 74 2e 20 20 28 42 75   in pEList.  (Bu
16230 74 20 6c 65 61 76 65 20 72 65 66 65 72 65 6e 63  t leave referenc
16240 65 73 20 74 6f 20 74 68 65 20 52 4f 57 49 44 20  es to the ROWID 
16250 63 6f 6c 75 6d 6e 20 0a 2a 2a 20 75 6e 63 68 61  column .** uncha
16260 6e 67 65 64 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 69  nged.).**.** Thi
16270 73 20 72 6f 75 74 69 6e 65 20 69 73 20 70 61 72  s routine is par
16280 74 20 6f 66 20 74 68 65 20 66 6c 61 74 74 65 6e  t of the flatten
16290 69 6e 67 20 70 72 6f 63 65 64 75 72 65 2e 20 20  ing procedure.  
162a0 41 20 73 75 62 71 75 65 72 79 0a 2a 2a 20 77 68  A subquery.** wh
162b0 6f 73 65 20 72 65 73 75 6c 74 20 73 65 74 20 69  ose result set i
162c0 73 20 64 65 66 69 6e 65 64 20 62 79 20 70 45 4c  s defined by pEL
162d0 69 73 74 20 61 70 70 65 61 72 73 20 61 73 20 65  ist appears as e
162e0 6e 74 72 79 20 69 6e 20 74 68 65 0a 2a 2a 20 46  ntry in the.** F
162f0 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20  ROM clause of a 
16300 53 45 4c 45 43 54 20 73 75 63 68 20 74 68 61 74  SELECT such that
16310 20 74 68 65 20 56 44 42 45 20 63 75 72 73 6f 72   the VDBE cursor
16320 20 61 73 73 69 67 6e 65 64 20 74 6f 20 74 68 61   assigned to tha
16330 74 0a 2a 2a 20 46 4f 52 4d 20 63 6c 61 75 73 65  t.** FORM clause
16340 20 65 6e 74 72 79 20 69 73 20 69 54 61 62 6c 65   entry is iTable
16350 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
16360 6d 61 6b 65 20 74 68 65 20 6e 65 63 65 73 73 61  make the necessa
16370 72 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74  ry .** changes t
16380 6f 20 70 45 78 70 72 20 73 6f 20 74 68 61 74 20  o pExpr so that 
16390 69 74 20 72 65 66 65 72 73 20 64 69 72 65 63 74  it refers direct
163a0 6c 79 20 74 6f 20 74 68 65 20 73 6f 75 72 63 65  ly to the source
163b0 20 74 61 62 6c 65 0a 2a 2a 20 6f 66 20 74 68 65   table.** of the
163c0 20 73 75 62 71 75 65 72 79 20 72 61 74 68 65 72   subquery rather
163d0 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
163e0 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79 2e  of the subquery.
163f0 0a 2a 2f 0a 73 74 61 74 69 63 20 45 78 70 72 20  .*/.static Expr 
16400 2a 73 75 62 73 74 45 78 70 72 28 0a 20 20 73 71  *substExpr(.  sq
16410 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
16420 20 20 2f 2a 20 52 65 70 6f 72 74 20 6d 61 6c 6c    /* Report mall
16430 6f 63 20 65 72 72 6f 72 73 20 74 6f 20 74 68 69  oc errors to thi
16440 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  s connection */.
16450 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20    Expr *pExpr,  
16460 20 20 20 20 20 20 2f 2a 20 45 78 70 72 20 69 6e        /* Expr in
16470 20 77 68 69 63 68 20 73 75 62 73 74 69 74 75 74   which substitut
16480 69 6f 6e 20 6f 63 63 75 72 73 20 2a 2f 0a 20 20  ion occurs */.  
16490 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20  int iTable,     
164a0 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20      /* Table to 
164b0 62 65 20 73 75 62 73 74 69 74 75 74 65 64 20 2a  be substituted *
164c0 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  /.  ExprList *pE
164d0 4c 69 73 74 20 20 20 20 2f 2a 20 53 75 62 73 74  List    /* Subst
164e0 69 74 75 74 65 20 65 78 70 72 65 73 73 69 6f 6e  itute expression
164f0 73 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 45  s */.){.  if( pE
16500 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  xpr==0 ) return 
16510 30 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  0;.  if( pExpr->
16520 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26  op==TK_COLUMN &&
16530 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d   pExpr->iTable==
16540 69 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 69 66  iTable ){.    if
16550 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ( pExpr->iColumn
16560 3c 30 20 29 7b 0a 20 20 20 20 20 20 70 45 78 70  <0 ){.      pExp
16570 72 2d 3e 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b  r->op = TK_NULL;
16580 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
16590 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20    Expr *pNew;.  
165a0 20 20 20 20 61 73 73 65 72 74 28 20 70 45 4c 69      assert( pELi
165b0 73 74 21 3d 30 20 26 26 20 70 45 78 70 72 2d 3e  st!=0 && pExpr->
165c0 69 43 6f 6c 75 6d 6e 3c 70 45 4c 69 73 74 2d 3e  iColumn<pEList->
165d0 6e 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20 61  nExpr );.      a
165e0 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c  ssert( pExpr->pL
165f0 65 66 74 3d 3d 30 20 26 26 20 70 45 78 70 72 2d  eft==0 && pExpr-
16600 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20  >pRight==0 );.  
16610 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74      pNew = sqlit
16620 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 45  e3ExprDup(db, pE
16630 4c 69 73 74 2d 3e 61 5b 70 45 78 70 72 2d 3e 69  List->a[pExpr->i
16640 43 6f 6c 75 6d 6e 5d 2e 70 45 78 70 72 2c 20 30  Column].pExpr, 0
16650 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65  );.      if( pNe
16660 77 20 26 26 20 70 45 78 70 72 2d 3e 70 43 6f 6c  w && pExpr->pCol
16670 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65  l ){.        pNe
16680 77 2d 3e 70 43 6f 6c 6c 20 3d 20 70 45 78 70 72  w->pColl = pExpr
16690 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d  ->pColl;.      }
166a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
166b0 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 45 78  prDelete(db, pEx
166c0 70 72 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72  pr);.      pExpr
166d0 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 7d 0a 20   = pNew;.    }. 
166e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 45 78 70   }else{.    pExp
166f0 72 2d 3e 70 4c 65 66 74 20 3d 20 73 75 62 73 74  r->pLeft = subst
16700 45 78 70 72 28 64 62 2c 20 70 45 78 70 72 2d 3e  Expr(db, pExpr->
16710 70 4c 65 66 74 2c 20 69 54 61 62 6c 65 2c 20 70  pLeft, iTable, p
16720 45 4c 69 73 74 29 3b 0a 20 20 20 20 70 45 78 70  EList);.    pExp
16730 72 2d 3e 70 52 69 67 68 74 20 3d 20 73 75 62 73  r->pRight = subs
16740 74 45 78 70 72 28 64 62 2c 20 70 45 78 70 72 2d  tExpr(db, pExpr-
16750 3e 70 52 69 67 68 74 2c 20 69 54 61 62 6c 65 2c  >pRight, iTable,
16760 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 69 66   pEList);.    if
16770 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
16780 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
16790 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20  elect) ){.      
167a0 73 75 62 73 74 53 65 6c 65 63 74 28 64 62 2c 20  substSelect(db, 
167b0 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74  pExpr->x.pSelect
167c0 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
167d0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
167e0 20 20 20 20 73 75 62 73 74 45 78 70 72 4c 69 73      substExprLis
167f0 74 28 64 62 2c 20 70 45 78 70 72 2d 3e 78 2e 70  t(db, pExpr->x.p
16800 4c 69 73 74 2c 20 69 54 61 62 6c 65 2c 20 70 45  List, iTable, pE
16810 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  List);.    }.  }
16820 0a 20 20 72 65 74 75 72 6e 20 70 45 78 70 72 3b  .  return pExpr;
16830 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  .}.static void s
16840 75 62 73 74 45 78 70 72 4c 69 73 74 28 0a 20 20  ubstExprList(.  
16850 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
16860 20 20 20 20 20 2f 2a 20 52 65 70 6f 72 74 20 6d       /* Report m
16870 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20 68 65 72  alloc errors her
16880 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  e */.  ExprList 
16890 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 4c  *pList,     /* L
168a0 69 73 74 20 74 6f 20 73 63 61 6e 20 61 6e 64 20  ist to scan and 
168b0 69 6e 20 77 68 69 63 68 20 74 6f 20 6d 61 6b 65  in which to make
168c0 20 73 75 62 73 74 69 74 75 74 65 73 20 2a 2f 0a   substitutes */.
168d0 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20    int iTable,   
168e0 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20         /* Table 
168f0 74 6f 20 62 65 20 73 75 62 73 74 69 74 75 74 65  to be substitute
16900 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  d */.  ExprList 
16910 2a 70 45 4c 69 73 74 20 20 20 20 20 2f 2a 20 53  *pEList     /* S
16920 75 62 73 74 69 74 75 74 65 20 76 61 6c 75 65 73  ubstitute values
16930 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   */.){.  int i;.
16940 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
16950 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69   return;.  for(i
16960 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  =0; i<pList->nEx
16970 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 4c  pr; i++){.    pL
16980 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 20  ist->a[i].pExpr 
16990 3d 20 73 75 62 73 74 45 78 70 72 28 64 62 2c 20  = substExpr(db, 
169a0 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
169b0 72 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  r, iTable, pELis
169c0 74 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63  t);.  }.}.static
169d0 20 76 6f 69 64 20 73 75 62 73 74 53 65 6c 65 63   void substSelec
169e0 74 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  t(.  sqlite3 *db
169f0 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 70  ,         /* Rep
16a00 6f 72 74 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72  ort malloc error
16a10 73 20 68 65 72 65 20 2a 2f 0a 20 20 53 65 6c 65  s here */.  Sele
16a20 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
16a30 20 2f 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65   /* SELECT state
16a40 6d 65 6e 74 20 69 6e 20 77 68 69 63 68 20 74 6f  ment in which to
16a50 20 6d 61 6b 65 20 73 75 62 73 74 69 74 75 74 69   make substituti
16a60 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  ons */.  int iTa
16a70 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  ble,          /*
16a80 20 54 61 62 6c 65 20 74 6f 20 62 65 20 72 65 70   Table to be rep
16a90 6c 61 63 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c  laced */.  ExprL
16aa0 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20 20  ist *pEList     
16ab0 2f 2a 20 53 75 62 73 74 69 74 75 74 65 20 76 61  /* Substitute va
16ac0 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20 20 53 72 63  lues */.){.  Src
16ad0 4c 69 73 74 20 2a 70 53 72 63 3b 0a 20 20 73 74  List *pSrc;.  st
16ae0 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
16af0 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20  m *pItem;.  int 
16b00 69 3b 0a 20 20 69 66 28 20 21 70 20 29 20 72 65  i;.  if( !p ) re
16b10 74 75 72 6e 3b 0a 20 20 73 75 62 73 74 45 78 70  turn;.  substExp
16b20 72 4c 69 73 74 28 64 62 2c 20 70 2d 3e 70 45 4c  rList(db, p->pEL
16b30 69 73 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c  ist, iTable, pEL
16b40 69 73 74 29 3b 0a 20 20 73 75 62 73 74 45 78 70  ist);.  substExp
16b50 72 4c 69 73 74 28 64 62 2c 20 70 2d 3e 70 47 72  rList(db, p->pGr
16b60 6f 75 70 42 79 2c 20 69 54 61 62 6c 65 2c 20 70  oupBy, iTable, p
16b70 45 4c 69 73 74 29 3b 0a 20 20 73 75 62 73 74 45  EList);.  substE
16b80 78 70 72 4c 69 73 74 28 64 62 2c 20 70 2d 3e 70  xprList(db, p->p
16b90 4f 72 64 65 72 42 79 2c 20 69 54 61 62 6c 65 2c  OrderBy, iTable,
16ba0 20 70 45 4c 69 73 74 29 3b 0a 20 20 70 2d 3e 70   pEList);.  p->p
16bb0 48 61 76 69 6e 67 20 3d 20 73 75 62 73 74 45 78  Having = substEx
16bc0 70 72 28 64 62 2c 20 70 2d 3e 70 48 61 76 69 6e  pr(db, p->pHavin
16bd0 67 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  g, iTable, pELis
16be0 74 29 3b 0a 20 20 70 2d 3e 70 57 68 65 72 65 20  t);.  p->pWhere 
16bf0 3d 20 73 75 62 73 74 45 78 70 72 28 64 62 2c 20  = substExpr(db, 
16c00 70 2d 3e 70 57 68 65 72 65 2c 20 69 54 61 62 6c  p->pWhere, iTabl
16c10 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 73 75  e, pEList);.  su
16c20 62 73 74 53 65 6c 65 63 74 28 64 62 2c 20 70 2d  bstSelect(db, p-
16c30 3e 70 50 72 69 6f 72 2c 20 69 54 61 62 6c 65 2c  >pPrior, iTable,
16c40 20 70 45 4c 69 73 74 29 3b 0a 20 20 70 53 72 63   pEList);.  pSrc
16c50 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73   = p->pSrc;.  as
16c60 73 65 72 74 28 20 70 53 72 63 20 29 3b 20 20 2f  sert( pSrc );  /
16c70 2a 20 45 76 65 6e 20 66 6f 72 20 28 53 45 4c 45  * Even for (SELE
16c80 43 54 20 31 29 20 77 65 20 68 61 76 65 3a 20 70  CT 1) we have: p
16c90 53 72 63 21 3d 30 20 62 75 74 20 70 53 72 63 2d  Src!=0 but pSrc-
16ca0 3e 6e 53 72 63 3d 3d 30 20 2a 2f 0a 20 20 69 66  >nSrc==0 */.  if
16cb0 28 20 41 4c 57 41 59 53 28 70 53 72 63 29 20 29  ( ALWAYS(pSrc) )
16cc0 7b 0a 20 20 20 20 66 6f 72 28 69 3d 70 53 72 63  {.    for(i=pSrc
16cd0 2d 3e 6e 53 72 63 2c 20 70 49 74 65 6d 3d 70 53  ->nSrc, pItem=pS
16ce0 72 63 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c  rc->a; i>0; i--,
16cf0 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
16d00 20 73 75 62 73 74 53 65 6c 65 63 74 28 64 62 2c   substSelect(db,
16d10 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2c   pItem->pSelect,
16d20 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
16d30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65  ;.    }.  }.}.#e
16d40 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
16d50 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42  (SQLITE_OMIT_SUB
16d60 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e  QUERY) || !defin
16d70 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
16d80 49 45 57 29 20 2a 2f 0a 0a 23 69 66 20 21 64 65  IEW) */..#if !de
16d90 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
16da0 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21  T_SUBQUERY) || !
16db0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
16dc0 4d 49 54 5f 56 49 45 57 29 0a 2f 2a 0a 2a 2a 20  MIT_VIEW)./*.** 
16dd0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74  This routine att
16de0 65 6d 70 74 73 20 74 6f 20 66 6c 61 74 74 65 6e  empts to flatten
16df0 20 73 75 62 71 75 65 72 69 65 73 20 61 73 20 61   subqueries as a
16e00 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f 70 74   performance opt
16e10 69 6d 69 7a 61 74 69 6f 6e 2e 0a 2a 2a 20 54 68  imization..** Th
16e20 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
16e30 6e 73 20 31 20 69 66 20 69 74 20 6d 61 6b 65 73  ns 1 if it makes
16e40 20 63 68 61 6e 67 65 73 20 61 6e 64 20 30 20 69   changes and 0 i
16e50 66 20 6e 6f 20 66 6c 61 74 74 65 6e 69 6e 67 20  f no flattening 
16e60 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f  occurs..**.** To
16e70 20 75 6e 64 65 72 73 74 61 6e 64 20 74 68 65 20   understand the 
16e80 63 6f 6e 63 65 70 74 20 6f 66 20 66 6c 61 74 74  concept of flatt
16e90 65 6e 69 6e 67 2c 20 63 6f 6e 73 69 64 65 72 20  ening, consider 
16ea0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a  the following.**
16eb0 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20   query:.**.**   
16ec0 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20    SELECT a FROM 
16ed0 28 53 45 4c 45 43 54 20 78 2b 79 20 41 53 20 61  (SELECT x+y AS a
16ee0 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 7a   FROM t1 WHERE z
16ef0 3c 31 30 30 29 20 57 48 45 52 45 20 61 3e 35 0a  <100) WHERE a>5.
16f00 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 66 61 75 6c  **.** The defaul
16f10 74 20 77 61 79 20 6f 66 20 69 6d 70 6c 65 6d 65  t way of impleme
16f20 6e 74 69 6e 67 20 74 68 69 73 20 71 75 65 72 79  nting this query
16f30 20 69 73 20 74 6f 20 65 78 65 63 75 74 65 20 74   is to execute t
16f40 68 65 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 66  he.** subquery f
16f50 69 72 73 74 20 61 6e 64 20 73 74 6f 72 65 20 74  irst and store t
16f60 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 61 20  he results in a 
16f70 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c  temporary table,
16f80 20 74 68 65 6e 0a 2a 2a 20 72 75 6e 20 74 68 65   then.** run the
16f90 20 6f 75 74 65 72 20 71 75 65 72 79 20 6f 6e 20   outer query on 
16fa0 74 68 61 74 20 74 65 6d 70 6f 72 61 72 79 20 74  that temporary t
16fb0 61 62 6c 65 2e 20 20 54 68 69 73 20 72 65 71 75  able.  This requ
16fc0 69 72 65 73 20 74 77 6f 0a 2a 2a 20 70 61 73 73  ires two.** pass
16fd0 65 73 20 6f 76 65 72 20 74 68 65 20 64 61 74 61  es over the data
16fe0 2e 20 20 46 75 72 74 68 65 72 6d 6f 72 65 2c 20  .  Furthermore, 
16ff0 62 65 63 61 75 73 65 20 74 68 65 20 74 65 6d 70  because the temp
17000 6f 72 61 72 79 20 74 61 62 6c 65 0a 2a 2a 20 68  orary table.** h
17010 61 73 20 6e 6f 20 69 6e 64 69 63 65 73 2c 20 74  as no indices, t
17020 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
17030 6f 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  on the outer que
17040 72 79 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20  ry cannot be.** 
17050 6f 70 74 69 6d 69 7a 65 64 2e 0a 2a 2a 0a 2a 2a  optimized..**.**
17060 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74   This routine at
17070 74 65 6d 70 74 73 20 74 6f 20 72 65 77 72 69 74  tempts to rewrit
17080 65 20 71 75 65 72 69 65 73 20 73 75 63 68 20 61  e queries such a
17090 73 20 74 68 65 20 61 62 6f 76 65 20 69 6e 74 6f  s the above into
170a0 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 66 6c 61  .** a single fla
170b0 74 20 73 65 6c 65 63 74 2c 20 6c 69 6b 65 20 74  t select, like t
170c0 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  his:.**.**     S
170d0 45 4c 45 43 54 20 78 2b 79 20 41 53 20 61 20 46  ELECT x+y AS a F
170e0 52 4f 4d 20 74 31 20 57 48 45 52 45 20 7a 3c 31  ROM t1 WHERE z<1
170f0 30 30 20 41 4e 44 20 61 3e 35 0a 2a 2a 0a 2a 2a  00 AND a>5.**.**
17100 20 54 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61   The code genera
17110 74 65 64 20 66 6f 72 20 74 68 69 73 20 73 69 6d  ted for this sim
17120 70 69 66 69 63 61 74 69 6f 6e 20 67 69 76 65 73  pification gives
17130 20 74 68 65 20 73 61 6d 65 20 72 65 73 75 6c 74   the same result
17140 0a 2a 2a 20 62 75 74 20 6f 6e 6c 79 20 68 61 73  .** but only has
17150 20 74 6f 20 73 63 61 6e 20 74 68 65 20 64 61 74   to scan the dat
17160 61 20 6f 6e 63 65 2e 20 20 41 6e 64 20 62 65 63  a once.  And bec
17170 61 75 73 65 20 69 6e 64 69 63 65 73 20 6d 69 67  ause indices mig
17180 68 74 20 0a 2a 2a 20 65 78 69 73 74 20 6f 6e 20  ht .** exist on 
17190 74 68 65 20 74 61 62 6c 65 20 74 31 2c 20 61 20  the table t1, a 
171a0 63 6f 6d 70 6c 65 74 65 20 73 63 61 6e 20 6f 66  complete scan of
171b0 20 74 68 65 20 64 61 74 61 20 6d 69 67 68 74 20   the data might 
171c0 62 65 0a 2a 2a 20 61 76 6f 69 64 65 64 2e 0a 2a  be.** avoided..*
171d0 2a 0a 2a 2a 20 46 6c 61 74 74 65 6e 69 6e 67 20  *.** Flattening 
171e0 69 73 20 6f 6e 6c 79 20 61 74 74 65 6d 70 74 65  is only attempte
171f0 64 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 20  d if all of the 
17200 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72  following are tr
17210 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20  ue:.**.**   (1) 
17220 20 54 68 65 20 73 75 62 71 75 65 72 79 20 61 6e   The subquery an
17230 64 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  d the outer quer
17240 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20 75 73  y do not both us
17250 65 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a  e aggregates..**
17260 0a 2a 2a 20 20 20 28 32 29 20 20 54 68 65 20 73  .**   (2)  The s
17270 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61  ubquery is not a
17280 6e 20 61 67 67 72 65 67 61 74 65 20 6f 72 20 74  n aggregate or t
17290 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69  he outer query i
172a0 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a  s not a join..**
172b0 0a 2a 2a 20 20 20 28 33 29 20 20 54 68 65 20 73  .**   (3)  The s
172c0 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 74  ubquery is not t
172d0 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64  he right operand
172e0 20 6f 66 20 61 20 6c 65 66 74 20 6f 75 74 65 72   of a left outer
172f0 20 6a 6f 69 6e 0a 2a 2a 20 20 20 20 20 20 20 20   join.**        
17300 28 4f 72 69 67 69 6e 61 6c 6c 79 20 74 69 63 6b  (Originally tick
17310 65 74 20 23 33 30 36 2e 20 20 53 74 72 65 6e 67  et #306.  Streng
17320 74 68 65 6e 65 64 20 62 79 20 74 69 63 6b 65 74  thened by ticket
17330 20 23 33 33 30 30 29 0a 2a 2a 0a 2a 2a 20 20 20   #3300).**.**   
17340 28 34 29 20 20 54 68 65 20 73 75 62 71 75 65 72  (4)  The subquer
17350 79 20 69 73 20 6e 6f 74 20 44 49 53 54 49 4e 43  y is not DISTINC
17360 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20  T..**.**  (**)  
17370 41 74 20 6f 6e 65 20 70 6f 69 6e 74 20 72 65 73  At one point res
17380 74 72 69 63 74 69 6f 6e 73 20 28 34 29 20 61 6e  trictions (4) an
17390 64 20 28 35 29 20 64 65 66 69 6e 65 64 20 61 20  d (5) defined a 
173a0 73 75 62 73 65 74 20 6f 66 20 44 49 53 54 49 4e  subset of DISTIN
173b0 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 73 75 62  CT.**        sub
173c0 2d 71 75 65 72 69 65 73 20 74 68 61 74 20 77 65  -queries that we
173d0 72 65 20 65 78 63 6c 75 64 65 64 20 66 72 6f 6d  re excluded from
173e0 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69   this optimizati
173f0 6f 6e 2e 20 52 65 73 74 72 69 63 74 69 6f 6e 20  on. Restriction 
17400 0a 2a 2a 20 20 20 20 20 20 20 20 28 34 29 20 68  .**        (4) h
17410 61 73 20 73 69 6e 63 65 20 62 65 65 6e 20 65 78  as since been ex
17420 70 61 6e 64 65 64 20 74 6f 20 65 78 63 6c 75 64  panded to exclud
17430 65 20 61 6c 6c 20 44 49 53 54 49 4e 43 54 20 73  e all DISTINCT s
17440 75 62 71 75 65 72 69 65 73 2e 0a 2a 2a 0a 2a 2a  ubqueries..**.**
17450 20 20 20 28 36 29 20 20 54 68 65 20 73 75 62 71     (6)  The subq
17460 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73  uery does not us
17470 65 20 61 67 67 72 65 67 61 74 65 73 20 6f 72 20  e aggregates or 
17480 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
17490 69 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20  is not.**       
174a0 20 44 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a   DISTINCT..**.**
174b0 20 20 20 28 37 29 20 20 54 68 65 20 73 75 62 71     (7)  The subq
174c0 75 65 72 79 20 68 61 73 20 61 20 46 52 4f 4d 20  uery has a FROM 
174d0 63 6c 61 75 73 65 2e 20 20 54 4f 44 4f 3a 20 20  clause.  TODO:  
174e0 46 6f 72 20 73 75 62 71 75 65 72 69 65 73 20 77  For subqueries w
174f0 69 74 68 6f 75 74 0a 2a 2a 20 20 20 20 20 20 20  ithout.**       
17500 20 41 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c 20   A FROM clause, 
17510 63 6f 6e 73 69 64 65 72 20 61 64 64 69 6e 67 20  consider adding 
17520 61 20 46 52 4f 4d 20 63 6c 6f 73 65 20 77 69 74  a FROM close wit
17530 68 20 74 68 65 20 73 70 65 63 69 61 6c 0a 2a 2a  h the special.**
17540 20 20 20 20 20 20 20 20 74 61 62 6c 65 20 73 71          table sq
17550 6c 69 74 65 5f 6f 6e 63 65 20 74 68 61 74 20 63  lite_once that c
17560 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 73 69 6e  onsists of a sin
17570 67 6c 65 20 72 6f 77 20 63 6f 6e 74 61 69 6e 69  gle row containi
17580 6e 67 20 61 0a 2a 2a 20 20 20 20 20 20 20 20 73  ng a.**        s
17590 69 6e 67 6c 65 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  ingle NULL..**.*
175a0 2a 20 20 20 28 38 29 20 20 54 68 65 20 73 75 62  *   (8)  The sub
175b0 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75  query does not u
175c0 73 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65 20  se LIMIT or the 
175d0 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e  outer query is n
175e0 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a  ot a join..**.**
175f0 20 20 20 28 39 29 20 20 54 68 65 20 73 75 62 71     (9)  The subq
17600 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73  uery does not us
17610 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65 20 6f  e LIMIT or the o
17620 75 74 65 72 20 71 75 65 72 79 20 64 6f 65 73 20  uter query does 
17630 6e 6f 74 20 75 73 65 0a 2a 2a 20 20 20 20 20 20  not use.**      
17640 20 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a    aggregates..**
17650 0a 2a 2a 20 20 28 31 30 29 20 20 54 68 65 20 73  .**  (10)  The s
17660 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  ubquery does not
17670 20 75 73 65 20 61 67 67 72 65 67 61 74 65 73 20   use aggregates 
17680 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  or the outer que
17690 72 79 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 20  ry does not.**  
176a0 20 20 20 20 20 20 75 73 65 20 4c 49 4d 49 54 2e        use LIMIT.
176b0 0a 2a 2a 0a 2a 2a 20 20 28 31 31 29 20 20 54 68  .**.**  (11)  Th
176c0 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20 74  e subquery and t
176d0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64  he outer query d
176e0 6f 20 6e 6f 74 20 62 6f 74 68 20 68 61 76 65 20  o not both have 
176f0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 73  ORDER BY clauses
17700 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 4e  ..**.**  (**)  N
17710 6f 74 20 69 6d 70 6c 65 6d 65 6e 74 65 64 2e 20  ot implemented. 
17720 20 53 75 62 73 75 6d 65 64 20 69 6e 74 6f 20 72   Subsumed into r
17730 65 73 74 72 69 63 74 69 6f 6e 20 28 33 29 2e 20  estriction (3). 
17740 20 57 61 73 20 70 72 65 76 69 6f 75 73 6c 79 0a   Was previously.
17750 2a 2a 20 20 20 20 20 20 20 20 61 20 73 65 70 61  **        a sepa
17760 72 61 74 65 20 72 65 73 74 72 69 63 74 69 6f 6e  rate restriction
17770 20 64 65 72 69 76 69 6e 67 20 66 72 6f 6d 20 74   deriving from t
17780 69 63 6b 65 74 20 23 33 35 30 2e 0a 2a 2a 0a 2a  icket #350..**.*
17790 2a 20 20 28 31 33 29 20 20 54 68 65 20 73 75 62  *  (13)  The sub
177a0 71 75 65 72 79 20 61 6e 64 20 6f 75 74 65 72 20  query and outer 
177b0 71 75 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74  query do not bot
177c0 68 20 75 73 65 20 4c 49 4d 49 54 2e 0a 2a 2a 0a  h use LIMIT..**.
177d0 2a 2a 20 20 28 31 34 29 20 20 54 68 65 20 73 75  **  (14)  The su
177e0 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20  bquery does not 
177f0 75 73 65 20 4f 46 46 53 45 54 2e 0a 2a 2a 0a 2a  use OFFSET..**.*
17800 2a 20 20 28 31 35 29 20 20 54 68 65 20 6f 75 74  *  (15)  The out
17810 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20  er query is not 
17820 70 61 72 74 20 6f 66 20 61 20 63 6f 6d 70 6f 75  part of a compou
17830 6e 64 20 73 65 6c 65 63 74 20 6f 72 20 74 68 65  nd select or the
17840 0a 2a 2a 20 20 20 20 20 20 20 20 73 75 62 71 75  .**        subqu
17850 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 68 61 76  ery does not hav
17860 65 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65  e a LIMIT clause
17870 2e 0a 2a 2a 20 20 20 20 20 20 20 20 28 53 65 65  ..**        (See
17880 20 74 69 63 6b 65 74 20 23 32 33 33 39 20 61 6e   ticket #2339 an
17890 64 20 74 69 63 6b 65 74 20 5b 30 32 61 38 65 38  d ticket [02a8e8
178a0 31 64 34 34 5d 29 2e 0a 2a 2a 0a 2a 2a 20 20 28  1d44])..**.**  (
178b0 31 36 29 20 20 54 68 65 20 6f 75 74 65 72 20 71  16)  The outer q
178c0 75 65 72 79 20 69 73 20 6e 6f 74 20 61 6e 20 61  uery is not an a
178d0 67 67 72 65 67 61 74 65 20 6f 72 20 74 68 65 20  ggregate or the 
178e0 73 75 62 71 75 65 72 79 20 64 6f 65 73 0a 2a 2a  subquery does.**
178f0 20 20 20 20 20 20 20 20 6e 6f 74 20 63 6f 6e 74          not cont
17900 61 69 6e 20 4f 52 44 45 52 20 42 59 2e 20 20 28  ain ORDER BY.  (
17910 54 69 63 6b 65 74 20 23 32 39 34 32 29 20 20 54  Ticket #2942)  T
17920 68 69 73 20 75 73 65 64 20 74 6f 20 6e 6f 74 20  his used to not 
17930 6d 61 74 74 65 72 0a 2a 2a 20 20 20 20 20 20 20  matter.**       
17940 20 75 6e 74 69 6c 20 77 65 20 69 6e 74 72 6f 64   until we introd
17950 75 63 65 64 20 74 68 65 20 67 72 6f 75 70 5f 63  uced the group_c
17960 6f 6e 63 61 74 28 29 20 66 75 6e 63 74 69 6f 6e  oncat() function
17970 2e 20 20 0a 2a 2a 0a 2a 2a 20 20 28 31 37 29 20  .  .**.**  (17) 
17980 20 54 68 65 20 73 75 62 2d 71 75 65 72 79 20 69   The sub-query i
17990 73 20 6e 6f 74 20 61 20 63 6f 6d 70 6f 75 6e 64  s not a compound
179a0 20 73 65 6c 65 63 74 2c 20 6f 72 20 69 74 20 69   select, or it i
179b0 73 20 61 20 55 4e 49 4f 4e 20 41 4c 4c 20 0a 2a  s a UNION ALL .*
179c0 2a 20 20 20 20 20 20 20 20 63 6f 6d 70 6f 75 6e  *        compoun
179d0 64 20 63 6c 61 75 73 65 20 6d 61 64 65 20 75 70  d clause made up
179e0 20 65 6e 74 69 72 65 6c 79 20 6f 66 20 6e 6f 6e   entirely of non
179f0 2d 61 67 67 72 65 67 61 74 65 20 71 75 65 72 69  -aggregate queri
17a00 65 73 2c 20 61 6e 64 20 0a 2a 2a 20 20 20 20 20  es, and .**     
17a10 20 20 20 74 68 65 20 70 61 72 65 6e 74 20 71 75     the parent qu
17a20 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  ery:.**.**      
17a30 20 20 20 20 2a 20 69 73 20 6e 6f 74 20 69 74 73      * is not its
17a40 65 6c 66 20 70 61 72 74 20 6f 66 20 61 20 63 6f  elf part of a co
17a50 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c 0a 2a  mpound select,.*
17a60 2a 20 20 20 20 20 20 20 20 20 20 2a 20 69 73 20  *          * is 
17a70 6e 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74 65  not an aggregate
17a80 20 6f 72 20 44 49 53 54 49 4e 43 54 20 71 75 65   or DISTINCT que
17a90 72 79 2c 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20  ry, and.**      
17aa0 20 20 20 20 2a 20 69 73 20 6e 6f 74 20 61 20 6a      * is not a j
17ab0 6f 69 6e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  oin.**.**       
17ac0 20 54 68 65 20 70 61 72 65 6e 74 20 61 6e 64 20   The parent and 
17ad0 73 75 62 2d 71 75 65 72 79 20 6d 61 79 20 63 6f  sub-query may co
17ae0 6e 74 61 69 6e 20 57 48 45 52 45 20 63 6c 61 75  ntain WHERE clau
17af0 73 65 73 2e 20 53 75 62 6a 65 63 74 20 74 6f 0a  ses. Subject to.
17b00 2a 2a 20 20 20 20 20 20 20 20 72 75 6c 65 73 20  **        rules 
17b10 28 31 31 29 2c 20 28 31 33 29 20 61 6e 64 20 28  (11), (13) and (
17b20 31 34 29 2c 20 74 68 65 79 20 6d 61 79 20 61 6c  14), they may al
17b30 73 6f 20 63 6f 6e 74 61 69 6e 20 4f 52 44 45 52  so contain ORDER
17b40 20 42 59 2c 0a 2a 2a 20 20 20 20 20 20 20 20 4c   BY,.**        L
17b50 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20  IMIT and OFFSET 
17b60 63 6c 61 75 73 65 73 2e 20 20 54 68 65 20 73 75  clauses.  The su
17b70 62 71 75 65 72 79 20 63 61 6e 6e 6f 74 20 75 73  bquery cannot us
17b80 65 20 61 6e 79 20 63 6f 6d 70 6f 75 6e 64 0a 2a  e any compound.*
17b90 2a 20 20 20 20 20 20 20 20 6f 70 65 72 61 74 6f  *        operato
17ba0 72 20 6f 74 68 65 72 20 74 68 61 6e 20 55 4e 49  r other than UNI
17bb0 4f 4e 20 41 4c 4c 20 62 65 63 61 75 73 65 20 61  ON ALL because a
17bc0 6c 6c 20 74 68 65 20 6f 74 68 65 72 20 63 6f 6d  ll the other com
17bd0 70 6f 75 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20  pound.**        
17be0 6f 70 65 72 61 74 6f 72 73 20 68 61 76 65 20 61  operators have a
17bf0 6e 20 69 6d 70 6c 69 65 64 20 44 49 53 54 49 4e  n implied DISTIN
17c00 43 54 20 77 68 69 63 68 20 69 73 20 64 69 73 61  CT which is disa
17c10 6c 6c 6f 77 65 64 20 62 79 0a 2a 2a 20 20 20 20  llowed by.**    
17c20 20 20 20 20 72 65 73 74 72 69 63 74 69 6f 6e 20      restriction 
17c30 28 34 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  (4)..**.**      
17c40 20 20 41 6c 73 6f 2c 20 65 61 63 68 20 63 6f 6d    Also, each com
17c50 70 6f 6e 65 6e 74 20 6f 66 20 74 68 65 20 73 75  ponent of the su
17c60 62 2d 71 75 65 72 79 20 6d 75 73 74 20 72 65 74  b-query must ret
17c70 75 72 6e 20 74 68 65 20 73 61 6d 65 20 6e 75 6d  urn the same num
17c80 62 65 72 0a 2a 2a 20 20 20 20 20 20 20 20 6f 66  ber.**        of
17c90 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 2e   result columns.
17ca0 20 54 68 69 73 20 69 73 20 61 63 74 75 61 6c 6c   This is actuall
17cb0 79 20 61 20 72 65 71 75 69 72 65 6d 65 6e 74 20  y a requirement 
17cc0 66 6f 72 20 61 6e 79 20 63 6f 6d 70 6f 75 6e 64  for any compound
17cd0 0a 2a 2a 20 20 20 20 20 20 20 20 53 45 4c 45 43  .**        SELEC
17ce0 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 62 75 74  T statement, but
17cf0 20 61 6c 6c 20 74 68 65 20 63 6f 64 65 20 68 65   all the code he
17d00 72 65 20 64 6f 65 73 20 69 73 20 6d 61 6b 65 20  re does is make 
17d10 73 75 72 65 20 74 68 61 74 20 6e 6f 0a 2a 2a 20  sure that no.** 
17d20 20 20 20 20 20 20 20 73 75 63 68 20 28 69 6c 6c         such (ill
17d30 65 67 61 6c 29 20 73 75 62 2d 71 75 65 72 79 20  egal) sub-query 
17d40 69 73 20 66 6c 61 74 74 65 6e 65 64 2e 20 54 68  is flattened. Th
17d50 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 64 65  e caller will de
17d60 74 65 63 74 20 74 68 65 0a 2a 2a 20 20 20 20 20  tect the.**     
17d70 20 20 20 73 79 6e 74 61 78 20 65 72 72 6f 72 20     syntax error 
17d80 61 6e 64 20 72 65 74 75 72 6e 20 61 20 64 65 74  and return a det
17d90 61 69 6c 65 64 20 6d 65 73 73 61 67 65 2e 0a 2a  ailed message..*
17da0 2a 0a 2a 2a 20 20 28 31 38 29 20 20 49 66 20 74  *.**  (18)  If t
17db0 68 65 20 73 75 62 2d 71 75 65 72 79 20 69 73 20  he sub-query is 
17dc0 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63  a compound selec
17dd0 74 2c 20 74 68 65 6e 20 61 6c 6c 20 74 65 72 6d  t, then all term
17de0 73 20 6f 66 20 74 68 65 0a 2a 2a 20 20 20 20 20  s of the.**     
17df0 20 20 20 4f 52 44 45 52 20 62 79 20 63 6c 61 75     ORDER by clau
17e00 73 65 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74  se of the parent
17e10 20 6d 75 73 74 20 62 65 20 73 69 6d 70 6c 65 20   must be simple 
17e20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 0a 2a  references to .*
17e30 2a 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 73  *        columns
17e40 20 6f 66 20 74 68 65 20 73 75 62 2d 71 75 65 72   of the sub-quer
17e50 79 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 39 29 20 20  y..**.**  (19)  
17e60 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65  The subquery doe
17e70 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 20  s not use LIMIT 
17e80 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  or the outer que
17e90 72 79 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 20  ry does not.**  
17ea0 20 20 20 20 20 20 68 61 76 65 20 61 20 57 48 45        have a WHE
17eb0 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a  RE clause..**.**
17ec0 20 20 28 32 30 29 20 20 49 66 20 74 68 65 20 73    (20)  If the s
17ed0 75 62 2d 71 75 65 72 79 20 69 73 20 61 20 63 6f  ub-query is a co
17ee0 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20 74  mpound select, t
17ef0 68 65 6e 20 69 74 20 6d 75 73 74 20 6e 6f 74 20  hen it must not 
17f00 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 61 6e  use.**        an
17f10 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
17f20 2e 20 20 54 69 63 6b 65 74 20 23 33 37 37 33 2e  .  Ticket #3773.
17f30 20 20 57 65 20 63 6f 75 6c 64 20 72 65 6c 61 78    We could relax
17f40 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74   this constraint
17f50 0a 2a 2a 20 20 20 20 20 20 20 20 73 6f 6d 65 77  .**        somew
17f60 68 61 74 20 62 79 20 73 61 79 69 6e 67 20 74 68  hat by saying th
17f70 61 74 20 74 68 65 20 74 65 72 6d 73 20 6f 66 20  at the terms of 
17f80 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
17f90 75 73 65 20 6d 75 73 74 0a 2a 2a 20 20 20 20 20  use must.**     
17fa0 20 20 20 61 70 70 65 61 72 20 61 73 20 75 6e 6d     appear as unm
17fb0 6f 64 69 66 69 65 64 20 72 65 73 75 6c 74 20 63  odified result c
17fc0 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 6f 75  olumns in the ou
17fd0 74 65 72 20 71 75 65 72 79 2e 20 20 42 75 74 20  ter query.  But 
17fe0 77 65 0a 2a 2a 20 20 20 20 20 20 20 20 68 61 76  we.**        hav
17ff0 65 20 6f 74 68 65 72 20 6f 70 74 69 6d 69 7a 61  e other optimiza
18000 74 69 6f 6e 73 20 69 6e 20 6d 69 6e 64 20 74 6f  tions in mind to
18010 20 64 65 61 6c 20 77 69 74 68 20 74 68 61 74 20   deal with that 
18020 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 31  case..**.**  (21
18030 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
18040 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d  does not use LIM
18050 49 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20  IT or the outer 
18060 71 75 65 72 79 20 69 73 20 6e 6f 74 0a 2a 2a 20  query is not.** 
18070 20 20 20 20 20 20 20 44 49 53 54 49 4e 43 54 2e         DISTINCT.
18080 20 20 28 53 65 65 20 74 69 63 6b 65 74 20 5b 37    (See ticket [7
18090 35 32 65 31 36 34 36 66 63 5d 29 2e 0a 2a 2a 0a  52e1646fc])..**.
180a0 2a 2a 20 49 6e 20 74 68 69 73 20 72 6f 75 74 69  ** In this routi
180b0 6e 65 2c 20 74 68 65 20 22 70 22 20 70 61 72 61  ne, the "p" para
180c0 6d 65 74 65 72 20 69 73 20 61 20 70 6f 69 6e 74  meter is a point
180d0 65 72 20 74 6f 20 74 68 65 20 6f 75 74 65 72 20  er to the outer 
180e0 71 75 65 72 79 2e 0a 2a 2a 20 54 68 65 20 73 75  query..** The su
180f0 62 71 75 65 72 79 20 69 73 20 70 2d 3e 70 53 72  bquery is p->pSr
18100 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 20 20 69 73  c->a[iFrom].  is
18110 41 67 67 20 69 73 20 74 72 75 65 20 69 66 20 74  Agg is true if t
18120 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 0a 2a  he outer query.*
18130 2a 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65  * uses aggregate
18140 73 20 61 6e 64 20 73 75 62 71 75 65 72 79 49 73  s and subqueryIs
18150 41 67 67 20 69 73 20 74 72 75 65 20 69 66 20 74  Agg is true if t
18160 68 65 20 73 75 62 71 75 65 72 79 20 75 73 65 73  he subquery uses
18170 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a   aggregates..**.
18180 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e 69 6e 67  ** If flattening
18190 20 69 73 20 6e 6f 74 20 61 74 74 65 6d 70 74 65   is not attempte
181a0 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  d, this routine 
181b0 69 73 20 61 20 6e 6f 2d 6f 70 20 61 6e 64 20 72  is a no-op and r
181c0 65 74 75 72 6e 73 20 30 2e 0a 2a 2a 20 49 66 20  eturns 0..** If 
181d0 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 61 74  flattening is at
181e0 74 65 6d 70 74 65 64 20 74 68 69 73 20 72 6f 75  tempted this rou
181f0 74 69 6e 65 20 72 65 74 75 72 6e 73 20 31 2e 0a  tine returns 1..
18200 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 66 20 74 68 65  **.** All of the
18210 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 61 6c   expression anal
18220 79 73 69 73 20 6d 75 73 74 20 6f 63 63 75 72 20  ysis must occur 
18230 6f 6e 20 62 6f 74 68 20 74 68 65 20 6f 75 74 65  on both the oute
18240 72 20 71 75 65 72 79 20 61 6e 64 0a 2a 2a 20 74  r query and.** t
18250 68 65 20 73 75 62 71 75 65 72 79 20 62 65 66 6f  he subquery befo
18260 72 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  re this routine 
18270 72 75 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  runs..*/.static 
18280 69 6e 74 20 66 6c 61 74 74 65 6e 53 75 62 71 75  int flattenSubqu
18290 65 72 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ery(.  Parse *pP
182a0 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50  arse,       /* P
182b0 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
182c0 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
182d0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
182e0 70 61 72 65 6e 74 20 6f 72 20 6f 75 74 65 72 20  parent or outer 
182f0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
18300 20 2a 2f 0a 20 20 69 6e 74 20 69 46 72 6f 6d 2c   */.  int iFrom,
18310 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
18320 64 65 78 20 69 6e 20 70 2d 3e 70 53 72 63 2d 3e  dex in p->pSrc->
18330 61 5b 5d 20 6f 66 20 74 68 65 20 69 6e 6e 65 72  a[] of the inner
18340 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 69   subquery */.  i
18350 6e 74 20 69 73 41 67 67 2c 20 20 20 20 20 20 20  nt isAgg,       
18360 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6f      /* True if o
18370 75 74 65 72 20 53 45 4c 45 43 54 20 75 73 65 73  uter SELECT uses
18380 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
18390 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 73 75  ions */.  int su
183a0 62 71 75 65 72 79 49 73 41 67 67 20 20 20 20 2f  bqueryIsAgg    /
183b0 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 73 75  * True if the su
183c0 62 71 75 65 72 79 20 75 73 65 73 20 61 67 67 72  bquery uses aggr
183d0 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20  egate functions 
183e0 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  */.){.  const ch
183f0 61 72 20 2a 7a 53 61 76 65 64 41 75 74 68 43 6f  ar *zSavedAuthCo
18400 6e 74 65 78 74 20 3d 20 70 50 61 72 73 65 2d 3e  ntext = pParse->
18410 7a 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a 20 20  zAuthContext;.  
18420 53 65 6c 65 63 74 20 2a 70 50 61 72 65 6e 74 3b  Select *pParent;
18430 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 3b  .  Select *pSub;
18440 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e         /* The in
18450 6e 65 72 20 71 75 65 72 79 20 6f 72 20 22 73 75  ner query or "su
18460 62 71 75 65 72 79 22 20 2a 2f 0a 20 20 53 65 6c  bquery" */.  Sel
18470 65 63 74 20 2a 70 53 75 62 31 3b 20 20 20 20 20  ect *pSub1;     
18480 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74   /* Pointer to t
18490 68 65 20 72 69 67 68 74 6d 6f 73 74 20 73 65 6c  he rightmost sel
184a0 65 63 74 20 69 6e 20 73 75 62 2d 71 75 65 72 79  ect in sub-query
184b0 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
184c0 53 72 63 3b 20 20 20 20 20 20 2f 2a 20 54 68 65  Src;      /* The
184d0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
184e0 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
184f0 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  */.  SrcList *pS
18500 75 62 53 72 63 3b 20 20 20 2f 2a 20 54 68 65 20  ubSrc;   /* The 
18510 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74  FROM clause of t
18520 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20  he subquery */. 
18530 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
18540 3b 20 20 20 20 2f 2a 20 54 68 65 20 72 65 73 75  ;    /* The resu
18550 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 6f 75  lt set of the ou
18560 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 20 20 69  ter query */.  i
18570 6e 74 20 69 50 61 72 65 6e 74 3b 20 20 20 20 20  nt iParent;     
18580 20 20 20 2f 2a 20 56 44 42 45 20 63 75 72 73 6f     /* VDBE curso
18590 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  r number of the 
185a0 70 53 75 62 20 72 65 73 75 6c 74 20 73 65 74 20  pSub result set 
185b0 74 65 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20  temp table */.  
185c0 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
185d0 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
185e0 74 65 72 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ter */.  Expr *p
185f0 57 68 65 72 65 3b 20 20 20 20 20 20 20 20 20 20  Where;          
18600 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
18610 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
18620 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
18630 74 5f 69 74 65 6d 20 2a 70 53 75 62 69 74 65 6d  t_item *pSubitem
18640 3b 20 20 20 2f 2a 20 54 68 65 20 73 75 62 71 75  ;   /* The subqu
18650 65 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ery */.  sqlite3
18660 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
18670 62 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  b;..  /* Check t
18680 6f 20 73 65 65 20 69 66 20 66 6c 61 74 74 65 6e  o see if flatten
18690 69 6e 67 20 69 73 20 70 65 72 6d 69 74 74 65 64  ing is permitted
186a0 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66 20 6e  .  Return 0 if n
186b0 6f 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ot..  */.  asser
186c0 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 73 73  t( p!=0 );.  ass
186d0 65 72 74 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d  ert( p->pPrior==
186e0 30 20 29 3b 20 20 2f 2a 20 55 6e 61 62 6c 65 20  0 );  /* Unable 
186f0 74 6f 20 66 6c 61 74 74 65 6e 20 63 6f 6d 70 6f  to flatten compo
18700 75 6e 64 20 71 75 65 72 69 65 73 20 2a 2f 0a 20  und queries */. 
18710 20 69 66 28 20 4f 70 74 69 6d 69 7a 61 74 69 6f   if( Optimizatio
18720 6e 44 69 73 61 62 6c 65 64 28 64 62 2c 20 53 51  nDisabled(db, SQ
18730 4c 49 54 45 5f 51 75 65 72 79 46 6c 61 74 74 65  LITE_QueryFlatte
18740 6e 65 72 29 20 29 20 72 65 74 75 72 6e 20 30 3b  ner) ) return 0;
18750 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72  .  pSrc = p->pSr
18760 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72  c;.  assert( pSr
18770 63 20 26 26 20 69 46 72 6f 6d 3e 3d 30 20 26 26  c && iFrom>=0 &&
18780 20 69 46 72 6f 6d 3c 70 53 72 63 2d 3e 6e 53 72   iFrom<pSrc->nSr
18790 63 20 29 3b 0a 20 20 70 53 75 62 69 74 65 6d 20  c );.  pSubitem 
187a0 3d 20 26 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d  = &pSrc->a[iFrom
187b0 5d 3b 0a 20 20 69 50 61 72 65 6e 74 20 3d 20 70  ];.  iParent = p
187c0 53 75 62 69 74 65 6d 2d 3e 69 43 75 72 73 6f 72  Subitem->iCursor
187d0 3b 0a 20 20 70 53 75 62 20 3d 20 70 53 75 62 69  ;.  pSub = pSubi
187e0 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20  tem->pSelect;.  
187f0 61 73 73 65 72 74 28 20 70 53 75 62 21 3d 30 20  assert( pSub!=0 
18800 29 3b 0a 20 20 69 66 28 20 69 73 41 67 67 20 26  );.  if( isAgg &
18810 26 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20  & subqueryIsAgg 
18820 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
18830 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
18840 65 73 74 72 69 63 74 69 6f 6e 20 28 31 29 20 20  estriction (1)  
18850 2a 2f 0a 20 20 69 66 28 20 73 75 62 71 75 65 72  */.  if( subquer
18860 79 49 73 41 67 67 20 26 26 20 70 53 72 63 2d 3e  yIsAgg && pSrc->
18870 6e 53 72 63 3e 31 20 29 20 72 65 74 75 72 6e 20  nSrc>1 ) return 
18880 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  0;          /* R
18890 65 73 74 72 69 63 74 69 6f 6e 20 28 32 29 20 20  estriction (2)  
188a0 2a 2f 0a 20 20 70 53 75 62 53 72 63 20 3d 20 70  */.  pSubSrc = p
188b0 53 75 62 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73  Sub->pSrc;.  ass
188c0 65 72 74 28 20 70 53 75 62 53 72 63 20 29 3b 0a  ert( pSubSrc );.
188d0 20 20 2f 2a 20 50 72 69 6f 72 20 74 6f 20 76 65    /* Prior to ve
188e0 72 73 69 6f 6e 20 33 2e 31 2e 32 2c 20 77 68 65  rsion 3.1.2, whe
188f0 6e 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53  n LIMIT and OFFS
18900 45 54 20 68 61 64 20 74 6f 20 62 65 20 73 69 6d  ET had to be sim
18910 70 6c 65 20 63 6f 6e 73 74 61 6e 74 73 2c 0a 20  ple constants,. 
18920 20 2a 2a 20 6e 6f 74 20 61 72 62 69 74 72 61 72   ** not arbitrar
18930 79 20 65 78 70 72 65 73 73 73 69 6f 6e 73 2c 20  y expresssions, 
18940 77 65 20 61 6c 6c 6f 77 65 64 20 73 6f 6d 65 20  we allowed some 
18950 63 6f 6d 62 69 6e 69 6e 67 20 6f 66 20 4c 49 4d  combining of LIM
18960 49 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 20 20  IT and OFFSET.  
18970 2a 2a 20 62 65 63 61 75 73 65 20 74 68 65 79 20  ** because they 
18980 63 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65  could be compute
18990 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  d at compile-tim
189a0 65 2e 20 20 42 75 74 20 77 68 65 6e 20 4c 49 4d  e.  But when LIM
189b0 49 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 20 20  IT and OFFSET.  
189c0 2a 2a 20 62 65 63 61 6d 65 20 61 72 62 69 74 72  ** became arbitr
189d0 61 72 79 20 65 78 70 72 65 73 73 69 6f 6e 73 2c  ary expressions,
189e0 20 77 65 20 77 65 72 65 20 66 6f 72 63 65 64 20   we were forced 
189f0 74 6f 20 61 64 64 20 72 65 73 74 72 69 63 74 69  to add restricti
18a00 6f 6e 73 20 28 31 33 29 0a 20 20 2a 2a 20 61 6e  ons (13).  ** an
18a10 64 20 28 31 34 29 2e 20 2a 2f 0a 20 20 69 66 28  d (14). */.  if(
18a20 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26   pSub->pLimit &&
18a30 20 70 2d 3e 70 4c 69 6d 69 74 20 29 20 72 65 74   p->pLimit ) ret
18a40 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
18a50 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
18a60 6f 6e 20 28 31 33 29 20 2a 2f 0a 20 20 69 66 28  on (13) */.  if(
18a70 20 70 53 75 62 2d 3e 70 4f 66 66 73 65 74 20 29   pSub->pOffset )
18a80 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
18a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18aa0 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
18ab0 6f 6e 20 28 31 34 29 20 2a 2f 0a 20 20 69 66 28  on (14) */.  if(
18ac0 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 20 26   p->pRightmost &
18ad0 26 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 29  & pSub->pLimit )
18ae0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20  {.    return 0; 
18af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18b10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
18b20 73 74 72 69 63 74 69 6f 6e 20 28 31 35 29 20 2a  striction (15) *
18b30 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 75 62  /.  }.  if( pSub
18b40 53 72 63 2d 3e 6e 53 72 63 3d 3d 30 20 29 20 72  Src->nSrc==0 ) r
18b50 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
18b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
18b70 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 37  * Restriction (7
18b80 29 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62  )  */.  if( pSub
18b90 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
18ba0 44 69 73 74 69 6e 63 74 20 29 20 72 65 74 75 72  Distinct ) retur
18bb0 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  n 0;           /
18bc0 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 35  * Restriction (5
18bd0 29 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62  )  */.  if( pSub
18be0 2d 3e 70 4c 69 6d 69 74 20 26 26 20 28 70 53 72  ->pLimit && (pSr
18bf0 63 2d 3e 6e 53 72 63 3e 31 20 7c 7c 20 69 73 41  c->nSrc>1 || isA
18c00 67 67 29 20 29 7b 0a 20 20 20 20 20 72 65 74 75  gg) ){.     retu
18c10 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a  rn 0;         /*
18c20 20 52 65 73 74 72 69 63 74 69 6f 6e 73 20 28 38   Restrictions (8
18c30 29 28 39 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66  )(9) */.  }.  if
18c40 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  ( (p->selFlags &
18c50 20 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30   SF_Distinct)!=0
18c60 20 26 26 20 73 75 62 71 75 65 72 79 49 73 41 67   && subqueryIsAg
18c70 67 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e  g ){.     return
18c80 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52   0;         /* R
18c90 65 73 74 72 69 63 74 69 6f 6e 20 28 36 29 20 20  estriction (6)  
18ca0 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  */.  }.  if( p->
18cb0 70 4f 72 64 65 72 42 79 20 26 26 20 70 53 75 62  pOrderBy && pSub
18cc0 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ->pOrderBy ){.  
18cd0 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20     return 0;    
18ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18d00 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
18d10 63 74 69 6f 6e 20 28 31 31 29 20 2a 2f 0a 20 20  ction (11) */.  
18d20 7d 0a 20 20 69 66 28 20 69 73 41 67 67 20 26 26  }.  if( isAgg &&
18d30 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20   pSub->pOrderBy 
18d40 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
18d50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
18d60 73 74 72 69 63 74 69 6f 6e 20 28 31 36 29 20 2a  striction (16) *
18d70 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c  /.  if( pSub->pL
18d80 69 6d 69 74 20 26 26 20 70 2d 3e 70 57 68 65 72  imit && p->pWher
18d90 65 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  e ) return 0;   
18da0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
18db0 73 74 72 69 63 74 69 6f 6e 20 28 31 39 29 20 2a  striction (19) *
18dc0 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c  /.  if( pSub->pL
18dd0 69 6d 69 74 20 26 26 20 28 70 2d 3e 73 65 6c 46  imit && (p->selF
18de0 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e  lags & SF_Distin
18df0 63 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 72  ct)!=0 ){.     r
18e00 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
18e10 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
18e20 28 32 31 29 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f  (21) */.  }..  /
18e30 2a 20 4f 42 53 4f 4c 45 54 45 20 43 4f 4d 4d 45  * OBSOLETE COMME
18e40 4e 54 20 31 3a 0a 20 20 2a 2a 20 52 65 73 74 72  NT 1:.  ** Restr
18e50 69 63 74 69 6f 6e 20 33 3a 20 20 49 66 20 74 68  iction 3:  If th
18e60 65 20 73 75 62 71 75 65 72 79 20 69 73 20 61 20  e subquery is a 
18e70 6a 6f 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20  join, make sure 
18e80 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  the subquery is 
18e90 0a 20 20 2a 2a 20 6e 6f 74 20 75 73 65 64 20 61  .  ** not used a
18ea0 73 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72  s the right oper
18eb0 61 6e 64 20 6f 66 20 61 6e 20 6f 75 74 65 72 20  and of an outer 
18ec0 6a 6f 69 6e 2e 20 20 45 78 61 6d 70 6c 65 73 20  join.  Examples 
18ed0 6f 66 20 77 68 79 20 74 68 69 73 0a 20 20 2a 2a  of why this.  **
18ee0 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a   is not allowed:
18ef0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
18f00 20 20 20 74 31 20 4c 45 46 54 20 4f 55 54 45 52     t1 LEFT OUTER
18f10 20 4a 4f 49 4e 20 28 74 32 20 4a 4f 49 4e 20 74   JOIN (t2 JOIN t
18f20 33 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  3).  **.  ** If 
18f30 77 65 20 66 6c 61 74 74 65 6e 20 74 68 65 20 61  we flatten the a
18f40 62 6f 76 65 2c 20 77 65 20 77 6f 75 6c 64 20 67  bove, we would g
18f50 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  et.  **.  **    
18f60 20 20 20 20 20 28 74 31 20 4c 45 46 54 20 4f 55       (t1 LEFT OU
18f70 54 45 52 20 4a 4f 49 4e 20 74 32 29 20 4a 4f 49  TER JOIN t2) JOI
18f80 4e 20 74 33 0a 20 20 2a 2a 0a 20 20 2a 2a 20 77  N t3.  **.  ** w
18f90 68 69 63 68 20 69 73 20 6e 6f 74 20 61 74 20 61  hich is not at a
18fa0 6c 6c 20 74 68 65 20 73 61 6d 65 20 74 68 69 6e  ll the same thin
18fb0 67 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 42 53  g..  **.  ** OBS
18fc0 4f 4c 45 54 45 20 43 4f 4d 4d 45 4e 54 20 32 3a  OLETE COMMENT 2:
18fd0 0a 20 20 2a 2a 20 52 65 73 74 72 69 63 74 69 6f  .  ** Restrictio
18fe0 6e 20 31 32 3a 20 20 49 66 20 74 68 65 20 73 75  n 12:  If the su
18ff0 62 71 75 65 72 79 20 69 73 20 74 68 65 20 72 69  bquery is the ri
19000 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61  ght operand of a
19010 20 6c 65 66 74 20 6f 75 74 65 72 0a 20 20 2a 2a   left outer.  **
19020 20 6a 6f 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65   join, make sure
19030 20 74 68 65 20 73 75 62 71 75 65 72 79 20 68 61   the subquery ha
19040 73 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73  s no WHERE claus
19050 65 2e 0a 20 20 2a 2a 20 41 6e 20 65 78 61 6d 70  e..  ** An examp
19060 6c 65 73 20 6f 66 20 77 68 79 20 74 68 69 73 20  les of why this 
19070 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a  is not allowed:.
19080 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20    **.  **       
19090 20 20 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20    t1 LEFT OUTER 
190a0 4a 4f 49 4e 20 28 53 45 4c 45 43 54 20 2a 20 46  JOIN (SELECT * F
190b0 52 4f 4d 20 74 32 20 57 48 45 52 45 20 74 32 2e  ROM t2 WHERE t2.
190c0 78 3e 30 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  x>0).  **.  ** I
190d0 66 20 77 65 20 66 6c 61 74 74 65 6e 20 74 68 65  f we flatten the
190e0 20 61 62 6f 76 65 2c 20 77 65 20 77 6f 75 6c 64   above, we would
190f0 20 67 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20   get.  **.  **  
19100 20 20 20 20 20 20 20 28 74 31 20 4c 45 46 54 20         (t1 LEFT 
19110 4f 55 54 45 52 20 4a 4f 49 4e 20 74 32 29 20 57  OUTER JOIN t2) W
19120 48 45 52 45 20 74 32 2e 78 3e 30 0a 20 20 2a 2a  HERE t2.x>0.  **
19130 0a 20 20 2a 2a 20 42 75 74 20 74 68 65 20 74 32  .  ** But the t2
19140 2e 78 3e 30 20 74 65 73 74 20 77 69 6c 6c 20 61  .x>0 test will a
19150 6c 77 61 79 73 20 66 61 69 6c 20 6f 6e 20 61 20  lways fail on a 
19160 4e 55 4c 4c 20 72 6f 77 20 6f 66 20 74 32 2c 20  NULL row of t2, 
19170 77 68 69 63 68 0a 20 20 2a 2a 20 65 66 66 65 63  which.  ** effec
19180 74 69 76 65 6c 79 20 63 6f 6e 76 65 72 74 73 20  tively converts 
19190 74 68 65 20 4f 55 54 45 52 20 4a 4f 49 4e 20 69  the OUTER JOIN i
191a0 6e 74 6f 20 61 6e 20 49 4e 4e 45 52 20 4a 4f 49  nto an INNER JOI
191b0 4e 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 48 49  N..  **.  ** THI
191c0 53 20 4f 56 45 52 52 49 44 45 53 20 4f 42 53 4f  S OVERRIDES OBSO
191d0 4c 45 54 45 20 43 4f 4d 4d 45 4e 54 53 20 31 20  LETE COMMENTS 1 
191e0 41 4e 44 20 32 20 41 42 4f 56 45 3a 0a 20 20 2a  AND 2 ABOVE:.  *
191f0 2a 20 54 69 63 6b 65 74 20 23 33 33 30 30 20 73  * Ticket #3300 s
19200 68 6f 77 73 20 74 68 61 74 20 66 6c 61 74 74 65  hows that flatte
19210 6e 69 6e 67 20 74 68 65 20 72 69 67 68 74 20 74  ning the right t
19220 65 72 6d 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f  erm of a LEFT JO
19230 49 4e 0a 20 20 2a 2a 20 69 73 20 66 72 61 75 67  IN.  ** is fraug
19240 68 74 20 77 69 74 68 20 64 61 6e 67 65 72 2e 20  ht with danger. 
19250 20 42 65 73 74 20 74 6f 20 61 76 6f 69 64 20 74   Best to avoid t
19260 68 65 20 77 68 6f 6c 65 20 74 68 69 6e 67 2e 20  he whole thing. 
19270 20 49 66 20 74 68 65 0a 20 20 2a 2a 20 73 75 62   If the.  ** sub
19280 71 75 65 72 79 20 69 73 20 74 68 65 20 72 69 67  query is the rig
19290 68 74 20 74 65 72 6d 20 6f 66 20 61 20 4c 45 46  ht term of a LEF
192a0 54 20 4a 4f 49 4e 2c 20 74 68 65 6e 20 64 6f 20  T JOIN, then do 
192b0 6e 6f 74 20 66 6c 61 74 74 65 6e 2e 0a 20 20 2a  not flatten..  *
192c0 2f 0a 20 20 69 66 28 20 28 70 53 75 62 69 74 65  /.  if( (pSubite
192d0 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54  m->jointype & JT
192e0 5f 4f 55 54 45 52 29 21 3d 30 20 29 7b 0a 20 20  _OUTER)!=0 ){.  
192f0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
19300 0a 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f  .  /* Restrictio
19310 6e 20 31 37 3a 20 49 66 20 74 68 65 20 73 75 62  n 17: If the sub
19320 2d 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70  -query is a comp
19330 6f 75 6e 64 20 53 45 4c 45 43 54 2c 20 74 68 65  ound SELECT, the
19340 6e 20 69 74 20 6d 75 73 74 0a 20 20 2a 2a 20 75  n it must.  ** u
19350 73 65 20 6f 6e 6c 79 20 74 68 65 20 55 4e 49 4f  se only the UNIO
19360 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72 2e 20  N ALL operator. 
19370 41 6e 64 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20  And none of the 
19380 73 69 6d 70 6c 65 20 73 65 6c 65 63 74 20 71 75  simple select qu
19390 65 72 69 65 73 0a 20 20 2a 2a 20 74 68 61 74 20  eries.  ** that 
193a0 6d 61 6b 65 20 75 70 20 74 68 65 20 63 6f 6d 70  make up the comp
193b0 6f 75 6e 64 20 53 45 4c 45 43 54 20 61 72 65 20  ound SELECT are 
193c0 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65 20 61 67  allowed to be ag
193d0 67 72 65 67 61 74 65 20 6f 72 20 64 69 73 74 69  gregate or disti
193e0 6e 63 74 0a 20 20 2a 2a 20 71 75 65 72 69 65 73  nct.  ** queries
193f0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 75  ..  */.  if( pSu
19400 62 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20  b->pPrior ){.   
19410 20 69 66 28 20 70 53 75 62 2d 3e 70 4f 72 64 65   if( pSub->pOrde
19420 72 42 79 20 29 7b 0a 20 20 20 20 20 20 72 65 74  rBy ){.      ret
19430 75 72 6e 20 30 3b 20 20 2f 2a 20 52 65 73 74 72  urn 0;  /* Restr
19440 69 63 74 69 6f 6e 20 32 30 20 2a 2f 0a 20 20 20  iction 20 */.   
19450 20 7d 0a 20 20 20 20 69 66 28 20 69 73 41 67 67   }.    if( isAgg
19460 20 7c 7c 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73   || (p->selFlags
19470 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 29 21   & SF_Distinct)!
19480 3d 30 20 7c 7c 20 70 53 72 63 2d 3e 6e 53 72 63  =0 || pSrc->nSrc
19490 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 72 65 74  !=1 ){.      ret
194a0 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 0;.    }.   
194b0 20 66 6f 72 28 70 53 75 62 31 3d 70 53 75 62 3b   for(pSub1=pSub;
194c0 20 70 53 75 62 31 3b 20 70 53 75 62 31 3d 70 53   pSub1; pSub1=pS
194d0 75 62 31 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20  ub1->pPrior){.  
194e0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28 70      testcase( (p
194f0 53 75 62 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26  Sub1->selFlags &
19500 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46   (SF_Distinct|SF
19510 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46  _Aggregate))==SF
19520 5f 44 69 73 74 69 6e 63 74 20 29 3b 0a 20 20 20  _Distinct );.   
19530 20 20 20 74 65 73 74 63 61 73 65 28 20 28 70 53     testcase( (pS
19540 75 62 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ub1->selFlags & 
19550 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f  (SF_Distinct|SF_
19560 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f  Aggregate))==SF_
19570 41 67 67 72 65 67 61 74 65 20 29 3b 0a 20 20 20  Aggregate );.   
19580 20 20 20 61 73 73 65 72 74 28 20 70 53 75 62 2d     assert( pSub-
19590 3e 70 53 72 63 21 3d 30 20 29 3b 0a 20 20 20 20  >pSrc!=0 );.    
195a0 20 20 69 66 28 20 28 70 53 75 62 31 2d 3e 73 65    if( (pSub1->se
195b0 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73  lFlags & (SF_Dis
195c0 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61  tinct|SF_Aggrega
195d0 74 65 29 29 21 3d 30 0a 20 20 20 20 20 20 20 7c  te))!=0.       |
195e0 7c 20 28 70 53 75 62 31 2d 3e 70 50 72 69 6f 72  | (pSub1->pPrior
195f0 20 26 26 20 70 53 75 62 31 2d 3e 6f 70 21 3d 54   && pSub1->op!=T
19600 4b 5f 41 4c 4c 29 20 0a 20 20 20 20 20 20 20 7c  K_ALL) .       |
19610 7c 20 70 53 75 62 31 2d 3e 70 53 72 63 2d 3e 6e  | pSub1->pSrc->n
19620 53 72 63 3c 31 0a 20 20 20 20 20 20 20 7c 7c 20  Src<1.       || 
19630 70 53 75 62 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  pSub->pEList->nE
19640 78 70 72 21 3d 70 53 75 62 31 2d 3e 70 45 4c 69  xpr!=pSub1->pELi
19650 73 74 2d 3e 6e 45 78 70 72 0a 20 20 20 20 20 20  st->nExpr.      
19660 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
19670 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 0;.      }.   
19680 20 20 20 74 65 73 74 63 61 73 65 28 20 70 53 75     testcase( pSu
19690 62 31 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3e 31  b1->pSrc->nSrc>1
196a0 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f   );.    }..    /
196b0 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 31 38  * Restriction 18
196c0 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e  . */.    if( p->
196d0 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
196e0 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20    int ii;.      
196f0 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 2d 3e  for(ii=0; ii<p->
19700 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
19710 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20   ii++){.        
19720 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 2d  if( p->pOrderBy-
19730 3e 61 5b 69 69 5d 2e 69 4f 72 64 65 72 42 79 43  >a[ii].iOrderByC
19740 6f 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ol==0 ) return 0
19750 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
19760 20 20 7d 0a 0a 20 20 2f 2a 2a 2a 2a 2a 20 49 66    }..  /***** If
19770 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70   we reach this p
19780 6f 69 6e 74 2c 20 66 6c 61 74 74 65 6e 69 6e 67  oint, flattening
19790 20 69 73 20 70 65 72 6d 69 74 74 65 64 2e 20 2a   is permitted. *
197a0 2a 2a 2a 2a 2f 0a 0a 20 20 2f 2a 20 41 75 74 68  ****/..  /* Auth
197b0 6f 72 69 7a 65 20 74 68 65 20 73 75 62 71 75 65  orize the subque
197c0 72 79 20 2a 2f 0a 20 20 70 50 61 72 73 65 2d 3e  ry */.  pParse->
197d0 7a 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70  zAuthContext = p
197e0 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a  Subitem->zName;.
197f0 20 20 54 45 53 54 4f 4e 4c 59 28 69 20 3d 29 20    TESTONLY(i =) 
19800 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
19810 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
19820 53 45 4c 45 43 54 2c 20 30 2c 20 30 2c 20 30 29  SELECT, 0, 0, 0)
19830 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 69 3d  ;.  testcase( i=
19840 3d 53 51 4c 49 54 45 5f 44 45 4e 59 20 29 3b 0a  =SQLITE_DENY );.
19850 20 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43    pParse->zAuthC
19860 6f 6e 74 65 78 74 20 3d 20 7a 53 61 76 65 64 41  ontext = zSavedA
19870 75 74 68 43 6f 6e 74 65 78 74 3b 0a 0a 20 20 2f  uthContext;..  /
19880 2a 20 49 66 20 74 68 65 20 73 75 62 2d 71 75 65  * If the sub-que
19890 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64  ry is a compound
198a0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
198b0 74 2c 20 74 68 65 6e 20 28 62 79 20 72 65 73 74  t, then (by rest
198c0 72 69 63 74 69 6f 6e 73 0a 20 20 2a 2a 20 31 37  rictions.  ** 17
198d0 20 61 6e 64 20 31 38 20 61 62 6f 76 65 29 20 69   and 18 above) i
198e0 74 20 6d 75 73 74 20 62 65 20 61 20 55 4e 49 4f  t must be a UNIO
198f0 4e 20 41 4c 4c 20 61 6e 64 20 74 68 65 20 70 61  N ALL and the pa
19900 72 65 6e 74 20 71 75 65 72 79 20 6d 75 73 74 20  rent query must 
19910 0a 20 20 2a 2a 20 62 65 20 6f 66 20 74 68 65 20  .  ** be of the 
19920 66 6f 72 6d 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  form:.  **.  ** 
19930 20 20 20 20 53 45 4c 45 43 54 20 3c 65 78 70 72      SELECT <expr
19940 2d 6c 69 73 74 3e 20 46 52 4f 4d 20 28 3c 73 75  -list> FROM (<su
19950 62 2d 71 75 65 72 79 3e 29 20 3c 77 68 65 72 65  b-query>) <where
19960 2d 63 6c 61 75 73 65 3e 20 0a 20 20 2a 2a 0a 20  -clause> .  **. 
19970 20 2a 2a 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20   ** followed by 
19980 61 6e 79 20 4f 52 44 45 52 20 42 59 2c 20 4c 49  any ORDER BY, LI
19990 4d 49 54 20 61 6e 64 2f 6f 72 20 4f 46 46 53 45  MIT and/or OFFSE
199a0 54 20 63 6c 61 75 73 65 73 2e 20 54 68 69 73 20  T clauses. This 
199b0 62 6c 6f 63 6b 0a 20 20 2a 2a 20 63 72 65 61 74  block.  ** creat
199c0 65 73 20 4e 2d 31 20 63 6f 70 69 65 73 20 6f 66  es N-1 copies of
199d0 20 74 68 65 20 70 61 72 65 6e 74 20 71 75 65 72   the parent quer
199e0 79 20 77 69 74 68 6f 75 74 20 61 6e 79 20 4f 52  y without any OR
199f0 44 45 52 20 42 59 2c 20 4c 49 4d 49 54 20 6f 72  DER BY, LIMIT or
19a00 20 0a 20 20 2a 2a 20 4f 46 46 53 45 54 20 63 6c   .  ** OFFSET cl
19a10 61 75 73 65 73 20 61 6e 64 20 6a 6f 69 6e 73 20  auses and joins 
19a20 74 68 65 6d 20 74 6f 20 74 68 65 20 6c 65 66 74  them to the left
19a30 2d 68 61 6e 64 2d 73 69 64 65 20 6f 66 20 74 68  -hand-side of th
19a40 65 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20  e original.  ** 
19a50 75 73 69 6e 67 20 55 4e 49 4f 4e 20 41 4c 4c 20  using UNION ALL 
19a60 6f 70 65 72 61 74 6f 72 73 2e 20 49 6e 20 74 68  operators. In th
19a70 69 73 20 63 61 73 65 20 4e 20 69 73 20 74 68 65  is case N is the
19a80 20 6e 75 6d 62 65 72 20 6f 66 20 73 69 6d 70 6c   number of simpl
19a90 65 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20 73 74  e.  ** select st
19aa0 61 74 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20  atements in the 
19ab0 63 6f 6d 70 6f 75 6e 64 20 73 75 62 2d 71 75 65  compound sub-que
19ac0 72 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78  ry..  **.  ** Ex
19ad0 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  ample:.  **.  **
19ae0 20 20 20 20 20 53 45 4c 45 43 54 20 61 2b 31 20       SELECT a+1 
19af0 46 52 4f 4d 20 28 0a 20 20 2a 2a 20 20 20 20 20  FROM (.  **     
19b00 20 20 20 53 45 4c 45 43 54 20 78 20 46 52 4f 4d     SELECT x FROM
19b10 20 74 61 62 0a 20 20 2a 2a 20 20 20 20 20 20 20   tab.  **       
19b20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20   UNION ALL.  ** 
19b30 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 79 20         SELECT y 
19b40 46 52 4f 4d 20 74 61 62 0a 20 20 2a 2a 20 20 20  FROM tab.  **   
19b50 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20       UNION ALL. 
19b60 20 2a 2a 20 20 20 20 20 20 20 20 53 45 4c 45 43   **        SELEC
19b70 54 20 61 62 73 28 7a 2a 32 29 20 46 52 4f 4d 20  T abs(z*2) FROM 
19b80 74 61 62 32 0a 20 20 2a 2a 20 20 20 20 20 29 20  tab2.  **     ) 
19b90 57 48 45 52 45 20 61 21 3d 35 20 4f 52 44 45 52  WHERE a!=5 ORDER
19ba0 20 42 59 20 31 0a 20 20 2a 2a 0a 20 20 2a 2a 20   BY 1.  **.  ** 
19bb0 54 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f  Transformed into
19bc0 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
19bd0 53 45 4c 45 43 54 20 78 2b 31 20 46 52 4f 4d 20  SELECT x+1 FROM 
19be0 74 61 62 20 57 48 45 52 45 20 78 2b 31 21 3d 35  tab WHERE x+1!=5
19bf0 0a 20 20 2a 2a 20 20 20 20 20 55 4e 49 4f 4e 20  .  **     UNION 
19c00 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c  ALL.  **     SEL
19c10 45 43 54 20 79 2b 31 20 46 52 4f 4d 20 74 61 62  ECT y+1 FROM tab
19c20 20 57 48 45 52 45 20 79 2b 31 21 3d 35 0a 20 20   WHERE y+1!=5.  
19c30 2a 2a 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c  **     UNION ALL
19c40 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  .  **     SELECT
19c50 20 61 62 73 28 7a 2a 32 29 2b 31 20 46 52 4f 4d   abs(z*2)+1 FROM
19c60 20 74 61 62 32 20 57 48 45 52 45 20 61 62 73 28   tab2 WHERE abs(
19c70 7a 2a 32 29 2b 31 21 3d 35 0a 20 20 2a 2a 20 20  z*2)+1!=5.  **  
19c80 20 20 20 4f 52 44 45 52 20 42 59 20 31 0a 20 20     ORDER BY 1.  
19c90 2a 2a 0a 20 20 2a 2a 20 57 65 20 63 61 6c 6c 20  **.  ** We call 
19ca0 74 68 69 73 20 74 68 65 20 22 63 6f 6d 70 6f 75  this the "compou
19cb0 6e 64 2d 73 75 62 71 75 65 72 79 20 66 6c 61 74  nd-subquery flat
19cc0 74 65 6e 69 6e 67 22 2e 0a 20 20 2a 2f 0a 20 20  tening"..  */.  
19cd0 66 6f 72 28 70 53 75 62 3d 70 53 75 62 2d 3e 70  for(pSub=pSub->p
19ce0 50 72 69 6f 72 3b 20 70 53 75 62 3b 20 70 53 75  Prior; pSub; pSu
19cf0 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72 29 7b  b=pSub->pPrior){
19d00 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 4e 65  .    Select *pNe
19d10 77 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20  w;.    ExprList 
19d20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70  *pOrderBy = p->p
19d30 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 45 78 70  OrderBy;.    Exp
19d40 72 20 2a 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70  r *pLimit = p->p
19d50 4c 69 6d 69 74 3b 0a 20 20 20 20 53 65 6c 65 63  Limit;.    Selec
19d60 74 20 2a 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70  t *pPrior = p->p
19d70 50 72 69 6f 72 3b 0a 20 20 20 20 70 2d 3e 70 4f  Prior;.    p->pO
19d80 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20  rderBy = 0;.    
19d90 70 2d 3e 70 53 72 63 20 3d 20 30 3b 0a 20 20 20  p->pSrc = 0;.   
19da0 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a   p->pPrior = 0;.
19db0 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20      p->pLimit = 
19dc0 30 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71  0;.    pNew = sq
19dd0 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64  lite3SelectDup(d
19de0 62 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20 70 2d  b, p, 0);.    p-
19df0 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74  >pLimit = pLimit
19e00 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42  ;.    p->pOrderB
19e10 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20  y = pOrderBy;.  
19e20 20 20 70 2d 3e 70 53 72 63 20 3d 20 70 53 72 63    p->pSrc = pSrc
19e30 3b 0a 20 20 20 20 70 2d 3e 6f 70 20 3d 20 54 4b  ;.    p->op = TK
19e40 5f 41 4c 4c 3b 0a 20 20 20 20 70 2d 3e 70 52 69  _ALL;.    p->pRi
19e50 67 68 74 6d 6f 73 74 20 3d 20 30 3b 0a 20 20 20  ghtmost = 0;.   
19e60 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a   if( pNew==0 ){.
19e70 20 20 20 20 20 20 70 4e 65 77 20 3d 20 70 50 72        pNew = pPr
19e80 69 6f 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ior;.    }else{.
19e90 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 50 72 69        pNew->pPri
19ea0 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20  or = pPrior;.   
19eb0 20 20 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 6d     pNew->pRightm
19ec0 6f 73 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ost = 0;.    }. 
19ed0 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70     p->pPrior = p
19ee0 4e 65 77 3b 0a 20 20 20 20 69 66 28 20 64 62 2d  New;.    if( db-
19ef0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
19f00 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20  return 1;.  }.. 
19f10 20 2f 2a 20 42 65 67 69 6e 20 66 6c 61 74 74 65   /* Begin flatte
19f20 6e 69 6e 67 20 74 68 65 20 69 46 72 6f 6d 2d 74  ning the iFrom-t
19f30 68 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20 46  h entry of the F
19f40 52 4f 4d 20 63 6c 61 75 73 65 20 0a 20 20 2a 2a  ROM clause .  **
19f50 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75   in the outer qu
19f60 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 70 53 75 62  ery..  */.  pSub
19f70 20 3d 20 70 53 75 62 31 20 3d 20 70 53 75 62 69   = pSub1 = pSubi
19f80 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 0a 20  tem->pSelect;.. 
19f90 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20 74   /* Delete the t
19fa0 72 61 6e 73 69 65 6e 74 20 74 61 62 6c 65 20 73  ransient table s
19fb0 74 72 75 63 74 75 72 65 20 61 73 73 6f 63 69 61  tructure associa
19fc0 74 65 64 20 77 69 74 68 20 74 68 65 0a 20 20 2a  ted with the.  *
19fd0 2a 20 73 75 62 71 75 65 72 79 0a 20 20 2a 2f 0a  * subquery.  */.
19fe0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
19ff0 64 62 2c 20 70 53 75 62 69 74 65 6d 2d 3e 7a 44  db, pSubitem->zD
1a000 61 74 61 62 61 73 65 29 3b 0a 20 20 73 71 6c 69  atabase);.  sqli
1a010 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 53  te3DbFree(db, pS
1a020 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a  ubitem->zName);.
1a030 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
1a040 64 62 2c 20 70 53 75 62 69 74 65 6d 2d 3e 7a 41  db, pSubitem->zA
1a050 6c 69 61 73 29 3b 0a 20 20 70 53 75 62 69 74 65  lias);.  pSubite
1a060 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d 20 30  m->zDatabase = 0
1a070 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e  ;.  pSubitem->zN
1a080 61 6d 65 20 3d 20 30 3b 0a 20 20 70 53 75 62 69  ame = 0;.  pSubi
1a090 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 30 3b  tem->zAlias = 0;
1a0a0 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e 70 53 65  .  pSubitem->pSe
1a0b0 6c 65 63 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  lect = 0;..  /* 
1a0c0 44 65 66 65 72 20 64 65 6c 65 74 69 6e 67 20 74  Defer deleting t
1a0d0 68 65 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 20  he Table object 
1a0e0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
1a0f0 74 68 65 0a 20 20 2a 2a 20 73 75 62 71 75 65 72  the.  ** subquer
1a100 79 20 75 6e 74 69 6c 20 63 6f 64 65 20 67 65 6e  y until code gen
1a110 65 72 61 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20  eration is.  ** 
1a120 63 6f 6d 70 6c 65 74 65 2c 20 73 69 6e 63 65 20  complete, since 
1a130 74 68 65 72 65 20 6d 61 79 20 73 74 69 6c 6c 20  there may still 
1a140 65 78 69 73 74 20 45 78 70 72 2e 70 54 61 62 20  exist Expr.pTab 
1a150 65 6e 74 72 69 65 73 20 74 68 61 74 0a 20 20 2a  entries that.  *
1a160 2a 20 72 65 66 65 72 20 74 6f 20 74 68 65 20 73  * refer to the s
1a170 75 62 71 75 65 72 79 20 65 76 65 6e 20 61 66 74  ubquery even aft
1a180 65 72 20 66 6c 61 74 74 65 6e 69 6e 67 2e 20 20  er flattening.  
1a190 54 69 63 6b 65 74 20 23 33 33 34 36 2e 0a 20 20  Ticket #3346..  
1a1a0 2a 2a 0a 20 20 2a 2a 20 70 53 75 62 69 74 65 6d  **.  ** pSubitem
1a1b0 2d 3e 70 54 61 62 20 69 73 20 61 6c 77 61 79 73  ->pTab is always
1a1c0 20 6e 6f 6e 2d 4e 55 4c 4c 20 62 79 20 74 65 73   non-NULL by tes
1a1d0 74 20 72 65 73 74 72 69 63 74 69 6f 6e 73 20 61  t restrictions a
1a1e0 6e 64 20 74 65 73 74 73 20 61 62 6f 76 65 2e 0a  nd tests above..
1a1f0 20 20 2a 2f 0a 20 20 69 66 28 20 41 4c 57 41 59    */.  if( ALWAY
1a200 53 28 70 53 75 62 69 74 65 6d 2d 3e 70 54 61 62  S(pSubitem->pTab
1a210 21 3d 30 29 20 29 7b 0a 20 20 20 20 54 61 62 6c  !=0) ){.    Tabl
1a220 65 20 2a 70 54 61 62 54 6f 44 65 6c 20 3d 20 70  e *pTabToDel = p
1a230 53 75 62 69 74 65 6d 2d 3e 70 54 61 62 3b 0a 20  Subitem->pTab;. 
1a240 20 20 20 69 66 28 20 70 54 61 62 54 6f 44 65 6c     if( pTabToDel
1a250 2d 3e 6e 52 65 66 3d 3d 31 20 29 7b 0a 20 20 20  ->nRef==1 ){.   
1a260 20 20 20 50 61 72 73 65 20 2a 70 54 6f 70 6c 65     Parse *pTople
1a270 76 65 6c 20 3d 20 73 71 6c 69 74 65 33 50 61 72  vel = sqlite3Par
1a280 73 65 54 6f 70 6c 65 76 65 6c 28 70 50 61 72 73  seToplevel(pPars
1a290 65 29 3b 0a 20 20 20 20 20 20 70 54 61 62 54 6f  e);.      pTabTo
1a2a0 44 65 6c 2d 3e 70 4e 65 78 74 5a 6f 6d 62 69 65  Del->pNextZombie
1a2b0 20 3d 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 70 5a   = pToplevel->pZ
1a2c0 6f 6d 62 69 65 54 61 62 3b 0a 20 20 20 20 20 20  ombieTab;.      
1a2d0 70 54 6f 70 6c 65 76 65 6c 2d 3e 70 5a 6f 6d 62  pToplevel->pZomb
1a2e0 69 65 54 61 62 20 3d 20 70 54 61 62 54 6f 44 65  ieTab = pTabToDe
1a2f0 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  l;.    }else{.  
1a300 20 20 20 20 70 54 61 62 54 6f 44 65 6c 2d 3e 6e      pTabToDel->n
1a310 52 65 66 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20  Ref--;.    }.   
1a320 20 70 53 75 62 69 74 65 6d 2d 3e 70 54 61 62 20   pSubitem->pTab 
1a330 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  = 0;.  }..  /* T
1a340 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6c 6f 6f  he following loo
1a350 70 20 72 75 6e 73 20 6f 6e 63 65 20 66 6f 72 20  p runs once for 
1a360 65 61 63 68 20 74 65 72 6d 20 69 6e 20 61 20 63  each term in a c
1a370 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65 72 79  ompound-subquery
1a380 0a 20 20 2a 2a 20 66 6c 61 74 74 65 6e 69 6e 67  .  ** flattening
1a390 20 28 61 73 20 64 65 73 63 72 69 62 65 64 20 61   (as described a
1a3a0 62 6f 76 65 29 2e 20 20 49 66 20 77 65 20 61 72  bove).  If we ar
1a3b0 65 20 64 6f 69 6e 67 20 61 20 64 69 66 66 65 72  e doing a differ
1a3c0 65 6e 74 20 6b 69 6e 64 0a 20 20 2a 2a 20 6f 66  ent kind.  ** of
1a3d0 20 66 6c 61 74 74 65 6e 69 6e 67 20 2d 20 61 20   flattening - a 
1a3e0 66 6c 61 74 74 65 6e 69 6e 67 20 6f 74 68 65 72  flattening other
1a3f0 20 74 68 61 6e 20 61 20 63 6f 6d 70 6f 75 6e 64   than a compound
1a400 2d 73 75 62 71 75 65 72 79 20 66 6c 61 74 74 65  -subquery flatte
1a410 6e 69 6e 67 20 2d 0a 20 20 2a 2a 20 74 68 65 6e  ning -.  ** then
1a420 20 74 68 69 73 20 6c 6f 6f 70 20 6f 6e 6c 79 20   this loop only 
1a430 72 75 6e 73 20 6f 6e 63 65 2e 0a 20 20 2a 2a 0a  runs once..  **.
1a440 20 20 2a 2a 20 54 68 69 73 20 6c 6f 6f 70 20 6d    ** This loop m
1a450 6f 76 65 73 20 61 6c 6c 20 6f 66 20 74 68 65 20  oves all of the 
1a460 46 52 4f 4d 20 65 6c 65 6d 65 6e 74 73 20 6f 66  FROM elements of
1a470 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69 6e   the subquery in
1a480 74 6f 20 74 68 65 0a 20 20 2a 2a 20 74 68 65 20  to the.  ** the 
1a490 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74  FROM clause of t
1a4a0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 20  he outer query. 
1a4b0 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 20 74 68   Before doing th
1a4c0 69 73 2c 20 72 65 6d 65 6d 62 65 72 0a 20 20 2a  is, remember.  *
1a4d0 2a 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d  * the cursor num
1a4e0 62 65 72 20 66 6f 72 20 74 68 65 20 6f 72 69 67  ber for the orig
1a4f0 69 6e 61 6c 20 6f 75 74 65 72 20 71 75 65 72 79  inal outer query
1a500 20 46 52 4f 4d 20 65 6c 65 6d 65 6e 74 20 69 6e   FROM element in
1a510 0a 20 20 2a 2a 20 69 50 61 72 65 6e 74 2e 20 20  .  ** iParent.  
1a520 54 68 65 20 69 50 61 72 65 6e 74 20 63 75 72 73  The iParent curs
1a530 6f 72 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65  or will never be
1a540 20 75 73 65 64 2e 20 20 53 75 62 73 65 71 75 65   used.  Subseque
1a550 6e 74 20 63 6f 64 65 0a 20 20 2a 2a 20 77 69 6c  nt code.  ** wil
1a560 6c 20 73 63 61 6e 20 65 78 70 72 65 73 73 69 6f  l scan expressio
1a570 6e 73 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 69  ns looking for i
1a580 50 61 72 65 6e 74 20 72 65 66 65 72 65 6e 63 65  Parent reference
1a590 73 20 61 6e 64 20 72 65 70 6c 61 63 65 0a 20 20  s and replace.  
1a5a0 2a 2a 20 74 68 6f 73 65 20 72 65 66 65 72 65 6e  ** those referen
1a5b0 63 65 73 20 77 69 74 68 20 65 78 70 72 65 73 73  ces with express
1a5c0 69 6f 6e 73 20 74 68 61 74 20 72 65 73 6f 6c 76  ions that resolv
1a5d0 65 20 74 6f 20 74 68 65 20 73 75 62 71 75 65 72  e to the subquer
1a5e0 79 20 46 52 4f 4d 0a 20 20 2a 2a 20 65 6c 65 6d  y FROM.  ** elem
1a5f0 65 6e 74 73 20 77 65 20 61 72 65 20 6e 6f 77 20  ents we are now 
1a600 63 6f 70 79 69 6e 67 20 69 6e 2e 0a 20 20 2a 2f  copying in..  */
1a610 0a 20 20 66 6f 72 28 70 50 61 72 65 6e 74 3d 70  .  for(pParent=p
1a620 3b 20 70 50 61 72 65 6e 74 3b 20 70 50 61 72 65  ; pParent; pPare
1a630 6e 74 3d 70 50 61 72 65 6e 74 2d 3e 70 50 72 69  nt=pParent->pPri
1a640 6f 72 2c 20 70 53 75 62 3d 70 53 75 62 2d 3e 70  or, pSub=pSub->p
1a650 50 72 69 6f 72 29 7b 0a 20 20 20 20 69 6e 74 20  Prior){.    int 
1a660 6e 53 75 62 53 72 63 3b 0a 20 20 20 20 75 38 20  nSubSrc;.    u8 
1a670 6a 6f 69 6e 74 79 70 65 20 3d 20 30 3b 0a 20 20  jointype = 0;.  
1a680 20 20 70 53 75 62 53 72 63 20 3d 20 70 53 75 62    pSubSrc = pSub
1a690 2d 3e 70 53 72 63 3b 20 20 20 20 20 2f 2a 20 46  ->pSrc;     /* F
1a6a0 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 73 75  ROM clause of su
1a6b0 62 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 6e 53  bquery */.    nS
1a6c0 75 62 53 72 63 20 3d 20 70 53 75 62 53 72 63 2d  ubSrc = pSubSrc-
1a6d0 3e 6e 53 72 63 3b 20 20 2f 2a 20 4e 75 6d 62 65  >nSrc;  /* Numbe
1a6e0 72 20 6f 66 20 74 65 72 6d 73 20 69 6e 20 73 75  r of terms in su
1a6f0 62 71 75 65 72 79 20 46 52 4f 4d 20 63 6c 61 75  bquery FROM clau
1a700 73 65 20 2a 2f 0a 20 20 20 20 70 53 72 63 20 3d  se */.    pSrc =
1a710 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 3b 20   pParent->pSrc; 
1a720 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75      /* FROM clau
1a730 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20  se of the outer 
1a740 71 75 65 72 79 20 2a 2f 0a 0a 20 20 20 20 69 66  query */..    if
1a750 28 20 70 53 72 63 20 29 7b 0a 20 20 20 20 20 20  ( pSrc ){.      
1a760 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 3d  assert( pParent=
1a770 3d 70 20 29 3b 20 20 2f 2a 20 46 69 72 73 74 20  =p );  /* First 
1a780 74 69 6d 65 20 74 68 72 6f 75 67 68 20 74 68 65  time through the
1a790 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20 6a   loop */.      j
1a7a0 6f 69 6e 74 79 70 65 20 3d 20 70 53 75 62 69 74  ointype = pSubit
1a7b0 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20  em->jointype;.  
1a7c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
1a7d0 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 21 3d  ssert( pParent!=
1a7e0 70 20 29 3b 20 20 2f 2a 20 32 6e 64 20 61 6e 64  p );  /* 2nd and
1a7f0 20 73 75 62 73 65 71 75 65 6e 74 20 74 69 6d 65   subsequent time
1a800 73 20 74 68 72 6f 75 67 68 20 74 68 65 20 6c 6f  s through the lo
1a810 6f 70 20 2a 2f 0a 20 20 20 20 20 20 70 53 72 63  op */.      pSrc
1a820 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63   = pParent->pSrc
1a830 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73   = sqlite3SrcLis
1a840 74 41 70 70 65 6e 64 28 64 62 2c 20 30 2c 20 30  tAppend(db, 0, 0
1a850 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
1a860 70 53 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pSrc==0 ){.     
1a870 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d     assert( db->m
1a880 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
1a890 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1a8a0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
1a8b0 20 2f 2a 20 54 68 65 20 73 75 62 71 75 65 72 79   /* The subquery
1a8c0 20 75 73 65 73 20 61 20 73 69 6e 67 6c 65 20 73   uses a single s
1a8d0 6c 6f 74 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  lot of the FROM 
1a8e0 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75  clause of the ou
1a8f0 74 65 72 0a 20 20 20 20 2a 2a 20 71 75 65 72 79  ter.    ** query
1a900 2e 20 20 49 66 20 74 68 65 20 73 75 62 71 75 65  .  If the subque
1a910 72 79 20 68 61 73 20 6d 6f 72 65 20 74 68 61 6e  ry has more than
1a920 20 6f 6e 65 20 65 6c 65 6d 65 6e 74 20 69 6e 20   one element in 
1a930 69 74 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c  its FROM clause,
1a940 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 65 78 70  .    ** then exp
1a950 61 6e 64 20 74 68 65 20 6f 75 74 65 72 20 71 75  and the outer qu
1a960 65 72 79 20 74 6f 20 6d 61 6b 65 20 73 70 61 63  ery to make spac
1a970 65 20 66 6f 72 20 69 74 20 74 6f 20 68 6f 6c 64  e for it to hold
1a980 20 61 6c 6c 20 65 6c 65 6d 65 6e 74 73 0a 20 20   all elements.  
1a990 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 75 62 71    ** of the subq
1a9a0 75 65 72 79 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  uery..    **.   
1a9b0 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20 20   ** Example:.   
1a9c0 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 53 45   **.    **    SE
1a9d0 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 61 62 41  LECT * FROM tabA
1a9e0 2c 20 28 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  , (SELECT * FROM
1a9f0 20 73 75 62 31 2c 20 73 75 62 32 29 2c 20 74 61   sub1, sub2), ta
1aa00 62 42 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  bB;.    **.    *
1aa10 2a 20 54 68 65 20 6f 75 74 65 72 20 71 75 65 72  * The outer quer
1aa20 79 20 68 61 73 20 33 20 73 6c 6f 74 73 20 69 6e  y has 3 slots in
1aa30 20 69 74 73 20 46 52 4f 4d 20 63 6c 61 75 73 65   its FROM clause
1aa40 2e 20 20 4f 6e 65 20 73 6c 6f 74 20 6f 66 20 74  .  One slot of t
1aa50 68 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72 20  he.    ** outer 
1aa60 71 75 65 72 79 20 28 74 68 65 20 6d 69 64 64 6c  query (the middl
1aa70 65 20 73 6c 6f 74 29 20 69 73 20 75 73 65 64 20  e slot) is used 
1aa80 62 79 20 74 68 65 20 73 75 62 71 75 65 72 79 2e  by the subquery.
1aa90 20 20 54 68 65 20 6e 65 78 74 0a 20 20 20 20 2a    The next.    *
1aaa0 2a 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20  * block of code 
1aab0 77 69 6c 6c 20 65 78 70 61 6e 64 20 74 68 65 20  will expand the 
1aac0 6f 75 74 20 71 75 65 72 79 20 74 6f 20 34 20 73  out query to 4 s
1aad0 6c 6f 74 73 2e 20 20 54 68 65 20 6d 69 64 64 6c  lots.  The middl
1aae0 65 0a 20 20 20 20 2a 2a 20 73 6c 6f 74 20 69 73  e.    ** slot is
1aaf0 20 65 78 70 61 6e 64 65 64 20 74 6f 20 74 77 6f   expanded to two
1ab00 20 73 6c 6f 74 73 20 69 6e 20 6f 72 64 65 72 20   slots in order 
1ab10 74 6f 20 6d 61 6b 65 20 73 70 61 63 65 20 66 6f  to make space fo
1ab20 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 77 6f  r the.    ** two
1ab30 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65   elements in the
1ab40 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
1ab50 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a 20 20  the subquery..  
1ab60 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 53 75    */.    if( nSu
1ab70 62 53 72 63 3e 31 20 29 7b 0a 20 20 20 20 20 20  bSrc>1 ){.      
1ab80 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 20 3d 20  pParent->pSrc = 
1ab90 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53 72  pSrc = sqlite3Sr
1aba0 63 4c 69 73 74 45 6e 6c 61 72 67 65 28 64 62 2c  cListEnlarge(db,
1abb0 20 70 53 72 63 2c 20 6e 53 75 62 53 72 63 2d 31   pSrc, nSubSrc-1
1abc0 2c 69 46 72 6f 6d 2b 31 29 3b 0a 20 20 20 20 20  ,iFrom+1);.     
1abd0 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
1abe0 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20  ailed ){.       
1abf0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
1ac00 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 72      }..    /* Tr
1ac10 61 6e 73 66 65 72 20 74 68 65 20 46 52 4f 4d 20  ansfer the FROM 
1ac20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 66 72 6f  clause terms fro
1ac30 6d 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69  m the subquery i
1ac40 6e 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f  nto the.    ** o
1ac50 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20 20 20  uter query..    
1ac60 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  */.    for(i=0; 
1ac70 69 3c 6e 53 75 62 53 72 63 3b 20 69 2b 2b 29 7b  i<nSubSrc; i++){
1ac80 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 49 64  .      sqlite3Id
1ac90 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
1aca0 53 72 63 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 2e  Src->a[i+iFrom].
1acb0 70 55 73 69 6e 67 29 3b 0a 20 20 20 20 20 20 70  pUsing);.      p
1acc0 53 72 63 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 20  Src->a[i+iFrom] 
1acd0 3d 20 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 3b  = pSubSrc->a[i];
1ace0 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 70  .      memset(&p
1acf0 53 75 62 53 72 63 2d 3e 61 5b 69 5d 2c 20 30 2c  SubSrc->a[i], 0,
1ad00 20 73 69 7a 65 6f 66 28 70 53 75 62 53 72 63 2d   sizeof(pSubSrc-
1ad10 3e 61 5b 69 5d 29 29 3b 0a 20 20 20 20 7d 0a 20  >a[i]));.    }. 
1ad20 20 20 20 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d     pSrc->a[iFrom
1ad30 5d 2e 6a 6f 69 6e 74 79 70 65 20 3d 20 6a 6f 69  ].jointype = joi
1ad40 6e 74 79 70 65 3b 0a 20 20 0a 20 20 20 20 2f 2a  ntype;.  .    /*
1ad50 20 4e 6f 77 20 62 65 67 69 6e 20 73 75 62 73 74   Now begin subst
1ad60 69 74 75 74 69 6e 67 20 73 75 62 71 75 65 72 79  ituting subquery
1ad70 20 72 65 73 75 6c 74 20 73 65 74 20 65 78 70 72   result set expr
1ad80 65 73 73 69 6f 6e 73 20 66 6f 72 20 0a 20 20 20  essions for .   
1ad90 20 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 20 74   ** references t
1ada0 6f 20 74 68 65 20 69 50 61 72 65 6e 74 20 69 6e  o the iParent in
1adb0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1adc0 2e 0a 20 20 20 20 2a 2a 20 0a 20 20 20 20 2a 2a  ..    ** .    **
1add0 20 45 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a   Example:.    **
1ade0 0a 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54  .    **   SELECT
1adf0 20 61 2b 35 2c 20 62 2a 31 30 20 46 52 4f 4d 20   a+5, b*10 FROM 
1ae00 28 53 45 4c 45 43 54 20 78 2a 33 20 41 53 20 61  (SELECT x*3 AS a
1ae10 2c 20 79 2b 31 30 20 41 53 20 62 20 46 52 4f 4d  , y+10 AS b FROM
1ae20 20 74 31 29 20 57 48 45 52 45 20 61 3e 62 3b 0a   t1) WHERE a>b;.
1ae30 20 20 20 20 2a 2a 20 20 20 5c 20 20 20 20 20 20      **   \      
1ae40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
1ae50 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 73 75  _____________ su
1ae60 62 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f  bquery _________
1ae70 5f 2f 20 20 20 20 20 20 20 20 20 20 2f 0a 20 20  _/          /.  
1ae80 20 20 2a 2a 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f    **    \_______
1ae90 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f  ______________ o
1aea0 75 74 65 72 20 71 75 65 72 79 20 5f 5f 5f 5f 5f  uter query _____
1aeb0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
1aec0 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 20 20 20 20 2a  _________/.    *
1aed0 2a 0a 20 20 20 20 2a 2a 20 57 65 20 6c 6f 6f 6b  *.    ** We look
1aee0 20 61 74 20 65 76 65 72 79 20 65 78 70 72 65 73   at every expres
1aef0 73 69 6f 6e 20 69 6e 20 74 68 65 20 6f 75 74 65  sion in the oute
1af00 72 20 71 75 65 72 79 20 61 6e 64 20 65 76 65 72  r query and ever
1af10 79 20 70 6c 61 63 65 20 77 65 20 73 65 65 0a 20  y place we see. 
1af20 20 20 20 2a 2a 20 22 61 22 20 77 65 20 73 75 62     ** "a" we sub
1af30 73 74 69 74 75 74 65 20 22 78 2a 33 22 20 61 6e  stitute "x*3" an
1af40 64 20 65 76 65 72 79 20 70 6c 61 63 65 20 77 65  d every place we
1af50 20 73 65 65 20 22 62 22 20 77 65 20 73 75 62 73   see "b" we subs
1af60 74 69 74 75 74 65 20 22 79 2b 31 30 22 2e 0a 20  titute "y+10".. 
1af70 20 20 20 2a 2f 0a 20 20 20 20 70 4c 69 73 74 20     */.    pList 
1af80 3d 20 70 50 61 72 65 6e 74 2d 3e 70 45 4c 69 73  = pParent->pELis
1af90 74 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  t;.    for(i=0; 
1afa0 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  i<pList->nExpr; 
1afb0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
1afc0 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  pList->a[i].zNam
1afd0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
1afe0 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 73 71  char *zName = sq
1aff0 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
1b000 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53  , pList->a[i].zS
1b010 70 61 6e 29 3b 0a 20 20 20 20 20 20 20 20 73 71  pan);.        sq
1b020 6c 69 74 65 33 44 65 71 75 6f 74 65 28 7a 4e 61  lite3Dequote(zNa
1b030 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 69  me);.        pLi
1b040 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d  st->a[i].zName =
1b050 20 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 7d 0a   zName;.      }.
1b060 20 20 20 20 7d 0a 20 20 20 20 73 75 62 73 74 45      }.    substE
1b070 78 70 72 4c 69 73 74 28 64 62 2c 20 70 50 61 72  xprList(db, pPar
1b080 65 6e 74 2d 3e 70 45 4c 69 73 74 2c 20 69 50 61  ent->pEList, iPa
1b090 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69  rent, pSub->pELi
1b0a0 73 74 29 3b 0a 20 20 20 20 69 66 28 20 69 73 41  st);.    if( isA
1b0b0 67 67 20 29 7b 0a 20 20 20 20 20 20 73 75 62 73  gg ){.      subs
1b0c0 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70 50  tExprList(db, pP
1b0d0 61 72 65 6e 74 2d 3e 70 47 72 6f 75 70 42 79 2c  arent->pGroupBy,
1b0e0 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e   iParent, pSub->
1b0f0 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 70  pEList);.      p
1b100 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 20  Parent->pHaving 
1b110 3d 20 73 75 62 73 74 45 78 70 72 28 64 62 2c 20  = substExpr(db, 
1b120 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67  pParent->pHaving
1b130 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d  , iParent, pSub-
1b140 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a  >pEList);.    }.
1b150 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4f      if( pSub->pO
1b160 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
1b170 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d  assert( pParent-
1b180 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a  >pOrderBy==0 );.
1b190 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70        pParent->p
1b1a0 4f 72 64 65 72 42 79 20 3d 20 70 53 75 62 2d 3e  OrderBy = pSub->
1b1b0 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 20 20  pOrderBy;.      
1b1c0 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 3d  pSub->pOrderBy =
1b1d0 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   0;.    }else if
1b1e0 28 20 70 50 61 72 65 6e 74 2d 3e 70 4f 72 64 65  ( pParent->pOrde
1b1f0 72 42 79 20 29 7b 0a 20 20 20 20 20 20 73 75 62  rBy ){.      sub
1b200 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70  stExprList(db, p
1b210 50 61 72 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79  Parent->pOrderBy
1b220 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d  , iParent, pSub-
1b230 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a  >pEList);.    }.
1b240 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70 57      if( pSub->pW
1b250 68 65 72 65 20 29 7b 0a 20 20 20 20 20 20 70 57  here ){.      pW
1b260 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78  here = sqlite3Ex
1b270 70 72 44 75 70 28 64 62 2c 20 70 53 75 62 2d 3e  prDup(db, pSub->
1b280 70 57 68 65 72 65 2c 20 30 29 3b 0a 20 20 20 20  pWhere, 0);.    
1b290 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 57 68  }else{.      pWh
1b2a0 65 72 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ere = 0;.    }. 
1b2b0 20 20 20 69 66 28 20 73 75 62 71 75 65 72 79 49     if( subqueryI
1b2c0 73 41 67 67 20 29 7b 0a 20 20 20 20 20 20 61 73  sAgg ){.      as
1b2d0 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 70  sert( pParent->p
1b2e0 48 61 76 69 6e 67 3d 3d 30 20 29 3b 0a 20 20 20  Having==0 );.   
1b2f0 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76     pParent->pHav
1b300 69 6e 67 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70  ing = pParent->p
1b310 57 68 65 72 65 3b 0a 20 20 20 20 20 20 70 50 61  Where;.      pPa
1b320 72 65 6e 74 2d 3e 70 57 68 65 72 65 20 3d 20 70  rent->pWhere = p
1b330 57 68 65 72 65 3b 0a 20 20 20 20 20 20 70 50 61  Where;.      pPa
1b340 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 20 3d 20  rent->pHaving = 
1b350 73 75 62 73 74 45 78 70 72 28 64 62 2c 20 70 50  substExpr(db, pP
1b360 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 2c 20  arent->pHaving, 
1b370 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70  iParent, pSub->p
1b380 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 70 50  EList);.      pP
1b390 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 20 3d  arent->pHaving =
1b3a0 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28   sqlite3ExprAnd(
1b3b0 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 48 61  db, pParent->pHa
1b3c0 76 69 6e 67 2c 20 0a 20 20 20 20 20 20 20 20 20  ving, .         
1b3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b3e0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1b3f0 45 78 70 72 44 75 70 28 64 62 2c 20 70 53 75 62  ExprDup(db, pSub
1b400 2d 3e 70 48 61 76 69 6e 67 2c 20 30 29 29 3b 0a  ->pHaving, 0));.
1b410 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
1b420 61 72 65 6e 74 2d 3e 70 47 72 6f 75 70 42 79 3d  arent->pGroupBy=
1b430 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50 61 72  =0 );.      pPar
1b440 65 6e 74 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20  ent->pGroupBy = 
1b450 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
1b460 75 70 28 64 62 2c 20 70 53 75 62 2d 3e 70 47 72  up(db, pSub->pGr
1b470 6f 75 70 42 79 2c 20 30 29 3b 0a 20 20 20 20 7d  oupBy, 0);.    }
1b480 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 61 72  else{.      pPar
1b490 65 6e 74 2d 3e 70 57 68 65 72 65 20 3d 20 73 75  ent->pWhere = su
1b4a0 62 73 74 45 78 70 72 28 64 62 2c 20 70 50 61 72  bstExpr(db, pPar
1b4b0 65 6e 74 2d 3e 70 57 68 65 72 65 2c 20 69 50 61  ent->pWhere, iPa
1b4c0 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69  rent, pSub->pELi
1b4d0 73 74 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65  st);.      pPare
1b4e0 6e 74 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c  nt->pWhere = sql
1b4f0 69 74 65 33 45 78 70 72 41 6e 64 28 64 62 2c 20  ite3ExprAnd(db, 
1b500 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 2c  pParent->pWhere,
1b510 20 70 57 68 65 72 65 29 3b 0a 20 20 20 20 7d 0a   pWhere);.    }.
1b520 20 20 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 6c    .    /* The fl
1b530 61 74 74 65 6e 65 64 20 71 75 65 72 79 20 69 73  attened query is
1b540 20 64 69 73 74 69 6e 63 74 20 69 66 20 65 69 74   distinct if eit
1b550 68 65 72 20 74 68 65 20 69 6e 6e 65 72 20 6f 72  her the inner or
1b560 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65   the.    ** oute
1b570 72 20 71 75 65 72 79 20 69 73 20 64 69 73 74 69  r query is disti
1b580 6e 63 74 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20  nct. .    */.   
1b590 20 70 50 61 72 65 6e 74 2d 3e 73 65 6c 46 6c 61   pParent->selFla
1b5a0 67 73 20 7c 3d 20 70 53 75 62 2d 3e 73 65 6c 46  gs |= pSub->selF
1b5b0 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e  lags & SF_Distin
1b5c0 63 74 3b 0a 20 20 0a 20 20 20 20 2f 2a 0a 20 20  ct;.  .    /*.  
1b5d0 20 20 2a 2a 20 53 45 4c 45 43 54 20 2e 2e 2e 20    ** SELECT ... 
1b5e0 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 2e 2e 2e  FROM (SELECT ...
1b5f0 20 4c 49 4d 49 54 20 61 20 4f 46 46 53 45 54 20   LIMIT a OFFSET 
1b600 62 29 20 4c 49 4d 49 54 20 78 20 4f 46 46 53 45  b) LIMIT x OFFSE
1b610 54 20 79 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20  T y;.    **.    
1b620 2a 2a 20 4f 6e 65 20 69 73 20 74 65 6d 70 74 65  ** One is tempte
1b630 64 20 74 6f 20 74 72 79 20 74 6f 20 61 64 64 20  d to try to add 
1b640 61 20 61 6e 64 20 62 20 74 6f 20 63 6f 6d 62 69  a and b to combi
1b650 6e 65 20 74 68 65 20 6c 69 6d 69 74 73 2e 20 20  ne the limits.  
1b660 42 75 74 20 74 68 69 73 0a 20 20 20 20 2a 2a 20  But this.    ** 
1b670 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 69 66  does not work if
1b680 20 65 69 74 68 65 72 20 6c 69 6d 69 74 20 69 73   either limit is
1b690 20 6e 65 67 61 74 69 76 65 2e 0a 20 20 20 20 2a   negative..    *
1b6a0 2f 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e  /.    if( pSub->
1b6b0 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20  pLimit ){.      
1b6c0 70 50 61 72 65 6e 74 2d 3e 70 4c 69 6d 69 74 20  pParent->pLimit 
1b6d0 3d 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 3b 0a  = pSub->pLimit;.
1b6e0 20 20 20 20 20 20 70 53 75 62 2d 3e 70 4c 69 6d        pSub->pLim
1b6f0 69 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  it = 0;.    }.  
1b700 7d 0a 0a 20 20 2f 2a 20 46 69 6e 69 61 6c 6c 79  }..  /* Finially
1b710 2c 20 64 65 6c 65 74 65 20 77 68 61 74 20 69 73  , delete what is
1b720 20 6c 65 66 74 20 6f 66 20 74 68 65 20 73 75 62   left of the sub
1b730 71 75 65 72 79 20 61 6e 64 20 72 65 74 75 72 6e  query and return
1b740 0a 20 20 2a 2a 20 73 75 63 63 65 73 73 2e 0a 20  .  ** success.. 
1b750 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 53 65 6c   */.  sqlite3Sel
1b760 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53  ectDelete(db, pS
1b770 75 62 31 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  ub1);..  return 
1b780 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21  1;.}.#endif /* !
1b790 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
1b7a0 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c  MIT_SUBQUERY) ||
1b7b0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
1b7c0 5f 4f 4d 49 54 5f 56 49 45 57 29 20 2a 2f 0a 0a  _OMIT_VIEW) */..
1b7d0 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 74 68  /*.** Analyze th
1b7e0 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
1b7f0 6e 74 20 70 61 73 73 65 64 20 61 73 20 61 6e 20  nt passed as an 
1b800 61 72 67 75 6d 65 6e 74 20 74 6f 20 73 65 65 20  argument to see 
1b810 69 66 20 69 74 0a 2a 2a 20 69 73 20 61 20 6d 69  if it.** is a mi
1b820 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 71 75 65  n() or max() que
1b830 72 79 2e 20 52 65 74 75 72 6e 20 57 48 45 52 45  ry. Return WHERE
1b840 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 20 6f 72 20  _ORDERBY_MIN or 
1b850 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 41  WHERE_ORDERBY_MA
1b860 58 20 69 66 20 0a 2a 2a 20 69 74 20 69 73 2c 20  X if .** it is, 
1b870 6f 72 20 30 20 6f 74 68 65 72 77 69 73 65 2e 20  or 0 otherwise. 
1b880 41 74 20 70 72 65 73 65 6e 74 2c 20 61 20 71 75  At present, a qu
1b890 65 72 79 20 69 73 20 63 6f 6e 73 69 64 65 72 65  ery is considere
1b8a0 64 20 74 6f 20 62 65 0a 2a 2a 20 61 20 6d 69 6e  d to be.** a min
1b8b0 28 29 2f 6d 61 78 28 29 20 71 75 65 72 79 20 69  ()/max() query i
1b8c0 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 2e 20 54 68  f:.**.**   1. Th
1b8d0 65 72 65 20 69 73 20 61 20 73 69 6e 67 6c 65 20  ere is a single 
1b8e0 6f 62 6a 65 63 74 20 69 6e 20 74 68 65 20 46 52  object in the FR
1b8f0 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a  OM clause..**.**
1b900 20 20 20 32 2e 20 54 68 65 72 65 20 69 73 20 61     2. There is a
1b910 20 73 69 6e 67 6c 65 20 65 78 70 72 65 73 73 69   single expressi
1b920 6f 6e 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  on in the result
1b930 20 73 65 74 2c 20 61 6e 64 20 69 74 20 69 73 0a   set, and it is.
1b940 2a 2a 20 20 20 20 20 20 65 69 74 68 65 72 20 6d  **      either m
1b950 69 6e 28 78 29 20 6f 72 20 6d 61 78 28 78 29 2c  in(x) or max(x),
1b960 20 77 68 65 72 65 20 78 20 69 73 20 61 20 63 6f   where x is a co
1b970 6c 75 6d 6e 20 72 65 66 65 72 65 6e 63 65 2e 0a  lumn reference..
1b980 2a 2f 0a 73 74 61 74 69 63 20 75 38 20 6d 69 6e  */.static u8 min
1b990 4d 61 78 51 75 65 72 79 28 53 65 6c 65 63 74 20  MaxQuery(Select 
1b9a0 2a 70 29 7b 0a 20 20 45 78 70 72 20 2a 70 45 78  *p){.  Expr *pEx
1b9b0 70 72 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  pr;.  ExprList *
1b9c0 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69  pEList = p->pELi
1b9d0 73 74 3b 0a 0a 20 20 69 66 28 20 70 45 4c 69 73  st;..  if( pELis
1b9e0 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29 20 72 65  t->nExpr!=1 ) re
1b9f0 74 75 72 6e 20 57 48 45 52 45 5f 4f 52 44 45 52  turn WHERE_ORDER
1ba00 42 59 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 70 45 78  BY_NORMAL;.  pEx
1ba10 70 72 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 30  pr = pEList->a[0
1ba20 5d 2e 70 45 78 70 72 3b 0a 20 20 69 66 28 20 70  ].pExpr;.  if( p
1ba30 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47  Expr->op!=TK_AGG
1ba40 5f 46 55 4e 43 54 49 4f 4e 20 29 20 72 65 74 75  _FUNCTION ) retu
1ba50 72 6e 20 30 3b 0a 20 20 69 66 28 20 4e 45 56 45  rn 0;.  if( NEVE
1ba60 52 28 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  R(ExprHasPropert
1ba70 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
1ba80 65 6c 65 63 74 29 29 20 29 20 72 65 74 75 72 6e  elect)) ) return
1ba90 20 30 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70   0;.  pEList = p
1baa0 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20  Expr->x.pList;. 
1bab0 20 69 66 28 20 70 45 4c 69 73 74 3d 3d 30 20 7c   if( pEList==0 |
1bac0 7c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21  | pEList->nExpr!
1bad0 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =1 ) return 0;. 
1bae0 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b 30   if( pEList->a[0
1baf0 5d 2e 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ].pExpr->op!=TK_
1bb00 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 20 72 65 74  AGG_COLUMN ) ret
1bb10 75 72 6e 20 57 48 45 52 45 5f 4f 52 44 45 52 42  urn WHERE_ORDERB
1bb20 59 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 61 73 73 65  Y_NORMAL;.  asse
1bb30 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
1bb40 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49  erty(pExpr, EP_I
1bb50 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 69 66  ntValue) );.  if
1bb60 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
1bb70 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e  (pExpr->u.zToken
1bb80 2c 22 6d 69 6e 22 29 3d 3d 30 20 29 7b 0a 20 20  ,"min")==0 ){.  
1bb90 20 20 72 65 74 75 72 6e 20 57 48 45 52 45 5f 4f    return WHERE_O
1bba0 52 44 45 52 42 59 5f 4d 49 4e 3b 0a 20 20 7d 65  RDERBY_MIN;.  }e
1bbb0 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33 53  lse if( sqlite3S
1bbc0 74 72 49 43 6d 70 28 70 45 78 70 72 2d 3e 75 2e  trICmp(pExpr->u.
1bbd0 7a 54 6f 6b 65 6e 2c 22 6d 61 78 22 29 3d 3d 30  zToken,"max")==0
1bbe0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57   ){.    return W
1bbf0 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 41 58  HERE_ORDERBY_MAX
1bc00 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 57  ;.  }.  return W
1bc10 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52  HERE_ORDERBY_NOR
1bc20 4d 41 4c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  MAL;.}../*.** Th
1bc30 65 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65  e select stateme
1bc40 6e 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65  nt passed as the
1bc50 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
1bc60 69 73 20 61 6e 20 61 67 67 72 65 67 61 74 65 20  is an aggregate 
1bc70 71 75 65 72 79 2e 0a 2a 2a 20 54 68 65 20 73 65  query..** The se
1bc80 63 6f 6e 64 20 61 72 67 6d 65 6e 74 20 69 73 20  cond argment is 
1bc90 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 61  the associated a
1bca0 67 67 72 65 67 61 74 65 2d 69 6e 66 6f 20 6f 62  ggregate-info ob
1bcb0 6a 65 63 74 2e 20 54 68 69 73 20 0a 2a 2a 20 66  ject. This .** f
1bcc0 75 6e 63 74 69 6f 6e 20 74 65 73 74 73 20 69 66  unction tests if
1bcd0 20 74 68 65 20 53 45 4c 45 43 54 20 69 73 20 6f   the SELECT is o
1bce0 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a  f the form:.**.*
1bcf0 2a 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74  *   SELECT count
1bd00 28 2a 29 20 46 52 4f 4d 20 3c 74 62 6c 3e 0a 2a  (*) FROM <tbl>.*
1bd10 2a 0a 2a 2a 20 77 68 65 72 65 20 74 61 62 6c 65  *.** where table
1bd20 20 69 73 20 61 20 64 61 74 61 62 61 73 65 20 74   is a database t
1bd30 61 62 6c 65 2c 20 6e 6f 74 20 61 20 73 75 62 2d  able, not a sub-
1bd40 73 65 6c 65 63 74 20 6f 72 20 76 69 65 77 2e 20  select or view. 
1bd50 49 66 20 74 68 65 20 71 75 65 72 79 0a 2a 2a 20  If the query.** 
1bd60 64 6f 65 73 20 6d 61 74 63 68 20 74 68 69 73 20  does match this 
1bd70 70 61 74 74 65 72 6e 2c 20 74 68 65 6e 20 61 20  pattern, then a 
1bd80 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 54  pointer to the T
1bd90 61 62 6c 65 20 6f 62 6a 65 63 74 20 72 65 70 72  able object repr
1bda0 65 73 65 6e 74 69 6e 67 0a 2a 2a 20 3c 74 62 6c  esenting.** <tbl
1bdb0 3e 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  > is returned. O
1bdc0 74 68 65 72 77 69 73 65 2c 20 30 20 69 73 20 72  therwise, 0 is r
1bdd0 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
1bde0 69 63 20 54 61 62 6c 65 20 2a 69 73 53 69 6d 70  ic Table *isSimp
1bdf0 6c 65 43 6f 75 6e 74 28 53 65 6c 65 63 74 20 2a  leCount(Select *
1be00 70 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67  p, AggInfo *pAgg
1be10 49 6e 66 6f 29 7b 0a 20 20 54 61 62 6c 65 20 2a  Info){.  Table *
1be20 70 54 61 62 3b 0a 20 20 45 78 70 72 20 2a 70 45  pTab;.  Expr *pE
1be30 78 70 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  xpr;..  assert( 
1be40 21 70 2d 3e 70 47 72 6f 75 70 42 79 20 29 3b 0a  !p->pGroupBy );.
1be50 0a 20 20 69 66 28 20 70 2d 3e 70 57 68 65 72 65  .  if( p->pWhere
1be60 20 7c 7c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e   || p->pEList->n
1be70 45 78 70 72 21 3d 31 20 0a 20 20 20 7c 7c 20 70  Expr!=1 .   || p
1be80 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20  ->pSrc->nSrc!=1 
1be90 7c 7c 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d  || p->pSrc->a[0]
1bea0 2e 70 53 65 6c 65 63 74 0a 20 20 29 7b 0a 20 20  .pSelect.  ){.  
1beb0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
1bec0 20 20 70 54 61 62 20 3d 20 70 2d 3e 70 53 72 63    pTab = p->pSrc
1bed0 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 20 20 70  ->a[0].pTab;.  p
1bee0 45 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74  Expr = p->pEList
1bef0 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[0].pExpr;.  
1bf00 61 73 73 65 72 74 28 20 70 54 61 62 20 26 26 20  assert( pTab && 
1bf10 21 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 26  !pTab->pSelect &
1bf20 26 20 70 45 78 70 72 20 29 3b 0a 0a 20 20 69 66  & pExpr );..  if
1bf30 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  ( IsVirtual(pTab
1bf40 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
1bf50 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  if( pExpr->op!=T
1bf60 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29  K_AGG_FUNCTION )
1bf70 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
1bf80 20 4e 45 56 45 52 28 70 41 67 67 49 6e 66 6f 2d   NEVER(pAggInfo-
1bf90 3e 6e 46 75 6e 63 3d 3d 30 29 20 29 20 72 65 74  >nFunc==0) ) ret
1bfa0 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70 41  urn 0;.  if( (pA
1bfb0 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d  ggInfo->aFunc[0]
1bfc0 2e 70 46 75 6e 63 2d 3e 66 6c 61 67 73 26 53 51  .pFunc->flags&SQ
1bfd0 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 55 4e 54 29  LITE_FUNC_COUNT)
1bfe0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
1bff0 20 20 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61    if( pExpr->fla
1c000 67 73 26 45 50 5f 44 69 73 74 69 6e 63 74 20 29  gs&EP_Distinct )
1c010 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 72 65   return 0;..  re
1c020 74 75 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a  turn pTab;.}../*
1c030 0a 2a 2a 20 49 66 20 74 68 65 20 73 6f 75 72 63  .** If the sourc
1c040 65 2d 6c 69 73 74 20 69 74 65 6d 20 70 61 73 73  e-list item pass
1c050 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e  ed as an argumen
1c060 74 20 77 61 73 20 61 75 67 6d 65 6e 74 65 64 20  t was augmented 
1c070 77 69 74 68 20 61 6e 0a 2a 2a 20 49 4e 44 45 58  with an.** INDEX
1c080 45 44 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68  ED BY clause, th
1c090 65 6e 20 74 72 79 20 74 6f 20 6c 6f 63 61 74 65  en try to locate
1c0a0 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 69   the specified i
1c0b0 6e 64 65 78 2e 20 49 66 20 74 68 65 72 65 0a 2a  ndex. If there.*
1c0c0 2a 20 77 61 73 20 73 75 63 68 20 61 20 63 6c 61  * was such a cla
1c0d0 75 73 65 20 61 6e 64 20 74 68 65 20 6e 61 6d 65  use and the name
1c0e0 64 20 69 6e 64 65 78 20 63 61 6e 6e 6f 74 20 62  d index cannot b
1c0f0 65 20 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20  e found, return 
1c100 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  .** SQLITE_ERROR
1c110 20 61 6e 64 20 6c 65 61 76 65 20 61 6e 20 65 72   and leave an er
1c120 72 6f 72 20 69 6e 20 70 50 61 72 73 65 2e 20 4f  ror in pParse. O
1c130 74 68 65 72 77 69 73 65 2c 20 70 6f 70 75 6c 61  therwise, popula
1c140 74 65 20 0a 2a 2a 20 70 46 72 6f 6d 2d 3e 70 49  te .** pFrom->pI
1c150 6e 64 65 78 20 61 6e 64 20 72 65 74 75 72 6e 20  ndex and return 
1c160 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e  SQLITE_OK..*/.in
1c170 74 20 73 71 6c 69 74 65 33 49 6e 64 65 78 65 64  t sqlite3Indexed
1c180 42 79 4c 6f 6f 6b 75 70 28 50 61 72 73 65 20 2a  ByLookup(Parse *
1c190 70 50 61 72 73 65 2c 20 73 74 72 75 63 74 20 53  pParse, struct S
1c1a0 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72  rcList_item *pFr
1c1b0 6f 6d 29 7b 0a 20 20 69 66 28 20 70 46 72 6f 6d  om){.  if( pFrom
1c1c0 2d 3e 70 54 61 62 20 26 26 20 70 46 72 6f 6d 2d  ->pTab && pFrom-
1c1d0 3e 7a 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 54  >zIndex ){.    T
1c1e0 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 46 72  able *pTab = pFr
1c1f0 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 63 68  om->pTab;.    ch
1c200 61 72 20 2a 7a 49 6e 64 65 78 20 3d 20 70 46 72  ar *zIndex = pFr
1c210 6f 6d 2d 3e 7a 49 6e 64 65 78 3b 0a 20 20 20 20  om->zIndex;.    
1c220 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20  Index *pIdx;.   
1c230 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e   for(pIdx=pTab->
1c240 70 49 6e 64 65 78 3b 20 0a 20 20 20 20 20 20 20  pIndex; .       
1c250 20 70 49 64 78 20 26 26 20 73 71 6c 69 74 65 33   pIdx && sqlite3
1c260 53 74 72 49 43 6d 70 28 70 49 64 78 2d 3e 7a 4e  StrICmp(pIdx->zN
1c270 61 6d 65 2c 20 7a 49 6e 64 65 78 29 3b 20 0a 20  ame, zIndex); . 
1c280 20 20 20 20 20 20 20 70 49 64 78 3d 70 49 64 78         pIdx=pIdx
1c290 2d 3e 70 4e 65 78 74 0a 20 20 20 20 29 3b 0a 20  ->pNext.    );. 
1c2a0 20 20 20 69 66 28 20 21 70 49 64 78 20 29 7b 0a     if( !pIdx ){.
1c2b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
1c2c0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e  orMsg(pParse, "n
1c2d0 6f 20 73 75 63 68 20 69 6e 64 65 78 3a 20 25 73  o such index: %s
1c2e0 22 2c 20 7a 49 6e 64 65 78 2c 20 30 29 3b 0a 20  ", zIndex, 0);. 
1c2f0 20 20 20 20 20 70 50 61 72 73 65 2d 3e 63 68 65       pParse->che
1c300 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20  ckSchema = 1;.  
1c310 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1c320 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  E_ERROR;.    }. 
1c330 20 20 20 70 46 72 6f 6d 2d 3e 70 49 6e 64 65 78     pFrom->pIndex
1c340 20 3d 20 70 49 64 78 3b 0a 20 20 7d 0a 20 20 72   = pIdx;.  }.  r
1c350 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1c360 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
1c370 6f 75 74 69 6e 65 20 69 73 20 61 20 57 61 6c 6b  outine is a Walk
1c380 65 72 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20  er callback for 
1c390 22 65 78 70 61 6e 64 69 6e 67 22 20 61 20 53 45  "expanding" a SE
1c3a0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a  LECT statement..
1c3b0 2a 2a 20 22 45 78 70 61 6e 64 69 6e 67 22 20 6d  ** "Expanding" m
1c3c0 65 61 6e 73 20 74 6f 20 64 6f 20 74 68 65 20 66  eans to do the f
1c3d0 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20  ollowing:.**.** 
1c3e0 20 20 20 28 31 29 20 20 4d 61 6b 65 20 73 75 72     (1)  Make sur
1c3f0 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75  e VDBE cursor nu
1c400 6d 62 65 72 73 20 68 61 76 65 20 62 65 65 6e 20  mbers have been 
1c410 61 73 73 69 67 6e 65 64 20 74 6f 20 65 76 65 72  assigned to ever
1c420 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 65 6c 65  y.**         ele
1c430 6d 65 6e 74 20 6f 66 20 74 68 65 20 46 52 4f 4d  ment of the FROM
1c440 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20   clause..**.**  
1c450 20 20 28 32 29 20 20 46 69 6c 6c 20 69 6e 20 74    (2)  Fill in t
1c460 68 65 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d  he pTabList->a[]
1c470 2e 70 54 61 62 20 66 69 65 6c 64 73 20 69 6e 20  .pTab fields in 
1c480 74 68 65 20 53 72 63 4c 69 73 74 20 74 68 61 74  the SrcList that
1c490 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 64 65 66   .**         def
1c4a0 69 6e 65 73 20 46 52 4f 4d 20 63 6c 61 75 73 65  ines FROM clause
1c4b0 2e 20 20 57 68 65 6e 20 76 69 65 77 73 20 61 70  .  When views ap
1c4c0 70 65 61 72 20 69 6e 20 74 68 65 20 46 52 4f 4d  pear in the FROM
1c4d0 20 63 6c 61 75 73 65 2c 0a 2a 2a 20 20 20 20 20   clause,.**     
1c4e0 20 20 20 20 66 69 6c 6c 20 70 54 61 62 4c 69 73      fill pTabLis
1c4f0 74 2d 3e 61 5b 5d 2e 70 53 65 6c 65 63 74 20 77  t->a[].pSelect w
1c500 69 74 68 20 61 20 63 6f 70 79 20 6f 66 20 74 68  ith a copy of th
1c510 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
1c520 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 74 68  nt.**         th
1c530 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68  at implements th
1c540 65 20 76 69 65 77 2e 20 20 41 20 63 6f 70 79 20  e view.  A copy 
1c550 69 73 20 6d 61 64 65 20 6f 66 20 74 68 65 20 76  is made of the v
1c560 69 65 77 27 73 20 53 45 4c 45 43 54 0a 2a 2a 20  iew's SELECT.** 
1c570 20 20 20 20 20 20 20 20 73 74 61 74 65 6d 65 6e          statemen
1c580 74 20 73 6f 20 74 68 61 74 20 77 65 20 63 61 6e  t so that we can
1c590 20 66 72 65 65 6c 79 20 6d 6f 64 69 66 79 20 6f   freely modify o
1c5a0 72 20 64 65 6c 65 74 65 20 74 68 61 74 20 73 74  r delete that st
1c5b0 61 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20  atement.**      
1c5c0 20 20 20 77 69 74 68 6f 75 74 20 77 6f 72 72 79     without worry
1c5d0 69 6e 67 20 61 62 6f 75 74 20 6d 65 73 73 69 6e  ing about messin
1c5e0 67 20 75 70 20 74 68 65 20 70 72 65 73 69 73 74  g up the presist
1c5f0 65 6e 74 20 72 65 70 72 65 73 65 6e 74 61 74 69  ent representati
1c600 6f 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f 66  on.**         of
1c610 20 74 68 65 20 76 69 65 77 2e 0a 2a 2a 0a 2a 2a   the view..**.**
1c620 20 20 20 20 28 33 29 20 20 41 64 64 20 74 65 72      (3)  Add ter
1c630 6d 73 20 74 6f 20 74 68 65 20 57 48 45 52 45 20  ms to the WHERE 
1c640 63 6c 61 75 73 65 20 74 6f 20 61 63 63 6f 6d 6f  clause to accomo
1c650 64 61 74 65 20 74 68 65 20 4e 41 54 55 52 41 4c  date the NATURAL
1c660 20 6b 65 79 77 6f 72 64 0a 2a 2a 20 20 20 20 20   keyword.**     
1c670 20 20 20 20 6f 6e 20 6a 6f 69 6e 73 20 61 6e 64      on joins and
1c680 20 74 68 65 20 4f 4e 20 61 6e 64 20 55 53 49 4e   the ON and USIN
1c690 47 20 63 6c 61 75 73 65 20 6f 66 20 6a 6f 69 6e  G clause of join
1c6a0 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 34 29 20  s..**.**    (4) 
1c6b0 20 53 63 61 6e 20 74 68 65 20 6c 69 73 74 20 6f   Scan the list o
1c6c0 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  f columns in the
1c6d0 20 72 65 73 75 6c 74 20 73 65 74 20 28 70 45 4c   result set (pEL
1c6e0 69 73 74 29 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20  ist) looking.** 
1c6f0 20 20 20 20 20 20 20 20 66 6f 72 20 69 6e 73 74          for inst
1c700 61 6e 63 65 73 20 6f 66 20 74 68 65 20 22 2a 22  ances of the "*"
1c710 20 6f 70 65 72 61 74 6f 72 20 6f 72 20 74 68 65   operator or the
1c720 20 54 41 42 4c 45 2e 2a 20 6f 70 65 72 61 74 6f   TABLE.* operato
1c730 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 49 66  r..**         If
1c740 20 66 6f 75 6e 64 2c 20 65 78 70 61 6e 64 20 65   found, expand e
1c750 61 63 68 20 22 2a 22 20 74 6f 20 62 65 20 65 76  ach "*" to be ev
1c760 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 65 76  ery column in ev
1c770 65 72 79 20 74 61 62 6c 65 0a 2a 2a 20 20 20 20  ery table.**    
1c780 20 20 20 20 20 61 6e 64 20 54 41 42 4c 45 2e 2a       and TABLE.*
1c790 20 74 6f 20 62 65 20 65 76 65 72 79 20 63 6f 6c   to be every col
1c7a0 75 6d 6e 20 69 6e 20 54 41 42 4c 45 2e 0a 2a 2a  umn in TABLE..**
1c7b0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
1c7c0 65 6c 65 63 74 45 78 70 61 6e 64 65 72 28 57 61  electExpander(Wa
1c7d0 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53  lker *pWalker, S
1c7e0 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 50 61 72  elect *p){.  Par
1c7f0 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 61  se *pParse = pWa
1c800 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20  lker->pParse;.  
1c810 69 6e 74 20 69 2c 20 6a 2c 20 6b 3b 0a 20 20 53  int i, j, k;.  S
1c820 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
1c830 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  ;.  ExprList *pE
1c840 4c 69 73 74 3b 0a 20 20 73 74 72 75 63 74 20 53  List;.  struct S
1c850 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72  rcList_item *pFr
1c860 6f 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  om;.  sqlite3 *d
1c870 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
1c880 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
1c890 63 46 61 69 6c 65 64 20 20 29 7b 0a 20 20 20 20  cFailed  ){.    
1c8a0 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
1c8b0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 4e 45 56 45  ;.  }.  if( NEVE
1c8c0 52 28 70 2d 3e 70 53 72 63 3d 3d 30 29 20 7c 7c  R(p->pSrc==0) ||
1c8d0 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
1c8e0 53 46 5f 45 78 70 61 6e 64 65 64 29 21 3d 30 20  SF_Expanded)!=0 
1c8f0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52  ){.    return WR
1c900 43 5f 50 72 75 6e 65 3b 0a 20 20 7d 0a 20 20 70  C_Prune;.  }.  p
1c910 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46  ->selFlags |= SF
1c920 5f 45 78 70 61 6e 64 65 64 3b 0a 20 20 70 54 61  _Expanded;.  pTa
1c930 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b  bList = p->pSrc;
1c940 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70  .  pEList = p->p
1c950 45 4c 69 73 74 3b 0a 0a 20 20 2f 2a 20 4d 61 6b  EList;..  /* Mak
1c960 65 20 73 75 72 65 20 63 75 72 73 6f 72 20 6e 75  e sure cursor nu
1c970 6d 62 65 72 73 20 68 61 76 65 20 62 65 65 6e 20  mbers have been 
1c980 61 73 73 69 67 6e 65 64 20 74 6f 20 61 6c 6c 20  assigned to all 
1c990 65 6e 74 72 69 65 73 20 69 6e 0a 20 20 2a 2a 20  entries in.  ** 
1c9a0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
1c9b0 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  of the SELECT st
1c9c0 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20  atement..  */.  
1c9d0 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73  sqlite3SrcListAs
1c9e0 73 69 67 6e 43 75 72 73 6f 72 73 28 70 50 61 72  signCursors(pPar
1c9f0 73 65 2c 20 70 54 61 62 4c 69 73 74 29 3b 0a 0a  se, pTabList);..
1ca00 20 20 2f 2a 20 4c 6f 6f 6b 20 75 70 20 65 76 65    /* Look up eve
1ca10 72 79 20 74 61 62 6c 65 20 6e 61 6d 65 64 20 69  ry table named i
1ca20 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
1ca30 65 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2e  e of the select.
1ca40 20 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65 6e 74    If.  ** an ent
1ca50 72 79 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63  ry of the FROM c
1ca60 6c 61 75 73 65 20 69 73 20 61 20 73 75 62 71 75  lause is a subqu
1ca70 65 72 79 20 69 6e 73 74 65 61 64 20 6f 66 20 61  ery instead of a
1ca80 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 2c 0a   table or view,.
1ca90 20 20 2a 2a 20 74 68 65 6e 20 63 72 65 61 74 65    ** then create
1caa0 20 61 20 74 72 61 6e 73 69 65 6e 74 20 74 61 62   a transient tab
1cab0 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 6f 20  le structure to 
1cac0 64 65 73 63 72 69 62 65 20 74 68 65 20 73 75 62  describe the sub
1cad0 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f  query..  */.  fo
1cae0 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61  r(i=0, pFrom=pTa
1caf0 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62  bList->a; i<pTab
1cb00 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c  List->nSrc; i++,
1cb10 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 54   pFrom++){.    T
1cb20 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20  able *pTab;.    
1cb30 69 66 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 21  if( pFrom->pTab!
1cb40 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  =0 ){.      /* T
1cb50 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 68 61  his statement ha
1cb60 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 70  s already been p
1cb70 72 65 70 61 72 65 64 2e 20 20 54 68 65 72 65 20  repared.  There 
1cb80 69 73 20 6e 6f 20 6e 65 65 64 0a 20 20 20 20 20  is no need.     
1cb90 20 2a 2a 20 74 6f 20 67 6f 20 66 75 72 74 68 65   ** to go furthe
1cba0 72 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  r. */.      asse
1cbb0 72 74 28 20 69 3d 3d 30 20 29 3b 0a 20 20 20 20  rt( i==0 );.    
1cbc0 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75    return WRC_Pru
1cbd0 6e 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ne;.    }.    if
1cbe0 28 20 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 3d 3d  ( pFrom->zName==
1cbf0 30 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  0 ){.#ifndef SQL
1cc00 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
1cc10 59 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a  Y.      Select *
1cc20 70 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53  pSel = pFrom->pS
1cc30 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 2f 2a 20  elect;.      /* 
1cc40 41 20 73 75 62 2d 71 75 65 72 79 20 69 6e 20 74  A sub-query in t
1cc50 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
1cc60 66 20 61 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20  f a SELECT */.  
1cc70 20 20 20 20 61 73 73 65 72 74 28 20 70 53 65 6c      assert( pSel
1cc80 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73  !=0 );.      ass
1cc90 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62  ert( pFrom->pTab
1cca0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ==0 );.      sql
1ccb0 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70  ite3WalkSelect(p
1ccc0 57 61 6c 6b 65 72 2c 20 70 53 65 6c 29 3b 0a 20  Walker, pSel);. 
1ccd0 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62       pFrom->pTab
1cce0 20 3d 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65   = pTab = sqlite
1ccf0 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
1cd00 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 29  , sizeof(Table))
1cd10 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62  ;.      if( pTab
1cd20 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43  ==0 ) return WRC
1cd30 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 70 54  _Abort;.      pT
1cd40 61 62 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20  ab->nRef = 1;.  
1cd50 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20      pTab->zName 
1cd60 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
1cd70 28 64 62 2c 20 22 73 71 6c 69 74 65 5f 73 75 62  (db, "sqlite_sub
1cd80 71 75 65 72 79 5f 25 70 5f 22 2c 20 28 76 6f 69  query_%p_", (voi
1cd90 64 2a 29 70 54 61 62 29 3b 0a 20 20 20 20 20 20  d*)pTab);.      
1cda0 77 68 69 6c 65 28 20 70 53 65 6c 2d 3e 70 50 72  while( pSel->pPr
1cdb0 69 6f 72 20 29 7b 20 70 53 65 6c 20 3d 20 70 53  ior ){ pSel = pS
1cdc0 65 6c 2d 3e 70 50 72 69 6f 72 3b 20 7d 0a 20 20  el->pPrior; }.  
1cdd0 20 20 20 20 73 65 6c 65 63 74 43 6f 6c 75 6d 6e      selectColumn
1cde0 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50  sFromExprList(pP
1cdf0 61 72 73 65 2c 20 70 53 65 6c 2d 3e 70 45 4c 69  arse, pSel->pELi
1ce00 73 74 2c 20 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c  st, &pTab->nCol,
1ce10 20 26 70 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20   &pTab->aCol);. 
1ce20 20 20 20 20 20 70 54 61 62 2d 3e 69 50 4b 65 79       pTab->iPKey
1ce30 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 70 54 61   = -1;.      pTa
1ce40 62 2d 3e 6e 52 6f 77 45 73 74 20 3d 20 31 30 30  b->nRowEst = 100
1ce50 30 30 30 30 3b 0a 20 20 20 20 20 20 70 54 61 62  0000;.      pTab
1ce60 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46  ->tabFlags |= TF
1ce70 5f 45 70 68 65 6d 65 72 61 6c 3b 0a 23 65 6e 64  _Ephemeral;.#end
1ce80 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  if.    }else{.  
1ce90 20 20 20 20 2f 2a 20 41 6e 20 6f 72 64 69 6e 61      /* An ordina
1cea0 72 79 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77  ry table or view
1ceb0 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 46 52 4f   name in the FRO
1cec0 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20  M clause */.    
1ced0 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d    assert( pFrom-
1cee0 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20  >pTab==0 );.    
1cef0 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20    pFrom->pTab = 
1cf00 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f  pTab = sqlite3Lo
1cf10 63 61 74 65 54 61 62 6c 65 49 74 65 6d 28 70 50  cateTableItem(pP
1cf20 61 72 73 65 2c 20 30 2c 20 70 46 72 6f 6d 29 3b  arse, 0, pFrom);
1cf30 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62 3d  .      if( pTab=
1cf40 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f  =0 ) return WRC_
1cf50 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 70 54 61  Abort;.      pTa
1cf60 62 2d 3e 6e 52 65 66 2b 2b 3b 0a 23 69 66 20 21  b->nRef++;.#if !
1cf70 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
1cf80 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65  MIT_VIEW) || !de
1cf90 66 69 6e 65 64 20 28 53 51 4c 49 54 45 5f 4f 4d  fined (SQLITE_OM
1cfa0 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  IT_VIRTUALTABLE)
1cfb0 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62 2d  .      if( pTab-
1cfc0 3e 70 53 65 6c 65 63 74 20 7c 7c 20 49 73 56 69  >pSelect || IsVi
1cfd0 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20  rtual(pTab) ){. 
1cfe0 20 20 20 20 20 20 20 2f 2a 20 57 65 20 72 65 61         /* We rea
1cff0 63 68 20 68 65 72 65 20 69 66 20 74 68 65 20 6e  ch here if the n
1d000 61 6d 65 64 20 74 61 62 6c 65 20 69 73 20 61 20  amed table is a 
1d010 72 65 61 6c 6c 79 20 61 20 76 69 65 77 20 2a 2f  really a view */
1d020 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
1d030 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d  ite3ViewGetColum
1d040 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70  nNames(pParse, p
1d050 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 57 52  Tab) ) return WR
1d060 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 20  C_Abort;.       
1d070 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e   assert( pFrom->
1d080 70 53 65 6c 65 63 74 3d 3d 30 20 29 3b 0a 20 20  pSelect==0 );.  
1d090 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 53 65        pFrom->pSe
1d0a0 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65  lect = sqlite3Se
1d0b0 6c 65 63 74 44 75 70 28 64 62 2c 20 70 54 61 62  lectDup(db, pTab
1d0c0 2d 3e 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20  ->pSelect, 0);. 
1d0d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 61         sqlite3Wa
1d0e0 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72  lkSelect(pWalker
1d0f0 2c 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74  , pFrom->pSelect
1d100 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
1d110 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  f.    }..    /* 
1d120 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 64 65 78  Locate the index
1d130 20 6e 61 6d 65 64 20 62 79 20 74 68 65 20 49 4e   named by the IN
1d140 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 2c  DEXED BY clause,
1d150 20 69 66 20 61 6e 79 2e 20 2a 2f 0a 20 20 20 20   if any. */.    
1d160 69 66 28 20 73 71 6c 69 74 65 33 49 6e 64 65 78  if( sqlite3Index
1d170 65 64 42 79 4c 6f 6f 6b 75 70 28 70 50 61 72 73  edByLookup(pPars
1d180 65 2c 20 70 46 72 6f 6d 29 20 29 7b 0a 20 20 20  e, pFrom) ){.   
1d190 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62     return WRC_Ab
1d1a0 6f 72 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ort;.    }.  }..
1d1b0 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 4e 41 54    /* Process NAT
1d1c0 55 52 41 4c 20 6b 65 79 77 6f 72 64 73 2c 20 61  URAL keywords, a
1d1d0 6e 64 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20  nd ON and USING 
1d1e0 63 6c 61 75 73 65 73 20 6f 66 20 6a 6f 69 6e 73  clauses of joins
1d1f0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d  ..  */.  if( db-
1d200 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c  >mallocFailed ||
1d210 20 73 71 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f   sqliteProcessJo
1d220 69 6e 28 70 50 61 72 73 65 2c 20 70 29 20 29 7b  in(pParse, p) ){
1d230 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f  .    return WRC_
1d240 41 62 6f 72 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Abort;.  }..  /*
1d250 20 46 6f 72 20 65 76 65 72 79 20 22 2a 22 20 74   For every "*" t
1d260 68 61 74 20 6f 63 63 75 72 73 20 69 6e 20 74 68  hat occurs in th
1d270 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2c 20 69  e column list, i
1d280 6e 73 65 72 74 20 74 68 65 20 6e 61 6d 65 73 20  nsert the names 
1d290 6f 66 0a 20 20 2a 2a 20 61 6c 6c 20 63 6f 6c 75  of.  ** all colu
1d2a0 6d 6e 73 20 69 6e 20 61 6c 6c 20 74 61 62 6c 65  mns in all table
1d2b0 73 2e 20 20 41 6e 64 20 66 6f 72 20 65 76 65 72  s.  And for ever
1d2c0 79 20 54 41 42 4c 45 2e 2a 20 69 6e 73 65 72 74  y TABLE.* insert
1d2d0 20 74 68 65 20 6e 61 6d 65 73 0a 20 20 2a 2a 20   the names.  ** 
1d2e0 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69  of all columns i
1d2f0 6e 20 54 41 42 4c 45 2e 20 20 54 68 65 20 70 61  n TABLE.  The pa
1d300 72 73 65 72 20 69 6e 73 65 72 74 65 64 20 61 20  rser inserted a 
1d310 73 70 65 63 69 61 6c 20 65 78 70 72 65 73 73 69  special expressi
1d320 6f 6e 0a 20 20 2a 2a 20 77 69 74 68 20 74 68 65  on.  ** with the
1d330 20 54 4b 5f 41 4c 4c 20 6f 70 65 72 61 74 6f 72   TK_ALL operator
1d340 20 66 6f 72 20 65 61 63 68 20 22 2a 22 20 74 68   for each "*" th
1d350 61 74 20 69 74 20 66 6f 75 6e 64 20 69 6e 20 74  at it found in t
1d360 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2e 0a  he column list..
1d370 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    ** The followi
1d380 6e 67 20 63 6f 64 65 20 6a 75 73 74 20 68 61 73  ng code just has
1d390 20 74 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 54   to locate the T
1d3a0 4b 5f 41 4c 4c 20 65 78 70 72 65 73 73 69 6f 6e  K_ALL expression
1d3b0 73 20 61 6e 64 20 65 78 70 61 6e 64 0a 20 20 2a  s and expand.  *
1d3c0 2a 20 65 61 63 68 20 6f 6e 65 20 74 6f 20 74 68  * each one to th
1d3d0 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 63 6f  e list of all co
1d3e0 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c 20 74 61 62  lumns in all tab
1d3f0 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  les..  **.  ** T
1d400 68 65 20 66 69 72 73 74 20 6c 6f 6f 70 20 6a 75  he first loop ju
1d410 73 74 20 63 68 65 63 6b 73 20 74 6f 20 73 65 65  st checks to see
1d420 20 69 66 20 74 68 65 72 65 20 61 72 65 20 61 6e   if there are an
1d430 79 20 22 2a 22 20 6f 70 65 72 61 74 6f 72 73 0a  y "*" operators.
1d440 20 20 2a 2a 20 74 68 61 74 20 6e 65 65 64 20 65    ** that need e
1d450 78 70 61 6e 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20  xpanding..  */. 
1d460 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69   for(k=0; k<pELi
1d470 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b  st->nExpr; k++){
1d480 0a 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20  .    Expr *pE = 
1d490 70 45 4c 69 73 74 2d 3e 61 5b 6b 5d 2e 70 45 78  pEList->a[k].pEx
1d4a0 70 72 3b 0a 20 20 20 20 69 66 28 20 70 45 2d 3e  pr;.    if( pE->
1d4b0 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 20 62 72 65  op==TK_ALL ) bre
1d4c0 61 6b 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ak;.    assert( 
1d4d0 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c  pE->op!=TK_DOT |
1d4e0 7c 20 70 45 2d 3e 70 52 69 67 68 74 21 3d 30 20  | pE->pRight!=0 
1d4f0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
1d500 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c  E->op!=TK_DOT ||
1d510 20 28 70 45 2d 3e 70 4c 65 66 74 21 3d 30 20 26   (pE->pLeft!=0 &
1d520 26 20 70 45 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d  & pE->pLeft->op=
1d530 3d 54 4b 5f 49 44 29 20 29 3b 0a 20 20 20 20 69  =TK_ID) );.    i
1d540 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f  f( pE->op==TK_DO
1d550 54 20 26 26 20 70 45 2d 3e 70 52 69 67 68 74 2d  T && pE->pRight-
1d560 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 20 62 72  >op==TK_ALL ) br
1d570 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6b  eak;.  }.  if( k
1d580 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  <pEList->nExpr )
1d590 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  {.    /*.    ** 
1d5a0 49 66 20 77 65 20 67 65 74 20 68 65 72 65 20 69  If we get here i
1d5b0 74 20 6d 65 61 6e 73 20 74 68 65 20 72 65 73 75  t means the resu
1d5c0 6c 74 20 73 65 74 20 63 6f 6e 74 61 69 6e 73 20  lt set contains 
1d5d0 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 22 2a 22 0a  one or more "*".
1d5e0 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72 73      ** operators
1d5f0 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65   that need to be
1d600 20 65 78 70 61 6e 64 65 64 2e 20 20 4c 6f 6f 70   expanded.  Loop
1d610 20 74 68 72 6f 75 67 68 20 65 61 63 68 20 65 78   through each ex
1d620 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2a 20  pression.    ** 
1d630 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
1d640 74 20 61 6e 64 20 65 78 70 61 6e 64 20 74 68 65  t and expand the
1d650 6d 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20  m one by one..  
1d660 20 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20    */.    struct 
1d670 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61  ExprList_item *a
1d680 20 3d 20 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20   = pEList->a;.  
1d690 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4e 65 77    ExprList *pNew
1d6a0 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 66 6c   = 0;.    int fl
1d6b0 61 67 73 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  ags = pParse->db
1d6c0 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 69 6e 74  ->flags;.    int
1d6d0 20 6c 6f 6e 67 4e 61 6d 65 73 20 3d 20 28 66 6c   longNames = (fl
1d6e0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 75 6c  ags & SQLITE_Ful
1d6f0 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 0a 20 20  lColNames)!=0.  
1d700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d710 20 20 20 20 26 26 20 28 66 6c 61 67 73 20 26 20      && (flags & 
1d720 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e  SQLITE_ShortColN
1d730 61 6d 65 73 29 3d 3d 30 3b 0a 0a 20 20 20 20 66  ames)==0;..    f
1d740 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74  or(k=0; k<pEList
1d750 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20  ->nExpr; k++){. 
1d760 20 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20       Expr *pE = 
1d770 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[k].pExpr;.    
1d780 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e 6f 70    assert( pE->op
1d790 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 45 2d 3e  !=TK_DOT || pE->
1d7a0 70 52 69 67 68 74 21 3d 30 20 29 3b 0a 20 20 20  pRight!=0 );.   
1d7b0 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 21 3d 54     if( pE->op!=T
1d7c0 4b 5f 41 4c 4c 20 26 26 20 28 70 45 2d 3e 6f 70  K_ALL && (pE->op
1d7d0 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 45 2d 3e  !=TK_DOT || pE->
1d7e0 70 52 69 67 68 74 2d 3e 6f 70 21 3d 54 4b 5f 41  pRight->op!=TK_A
1d7f0 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  LL) ){.        /
1d800 2a 20 54 68 69 73 20 70 61 72 74 69 63 75 6c 61  * This particula
1d810 72 20 65 78 70 72 65 73 73 69 6f 6e 20 64 6f 65  r expression doe
1d820 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65  s not need to be
1d830 20 65 78 70 61 6e 64 65 64 2e 0a 20 20 20 20 20   expanded..     
1d840 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e     */.        pN
1d850 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ew = sqlite3Expr
1d860 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73  ListAppend(pPars
1d870 65 2c 20 70 4e 65 77 2c 20 61 5b 6b 5d 2e 70 45  e, pNew, a[k].pE
1d880 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66  xpr);.        if
1d890 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20  ( pNew ){.      
1d8a0 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77      pNew->a[pNew
1d8b0 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a 4e 61 6d 65  ->nExpr-1].zName
1d8c0 20 3d 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 3b 0a 20   = a[k].zName;. 
1d8d0 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61           pNew->a
1d8e0 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e  [pNew->nExpr-1].
1d8f0 7a 53 70 61 6e 20 3d 20 61 5b 6b 5d 2e 7a 53 70  zSpan = a[k].zSp
1d900 61 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 61 5b  an;.          a[
1d910 6b 5d 2e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20  k].zName = 0;.  
1d920 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 7a 53 70          a[k].zSp
1d930 61 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  an = 0;.        
1d940 7d 0a 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 70  }.        a[k].p
1d950 45 78 70 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  Expr = 0;.      
1d960 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
1d970 2a 20 54 68 69 73 20 65 78 70 72 65 73 73 69 6f  * This expressio
1d980 6e 20 69 73 20 61 20 22 2a 22 20 6f 72 20 61 20  n is a "*" or a 
1d990 22 54 41 42 4c 45 2e 2a 22 20 61 6e 64 20 6e 65  "TABLE.*" and ne
1d9a0 65 64 73 20 74 6f 20 62 65 0a 20 20 20 20 20 20  eds to be.      
1d9b0 20 20 2a 2a 20 65 78 70 61 6e 64 65 64 2e 20 2a    ** expanded. *
1d9c0 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74 61  /.        int ta
1d9d0 62 6c 65 53 65 65 6e 20 3d 20 30 3b 20 20 20 20  bleSeen = 0;    
1d9e0 20 20 2f 2a 20 53 65 74 20 74 6f 20 31 20 77 68    /* Set to 1 wh
1d9f0 65 6e 20 54 41 42 4c 45 20 6d 61 74 63 68 65 73  en TABLE matches
1da00 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 68 61 72   */.        char
1da10 20 2a 7a 54 4e 61 6d 65 3b 20 20 20 20 20 20 20   *zTName;       
1da20 20 20 20 20 20 2f 2a 20 74 65 78 74 20 6f 66 20       /* text of 
1da30 6e 61 6d 65 20 6f 66 20 54 41 42 4c 45 20 2a 2f  name of TABLE */
1da40 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 45 2d  .        if( pE-
1da50 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29 7b 0a 20  >op==TK_DOT ){. 
1da60 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
1da70 20 70 45 2d 3e 70 4c 65 66 74 21 3d 30 20 29 3b   pE->pLeft!=0 );
1da80 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
1da90 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
1daa0 72 74 79 28 70 45 2d 3e 70 4c 65 66 74 2c 20 45  rty(pE->pLeft, E
1dab0 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20  P_IntValue) );. 
1dac0 20 20 20 20 20 20 20 20 20 7a 54 4e 61 6d 65 20           zTName 
1dad0 3d 20 70 45 2d 3e 70 4c 65 66 74 2d 3e 75 2e 7a  = pE->pLeft->u.z
1dae0 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20 7d  Token;.        }
1daf0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1db00 7a 54 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20  zTName = 0;.    
1db10 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66 6f      }.        fo
1db20 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61  r(i=0, pFrom=pTa
1db30 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62  bList->a; i<pTab
1db40 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c  List->nSrc; i++,
1db50 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20   pFrom++){.     
1db60 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62       Table *pTab
1db70 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a   = pFrom->pTab;.
1db80 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a            char *
1db90 7a 54 61 62 4e 61 6d 65 20 3d 20 70 46 72 6f 6d  zTabName = pFrom
1dba0 2d 3e 7a 41 6c 69 61 73 3b 0a 20 20 20 20 20 20  ->zAlias;.      
1dbb0 20 20 20 20 69 66 28 20 7a 54 61 62 4e 61 6d 65      if( zTabName
1dbc0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
1dbd0 20 20 20 7a 54 61 62 4e 61 6d 65 20 3d 20 70 54     zTabName = pT
1dbe0 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  ab->zName;.     
1dbf0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1dc00 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
1dc10 61 69 6c 65 64 20 29 20 62 72 65 61 6b 3b 0a 20  ailed ) break;. 
1dc20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 4e           if( zTN
1dc30 61 6d 65 20 26 26 20 73 71 6c 69 74 65 33 53 74  ame && sqlite3St
1dc40 72 49 43 6d 70 28 7a 54 4e 61 6d 65 2c 20 7a 54  rICmp(zTName, zT
1dc50 61 62 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20  abName)!=0 ){.  
1dc60 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
1dc70 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ue;.          }.
1dc80 20 20 20 20 20 20 20 20 20 20 74 61 62 6c 65 53            tableS
1dc90 65 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  een = 1;.       
1dca0 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54     for(j=0; j<pT
1dcb0 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a  ab->nCol; j++){.
1dcc0 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72              Expr
1dcd0 20 2a 70 45 78 70 72 2c 20 2a 70 52 69 67 68 74   *pExpr, *pRight
1dce0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 68  ;.            ch
1dcf0 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 54 61 62  ar *zName = pTab
1dd00 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b  ->aCol[j].zName;
1dd10 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61  .            cha
1dd20 72 20 2a 7a 43 6f 6c 6e 61 6d 65 3b 20 20 2f 2a  r *zColname;  /*
1dd30 20 54 68 65 20 63 6f 6d 70 75 74 65 64 20 63 6f   The computed co
1dd40 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 20  lumn name */.   
1dd50 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a           char *z
1dd60 54 6f 46 72 65 65 3b 20 20 20 2f 2a 20 4d 61 6c  ToFree;   /* Mal
1dd70 6c 6f 63 65 64 20 73 74 72 69 6e 67 20 74 68 61  loced string tha
1dd80 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 66 72  t needs to be fr
1dd90 65 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  eed */.         
1dda0 20 20 20 54 6f 6b 65 6e 20 73 43 6f 6c 6e 61 6d     Token sColnam
1ddb0 65 3b 20 20 2f 2a 20 43 6f 6d 70 75 74 65 64 20  e;  /* Computed 
1ddc0 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 61 73 20 61  column name as a
1ddd0 20 74 6f 6b 65 6e 20 2a 2f 0a 0a 20 20 20 20 20   token */..     
1dde0 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 20 63         /* If a c
1ddf0 6f 6c 75 6d 6e 20 69 73 20 6d 61 72 6b 65 64 20  olumn is marked 
1de00 61 73 20 27 68 69 64 64 65 6e 27 20 28 63 75 72  as 'hidden' (cur
1de10 72 65 6e 74 6c 79 20 6f 6e 6c 79 20 70 6f 73 73  rently only poss
1de20 69 62 6c 65 0a 20 20 20 20 20 20 20 20 20 20 20  ible.           
1de30 20 2a 2a 20 66 6f 72 20 76 69 72 74 75 61 6c 20   ** for virtual 
1de40 74 61 62 6c 65 73 29 2c 20 64 6f 20 6e 6f 74 20  tables), do not 
1de50 69 6e 63 6c 75 64 65 20 69 74 20 69 6e 20 74 68  include it in th
1de60 65 20 65 78 70 61 6e 64 65 64 0a 20 20 20 20 20  e expanded.     
1de70 20 20 20 20 20 20 20 2a 2a 20 72 65 73 75 6c 74         ** result
1de80 2d 73 65 74 20 6c 69 73 74 2e 0a 20 20 20 20 20  -set list..     
1de90 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
1dea0 20 20 20 20 20 20 69 66 28 20 49 73 48 69 64 64        if( IsHidd
1deb0 65 6e 43 6f 6c 75 6d 6e 28 26 70 54 61 62 2d 3e  enColumn(&pTab->
1dec0 61 43 6f 6c 5b 6a 5d 29 20 29 7b 0a 20 20 20 20  aCol[j]) ){.    
1ded0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
1dee0 28 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29  (IsVirtual(pTab)
1def0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
1df00 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
1df10 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
1df20 20 20 20 20 20 20 69 66 28 20 69 3e 30 20 26 26        if( i>0 &&
1df30 20 7a 54 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20   zTName==0 ){.  
1df40 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
1df50 28 70 46 72 6f 6d 2d 3e 6a 6f 69 6e 74 79 70 65  (pFrom->jointype
1df60 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c 29 21 3d   & JT_NATURAL)!=
1df70 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0.              
1df80 20 20 26 26 20 74 61 62 6c 65 41 6e 64 43 6f 6c    && tableAndCol
1df90 75 6d 6e 49 6e 64 65 78 28 70 54 61 62 4c 69 73  umnIndex(pTabLis
1dfa0 74 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20 30 2c 20  t, i, zName, 0, 
1dfb0 30 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0).             
1dfc0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1dfd0 20 20 20 20 2f 2a 20 49 6e 20 61 20 4e 41 54 55      /* In a NATU
1dfe0 52 41 4c 20 6a 6f 69 6e 2c 20 6f 6d 69 74 20 74  RAL join, omit t
1dff0 68 65 20 6a 6f 69 6e 20 63 6f 6c 75 6d 6e 73 20  he join columns 
1e000 66 72 6f 6d 20 74 68 65 20 0a 20 20 20 20 20 20  from the .      
1e010 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62            ** tab
1e020 6c 65 20 74 6f 20 74 68 65 20 72 69 67 68 74 20  le to the right 
1e030 6f 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20  of the join */. 
1e040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
1e050 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
1e060 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1e070 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
1e080 65 33 49 64 4c 69 73 74 49 6e 64 65 78 28 70 46  e3IdListIndex(pF
1e090 72 6f 6d 2d 3e 70 55 73 69 6e 67 2c 20 7a 4e 61  rom->pUsing, zNa
1e0a0 6d 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)>=0 ){.      
1e0b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20            /* In 
1e0c0 61 20 6a 6f 69 6e 20 77 69 74 68 20 61 20 55 53  a join with a US
1e0d0 49 4e 47 20 63 6c 61 75 73 65 2c 20 6f 6d 69 74  ING clause, omit
1e0e0 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 0a   columns in the.
1e0f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e100 2a 2a 20 75 73 69 6e 67 20 63 6c 61 75 73 65 20  ** using clause 
1e110 66 72 6f 6d 20 74 68 65 20 74 61 62 6c 65 20 6f  from the table o
1e120 6e 20 74 68 65 20 72 69 67 68 74 2e 20 2a 2f 0a  n the right. */.
1e130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e140 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
1e150 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1e160 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1e170 20 20 20 20 70 52 69 67 68 74 20 3d 20 73 71 6c      pRight = sql
1e180 69 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f  ite3Expr(db, TK_
1e190 49 44 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ID, zName);.    
1e1a0 20 20 20 20 20 20 20 20 7a 43 6f 6c 6e 61 6d 65          zColname
1e1b0 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20   = zName;.      
1e1c0 20 20 20 20 20 20 7a 54 6f 46 72 65 65 20 3d 20        zToFree = 
1e1d0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  0;.            i
1e1e0 66 28 20 6c 6f 6e 67 4e 61 6d 65 73 20 7c 7c 20  f( longNames || 
1e1f0 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 31  pTabList->nSrc>1
1e200 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1e210 20 20 45 78 70 72 20 2a 70 4c 65 66 74 3b 0a 20    Expr *pLeft;. 
1e220 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 65               pLe
1e230 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ft = sqlite3Expr
1e240 28 64 62 2c 20 54 4b 5f 49 44 2c 20 7a 54 61 62  (db, TK_ID, zTab
1e250 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Name);.         
1e260 20 20 20 20 20 70 45 78 70 72 20 3d 20 73 71 6c       pExpr = sql
1e270 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
1e280 2c 20 54 4b 5f 44 4f 54 2c 20 70 4c 65 66 74 2c  , TK_DOT, pLeft,
1e290 20 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 20   pRight, 0);.   
1e2a0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6c             if( l
1e2b0 6f 6e 67 4e 61 6d 65 73 20 29 7b 0a 20 20 20 20  ongNames ){.    
1e2c0 20 20 20 20 20 20 20 20 20 20 20 20 7a 43 6f 6c              zCol
1e2d0 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50  name = sqlite3MP
1e2e0 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2e 25 73  rintf(db, "%s.%s
1e2f0 22 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 7a 4e 61  ", zTabName, zNa
1e300 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  me);.           
1e310 20 20 20 20 20 7a 54 6f 46 72 65 65 20 3d 20 7a       zToFree = z
1e320 43 6f 6c 6e 61 6d 65 3b 0a 20 20 20 20 20 20 20  Colname;.       
1e330 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1e340 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1e350 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 20            pExpr 
1e360 3d 20 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  = pRight;.      
1e370 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1e380 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74      pNew = sqlit
1e390 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
1e3a0 28 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 70  (pParse, pNew, p
1e3b0 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20  Expr);.         
1e3c0 20 20 20 73 43 6f 6c 6e 61 6d 65 2e 7a 20 3d 20     sColname.z = 
1e3d0 7a 43 6f 6c 6e 61 6d 65 3b 0a 20 20 20 20 20 20  zColname;.      
1e3e0 20 20 20 20 20 20 73 43 6f 6c 6e 61 6d 65 2e 6e        sColname.n
1e3f0 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
1e400 33 30 28 7a 43 6f 6c 6e 61 6d 65 29 3b 0a 20 20  30(zColname);.  
1e410 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1e420 33 45 78 70 72 4c 69 73 74 53 65 74 4e 61 6d 65  3ExprListSetName
1e430 28 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 26  (pParse, pNew, &
1e440 73 43 6f 6c 6e 61 6d 65 2c 20 30 29 3b 0a 20 20  sColname, 0);.  
1e450 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1e460 33 44 62 46 72 65 65 28 64 62 2c 20 7a 54 6f 46  3DbFree(db, zToF
1e470 72 65 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ree);.          
1e480 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
1e490 20 20 20 20 69 66 28 20 21 74 61 62 6c 65 53 65      if( !tableSe
1e4a0 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  en ){.          
1e4b0 69 66 28 20 7a 54 4e 61 6d 65 20 29 7b 0a 20 20  if( zTName ){.  
1e4c0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1e4d0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
1e4e0 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65  , "no such table
1e4f0 3a 20 25 73 22 2c 20 7a 54 4e 61 6d 65 29 3b 0a  : %s", zTName);.
1e500 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
1e510 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
1e520 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
1e530 72 73 65 2c 20 22 6e 6f 20 74 61 62 6c 65 73 20  rse, "no tables 
1e540 73 70 65 63 69 66 69 65 64 22 29 3b 0a 20 20 20  specified");.   
1e550 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1e560 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
1e570 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
1e580 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
1e590 45 4c 69 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70  EList);.    p->p
1e5a0 45 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20  EList = pNew;.  
1e5b0 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  }.#if SQLITE_MAX
1e5c0 5f 43 4f 4c 55 4d 4e 0a 20 20 69 66 28 20 70 2d  _COLUMN.  if( p-
1e5d0 3e 70 45 4c 69 73 74 20 26 26 20 70 2d 3e 70 45  >pEList && p->pE
1e5e0 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 64 62 2d 3e  List->nExpr>db->
1e5f0 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
1e600 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20 29 7b 0a 20  MIT_COLUMN] ){. 
1e610 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
1e620 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20  sg(pParse, "too 
1e630 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  many columns in 
1e640 72 65 73 75 6c 74 20 73 65 74 22 29 3b 0a 20 20  result set");.  
1e650 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  }.#endif.  retur
1e660 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
1e670 7d 0a 0a 2f 2a 0a 2a 2a 20 4e 6f 2d 6f 70 20 72  }../*.** No-op r
1e680 6f 75 74 69 6e 65 20 66 6f 72 20 74 68 65 20 70  outine for the p
1e690 61 72 73 65 2d 74 72 65 65 20 77 61 6c 6b 65 72  arse-tree walker
1e6a0 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69  ..**.** When thi
1e6b0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65  s routine is the
1e6c0 20 57 61 6c 6b 65 72 2e 78 45 78 70 72 43 61 6c   Walker.xExprCal
1e6d0 6c 62 61 63 6b 20 74 68 65 6e 20 65 78 70 72 65  lback then expre
1e6e0 73 73 69 6f 6e 20 74 72 65 65 73 0a 2a 2a 20 61  ssion trees.** a
1e6f0 72 65 20 77 61 6c 6b 65 64 20 77 69 74 68 6f 75  re walked withou
1e700 74 20 61 6e 79 20 61 63 74 69 6f 6e 73 20 62 65  t any actions be
1e710 69 6e 67 20 74 61 6b 65 6e 20 61 74 20 65 61 63  ing taken at eac
1e720 68 20 6e 6f 64 65 2e 20 20 50 72 65 73 75 6d 61  h node.  Presuma
1e730 62 6c 79 2c 0a 2a 2a 20 77 68 65 6e 20 74 68 69  bly,.** when thi
1e740 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
1e750 64 20 66 6f 72 20 57 61 6c 6b 65 72 2e 78 45 78  d for Walker.xEx
1e760 70 72 43 61 6c 6c 62 61 63 6b 20 74 68 65 6e 20  prCallback then 
1e770 0a 2a 2a 20 57 61 6c 6b 65 72 2e 78 53 65 6c 65  .** Walker.xSele
1e780 63 74 43 61 6c 6c 62 61 63 6b 20 69 73 20 73 65  ctCallback is se
1e790 74 20 74 6f 20 64 6f 20 73 6f 6d 65 74 68 69 6e  t to do somethin
1e7a0 67 20 75 73 65 66 75 6c 20 66 6f 72 20 65 76 65  g useful for eve
1e7b0 72 79 20 0a 2a 2a 20 73 75 62 71 75 65 72 79 20  ry .** subquery 
1e7c0 69 6e 20 74 68 65 20 70 61 72 73 65 72 20 74 72  in the parser tr
1e7d0 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ee..*/.static in
1e7e0 74 20 65 78 70 72 57 61 6c 6b 4e 6f 6f 70 28 57  t exprWalkNoop(W
1e7f0 61 6c 6b 65 72 20 2a 4e 6f 74 55 73 65 64 2c 20  alker *NotUsed, 
1e800 45 78 70 72 20 2a 4e 6f 74 55 73 65 64 32 29 7b  Expr *NotUsed2){
1e810 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
1e820 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f  TER2(NotUsed, No
1e830 74 55 73 65 64 32 29 3b 0a 20 20 72 65 74 75 72  tUsed2);.  retur
1e840 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
1e850 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
1e860 75 74 69 6e 65 20 22 65 78 70 61 6e 64 73 22 20  utine "expands" 
1e870 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
1e880 6e 74 20 61 6e 64 20 61 6c 6c 20 6f 66 20 69 74  nt and all of it
1e890 73 20 73 75 62 71 75 65 72 69 65 73 2e 0a 2a 2a  s subqueries..**
1e8a0 20 46 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20   For additional 
1e8b0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 77  information on w
1e8c0 68 61 74 20 69 74 20 6d 65 61 6e 73 20 74 6f 20  hat it means to 
1e8d0 22 65 78 70 61 6e 64 22 20 61 20 53 45 4c 45 43  "expand" a SELEC
1e8e0 54 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2c 20  T.** statement, 
1e8f0 73 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20  see the comment 
1e900 6f 6e 20 74 68 65 20 73 65 6c 65 63 74 45 78 70  on the selectExp
1e910 61 6e 64 20 77 6f 72 6b 65 72 20 63 61 6c 6c 62  and worker callb
1e920 61 63 6b 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a  ack above..**.**
1e930 20 45 78 70 61 6e 64 69 6e 67 20 61 20 53 45 4c   Expanding a SEL
1e940 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69 73  ECT statement is
1e950 20 74 68 65 20 66 69 72 73 74 20 73 74 65 70 20   the first step 
1e960 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 61 0a  in processing a.
1e970 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  ** SELECT statem
1e980 65 6e 74 2e 20 20 54 68 65 20 53 45 4c 45 43 54  ent.  The SELECT
1e990 20 73 74 61 74 65 6d 65 6e 74 20 6d 75 73 74 20   statement must 
1e9a0 62 65 20 65 78 70 61 6e 64 65 64 20 62 65 66 6f  be expanded befo
1e9b0 72 65 0a 2a 2a 20 6e 61 6d 65 20 72 65 73 6f 6c  re.** name resol
1e9c0 75 74 69 6f 6e 20 69 73 20 70 65 72 66 6f 72 6d  ution is perform
1e9d0 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79  ed..**.** If any
1e9e0 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67  thing goes wrong
1e9f0 2c 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  , an error messa
1ea00 67 65 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e  ge is written in
1ea10 74 6f 20 70 50 61 72 73 65 2e 0a 2a 2a 20 54 68  to pParse..** Th
1ea20 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
1ea30 6f 6e 20 63 61 6e 20 64 65 74 65 63 74 20 74 68  on can detect th
1ea40 65 20 70 72 6f 62 6c 65 6d 20 62 79 20 6c 6f 6f  e problem by loo
1ea50 6b 69 6e 67 20 61 74 20 70 50 61 72 73 65 2d 3e  king at pParse->
1ea60 6e 45 72 72 0a 2a 2a 20 61 6e 64 2f 6f 72 20 70  nErr.** and/or p
1ea70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
1ea80 63 46 61 69 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74  cFailed..*/.stat
1ea90 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 53  ic void sqlite3S
1eaa0 65 6c 65 63 74 45 78 70 61 6e 64 28 50 61 72 73  electExpand(Pars
1eab0 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63  e *pParse, Selec
1eac0 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 57  t *pSelect){.  W
1ead0 61 6c 6b 65 72 20 77 3b 0a 20 20 77 2e 78 53 65  alker w;.  w.xSe
1eae0 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73  lectCallback = s
1eaf0 65 6c 65 63 74 45 78 70 61 6e 64 65 72 3b 0a 20  electExpander;. 
1eb00 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b   w.xExprCallback
1eb10 20 3d 20 65 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b   = exprWalkNoop;
1eb20 0a 20 20 77 2e 70 50 61 72 73 65 20 3d 20 70 50  .  w.pParse = pP
1eb30 61 72 73 65 3b 0a 20 20 73 71 6c 69 74 65 33 57  arse;.  sqlite3W
1eb40 61 6c 6b 53 65 6c 65 63 74 28 26 77 2c 20 70 53  alkSelect(&w, pS
1eb50 65 6c 65 63 74 29 3b 0a 7d 0a 0a 0a 23 69 66 6e  elect);.}...#ifn
1eb60 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1eb70 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 54  SUBQUERY./*.** T
1eb80 68 69 73 20 69 73 20 61 20 57 61 6c 6b 65 72 2e  his is a Walker.
1eb90 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20  xSelectCallback 
1eba0 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 74 68 65  callback for the
1ebb0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 79   sqlite3SelectTy
1ebc0 70 65 49 6e 66 6f 28 29 0a 2a 2a 20 69 6e 74 65  peInfo().** inte
1ebd0 72 66 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  rface..**.** For
1ebe0 20 65 61 63 68 20 46 52 4f 4d 2d 63 6c 61 75 73   each FROM-claus
1ebf0 65 20 73 75 62 71 75 65 72 79 2c 20 61 64 64 20  e subquery, add 
1ec00 43 6f 6c 75 6d 6e 2e 7a 54 79 70 65 20 61 6e 64  Column.zType and
1ec10 20 43 6f 6c 75 6d 6e 2e 7a 43 6f 6c 6c 0a 2a 2a   Column.zColl.**
1ec20 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20   information to 
1ec30 74 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74  the Table struct
1ec40 75 72 65 20 74 68 61 74 20 72 65 70 72 65 73 65  ure that represe
1ec50 6e 74 73 20 74 68 65 20 72 65 73 75 6c 74 20 73  nts the result s
1ec60 65 74 0a 2a 2a 20 6f 66 20 74 68 61 74 20 73 75  et.** of that su
1ec70 62 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68  bquery..**.** Th
1ec80 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72  e Table structur
1ec90 65 20 74 68 61 74 20 72 65 70 72 65 73 65 6e 74  e that represent
1eca0 73 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  s the result set
1ecb0 20 77 61 73 20 63 6f 6e 73 74 72 75 63 74 65 64   was constructed
1ecc0 0a 2a 2a 20 62 79 20 73 65 6c 65 63 74 45 78 70  .** by selectExp
1ecd0 61 6e 64 65 72 28 29 20 62 75 74 20 74 68 65 20  ander() but the 
1ece0 74 79 70 65 20 61 6e 64 20 63 6f 6c 6c 61 74 69  type and collati
1ecf0 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77  on information w
1ed00 61 73 20 6f 6d 69 74 74 65 64 0a 2a 2a 20 61 74  as omitted.** at
1ed10 20 74 68 61 74 20 70 6f 69 6e 74 20 62 65 63 61   that point beca
1ed20 75 73 65 20 69 64 65 6e 74 69 66 69 65 72 73 20  use identifiers 
1ed30 68 61 64 20 6e 6f 74 20 79 65 74 20 62 65 65 6e  had not yet been
1ed40 20 72 65 73 6f 6c 76 65 64 2e 20 20 54 68 69 73   resolved.  This
1ed50 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 63  .** routine is c
1ed60 61 6c 6c 65 64 20 61 66 74 65 72 20 69 64 65 6e  alled after iden
1ed70 74 69 66 69 65 72 20 72 65 73 6f 6c 75 74 69 6f  tifier resolutio
1ed80 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
1ed90 20 73 65 6c 65 63 74 41 64 64 53 75 62 71 75 65   selectAddSubque
1eda0 72 79 54 79 70 65 49 6e 66 6f 28 57 61 6c 6b 65  ryTypeInfo(Walke
1edb0 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65  r *pWalker, Sele
1edc0 63 74 20 2a 70 29 7b 0a 20 20 50 61 72 73 65 20  ct *p){.  Parse 
1edd0 2a 70 50 61 72 73 65 3b 0a 20 20 69 6e 74 20 69  *pParse;.  int i
1ede0 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  ;.  SrcList *pTa
1edf0 62 4c 69 73 74 3b 0a 20 20 73 74 72 75 63 74 20  bList;.  struct 
1ee00 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46  SrcList_item *pF
1ee10 72 6f 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  rom;..  assert( 
1ee20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
1ee30 5f 52 65 73 6f 6c 76 65 64 20 29 3b 0a 20 20 69  _Resolved );.  i
1ee40 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20  f( (p->selFlags 
1ee50 26 20 53 46 5f 48 61 73 54 79 70 65 49 6e 66 6f  & SF_HasTypeInfo
1ee60 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 73  )==0 ){.    p->s
1ee70 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 48 61  elFlags |= SF_Ha
1ee80 73 54 79 70 65 49 6e 66 6f 3b 0a 20 20 20 20 70  sTypeInfo;.    p
1ee90 50 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d  Parse = pWalker-
1eea0 3e 70 50 61 72 73 65 3b 0a 20 20 20 20 70 54 61  >pParse;.    pTa
1eeb0 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b  bList = p->pSrc;
1eec0 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 46  .    for(i=0, pF
1eed0 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b  rom=pTabList->a;
1eee0 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   i<pTabList->nSr
1eef0 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29  c; i++, pFrom++)
1ef00 7b 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70  {.      Table *p
1ef10 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61  Tab = pFrom->pTa
1ef20 62 3b 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57  b;.      if( ALW
1ef30 41 59 53 28 70 54 61 62 21 3d 30 29 20 26 26 20  AYS(pTab!=0) && 
1ef40 28 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20  (pTab->tabFlags 
1ef50 26 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 29 21  & TF_Ephemeral)!
1ef60 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  =0 ){.        /*
1ef70 20 41 20 73 75 62 2d 71 75 65 72 79 20 69 6e 20   A sub-query in 
1ef80 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
1ef90 6f 66 20 61 20 53 45 4c 45 43 54 20 2a 2f 0a 20  of a SELECT */. 
1efa0 20 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70         Select *p
1efb0 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65  Sel = pFrom->pSe
1efc0 6c 65 63 74 3b 0a 20 20 20 20 20 20 20 20 61 73  lect;.        as
1efd0 73 65 72 74 28 20 70 53 65 6c 20 29 3b 0a 20 20  sert( pSel );.  
1efe0 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 53 65        while( pSe
1eff0 6c 2d 3e 70 50 72 69 6f 72 20 29 20 70 53 65 6c  l->pPrior ) pSel
1f000 20 3d 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 3b   = pSel->pPrior;
1f010 0a 20 20 20 20 20 20 20 20 73 65 6c 65 63 74 41  .        selectA
1f020 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43  ddColumnTypeAndC
1f030 6f 6c 6c 61 74 69 6f 6e 28 70 50 61 72 73 65 2c  ollation(pParse,
1f040 20 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 70 54 61   pTab->nCol, pTa
1f050 62 2d 3e 61 43 6f 6c 2c 20 70 53 65 6c 29 3b 0a  b->aCol, pSel);.
1f060 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1f070 7d 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43  }.  return WRC_C
1f080 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 23 65 6e 64 69  ontinue;.}.#endi
1f090 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  f.../*.** This r
1f0a0 6f 75 74 69 6e 65 20 61 64 64 73 20 64 61 74 61  outine adds data
1f0b0 74 79 70 65 20 61 6e 64 20 63 6f 6c 6c 61 74 69  type and collati
1f0c0 6e 67 20 73 65 71 75 65 6e 63 65 20 69 6e 66 6f  ng sequence info
1f0d0 72 6d 61 74 69 6f 6e 20 74 6f 0a 2a 2a 20 74 68  rmation to.** th
1f0e0 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72  e Table structur
1f0f0 65 73 20 6f 66 20 61 6c 6c 20 46 52 4f 4d 2d 63  es of all FROM-c
1f100 6c 61 75 73 65 20 73 75 62 71 75 65 72 69 65 73  lause subqueries
1f110 20 69 6e 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20   in a.** SELECT 
1f120 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a  statement..**.**
1f130 20 55 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e   Use this routin
1f140 65 20 61 66 74 65 72 20 6e 61 6d 65 20 72 65 73  e after name res
1f150 6f 6c 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  olution..*/.stat
1f160 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 53  ic void sqlite3S
1f170 65 6c 65 63 74 41 64 64 54 79 70 65 49 6e 66 6f  electAddTypeInfo
1f180 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1f190 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29  Select *pSelect)
1f1a0 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
1f1b0 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
1f1c0 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 77 2e 78   Walker w;.  w.x
1f1d0 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d  SelectCallback =
1f1e0 20 73 65 6c 65 63 74 41 64 64 53 75 62 71 75 65   selectAddSubque
1f1f0 72 79 54 79 70 65 49 6e 66 6f 3b 0a 20 20 77 2e  ryTypeInfo;.  w.
1f200 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20  xExprCallback = 
1f210 65 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20  exprWalkNoop;.  
1f220 77 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73  w.pParse = pPars
1f230 65 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b  e;.  sqlite3Walk
1f240 53 65 6c 65 63 74 28 26 77 2c 20 70 53 65 6c 65  Select(&w, pSele
1f250 63 74 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a  ct);.#endif.}...
1f260 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
1f270 6e 65 20 73 65 74 73 20 75 70 20 61 20 53 45 4c  ne sets up a SEL
1f280 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 66 6f  ECT statement fo
1f290 72 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 54  r processing.  T
1f2a0 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20  he.** following 
1f2b0 69 73 20 61 63 63 6f 6d 70 6c 69 73 68 65 64 3a  is accomplished:
1f2c0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 20 56 44  .**.**     *  VD
1f2d0 42 45 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72  BE Cursor number
1f2e0 73 20 61 72 65 20 61 73 73 69 67 6e 65 64 20 74  s are assigned t
1f2f0 6f 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73  o all FROM-claus
1f300 65 20 74 65 72 6d 73 2e 0a 2a 2a 20 20 20 20 20  e terms..**     
1f310 2a 20 20 45 70 68 65 6d 65 72 61 6c 20 54 61 62  *  Ephemeral Tab
1f320 6c 65 20 6f 62 6a 65 63 74 73 20 61 72 65 20 63  le objects are c
1f330 72 65 61 74 65 64 20 66 6f 72 20 61 6c 6c 20 46  reated for all F
1f340 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62 71 75  ROM-clause subqu
1f350 65 72 69 65 73 2e 0a 2a 2a 20 20 20 20 20 2a 20  eries..**     * 
1f360 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c   ON and USING cl
1f370 61 75 73 65 73 20 61 72 65 20 73 68 69 66 74 65  auses are shifte
1f380 64 20 69 6e 74 6f 20 57 48 45 52 45 20 73 74 61  d into WHERE sta
1f390 74 65 6d 65 6e 74 73 0a 2a 2a 20 20 20 20 20 2a  tements.**     *
1f3a0 20 20 57 69 6c 64 63 61 72 64 73 20 22 2a 22 20    Wildcards "*" 
1f3b0 61 6e 64 20 22 54 41 42 4c 45 2e 2a 22 20 69 6e  and "TABLE.*" in
1f3c0 20 72 65 73 75 6c 74 20 73 65 74 73 20 61 72 65   result sets are
1f3d0 20 65 78 70 61 6e 64 65 64 2e 0a 2a 2a 20 20 20   expanded..**   
1f3e0 20 20 2a 20 20 49 64 65 6e 74 69 66 69 65 72 73    *  Identifiers
1f3f0 20 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61   in expression a
1f400 72 65 20 6d 61 74 63 68 65 64 20 74 6f 20 74 61  re matched to ta
1f410 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  bles..**.** This
1f420 20 72 6f 75 74 69 6e 65 20 61 63 74 73 20 72 65   routine acts re
1f430 63 75 72 73 69 76 65 6c 79 20 6f 6e 20 61 6c 6c  cursively on all
1f440 20 73 75 62 71 75 65 72 69 65 73 20 77 69 74 68   subqueries with
1f450 69 6e 20 74 68 65 20 53 45 4c 45 43 54 2e 0a 2a  in the SELECT..*
1f460 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65  /.void sqlite3Se
1f470 6c 65 63 74 50 72 65 70 28 0a 20 20 50 61 72 73  lectPrep(.  Pars
1f480 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
1f490 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72     /* The parser
1f4a0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
1f4b0 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
1f4c0 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45       /* The SELE
1f4d0 43 54 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69  CT statement bei
1f4e0 6e 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 4e  ng coded. */.  N
1f4f0 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4f 75 74  ameContext *pOut
1f500 65 72 4e 43 20 20 2f 2a 20 4e 61 6d 65 20 63 6f  erNC  /* Name co
1f510 6e 74 65 78 74 20 66 6f 72 20 63 6f 6e 74 61 69  ntext for contai
1f520 6e 65 72 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  ner */.){.  sqli
1f530 74 65 33 20 2a 64 62 3b 0a 20 20 69 66 28 20 4e  te3 *db;.  if( N
1f540 45 56 45 52 28 70 3d 3d 30 29 20 29 20 72 65 74  EVER(p==0) ) ret
1f550 75 72 6e 3b 0a 20 20 64 62 20 3d 20 70 50 61 72  urn;.  db = pPar
1f560 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 2d  se->db;.  if( p-
1f570 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 48  >selFlags & SF_H
1f580 61 73 54 79 70 65 49 6e 66 6f 20 29 20 72 65 74  asTypeInfo ) ret
1f590 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  urn;.  sqlite3Se
1f5a0 6c 65 63 74 45 78 70 61 6e 64 28 70 50 61 72 73  lectExpand(pPars
1f5b0 65 2c 20 70 29 3b 0a 20 20 69 66 28 20 70 50 61  e, p);.  if( pPa
1f5c0 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d  rse->nErr || db-
1f5d0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
1f5e0 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65  return;.  sqlite
1f5f0 33 52 65 73 6f 6c 76 65 53 65 6c 65 63 74 4e 61  3ResolveSelectNa
1f600 6d 65 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70  mes(pParse, p, p
1f610 4f 75 74 65 72 4e 43 29 3b 0a 20 20 69 66 28 20  OuterNC);.  if( 
1f620 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
1f630 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1f640 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c   ) return;.  sql
1f650 69 74 65 33 53 65 6c 65 63 74 41 64 64 54 79 70  ite3SelectAddTyp
1f660 65 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 29  eInfo(pParse, p)
1f670 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 65 74  ;.}../*.** Reset
1f680 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20 61   the aggregate a
1f690 63 63 75 6d 75 6c 61 74 6f 72 2e 0a 2a 2a 0a 2a  ccumulator..**.*
1f6a0 2a 20 54 68 65 20 61 67 67 72 65 67 61 74 65 20  * The aggregate 
1f6b0 61 63 63 75 6d 75 6c 61 74 6f 72 20 69 73 20 61  accumulator is a
1f6c0 20 73 65 74 20 6f 66 20 6d 65 6d 6f 72 79 20 63   set of memory c
1f6d0 65 6c 6c 73 20 74 68 61 74 20 68 6f 6c 64 0a 2a  ells that hold.*
1f6e0 2a 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 72  * intermediate r
1f6f0 65 73 75 6c 74 73 20 77 68 69 6c 65 20 63 61 6c  esults while cal
1f700 63 75 6c 61 74 69 6e 67 20 61 6e 20 61 67 67 72  culating an aggr
1f710 65 67 61 74 65 2e 20 20 54 68 69 73 0a 2a 2a 20  egate.  This.** 
1f720 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65  routine generate
1f730 73 20 63 6f 64 65 20 74 68 61 74 20 73 74 6f 72  s code that stor
1f740 65 73 20 4e 55 4c 4c 73 20 69 6e 20 61 6c 6c 20  es NULLs in all 
1f750 6f 66 20 74 68 6f 73 65 20 6d 65 6d 6f 72 79 0a  of those memory.
1f760 2a 2a 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 73 74 61  ** cells..*/.sta
1f770 74 69 63 20 76 6f 69 64 20 72 65 73 65 74 41 63  tic void resetAc
1f780 63 75 6d 75 6c 61 74 6f 72 28 50 61 72 73 65 20  cumulator(Parse 
1f790 2a 70 50 61 72 73 65 2c 20 41 67 67 49 6e 66 6f  *pParse, AggInfo
1f7a0 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56   *pAggInfo){.  V
1f7b0 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
1f7c0 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b  >pVdbe;.  int i;
1f7d0 0a 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66  .  struct AggInf
1f7e0 6f 5f 66 75 6e 63 20 2a 70 46 75 6e 63 3b 0a 20  o_func *pFunc;. 
1f7f0 20 69 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e 6e   if( pAggInfo->n
1f800 46 75 6e 63 2b 70 41 67 67 49 6e 66 6f 2d 3e 6e  Func+pAggInfo->n
1f810 43 6f 6c 75 6d 6e 3d 3d 30 20 29 7b 0a 20 20 20  Column==0 ){.   
1f820 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 66   return;.  }.  f
1f830 6f 72 28 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e  or(i=0; i<pAggIn
1f840 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b  fo->nColumn; i++
1f850 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
1f860 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
1f870 75 6c 6c 2c 20 30 2c 20 70 41 67 67 49 6e 66 6f  ull, 0, pAggInfo
1f880 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 4d 65 6d 29 3b  ->aCol[i].iMem);
1f890 0a 20 20 7d 0a 20 20 66 6f 72 28 70 46 75 6e 63  .  }.  for(pFunc
1f8a0 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63  =pAggInfo->aFunc
1f8b0 2c 20 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66  , i=0; i<pAggInf
1f8c0 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70  o->nFunc; i++, p
1f8d0 46 75 6e 63 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  Func++){.    sql
1f8e0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1f8f0 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 46  , OP_Null, 0, pF
1f900 75 6e 63 2d 3e 69 4d 65 6d 29 3b 0a 20 20 20 20  unc->iMem);.    
1f910 69 66 28 20 70 46 75 6e 63 2d 3e 69 44 69 73 74  if( pFunc->iDist
1f920 69 6e 63 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20  inct>=0 ){.     
1f930 20 45 78 70 72 20 2a 70 45 20 3d 20 70 46 75 6e   Expr *pE = pFun
1f940 63 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  c->pExpr;.      
1f950 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
1f960 50 72 6f 70 65 72 74 79 28 70 45 2c 20 45 50 5f  Property(pE, EP_
1f970 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20  xIsSelect) );.  
1f980 20 20 20 20 69 66 28 20 70 45 2d 3e 78 2e 70 4c      if( pE->x.pL
1f990 69 73 74 3d 3d 30 20 7c 7c 20 70 45 2d 3e 78 2e  ist==0 || pE->x.
1f9a0 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20  pList->nExpr!=1 
1f9b0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1f9c0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
1f9d0 65 2c 20 22 44 49 53 54 49 4e 43 54 20 61 67 67  e, "DISTINCT agg
1f9e0 72 65 67 61 74 65 73 20 6d 75 73 74 20 68 61 76  regates must hav
1f9f0 65 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 22 0a  e exactly one ".
1fa00 20 20 20 20 20 20 20 20 20 20 20 22 61 72 67 75             "argu
1fa10 6d 65 6e 74 22 29 3b 0a 20 20 20 20 20 20 20 20  ment");.        
1fa20 70 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74  pFunc->iDistinct
1fa30 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c   = -1;.      }el
1fa40 73 65 7b 0a 20 20 20 20 20 20 20 20 4b 65 79 49  se{.        KeyI
1fa50 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20  nfo *pKeyInfo = 
1fa60 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c  keyInfoFromExprL
1fa70 69 73 74 28 70 50 61 72 73 65 2c 20 70 45 2d 3e  ist(pParse, pE->
1fa80 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  x.pList);.      
1fa90 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1faa0 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  Op4(v, OP_OpenEp
1fab0 68 65 6d 65 72 61 6c 2c 20 70 46 75 6e 63 2d 3e  hemeral, pFunc->
1fac0 69 44 69 73 74 69 6e 63 74 2c 20 30 2c 20 30 2c  iDistinct, 0, 0,
1fad0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1fae0 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
1faf0 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b  *)pKeyInfo, P4_K
1fb00 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b  EYINFO_HANDOFF);
1fb10 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1fb20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f   }.}../*.** Invo
1fb30 6b 65 20 74 68 65 20 4f 50 5f 41 67 67 46 69 6e  ke the OP_AggFin
1fb40 61 6c 69 7a 65 20 6f 70 63 6f 64 65 20 66 6f 72  alize opcode for
1fb50 20 65 76 65 72 79 20 61 67 67 72 65 67 61 74 65   every aggregate
1fb60 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20   function.** in 
1fb70 74 68 65 20 41 67 67 49 6e 66 6f 20 73 74 72 75  the AggInfo stru
1fb80 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  cture..*/.static
1fb90 20 76 6f 69 64 20 66 69 6e 61 6c 69 7a 65 41 67   void finalizeAg
1fba0 67 46 75 6e 63 74 69 6f 6e 73 28 50 61 72 73 65  gFunctions(Parse
1fbb0 20 2a 70 50 61 72 73 65 2c 20 41 67 67 49 6e 66   *pParse, AggInf
1fbc0 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20  o *pAggInfo){.  
1fbd0 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
1fbe0 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
1fbf0 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67 49 6e  ;.  struct AggIn
1fc00 66 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a 20 20 66  fo_func *pF;.  f
1fc10 6f 72 28 69 3d 30 2c 20 70 46 3d 70 41 67 67 49  or(i=0, pF=pAggI
1fc20 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c 70 41  nfo->aFunc; i<pA
1fc30 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69  ggInfo->nFunc; i
1fc40 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20 20 20 45  ++, pF++){.    E
1fc50 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d  xprList *pList =
1fc60 20 70 46 2d 3e 70 45 78 70 72 2d 3e 78 2e 70 4c   pF->pExpr->x.pL
1fc70 69 73 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ist;.    assert(
1fc80 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
1fc90 79 28 70 46 2d 3e 70 45 78 70 72 2c 20 45 50 5f  y(pF->pExpr, EP_
1fca0 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20  xIsSelect) );.  
1fcb0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1fcc0 4f 70 34 28 76 2c 20 4f 50 5f 41 67 67 46 69 6e  Op4(v, OP_AggFin
1fcd0 61 6c 2c 20 70 46 2d 3e 69 4d 65 6d 2c 20 70 4c  al, pF->iMem, pL
1fce0 69 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45 78  ist ? pList->nEx
1fcf0 70 72 20 3a 20 30 2c 20 30 2c 0a 20 20 20 20 20  pr : 0, 0,.     
1fd00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fd10 20 28 76 6f 69 64 2a 29 70 46 2d 3e 70 46 75 6e   (void*)pF->pFun
1fd20 63 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a  c, P4_FUNCDEF);.
1fd30 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70 64    }.}../*.** Upd
1fd40 61 74 65 20 74 68 65 20 61 63 63 75 6d 75 6c 61  ate the accumula
1fd50 74 6f 72 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73  tor memory cells
1fd60 20 66 6f 72 20 61 6e 20 61 67 67 72 65 67 61 74   for an aggregat
1fd70 65 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 74 68  e based on.** th
1fd80 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72  e current cursor
1fd90 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 73 74   position..*/.st
1fda0 61 74 69 63 20 76 6f 69 64 20 75 70 64 61 74 65  atic void update
1fdb0 41 63 63 75 6d 75 6c 61 74 6f 72 28 50 61 72 73  Accumulator(Pars
1fdc0 65 20 2a 70 50 61 72 73 65 2c 20 41 67 67 49 6e  e *pParse, AggIn
1fdd0 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20  fo *pAggInfo){. 
1fde0 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
1fdf0 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
1fe00 69 3b 0a 20 20 69 6e 74 20 72 65 67 48 69 74 20  i;.  int regHit 
1fe10 3d 20 30 3b 0a 20 20 69 6e 74 20 61 64 64 72 48  = 0;.  int addrH
1fe20 69 74 54 65 73 74 20 3d 20 30 3b 0a 20 20 73 74  itTest = 0;.  st
1fe30 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e  ruct AggInfo_fun
1fe40 63 20 2a 70 46 3b 0a 20 20 73 74 72 75 63 74 20  c *pF;.  struct 
1fe50 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 3b  AggInfo_col *pC;
1fe60 0a 0a 20 20 70 41 67 67 49 6e 66 6f 2d 3e 64 69  ..  pAggInfo->di
1fe70 72 65 63 74 4d 6f 64 65 20 3d 20 31 3b 0a 20 20  rectMode = 1;.  
1fe80 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
1fe90 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20  Clear(pParse);. 
1fea0 20 66 6f 72 28 69 3d 30 2c 20 70 46 3d 70 41 67   for(i=0, pF=pAg
1feb0 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c  gInfo->aFunc; i<
1fec0 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b  pAggInfo->nFunc;
1fed0 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20 20   i++, pF++){.   
1fee0 20 69 6e 74 20 6e 41 72 67 3b 0a 20 20 20 20 69   int nArg;.    i
1fef0 6e 74 20 61 64 64 72 4e 65 78 74 20 3d 20 30 3b  nt addrNext = 0;
1ff00 0a 20 20 20 20 69 6e 74 20 72 65 67 41 67 67 3b  .    int regAgg;
1ff10 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70  .    ExprList *p
1ff20 4c 69 73 74 20 3d 20 70 46 2d 3e 70 45 78 70 72  List = pF->pExpr
1ff30 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 61  ->x.pList;.    a
1ff40 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
1ff50 72 6f 70 65 72 74 79 28 70 46 2d 3e 70 45 78 70  roperty(pF->pExp
1ff60 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
1ff70 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73   );.    if( pLis
1ff80 74 20 29 7b 0a 20 20 20 20 20 20 6e 41 72 67 20  t ){.      nArg 
1ff90 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a  = pList->nExpr;.
1ffa0 20 20 20 20 20 20 72 65 67 41 67 67 20 3d 20 73        regAgg = s
1ffb0 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e  qlite3GetTempRan
1ffc0 67 65 28 70 50 61 72 73 65 2c 20 6e 41 72 67 29  ge(pParse, nArg)
1ffd0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1ffe0 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28  xprCodeExprList(
1fff0 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2c 20 72  pParse, pList, r
20000 65 67 41 67 67 2c 20 31 29 3b 0a 20 20 20 20 7d  egAgg, 1);.    }
20010 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 41 72 67  else{.      nArg
20020 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 67 41   = 0;.      regA
20030 67 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  gg = 0;.    }.  
20040 20 20 69 66 28 20 70 46 2d 3e 69 44 69 73 74 69    if( pF->iDisti
20050 6e 63 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  nct>=0 ){.      
20060 61 64 64 72 4e 65 78 74 20 3d 20 73 71 6c 69 74  addrNext = sqlit
20070 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
20080 76 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  v);.      assert
20090 28 20 6e 41 72 67 3d 3d 31 20 29 3b 0a 20 20 20  ( nArg==1 );.   
200a0 20 20 20 63 6f 64 65 44 69 73 74 69 6e 63 74 28     codeDistinct(
200b0 70 50 61 72 73 65 2c 20 70 46 2d 3e 69 44 69 73  pParse, pF->iDis
200c0 74 69 6e 63 74 2c 20 61 64 64 72 4e 65 78 74 2c  tinct, addrNext,
200d0 20 31 2c 20 72 65 67 41 67 67 29 3b 0a 20 20 20   1, regAgg);.   
200e0 20 7d 0a 20 20 20 20 69 66 28 20 70 46 2d 3e 70   }.    if( pF->p
200f0 46 75 6e 63 2d 3e 66 6c 61 67 73 20 26 20 53 51  Func->flags & SQ
20100 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f  LITE_FUNC_NEEDCO
20110 4c 4c 20 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c  LL ){.      Coll
20120 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a  Seq *pColl = 0;.
20130 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70        struct Exp
20140 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
20150 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  m;.      int j;.
20160 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c        assert( pL
20170 69 73 74 21 3d 30 20 29 3b 20 20 2f 2a 20 70 4c  ist!=0 );  /* pL
20180 69 73 74 21 3d 30 20 69 66 20 70 46 2d 3e 70 46  ist!=0 if pF->pF
20190 75 6e 63 20 68 61 73 20 4e 45 45 44 43 4f 4c 4c  unc has NEEDCOLL
201a0 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d   */.      for(j=
201b0 30 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e  0, pItem=pList->
201c0 61 3b 20 21 70 43 6f 6c 6c 20 26 26 20 6a 3c 6e  a; !pColl && j<n
201d0 41 72 67 3b 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b  Arg; j++, pItem+
201e0 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c  +){.        pCol
201f0 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
20200 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
20210 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20  Item->pExpr);.  
20220 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
20230 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20  !pColl ){.      
20240 20 20 70 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65    pColl = pParse
20250 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b  ->db->pDfltColl;
20260 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
20270 66 28 20 72 65 67 48 69 74 3d 3d 30 20 26 26 20  f( regHit==0 && 
20280 70 41 67 67 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d  pAggInfo->nAccum
20290 75 6c 61 74 6f 72 20 29 20 72 65 67 48 69 74 20  ulator ) regHit 
202a0 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
202b0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
202c0 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
202d0 43 6f 6c 6c 53 65 71 2c 20 72 65 67 48 69 74 2c  CollSeq, regHit,
202e0 20 30 2c 20 30 2c 20 28 63 68 61 72 20 2a 29 70   0, 0, (char *)p
202f0 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51  Coll, P4_COLLSEQ
20300 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
20310 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
20320 2c 20 4f 50 5f 41 67 67 53 74 65 70 2c 20 30 2c  , OP_AggStep, 0,
20330 20 72 65 67 41 67 67 2c 20 70 46 2d 3e 69 4d 65   regAgg, pF->iMe
20340 6d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  m,.             
20350 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29           (void*)
20360 70 46 2d 3e 70 46 75 6e 63 2c 20 50 34 5f 46 55  pF->pFunc, P4_FU
20370 4e 43 44 45 46 29 3b 0a 20 20 20 20 73 71 6c 69  NCDEF);.    sqli
20380 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
20390 76 2c 20 28 75 38 29 6e 41 72 67 29 3b 0a 20 20  v, (u8)nArg);.  
203a0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
203b0 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  heAffinityChange
203c0 28 70 50 61 72 73 65 2c 20 72 65 67 41 67 67 2c  (pParse, regAgg,
203d0 20 6e 41 72 67 29 3b 0a 20 20 20 20 73 71 6c 69   nArg);.    sqli
203e0 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61  te3ReleaseTempRa
203f0 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 41  nge(pParse, regA
20400 67 67 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20 69  gg, nArg);.    i
20410 66 28 20 61 64 64 72 4e 65 78 74 20 29 7b 0a 20  f( addrNext ){. 
20420 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
20430 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
20440 61 64 64 72 4e 65 78 74 29 3b 0a 20 20 20 20 20  addrNext);.     
20450 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
20460 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a  eClear(pParse);.
20470 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
20480 42 65 66 6f 72 65 20 70 6f 70 75 6c 61 74 69 6e  Before populatin
20490 67 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74 6f  g the accumulato
204a0 72 20 72 65 67 69 73 74 65 72 73 2c 20 63 6c 65  r registers, cle
204b0 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61  ar the column ca
204c0 63 68 65 2e 0a 20 20 2a 2a 20 4f 74 68 65 72 77  che..  ** Otherw
204d0 69 73 65 2c 20 69 66 20 61 6e 79 20 6f 66 20 74  ise, if any of t
204e0 68 65 20 72 65 71 75 69 72 65 64 20 63 6f 6c 75  he required colu
204f0 6d 6e 20 76 61 6c 75 65 73 20 61 72 65 20 61 6c  mn values are al
20500 72 65 61 64 79 20 70 72 65 73 65 6e 74 20 0a 20  ready present . 
20510 20 2a 2a 20 69 6e 20 72 65 67 69 73 74 65 72 73   ** in registers
20520 2c 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  , sqlite3ExprCod
20530 65 28 29 20 6d 61 79 20 75 73 65 20 4f 50 5f 53  e() may use OP_S
20540 43 6f 70 79 20 74 6f 20 63 6f 70 79 20 74 68 65  Copy to copy the
20550 20 76 61 6c 75 65 0a 20 20 2a 2a 20 74 6f 20 70   value.  ** to p
20560 43 2d 3e 69 4d 65 6d 2e 20 42 75 74 20 62 79 20  C->iMem. But by 
20570 74 68 65 20 74 69 6d 65 20 74 68 65 20 76 61 6c  the time the val
20580 75 65 20 69 73 20 75 73 65 64 2c 20 74 68 65 20  ue is used, the 
20590 6f 72 69 67 69 6e 61 6c 20 72 65 67 69 73 74 65  original registe
205a0 72 0a 20 20 2a 2a 20 6d 61 79 20 68 61 76 65 20  r.  ** may have 
205b0 62 65 65 6e 20 75 73 65 64 2c 20 69 6e 76 61 6c  been used, inval
205c0 69 64 61 74 69 6e 67 20 74 68 65 20 75 6e 64 65  idating the unde
205d0 72 6c 79 69 6e 67 20 62 75 66 66 65 72 20 68 6f  rlying buffer ho
205e0 6c 64 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 74  lding the.  ** t
205f0 65 78 74 20 6f 72 20 62 6c 6f 62 20 76 61 6c 75  ext or blob valu
20600 65 2e 20 53 65 65 20 74 69 63 6b 65 74 20 5b 38  e. See ticket [8
20610 38 33 30 33 34 64 63 62 35 5d 2e 0a 20 20 2a 2a  83034dcb5]..  **
20620 0a 20 20 2a 2a 20 41 6e 6f 74 68 65 72 20 73 6f  .  ** Another so
20630 6c 75 74 69 6f 6e 20 77 6f 75 6c 64 20 62 65 20  lution would be 
20640 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20 4f 50  to change the OP
20650 5f 53 43 6f 70 79 20 75 73 65 64 20 74 6f 20 63  _SCopy used to c
20660 6f 70 79 20 63 61 63 68 65 64 0a 20 20 2a 2a 20  opy cached.  ** 
20670 76 61 6c 75 65 73 20 74 6f 20 61 6e 20 4f 50 5f  values to an OP_
20680 43 6f 70 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  Copy..  */.  if(
20690 20 72 65 67 48 69 74 20 29 7b 0a 20 20 20 20 61   regHit ){.    a
206a0 64 64 72 48 69 74 54 65 73 74 20 3d 20 73 71 6c  ddrHitTest = sql
206b0 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
206c0 2c 20 4f 50 5f 49 66 2c 20 72 65 67 48 69 74 29  , OP_If, regHit)
206d0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45  ;.  }.  sqlite3E
206e0 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50  xprCacheClear(pP
206f0 61 72 73 65 29 3b 0a 20 20 66 6f 72 28 69 3d 30  arse);.  for(i=0
20700 2c 20 70 43 3d 70 41 67 67 49 6e 66 6f 2d 3e 61  , pC=pAggInfo->a
20710 43 6f 6c 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d  Col; i<pAggInfo-
20720 3e 6e 41 63 63 75 6d 75 6c 61 74 6f 72 3b 20 69  >nAccumulator; i
20730 2b 2b 2c 20 70 43 2b 2b 29 7b 0a 20 20 20 20 73  ++, pC++){.    s
20740 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
20750 50 61 72 73 65 2c 20 70 43 2d 3e 70 45 78 70 72  Parse, pC->pExpr
20760 2c 20 70 43 2d 3e 69 4d 65 6d 29 3b 0a 20 20 7d  , pC->iMem);.  }
20770 0a 20 20 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72  .  pAggInfo->dir
20780 65 63 74 4d 6f 64 65 20 3d 20 30 3b 0a 20 20 73  ectMode = 0;.  s
20790 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43  qlite3ExprCacheC
207a0 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20  lear(pParse);.  
207b0 69 66 28 20 61 64 64 72 48 69 74 54 65 73 74 20  if( addrHitTest 
207c0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
207d0 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
207e0 64 72 48 69 74 54 65 73 74 29 3b 0a 20 20 7d 0a  drHitTest);.  }.
207f0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 73  }../*.** Add a s
20800 69 6e 67 6c 65 20 4f 50 5f 45 78 70 6c 61 69 6e  ingle OP_Explain
20810 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20   instruction to 
20820 74 68 65 20 56 44 42 45 20 74 6f 20 65 78 70 6c  the VDBE to expl
20830 61 69 6e 20 61 20 73 69 6d 70 6c 65 0a 2a 2a 20  ain a simple.** 
20840 63 6f 75 6e 74 28 2a 29 20 71 75 65 72 79 20 28  count(*) query (
20850 22 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29  "SELECT count(*)
20860 20 46 52 4f 4d 20 70 54 61 62 22 29 2e 0a 2a 2f   FROM pTab")..*/
20870 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
20880 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 73 74 61  OMIT_EXPLAIN.sta
20890 74 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69 6e  tic void explain
208a0 53 69 6d 70 6c 65 43 6f 75 6e 74 28 0a 20 20 50  SimpleCount(.  P
208b0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
208c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
208d0 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20  * Parse context 
208e0 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  */.  Table *pTab
208f0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
20900 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 62 65       /* Table be
20910 69 6e 67 20 71 75 65 72 69 65 64 20 2a 2f 0a 20  ing queried */. 
20920 20 49 6e 64 65 78 20 2a 70 49 64 78 20 20 20 20   Index *pIdx    
20930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20940 20 2f 2a 20 49 6e 64 65 78 20 75 73 65 64 20 74   /* Index used t
20950 6f 20 6f 70 74 69 6d 69 7a 65 20 73 63 61 6e 2c  o optimize scan,
20960 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20   or NULL */.){. 
20970 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70   if( pParse->exp
20980 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 63  lain==2 ){.    c
20990 68 61 72 20 2a 7a 45 71 70 20 3d 20 73 71 6c 69  har *zEqp = sqli
209a0 74 65 33 4d 50 72 69 6e 74 66 28 70 50 61 72 73  te3MPrintf(pPars
209b0 65 2d 3e 64 62 2c 20 22 53 43 41 4e 20 54 41 42  e->db, "SCAN TAB
209c0 4c 45 20 25 73 20 25 73 25 73 28 7e 25 64 20 72  LE %s %s%s(~%d r
209d0 6f 77 73 29 22 2c 0a 20 20 20 20 20 20 20 20 70  ows)",.        p
209e0 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 0a 20 20 20  Tab->zName, .   
209f0 20 20 20 20 20 70 49 64 78 20 3f 20 22 55 53 49       pIdx ? "USI
20a00 4e 47 20 43 4f 56 45 52 49 4e 47 20 49 4e 44 45  NG COVERING INDE
20a10 58 20 22 20 3a 20 22 22 2c 0a 20 20 20 20 20 20  X " : "",.      
20a20 20 20 70 49 64 78 20 3f 20 70 49 64 78 2d 3e 7a    pIdx ? pIdx->z
20a30 4e 61 6d 65 20 3a 20 22 22 2c 0a 20 20 20 20 20  Name : "",.     
20a40 20 20 20 70 54 61 62 2d 3e 6e 52 6f 77 45 73 74     pTab->nRowEst
20a50 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69  .    );.    sqli
20a60 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 0a 20  te3VdbeAddOp4(. 
20a70 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 70         pParse->p
20a80 56 64 62 65 2c 20 4f 50 5f 45 78 70 6c 61 69 6e  Vdbe, OP_Explain
20a90 2c 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63  , pParse->iSelec
20aa0 74 49 64 2c 20 30 2c 20 30 2c 20 7a 45 71 70 2c  tId, 0, 0, zEqp,
20ab0 20 50 34 5f 44 59 4e 41 4d 49 43 0a 20 20 20 20   P4_DYNAMIC.    
20ac0 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23  );.  }.}.#else.#
20ad0 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69 6e 53   define explainS
20ae0 69 6d 70 6c 65 43 6f 75 6e 74 28 61 2c 62 2c 63  impleCount(a,b,c
20af0 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
20b00 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
20b10 72 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  r the SELECT sta
20b20 74 65 6d 65 6e 74 20 67 69 76 65 6e 20 69 6e 20  tement given in 
20b30 74 68 65 20 70 20 61 72 67 75 6d 65 6e 74 2e 20  the p argument. 
20b40 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75   .**.** The resu
20b50 6c 74 73 20 61 72 65 20 64 69 73 74 72 69 62 75  lts are distribu
20b60 74 65 64 20 69 6e 20 76 61 72 69 6f 75 73 20 77  ted in various w
20b70 61 79 73 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e  ays depending on
20b80 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73   the.** contents
20b90 20 6f 66 20 74 68 65 20 53 65 6c 65 63 74 44 65   of the SelectDe
20ba0 73 74 20 73 74 72 75 63 74 75 72 65 20 70 6f 69  st structure poi
20bb0 6e 74 65 64 20 74 6f 20 62 79 20 61 72 67 75 6d  nted to by argum
20bc0 65 6e 74 20 70 44 65 73 74 0a 2a 2a 20 61 73 20  ent pDest.** as 
20bd0 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
20be0 20 20 20 70 44 65 73 74 2d 3e 65 44 65 73 74 20     pDest->eDest 
20bf0 20 20 20 52 65 73 75 6c 74 0a 2a 2a 20 20 20 20     Result.**    
20c00 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20   ------------   
20c10 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
20c20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
20c30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20  ------------.** 
20c40 20 20 20 20 53 52 54 5f 4f 75 74 70 75 74 20 20      SRT_Output  
20c50 20 20 20 20 47 65 6e 65 72 61 74 65 20 61 20 72      Generate a r
20c60 6f 77 20 6f 66 20 6f 75 74 70 75 74 20 28 75 73  ow of output (us
20c70 69 6e 67 20 74 68 65 20 4f 50 5f 52 65 73 75 6c  ing the OP_Resul
20c80 74 52 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20 20  tRow.**         
20c90 20 20 20 20 20 20 20 20 20 20 20 20 6f 70 63 6f              opco
20ca0 64 65 29 20 66 6f 72 20 65 61 63 68 20 72 6f 77  de) for each row
20cb0 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
20cc0 65 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52  et..**.**     SR
20cd0 54 5f 4d 65 6d 20 20 20 20 20 20 20 20 20 4f 6e  T_Mem         On
20ce0 6c 79 20 76 61 6c 69 64 20 69 66 20 74 68 65 20  ly valid if the 
20cf0 72 65 73 75 6c 74 20 69 73 20 61 20 73 69 6e 67  result is a sing
20d00 6c 65 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 20 20 20  le column..**   
20d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20d20 20 20 53 74 6f 72 65 20 74 68 65 20 66 69 72 73    Store the firs
20d30 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  t column of the 
20d40 66 69 72 73 74 20 72 65 73 75 6c 74 20 72 6f 77  first result row
20d50 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
20d60 20 20 20 20 20 20 20 20 69 6e 20 72 65 67 69 73          in regis
20d70 74 65 72 20 70 44 65 73 74 2d 3e 69 53 44 50 61  ter pDest->iSDPa
20d80 72 6d 20 74 68 65 6e 20 61 62 61 6e 64 6f 6e 20  rm then abandon 
20d90 74 68 65 20 72 65 73 74 0a 2a 2a 20 20 20 20 20  the rest.**     
20da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20db0 6f 66 20 74 68 65 20 71 75 65 72 79 2e 20 20 54  of the query.  T
20dc0 68 69 73 20 64 65 73 74 69 6e 61 74 69 6f 6e 20  his destination 
20dd0 69 6d 70 6c 69 65 73 20 22 4c 49 4d 49 54 20 31  implies "LIMIT 1
20de0 22 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54  "..**.**     SRT
20df0 5f 53 65 74 20 20 20 20 20 20 20 20 20 54 68 65  _Set         The
20e00 20 72 65 73 75 6c 74 20 6d 75 73 74 20 62 65 20   result must be 
20e10 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 2e  a single column.
20e20 20 20 53 74 6f 72 65 20 65 61 63 68 0a 2a 2a 20    Store each.** 
20e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20e40 20 20 20 20 72 6f 77 20 6f 66 20 72 65 73 75 6c      row of resul
20e50 74 20 61 73 20 74 68 65 20 6b 65 79 20 69 6e 20  t as the key in 
20e60 74 61 62 6c 65 20 70 44 65 73 74 2d 3e 69 53 44  table pDest->iSD
20e70 50 61 72 6d 2e 20 0a 2a 2a 20 20 20 20 20 20 20  Parm. .**       
20e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 41 70                Ap
20e90 70 6c 79 20 74 68 65 20 61 66 66 69 6e 69 74 79  ply the affinity
20ea0 20 70 44 65 73 74 2d 3e 61 66 66 53 64 73 74 20   pDest->affSdst 
20eb0 62 65 66 6f 72 65 20 73 74 6f 72 69 6e 67 0a 2a  before storing.*
20ec0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
20ed0 20 20 20 20 20 20 72 65 73 75 6c 74 73 2e 20 20        results.  
20ee0 55 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  Used to implemen
20ef0 74 20 22 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e  t "IN (SELECT ..
20f00 2e 29 22 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  .)"..**.**     S
20f10 52 54 5f 55 6e 69 6f 6e 20 20 20 20 20 20 20 53  RT_Union       S
20f20 74 6f 72 65 20 72 65 73 75 6c 74 73 20 61 73 20  tore results as 
20f30 61 20 6b 65 79 20 69 6e 20 61 20 74 65 6d 70 6f  a key in a tempo
20f40 72 61 72 79 20 74 61 62 6c 65 20 0a 2a 2a 20 20  rary table .**  
20f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20f60 20 20 20 69 64 65 6e 74 69 66 69 65 64 20 62 79     identified by
20f70 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 2e   pDest->iSDParm.
20f80 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 45  .**.**     SRT_E
20f90 78 63 65 70 74 20 20 20 20 20 20 52 65 6d 6f 76  xcept      Remov
20fa0 65 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 74  e results from t
20fb0 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  he temporary tab
20fc0 6c 65 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72  le pDest->iSDPar
20fd0 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54  m..**.**     SRT
20fe0 5f 54 61 62 6c 65 20 20 20 20 20 20 20 53 74 6f  _Table       Sto
20ff0 72 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74 65  re results in te
21000 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 70 44  mporary table pD
21010 65 73 74 2d 3e 69 53 44 50 61 72 6d 2e 0a 2a 2a  est->iSDParm..**
21020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21030 20 20 20 20 20 54 68 69 73 20 69 73 20 6c 69 6b       This is lik
21040 65 20 53 52 54 5f 45 70 68 65 6d 54 61 62 20 65  e SRT_EphemTab e
21050 78 63 65 70 74 20 74 68 61 74 20 74 68 65 20 74  xcept that the t
21060 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  able.**         
21070 20 20 20 20 20 20 20 20 20 20 20 20 69 73 20 61              is a
21080 73 73 75 6d 65 64 20 74 6f 20 61 6c 72 65 61 64  ssumed to alread
21090 79 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a 0a 2a 2a  y be open..**.**
210a0 20 20 20 20 20 53 52 54 5f 45 70 68 65 6d 54 61       SRT_EphemTa
210b0 62 20 20 20 20 43 72 65 61 74 65 20 61 6e 20 74  b    Create an t
210c0 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 70  emporary table p
210d0 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 20 61 6e  Dest->iSDParm an
210e0 64 20 73 74 6f 72 65 0a 2a 2a 20 20 20 20 20 20  d store.**      
210f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
21100 68 65 20 72 65 73 75 6c 74 20 74 68 65 72 65 2e  he result there.
21110 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c   The cursor is l
21120 65 66 74 20 6f 70 65 6e 20 61 66 74 65 72 0a 2a  eft open after.*
21130 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
21140 20 20 20 20 20 20 72 65 74 75 72 6e 69 6e 67 2e        returning.
21150 20 20 54 68 69 73 20 69 73 20 6c 69 6b 65 20 53    This is like S
21160 52 54 5f 54 61 62 6c 65 20 65 78 63 65 70 74 20  RT_Table except 
21170 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  that.**         
21180 20 20 20 20 20 20 20 20 20 20 20 20 74 68 69 73              this
21190 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 75 73 65   destination use
211a0 73 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  s OP_OpenEphemer
211b0 61 6c 20 74 6f 20 63 72 65 61 74 65 0a 2a 2a 20  al to create.** 
211c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
211d0 20 20 20 20 74 68 65 20 74 61 62 6c 65 20 66 69      the table fi
211e0 72 73 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  rst..**.**     S
211f0 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 20 20 47  RT_Coroutine   G
21200 65 6e 65 72 61 74 65 20 61 20 63 6f 2d 72 6f 75  enerate a co-rou
21210 74 69 6e 65 20 74 68 61 74 20 72 65 74 75 72 6e  tine that return
21220 73 20 61 20 6e 65 77 20 72 6f 77 20 6f 66 0a 2a  s a new row of.*
21230 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
21240 20 20 20 20 20 20 72 65 73 75 6c 74 73 20 65 61        results ea
21250 63 68 20 74 69 6d 65 20 69 74 20 69 73 20 69 6e  ch time it is in
21260 76 6f 6b 65 64 2e 20 20 54 68 65 20 65 6e 74 72  voked.  The entr
21270 79 20 70 6f 69 6e 74 0a 2a 2a 20 20 20 20 20 20  y point.**      
21280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
21290 66 20 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65  f the co-routine
212a0 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 72 65   is stored in re
212b0 67 69 73 74 65 72 20 70 44 65 73 74 2d 3e 69 53  gister pDest->iS
212c0 44 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  DParm..**.**    
212d0 20 53 52 54 5f 45 78 69 73 74 73 20 20 20 20 20   SRT_Exists     
212e0 20 53 74 6f 72 65 20 61 20 31 20 69 6e 20 6d 65   Store a 1 in me
212f0 6d 6f 72 79 20 63 65 6c 6c 20 70 44 65 73 74 2d  mory cell pDest-
21300 3e 69 53 44 50 61 72 6d 20 69 66 20 74 68 65 20  >iSDParm if the 
21310 72 65 73 75 6c 74 0a 2a 2a 20 20 20 20 20 20 20  result.**       
21320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65                se
21330 74 20 69 73 20 6e 6f 74 20 65 6d 70 74 79 2e 0a  t is not empty..
21340 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 44 69  **.**     SRT_Di
21350 73 63 61 72 64 20 20 20 20 20 54 68 72 6f 77 20  scard     Throw 
21360 74 68 65 20 72 65 73 75 6c 74 73 20 61 77 61 79  the results away
21370 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20  .  This is used 
21380 62 79 20 53 45 4c 45 43 54 0a 2a 2a 20 20 20 20  by SELECT.**    
21390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
213a0 20 73 74 61 74 65 6d 65 6e 74 73 20 77 69 74 68   statements with
213b0 69 6e 20 74 72 69 67 67 65 72 73 20 77 68 6f 73  in triggers whos
213c0 65 20 6f 6e 6c 79 20 70 75 72 70 6f 73 65 20 69  e only purpose i
213d0 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  s.**            
213e0 20 20 20 20 20 20 20 20 20 74 68 65 20 73 69 64           the sid
213f0 65 2d 65 66 66 65 63 74 73 20 6f 66 20 66 75 6e  e-effects of fun
21400 63 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  ctions..**.** Th
21410 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
21420 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ns the number of
21430 20 65 72 72 6f 72 73 2e 20 20 49 66 20 61 6e 79   errors.  If any
21440 20 65 72 72 6f 72 73 20 61 72 65 0a 2a 2a 20 65   errors are.** e
21450 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 65 6e  ncountered, then
21460 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20   an appropriate 
21470 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73  error message is
21480 20 6c 65 66 74 20 69 6e 0a 2a 2a 20 70 50 61 72   left in.** pPar
21490 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a  se->zErrMsg..**.
214a0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
214b0 64 6f 65 73 20 4e 4f 54 20 66 72 65 65 20 74 68  does NOT free th
214c0 65 20 53 65 6c 65 63 74 20 73 74 72 75 63 74 75  e Select structu
214d0 72 65 20 70 61 73 73 65 64 20 69 6e 2e 20 20 54  re passed in.  T
214e0 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 66 75  he.** calling fu
214f0 6e 63 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f 20  nction needs to 
21500 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a 69 6e 74 20  do that..*/.int 
21510 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 0a 20  sqlite3Select(. 
21520 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
21530 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
21540 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
21550 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
21560 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
21570 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
21580 74 20 62 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a  t being coded. *
21590 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a  /.  SelectDest *
215a0 70 44 65 73 74 20 20 20 20 20 20 2f 2a 20 57 68  pDest      /* Wh
215b0 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 74 68  at to do with th
215c0 65 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20  e query results 
215d0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a  */.){.  int i, j
215e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
215f0 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20  * Loop counters 
21600 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  */.  WhereInfo *
21610 70 57 49 6e 66 6f 3b 20 20 20 20 20 2f 2a 20 52  pWInfo;     /* R
21620 65 74 75 72 6e 20 66 72 6f 6d 20 73 71 6c 69 74  eturn from sqlit
21630 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 2a  e3WhereBegin() *
21640 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20  /.  Vdbe *v;    
21650 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
21660 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  e virtual machin
21670 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  e under construc
21680 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 73  tion */.  int is
21690 41 67 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  Agg;            
216a0 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 73 65 6c   /* True for sel
216b0 65 63 74 20 6c 69 73 74 73 20 6c 69 6b 65 20 22  ect lists like "
216c0 63 6f 75 6e 74 28 2a 29 22 20 2a 2f 0a 20 20 45  count(*)" */.  E
216d0 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b  xprList *pEList;
216e0 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
216f0 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 65 78 74 72   columns to extr
21700 61 63 74 2e 20 2a 2f 0a 20 20 53 72 63 4c 69 73  act. */.  SrcLis
21710 74 20 2a 70 54 61 62 4c 69 73 74 3b 20 20 20 20  t *pTabList;    
21720 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c   /* List of tabl
21730 65 73 20 74 6f 20 73 65 6c 65 63 74 20 66 72 6f  es to select fro
21740 6d 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68  m */.  Expr *pWh
21750 65 72 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ere;          /*
21760 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
21770 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20  e.  May be NULL 
21780 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
21790 4f 72 64 65 72 42 79 3b 20 20 20 20 2f 2a 20 54  OrderBy;    /* T
217a0 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
217b0 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c  se.  May be NULL
217c0 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
217d0 70 47 72 6f 75 70 42 79 3b 20 20 20 20 2f 2a 20  pGroupBy;    /* 
217e0 54 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61  The GROUP BY cla
217f0 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c  use.  May be NUL
21800 4c 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 48 61  L */.  Expr *pHa
21810 76 69 6e 67 3b 20 20 20 20 20 20 20 20 20 2f 2a  ving;         /*
21820 20 54 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75   The HAVING clau
21830 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c  se.  May be NULL
21840 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 31   */.  int rc = 1
21850 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
21860 56 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20  Value to return 
21870 66 72 6f 6d 20 74 68 69 73 20 66 75 6e 63 74 69  from this functi
21880 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  on */.  int addr
21890 53 6f 72 74 49 6e 64 65 78 3b 20 20 20 20 20 2f  SortIndex;     /
218a0 2a 20 41 64 64 72 65 73 73 20 6f 66 20 61 6e 20  * Address of an 
218b0 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
218c0 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a   instruction */.
218d0 20 20 44 69 73 74 69 6e 63 74 43 74 78 20 73 44    DistinctCtx sD
218e0 69 73 74 69 6e 63 74 3b 20 2f 2a 20 49 6e 66 6f  istinct; /* Info
218f0 20 6f 6e 20 68 6f 77 20 74 6f 20 63 6f 64 65 20   on how to code 
21900 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79  the DISTINCT key
21910 77 6f 72 64 20 2a 2f 0a 20 20 41 67 67 49 6e 66  word */.  AggInf
21920 6f 20 73 41 67 67 49 6e 66 6f 3b 20 20 20 20 20  o sAggInfo;     
21930 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20   /* Information 
21940 75 73 65 64 20 62 79 20 61 67 67 72 65 67 61 74  used by aggregat
21950 65 20 71 75 65 72 69 65 73 20 2a 2f 0a 20 20 69  e queries */.  i
21960 6e 74 20 69 45 6e 64 3b 20 20 20 20 20 20 20 20  nt iEnd;        
21970 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
21980 20 6f 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74   of the end of t
21990 68 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 73 71  he query */.  sq
219a0 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20  lite3 *db;      
219b0 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
219c0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
219d0 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
219e0 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a  TE_OMIT_EXPLAIN.
219f0 20 20 69 6e 74 20 69 52 65 73 74 6f 72 65 53 65    int iRestoreSe
21a00 6c 65 63 74 49 64 20 3d 20 70 50 61 72 73 65 2d  lectId = pParse-
21a10 3e 69 53 65 6c 65 63 74 49 64 3b 0a 20 20 70 50  >iSelectId;.  pP
21a20 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 20  arse->iSelectId 
21a30 3d 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53  = pParse->iNextS
21a40 65 6c 65 63 74 49 64 2b 2b 3b 0a 23 65 6e 64 69  electId++;.#endi
21a50 66 0a 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65  f..  db = pParse
21a60 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 3d 3d 30  ->db;.  if( p==0
21a70 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
21a80 69 6c 65 64 20 7c 7c 20 70 50 61 72 73 65 2d 3e  iled || pParse->
21a90 6e 45 72 72 20 29 7b 0a 20 20 20 20 72 65 74 75  nErr ){.    retu
21aa0 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 1;.  }.  if( 
21ab0 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
21ac0 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
21ad0 53 45 4c 45 43 54 2c 20 30 2c 20 30 2c 20 30 29  SELECT, 0, 0, 0)
21ae0 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 6d   ) return 1;.  m
21af0 65 6d 73 65 74 28 26 73 41 67 67 49 6e 66 6f 2c  emset(&sAggInfo,
21b00 20 30 2c 20 73 69 7a 65 6f 66 28 73 41 67 67 49   0, sizeof(sAggI
21b10 6e 66 6f 29 29 3b 0a 0a 20 20 69 66 28 20 49 67  nfo));..  if( Ig
21b20 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62 79 28 70  norableOrderby(p
21b30 44 65 73 74 29 20 29 7b 0a 20 20 20 20 61 73 73  Dest) ){.    ass
21b40 65 72 74 28 70 44 65 73 74 2d 3e 65 44 65 73 74  ert(pDest->eDest
21b50 3d 3d 53 52 54 5f 45 78 69 73 74 73 20 7c 7c 20  ==SRT_Exists || 
21b60 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52  pDest->eDest==SR
21b70 54 5f 55 6e 69 6f 6e 20 7c 7c 20 0a 20 20 20 20  T_Union || .    
21b80 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e 65 44         pDest->eD
21b90 65 73 74 3d 3d 53 52 54 5f 45 78 63 65 70 74 20  est==SRT_Except 
21ba0 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d  || pDest->eDest=
21bb0 3d 53 52 54 5f 44 69 73 63 61 72 64 29 3b 0a 20  =SRT_Discard);. 
21bc0 20 20 20 2f 2a 20 49 66 20 4f 52 44 45 52 20 42     /* If ORDER B
21bd0 59 20 6d 61 6b 65 73 20 6e 6f 20 64 69 66 66 65  Y makes no diffe
21be0 72 65 6e 63 65 20 69 6e 20 74 68 65 20 6f 75 74  rence in the out
21bf0 70 75 74 20 74 68 65 6e 20 6e 65 69 74 68 65 72  put then neither
21c00 20 64 6f 65 73 0a 20 20 20 20 2a 2a 20 44 49 53   does.    ** DIS
21c10 54 49 4e 43 54 20 73 6f 20 69 74 20 63 61 6e 20  TINCT so it can 
21c20 62 65 20 72 65 6d 6f 76 65 64 20 74 6f 6f 2e 20  be removed too. 
21c30 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  */.    sqlite3Ex
21c40 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
21c50 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20   p->pOrderBy);. 
21c60 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d     p->pOrderBy =
21c70 20 30 3b 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c   0;.    p->selFl
21c80 61 67 73 20 26 3d 20 7e 53 46 5f 44 69 73 74 69  ags &= ~SF_Disti
21c90 6e 63 74 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  nct;.  }.  sqlit
21ca0 65 33 53 65 6c 65 63 74 50 72 65 70 28 70 50 61  e3SelectPrep(pPa
21cb0 72 73 65 2c 20 70 2c 20 30 29 3b 0a 20 20 70 4f  rse, p, 0);.  pO
21cc0 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64  rderBy = p->pOrd
21cd0 65 72 42 79 3b 0a 20 20 70 54 61 62 4c 69 73 74  erBy;.  pTabList
21ce0 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 45   = p->pSrc;.  pE
21cf0 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74  List = p->pEList
21d00 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
21d10 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  nErr || db->mall
21d20 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
21d30 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
21d40 0a 20 20 7d 0a 20 20 69 73 41 67 67 20 3d 20 28  .  }.  isAgg = (
21d50 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
21d60 5f 41 67 67 72 65 67 61 74 65 29 21 3d 30 3b 0a  _Aggregate)!=0;.
21d70 20 20 61 73 73 65 72 74 28 20 70 45 4c 69 73 74    assert( pEList
21d80 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 42 65 67  !=0 );..  /* Beg
21d90 69 6e 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f  in generating co
21da0 64 65 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73  de..  */.  v = s
21db0 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
21dc0 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d  arse);.  if( v==
21dd0 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f  0 ) goto select_
21de0 65 6e 64 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 72  end;..  /* If wr
21df0 69 74 69 6e 67 20 74 6f 20 6d 65 6d 6f 72 79 20  iting to memory 
21e00 6f 72 20 67 65 6e 65 72 61 74 69 6e 67 20 61 20  or generating a 
21e10 73 65 74 0a 20 20 2a 2a 20 6f 6e 6c 79 20 61 20  set.  ** only a 
21e20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6d 61  single column ma
21e30 79 20 62 65 20 6f 75 74 70 75 74 2e 0a 20 20 2a  y be output..  *
21e40 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
21e50 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
21e60 20 69 66 28 20 63 68 65 63 6b 46 6f 72 4d 75 6c   if( checkForMul
21e70 74 69 43 6f 6c 75 6d 6e 53 65 6c 65 63 74 45 72  tiColumnSelectEr
21e80 72 6f 72 28 70 50 61 72 73 65 2c 20 70 44 65 73  ror(pParse, pDes
21e90 74 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  t, pEList->nExpr
21ea0 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65  ) ){.    goto se
21eb0 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 23 65  lect_end;.  }.#e
21ec0 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  ndif..  /* Gener
21ed0 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 6c 6c  ate code for all
21ee0 20 73 75 62 2d 71 75 65 72 69 65 73 20 69 6e 20   sub-queries in 
21ef0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a  the FROM clause.
21f00 20 20 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65    */.#if !define
21f10 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  d(SQLITE_OMIT_SU
21f20 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69  BQUERY) || !defi
21f30 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
21f40 56 49 45 57 29 0a 20 20 66 6f 72 28 69 3d 30 3b  VIEW).  for(i=0;
21f50 20 21 70 2d 3e 70 50 72 69 6f 72 20 26 26 20 69   !p->pPrior && i
21f60 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b  <pTabList->nSrc;
21f70 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63   i++){.    struc
21f80 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
21f90 70 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73  pItem = &pTabLis
21fa0 74 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 53 65 6c  t->a[i];.    Sel
21fb0 65 63 74 44 65 73 74 20 64 65 73 74 3b 0a 20 20  ectDest dest;.  
21fc0 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 20 3d    Select *pSub =
21fd0 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b   pItem->pSelect;
21fe0 0a 20 20 20 20 69 6e 74 20 69 73 41 67 67 53 75  .    int isAggSu
21ff0 62 3b 0a 0a 20 20 20 20 69 66 28 20 70 53 75 62  b;..    if( pSub
22000 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
22010 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 61      if( pItem->a
22020 64 64 72 46 69 6c 6c 53 75 62 20 29 7b 0a 20 20  ddrFillSub ){.  
22030 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
22040 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75  ddOp2(v, OP_Gosu
22050 62 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74  b, pItem->regRet
22060 75 72 6e 2c 20 70 49 74 65 6d 2d 3e 61 64 64 72  urn, pItem->addr
22070 46 69 6c 6c 53 75 62 29 3b 0a 20 20 20 20 20 20  FillSub);.      
22080 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a  continue;.    }.
22090 0a 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e  .    /* Incremen
220a0 74 20 50 61 72 73 65 2e 6e 48 65 69 67 68 74 20  t Parse.nHeight 
220b0 62 79 20 74 68 65 20 68 65 69 67 68 74 20 6f 66  by the height of
220c0 20 74 68 65 20 6c 61 72 67 65 73 74 20 65 78 70   the largest exp
220d0 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2a 20 74  ression.    ** t
220e0 72 65 65 20 72 65 66 65 72 65 64 20 74 6f 20 62  ree refered to b
220f0 79 20 74 68 69 73 2c 20 74 68 65 20 70 61 72 65  y this, the pare
22100 6e 74 20 73 65 6c 65 63 74 2e 20 54 68 65 20 63  nt select. The c
22110 68 69 6c 64 20 73 65 6c 65 63 74 0a 20 20 20 20  hild select.    
22120 2a 2a 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 65  ** may contain e
22130 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 73 20  xpression trees 
22140 6f 66 20 61 74 20 6d 6f 73 74 0a 20 20 20 20 2a  of at most.    *
22150 2a 20 28 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58  * (SQLITE_MAX_EX
22160 50 52 5f 44 45 50 54 48 2d 50 61 72 73 65 2e 6e  PR_DEPTH-Parse.n
22170 48 65 69 67 68 74 29 20 68 65 69 67 68 74 2e 20  Height) height. 
22180 54 68 69 73 20 69 73 20 61 20 62 69 74 0a 20 20  This is a bit.  
22190 20 20 2a 2a 20 6d 6f 72 65 20 63 6f 6e 73 65 72    ** more conser
221a0 76 61 74 69 76 65 20 74 68 61 6e 20 6e 65 63 65  vative than nece
221b0 73 73 61 72 79 2c 20 62 75 74 20 6d 75 63 68 20  ssary, but much 
221c0 65 61 73 69 65 72 20 74 68 61 6e 20 65 6e 66 6f  easier than enfo
221d0 72 63 69 6e 67 0a 20 20 20 20 2a 2a 20 61 6e 20  rcing.    ** an 
221e0 65 78 61 63 74 20 6c 69 6d 69 74 2e 0a 20 20 20  exact limit..   
221f0 20 2a 2f 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   */.    pParse->
22200 6e 48 65 69 67 68 74 20 2b 3d 20 73 71 6c 69 74  nHeight += sqlit
22210 65 33 53 65 6c 65 63 74 45 78 70 72 48 65 69 67  e3SelectExprHeig
22220 68 74 28 70 29 3b 0a 0a 20 20 20 20 69 73 41 67  ht(p);..    isAg
22230 67 53 75 62 20 3d 20 28 70 53 75 62 2d 3e 73 65  gSub = (pSub->se
22240 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67 67 72  lFlags & SF_Aggr
22250 65 67 61 74 65 29 21 3d 30 3b 0a 20 20 20 20 69  egate)!=0;.    i
22260 66 28 20 66 6c 61 74 74 65 6e 53 75 62 71 75 65  f( flattenSubque
22270 72 79 28 70 50 61 72 73 65 2c 20 70 2c 20 69 2c  ry(pParse, p, i,
22280 20 69 73 41 67 67 2c 20 69 73 41 67 67 53 75 62   isAgg, isAggSub
22290 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  ) ){.      /* Th
222a0 69 73 20 73 75 62 71 75 65 72 79 20 63 61 6e 20  is subquery can 
222b0 62 65 20 61 62 73 6f 72 62 65 64 20 69 6e 74 6f  be absorbed into
222c0 20 69 74 73 20 70 61 72 65 6e 74 2e 20 2a 2f 0a   its parent. */.
222d0 20 20 20 20 20 20 69 66 28 20 69 73 41 67 67 53        if( isAggS
222e0 75 62 20 29 7b 0a 20 20 20 20 20 20 20 20 69 73  ub ){.        is
222f0 41 67 67 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  Agg = 1;.       
22300 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20   p->selFlags |= 
22310 53 46 5f 41 67 67 72 65 67 61 74 65 3b 0a 20 20  SF_Aggregate;.  
22320 20 20 20 20 7d 0a 20 20 20 20 20 20 69 20 3d 20      }.      i = 
22330 2d 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  -1;.    }else{. 
22340 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
22350 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68   a subroutine th
22360 61 74 20 77 69 6c 6c 20 66 69 6c 6c 20 61 6e 20  at will fill an 
22370 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20  ephemeral table 
22380 77 69 74 68 0a 20 20 20 20 20 20 2a 2a 20 74 68  with.      ** th
22390 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 69  e content of thi
223a0 73 20 73 75 62 71 75 65 72 79 2e 20 20 70 49 74  s subquery.  pIt
223b0 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20  em->addrFillSub 
223c0 77 69 6c 6c 20 70 6f 69 6e 74 0a 20 20 20 20 20  will point.     
223d0 20 2a 2a 20 74 6f 20 74 68 65 20 61 64 64 72 65   ** to the addre
223e0 73 73 20 6f 66 20 74 68 65 20 67 65 6e 65 72 61  ss of the genera
223f0 74 65 64 20 73 75 62 72 6f 75 74 69 6e 65 2e 20  ted subroutine. 
22400 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72   pItem->regRetur
22410 6e 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 61 20  n.      ** is a 
22420 72 65 67 69 73 74 65 72 20 61 6c 6c 6f 63 61 74  register allocat
22430 65 64 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 73  ed to hold the s
22440 75 62 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  ubroutine return
22450 20 61 64 64 72 65 73 73 0a 20 20 20 20 20 20 2a   address.      *
22460 2f 0a 20 20 20 20 20 20 69 6e 74 20 74 6f 70 41  /.      int topA
22470 64 64 72 3b 0a 20 20 20 20 20 20 69 6e 74 20 6f  ddr;.      int o
22480 6e 63 65 41 64 64 72 20 3d 20 30 3b 0a 20 20 20  nceAddr = 0;.   
22490 20 20 20 69 6e 74 20 72 65 74 41 64 64 72 3b 0a     int retAddr;.
224a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
224b0 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62  tem->addrFillSub
224c0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 49 74  ==0 );.      pIt
224d0 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 20 3d 20  em->regReturn = 
224e0 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
224f0 20 20 20 20 20 20 74 6f 70 41 64 64 72 20 3d 20        topAddr = 
22500 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
22510 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
22520 20 30 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65   0, pItem->regRe
22530 74 75 72 6e 29 3b 0a 20 20 20 20 20 20 70 49 74  turn);.      pIt
22540 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20  em->addrFillSub 
22550 3d 20 74 6f 70 41 64 64 72 2b 31 3b 0a 20 20 20  = topAddr+1;.   
22560 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65     VdbeNoopComme
22570 6e 74 28 28 76 2c 20 22 6d 61 74 65 72 69 61 6c  nt((v, "material
22580 69 7a 65 20 25 73 22 2c 20 70 49 74 65 6d 2d 3e  ize %s", pItem->
22590 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20  pTab->zName));. 
225a0 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
225b0 69 73 43 6f 72 72 65 6c 61 74 65 64 3d 3d 30 20  isCorrelated==0 
225c0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66  ){.        /* If
225d0 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73   the subquery is
225e0 20 6e 6f 20 63 6f 72 72 65 6c 61 74 65 64 20 61   no correlated a
225f0 6e 64 20 69 66 20 77 65 20 61 72 65 20 6e 6f 74  nd if we are not
22600 20 69 6e 73 69 64 65 20 6f 66 0a 20 20 20 20 20   inside of.     
22610 20 20 20 2a 2a 20 61 20 74 72 69 67 67 65 72 2c     ** a trigger,
22620 20 74 68 65 6e 20 77 65 20 6f 6e 6c 79 20 6e 65   then we only ne
22630 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68  ed to compute th
22640 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 73  e value of the s
22650 75 62 71 75 65 72 79 0a 20 20 20 20 20 20 20 20  ubquery.        
22660 2a 2a 20 6f 6e 63 65 2e 20 2a 2f 0a 20 20 20 20  ** once. */.    
22670 20 20 20 20 6f 6e 63 65 41 64 64 72 20 3d 20 73      onceAddr = s
22680 71 6c 69 74 65 33 43 6f 64 65 4f 6e 63 65 28 70  qlite3CodeOnce(p
22690 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 7d 0a  Parse);.      }.
226a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
226b0 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73  ectDestInit(&des
226c0 74 2c 20 53 52 54 5f 45 70 68 65 6d 54 61 62 2c  t, SRT_EphemTab,
226d0 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29   pItem->iCursor)
226e0 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53  ;.      explainS
226f0 65 74 49 6e 74 65 67 65 72 28 70 49 74 65 6d 2d  etInteger(pItem-
22700 3e 69 53 65 6c 65 63 74 49 64 2c 20 28 75 38 29  >iSelectId, (u8)
22710 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c  pParse->iNextSel
22720 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 73 71  ectId);.      sq
22730 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
22740 73 65 2c 20 70 53 75 62 2c 20 26 64 65 73 74 29  se, pSub, &dest)
22750 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70  ;.      pItem->p
22760 54 61 62 2d 3e 6e 52 6f 77 45 73 74 20 3d 20 28  Tab->nRowEst = (
22770 75 6e 73 69 67 6e 65 64 29 70 53 75 62 2d 3e 6e  unsigned)pSub->n
22780 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20 20  SelectRow;.     
22790 20 69 66 28 20 6f 6e 63 65 41 64 64 72 20 29 20   if( onceAddr ) 
227a0 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
227b0 65 72 65 28 76 2c 20 6f 6e 63 65 41 64 64 72 29  ere(v, onceAddr)
227c0 3b 0a 20 20 20 20 20 20 72 65 74 41 64 64 72 20  ;.      retAddr 
227d0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
227e0 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e  Op1(v, OP_Return
227f0 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75  , pItem->regRetu
22800 72 6e 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  rn);.      VdbeC
22810 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6e 64 20  omment((v, "end 
22820 25 73 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62  %s", pItem->pTab
22830 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20  ->zName));.     
22840 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
22850 67 65 50 31 28 76 2c 20 74 6f 70 41 64 64 72 2c  geP1(v, topAddr,
22860 20 72 65 74 41 64 64 72 29 3b 0a 20 20 20 20 20   retAddr);.     
22870 20 73 71 6c 69 74 65 33 43 6c 65 61 72 54 65 6d   sqlite3ClearTem
22880 70 52 65 67 43 61 63 68 65 28 70 50 61 72 73 65  pRegCache(pParse
22890 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
228a0 20 2f 2a 70 50 61 72 73 65 2d 3e 6e 45 72 72 20   /*pParse->nErr 
228b0 7c 7c 2a 2f 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ||*/ db->mallocF
228c0 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 67  ailed ){.      g
228d0 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
228e0 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65      }.    pParse
228f0 2d 3e 6e 48 65 69 67 68 74 20 2d 3d 20 73 71 6c  ->nHeight -= sql
22900 69 74 65 33 53 65 6c 65 63 74 45 78 70 72 48 65  ite3SelectExprHe
22910 69 67 68 74 28 70 29 3b 0a 20 20 20 20 70 54 61  ight(p);.    pTa
22920 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b  bList = p->pSrc;
22930 0a 20 20 20 20 69 66 28 20 21 49 67 6e 6f 72 61  .    if( !Ignora
22940 62 6c 65 4f 72 64 65 72 62 79 28 70 44 65 73 74  bleOrderby(pDest
22950 29 20 29 7b 0a 20 20 20 20 20 20 70 4f 72 64 65  ) ){.      pOrde
22960 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42  rBy = p->pOrderB
22970 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  y;.    }.  }.  p
22980 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73  EList = p->pELis
22990 74 3b 0a 23 65 6e 64 69 66 0a 20 20 70 57 68 65  t;.#endif.  pWhe
229a0 72 65 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a  re = p->pWhere;.
229b0 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e    pGroupBy = p->
229c0 70 47 72 6f 75 70 42 79 3b 0a 20 20 70 48 61 76  pGroupBy;.  pHav
229d0 69 6e 67 20 3d 20 70 2d 3e 70 48 61 76 69 6e 67  ing = p->pHaving
229e0 3b 0a 20 20 73 44 69 73 74 69 6e 63 74 2e 69 73  ;.  sDistinct.is
229f0 54 6e 63 74 20 3d 20 28 70 2d 3e 73 65 6c 46 6c  Tnct = (p->selFl
22a00 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63  ags & SF_Distinc
22a10 74 29 21 3d 30 3b 0a 0a 23 69 66 6e 64 65 66 20  t)!=0;..#ifndef 
22a20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50  SQLITE_OMIT_COMP
22a30 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 20 20 2f 2a  OUND_SELECT.  /*
22a40 20 49 66 20 74 68 65 72 65 20 69 73 20 61 72 65   If there is are
22a50 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20 71   a sequence of q
22a60 75 65 72 69 65 73 2c 20 64 6f 20 74 68 65 20 65  ueries, do the e
22a70 61 72 6c 69 65 72 20 6f 6e 65 73 20 66 69 72 73  arlier ones firs
22a80 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  t..  */.  if( p-
22a90 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 69  >pPrior ){.    i
22aa0 66 28 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74  f( p->pRightmost
22ab0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 53 65 6c  ==0 ){.      Sel
22ac0 65 63 74 20 2a 70 4c 6f 6f 70 2c 20 2a 70 52 69  ect *pLoop, *pRi
22ad0 67 68 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  ght = 0;.      i
22ae0 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20  nt cnt = 0;.    
22af0 20 20 69 6e 74 20 6d 78 53 65 6c 65 63 74 3b 0a    int mxSelect;.
22b00 20 20 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d        for(pLoop=
22b10 70 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d  p; pLoop; pLoop=
22b20 70 4c 6f 6f 70 2d 3e 70 50 72 69 6f 72 2c 20 63  pLoop->pPrior, c
22b30 6e 74 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70  nt++){.        p
22b40 4c 6f 6f 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74  Loop->pRightmost
22b50 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 70 4c   = p;.        pL
22b60 6f 6f 70 2d 3e 70 4e 65 78 74 20 3d 20 70 52 69  oop->pNext = pRi
22b70 67 68 74 3b 0a 20 20 20 20 20 20 20 20 70 52 69  ght;.        pRi
22b80 67 68 74 20 3d 20 70 4c 6f 6f 70 3b 0a 20 20 20  ght = pLoop;.   
22b90 20 20 20 7d 0a 20 20 20 20 20 20 6d 78 53 65 6c     }.      mxSel
22ba0 65 63 74 20 3d 20 64 62 2d 3e 61 4c 69 6d 69 74  ect = db->aLimit
22bb0 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f  [SQLITE_LIMIT_CO
22bc0 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 5d 3b 0a  MPOUND_SELECT];.
22bd0 20 20 20 20 20 20 69 66 28 20 6d 78 53 65 6c 65        if( mxSele
22be0 63 74 20 26 26 20 63 6e 74 3e 6d 78 53 65 6c 65  ct && cnt>mxSele
22bf0 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ct ){.        sq
22c00 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
22c10 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20  arse, "too many 
22c20 74 65 72 6d 73 20 69 6e 20 63 6f 6d 70 6f 75 6e  terms in compoun
22c30 64 20 53 45 4c 45 43 54 22 29 3b 0a 20 20 20 20  d SELECT");.    
22c40 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
22c50 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  end;.      }.   
22c60 20 7d 0a 20 20 20 20 72 63 20 3d 20 6d 75 6c 74   }.    rc = mult
22c70 69 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  iSelect(pParse, 
22c80 70 2c 20 70 44 65 73 74 29 3b 0a 20 20 20 20 65  p, pDest);.    e
22c90 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72  xplainSetInteger
22ca0 28 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74  (pParse->iSelect
22cb0 49 64 2c 20 69 52 65 73 74 6f 72 65 53 65 6c 65  Id, iRestoreSele
22cc0 63 74 49 64 29 3b 0a 20 20 20 20 72 65 74 75 72  ctId);.    retur
22cd0 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  n rc;.  }.#endif
22ce0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
22cf0 69 73 20 62 6f 74 68 20 61 20 47 52 4f 55 50 20  is both a GROUP 
22d00 42 59 20 61 6e 64 20 61 6e 20 4f 52 44 45 52 20  BY and an ORDER 
22d10 42 59 20 63 6c 61 75 73 65 20 61 6e 64 20 74 68  BY clause and th
22d20 65 79 20 61 72 65 0a 20 20 2a 2a 20 69 64 65 6e  ey are.  ** iden
22d30 74 69 63 61 6c 2c 20 74 68 65 6e 20 64 69 73 61  tical, then disa
22d40 62 6c 65 20 74 68 65 20 4f 52 44 45 52 20 42 59  ble the ORDER BY
22d50 20 63 6c 61 75 73 65 20 73 69 6e 63 65 20 74 68   clause since th
22d60 65 20 47 52 4f 55 50 20 42 59 0a 20 20 2a 2a 20  e GROUP BY.  ** 
22d70 77 69 6c 6c 20 63 61 75 73 65 20 65 6c 65 6d 65  will cause eleme
22d80 6e 74 73 20 74 6f 20 63 6f 6d 65 20 6f 75 74 20  nts to come out 
22d90 69 6e 20 74 68 65 20 63 6f 72 72 65 63 74 20 6f  in the correct o
22da0 72 64 65 72 2e 20 20 54 68 69 73 20 69 73 0a 20  rder.  This is. 
22db0 20 2a 2a 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74   ** an optimizat
22dc0 69 6f 6e 20 2d 20 74 68 65 20 63 6f 72 72 65 63  ion - the correc
22dd0 74 20 61 6e 73 77 65 72 20 73 68 6f 75 6c 64 20  t answer should 
22de0 72 65 73 75 6c 74 20 72 65 67 61 72 64 6c 65 73  result regardles
22df0 73 2e 0a 20 20 2a 2a 20 55 73 65 20 74 68 65 20  s..  ** Use the 
22e00 53 51 4c 49 54 45 5f 47 72 6f 75 70 42 79 4f 72  SQLITE_GroupByOr
22e10 64 65 72 20 66 6c 61 67 20 77 69 74 68 20 53 51  der flag with SQ
22e20 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50  LITE_TESTCTRL_OP
22e30 54 49 4d 49 5a 45 52 0a 20 20 2a 2a 20 74 6f 20  TIMIZER.  ** to 
22e40 64 69 73 61 62 6c 65 20 74 68 69 73 20 6f 70 74  disable this opt
22e50 69 6d 69 7a 61 74 69 6f 6e 20 66 6f 72 20 74 65  imization for te
22e60 73 74 69 6e 67 20 70 75 72 70 6f 73 65 73 2e 0a  sting purposes..
22e70 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74    */.  if( sqlit
22e80 65 33 45 78 70 72 4c 69 73 74 43 6f 6d 70 61 72  e3ExprListCompar
22e90 65 28 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 70  e(p->pGroupBy, p
22ea0 4f 72 64 65 72 42 79 29 3d 3d 30 0a 20 20 20 20  OrderBy)==0.    
22eb0 20 20 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61       && Optimiza
22ec0 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20  tionEnabled(db, 
22ed0 53 51 4c 49 54 45 5f 47 72 6f 75 70 42 79 4f 72  SQLITE_GroupByOr
22ee0 64 65 72 29 20 29 7b 0a 20 20 20 20 70 4f 72 64  der) ){.    pOrd
22ef0 65 72 42 79 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  erBy = 0;.  }.. 
22f00 20 2f 2a 20 49 66 20 74 68 65 20 71 75 65 72 79   /* If the query
22f10 20 69 73 20 44 49 53 54 49 4e 43 54 20 77 69 74   is DISTINCT wit
22f20 68 20 61 6e 20 4f 52 44 45 52 20 42 59 20 62 75  h an ORDER BY bu
22f30 74 20 69 73 20 6e 6f 74 20 61 6e 20 61 67 67 72  t is not an aggr
22f40 65 67 61 74 65 2c 20 61 6e 64 20 0a 20 20 2a 2a  egate, and .  **
22f50 20 69 66 20 74 68 65 20 73 65 6c 65 63 74 2d 6c   if the select-l
22f60 69 73 74 20 69 73 20 74 68 65 20 73 61 6d 65 20  ist is the same 
22f70 61 73 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  as the ORDER BY 
22f80 6c 69 73 74 2c 20 74 68 65 6e 20 74 68 69 73 20  list, then this 
22f90 71 75 65 72 79 0a 20 20 2a 2a 20 63 61 6e 20 62  query.  ** can b
22fa0 65 20 72 65 77 72 69 74 74 65 6e 20 61 73 20 61  e rewritten as a
22fb0 20 47 52 4f 55 50 20 42 59 2e 20 49 6e 20 6f 74   GROUP BY. In ot
22fc0 68 65 72 20 77 6f 72 64 73 2c 20 74 68 69 73 3a  her words, this:
22fd0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53  .  **.  **     S
22fe0 45 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20 78  ELECT DISTINCT x
22ff0 79 7a 20 46 52 4f 4d 20 2e 2e 2e 20 4f 52 44 45  yz FROM ... ORDE
23000 52 20 42 59 20 78 79 7a 0a 20 20 2a 2a 0a 20 20  R BY xyz.  **.  
23010 2a 2a 20 69 73 20 74 72 61 6e 73 66 6f 72 6d 65  ** is transforme
23020 64 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  d to:.  **.  ** 
23030 20 20 20 20 53 45 4c 45 43 54 20 78 79 7a 20 46      SELECT xyz F
23040 52 4f 4d 20 2e 2e 2e 20 47 52 4f 55 50 20 42 59  ROM ... GROUP BY
23050 20 78 79 7a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54   xyz.  **.  ** T
23060 68 65 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20 69  he second form i
23070 73 20 70 72 65 66 65 72 72 65 64 20 61 73 20 61  s preferred as a
23080 20 73 69 6e 67 6c 65 20 69 6e 64 65 78 20 28 6f   single index (o
23090 72 20 74 65 6d 70 2d 74 61 62 6c 65 29 20 6d 61  r temp-table) ma
230a0 79 20 62 65 20 0a 20 20 2a 2a 20 75 73 65 64 20  y be .  ** used 
230b0 66 6f 72 20 62 6f 74 68 20 74 68 65 20 4f 52 44  for both the ORD
230c0 45 52 20 42 59 20 61 6e 64 20 44 49 53 54 49 4e  ER BY and DISTIN
230d0 43 54 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 41  CT processing. A
230e0 73 20 6f 72 69 67 69 6e 61 6c 6c 79 20 0a 20 20  s originally .  
230f0 2a 2a 20 77 72 69 74 74 65 6e 20 74 68 65 20 71  ** written the q
23100 75 65 72 79 20 6d 75 73 74 20 75 73 65 20 61 20  uery must use a 
23110 74 65 6d 70 2d 74 61 62 6c 65 20 66 6f 72 20 61  temp-table for a
23120 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 66 20 74  t least one of t
23130 68 65 20 4f 52 44 45 52 20 0a 20 20 2a 2a 20 42  he ORDER .  ** B
23140 59 20 61 6e 64 20 44 49 53 54 49 4e 43 54 2c 20  Y and DISTINCT, 
23150 61 6e 64 20 61 6e 20 69 6e 64 65 78 20 6f 72 20  and an index or 
23160 73 65 70 61 72 61 74 65 20 74 65 6d 70 2d 74 61  separate temp-ta
23170 62 6c 65 20 66 6f 72 20 74 68 65 20 6f 74 68 65  ble for the othe
23180 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70  r..  */.  if( (p
23190 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46  ->selFlags & (SF
231a0 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67  _Distinct|SF_Agg
231b0 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 44 69 73  regate))==SF_Dis
231c0 74 69 6e 63 74 20 0a 20 20 20 26 26 20 73 71 6c  tinct .   && sql
231d0 69 74 65 33 45 78 70 72 4c 69 73 74 43 6f 6d 70  ite3ExprListComp
231e0 61 72 65 28 70 4f 72 64 65 72 42 79 2c 20 70 2d  are(pOrderBy, p-
231f0 3e 70 45 4c 69 73 74 29 3d 3d 30 0a 20 20 29 7b  >pEList)==0.  ){
23200 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73  .    p->selFlags
23210 20 26 3d 20 7e 53 46 5f 44 69 73 74 69 6e 63 74   &= ~SF_Distinct
23220 3b 0a 20 20 20 20 70 2d 3e 70 47 72 6f 75 70 42  ;.    p->pGroupB
23230 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  y = sqlite3ExprL
23240 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 45  istDup(db, p->pE
23250 4c 69 73 74 2c 20 30 29 3b 0a 20 20 20 20 70 47  List, 0);.    pG
23260 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f  roupBy = p->pGro
23270 75 70 42 79 3b 0a 20 20 20 20 70 4f 72 64 65 72  upBy;.    pOrder
23280 42 79 20 3d 20 30 3b 0a 20 20 20 20 2f 2a 20 4e  By = 0;.    /* N
23290 6f 74 69 63 65 20 74 68 61 74 20 65 76 65 6e 20  otice that even 
232a0 74 68 6f 75 67 68 74 20 53 46 5f 44 69 73 74 69  thought SF_Disti
232b0 6e 63 74 20 68 61 73 20 62 65 65 6e 20 63 6c 65  nct has been cle
232c0 61 72 65 64 20 66 72 6f 6d 20 70 2d 3e 73 65 6c  ared from p->sel
232d0 46 6c 61 67 73 2c 0a 20 20 20 20 2a 2a 20 74 68  Flags,.    ** th
232e0 65 20 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e  e sDistinct.isTn
232f0 63 74 20 69 73 20 73 74 69 6c 6c 20 73 65 74 2e  ct is still set.
23300 20 20 48 65 6e 63 65 2c 20 69 73 54 6e 63 74 20    Hence, isTnct 
23310 72 65 70 72 65 73 65 6e 74 73 20 74 68 65 0a 20  represents the. 
23320 20 20 20 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 73     ** original s
23330 65 74 74 69 6e 67 20 6f 66 20 74 68 65 20 53 46  etting of the SF
23340 5f 44 69 73 74 69 6e 63 74 20 66 6c 61 67 2c 20  _Distinct flag, 
23350 6e 6f 74 20 74 68 65 20 63 75 72 72 65 6e 74 20  not the current 
23360 73 65 74 74 69 6e 67 20 2a 2f 0a 20 20 20 20 61  setting */.    a
23370 73 73 65 72 74 28 20 73 44 69 73 74 69 6e 63 74  ssert( sDistinct
23380 2e 69 73 54 6e 63 74 20 29 3b 0a 20 20 7d 0a 0a  .isTnct );.  }..
23390 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
233a0 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
233b0 75 73 65 2c 20 74 68 65 6e 20 74 68 69 73 20 73  use, then this s
233c0 6f 72 74 69 6e 67 0a 20 20 2a 2a 20 69 6e 64 65  orting.  ** inde
233d0 78 20 6d 69 67 68 74 20 65 6e 64 20 75 70 20 62  x might end up b
233e0 65 69 6e 67 20 75 6e 75 73 65 64 20 69 66 20 74  eing unused if t
233f0 68 65 20 64 61 74 61 20 63 61 6e 20 62 65 20 0a  he data can be .
23400 20 20 2a 2a 20 65 78 74 72 61 63 74 65 64 20 69    ** extracted i
23410 6e 20 70 72 65 2d 73 6f 72 74 65 64 20 6f 72 64  n pre-sorted ord
23420 65 72 2e 20 20 49 66 20 74 68 61 74 20 69 73 20  er.  If that is 
23430 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e 20 74  the case, then t
23440 68 65 0a 20 20 2a 2a 20 4f 50 5f 4f 70 65 6e 45  he.  ** OP_OpenE
23450 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 75 63  phemeral instruc
23460 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 63 68 61  tion will be cha
23470 6e 67 65 64 20 74 6f 20 61 6e 20 4f 50 5f 4e 6f  nged to an OP_No
23480 6f 70 20 6f 6e 63 65 0a 20 20 2a 2a 20 77 65 20  op once.  ** we 
23490 66 69 67 75 72 65 20 6f 75 74 20 74 68 61 74 20  figure out that 
234a0 74 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65  the sorting inde
234b0 78 20 69 73 20 6e 6f 74 20 6e 65 65 64 65 64 2e  x is not needed.
234c0 20 20 54 68 65 20 61 64 64 72 53 6f 72 74 49 6e    The addrSortIn
234d0 64 65 78 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c  dex.  ** variabl
234e0 65 20 69 73 20 75 73 65 64 20 74 6f 20 66 61 63  e is used to fac
234f0 69 6c 69 74 61 74 65 20 74 68 61 74 20 63 68 61  ilitate that cha
23500 6e 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  nge..  */.  if( 
23510 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
23520 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
23530 6f 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 20  o;.    pKeyInfo 
23540 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70  = keyInfoFromExp
23550 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 4f  rList(pParse, pO
23560 72 64 65 72 42 79 29 3b 0a 20 20 20 20 70 4f 72  rderBy);.    pOr
23570 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 20  derBy->iECursor 
23580 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
23590 3b 0a 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65  ;.    p->addrOpe
235a0 6e 45 70 68 6d 5b 32 5d 20 3d 20 61 64 64 72 53  nEphm[2] = addrS
235b0 6f 72 74 49 6e 64 65 78 20 3d 0a 20 20 20 20 20  ortIndex =.     
235c0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
235d0 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p4(v, OP_OpenEph
235e0 65 6d 65 72 61 6c 2c 0a 20 20 20 20 20 20 20 20  emeral,.        
235f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23600 20 20 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43     pOrderBy->iEC
23610 75 72 73 6f 72 2c 20 70 4f 72 64 65 72 42 79 2d  ursor, pOrderBy-
23620 3e 6e 45 78 70 72 2b 32 2c 20 30 2c 0a 20 20 20  >nExpr+2, 0,.   
23630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23640 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70          (char*)p
23650 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49  KeyInfo, P4_KEYI
23660 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20  NFO_HANDOFF);.  
23670 7d 65 6c 73 65 7b 0a 20 20 20 20 61 64 64 72 53  }else{.    addrS
23680 6f 72 74 49 6e 64 65 78 20 3d 20 2d 31 3b 0a 20  ortIndex = -1;. 
23690 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
236a0 6f 75 74 70 75 74 20 69 73 20 64 65 73 74 69 6e  output is destin
236b0 65 64 20 66 6f 72 20 61 20 74 65 6d 70 6f 72 61  ed for a tempora
236c0 72 79 20 74 61 62 6c 65 2c 20 6f 70 65 6e 20 74  ry table, open t
236d0 68 61 74 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a  hat table..  */.
236e0 20 20 69 66 28 20 70 44 65 73 74 2d 3e 65 44 65    if( pDest->eDe
236f0 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61 62  st==SRT_EphemTab
23700 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
23710 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
23720 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70  OpenEphemeral, p
23730 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 70  Dest->iSDParm, p
23740 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20  EList->nExpr);. 
23750 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65   }..  /* Set the
23760 20 6c 69 6d 69 74 65 72 2e 0a 20 20 2a 2f 0a 20   limiter..  */. 
23770 20 69 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56   iEnd = sqlite3V
23780 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
23790 0a 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  .  p->nSelectRow
237a0 20 3d 20 28 64 6f 75 62 6c 65 29 4c 41 52 47 45   = (double)LARGE
237b0 53 54 5f 49 4e 54 36 34 3b 0a 20 20 63 6f 6d 70  ST_INT64;.  comp
237c0 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72  uteLimitRegister
237d0 73 28 70 50 61 72 73 65 2c 20 70 2c 20 69 45 6e  s(pParse, p, iEn
237e0 64 29 3b 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69  d);.  if( p->iLi
237f0 6d 69 74 3d 3d 30 20 26 26 20 61 64 64 72 53 6f  mit==0 && addrSo
23800 72 74 49 6e 64 65 78 3e 3d 30 20 29 7b 0a 20 20  rtIndex>=0 ){.  
23810 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74    sqlite3VdbeGet
23820 4f 70 28 76 2c 20 61 64 64 72 53 6f 72 74 49 6e  Op(v, addrSortIn
23830 64 65 78 29 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f  dex)->opcode = O
23840 50 5f 53 6f 72 74 65 72 4f 70 65 6e 3b 0a 20 20  P_SorterOpen;.  
23850 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d    p->selFlags |=
23860 20 53 46 5f 55 73 65 53 6f 72 74 65 72 3b 0a 20   SF_UseSorter;. 
23870 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 20   }..  /* Open a 
23880 76 69 72 74 75 61 6c 20 69 6e 64 65 78 20 74 6f  virtual index to
23890 20 75 73 65 20 66 6f 72 20 74 68 65 20 64 69 73   use for the dis
238a0 74 69 6e 63 74 20 73 65 74 2e 0a 20 20 2a 2f 0a  tinct set..  */.
238b0 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67    if( p->selFlag
238c0 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 20  s & SF_Distinct 
238d0 29 7b 0a 20 20 20 20 73 44 69 73 74 69 6e 63 74  ){.    sDistinct
238e0 2e 74 61 62 54 6e 63 74 20 3d 20 70 50 61 72 73  .tabTnct = pPars
238f0 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 73  e->nTab++;.    s
23900 44 69 73 74 69 6e 63 74 2e 61 64 64 72 54 6e 63  Distinct.addrTnc
23910 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  t = sqlite3VdbeA
23920 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp4(v, OP_Open
23930 45 70 68 65 6d 65 72 61 6c 2c 0a 20 20 20 20 20  Ephemeral,.     
23940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23950 20 20 20 20 20 20 20 20 20 20 20 73 44 69 73 74             sDist
23960 69 6e 63 74 2e 74 61 62 54 6e 63 74 2c 20 30 2c  inct.tabTnct, 0,
23970 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
23980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23990 20 20 20 20 28 63 68 61 72 2a 29 6b 65 79 49 6e      (char*)keyIn
239a0 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70  foFromExprList(p
239b0 50 61 72 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74  Parse, p->pEList
239c0 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
239d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
239e0 20 20 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41     P4_KEYINFO_HA
239f0 4e 44 4f 46 46 29 3b 0a 20 20 20 20 73 71 6c 69  NDOFF);.    sqli
23a00 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
23a10 76 2c 20 42 54 52 45 45 5f 55 4e 4f 52 44 45 52  v, BTREE_UNORDER
23a20 45 44 29 3b 0a 20 20 20 20 73 44 69 73 74 69 6e  ED);.    sDistin
23a30 63 74 2e 65 54 6e 63 74 54 79 70 65 20 3d 20 57  ct.eTnctType = W
23a40 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e  HERE_DISTINCT_UN
23a50 4f 52 44 45 52 45 44 3b 0a 20 20 7d 65 6c 73 65  ORDERED;.  }else
23a60 7b 0a 20 20 20 20 73 44 69 73 74 69 6e 63 74 2e  {.    sDistinct.
23a70 65 54 6e 63 74 54 79 70 65 20 3d 20 57 48 45 52  eTnctType = WHER
23a80 45 5f 44 49 53 54 49 4e 43 54 5f 4e 4f 4f 50 3b  E_DISTINCT_NOOP;
23a90 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 69 73 41  .  }..  if( !isA
23aa0 67 67 20 26 26 20 70 47 72 6f 75 70 42 79 3d 3d  gg && pGroupBy==
23ab0 30 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 61  0 ){.    /* No a
23ac0 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
23ad0 6e 73 20 61 6e 64 20 6e 6f 20 47 52 4f 55 50 20  ns and no GROUP 
23ae0 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20  BY clause */.   
23af0 20 45 78 70 72 4c 69 73 74 20 2a 70 44 69 73 74   ExprList *pDist
23b00 20 3d 20 28 73 44 69 73 74 69 6e 63 74 2e 69 73   = (sDistinct.is
23b10 54 6e 63 74 20 3f 20 70 2d 3e 70 45 4c 69 73 74  Tnct ? p->pEList
23b20 20 3a 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 42   : 0);..    /* B
23b30 65 67 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  egin the databas
23b40 65 20 73 63 61 6e 2e 20 2a 2f 0a 20 20 20 20 70  e scan. */.    p
23b50 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57  WInfo = sqlite3W
23b60 68 65 72 65 42 65 67 69 6e 28 70 50 61 72 73 65  hereBegin(pParse
23b70 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65  , pTabList, pWhe
23b80 72 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 44  re, pOrderBy, pD
23b90 69 73 74 2c 20 30 2c 30 29 3b 0a 20 20 20 20 69  ist, 0,0);.    i
23ba0 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67  f( pWInfo==0 ) g
23bb0 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
23bc0 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e      if( pWInfo->
23bd0 6e 52 6f 77 4f 75 74 20 3c 20 70 2d 3e 6e 53 65  nRowOut < p->nSe
23be0 6c 65 63 74 52 6f 77 20 29 20 70 2d 3e 6e 53 65  lectRow ) p->nSe
23bf0 6c 65 63 74 52 6f 77 20 3d 20 70 57 49 6e 66 6f  lectRow = pWInfo
23c00 2d 3e 6e 52 6f 77 4f 75 74 3b 0a 20 20 20 20 69  ->nRowOut;.    i
23c10 66 28 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74  f( pWInfo->eDist
23c20 69 6e 63 74 20 29 20 73 44 69 73 74 69 6e 63 74  inct ) sDistinct
23c30 2e 65 54 6e 63 74 54 79 70 65 20 3d 20 70 57 49  .eTnctType = pWI
23c40 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 3b 0a  nfo->eDistinct;.
23c50 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79      if( pOrderBy
23c60 20 26 26 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53   && pWInfo->nOBS
23c70 61 74 3d 3d 70 4f 72 64 65 72 42 79 2d 3e 6e 45  at==pOrderBy->nE
23c80 78 70 72 20 29 20 70 4f 72 64 65 72 42 79 20 3d  xpr ) pOrderBy =
23c90 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 73   0;..    /* If s
23ca0 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74 68 61  orting index tha
23cb0 74 20 77 61 73 20 63 72 65 61 74 65 64 20 62 79  t was created by
23cc0 20 61 20 70 72 69 6f 72 20 4f 50 5f 4f 70 65 6e   a prior OP_Open
23cd0 45 70 68 65 6d 65 72 61 6c 20 0a 20 20 20 20 2a  Ephemeral .    *
23ce0 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 65 6e  * instruction en
23cf0 64 65 64 20 75 70 20 6e 6f 74 20 62 65 69 6e 67  ded up not being
23d00 20 6e 65 65 64 65 64 2c 20 74 68 65 6e 20 63 68   needed, then ch
23d10 61 6e 67 65 20 74 68 65 20 4f 50 5f 4f 70 65 6e  ange the OP_Open
23d20 45 70 68 65 6d 65 72 61 6c 0a 20 20 20 20 2a 2a  Ephemeral.    **
23d30 20 69 6e 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70   into an OP_Noop
23d40 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
23d50 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78 3e 3d   addrSortIndex>=
23d60 30 20 26 26 20 70 4f 72 64 65 72 42 79 3d 3d 30  0 && pOrderBy==0
23d70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
23d80 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f  3VdbeChangeToNoo
23d90 70 28 76 2c 20 61 64 64 72 53 6f 72 74 49 6e 64  p(v, addrSortInd
23da0 65 78 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64  ex);.      p->ad
23db0 64 72 4f 70 65 6e 45 70 68 6d 5b 32 5d 20 3d 20  drOpenEphm[2] = 
23dc0 2d 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  -1;.    }..    /
23dd0 2a 20 55 73 65 20 74 68 65 20 73 74 61 6e 64 61  * Use the standa
23de0 72 64 20 69 6e 6e 65 72 20 6c 6f 6f 70 2e 20 2a  rd inner loop. *
23df0 2f 0a 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65  /.    selectInne
23e00 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c  rLoop(pParse, p,
23e10 20 70 45 4c 69 73 74 2c 20 30 2c 20 30 2c 20 70   pEList, 0, 0, p
23e20 4f 72 64 65 72 42 79 2c 20 26 73 44 69 73 74 69  OrderBy, &sDisti
23e30 6e 63 74 2c 20 70 44 65 73 74 2c 0a 20 20 20 20  nct, pDest,.    
23e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23e50 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75  pWInfo->iContinu
23e60 65 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61  e, pWInfo->iBrea
23e70 6b 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 6e 64 20  k);..    /* End 
23e80 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63 61  the database sca
23e90 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20  n loop..    */. 
23ea0 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45     sqlite3WhereE
23eb0 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 7d 65  nd(pWInfo);.  }e
23ec0 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  lse{.    /* This
23ed0 20 63 61 73 65 20 77 68 65 6e 20 74 68 65 72 65   case when there
23ee0 20 65 78 69 73 74 20 61 67 67 72 65 67 61 74 65   exist aggregate
23ef0 20 66 75 6e 63 74 69 6f 6e 73 20 6f 72 20 61 20   functions or a 
23f00 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 0a  GROUP BY clause.
23f10 20 20 20 20 2a 2a 20 6f 72 20 62 6f 74 68 20 2a      ** or both *
23f20 2f 0a 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78  /.    NameContex
23f30 74 20 73 4e 43 3b 20 20 20 20 2f 2a 20 4e 61 6d  t sNC;    /* Nam
23f40 65 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 70 72  e context for pr
23f50 6f 63 65 73 73 69 6e 67 20 61 67 67 72 65 67 61  ocessing aggrega
23f60 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a  te information *
23f70 2f 0a 20 20 20 20 69 6e 74 20 69 41 4d 65 6d 3b  /.    int iAMem;
23f80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
23f90 73 74 20 4d 65 6d 20 61 64 64 72 65 73 73 20 66  st Mem address f
23fa0 6f 72 20 73 74 6f 72 69 6e 67 20 63 75 72 72 65  or storing curre
23fb0 6e 74 20 47 52 4f 55 50 20 42 59 20 2a 2f 0a 20  nt GROUP BY */. 
23fc0 20 20 20 69 6e 74 20 69 42 4d 65 6d 3b 20 20 20     int iBMem;   
23fd0 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
23fe0 4d 65 6d 20 61 64 64 72 65 73 73 20 66 6f 72 20  Mem address for 
23ff0 70 72 65 76 69 6f 75 73 20 47 52 4f 55 50 20 42  previous GROUP B
24000 59 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 55 73  Y */.    int iUs
24010 65 46 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a 20  eFlag;       /* 
24020 4d 65 6d 20 61 64 64 72 65 73 73 20 68 6f 6c 64  Mem address hold
24030 69 6e 67 20 66 6c 61 67 20 69 6e 64 69 63 61 74  ing flag indicat
24040 69 6e 67 20 74 68 61 74 20 61 74 20 6c 65 61 73  ing that at leas
24050 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t.              
24060 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 65            ** one
24070 20 72 6f 77 20 6f 66 20 74 68 65 20 69 6e 70 75   row of the inpu
24080 74 20 74 6f 20 74 68 65 20 61 67 67 72 65 67 61  t to the aggrega
24090 74 6f 72 20 68 61 73 20 62 65 65 6e 0a 20 20 20  tor has been.   
240a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
240b0 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 65       ** processe
240c0 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 41 62  d */.    int iAb
240d0 6f 72 74 46 6c 61 67 3b 20 20 20 20 20 2f 2a 20  ortFlag;     /* 
240e0 4d 65 6d 20 61 64 64 72 65 73 73 20 77 68 69 63  Mem address whic
240f0 68 20 63 61 75 73 65 73 20 71 75 65 72 79 20 61  h causes query a
24100 62 6f 72 74 20 69 66 20 70 6f 73 69 74 69 76 65  bort if positive
24110 20 2a 2f 0a 20 20 20 20 69 6e 74 20 67 72 6f 75   */.    int grou
24120 70 42 79 53 6f 72 74 3b 20 20 20 20 2f 2a 20 52  pBySort;    /* R
24130 6f 77 73 20 63 6f 6d 65 20 66 72 6f 6d 20 73 6f  ows come from so
24140 75 72 63 65 20 69 6e 20 47 52 4f 55 50 20 42 59  urce in GROUP BY
24150 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20 69 6e   order */.    in
24160 74 20 61 64 64 72 45 6e 64 3b 20 20 20 20 20 20  t addrEnd;      
24170 20 20 2f 2a 20 45 6e 64 20 6f 66 20 70 72 6f 63    /* End of proc
24180 65 73 73 69 6e 67 20 66 6f 72 20 74 68 69 73 20  essing for this 
24190 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20 69 6e  SELECT */.    in
241a0 74 20 73 6f 72 74 50 54 61 62 20 3d 20 30 3b 20  t sortPTab = 0; 
241b0 20 20 2f 2a 20 50 73 65 75 64 6f 74 61 62 6c 65    /* Pseudotable
241c0 20 75 73 65 64 20 74 6f 20 64 65 63 6f 64 65 20   used to decode 
241d0 73 6f 72 74 69 6e 67 20 72 65 73 75 6c 74 73 20  sorting results 
241e0 2a 2f 0a 20 20 20 20 69 6e 74 20 73 6f 72 74 4f  */.    int sortO
241f0 75 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4f 75  ut = 0;    /* Ou
24200 74 70 75 74 20 72 65 67 69 73 74 65 72 20 66 72  tput register fr
24210 6f 6d 20 74 68 65 20 73 6f 72 74 65 72 20 2a 2f  om the sorter */
24220 0a 0a 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20  ..    /* Remove 
24230 61 6e 79 20 61 6e 64 20 61 6c 6c 20 61 6c 69 61  any and all alia
24240 73 65 73 20 62 65 74 77 65 65 6e 20 74 68 65 20  ses between the 
24250 72 65 73 75 6c 74 20 73 65 74 20 61 6e 64 20 74  result set and t
24260 68 65 0a 20 20 20 20 2a 2a 20 47 52 4f 55 50 20  he.    ** GROUP 
24270 42 59 20 63 6c 61 75 73 65 2e 0a 20 20 20 20 2a  BY clause..    *
24280 2f 0a 20 20 20 20 69 66 28 20 70 47 72 6f 75 70  /.    if( pGroup
24290 42 79 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  By ){.      int 
242a0 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
242b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
242c0 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20  p counter */.   
242d0 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
242e0 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 20  st_item *pItem; 
242f0 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
24300 6f 76 65 72 20 65 78 70 72 65 73 73 69 6f 6e 20  over expression 
24310 69 6e 20 61 20 6c 69 73 74 20 2a 2f 0a 0a 20 20  in a list */..  
24320 20 20 20 20 66 6f 72 28 6b 3d 70 2d 3e 70 45 4c      for(k=p->pEL
24330 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65  ist->nExpr, pIte
24340 6d 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b 20  m=p->pEList->a; 
24350 6b 3e 30 3b 20 6b 2d 2d 2c 20 70 49 74 65 6d 2b  k>0; k--, pItem+
24360 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 49 74 65  +){.        pIte
24370 6d 2d 3e 69 41 6c 69 61 73 20 3d 20 30 3b 0a 20  m->iAlias = 0;. 
24380 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72       }.      for
24390 28 6b 3d 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78  (k=pGroupBy->nEx
243a0 70 72 2c 20 70 49 74 65 6d 3d 70 47 72 6f 75 70  pr, pItem=pGroup
243b0 42 79 2d 3e 61 3b 20 6b 3e 30 3b 20 6b 2d 2d 2c  By->a; k>0; k--,
243c0 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
243d0 20 20 20 70 49 74 65 6d 2d 3e 69 41 6c 69 61 73     pItem->iAlias
243e0 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
243f0 20 20 20 20 69 66 28 20 70 2d 3e 6e 53 65 6c 65      if( p->nSele
24400 63 74 52 6f 77 3e 28 64 6f 75 62 6c 65 29 31 30  ctRow>(double)10
24410 30 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f  0 ) p->nSelectRo
24420 77 20 3d 20 28 64 6f 75 62 6c 65 29 31 30 30 3b  w = (double)100;
24430 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
24440 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20    p->nSelectRow 
24450 3d 20 28 64 6f 75 62 6c 65 29 31 3b 0a 20 20 20  = (double)1;.   
24460 20 7d 0a 0a 20 0a 20 20 20 20 2f 2a 20 43 72 65   }.. .    /* Cre
24470 61 74 65 20 61 20 6c 61 62 65 6c 20 74 6f 20 6a  ate a label to j
24480 75 6d 70 20 74 6f 20 77 68 65 6e 20 77 65 20 77  ump to when we w
24490 61 6e 74 20 74 6f 20 61 62 6f 72 74 20 74 68 65  ant to abort the
244a0 20 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 61 64   query */.    ad
244b0 64 72 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56  drEnd = sqlite3V
244c0 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
244d0 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74  ..    /* Convert
244e0 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73   TK_COLUMN nodes
244f0 20 69 6e 74 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c   into TK_AGG_COL
24500 55 4d 4e 20 61 6e 64 20 6d 61 6b 65 20 65 6e 74  UMN and make ent
24510 72 69 65 73 20 69 6e 0a 20 20 20 20 2a 2a 20 73  ries in.    ** s
24520 41 67 67 49 6e 66 6f 20 66 6f 72 20 61 6c 6c 20  AggInfo for all 
24530 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20  TK_AGG_FUNCTION 
24540 6e 6f 64 65 73 20 69 6e 20 65 78 70 72 65 73 73  nodes in express
24550 69 6f 6e 73 20 6f 66 20 74 68 65 0a 20 20 20 20  ions of the.    
24560 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  ** SELECT statem
24570 65 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ent..    */.    
24580 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c 20  memset(&sNC, 0, 
24590 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20  sizeof(sNC));.  
245a0 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70    sNC.pParse = p
245b0 50 61 72 73 65 3b 0a 20 20 20 20 73 4e 43 2e 70  Parse;.    sNC.p
245c0 53 72 63 4c 69 73 74 20 3d 20 70 54 61 62 4c 69  SrcList = pTabLi
245d0 73 74 3b 0a 20 20 20 20 73 4e 43 2e 70 41 67 67  st;.    sNC.pAgg
245e0 49 6e 66 6f 20 3d 20 26 73 41 67 67 49 6e 66 6f  Info = &sAggInfo
245f0 3b 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6e  ;.    sAggInfo.n
24600 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 20 3d 20  SortingColumn = 
24610 70 47 72 6f 75 70 42 79 20 3f 20 70 47 72 6f 75  pGroupBy ? pGrou
24620 70 42 79 2d 3e 6e 45 78 70 72 2b 31 20 3a 20 30  pBy->nExpr+1 : 0
24630 3b 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 70  ;.    sAggInfo.p
24640 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f 75 70  GroupBy = pGroup
24650 42 79 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  By;.    sqlite3E
24660 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73  xprAnalyzeAggLis
24670 74 28 26 73 4e 43 2c 20 70 45 4c 69 73 74 29 3b  t(&sNC, pEList);
24680 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
24690 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 26  AnalyzeAggList(&
246a0 73 4e 43 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a  sNC, pOrderBy);.
246b0 20 20 20 20 69 66 28 20 70 48 61 76 69 6e 67 20      if( pHaving 
246c0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
246d0 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65  ExprAnalyzeAggre
246e0 67 61 74 65 73 28 26 73 4e 43 2c 20 70 48 61 76  gates(&sNC, pHav
246f0 69 6e 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ing);.    }.    
24700 73 41 67 67 49 6e 66 6f 2e 6e 41 63 63 75 6d 75  sAggInfo.nAccumu
24710 6c 61 74 6f 72 20 3d 20 73 41 67 67 49 6e 66 6f  lator = sAggInfo
24720 2e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 66 6f  .nColumn;.    fo
24730 72 28 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66  r(i=0; i<sAggInf
24740 6f 2e 6e 46 75 6e 63 3b 20 69 2b 2b 29 7b 0a 20  o.nFunc; i++){. 
24750 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
24760 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 73 41  prHasProperty(sA
24770 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 69 5d 2e  ggInfo.aFunc[i].
24780 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
24790 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20 73 4e  ect) );.      sN
247a0 43 2e 6e 63 46 6c 61 67 73 20 7c 3d 20 4e 43 5f  C.ncFlags |= NC_
247b0 49 6e 41 67 67 46 75 6e 63 3b 0a 20 20 20 20 20  InAggFunc;.     
247c0 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
247d0 79 7a 65 41 67 67 4c 69 73 74 28 26 73 4e 43 2c  yzeAggList(&sNC,
247e0 20 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b   sAggInfo.aFunc[
247f0 69 5d 2e 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  i].pExpr->x.pLis
24800 74 29 3b 0a 20 20 20 20 20 20 73 4e 43 2e 6e 63  t);.      sNC.nc
24810 46 6c 61 67 73 20 26 3d 20 7e 4e 43 5f 49 6e 41  Flags &= ~NC_InA
24820 67 67 46 75 6e 63 3b 0a 20 20 20 20 7d 0a 20 20  ggFunc;.    }.  
24830 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
24840 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 73 65  Failed ) goto se
24850 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 20 20 2f  lect_end;..    /
24860 2a 20 50 72 6f 63 65 73 73 69 6e 67 20 66 6f 72  * Processing for
24870 20 61 67 67 72 65 67 61 74 65 73 20 77 69 74 68   aggregates with
24880 20 47 52 4f 55 50 20 42 59 20 69 73 20 76 65 72   GROUP BY is ver
24890 79 20 64 69 66 66 65 72 65 6e 74 20 61 6e 64 0a  y different and.
248a0 20 20 20 20 2a 2a 20 6d 75 63 68 20 6d 6f 72 65      ** much more
248b0 20 63 6f 6d 70 6c 65 78 20 74 68 61 6e 20 61 67   complex than ag
248c0 67 72 65 67 61 74 65 73 20 77 69 74 68 6f 75 74  gregates without
248d0 20 61 20 47 52 4f 55 50 20 42 59 2e 0a 20 20 20   a GROUP BY..   
248e0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 47 72 6f   */.    if( pGro
248f0 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20 4b 65  upBy ){.      Ke
24900 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b  yInfo *pKeyInfo;
24910 20 20 2f 2a 20 4b 65 79 69 6e 67 20 69 6e 66 6f    /* Keying info
24920 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20  rmation for the 
24930 67 72 6f 75 70 20 62 79 20 63 6c 61 75 73 65 20  group by clause 
24940 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6a 31 3b  */.      int j1;
24950 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24960 41 2d 76 73 2d 42 20 63 6f 6d 70 61 72 69 73 69  A-vs-B comparisi
24970 6f 6e 20 6a 75 6d 70 20 2a 2f 0a 20 20 20 20 20  on jump */.     
24980 20 69 6e 74 20 61 64 64 72 4f 75 74 70 75 74 52   int addrOutputR
24990 6f 77 3b 20 20 2f 2a 20 53 74 61 72 74 20 6f 66  ow;  /* Start of
249a0 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74   subroutine that
249b0 20 6f 75 74 70 75 74 73 20 61 20 72 65 73 75 6c   outputs a resul
249c0 74 20 72 6f 77 20 2a 2f 0a 20 20 20 20 20 20 69  t row */.      i
249d0 6e 74 20 72 65 67 4f 75 74 70 75 74 52 6f 77 3b  nt regOutputRow;
249e0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 61 64 64     /* Return add
249f0 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66 6f  ress register fo
24a00 72 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74  r output subrout
24a10 69 6e 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ine */.      int
24a20 20 61 64 64 72 53 65 74 41 62 6f 72 74 3b 20 20   addrSetAbort;  
24a30 20 2f 2a 20 53 65 74 20 74 68 65 20 61 62 6f 72   /* Set the abor
24a40 74 20 66 6c 61 67 20 61 6e 64 20 72 65 74 75 72  t flag and retur
24a50 6e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61  n */.      int a
24a60 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 3b 20 20 2f  ddrTopOfLoop;  /
24a70 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 69 6e 70  * Top of the inp
24a80 75 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20  ut loop */.     
24a90 20 69 6e 74 20 61 64 64 72 53 6f 72 74 69 6e 67   int addrSorting
24aa0 49 64 78 3b 20 2f 2a 20 54 68 65 20 4f 50 5f 4f  Idx; /* The OP_O
24ab0 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 66 6f 72  penEphemeral for
24ac0 20 74 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64   the sorting ind
24ad0 65 78 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ex */.      int 
24ae0 61 64 64 72 52 65 73 65 74 3b 20 20 20 20 20 20  addrReset;      
24af0 2f 2a 20 53 75 62 72 6f 75 74 69 6e 65 20 66 6f  /* Subroutine fo
24b00 72 20 72 65 73 65 74 74 69 6e 67 20 74 68 65 20  r resetting the 
24b10 61 63 63 75 6d 75 6c 61 74 6f 72 20 2a 2f 0a 20  accumulator */. 
24b20 20 20 20 20 20 69 6e 74 20 72 65 67 52 65 73 65       int regRese
24b30 74 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75  t;       /* Retu
24b40 72 6e 20 61 64 64 72 65 73 73 20 72 65 67 69 73  rn address regis
24b50 74 65 72 20 66 6f 72 20 72 65 73 65 74 20 73 75  ter for reset su
24b60 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 0a 20 20 20  broutine */..   
24b70 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69     /* If there i
24b80 73 20 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61  s a GROUP BY cla
24b90 75 73 65 20 77 65 20 6d 69 67 68 74 20 6e 65 65  use we might nee
24ba0 64 20 61 20 73 6f 72 74 69 6e 67 20 69 6e 64 65  d a sorting inde
24bb0 78 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 69 6d  x to.      ** im
24bc0 70 6c 65 6d 65 6e 74 20 69 74 2e 20 20 41 6c 6c  plement it.  All
24bd0 6f 63 61 74 65 20 74 68 61 74 20 73 6f 72 74 69  ocate that sorti
24be0 6e 67 20 69 6e 64 65 78 20 6e 6f 77 2e 20 20 49  ng index now.  I
24bf0 66 20 69 74 20 74 75 72 6e 73 20 6f 75 74 0a 20  f it turns out. 
24c00 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77 65 20       ** that we 
24c10 64 6f 20 6e 6f 74 20 6e 65 65 64 20 69 74 20 61  do not need it a
24c20 66 74 65 72 20 61 6c 6c 2c 20 74 68 65 20 4f 50  fter all, the OP
24c30 5f 53 6f 72 74 65 72 4f 70 65 6e 20 69 6e 73 74  _SorterOpen inst
24c40 72 75 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a  ruction.      **
24c50 20 77 69 6c 6c 20 62 65 20 63 6f 6e 76 65 72 74   will be convert
24c60 65 64 20 69 6e 74 6f 20 61 20 4e 6f 6f 70 2e 20  ed into a Noop. 
24c70 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20   .      */.     
24c80 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e   sAggInfo.sortin
24c90 67 49 64 78 20 3d 20 70 50 61 72 73 65 2d 3e 6e  gIdx = pParse->n
24ca0 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 70 4b 65  Tab++;.      pKe
24cb0 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46  yInfo = keyInfoF
24cc0 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72  romExprList(pPar
24cd0 73 65 2c 20 70 47 72 6f 75 70 42 79 29 3b 0a 20  se, pGroupBy);. 
24ce0 20 20 20 20 20 61 64 64 72 53 6f 72 74 69 6e 67       addrSorting
24cf0 49 64 78 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Idx = sqlite3Vdb
24d00 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53 6f  eAddOp4(v, OP_So
24d10 72 74 65 72 4f 70 65 6e 2c 20 0a 20 20 20 20 20  rterOpen, .     
24d20 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 73 6f       sAggInfo.so
24d30 72 74 69 6e 67 49 64 78 2c 20 73 41 67 67 49 6e  rtingIdx, sAggIn
24d40 66 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d  fo.nSortingColum
24d50 6e 2c 20 0a 20 20 20 20 20 20 20 20 20 20 30 2c  n, .          0,
24d60 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f   (char*)pKeyInfo
24d70 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e  , P4_KEYINFO_HAN
24d80 44 4f 46 46 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  DOFF);..      /*
24d90 20 49 6e 69 74 69 61 6c 69 7a 65 20 6d 65 6d 6f   Initialize memo
24da0 72 79 20 6c 6f 63 61 74 69 6f 6e 73 20 75 73 65  ry locations use
24db0 64 20 62 79 20 47 52 4f 55 50 20 42 59 20 61 67  d by GROUP BY ag
24dc0 67 72 65 67 61 74 65 20 70 72 6f 63 65 73 73 69  gregate processi
24dd0 6e 67 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  ng.      */.    
24de0 20 20 69 55 73 65 46 6c 61 67 20 3d 20 2b 2b 70    iUseFlag = ++p
24df0 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
24e00 20 20 20 69 41 62 6f 72 74 46 6c 61 67 20 3d 20     iAbortFlag = 
24e10 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
24e20 20 20 20 20 20 20 72 65 67 4f 75 74 70 75 74 52        regOutputR
24e30 6f 77 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  ow = ++pParse->n
24e40 4d 65 6d 3b 0a 20 20 20 20 20 20 61 64 64 72 4f  Mem;.      addrO
24e50 75 74 70 75 74 52 6f 77 20 3d 20 73 71 6c 69 74  utputRow = sqlit
24e60 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
24e70 76 29 3b 0a 20 20 20 20 20 20 72 65 67 52 65 73  v);.      regRes
24e80 65 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  et = ++pParse->n
24e90 4d 65 6d 3b 0a 20 20 20 20 20 20 61 64 64 72 52  Mem;.      addrR
24ea0 65 73 65 74 20 3d 20 73 71 6c 69 74 65 33 56 64  eset = sqlite3Vd
24eb0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
24ec0 20 20 20 20 20 20 69 41 4d 65 6d 20 3d 20 70 50        iAMem = pP
24ed0 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a  arse->nMem + 1;.
24ee0 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d        pParse->nM
24ef0 65 6d 20 2b 3d 20 70 47 72 6f 75 70 42 79 2d 3e  em += pGroupBy->
24f00 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 69 42 4d  nExpr;.      iBM
24f10 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  em = pParse->nMe
24f20 6d 20 2b 20 31 3b 0a 20 20 20 20 20 20 70 50 61  m + 1;.      pPa
24f30 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 47 72  rse->nMem += pGr
24f40 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20  oupBy->nExpr;.  
24f50 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
24f60 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
24f70 67 65 72 2c 20 30 2c 20 69 41 62 6f 72 74 46 6c  ger, 0, iAbortFl
24f80 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  ag);.      VdbeC
24f90 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 63 6c 65 61  omment((v, "clea
24fa0 72 20 61 62 6f 72 74 20 66 6c 61 67 22 29 29 3b  r abort flag"));
24fb0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
24fc0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
24fd0 6e 74 65 67 65 72 2c 20 30 2c 20 69 55 73 65 46  nteger, 0, iUseF
24fe0 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65  lag);.      Vdbe
24ff0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 69 6e 64  Comment((v, "ind
25000 69 63 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f  icate accumulato
25010 72 20 65 6d 70 74 79 22 29 29 3b 0a 20 20 20 20  r empty"));.    
25020 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
25030 4f 70 33 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  Op3(v, OP_Null, 
25040 30 2c 20 69 41 4d 65 6d 2c 20 69 41 4d 65 6d 2b  0, iAMem, iAMem+
25050 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2d  pGroupBy->nExpr-
25060 31 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 42 65  1);..      /* Be
25070 67 69 6e 20 61 20 6c 6f 6f 70 20 74 68 61 74 20  gin a loop that 
25080 77 69 6c 6c 20 65 78 74 72 61 63 74 20 61 6c 6c  will extract all
25090 20 73 6f 75 72 63 65 20 72 6f 77 73 20 69 6e 20   source rows in 
250a0 47 52 4f 55 50 20 42 59 20 6f 72 64 65 72 2e 0a  GROUP BY order..
250b0 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 6d 69        ** This mi
250c0 67 68 74 20 69 6e 76 6f 6c 76 65 20 74 77 6f 20  ght involve two 
250d0 73 65 70 61 72 61 74 65 20 6c 6f 6f 70 73 20 77  separate loops w
250e0 69 74 68 20 61 6e 20 4f 50 5f 53 6f 72 74 20 69  ith an OP_Sort i
250f0 6e 20 62 65 74 77 65 65 6e 2c 20 6f 72 0a 20 20  n between, or.  
25100 20 20 20 20 2a 2a 20 69 74 20 6d 69 67 68 74 20      ** it might 
25110 62 65 20 61 20 73 69 6e 67 6c 65 20 6c 6f 6f 70  be a single loop
25120 20 74 68 61 74 20 75 73 65 73 20 61 6e 20 69 6e   that uses an in
25130 64 65 78 20 74 6f 20 65 78 74 72 61 63 74 20 69  dex to extract i
25140 6e 66 6f 72 6d 61 74 69 6f 6e 0a 20 20 20 20 20  nformation.     
25150 20 2a 2a 20 69 6e 20 74 68 65 20 72 69 67 68 74   ** in the right
25160 20 6f 72 64 65 72 20 74 6f 20 62 65 67 69 6e 20   order to begin 
25170 77 69 74 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  with..      */. 
25180 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
25190 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
251a0 75 62 2c 20 72 65 67 52 65 73 65 74 2c 20 61 64  ub, regReset, ad
251b0 64 72 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20  drReset);.      
251c0 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33  pWInfo = sqlite3
251d0 57 68 65 72 65 42 65 67 69 6e 28 70 50 61 72 73  WhereBegin(pPars
251e0 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68  e, pTabList, pWh
251f0 65 72 65 2c 20 70 47 72 6f 75 70 42 79 2c 20 30  ere, pGroupBy, 0
25200 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  , 0, 0);.      i
25210 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67  f( pWInfo==0 ) g
25220 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
25230 20 20 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f        if( pWInfo
25240 2d 3e 6e 4f 42 53 61 74 3d 3d 70 47 72 6f 75 70  ->nOBSat==pGroup
25250 42 79 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20  By->nExpr ){.   
25260 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 74 69       /* The opti
25270 6d 69 7a 65 72 20 69 73 20 61 62 6c 65 20 74 6f  mizer is able to
25280 20 64 65 6c 69 76 65 72 20 72 6f 77 73 20 69 6e   deliver rows in
25290 20 67 72 6f 75 70 20 62 79 20 6f 72 64 65 72 20   group by order 
252a0 73 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 65  so.        ** we
252b0 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f 20   do not have to 
252c0 73 6f 72 74 2e 20 20 54 68 65 20 4f 50 5f 4f 70  sort.  The OP_Op
252d0 65 6e 45 70 68 65 6d 65 72 61 6c 20 74 61 62 6c  enEphemeral tabl
252e0 65 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 20 20  e will be.      
252f0 20 20 2a 2a 20 63 61 6e 63 65 6c 6c 65 64 20 6c    ** cancelled l
25300 61 74 65 72 20 62 65 63 61 75 73 65 20 77 65 20  ater because we 
25310 73 74 69 6c 6c 20 6e 65 65 64 20 74 6f 20 75 73  still need to us
25320 65 20 74 68 65 20 70 4b 65 79 49 6e 66 6f 0a 20  e the pKeyInfo. 
25330 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
25340 20 20 67 72 6f 75 70 42 79 53 6f 72 74 20 3d 20    groupBySort = 
25350 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  0;.      }else{.
25360 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 73 20          /* Rows 
25370 61 72 65 20 63 6f 6d 69 6e 67 20 6f 75 74 20 69  are coming out i
25380 6e 20 75 6e 64 65 74 65 72 6d 69 6e 65 64 20 6f  n undetermined o
25390 72 64 65 72 2e 20 20 57 65 20 68 61 76 65 20 74  rder.  We have t
253a0 6f 20 70 75 73 68 0a 20 20 20 20 20 20 20 20 2a  o push.        *
253b0 2a 20 65 61 63 68 20 72 6f 77 20 69 6e 74 6f 20  * each row into 
253c0 61 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 2c  a sorting index,
253d0 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 66   terminate the f
253e0 69 72 73 74 20 6c 6f 6f 70 2c 0a 20 20 20 20 20  irst loop,.     
253f0 20 20 20 2a 2a 20 74 68 65 6e 20 6c 6f 6f 70 20     ** then loop 
25400 6f 76 65 72 20 74 68 65 20 73 6f 72 74 69 6e 67  over the sorting
25410 20 69 6e 64 65 78 20 69 6e 20 6f 72 64 65 72 20   index in order 
25420 74 6f 20 67 65 74 20 74 68 65 20 6f 75 74 70 75  to get the outpu
25430 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20  t.        ** in 
25440 73 6f 72 74 65 64 20 6f 72 64 65 72 0a 20 20 20  sorted order.   
25450 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
25460 69 6e 74 20 72 65 67 42 61 73 65 3b 0a 20 20 20  int regBase;.   
25470 20 20 20 20 20 69 6e 74 20 72 65 67 52 65 63 6f       int regReco
25480 72 64 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  rd;.        int 
25490 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 69 6e  nCol;.        in
254a0 74 20 6e 47 72 6f 75 70 42 79 3b 0a 0a 20 20 20  t nGroupBy;..   
254b0 20 20 20 20 20 65 78 70 6c 61 69 6e 54 65 6d 70       explainTemp
254c0 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 0a 20  Table(pParse, . 
254d0 20 20 20 20 20 20 20 20 20 20 20 28 73 44 69 73             (sDis
254e0 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 26 26 20  tinct.isTnct && 
254f0 28 70 2d 3e 73 65 6c 46 6c 61 67 73 26 53 46 5f  (p->selFlags&SF_
25500 44 69 73 74 69 6e 63 74 29 3d 3d 30 29 20 3f 0a  Distinct)==0) ?.
25510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25520 20 20 20 20 22 44 49 53 54 49 4e 43 54 22 20 3a      "DISTINCT" :
25530 20 22 47 52 4f 55 50 20 42 59 22 29 3b 0a 0a 20   "GROUP BY");.. 
25540 20 20 20 20 20 20 20 67 72 6f 75 70 42 79 53 6f         groupBySo
25550 72 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  rt = 1;.        
25560 6e 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f 75  nGroupBy = pGrou
25570 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  pBy->nExpr;.    
25580 20 20 20 20 6e 43 6f 6c 20 3d 20 6e 47 72 6f 75      nCol = nGrou
25590 70 42 79 20 2b 20 31 3b 0a 20 20 20 20 20 20 20  pBy + 1;.       
255a0 20 6a 20 3d 20 6e 47 72 6f 75 70 42 79 2b 31 3b   j = nGroupBy+1;
255b0 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
255c0 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 43 6f  ; i<sAggInfo.nCo
255d0 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  lumn; i++){.    
255e0 20 20 20 20 20 20 69 66 28 20 73 41 67 67 49 6e        if( sAggIn
255f0 66 6f 2e 61 43 6f 6c 5b 69 5d 2e 69 53 6f 72 74  fo.aCol[i].iSort
25600 65 72 43 6f 6c 75 6d 6e 3e 3d 6a 20 29 7b 0a 20  erColumn>=j ){. 
25610 20 20 20 20 20 20 20 20 20 20 20 6e 43 6f 6c 2b             nCol+
25620 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a  +;.            j
25630 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ++;.          }.
25640 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
25650 20 20 72 65 67 42 61 73 65 20 3d 20 73 71 6c 69    regBase = sqli
25660 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28  te3GetTempRange(
25670 70 50 61 72 73 65 2c 20 6e 43 6f 6c 29 3b 0a 20  pParse, nCol);. 
25680 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
25690 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61  prCacheClear(pPa
256a0 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71  rse);.        sq
256b0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70  lite3ExprCodeExp
256c0 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 47  rList(pParse, pG
256d0 72 6f 75 70 42 79 2c 20 72 65 67 42 61 73 65 2c  roupBy, regBase,
256e0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   0);.        sql
256f0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
25700 2c 20 4f 50 5f 53 65 71 75 65 6e 63 65 2c 20 73  , OP_Sequence, s
25710 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49  AggInfo.sortingI
25720 64 78 2c 72 65 67 42 61 73 65 2b 6e 47 72 6f 75  dx,regBase+nGrou
25730 70 42 79 29 3b 0a 20 20 20 20 20 20 20 20 6a 20  pBy);.        j 
25740 3d 20 6e 47 72 6f 75 70 42 79 2b 31 3b 0a 20 20  = nGroupBy+1;.  
25750 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
25760 3c 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d  <sAggInfo.nColum
25770 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  n; i++){.       
25780 20 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66     struct AggInf
25790 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20 3d 20 26 73  o_col *pCol = &s
257a0 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69 5d 3b  AggInfo.aCol[i];
257b0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
257c0 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75  Col->iSorterColu
257d0 6d 6e 3e 3d 6a 20 29 7b 0a 20 20 20 20 20 20 20  mn>=j ){.       
257e0 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20 6a 20       int r1 = j 
257f0 2b 20 72 65 67 42 61 73 65 3b 0a 20 20 20 20 20  + regBase;.     
25800 20 20 20 20 20 20 20 69 6e 74 20 72 32 3b 0a 0a         int r2;..
25810 20 20 20 20 20 20 20 20 20 20 20 20 72 32 20 3d              r2 =
25820 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
25830 47 65 74 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65  GetColumn(pParse
25840 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
25850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25860 20 20 70 43 6f 6c 2d 3e 70 54 61 62 2c 20 70 43    pCol->pTab, pC
25870 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 70 43 6f  ol->iColumn, pCo
25880 6c 2d 3e 69 54 61 62 6c 65 2c 20 72 31 2c 20 30  l->iTable, r1, 0
25890 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
258a0 66 28 20 72 31 21 3d 72 32 20 29 7b 0a 20 20 20  f( r1!=r2 ){.   
258b0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
258c0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
258d0 4f 50 5f 53 43 6f 70 79 2c 20 72 32 2c 20 72 31  OP_SCopy, r2, r1
258e0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
258f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a 2b 2b  .            j++
25900 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
25910 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
25920 72 65 67 52 65 63 6f 72 64 20 3d 20 73 71 6c 69  regRecord = sqli
25930 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
25940 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73  arse);.        s
25950 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
25960 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
25970 64 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f 6c  d, regBase, nCol
25980 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20  , regRecord);.  
25990 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
259a0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f  eAddOp2(v, OP_So
259b0 72 74 65 72 49 6e 73 65 72 74 2c 20 73 41 67 67  rterInsert, sAgg
259c0 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c  Info.sortingIdx,
259d0 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 20   regRecord);.   
259e0 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
259f0 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
25a00 65 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20  e, regRecord);. 
25a10 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65         sqlite3Re
25a20 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70  leaseTempRange(p
25a30 50 61 72 73 65 2c 20 72 65 67 42 61 73 65 2c 20  Parse, regBase, 
25a40 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73  nCol);.        s
25a50 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70  qlite3WhereEnd(p
25a60 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  WInfo);.        
25a70 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67  sAggInfo.sorting
25a80 49 64 78 50 54 61 62 20 3d 20 73 6f 72 74 50 54  IdxPTab = sortPT
25a90 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ab = pParse->nTa
25aa0 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 73 6f 72  b++;.        sor
25ab0 74 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 47 65  tOut = sqlite3Ge
25ac0 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
25ad0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
25ae0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
25af0 50 5f 4f 70 65 6e 50 73 65 75 64 6f 2c 20 73 6f  P_OpenPseudo, so
25b00 72 74 50 54 61 62 2c 20 73 6f 72 74 4f 75 74 2c  rtPTab, sortOut,
25b10 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20   nCol);.        
25b20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
25b30 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 53 6f  2(v, OP_SorterSo
25b40 72 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72  rt, sAggInfo.sor
25b50 74 69 6e 67 49 64 78 2c 20 61 64 64 72 45 6e 64  tingIdx, addrEnd
25b60 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
25b70 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 47 52 4f 55  omment((v, "GROU
25b80 50 20 42 59 20 73 6f 72 74 22 29 29 3b 0a 20 20  P BY sort"));.  
25b90 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 75        sAggInfo.u
25ba0 73 65 53 6f 72 74 69 6e 67 49 64 78 20 3d 20 31  seSortingIdx = 1
25bb0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
25bc0 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28  3ExprCacheClear(
25bd0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 7d  pParse);.      }
25be0 0a 0a 20 20 20 20 20 20 2f 2a 20 45 76 61 6c 75  ..      /* Evalu
25bf0 61 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ate the current 
25c00 47 52 4f 55 50 20 42 59 20 74 65 72 6d 73 20 61  GROUP BY terms a
25c10 6e 64 20 73 74 6f 72 65 20 69 6e 20 62 30 2c 20  nd store in b0, 
25c20 62 31 2c 20 62 32 2e 2e 2e 0a 20 20 20 20 20 20  b1, b2....      
25c30 2a 2a 20 28 62 30 20 69 73 20 6d 65 6d 6f 72 79  ** (b0 is memory
25c40 20 6c 6f 63 61 74 69 6f 6e 20 69 42 4d 65 6d 2b   location iBMem+
25c50 30 2c 20 62 31 20 69 73 20 69 42 4d 65 6d 2b 31  0, b1 is iBMem+1
25c60 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 29 0a  , and so forth).
25c70 20 20 20 20 20 20 2a 2a 20 54 68 65 6e 20 63 6f        ** Then co
25c80 6d 70 61 72 65 20 74 68 65 20 63 75 72 72 65 6e  mpare the curren
25c90 74 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d 73  t GROUP BY terms
25ca0 20 61 67 61 69 6e 73 74 20 74 68 65 20 47 52 4f   against the GRO
25cb0 55 50 20 42 59 20 74 65 72 6d 73 0a 20 20 20 20  UP BY terms.    
25cc0 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 70 72    ** from the pr
25cd0 65 76 69 6f 75 73 20 72 6f 77 20 63 75 72 72 65  evious row curre
25ce0 6e 74 6c 79 20 73 74 6f 72 65 64 20 69 6e 20 61  ntly stored in a
25cf0 30 2c 20 61 31 2c 20 61 32 2e 2e 2e 0a 20 20 20  0, a1, a2....   
25d00 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 64 64 72     */.      addr
25d10 54 6f 70 4f 66 4c 6f 6f 70 20 3d 20 73 71 6c 69  TopOfLoop = sqli
25d20 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
25d30 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c  dr(v);.      sql
25d40 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65  ite3ExprCacheCle
25d50 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  ar(pParse);.    
25d60 20 20 69 66 28 20 67 72 6f 75 70 42 79 53 6f 72    if( groupBySor
25d70 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
25d80 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
25d90 2c 20 4f 50 5f 53 6f 72 74 65 72 44 61 74 61 2c  , OP_SorterData,
25da0 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e   sAggInfo.sortin
25db0 67 49 64 78 2c 20 73 6f 72 74 4f 75 74 29 3b 0a  gIdx, sortOut);.
25dc0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f        }.      fo
25dd0 72 28 6a 3d 30 3b 20 6a 3c 70 47 72 6f 75 70 42  r(j=0; j<pGroupB
25de0 79 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a  y->nExpr; j++){.
25df0 20 20 20 20 20 20 20 20 69 66 28 20 67 72 6f 75          if( grou
25e00 70 42 79 53 6f 72 74 20 29 7b 0a 20 20 20 20 20  pBySort ){.     
25e10 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
25e20 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
25e30 75 6d 6e 2c 20 73 6f 72 74 50 54 61 62 2c 20 6a  umn, sortPTab, j
25e40 2c 20 69 42 4d 65 6d 2b 6a 29 3b 0a 20 20 20 20  , iBMem+j);.    
25e50 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 30 20 29        if( j==0 )
25e60 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
25e70 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 43  geP5(v, OPFLAG_C
25e80 4c 45 41 52 43 41 43 48 45 29 3b 0a 20 20 20 20  LEARCACHE);.    
25e90 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
25ea0 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 64 69       sAggInfo.di
25eb0 72 65 63 74 4d 6f 64 65 20 3d 20 31 3b 0a 20 20  rectMode = 1;.  
25ec0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
25ed0 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
25ee0 70 47 72 6f 75 70 42 79 2d 3e 61 5b 6a 5d 2e 70  pGroupBy->a[j].p
25ef0 45 78 70 72 2c 20 69 42 4d 65 6d 2b 6a 29 3b 0a  Expr, iBMem+j);.
25f00 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
25f10 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
25f20 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
25f30 43 6f 6d 70 61 72 65 2c 20 69 41 4d 65 6d 2c 20  Compare, iAMem, 
25f40 69 42 4d 65 6d 2c 20 70 47 72 6f 75 70 42 79 2d  iBMem, pGroupBy-
25f50 3e 6e 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20  >nExpr,.        
25f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25f70 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66    (char*)pKeyInf
25f80 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a  o, P4_KEYINFO);.
25f90 20 20 20 20 20 20 6a 31 20 3d 20 73 71 6c 69 74        j1 = sqlit
25fa0 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
25fb0 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  r(v);.      sqli
25fc0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
25fd0 20 4f 50 5f 4a 75 6d 70 2c 20 6a 31 2b 31 2c 20   OP_Jump, j1+1, 
25fe0 30 2c 20 6a 31 2b 31 29 3b 0a 0a 20 20 20 20 20  0, j1+1);..     
25ff0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
26000 65 20 74 68 61 74 20 72 75 6e 73 20 77 68 65 6e  e that runs when
26010 65 76 65 72 20 74 68 65 20 47 52 4f 55 50 20 42  ever the GROUP B
26020 59 20 63 68 61 6e 67 65 73 2e 0a 20 20 20 20 20  Y changes..     
26030 20 2a 2a 20 43 68 61 6e 67 65 73 20 69 6e 20 74   ** Changes in t
26040 68 65 20 47 52 4f 55 50 20 42 59 20 61 72 65 20  he GROUP BY are 
26050 64 65 74 65 63 74 65 64 20 62 79 20 74 68 65 20  detected by the 
26060 70 72 65 76 69 6f 75 73 20 63 6f 64 65 0a 20 20  previous code.  
26070 20 20 20 20 2a 2a 20 62 6c 6f 63 6b 2e 20 20 49      ** block.  I
26080 66 20 74 68 65 72 65 20 77 65 72 65 20 6e 6f 20  f there were no 
26090 63 68 61 6e 67 65 73 2c 20 74 68 69 73 20 62 6c  changes, this bl
260a0 6f 63 6b 20 69 73 20 73 6b 69 70 70 65 64 2e 0a  ock is skipped..
260b0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
260c0 2a 20 54 68 69 73 20 63 6f 64 65 20 63 6f 70 69  * This code copi
260d0 65 73 20 63 75 72 72 65 6e 74 20 67 72 6f 75 70  es current group
260e0 20 62 79 20 74 65 72 6d 73 20 69 6e 20 62 30 2c   by terms in b0,
260f0 62 31 2c 62 32 2c 2e 2e 2e 0a 20 20 20 20 20 20  b1,b2,....      
26100 2a 2a 20 6f 76 65 72 20 74 6f 20 61 30 2c 61 31  ** over to a0,a1
26110 2c 61 32 2e 20 20 49 74 20 74 68 65 6e 20 63 61  ,a2.  It then ca
26120 6c 6c 73 20 74 68 65 20 6f 75 74 70 75 74 20 73  lls the output s
26130 75 62 72 6f 75 74 69 6e 65 0a 20 20 20 20 20 20  ubroutine.      
26140 2a 2a 20 61 6e 64 20 72 65 73 65 74 73 20 74 68  ** and resets th
26150 65 20 61 67 67 72 65 67 61 74 65 20 61 63 63 75  e aggregate accu
26160 6d 75 6c 61 74 6f 72 20 72 65 67 69 73 74 65 72  mulator register
26170 73 20 69 6e 20 70 72 65 70 61 72 61 74 69 6f 6e  s in preparation
26180 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68  .      ** for th
26190 65 20 6e 65 78 74 20 47 52 4f 55 50 20 42 59 20  e next GROUP BY 
261a0 62 61 74 63 68 2e 0a 20 20 20 20 20 20 2a 2f 0a  batch..      */.
261b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
261c0 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65  rCodeMove(pParse
261d0 2c 20 69 42 4d 65 6d 2c 20 69 41 4d 65 6d 2c 20  , iBMem, iAMem, 
261e0 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 29  pGroupBy->nExpr)
261f0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
26200 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
26210 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 70 75 74  Gosub, regOutput
26220 52 6f 77 2c 20 61 64 64 72 4f 75 74 70 75 74 52  Row, addrOutputR
26230 6f 77 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  ow);.      VdbeC
26240 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6f 75 74 70  omment((v, "outp
26250 75 74 20 6f 6e 65 20 72 6f 77 22 29 29 3b 0a 20  ut one row"));. 
26260 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
26270 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 50  AddOp2(v, OP_IfP
26280 6f 73 2c 20 69 41 62 6f 72 74 46 6c 61 67 2c 20  os, iAbortFlag, 
26290 61 64 64 72 45 6e 64 29 3b 0a 20 20 20 20 20 20  addrEnd);.      
262a0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
262b0 22 63 68 65 63 6b 20 61 62 6f 72 74 20 66 6c 61  "check abort fla
262c0 67 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  g"));.      sqli
262d0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
262e0 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 52 65   OP_Gosub, regRe
262f0 73 65 74 2c 20 61 64 64 72 52 65 73 65 74 29 3b  set, addrReset);
26300 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
26310 6e 74 28 28 76 2c 20 22 72 65 73 65 74 20 61 63  nt((v, "reset ac
26320 63 75 6d 75 6c 61 74 6f 72 22 29 29 3b 0a 0a 20  cumulator"));.. 
26330 20 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74       /* Update t
26340 68 65 20 61 67 67 72 65 67 61 74 65 20 61 63 63  he aggregate acc
26350 75 6d 75 6c 61 74 6f 72 73 20 62 61 73 65 64 20  umulators based 
26360 6f 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  on the content o
26370 66 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63  f.      ** the c
26380 75 72 72 65 6e 74 20 72 6f 77 0a 20 20 20 20 20  urrent row.     
26390 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
263a0 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
263b0 20 6a 31 29 3b 0a 20 20 20 20 20 20 75 70 64 61   j1);.      upda
263c0 74 65 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50  teAccumulator(pP
263d0 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29  arse, &sAggInfo)
263e0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
263f0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
26400 49 6e 74 65 67 65 72 2c 20 31 2c 20 69 55 73 65  Integer, 1, iUse
26410 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62  Flag);.      Vdb
26420 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 69 6e  eComment((v, "in
26430 64 69 63 61 74 65 20 64 61 74 61 20 69 6e 20 61  dicate data in a
26440 63 63 75 6d 75 6c 61 74 6f 72 22 29 29 3b 0a 0a  ccumulator"));..
26450 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20        /* End of 
26460 74 68 65 20 6c 6f 6f 70 0a 20 20 20 20 20 20 2a  the loop.      *
26470 2f 0a 20 20 20 20 20 20 69 66 28 20 67 72 6f 75  /.      if( grou
26480 70 42 79 53 6f 72 74 20 29 7b 0a 20 20 20 20 20  pBySort ){.     
26490 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
264a0 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65  dOp2(v, OP_Sorte
264b0 72 4e 65 78 74 2c 20 73 41 67 67 49 6e 66 6f 2e  rNext, sAggInfo.
264c0 73 6f 72 74 69 6e 67 49 64 78 2c 20 61 64 64 72  sortingIdx, addr
264d0 54 6f 70 4f 66 4c 6f 6f 70 29 3b 0a 20 20 20 20  TopOfLoop);.    
264e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
264f0 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
26500 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  (pWInfo);.      
26510 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
26520 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 61 64 64  ngeToNoop(v, add
26530 72 53 6f 72 74 69 6e 67 49 64 78 29 3b 0a 20 20  rSortingIdx);.  
26540 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
26550 4f 75 74 70 75 74 20 74 68 65 20 66 69 6e 61 6c  Output the final
26560 20 72 6f 77 20 6f 66 20 72 65 73 75 6c 74 0a 20   row of result. 
26570 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
26580 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
26590 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67  v, OP_Gosub, reg
265a0 4f 75 74 70 75 74 52 6f 77 2c 20 61 64 64 72 4f  OutputRow, addrO
265b0 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20  utputRow);.     
265c0 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
265d0 20 22 6f 75 74 70 75 74 20 66 69 6e 61 6c 20 72   "output final r
265e0 6f 77 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  ow"));..      /*
265f0 20 4a 75 6d 70 20 6f 76 65 72 20 74 68 65 20 73   Jump over the s
26600 75 62 72 6f 75 74 69 6e 65 73 0a 20 20 20 20 20  ubroutines.     
26610 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
26620 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
26630 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 45  P_Goto, 0, addrE
26640 6e 64 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47  nd);..      /* G
26650 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75  enerate a subrou
26660 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74  tine that output
26670 73 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f  s a single row o
26680 66 20 74 68 65 20 72 65 73 75 6c 74 0a 20 20 20  f the result.   
26690 20 20 20 2a 2a 20 73 65 74 2e 20 20 54 68 69 73     ** set.  This
266a0 20 73 75 62 72 6f 75 74 69 6e 65 20 66 69 72 73   subroutine firs
266b0 74 20 6c 6f 6f 6b 73 20 61 74 20 74 68 65 20 69  t looks at the i
266c0 55 73 65 46 6c 61 67 2e 20 20 49 66 20 69 55 73  UseFlag.  If iUs
266d0 65 46 6c 61 67 0a 20 20 20 20 20 20 2a 2a 20 69  eFlag.      ** i
266e0 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65  s less than or e
266f0 71 75 61 6c 20 74 6f 20 7a 65 72 6f 2c 20 74 68  qual to zero, th
26700 65 20 73 75 62 72 6f 75 74 69 6e 65 20 69 73 20  e subroutine is 
26710 61 20 6e 6f 2d 6f 70 2e 20 20 49 66 0a 20 20 20  a no-op.  If.   
26720 20 20 20 2a 2a 20 74 68 65 20 70 72 6f 63 65 73     ** the proces
26730 73 69 6e 67 20 63 61 6c 6c 73 20 66 6f 72 20 74  sing calls for t
26740 68 65 20 71 75 65 72 79 20 74 6f 20 61 62 6f 72  he query to abor
26750 74 2c 20 74 68 69 73 20 73 75 62 72 6f 75 74 69  t, this subrouti
26760 6e 65 0a 20 20 20 20 20 20 2a 2a 20 69 6e 63 72  ne.      ** incr
26770 65 6d 65 6e 74 73 20 74 68 65 20 69 41 62 6f 72  ements the iAbor
26780 74 46 6c 61 67 20 6d 65 6d 6f 72 79 20 6c 6f 63  tFlag memory loc
26790 61 74 69 6f 6e 20 62 65 66 6f 72 65 20 72 65 74  ation before ret
267a0 75 72 6e 69 6e 67 20 69 6e 0a 20 20 20 20 20 20  urning in.      
267b0 2a 2a 20 6f 72 64 65 72 20 74 6f 20 73 69 67 6e  ** order to sign
267c0 61 6c 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f  al the caller to
267d0 20 61 62 6f 72 74 2e 0a 20 20 20 20 20 20 2a 2f   abort..      */
267e0 0a 20 20 20 20 20 20 61 64 64 72 53 65 74 41 62  .      addrSetAb
267f0 6f 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ort = sqlite3Vdb
26800 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
26810 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
26820 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
26830 6e 74 65 67 65 72 2c 20 31 2c 20 69 41 62 6f 72  nteger, 1, iAbor
26840 74 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64  tFlag);.      Vd
26850 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 73  beComment((v, "s
26860 65 74 20 61 62 6f 72 74 20 66 6c 61 67 22 29 29  et abort flag"))
26870 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
26880 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
26890 52 65 74 75 72 6e 2c 20 72 65 67 4f 75 74 70 75  Return, regOutpu
268a0 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 73 71 6c  tRow);.      sql
268b0 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
268c0 61 62 65 6c 28 76 2c 20 61 64 64 72 4f 75 74 70  abel(v, addrOutp
268d0 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 61 64  utRow);.      ad
268e0 64 72 4f 75 74 70 75 74 52 6f 77 20 3d 20 73 71  drOutputRow = sq
268f0 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
26900 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73  Addr(v);.      s
26910 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
26920 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69 55  (v, OP_IfPos, iU
26930 73 65 46 6c 61 67 2c 20 61 64 64 72 4f 75 74 70  seFlag, addrOutp
26940 75 74 52 6f 77 2b 32 29 3b 0a 20 20 20 20 20 20  utRow+2);.      
26950 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
26960 22 47 72 6f 75 70 62 79 20 72 65 73 75 6c 74 20  "Groupby result 
26970 67 65 6e 65 72 61 74 6f 72 20 65 6e 74 72 79 20  generator entry 
26980 70 6f 69 6e 74 22 29 29 3b 0a 20 20 20 20 20 20  point"));.      
26990 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
269a0 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20  1(v, OP_Return, 
269b0 72 65 67 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20  regOutputRow);. 
269c0 20 20 20 20 20 66 69 6e 61 6c 69 7a 65 41 67 67       finalizeAgg
269d0 46 75 6e 63 74 69 6f 6e 73 28 70 50 61 72 73 65  Functions(pParse
269e0 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20  , &sAggInfo);.  
269f0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
26a00 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
26a10 48 61 76 69 6e 67 2c 20 61 64 64 72 4f 75 74 70  Having, addrOutp
26a20 75 74 52 6f 77 2b 31 2c 20 53 51 4c 49 54 45 5f  utRow+1, SQLITE_
26a30 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20  JUMPIFNULL);.   
26a40 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f     selectInnerLo
26a50 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d  op(pParse, p, p-
26a60 3e 70 45 4c 69 73 74 2c 20 30 2c 20 30 2c 20 70  >pEList, 0, 0, p
26a70 4f 72 64 65 72 42 79 2c 0a 20 20 20 20 20 20 20  OrderBy,.       
26a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
26a90 73 44 69 73 74 69 6e 63 74 2c 20 70 44 65 73 74  sDistinct, pDest
26aa0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
26ab0 20 20 20 20 20 20 20 20 61 64 64 72 4f 75 74 70          addrOutp
26ac0 75 74 52 6f 77 2b 31 2c 20 61 64 64 72 53 65 74  utRow+1, addrSet
26ad0 41 62 6f 72 74 29 3b 0a 20 20 20 20 20 20 73 71  Abort);.      sq
26ae0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
26af0 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65  v, OP_Return, re
26b00 67 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20  gOutputRow);.   
26b10 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
26b20 76 2c 20 22 65 6e 64 20 67 72 6f 75 70 62 79 20  v, "end groupby 
26b30 72 65 73 75 6c 74 20 67 65 6e 65 72 61 74 6f 72  result generator
26b40 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47  "));..      /* G
26b50 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75  enerate a subrou
26b60 74 69 6e 65 20 74 68 61 74 20 77 69 6c 6c 20 72  tine that will r
26b70 65 73 65 74 20 74 68 65 20 67 72 6f 75 70 2d 62  eset the group-b
26b80 79 20 61 63 63 75 6d 75 6c 61 74 6f 72 0a 20 20  y accumulator.  
26b90 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
26ba0 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
26bb0 61 62 65 6c 28 76 2c 20 61 64 64 72 52 65 73 65  abel(v, addrRese
26bc0 74 29 3b 0a 20 20 20 20 20 20 72 65 73 65 74 41  t);.      resetA
26bd0 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73  ccumulator(pPars
26be0 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20  e, &sAggInfo);. 
26bf0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
26c00 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74  AddOp1(v, OP_Ret
26c10 75 72 6e 2c 20 72 65 67 52 65 73 65 74 29 3b 0a  urn, regReset);.
26c20 20 20 20 20 20 0a 20 20 20 20 7d 20 2f 2a 20 65       .    } /* e
26c30 6e 64 69 66 20 70 47 72 6f 75 70 42 79 2e 20 20  ndif pGroupBy.  
26c40 42 65 67 69 6e 20 61 67 67 72 65 67 61 74 65 20  Begin aggregate 
26c50 71 75 65 72 69 65 73 20 77 69 74 68 6f 75 74 20  queries without 
26c60 47 52 4f 55 50 20 42 59 3a 20 2a 2f 0a 20 20 20  GROUP BY: */.   
26c70 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 45 78   else {.      Ex
26c80 70 72 4c 69 73 74 20 2a 70 44 65 6c 20 3d 20 30  prList *pDel = 0
26c90 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
26ca0 5f 4f 4d 49 54 5f 42 54 52 45 45 43 4f 55 4e 54  _OMIT_BTREECOUNT
26cb0 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54  .      Table *pT
26cc0 61 62 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70  ab;.      if( (p
26cd0 54 61 62 20 3d 20 69 73 53 69 6d 70 6c 65 43 6f  Tab = isSimpleCo
26ce0 75 6e 74 28 70 2c 20 26 73 41 67 67 49 6e 66 6f  unt(p, &sAggInfo
26cf0 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ))!=0 ){.       
26d00 20 2f 2a 20 49 66 20 69 73 53 69 6d 70 6c 65 43   /* If isSimpleC
26d10 6f 75 6e 74 28 29 20 72 65 74 75 72 6e 73 20 61  ount() returns a
26d20 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 54 61   pointer to a Ta
26d30 62 6c 65 20 73 74 72 75 63 74 75 72 65 2c 20 74  ble structure, t
26d40 68 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  hen.        ** t
26d50 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  he SQL statement
26d60 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a   is of the form:
26d70 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
26d80 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20      **   SELECT 
26d90 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 3c 74  count(*) FROM <t
26da0 62 6c 3e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  bl>.        **. 
26db0 20 20 20 20 20 20 20 2a 2a 20 77 68 65 72 65 20         ** where 
26dc0 74 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74  the Table struct
26dd0 75 72 65 20 72 65 74 75 72 6e 65 64 20 72 65 70  ure returned rep
26de0 72 65 73 65 6e 74 73 20 74 61 62 6c 65 20 3c 74  resents table <t
26df0 62 6c 3e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  bl>..        **.
26e00 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20          ** This 
26e10 73 74 61 74 65 6d 65 6e 74 20 69 73 20 73 6f 20  statement is so 
26e20 63 6f 6d 6d 6f 6e 20 74 68 61 74 20 69 74 20 69  common that it i
26e30 73 20 6f 70 74 69 6d 69 7a 65 64 20 73 70 65 63  s optimized spec
26e40 69 61 6c 6c 79 2e 20 54 68 65 0a 20 20 20 20 20  ially. The.     
26e50 20 20 20 2a 2a 20 4f 50 5f 43 6f 75 6e 74 20 69     ** OP_Count i
26e60 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20 65 78  nstruction is ex
26e70 65 63 75 74 65 64 20 65 69 74 68 65 72 20 6f 6e  ecuted either on
26e80 20 74 68 65 20 69 6e 74 6b 65 79 20 74 61 62 6c   the intkey tabl
26e90 65 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a  e that.        *
26ea0 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 64  * contains the d
26eb0 61 74 61 20 66 6f 72 20 74 61 62 6c 65 20 3c 74  ata for table <t
26ec0 62 6c 3e 20 6f 72 20 6f 6e 20 6f 6e 65 20 6f 66  bl> or on one of
26ed0 20 69 74 73 20 69 6e 64 65 78 65 73 2e 20 49 74   its indexes. It
26ee0 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 62  .        ** is b
26ef0 65 74 74 65 72 20 74 6f 20 65 78 65 63 75 74 65  etter to execute
26f00 20 74 68 65 20 6f 70 20 6f 6e 20 61 6e 20 69 6e   the op on an in
26f10 64 65 78 2c 20 61 73 20 69 6e 64 65 78 65 73 20  dex, as indexes 
26f20 61 72 65 20 61 6c 6d 6f 73 74 0a 20 20 20 20 20  are almost.     
26f30 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 73 70 72     ** always spr
26f40 65 61 64 20 61 63 72 6f 73 73 20 6c 65 73 73 20  ead across less 
26f50 70 61 67 65 73 20 74 68 61 6e 20 74 68 65 69 72  pages than their
26f60 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
26f70 61 62 6c 65 73 2e 0a 20 20 20 20 20 20 20 20 2a  ables..        *
26f80 2f 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20  /.        const 
26f90 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65  int iDb = sqlite
26fa0 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70  3SchemaToIndex(p
26fb0 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d  Parse->db, pTab-
26fc0 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20  >pSchema);.     
26fd0 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 43 73     const int iCs
26fe0 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  r = pParse->nTab
26ff0 2b 2b 3b 20 20 20 20 20 2f 2a 20 43 75 72 73 6f  ++;     /* Curso
27000 72 20 74 6f 20 73 63 61 6e 20 62 2d 74 72 65 65  r to scan b-tree
27010 20 2a 2f 0a 20 20 20 20 20 20 20 20 49 6e 64 65   */.        Inde
27020 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20  x *pIdx;        
27030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27040 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72   /* Iterator var
27050 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20  iable */.       
27060 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
27070 66 6f 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  fo = 0;         
27080 20 20 20 20 20 20 2f 2a 20 4b 65 79 69 6e 66 6f        /* Keyinfo
27090 20 66 6f 72 20 73 63 61 6e 6e 65 64 20 69 6e 64   for scanned ind
270a0 65 78 20 2a 2f 0a 20 20 20 20 20 20 20 20 49 6e  ex */.        In
270b0 64 65 78 20 2a 70 42 65 73 74 20 3d 20 30 3b 20  dex *pBest = 0; 
270c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
270d0 20 20 20 2f 2a 20 42 65 73 74 20 69 6e 64 65 78     /* Best index
270e0 20 66 6f 75 6e 64 20 73 6f 20 66 61 72 20 2a 2f   found so far */
270f0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 52 6f  .        int iRo
27100 6f 74 20 3d 20 70 54 61 62 2d 3e 74 6e 75 6d 3b  ot = pTab->tnum;
27110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
27120 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 73 63   Root page of sc
27130 61 6e 6e 65 64 20 62 2d 74 72 65 65 20 2a 2f 0a  anned b-tree */.
27140 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
27150 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61  CodeVerifySchema
27160 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20  (pParse, iDb);. 
27170 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 61         sqlite3Ta
27180 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20  bleLock(pParse, 
27190 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c  iDb, pTab->tnum,
271a0 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29   0, pTab->zName)
271b0 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 65  ;..        /* Se
271c0 61 72 63 68 20 66 6f 72 20 74 68 65 20 69 6e 64  arch for the ind
271d0 65 78 20 74 68 61 74 20 68 61 73 20 74 68 65 20  ex that has the 
271e0 6c 65 61 73 74 20 61 6d 6f 75 6e 74 20 6f 66 20  least amount of 
271f0 63 6f 6c 75 6d 6e 73 2e 20 49 66 0a 20 20 20 20  columns. If.    
27200 20 20 20 20 2a 2a 20 74 68 65 72 65 20 69 73 20      ** there is 
27210 73 75 63 68 20 61 6e 20 69 6e 64 65 78 2c 20 61  such an index, a
27220 6e 64 20 69 74 20 68 61 73 20 6c 65 73 73 20 63  nd it has less c
27230 6f 6c 75 6d 6e 73 20 74 68 61 6e 20 74 68 65 20  olumns than the 
27240 74 61 62 6c 65 0a 20 20 20 20 20 20 20 20 2a 2a  table.        **
27250 20 64 6f 65 73 2c 20 74 68 65 6e 20 77 65 20 63   does, then we c
27260 61 6e 20 61 73 73 75 6d 65 20 74 68 61 74 20 69  an assume that i
27270 74 20 63 6f 6e 73 75 6d 65 73 20 6c 65 73 73 20  t consumes less 
27280 73 70 61 63 65 20 6f 6e 20 64 69 73 6b 20 61 6e  space on disk an
27290 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 69 6c  d.        ** wil
272a0 6c 20 74 68 65 72 65 66 6f 72 65 20 62 65 20 63  l therefore be c
272b0 68 65 61 70 65 72 20 74 6f 20 73 63 61 6e 20 74  heaper to scan t
272c0 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20  o determine the 
272d0 71 75 65 72 79 20 72 65 73 75 6c 74 2e 0a 20 20  query result..  
272e0 20 20 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73        ** In this
272f0 20 63 61 73 65 20 73 65 74 20 69 52 6f 6f 74 20   case set iRoot 
27300 74 6f 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  to the root page
27310 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 69   number of the i
27320 6e 64 65 78 20 62 2d 74 72 65 65 0a 20 20 20 20  ndex b-tree.    
27330 20 20 20 20 2a 2a 20 61 6e 64 20 70 4b 65 79 49      ** and pKeyI
27340 6e 66 6f 20 74 6f 20 74 68 65 20 4b 65 79 49 6e  nfo to the KeyIn
27350 66 6f 20 73 74 72 75 63 74 75 72 65 20 72 65 71  fo structure req
27360 75 69 72 65 64 20 74 6f 20 6e 61 76 69 67 61 74  uired to navigat
27370 65 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  e the.        **
27380 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20   index..        
27390 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 32  **.        ** (2
273a0 30 31 31 2d 30 34 2d 31 35 29 20 44 6f 20 6e 6f  011-04-15) Do no
273b0 74 20 64 6f 20 61 20 66 75 6c 6c 20 73 63 61 6e  t do a full scan
273c0 20 6f 66 20 61 6e 20 75 6e 6f 72 64 65 72 65 64   of an unordered
273d0 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20   index..        
273e0 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 6e  **.        ** In
273f0 20 70 72 61 63 74 69 63 65 20 74 68 65 20 4b 65   practice the Ke
27400 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  yInfo structure 
27410 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75 73 65 64  will not be used
27420 2e 20 49 74 20 69 73 20 6f 6e 6c 79 20 0a 20 20  . It is only .  
27430 20 20 20 20 20 20 2a 2a 20 70 61 73 73 65 64 20        ** passed 
27440 74 6f 20 6b 65 65 70 20 4f 50 5f 4f 70 65 6e 52  to keep OP_OpenR
27450 65 61 64 20 68 61 70 70 79 2e 0a 20 20 20 20 20  ead happy..     
27460 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f     */.        fo
27470 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  r(pIdx=pTab->pIn
27480 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d  dex; pIdx; pIdx=
27490 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pIdx->pNext){.  
274a0 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78          if( pIdx
274b0 2d 3e 62 55 6e 6f 72 64 65 72 65 64 3d 3d 30 20  ->bUnordered==0 
274c0 26 26 20 28 21 70 42 65 73 74 20 7c 7c 20 70 49  && (!pBest || pI
274d0 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3c 70 42 65 73  dx->nColumn<pBes
274e0 74 2d 3e 6e 43 6f 6c 75 6d 6e 29 20 29 7b 0a 20  t->nColumn) ){. 
274f0 20 20 20 20 20 20 20 20 20 20 20 70 42 65 73 74             pBest
27500 20 3d 20 70 49 64 78 3b 0a 20 20 20 20 20 20 20   = pIdx;.       
27510 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
27520 20 20 20 20 20 20 20 69 66 28 20 70 42 65 73 74         if( pBest
27530 20 26 26 20 70 42 65 73 74 2d 3e 6e 43 6f 6c 75   && pBest->nColu
27540 6d 6e 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b  mn<pTab->nCol ){
27550 0a 20 20 20 20 20 20 20 20 20 20 69 52 6f 6f 74  .          iRoot
27560 20 3d 20 70 42 65 73 74 2d 3e 74 6e 75 6d 3b 0a   = pBest->tnum;.
27570 20 20 20 20 20 20 20 20 20 20 70 4b 65 79 49 6e            pKeyIn
27580 66 6f 20 3d 20 73 71 6c 69 74 65 33 49 6e 64 65  fo = sqlite3Inde
27590 78 4b 65 79 69 6e 66 6f 28 70 50 61 72 73 65 2c  xKeyinfo(pParse,
275a0 20 70 42 65 73 74 29 3b 0a 20 20 20 20 20 20 20   pBest);.       
275b0 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f   }..        /* O
275c0 70 65 6e 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20  pen a read-only 
275d0 63 75 72 73 6f 72 2c 20 65 78 65 63 75 74 65 20  cursor, execute 
275e0 74 68 65 20 4f 50 5f 43 6f 75 6e 74 2c 20 63 6c  the OP_Count, cl
275f0 6f 73 65 20 74 68 65 20 63 75 72 73 6f 72 2e 20  ose the cursor. 
27600 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  */.        sqlit
27610 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
27620 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69 43 73  OP_OpenRead, iCs
27630 72 2c 20 69 52 6f 6f 74 2c 20 69 44 62 29 3b 0a  r, iRoot, iDb);.
27640 20 20 20 20 20 20 20 20 69 66 28 20 70 4b 65 79          if( pKey
27650 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 20 20  Info ){.        
27660 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
27670 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 28 63 68  ngeP4(v, -1, (ch
27680 61 72 20 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50  ar *)pKeyInfo, P
27690 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46  4_KEYINFO_HANDOF
276a0 46 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  F);.        }.  
276b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
276c0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f  eAddOp2(v, OP_Co
276d0 75 6e 74 2c 20 69 43 73 72 2c 20 73 41 67 67 49  unt, iCsr, sAggI
276e0 6e 66 6f 2e 61 46 75 6e 63 5b 30 5d 2e 69 4d 65  nfo.aFunc[0].iMe
276f0 6d 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  m);.        sqli
27700 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
27710 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 43 73 72 29   OP_Close, iCsr)
27720 3b 0a 20 20 20 20 20 20 20 20 65 78 70 6c 61 69  ;.        explai
27730 6e 53 69 6d 70 6c 65 43 6f 75 6e 74 28 70 50 61  nSimpleCount(pPa
27740 72 73 65 2c 20 70 54 61 62 2c 20 70 42 65 73 74  rse, pTab, pBest
27750 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 23  );.      }else.#
27760 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
27770 4f 4d 49 54 5f 42 54 52 45 45 43 4f 55 4e 54 20  OMIT_BTREECOUNT 
27780 2a 2f 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20  */.      {.     
27790 20 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74     /* Check if t
277a0 68 65 20 71 75 65 72 79 20 69 73 20 6f 66 20 6f  he query is of o
277b0 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ne of the follow
277c0 69 6e 67 20 66 6f 72 6d 73 3a 0a 20 20 20 20 20  ing forms:.     
277d0 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
277e0 20 20 20 53 45 4c 45 43 54 20 6d 69 6e 28 78 29     SELECT min(x)
277f0 20 46 52 4f 4d 20 2e 2e 2e 0a 20 20 20 20 20 20   FROM ....      
27800 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 6d 61    **   SELECT ma
27810 78 28 78 29 20 46 52 4f 4d 20 2e 2e 2e 0a 20 20  x(x) FROM ....  
27820 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
27830 20 2a 2a 20 49 66 20 69 74 20 69 73 2c 20 74 68   ** If it is, th
27840 65 6e 20 61 73 6b 20 74 68 65 20 63 6f 64 65 20  en ask the code 
27850 69 6e 20 77 68 65 72 65 2e 63 20 74 6f 20 61 74  in where.c to at
27860 74 65 6d 70 74 20 74 6f 20 73 6f 72 74 20 72 65  tempt to sort re
27870 73 75 6c 74 73 0a 20 20 20 20 20 20 20 20 2a 2a  sults.        **
27880 20 61 73 20 69 66 20 74 68 65 72 65 20 77 61 73   as if there was
27890 20 61 6e 20 22 4f 52 44 45 52 20 4f 4e 20 78 22   an "ORDER ON x"
278a0 20 6f 72 20 22 4f 52 44 45 52 20 4f 4e 20 78 20   or "ORDER ON x 
278b0 44 45 53 43 22 20 63 6c 61 75 73 65 2e 20 0a 20  DESC" clause. . 
278c0 20 20 20 20 20 20 20 2a 2a 20 49 66 20 77 68 65         ** If whe
278d0 72 65 2e 63 20 69 73 20 61 62 6c 65 20 74 6f 20  re.c is able to 
278e0 70 72 6f 64 75 63 65 20 72 65 73 75 6c 74 73 20  produce results 
278f0 73 6f 72 74 65 64 20 69 6e 20 74 68 69 73 20 6f  sorted in this o
27900 72 64 65 72 2c 20 74 68 65 6e 0a 20 20 20 20 20  rder, then.     
27910 20 20 20 2a 2a 20 61 64 64 20 76 64 62 65 20 63     ** add vdbe c
27920 6f 64 65 20 74 6f 20 62 72 65 61 6b 20 6f 75 74  ode to break out
27930 20 6f 66 20 74 68 65 20 70 72 6f 63 65 73 73 69   of the processi
27940 6e 67 20 6c 6f 6f 70 20 61 66 74 65 72 20 74 68  ng loop after th
27950 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 69  e .        ** fi
27960 72 73 74 20 69 74 65 72 61 74 69 6f 6e 20 28 73  rst iteration (s
27970 69 6e 63 65 20 74 68 65 20 66 69 72 73 74 20 69  ince the first i
27980 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  teration of the 
27990 6c 6f 6f 70 20 69 73 20 0a 20 20 20 20 20 20 20  loop is .       
279a0 20 2a 2a 20 67 75 61 72 61 6e 74 65 65 64 20 74   ** guaranteed t
279b0 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65  o operate on the
279c0 20 72 6f 77 20 77 69 74 68 20 74 68 65 20 6d 69   row with the mi
279d0 6e 69 6d 75 6d 20 6f 72 20 6d 61 78 69 6d 75 6d  nimum or maximum
279e0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 76 61 6c   .        ** val
279f0 75 65 20 6f 66 20 78 2c 20 74 68 65 20 6f 6e 6c  ue of x, the onl
27a00 79 20 72 6f 77 20 72 65 71 75 69 72 65 64 29 2e  y row required).
27a10 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
27a20 20 20 20 20 2a 2a 20 41 20 73 70 65 63 69 61 6c      ** A special
27a30 20 66 6c 61 67 20 6d 75 73 74 20 62 65 20 70 61   flag must be pa
27a40 73 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33 57  ssed to sqlite3W
27a50 68 65 72 65 42 65 67 69 6e 28 29 20 74 6f 20 73  hereBegin() to s
27a60 6c 69 67 68 74 6c 79 0a 20 20 20 20 20 20 20 20  lightly.        
27a70 2a 2a 20 6d 6f 64 69 66 79 20 62 65 68 61 76 69  ** modify behavi
27a80 6f 75 72 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  our as follows:.
27a90 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
27aa0 20 20 20 2a 2a 20 20 20 2b 20 49 66 20 74 68 65     **   + If the
27ab0 20 71 75 65 72 79 20 69 73 20 61 20 22 53 45 4c   query is a "SEL
27ac0 45 43 54 20 6d 69 6e 28 78 29 22 2c 20 74 68 65  ECT min(x)", the
27ad0 6e 20 74 68 65 20 6c 6f 6f 70 20 63 6f 64 65 64  n the loop coded
27ae0 20 62 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 20   by.        **  
27af0 20 20 20 77 68 65 72 65 2e 63 20 73 68 6f 75 6c     where.c shoul
27b00 64 20 6e 6f 74 20 69 74 65 72 61 74 65 20 6f 76  d not iterate ov
27b10 65 72 20 61 6e 79 20 76 61 6c 75 65 73 20 77 69  er any values wi
27b20 74 68 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65 0a  th a NULL value.
27b30 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 66          **     f
27b40 6f 72 20 78 2e 0a 20 20 20 20 20 20 20 20 2a 2a  or x..        **
27b50 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 2b 20  .        **   + 
27b60 54 68 65 20 6f 70 74 69 6d 69 7a 65 72 20 63 6f  The optimizer co
27b70 64 65 20 69 6e 20 77 68 65 72 65 2e 63 20 28 74  de in where.c (t
27b80 68 65 20 74 68 69 6e 67 20 74 68 61 74 20 64 65  he thing that de
27b90 63 69 64 65 73 20 77 68 69 63 68 0a 20 20 20 20  cides which.    
27ba0 20 20 20 20 2a 2a 20 20 20 20 20 69 6e 64 65 78      **     index
27bb0 20 6f 72 20 69 6e 64 69 63 65 73 20 74 6f 20 75   or indices to u
27bc0 73 65 29 20 73 68 6f 75 6c 64 20 70 6c 61 63 65  se) should place
27bd0 20 61 20 64 69 66 66 65 72 65 6e 74 20 70 72 69   a different pri
27be0 6f 72 69 74 79 20 6f 6e 20 0a 20 20 20 20 20 20  ority on .      
27bf0 20 20 2a 2a 20 20 20 20 20 73 61 74 69 73 66 79    **     satisfy
27c00 69 6e 67 20 74 68 65 20 27 4f 52 44 45 52 20 42  ing the 'ORDER B
27c10 59 27 20 63 6c 61 75 73 65 20 74 68 61 6e 20 69  Y' clause than i
27c20 74 20 64 6f 65 73 20 69 6e 20 6f 74 68 65 72 20  t does in other 
27c30 63 61 73 65 73 2e 0a 20 20 20 20 20 20 20 20 2a  cases..        *
27c40 2a 20 20 20 20 20 52 65 66 65 72 20 74 6f 20 63  *     Refer to c
27c50 6f 64 65 20 61 6e 64 20 63 6f 6d 6d 65 6e 74 73  ode and comments
27c60 20 69 6e 20 77 68 65 72 65 2e 63 20 66 6f 72 20   in where.c for 
27c70 64 65 74 61 69 6c 73 2e 0a 20 20 20 20 20 20 20  details..       
27c80 20 2a 2f 0a 20 20 20 20 20 20 20 20 45 78 70 72   */.        Expr
27c90 4c 69 73 74 20 2a 70 4d 69 6e 4d 61 78 20 3d 20  List *pMinMax = 
27ca0 30 3b 0a 20 20 20 20 20 20 20 20 75 38 20 66 6c  0;.        u8 fl
27cb0 61 67 20 3d 20 6d 69 6e 4d 61 78 51 75 65 72 79  ag = minMaxQuery
27cc0 28 70 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  (p);.        if(
27cd0 20 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 20   flag ){.       
27ce0 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
27cf0 48 61 73 50 72 6f 70 65 72 74 79 28 70 2d 3e 70  HasProperty(p->p
27d00 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
27d10 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
27d20 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73   );.          as
27d30 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 2d  sert( p->pEList-
27d40 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 78 2e 70  >a[0].pExpr->x.p
27d50 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 31 20 29  List->nExpr==1 )
27d60 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4d 69 6e  ;.          pMin
27d70 4d 61 78 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Max = sqlite3Exp
27d80 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e  rListDup(db, p->
27d90 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  pEList->a[0].pEx
27da0 70 72 2d 3e 78 2e 70 4c 69 73 74 2c 30 29 3b 0a  pr->x.pList,0);.
27db0 20 20 20 20 20 20 20 20 20 20 70 44 65 6c 20 3d            pDel =
27dc0 20 70 4d 69 6e 4d 61 78 3b 0a 20 20 20 20 20 20   pMinMax;.      
27dd0 20 20 20 20 69 66 28 20 70 4d 69 6e 4d 61 78 20      if( pMinMax 
27de0 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  && !db->mallocFa
27df0 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20  iled ){.        
27e00 20 20 20 20 70 4d 69 6e 4d 61 78 2d 3e 61 5b 30      pMinMax->a[0
27e10 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20 66 6c  ].sortOrder = fl
27e20 61 67 21 3d 57 48 45 52 45 5f 4f 52 44 45 52 42  ag!=WHERE_ORDERB
27e30 59 5f 4d 49 4e 20 3f 31 3a 30 3b 0a 20 20 20 20  Y_MIN ?1:0;.    
27e40 20 20 20 20 20 20 20 20 70 4d 69 6e 4d 61 78 2d          pMinMax-
27e50 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 20  >a[0].pExpr->op 
27e60 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20  = TK_COLUMN;.   
27e70 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
27e80 20 7d 0a 20 20 0a 20 20 20 20 20 20 20 20 2f 2a   }.  .        /*
27e90 20 54 68 69 73 20 63 61 73 65 20 72 75 6e 73 20   This case runs 
27ea0 69 66 20 74 68 65 20 61 67 67 72 65 67 61 74 65  if the aggregate
27eb0 20 68 61 73 20 6e 6f 20 47 52 4f 55 50 20 42 59   has no GROUP BY
27ec0 20 63 6c 61 75 73 65 2e 20 20 54 68 65 0a 20 20   clause.  The.  
27ed0 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73        ** process
27ee0 69 6e 67 20 69 73 20 6d 75 63 68 20 73 69 6d 70  ing is much simp
27ef0 6c 65 72 20 73 69 6e 63 65 20 74 68 65 72 65 20  ler since there 
27f00 69 73 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65  is only a single
27f10 20 72 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a 20   row.        ** 
27f20 6f 66 20 6f 75 74 70 75 74 2e 0a 20 20 20 20 20  of output..     
27f30 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65     */.        re
27f40 73 65 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 70  setAccumulator(p
27f50 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f  Parse, &sAggInfo
27f60 29 3b 0a 20 20 20 20 20 20 20 20 70 57 49 6e 66  );.        pWInf
27f70 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65  o = sqlite3Where
27f80 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54  Begin(pParse, pT
27f90 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20  abList, pWhere, 
27fa0 70 4d 69 6e 4d 61 78 2c 30 2c 66 6c 61 67 2c 30  pMinMax,0,flag,0
27fb0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
27fc0 57 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20  WInfo==0 ){.    
27fd0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
27fe0 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
27ff0 70 44 65 6c 29 3b 0a 20 20 20 20 20 20 20 20 20  pDel);.         
28000 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
28010 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
28020 20 20 20 20 75 70 64 61 74 65 41 63 63 75 6d 75      updateAccumu
28030 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73  lator(pParse, &s
28040 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  AggInfo);.      
28050 20 20 61 73 73 65 72 74 28 20 70 4d 69 6e 4d 61    assert( pMinMa
28060 78 3d 3d 30 20 7c 7c 20 70 4d 69 6e 4d 61 78 2d  x==0 || pMinMax-
28070 3e 6e 45 78 70 72 3d 3d 31 20 29 3b 0a 20 20 20  >nExpr==1 );.   
28080 20 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d       if( pWInfo-
28090 3e 6e 4f 42 53 61 74 3e 30 20 29 7b 0a 20 20 20  >nOBSat>0 ){.   
280a0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
280b0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
280c0 6f 74 6f 2c 20 30 2c 20 70 57 49 6e 66 6f 2d 3e  oto, 0, pWInfo->
280d0 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20  iBreak);.       
280e0 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
280f0 76 2c 20 22 25 73 28 29 20 62 79 20 69 6e 64 65  v, "%s() by inde
28100 78 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  x",.            
28110 20 20 20 20 28 66 6c 61 67 3d 3d 57 48 45 52 45      (flag==WHERE
28120 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 3f 22 6d 69  _ORDERBY_MIN?"mi
28130 6e 22 3a 22 6d 61 78 22 29 29 29 3b 0a 20 20 20  n":"max")));.   
28140 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
28150 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70  qlite3WhereEnd(p
28160 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  WInfo);.        
28170 66 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63 74  finalizeAggFunct
28180 69 6f 6e 73 28 70 50 61 72 73 65 2c 20 26 73 41  ions(pParse, &sA
28190 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 7d  ggInfo);.      }
281a0 0a 0a 20 20 20 20 20 20 70 4f 72 64 65 72 42 79  ..      pOrderBy
281b0 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69   = 0;.      sqli
281c0 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
281d0 50 61 72 73 65 2c 20 70 48 61 76 69 6e 67 2c 20  Parse, pHaving, 
281e0 61 64 64 72 45 6e 64 2c 20 53 51 4c 49 54 45 5f  addrEnd, SQLITE_
281f0 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20  JUMPIFNULL);.   
28200 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f     selectInnerLo
28210 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d  op(pParse, p, p-
28220 3e 70 45 4c 69 73 74 2c 20 30 2c 20 30 2c 20 30  >pEList, 0, 0, 0
28230 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20  , 0, .          
28240 20 20 20 20 20 20 20 20 20 20 20 20 70 44 65 73              pDes
28250 74 2c 20 61 64 64 72 45 6e 64 2c 20 61 64 64 72  t, addrEnd, addr
28260 45 6e 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  End);.      sqli
28270 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
28280 65 28 64 62 2c 20 70 44 65 6c 29 3b 0a 20 20 20  e(db, pDel);.   
28290 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64   }.    sqlite3Vd
282a0 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
282b0 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20 20 20 20  , addrEnd);.    
282c0 0a 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20 61 67  .  } /* endif ag
282d0 67 72 65 67 61 74 65 20 71 75 65 72 79 20 2a 2f  gregate query */
282e0 0a 0a 20 20 69 66 28 20 73 44 69 73 74 69 6e 63  ..  if( sDistinc
282f0 74 2e 65 54 6e 63 74 54 79 70 65 3d 3d 57 48 45  t.eTnctType==WHE
28300 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 4f 52  RE_DISTINCT_UNOR
28310 44 45 52 45 44 20 29 7b 0a 20 20 20 20 65 78 70  DERED ){.    exp
28320 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65 28 70 50  lainTempTable(pP
28330 61 72 73 65 2c 20 22 44 49 53 54 49 4e 43 54 22  arse, "DISTINCT"
28340 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  );.  }..  /* If 
28350 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45  there is an ORDE
28360 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65  R BY clause, the
28370 6e 20 77 65 20 6e 65 65 64 20 74 6f 20 73 6f 72  n we need to sor
28380 74 20 74 68 65 20 72 65 73 75 6c 74 73 0a 20 20  t the results.  
28390 2a 2a 20 61 6e 64 20 73 65 6e 64 20 74 68 65 6d  ** and send them
283a0 20 74 6f 20 74 68 65 20 63 61 6c 6c 62 61 63 6b   to the callback
283b0 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20 2a   one by one..  *
283c0 2f 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79  /.  if( pOrderBy
283d0 20 29 7b 0a 20 20 20 20 65 78 70 6c 61 69 6e 54   ){.    explainT
283e0 65 6d 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c  empTable(pParse,
283f0 20 22 4f 52 44 45 52 20 42 59 22 29 3b 0a 20 20   "ORDER BY");.  
28400 20 20 67 65 6e 65 72 61 74 65 53 6f 72 74 54 61    generateSortTa
28410 69 6c 28 70 50 61 72 73 65 2c 20 70 2c 20 76 2c  il(pParse, p, v,
28420 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20   pEList->nExpr, 
28430 70 44 65 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f  pDest);.  }..  /
28440 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 73  * Jump here to s
28450 6b 69 70 20 74 68 69 73 20 71 75 65 72 79 0a 20  kip this query. 
28460 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
28470 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
28480 20 69 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20 54 68   iEnd);..  /* Th
28490 65 20 53 45 4c 45 43 54 20 77 61 73 20 73 75 63  e SELECT was suc
284a0 63 65 73 73 66 75 6c 6c 79 20 63 6f 64 65 64 2e  cessfully coded.
284b0 20 20 20 53 65 74 20 74 68 65 20 72 65 74 75 72     Set the retur
284c0 6e 20 63 6f 64 65 20 74 6f 20 30 0a 20 20 2a 2a  n code to 0.  **
284d0 20 74 6f 20 69 6e 64 69 63 61 74 65 20 6e 6f 20   to indicate no 
284e0 65 72 72 6f 72 73 2e 0a 20 20 2a 2f 0a 20 20 72  errors..  */.  r
284f0 63 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43 6f 6e  c = 0;..  /* Con
28500 74 72 6f 6c 20 6a 75 6d 70 73 20 74 6f 20 68 65  trol jumps to he
28510 72 65 20 69 66 20 61 6e 20 65 72 72 6f 72 20 69  re if an error i
28520 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 61 62  s encountered ab
28530 6f 76 65 2c 20 6f 72 20 75 70 6f 6e 0a 20 20 2a  ove, or upon.  *
28540 2a 20 73 75 63 63 65 73 73 66 75 6c 20 63 6f 64  * successful cod
28550 69 6e 67 20 6f 66 20 74 68 65 20 53 45 4c 45 43  ing of the SELEC
28560 54 2e 0a 20 20 2a 2f 0a 73 65 6c 65 63 74 5f 65  T..  */.select_e
28570 6e 64 3a 0a 20 20 65 78 70 6c 61 69 6e 53 65 74  nd:.  explainSet
28580 49 6e 74 65 67 65 72 28 70 50 61 72 73 65 2d 3e  Integer(pParse->
28590 69 53 65 6c 65 63 74 49 64 2c 20 69 52 65 73 74  iSelectId, iRest
285a0 6f 72 65 53 65 6c 65 63 74 49 64 29 3b 0a 0a 20  oreSelectId);.. 
285b0 20 2f 2a 20 49 64 65 6e 74 69 66 79 20 63 6f 6c   /* Identify col
285c0 75 6d 6e 20 6e 61 6d 65 73 20 69 66 20 72 65 73  umn names if res
285d0 75 6c 74 73 20 6f 66 20 74 68 65 20 53 45 4c 45  ults of the SELE
285e0 43 54 20 61 72 65 20 74 6f 20 62 65 20 6f 75 74  CT are to be out
285f0 70 75 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  put..  */.  if( 
28600 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
28610 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53   pDest->eDest==S
28620 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20  RT_Output ){.   
28630 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e   generateColumnN
28640 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 54 61  ames(pParse, pTa
28650 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 29 3b 0a  bList, pEList);.
28660 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 44 62    }..  sqlite3Db
28670 46 72 65 65 28 64 62 2c 20 73 41 67 67 49 6e 66  Free(db, sAggInf
28680 6f 2e 61 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74  o.aCol);.  sqlit
28690 65 33 44 62 46 72 65 65 28 64 62 2c 20 73 41 67  e3DbFree(db, sAg
286a0 67 49 6e 66 6f 2e 61 46 75 6e 63 29 3b 0a 20 20  gInfo.aFunc);.  
286b0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
286c0 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
286d0 5f 45 4e 41 42 4c 45 5f 54 52 45 45 5f 45 58 50  _ENABLE_TREE_EXP
286e0 4c 41 49 4e 29 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  LAIN)./*.** Gene
286f0 72 61 74 65 20 61 20 68 75 6d 61 6e 2d 72 65 61  rate a human-rea
28700 64 61 62 6c 65 20 64 65 73 63 72 69 70 74 69 6f  dable descriptio
28710 6e 20 6f 66 20 61 20 74 68 65 20 53 65 6c 65 63  n of a the Selec
28720 74 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61  t object..*/.sta
28730 74 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69 6e  tic void explain
28740 4f 6e 65 53 65 6c 65 63 74 28 56 64 62 65 20 2a  OneSelect(Vdbe *
28750 70 56 64 62 65 2c 20 53 65 6c 65 63 74 20 2a 70  pVdbe, Select *p
28760 29 7b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 6c  ){.  sqlite3Expl
28770 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c  ainPrintf(pVdbe,
28780 20 22 53 45 4c 45 43 54 20 22 29 3b 0a 20 20 69   "SELECT ");.  i
28790 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  f( p->selFlags &
287a0 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46   (SF_Distinct|SF
287b0 5f 41 67 67 72 65 67 61 74 65 29 20 29 7b 0a 20  _Aggregate) ){. 
287c0 20 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61     if( p->selFla
287d0 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74  gs & SF_Distinct
287e0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
287f0 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70  3ExplainPrintf(p
28800 56 64 62 65 2c 20 22 44 49 53 54 49 4e 43 54 20  Vdbe, "DISTINCT 
28810 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ");.    }.    if
28820 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ( p->selFlags & 
28830 53 46 5f 41 67 67 72 65 67 61 74 65 20 29 7b 0a  SF_Aggregate ){.
28840 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
28850 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65  lainPrintf(pVdbe
28860 2c 20 22 61 67 67 5f 66 6c 61 67 20 22 29 3b 0a  , "agg_flag ");.
28870 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
28880 33 45 78 70 6c 61 69 6e 4e 4c 28 70 56 64 62 65  3ExplainNL(pVdbe
28890 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
288a0 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62  plainPrintf(pVdb
288b0 65 2c 20 22 20 20 20 22 29 3b 0a 20 20 7d 0a 20  e, "   ");.  }. 
288c0 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45   sqlite3ExplainE
288d0 78 70 72 4c 69 73 74 28 70 56 64 62 65 2c 20 70  xprList(pVdbe, p
288e0 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 73 71 6c  ->pEList);.  sql
288f0 69 74 65 33 45 78 70 6c 61 69 6e 4e 4c 28 70 56  ite3ExplainNL(pV
28900 64 62 65 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70  dbe);.  if( p->p
28910 53 72 63 20 26 26 20 70 2d 3e 70 53 72 63 2d 3e  Src && p->pSrc->
28920 6e 53 72 63 20 29 7b 0a 20 20 20 20 69 6e 74 20  nSrc ){.    int 
28930 69 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  i;.    sqlite3Ex
28940 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62  plainPrintf(pVdb
28950 65 2c 20 22 46 52 4f 4d 20 22 29 3b 0a 20 20 20  e, "FROM ");.   
28960 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
28970 75 73 68 28 70 56 64 62 65 29 3b 0a 20 20 20 20  ush(pVdbe);.    
28980 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 70 53  for(i=0; i<p->pS
28990 72 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a  rc->nSrc; i++){.
289a0 20 20 20 20 20 20 73 74 72 75 63 74 20 53 72 63        struct Src
289b0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
289c0 20 3d 20 26 70 2d 3e 70 53 72 63 2d 3e 61 5b 69   = &p->pSrc->a[i
289d0 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ];.      sqlite3
289e0 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56  ExplainPrintf(pV
289f0 64 62 65 2c 20 22 7b 25 64 2c 2a 7d 20 3d 20 22  dbe, "{%d,*} = "
28a00 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  , pItem->iCursor
28a10 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74  );.      if( pIt
28a20 65 6d 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  em->pSelect ){. 
28a30 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
28a40 70 6c 61 69 6e 53 65 6c 65 63 74 28 70 56 64 62  plainSelect(pVdb
28a50 65 2c 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63  e, pItem->pSelec
28a60 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  t);.        if( 
28a70 70 49 74 65 6d 2d 3e 70 54 61 62 20 29 7b 0a 20  pItem->pTab ){. 
28a80 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
28a90 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56  ExplainPrintf(pV
28aa0 64 62 65 2c 20 22 20 28 74 61 62 6e 61 6d 65 3d  dbe, " (tabname=
28ab0 25 73 29 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61  %s)", pItem->pTa
28ac0 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  b->zName);.     
28ad0 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
28ae0 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d   if( pItem->zNam
28af0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  e ){.        sql
28b00 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74  ite3ExplainPrint
28b10 66 28 70 56 64 62 65 2c 20 22 25 73 22 2c 20 70  f(pVdbe, "%s", p
28b20 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Item->zName);.  
28b30 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
28b40 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 29 7b  pItem->zAlias ){
28b50 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
28b60 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56  ExplainPrintf(pV
28b70 64 62 65 2c 20 22 20 28 41 53 20 25 73 29 22 2c  dbe, " (AS %s)",
28b80 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b   pItem->zAlias);
28b90 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
28ba0 66 28 20 70 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79  f( pItem->jointy
28bb0 70 65 20 26 20 4a 54 5f 4c 45 46 54 20 29 7b 0a  pe & JT_LEFT ){.
28bc0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
28bd0 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64  xplainPrintf(pVd
28be0 62 65 2c 20 22 20 4c 45 46 54 2d 4a 4f 49 4e 22  be, " LEFT-JOIN"
28bf0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
28c00 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 4e   sqlite3ExplainN
28c10 4c 28 70 56 64 62 65 29 3b 0a 20 20 20 20 7d 0a  L(pVdbe);.    }.
28c20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
28c30 69 6e 50 6f 70 28 70 56 64 62 65 29 3b 0a 20 20  inPop(pVdbe);.  
28c40 7d 0a 20 20 69 66 28 20 70 2d 3e 70 57 68 65 72  }.  if( p->pWher
28c50 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
28c60 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56  ExplainPrintf(pV
28c70 64 62 65 2c 20 22 57 48 45 52 45 20 22 29 3b 0a  dbe, "WHERE ");.
28c80 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
28c90 69 6e 45 78 70 72 28 70 56 64 62 65 2c 20 70 2d  inExpr(pVdbe, p-
28ca0 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20 73 71  >pWhere);.    sq
28cb0 6c 69 74 65 33 45 78 70 6c 61 69 6e 4e 4c 28 70  lite3ExplainNL(p
28cc0 56 64 62 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28  Vdbe);.  }.  if(
28cd0 20 70 2d 3e 70 47 72 6f 75 70 42 79 20 29 7b 0a   p->pGroupBy ){.
28ce0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
28cf0 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20  inPrintf(pVdbe, 
28d00 22 47 52 4f 55 50 42 59 20 22 29 3b 0a 20 20 20  "GROUPBY ");.   
28d10 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45   sqlite3ExplainE
28d20 78 70 72 4c 69 73 74 28 70 56 64 62 65 2c 20 70  xprList(pVdbe, p
28d30 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20  ->pGroupBy);.   
28d40 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 4e   sqlite3ExplainN
28d50 4c 28 70 56 64 62 65 29 3b 0a 20 20 7d 0a 20 20  L(pVdbe);.  }.  
28d60 69 66 28 20 70 2d 3e 70 48 61 76 69 6e 67 20 29  if( p->pHaving )
28d70 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
28d80 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65  lainPrintf(pVdbe
28d90 2c 20 22 48 41 56 49 4e 47 20 22 29 3b 0a 20 20  , "HAVING ");.  
28da0 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
28db0 45 78 70 72 28 70 56 64 62 65 2c 20 70 2d 3e 70  Expr(pVdbe, p->p
28dc0 48 61 76 69 6e 67 29 3b 0a 20 20 20 20 73 71 6c  Having);.    sql
28dd0 69 74 65 33 45 78 70 6c 61 69 6e 4e 4c 28 70 56  ite3ExplainNL(pV
28de0 64 62 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  dbe);.  }.  if( 
28df0 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  p->pOrderBy ){. 
28e00 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
28e10 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22  nPrintf(pVdbe, "
28e20 4f 52 44 45 52 42 59 20 22 29 3b 0a 20 20 20 20  ORDERBY ");.    
28e30 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78  sqlite3ExplainEx
28e40 70 72 4c 69 73 74 28 70 56 64 62 65 2c 20 70 2d  prList(pVdbe, p-
28e50 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20  >pOrderBy);.    
28e60 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 4e 4c  sqlite3ExplainNL
28e70 28 70 56 64 62 65 29 3b 0a 20 20 7d 0a 20 20 69  (pVdbe);.  }.  i
28e80 66 28 20 70 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a  f( p->pLimit ){.
28e90 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
28ea0 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20  inPrintf(pVdbe, 
28eb0 22 4c 49 4d 49 54 20 22 29 3b 0a 20 20 20 20 73  "LIMIT ");.    s
28ec0 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70  qlite3ExplainExp
28ed0 72 28 70 56 64 62 65 2c 20 70 2d 3e 70 4c 69 6d  r(pVdbe, p->pLim
28ee0 69 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  it);.    sqlite3
28ef0 45 78 70 6c 61 69 6e 4e 4c 28 70 56 64 62 65 29  ExplainNL(pVdbe)
28f00 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70  ;.  }.  if( p->p
28f10 4f 66 66 73 65 74 20 29 7b 0a 20 20 20 20 73 71  Offset ){.    sq
28f20 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e  lite3ExplainPrin
28f30 74 66 28 70 56 64 62 65 2c 20 22 4f 46 46 53 45  tf(pVdbe, "OFFSE
28f40 54 20 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  T ");.    sqlite
28f50 33 45 78 70 6c 61 69 6e 45 78 70 72 28 70 56 64  3ExplainExpr(pVd
28f60 62 65 2c 20 70 2d 3e 70 4f 66 66 73 65 74 29 3b  be, p->pOffset);
28f70 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c  .    sqlite3Expl
28f80 61 69 6e 4e 4c 28 70 56 64 62 65 29 3b 0a 20 20  ainNL(pVdbe);.  
28f90 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  }.}.void sqlite3
28fa0 45 78 70 6c 61 69 6e 53 65 6c 65 63 74 28 56 64  ExplainSelect(Vd
28fb0 62 65 20 2a 70 56 64 62 65 2c 20 53 65 6c 65 63  be *pVdbe, Selec
28fc0 74 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 3d 3d  t *p){.  if( p==
28fd0 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
28fe0 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56  ExplainPrintf(pV
28ff0 64 62 65 2c 20 22 28 6e 75 6c 6c 2d 73 65 6c 65  dbe, "(null-sele
29000 63 74 29 22 29 3b 0a 20 20 20 20 72 65 74 75 72  ct)");.    retur
29010 6e 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20  n;.  }.  while( 
29020 70 2d 3e 70 50 72 69 6f 72 20 29 20 70 20 3d 20  p->pPrior ) p = 
29030 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 73 71 6c  p->pPrior;.  sql
29040 69 74 65 33 45 78 70 6c 61 69 6e 50 75 73 68 28  ite3ExplainPush(
29050 70 56 64 62 65 29 3b 0a 20 20 77 68 69 6c 65 28  pVdbe);.  while(
29060 20 70 20 29 7b 0a 20 20 20 20 65 78 70 6c 61 69   p ){.    explai
29070 6e 4f 6e 65 53 65 6c 65 63 74 28 70 56 64 62 65  nOneSelect(pVdbe
29080 2c 20 70 29 3b 0a 20 20 20 20 70 20 3d 20 70 2d  , p);.    p = p-
29090 3e 70 4e 65 78 74 3b 0a 20 20 20 20 69 66 28 20  >pNext;.    if( 
290a0 70 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  p==0 ) break;.  
290b0 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
290c0 4e 4c 28 70 56 64 62 65 29 3b 0a 20 20 20 20 73  NL(pVdbe);.    s
290d0 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69  qlite3ExplainPri
290e0 6e 74 66 28 70 56 64 62 65 2c 20 22 25 73 5c 6e  ntf(pVdbe, "%s\n
290f0 22 2c 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28  ", selectOpName(
29100 70 2d 3e 6f 70 29 29 3b 0a 20 20 7d 0a 20 20 73  p->op));.  }.  s
29110 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69  qlite3ExplainPri
29120 6e 74 66 28 70 56 64 62 65 2c 20 22 45 4e 44 22  ntf(pVdbe, "END"
29130 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 6c  );.  sqlite3Expl
29140 61 69 6e 50 6f 70 28 70 56 64 62 65 29 3b 0a 7d  ainPop(pVdbe);.}
29150 0a 0a 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20  ../* End of the 
29160 73 74 72 75 63 74 75 72 65 20 64 65 62 75 67 20  structure debug 
29170 70 72 69 6e 74 69 6e 67 20 63 6f 64 65 0a 2a 2a  printing code.**
29180 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29190 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
291a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
291b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
291c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 23 65 6e  ***********/.#en
291d0 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 53  dif /* defined(S
291e0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 54 52 45  QLITE_ENABLE_TRE
291f0 45 5f 45 58 50 4c 41 49 4e 29 20 2a 2f 0a        E_EXPLAIN) */.