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

Artifact ebbbe13c0935bbe1064372370958cc4e44766018:


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 43 6f 6c 6c 61 74 65 20  gs & EP_Collate 
14180 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f  ){.          pCo
14190 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
141a0 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
141b0 70 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 20 20  pTerm);.        
141c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
141d0 20 70 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69 53 65   pColl = multiSe
141e0 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72  lectCollSeq(pPar
141f0 73 65 2c 20 70 2c 20 61 50 65 72 6d 75 74 65 5b  se, p, aPermute[
14200 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  i]);.        }. 
14210 20 20 20 20 20 20 20 70 4b 65 79 4d 65 72 67 65         pKeyMerge
14220 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 70 43 6f  ->aColl[i] = pCo
14230 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70 4b 65 79  ll;.        pKey
14240 4d 65 72 67 65 2d 3e 61 53 6f 72 74 4f 72 64 65  Merge->aSortOrde
14250 72 5b 69 5d 20 3d 20 70 4f 72 64 65 72 42 79 2d  r[i] = pOrderBy-
14260 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b  >a[i].sortOrder;
14270 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
14280 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4b 65 79   }else{.    pKey
14290 4d 65 72 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a  Merge = 0;.  }..
142a0 20 20 2f 2a 20 52 65 61 74 74 61 63 68 20 74 68    /* Reattach th
142b0 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
142c0 65 20 74 6f 20 74 68 65 20 71 75 65 72 79 2e 0a  e to the query..
142d0 20 20 2a 2f 0a 20 20 70 2d 3e 70 4f 72 64 65 72    */.  p->pOrder
142e0 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20  By = pOrderBy;. 
142f0 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42   pPrior->pOrderB
14300 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  y = sqlite3ExprL
14310 69 73 74 44 75 70 28 70 50 61 72 73 65 2d 3e 64  istDup(pParse->d
14320 62 2c 20 70 4f 72 64 65 72 42 79 2c 20 30 29 3b  b, pOrderBy, 0);
14330 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
14340 61 20 72 61 6e 67 65 20 6f 66 20 74 65 6d 70 6f  a range of tempo
14350 72 61 72 79 20 72 65 67 69 73 74 65 72 73 20 61  rary registers a
14360 6e 64 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 6e  nd the KeyInfo n
14370 65 65 64 65 64 0a 20 20 2a 2a 20 66 6f 72 20 74  eeded.  ** for t
14380 68 65 20 6c 6f 67 69 63 20 74 68 61 74 20 72 65  he logic that re
14390 6d 6f 76 65 73 20 64 75 70 6c 69 63 61 74 65 20  moves duplicate 
143a0 72 65 73 75 6c 74 20 72 6f 77 73 20 77 68 65 6e  result rows when
143b0 20 74 68 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74   the.  ** operat
143c0 6f 72 20 69 73 20 55 4e 49 4f 4e 2c 20 45 58 43  or is UNION, EXC
143d0 45 50 54 2c 20 6f 72 20 49 4e 54 45 52 53 45 43  EPT, or INTERSEC
143e0 54 20 28 62 75 74 20 6e 6f 74 20 55 4e 49 4f 4e  T (but not UNION
143f0 20 41 4c 4c 29 2e 0a 20 20 2a 2f 0a 20 20 69 66   ALL)..  */.  if
14400 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a  ( op==TK_ALL ){.
14410 20 20 20 20 72 65 67 50 72 65 76 20 3d 20 30 3b      regPrev = 0;
14420 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
14430 74 20 6e 45 78 70 72 20 3d 20 70 2d 3e 70 45 4c  t nExpr = p->pEL
14440 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  ist->nExpr;.    
14450 61 73 73 65 72 74 28 20 6e 4f 72 64 65 72 42 79  assert( nOrderBy
14460 3e 3d 6e 45 78 70 72 20 7c 7c 20 64 62 2d 3e 6d  >=nExpr || db->m
14470 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
14480 20 20 20 72 65 67 50 72 65 76 20 3d 20 73 71 6c     regPrev = sql
14490 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65  ite3GetTempRange
144a0 28 70 50 61 72 73 65 2c 20 6e 45 78 70 72 2b 31  (pParse, nExpr+1
144b0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
144c0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
144d0 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67 50 72  nteger, 0, regPr
144e0 65 76 29 3b 0a 20 20 20 20 70 4b 65 79 44 75 70  ev);.    pKeyDup
144f0 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
14500 6f 63 5a 65 72 6f 28 64 62 2c 0a 20 20 20 20 20  ocZero(db,.     
14510 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a               siz
14520 65 6f 66 28 2a 70 4b 65 79 44 75 70 29 20 2b 20  eof(*pKeyDup) + 
14530 6e 45 78 70 72 2a 28 73 69 7a 65 6f 66 28 43 6f  nExpr*(sizeof(Co
14540 6c 6c 53 65 71 2a 29 2b 31 29 20 29 3b 0a 20 20  llSeq*)+1) );.  
14550 20 20 69 66 28 20 70 4b 65 79 44 75 70 20 29 7b    if( pKeyDup ){
14560 0a 20 20 20 20 20 20 70 4b 65 79 44 75 70 2d 3e  .      pKeyDup->
14570 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38  aSortOrder = (u8
14580 2a 29 26 70 4b 65 79 44 75 70 2d 3e 61 43 6f 6c  *)&pKeyDup->aCol
14590 6c 5b 6e 45 78 70 72 5d 3b 0a 20 20 20 20 20 20  l[nExpr];.      
145a0 70 4b 65 79 44 75 70 2d 3e 6e 46 69 65 6c 64 20  pKeyDup->nField 
145b0 3d 20 28 75 31 36 29 6e 45 78 70 72 3b 0a 20 20  = (u16)nExpr;.  
145c0 20 20 20 20 70 4b 65 79 44 75 70 2d 3e 65 6e 63      pKeyDup->enc
145d0 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20 20 20   = ENC(db);.    
145e0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78    for(i=0; i<nEx
145f0 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
14600 20 20 70 4b 65 79 44 75 70 2d 3e 61 43 6f 6c 6c    pKeyDup->aColl
14610 5b 69 5d 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63  [i] = multiSelec
14620 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  tCollSeq(pParse,
14630 20 70 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20   p, i);.        
14640 70 4b 65 79 44 75 70 2d 3e 61 53 6f 72 74 4f 72  pKeyDup->aSortOr
14650 64 65 72 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20  der[i] = 0;.    
14660 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 0a    }.    }.  }. .
14670 20 20 2f 2a 20 53 65 70 61 72 61 74 65 20 74 68    /* Separate th
14680 65 20 6c 65 66 74 20 61 6e 64 20 74 68 65 20 72  e left and the r
14690 69 67 68 74 20 71 75 65 72 79 20 66 72 6f 6d 20  ight query from 
146a0 6f 6e 65 20 61 6e 6f 74 68 65 72 0a 20 20 2a 2f  one another.  */
146b0 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30  .  p->pPrior = 0
146c0 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c  ;.  sqlite3Resol
146d0 76 65 4f 72 64 65 72 47 72 6f 75 70 42 79 28 70  veOrderGroupBy(p
146e0 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 4f 72  Parse, p, p->pOr
146f0 64 65 72 42 79 2c 20 22 4f 52 44 45 52 22 29 3b  derBy, "ORDER");
14700 0a 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70  .  if( pPrior->p
14710 50 72 69 6f 72 3d 3d 30 20 29 7b 0a 20 20 20 20  Prior==0 ){.    
14720 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 4f 72  sqlite3ResolveOr
14730 64 65 72 47 72 6f 75 70 42 79 28 70 50 61 72 73  derGroupBy(pPars
14740 65 2c 20 70 50 72 69 6f 72 2c 20 70 50 72 69 6f  e, pPrior, pPrio
14750 72 2d 3e 70 4f 72 64 65 72 42 79 2c 20 22 4f 52  r->pOrderBy, "OR
14760 44 45 52 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  DER");.  }..  /*
14770 20 43 6f 6d 70 75 74 65 20 74 68 65 20 6c 69 6d   Compute the lim
14780 69 74 20 72 65 67 69 73 74 65 72 73 20 2a 2f 0a  it registers */.
14790 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65    computeLimitRe
147a0 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c 20  gisters(pParse, 
147b0 70 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20  p, labelEnd);.  
147c0 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 26 26  if( p->iLimit &&
147d0 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20   op==TK_ALL ){. 
147e0 20 20 20 72 65 67 4c 69 6d 69 74 41 20 3d 20 2b     regLimitA = +
147f0 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
14800 20 20 20 72 65 67 4c 69 6d 69 74 42 20 3d 20 2b     regLimitB = +
14810 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
14820 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
14830 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c  dOp2(v, OP_Copy,
14840 20 70 2d 3e 69 4f 66 66 73 65 74 20 3f 20 70 2d   p->iOffset ? p-
14850 3e 69 4f 66 66 73 65 74 2b 31 20 3a 20 70 2d 3e  >iOffset+1 : p->
14860 69 4c 69 6d 69 74 2c 0a 20 20 20 20 20 20 20 20  iLimit,.        
14870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14880 20 20 20 20 20 20 20 20 20 20 72 65 67 4c 69 6d            regLim
14890 69 74 41 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  itA);.    sqlite
148a0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
148b0 50 5f 43 6f 70 79 2c 20 72 65 67 4c 69 6d 69 74  P_Copy, regLimit
148c0 41 2c 20 72 65 67 4c 69 6d 69 74 42 29 3b 0a 20  A, regLimitB);. 
148d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 67 4c   }else{.    regL
148e0 69 6d 69 74 41 20 3d 20 72 65 67 4c 69 6d 69 74  imitA = regLimit
148f0 42 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c  B = 0;.  }.  sql
14900 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
14910 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20  b, p->pLimit);. 
14920 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a   p->pLimit = 0;.
14930 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
14940 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 66 66 73  ete(db, p->pOffs
14950 65 74 29 3b 0a 20 20 70 2d 3e 70 4f 66 66 73 65  et);.  p->pOffse
14960 74 20 3d 20 30 3b 0a 0a 20 20 72 65 67 41 64 64  t = 0;..  regAdd
14970 72 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  rA = ++pParse->n
14980 4d 65 6d 3b 0a 20 20 72 65 67 45 6f 66 41 20 3d  Mem;.  regEofA =
14990 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
149a0 0a 20 20 72 65 67 41 64 64 72 42 20 3d 20 2b 2b  .  regAddrB = ++
149b0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
149c0 72 65 67 45 6f 66 42 20 3d 20 2b 2b 70 50 61 72  regEofB = ++pPar
149d0 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 4f  se->nMem;.  regO
149e0 75 74 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  utA = ++pParse->
149f0 6e 4d 65 6d 3b 0a 20 20 72 65 67 4f 75 74 42 20  nMem;.  regOutB 
14a00 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
14a10 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ;.  sqlite3Selec
14a20 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 41  tDestInit(&destA
14a30 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c  , SRT_Coroutine,
14a40 20 72 65 67 41 64 64 72 41 29 3b 0a 20 20 73 71   regAddrA);.  sq
14a50 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49  lite3SelectDestI
14a60 6e 69 74 28 26 64 65 73 74 42 2c 20 53 52 54 5f  nit(&destB, SRT_
14a70 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64  Coroutine, regAd
14a80 64 72 42 29 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70  drB);..  /* Jump
14a90 20 70 61 73 74 20 74 68 65 20 76 61 72 69 6f 75   past the variou
14aa0 73 20 73 75 62 72 6f 75 74 69 6e 65 73 20 61 6e  s subroutines an
14ab0 64 20 63 6f 72 6f 75 74 69 6e 65 73 20 74 6f 20  d coroutines to 
14ac0 74 68 65 20 6d 61 69 6e 0a 20 20 2a 2a 20 6d 65  the main.  ** me
14ad0 72 67 65 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20 20  rge loop.  */.  
14ae0 6a 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  j1 = sqlite3Vdbe
14af0 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74  AddOp0(v, OP_Got
14b00 6f 29 3b 0a 20 20 61 64 64 72 53 65 6c 65 63 74  o);.  addrSelect
14b10 41 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  A = sqlite3VdbeC
14b20 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 0a  urrentAddr(v);..
14b30 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61  .  /* Generate a
14b40 20 63 6f 72 6f 75 74 69 6e 65 20 74 6f 20 65 76   coroutine to ev
14b50 61 6c 75 61 74 65 20 74 68 65 20 53 45 4c 45 43  aluate the SELEC
14b60 54 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 74  T statement to t
14b70 68 65 0a 20 20 2a 2a 20 6c 65 66 74 20 6f 66 20  he.  ** left of 
14b80 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 6f 70 65  the compound ope
14b90 72 61 74 6f 72 20 2d 20 74 68 65 20 22 41 22 20  rator - the "A" 
14ba0 73 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 56  select..  */.  V
14bb0 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28  dbeNoopComment((
14bc0 76 2c 20 22 42 65 67 69 6e 20 63 6f 72 6f 75 74  v, "Begin corout
14bd0 69 6e 65 20 66 6f 72 20 6c 65 66 74 20 53 45 4c  ine for left SEL
14be0 45 43 54 22 29 29 3b 0a 20 20 70 50 72 69 6f 72  ECT"));.  pPrior
14bf0 2d 3e 69 4c 69 6d 69 74 20 3d 20 72 65 67 4c 69  ->iLimit = regLi
14c00 6d 69 74 41 3b 0a 20 20 65 78 70 6c 61 69 6e 53  mitA;.  explainS
14c10 65 74 49 6e 74 65 67 65 72 28 69 53 75 62 31 2c  etInteger(iSub1,
14c20 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65   pParse->iNextSe
14c30 6c 65 63 74 49 64 29 3b 0a 20 20 73 71 6c 69 74  lectId);.  sqlit
14c40 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
14c50 20 70 50 72 69 6f 72 2c 20 26 64 65 73 74 41 29   pPrior, &destA)
14c60 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
14c70 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
14c80 67 65 72 2c 20 31 2c 20 72 65 67 45 6f 66 41 29  ger, 1, regEofA)
14c90 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
14ca0 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c  ddOp1(v, OP_Yiel
14cb0 64 2c 20 72 65 67 41 64 64 72 41 29 3b 0a 20 20  d, regAddrA);.  
14cc0 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28  VdbeNoopComment(
14cd0 28 76 2c 20 22 45 6e 64 20 63 6f 72 6f 75 74 69  (v, "End corouti
14ce0 6e 65 20 66 6f 72 20 6c 65 66 74 20 53 45 4c 45  ne for left SELE
14cf0 43 54 22 29 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e  CT"));..  /* Gen
14d00 65 72 61 74 65 20 61 20 63 6f 72 6f 75 74 69 6e  erate a coroutin
14d10 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68  e to evaluate th
14d20 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
14d30 6e 74 20 6f 6e 20 0a 20 20 2a 2a 20 74 68 65 20  nt on .  ** the 
14d40 72 69 67 68 74 20 2d 20 74 68 65 20 22 42 22 20  right - the "B" 
14d50 73 65 6c 65 63 74 0a 20 20 2a 2f 0a 20 20 61 64  select.  */.  ad
14d60 64 72 53 65 6c 65 63 74 42 20 3d 20 73 71 6c 69  drSelectB = sqli
14d70 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
14d80 64 72 28 76 29 3b 0a 20 20 56 64 62 65 4e 6f 6f  dr(v);.  VdbeNoo
14d90 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 42 65  pComment((v, "Be
14da0 67 69 6e 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f  gin coroutine fo
14db0 72 20 72 69 67 68 74 20 53 45 4c 45 43 54 22 29  r right SELECT")
14dc0 29 3b 0a 20 20 73 61 76 65 64 4c 69 6d 69 74 20  );.  savedLimit 
14dd0 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 73  = p->iLimit;.  s
14de0 61 76 65 64 4f 66 66 73 65 74 20 3d 20 70 2d 3e  avedOffset = p->
14df0 69 4f 66 66 73 65 74 3b 0a 20 20 70 2d 3e 69 4c  iOffset;.  p->iL
14e00 69 6d 69 74 20 3d 20 72 65 67 4c 69 6d 69 74 42  imit = regLimitB
14e10 3b 0a 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d  ;.  p->iOffset =
14e20 20 30 3b 20 20 0a 20 20 65 78 70 6c 61 69 6e 53   0;  .  explainS
14e30 65 74 49 6e 74 65 67 65 72 28 69 53 75 62 32 2c  etInteger(iSub2,
14e40 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65   pParse->iNextSe
14e50 6c 65 63 74 49 64 29 3b 0a 20 20 73 71 6c 69 74  lectId);.  sqlit
14e60 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
14e70 20 70 2c 20 26 64 65 73 74 42 29 3b 0a 20 20 70   p, &destB);.  p
14e80 2d 3e 69 4c 69 6d 69 74 20 3d 20 73 61 76 65 64  ->iLimit = saved
14e90 4c 69 6d 69 74 3b 0a 20 20 70 2d 3e 69 4f 66 66  Limit;.  p->iOff
14ea0 73 65 74 20 3d 20 73 61 76 65 64 4f 66 66 73 65  set = savedOffse
14eb0 74 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  t;.  sqlite3Vdbe
14ec0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
14ed0 65 67 65 72 2c 20 31 2c 20 72 65 67 45 6f 66 42  eger, 1, regEofB
14ee0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
14ef0 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65  AddOp1(v, OP_Yie
14f00 6c 64 2c 20 72 65 67 41 64 64 72 42 29 3b 0a 20  ld, regAddrB);. 
14f10 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74   VdbeNoopComment
14f20 28 28 76 2c 20 22 45 6e 64 20 63 6f 72 6f 75 74  ((v, "End corout
14f30 69 6e 65 20 66 6f 72 20 72 69 67 68 74 20 53 45  ine for right SE
14f40 4c 45 43 54 22 29 29 3b 0a 0a 20 20 2f 2a 20 47  LECT"));..  /* G
14f50 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75  enerate a subrou
14f60 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74  tine that output
14f70 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f  s the current ro
14f80 77 20 6f 66 20 74 68 65 20 41 0a 20 20 2a 2a 20  w of the A.  ** 
14f90 73 65 6c 65 63 74 20 61 73 20 74 68 65 20 6e 65  select as the ne
14fa0 78 74 20 6f 75 74 70 75 74 20 72 6f 77 20 6f 66  xt output row of
14fb0 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65   the compound se
14fc0 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 56 64 62  lect..  */.  Vdb
14fd0 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c  eNoopComment((v,
14fe0 20 22 4f 75 74 70 75 74 20 72 6f 75 74 69 6e 65   "Output routine
14ff0 20 66 6f 72 20 41 22 29 29 3b 0a 20 20 61 64 64   for A"));.  add
15000 72 4f 75 74 41 20 3d 20 67 65 6e 65 72 61 74 65  rOutA = generate
15010 4f 75 74 70 75 74 53 75 62 72 6f 75 74 69 6e 65  OutputSubroutine
15020 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20  (pParse,.       
15030 20 20 20 20 20 20 20 20 20 20 70 2c 20 26 64 65            p, &de
15040 73 74 41 2c 20 70 44 65 73 74 2c 20 72 65 67 4f  stA, pDest, regO
15050 75 74 41 2c 0a 20 20 20 20 20 20 20 20 20 20 20  utA,.           
15060 20 20 20 20 20 20 72 65 67 50 72 65 76 2c 20 70        regPrev, p
15070 4b 65 79 44 75 70 2c 20 50 34 5f 4b 45 59 49 4e  KeyDup, P4_KEYIN
15080 46 4f 5f 48 41 4e 44 4f 46 46 2c 20 6c 61 62 65  FO_HANDOFF, labe
15090 6c 45 6e 64 29 3b 0a 20 20 0a 20 20 2f 2a 20 47  lEnd);.  .  /* G
150a0 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75  enerate a subrou
150b0 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74  tine that output
150c0 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f  s the current ro
150d0 77 20 6f 66 20 74 68 65 20 42 0a 20 20 2a 2a 20  w of the B.  ** 
150e0 73 65 6c 65 63 74 20 61 73 20 74 68 65 20 6e 65  select as the ne
150f0 78 74 20 6f 75 74 70 75 74 20 72 6f 77 20 6f 66  xt output row of
15100 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65   the compound se
15110 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  lect..  */.  if(
15120 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 6f   op==TK_ALL || o
15130 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20  p==TK_UNION ){. 
15140 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65     VdbeNoopComme
15150 6e 74 28 28 76 2c 20 22 4f 75 74 70 75 74 20 72  nt((v, "Output r
15160 6f 75 74 69 6e 65 20 66 6f 72 20 42 22 29 29 3b  outine for B"));
15170 0a 20 20 20 20 61 64 64 72 4f 75 74 42 20 3d 20  .    addrOutB = 
15180 67 65 6e 65 72 61 74 65 4f 75 74 70 75 74 53 75  generateOutputSu
15190 62 72 6f 75 74 69 6e 65 28 70 50 61 72 73 65 2c  broutine(pParse,
151a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
151b0 20 20 70 2c 20 26 64 65 73 74 42 2c 20 70 44 65    p, &destB, pDe
151c0 73 74 2c 20 72 65 67 4f 75 74 42 2c 0a 20 20 20  st, regOutB,.   
151d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
151e0 67 50 72 65 76 2c 20 70 4b 65 79 44 75 70 2c 20  gPrev, pKeyDup, 
151f0 50 34 5f 4b 45 59 49 4e 46 4f 5f 53 54 41 54 49  P4_KEYINFO_STATI
15200 43 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20  C, labelEnd);.  
15210 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  }..  /* Generate
15220 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 6f   a subroutine to
15230 20 72 75 6e 20 77 68 65 6e 20 74 68 65 20 72 65   run when the re
15240 73 75 6c 74 73 20 66 72 6f 6d 20 73 65 6c 65 63  sults from selec
15250 74 20 41 0a 20 20 2a 2a 20 61 72 65 20 65 78 68  t A.  ** are exh
15260 61 75 73 74 65 64 20 61 6e 64 20 6f 6e 6c 79 20  austed and only 
15270 64 61 74 61 20 69 6e 20 73 65 6c 65 63 74 20 42  data in select B
15280 20 72 65 6d 61 69 6e 73 2e 0a 20 20 2a 2f 0a 20   remains..  */. 
15290 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74   VdbeNoopComment
152a0 28 28 76 2c 20 22 65 6f 66 2d 41 20 73 75 62 72  ((v, "eof-A subr
152b0 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 69 66 28  outine"));.  if(
152c0 20 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20 7c   op==TK_EXCEPT |
152d0 7c 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45  | op==TK_INTERSE
152e0 43 54 20 29 7b 0a 20 20 20 20 61 64 64 72 45 6f  CT ){.    addrEo
152f0 66 41 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  fA = sqlite3Vdbe
15300 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
15310 6f 2c 20 30 2c 20 6c 61 62 65 6c 45 6e 64 29 3b  o, 0, labelEnd);
15320 0a 20 20 7d 65 6c 73 65 7b 20 20 0a 20 20 20 20  .  }else{  .    
15330 61 64 64 72 45 6f 66 41 20 3d 20 73 71 6c 69 74  addrEofA = sqlit
15340 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
15350 4f 50 5f 49 66 2c 20 72 65 67 45 6f 66 42 2c 20  OP_If, regEofB, 
15360 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 20 20 73  labelEnd);.    s
15370 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
15380 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65  (v, OP_Gosub, re
15390 67 4f 75 74 42 2c 20 61 64 64 72 4f 75 74 42 29  gOutB, addrOutB)
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 31 28 76 2c 20 4f 50 5f 59 69  eAddOp1(v, OP_Yi
153c0 65 6c 64 2c 20 72 65 67 41 64 64 72 42 29 3b 0a  eld, regAddrB);.
153d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
153e0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
153f0 2c 20 30 2c 20 61 64 64 72 45 6f 66 41 29 3b 0a  , 0, addrEofA);.
15400 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f      p->nSelectRo
15410 77 20 2b 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65  w += pPrior->nSe
15420 6c 65 63 74 52 6f 77 3b 0a 20 20 7d 0a 0a 20 20  lectRow;.  }..  
15430 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75  /* Generate a su
15440 62 72 6f 75 74 69 6e 65 20 74 6f 20 72 75 6e 20  broutine to run 
15450 77 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 73  when the results
15460 20 66 72 6f 6d 20 73 65 6c 65 63 74 20 42 0a 20   from select B. 
15470 20 2a 2a 20 61 72 65 20 65 78 68 61 75 73 74 65   ** are exhauste
15480 64 20 61 6e 64 20 6f 6e 6c 79 20 64 61 74 61 20  d and only data 
15490 69 6e 20 73 65 6c 65 63 74 20 41 20 72 65 6d 61  in select A rema
154a0 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ins..  */.  if( 
154b0 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54  op==TK_INTERSECT
154c0 20 29 7b 0a 20 20 20 20 61 64 64 72 45 6f 66 42   ){.    addrEofB
154d0 20 3d 20 61 64 64 72 45 6f 66 41 3b 0a 20 20 20   = addrEofA;.   
154e0 20 69 66 28 20 70 2d 3e 6e 53 65 6c 65 63 74 52   if( p->nSelectR
154f0 6f 77 20 3e 20 70 50 72 69 6f 72 2d 3e 6e 53 65  ow > pPrior->nSe
15500 6c 65 63 74 52 6f 77 20 29 20 70 2d 3e 6e 53 65  lectRow ) p->nSe
15510 6c 65 63 74 52 6f 77 20 3d 20 70 50 72 69 6f 72  lectRow = pPrior
15520 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20  ->nSelectRow;.  
15530 7d 65 6c 73 65 7b 20 20 0a 20 20 20 20 56 64 62  }else{  .    Vdb
15540 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c  eNoopComment((v,
15550 20 22 65 6f 66 2d 42 20 73 75 62 72 6f 75 74 69   "eof-B subrouti
15560 6e 65 22 29 29 3b 0a 20 20 20 20 61 64 64 72 45  ne"));.    addrE
15570 6f 66 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ofB = sqlite3Vdb
15580 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66  eAddOp2(v, OP_If
15590 2c 20 72 65 67 45 6f 66 41 2c 20 6c 61 62 65 6c  , regEofA, label
155a0 45 6e 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  End);.    sqlite
155b0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
155c0 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 41  P_Gosub, regOutA
155d0 2c 20 61 64 64 72 4f 75 74 41 29 3b 0a 20 20 20  , addrOutA);.   
155e0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
155f0 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p1(v, OP_Yield, 
15600 72 65 67 41 64 64 72 41 29 3b 0a 20 20 20 20 73  regAddrA);.    s
15610 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
15620 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
15630 61 64 64 72 45 6f 66 42 29 3b 0a 20 20 7d 0a 0a  addrEofB);.  }..
15640 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
15650 64 65 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65  de to handle the
15660 20 63 61 73 65 20 6f 66 20 41 3c 42 0a 20 20 2a   case of A<B.  *
15670 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d  /.  VdbeNoopComm
15680 65 6e 74 28 28 76 2c 20 22 41 2d 6c 74 2d 42 20  ent((v, "A-lt-B 
15690 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20  subroutine"));. 
156a0 20 61 64 64 72 41 6c 74 42 20 3d 20 73 71 6c 69   addrAltB = sqli
156b0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
156c0 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75   OP_Gosub, regOu
156d0 74 41 2c 20 61 64 64 72 4f 75 74 41 29 3b 0a 20  tA, addrOutA);. 
156e0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
156f0 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p1(v, OP_Yield, 
15700 72 65 67 41 64 64 72 41 29 3b 0a 20 20 73 71 6c  regAddrA);.  sql
15710 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
15720 2c 20 4f 50 5f 49 66 2c 20 72 65 67 45 6f 66 41  , OP_If, regEofA
15730 2c 20 61 64 64 72 45 6f 66 41 29 3b 0a 20 20 73  , addrEofA);.  s
15740 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
15750 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
15760 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 0a 20 20 2f  labelCmpr);..  /
15770 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
15780 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 63 61  to handle the ca
15790 73 65 20 6f 66 20 41 3d 3d 42 0a 20 20 2a 2f 0a  se of A==B.  */.
157a0 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c    if( op==TK_ALL
157b0 20 29 7b 0a 20 20 20 20 61 64 64 72 41 65 71 42   ){.    addrAeqB
157c0 20 3d 20 61 64 64 72 41 6c 74 42 3b 0a 20 20 7d   = addrAltB;.  }
157d0 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  else if( op==TK_
157e0 49 4e 54 45 52 53 45 43 54 20 29 7b 0a 20 20 20  INTERSECT ){.   
157f0 20 61 64 64 72 41 65 71 42 20 3d 20 61 64 64 72   addrAeqB = addr
15800 41 6c 74 42 3b 0a 20 20 20 20 61 64 64 72 41 6c  AltB;.    addrAl
15810 74 42 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  tB++;.  }else{. 
15820 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65     VdbeNoopComme
15830 6e 74 28 28 76 2c 20 22 41 2d 65 71 2d 42 20 73  nt((v, "A-eq-B s
15840 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20  ubroutine"));.  
15850 20 20 61 64 64 72 41 65 71 42 20 3d 0a 20 20 20    addrAeqB =.   
15860 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15870 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p1(v, OP_Yield, 
15880 72 65 67 41 64 64 72 41 29 3b 0a 20 20 20 20 73  regAddrA);.    s
15890 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
158a0 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 45 6f  (v, OP_If, regEo
158b0 66 41 2c 20 61 64 64 72 45 6f 66 41 29 3b 0a 20  fA, addrEofA);. 
158c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
158d0 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
158e0 20 30 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a   0, labelCmpr);.
158f0 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61    }..  /* Genera
15900 74 65 20 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c  te code to handl
15910 65 20 74 68 65 20 63 61 73 65 20 6f 66 20 41 3e  e the case of A>
15920 42 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f  B.  */.  VdbeNoo
15930 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 41 2d  pComment((v, "A-
15940 67 74 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 22  gt-B subroutine"
15950 29 29 3b 0a 20 20 61 64 64 72 41 67 74 42 20 3d  ));.  addrAgtB =
15960 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
15970 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 69 66  entAddr(v);.  if
15980 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20  ( op==TK_ALL || 
15990 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a  op==TK_UNION ){.
159a0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
159b0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75  ddOp2(v, OP_Gosu
159c0 62 2c 20 72 65 67 4f 75 74 42 2c 20 61 64 64 72  b, regOutB, addr
159d0 4f 75 74 42 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  OutB);.  }.  sql
159e0 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
159f0 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41  , OP_Yield, regA
15a00 64 64 72 42 29 3b 0a 20 20 73 71 6c 69 74 65 33  ddrB);.  sqlite3
15a10 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
15a20 5f 49 66 2c 20 72 65 67 45 6f 66 42 2c 20 61 64  _If, regEofB, ad
15a30 64 72 45 6f 66 42 29 3b 0a 20 20 73 71 6c 69 74  drEofB);.  sqlit
15a40 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
15a50 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c 61 62 65  OP_Goto, 0, labe
15a60 6c 43 6d 70 72 29 3b 0a 0a 20 20 2f 2a 20 54 68  lCmpr);..  /* Th
15a70 69 73 20 63 6f 64 65 20 72 75 6e 73 20 6f 6e 63  is code runs onc
15a80 65 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20  e to initialize 
15a90 65 76 65 72 79 74 68 69 6e 67 2e 0a 20 20 2a 2f  everything..  */
15aa0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75  .  sqlite3VdbeJu
15ab0 6d 70 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a 20  mpHere(v, j1);. 
15ac0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15ad0 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
15ae0 2c 20 30 2c 20 72 65 67 45 6f 66 41 29 3b 0a 20  , 0, regEofA);. 
15af0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15b00 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
15b10 2c 20 30 2c 20 72 65 67 45 6f 66 42 29 3b 0a 20  , 0, regEofB);. 
15b20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15b30 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
15b40 72 65 67 41 64 64 72 41 2c 20 61 64 64 72 53 65  regAddrA, addrSe
15b50 6c 65 63 74 41 29 3b 0a 20 20 73 71 6c 69 74 65  lectA);.  sqlite
15b60 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
15b70 50 5f 47 6f 73 75 62 2c 20 72 65 67 41 64 64 72  P_Gosub, regAddr
15b80 42 2c 20 61 64 64 72 53 65 6c 65 63 74 42 29 3b  B, addrSelectB);
15b90 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
15ba0 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20 72  dOp2(v, OP_If, r
15bb0 65 67 45 6f 66 41 2c 20 61 64 64 72 45 6f 66 41  egEofA, addrEofA
15bc0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
15bd0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c  AddOp2(v, OP_If,
15be0 20 72 65 67 45 6f 66 42 2c 20 61 64 64 72 45 6f   regEofB, addrEo
15bf0 66 42 29 3b 0a 0a 20 20 2f 2a 20 49 6d 70 6c 65  fB);..  /* Imple
15c00 6d 65 6e 74 20 74 68 65 20 6d 61 69 6e 20 6d 65  ment the main me
15c10 72 67 65 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20 20  rge loop.  */.  
15c20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
15c30 76 65 4c 61 62 65 6c 28 76 2c 20 6c 61 62 65 6c  veLabel(v, label
15c40 43 6d 70 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  Cmpr);.  sqlite3
15c50 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
15c60 5f 50 65 72 6d 75 74 61 74 69 6f 6e 2c 20 30 2c  _Permutation, 0,
15c70 20 30 2c 20 30 2c 20 28 63 68 61 72 2a 29 61 50   0, 0, (char*)aP
15c80 65 72 6d 75 74 65 2c 20 50 34 5f 49 4e 54 41 52  ermute, P4_INTAR
15c90 52 41 59 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  RAY);.  sqlite3V
15ca0 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
15cb0 43 6f 6d 70 61 72 65 2c 20 64 65 73 74 41 2e 69  Compare, destA.i
15cc0 53 64 73 74 2c 20 64 65 73 74 42 2e 69 53 64 73  Sdst, destB.iSds
15cd0 74 2c 20 6e 4f 72 64 65 72 42 79 2c 0a 20 20 20  t, nOrderBy,.   
15ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15cf0 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65        (char*)pKe
15d00 79 4d 65 72 67 65 2c 20 50 34 5f 4b 45 59 49 4e  yMerge, P4_KEYIN
15d10 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 73  FO_HANDOFF);.  s
15d20 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
15d30 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 50 45 52  P5(v, OPFLAG_PER
15d40 4d 55 54 45 29 3b 0a 20 20 73 71 6c 69 74 65 33  MUTE);.  sqlite3
15d50 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
15d60 5f 4a 75 6d 70 2c 20 61 64 64 72 41 6c 74 42 2c  _Jump, addrAltB,
15d70 20 61 64 64 72 41 65 71 42 2c 20 61 64 64 72 41   addrAeqB, addrA
15d80 67 74 42 29 3b 0a 0a 20 20 2f 2a 20 52 65 6c 65  gtB);..  /* Rele
15d90 61 73 65 20 74 65 6d 70 6f 72 61 72 79 20 72 65  ase temporary re
15da0 67 69 73 74 65 72 73 0a 20 20 2a 2f 0a 20 20 69  gisters.  */.  i
15db0 66 28 20 72 65 67 50 72 65 76 20 29 7b 0a 20 20  f( regPrev ){.  
15dc0 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
15dd0 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
15de0 2c 20 72 65 67 50 72 65 76 2c 20 6e 4f 72 64 65  , regPrev, nOrde
15df0 72 42 79 2b 31 29 3b 0a 20 20 7d 0a 0a 20 20 2f  rBy+1);.  }..  /
15e00 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20 74 68  * Jump to the th
15e10 69 73 20 70 6f 69 6e 74 20 69 6e 20 6f 72 64 65  is point in orde
15e20 72 20 74 6f 20 74 65 72 6d 69 6e 61 74 65 20 74  r to terminate t
15e30 68 65 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20  he query..  */. 
15e40 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
15e50 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 61 62 65  lveLabel(v, labe
15e60 6c 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20 53 65 74  lEnd);..  /* Set
15e70 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f   the number of o
15e80 75 74 70 75 74 20 63 6f 6c 75 6d 6e 73 0a 20 20  utput columns.  
15e90 2a 2f 0a 20 20 69 66 28 20 70 44 65 73 74 2d 3e  */.  if( pDest->
15ea0 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75  eDest==SRT_Outpu
15eb0 74 20 29 7b 0a 20 20 20 20 53 65 6c 65 63 74 20  t ){.    Select 
15ec0 2a 70 46 69 72 73 74 20 3d 20 70 50 72 69 6f 72  *pFirst = pPrior
15ed0 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 46 69  ;.    while( pFi
15ee0 72 73 74 2d 3e 70 50 72 69 6f 72 20 29 20 70 46  rst->pPrior ) pF
15ef0 69 72 73 74 20 3d 20 70 46 69 72 73 74 2d 3e 70  irst = pFirst->p
15f00 50 72 69 6f 72 3b 0a 20 20 20 20 67 65 6e 65 72  Prior;.    gener
15f10 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70  ateColumnNames(p
15f20 50 61 72 73 65 2c 20 30 2c 20 70 46 69 72 73 74  Parse, 0, pFirst
15f30 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a  ->pEList);.  }..
15f40 20 20 2f 2a 20 52 65 61 73 73 65 6d 62 6c 79 20    /* Reassembly 
15f50 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65  the compound que
15f60 72 79 20 73 6f 20 74 68 61 74 20 69 74 20 77 69  ry so that it wi
15f70 6c 6c 20 62 65 20 66 72 65 65 64 20 63 6f 72 72  ll be freed corr
15f80 65 63 74 6c 79 0a 20 20 2a 2a 20 62 79 20 74 68  ectly.  ** by th
15f90 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
15fa0 6f 6e 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  on */.  if( p->p
15fb0 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c  Prior ){.    sql
15fc0 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
15fd0 28 64 62 2c 20 70 2d 3e 70 50 72 69 6f 72 29 3b  (db, p->pPrior);
15fe0 0a 20 20 7d 0a 20 20 70 2d 3e 70 50 72 69 6f 72  .  }.  p->pPrior
15ff0 20 3d 20 70 50 72 69 6f 72 3b 0a 0a 20 20 2f 2a   = pPrior;..  /*
16000 2a 2a 20 54 42 44 3a 20 20 49 6e 73 65 72 74 20  ** TBD:  Insert 
16010 73 75 62 72 6f 75 74 69 6e 65 20 63 61 6c 6c 73  subroutine calls
16020 20 74 6f 20 63 6c 6f 73 65 20 63 75 72 73 6f 72   to close cursor
16030 73 20 6f 6e 20 69 6e 63 6f 6d 70 6c 65 74 65 0a  s on incomplete.
16040 20 20 2a 2a 2a 2a 20 73 75 62 71 75 65 72 69 65    **** subquerie
16050 73 20 2a 2a 2a 2a 2f 0a 20 20 65 78 70 6c 61 69  s ****/.  explai
16060 6e 43 6f 6d 70 6f 73 69 74 65 28 70 50 61 72 73  nComposite(pPars
16070 65 2c 20 70 2d 3e 6f 70 2c 20 69 53 75 62 31 2c  e, p->op, iSub1,
16080 20 69 53 75 62 32 2c 20 30 29 3b 0a 20 20 72 65   iSub2, 0);.  re
16090 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
160a0 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64  }.#endif..#if !d
160b0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
160c0 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20  IT_SUBQUERY) || 
160d0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
160e0 4f 4d 49 54 5f 56 49 45 57 29 0a 2f 2a 20 46 6f  OMIT_VIEW)./* Fo
160f0 72 77 61 72 64 20 44 65 63 6c 61 72 61 74 69 6f  rward Declaratio
16100 6e 73 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ns */.static voi
16110 64 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28  d substExprList(
16120 73 71 6c 69 74 65 33 2a 2c 20 45 78 70 72 4c 69  sqlite3*, ExprLi
16130 73 74 2a 2c 20 69 6e 74 2c 20 45 78 70 72 4c 69  st*, int, ExprLi
16140 73 74 2a 29 3b 0a 73 74 61 74 69 63 20 76 6f 69  st*);.static voi
16150 64 20 73 75 62 73 74 53 65 6c 65 63 74 28 73 71  d substSelect(sq
16160 6c 69 74 65 33 2a 2c 20 53 65 6c 65 63 74 20 2a  lite3*, Select *
16170 2c 20 69 6e 74 2c 20 45 78 70 72 4c 69 73 74 20  , int, ExprList 
16180 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20  *);../*.** Scan 
16190 74 68 72 6f 75 67 68 20 74 68 65 20 65 78 70 72  through the expr
161a0 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 20 52  ession pExpr.  R
161b0 65 70 6c 61 63 65 20 65 76 65 72 79 20 72 65 66  eplace every ref
161c0 65 72 65 6e 63 65 20 74 6f 0a 2a 2a 20 61 20 63  erence to.** a c
161d0 6f 6c 75 6d 6e 20 69 6e 20 74 61 62 6c 65 20 6e  olumn in table n
161e0 75 6d 62 65 72 20 69 54 61 62 6c 65 20 77 69 74  umber iTable wit
161f0 68 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  h a copy of the 
16200 69 43 6f 6c 75 6d 6e 2d 74 68 0a 2a 2a 20 65 6e  iColumn-th.** en
16210 74 72 79 20 69 6e 20 70 45 4c 69 73 74 2e 20 20  try in pEList.  
16220 28 42 75 74 20 6c 65 61 76 65 20 72 65 66 65 72  (But leave refer
16230 65 6e 63 65 73 20 74 6f 20 74 68 65 20 52 4f 57  ences to the ROW
16240 49 44 20 63 6f 6c 75 6d 6e 20 0a 2a 2a 20 75 6e  ID column .** un
16250 63 68 61 6e 67 65 64 2e 29 0a 2a 2a 0a 2a 2a 20  changed.).**.** 
16260 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
16270 70 61 72 74 20 6f 66 20 74 68 65 20 66 6c 61 74  part of the flat
16280 74 65 6e 69 6e 67 20 70 72 6f 63 65 64 75 72 65  tening procedure
16290 2e 20 20 41 20 73 75 62 71 75 65 72 79 0a 2a 2a  .  A subquery.**
162a0 20 77 68 6f 73 65 20 72 65 73 75 6c 74 20 73 65   whose result se
162b0 74 20 69 73 20 64 65 66 69 6e 65 64 20 62 79 20  t is defined by 
162c0 70 45 4c 69 73 74 20 61 70 70 65 61 72 73 20 61  pEList appears a
162d0 73 20 65 6e 74 72 79 20 69 6e 20 74 68 65 0a 2a  s entry in the.*
162e0 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  * FROM clause of
162f0 20 61 20 53 45 4c 45 43 54 20 73 75 63 68 20 74   a SELECT such t
16300 68 61 74 20 74 68 65 20 56 44 42 45 20 63 75 72  hat the VDBE cur
16310 73 6f 72 20 61 73 73 69 67 6e 65 64 20 74 6f 20  sor assigned to 
16320 74 68 61 74 0a 2a 2a 20 46 4f 52 4d 20 63 6c 61  that.** FORM cla
16330 75 73 65 20 65 6e 74 72 79 20 69 73 20 69 54 61  use entry is iTa
16340 62 6c 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ble.  This routi
16350 6e 65 20 6d 61 6b 65 20 74 68 65 20 6e 65 63 65  ne make the nece
16360 73 73 61 72 79 20 0a 2a 2a 20 63 68 61 6e 67 65  ssary .** change
16370 73 20 74 6f 20 70 45 78 70 72 20 73 6f 20 74 68  s to pExpr so th
16380 61 74 20 69 74 20 72 65 66 65 72 73 20 64 69 72  at it refers dir
16390 65 63 74 6c 79 20 74 6f 20 74 68 65 20 73 6f 75  ectly to the sou
163a0 72 63 65 20 74 61 62 6c 65 0a 2a 2a 20 6f 66 20  rce table.** of 
163b0 74 68 65 20 73 75 62 71 75 65 72 79 20 72 61 74  the subquery rat
163c0 68 65 72 20 74 68 65 20 72 65 73 75 6c 74 20 73  her the result s
163d0 65 74 20 6f 66 20 74 68 65 20 73 75 62 71 75 65  et of the subque
163e0 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 45 78  ry..*/.static Ex
163f0 70 72 20 2a 73 75 62 73 74 45 78 70 72 28 0a 20  pr *substExpr(. 
16400 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
16410 20 20 20 20 20 2f 2a 20 52 65 70 6f 72 74 20 6d       /* Report m
16420 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20 74 6f 20  alloc errors to 
16430 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  this connection 
16440 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  */.  Expr *pExpr
16450 2c 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72  ,        /* Expr
16460 20 69 6e 20 77 68 69 63 68 20 73 75 62 73 74 69   in which substi
16470 74 75 74 69 6f 6e 20 6f 63 63 75 72 73 20 2a 2f  tution occurs */
16480 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20  .  int iTable,  
16490 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20         /* Table 
164a0 74 6f 20 62 65 20 73 75 62 73 74 69 74 75 74 65  to be substitute
164b0 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  d */.  ExprList 
164c0 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a 20 53 75  *pEList    /* Su
164d0 62 73 74 69 74 75 74 65 20 65 78 70 72 65 73 73  bstitute express
164e0 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 69 66 28  ions */.){.  if(
164f0 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75   pExpr==0 ) retu
16500 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 45 78 70  rn 0;.  if( pExp
16510 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op==TK_COLUMN
16520 20 26 26 20 70 45 78 70 72 2d 3e 69 54 61 62 6c   && pExpr->iTabl
16530 65 3d 3d 69 54 61 62 6c 65 20 29 7b 0a 20 20 20  e==iTable ){.   
16540 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c   if( pExpr->iCol
16550 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 70  umn<0 ){.      p
16560 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 4e 55  Expr->op = TK_NU
16570 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  LL;.    }else{. 
16580 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 3b       Expr *pNew;
16590 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
165a0 45 4c 69 73 74 21 3d 30 20 26 26 20 70 45 78 70  EList!=0 && pExp
165b0 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 45 4c 69 73  r->iColumn<pELis
165c0 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20 20  t->nExpr );.    
165d0 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
165e0 3e 70 4c 65 66 74 3d 3d 30 20 26 26 20 70 45 78  >pLeft==0 && pEx
165f0 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b  pr->pRight==0 );
16600 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71  .      pNew = sq
16610 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
16620 20 70 45 4c 69 73 74 2d 3e 61 5b 70 45 78 70 72   pEList->a[pExpr
16630 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 70 45 78 70 72  ->iColumn].pExpr
16640 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
16650 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
16660 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  , pExpr);.      
16670 70 45 78 70 72 20 3d 20 70 4e 65 77 3b 0a 20 20  pExpr = pNew;.  
16680 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
16690 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20   pExpr->pLeft = 
166a0 73 75 62 73 74 45 78 70 72 28 64 62 2c 20 70 45  substExpr(db, pE
166b0 78 70 72 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62  xpr->pLeft, iTab
166c0 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20  le, pEList);.   
166d0 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20 3d   pExpr->pRight =
166e0 20 73 75 62 73 74 45 78 70 72 28 64 62 2c 20 70   substExpr(db, p
166f0 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 69 54  Expr->pRight, iT
16700 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20  able, pEList);. 
16710 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72     if( ExprHasPr
16720 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
16730 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20  _xIsSelect) ){. 
16740 20 20 20 20 20 73 75 62 73 74 53 65 6c 65 63 74       substSelect
16750 28 64 62 2c 20 70 45 78 70 72 2d 3e 78 2e 70 53  (db, pExpr->x.pS
16760 65 6c 65 63 74 2c 20 69 54 61 62 6c 65 2c 20 70  elect, iTable, p
16770 45 4c 69 73 74 29 3b 0a 20 20 20 20 7d 65 6c 73  EList);.    }els
16780 65 7b 0a 20 20 20 20 20 20 73 75 62 73 74 45 78  e{.      substEx
16790 70 72 4c 69 73 74 28 64 62 2c 20 70 45 78 70 72  prList(db, pExpr
167a0 2d 3e 78 2e 70 4c 69 73 74 2c 20 69 54 61 62 6c  ->x.pList, iTabl
167b0 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  e, pEList);.    
167c0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  }.  }.  return p
167d0 45 78 70 72 3b 0a 7d 0a 73 74 61 74 69 63 20 76  Expr;.}.static v
167e0 6f 69 64 20 73 75 62 73 74 45 78 70 72 4c 69 73  oid substExprLis
167f0 74 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  t(.  sqlite3 *db
16800 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 70  ,         /* Rep
16810 6f 72 74 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72  ort malloc error
16820 73 20 68 65 72 65 20 2a 2f 0a 20 20 45 78 70 72  s here */.  Expr
16830 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20  List *pList,    
16840 20 2f 2a 20 4c 69 73 74 20 74 6f 20 73 63 61 6e   /* List to scan
16850 20 61 6e 64 20 69 6e 20 77 68 69 63 68 20 74 6f   and in which to
16860 20 6d 61 6b 65 20 73 75 62 73 74 69 74 75 74 65   make substitute
16870 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c  s */.  int iTabl
16880 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  e,          /* T
16890 61 62 6c 65 20 74 6f 20 62 65 20 73 75 62 73 74  able to be subst
168a0 69 74 75 74 65 64 20 2a 2f 0a 20 20 45 78 70 72  ituted */.  Expr
168b0 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20  List *pEList    
168c0 20 2f 2a 20 53 75 62 73 74 69 74 75 74 65 20 76   /* Substitute v
168d0 61 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  alues */.){.  in
168e0 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  t i;.  if( pList
168f0 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
16900 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74  for(i=0; i<pList
16910 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
16920 20 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70     pList->a[i].p
16930 45 78 70 72 20 3d 20 73 75 62 73 74 45 78 70 72  Expr = substExpr
16940 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  (db, pList->a[i]
16950 2e 70 45 78 70 72 2c 20 69 54 61 62 6c 65 2c 20  .pExpr, iTable, 
16960 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a 73  pEList);.  }.}.s
16970 74 61 74 69 63 20 76 6f 69 64 20 73 75 62 73 74  tatic void subst
16980 53 65 6c 65 63 74 28 0a 20 20 73 71 6c 69 74 65  Select(.  sqlite
16990 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 2f  3 *db,         /
169a0 2a 20 52 65 70 6f 72 74 20 6d 61 6c 6c 6f 63 20  * Report malloc 
169b0 65 72 72 6f 72 73 20 68 65 72 65 20 2a 2f 0a 20  errors here */. 
169c0 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
169d0 20 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20        /* SELECT 
169e0 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 77 68 69  statement in whi
169f0 63 68 20 74 6f 20 6d 61 6b 65 20 73 75 62 73 74  ch to make subst
16a00 69 74 75 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e  itutions */.  in
16a10 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20  t iTable,       
16a20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62     /* Table to b
16a30 65 20 72 65 70 6c 61 63 65 64 20 2a 2f 0a 20 20  e replaced */.  
16a40 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
16a50 20 20 20 20 20 2f 2a 20 53 75 62 73 74 69 74 75       /* Substitu
16a60 74 65 20 76 61 6c 75 65 73 20 2a 2f 0a 29 7b 0a  te values */.){.
16a70 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b    SrcList *pSrc;
16a80 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
16a90 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
16aa0 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 21 70   int i;.  if( !p
16ab0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 75 62   ) return;.  sub
16ac0 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70  stExprList(db, p
16ad0 2d 3e 70 45 4c 69 73 74 2c 20 69 54 61 62 6c 65  ->pEList, iTable
16ae0 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 73 75 62  , pEList);.  sub
16af0 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70  stExprList(db, p
16b00 2d 3e 70 47 72 6f 75 70 42 79 2c 20 69 54 61 62  ->pGroupBy, iTab
16b10 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 73  le, pEList);.  s
16b20 75 62 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c  ubstExprList(db,
16b30 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 69 54   p->pOrderBy, iT
16b40 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20  able, pEList);. 
16b50 20 70 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 75   p->pHaving = su
16b60 62 73 74 45 78 70 72 28 64 62 2c 20 70 2d 3e 70  bstExpr(db, p->p
16b70 48 61 76 69 6e 67 2c 20 69 54 61 62 6c 65 2c 20  Having, iTable, 
16b80 70 45 4c 69 73 74 29 3b 0a 20 20 70 2d 3e 70 57  pEList);.  p->pW
16b90 68 65 72 65 20 3d 20 73 75 62 73 74 45 78 70 72  here = substExpr
16ba0 28 64 62 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20  (db, p->pWhere, 
16bb0 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
16bc0 0a 20 20 73 75 62 73 74 53 65 6c 65 63 74 28 64  .  substSelect(d
16bd0 62 2c 20 70 2d 3e 70 50 72 69 6f 72 2c 20 69 54  b, p->pPrior, iT
16be0 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20  able, pEList);. 
16bf0 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b   pSrc = p->pSrc;
16c00 0a 20 20 61 73 73 65 72 74 28 20 70 53 72 63 20  .  assert( pSrc 
16c10 29 3b 20 20 2f 2a 20 45 76 65 6e 20 66 6f 72 20  );  /* Even for 
16c20 28 53 45 4c 45 43 54 20 31 29 20 77 65 20 68 61  (SELECT 1) we ha
16c30 76 65 3a 20 70 53 72 63 21 3d 30 20 62 75 74 20  ve: pSrc!=0 but 
16c40 70 53 72 63 2d 3e 6e 53 72 63 3d 3d 30 20 2a 2f  pSrc->nSrc==0 */
16c50 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 53  .  if( ALWAYS(pS
16c60 72 63 29 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  rc) ){.    for(i
16c70 3d 70 53 72 63 2d 3e 6e 53 72 63 2c 20 70 49 74  =pSrc->nSrc, pIt
16c80 65 6d 3d 70 53 72 63 2d 3e 61 3b 20 69 3e 30 3b  em=pSrc->a; i>0;
16c90 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i--, pItem++){.
16ca0 20 20 20 20 20 20 73 75 62 73 74 53 65 6c 65 63        substSelec
16cb0 74 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70 53 65  t(db, pItem->pSe
16cc0 6c 65 63 74 2c 20 69 54 61 62 6c 65 2c 20 70 45  lect, iTable, pE
16cd0 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  List);.    }.  }
16ce0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65  .}.#endif /* !de
16cf0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
16d00 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21  T_SUBQUERY) || !
16d10 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
16d20 4d 49 54 5f 56 49 45 57 29 20 2a 2f 0a 0a 23 69  MIT_VIEW) */..#i
16d30 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
16d40 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29  E_OMIT_SUBQUERY)
16d50 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
16d60 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 2f  ITE_OMIT_VIEW)./
16d70 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
16d80 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20 66 6c  e attempts to fl
16d90 61 74 74 65 6e 20 73 75 62 71 75 65 72 69 65 73  atten subqueries
16da0 20 61 73 20 61 20 70 65 72 66 6f 72 6d 61 6e 63   as a performanc
16db0 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a  e optimization..
16dc0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
16dd0 72 65 74 75 72 6e 73 20 31 20 69 66 20 69 74 20  returns 1 if it 
16de0 6d 61 6b 65 73 20 63 68 61 6e 67 65 73 20 61 6e  makes changes an
16df0 64 20 30 20 69 66 20 6e 6f 20 66 6c 61 74 74 65  d 0 if no flatte
16e00 6e 69 6e 67 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a  ning occurs..**.
16e10 2a 2a 20 54 6f 20 75 6e 64 65 72 73 74 61 6e 64  ** To understand
16e20 20 74 68 65 20 63 6f 6e 63 65 70 74 20 6f 66 20   the concept of 
16e30 66 6c 61 74 74 65 6e 69 6e 67 2c 20 63 6f 6e 73  flattening, cons
16e40 69 64 65 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ider the followi
16e50 6e 67 0a 2a 2a 20 71 75 65 72 79 3a 0a 2a 2a 0a  ng.** query:.**.
16e60 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61 20  **     SELECT a 
16e70 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 78 2b 79  FROM (SELECT x+y
16e80 20 41 53 20 61 20 46 52 4f 4d 20 74 31 20 57 48   AS a FROM t1 WH
16e90 45 52 45 20 7a 3c 31 30 30 29 20 57 48 45 52 45  ERE z<100) WHERE
16ea0 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64   a>5.**.** The d
16eb0 65 66 61 75 6c 74 20 77 61 79 20 6f 66 20 69 6d  efault way of im
16ec0 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68 69 73 20  plementing this 
16ed0 71 75 65 72 79 20 69 73 20 74 6f 20 65 78 65 63  query is to exec
16ee0 75 74 65 20 74 68 65 0a 2a 2a 20 73 75 62 71 75  ute the.** subqu
16ef0 65 72 79 20 66 69 72 73 74 20 61 6e 64 20 73 74  ery first and st
16f00 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20  ore the results 
16f10 69 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74  in a temporary t
16f20 61 62 6c 65 2c 20 74 68 65 6e 0a 2a 2a 20 72 75  able, then.** ru
16f30 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  n the outer quer
16f40 79 20 6f 6e 20 74 68 61 74 20 74 65 6d 70 6f 72  y on that tempor
16f50 61 72 79 20 74 61 62 6c 65 2e 20 20 54 68 69 73  ary table.  This
16f60 20 72 65 71 75 69 72 65 73 20 74 77 6f 0a 2a 2a   requires two.**
16f70 20 70 61 73 73 65 73 20 6f 76 65 72 20 74 68 65   passes over the
16f80 20 64 61 74 61 2e 20 20 46 75 72 74 68 65 72 6d   data.  Furtherm
16f90 6f 72 65 2c 20 62 65 63 61 75 73 65 20 74 68 65  ore, because the
16fa0 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
16fb0 0a 2a 2a 20 68 61 73 20 6e 6f 20 69 6e 64 69 63  .** has no indic
16fc0 65 73 2c 20 74 68 65 20 57 48 45 52 45 20 63 6c  es, the WHERE cl
16fd0 61 75 73 65 20 6f 6e 20 74 68 65 20 6f 75 74 65  ause on the oute
16fe0 72 20 71 75 65 72 79 20 63 61 6e 6e 6f 74 20 62  r query cannot b
16ff0 65 0a 2a 2a 20 6f 70 74 69 6d 69 7a 65 64 2e 0a  e.** optimized..
17000 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
17010 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20 72  ne attempts to r
17020 65 77 72 69 74 65 20 71 75 65 72 69 65 73 20 73  ewrite queries s
17030 75 63 68 20 61 73 20 74 68 65 20 61 62 6f 76 65  uch as the above
17040 20 69 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c   into.** a singl
17050 65 20 66 6c 61 74 20 73 65 6c 65 63 74 2c 20 6c  e flat select, l
17060 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20  ike this:.**.** 
17070 20 20 20 20 53 45 4c 45 43 54 20 78 2b 79 20 41      SELECT x+y A
17080 53 20 61 20 46 52 4f 4d 20 74 31 20 57 48 45 52  S a FROM t1 WHER
17090 45 20 7a 3c 31 30 30 20 41 4e 44 20 61 3e 35 0a  E z<100 AND a>5.
170a0 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 67  **.** The code g
170b0 65 6e 65 72 61 74 65 64 20 66 6f 72 20 74 68 69  enerated for thi
170c0 73 20 73 69 6d 70 69 66 69 63 61 74 69 6f 6e 20  s simpification 
170d0 67 69 76 65 73 20 74 68 65 20 73 61 6d 65 20 72  gives the same r
170e0 65 73 75 6c 74 0a 2a 2a 20 62 75 74 20 6f 6e 6c  esult.** but onl
170f0 79 20 68 61 73 20 74 6f 20 73 63 61 6e 20 74 68  y has to scan th
17100 65 20 64 61 74 61 20 6f 6e 63 65 2e 20 20 41 6e  e data once.  An
17110 64 20 62 65 63 61 75 73 65 20 69 6e 64 69 63 65  d because indice
17120 73 20 6d 69 67 68 74 20 0a 2a 2a 20 65 78 69 73  s might .** exis
17130 74 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 74  t on the table t
17140 31 2c 20 61 20 63 6f 6d 70 6c 65 74 65 20 73 63  1, a complete sc
17150 61 6e 20 6f 66 20 74 68 65 20 64 61 74 61 20 6d  an of the data m
17160 69 67 68 74 20 62 65 0a 2a 2a 20 61 76 6f 69 64  ight be.** avoid
17170 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6c 61 74 74 65  ed..**.** Flatte
17180 6e 69 6e 67 20 69 73 20 6f 6e 6c 79 20 61 74 74  ning is only att
17190 65 6d 70 74 65 64 20 69 66 20 61 6c 6c 20 6f 66  empted if all of
171a0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   the following a
171b0 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20  re true:.**.**  
171c0 20 28 31 29 20 20 54 68 65 20 73 75 62 71 75 65   (1)  The subque
171d0 72 79 20 61 6e 64 20 74 68 65 20 6f 75 74 65 72  ry and the outer
171e0 20 71 75 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f   query do not bo
171f0 74 68 20 75 73 65 20 61 67 67 72 65 67 61 74 65  th use aggregate
17200 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 32 29 20 20  s..**.**   (2)  
17210 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  The subquery is 
17220 6e 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74 65  not an aggregate
17230 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75   or the outer qu
17240 65 72 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69  ery is not a joi
17250 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 33 29 20 20  n..**.**   (3)  
17260 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  The subquery is 
17270 6e 6f 74 20 74 68 65 20 72 69 67 68 74 20 6f 70  not the right op
17280 65 72 61 6e 64 20 6f 66 20 61 20 6c 65 66 74 20  erand of a left 
17290 6f 75 74 65 72 20 6a 6f 69 6e 0a 2a 2a 20 20 20  outer join.**   
172a0 20 20 20 20 20 28 4f 72 69 67 69 6e 61 6c 6c 79       (Originally
172b0 20 74 69 63 6b 65 74 20 23 33 30 36 2e 20 20 53   ticket #306.  S
172c0 74 72 65 6e 67 74 68 65 6e 65 64 20 62 79 20 74  trengthened by t
172d0 69 63 6b 65 74 20 23 33 33 30 30 29 0a 2a 2a 0a  icket #3300).**.
172e0 2a 2a 20 20 20 28 34 29 20 20 54 68 65 20 73 75  **   (4)  The su
172f0 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 44 49  bquery is not DI
17300 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20 20 28  STINCT..**.**  (
17310 2a 2a 29 20 20 41 74 20 6f 6e 65 20 70 6f 69 6e  **)  At one poin
17320 74 20 72 65 73 74 72 69 63 74 69 6f 6e 73 20 28  t restrictions (
17330 34 29 20 61 6e 64 20 28 35 29 20 64 65 66 69 6e  4) and (5) defin
17340 65 64 20 61 20 73 75 62 73 65 74 20 6f 66 20 44  ed a subset of D
17350 49 53 54 49 4e 43 54 0a 2a 2a 20 20 20 20 20 20  ISTINCT.**      
17360 20 20 73 75 62 2d 71 75 65 72 69 65 73 20 74 68    sub-queries th
17370 61 74 20 77 65 72 65 20 65 78 63 6c 75 64 65 64  at were excluded
17380 20 66 72 6f 6d 20 74 68 69 73 20 6f 70 74 69 6d   from this optim
17390 69 7a 61 74 69 6f 6e 2e 20 52 65 73 74 72 69 63  ization. Restric
173a0 74 69 6f 6e 20 0a 2a 2a 20 20 20 20 20 20 20 20  tion .**        
173b0 28 34 29 20 68 61 73 20 73 69 6e 63 65 20 62 65  (4) has since be
173c0 65 6e 20 65 78 70 61 6e 64 65 64 20 74 6f 20 65  en expanded to e
173d0 78 63 6c 75 64 65 20 61 6c 6c 20 44 49 53 54 49  xclude all DISTI
173e0 4e 43 54 20 73 75 62 71 75 65 72 69 65 73 2e 0a  NCT subqueries..
173f0 2a 2a 0a 2a 2a 20 20 20 28 36 29 20 20 54 68 65  **.**   (6)  The
17400 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e   subquery does n
17410 6f 74 20 75 73 65 20 61 67 67 72 65 67 61 74 65  ot use aggregate
17420 73 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71  s or the outer q
17430 75 65 72 79 20 69 73 20 6e 6f 74 0a 2a 2a 20 20  uery is not.**  
17440 20 20 20 20 20 20 44 49 53 54 49 4e 43 54 2e 0a        DISTINCT..
17450 2a 2a 0a 2a 2a 20 20 20 28 37 29 20 20 54 68 65  **.**   (7)  The
17460 20 73 75 62 71 75 65 72 79 20 68 61 73 20 61 20   subquery has a 
17470 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 54 4f  FROM clause.  TO
17480 44 4f 3a 20 20 46 6f 72 20 73 75 62 71 75 65 72  DO:  For subquer
17490 69 65 73 20 77 69 74 68 6f 75 74 0a 2a 2a 20 20  ies without.**  
174a0 20 20 20 20 20 20 41 20 46 52 4f 4d 20 63 6c 61        A FROM cla
174b0 75 73 65 2c 20 63 6f 6e 73 69 64 65 72 20 61 64  use, consider ad
174c0 64 69 6e 67 20 61 20 46 52 4f 4d 20 63 6c 6f 73  ding a FROM clos
174d0 65 20 77 69 74 68 20 74 68 65 20 73 70 65 63 69  e with the speci
174e0 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 74 61 62  al.**        tab
174f0 6c 65 20 73 71 6c 69 74 65 5f 6f 6e 63 65 20 74  le sqlite_once t
17500 68 61 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  hat consists of 
17510 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 63 6f 6e  a single row con
17520 74 61 69 6e 69 6e 67 20 61 0a 2a 2a 20 20 20 20  taining a.**    
17530 20 20 20 20 73 69 6e 67 6c 65 20 4e 55 4c 4c 2e      single NULL.
17540 0a 2a 2a 0a 2a 2a 20 20 20 28 38 29 20 20 54 68  .**.**   (8)  Th
17550 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20  e subquery does 
17560 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 20 6f 72  not use LIMIT or
17570 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
17580 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a   is not a join..
17590 2a 2a 0a 2a 2a 20 20 20 28 39 29 20 20 54 68 65  **.**   (9)  The
175a0 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e   subquery does n
175b0 6f 74 20 75 73 65 20 4c 49 4d 49 54 20 6f 72 20  ot use LIMIT or 
175c0 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
175d0 64 6f 65 73 20 6e 6f 74 20 75 73 65 0a 2a 2a 20  does not use.** 
175e0 20 20 20 20 20 20 20 61 67 67 72 65 67 61 74 65         aggregate
175f0 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 30 29 20 20  s..**.**  (10)  
17600 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65  The subquery doe
17610 73 20 6e 6f 74 20 75 73 65 20 61 67 67 72 65 67  s not use aggreg
17620 61 74 65 73 20 6f 72 20 74 68 65 20 6f 75 74 65  ates or the oute
17630 72 20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  r query does not
17640 0a 2a 2a 20 20 20 20 20 20 20 20 75 73 65 20 4c  .**        use L
17650 49 4d 49 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 31  IMIT..**.**  (11
17660 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
17670 61 6e 64 20 74 68 65 20 6f 75 74 65 72 20 71 75  and the outer qu
17680 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20  ery do not both 
17690 68 61 76 65 20 4f 52 44 45 52 20 42 59 20 63 6c  have ORDER BY cl
176a0 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a  auses..**.**  (*
176b0 2a 29 20 20 4e 6f 74 20 69 6d 70 6c 65 6d 65 6e  *)  Not implemen
176c0 74 65 64 2e 20 20 53 75 62 73 75 6d 65 64 20 69  ted.  Subsumed i
176d0 6e 74 6f 20 72 65 73 74 72 69 63 74 69 6f 6e 20  nto restriction 
176e0 28 33 29 2e 20 20 57 61 73 20 70 72 65 76 69 6f  (3).  Was previo
176f0 75 73 6c 79 0a 2a 2a 20 20 20 20 20 20 20 20 61  usly.**        a
17700 20 73 65 70 61 72 61 74 65 20 72 65 73 74 72 69   separate restri
17710 63 74 69 6f 6e 20 64 65 72 69 76 69 6e 67 20 66  ction deriving f
17720 72 6f 6d 20 74 69 63 6b 65 74 20 23 33 35 30 2e  rom ticket #350.
17730 0a 2a 2a 0a 2a 2a 20 20 28 31 33 29 20 20 54 68  .**.**  (13)  Th
17740 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20 6f  e subquery and o
17750 75 74 65 72 20 71 75 65 72 79 20 64 6f 20 6e 6f  uter query do no
17760 74 20 62 6f 74 68 20 75 73 65 20 4c 49 4d 49 54  t both use LIMIT
17770 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 34 29 20 20 54  ..**.**  (14)  T
17780 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73  he subquery does
17790 20 6e 6f 74 20 75 73 65 20 4f 46 46 53 45 54 2e   not use OFFSET.
177a0 0a 2a 2a 0a 2a 2a 20 20 28 31 35 29 20 20 54 68  .**.**  (15)  Th
177b0 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73  e outer query is
177c0 20 6e 6f 74 20 70 61 72 74 20 6f 66 20 61 20 63   not part of a c
177d0 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 6f  ompound select o
177e0 72 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  r the.**        
177f0 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f  subquery does no
17800 74 20 68 61 76 65 20 61 20 4c 49 4d 49 54 20 63  t have a LIMIT c
17810 6c 61 75 73 65 2e 0a 2a 2a 20 20 20 20 20 20 20  lause..**       
17820 20 28 53 65 65 20 74 69 63 6b 65 74 20 23 32 33   (See ticket #23
17830 33 39 20 61 6e 64 20 74 69 63 6b 65 74 20 5b 30  39 and ticket [0
17840 32 61 38 65 38 31 64 34 34 5d 29 2e 0a 2a 2a 0a  2a8e81d44])..**.
17850 2a 2a 20 20 28 31 36 29 20 20 54 68 65 20 6f 75  **  (16)  The ou
17860 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74  ter query is not
17870 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 6f 72   an aggregate or
17880 20 74 68 65 20 73 75 62 71 75 65 72 79 20 64 6f   the subquery do
17890 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 6e 6f 74  es.**        not
178a0 20 63 6f 6e 74 61 69 6e 20 4f 52 44 45 52 20 42   contain ORDER B
178b0 59 2e 20 20 28 54 69 63 6b 65 74 20 23 32 39 34  Y.  (Ticket #294
178c0 32 29 20 20 54 68 69 73 20 75 73 65 64 20 74 6f  2)  This used to
178d0 20 6e 6f 74 20 6d 61 74 74 65 72 0a 2a 2a 20 20   not matter.**  
178e0 20 20 20 20 20 20 75 6e 74 69 6c 20 77 65 20 69        until we i
178f0 6e 74 72 6f 64 75 63 65 64 20 74 68 65 20 67 72  ntroduced the gr
17900 6f 75 70 5f 63 6f 6e 63 61 74 28 29 20 66 75 6e  oup_concat() fun
17910 63 74 69 6f 6e 2e 20 20 0a 2a 2a 0a 2a 2a 20 20  ction.  .**.**  
17920 28 31 37 29 20 20 54 68 65 20 73 75 62 2d 71 75  (17)  The sub-qu
17930 65 72 79 20 69 73 20 6e 6f 74 20 61 20 63 6f 6d  ery is not a com
17940 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20 6f 72  pound select, or
17950 20 69 74 20 69 73 20 61 20 55 4e 49 4f 4e 20 41   it is a UNION A
17960 4c 4c 20 0a 2a 2a 20 20 20 20 20 20 20 20 63 6f  LL .**        co
17970 6d 70 6f 75 6e 64 20 63 6c 61 75 73 65 20 6d 61  mpound clause ma
17980 64 65 20 75 70 20 65 6e 74 69 72 65 6c 79 20 6f  de up entirely o
17990 66 20 6e 6f 6e 2d 61 67 67 72 65 67 61 74 65 20  f non-aggregate 
179a0 71 75 65 72 69 65 73 2c 20 61 6e 64 20 0a 2a 2a  queries, and .**
179b0 20 20 20 20 20 20 20 20 74 68 65 20 70 61 72 65          the pare
179c0 6e 74 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20  nt query:.**.** 
179d0 20 20 20 20 20 20 20 20 20 2a 20 69 73 20 6e 6f           * is no
179e0 74 20 69 74 73 65 6c 66 20 70 61 72 74 20 6f 66  t itself part of
179f0 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65   a compound sele
17a00 63 74 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ct,.**          
17a10 2a 20 69 73 20 6e 6f 74 20 61 6e 20 61 67 67 72  * is not an aggr
17a20 65 67 61 74 65 20 6f 72 20 44 49 53 54 49 4e 43  egate or DISTINC
17a30 54 20 71 75 65 72 79 2c 20 61 6e 64 0a 2a 2a 20  T query, and.** 
17a40 20 20 20 20 20 20 20 20 20 2a 20 69 73 20 6e 6f           * is no
17a50 74 20 61 20 6a 6f 69 6e 0a 2a 2a 0a 2a 2a 20 20  t a join.**.**  
17a60 20 20 20 20 20 20 54 68 65 20 70 61 72 65 6e 74        The parent
17a70 20 61 6e 64 20 73 75 62 2d 71 75 65 72 79 20 6d   and sub-query m
17a80 61 79 20 63 6f 6e 74 61 69 6e 20 57 48 45 52 45  ay contain WHERE
17a90 20 63 6c 61 75 73 65 73 2e 20 53 75 62 6a 65 63   clauses. Subjec
17aa0 74 20 74 6f 0a 2a 2a 20 20 20 20 20 20 20 20 72  t to.**        r
17ab0 75 6c 65 73 20 28 31 31 29 2c 20 28 31 33 29 20  ules (11), (13) 
17ac0 61 6e 64 20 28 31 34 29 2c 20 74 68 65 79 20 6d  and (14), they m
17ad0 61 79 20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e 20  ay also contain 
17ae0 4f 52 44 45 52 20 42 59 2c 0a 2a 2a 20 20 20 20  ORDER BY,.**    
17af0 20 20 20 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46      LIMIT and OF
17b00 46 53 45 54 20 63 6c 61 75 73 65 73 2e 20 20 54  FSET clauses.  T
17b10 68 65 20 73 75 62 71 75 65 72 79 20 63 61 6e 6e  he subquery cann
17b20 6f 74 20 75 73 65 20 61 6e 79 20 63 6f 6d 70 6f  ot use any compo
17b30 75 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 6f 70  und.**        op
17b40 65 72 61 74 6f 72 20 6f 74 68 65 72 20 74 68 61  erator other tha
17b50 6e 20 55 4e 49 4f 4e 20 41 4c 4c 20 62 65 63 61  n UNION ALL beca
17b60 75 73 65 20 61 6c 6c 20 74 68 65 20 6f 74 68 65  use all the othe
17b70 72 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20 20  r compound.**   
17b80 20 20 20 20 20 6f 70 65 72 61 74 6f 72 73 20 68       operators h
17b90 61 76 65 20 61 6e 20 69 6d 70 6c 69 65 64 20 44  ave an implied D
17ba0 49 53 54 49 4e 43 54 20 77 68 69 63 68 20 69 73  ISTINCT which is
17bb0 20 64 69 73 61 6c 6c 6f 77 65 64 20 62 79 0a 2a   disallowed by.*
17bc0 2a 20 20 20 20 20 20 20 20 72 65 73 74 72 69 63  *        restric
17bd0 74 69 6f 6e 20 28 34 29 2e 0a 2a 2a 0a 2a 2a 20  tion (4)..**.** 
17be0 20 20 20 20 20 20 20 41 6c 73 6f 2c 20 65 61 63         Also, eac
17bf0 68 20 63 6f 6d 70 6f 6e 65 6e 74 20 6f 66 20 74  h component of t
17c00 68 65 20 73 75 62 2d 71 75 65 72 79 20 6d 75 73  he sub-query mus
17c10 74 20 72 65 74 75 72 6e 20 74 68 65 20 73 61 6d  t return the sam
17c20 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 20 20 20 20  e number.**     
17c30 20 20 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c     of result col
17c40 75 6d 6e 73 2e 20 54 68 69 73 20 69 73 20 61 63  umns. This is ac
17c50 74 75 61 6c 6c 79 20 61 20 72 65 71 75 69 72 65  tually a require
17c60 6d 65 6e 74 20 66 6f 72 20 61 6e 79 20 63 6f 6d  ment for any com
17c70 70 6f 75 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20  pound.**        
17c80 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
17c90 2c 20 62 75 74 20 61 6c 6c 20 74 68 65 20 63 6f  , but all the co
17ca0 64 65 20 68 65 72 65 20 64 6f 65 73 20 69 73 20  de here does is 
17cb0 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 6e  make sure that n
17cc0 6f 0a 2a 2a 20 20 20 20 20 20 20 20 73 75 63 68  o.**        such
17cd0 20 28 69 6c 6c 65 67 61 6c 29 20 73 75 62 2d 71   (illegal) sub-q
17ce0 75 65 72 79 20 69 73 20 66 6c 61 74 74 65 6e 65  uery is flattene
17cf0 64 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69  d. The caller wi
17d00 6c 6c 20 64 65 74 65 63 74 20 74 68 65 0a 2a 2a  ll detect the.**
17d10 20 20 20 20 20 20 20 20 73 79 6e 74 61 78 20 65          syntax e
17d20 72 72 6f 72 20 61 6e 64 20 72 65 74 75 72 6e 20  rror and return 
17d30 61 20 64 65 74 61 69 6c 65 64 20 6d 65 73 73 61  a detailed messa
17d40 67 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 38 29 20  ge..**.**  (18) 
17d50 20 49 66 20 74 68 65 20 73 75 62 2d 71 75 65 72   If the sub-quer
17d60 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20  y is a compound 
17d70 73 65 6c 65 63 74 2c 20 74 68 65 6e 20 61 6c 6c  select, then all
17d80 20 74 65 72 6d 73 20 6f 66 20 74 68 65 0a 2a 2a   terms of the.**
17d90 20 20 20 20 20 20 20 20 4f 52 44 45 52 20 62 79          ORDER by
17da0 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 70   clause of the p
17db0 61 72 65 6e 74 20 6d 75 73 74 20 62 65 20 73 69  arent must be si
17dc0 6d 70 6c 65 20 72 65 66 65 72 65 6e 63 65 73 20  mple references 
17dd0 74 6f 20 0a 2a 2a 20 20 20 20 20 20 20 20 63 6f  to .**        co
17de0 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 73 75 62  lumns of the sub
17df0 2d 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 20 28  -query..**.**  (
17e00 31 39 29 20 20 54 68 65 20 73 75 62 71 75 65 72  19)  The subquer
17e10 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c  y does not use L
17e20 49 4d 49 54 20 6f 72 20 74 68 65 20 6f 75 74 65  IMIT or the oute
17e30 72 20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  r query does not
17e40 0a 2a 2a 20 20 20 20 20 20 20 20 68 61 76 65 20  .**        have 
17e50 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a  a WHERE clause..
17e60 2a 2a 0a 2a 2a 20 20 28 32 30 29 20 20 49 66 20  **.**  (20)  If 
17e70 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 69 73  the sub-query is
17e80 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65   a compound sele
17e90 63 74 2c 20 74 68 65 6e 20 69 74 20 6d 75 73 74  ct, then it must
17ea0 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 20 20 20 20   not use.**     
17eb0 20 20 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63     an ORDER BY c
17ec0 6c 61 75 73 65 2e 20 20 54 69 63 6b 65 74 20 23  lause.  Ticket #
17ed0 33 37 37 33 2e 20 20 57 65 20 63 6f 75 6c 64 20  3773.  We could 
17ee0 72 65 6c 61 78 20 74 68 69 73 20 63 6f 6e 73 74  relax this const
17ef0 72 61 69 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20  raint.**        
17f00 73 6f 6d 65 77 68 61 74 20 62 79 20 73 61 79 69  somewhat by sayi
17f10 6e 67 20 74 68 61 74 20 74 68 65 20 74 65 72 6d  ng that the term
17f20 73 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42  s of the ORDER B
17f30 59 20 63 6c 61 75 73 65 20 6d 75 73 74 0a 2a 2a  Y clause must.**
17f40 20 20 20 20 20 20 20 20 61 70 70 65 61 72 20 61          appear a
17f50 73 20 75 6e 6d 6f 64 69 66 69 65 64 20 72 65 73  s unmodified res
17f60 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74  ult columns in t
17f70 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 20  he outer query. 
17f80 20 42 75 74 20 77 65 0a 2a 2a 20 20 20 20 20 20   But we.**      
17f90 20 20 68 61 76 65 20 6f 74 68 65 72 20 6f 70 74    have other opt
17fa0 69 6d 69 7a 61 74 69 6f 6e 73 20 69 6e 20 6d 69  imizations in mi
17fb0 6e 64 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20  nd to deal with 
17fc0 74 68 61 74 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a  that case..**.**
17fd0 20 20 28 32 31 29 20 20 54 68 65 20 73 75 62 71    (21)  The subq
17fe0 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73  uery does not us
17ff0 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65 20 6f  e LIMIT or the o
18000 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f  uter query is no
18010 74 0a 2a 2a 20 20 20 20 20 20 20 20 44 49 53 54  t.**        DIST
18020 49 4e 43 54 2e 20 20 28 53 65 65 20 74 69 63 6b  INCT.  (See tick
18030 65 74 20 5b 37 35 32 65 31 36 34 36 66 63 5d 29  et [752e1646fc])
18040 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20  ..**.** In this 
18050 72 6f 75 74 69 6e 65 2c 20 74 68 65 20 22 70 22  routine, the "p"
18060 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20   parameter is a 
18070 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6f  pointer to the o
18080 75 74 65 72 20 71 75 65 72 79 2e 0a 2a 2a 20 54  uter query..** T
18090 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 70  he subquery is p
180a0 2d 3e 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d  ->pSrc->a[iFrom]
180b0 2e 20 20 69 73 41 67 67 20 69 73 20 74 72 75 65  .  isAgg is true
180c0 20 69 66 20 74 68 65 20 6f 75 74 65 72 20 71 75   if the outer qu
180d0 65 72 79 0a 2a 2a 20 75 73 65 73 20 61 67 67 72  ery.** uses aggr
180e0 65 67 61 74 65 73 20 61 6e 64 20 73 75 62 71 75  egates and subqu
180f0 65 72 79 49 73 41 67 67 20 69 73 20 74 72 75 65  eryIsAgg is true
18100 20 69 66 20 74 68 65 20 73 75 62 71 75 65 72 79   if the subquery
18110 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65 73   uses aggregates
18120 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 66 6c 61 74 74  ..**.** If flatt
18130 65 6e 69 6e 67 20 69 73 20 6e 6f 74 20 61 74 74  ening is not att
18140 65 6d 70 74 65 64 2c 20 74 68 69 73 20 72 6f 75  empted, this rou
18150 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 20  tine is a no-op 
18160 61 6e 64 20 72 65 74 75 72 6e 73 20 30 2e 0a 2a  and returns 0..*
18170 2a 20 49 66 20 66 6c 61 74 74 65 6e 69 6e 67 20  * If flattening 
18180 69 73 20 61 74 74 65 6d 70 74 65 64 20 74 68 69  is attempted thi
18190 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
181a0 73 20 31 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f  s 1..**.** All o
181b0 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
181c0 20 61 6e 61 6c 79 73 69 73 20 6d 75 73 74 20 6f   analysis must o
181d0 63 63 75 72 20 6f 6e 20 62 6f 74 68 20 74 68 65  ccur on both the
181e0 20 6f 75 74 65 72 20 71 75 65 72 79 20 61 6e 64   outer query and
181f0 0a 2a 2a 20 74 68 65 20 73 75 62 71 75 65 72 79  .** the subquery
18200 20 62 65 66 6f 72 65 20 74 68 69 73 20 72 6f 75   before this rou
18210 74 69 6e 65 20 72 75 6e 73 2e 0a 2a 2f 0a 73 74  tine runs..*/.st
18220 61 74 69 63 20 69 6e 74 20 66 6c 61 74 74 65 6e  atic int flatten
18230 53 75 62 71 75 65 72 79 28 0a 20 20 50 61 72 73  Subquery(.  Pars
18240 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
18250 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
18260 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
18270 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  *p,           /*
18280 20 54 68 65 20 70 61 72 65 6e 74 20 6f 72 20 6f   The parent or o
18290 75 74 65 72 20 53 45 4c 45 43 54 20 73 74 61 74  uter SELECT stat
182a0 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69  ement */.  int i
182b0 46 72 6f 6d 2c 20 20 20 20 20 20 20 20 20 20 20  From,           
182c0 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70 2d 3e 70  /* Index in p->p
182d0 53 72 63 2d 3e 61 5b 5d 20 6f 66 20 74 68 65 20  Src->a[] of the 
182e0 69 6e 6e 65 72 20 73 75 62 71 75 65 72 79 20 2a  inner subquery *
182f0 2f 0a 20 20 69 6e 74 20 69 73 41 67 67 2c 20 20  /.  int isAgg,  
18300 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
18310 20 69 66 20 6f 75 74 65 72 20 53 45 4c 45 43 54   if outer SELECT
18320 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65 20   uses aggregate 
18330 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 69  functions */.  i
18340 6e 74 20 73 75 62 71 75 65 72 79 49 73 41 67 67  nt subqueryIsAgg
18350 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
18360 68 65 20 73 75 62 71 75 65 72 79 20 75 73 65 73  he subquery uses
18370 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
18380 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e  ions */.){.  con
18390 73 74 20 63 68 61 72 20 2a 7a 53 61 76 65 64 41  st char *zSavedA
183a0 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70 50 61  uthContext = pPa
183b0 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78  rse->zAuthContex
183c0 74 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 61  t;.  Select *pPa
183d0 72 65 6e 74 3b 0a 20 20 53 65 6c 65 63 74 20 2a  rent;.  Select *
183e0 70 53 75 62 3b 20 20 20 20 20 20 20 2f 2a 20 54  pSub;       /* T
183f0 68 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20 6f  he inner query o
18400 72 20 22 73 75 62 71 75 65 72 79 22 20 2a 2f 0a  r "subquery" */.
18410 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 31 3b    Select *pSub1;
18420 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
18430 20 74 6f 20 74 68 65 20 72 69 67 68 74 6d 6f 73   to the rightmos
18440 74 20 73 65 6c 65 63 74 20 69 6e 20 73 75 62 2d  t select in sub-
18450 71 75 65 72 79 20 2a 2f 0a 20 20 53 72 63 4c 69  query */.  SrcLi
18460 73 74 20 2a 70 53 72 63 3b 20 20 20 20 20 20 2f  st *pSrc;      /
18470 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * The FROM claus
18480 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71  e of the outer q
18490 75 65 72 79 20 2a 2f 0a 20 20 53 72 63 4c 69 73  uery */.  SrcLis
184a0 74 20 2a 70 53 75 62 53 72 63 3b 20 20 20 2f 2a  t *pSubSrc;   /*
184b0 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   The FROM clause
184c0 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79   of the subquery
184d0 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
184e0 70 4c 69 73 74 3b 20 20 20 20 2f 2a 20 54 68 65  pList;    /* The
184f0 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74   result set of t
18500 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a  he outer query *
18510 2f 0a 20 20 69 6e 74 20 69 50 61 72 65 6e 74 3b  /.  int iParent;
18520 20 20 20 20 20 20 20 20 2f 2a 20 56 44 42 45 20          /* VDBE 
18530 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66  cursor number of
18540 20 74 68 65 20 70 53 75 62 20 72 65 73 75 6c 74   the pSub result
18550 20 73 65 74 20 74 65 6d 70 20 74 61 62 6c 65 20   set temp table 
18560 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  int i;     
18570 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
18580 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 45 78   counter */.  Ex
18590 70 72 20 2a 70 57 68 65 72 65 3b 20 20 20 20 20  pr *pWhere;     
185a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
185b0 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
185c0 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  se */.  struct S
185d0 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 75  rcList_item *pSu
185e0 62 69 74 65 6d 3b 20 20 20 2f 2a 20 54 68 65 20  bitem;   /* The 
185f0 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 73 71  subquery */.  sq
18600 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
18610 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 43 68  se->db;..  /* Ch
18620 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 66 6c  eck to see if fl
18630 61 74 74 65 6e 69 6e 67 20 69 73 20 70 65 72 6d  attening is perm
18640 69 74 74 65 64 2e 20 20 52 65 74 75 72 6e 20 30  itted.  Return 0
18650 20 69 66 20 6e 6f 74 2e 0a 20 20 2a 2f 0a 20 20   if not..  */.  
18660 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a  assert( p!=0 );.
18670 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 50 72    assert( p->pPr
18680 69 6f 72 3d 3d 30 20 29 3b 20 20 2f 2a 20 55 6e  ior==0 );  /* Un
18690 61 62 6c 65 20 74 6f 20 66 6c 61 74 74 65 6e 20  able to flatten 
186a0 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 69 65 73  compound queries
186b0 20 2a 2f 0a 20 20 69 66 28 20 4f 70 74 69 6d 69   */.  if( Optimi
186c0 7a 61 74 69 6f 6e 44 69 73 61 62 6c 65 64 28 64  zationDisabled(d
186d0 62 2c 20 53 51 4c 49 54 45 5f 51 75 65 72 79 46  b, SQLITE_QueryF
186e0 6c 61 74 74 65 6e 65 72 29 20 29 20 72 65 74 75  lattener) ) retu
186f0 72 6e 20 30 3b 0a 20 20 70 53 72 63 20 3d 20 70  rn 0;.  pSrc = p
18700 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74  ->pSrc;.  assert
18710 28 20 70 53 72 63 20 26 26 20 69 46 72 6f 6d 3e  ( pSrc && iFrom>
18720 3d 30 20 26 26 20 69 46 72 6f 6d 3c 70 53 72 63  =0 && iFrom<pSrc
18730 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 70 53 75 62  ->nSrc );.  pSub
18740 69 74 65 6d 20 3d 20 26 70 53 72 63 2d 3e 61 5b  item = &pSrc->a[
18750 69 46 72 6f 6d 5d 3b 0a 20 20 69 50 61 72 65 6e  iFrom];.  iParen
18760 74 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 69 43  t = pSubitem->iC
18770 75 72 73 6f 72 3b 0a 20 20 70 53 75 62 20 3d 20  ursor;.  pSub = 
18780 70 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63  pSubitem->pSelec
18790 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 75  t;.  assert( pSu
187a0 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 69 73  b!=0 );.  if( is
187b0 41 67 67 20 26 26 20 73 75 62 71 75 65 72 79 49  Agg && subqueryI
187c0 73 41 67 67 20 29 20 72 65 74 75 72 6e 20 30 3b  sAgg ) return 0;
187d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
187e0 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
187f0 28 31 29 20 20 2a 2f 0a 20 20 69 66 28 20 73 75  (1)  */.  if( su
18800 62 71 75 65 72 79 49 73 41 67 67 20 26 26 20 70  bqueryIsAgg && p
18810 53 72 63 2d 3e 6e 53 72 63 3e 31 20 29 20 72 65  Src->nSrc>1 ) re
18820 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
18830 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
18840 28 32 29 20 20 2a 2f 0a 20 20 70 53 75 62 53 72  (2)  */.  pSubSr
18850 63 20 3d 20 70 53 75 62 2d 3e 70 53 72 63 3b 0a  c = pSub->pSrc;.
18860 20 20 61 73 73 65 72 74 28 20 70 53 75 62 53 72    assert( pSubSr
18870 63 20 29 3b 0a 20 20 2f 2a 20 50 72 69 6f 72 20  c );.  /* Prior 
18880 74 6f 20 76 65 72 73 69 6f 6e 20 33 2e 31 2e 32  to version 3.1.2
18890 2c 20 77 68 65 6e 20 4c 49 4d 49 54 20 61 6e 64  , when LIMIT and
188a0 20 4f 46 46 53 45 54 20 68 61 64 20 74 6f 20 62   OFFSET had to b
188b0 65 20 73 69 6d 70 6c 65 20 63 6f 6e 73 74 61 6e  e simple constan
188c0 74 73 2c 0a 20 20 2a 2a 20 6e 6f 74 20 61 72 62  ts,.  ** not arb
188d0 69 74 72 61 72 79 20 65 78 70 72 65 73 73 73 69  itrary expresssi
188e0 6f 6e 73 2c 20 77 65 20 61 6c 6c 6f 77 65 64 20  ons, we allowed 
188f0 73 6f 6d 65 20 63 6f 6d 62 69 6e 69 6e 67 20 6f  some combining o
18900 66 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53  f LIMIT and OFFS
18910 45 54 0a 20 20 2a 2a 20 62 65 63 61 75 73 65 20  ET.  ** because 
18920 74 68 65 79 20 63 6f 75 6c 64 20 62 65 20 63 6f  they could be co
18930 6d 70 75 74 65 64 20 61 74 20 63 6f 6d 70 69 6c  mputed at compil
18940 65 2d 74 69 6d 65 2e 20 20 42 75 74 20 77 68 65  e-time.  But whe
18950 6e 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53  n LIMIT and OFFS
18960 45 54 0a 20 20 2a 2a 20 62 65 63 61 6d 65 20 61  ET.  ** became a
18970 72 62 69 74 72 61 72 79 20 65 78 70 72 65 73 73  rbitrary express
18980 69 6f 6e 73 2c 20 77 65 20 77 65 72 65 20 66 6f  ions, we were fo
18990 72 63 65 64 20 74 6f 20 61 64 64 20 72 65 73 74  rced to add rest
189a0 72 69 63 74 69 6f 6e 73 20 28 31 33 29 0a 20 20  rictions (13).  
189b0 2a 2a 20 61 6e 64 20 28 31 34 29 2e 20 2a 2f 0a  ** and (14). */.
189c0 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d    if( pSub->pLim
189d0 69 74 20 26 26 20 70 2d 3e 70 4c 69 6d 69 74 20  it && p->pLimit 
189e0 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
189f0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
18a00 72 69 63 74 69 6f 6e 20 28 31 33 29 20 2a 2f 0a  riction (13) */.
18a10 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4f 66 66    if( pSub->pOff
18a20 73 65 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20  set ) return 0; 
18a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18a40 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
18a50 72 69 63 74 69 6f 6e 20 28 31 34 29 20 2a 2f 0a  riction (14) */.
18a60 20 20 69 66 28 20 70 2d 3e 70 52 69 67 68 74 6d    if( p->pRightm
18a70 6f 73 74 20 26 26 20 70 53 75 62 2d 3e 70 4c 69  ost && pSub->pLi
18a80 6d 69 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72  mit ){.    retur
18a90 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
18aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18ac0 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
18ad0 31 35 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28  15) */.  }.  if(
18ae0 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63 3d 3d   pSubSrc->nSrc==
18af0 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  0 ) return 0;   
18b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18b10 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
18b20 6f 6e 20 28 37 29 20 20 2a 2f 0a 20 20 69 66 28  on (7)  */.  if(
18b30 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20   pSub->selFlags 
18b40 26 20 53 46 5f 44 69 73 74 69 6e 63 74 20 29 20  & SF_Distinct ) 
18b50 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
18b60 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
18b70 6f 6e 20 28 35 29 20 20 2a 2f 0a 20 20 69 66 28  on (5)  */.  if(
18b80 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26   pSub->pLimit &&
18b90 20 28 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20 7c   (pSrc->nSrc>1 |
18ba0 7c 20 69 73 41 67 67 29 20 29 7b 0a 20 20 20 20  | isAgg) ){.    
18bb0 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
18bc0 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
18bd0 6e 73 20 28 38 29 28 39 29 20 2a 2f 0a 20 20 7d  ns (8)(9) */.  }
18be0 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c  .  if( (p->selFl
18bf0 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63  ags & SF_Distinc
18c00 74 29 21 3d 30 20 26 26 20 73 75 62 71 75 65 72  t)!=0 && subquer
18c10 79 49 73 41 67 67 20 29 7b 0a 20 20 20 20 20 72  yIsAgg ){.     r
18c20 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
18c30 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
18c40 28 36 29 20 20 2a 2f 0a 20 20 7d 0a 20 20 69 66  (6)  */.  }.  if
18c50 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 26 26  ( p->pOrderBy &&
18c60 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20   pSub->pOrderBy 
18c70 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30  ){.     return 0
18c80 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
18c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18ca0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
18cb0 65 73 74 72 69 63 74 69 6f 6e 20 28 31 31 29 20  estriction (11) 
18cc0 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 41  */.  }.  if( isA
18cd0 67 67 20 26 26 20 70 53 75 62 2d 3e 70 4f 72 64  gg && pSub->pOrd
18ce0 65 72 42 79 20 29 20 72 65 74 75 72 6e 20 30 3b  erBy ) return 0;
18cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18d00 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
18d10 31 36 29 20 2a 2f 0a 20 20 69 66 28 20 70 53 75  16) */.  if( pSu
18d20 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 70 2d 3e  b->pLimit && p->
18d30 70 57 68 65 72 65 20 29 20 72 65 74 75 72 6e 20  pWhere ) return 
18d40 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
18d50 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
18d60 31 39 29 20 2a 2f 0a 20 20 69 66 28 20 70 53 75  19) */.  if( pSu
18d70 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 28 70 2d  b->pLimit && (p-
18d80 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44  >selFlags & SF_D
18d90 69 73 74 69 6e 63 74 29 21 3d 30 20 29 7b 0a 20  istinct)!=0 ){. 
18da0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20      return 0;   
18db0 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
18dc0 74 69 6f 6e 20 28 32 31 29 20 2a 2f 0a 20 20 7d  tion (21) */.  }
18dd0 0a 0a 20 20 2f 2a 20 4f 42 53 4f 4c 45 54 45 20  ..  /* OBSOLETE 
18de0 43 4f 4d 4d 45 4e 54 20 31 3a 0a 20 20 2a 2a 20  COMMENT 1:.  ** 
18df0 52 65 73 74 72 69 63 74 69 6f 6e 20 33 3a 20 20  Restriction 3:  
18e00 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  If the subquery 
18e10 69 73 20 61 20 6a 6f 69 6e 2c 20 6d 61 6b 65 20  is a join, make 
18e20 73 75 72 65 20 74 68 65 20 73 75 62 71 75 65 72  sure the subquer
18e30 79 20 69 73 20 0a 20 20 2a 2a 20 6e 6f 74 20 75  y is .  ** not u
18e40 73 65 64 20 61 73 20 74 68 65 20 72 69 67 68 74  sed as the right
18e50 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 6e 20 6f   operand of an o
18e60 75 74 65 72 20 6a 6f 69 6e 2e 20 20 45 78 61 6d  uter join.  Exam
18e70 70 6c 65 73 20 6f 66 20 77 68 79 20 74 68 69 73  ples of why this
18e80 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 6c 6c  .  ** is not all
18e90 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  owed:.  **.  ** 
18ea0 20 20 20 20 20 20 20 20 74 31 20 4c 45 46 54 20          t1 LEFT 
18eb0 4f 55 54 45 52 20 4a 4f 49 4e 20 28 74 32 20 4a  OUTER JOIN (t2 J
18ec0 4f 49 4e 20 74 33 29 0a 20 20 2a 2a 0a 20 20 2a  OIN t3).  **.  *
18ed0 2a 20 49 66 20 77 65 20 66 6c 61 74 74 65 6e 20  * If we flatten 
18ee0 74 68 65 20 61 62 6f 76 65 2c 20 77 65 20 77 6f  the above, we wo
18ef0 75 6c 64 20 67 65 74 0a 20 20 2a 2a 0a 20 20 2a  uld get.  **.  *
18f00 2a 20 20 20 20 20 20 20 20 20 28 74 31 20 4c 45  *         (t1 LE
18f10 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 74 32  FT OUTER JOIN t2
18f20 29 20 4a 4f 49 4e 20 74 33 0a 20 20 2a 2a 0a 20  ) JOIN t3.  **. 
18f30 20 2a 2a 20 77 68 69 63 68 20 69 73 20 6e 6f 74   ** which is not
18f40 20 61 74 20 61 6c 6c 20 74 68 65 20 73 61 6d 65   at all the same
18f50 20 74 68 69 6e 67 2e 0a 20 20 2a 2a 0a 20 20 2a   thing..  **.  *
18f60 2a 20 4f 42 53 4f 4c 45 54 45 20 43 4f 4d 4d 45  * OBSOLETE COMME
18f70 4e 54 20 32 3a 0a 20 20 2a 2a 20 52 65 73 74 72  NT 2:.  ** Restr
18f80 69 63 74 69 6f 6e 20 31 32 3a 20 20 49 66 20 74  iction 12:  If t
18f90 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 74  he subquery is t
18fa0 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64  he right operand
18fb0 20 6f 66 20 61 20 6c 65 66 74 20 6f 75 74 65 72   of a left outer
18fc0 0a 20 20 2a 2a 20 6a 6f 69 6e 2c 20 6d 61 6b 65  .  ** join, make
18fd0 20 73 75 72 65 20 74 68 65 20 73 75 62 71 75 65   sure the subque
18fe0 72 79 20 68 61 73 20 6e 6f 20 57 48 45 52 45 20  ry has no WHERE 
18ff0 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 20 41 6e 20  clause..  ** An 
19000 65 78 61 6d 70 6c 65 73 20 6f 66 20 77 68 79 20  examples of why 
19010 74 68 69 73 20 69 73 20 6e 6f 74 20 61 6c 6c 6f  this is not allo
19020 77 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  wed:.  **.  **  
19030 20 20 20 20 20 20 20 74 31 20 4c 45 46 54 20 4f         t1 LEFT O
19040 55 54 45 52 20 4a 4f 49 4e 20 28 53 45 4c 45 43  UTER JOIN (SELEC
19050 54 20 2a 20 46 52 4f 4d 20 74 32 20 57 48 45 52  T * FROM t2 WHER
19060 45 20 74 32 2e 78 3e 30 29 0a 20 20 2a 2a 0a 20  E t2.x>0).  **. 
19070 20 2a 2a 20 49 66 20 77 65 20 66 6c 61 74 74 65   ** If we flatte
19080 6e 20 74 68 65 20 61 62 6f 76 65 2c 20 77 65 20  n the above, we 
19090 77 6f 75 6c 64 20 67 65 74 0a 20 20 2a 2a 0a 20  would get.  **. 
190a0 20 2a 2a 20 20 20 20 20 20 20 20 20 28 74 31 20   **         (t1 
190b0 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20  LEFT OUTER JOIN 
190c0 74 32 29 20 57 48 45 52 45 20 74 32 2e 78 3e 30  t2) WHERE t2.x>0
190d0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 42 75 74 20 74  .  **.  ** But t
190e0 68 65 20 74 32 2e 78 3e 30 20 74 65 73 74 20 77  he t2.x>0 test w
190f0 69 6c 6c 20 61 6c 77 61 79 73 20 66 61 69 6c 20  ill always fail 
19100 6f 6e 20 61 20 4e 55 4c 4c 20 72 6f 77 20 6f 66  on a NULL row of
19110 20 74 32 2c 20 77 68 69 63 68 0a 20 20 2a 2a 20   t2, which.  ** 
19120 65 66 66 65 63 74 69 76 65 6c 79 20 63 6f 6e 76  effectively conv
19130 65 72 74 73 20 74 68 65 20 4f 55 54 45 52 20 4a  erts the OUTER J
19140 4f 49 4e 20 69 6e 74 6f 20 61 6e 20 49 4e 4e 45  OIN into an INNE
19150 52 20 4a 4f 49 4e 2e 0a 20 20 2a 2a 0a 20 20 2a  R JOIN..  **.  *
19160 2a 20 54 48 49 53 20 4f 56 45 52 52 49 44 45 53  * THIS OVERRIDES
19170 20 4f 42 53 4f 4c 45 54 45 20 43 4f 4d 4d 45 4e   OBSOLETE COMMEN
19180 54 53 20 31 20 41 4e 44 20 32 20 41 42 4f 56 45  TS 1 AND 2 ABOVE
19190 3a 0a 20 20 2a 2a 20 54 69 63 6b 65 74 20 23 33  :.  ** Ticket #3
191a0 33 30 30 20 73 68 6f 77 73 20 74 68 61 74 20 66  300 shows that f
191b0 6c 61 74 74 65 6e 69 6e 67 20 74 68 65 20 72 69  lattening the ri
191c0 67 68 74 20 74 65 72 6d 20 6f 66 20 61 20 4c 45  ght term of a LE
191d0 46 54 20 4a 4f 49 4e 0a 20 20 2a 2a 20 69 73 20  FT JOIN.  ** is 
191e0 66 72 61 75 67 68 74 20 77 69 74 68 20 64 61 6e  fraught with dan
191f0 67 65 72 2e 20 20 42 65 73 74 20 74 6f 20 61 76  ger.  Best to av
19200 6f 69 64 20 74 68 65 20 77 68 6f 6c 65 20 74 68  oid the whole th
19210 69 6e 67 2e 20 20 49 66 20 74 68 65 0a 20 20 2a  ing.  If the.  *
19220 2a 20 73 75 62 71 75 65 72 79 20 69 73 20 74 68  * subquery is th
19230 65 20 72 69 67 68 74 20 74 65 72 6d 20 6f 66 20  e right term of 
19240 61 20 4c 45 46 54 20 4a 4f 49 4e 2c 20 74 68 65  a LEFT JOIN, the
19250 6e 20 64 6f 20 6e 6f 74 20 66 6c 61 74 74 65 6e  n do not flatten
19260 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 53  ..  */.  if( (pS
19270 75 62 69 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65  ubitem->jointype
19280 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30 20   & JT_OUTER)!=0 
19290 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
192a0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 74 72  .  }..  /* Restr
192b0 69 63 74 69 6f 6e 20 31 37 3a 20 49 66 20 74 68  iction 17: If th
192c0 65 20 73 75 62 2d 71 75 65 72 79 20 69 73 20 61  e sub-query is a
192d0 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   compound SELECT
192e0 2c 20 74 68 65 6e 20 69 74 20 6d 75 73 74 0a 20  , then it must. 
192f0 20 2a 2a 20 75 73 65 20 6f 6e 6c 79 20 74 68 65   ** use only the
19300 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61   UNION ALL opera
19310 74 6f 72 2e 20 41 6e 64 20 6e 6f 6e 65 20 6f 66  tor. And none of
19320 20 74 68 65 20 73 69 6d 70 6c 65 20 73 65 6c 65   the simple sele
19330 63 74 20 71 75 65 72 69 65 73 0a 20 20 2a 2a 20  ct queries.  ** 
19340 74 68 61 74 20 6d 61 6b 65 20 75 70 20 74 68 65  that make up the
19350 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   compound SELECT
19360 20 61 72 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20   are allowed to 
19370 62 65 20 61 67 67 72 65 67 61 74 65 20 6f 72 20  be aggregate or 
19380 64 69 73 74 69 6e 63 74 0a 20 20 2a 2a 20 71 75  distinct.  ** qu
19390 65 72 69 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  eries..  */.  if
193a0 28 20 70 53 75 62 2d 3e 70 50 72 69 6f 72 20 29  ( pSub->pPrior )
193b0 7b 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e  {.    if( pSub->
193c0 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
193d0 20 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20    return 0;  /* 
193e0 52 65 73 74 72 69 63 74 69 6f 6e 20 32 30 20 2a  Restriction 20 *
193f0 2f 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  /.    }.    if( 
19400 69 73 41 67 67 20 7c 7c 20 28 70 2d 3e 73 65 6c  isAgg || (p->sel
19410 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69  Flags & SF_Disti
19420 6e 63 74 29 21 3d 30 20 7c 7c 20 70 53 72 63 2d  nct)!=0 || pSrc-
19430 3e 6e 53 72 63 21 3d 31 20 29 7b 0a 20 20 20 20  >nSrc!=1 ){.    
19440 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
19450 7d 0a 20 20 20 20 66 6f 72 28 70 53 75 62 31 3d  }.    for(pSub1=
19460 70 53 75 62 3b 20 70 53 75 62 31 3b 20 70 53 75  pSub; pSub1; pSu
19470 62 31 3d 70 53 75 62 31 2d 3e 70 50 72 69 6f 72  b1=pSub1->pPrior
19480 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  ){.      testcas
19490 65 28 20 28 70 53 75 62 31 2d 3e 73 65 6c 46 6c  e( (pSub1->selFl
194a0 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e  ags & (SF_Distin
194b0 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29  ct|SF_Aggregate)
194c0 29 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74 20 29  )==SF_Distinct )
194d0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
194e0 28 20 28 70 53 75 62 31 2d 3e 73 65 6c 46 6c 61  ( (pSub1->selFla
194f0 67 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63  gs & (SF_Distinc
19500 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 29  t|SF_Aggregate))
19510 3d 3d 53 46 5f 41 67 67 72 65 67 61 74 65 20 29  ==SF_Aggregate )
19520 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
19530 70 53 75 62 2d 3e 70 53 72 63 21 3d 30 20 29 3b  pSub->pSrc!=0 );
19540 0a 20 20 20 20 20 20 69 66 28 20 28 70 53 75 62  .      if( (pSub
19550 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53  1->selFlags & (S
19560 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67  F_Distinct|SF_Ag
19570 67 72 65 67 61 74 65 29 29 21 3d 30 0a 20 20 20  gregate))!=0.   
19580 20 20 20 20 7c 7c 20 28 70 53 75 62 31 2d 3e 70      || (pSub1->p
19590 50 72 69 6f 72 20 26 26 20 70 53 75 62 31 2d 3e  Prior && pSub1->
195a0 6f 70 21 3d 54 4b 5f 41 4c 4c 29 20 0a 20 20 20  op!=TK_ALL) .   
195b0 20 20 20 20 7c 7c 20 70 53 75 62 31 2d 3e 70 53      || pSub1->pS
195c0 72 63 2d 3e 6e 53 72 63 3c 31 0a 20 20 20 20 20  rc->nSrc<1.     
195d0 20 20 7c 7c 20 70 53 75 62 2d 3e 70 45 4c 69 73    || pSub->pELis
195e0 74 2d 3e 6e 45 78 70 72 21 3d 70 53 75 62 31 2d  t->nExpr!=pSub1-
195f0 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 0a 20  >pEList->nExpr. 
19600 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
19610 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
19620 7d 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  }.      testcase
19630 28 20 70 53 75 62 31 2d 3e 70 53 72 63 2d 3e 6e  ( pSub1->pSrc->n
19640 53 72 63 3e 31 20 29 3b 0a 20 20 20 20 7d 0a 0a  Src>1 );.    }..
19650 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
19660 6f 6e 20 31 38 2e 20 2a 2f 0a 20 20 20 20 69 66  on 18. */.    if
19670 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b  ( p->pOrderBy ){
19680 0a 20 20 20 20 20 20 69 6e 74 20 69 69 3b 0a 20  .      int ii;. 
19690 20 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69       for(ii=0; i
196a0 69 3c 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e  i<p->pOrderBy->n
196b0 45 78 70 72 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  Expr; ii++){.   
196c0 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 72 64       if( p->pOrd
196d0 65 72 42 79 2d 3e 61 5b 69 69 5d 2e 69 4f 72 64  erBy->a[ii].iOrd
196e0 65 72 42 79 43 6f 6c 3d 3d 30 20 29 20 72 65 74  erByCol==0 ) ret
196f0 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 0;.      }. 
19700 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 2a 2a     }.  }..  /***
19710 2a 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74  ** If we reach t
19720 68 69 73 20 70 6f 69 6e 74 2c 20 66 6c 61 74 74  his point, flatt
19730 65 6e 69 6e 67 20 69 73 20 70 65 72 6d 69 74 74  ening is permitt
19740 65 64 2e 20 2a 2a 2a 2a 2a 2f 0a 0a 20 20 2f 2a  ed. *****/..  /*
19750 20 41 75 74 68 6f 72 69 7a 65 20 74 68 65 20 73   Authorize the s
19760 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 70 50 61  ubquery */.  pPa
19770 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78  rse->zAuthContex
19780 74 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e  t = pSubitem->zN
19790 61 6d 65 3b 0a 20 20 54 45 53 54 4f 4e 4c 59 28  ame;.  TESTONLY(
197a0 69 20 3d 29 20 73 71 6c 69 74 65 33 41 75 74 68  i =) sqlite3Auth
197b0 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
197c0 4c 49 54 45 5f 53 45 4c 45 43 54 2c 20 30 2c 20  LITE_SELECT, 0, 
197d0 30 2c 20 30 29 3b 0a 20 20 74 65 73 74 63 61 73  0, 0);.  testcas
197e0 65 28 20 69 3d 3d 53 51 4c 49 54 45 5f 44 45 4e  e( i==SQLITE_DEN
197f0 59 20 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 7a  Y );.  pParse->z
19800 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 7a 53  AuthContext = zS
19810 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74 3b  avedAuthContext;
19820 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 73 75  ..  /* If the su
19830 62 2d 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d  b-query is a com
19840 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 73 74 61  pound SELECT sta
19850 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20 28 62 79  tement, then (by
19860 20 72 65 73 74 72 69 63 74 69 6f 6e 73 0a 20 20   restrictions.  
19870 2a 2a 20 31 37 20 61 6e 64 20 31 38 20 61 62 6f  ** 17 and 18 abo
19880 76 65 29 20 69 74 20 6d 75 73 74 20 62 65 20 61  ve) it must be a
19890 20 55 4e 49 4f 4e 20 41 4c 4c 20 61 6e 64 20 74   UNION ALL and t
198a0 68 65 20 70 61 72 65 6e 74 20 71 75 65 72 79 20  he parent query 
198b0 6d 75 73 74 20 0a 20 20 2a 2a 20 62 65 20 6f 66  must .  ** be of
198c0 20 74 68 65 20 66 6f 72 6d 3a 0a 20 20 2a 2a 0a   the form:.  **.
198d0 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20    **     SELECT 
198e0 3c 65 78 70 72 2d 6c 69 73 74 3e 20 46 52 4f 4d  <expr-list> FROM
198f0 20 28 3c 73 75 62 2d 71 75 65 72 79 3e 29 20 3c   (<sub-query>) <
19900 77 68 65 72 65 2d 63 6c 61 75 73 65 3e 20 0a 20  where-clause> . 
19910 20 2a 2a 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 65   **.  ** followe
19920 64 20 62 79 20 61 6e 79 20 4f 52 44 45 52 20 42  d by any ORDER B
19930 59 2c 20 4c 49 4d 49 54 20 61 6e 64 2f 6f 72 20  Y, LIMIT and/or 
19940 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73 2e 20  OFFSET clauses. 
19950 54 68 69 73 20 62 6c 6f 63 6b 0a 20 20 2a 2a 20  This block.  ** 
19960 63 72 65 61 74 65 73 20 4e 2d 31 20 63 6f 70 69  creates N-1 copi
19970 65 73 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74  es of the parent
19980 20 71 75 65 72 79 20 77 69 74 68 6f 75 74 20 61   query without a
19990 6e 79 20 4f 52 44 45 52 20 42 59 2c 20 4c 49 4d  ny ORDER BY, LIM
199a0 49 54 20 6f 72 20 0a 20 20 2a 2a 20 4f 46 46 53  IT or .  ** OFFS
199b0 45 54 20 63 6c 61 75 73 65 73 20 61 6e 64 20 6a  ET clauses and j
199c0 6f 69 6e 73 20 74 68 65 6d 20 74 6f 20 74 68 65  oins them to the
199d0 20 6c 65 66 74 2d 68 61 6e 64 2d 73 69 64 65 20   left-hand-side 
199e0 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a  of the original.
199f0 20 20 2a 2a 20 75 73 69 6e 67 20 55 4e 49 4f 4e    ** using UNION
19a00 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72 73 2e 20   ALL operators. 
19a10 49 6e 20 74 68 69 73 20 63 61 73 65 20 4e 20 69  In this case N i
19a20 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
19a30 73 69 6d 70 6c 65 0a 20 20 2a 2a 20 73 65 6c 65  simple.  ** sele
19a40 63 74 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e  ct statements in
19a50 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 75   the compound su
19a60 62 2d 71 75 65 72 79 2e 0a 20 20 2a 2a 0a 20 20  b-query..  **.  
19a70 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a  ** Example:.  **
19a80 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  .  **     SELECT
19a90 20 61 2b 31 20 46 52 4f 4d 20 28 0a 20 20 2a 2a   a+1 FROM (.  **
19aa0 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 78          SELECT x
19ab0 20 46 52 4f 4d 20 74 61 62 0a 20 20 2a 2a 20 20   FROM tab.  **  
19ac0 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a        UNION ALL.
19ad0 20 20 2a 2a 20 20 20 20 20 20 20 20 53 45 4c 45    **        SELE
19ae0 43 54 20 79 20 46 52 4f 4d 20 74 61 62 0a 20 20  CT y FROM tab.  
19af0 2a 2a 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20  **        UNION 
19b00 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 20 20 20  ALL.  **        
19b10 53 45 4c 45 43 54 20 61 62 73 28 7a 2a 32 29 20  SELECT abs(z*2) 
19b20 46 52 4f 4d 20 74 61 62 32 0a 20 20 2a 2a 20 20  FROM tab2.  **  
19b30 20 20 20 29 20 57 48 45 52 45 20 61 21 3d 35 20     ) WHERE a!=5 
19b40 4f 52 44 45 52 20 42 59 20 31 0a 20 20 2a 2a 0a  ORDER BY 1.  **.
19b50 20 20 2a 2a 20 54 72 61 6e 73 66 6f 72 6d 65 64    ** Transformed
19b60 20 69 6e 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a   into:.  **.  **
19b70 20 20 20 20 20 53 45 4c 45 43 54 20 78 2b 31 20       SELECT x+1 
19b80 46 52 4f 4d 20 74 61 62 20 57 48 45 52 45 20 78  FROM tab WHERE x
19b90 2b 31 21 3d 35 0a 20 20 2a 2a 20 20 20 20 20 55  +1!=5.  **     U
19ba0 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20  NION ALL.  **   
19bb0 20 20 53 45 4c 45 43 54 20 79 2b 31 20 46 52 4f    SELECT y+1 FRO
19bc0 4d 20 74 61 62 20 57 48 45 52 45 20 79 2b 31 21  M tab WHERE y+1!
19bd0 3d 35 0a 20 20 2a 2a 20 20 20 20 20 55 4e 49 4f  =5.  **     UNIO
19be0 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 53  N ALL.  **     S
19bf0 45 4c 45 43 54 20 61 62 73 28 7a 2a 32 29 2b 31  ELECT abs(z*2)+1
19c00 20 46 52 4f 4d 20 74 61 62 32 20 57 48 45 52 45   FROM tab2 WHERE
19c10 20 61 62 73 28 7a 2a 32 29 2b 31 21 3d 35 0a 20   abs(z*2)+1!=5. 
19c20 20 2a 2a 20 20 20 20 20 4f 52 44 45 52 20 42 59   **     ORDER BY
19c30 20 31 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 65 20   1.  **.  ** We 
19c40 63 61 6c 6c 20 74 68 69 73 20 74 68 65 20 22 63  call this the "c
19c50 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65 72 79  ompound-subquery
19c60 20 66 6c 61 74 74 65 6e 69 6e 67 22 2e 0a 20 20   flattening"..  
19c70 2a 2f 0a 20 20 66 6f 72 28 70 53 75 62 3d 70 53  */.  for(pSub=pS
19c80 75 62 2d 3e 70 50 72 69 6f 72 3b 20 70 53 75 62  ub->pPrior; pSub
19c90 3b 20 70 53 75 62 3d 70 53 75 62 2d 3e 70 50 72  ; pSub=pSub->pPr
19ca0 69 6f 72 29 7b 0a 20 20 20 20 53 65 6c 65 63 74  ior){.    Select
19cb0 20 2a 70 4e 65 77 3b 0a 20 20 20 20 45 78 70 72   *pNew;.    Expr
19cc0 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d  List *pOrderBy =
19cd0 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20   p->pOrderBy;.  
19ce0 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 20 3d    Expr *pLimit =
19cf0 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20   p->pLimit;.    
19d00 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72 20 3d  Select *pPrior =
19d10 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20   p->pPrior;.    
19d20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b  p->pOrderBy = 0;
19d30 0a 20 20 20 20 70 2d 3e 70 53 72 63 20 3d 20 30  .    p->pSrc = 0
19d40 3b 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20  ;.    p->pPrior 
19d50 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 4c 69 6d  = 0;.    p->pLim
19d60 69 74 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77  it = 0;.    pNew
19d70 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
19d80 44 75 70 28 64 62 2c 20 70 2c 20 30 29 3b 0a 20  Dup(db, p, 0);. 
19d90 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70     p->pLimit = p
19da0 4c 69 6d 69 74 3b 0a 20 20 20 20 70 2d 3e 70 4f  Limit;.    p->pO
19db0 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42  rderBy = pOrderB
19dc0 79 3b 0a 20 20 20 20 70 2d 3e 70 53 72 63 20 3d  y;.    p->pSrc =
19dd0 20 70 53 72 63 3b 0a 20 20 20 20 70 2d 3e 6f 70   pSrc;.    p->op
19de0 20 3d 20 54 4b 5f 41 4c 4c 3b 0a 20 20 20 20 70   = TK_ALL;.    p
19df0 2d 3e 70 52 69 67 68 74 6d 6f 73 74 20 3d 20 30  ->pRightmost = 0
19e00 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d  ;.    if( pNew==
19e10 30 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 20  0 ){.      pNew 
19e20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 7d 65  = pPrior;.    }e
19e30 6c 73 65 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d  lse{.      pNew-
19e40 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72  >pPrior = pPrior
19e50 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 52  ;.      pNew->pR
19e60 69 67 68 74 6d 6f 73 74 20 3d 20 30 3b 0a 20 20  ightmost = 0;.  
19e70 20 20 7d 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f    }.    p->pPrio
19e80 72 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 69 66  r = pNew;.    if
19e90 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
19ea0 65 64 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  ed ) return 1;. 
19eb0 20 7d 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 66   }..  /* Begin f
19ec0 6c 61 74 74 65 6e 69 6e 67 20 74 68 65 20 69 46  lattening the iF
19ed0 72 6f 6d 2d 74 68 20 65 6e 74 72 79 20 6f 66 20  rom-th entry of 
19ee0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
19ef0 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 6f 75 74  .  ** in the out
19f00 65 72 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20  er query..  */. 
19f10 20 70 53 75 62 20 3d 20 70 53 75 62 31 20 3d 20   pSub = pSub1 = 
19f20 70 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63  pSubitem->pSelec
19f30 74 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20  t;..  /* Delete 
19f40 74 68 65 20 74 72 61 6e 73 69 65 6e 74 20 74 61  the transient ta
19f50 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 61 73  ble structure as
19f60 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
19f70 65 0a 20 20 2a 2a 20 73 75 62 71 75 65 72 79 0a  e.  ** subquery.
19f80 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 44 62    */.  sqlite3Db
19f90 46 72 65 65 28 64 62 2c 20 70 53 75 62 69 74 65  Free(db, pSubite
19fa0 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20  m->zDatabase);. 
19fb0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
19fc0 62 2c 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61  b, pSubitem->zNa
19fd0 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  me);.  sqlite3Db
19fe0 46 72 65 65 28 64 62 2c 20 70 53 75 62 69 74 65  Free(db, pSubite
19ff0 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 70 53  m->zAlias);.  pS
1a000 75 62 69 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73  ubitem->zDatabas
1a010 65 20 3d 20 30 3b 0a 20 20 70 53 75 62 69 74 65  e = 0;.  pSubite
1a020 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20  m->zName = 0;.  
1a030 70 53 75 62 69 74 65 6d 2d 3e 7a 41 6c 69 61 73  pSubitem->zAlias
1a040 20 3d 20 30 3b 0a 20 20 70 53 75 62 69 74 65 6d   = 0;.  pSubitem
1a050 2d 3e 70 53 65 6c 65 63 74 20 3d 20 30 3b 0a 0a  ->pSelect = 0;..
1a060 20 20 2f 2a 20 44 65 66 65 72 20 64 65 6c 65 74    /* Defer delet
1a070 69 6e 67 20 74 68 65 20 54 61 62 6c 65 20 6f 62  ing the Table ob
1a080 6a 65 63 74 20 61 73 73 6f 63 69 61 74 65 64 20  ject associated 
1a090 77 69 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 75  with the.  ** su
1a0a0 62 71 75 65 72 79 20 75 6e 74 69 6c 20 63 6f 64  bquery until cod
1a0b0 65 20 67 65 6e 65 72 61 74 69 6f 6e 20 69 73 0a  e generation is.
1a0c0 20 20 2a 2a 20 63 6f 6d 70 6c 65 74 65 2c 20 73    ** complete, s
1a0d0 69 6e 63 65 20 74 68 65 72 65 20 6d 61 79 20 73  ince there may s
1a0e0 74 69 6c 6c 20 65 78 69 73 74 20 45 78 70 72 2e  till exist Expr.
1a0f0 70 54 61 62 20 65 6e 74 72 69 65 73 20 74 68 61  pTab entries tha
1a100 74 0a 20 20 2a 2a 20 72 65 66 65 72 20 74 6f 20  t.  ** refer to 
1a110 74 68 65 20 73 75 62 71 75 65 72 79 20 65 76 65  the subquery eve
1a120 6e 20 61 66 74 65 72 20 66 6c 61 74 74 65 6e 69  n after flatteni
1a130 6e 67 2e 20 20 54 69 63 6b 65 74 20 23 33 33 34  ng.  Ticket #334
1a140 36 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 70 53 75  6..  **.  ** pSu
1a150 62 69 74 65 6d 2d 3e 70 54 61 62 20 69 73 20 61  bitem->pTab is a
1a160 6c 77 61 79 73 20 6e 6f 6e 2d 4e 55 4c 4c 20 62  lways non-NULL b
1a170 79 20 74 65 73 74 20 72 65 73 74 72 69 63 74 69  y test restricti
1a180 6f 6e 73 20 61 6e 64 20 74 65 73 74 73 20 61 62  ons and tests ab
1a190 6f 76 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ove..  */.  if( 
1a1a0 41 4c 57 41 59 53 28 70 53 75 62 69 74 65 6d 2d  ALWAYS(pSubitem-
1a1b0 3e 70 54 61 62 21 3d 30 29 20 29 7b 0a 20 20 20  >pTab!=0) ){.   
1a1c0 20 54 61 62 6c 65 20 2a 70 54 61 62 54 6f 44 65   Table *pTabToDe
1a1d0 6c 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70 54  l = pSubitem->pT
1a1e0 61 62 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62  ab;.    if( pTab
1a1f0 54 6f 44 65 6c 2d 3e 6e 52 65 66 3d 3d 31 20 29  ToDel->nRef==1 )
1a200 7b 0a 20 20 20 20 20 20 50 61 72 73 65 20 2a 70  {.      Parse *p
1a210 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74  Toplevel = sqlit
1a220 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65 6c 28  e3ParseToplevel(
1a230 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 70  pParse);.      p
1a240 54 61 62 54 6f 44 65 6c 2d 3e 70 4e 65 78 74 5a  TabToDel->pNextZ
1a250 6f 6d 62 69 65 20 3d 20 70 54 6f 70 6c 65 76 65  ombie = pTopleve
1a260 6c 2d 3e 70 5a 6f 6d 62 69 65 54 61 62 3b 0a 20  l->pZombieTab;. 
1a270 20 20 20 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e       pToplevel->
1a280 70 5a 6f 6d 62 69 65 54 61 62 20 3d 20 70 54 61  pZombieTab = pTa
1a290 62 54 6f 44 65 6c 3b 0a 20 20 20 20 7d 65 6c 73  bToDel;.    }els
1a2a0 65 7b 0a 20 20 20 20 20 20 70 54 61 62 54 6f 44  e{.      pTabToD
1a2b0 65 6c 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20  el->nRef--;.    
1a2c0 7d 0a 20 20 20 20 70 53 75 62 69 74 65 6d 2d 3e  }.    pSubitem->
1a2d0 70 54 61 62 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  pTab = 0;.  }.. 
1a2e0 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   /* The followin
1a2f0 67 20 6c 6f 6f 70 20 72 75 6e 73 20 6f 6e 63 65  g loop runs once
1a300 20 66 6f 72 20 65 61 63 68 20 74 65 72 6d 20 69   for each term i
1a310 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 2d 73 75 62  n a compound-sub
1a320 71 75 65 72 79 0a 20 20 2a 2a 20 66 6c 61 74 74  query.  ** flatt
1a330 65 6e 69 6e 67 20 28 61 73 20 64 65 73 63 72 69  ening (as descri
1a340 62 65 64 20 61 62 6f 76 65 29 2e 20 20 49 66 20  bed above).  If 
1a350 77 65 20 61 72 65 20 64 6f 69 6e 67 20 61 20 64  we are doing a d
1a360 69 66 66 65 72 65 6e 74 20 6b 69 6e 64 0a 20 20  ifferent kind.  
1a370 2a 2a 20 6f 66 20 66 6c 61 74 74 65 6e 69 6e 67  ** of flattening
1a380 20 2d 20 61 20 66 6c 61 74 74 65 6e 69 6e 67 20   - a flattening 
1a390 6f 74 68 65 72 20 74 68 61 6e 20 61 20 63 6f 6d  other than a com
1a3a0 70 6f 75 6e 64 2d 73 75 62 71 75 65 72 79 20 66  pound-subquery f
1a3b0 6c 61 74 74 65 6e 69 6e 67 20 2d 0a 20 20 2a 2a  lattening -.  **
1a3c0 20 74 68 65 6e 20 74 68 69 73 20 6c 6f 6f 70 20   then this loop 
1a3d0 6f 6e 6c 79 20 72 75 6e 73 20 6f 6e 63 65 2e 0a  only runs once..
1a3e0 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 6c    **.  ** This l
1a3f0 6f 6f 70 20 6d 6f 76 65 73 20 61 6c 6c 20 6f 66  oop moves all of
1a400 20 74 68 65 20 46 52 4f 4d 20 65 6c 65 6d 65 6e   the FROM elemen
1a410 74 73 20 6f 66 20 74 68 65 20 73 75 62 71 75 65  ts of the subque
1a420 72 79 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a  ry into the.  **
1a430 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
1a440 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75   of the outer qu
1a450 65 72 79 2e 20 20 42 65 66 6f 72 65 20 64 6f 69  ery.  Before doi
1a460 6e 67 20 74 68 69 73 2c 20 72 65 6d 65 6d 62 65  ng this, remembe
1a470 72 0a 20 20 2a 2a 20 74 68 65 20 63 75 72 73 6f  r.  ** the curso
1a480 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65  r number for the
1a490 20 6f 72 69 67 69 6e 61 6c 20 6f 75 74 65 72 20   original outer 
1a4a0 71 75 65 72 79 20 46 52 4f 4d 20 65 6c 65 6d 65  query FROM eleme
1a4b0 6e 74 20 69 6e 0a 20 20 2a 2a 20 69 50 61 72 65  nt in.  ** iPare
1a4c0 6e 74 2e 20 20 54 68 65 20 69 50 61 72 65 6e 74  nt.  The iParent
1a4d0 20 63 75 72 73 6f 72 20 77 69 6c 6c 20 6e 65 76   cursor will nev
1a4e0 65 72 20 62 65 20 75 73 65 64 2e 20 20 53 75 62  er be used.  Sub
1a4f0 73 65 71 75 65 6e 74 20 63 6f 64 65 0a 20 20 2a  sequent code.  *
1a500 2a 20 77 69 6c 6c 20 73 63 61 6e 20 65 78 70 72  * will scan expr
1a510 65 73 73 69 6f 6e 73 20 6c 6f 6f 6b 69 6e 67 20  essions looking 
1a520 66 6f 72 20 69 50 61 72 65 6e 74 20 72 65 66 65  for iParent refe
1a530 72 65 6e 63 65 73 20 61 6e 64 20 72 65 70 6c 61  rences and repla
1a540 63 65 0a 20 20 2a 2a 20 74 68 6f 73 65 20 72 65  ce.  ** those re
1a550 66 65 72 65 6e 63 65 73 20 77 69 74 68 20 65 78  ferences with ex
1a560 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20 72  pressions that r
1a570 65 73 6f 6c 76 65 20 74 6f 20 74 68 65 20 73 75  esolve to the su
1a580 62 71 75 65 72 79 20 46 52 4f 4d 0a 20 20 2a 2a  bquery FROM.  **
1a590 20 65 6c 65 6d 65 6e 74 73 20 77 65 20 61 72 65   elements we are
1a5a0 20 6e 6f 77 20 63 6f 70 79 69 6e 67 20 69 6e 2e   now copying in.
1a5b0 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 50 61 72  .  */.  for(pPar
1a5c0 65 6e 74 3d 70 3b 20 70 50 61 72 65 6e 74 3b 20  ent=p; pParent; 
1a5d0 70 50 61 72 65 6e 74 3d 70 50 61 72 65 6e 74 2d  pParent=pParent-
1a5e0 3e 70 50 72 69 6f 72 2c 20 70 53 75 62 3d 70 53  >pPrior, pSub=pS
1a5f0 75 62 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20  ub->pPrior){.   
1a600 20 69 6e 74 20 6e 53 75 62 53 72 63 3b 0a 20 20   int nSubSrc;.  
1a610 20 20 75 38 20 6a 6f 69 6e 74 79 70 65 20 3d 20    u8 jointype = 
1a620 30 3b 0a 20 20 20 20 70 53 75 62 53 72 63 20 3d  0;.    pSubSrc =
1a630 20 70 53 75 62 2d 3e 70 53 72 63 3b 20 20 20 20   pSub->pSrc;    
1a640 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20   /* FROM clause 
1a650 6f 66 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20  of subquery */. 
1a660 20 20 20 6e 53 75 62 53 72 63 20 3d 20 70 53 75     nSubSrc = pSu
1a670 62 53 72 63 2d 3e 6e 53 72 63 3b 20 20 2f 2a 20  bSrc->nSrc;  /* 
1a680 4e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 20  Number of terms 
1a690 69 6e 20 73 75 62 71 75 65 72 79 20 46 52 4f 4d  in subquery FROM
1a6a0 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 70   clause */.    p
1a6b0 53 72 63 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70  Src = pParent->p
1a6c0 53 72 63 3b 20 20 20 20 20 2f 2a 20 46 52 4f 4d  Src;     /* FROM
1a6d0 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f   clause of the o
1a6e0 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 0a 20  uter query */.. 
1a6f0 20 20 20 69 66 28 20 70 53 72 63 20 29 7b 0a 20     if( pSrc ){. 
1a700 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
1a710 72 65 6e 74 3d 3d 70 20 29 3b 20 20 2f 2a 20 46  rent==p );  /* F
1a720 69 72 73 74 20 74 69 6d 65 20 74 68 72 6f 75 67  irst time throug
1a730 68 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20  h the loop */.  
1a740 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d 20 70      jointype = p
1a750 53 75 62 69 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70  Subitem->jointyp
1a760 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  e;.    }else{.  
1a770 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
1a780 65 6e 74 21 3d 70 20 29 3b 20 20 2f 2a 20 32 6e  ent!=p );  /* 2n
1a790 64 20 61 6e 64 20 73 75 62 73 65 71 75 65 6e 74  d and subsequent
1a7a0 20 74 69 6d 65 73 20 74 68 72 6f 75 67 68 20 74   times through t
1a7b0 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20  he loop */.     
1a7c0 20 70 53 72 63 20 3d 20 70 50 61 72 65 6e 74 2d   pSrc = pParent-
1a7d0 3e 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53  >pSrc = sqlite3S
1a7e0 72 63 4c 69 73 74 41 70 70 65 6e 64 28 64 62 2c  rcListAppend(db,
1a7f0 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20   0, 0, 0);.     
1a800 20 69 66 28 20 70 53 72 63 3d 3d 30 20 29 7b 0a   if( pSrc==0 ){.
1a810 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1a820 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1a830 20 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61   );.        brea
1a840 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
1a850 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 73 75 62  ..    /* The sub
1a860 71 75 65 72 79 20 75 73 65 73 20 61 20 73 69 6e  query uses a sin
1a870 67 6c 65 20 73 6c 6f 74 20 6f 66 20 74 68 65 20  gle slot of the 
1a880 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74  FROM clause of t
1a890 68 65 20 6f 75 74 65 72 0a 20 20 20 20 2a 2a 20  he outer.    ** 
1a8a0 71 75 65 72 79 2e 20 20 49 66 20 74 68 65 20 73  query.  If the s
1a8b0 75 62 71 75 65 72 79 20 68 61 73 20 6d 6f 72 65  ubquery has more
1a8c0 20 74 68 61 6e 20 6f 6e 65 20 65 6c 65 6d 65 6e   than one elemen
1a8d0 74 20 69 6e 20 69 74 73 20 46 52 4f 4d 20 63 6c  t in its FROM cl
1a8e0 61 75 73 65 2c 0a 20 20 20 20 2a 2a 20 74 68 65  ause,.    ** the
1a8f0 6e 20 65 78 70 61 6e 64 20 74 68 65 20 6f 75 74  n expand the out
1a900 65 72 20 71 75 65 72 79 20 74 6f 20 6d 61 6b 65  er query to make
1a910 20 73 70 61 63 65 20 66 6f 72 20 69 74 20 74 6f   space for it to
1a920 20 68 6f 6c 64 20 61 6c 6c 20 65 6c 65 6d 65 6e   hold all elemen
1a930 74 73 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  ts.    ** of the
1a940 20 73 75 62 71 75 65 72 79 2e 0a 20 20 20 20 2a   subquery..    *
1a950 2a 0a 20 20 20 20 2a 2a 20 45 78 61 6d 70 6c 65  *.    ** Example
1a960 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
1a970 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
1a980 20 74 61 62 41 2c 20 28 53 45 4c 45 43 54 20 2a   tabA, (SELECT *
1a990 20 46 52 4f 4d 20 73 75 62 31 2c 20 73 75 62 32   FROM sub1, sub2
1a9a0 29 2c 20 74 61 62 42 3b 0a 20 20 20 20 2a 2a 0a  ), tabB;.    **.
1a9b0 20 20 20 20 2a 2a 20 54 68 65 20 6f 75 74 65 72      ** The outer
1a9c0 20 71 75 65 72 79 20 68 61 73 20 33 20 73 6c 6f   query has 3 slo
1a9d0 74 73 20 69 6e 20 69 74 73 20 46 52 4f 4d 20 63  ts in its FROM c
1a9e0 6c 61 75 73 65 2e 20 20 4f 6e 65 20 73 6c 6f 74  lause.  One slot
1a9f0 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f   of the.    ** o
1aa00 75 74 65 72 20 71 75 65 72 79 20 28 74 68 65 20  uter query (the 
1aa10 6d 69 64 64 6c 65 20 73 6c 6f 74 29 20 69 73 20  middle slot) is 
1aa20 75 73 65 64 20 62 79 20 74 68 65 20 73 75 62 71  used by the subq
1aa30 75 65 72 79 2e 20 20 54 68 65 20 6e 65 78 74 0a  uery.  The next.
1aa40 20 20 20 20 2a 2a 20 62 6c 6f 63 6b 20 6f 66 20      ** block of 
1aa50 63 6f 64 65 20 77 69 6c 6c 20 65 78 70 61 6e 64  code will expand
1aa60 20 74 68 65 20 6f 75 74 20 71 75 65 72 79 20 74   the out query t
1aa70 6f 20 34 20 73 6c 6f 74 73 2e 20 20 54 68 65 20  o 4 slots.  The 
1aa80 6d 69 64 64 6c 65 0a 20 20 20 20 2a 2a 20 73 6c  middle.    ** sl
1aa90 6f 74 20 69 73 20 65 78 70 61 6e 64 65 64 20 74  ot is expanded t
1aaa0 6f 20 74 77 6f 20 73 6c 6f 74 73 20 69 6e 20 6f  o two slots in o
1aab0 72 64 65 72 20 74 6f 20 6d 61 6b 65 20 73 70 61  rder to make spa
1aac0 63 65 20 66 6f 72 20 74 68 65 0a 20 20 20 20 2a  ce for the.    *
1aad0 2a 20 74 77 6f 20 65 6c 65 6d 65 6e 74 73 20 69  * two elements i
1aae0 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
1aaf0 65 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72  e of the subquer
1ab00 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  y..    */.    if
1ab10 28 20 6e 53 75 62 53 72 63 3e 31 20 29 7b 0a 20  ( nSubSrc>1 ){. 
1ab20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 53       pParent->pS
1ab30 72 63 20 3d 20 70 53 72 63 20 3d 20 73 71 6c 69  rc = pSrc = sqli
1ab40 74 65 33 53 72 63 4c 69 73 74 45 6e 6c 61 72 67  te3SrcListEnlarg
1ab50 65 28 64 62 2c 20 70 53 72 63 2c 20 6e 53 75 62  e(db, pSrc, nSub
1ab60 53 72 63 2d 31 2c 69 46 72 6f 6d 2b 31 29 3b 0a  Src-1,iFrom+1);.
1ab70 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61        if( db->ma
1ab80 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
1ab90 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1aba0 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
1abb0 2f 2a 20 54 72 61 6e 73 66 65 72 20 74 68 65 20  /* Transfer the 
1abc0 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d  FROM clause term
1abd0 73 20 66 72 6f 6d 20 74 68 65 20 73 75 62 71 75  s from the subqu
1abe0 65 72 79 20 69 6e 74 6f 20 74 68 65 0a 20 20 20  ery into the.   
1abf0 20 2a 2a 20 6f 75 74 65 72 20 71 75 65 72 79 2e   ** outer query.
1ac00 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
1ac10 69 3d 30 3b 20 69 3c 6e 53 75 62 53 72 63 3b 20  i=0; i<nSubSrc; 
1ac20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  i++){.      sqli
1ac30 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28  te3IdListDelete(
1ac40 64 62 2c 20 70 53 72 63 2d 3e 61 5b 69 2b 69 46  db, pSrc->a[i+iF
1ac50 72 6f 6d 5d 2e 70 55 73 69 6e 67 29 3b 0a 20 20  rom].pUsing);.  
1ac60 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 2b 69 46      pSrc->a[i+iF
1ac70 72 6f 6d 5d 20 3d 20 70 53 75 62 53 72 63 2d 3e  rom] = pSubSrc->
1ac80 61 5b 69 5d 3b 0a 20 20 20 20 20 20 6d 65 6d 73  a[i];.      mems
1ac90 65 74 28 26 70 53 75 62 53 72 63 2d 3e 61 5b 69  et(&pSubSrc->a[i
1aca0 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 53 75  ], 0, sizeof(pSu
1acb0 62 53 72 63 2d 3e 61 5b 69 5d 29 29 3b 0a 20 20  bSrc->a[i]));.  
1acc0 20 20 7d 0a 20 20 20 20 70 53 72 63 2d 3e 61 5b    }.    pSrc->a[
1acd0 69 46 72 6f 6d 5d 2e 6a 6f 69 6e 74 79 70 65 20  iFrom].jointype 
1ace0 3d 20 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 0a 20  = jointype;.  . 
1acf0 20 20 20 2f 2a 20 4e 6f 77 20 62 65 67 69 6e 20     /* Now begin 
1ad00 73 75 62 73 74 69 74 75 74 69 6e 67 20 73 75 62  substituting sub
1ad10 71 75 65 72 79 20 72 65 73 75 6c 74 20 73 65 74  query result set
1ad20 20 65 78 70 72 65 73 73 69 6f 6e 73 20 66 6f 72   expressions for
1ad30 20 0a 20 20 20 20 2a 2a 20 72 65 66 65 72 65 6e   .    ** referen
1ad40 63 65 73 20 74 6f 20 74 68 65 20 69 50 61 72 65  ces to the iPare
1ad50 6e 74 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20  nt in the outer 
1ad60 71 75 65 72 79 2e 0a 20 20 20 20 2a 2a 20 0a 20  query..    ** . 
1ad70 20 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20     ** Example:. 
1ad80 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 53     **.    **   S
1ad90 45 4c 45 43 54 20 61 2b 35 2c 20 62 2a 31 30 20  ELECT a+5, b*10 
1ada0 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 78 2a 33  FROM (SELECT x*3
1adb0 20 41 53 20 61 2c 20 79 2b 31 30 20 41 53 20 62   AS a, y+10 AS b
1adc0 20 46 52 4f 4d 20 74 31 29 20 57 48 45 52 45 20   FROM t1) WHERE 
1add0 61 3e 62 3b 0a 20 20 20 20 2a 2a 20 20 20 5c 20  a>b;.    **   \ 
1ade0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1adf0 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f      \___________
1ae00 5f 5f 20 73 75 62 71 75 65 72 79 20 5f 5f 5f 5f  __ subquery ____
1ae10 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20 20 20 20  ______/         
1ae20 20 2f 0a 20 20 20 20 2a 2a 20 20 20 20 5c 5f 5f   /.    **    \__
1ae30 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
1ae40 5f 5f 5f 20 6f 75 74 65 72 20 71 75 65 72 79 20  ___ outer query 
1ae50 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
1ae60 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a  ______________/.
1ae70 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 57 65      **.    ** We
1ae80 20 6c 6f 6f 6b 20 61 74 20 65 76 65 72 79 20 65   look at every e
1ae90 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 65  xpression in the
1aea0 20 6f 75 74 65 72 20 71 75 65 72 79 20 61 6e 64   outer query and
1aeb0 20 65 76 65 72 79 20 70 6c 61 63 65 20 77 65 20   every place we 
1aec0 73 65 65 0a 20 20 20 20 2a 2a 20 22 61 22 20 77  see.    ** "a" w
1aed0 65 20 73 75 62 73 74 69 74 75 74 65 20 22 78 2a  e substitute "x*
1aee0 33 22 20 61 6e 64 20 65 76 65 72 79 20 70 6c 61  3" and every pla
1aef0 63 65 20 77 65 20 73 65 65 20 22 62 22 20 77 65  ce we see "b" we
1af00 20 73 75 62 73 74 69 74 75 74 65 20 22 79 2b 31   substitute "y+1
1af10 30 22 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  0"..    */.    p
1af20 4c 69 73 74 20 3d 20 70 50 61 72 65 6e 74 2d 3e  List = pParent->
1af30 70 45 4c 69 73 74 3b 0a 20 20 20 20 66 6f 72 28  pEList;.    for(
1af40 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45  i=0; i<pList->nE
1af50 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
1af60 20 69 66 28 20 70 4c 69 73 74 2d 3e 61 5b 69 5d   if( pList->a[i]
1af70 2e 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20  .zName==0 ){.   
1af80 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65       char *zName
1af90 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
1afa0 75 70 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61 5b  up(db, pList->a[
1afb0 69 5d 2e 7a 53 70 61 6e 29 3b 0a 20 20 20 20 20  i].zSpan);.     
1afc0 20 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74     sqlite3Dequot
1afd0 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  e(zName);.      
1afe0 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e    pList->a[i].zN
1aff0 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20  ame = zName;.   
1b000 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
1b010 75 62 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c  ubstExprList(db,
1b020 20 70 50 61 72 65 6e 74 2d 3e 70 45 4c 69 73 74   pParent->pEList
1b030 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d  , iParent, pSub-
1b040 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 69 66  >pEList);.    if
1b050 28 20 69 73 41 67 67 20 29 7b 0a 20 20 20 20 20  ( isAgg ){.     
1b060 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 64   substExprList(d
1b070 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 47 72 6f  b, pParent->pGro
1b080 75 70 42 79 2c 20 69 50 61 72 65 6e 74 2c 20 70  upBy, iParent, p
1b090 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  Sub->pEList);.  
1b0a0 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 48 61      pParent->pHa
1b0b0 76 69 6e 67 20 3d 20 73 75 62 73 74 45 78 70 72  ving = substExpr
1b0c0 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 48  (db, pParent->pH
1b0d0 61 76 69 6e 67 2c 20 69 50 61 72 65 6e 74 2c 20  aving, iParent, 
1b0e0 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  pSub->pEList);. 
1b0f0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 53 75     }.    if( pSu
1b100 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  b->pOrderBy ){. 
1b110 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
1b120 72 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79 3d 3d  rent->pOrderBy==
1b130 30 20 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65  0 );.      pPare
1b140 6e 74 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70  nt->pOrderBy = p
1b150 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20  Sub->pOrderBy;. 
1b160 20 20 20 20 20 70 53 75 62 2d 3e 70 4f 72 64 65       pSub->pOrde
1b170 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  rBy = 0;.    }el
1b180 73 65 20 69 66 28 20 70 50 61 72 65 6e 74 2d 3e  se if( pParent->
1b190 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
1b1a0 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28    substExprList(
1b1b0 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 4f 72  db, pParent->pOr
1b1c0 64 65 72 42 79 2c 20 69 50 61 72 65 6e 74 2c 20  derBy, iParent, 
1b1d0 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  pSub->pEList);. 
1b1e0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 53 75     }.    if( pSu
1b1f0 62 2d 3e 70 57 68 65 72 65 20 29 7b 0a 20 20 20  b->pWhere ){.   
1b200 20 20 20 70 57 68 65 72 65 20 3d 20 73 71 6c 69     pWhere = sqli
1b210 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
1b220 53 75 62 2d 3e 70 57 68 65 72 65 2c 20 30 29 3b  Sub->pWhere, 0);
1b230 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1b240 20 20 70 57 68 65 72 65 20 3d 20 30 3b 0a 20 20    pWhere = 0;.  
1b250 20 20 7d 0a 20 20 20 20 69 66 28 20 73 75 62 71    }.    if( subq
1b260 75 65 72 79 49 73 41 67 67 20 29 7b 0a 20 20 20  ueryIsAgg ){.   
1b270 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65     assert( pPare
1b280 6e 74 2d 3e 70 48 61 76 69 6e 67 3d 3d 30 20 29  nt->pHaving==0 )
1b290 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d  ;.      pParent-
1b2a0 3e 70 48 61 76 69 6e 67 20 3d 20 70 50 61 72 65  >pHaving = pPare
1b2b0 6e 74 2d 3e 70 57 68 65 72 65 3b 0a 20 20 20 20  nt->pWhere;.    
1b2c0 20 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72    pParent->pWher
1b2d0 65 20 3d 20 70 57 68 65 72 65 3b 0a 20 20 20 20  e = pWhere;.    
1b2e0 20 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69    pParent->pHavi
1b2f0 6e 67 20 3d 20 73 75 62 73 74 45 78 70 72 28 64  ng = substExpr(d
1b300 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76  b, pParent->pHav
1b310 69 6e 67 2c 20 69 50 61 72 65 6e 74 2c 20 70 53  ing, iParent, pS
1b320 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20  ub->pEList);.   
1b330 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76     pParent->pHav
1b340 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ing = sqlite3Exp
1b350 72 41 6e 64 28 64 62 2c 20 70 50 61 72 65 6e 74  rAnd(db, pParent
1b360 2d 3e 70 48 61 76 69 6e 67 2c 20 0a 20 20 20 20  ->pHaving, .    
1b370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
1b390 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
1b3a0 20 70 53 75 62 2d 3e 70 48 61 76 69 6e 67 2c 20   pSub->pHaving, 
1b3b0 30 29 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  0));.      asser
1b3c0 74 28 20 70 50 61 72 65 6e 74 2d 3e 70 47 72 6f  t( pParent->pGro
1b3d0 75 70 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20  upBy==0 );.     
1b3e0 20 70 50 61 72 65 6e 74 2d 3e 70 47 72 6f 75 70   pParent->pGroup
1b3f0 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  By = sqlite3Expr
1b400 4c 69 73 74 44 75 70 28 64 62 2c 20 70 53 75 62  ListDup(db, pSub
1b410 2d 3e 70 47 72 6f 75 70 42 79 2c 20 30 29 3b 0a  ->pGroupBy, 0);.
1b420 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1b430 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65   pParent->pWhere
1b440 20 3d 20 73 75 62 73 74 45 78 70 72 28 64 62 2c   = substExpr(db,
1b450 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65   pParent->pWhere
1b460 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d  , iParent, pSub-
1b470 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  >pEList);.      
1b480 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 20  pParent->pWhere 
1b490 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64  = sqlite3ExprAnd
1b4a0 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 57  (db, pParent->pW
1b4b0 68 65 72 65 2c 20 70 57 68 65 72 65 29 3b 0a 20  here, pWhere);. 
1b4c0 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 54     }.  .    /* T
1b4d0 68 65 20 66 6c 61 74 74 65 6e 65 64 20 71 75 65  he flattened que
1b4e0 72 79 20 69 73 20 64 69 73 74 69 6e 63 74 20 69  ry is distinct i
1b4f0 66 20 65 69 74 68 65 72 20 74 68 65 20 69 6e 6e  f either the inn
1b500 65 72 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a  er or the.    **
1b510 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20   outer query is 
1b520 64 69 73 74 69 6e 63 74 2e 20 0a 20 20 20 20 2a  distinct. .    *
1b530 2f 0a 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 73  /.    pParent->s
1b540 65 6c 46 6c 61 67 73 20 7c 3d 20 70 53 75 62 2d  elFlags |= pSub-
1b550 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44  >selFlags & SF_D
1b560 69 73 74 69 6e 63 74 3b 0a 20 20 0a 20 20 20 20  istinct;.  .    
1b570 2f 2a 0a 20 20 20 20 2a 2a 20 53 45 4c 45 43 54  /*.    ** SELECT
1b580 20 2e 2e 2e 20 46 52 4f 4d 20 28 53 45 4c 45 43   ... FROM (SELEC
1b590 54 20 2e 2e 2e 20 4c 49 4d 49 54 20 61 20 4f 46  T ... LIMIT a OF
1b5a0 46 53 45 54 20 62 29 20 4c 49 4d 49 54 20 78 20  FSET b) LIMIT x 
1b5b0 4f 46 46 53 45 54 20 79 3b 0a 20 20 20 20 2a 2a  OFFSET y;.    **
1b5c0 0a 20 20 20 20 2a 2a 20 4f 6e 65 20 69 73 20 74  .    ** One is t
1b5d0 65 6d 70 74 65 64 20 74 6f 20 74 72 79 20 74 6f  empted to try to
1b5e0 20 61 64 64 20 61 20 61 6e 64 20 62 20 74 6f 20   add a and b to 
1b5f0 63 6f 6d 62 69 6e 65 20 74 68 65 20 6c 69 6d 69  combine the limi
1b600 74 73 2e 20 20 42 75 74 20 74 68 69 73 0a 20 20  ts.  But this.  
1b610 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 77 6f    ** does not wo
1b620 72 6b 20 69 66 20 65 69 74 68 65 72 20 6c 69 6d  rk if either lim
1b630 69 74 20 69 73 20 6e 65 67 61 74 69 76 65 2e 0a  it is negative..
1b640 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
1b650 53 75 62 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20  Sub->pLimit ){. 
1b660 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 4c       pParent->pL
1b670 69 6d 69 74 20 3d 20 70 53 75 62 2d 3e 70 4c 69  imit = pSub->pLi
1b680 6d 69 74 3b 0a 20 20 20 20 20 20 70 53 75 62 2d  mit;.      pSub-
1b690 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20  >pLimit = 0;.   
1b6a0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e   }.  }..  /* Fin
1b6b0 69 61 6c 6c 79 2c 20 64 65 6c 65 74 65 20 77 68  ially, delete wh
1b6c0 61 74 20 69 73 20 6c 65 66 74 20 6f 66 20 74 68  at is left of th
1b6d0 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20 72  e subquery and r
1b6e0 65 74 75 72 6e 0a 20 20 2a 2a 20 73 75 63 63 65  eturn.  ** succe
1b6f0 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ss..  */.  sqlit
1b700 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64  e3SelectDelete(d
1b710 62 2c 20 70 53 75 62 31 29 3b 0a 0a 20 20 72 65  b, pSub1);..  re
1b720 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66  turn 1;.}.#endif
1b730 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c   /* !defined(SQL
1b740 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
1b750 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  Y) || !defined(S
1b760 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
1b770 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79   */../*.** Analy
1b780 7a 65 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  ze the SELECT st
1b790 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64 20 61  atement passed a
1b7a0 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 20 74 6f  s an argument to
1b7b0 20 73 65 65 20 69 66 20 69 74 0a 2a 2a 20 69 73   see if it.** is
1b7c0 20 61 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28   a min() or max(
1b7d0 29 20 71 75 65 72 79 2e 20 52 65 74 75 72 6e 20  ) query. Return 
1b7e0 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49  WHERE_ORDERBY_MI
1b7f0 4e 20 6f 72 20 57 48 45 52 45 5f 4f 52 44 45 52  N or WHERE_ORDER
1b800 42 59 5f 4d 41 58 20 69 66 20 0a 2a 2a 20 69 74  BY_MAX if .** it
1b810 20 69 73 2c 20 6f 72 20 30 20 6f 74 68 65 72 77   is, or 0 otherw
1b820 69 73 65 2e 20 41 74 20 70 72 65 73 65 6e 74 2c  ise. At present,
1b830 20 61 20 71 75 65 72 79 20 69 73 20 63 6f 6e 73   a query is cons
1b840 69 64 65 72 65 64 20 74 6f 20 62 65 0a 2a 2a 20  idered to be.** 
1b850 61 20 6d 69 6e 28 29 2f 6d 61 78 28 29 20 71 75  a min()/max() qu
1b860 65 72 79 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20  ery if:.**.**   
1b870 31 2e 20 54 68 65 72 65 20 69 73 20 61 20 73 69  1. There is a si
1b880 6e 67 6c 65 20 6f 62 6a 65 63 74 20 69 6e 20 74  ngle object in t
1b890 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a  he FROM clause..
1b8a0 2a 2a 0a 2a 2a 20 20 20 32 2e 20 54 68 65 72 65  **.**   2. There
1b8b0 20 69 73 20 61 20 73 69 6e 67 6c 65 20 65 78 70   is a single exp
1b8c0 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 65 20 72  ression in the r
1b8d0 65 73 75 6c 74 20 73 65 74 2c 20 61 6e 64 20 69  esult set, and i
1b8e0 74 20 69 73 0a 2a 2a 20 20 20 20 20 20 65 69 74  t is.**      eit
1b8f0 68 65 72 20 6d 69 6e 28 78 29 20 6f 72 20 6d 61  her min(x) or ma
1b900 78 28 78 29 2c 20 77 68 65 72 65 20 78 20 69 73  x(x), where x is
1b910 20 61 20 63 6f 6c 75 6d 6e 20 72 65 66 65 72 65   a column refere
1b920 6e 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75  nce..*/.static u
1b930 38 20 6d 69 6e 4d 61 78 51 75 65 72 79 28 53 65  8 minMaxQuery(Se
1b940 6c 65 63 74 20 2a 70 29 7b 0a 20 20 45 78 70 72  lect *p){.  Expr
1b950 20 2a 70 45 78 70 72 3b 0a 20 20 45 78 70 72 4c   *pExpr;.  ExprL
1b960 69 73 74 20 2a 70 45 4c 69 73 74 20 3d 20 70 2d  ist *pEList = p-
1b970 3e 70 45 4c 69 73 74 3b 0a 0a 20 20 69 66 28 20  >pEList;..  if( 
1b980 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31  pEList->nExpr!=1
1b990 20 29 20 72 65 74 75 72 6e 20 57 48 45 52 45 5f   ) return WHERE_
1b9a0 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b 0a  ORDERBY_NORMAL;.
1b9b0 20 20 70 45 78 70 72 20 3d 20 70 45 4c 69 73 74    pExpr = pEList
1b9c0 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[0].pExpr;.  
1b9d0 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  if( pExpr->op!=T
1b9e0 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29  K_AGG_FUNCTION )
1b9f0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
1ba00 20 4e 45 56 45 52 28 45 78 70 72 48 61 73 50 72   NEVER(ExprHasPr
1ba10 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
1ba20 5f 78 49 73 53 65 6c 65 63 74 29 29 20 29 20 72  _xIsSelect)) ) r
1ba30 65 74 75 72 6e 20 30 3b 0a 20 20 70 45 4c 69 73  eturn 0;.  pELis
1ba40 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  t = pExpr->x.pLi
1ba50 73 74 3b 0a 20 20 69 66 28 20 70 45 4c 69 73 74  st;.  if( pEList
1ba60 3d 3d 30 20 7c 7c 20 70 45 4c 69 73 74 2d 3e 6e  ==0 || pEList->n
1ba70 45 78 70 72 21 3d 31 20 29 20 72 65 74 75 72 6e  Expr!=1 ) return
1ba80 20 30 3b 0a 20 20 69 66 28 20 70 45 4c 69 73 74   0;.  if( pEList
1ba90 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70  ->a[0].pExpr->op
1baa0 21 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20  !=TK_AGG_COLUMN 
1bab0 29 20 72 65 74 75 72 6e 20 57 48 45 52 45 5f 4f  ) return WHERE_O
1bac0 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b 0a 20  RDERBY_NORMAL;. 
1bad0 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
1bae0 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
1baf0 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b   EP_IntValue) );
1bb00 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74  .  if( sqlite3St
1bb10 72 49 43 6d 70 28 70 45 78 70 72 2d 3e 75 2e 7a  rICmp(pExpr->u.z
1bb20 54 6f 6b 65 6e 2c 22 6d 69 6e 22 29 3d 3d 30 20  Token,"min")==0 
1bb30 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 48  ){.    return WH
1bb40 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 3b  ERE_ORDERBY_MIN;
1bb50 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c  .  }else if( sql
1bb60 69 74 65 33 53 74 72 49 43 6d 70 28 70 45 78 70  ite3StrICmp(pExp
1bb70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 22 6d 61 78  r->u.zToken,"max
1bb80 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ")==0 ){.    ret
1bb90 75 72 6e 20 57 48 45 52 45 5f 4f 52 44 45 52 42  urn WHERE_ORDERB
1bba0 59 5f 4d 41 58 3b 0a 20 20 7d 0a 20 20 72 65 74  Y_MAX;.  }.  ret
1bbb0 75 72 6e 20 57 48 45 52 45 5f 4f 52 44 45 52 42  urn WHERE_ORDERB
1bbc0 59 5f 4e 4f 52 4d 41 4c 3b 0a 7d 0a 0a 2f 2a 0a  Y_NORMAL;.}../*.
1bbd0 2a 2a 20 54 68 65 20 73 65 6c 65 63 74 20 73 74  ** The select st
1bbe0 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64 20 61  atement passed a
1bbf0 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  s the first argu
1bc00 6d 65 6e 74 20 69 73 20 61 6e 20 61 67 67 72 65  ment is an aggre
1bc10 67 61 74 65 20 71 75 65 72 79 2e 0a 2a 2a 20 54  gate query..** T
1bc20 68 65 20 73 65 63 6f 6e 64 20 61 72 67 6d 65 6e  he second argmen
1bc30 74 20 69 73 20 74 68 65 20 61 73 73 6f 63 69 61  t is the associa
1bc40 74 65 64 20 61 67 67 72 65 67 61 74 65 2d 69 6e  ted aggregate-in
1bc50 66 6f 20 6f 62 6a 65 63 74 2e 20 54 68 69 73 20  fo object. This 
1bc60 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 74 65 73  .** function tes
1bc70 74 73 20 69 66 20 74 68 65 20 53 45 4c 45 43 54  ts if the SELECT
1bc80 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a   is of the form:
1bc90 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20  .**.**   SELECT 
1bca0 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 3c 74  count(*) FROM <t
1bcb0 62 6c 3e 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20  bl>.**.** where 
1bcc0 74 61 62 6c 65 20 69 73 20 61 20 64 61 74 61 62  table is a datab
1bcd0 61 73 65 20 74 61 62 6c 65 2c 20 6e 6f 74 20 61  ase table, not a
1bce0 20 73 75 62 2d 73 65 6c 65 63 74 20 6f 72 20 76   sub-select or v
1bcf0 69 65 77 2e 20 49 66 20 74 68 65 20 71 75 65 72  iew. If the quer
1bd00 79 0a 2a 2a 20 64 6f 65 73 20 6d 61 74 63 68 20  y.** does match 
1bd10 74 68 69 73 20 70 61 74 74 65 72 6e 2c 20 74 68  this pattern, th
1bd20 65 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  en a pointer to 
1bd30 74 68 65 20 54 61 62 6c 65 20 6f 62 6a 65 63 74  the Table object
1bd40 20 72 65 70 72 65 73 65 6e 74 69 6e 67 0a 2a 2a   representing.**
1bd50 20 3c 74 62 6c 3e 20 69 73 20 72 65 74 75 72 6e   <tbl> is return
1bd60 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 30  ed. Otherwise, 0
1bd70 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
1bd80 0a 73 74 61 74 69 63 20 54 61 62 6c 65 20 2a 69  .static Table *i
1bd90 73 53 69 6d 70 6c 65 43 6f 75 6e 74 28 53 65 6c  sSimpleCount(Sel
1bda0 65 63 74 20 2a 70 2c 20 41 67 67 49 6e 66 6f 20  ect *p, AggInfo 
1bdb0 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 54 61  *pAggInfo){.  Ta
1bdc0 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 45 78 70  ble *pTab;.  Exp
1bdd0 72 20 2a 70 45 78 70 72 3b 0a 0a 20 20 61 73 73  r *pExpr;..  ass
1bde0 65 72 74 28 20 21 70 2d 3e 70 47 72 6f 75 70 42  ert( !p->pGroupB
1bdf0 79 20 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 70  y );..  if( p->p
1be00 57 68 65 72 65 20 7c 7c 20 70 2d 3e 70 45 4c 69  Where || p->pELi
1be10 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 0a 20 20  st->nExpr!=1 .  
1be20 20 7c 7c 20 70 2d 3e 70 53 72 63 2d 3e 6e 53 72   || p->pSrc->nSr
1be30 63 21 3d 31 20 7c 7c 20 70 2d 3e 70 53 72 63 2d  c!=1 || p->pSrc-
1be40 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 0a 20 20  >a[0].pSelect.  
1be50 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
1be60 0a 20 20 7d 0a 20 20 70 54 61 62 20 3d 20 70 2d  .  }.  pTab = p-
1be70 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62  >pSrc->a[0].pTab
1be80 3b 0a 20 20 70 45 78 70 72 20 3d 20 70 2d 3e 70  ;.  pExpr = p->p
1be90 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
1bea0 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 61  r;.  assert( pTa
1beb0 62 20 26 26 20 21 70 54 61 62 2d 3e 70 53 65 6c  b && !pTab->pSel
1bec0 65 63 74 20 26 26 20 70 45 78 70 72 20 29 3b 0a  ect && pExpr );.
1bed0 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c  .  if( IsVirtual
1bee0 28 70 54 61 62 29 20 29 20 72 65 74 75 72 6e 20  (pTab) ) return 
1bef0 30 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  0;.  if( pExpr->
1bf00 6f 70 21 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54  op!=TK_AGG_FUNCT
1bf10 49 4f 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ION ) return 0;.
1bf20 20 20 69 66 28 20 4e 45 56 45 52 28 70 41 67 67    if( NEVER(pAgg
1bf30 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3d 3d 30 29 20  Info->nFunc==0) 
1bf40 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
1bf50 28 20 28 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75  ( (pAggInfo->aFu
1bf60 6e 63 5b 30 5d 2e 70 46 75 6e 63 2d 3e 66 6c 61  nc[0].pFunc->fla
1bf70 67 73 26 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43  gs&SQLITE_FUNC_C
1bf80 4f 55 4e 54 29 3d 3d 30 20 29 20 72 65 74 75 72  OUNT)==0 ) retur
1bf90 6e 20 30 3b 0a 20 20 69 66 28 20 70 45 78 70 72  n 0;.  if( pExpr
1bfa0 2d 3e 66 6c 61 67 73 26 45 50 5f 44 69 73 74 69  ->flags&EP_Disti
1bfb0 6e 63 74 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  nct ) return 0;.
1bfc0 0a 20 20 72 65 74 75 72 6e 20 70 54 61 62 3b 0a  .  return pTab;.
1bfd0 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  }../*.** If the 
1bfe0 73 6f 75 72 63 65 2d 6c 69 73 74 20 69 74 65 6d  source-list item
1bff0 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 61 72   passed as an ar
1c000 67 75 6d 65 6e 74 20 77 61 73 20 61 75 67 6d 65  gument was augme
1c010 6e 74 65 64 20 77 69 74 68 20 61 6e 0a 2a 2a 20  nted with an.** 
1c020 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73  INDEXED BY claus
1c030 65 2c 20 74 68 65 6e 20 74 72 79 20 74 6f 20 6c  e, then try to l
1c040 6f 63 61 74 65 20 74 68 65 20 73 70 65 63 69 66  ocate the specif
1c050 69 65 64 20 69 6e 64 65 78 2e 20 49 66 20 74 68  ied index. If th
1c060 65 72 65 0a 2a 2a 20 77 61 73 20 73 75 63 68 20  ere.** was such 
1c070 61 20 63 6c 61 75 73 65 20 61 6e 64 20 74 68 65  a clause and the
1c080 20 6e 61 6d 65 64 20 69 6e 64 65 78 20 63 61 6e   named index can
1c090 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2c 20 72 65  not be found, re
1c0a0 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f  turn .** SQLITE_
1c0b0 45 52 52 4f 52 20 61 6e 64 20 6c 65 61 76 65 20  ERROR and leave 
1c0c0 61 6e 20 65 72 72 6f 72 20 69 6e 20 70 50 61 72  an error in pPar
1c0d0 73 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 70  se. Otherwise, p
1c0e0 6f 70 75 6c 61 74 65 20 0a 2a 2a 20 70 46 72 6f  opulate .** pFro
1c0f0 6d 2d 3e 70 49 6e 64 65 78 20 61 6e 64 20 72 65  m->pIndex and re
1c100 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  turn SQLITE_OK..
1c110 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 6e  */.int sqlite3In
1c120 64 65 78 65 64 42 79 4c 6f 6f 6b 75 70 28 50 61  dexedByLookup(Pa
1c130 72 73 65 20 2a 70 50 61 72 73 65 2c 20 73 74 72  rse *pParse, str
1c140 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
1c150 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 69 66 28 20   *pFrom){.  if( 
1c160 70 46 72 6f 6d 2d 3e 70 54 61 62 20 26 26 20 70  pFrom->pTab && p
1c170 46 72 6f 6d 2d 3e 7a 49 6e 64 65 78 20 29 7b 0a  From->zIndex ){.
1c180 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
1c190 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20  = pFrom->pTab;. 
1c1a0 20 20 20 63 68 61 72 20 2a 7a 49 6e 64 65 78 20     char *zIndex 
1c1b0 3d 20 70 46 72 6f 6d 2d 3e 7a 49 6e 64 65 78 3b  = pFrom->zIndex;
1c1c0 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78  .    Index *pIdx
1c1d0 3b 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70  ;.    for(pIdx=p
1c1e0 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 0a 20 20  Tab->pIndex; .  
1c1f0 20 20 20 20 20 20 70 49 64 78 20 26 26 20 73 71        pIdx && sq
1c200 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 49 64  lite3StrICmp(pId
1c210 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 49 6e 64 65 78  x->zName, zIndex
1c220 29 3b 20 0a 20 20 20 20 20 20 20 20 70 49 64 78  ); .        pIdx
1c230 3d 70 49 64 78 2d 3e 70 4e 65 78 74 0a 20 20 20  =pIdx->pNext.   
1c240 20 29 3b 0a 20 20 20 20 69 66 28 20 21 70 49 64   );.    if( !pId
1c250 78 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  x ){.      sqlit
1c260 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
1c270 65 2c 20 22 6e 6f 20 73 75 63 68 20 69 6e 64 65  e, "no such inde
1c280 78 3a 20 25 73 22 2c 20 7a 49 6e 64 65 78 2c 20  x: %s", zIndex, 
1c290 30 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  0);.      pParse
1c2a0 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61 20 3d 20  ->checkSchema = 
1c2b0 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  1;.      return 
1c2c0 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
1c2d0 20 20 7d 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 70    }.    pFrom->p
1c2e0 49 6e 64 65 78 20 3d 20 70 49 64 78 3b 0a 20 20  Index = pIdx;.  
1c2f0 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
1c300 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  E_OK;.}../*.** T
1c310 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
1c320 20 57 61 6c 6b 65 72 20 63 61 6c 6c 62 61 63 6b   Walker callback
1c330 20 66 6f 72 20 22 65 78 70 61 6e 64 69 6e 67 22   for "expanding"
1c340 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
1c350 65 6e 74 2e 0a 2a 2a 20 22 45 78 70 61 6e 64 69  ent..** "Expandi
1c360 6e 67 22 20 6d 65 61 6e 73 20 74 6f 20 64 6f 20  ng" means to do 
1c370 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a  the following:.*
1c380 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20 4d 61 6b  *.**    (1)  Mak
1c390 65 20 73 75 72 65 20 56 44 42 45 20 63 75 72 73  e sure VDBE curs
1c3a0 6f 72 20 6e 75 6d 62 65 72 73 20 68 61 76 65 20  or numbers have 
1c3b0 62 65 65 6e 20 61 73 73 69 67 6e 65 64 20 74 6f  been assigned to
1c3c0 20 65 76 65 72 79 0a 2a 2a 20 20 20 20 20 20 20   every.**       
1c3d0 20 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65    element of the
1c3e0 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a   FROM clause..**
1c3f0 0a 2a 2a 20 20 20 20 28 32 29 20 20 46 69 6c 6c  .**    (2)  Fill
1c400 20 69 6e 20 74 68 65 20 70 54 61 62 4c 69 73 74   in the pTabList
1c410 2d 3e 61 5b 5d 2e 70 54 61 62 20 66 69 65 6c 64  ->a[].pTab field
1c420 73 20 69 6e 20 74 68 65 20 53 72 63 4c 69 73 74  s in the SrcList
1c430 20 74 68 61 74 20 0a 2a 2a 20 20 20 20 20 20 20   that .**       
1c440 20 20 64 65 66 69 6e 65 73 20 46 52 4f 4d 20 63    defines FROM c
1c450 6c 61 75 73 65 2e 20 20 57 68 65 6e 20 76 69 65  lause.  When vie
1c460 77 73 20 61 70 70 65 61 72 20 69 6e 20 74 68 65  ws appear in the
1c470 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c 0a 2a 2a   FROM clause,.**
1c480 20 20 20 20 20 20 20 20 20 66 69 6c 6c 20 70 54           fill pT
1c490 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70 53 65 6c  abList->a[].pSel
1c4a0 65 63 74 20 77 69 74 68 20 61 20 63 6f 70 79 20  ect with a copy 
1c4b0 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  of the SELECT st
1c4c0 61 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20  atement.**      
1c4d0 20 20 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e     that implemen
1c4e0 74 73 20 74 68 65 20 76 69 65 77 2e 20 20 41 20  ts the view.  A 
1c4f0 63 6f 70 79 20 69 73 20 6d 61 64 65 20 6f 66 20  copy is made of 
1c500 74 68 65 20 76 69 65 77 27 73 20 53 45 4c 45 43  the view's SELEC
1c510 54 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 74 61  T.**         sta
1c520 74 65 6d 65 6e 74 20 73 6f 20 74 68 61 74 20 77  tement so that w
1c530 65 20 63 61 6e 20 66 72 65 65 6c 79 20 6d 6f 64  e can freely mod
1c540 69 66 79 20 6f 72 20 64 65 6c 65 74 65 20 74 68  ify or delete th
1c550 61 74 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20  at statement.** 
1c560 20 20 20 20 20 20 20 20 77 69 74 68 6f 75 74 20          without 
1c570 77 6f 72 72 79 69 6e 67 20 61 62 6f 75 74 20 6d  worrying about m
1c580 65 73 73 69 6e 67 20 75 70 20 74 68 65 20 70 72  essing up the pr
1c590 65 73 69 73 74 65 6e 74 20 72 65 70 72 65 73 65  esistent represe
1c5a0 6e 74 61 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 20  ntation.**      
1c5b0 20 20 20 6f 66 20 74 68 65 20 76 69 65 77 2e 0a     of the view..
1c5c0 2a 2a 0a 2a 2a 20 20 20 20 28 33 29 20 20 41 64  **.**    (3)  Ad
1c5d0 64 20 74 65 72 6d 73 20 74 6f 20 74 68 65 20 57  d terms to the W
1c5e0 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20 61  HERE clause to a
1c5f0 63 63 6f 6d 6f 64 61 74 65 20 74 68 65 20 4e 41  ccomodate the NA
1c600 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 0a 2a 2a  TURAL keyword.**
1c610 20 20 20 20 20 20 20 20 20 6f 6e 20 6a 6f 69 6e           on join
1c620 73 20 61 6e 64 20 74 68 65 20 4f 4e 20 61 6e 64  s and the ON and
1c630 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66   USING clause of
1c640 20 6a 6f 69 6e 73 2e 0a 2a 2a 0a 2a 2a 20 20 20   joins..**.**   
1c650 20 28 34 29 20 20 53 63 61 6e 20 74 68 65 20 6c   (4)  Scan the l
1c660 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ist of columns i
1c670 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
1c680 20 28 70 45 4c 69 73 74 29 20 6c 6f 6f 6b 69 6e   (pEList) lookin
1c690 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 66 6f 72  g.**         for
1c6a0 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68   instances of th
1c6b0 65 20 22 2a 22 20 6f 70 65 72 61 74 6f 72 20 6f  e "*" operator o
1c6c0 72 20 74 68 65 20 54 41 42 4c 45 2e 2a 20 6f 70  r the TABLE.* op
1c6d0 65 72 61 74 6f 72 2e 0a 2a 2a 20 20 20 20 20 20  erator..**      
1c6e0 20 20 20 49 66 20 66 6f 75 6e 64 2c 20 65 78 70     If found, exp
1c6f0 61 6e 64 20 65 61 63 68 20 22 2a 22 20 74 6f 20  and each "*" to 
1c700 62 65 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20  be every column 
1c710 69 6e 20 65 76 65 72 79 20 74 61 62 6c 65 0a 2a  in every table.*
1c720 2a 20 20 20 20 20 20 20 20 20 61 6e 64 20 54 41  *         and TA
1c730 42 4c 45 2e 2a 20 74 6f 20 62 65 20 65 76 65 72  BLE.* to be ever
1c740 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 54 41 42 4c  y column in TABL
1c750 45 2e 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20  E..**.*/.static 
1c760 69 6e 74 20 73 65 6c 65 63 74 45 78 70 61 6e 64  int selectExpand
1c770 65 72 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b  er(Walker *pWalk
1c780 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a  er, Select *p){.
1c790 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20    Parse *pParse 
1c7a0 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73  = pWalker->pPars
1c7b0 65 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b  e;.  int i, j, k
1c7c0 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  ;.  SrcList *pTa
1c7d0 62 4c 69 73 74 3b 0a 20 20 45 78 70 72 4c 69 73  bList;.  ExprLis
1c7e0 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 73 74 72  t *pEList;.  str
1c7f0 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
1c800 20 2a 70 46 72 6f 6d 3b 0a 20 20 73 71 6c 69 74   *pFrom;.  sqlit
1c810 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
1c820 3e 64 62 3b 0a 0a 20 20 69 66 28 20 64 62 2d 3e  >db;..  if( db->
1c830 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 20 29 7b  mallocFailed  ){
1c840 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f  .    return WRC_
1c850 41 62 6f 72 74 3b 0a 20 20 7d 0a 20 20 69 66 28  Abort;.  }.  if(
1c860 20 4e 45 56 45 52 28 70 2d 3e 70 53 72 63 3d 3d   NEVER(p->pSrc==
1c870 30 29 20 7c 7c 20 28 70 2d 3e 73 65 6c 46 6c 61  0) || (p->selFla
1c880 67 73 20 26 20 53 46 5f 45 78 70 61 6e 64 65 64  gs & SF_Expanded
1c890 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  )!=0 ){.    retu
1c8a0 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20  rn WRC_Prune;.  
1c8b0 7d 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  }.  p->selFlags 
1c8c0 7c 3d 20 53 46 5f 45 78 70 61 6e 64 65 64 3b 0a  |= SF_Expanded;.
1c8d0 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e    pTabList = p->
1c8e0 70 53 72 63 3b 0a 20 20 70 45 4c 69 73 74 20 3d  pSrc;.  pEList =
1c8f0 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 0a 20 20 2f   p->pEList;..  /
1c900 2a 20 4d 61 6b 65 20 73 75 72 65 20 63 75 72 73  * Make sure curs
1c910 6f 72 20 6e 75 6d 62 65 72 73 20 68 61 76 65 20  or numbers have 
1c920 62 65 65 6e 20 61 73 73 69 67 6e 65 64 20 74 6f  been assigned to
1c930 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 69 6e 0a   all entries in.
1c940 20 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c    ** the FROM cl
1c950 61 75 73 65 20 6f 66 20 74 68 65 20 53 45 4c 45  ause of the SELE
1c960 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20  CT statement..  
1c970 2a 2f 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c  */.  sqlite3SrcL
1c980 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73  istAssignCursors
1c990 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73  (pParse, pTabLis
1c9a0 74 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 75  t);..  /* Look u
1c9b0 70 20 65 76 65 72 79 20 74 61 62 6c 65 20 6e 61  p every table na
1c9c0 6d 65 64 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  med in the FROM 
1c9d0 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 73 65  clause of the se
1c9e0 6c 65 63 74 2e 20 20 49 66 0a 20 20 2a 2a 20 61  lect.  If.  ** a
1c9f0 6e 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20 46  n entry of the F
1ca00 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 61 20  ROM clause is a 
1ca10 73 75 62 71 75 65 72 79 20 69 6e 73 74 65 61 64  subquery instead
1ca20 20 6f 66 20 61 20 74 61 62 6c 65 20 6f 72 20 76   of a table or v
1ca30 69 65 77 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 63  iew,.  ** then c
1ca40 72 65 61 74 65 20 61 20 74 72 61 6e 73 69 65 6e  reate a transien
1ca50 74 20 74 61 62 6c 65 20 73 74 72 75 63 74 75 72  t table structur
1ca60 65 20 74 6f 20 64 65 73 63 72 69 62 65 20 74 68  e to describe th
1ca70 65 20 73 75 62 71 75 65 72 79 2e 0a 20 20 2a 2f  e subquery..  */
1ca80 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f  .  for(i=0, pFro
1ca90 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69  m=pTabList->a; i
1caa0 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b  <pTabList->nSrc;
1cab0 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a   i++, pFrom++){.
1cac0 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b      Table *pTab;
1cad0 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e  .    if( pFrom->
1cae0 70 54 61 62 21 3d 30 20 29 7b 0a 20 20 20 20 20  pTab!=0 ){.     
1caf0 20 2f 2a 20 54 68 69 73 20 73 74 61 74 65 6d 65   /* This stateme
1cb00 6e 74 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  nt has already b
1cb10 65 65 6e 20 70 72 65 70 61 72 65 64 2e 20 20 54  een prepared.  T
1cb20 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 0a  here is no need.
1cb30 20 20 20 20 20 20 2a 2a 20 74 6f 20 67 6f 20 66        ** to go f
1cb40 75 72 74 68 65 72 2e 20 2a 2f 0a 20 20 20 20 20  urther. */.     
1cb50 20 61 73 73 65 72 74 28 20 69 3d 3d 30 20 29 3b   assert( i==0 );
1cb60 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52  .      return WR
1cb70 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 7d 0a 20  C_Prune;.    }. 
1cb80 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 7a 4e     if( pFrom->zN
1cb90 61 6d 65 3d 3d 30 20 29 7b 0a 23 69 66 6e 64 65  ame==0 ){.#ifnde
1cba0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
1cbb0 42 51 55 45 52 59 0a 20 20 20 20 20 20 53 65 6c  BQUERY.      Sel
1cbc0 65 63 74 20 2a 70 53 65 6c 20 3d 20 70 46 72 6f  ect *pSel = pFro
1cbd0 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20  m->pSelect;.    
1cbe0 20 20 2f 2a 20 41 20 73 75 62 2d 71 75 65 72 79    /* A sub-query
1cbf0 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
1cc00 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20  use of a SELECT 
1cc10 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
1cc20 20 70 53 65 6c 21 3d 30 20 29 3b 0a 20 20 20 20   pSel!=0 );.    
1cc30 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d    assert( pFrom-
1cc40 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20  >pTab==0 );.    
1cc50 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c    sqlite3WalkSel
1cc60 65 63 74 28 70 57 61 6c 6b 65 72 2c 20 70 53 65  ect(pWalker, pSe
1cc70 6c 29 3b 0a 20 20 20 20 20 20 70 46 72 6f 6d 2d  l);.      pFrom-
1cc80 3e 70 54 61 62 20 3d 20 70 54 61 62 20 3d 20 73  >pTab = pTab = s
1cc90 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
1cca0 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 54 61  ro(db, sizeof(Ta
1ccb0 62 6c 65 29 29 3b 0a 20 20 20 20 20 20 69 66 28  ble));.      if(
1ccc0 20 70 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72   pTab==0 ) retur
1ccd0 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20  n WRC_Abort;.   
1cce0 20 20 20 70 54 61 62 2d 3e 6e 52 65 66 20 3d 20     pTab->nRef = 
1ccf0 31 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 7a  1;.      pTab->z
1cd00 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50  Name = sqlite3MP
1cd10 72 69 6e 74 66 28 64 62 2c 20 22 73 71 6c 69 74  rintf(db, "sqlit
1cd20 65 5f 73 75 62 71 75 65 72 79 5f 25 70 5f 22 2c  e_subquery_%p_",
1cd30 20 28 76 6f 69 64 2a 29 70 54 61 62 29 3b 0a 20   (void*)pTab);. 
1cd40 20 20 20 20 20 77 68 69 6c 65 28 20 70 53 65 6c       while( pSel
1cd50 2d 3e 70 50 72 69 6f 72 20 29 7b 20 70 53 65 6c  ->pPrior ){ pSel
1cd60 20 3d 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 3b   = pSel->pPrior;
1cd70 20 7d 0a 20 20 20 20 20 20 73 65 6c 65 63 74 43   }.      selectC
1cd80 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69  olumnsFromExprLi
1cd90 73 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 2d  st(pParse, pSel-
1cda0 3e 70 45 4c 69 73 74 2c 20 26 70 54 61 62 2d 3e  >pEList, &pTab->
1cdb0 6e 43 6f 6c 2c 20 26 70 54 61 62 2d 3e 61 43 6f  nCol, &pTab->aCo
1cdc0 6c 29 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e  l);.      pTab->
1cdd0 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 20 20  iPKey = -1;.    
1cde0 20 20 70 54 61 62 2d 3e 6e 52 6f 77 45 73 74 20    pTab->nRowEst 
1cdf0 3d 20 31 30 30 30 30 30 30 3b 0a 20 20 20 20 20  = 1000000;.     
1ce00 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20   pTab->tabFlags 
1ce10 7c 3d 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 3b  |= TF_Ephemeral;
1ce20 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73  .#endif.    }els
1ce30 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 6f  e{.      /* An o
1ce40 72 64 69 6e 61 72 79 20 74 61 62 6c 65 20 6f 72  rdinary table or
1ce50 20 76 69 65 77 20 6e 61 6d 65 20 69 6e 20 74 68   view name in th
1ce60 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  e FROM clause */
1ce70 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1ce80 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b  From->pTab==0 );
1ce90 0a 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54  .      pFrom->pT
1cea0 61 62 20 3d 20 70 54 61 62 20 3d 20 73 71 6c 69  ab = pTab = sqli
1ceb0 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 49 74  te3LocateTableIt
1cec0 65 6d 28 70 50 61 72 73 65 2c 20 30 2c 20 70 46  em(pParse, 0, pF
1ced0 72 6f 6d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  rom);.      if( 
1cee0 70 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e  pTab==0 ) return
1cef0 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20   WRC_Abort;.    
1cf00 20 20 70 54 61 62 2d 3e 6e 52 65 66 2b 2b 3b 0a    pTab->nRef++;.
1cf10 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
1cf20 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c  ITE_OMIT_VIEW) |
1cf30 7c 20 21 64 65 66 69 6e 65 64 20 28 53 51 4c 49  | !defined (SQLI
1cf40 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
1cf50 41 42 4c 45 29 0a 20 20 20 20 20 20 69 66 28 20  ABLE).      if( 
1cf60 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 7c 7c  pTab->pSelect ||
1cf70 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
1cf80 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57   ){.        /* W
1cf90 65 20 72 65 61 63 68 20 68 65 72 65 20 69 66 20  e reach here if 
1cfa0 74 68 65 20 6e 61 6d 65 64 20 74 61 62 6c 65 20  the named table 
1cfb0 69 73 20 61 20 72 65 61 6c 6c 79 20 61 20 76 69  is a really a vi
1cfc0 65 77 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66  ew */.        if
1cfd0 28 20 73 71 6c 69 74 65 33 56 69 65 77 47 65 74  ( sqlite3ViewGet
1cfe0 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72  ColumnNames(pPar
1cff0 73 65 2c 20 70 54 61 62 29 20 29 20 72 65 74 75  se, pTab) ) retu
1d000 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
1d010 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 46        assert( pF
1d020 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20  rom->pSelect==0 
1d030 29 3b 0a 20 20 20 20 20 20 20 20 70 46 72 6f 6d  );.        pFrom
1d040 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69  ->pSelect = sqli
1d050 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c  te3SelectDup(db,
1d060 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 2c 20   pTab->pSelect, 
1d070 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0);.        sqli
1d080 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57  te3WalkSelect(pW
1d090 61 6c 6b 65 72 2c 20 70 46 72 6f 6d 2d 3e 70 53  alker, pFrom->pS
1d0a0 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 7d 0a  elect);.      }.
1d0b0 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20  #endif.    }..  
1d0c0 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20    /* Locate the 
1d0d0 69 6e 64 65 78 20 6e 61 6d 65 64 20 62 79 20 74  index named by t
1d0e0 68 65 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c  he INDEXED BY cl
1d0f0 61 75 73 65 2c 20 69 66 20 61 6e 79 2e 20 2a 2f  ause, if any. */
1d100 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
1d110 49 6e 64 65 78 65 64 42 79 4c 6f 6f 6b 75 70 28  IndexedByLookup(
1d120 70 50 61 72 73 65 2c 20 70 46 72 6f 6d 29 20 29  pParse, pFrom) )
1d130 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57  {.      return W
1d140 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 7d 0a  RC_Abort;.    }.
1d150 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 6f 63 65 73    }..  /* Proces
1d160 73 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72  s NATURAL keywor
1d170 64 73 2c 20 61 6e 64 20 4f 4e 20 61 6e 64 20 55  ds, and ON and U
1d180 53 49 4e 47 20 63 6c 61 75 73 65 73 20 6f 66 20  SING clauses of 
1d190 6a 6f 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  joins..  */.  if
1d1a0 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
1d1b0 65 64 20 7c 7c 20 73 71 6c 69 74 65 50 72 6f 63  ed || sqliteProc
1d1c0 65 73 73 4a 6f 69 6e 28 70 50 61 72 73 65 2c 20  essJoin(pParse, 
1d1d0 70 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  p) ){.    return
1d1e0 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a   WRC_Abort;.  }.
1d1f0 0a 20 20 2f 2a 20 46 6f 72 20 65 76 65 72 79 20  .  /* For every 
1d200 22 2a 22 20 74 68 61 74 20 6f 63 63 75 72 73 20  "*" that occurs 
1d210 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6c 69  in the column li
1d220 73 74 2c 20 69 6e 73 65 72 74 20 74 68 65 20 6e  st, insert the n
1d230 61 6d 65 73 20 6f 66 0a 20 20 2a 2a 20 61 6c 6c  ames of.  ** all
1d240 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c 20   columns in all 
1d250 74 61 62 6c 65 73 2e 20 20 41 6e 64 20 66 6f 72  tables.  And for
1d260 20 65 76 65 72 79 20 54 41 42 4c 45 2e 2a 20 69   every TABLE.* i
1d270 6e 73 65 72 74 20 74 68 65 20 6e 61 6d 65 73 0a  nsert the names.
1d280 20 20 2a 2a 20 6f 66 20 61 6c 6c 20 63 6f 6c 75    ** of all colu
1d290 6d 6e 73 20 69 6e 20 54 41 42 4c 45 2e 20 20 54  mns in TABLE.  T
1d2a0 68 65 20 70 61 72 73 65 72 20 69 6e 73 65 72 74  he parser insert
1d2b0 65 64 20 61 20 73 70 65 63 69 61 6c 20 65 78 70  ed a special exp
1d2c0 72 65 73 73 69 6f 6e 0a 20 20 2a 2a 20 77 69 74  ression.  ** wit
1d2d0 68 20 74 68 65 20 54 4b 5f 41 4c 4c 20 6f 70 65  h the TK_ALL ope
1d2e0 72 61 74 6f 72 20 66 6f 72 20 65 61 63 68 20 22  rator for each "
1d2f0 2a 22 20 74 68 61 74 20 69 74 20 66 6f 75 6e 64  *" that it found
1d300 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6c   in the column l
1d310 69 73 74 2e 0a 20 20 2a 2a 20 54 68 65 20 66 6f  ist..  ** The fo
1d320 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20 6a 75 73  llowing code jus
1d330 74 20 68 61 73 20 74 6f 20 6c 6f 63 61 74 65 20  t has to locate 
1d340 74 68 65 20 54 4b 5f 41 4c 4c 20 65 78 70 72 65  the TK_ALL expre
1d350 73 73 69 6f 6e 73 20 61 6e 64 20 65 78 70 61 6e  ssions and expan
1d360 64 0a 20 20 2a 2a 20 65 61 63 68 20 6f 6e 65 20  d.  ** each one 
1d370 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61  to the list of a
1d380 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c  ll columns in al
1d390 6c 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20  l tables..  **. 
1d3a0 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20 6c 6f   ** The first lo
1d3b0 6f 70 20 6a 75 73 74 20 63 68 65 63 6b 73 20 74  op just checks t
1d3c0 6f 20 73 65 65 20 69 66 20 74 68 65 72 65 20 61  o see if there a
1d3d0 72 65 20 61 6e 79 20 22 2a 22 20 6f 70 65 72 61  re any "*" opera
1d3e0 74 6f 72 73 0a 20 20 2a 2a 20 74 68 61 74 20 6e  tors.  ** that n
1d3f0 65 65 64 20 65 78 70 61 6e 64 69 6e 67 2e 0a 20  eed expanding.. 
1d400 20 2a 2f 0a 20 20 66 6f 72 28 6b 3d 30 3b 20 6b   */.  for(k=0; k
1d410 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  <pEList->nExpr; 
1d420 6b 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  k++){.    Expr *
1d430 70 45 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 6b  pE = pEList->a[k
1d440 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28  ].pExpr;.    if(
1d450 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20   pE->op==TK_ALL 
1d460 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 61 73 73  ) break;.    ass
1d470 65 72 74 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f  ert( pE->op!=TK_
1d480 44 4f 54 20 7c 7c 20 70 45 2d 3e 70 52 69 67 68  DOT || pE->pRigh
1d490 74 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  t!=0 );.    asse
1d4a0 72 74 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44  rt( pE->op!=TK_D
1d4b0 4f 54 20 7c 7c 20 28 70 45 2d 3e 70 4c 65 66 74  OT || (pE->pLeft
1d4c0 21 3d 30 20 26 26 20 70 45 2d 3e 70 4c 65 66 74  !=0 && pE->pLeft
1d4d0 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 29 20 29 3b 0a  ->op==TK_ID) );.
1d4e0 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d      if( pE->op==
1d4f0 54 4b 5f 44 4f 54 20 26 26 20 70 45 2d 3e 70 52  TK_DOT && pE->pR
1d500 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c  ight->op==TK_ALL
1d510 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20   ) break;.  }.  
1d520 69 66 28 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45  if( k<pEList->nE
1d530 78 70 72 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20  xpr ){.    /*.  
1d540 20 20 2a 2a 20 49 66 20 77 65 20 67 65 74 20 68    ** If we get h
1d550 65 72 65 20 69 74 20 6d 65 61 6e 73 20 74 68 65  ere it means the
1d560 20 72 65 73 75 6c 74 20 73 65 74 20 63 6f 6e 74   result set cont
1d570 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  ains one or more
1d580 20 22 2a 22 0a 20 20 20 20 2a 2a 20 6f 70 65 72   "*".    ** oper
1d590 61 74 6f 72 73 20 74 68 61 74 20 6e 65 65 64 20  ators that need 
1d5a0 74 6f 20 62 65 20 65 78 70 61 6e 64 65 64 2e 20  to be expanded. 
1d5b0 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 65 61   Loop through ea
1d5c0 63 68 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20  ch expression.  
1d5d0 20 20 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75    ** in the resu
1d5e0 6c 74 20 73 65 74 20 61 6e 64 20 65 78 70 61 6e  lt set and expan
1d5f0 64 20 74 68 65 6d 20 6f 6e 65 20 62 79 20 6f 6e  d them one by on
1d600 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 74  e..    */.    st
1d610 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
1d620 65 6d 20 2a 61 20 3d 20 70 45 4c 69 73 74 2d 3e  em *a = pEList->
1d630 61 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20  a;.    ExprList 
1d640 2a 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 69  *pNew = 0;.    i
1d650 6e 74 20 66 6c 61 67 73 20 3d 20 70 50 61 72 73  nt flags = pPars
1d660 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 3b 0a 20 20  e->db->flags;.  
1d670 20 20 69 6e 74 20 6c 6f 6e 67 4e 61 6d 65 73 20    int longNames 
1d680 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  = (flags & SQLIT
1d690 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21  E_FullColNames)!
1d6a0 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  =0.             
1d6b0 20 20 20 20 20 20 20 20 20 26 26 20 28 66 6c 61           && (fla
1d6c0 67 73 20 26 20 53 51 4c 49 54 45 5f 53 68 6f 72  gs & SQLITE_Shor
1d6d0 74 43 6f 6c 4e 61 6d 65 73 29 3d 3d 30 3b 0a 0a  tColNames)==0;..
1d6e0 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70      for(k=0; k<p
1d6f0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b  EList->nExpr; k+
1d700 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  +){.      Expr *
1d710 70 45 20 3d 20 61 5b 6b 5d 2e 70 45 78 70 72 3b  pE = a[k].pExpr;
1d720 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1d730 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c  E->op!=TK_DOT ||
1d740 20 70 45 2d 3e 70 52 69 67 68 74 21 3d 30 20 29   pE->pRight!=0 )
1d750 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e  ;.      if( pE->
1d760 6f 70 21 3d 54 4b 5f 41 4c 4c 20 26 26 20 28 70  op!=TK_ALL && (p
1d770 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c  E->op!=TK_DOT ||
1d780 20 70 45 2d 3e 70 52 69 67 68 74 2d 3e 6f 70 21   pE->pRight->op!
1d790 3d 54 4b 5f 41 4c 4c 29 20 29 7b 0a 20 20 20 20  =TK_ALL) ){.    
1d7a0 20 20 20 20 2f 2a 20 54 68 69 73 20 70 61 72 74      /* This part
1d7b0 69 63 75 6c 61 72 20 65 78 70 72 65 73 73 69 6f  icular expressio
1d7c0 6e 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20  n does not need 
1d7d0 74 6f 20 62 65 20 65 78 70 61 6e 64 65 64 2e 0a  to be expanded..
1d7e0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
1d7f0 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65     pNew = sqlite
1d800 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
1d810 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 61 5b  pParse, pNew, a[
1d820 6b 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  k].pExpr);.     
1d830 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20     if( pNew ){. 
1d840 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61           pNew->a
1d850 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e  [pNew->nExpr-1].
1d860 7a 4e 61 6d 65 20 3d 20 61 5b 6b 5d 2e 7a 4e 61  zName = a[k].zNa
1d870 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4e  me;.          pN
1d880 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70  ew->a[pNew->nExp
1d890 72 2d 31 5d 2e 7a 53 70 61 6e 20 3d 20 61 5b 6b  r-1].zSpan = a[k
1d8a0 5d 2e 7a 53 70 61 6e 3b 0a 20 20 20 20 20 20 20  ].zSpan;.       
1d8b0 20 20 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 20 3d 20     a[k].zName = 
1d8c0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 61 5b 6b  0;.          a[k
1d8d0 5d 2e 7a 53 70 61 6e 20 3d 20 30 3b 0a 20 20 20  ].zSpan = 0;.   
1d8e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
1d8f0 5b 6b 5d 2e 70 45 78 70 72 20 3d 20 30 3b 0a 20  [k].pExpr = 0;. 
1d900 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1d910 20 20 20 20 2f 2a 20 54 68 69 73 20 65 78 70 72      /* This expr
1d920 65 73 73 69 6f 6e 20 69 73 20 61 20 22 2a 22 20  ession is a "*" 
1d930 6f 72 20 61 20 22 54 41 42 4c 45 2e 2a 22 20 61  or a "TABLE.*" a
1d940 6e 64 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20  nd needs to be. 
1d950 20 20 20 20 20 20 20 2a 2a 20 65 78 70 61 6e 64         ** expand
1d960 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  ed. */.        i
1d970 6e 74 20 74 61 62 6c 65 53 65 65 6e 20 3d 20 30  nt tableSeen = 0
1d980 3b 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f  ;      /* Set to
1d990 20 31 20 77 68 65 6e 20 54 41 42 4c 45 20 6d 61   1 when TABLE ma
1d9a0 74 63 68 65 73 20 2a 2f 0a 20 20 20 20 20 20 20  tches */.       
1d9b0 20 63 68 61 72 20 2a 7a 54 4e 61 6d 65 3b 20 20   char *zTName;  
1d9c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74 65 78            /* tex
1d9d0 74 20 6f 66 20 6e 61 6d 65 20 6f 66 20 54 41 42  t of name of TAB
1d9e0 4c 45 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66  LE */.        if
1d9f0 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54  ( pE->op==TK_DOT
1da00 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73   ){.          as
1da10 73 65 72 74 28 20 70 45 2d 3e 70 4c 65 66 74 21  sert( pE->pLeft!
1da20 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =0 );.          
1da30 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
1da40 50 72 6f 70 65 72 74 79 28 70 45 2d 3e 70 4c 65  Property(pE->pLe
1da50 66 74 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  ft, EP_IntValue)
1da60 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 54   );.          zT
1da70 4e 61 6d 65 20 3d 20 70 45 2d 3e 70 4c 65 66 74  Name = pE->pLeft
1da80 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20  ->u.zToken;.    
1da90 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1daa0 20 20 20 20 20 7a 54 4e 61 6d 65 20 3d 20 30 3b       zTName = 0;
1dab0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1dac0 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f     for(i=0, pFro
1dad0 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69  m=pTabList->a; i
1dae0 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b  <pTabList->nSrc;
1daf0 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a   i++, pFrom++){.
1db00 20 20 20 20 20 20 20 20 20 20 54 61 62 6c 65 20            Table 
1db10 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70  *pTab = pFrom->p
1db20 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20 63  Tab;.          c
1db30 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65 20 3d 20  har *zTabName = 
1db40 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 3b 0a 20  pFrom->zAlias;. 
1db50 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 61           if( zTa
1db60 62 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  bName==0 ){.    
1db70 20 20 20 20 20 20 20 20 7a 54 61 62 4e 61 6d 65          zTabName
1db80 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a   = pTab->zName;.
1db90 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1dba0 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61        if( db->ma
1dbb0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 62 72 65  llocFailed ) bre
1dbc0 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ak;.          if
1dbd0 28 20 7a 54 4e 61 6d 65 20 26 26 20 73 71 6c 69  ( zTName && sqli
1dbe0 74 65 33 53 74 72 49 43 6d 70 28 7a 54 4e 61 6d  te3StrICmp(zTNam
1dbf0 65 2c 20 7a 54 61 62 4e 61 6d 65 29 21 3d 30 20  e, zTabName)!=0 
1dc00 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  ){.            c
1dc10 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
1dc20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 74     }.          t
1dc30 61 62 6c 65 53 65 65 6e 20 3d 20 31 3b 0a 20 20  ableSeen = 1;.  
1dc40 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b          for(j=0;
1dc50 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a   j<pTab->nCol; j
1dc60 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
1dc70 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 2a 70   Expr *pExpr, *p
1dc80 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 20  Right;.         
1dc90 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d     char *zName =
1dca0 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a   pTab->aCol[j].z
1dcb0 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Name;.          
1dcc0 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6e 61 6d 65    char *zColname
1dcd0 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 75 74  ;  /* The comput
1dce0 65 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a  ed column name *
1dcf0 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 68  /.            ch
1dd00 61 72 20 2a 7a 54 6f 46 72 65 65 3b 20 20 20 2f  ar *zToFree;   /
1dd10 2a 20 4d 61 6c 6c 6f 63 65 64 20 73 74 72 69 6e  * Malloced strin
1dd20 67 20 74 68 61 74 20 6e 65 65 64 73 20 74 6f 20  g that needs to 
1dd30 62 65 20 66 72 65 65 64 20 2a 2f 0a 20 20 20 20  be freed */.    
1dd40 20 20 20 20 20 20 20 20 54 6f 6b 65 6e 20 73 43          Token sC
1dd50 6f 6c 6e 61 6d 65 3b 20 20 2f 2a 20 43 6f 6d 70  olname;  /* Comp
1dd60 75 74 65 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  uted column name
1dd70 20 61 73 20 61 20 74 6f 6b 65 6e 20 2a 2f 0a 0a   as a token */..
1dd80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
1dd90 66 20 61 20 63 6f 6c 75 6d 6e 20 69 73 20 6d 61  f a column is ma
1dda0 72 6b 65 64 20 61 73 20 27 68 69 64 64 65 6e 27  rked as 'hidden'
1ddb0 20 28 63 75 72 72 65 6e 74 6c 79 20 6f 6e 6c 79   (currently only
1ddc0 20 70 6f 73 73 69 62 6c 65 0a 20 20 20 20 20 20   possible.      
1ddd0 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 76 69 72        ** for vir
1dde0 74 75 61 6c 20 74 61 62 6c 65 73 29 2c 20 64 6f  tual tables), do
1ddf0 20 6e 6f 74 20 69 6e 63 6c 75 64 65 20 69 74 20   not include it 
1de00 69 6e 20 74 68 65 20 65 78 70 61 6e 64 65 64 0a  in the expanded.
1de10 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72              ** r
1de20 65 73 75 6c 74 2d 73 65 74 20 6c 69 73 74 2e 0a  esult-set list..
1de30 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20              */. 
1de40 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 49             if( I
1de50 73 48 69 64 64 65 6e 43 6f 6c 75 6d 6e 28 26 70  sHiddenColumn(&p
1de60 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 29 20 29 7b  Tab->aCol[j]) ){
1de70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61  .              a
1de80 73 73 65 72 74 28 49 73 56 69 72 74 75 61 6c 28  ssert(IsVirtual(
1de90 70 54 61 62 29 29 3b 0a 20 20 20 20 20 20 20 20  pTab));.        
1dea0 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
1deb0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20              }.. 
1dec0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69             if( i
1ded0 3e 30 20 26 26 20 7a 54 4e 61 6d 65 3d 3d 30 20  >0 && zTName==0 
1dee0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
1def0 20 69 66 28 20 28 70 46 72 6f 6d 2d 3e 6a 6f 69   if( (pFrom->joi
1df00 6e 74 79 70 65 20 26 20 4a 54 5f 4e 41 54 55 52  ntype & JT_NATUR
1df10 41 4c 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20  AL)!=0.         
1df20 20 20 20 20 20 20 20 26 26 20 74 61 62 6c 65 41         && tableA
1df30 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 54  ndColumnIndex(pT
1df40 61 62 4c 69 73 74 2c 20 69 2c 20 7a 4e 61 6d 65  abList, i, zName
1df50 2c 20 30 2c 20 30 29 0a 20 20 20 20 20 20 20 20  , 0, 0).        
1df60 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
1df70 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 61           /* In a
1df80 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 2c 20 6f   NATURAL join, o
1df90 6d 69 74 20 74 68 65 20 6a 6f 69 6e 20 63 6f 6c  mit the join col
1dfa0 75 6d 6e 73 20 66 72 6f 6d 20 74 68 65 20 0a 20  umns from the . 
1dfb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
1dfc0 2a 20 74 61 62 6c 65 20 74 6f 20 74 68 65 20 72  * table to the r
1dfd0 69 67 68 74 20 6f 66 20 74 68 65 20 6a 6f 69 6e  ight of the join
1dfe0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
1dff0 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
1e000 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
1e010 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
1e020 73 71 6c 69 74 65 33 49 64 4c 69 73 74 49 6e 64  sqlite3IdListInd
1e030 65 78 28 70 46 72 6f 6d 2d 3e 70 55 73 69 6e 67  ex(pFrom->pUsing
1e040 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a 20  , zName)>=0 ){. 
1e050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1e060 2a 20 49 6e 20 61 20 6a 6f 69 6e 20 77 69 74 68  * In a join with
1e070 20 61 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2c   a USING clause,
1e080 20 6f 6d 69 74 20 63 6f 6c 75 6d 6e 73 20 69 6e   omit columns in
1e090 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 20   the.           
1e0a0 20 20 20 20 20 2a 2a 20 75 73 69 6e 67 20 63 6c       ** using cl
1e0b0 61 75 73 65 20 66 72 6f 6d 20 74 68 65 20 74 61  ause from the ta
1e0c0 62 6c 65 20 6f 6e 20 74 68 65 20 72 69 67 68 74  ble on the right
1e0d0 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  . */.           
1e0e0 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
1e0f0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
1e100 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
1e110 20 20 20 20 20 20 20 20 20 70 52 69 67 68 74 20           pRight 
1e120 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62  = sqlite3Expr(db
1e130 2c 20 54 4b 5f 49 44 2c 20 7a 4e 61 6d 65 29 3b  , TK_ID, zName);
1e140 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 43 6f  .            zCo
1e150 6c 6e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20  lname = zName;. 
1e160 20 20 20 20 20 20 20 20 20 20 20 7a 54 6f 46 72             zToFr
1e170 65 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ee = 0;.        
1e180 20 20 20 20 69 66 28 20 6c 6f 6e 67 4e 61 6d 65      if( longName
1e190 73 20 7c 7c 20 70 54 61 62 4c 69 73 74 2d 3e 6e  s || pTabList->n
1e1a0 53 72 63 3e 31 20 29 7b 0a 20 20 20 20 20 20 20  Src>1 ){.       
1e1b0 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65         Expr *pLe
1e1c0 66 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ft;.            
1e1d0 20 20 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65    pLeft = sqlite
1e1e0 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 49 44 2c  3Expr(db, TK_ID,
1e1f0 20 7a 54 61 62 4e 61 6d 65 29 3b 0a 20 20 20 20   zTabName);.    
1e200 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 20            pExpr 
1e210 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
1e220 50 61 72 73 65 2c 20 54 4b 5f 44 4f 54 2c 20 70  Parse, TK_DOT, p
1e230 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20 30 29  Left, pRight, 0)
1e240 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1e250 69 66 28 20 6c 6f 6e 67 4e 61 6d 65 73 20 29 7b  if( longNames ){
1e260 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1e270 20 7a 43 6f 6c 6e 61 6d 65 20 3d 20 73 71 6c 69   zColname = sqli
1e280 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
1e290 25 73 2e 25 73 22 2c 20 7a 54 61 62 4e 61 6d 65  %s.%s", zTabName
1e2a0 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
1e2b0 20 20 20 20 20 20 20 20 20 20 7a 54 6f 46 72 65            zToFre
1e2c0 65 20 3d 20 7a 43 6f 6c 6e 61 6d 65 3b 0a 20 20  e = zColname;.  
1e2d0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
1e2e0 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
1e2f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
1e300 45 78 70 72 20 3d 20 70 52 69 67 68 74 3b 0a 20  Expr = pRight;. 
1e310 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
1e320 20 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20           pNew = 
1e330 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
1e340 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70 4e  ppend(pParse, pN
1e350 65 77 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20  ew, pExpr);.    
1e360 20 20 20 20 20 20 20 20 73 43 6f 6c 6e 61 6d 65          sColname
1e370 2e 7a 20 3d 20 7a 43 6f 6c 6e 61 6d 65 3b 0a 20  .z = zColname;. 
1e380 20 20 20 20 20 20 20 20 20 20 20 73 43 6f 6c 6e             sColn
1e390 61 6d 65 2e 6e 20 3d 20 73 71 6c 69 74 65 33 53  ame.n = sqlite3S
1e3a0 74 72 6c 65 6e 33 30 28 7a 43 6f 6c 6e 61 6d 65  trlen30(zColname
1e3b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
1e3c0 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 53 65  qlite3ExprListSe
1e3d0 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e  tName(pParse, pN
1e3e0 65 77 2c 20 26 73 43 6f 6c 6e 61 6d 65 2c 20 30  ew, &sColname, 0
1e3f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
1e400 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
1e410 20 7a 54 6f 46 72 65 65 29 3b 0a 20 20 20 20 20   zToFree);.     
1e420 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
1e430 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 74 61  .        if( !ta
1e440 62 6c 65 53 65 65 6e 20 29 7b 0a 20 20 20 20 20  bleSeen ){.     
1e450 20 20 20 20 20 69 66 28 20 7a 54 4e 61 6d 65 20       if( zTName 
1e460 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
1e470 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
1e480 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20  Parse, "no such 
1e490 74 61 62 6c 65 3a 20 25 73 22 2c 20 7a 54 4e 61  table: %s", zTNa
1e4a0 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  me);.          }
1e4b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1e4c0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
1e4d0 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 74 61  g(pParse, "no ta
1e4e0 62 6c 65 73 20 73 70 65 63 69 66 69 65 64 22 29  bles specified")
1e4f0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1e500 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1e510 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
1e520 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
1e530 64 62 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20  db, pEList);.   
1e540 20 70 2d 3e 70 45 4c 69 73 74 20 3d 20 70 4e 65   p->pEList = pNe
1e550 77 3b 0a 20 20 7d 0a 23 69 66 20 53 51 4c 49 54  w;.  }.#if SQLIT
1e560 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 0a 20 20 69  E_MAX_COLUMN.  i
1e570 66 28 20 70 2d 3e 70 45 4c 69 73 74 20 26 26 20  f( p->pEList && 
1e580 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
1e590 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49  >db->aLimit[SQLI
1e5a0 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d  TE_LIMIT_COLUMN]
1e5b0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
1e5c0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
1e5d0 22 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e  "too many column
1e5e0 73 20 69 6e 20 72 65 73 75 6c 74 20 73 65 74 22  s in result set"
1e5f0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
1e600 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
1e610 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4e 6f  nue;.}../*.** No
1e620 2d 6f 70 20 72 6f 75 74 69 6e 65 20 66 6f 72 20  -op routine for 
1e630 74 68 65 20 70 61 72 73 65 2d 74 72 65 65 20 77  the parse-tree w
1e640 61 6c 6b 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  alker..**.** Whe
1e650 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
1e660 73 20 74 68 65 20 57 61 6c 6b 65 72 2e 78 45 78  s the Walker.xEx
1e670 70 72 43 61 6c 6c 62 61 63 6b 20 74 68 65 6e 20  prCallback then 
1e680 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 73  expression trees
1e690 0a 2a 2a 20 61 72 65 20 77 61 6c 6b 65 64 20 77  .** are walked w
1e6a0 69 74 68 6f 75 74 20 61 6e 79 20 61 63 74 69 6f  ithout any actio
1e6b0 6e 73 20 62 65 69 6e 67 20 74 61 6b 65 6e 20 61  ns being taken a
1e6c0 74 20 65 61 63 68 20 6e 6f 64 65 2e 20 20 50 72  t each node.  Pr
1e6d0 65 73 75 6d 61 62 6c 79 2c 0a 2a 2a 20 77 68 65  esumably,.** whe
1e6e0 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
1e6f0 73 20 75 73 65 64 20 66 6f 72 20 57 61 6c 6b 65  s used for Walke
1e700 72 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20  r.xExprCallback 
1e710 74 68 65 6e 20 0a 2a 2a 20 57 61 6c 6b 65 72 2e  then .** Walker.
1e720 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20  xSelectCallback 
1e730 69 73 20 73 65 74 20 74 6f 20 64 6f 20 73 6f 6d  is set to do som
1e740 65 74 68 69 6e 67 20 75 73 65 66 75 6c 20 66 6f  ething useful fo
1e750 72 20 65 76 65 72 79 20 0a 2a 2a 20 73 75 62 71  r every .** subq
1e760 75 65 72 79 20 69 6e 20 74 68 65 20 70 61 72 73  uery in the pars
1e770 65 72 20 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74  er tree..*/.stat
1e780 69 63 20 69 6e 74 20 65 78 70 72 57 61 6c 6b 4e  ic int exprWalkN
1e790 6f 6f 70 28 57 61 6c 6b 65 72 20 2a 4e 6f 74 55  oop(Walker *NotU
1e7a0 73 65 64 2c 20 45 78 70 72 20 2a 4e 6f 74 55 73  sed, Expr *NotUs
1e7b0 65 64 32 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  ed2){.  UNUSED_P
1e7c0 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55 73 65  ARAMETER2(NotUse
1e7d0 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20  d, NotUsed2);.  
1e7e0 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
1e7f0 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  nue;.}../*.** Th
1e800 69 73 20 72 6f 75 74 69 6e 65 20 22 65 78 70 61  is routine "expa
1e810 6e 64 73 22 20 61 20 53 45 4c 45 43 54 20 73 74  nds" a SELECT st
1e820 61 74 65 6d 65 6e 74 20 61 6e 64 20 61 6c 6c 20  atement and all 
1e830 6f 66 20 69 74 73 20 73 75 62 71 75 65 72 69 65  of its subquerie
1e840 73 2e 0a 2a 2a 20 46 6f 72 20 61 64 64 69 74 69  s..** For additi
1e850 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
1e860 20 6f 6e 20 77 68 61 74 20 69 74 20 6d 65 61 6e   on what it mean
1e870 73 20 74 6f 20 22 65 78 70 61 6e 64 22 20 61 20  s to "expand" a 
1e880 53 45 4c 45 43 54 0a 2a 2a 20 73 74 61 74 65 6d  SELECT.** statem
1e890 65 6e 74 2c 20 73 65 65 20 74 68 65 20 63 6f 6d  ent, see the com
1e8a0 6d 65 6e 74 20 6f 6e 20 74 68 65 20 73 65 6c 65  ment on the sele
1e8b0 63 74 45 78 70 61 6e 64 20 77 6f 72 6b 65 72 20  ctExpand worker 
1e8c0 63 61 6c 6c 62 61 63 6b 20 61 62 6f 76 65 2e 0a  callback above..
1e8d0 2a 2a 0a 2a 2a 20 45 78 70 61 6e 64 69 6e 67 20  **.** Expanding 
1e8e0 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
1e8f0 6e 74 20 69 73 20 74 68 65 20 66 69 72 73 74 20  nt is the first 
1e900 73 74 65 70 20 69 6e 20 70 72 6f 63 65 73 73 69  step in processi
1e910 6e 67 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20 73  ng a.** SELECT s
1e920 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 53  tatement.  The S
1e930 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
1e940 6d 75 73 74 20 62 65 20 65 78 70 61 6e 64 65 64  must be expanded
1e950 20 62 65 66 6f 72 65 0a 2a 2a 20 6e 61 6d 65 20   before.** name 
1e960 72 65 73 6f 6c 75 74 69 6f 6e 20 69 73 20 70 65  resolution is pe
1e970 72 66 6f 72 6d 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  rformed..**.** I
1e980 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20  f anything goes 
1e990 77 72 6f 6e 67 2c 20 61 6e 20 65 72 72 6f 72 20  wrong, an error 
1e9a0 6d 65 73 73 61 67 65 20 69 73 20 77 72 69 74 74  message is writt
1e9b0 65 6e 20 69 6e 74 6f 20 70 50 61 72 73 65 2e 0a  en into pParse..
1e9c0 2a 2a 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66  ** The calling f
1e9d0 75 6e 63 74 69 6f 6e 20 63 61 6e 20 64 65 74 65  unction can dete
1e9e0 63 74 20 74 68 65 20 70 72 6f 62 6c 65 6d 20 62  ct the problem b
1e9f0 79 20 6c 6f 6f 6b 69 6e 67 20 61 74 20 70 50 61  y looking at pPa
1ea00 72 73 65 2d 3e 6e 45 72 72 0a 2a 2a 20 61 6e 64  rse->nErr.** and
1ea10 2f 6f 72 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  /or pParse->db->
1ea20 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 2e 0a 2a 2f  mallocFailed..*/
1ea30 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c  .static void sql
1ea40 69 74 65 33 53 65 6c 65 63 74 45 78 70 61 6e 64  ite3SelectExpand
1ea50 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1ea60 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29  Select *pSelect)
1ea70 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20  {.  Walker w;.  
1ea80 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  w.xSelectCallbac
1ea90 6b 20 3d 20 73 65 6c 65 63 74 45 78 70 61 6e 64  k = selectExpand
1eaa0 65 72 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c  er;.  w.xExprCal
1eab0 6c 62 61 63 6b 20 3d 20 65 78 70 72 57 61 6c 6b  lback = exprWalk
1eac0 4e 6f 6f 70 3b 0a 20 20 77 2e 70 50 61 72 73 65  Noop;.  w.pParse
1ead0 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 73 71 6c   = pParse;.  sql
1eae0 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 26  ite3WalkSelect(&
1eaf0 77 2c 20 70 53 65 6c 65 63 74 29 3b 0a 7d 0a 0a  w, pSelect);.}..
1eb00 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1eb10 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a  OMIT_SUBQUERY./*
1eb20 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 57 61  .** This is a Wa
1eb30 6c 6b 65 72 2e 78 53 65 6c 65 63 74 43 61 6c 6c  lker.xSelectCall
1eb40 62 61 63 6b 20 63 61 6c 6c 62 61 63 6b 20 66 6f  back callback fo
1eb50 72 20 74 68 65 20 73 71 6c 69 74 65 33 53 65 6c  r the sqlite3Sel
1eb60 65 63 74 54 79 70 65 49 6e 66 6f 28 29 0a 2a 2a  ectTypeInfo().**
1eb70 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2a 0a 2a   interface..**.*
1eb80 2a 20 46 6f 72 20 65 61 63 68 20 46 52 4f 4d 2d  * For each FROM-
1eb90 63 6c 61 75 73 65 20 73 75 62 71 75 65 72 79 2c  clause subquery,
1eba0 20 61 64 64 20 43 6f 6c 75 6d 6e 2e 7a 54 79 70   add Column.zTyp
1ebb0 65 20 61 6e 64 20 43 6f 6c 75 6d 6e 2e 7a 43 6f  e and Column.zCo
1ebc0 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f  ll.** informatio
1ebd0 6e 20 74 6f 20 74 68 65 20 54 61 62 6c 65 20 73  n to the Table s
1ebe0 74 72 75 63 74 75 72 65 20 74 68 61 74 20 72 65  tructure that re
1ebf0 70 72 65 73 65 6e 74 73 20 74 68 65 20 72 65 73  presents the res
1ec00 75 6c 74 20 73 65 74 0a 2a 2a 20 6f 66 20 74 68  ult set.** of th
1ec10 61 74 20 73 75 62 71 75 65 72 79 2e 0a 2a 2a 0a  at subquery..**.
1ec20 2a 2a 20 54 68 65 20 54 61 62 6c 65 20 73 74 72  ** The Table str
1ec30 75 63 74 75 72 65 20 74 68 61 74 20 72 65 70 72  ucture that repr
1ec40 65 73 65 6e 74 73 20 74 68 65 20 72 65 73 75 6c  esents the resul
1ec50 74 20 73 65 74 20 77 61 73 20 63 6f 6e 73 74 72  t set was constr
1ec60 75 63 74 65 64 0a 2a 2a 20 62 79 20 73 65 6c 65  ucted.** by sele
1ec70 63 74 45 78 70 61 6e 64 65 72 28 29 20 62 75 74  ctExpander() but
1ec80 20 74 68 65 20 74 79 70 65 20 61 6e 64 20 63 6f   the type and co
1ec90 6c 6c 61 74 69 6f 6e 20 69 6e 66 6f 72 6d 61 74  llation informat
1eca0 69 6f 6e 20 77 61 73 20 6f 6d 69 74 74 65 64 0a  ion was omitted.
1ecb0 2a 2a 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74  ** at that point
1ecc0 20 62 65 63 61 75 73 65 20 69 64 65 6e 74 69 66   because identif
1ecd0 69 65 72 73 20 68 61 64 20 6e 6f 74 20 79 65 74  iers had not yet
1ece0 20 62 65 65 6e 20 72 65 73 6f 6c 76 65 64 2e 20   been resolved. 
1ecf0 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   This.** routine
1ed00 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72   is called after
1ed10 20 69 64 65 6e 74 69 66 69 65 72 20 72 65 73 6f   identifier reso
1ed20 6c 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  lution..*/.stati
1ed30 63 20 69 6e 74 20 73 65 6c 65 63 74 41 64 64 53  c int selectAddS
1ed40 75 62 71 75 65 72 79 54 79 70 65 49 6e 66 6f 28  ubqueryTypeInfo(
1ed50 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c  Walker *pWalker,
1ed60 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 50   Select *p){.  P
1ed70 61 72 73 65 20 2a 70 50 61 72 73 65 3b 0a 20 20  arse *pParse;.  
1ed80 69 6e 74 20 69 3b 0a 20 20 53 72 63 4c 69 73 74  int i;.  SrcList
1ed90 20 2a 70 54 61 62 4c 69 73 74 3b 0a 20 20 73 74   *pTabList;.  st
1eda0 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
1edb0 6d 20 2a 70 46 72 6f 6d 3b 0a 0a 20 20 61 73 73  m *pFrom;..  ass
1edc0 65 72 74 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73  ert( p->selFlags
1edd0 20 26 20 53 46 5f 52 65 73 6f 6c 76 65 64 20 29   & SF_Resolved )
1ede0 3b 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46  ;.  if( (p->selF
1edf0 6c 61 67 73 20 26 20 53 46 5f 48 61 73 54 79 70  lags & SF_HasTyp
1ee00 65 49 6e 66 6f 29 3d 3d 30 20 29 7b 0a 20 20 20  eInfo)==0 ){.   
1ee10 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20   p->selFlags |= 
1ee20 53 46 5f 48 61 73 54 79 70 65 49 6e 66 6f 3b 0a  SF_HasTypeInfo;.
1ee30 20 20 20 20 70 50 61 72 73 65 20 3d 20 70 57 61      pParse = pWa
1ee40 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20  lker->pParse;.  
1ee50 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e    pTabList = p->
1ee60 70 53 72 63 3b 0a 20 20 20 20 66 6f 72 28 69 3d  pSrc;.    for(i=
1ee70 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73  0, pFrom=pTabLis
1ee80 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74  t->a; i<pTabList
1ee90 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72  ->nSrc; i++, pFr
1eea0 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 54 61 62  om++){.      Tab
1eeb0 6c 65 20 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d  le *pTab = pFrom
1eec0 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 69 66  ->pTab;.      if
1eed0 28 20 41 4c 57 41 59 53 28 70 54 61 62 21 3d 30  ( ALWAYS(pTab!=0
1eee0 29 20 26 26 20 28 70 54 61 62 2d 3e 74 61 62 46  ) && (pTab->tabF
1eef0 6c 61 67 73 20 26 20 54 46 5f 45 70 68 65 6d 65  lags & TF_Epheme
1ef00 72 61 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ral)!=0 ){.     
1ef10 20 20 20 2f 2a 20 41 20 73 75 62 2d 71 75 65 72     /* A sub-quer
1ef20 79 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  y in the FROM cl
1ef30 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54  ause of a SELECT
1ef40 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 65 6c 65   */.        Sele
1ef50 63 74 20 2a 70 53 65 6c 20 3d 20 70 46 72 6f 6d  ct *pSel = pFrom
1ef60 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20  ->pSelect;.     
1ef70 20 20 20 61 73 73 65 72 74 28 20 70 53 65 6c 20     assert( pSel 
1ef80 29 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  );.        while
1ef90 28 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 20 29  ( pSel->pPrior )
1efa0 20 70 53 65 6c 20 3d 20 70 53 65 6c 2d 3e 70 50   pSel = pSel->pP
1efb0 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 73 65  rior;.        se
1efc0 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70  lectAddColumnTyp
1efd0 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 70 50  eAndCollation(pP
1efe0 61 72 73 65 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c  arse, pTab->nCol
1eff0 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 2c 20 70 53  , pTab->aCol, pS
1f000 65 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  el);.      }.   
1f010 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1f020 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a  WRC_Continue;.}.
1f030 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54  #endif.../*.** T
1f040 68 69 73 20 72 6f 75 74 69 6e 65 20 61 64 64 73  his routine adds
1f050 20 64 61 74 61 74 79 70 65 20 61 6e 64 20 63 6f   datatype and co
1f060 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
1f070 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 0a   information to.
1f080 2a 2a 20 74 68 65 20 54 61 62 6c 65 20 73 74 72  ** the Table str
1f090 75 63 74 75 72 65 73 20 6f 66 20 61 6c 6c 20 46  uctures of all F
1f0a0 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62 71 75  ROM-clause subqu
1f0b0 65 72 69 65 73 20 69 6e 20 61 0a 2a 2a 20 53 45  eries in a.** SE
1f0c0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a  LECT statement..
1f0d0 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 69 73 20 72  **.** Use this r
1f0e0 6f 75 74 69 6e 65 20 61 66 74 65 72 20 6e 61 6d  outine after nam
1f0f0 65 20 72 65 73 6f 6c 75 74 69 6f 6e 2e 0a 2a 2f  e resolution..*/
1f100 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c  .static void sql
1f110 69 74 65 33 53 65 6c 65 63 74 41 64 64 54 79 70  ite3SelectAddTyp
1f120 65 49 6e 66 6f 28 50 61 72 73 65 20 2a 70 50 61  eInfo(Parse *pPa
1f130 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 53 65  rse, Select *pSe
1f140 6c 65 63 74 29 7b 0a 23 69 66 6e 64 65 66 20 53  lect){.#ifndef S
1f150 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
1f160 45 52 59 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a  ERY.  Walker w;.
1f170 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62    w.xSelectCallb
1f180 61 63 6b 20 3d 20 73 65 6c 65 63 74 41 64 64 53  ack = selectAddS
1f190 75 62 71 75 65 72 79 54 79 70 65 49 6e 66 6f 3b  ubqueryTypeInfo;
1f1a0 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61  .  w.xExprCallba
1f1b0 63 6b 20 3d 20 65 78 70 72 57 61 6c 6b 4e 6f 6f  ck = exprWalkNoo
1f1c0 70 3b 0a 20 20 77 2e 70 50 61 72 73 65 20 3d 20  p;.  w.pParse = 
1f1d0 70 50 61 72 73 65 3b 0a 20 20 73 71 6c 69 74 65  pParse;.  sqlite
1f1e0 33 57 61 6c 6b 53 65 6c 65 63 74 28 26 77 2c 20  3WalkSelect(&w, 
1f1f0 70 53 65 6c 65 63 74 29 3b 0a 23 65 6e 64 69 66  pSelect);.#endif
1f200 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .}.../*.** This 
1f210 72 6f 75 74 69 6e 65 20 73 65 74 73 20 75 70 20  routine sets up 
1f220 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
1f230 6e 74 20 66 6f 72 20 70 72 6f 63 65 73 73 69 6e  nt for processin
1f240 67 2e 20 20 54 68 65 0a 2a 2a 20 66 6f 6c 6c 6f  g.  The.** follo
1f250 77 69 6e 67 20 69 73 20 61 63 63 6f 6d 70 6c 69  wing is accompli
1f260 73 68 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  shed:.**.**     
1f270 2a 20 20 56 44 42 45 20 43 75 72 73 6f 72 20 6e  *  VDBE Cursor n
1f280 75 6d 62 65 72 73 20 61 72 65 20 61 73 73 69 67  umbers are assig
1f290 6e 65 64 20 74 6f 20 61 6c 6c 20 46 52 4f 4d 2d  ned to all FROM-
1f2a0 63 6c 61 75 73 65 20 74 65 72 6d 73 2e 0a 2a 2a  clause terms..**
1f2b0 20 20 20 20 20 2a 20 20 45 70 68 65 6d 65 72 61       *  Ephemera
1f2c0 6c 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 73 20  l Table objects 
1f2d0 61 72 65 20 63 72 65 61 74 65 64 20 66 6f 72 20  are created for 
1f2e0 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20  all FROM-clause 
1f2f0 73 75 62 71 75 65 72 69 65 73 2e 0a 2a 2a 20 20  subqueries..**  
1f300 20 20 20 2a 20 20 4f 4e 20 61 6e 64 20 55 53 49     *  ON and USI
1f310 4e 47 20 63 6c 61 75 73 65 73 20 61 72 65 20 73  NG clauses are s
1f320 68 69 66 74 65 64 20 69 6e 74 6f 20 57 48 45 52  hifted into WHER
1f330 45 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20  E statements.** 
1f340 20 20 20 20 2a 20 20 57 69 6c 64 63 61 72 64 73      *  Wildcards
1f350 20 22 2a 22 20 61 6e 64 20 22 54 41 42 4c 45 2e   "*" and "TABLE.
1f360 2a 22 20 69 6e 20 72 65 73 75 6c 74 20 73 65 74  *" in result set
1f370 73 20 61 72 65 20 65 78 70 61 6e 64 65 64 2e 0a  s are expanded..
1f380 2a 2a 20 20 20 20 20 2a 20 20 49 64 65 6e 74 69  **     *  Identi
1f390 66 69 65 72 73 20 69 6e 20 65 78 70 72 65 73 73  fiers in express
1f3a0 69 6f 6e 20 61 72 65 20 6d 61 74 63 68 65 64 20  ion are matched 
1f3b0 74 6f 20 74 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a  to tables..**.**
1f3c0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 63   This routine ac
1f3d0 74 73 20 72 65 63 75 72 73 69 76 65 6c 79 20 6f  ts recursively o
1f3e0 6e 20 61 6c 6c 20 73 75 62 71 75 65 72 69 65 73  n all subqueries
1f3f0 20 77 69 74 68 69 6e 20 74 68 65 20 53 45 4c 45   within the SELE
1f400 43 54 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  CT..*/.void sqli
1f410 74 65 33 53 65 6c 65 63 74 50 72 65 70 28 0a 20  te3SelectPrep(. 
1f420 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
1f430 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
1f440 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
1f450 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
1f460 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1f470 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
1f480 74 20 62 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a  t being coded. *
1f490 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20  /.  NameContext 
1f4a0 2a 70 4f 75 74 65 72 4e 43 20 20 2f 2a 20 4e 61  *pOuterNC  /* Na
1f4b0 6d 65 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 63  me context for c
1f4c0 6f 6e 74 61 69 6e 65 72 20 2a 2f 0a 29 7b 0a 20  ontainer */.){. 
1f4d0 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
1f4e0 69 66 28 20 4e 45 56 45 52 28 70 3d 3d 30 29 20  if( NEVER(p==0) 
1f4f0 29 20 72 65 74 75 72 6e 3b 0a 20 20 64 62 20 3d  ) return;.  db =
1f500 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
1f510 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  f( p->selFlags &
1f520 20 53 46 5f 48 61 73 54 79 70 65 49 6e 66 6f 20   SF_HasTypeInfo 
1f530 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69  ) return;.  sqli
1f540 74 65 33 53 65 6c 65 63 74 45 78 70 61 6e 64 28  te3SelectExpand(
1f550 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 69 66  pParse, p);.  if
1f560 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  ( pParse->nErr |
1f570 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
1f580 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73  ed ) return;.  s
1f590 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 53 65 6c  qlite3ResolveSel
1f5a0 65 63 74 4e 61 6d 65 73 28 70 50 61 72 73 65 2c  ectNames(pParse,
1f5b0 20 70 2c 20 70 4f 75 74 65 72 4e 43 29 3b 0a 20   p, pOuterNC);. 
1f5c0 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
1f5d0 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  r || db->mallocF
1f5e0 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a  ailed ) return;.
1f5f0 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41    sqlite3SelectA
1f600 64 64 54 79 70 65 49 6e 66 6f 28 70 50 61 72 73  ddTypeInfo(pPars
1f610 65 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  e, p);.}../*.** 
1f620 52 65 73 65 74 20 74 68 65 20 61 67 67 72 65 67  Reset the aggreg
1f630 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 2e  ate accumulator.
1f640 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 67 67 72 65  .**.** The aggre
1f650 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72  gate accumulator
1f660 20 69 73 20 61 20 73 65 74 20 6f 66 20 6d 65 6d   is a set of mem
1f670 6f 72 79 20 63 65 6c 6c 73 20 74 68 61 74 20 68  ory cells that h
1f680 6f 6c 64 0a 2a 2a 20 69 6e 74 65 72 6d 65 64 69  old.** intermedi
1f690 61 74 65 20 72 65 73 75 6c 74 73 20 77 68 69 6c  ate results whil
1f6a0 65 20 63 61 6c 63 75 6c 61 74 69 6e 67 20 61 6e  e calculating an
1f6b0 20 61 67 67 72 65 67 61 74 65 2e 20 20 54 68 69   aggregate.  Thi
1f6c0 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67 65 6e  s.** routine gen
1f6d0 65 72 61 74 65 73 20 63 6f 64 65 20 74 68 61 74  erates code that
1f6e0 20 73 74 6f 72 65 73 20 4e 55 4c 4c 73 20 69 6e   stores NULLs in
1f6f0 20 61 6c 6c 20 6f 66 20 74 68 6f 73 65 20 6d 65   all of those me
1f700 6d 6f 72 79 0a 2a 2a 20 63 65 6c 6c 73 2e 0a 2a  mory.** cells..*
1f710 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  /.static void re
1f720 73 65 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 50  setAccumulator(P
1f730 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67  arse *pParse, Ag
1f740 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29  gInfo *pAggInfo)
1f750 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
1f760 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
1f770 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 41  nt i;.  struct A
1f780 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 75  ggInfo_func *pFu
1f790 6e 63 3b 0a 20 20 69 66 28 20 70 41 67 67 49 6e  nc;.  if( pAggIn
1f7a0 66 6f 2d 3e 6e 46 75 6e 63 2b 70 41 67 67 49 6e  fo->nFunc+pAggIn
1f7b0 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 30 20 29  fo->nColumn==0 )
1f7c0 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
1f7d0 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  }.  for(i=0; i<p
1f7e0 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e  AggInfo->nColumn
1f7f0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; i++){.    sqli
1f800 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1f810 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 41 67   OP_Null, 0, pAg
1f820 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e 69  gInfo->aCol[i].i
1f830 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  Mem);.  }.  for(
1f840 70 46 75 6e 63 3d 70 41 67 67 49 6e 66 6f 2d 3e  pFunc=pAggInfo->
1f850 61 46 75 6e 63 2c 20 69 3d 30 3b 20 69 3c 70 41  aFunc, i=0; i<pA
1f860 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69  ggInfo->nFunc; i
1f870 2b 2b 2c 20 70 46 75 6e 63 2b 2b 29 7b 0a 20 20  ++, pFunc++){.  
1f880 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1f890 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  Op2(v, OP_Null, 
1f8a0 30 2c 20 70 46 75 6e 63 2d 3e 69 4d 65 6d 29 3b  0, pFunc->iMem);
1f8b0 0a 20 20 20 20 69 66 28 20 70 46 75 6e 63 2d 3e  .    if( pFunc->
1f8c0 69 44 69 73 74 69 6e 63 74 3e 3d 30 20 29 7b 0a  iDistinct>=0 ){.
1f8d0 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d        Expr *pE =
1f8e0 20 70 46 75 6e 63 2d 3e 70 45 78 70 72 3b 0a 20   pFunc->pExpr;. 
1f8f0 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
1f900 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
1f910 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
1f920 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 2d  );.      if( pE-
1f930 3e 78 2e 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70  >x.pList==0 || p
1f940 45 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70  E->x.pList->nExp
1f950 72 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  r!=1 ){.        
1f960 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
1f970 70 50 61 72 73 65 2c 20 22 44 49 53 54 49 4e 43  pParse, "DISTINC
1f980 54 20 61 67 67 72 65 67 61 74 65 73 20 6d 75 73  T aggregates mus
1f990 74 20 68 61 76 65 20 65 78 61 63 74 6c 79 20 6f  t have exactly o
1f9a0 6e 65 20 22 0a 20 20 20 20 20 20 20 20 20 20 20  ne ".           
1f9b0 22 61 72 67 75 6d 65 6e 74 22 29 3b 0a 20 20 20  "argument");.   
1f9c0 20 20 20 20 20 70 46 75 6e 63 2d 3e 69 44 69 73       pFunc->iDis
1f9d0 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 20 20  tinct = -1;.    
1f9e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1f9f0 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
1fa00 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d  fo = keyInfoFrom
1fa10 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
1fa20 20 70 45 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20   pE->x.pList);. 
1fa30 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1fa40 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f  beAddOp4(v, OP_O
1fa50 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70 46  penEphemeral, pF
1fa60 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74 2c 20  unc->iDistinct, 
1fa70 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  0, 0,.          
1fa80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fa90 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c  (char*)pKeyInfo,
1faa0 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44   P4_KEYINFO_HAND
1fab0 4f 46 46 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OFF);.      }.  
1fac0 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
1fad0 20 49 6e 76 6f 6b 65 20 74 68 65 20 4f 50 5f 41   Invoke the OP_A
1fae0 67 67 46 69 6e 61 6c 69 7a 65 20 6f 70 63 6f 64  ggFinalize opcod
1faf0 65 20 66 6f 72 20 65 76 65 72 79 20 61 67 67 72  e for every aggr
1fb00 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 0a 2a  egate function.*
1fb10 2a 20 69 6e 20 74 68 65 20 41 67 67 49 6e 66 6f  * in the AggInfo
1fb20 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73   structure..*/.s
1fb30 74 61 74 69 63 20 76 6f 69 64 20 66 69 6e 61 6c  tatic void final
1fb40 69 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e 73 28  izeAggFunctions(
1fb50 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41  Parse *pParse, A
1fb60 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f  ggInfo *pAggInfo
1fb70 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
1fb80 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
1fb90 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
1fba0 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46  AggInfo_func *pF
1fbb0 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 3d  ;.  for(i=0, pF=
1fbc0 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b  pAggInfo->aFunc;
1fbd0 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75   i<pAggInfo->nFu
1fbe0 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a  nc; i++, pF++){.
1fbf0 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c      ExprList *pL
1fc00 69 73 74 20 3d 20 70 46 2d 3e 70 45 78 70 72 2d  ist = pF->pExpr-
1fc10 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 61 73  >x.pList;.    as
1fc20 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
1fc30 6f 70 65 72 74 79 28 70 46 2d 3e 70 45 78 70 72  operty(pF->pExpr
1fc40 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
1fc50 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
1fc60 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 41  beAddOp4(v, OP_A
1fc70 67 67 46 69 6e 61 6c 2c 20 70 46 2d 3e 69 4d 65  ggFinal, pF->iMe
1fc80 6d 2c 20 70 4c 69 73 74 20 3f 20 70 4c 69 73 74  m, pList ? pList
1fc90 2d 3e 6e 45 78 70 72 20 3a 20 30 2c 20 30 2c 0a  ->nExpr : 0, 0,.
1fca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fcb0 20 20 20 20 20 20 28 76 6f 69 64 2a 29 70 46 2d        (void*)pF-
1fcc0 3e 70 46 75 6e 63 2c 20 50 34 5f 46 55 4e 43 44  >pFunc, P4_FUNCD
1fcd0 45 46 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  EF);.  }.}../*.*
1fce0 2a 20 55 70 64 61 74 65 20 74 68 65 20 61 63 63  * Update the acc
1fcf0 75 6d 75 6c 61 74 6f 72 20 6d 65 6d 6f 72 79 20  umulator memory 
1fd00 63 65 6c 6c 73 20 66 6f 72 20 61 6e 20 61 67 67  cells for an agg
1fd10 72 65 67 61 74 65 20 62 61 73 65 64 20 6f 6e 0a  regate based on.
1fd20 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  ** the current c
1fd30 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2e 0a  ursor position..
1fd40 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75  */.static void u
1fd50 70 64 61 74 65 41 63 63 75 6d 75 6c 61 74 6f 72  pdateAccumulator
1fd60 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1fd70 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66  AggInfo *pAggInf
1fd80 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  o){.  Vdbe *v = 
1fd90 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
1fda0 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 65   int i;.  int re
1fdb0 67 48 69 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20  gHit = 0;.  int 
1fdc0 61 64 64 72 48 69 74 54 65 73 74 20 3d 20 30 3b  addrHitTest = 0;
1fdd0 0a 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66  .  struct AggInf
1fde0 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a 20 20 73 74  o_func *pF;.  st
1fdf0 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c  ruct AggInfo_col
1fe00 20 2a 70 43 3b 0a 0a 20 20 70 41 67 67 49 6e 66   *pC;..  pAggInf
1fe10 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20 3d 20  o->directMode = 
1fe20 31 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  1;.  sqlite3Expr
1fe30 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73  CacheClear(pPars
1fe40 65 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70  e);.  for(i=0, p
1fe50 46 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e  F=pAggInfo->aFun
1fe60 63 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e  c; i<pAggInfo->n
1fe70 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29  Func; i++, pF++)
1fe80 7b 0a 20 20 20 20 69 6e 74 20 6e 41 72 67 3b 0a  {.    int nArg;.
1fe90 20 20 20 20 69 6e 74 20 61 64 64 72 4e 65 78 74      int addrNext
1fea0 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 72 65   = 0;.    int re
1feb0 67 41 67 67 3b 0a 20 20 20 20 45 78 70 72 4c 69  gAgg;.    ExprLi
1fec0 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 46 2d 3e  st *pList = pF->
1fed0 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a  pExpr->x.pList;.
1fee0 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
1fef0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 46 2d  rHasProperty(pF-
1ff00 3e 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  >pExpr, EP_xIsSe
1ff10 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 69 66 28  lect) );.    if(
1ff20 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20   pList ){.      
1ff30 6e 41 72 67 20 3d 20 70 4c 69 73 74 2d 3e 6e 45  nArg = pList->nE
1ff40 78 70 72 3b 0a 20 20 20 20 20 20 72 65 67 41 67  xpr;.      regAg
1ff50 67 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  g = sqlite3GetTe
1ff60 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
1ff70 6e 41 72 67 29 3b 0a 20 20 20 20 20 20 73 71 6c  nArg);.      sql
1ff80 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72  ite3ExprCodeExpr
1ff90 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 4c 69  List(pParse, pLi
1ffa0 73 74 2c 20 72 65 67 41 67 67 2c 20 31 29 3b 0a  st, regAgg, 1);.
1ffb0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1ffc0 20 6e 41 72 67 20 3d 20 30 3b 0a 20 20 20 20 20   nArg = 0;.     
1ffd0 20 72 65 67 41 67 67 20 3d 20 30 3b 0a 20 20 20   regAgg = 0;.   
1ffe0 20 7d 0a 20 20 20 20 69 66 28 20 70 46 2d 3e 69   }.    if( pF->i
1fff0 44 69 73 74 69 6e 63 74 3e 3d 30 20 29 7b 0a 20  Distinct>=0 ){. 
20000 20 20 20 20 20 61 64 64 72 4e 65 78 74 20 3d 20       addrNext = 
20010 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
20020 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 61  abel(v);.      a
20030 73 73 65 72 74 28 20 6e 41 72 67 3d 3d 31 20 29  ssert( nArg==1 )
20040 3b 0a 20 20 20 20 20 20 63 6f 64 65 44 69 73 74  ;.      codeDist
20050 69 6e 63 74 28 70 50 61 72 73 65 2c 20 70 46 2d  inct(pParse, pF-
20060 3e 69 44 69 73 74 69 6e 63 74 2c 20 61 64 64 72  >iDistinct, addr
20070 4e 65 78 74 2c 20 31 2c 20 72 65 67 41 67 67 29  Next, 1, regAgg)
20080 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
20090 70 46 2d 3e 70 46 75 6e 63 2d 3e 66 6c 61 67 73  pF->pFunc->flags
200a0 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e   & SQLITE_FUNC_N
200b0 45 45 44 43 4f 4c 4c 20 29 7b 0a 20 20 20 20 20  EEDCOLL ){.     
200c0 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20   CollSeq *pColl 
200d0 3d 20 30 3b 0a 20 20 20 20 20 20 73 74 72 75 63  = 0;.      struc
200e0 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
200f0 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 69 6e  *pItem;.      in
20100 74 20 6a 3b 0a 20 20 20 20 20 20 61 73 73 65 72  t j;.      asser
20110 74 28 20 70 4c 69 73 74 21 3d 30 20 29 3b 20 20  t( pList!=0 );  
20120 2f 2a 20 70 4c 69 73 74 21 3d 30 20 69 66 20 70  /* pList!=0 if p
20130 46 2d 3e 70 46 75 6e 63 20 68 61 73 20 4e 45 45  F->pFunc has NEE
20140 44 43 4f 4c 4c 20 2a 2f 0a 20 20 20 20 20 20 66  DCOLL */.      f
20150 6f 72 28 6a 3d 30 2c 20 70 49 74 65 6d 3d 70 4c  or(j=0, pItem=pL
20160 69 73 74 2d 3e 61 3b 20 21 70 43 6f 6c 6c 20 26  ist->a; !pColl &
20170 26 20 6a 3c 6e 41 72 67 3b 20 6a 2b 2b 2c 20 70  & j<nArg; j++, p
20180 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Item++){.       
20190 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
201a0 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
201b0 73 65 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72  se, pItem->pExpr
201c0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
201d0 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20   if( !pColl ){. 
201e0 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 70         pColl = p
201f0 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74  Parse->db->pDflt
20200 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Coll;.      }.  
20210 20 20 20 20 69 66 28 20 72 65 67 48 69 74 3d 3d      if( regHit==
20220 30 20 26 26 20 70 41 67 67 49 6e 66 6f 2d 3e 6e  0 && pAggInfo->n
20230 41 63 63 75 6d 75 6c 61 74 6f 72 20 29 20 72 65  Accumulator ) re
20240 67 48 69 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d  gHit = ++pParse-
20250 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c  >nMem;.      sql
20260 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
20270 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20 72 65  , OP_CollSeq, re
20280 67 48 69 74 2c 20 30 2c 20 30 2c 20 28 63 68 61  gHit, 0, 0, (cha
20290 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f  r *)pColl, P4_CO
202a0 4c 4c 53 45 51 29 3b 0a 20 20 20 20 7d 0a 20 20  LLSEQ);.    }.  
202b0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
202c0 4f 70 34 28 76 2c 20 4f 50 5f 41 67 67 53 74 65  Op4(v, OP_AggSte
202d0 70 2c 20 30 2c 20 72 65 67 41 67 67 2c 20 70 46  p, 0, regAgg, pF
202e0 2d 3e 69 4d 65 6d 2c 0a 20 20 20 20 20 20 20 20  ->iMem,.        
202f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 76                (v
20300 6f 69 64 2a 29 70 46 2d 3e 70 46 75 6e 63 2c 20  oid*)pF->pFunc, 
20310 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 20  P4_FUNCDEF);.   
20320 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
20330 67 65 50 35 28 76 2c 20 28 75 38 29 6e 41 72 67  geP5(v, (u8)nArg
20340 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
20350 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43  prCacheAffinityC
20360 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65  hange(pParse, re
20370 67 41 67 67 2c 20 6e 41 72 67 29 3b 0a 20 20 20  gAgg, nArg);.   
20380 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
20390 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
203a0 20 72 65 67 41 67 67 2c 20 6e 41 72 67 29 3b 0a   regAgg, nArg);.
203b0 20 20 20 20 69 66 28 20 61 64 64 72 4e 65 78 74      if( addrNext
203c0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
203d0 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
203e0 6c 28 76 2c 20 61 64 64 72 4e 65 78 74 29 3b 0a  l(v, addrNext);.
203f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
20400 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72  rCacheClear(pPar
20410 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  se);.    }.  }..
20420 20 20 2f 2a 20 42 65 66 6f 72 65 20 70 6f 70 75    /* Before popu
20430 6c 61 74 69 6e 67 20 74 68 65 20 61 63 63 75 6d  lating the accum
20440 75 6c 61 74 6f 72 20 72 65 67 69 73 74 65 72 73  ulator registers
20450 2c 20 63 6c 65 61 72 20 74 68 65 20 63 6f 6c 75  , clear the colu
20460 6d 6e 20 63 61 63 68 65 2e 0a 20 20 2a 2a 20 4f  mn cache..  ** O
20470 74 68 65 72 77 69 73 65 2c 20 69 66 20 61 6e 79  therwise, if any
20480 20 6f 66 20 74 68 65 20 72 65 71 75 69 72 65 64   of the required
20490 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 73 20 61   column values a
204a0 72 65 20 61 6c 72 65 61 64 79 20 70 72 65 73 65  re already prese
204b0 6e 74 20 0a 20 20 2a 2a 20 69 6e 20 72 65 67 69  nt .  ** in regi
204c0 73 74 65 72 73 2c 20 73 71 6c 69 74 65 33 45 78  sters, sqlite3Ex
204d0 70 72 43 6f 64 65 28 29 20 6d 61 79 20 75 73 65  prCode() may use
204e0 20 4f 50 5f 53 43 6f 70 79 20 74 6f 20 63 6f 70   OP_SCopy to cop
204f0 79 20 74 68 65 20 76 61 6c 75 65 0a 20 20 2a 2a  y the value.  **
20500 20 74 6f 20 70 43 2d 3e 69 4d 65 6d 2e 20 42 75   to pC->iMem. Bu
20510 74 20 62 79 20 74 68 65 20 74 69 6d 65 20 74 68  t by the time th
20520 65 20 76 61 6c 75 65 20 69 73 20 75 73 65 64 2c  e value is used,
20530 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 72 65   the original re
20540 67 69 73 74 65 72 0a 20 20 2a 2a 20 6d 61 79 20  gister.  ** may 
20550 68 61 76 65 20 62 65 65 6e 20 75 73 65 64 2c 20  have been used, 
20560 69 6e 76 61 6c 69 64 61 74 69 6e 67 20 74 68 65  invalidating the
20570 20 75 6e 64 65 72 6c 79 69 6e 67 20 62 75 66 66   underlying buff
20580 65 72 20 68 6f 6c 64 69 6e 67 20 74 68 65 0a 20  er holding the. 
20590 20 2a 2a 20 74 65 78 74 20 6f 72 20 62 6c 6f 62   ** text or blob
205a0 20 76 61 6c 75 65 2e 20 53 65 65 20 74 69 63 6b   value. See tick
205b0 65 74 20 5b 38 38 33 30 33 34 64 63 62 35 5d 2e  et [883034dcb5].
205c0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 6f 74 68  .  **.  ** Anoth
205d0 65 72 20 73 6f 6c 75 74 69 6f 6e 20 77 6f 75 6c  er solution woul
205e0 64 20 62 65 20 74 6f 20 63 68 61 6e 67 65 20 74  d be to change t
205f0 68 65 20 4f 50 5f 53 43 6f 70 79 20 75 73 65 64  he OP_SCopy used
20600 20 74 6f 20 63 6f 70 79 20 63 61 63 68 65 64 0a   to copy cached.
20610 20 20 2a 2a 20 76 61 6c 75 65 73 20 74 6f 20 61    ** values to a
20620 6e 20 4f 50 5f 43 6f 70 79 2e 0a 20 20 2a 2f 0a  n OP_Copy..  */.
20630 20 20 69 66 28 20 72 65 67 48 69 74 20 29 7b 0a    if( regHit ){.
20640 20 20 20 20 61 64 64 72 48 69 74 54 65 73 74 20      addrHitTest 
20650 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
20660 4f 70 31 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65  Op1(v, OP_If, re
20670 67 48 69 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  gHit);.  }.  sql
20680 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65  ite3ExprCacheCle
20690 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 66 6f  ar(pParse);.  fo
206a0 72 28 69 3d 30 2c 20 70 43 3d 70 41 67 67 49 6e  r(i=0, pC=pAggIn
206b0 66 6f 2d 3e 61 43 6f 6c 3b 20 69 3c 70 41 67 67  fo->aCol; i<pAgg
206c0 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61 74  Info->nAccumulat
206d0 6f 72 3b 20 69 2b 2b 2c 20 70 43 2b 2b 29 7b 0a  or; i++, pC++){.
206e0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
206f0 6f 64 65 28 70 50 61 72 73 65 2c 20 70 43 2d 3e  ode(pParse, pC->
20700 70 45 78 70 72 2c 20 70 43 2d 3e 69 4d 65 6d 29  pExpr, pC->iMem)
20710 3b 0a 20 20 7d 0a 20 20 70 41 67 67 49 6e 66 6f  ;.  }.  pAggInfo
20720 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20 3d 20 30  ->directMode = 0
20730 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43  ;.  sqlite3ExprC
20740 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65  acheClear(pParse
20750 29 3b 0a 20 20 69 66 28 20 61 64 64 72 48 69 74  );.  if( addrHit
20760 54 65 73 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  Test ){.    sqli
20770 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
20780 76 2c 20 61 64 64 72 48 69 74 54 65 73 74 29 3b  v, addrHitTest);
20790 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  .  }.}../*.** Ad
207a0 64 20 61 20 73 69 6e 67 6c 65 20 4f 50 5f 45 78  d a single OP_Ex
207b0 70 6c 61 69 6e 20 69 6e 73 74 72 75 63 74 69 6f  plain instructio
207c0 6e 20 74 6f 20 74 68 65 20 56 44 42 45 20 74 6f  n to the VDBE to
207d0 20 65 78 70 6c 61 69 6e 20 61 20 73 69 6d 70 6c   explain a simpl
207e0 65 0a 2a 2a 20 63 6f 75 6e 74 28 2a 29 20 71 75  e.** count(*) qu
207f0 65 72 79 20 28 22 53 45 4c 45 43 54 20 63 6f 75  ery ("SELECT cou
20800 6e 74 28 2a 29 20 46 52 4f 4d 20 70 54 61 62 22  nt(*) FROM pTab"
20810 29 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  )..*/.#ifndef SQ
20820 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
20830 4e 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78  N.static void ex
20840 70 6c 61 69 6e 53 69 6d 70 6c 65 43 6f 75 6e 74  plainSimpleCount
20850 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
20860 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
20870 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e      /* Parse con
20880 74 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20  text */.  Table 
20890 2a 70 54 61 62 2c 20 20 20 20 20 20 20 20 20 20  *pTab,          
208a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62            /* Tab
208b0 6c 65 20 62 65 69 6e 67 20 71 75 65 72 69 65 64  le being queried
208c0 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64   */.  Index *pId
208d0 78 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x               
208e0 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 75        /* Index u
208f0 73 65 64 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20  sed to optimize 
20900 73 63 61 6e 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f  scan, or NULL */
20910 0a 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65  .){.  if( pParse
20920 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a  ->explain==2 ){.
20930 20 20 20 20 63 68 61 72 20 2a 7a 45 71 70 20 3d      char *zEqp =
20940 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
20950 70 50 61 72 73 65 2d 3e 64 62 2c 20 22 53 43 41  pParse->db, "SCA
20960 4e 20 54 41 42 4c 45 20 25 73 20 25 73 25 73 28  N TABLE %s %s%s(
20970 7e 25 64 20 72 6f 77 73 29 22 2c 0a 20 20 20 20  ~%d rows)",.    
20980 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c      pTab->zName,
20990 20 0a 20 20 20 20 20 20 20 20 70 49 64 78 20 3f   .        pIdx ?
209a0 20 22 55 53 49 4e 47 20 43 4f 56 45 52 49 4e 47   "USING COVERING
209b0 20 49 4e 44 45 58 20 22 20 3a 20 22 22 2c 0a 20   INDEX " : "",. 
209c0 20 20 20 20 20 20 20 70 49 64 78 20 3f 20 70 49         pIdx ? pI
209d0 64 78 2d 3e 7a 4e 61 6d 65 20 3a 20 22 22 2c 0a  dx->zName : "",.
209e0 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 52          pTab->nR
209f0 6f 77 45 73 74 0a 20 20 20 20 29 3b 0a 20 20 20  owEst.    );.   
20a00 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
20a10 70 34 28 0a 20 20 20 20 20 20 20 20 70 50 61 72  p4(.        pPar
20a20 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 45 78  se->pVdbe, OP_Ex
20a30 70 6c 61 69 6e 2c 20 70 50 61 72 73 65 2d 3e 69  plain, pParse->i
20a40 53 65 6c 65 63 74 49 64 2c 20 30 2c 20 30 2c 20  SelectId, 0, 0, 
20a50 7a 45 71 70 2c 20 50 34 5f 44 59 4e 41 4d 49 43  zEqp, P4_DYNAMIC
20a60 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65  .    );.  }.}.#e
20a70 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 65 78 70  lse.# define exp
20a80 6c 61 69 6e 53 69 6d 70 6c 65 43 6f 75 6e 74 28  lainSimpleCount(
20a90 61 2c 62 2c 63 29 0a 23 65 6e 64 69 66 0a 0a 2f  a,b,c).#endif../
20aa0 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
20ab0 64 65 20 66 6f 72 20 74 68 65 20 53 45 4c 45 43  de for the SELEC
20ac0 54 20 73 74 61 74 65 6d 65 6e 74 20 67 69 76 65  T statement give
20ad0 6e 20 69 6e 20 74 68 65 20 70 20 61 72 67 75 6d  n in the p argum
20ae0 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65  ent.  .**.** The
20af0 20 72 65 73 75 6c 74 73 20 61 72 65 20 64 69 73   results are dis
20b00 74 72 69 62 75 74 65 64 20 69 6e 20 76 61 72 69  tributed in vari
20b10 6f 75 73 20 77 61 79 73 20 64 65 70 65 6e 64 69  ous ways dependi
20b20 6e 67 20 6f 6e 20 74 68 65 0a 2a 2a 20 63 6f 6e  ng on the.** con
20b30 74 65 6e 74 73 20 6f 66 20 74 68 65 20 53 65 6c  tents of the Sel
20b40 65 63 74 44 65 73 74 20 73 74 72 75 63 74 75 72  ectDest structur
20b50 65 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  e pointed to by 
20b60 61 72 67 75 6d 65 6e 74 20 70 44 65 73 74 0a 2a  argument pDest.*
20b70 2a 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  * as follows:.**
20b80 0a 2a 2a 20 20 20 20 20 70 44 65 73 74 2d 3e 65  .**     pDest->e
20b90 44 65 73 74 20 20 20 20 52 65 73 75 6c 74 0a 2a  Dest    Result.*
20ba0 2a 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *     ----------
20bb0 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  --    ----------
20bc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
20bd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
20be0 2d 0a 2a 2a 20 20 20 20 20 53 52 54 5f 4f 75 74  -.**     SRT_Out
20bf0 70 75 74 20 20 20 20 20 20 47 65 6e 65 72 61 74  put      Generat
20c00 65 20 61 20 72 6f 77 20 6f 66 20 6f 75 74 70 75  e a row of outpu
20c10 74 20 28 75 73 69 6e 67 20 74 68 65 20 4f 50 5f  t (using the OP_
20c20 52 65 73 75 6c 74 52 6f 77 0a 2a 2a 20 20 20 20  ResultRow.**    
20c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20c40 20 6f 70 63 6f 64 65 29 20 66 6f 72 20 65 61 63   opcode) for eac
20c50 68 20 72 6f 77 20 69 6e 20 74 68 65 20 72 65 73  h row in the res
20c60 75 6c 74 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 20  ult set..**.**  
20c70 20 20 20 53 52 54 5f 4d 65 6d 20 20 20 20 20 20     SRT_Mem      
20c80 20 20 20 4f 6e 6c 79 20 76 61 6c 69 64 20 69 66     Only valid if
20c90 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 61   the result is a
20ca0 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 2e 0a   single column..
20cb0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
20cc0 20 20 20 20 20 20 20 53 74 6f 72 65 20 74 68 65         Store the
20cd0 20 66 69 72 73 74 20 63 6f 6c 75 6d 6e 20 6f 66   first column of
20ce0 20 74 68 65 20 66 69 72 73 74 20 72 65 73 75 6c   the first resul
20cf0 74 20 72 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20  t row.**        
20d00 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 20               in 
20d10 72 65 67 69 73 74 65 72 20 70 44 65 73 74 2d 3e  register pDest->
20d20 69 53 44 50 61 72 6d 20 74 68 65 6e 20 61 62 61  iSDParm then aba
20d30 6e 64 6f 6e 20 74 68 65 20 72 65 73 74 0a 2a 2a  ndon the rest.**
20d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20d50 20 20 20 20 20 6f 66 20 74 68 65 20 71 75 65 72       of the quer
20d60 79 2e 20 20 54 68 69 73 20 64 65 73 74 69 6e 61  y.  This destina
20d70 74 69 6f 6e 20 69 6d 70 6c 69 65 73 20 22 4c 49  tion implies "LI
20d80 4d 49 54 20 31 22 2e 0a 2a 2a 0a 2a 2a 20 20 20  MIT 1"..**.**   
20d90 20 20 53 52 54 5f 53 65 74 20 20 20 20 20 20 20    SRT_Set       
20da0 20 20 54 68 65 20 72 65 73 75 6c 74 20 6d 75 73    The result mus
20db0 74 20 62 65 20 61 20 73 69 6e 67 6c 65 20 63 6f  t be a single co
20dc0 6c 75 6d 6e 2e 20 20 53 74 6f 72 65 20 65 61 63  lumn.  Store eac
20dd0 68 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  h.**            
20de0 20 20 20 20 20 20 20 20 20 72 6f 77 20 6f 66 20           row of 
20df0 72 65 73 75 6c 74 20 61 73 20 74 68 65 20 6b 65  result as the ke
20e00 79 20 69 6e 20 74 61 62 6c 65 20 70 44 65 73 74  y in table pDest
20e10 2d 3e 69 53 44 50 61 72 6d 2e 20 0a 2a 2a 20 20  ->iSDParm. .**  
20e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20e30 20 20 20 41 70 70 6c 79 20 74 68 65 20 61 66 66     Apply the aff
20e40 69 6e 69 74 79 20 70 44 65 73 74 2d 3e 61 66 66  inity pDest->aff
20e50 53 64 73 74 20 62 65 66 6f 72 65 20 73 74 6f 72  Sdst before stor
20e60 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ing.**          
20e70 20 20 20 20 20 20 20 20 20 20 20 72 65 73 75 6c             resul
20e80 74 73 2e 20 20 55 73 65 64 20 74 6f 20 69 6d 70  ts.  Used to imp
20e90 6c 65 6d 65 6e 74 20 22 49 4e 20 28 53 45 4c 45  lement "IN (SELE
20ea0 43 54 20 2e 2e 2e 29 22 2e 0a 2a 2a 0a 2a 2a 20  CT ...)"..**.** 
20eb0 20 20 20 20 53 52 54 5f 55 6e 69 6f 6e 20 20 20      SRT_Union   
20ec0 20 20 20 20 53 74 6f 72 65 20 72 65 73 75 6c 74      Store result
20ed0 73 20 61 73 20 61 20 6b 65 79 20 69 6e 20 61 20  s as a key in a 
20ee0 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
20ef0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
20f00 20 20 20 20 20 20 20 20 69 64 65 6e 74 69 66 69          identifi
20f10 65 64 20 62 79 20 70 44 65 73 74 2d 3e 69 53 44  ed by pDest->iSD
20f20 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  Parm..**.**     
20f30 53 52 54 5f 45 78 63 65 70 74 20 20 20 20 20 20  SRT_Except      
20f40 52 65 6d 6f 76 65 20 72 65 73 75 6c 74 73 20 66  Remove results f
20f50 72 6f 6d 20 74 68 65 20 74 65 6d 70 6f 72 61 72  rom the temporar
20f60 79 20 74 61 62 6c 65 20 70 44 65 73 74 2d 3e 69  y table pDest->i
20f70 53 44 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20  SDParm..**.**   
20f80 20 20 53 52 54 5f 54 61 62 6c 65 20 20 20 20 20    SRT_Table     
20f90 20 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20    Store results 
20fa0 69 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  in temporary tab
20fb0 6c 65 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72  le pDest->iSDPar
20fc0 6d 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  m..**           
20fd0 20 20 20 20 20 20 20 20 20 20 54 68 69 73 20 69            This i
20fe0 73 20 6c 69 6b 65 20 53 52 54 5f 45 70 68 65 6d  s like SRT_Ephem
20ff0 54 61 62 20 65 78 63 65 70 74 20 74 68 61 74 20  Tab except that 
21000 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20 20 20 20  the table.**    
21010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21020 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20 61   is assumed to a
21030 6c 72 65 61 64 79 20 62 65 20 6f 70 65 6e 2e 0a  lready be open..
21040 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 45 70  **.**     SRT_Ep
21050 68 65 6d 54 61 62 20 20 20 20 43 72 65 61 74 65  hemTab    Create
21060 20 61 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61   an temporary ta
21070 62 6c 65 20 70 44 65 73 74 2d 3e 69 53 44 50 61  ble pDest->iSDPa
21080 72 6d 20 61 6e 64 20 73 74 6f 72 65 0a 2a 2a 20  rm and store.** 
21090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
210a0 20 20 20 20 74 68 65 20 72 65 73 75 6c 74 20 74      the result t
210b0 68 65 72 65 2e 20 54 68 65 20 63 75 72 73 6f 72  here. The cursor
210c0 20 69 73 20 6c 65 66 74 20 6f 70 65 6e 20 61 66   is left open af
210d0 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ter.**          
210e0 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
210f0 6e 69 6e 67 2e 20 20 54 68 69 73 20 69 73 20 6c  ning.  This is l
21100 69 6b 65 20 53 52 54 5f 54 61 62 6c 65 20 65 78  ike SRT_Table ex
21110 63 65 70 74 20 74 68 61 74 0a 2a 2a 20 20 20 20  cept that.**    
21120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21130 20 74 68 69 73 20 64 65 73 74 69 6e 61 74 69 6f   this destinatio
21140 6e 20 75 73 65 73 20 4f 50 5f 4f 70 65 6e 45 70  n uses OP_OpenEp
21150 68 65 6d 65 72 61 6c 20 74 6f 20 63 72 65 61 74  hemeral to creat
21160 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
21170 20 20 20 20 20 20 20 20 20 74 68 65 20 74 61 62           the tab
21180 6c 65 20 66 69 72 73 74 2e 0a 2a 2a 0a 2a 2a 20  le first..**.** 
21190 20 20 20 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e      SRT_Coroutin
211a0 65 20 20 20 47 65 6e 65 72 61 74 65 20 61 20 63  e   Generate a c
211b0 6f 2d 72 6f 75 74 69 6e 65 20 74 68 61 74 20 72  o-routine that r
211c0 65 74 75 72 6e 73 20 61 20 6e 65 77 20 72 6f 77  eturns a new row
211d0 20 6f 66 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   of.**          
211e0 20 20 20 20 20 20 20 20 20 20 20 72 65 73 75 6c             resul
211f0 74 73 20 65 61 63 68 20 74 69 6d 65 20 69 74 20  ts each time it 
21200 69 73 20 69 6e 76 6f 6b 65 64 2e 20 20 54 68 65  is invoked.  The
21210 20 65 6e 74 72 79 20 70 6f 69 6e 74 0a 2a 2a 20   entry point.** 
21220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21230 20 20 20 20 6f 66 20 74 68 65 20 63 6f 2d 72 6f      of the co-ro
21240 75 74 69 6e 65 20 69 73 20 73 74 6f 72 65 64 20  utine is stored 
21250 69 6e 20 72 65 67 69 73 74 65 72 20 70 44 65 73  in register pDes
21260 74 2d 3e 69 53 44 50 61 72 6d 2e 0a 2a 2a 0a 2a  t->iSDParm..**.*
21270 2a 20 20 20 20 20 53 52 54 5f 45 78 69 73 74 73  *     SRT_Exists
21280 20 20 20 20 20 20 53 74 6f 72 65 20 61 20 31 20        Store a 1 
21290 69 6e 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 70  in memory cell p
212a0 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 20 69 66  Dest->iSDParm if
212b0 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 20   the result.**  
212c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
212d0 20 20 20 73 65 74 20 69 73 20 6e 6f 74 20 65 6d     set is not em
212e0 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  pty..**.**     S
212f0 52 54 5f 44 69 73 63 61 72 64 20 20 20 20 20 54  RT_Discard     T
21300 68 72 6f 77 20 74 68 65 20 72 65 73 75 6c 74 73  hrow the results
21310 20 61 77 61 79 2e 20 20 54 68 69 73 20 69 73 20   away.  This is 
21320 75 73 65 64 20 62 79 20 53 45 4c 45 43 54 0a 2a  used by SELECT.*
21330 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
21340 20 20 20 20 20 20 73 74 61 74 65 6d 65 6e 74 73        statements
21350 20 77 69 74 68 69 6e 20 74 72 69 67 67 65 72 73   within triggers
21360 20 77 68 6f 73 65 20 6f 6e 6c 79 20 70 75 72 70   whose only purp
21370 6f 73 65 20 69 73 0a 2a 2a 20 20 20 20 20 20 20  ose is.**       
21380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68                th
21390 65 20 73 69 64 65 2d 65 66 66 65 63 74 73 20 6f  e side-effects o
213a0 66 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2a 0a  f functions..**.
213b0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
213c0 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62  returns the numb
213d0 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 49  er of errors.  I
213e0 66 20 61 6e 79 20 65 72 72 6f 72 73 20 61 72 65  f any errors are
213f0 0a 2a 2a 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c  .** encountered,
21400 20 74 68 65 6e 20 61 6e 20 61 70 70 72 6f 70 72   then an appropr
21410 69 61 74 65 20 65 72 72 6f 72 20 6d 65 73 73 61  iate error messa
21420 67 65 20 69 73 20 6c 65 66 74 20 69 6e 0a 2a 2a  ge is left in.**
21430 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67   pParse->zErrMsg
21440 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
21450 74 69 6e 65 20 64 6f 65 73 20 4e 4f 54 20 66 72  tine does NOT fr
21460 65 65 20 74 68 65 20 53 65 6c 65 63 74 20 73 74  ee the Select st
21470 72 75 63 74 75 72 65 20 70 61 73 73 65 64 20 69  ructure passed i
21480 6e 2e 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 69  n.  The.** calli
21490 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6e 65 65 64  ng function need
214a0 73 20 74 6f 20 64 6f 20 74 68 61 74 2e 0a 2a 2f  s to do that..*/
214b0 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 65 6c 65  .int sqlite3Sele
214c0 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ct(.  Parse *pPa
214d0 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  rse,         /* 
214e0 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65  The parser conte
214f0 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  xt */.  Select *
21500 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  p,             /
21510 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61  * The SELECT sta
21520 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64  tement being cod
21530 65 64 2e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  ed. */.  SelectD
21540 65 73 74 20 2a 70 44 65 73 74 20 20 20 20 20 20  est *pDest      
21550 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69  /* What to do wi
21560 74 68 20 74 68 65 20 71 75 65 72 79 20 72 65 73  th the query res
21570 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ults */.){.  int
21580 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20   i, j;          
21590 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
215a0 74 65 72 73 20 2a 2f 0a 20 20 57 68 65 72 65 49  ters */.  WhereI
215b0 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20  nfo *pWInfo;    
215c0 20 2f 2a 20 52 65 74 75 72 6e 20 66 72 6f 6d 20   /* Return from 
215d0 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
215e0 6e 28 29 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  n() */.  Vdbe *v
215f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
21600 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20 6d  /* The virtual m
21610 61 63 68 69 6e 65 20 75 6e 64 65 72 20 63 6f 6e  achine under con
21620 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69  struction */.  i
21630 6e 74 20 69 73 41 67 67 3b 20 20 20 20 20 20 20  nt isAgg;       
21640 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
21650 72 20 73 65 6c 65 63 74 20 6c 69 73 74 73 20 6c  r select lists l
21660 69 6b 65 20 22 63 6f 75 6e 74 28 2a 29 22 20 2a  ike "count(*)" *
21670 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  /.  ExprList *pE
21680 4c 69 73 74 3b 20 20 20 20 20 20 2f 2a 20 4c 69  List;      /* Li
21690 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f  st of columns to
216a0 20 65 78 74 72 61 63 74 2e 20 2a 2f 0a 20 20 53   extract. */.  S
216b0 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
216c0 3b 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66  ;     /* List of
216d0 20 74 61 62 6c 65 73 20 74 6f 20 73 65 6c 65 63   tables to selec
216e0 74 20 66 72 6f 6d 20 2a 2f 0a 20 20 45 78 70 72  t from */.  Expr
216f0 20 2a 70 57 68 65 72 65 3b 20 20 20 20 20 20 20   *pWhere;       
21700 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
21710 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20  clause.  May be 
21720 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69  NULL */.  ExprLi
21730 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 20  st *pOrderBy;   
21740 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59   /* The ORDER BY
21750 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65   clause.  May be
21760 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c   NULL */.  ExprL
21770 69 73 74 20 2a 70 47 72 6f 75 70 42 79 3b 20 20  ist *pGroupBy;  
21780 20 20 2f 2a 20 54 68 65 20 47 52 4f 55 50 20 42    /* The GROUP B
21790 59 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62  Y clause.  May b
217a0 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72  e NULL */.  Expr
217b0 20 2a 70 48 61 76 69 6e 67 3b 20 20 20 20 20 20   *pHaving;      
217c0 20 20 20 2f 2a 20 54 68 65 20 48 41 56 49 4e 47     /* The HAVING
217d0 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65   clause.  May be
217e0 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 72   NULL */.  int r
217f0 63 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20  c = 1;          
21800 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72 65    /* Value to re
21810 74 75 72 6e 20 66 72 6f 6d 20 74 68 69 73 20 66  turn from this f
21820 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  unction */.  int
21830 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78 3b 20   addrSortIndex; 
21840 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
21850 66 20 61 6e 20 4f 50 5f 4f 70 65 6e 45 70 68 65  f an OP_OpenEphe
21860 6d 65 72 61 6c 20 69 6e 73 74 72 75 63 74 69 6f  meral instructio
21870 6e 20 2a 2f 0a 20 20 44 69 73 74 69 6e 63 74 43  n */.  DistinctC
21880 74 78 20 73 44 69 73 74 69 6e 63 74 3b 20 2f 2a  tx sDistinct; /*
21890 20 49 6e 66 6f 20 6f 6e 20 68 6f 77 20 74 6f 20   Info on how to 
218a0 63 6f 64 65 20 74 68 65 20 44 49 53 54 49 4e 43  code the DISTINC
218b0 54 20 6b 65 79 77 6f 72 64 20 2a 2f 0a 20 20 41  T keyword */.  A
218c0 67 67 49 6e 66 6f 20 73 41 67 67 49 6e 66 6f 3b  ggInfo sAggInfo;
218d0 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61        /* Informa
218e0 74 69 6f 6e 20 75 73 65 64 20 62 79 20 61 67 67  tion used by agg
218f0 72 65 67 61 74 65 20 71 75 65 72 69 65 73 20 2a  regate queries *
21900 2f 0a 20 20 69 6e 74 20 69 45 6e 64 3b 20 20 20  /.  int iEnd;   
21910 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
21920 64 72 65 73 73 20 6f 66 20 74 68 65 20 65 6e 64  dress of the end
21930 20 6f 66 20 74 68 65 20 71 75 65 72 79 20 2a 2f   of the query */
21940 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20  .  sqlite3 *db; 
21950 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
21960 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
21970 74 69 6f 6e 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  tion */..#ifndef
21980 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50   SQLITE_OMIT_EXP
21990 4c 41 49 4e 0a 20 20 69 6e 74 20 69 52 65 73 74  LAIN.  int iRest
219a0 6f 72 65 53 65 6c 65 63 74 49 64 20 3d 20 70 50  oreSelectId = pP
219b0 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 3b  arse->iSelectId;
219c0 0a 20 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65  .  pParse->iSele
219d0 63 74 49 64 20 3d 20 70 50 61 72 73 65 2d 3e 69  ctId = pParse->i
219e0 4e 65 78 74 53 65 6c 65 63 74 49 64 2b 2b 3b 0a  NextSelectId++;.
219f0 23 65 6e 64 69 66 0a 0a 20 20 64 62 20 3d 20 70  #endif..  db = p
21a00 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28  Parse->db;.  if(
21a10 20 70 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c   p==0 || db->mal
21a20 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70 50 61  locFailed || pPa
21a30 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20  rse->nErr ){.   
21a40 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
21a50 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
21a60 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
21a70 4c 49 54 45 5f 53 45 4c 45 43 54 2c 20 30 2c 20  LITE_SELECT, 0, 
21a80 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e 20 31  0, 0) ) return 1
21a90 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 41 67 67  ;.  memset(&sAgg
21aa0 49 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Info, 0, sizeof(
21ab0 73 41 67 67 49 6e 66 6f 29 29 3b 0a 0a 20 20 69  sAggInfo));..  i
21ac0 66 28 20 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65  f( IgnorableOrde
21ad0 72 62 79 28 70 44 65 73 74 29 20 29 7b 0a 20 20  rby(pDest) ){.  
21ae0 20 20 61 73 73 65 72 74 28 70 44 65 73 74 2d 3e    assert(pDest->
21af0 65 44 65 73 74 3d 3d 53 52 54 5f 45 78 69 73 74  eDest==SRT_Exist
21b00 73 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73  s || pDest->eDes
21b10 74 3d 3d 53 52 54 5f 55 6e 69 6f 6e 20 7c 7c 20  t==SRT_Union || 
21b20 0a 20 20 20 20 20 20 20 20 20 20 20 70 44 65 73  .           pDes
21b30 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45 78  t->eDest==SRT_Ex
21b40 63 65 70 74 20 7c 7c 20 70 44 65 73 74 2d 3e 65  cept || pDest->e
21b50 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 63 61 72  Dest==SRT_Discar
21b60 64 29 3b 0a 20 20 20 20 2f 2a 20 49 66 20 4f 52  d);.    /* If OR
21b70 44 45 52 20 42 59 20 6d 61 6b 65 73 20 6e 6f 20  DER BY makes no 
21b80 64 69 66 66 65 72 65 6e 63 65 20 69 6e 20 74 68  difference in th
21b90 65 20 6f 75 74 70 75 74 20 74 68 65 6e 20 6e 65  e output then ne
21ba0 69 74 68 65 72 20 64 6f 65 73 0a 20 20 20 20 2a  ither does.    *
21bb0 2a 20 44 49 53 54 49 4e 43 54 20 73 6f 20 69 74  * DISTINCT so it
21bc0 20 63 61 6e 20 62 65 20 72 65 6d 6f 76 65 64 20   can be removed 
21bd0 74 6f 6f 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69  too. */.    sqli
21be0 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
21bf0 65 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42  e(db, p->pOrderB
21c00 79 29 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65  y);.    p->pOrde
21c10 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e  rBy = 0;.    p->
21c20 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f  selFlags &= ~SF_
21c30 44 69 73 74 69 6e 63 74 3b 0a 20 20 7d 0a 20 20  Distinct;.  }.  
21c40 73 71 6c 69 74 65 33 53 65 6c 65 63 74 50 72 65  sqlite3SelectPre
21c50 70 28 70 50 61 72 73 65 2c 20 70 2c 20 30 29 3b  p(pParse, p, 0);
21c60 0a 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d  .  pOrderBy = p-
21c70 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 70 54 61  >pOrderBy;.  pTa
21c80 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b  bList = p->pSrc;
21c90 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70  .  pEList = p->p
21ca0 45 4c 69 73 74 3b 0a 20 20 69 66 28 20 70 50 61  EList;.  if( pPa
21cb0 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d  rse->nErr || db-
21cc0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
21cd0 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74  .    goto select
21ce0 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 69 73 41 67  _end;.  }.  isAg
21cf0 67 20 3d 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73  g = (p->selFlags
21d00 20 26 20 53 46 5f 41 67 67 72 65 67 61 74 65 29   & SF_Aggregate)
21d10 21 3d 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70  !=0;.  assert( p
21d20 45 4c 69 73 74 21 3d 30 20 29 3b 0a 0a 20 20 2f  EList!=0 );..  /
21d30 2a 20 42 65 67 69 6e 20 67 65 6e 65 72 61 74 69  * Begin generati
21d40 6e 67 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20  ng code..  */.  
21d50 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
21d60 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
21d70 28 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65  ( v==0 ) goto se
21d80 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20  lect_end;..  /* 
21d90 49 66 20 77 72 69 74 69 6e 67 20 74 6f 20 6d 65  If writing to me
21da0 6d 6f 72 79 20 6f 72 20 67 65 6e 65 72 61 74 69  mory or generati
21db0 6e 67 20 61 20 73 65 74 0a 20 20 2a 2a 20 6f 6e  ng a set.  ** on
21dc0 6c 79 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75  ly a single colu
21dd0 6d 6e 20 6d 61 79 20 62 65 20 6f 75 74 70 75 74  mn may be output
21de0 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ..  */.#ifndef S
21df0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
21e00 45 52 59 0a 20 20 69 66 28 20 63 68 65 63 6b 46  ERY.  if( checkF
21e10 6f 72 4d 75 6c 74 69 43 6f 6c 75 6d 6e 53 65 6c  orMultiColumnSel
21e20 65 63 74 45 72 72 6f 72 28 70 50 61 72 73 65 2c  ectError(pParse,
21e30 20 70 44 65 73 74 2c 20 70 45 4c 69 73 74 2d 3e   pDest, pEList->
21e40 6e 45 78 70 72 29 20 29 7b 0a 20 20 20 20 67 6f  nExpr) ){.    go
21e50 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
21e60 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
21e70 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
21e80 72 20 61 6c 6c 20 73 75 62 2d 71 75 65 72 69 65  r all sub-querie
21e90 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  s in the FROM cl
21ea0 61 75 73 65 0a 20 20 2a 2f 0a 23 69 66 20 21 64  ause.  */.#if !d
21eb0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
21ec0 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20  IT_SUBQUERY) || 
21ed0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
21ee0 4f 4d 49 54 5f 56 49 45 57 29 0a 20 20 66 6f 72  OMIT_VIEW).  for
21ef0 28 69 3d 30 3b 20 21 70 2d 3e 70 50 72 69 6f 72  (i=0; !p->pPrior
21f00 20 26 26 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e   && i<pTabList->
21f10 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nSrc; i++){.    
21f20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
21f30 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 54  tem *pItem = &pT
21f40 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 3b 0a 20 20  abList->a[i];.  
21f50 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73    SelectDest des
21f60 74 3b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70  t;.    Select *p
21f70 53 75 62 20 3d 20 70 49 74 65 6d 2d 3e 70 53 65  Sub = pItem->pSe
21f80 6c 65 63 74 3b 0a 20 20 20 20 69 6e 74 20 69 73  lect;.    int is
21f90 41 67 67 53 75 62 3b 0a 0a 20 20 20 20 69 66 28  AggSub;..    if(
21fa0 20 70 53 75 62 3d 3d 30 20 29 20 63 6f 6e 74 69   pSub==0 ) conti
21fb0 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 53 6f 6d  nue;..    /* Som
21fc0 65 74 69 6d 65 73 20 74 68 65 20 63 6f 64 65 20  etimes the code 
21fd0 66 6f 72 20 61 20 73 75 62 71 75 65 72 79 20 77  for a subquery w
21fe0 69 6c 6c 20 62 65 20 67 65 6e 65 72 61 74 65 64  ill be generated
21ff0 20 6d 6f 72 65 20 74 68 61 6e 0a 20 20 20 20 2a   more than.    *
22000 2a 20 6f 6e 63 65 2c 20 69 66 20 74 68 65 20 73  * once, if the s
22010 75 62 71 75 65 72 79 20 69 73 20 70 61 72 74 20  ubquery is part 
22020 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
22030 75 73 65 20 69 6e 20 61 20 4c 45 46 54 20 4a 4f  use in a LEFT JO
22040 49 4e 2c 0a 20 20 20 20 2a 2a 20 66 6f 72 20 65  IN,.    ** for e
22050 78 61 6d 70 6c 65 2e 20 20 49 6e 20 74 68 61 74  xample.  In that
22060 20 63 61 73 65 2c 20 64 6f 20 6e 6f 74 20 72 65   case, do not re
22070 67 65 6e 65 72 61 74 65 20 74 68 65 20 63 6f 64  generate the cod
22080 65 20 74 6f 20 6d 61 6e 69 66 65 73 74 0a 20 20  e to manifest.  
22090 20 20 2a 2a 20 61 20 76 69 65 77 20 6f 72 20 74    ** a view or t
220a0 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20 74 6f  he co-routine to
220b0 20 69 6d 70 6c 65 6d 65 6e 74 20 61 20 76 69 65   implement a vie
220c0 77 2e 20 20 54 68 65 20 66 69 72 73 74 20 69 6e  w.  The first in
220d0 73 74 61 6e 63 65 0a 20 20 20 20 2a 2a 20 69 73  stance.    ** is
220e0 20 73 75 66 66 69 63 69 65 6e 74 2c 20 74 68 6f   sufficient, tho
220f0 75 67 68 20 74 68 65 20 73 75 62 72 6f 75 74 69  ugh the subrouti
22100 6e 65 20 74 6f 20 6d 61 6e 69 66 65 73 74 20 74  ne to manifest t
22110 68 65 20 76 69 65 77 20 64 6f 65 73 20 6e 65 65  he view does nee
22120 64 0a 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 69  d.    ** to be i
22130 6e 76 6f 6b 65 64 20 61 67 61 69 6e 2e 20 2a 2f  nvoked again. */
22140 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e  .    if( pItem->
22150 61 64 64 72 46 69 6c 6c 53 75 62 20 29 7b 0a 20  addrFillSub ){. 
22160 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
22170 76 69 61 43 6f 72 6f 75 74 69 6e 65 3d 3d 30 20  viaCoroutine==0 
22180 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
22190 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
221a0 4f 50 5f 47 6f 73 75 62 2c 20 70 49 74 65 6d 2d  OP_Gosub, pItem-
221b0 3e 72 65 67 52 65 74 75 72 6e 2c 20 70 49 74 65  >regReturn, pIte
221c0 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 29 3b  m->addrFillSub);
221d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63  .      }.      c
221e0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 0a  ontinue;.    }..
221f0 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74      /* Increment
22200 20 50 61 72 73 65 2e 6e 48 65 69 67 68 74 20 62   Parse.nHeight b
22210 79 20 74 68 65 20 68 65 69 67 68 74 20 6f 66 20  y the height of 
22220 74 68 65 20 6c 61 72 67 65 73 74 20 65 78 70 72  the largest expr
22230 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2a 20 74 72  ession.    ** tr
22240 65 65 20 72 65 66 65 72 65 64 20 74 6f 20 62 79  ee refered to by
22250 20 74 68 69 73 2c 20 74 68 65 20 70 61 72 65 6e   this, the paren
22260 74 20 73 65 6c 65 63 74 2e 20 54 68 65 20 63 68  t select. The ch
22270 69 6c 64 20 73 65 6c 65 63 74 0a 20 20 20 20 2a  ild select.    *
22280 2a 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 65 78  * may contain ex
22290 70 72 65 73 73 69 6f 6e 20 74 72 65 65 73 20 6f  pression trees o
222a0 66 20 61 74 20 6d 6f 73 74 0a 20 20 20 20 2a 2a  f at most.    **
222b0 20 28 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50   (SQLITE_MAX_EXP
222c0 52 5f 44 45 50 54 48 2d 50 61 72 73 65 2e 6e 48  R_DEPTH-Parse.nH
222d0 65 69 67 68 74 29 20 68 65 69 67 68 74 2e 20 54  eight) height. T
222e0 68 69 73 20 69 73 20 61 20 62 69 74 0a 20 20 20  his is a bit.   
222f0 20 2a 2a 20 6d 6f 72 65 20 63 6f 6e 73 65 72 76   ** more conserv
22300 61 74 69 76 65 20 74 68 61 6e 20 6e 65 63 65 73  ative than neces
22310 73 61 72 79 2c 20 62 75 74 20 6d 75 63 68 20 65  sary, but much e
22320 61 73 69 65 72 20 74 68 61 6e 20 65 6e 66 6f 72  asier than enfor
22330 63 69 6e 67 0a 20 20 20 20 2a 2a 20 61 6e 20 65  cing.    ** an e
22340 78 61 63 74 20 6c 69 6d 69 74 2e 0a 20 20 20 20  xact limit..    
22350 2a 2f 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  */.    pParse->n
22360 48 65 69 67 68 74 20 2b 3d 20 73 71 6c 69 74 65  Height += sqlite
22370 33 53 65 6c 65 63 74 45 78 70 72 48 65 69 67 68  3SelectExprHeigh
22380 74 28 70 29 3b 0a 0a 20 20 20 20 69 73 41 67 67  t(p);..    isAgg
22390 53 75 62 20 3d 20 28 70 53 75 62 2d 3e 73 65 6c  Sub = (pSub->sel
223a0 46 6c 61 67 73 20 26 20 53 46 5f 41 67 67 72 65  Flags & SF_Aggre
223b0 67 61 74 65 29 21 3d 30 3b 0a 20 20 20 20 69 66  gate)!=0;.    if
223c0 28 20 66 6c 61 74 74 65 6e 53 75 62 71 75 65 72  ( flattenSubquer
223d0 79 28 70 50 61 72 73 65 2c 20 70 2c 20 69 2c 20  y(pParse, p, i, 
223e0 69 73 41 67 67 2c 20 69 73 41 67 67 53 75 62 29  isAgg, isAggSub)
223f0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69   ){.      /* Thi
22400 73 20 73 75 62 71 75 65 72 79 20 63 61 6e 20 62  s subquery can b
22410 65 20 61 62 73 6f 72 62 65 64 20 69 6e 74 6f 20  e absorbed into 
22420 69 74 73 20 70 61 72 65 6e 74 2e 20 2a 2f 0a 20  its parent. */. 
22430 20 20 20 20 20 69 66 28 20 69 73 41 67 67 53 75       if( isAggSu
22440 62 20 29 7b 0a 20 20 20 20 20 20 20 20 69 73 41  b ){.        isA
22450 67 67 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  gg = 1;.        
22460 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53  p->selFlags |= S
22470 46 5f 41 67 67 72 65 67 61 74 65 3b 0a 20 20 20  F_Aggregate;.   
22480 20 20 20 7d 0a 20 20 20 20 20 20 69 20 3d 20 2d     }.      i = -
22490 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  1;.    }else if(
224a0 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3d   pTabList->nSrc=
224b0 3d 31 20 26 26 20 28 70 2d 3e 73 65 6c 46 6c 61  =1 && (p->selFla
224c0 67 73 20 26 20 53 46 5f 4d 61 74 65 72 69 61 6c  gs & SF_Material
224d0 69 7a 65 29 3d 3d 30 0a 20 20 20 20 20 20 26 26  ize)==0.      &&
224e0 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61   OptimizationEna
224f0 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f  bled(db, SQLITE_
22500 53 75 62 71 43 6f 72 6f 75 74 69 6e 65 29 0a 20  SubqCoroutine). 
22510 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49     ){.      /* I
22520 6d 70 6c 65 6d 65 6e 74 20 61 20 63 6f 2d 72 6f  mplement a co-ro
22530 75 74 69 6e 65 20 74 68 61 74 20 77 69 6c 6c 20  utine that will 
22540 72 65 74 75 72 6e 20 61 20 73 69 6e 67 6c 65 20  return a single 
22550 72 6f 77 20 6f 66 20 74 68 65 20 72 65 73 75 6c  row of the resul
22560 74 0a 20 20 20 20 20 20 2a 2a 20 73 65 74 20 6f  t.      ** set o
22570 6e 20 65 61 63 68 20 69 6e 76 6f 63 61 74 69 6f  n each invocatio
22580 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  n..      */.    
22590 20 20 69 6e 74 20 61 64 64 72 54 6f 70 3b 0a 20    int addrTop;. 
225a0 20 20 20 20 20 69 6e 74 20 61 64 64 72 45 6f 66       int addrEof
225b0 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 72  ;.      pItem->r
225c0 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50 61  egReturn = ++pPa
225d0 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
225e0 20 61 64 64 72 45 6f 66 20 3d 20 2b 2b 70 50 61   addrEof = ++pPa
225f0 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
22600 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
22610 70 30 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a  p0(v, OP_Goto);.
22620 20 20 20 20 20 20 61 64 64 72 54 6f 70 20 3d 20        addrTop = 
22630 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
22640 31 28 76 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75  1(v, OP_OpenPseu
22650 64 6f 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72 73  do, pItem->iCurs
22660 6f 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  or);.      sqlit
22670 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
22680 2c 20 31 29 3b 0a 20 20 20 20 20 20 56 64 62 65  , 1);.      Vdbe
22690 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 63 6f 72  Comment((v, "cor
226a0 6f 75 74 69 6e 65 20 66 6f 72 20 25 73 22 2c 20  outine for %s", 
226b0 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61  pItem->pTab->zNa
226c0 6d 65 29 29 3b 0a 20 20 20 20 20 20 70 49 74 65  me));.      pIte
226d0 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 3d  m->addrFillSub =
226e0 20 61 64 64 72 54 6f 70 3b 0a 20 20 20 20 20 20   addrTop;.      
226f0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
22700 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
22710 20 30 2c 20 61 64 64 72 45 6f 66 29 3b 0a 20 20   0, addrEof);.  
22720 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
22730 68 61 6e 67 65 50 35 28 76 2c 20 31 29 3b 0a 20  hangeP5(v, 1);. 
22740 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
22750 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74  ctDestInit(&dest
22760 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c  , SRT_Coroutine,
22770 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72   pItem->regRetur
22780 6e 29 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69  n);.      explai
22790 6e 53 65 74 49 6e 74 65 67 65 72 28 70 49 74 65  nSetInteger(pIte
227a0 6d 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 28 75  m->iSelectId, (u
227b0 38 29 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53  8)pParse->iNextS
227c0 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20  electId);.      
227d0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
227e0 61 72 73 65 2c 20 70 53 75 62 2c 20 26 64 65 73  arse, pSub, &des
227f0 74 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d  t);.      pItem-
22800 3e 70 54 61 62 2d 3e 6e 52 6f 77 45 73 74 20 3d  >pTab->nRowEst =
22810 20 28 75 6e 73 69 67 6e 65 64 29 70 53 75 62 2d   (unsigned)pSub-
22820 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20  >nSelectRow;.   
22830 20 20 20 70 49 74 65 6d 2d 3e 76 69 61 43 6f 72     pItem->viaCor
22840 6f 75 74 69 6e 65 20 3d 20 31 3b 0a 20 20 20 20  outine = 1;.    
22850 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
22860 6e 67 65 50 32 28 76 2c 20 61 64 64 72 54 6f 70  ngeP2(v, addrTop
22870 2c 20 64 65 73 74 2e 69 53 64 73 74 29 3b 0a 20  , dest.iSdst);. 
22880 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
22890 43 68 61 6e 67 65 50 33 28 76 2c 20 61 64 64 72  ChangeP3(v, addr
228a0 54 6f 70 2c 20 64 65 73 74 2e 6e 53 64 73 74 29  Top, dest.nSdst)
228b0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
228c0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
228d0 49 6e 74 65 67 65 72 2c 20 31 2c 20 61 64 64 72  Integer, 1, addr
228e0 45 6f 66 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Eof);.      sqli
228f0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
22900 20 4f 50 5f 59 69 65 6c 64 2c 20 70 49 74 65 6d   OP_Yield, pItem
22910 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a 20 20  ->regReturn);.  
22920 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
22930 28 76 2c 20 22 65 6e 64 20 25 73 22 2c 20 70 49  (v, "end %s", pI
22940 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65  tem->pTab->zName
22950 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
22960 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
22970 20 61 64 64 72 54 6f 70 2d 31 29 3b 0a 20 20 20   addrTop-1);.   
22980 20 20 20 73 71 6c 69 74 65 33 43 6c 65 61 72 54     sqlite3ClearT
22990 65 6d 70 52 65 67 43 61 63 68 65 28 70 50 61 72  empRegCache(pPar
229a0 73 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  se);.    }else{.
229b0 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
229c0 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74  e a subroutine t
229d0 68 61 74 20 77 69 6c 6c 20 66 69 6c 6c 20 61 6e  hat will fill an
229e0 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65   ephemeral table
229f0 20 77 69 74 68 0a 20 20 20 20 20 20 2a 2a 20 74   with.      ** t
22a00 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  he content of th
22a10 69 73 20 73 75 62 71 75 65 72 79 2e 20 20 70 49  is subquery.  pI
22a20 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62  tem->addrFillSub
22a30 20 77 69 6c 6c 20 70 6f 69 6e 74 0a 20 20 20 20   will point.    
22a40 20 20 2a 2a 20 74 6f 20 74 68 65 20 61 64 64 72    ** to the addr
22a50 65 73 73 20 6f 66 20 74 68 65 20 67 65 6e 65 72  ess of the gener
22a60 61 74 65 64 20 73 75 62 72 6f 75 74 69 6e 65 2e  ated subroutine.
22a70 20 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75    pItem->regRetu
22a80 72 6e 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 61  rn.      ** is a
22a90 20 72 65 67 69 73 74 65 72 20 61 6c 6c 6f 63 61   register alloca
22aa0 74 65 64 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ted to hold the 
22ab0 73 75 62 72 6f 75 74 69 6e 65 20 72 65 74 75 72  subroutine retur
22ac0 6e 20 61 64 64 72 65 73 73 0a 20 20 20 20 20 20  n address.      
22ad0 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 74 6f 70  */.      int top
22ae0 41 64 64 72 3b 0a 20 20 20 20 20 20 69 6e 74 20  Addr;.      int 
22af0 6f 6e 63 65 41 64 64 72 20 3d 20 30 3b 0a 20 20  onceAddr = 0;.  
22b00 20 20 20 20 69 6e 74 20 72 65 74 41 64 64 72 3b      int retAddr;
22b10 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
22b20 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75  Item->addrFillSu
22b30 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 49  b==0 );.      pI
22b40 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 20 3d  tem->regReturn =
22b50 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
22b60 0a 20 20 20 20 20 20 74 6f 70 41 64 64 72 20 3d  .      topAddr =
22b70 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
22b80 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
22b90 2c 20 30 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52  , 0, pItem->regR
22ba0 65 74 75 72 6e 29 3b 0a 20 20 20 20 20 20 70 49  eturn);.      pI
22bb0 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62  tem->addrFillSub
22bc0 20 3d 20 74 6f 70 41 64 64 72 2b 31 3b 0a 20 20   = topAddr+1;.  
22bd0 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d      VdbeNoopComm
22be0 65 6e 74 28 28 76 2c 20 22 6d 61 74 65 72 69 61  ent((v, "materia
22bf0 6c 69 7a 65 20 25 73 22 2c 20 70 49 74 65 6d 2d  lize %s", pItem-
22c00 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a  >pTab->zName));.
22c10 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d        if( pItem-
22c20 3e 69 73 43 6f 72 72 65 6c 61 74 65 64 3d 3d 30  >isCorrelated==0
22c30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49   ){.        /* I
22c40 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69  f the subquery i
22c50 73 20 6e 6f 20 63 6f 72 72 65 6c 61 74 65 64 20  s no correlated 
22c60 61 6e 64 20 69 66 20 77 65 20 61 72 65 20 6e 6f  and if we are no
22c70 74 20 69 6e 73 69 64 65 20 6f 66 0a 20 20 20 20  t inside of.    
22c80 20 20 20 20 2a 2a 20 61 20 74 72 69 67 67 65 72      ** a trigger
22c90 2c 20 74 68 65 6e 20 77 65 20 6f 6e 6c 79 20 6e  , then we only n
22ca0 65 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74  eed to compute t
22cb0 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
22cc0 73 75 62 71 75 65 72 79 0a 20 20 20 20 20 20 20  subquery.       
22cd0 20 2a 2a 20 6f 6e 63 65 2e 20 2a 2f 0a 20 20 20   ** once. */.   
22ce0 20 20 20 20 20 6f 6e 63 65 41 64 64 72 20 3d 20       onceAddr = 
22cf0 73 71 6c 69 74 65 33 43 6f 64 65 4f 6e 63 65 28  sqlite3CodeOnce(
22d00 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 7d  pParse);.      }
22d10 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65  .      sqlite3Se
22d20 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65  lectDestInit(&de
22d30 73 74 2c 20 53 52 54 5f 45 70 68 65 6d 54 61 62  st, SRT_EphemTab
22d40 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  , pItem->iCursor
22d50 29 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e  );.      explain
22d60 53 65 74 49 6e 74 65 67 65 72 28 70 49 74 65 6d  SetInteger(pItem
22d70 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 28 75 38  ->iSelectId, (u8
22d80 29 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65  )pParse->iNextSe
22d90 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 73  lectId);.      s
22da0 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
22db0 72 73 65 2c 20 70 53 75 62 2c 20 26 64 65 73 74  rse, pSub, &dest
22dc0 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  );.      pItem->
22dd0 70 54 61 62 2d 3e 6e 52 6f 77 45 73 74 20 3d 20  pTab->nRowEst = 
22de0 28 75 6e 73 69 67 6e 65 64 29 70 53 75 62 2d 3e  (unsigned)pSub->
22df0 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20  nSelectRow;.    
22e00 20 20 69 66 28 20 6f 6e 63 65 41 64 64 72 20 29    if( onceAddr )
22e10 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
22e20 48 65 72 65 28 76 2c 20 6f 6e 63 65 41 64 64 72  Here(v, onceAddr
22e30 29 3b 0a 20 20 20 20 20 20 72 65 74 41 64 64 72  );.      retAddr
22e40 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
22e50 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72  dOp1(v, OP_Retur
22e60 6e 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74  n, pItem->regRet
22e70 75 72 6e 29 3b 0a 20 20 20 20 20 20 56 64 62 65  urn);.      Vdbe
22e80 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6e 64  Comment((v, "end
22e90 20 25 73 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61   %s", pItem->pTa
22ea0 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20  b->zName));.    
22eb0 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
22ec0 6e 67 65 50 31 28 76 2c 20 74 6f 70 41 64 64 72  ngeP1(v, topAddr
22ed0 2c 20 72 65 74 41 64 64 72 29 3b 0a 20 20 20 20  , retAddr);.    
22ee0 20 20 73 71 6c 69 74 65 33 43 6c 65 61 72 54 65    sqlite3ClearTe
22ef0 6d 70 52 65 67 43 61 63 68 65 28 70 50 61 72 73  mpRegCache(pPars
22f00 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  e);.    }.    if
22f10 28 20 2f 2a 70 50 61 72 73 65 2d 3e 6e 45 72 72  ( /*pParse->nErr
22f20 20 7c 7c 2a 2f 20 64 62 2d 3e 6d 61 6c 6c 6f 63   ||*/ db->malloc
22f30 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20  Failed ){.      
22f40 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
22f50 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73  .    }.    pPars
22f60 65 2d 3e 6e 48 65 69 67 68 74 20 2d 3d 20 73 71  e->nHeight -= sq
22f70 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 72 48  lite3SelectExprH
22f80 65 69 67 68 74 28 70 29 3b 0a 20 20 20 20 70 54  eight(p);.    pT
22f90 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63  abList = p->pSrc
22fa0 3b 0a 20 20 20 20 69 66 28 20 21 49 67 6e 6f 72  ;.    if( !Ignor
22fb0 61 62 6c 65 4f 72 64 65 72 62 79 28 70 44 65 73  ableOrderby(pDes
22fc0 74 29 20 29 7b 0a 20 20 20 20 20 20 70 4f 72 64  t) ){.      pOrd
22fd0 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72  erBy = p->pOrder
22fe0 42 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  By;.    }.  }.  
22ff0 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69  pEList = p->pELi
23000 73 74 3b 0a 23 65 6e 64 69 66 0a 20 20 70 57 68  st;.#endif.  pWh
23010 65 72 65 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b  ere = p->pWhere;
23020 0a 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d  .  pGroupBy = p-
23030 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 70 48 61  >pGroupBy;.  pHa
23040 76 69 6e 67 20 3d 20 70 2d 3e 70 48 61 76 69 6e  ving = p->pHavin
23050 67 3b 0a 20 20 73 44 69 73 74 69 6e 63 74 2e 69  g;.  sDistinct.i
23060 73 54 6e 63 74 20 3d 20 28 70 2d 3e 73 65 6c 46  sTnct = (p->selF
23070 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e  lags & SF_Distin
23080 63 74 29 21 3d 30 3b 0a 0a 23 69 66 6e 64 65 66  ct)!=0;..#ifndef
23090 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d   SQLITE_OMIT_COM
230a0 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 20 20 2f  POUND_SELECT.  /
230b0 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 72  * If there is ar
230c0 65 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20  e a sequence of 
230d0 71 75 65 72 69 65 73 2c 20 64 6f 20 74 68 65 20  queries, do the 
230e0 65 61 72 6c 69 65 72 20 6f 6e 65 73 20 66 69 72  earlier ones fir
230f0 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  st..  */.  if( p
23100 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20  ->pPrior ){.    
23110 69 66 28 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73  if( p->pRightmos
23120 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 53 65  t==0 ){.      Se
23130 6c 65 63 74 20 2a 70 4c 6f 6f 70 2c 20 2a 70 52  lect *pLoop, *pR
23140 69 67 68 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  ight = 0;.      
23150 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20  int cnt = 0;.   
23160 20 20 20 69 6e 74 20 6d 78 53 65 6c 65 63 74 3b     int mxSelect;
23170 0a 20 20 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70  .      for(pLoop
23180 3d 70 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70  =p; pLoop; pLoop
23190 3d 70 4c 6f 6f 70 2d 3e 70 50 72 69 6f 72 2c 20  =pLoop->pPrior, 
231a0 63 6e 74 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  cnt++){.        
231b0 70 4c 6f 6f 70 2d 3e 70 52 69 67 68 74 6d 6f 73  pLoop->pRightmos
231c0 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 70  t = p;.        p
231d0 4c 6f 6f 70 2d 3e 70 4e 65 78 74 20 3d 20 70 52  Loop->pNext = pR
231e0 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 70 52  ight;.        pR
231f0 69 67 68 74 20 3d 20 70 4c 6f 6f 70 3b 0a 20 20  ight = pLoop;.  
23200 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 78 53 65      }.      mxSe
23210 6c 65 63 74 20 3d 20 64 62 2d 3e 61 4c 69 6d 69  lect = db->aLimi
23220 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43  t[SQLITE_LIMIT_C
23230 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 5d 3b  OMPOUND_SELECT];
23240 0a 20 20 20 20 20 20 69 66 28 20 6d 78 53 65 6c  .      if( mxSel
23250 65 63 74 20 26 26 20 63 6e 74 3e 6d 78 53 65 6c  ect && cnt>mxSel
23260 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ect ){.        s
23270 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
23280 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79  Parse, "too many
23290 20 74 65 72 6d 73 20 69 6e 20 63 6f 6d 70 6f 75   terms in compou
232a0 6e 64 20 53 45 4c 45 43 54 22 29 3b 0a 20 20 20  nd SELECT");.   
232b0 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74       goto select
232c0 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _end;.      }.  
232d0 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 6d 75 6c    }.    rc = mul
232e0 74 69 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  tiSelect(pParse,
232f0 20 70 2c 20 70 44 65 73 74 29 3b 0a 20 20 20 20   p, pDest);.    
23300 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65  explainSetIntege
23310 72 28 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63  r(pParse->iSelec
23320 74 49 64 2c 20 69 52 65 73 74 6f 72 65 53 65 6c  tId, iRestoreSel
23330 65 63 74 49 64 29 3b 0a 20 20 20 20 72 65 74 75  ectId);.    retu
23340 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69  rn rc;.  }.#endi
23350 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  f..  /* If there
23360 20 69 73 20 62 6f 74 68 20 61 20 47 52 4f 55 50   is both a GROUP
23370 20 42 59 20 61 6e 64 20 61 6e 20 4f 52 44 45 52   BY and an ORDER
23380 20 42 59 20 63 6c 61 75 73 65 20 61 6e 64 20 74   BY clause and t
23390 68 65 79 20 61 72 65 0a 20 20 2a 2a 20 69 64 65  hey are.  ** ide
233a0 6e 74 69 63 61 6c 2c 20 74 68 65 6e 20 64 69 73  ntical, then dis
233b0 61 62 6c 65 20 74 68 65 20 4f 52 44 45 52 20 42  able the ORDER B
233c0 59 20 63 6c 61 75 73 65 20 73 69 6e 63 65 20 74  Y clause since t
233d0 68 65 20 47 52 4f 55 50 20 42 59 0a 20 20 2a 2a  he GROUP BY.  **
233e0 20 77 69 6c 6c 20 63 61 75 73 65 20 65 6c 65 6d   will cause elem
233f0 65 6e 74 73 20 74 6f 20 63 6f 6d 65 20 6f 75 74  ents to come out
23400 20 69 6e 20 74 68 65 20 63 6f 72 72 65 63 74 20   in the correct 
23410 6f 72 64 65 72 2e 20 20 54 68 69 73 20 69 73 0a  order.  This is.
23420 20 20 2a 2a 20 61 6e 20 6f 70 74 69 6d 69 7a 61    ** an optimiza
23430 74 69 6f 6e 20 2d 20 74 68 65 20 63 6f 72 72 65  tion - the corre
23440 63 74 20 61 6e 73 77 65 72 20 73 68 6f 75 6c 64  ct answer should
23450 20 72 65 73 75 6c 74 20 72 65 67 61 72 64 6c 65   result regardle
23460 73 73 2e 0a 20 20 2a 2a 20 55 73 65 20 74 68 65  ss..  ** Use the
23470 20 53 51 4c 49 54 45 5f 47 72 6f 75 70 42 79 4f   SQLITE_GroupByO
23480 72 64 65 72 20 66 6c 61 67 20 77 69 74 68 20 53  rder flag with S
23490 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f  QLITE_TESTCTRL_O
234a0 50 54 49 4d 49 5a 45 52 0a 20 20 2a 2a 20 74 6f  PTIMIZER.  ** to
234b0 20 64 69 73 61 62 6c 65 20 74 68 69 73 20 6f 70   disable this op
234c0 74 69 6d 69 7a 61 74 69 6f 6e 20 66 6f 72 20 74  timization for t
234d0 65 73 74 69 6e 67 20 70 75 72 70 6f 73 65 73 2e  esting purposes.
234e0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69  .  */.  if( sqli
234f0 74 65 33 45 78 70 72 4c 69 73 74 43 6f 6d 70 61  te3ExprListCompa
23500 72 65 28 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20  re(p->pGroupBy, 
23510 70 4f 72 64 65 72 42 79 29 3d 3d 30 0a 20 20 20  pOrderBy)==0.   
23520 20 20 20 20 20 20 26 26 20 4f 70 74 69 6d 69 7a        && Optimiz
23530 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c  ationEnabled(db,
23540 20 53 51 4c 49 54 45 5f 47 72 6f 75 70 42 79 4f   SQLITE_GroupByO
23550 72 64 65 72 29 20 29 7b 0a 20 20 20 20 70 4f 72  rder) ){.    pOr
23560 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 7d 0a 0a  derBy = 0;.  }..
23570 20 20 2f 2a 20 49 66 20 74 68 65 20 71 75 65 72    /* If the quer
23580 79 20 69 73 20 44 49 53 54 49 4e 43 54 20 77 69  y is DISTINCT wi
23590 74 68 20 61 6e 20 4f 52 44 45 52 20 42 59 20 62  th an ORDER BY b
235a0 75 74 20 69 73 20 6e 6f 74 20 61 6e 20 61 67 67  ut is not an agg
235b0 72 65 67 61 74 65 2c 20 61 6e 64 20 0a 20 20 2a  regate, and .  *
235c0 2a 20 69 66 20 74 68 65 20 73 65 6c 65 63 74 2d  * if the select-
235d0 6c 69 73 74 20 69 73 20 74 68 65 20 73 61 6d 65  list is the same
235e0 20 61 73 20 74 68 65 20 4f 52 44 45 52 20 42 59   as the ORDER BY
235f0 20 6c 69 73 74 2c 20 74 68 65 6e 20 74 68 69 73   list, then this
23600 20 71 75 65 72 79 0a 20 20 2a 2a 20 63 61 6e 20   query.  ** can 
23610 62 65 20 72 65 77 72 69 74 74 65 6e 20 61 73 20  be rewritten as 
23620 61 20 47 52 4f 55 50 20 42 59 2e 20 49 6e 20 6f  a GROUP BY. In o
23630 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68 69 73  ther words, this
23640 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
23650 53 45 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20  SELECT DISTINCT 
23660 78 79 7a 20 46 52 4f 4d 20 2e 2e 2e 20 4f 52 44  xyz FROM ... ORD
23670 45 52 20 42 59 20 78 79 7a 0a 20 20 2a 2a 0a 20  ER BY xyz.  **. 
23680 20 2a 2a 20 69 73 20 74 72 61 6e 73 66 6f 72 6d   ** is transform
23690 65 64 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  ed to:.  **.  **
236a0 20 20 20 20 20 53 45 4c 45 43 54 20 78 79 7a 20       SELECT xyz 
236b0 46 52 4f 4d 20 2e 2e 2e 20 47 52 4f 55 50 20 42  FROM ... GROUP B
236c0 59 20 78 79 7a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  Y xyz.  **.  ** 
236d0 54 68 65 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20  The second form 
236e0 69 73 20 70 72 65 66 65 72 72 65 64 20 61 73 20  is preferred as 
236f0 61 20 73 69 6e 67 6c 65 20 69 6e 64 65 78 20 28  a single index (
23700 6f 72 20 74 65 6d 70 2d 74 61 62 6c 65 29 20 6d  or temp-table) m
23710 61 79 20 62 65 20 0a 20 20 2a 2a 20 75 73 65 64  ay be .  ** used
23720 20 66 6f 72 20 62 6f 74 68 20 74 68 65 20 4f 52   for both the OR
23730 44 45 52 20 42 59 20 61 6e 64 20 44 49 53 54 49  DER BY and DISTI
23740 4e 43 54 20 70 72 6f 63 65 73 73 69 6e 67 2e 20  NCT processing. 
23750 41 73 20 6f 72 69 67 69 6e 61 6c 6c 79 20 0a 20  As originally . 
23760 20 2a 2a 20 77 72 69 74 74 65 6e 20 74 68 65 20   ** written the 
23770 71 75 65 72 79 20 6d 75 73 74 20 75 73 65 20 61  query must use a
23780 20 74 65 6d 70 2d 74 61 62 6c 65 20 66 6f 72 20   temp-table for 
23790 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 66 20  at least one of 
237a0 74 68 65 20 4f 52 44 45 52 20 0a 20 20 2a 2a 20  the ORDER .  ** 
237b0 42 59 20 61 6e 64 20 44 49 53 54 49 4e 43 54 2c  BY and DISTINCT,
237c0 20 61 6e 64 20 61 6e 20 69 6e 64 65 78 20 6f 72   and an index or
237d0 20 73 65 70 61 72 61 74 65 20 74 65 6d 70 2d 74   separate temp-t
237e0 61 62 6c 65 20 66 6f 72 20 74 68 65 20 6f 74 68  able for the oth
237f0 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28  er..  */.  if( (
23800 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53  p->selFlags & (S
23810 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67  F_Distinct|SF_Ag
23820 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 44 69  gregate))==SF_Di
23830 73 74 69 6e 63 74 20 0a 20 20 20 26 26 20 73 71  stinct .   && sq
23840 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43 6f 6d  lite3ExprListCom
23850 70 61 72 65 28 70 4f 72 64 65 72 42 79 2c 20 70  pare(pOrderBy, p
23860 2d 3e 70 45 4c 69 73 74 29 3d 3d 30 0a 20 20 29  ->pEList)==0.  )
23870 7b 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67  {.    p->selFlag
23880 73 20 26 3d 20 7e 53 46 5f 44 69 73 74 69 6e 63  s &= ~SF_Distinc
23890 74 3b 0a 20 20 20 20 70 2d 3e 70 47 72 6f 75 70  t;.    p->pGroup
238a0 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  By = sqlite3Expr
238b0 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70  ListDup(db, p->p
238c0 45 4c 69 73 74 2c 20 30 29 3b 0a 20 20 20 20 70  EList, 0);.    p
238d0 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72  GroupBy = p->pGr
238e0 6f 75 70 42 79 3b 0a 20 20 20 20 70 4f 72 64 65  oupBy;.    pOrde
238f0 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 2f 2a 20  rBy = 0;.    /* 
23900 4e 6f 74 69 63 65 20 74 68 61 74 20 65 76 65 6e  Notice that even
23910 20 74 68 6f 75 67 68 74 20 53 46 5f 44 69 73 74   thought SF_Dist
23920 69 6e 63 74 20 68 61 73 20 62 65 65 6e 20 63 6c  inct has been cl
23930 65 61 72 65 64 20 66 72 6f 6d 20 70 2d 3e 73 65  eared from p->se
23940 6c 46 6c 61 67 73 2c 0a 20 20 20 20 2a 2a 20 74  lFlags,.    ** t
23950 68 65 20 73 44 69 73 74 69 6e 63 74 2e 69 73 54  he sDistinct.isT
23960 6e 63 74 20 69 73 20 73 74 69 6c 6c 20 73 65 74  nct is still set
23970 2e 20 20 48 65 6e 63 65 2c 20 69 73 54 6e 63 74  .  Hence, isTnct
23980 20 72 65 70 72 65 73 65 6e 74 73 20 74 68 65 0a   represents the.
23990 20 20 20 20 2a 2a 20 6f 72 69 67 69 6e 61 6c 20      ** original 
239a0 73 65 74 74 69 6e 67 20 6f 66 20 74 68 65 20 53  setting of the S
239b0 46 5f 44 69 73 74 69 6e 63 74 20 66 6c 61 67 2c  F_Distinct flag,
239c0 20 6e 6f 74 20 74 68 65 20 63 75 72 72 65 6e 74   not the current
239d0 20 73 65 74 74 69 6e 67 20 2a 2f 0a 20 20 20 20   setting */.    
239e0 61 73 73 65 72 74 28 20 73 44 69 73 74 69 6e 63  assert( sDistinc
239f0 74 2e 69 73 54 6e 63 74 20 29 3b 0a 20 20 7d 0a  t.isTnct );.  }.
23a00 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69  .  /* If there i
23a10 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  s an ORDER BY cl
23a20 61 75 73 65 2c 20 74 68 65 6e 20 74 68 69 73 20  ause, then this 
23a30 73 6f 72 74 69 6e 67 0a 20 20 2a 2a 20 69 6e 64  sorting.  ** ind
23a40 65 78 20 6d 69 67 68 74 20 65 6e 64 20 75 70 20  ex might end up 
23a50 62 65 69 6e 67 20 75 6e 75 73 65 64 20 69 66 20  being unused if 
23a60 74 68 65 20 64 61 74 61 20 63 61 6e 20 62 65 20  the data can be 
23a70 0a 20 20 2a 2a 20 65 78 74 72 61 63 74 65 64 20  .  ** extracted 
23a80 69 6e 20 70 72 65 2d 73 6f 72 74 65 64 20 6f 72  in pre-sorted or
23a90 64 65 72 2e 20 20 49 66 20 74 68 61 74 20 69 73  der.  If that is
23aa0 20 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e 20   the case, then 
23ab0 74 68 65 0a 20 20 2a 2a 20 4f 50 5f 4f 70 65 6e  the.  ** OP_Open
23ac0 45 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 75  Ephemeral instru
23ad0 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 63 68  ction will be ch
23ae0 61 6e 67 65 64 20 74 6f 20 61 6e 20 4f 50 5f 4e  anged to an OP_N
23af0 6f 6f 70 20 6f 6e 63 65 0a 20 20 2a 2a 20 77 65  oop once.  ** we
23b00 20 66 69 67 75 72 65 20 6f 75 74 20 74 68 61 74   figure out that
23b10 20 74 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64   the sorting ind
23b20 65 78 20 69 73 20 6e 6f 74 20 6e 65 65 64 65 64  ex is not needed
23b30 2e 20 20 54 68 65 20 61 64 64 72 53 6f 72 74 49  .  The addrSortI
23b40 6e 64 65 78 0a 20 20 2a 2a 20 76 61 72 69 61 62  ndex.  ** variab
23b50 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20 66 61  le is used to fa
23b60 63 69 6c 69 74 61 74 65 20 74 68 61 74 20 63 68  cilitate that ch
23b70 61 6e 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ange..  */.  if(
23b80 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20   pOrderBy ){.   
23b90 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
23ba0 66 6f 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f  fo;.    pKeyInfo
23bb0 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78   = keyInfoFromEx
23bc0 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
23bd0 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 70 4f  OrderBy);.    pO
23be0 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72  rderBy->iECursor
23bf0 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
23c00 2b 3b 0a 20 20 20 20 70 2d 3e 61 64 64 72 4f 70  +;.    p->addrOp
23c10 65 6e 45 70 68 6d 5b 32 5d 20 3d 20 61 64 64 72  enEphm[2] = addr
23c20 53 6f 72 74 49 6e 64 65 78 20 3d 0a 20 20 20 20  SortIndex =.    
23c30 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
23c40 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  Op4(v, OP_OpenEp
23c50 68 65 6d 65 72 61 6c 2c 0a 20 20 20 20 20 20 20  hemeral,.       
23c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23c70 20 20 20 20 70 4f 72 64 65 72 42 79 2d 3e 69 45      pOrderBy->iE
23c80 43 75 72 73 6f 72 2c 20 70 4f 72 64 65 72 42 79  Cursor, pOrderBy
23c90 2d 3e 6e 45 78 70 72 2b 32 2c 20 30 2c 0a 20 20  ->nExpr+2, 0,.  
23ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23cb0 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
23cc0 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59  pKeyInfo, P4_KEY
23cd0 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20  INFO_HANDOFF);. 
23ce0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 64 64 72   }else{.    addr
23cf0 53 6f 72 74 49 6e 64 65 78 20 3d 20 2d 31 3b 0a  SortIndex = -1;.
23d00 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
23d10 20 6f 75 74 70 75 74 20 69 73 20 64 65 73 74 69   output is desti
23d20 6e 65 64 20 66 6f 72 20 61 20 74 65 6d 70 6f 72  ned for a tempor
23d30 61 72 79 20 74 61 62 6c 65 2c 20 6f 70 65 6e 20  ary table, open 
23d40 74 68 61 74 20 74 61 62 6c 65 2e 0a 20 20 2a 2f  that table..  */
23d50 0a 20 20 69 66 28 20 70 44 65 73 74 2d 3e 65 44  .  if( pDest->eD
23d60 65 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61  est==SRT_EphemTa
23d70 62 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  b ){.    sqlite3
23d80 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
23d90 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20  _OpenEphemeral, 
23da0 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20  pDest->iSDParm, 
23db0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a  pEList->nExpr);.
23dc0 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68    }..  /* Set th
23dd0 65 20 6c 69 6d 69 74 65 72 2e 0a 20 20 2a 2f 0a  e limiter..  */.
23de0 20 20 69 45 6e 64 20 3d 20 73 71 6c 69 74 65 33    iEnd = sqlite3
23df0 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
23e00 3b 0a 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f  ;.  p->nSelectRo
23e10 77 20 3d 20 28 64 6f 75 62 6c 65 29 4c 41 52 47  w = (double)LARG
23e20 45 53 54 5f 49 4e 54 36 34 3b 0a 20 20 63 6f 6d  EST_INT64;.  com
23e30 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65  puteLimitRegiste
23e40 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20 69 45  rs(pParse, p, iE
23e50 6e 64 29 3b 0a 20 20 69 66 28 20 70 2d 3e 69 4c  nd);.  if( p->iL
23e60 69 6d 69 74 3d 3d 30 20 26 26 20 61 64 64 72 53  imit==0 && addrS
23e70 6f 72 74 49 6e 64 65 78 3e 3d 30 20 29 7b 0a 20  ortIndex>=0 ){. 
23e80 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 65     sqlite3VdbeGe
23e90 74 4f 70 28 76 2c 20 61 64 64 72 53 6f 72 74 49  tOp(v, addrSortI
23ea0 6e 64 65 78 29 2d 3e 6f 70 63 6f 64 65 20 3d 20  ndex)->opcode = 
23eb0 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e 3b 0a 20  OP_SorterOpen;. 
23ec0 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c     p->selFlags |
23ed0 3d 20 53 46 5f 55 73 65 53 6f 72 74 65 72 3b 0a  = SF_UseSorter;.
23ee0 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 61    }..  /* Open a
23ef0 20 76 69 72 74 75 61 6c 20 69 6e 64 65 78 20 74   virtual index t
23f00 6f 20 75 73 65 20 66 6f 72 20 74 68 65 20 64 69  o use for the di
23f10 73 74 69 6e 63 74 20 73 65 74 2e 0a 20 20 2a 2f  stinct set..  */
23f20 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61  .  if( p->selFla
23f30 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74  gs & SF_Distinct
23f40 20 29 7b 0a 20 20 20 20 73 44 69 73 74 69 6e 63   ){.    sDistinc
23f50 74 2e 74 61 62 54 6e 63 74 20 3d 20 70 50 61 72  t.tabTnct = pPar
23f60 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
23f70 73 44 69 73 74 69 6e 63 74 2e 61 64 64 72 54 6e  sDistinct.addrTn
23f80 63 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ct = sqlite3Vdbe
23f90 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65  AddOp4(v, OP_Ope
23fa0 6e 45 70 68 65 6d 65 72 61 6c 2c 0a 20 20 20 20  nEphemeral,.    
23fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23fc0 20 20 20 20 20 20 20 20 20 20 20 20 73 44 69 73              sDis
23fd0 74 69 6e 63 74 2e 74 61 62 54 6e 63 74 2c 20 30  tinct.tabTnct, 0
23fe0 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
23ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24000 20 20 20 20 20 28 63 68 61 72 2a 29 6b 65 79 49       (char*)keyI
24010 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28  nfoFromExprList(
24020 70 50 61 72 73 65 2c 20 70 2d 3e 70 45 4c 69 73  pParse, p->pELis
24030 74 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  t),.            
24040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24050 20 20 20 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48      P4_KEYINFO_H
24060 41 4e 44 4f 46 46 29 3b 0a 20 20 20 20 73 71 6c  ANDOFF);.    sql
24070 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
24080 28 76 2c 20 42 54 52 45 45 5f 55 4e 4f 52 44 45  (v, BTREE_UNORDE
24090 52 45 44 29 3b 0a 20 20 20 20 73 44 69 73 74 69  RED);.    sDisti
240a0 6e 63 74 2e 65 54 6e 63 74 54 79 70 65 20 3d 20  nct.eTnctType = 
240b0 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55  WHERE_DISTINCT_U
240c0 4e 4f 52 44 45 52 45 44 3b 0a 20 20 7d 65 6c 73  NORDERED;.  }els
240d0 65 7b 0a 20 20 20 20 73 44 69 73 74 69 6e 63 74  e{.    sDistinct
240e0 2e 65 54 6e 63 74 54 79 70 65 20 3d 20 57 48 45  .eTnctType = WHE
240f0 52 45 5f 44 49 53 54 49 4e 43 54 5f 4e 4f 4f 50  RE_DISTINCT_NOOP
24100 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 69 73  ;.  }..  if( !is
24110 41 67 67 20 26 26 20 70 47 72 6f 75 70 42 79 3d  Agg && pGroupBy=
24120 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20  =0 ){.    /* No 
24130 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
24140 6f 6e 73 20 61 6e 64 20 6e 6f 20 47 52 4f 55 50  ons and no GROUP
24150 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
24160 20 20 45 78 70 72 4c 69 73 74 20 2a 70 44 69 73    ExprList *pDis
24170 74 20 3d 20 28 73 44 69 73 74 69 6e 63 74 2e 69  t = (sDistinct.i
24180 73 54 6e 63 74 20 3f 20 70 2d 3e 70 45 4c 69 73  sTnct ? p->pELis
24190 74 20 3a 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20  t : 0);..    /* 
241a0 42 65 67 69 6e 20 74 68 65 20 64 61 74 61 62 61  Begin the databa
241b0 73 65 20 73 63 61 6e 2e 20 2a 2f 0a 20 20 20 20  se scan. */.    
241c0 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33  pWInfo = sqlite3
241d0 57 68 65 72 65 42 65 67 69 6e 28 70 50 61 72 73  WhereBegin(pPars
241e0 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68  e, pTabList, pWh
241f0 65 72 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 70  ere, pOrderBy, p
24200 44 69 73 74 2c 20 30 2c 30 29 3b 0a 20 20 20 20  Dist, 0,0);.    
24210 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20  if( pWInfo==0 ) 
24220 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
24230 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d  .    if( pWInfo-
24240 3e 6e 52 6f 77 4f 75 74 20 3c 20 70 2d 3e 6e 53  >nRowOut < p->nS
24250 65 6c 65 63 74 52 6f 77 20 29 20 70 2d 3e 6e 53  electRow ) p->nS
24260 65 6c 65 63 74 52 6f 77 20 3d 20 70 57 49 6e 66  electRow = pWInf
24270 6f 2d 3e 6e 52 6f 77 4f 75 74 3b 0a 20 20 20 20  o->nRowOut;.    
24280 69 66 28 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73  if( pWInfo->eDis
24290 74 69 6e 63 74 20 29 20 73 44 69 73 74 69 6e 63  tinct ) sDistinc
242a0 74 2e 65 54 6e 63 74 54 79 70 65 20 3d 20 70 57  t.eTnctType = pW
242b0 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 3b  Info->eDistinct;
242c0 0a 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42  .    if( pOrderB
242d0 79 20 26 26 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42  y && pWInfo->nOB
242e0 53 61 74 3d 3d 70 4f 72 64 65 72 42 79 2d 3e 6e  Sat==pOrderBy->n
242f0 45 78 70 72 20 29 20 70 4f 72 64 65 72 42 79 20  Expr ) pOrderBy 
24300 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  = 0;..    /* If 
24310 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74 68  sorting index th
24320 61 74 20 77 61 73 20 63 72 65 61 74 65 64 20 62  at was created b
24330 79 20 61 20 70 72 69 6f 72 20 4f 50 5f 4f 70 65  y a prior OP_Ope
24340 6e 45 70 68 65 6d 65 72 61 6c 20 0a 20 20 20 20  nEphemeral .    
24350 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 65  ** instruction e
24360 6e 64 65 64 20 75 70 20 6e 6f 74 20 62 65 69 6e  nded up not bein
24370 67 20 6e 65 65 64 65 64 2c 20 74 68 65 6e 20 63  g needed, then c
24380 68 61 6e 67 65 20 74 68 65 20 4f 50 5f 4f 70 65  hange the OP_Ope
24390 6e 45 70 68 65 6d 65 72 61 6c 0a 20 20 20 20 2a  nEphemeral.    *
243a0 2a 20 69 6e 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f  * into an OP_Noo
243b0 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  p..    */.    if
243c0 28 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78 3e  ( addrSortIndex>
243d0 3d 30 20 26 26 20 70 4f 72 64 65 72 42 79 3d 3d  =0 && pOrderBy==
243e0 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
243f0 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f  e3VdbeChangeToNo
24400 6f 70 28 76 2c 20 61 64 64 72 53 6f 72 74 49 6e  op(v, addrSortIn
24410 64 65 78 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61  dex);.      p->a
24420 64 64 72 4f 70 65 6e 45 70 68 6d 5b 32 5d 20 3d  ddrOpenEphm[2] =
24430 20 2d 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   -1;.    }..    
24440 2f 2a 20 55 73 65 20 74 68 65 20 73 74 61 6e 64  /* Use the stand
24450 61 72 64 20 69 6e 6e 65 72 20 6c 6f 6f 70 2e 20  ard inner loop. 
24460 2a 2f 0a 20 20 20 20 73 65 6c 65 63 74 49 6e 6e  */.    selectInn
24470 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70  erLoop(pParse, p
24480 2c 20 70 45 4c 69 73 74 2c 20 30 2c 20 30 2c 20  , pEList, 0, 0, 
24490 70 4f 72 64 65 72 42 79 2c 20 26 73 44 69 73 74  pOrderBy, &sDist
244a0 69 6e 63 74 2c 20 70 44 65 73 74 2c 0a 20 20 20  inct, pDest,.   
244b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
244c0 20 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e   pWInfo->iContin
244d0 75 65 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65  ue, pWInfo->iBre
244e0 61 6b 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 6e 64  ak);..    /* End
244f0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
24500 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a  an loop..    */.
24510 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65      sqlite3Where
24520 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 7d  End(pWInfo);.  }
24530 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 69  else{.    /* Thi
24540 73 20 63 61 73 65 20 77 68 65 6e 20 74 68 65 72  s case when ther
24550 65 20 65 78 69 73 74 20 61 67 67 72 65 67 61 74  e exist aggregat
24560 65 20 66 75 6e 63 74 69 6f 6e 73 20 6f 72 20 61  e functions or a
24570 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
24580 0a 20 20 20 20 2a 2a 20 6f 72 20 62 6f 74 68 20  .    ** or both 
24590 2a 2f 0a 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65  */.    NameConte
245a0 78 74 20 73 4e 43 3b 20 20 20 20 2f 2a 20 4e 61  xt sNC;    /* Na
245b0 6d 65 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 70  me context for p
245c0 72 6f 63 65 73 73 69 6e 67 20 61 67 67 72 65 67  rocessing aggreg
245d0 61 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ate information 
245e0 2a 2f 0a 20 20 20 20 69 6e 74 20 69 41 4d 65 6d  */.    int iAMem
245f0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  ;          /* Fi
24600 72 73 74 20 4d 65 6d 20 61 64 64 72 65 73 73 20  rst Mem address 
24610 66 6f 72 20 73 74 6f 72 69 6e 67 20 63 75 72 72  for storing curr
24620 65 6e 74 20 47 52 4f 55 50 20 42 59 20 2a 2f 0a  ent GROUP BY */.
24630 20 20 20 20 69 6e 74 20 69 42 4d 65 6d 3b 20 20      int iBMem;  
24640 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
24650 20 4d 65 6d 20 61 64 64 72 65 73 73 20 66 6f 72   Mem address for
24660 20 70 72 65 76 69 6f 75 73 20 47 52 4f 55 50 20   previous GROUP 
24670 42 59 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 55  BY */.    int iU
24680 73 65 46 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a  seFlag;       /*
24690 20 4d 65 6d 20 61 64 64 72 65 73 73 20 68 6f 6c   Mem address hol
246a0 64 69 6e 67 20 66 6c 61 67 20 69 6e 64 69 63 61  ding flag indica
246b0 74 69 6e 67 20 74 68 61 74 20 61 74 20 6c 65 61  ting that at lea
246c0 73 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  st.             
246d0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e             ** on
246e0 65 20 72 6f 77 20 6f 66 20 74 68 65 20 69 6e 70  e row of the inp
246f0 75 74 20 74 6f 20 74 68 65 20 61 67 67 72 65 67  ut to the aggreg
24700 61 74 6f 72 20 68 61 73 20 62 65 65 6e 0a 20 20  ator has been.  
24710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24720 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73        ** process
24730 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 41  ed */.    int iA
24740 62 6f 72 74 46 6c 61 67 3b 20 20 20 20 20 2f 2a  bortFlag;     /*
24750 20 4d 65 6d 20 61 64 64 72 65 73 73 20 77 68 69   Mem address whi
24760 63 68 20 63 61 75 73 65 73 20 71 75 65 72 79 20  ch causes query 
24770 61 62 6f 72 74 20 69 66 20 70 6f 73 69 74 69 76  abort if positiv
24780 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 67 72 6f  e */.    int gro
24790 75 70 42 79 53 6f 72 74 3b 20 20 20 20 2f 2a 20  upBySort;    /* 
247a0 52 6f 77 73 20 63 6f 6d 65 20 66 72 6f 6d 20 73  Rows come from s
247b0 6f 75 72 63 65 20 69 6e 20 47 52 4f 55 50 20 42  ource in GROUP B
247c0 59 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20 69  Y order */.    i
247d0 6e 74 20 61 64 64 72 45 6e 64 3b 20 20 20 20 20  nt addrEnd;     
247e0 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 70 72 6f     /* End of pro
247f0 63 65 73 73 69 6e 67 20 66 6f 72 20 74 68 69 73  cessing for this
24800 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20 69   SELECT */.    i
24810 6e 74 20 73 6f 72 74 50 54 61 62 20 3d 20 30 3b  nt sortPTab = 0;
24820 20 20 20 2f 2a 20 50 73 65 75 64 6f 74 61 62 6c     /* Pseudotabl
24830 65 20 75 73 65 64 20 74 6f 20 64 65 63 6f 64 65  e used to decode
24840 20 73 6f 72 74 69 6e 67 20 72 65 73 75 6c 74 73   sorting results
24850 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 6f 72 74   */.    int sort
24860 4f 75 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4f  Out = 0;    /* O
24870 75 74 70 75 74 20 72 65 67 69 73 74 65 72 20 66  utput register f
24880 72 6f 6d 20 74 68 65 20 73 6f 72 74 65 72 20 2a  rom the sorter *
24890 2f 0a 0a 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65  /..    /* Remove
248a0 20 61 6e 79 20 61 6e 64 20 61 6c 6c 20 61 6c 69   any and all ali
248b0 61 73 65 73 20 62 65 74 77 65 65 6e 20 74 68 65  ases between the
248c0 20 72 65 73 75 6c 74 20 73 65 74 20 61 6e 64 20   result set and 
248d0 74 68 65 0a 20 20 20 20 2a 2a 20 47 52 4f 55 50  the.    ** GROUP
248e0 20 42 59 20 63 6c 61 75 73 65 2e 0a 20 20 20 20   BY clause..    
248f0 2a 2f 0a 20 20 20 20 69 66 28 20 70 47 72 6f 75  */.    if( pGrou
24900 70 42 79 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  pBy ){.      int
24910 20 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   k;             
24920 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
24930 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
24940 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
24950 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
24960 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67    /* For looping
24970 20 6f 76 65 72 20 65 78 70 72 65 73 73 69 6f 6e   over expression
24980 20 69 6e 20 61 20 6c 69 73 74 20 2a 2f 0a 0a 20   in a list */.. 
24990 20 20 20 20 20 66 6f 72 28 6b 3d 70 2d 3e 70 45       for(k=p->pE
249a0 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70 49 74  List->nExpr, pIt
249b0 65 6d 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b  em=p->pEList->a;
249c0 20 6b 3e 30 3b 20 6b 2d 2d 2c 20 70 49 74 65 6d   k>0; k--, pItem
249d0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 49 74  ++){.        pIt
249e0 65 6d 2d 3e 69 41 6c 69 61 73 20 3d 20 30 3b 0a  em->iAlias = 0;.
249f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f        }.      fo
24a00 72 28 6b 3d 70 47 72 6f 75 70 42 79 2d 3e 6e 45  r(k=pGroupBy->nE
24a10 78 70 72 2c 20 70 49 74 65 6d 3d 70 47 72 6f 75  xpr, pItem=pGrou
24a20 70 42 79 2d 3e 61 3b 20 6b 3e 30 3b 20 6b 2d 2d  pBy->a; k>0; k--
24a30 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
24a40 20 20 20 20 70 49 74 65 6d 2d 3e 69 41 6c 69 61      pItem->iAlia
24a50 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  s = 0;.      }. 
24a60 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 53 65 6c       if( p->nSel
24a70 65 63 74 52 6f 77 3e 28 64 6f 75 62 6c 65 29 31  ectRow>(double)1
24a80 30 30 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74 52  00 ) p->nSelectR
24a90 6f 77 20 3d 20 28 64 6f 75 62 6c 65 29 31 30 30  ow = (double)100
24aa0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
24ab0 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77     p->nSelectRow
24ac0 20 3d 20 28 64 6f 75 62 6c 65 29 31 3b 0a 20 20   = (double)1;.  
24ad0 20 20 7d 0a 0a 20 0a 20 20 20 20 2f 2a 20 43 72    }.. .    /* Cr
24ae0 65 61 74 65 20 61 20 6c 61 62 65 6c 20 74 6f 20  eate a label to 
24af0 6a 75 6d 70 20 74 6f 20 77 68 65 6e 20 77 65 20  jump to when we 
24b00 77 61 6e 74 20 74 6f 20 61 62 6f 72 74 20 74 68  want to abort th
24b10 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 61  e query */.    a
24b20 64 64 72 45 6e 64 20 3d 20 73 71 6c 69 74 65 33  ddrEnd = sqlite3
24b30 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
24b40 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72  ;..    /* Conver
24b50 74 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65  t TK_COLUMN node
24b60 73 20 69 6e 74 6f 20 54 4b 5f 41 47 47 5f 43 4f  s into TK_AGG_CO
24b70 4c 55 4d 4e 20 61 6e 64 20 6d 61 6b 65 20 65 6e  LUMN and make en
24b80 74 72 69 65 73 20 69 6e 0a 20 20 20 20 2a 2a 20  tries in.    ** 
24b90 73 41 67 67 49 6e 66 6f 20 66 6f 72 20 61 6c 6c  sAggInfo for all
24ba0 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e   TK_AGG_FUNCTION
24bb0 20 6e 6f 64 65 73 20 69 6e 20 65 78 70 72 65 73   nodes in expres
24bc0 73 69 6f 6e 73 20 6f 66 20 74 68 65 0a 20 20 20  sions of the.   
24bd0 20 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65   ** SELECT state
24be0 6d 65 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ment..    */.   
24bf0 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c   memset(&sNC, 0,
24c00 20 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20   sizeof(sNC));. 
24c10 20 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20     sNC.pParse = 
24c20 70 50 61 72 73 65 3b 0a 20 20 20 20 73 4e 43 2e  pParse;.    sNC.
24c30 70 53 72 63 4c 69 73 74 20 3d 20 70 54 61 62 4c  pSrcList = pTabL
24c40 69 73 74 3b 0a 20 20 20 20 73 4e 43 2e 70 41 67  ist;.    sNC.pAg
24c50 67 49 6e 66 6f 20 3d 20 26 73 41 67 67 49 6e 66  gInfo = &sAggInf
24c60 6f 3b 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e  o;.    sAggInfo.
24c70 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 20 3d  nSortingColumn =
24c80 20 70 47 72 6f 75 70 42 79 20 3f 20 70 47 72 6f   pGroupBy ? pGro
24c90 75 70 42 79 2d 3e 6e 45 78 70 72 2b 31 20 3a 20  upBy->nExpr+1 : 
24ca0 30 3b 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e  0;.    sAggInfo.
24cb0 70 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f 75  pGroupBy = pGrou
24cc0 70 42 79 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  pBy;.    sqlite3
24cd0 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69  ExprAnalyzeAggLi
24ce0 73 74 28 26 73 4e 43 2c 20 70 45 4c 69 73 74 29  st(&sNC, pEList)
24cf0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
24d00 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28  rAnalyzeAggList(
24d10 26 73 4e 43 2c 20 70 4f 72 64 65 72 42 79 29 3b  &sNC, pOrderBy);
24d20 0a 20 20 20 20 69 66 28 20 70 48 61 76 69 6e 67  .    if( pHaving
24d30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
24d40 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72  3ExprAnalyzeAggr
24d50 65 67 61 74 65 73 28 26 73 4e 43 2c 20 70 48 61  egates(&sNC, pHa
24d60 76 69 6e 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ving);.    }.   
24d70 20 73 41 67 67 49 6e 66 6f 2e 6e 41 63 63 75 6d   sAggInfo.nAccum
24d80 75 6c 61 74 6f 72 20 3d 20 73 41 67 67 49 6e 66  ulator = sAggInf
24d90 6f 2e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 66  o.nColumn;.    f
24da0 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e  or(i=0; i<sAggIn
24db0 66 6f 2e 6e 46 75 6e 63 3b 20 69 2b 2b 29 7b 0a  fo.nFunc; i++){.
24dc0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
24dd0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 73  xprHasProperty(s
24de0 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 69 5d  AggInfo.aFunc[i]
24df0 2e 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  .pExpr, EP_xIsSe
24e00 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20 73  lect) );.      s
24e10 4e 43 2e 6e 63 46 6c 61 67 73 20 7c 3d 20 4e 43  NC.ncFlags |= NC
24e20 5f 49 6e 41 67 67 46 75 6e 63 3b 0a 20 20 20 20  _InAggFunc;.    
24e30 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61    sqlite3ExprAna
24e40 6c 79 7a 65 41 67 67 4c 69 73 74 28 26 73 4e 43  lyzeAggList(&sNC
24e50 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63  , sAggInfo.aFunc
24e60 5b 69 5d 2e 70 45 78 70 72 2d 3e 78 2e 70 4c 69  [i].pExpr->x.pLi
24e70 73 74 29 3b 0a 20 20 20 20 20 20 73 4e 43 2e 6e  st);.      sNC.n
24e80 63 46 6c 61 67 73 20 26 3d 20 7e 4e 43 5f 49 6e  cFlags &= ~NC_In
24e90 41 67 67 46 75 6e 63 3b 0a 20 20 20 20 7d 0a 20  AggFunc;.    }. 
24ea0 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f     if( db->mallo
24eb0 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 73  cFailed ) goto s
24ec0 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 20 20  elect_end;..    
24ed0 2f 2a 20 50 72 6f 63 65 73 73 69 6e 67 20 66 6f  /* Processing fo
24ee0 72 20 61 67 67 72 65 67 61 74 65 73 20 77 69 74  r aggregates wit
24ef0 68 20 47 52 4f 55 50 20 42 59 20 69 73 20 76 65  h GROUP BY is ve
24f00 72 79 20 64 69 66 66 65 72 65 6e 74 20 61 6e 64  ry different and
24f10 0a 20 20 20 20 2a 2a 20 6d 75 63 68 20 6d 6f 72  .    ** much mor
24f20 65 20 63 6f 6d 70 6c 65 78 20 74 68 61 6e 20 61  e complex than a
24f30 67 67 72 65 67 61 74 65 73 20 77 69 74 68 6f 75  ggregates withou
24f40 74 20 61 20 47 52 4f 55 50 20 42 59 2e 0a 20 20  t a GROUP BY..  
24f50 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 47 72    */.    if( pGr
24f60 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20 4b  oupBy ){.      K
24f70 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
24f80 3b 20 20 2f 2a 20 4b 65 79 69 6e 67 20 69 6e 66  ;  /* Keying inf
24f90 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65  ormation for the
24fa0 20 67 72 6f 75 70 20 62 79 20 63 6c 61 75 73 65   group by clause
24fb0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6a 31   */.      int j1
24fc0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
24fd0 20 41 2d 76 73 2d 42 20 63 6f 6d 70 61 72 69 73   A-vs-B comparis
24fe0 69 6f 6e 20 6a 75 6d 70 20 2a 2f 0a 20 20 20 20  ion jump */.    
24ff0 20 20 69 6e 74 20 61 64 64 72 4f 75 74 70 75 74    int addrOutput
25000 52 6f 77 3b 20 20 2f 2a 20 53 74 61 72 74 20 6f  Row;  /* Start o
25010 66 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61  f subroutine tha
25020 74 20 6f 75 74 70 75 74 73 20 61 20 72 65 73 75  t outputs a resu
25030 6c 74 20 72 6f 77 20 2a 2f 0a 20 20 20 20 20 20  lt row */.      
25040 69 6e 74 20 72 65 67 4f 75 74 70 75 74 52 6f 77  int regOutputRow
25050 3b 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 61 64  ;   /* Return ad
25060 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66  dress register f
25070 6f 72 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75  or output subrou
25080 74 69 6e 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e  tine */.      in
25090 74 20 61 64 64 72 53 65 74 41 62 6f 72 74 3b 20  t addrSetAbort; 
250a0 20 20 2f 2a 20 53 65 74 20 74 68 65 20 61 62 6f    /* Set the abo
250b0 72 74 20 66 6c 61 67 20 61 6e 64 20 72 65 74 75  rt flag and retu
250c0 72 6e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  rn */.      int 
250d0 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 3b 20 20  addrTopOfLoop;  
250e0 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 69 6e  /* Top of the in
250f0 70 75 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20  put loop */.    
25100 20 20 69 6e 74 20 61 64 64 72 53 6f 72 74 69 6e    int addrSortin
25110 67 49 64 78 3b 20 2f 2a 20 54 68 65 20 4f 50 5f  gIdx; /* The OP_
25120 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 66 6f  OpenEphemeral fo
25130 72 20 74 68 65 20 73 6f 72 74 69 6e 67 20 69 6e  r the sorting in
25140 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  dex */.      int
25150 20 61 64 64 72 52 65 73 65 74 3b 20 20 20 20 20   addrReset;     
25160 20 2f 2a 20 53 75 62 72 6f 75 74 69 6e 65 20 66   /* Subroutine f
25170 6f 72 20 72 65 73 65 74 74 69 6e 67 20 74 68 65  or resetting the
25180 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 2a 2f 0a   accumulator */.
25190 20 20 20 20 20 20 69 6e 74 20 72 65 67 52 65 73        int regRes
251a0 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 74  et;       /* Ret
251b0 75 72 6e 20 61 64 64 72 65 73 73 20 72 65 67 69  urn address regi
251c0 73 74 65 72 20 66 6f 72 20 72 65 73 65 74 20 73  ster for reset s
251d0 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 0a 20 20  ubroutine */..  
251e0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
251f0 69 73 20 61 20 47 52 4f 55 50 20 42 59 20 63 6c  is a GROUP BY cl
25200 61 75 73 65 20 77 65 20 6d 69 67 68 74 20 6e 65  ause we might ne
25210 65 64 20 61 20 73 6f 72 74 69 6e 67 20 69 6e 64  ed a sorting ind
25220 65 78 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 69  ex to.      ** i
25230 6d 70 6c 65 6d 65 6e 74 20 69 74 2e 20 20 41 6c  mplement it.  Al
25240 6c 6f 63 61 74 65 20 74 68 61 74 20 73 6f 72 74  locate that sort
25250 69 6e 67 20 69 6e 64 65 78 20 6e 6f 77 2e 20 20  ing index now.  
25260 49 66 20 69 74 20 74 75 72 6e 73 20 6f 75 74 0a  If it turns out.
25270 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77 65        ** that we
25280 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 69 74 20   do not need it 
25290 61 66 74 65 72 20 61 6c 6c 2c 20 74 68 65 20 4f  after all, the O
252a0 50 5f 53 6f 72 74 65 72 4f 70 65 6e 20 69 6e 73  P_SorterOpen ins
252b0 74 72 75 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a  truction.      *
252c0 2a 20 77 69 6c 6c 20 62 65 20 63 6f 6e 76 65 72  * will be conver
252d0 74 65 64 20 69 6e 74 6f 20 61 20 4e 6f 6f 70 2e  ted into a Noop.
252e0 20 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20    .      */.    
252f0 20 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69    sAggInfo.sorti
25300 6e 67 49 64 78 20 3d 20 70 50 61 72 73 65 2d 3e  ngIdx = pParse->
25310 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 70 4b  nTab++;.      pK
25320 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f  eyInfo = keyInfo
25330 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61  FromExprList(pPa
25340 72 73 65 2c 20 70 47 72 6f 75 70 42 79 29 3b 0a  rse, pGroupBy);.
25350 20 20 20 20 20 20 61 64 64 72 53 6f 72 74 69 6e        addrSortin
25360 67 49 64 78 20 3d 20 73 71 6c 69 74 65 33 56 64  gIdx = sqlite3Vd
25370 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53  beAddOp4(v, OP_S
25380 6f 72 74 65 72 4f 70 65 6e 2c 20 0a 20 20 20 20  orterOpen, .    
25390 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 73        sAggInfo.s
253a0 6f 72 74 69 6e 67 49 64 78 2c 20 73 41 67 67 49  ortingIdx, sAggI
253b0 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75  nfo.nSortingColu
253c0 6d 6e 2c 20 0a 20 20 20 20 20 20 20 20 20 20 30  mn, .          0
253d0 2c 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66  , (char*)pKeyInf
253e0 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41  o, P4_KEYINFO_HA
253f0 4e 44 4f 46 46 29 3b 0a 0a 20 20 20 20 20 20 2f  NDOFF);..      /
25400 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 6d 65 6d  * Initialize mem
25410 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 73 20 75 73  ory locations us
25420 65 64 20 62 79 20 47 52 4f 55 50 20 42 59 20 61  ed by GROUP BY a
25430 67 67 72 65 67 61 74 65 20 70 72 6f 63 65 73 73  ggregate process
25440 69 6e 67 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ing.      */.   
25450 20 20 20 69 55 73 65 46 6c 61 67 20 3d 20 2b 2b     iUseFlag = ++
25460 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
25470 20 20 20 20 69 41 62 6f 72 74 46 6c 61 67 20 3d      iAbortFlag =
25480 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
25490 0a 20 20 20 20 20 20 72 65 67 4f 75 74 70 75 74  .      regOutput
254a0 52 6f 77 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  Row = ++pParse->
254b0 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 61 64 64 72  nMem;.      addr
254c0 4f 75 74 70 75 74 52 6f 77 20 3d 20 73 71 6c 69  OutputRow = sqli
254d0 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
254e0 28 76 29 3b 0a 20 20 20 20 20 20 72 65 67 52 65  (v);.      regRe
254f0 73 65 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  set = ++pParse->
25500 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 61 64 64 72  nMem;.      addr
25510 52 65 73 65 74 20 3d 20 73 71 6c 69 74 65 33 56  Reset = sqlite3V
25520 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
25530 0a 20 20 20 20 20 20 69 41 4d 65 6d 20 3d 20 70  .      iAMem = p
25540 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b  Parse->nMem + 1;
25550 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
25560 4d 65 6d 20 2b 3d 20 70 47 72 6f 75 70 42 79 2d  Mem += pGroupBy-
25570 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 69 42  >nExpr;.      iB
25580 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  Mem = pParse->nM
25590 65 6d 20 2b 20 31 3b 0a 20 20 20 20 20 20 70 50  em + 1;.      pP
255a0 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 47  arse->nMem += pG
255b0 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20  roupBy->nExpr;. 
255c0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
255d0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
255e0 65 67 65 72 2c 20 30 2c 20 69 41 62 6f 72 74 46  eger, 0, iAbortF
255f0 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65  lag);.      Vdbe
25600 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 63 6c 65  Comment((v, "cle
25610 61 72 20 61 62 6f 72 74 20 66 6c 61 67 22 29 29  ar abort flag"))
25620 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
25630 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
25640 49 6e 74 65 67 65 72 2c 20 30 2c 20 69 55 73 65  Integer, 0, iUse
25650 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62  Flag);.      Vdb
25660 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 69 6e  eComment((v, "in
25670 64 69 63 61 74 65 20 61 63 63 75 6d 75 6c 61 74  dicate accumulat
25680 6f 72 20 65 6d 70 74 79 22 29 29 3b 0a 20 20 20  or empty"));.   
25690 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
256a0 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  dOp3(v, OP_Null,
256b0 20 30 2c 20 69 41 4d 65 6d 2c 20 69 41 4d 65 6d   0, iAMem, iAMem
256c0 2b 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72  +pGroupBy->nExpr
256d0 2d 31 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 42  -1);..      /* B
256e0 65 67 69 6e 20 61 20 6c 6f 6f 70 20 74 68 61 74  egin a loop that
256f0 20 77 69 6c 6c 20 65 78 74 72 61 63 74 20 61 6c   will extract al
25700 6c 20 73 6f 75 72 63 65 20 72 6f 77 73 20 69 6e  l source rows in
25710 20 47 52 4f 55 50 20 42 59 20 6f 72 64 65 72 2e   GROUP BY order.
25720 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 6d  .      ** This m
25730 69 67 68 74 20 69 6e 76 6f 6c 76 65 20 74 77 6f  ight involve two
25740 20 73 65 70 61 72 61 74 65 20 6c 6f 6f 70 73 20   separate loops 
25750 77 69 74 68 20 61 6e 20 4f 50 5f 53 6f 72 74 20  with an OP_Sort 
25760 69 6e 20 62 65 74 77 65 65 6e 2c 20 6f 72 0a 20  in between, or. 
25770 20 20 20 20 20 2a 2a 20 69 74 20 6d 69 67 68 74       ** it might
25780 20 62 65 20 61 20 73 69 6e 67 6c 65 20 6c 6f 6f   be a single loo
25790 70 20 74 68 61 74 20 75 73 65 73 20 61 6e 20 69  p that uses an i
257a0 6e 64 65 78 20 74 6f 20 65 78 74 72 61 63 74 20  ndex to extract 
257b0 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 20 20 20 20  information.    
257c0 20 20 2a 2a 20 69 6e 20 74 68 65 20 72 69 67 68    ** in the righ
257d0 74 20 6f 72 64 65 72 20 74 6f 20 62 65 67 69 6e  t order to begin
257e0 20 77 69 74 68 2e 0a 20 20 20 20 20 20 2a 2f 0a   with..      */.
257f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
25800 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
25810 73 75 62 2c 20 72 65 67 52 65 73 65 74 2c 20 61  sub, regReset, a
25820 64 64 72 52 65 73 65 74 29 3b 0a 20 20 20 20 20  ddrReset);.     
25830 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65   pWInfo = sqlite
25840 33 57 68 65 72 65 42 65 67 69 6e 28 70 50 61 72  3WhereBegin(pPar
25850 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57  se, pTabList, pW
25860 68 65 72 65 2c 20 70 47 72 6f 75 70 42 79 2c 20  here, pGroupBy, 
25870 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  0, 0, 0);.      
25880 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20  if( pWInfo==0 ) 
25890 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
258a0 0a 20 20 20 20 20 20 69 66 28 20 70 57 49 6e 66  .      if( pWInf
258b0 6f 2d 3e 6e 4f 42 53 61 74 3d 3d 70 47 72 6f 75  o->nOBSat==pGrou
258c0 70 42 79 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  pBy->nExpr ){.  
258d0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 74        /* The opt
258e0 69 6d 69 7a 65 72 20 69 73 20 61 62 6c 65 20 74  imizer is able t
258f0 6f 20 64 65 6c 69 76 65 72 20 72 6f 77 73 20 69  o deliver rows i
25900 6e 20 67 72 6f 75 70 20 62 79 20 6f 72 64 65 72  n group by order
25910 20 73 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 77   so.        ** w
25920 65 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f  e do not have to
25930 20 73 6f 72 74 2e 20 20 54 68 65 20 4f 50 5f 4f   sort.  The OP_O
25940 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 74 61 62  penEphemeral tab
25950 6c 65 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 20  le will be.     
25960 20 20 20 2a 2a 20 63 61 6e 63 65 6c 6c 65 64 20     ** cancelled 
25970 6c 61 74 65 72 20 62 65 63 61 75 73 65 20 77 65  later because we
25980 20 73 74 69 6c 6c 20 6e 65 65 64 20 74 6f 20 75   still need to u
25990 73 65 20 74 68 65 20 70 4b 65 79 49 6e 66 6f 0a  se the pKeyInfo.
259a0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
259b0 20 20 20 67 72 6f 75 70 42 79 53 6f 72 74 20 3d     groupBySort =
259c0 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   0;.      }else{
259d0 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 73  .        /* Rows
259e0 20 61 72 65 20 63 6f 6d 69 6e 67 20 6f 75 74 20   are coming out 
259f0 69 6e 20 75 6e 64 65 74 65 72 6d 69 6e 65 64 20  in undetermined 
25a00 6f 72 64 65 72 2e 20 20 57 65 20 68 61 76 65 20  order.  We have 
25a10 74 6f 20 70 75 73 68 0a 20 20 20 20 20 20 20 20  to push.        
25a20 2a 2a 20 65 61 63 68 20 72 6f 77 20 69 6e 74 6f  ** each row into
25a30 20 61 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78   a sorting index
25a40 2c 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20  , terminate the 
25a50 66 69 72 73 74 20 6c 6f 6f 70 2c 0a 20 20 20 20  first loop,.    
25a60 20 20 20 20 2a 2a 20 74 68 65 6e 20 6c 6f 6f 70      ** then loop
25a70 20 6f 76 65 72 20 74 68 65 20 73 6f 72 74 69 6e   over the sortin
25a80 67 20 69 6e 64 65 78 20 69 6e 20 6f 72 64 65 72  g index in order
25a90 20 74 6f 20 67 65 74 20 74 68 65 20 6f 75 74 70   to get the outp
25aa0 75 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e  ut.        ** in
25ab0 20 73 6f 72 74 65 64 20 6f 72 64 65 72 0a 20 20   sorted order.  
25ac0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
25ad0 20 69 6e 74 20 72 65 67 42 61 73 65 3b 0a 20 20   int regBase;.  
25ae0 20 20 20 20 20 20 69 6e 74 20 72 65 67 52 65 63        int regRec
25af0 6f 72 64 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  ord;.        int
25b00 20 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 69   nCol;.        i
25b10 6e 74 20 6e 47 72 6f 75 70 42 79 3b 0a 0a 20 20  nt nGroupBy;..  
25b20 20 20 20 20 20 20 65 78 70 6c 61 69 6e 54 65 6d        explainTem
25b30 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 0a  pTable(pParse, .
25b40 20 20 20 20 20 20 20 20 20 20 20 20 28 73 44 69              (sDi
25b50 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 26 26  stinct.isTnct &&
25b60 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 26 53 46   (p->selFlags&SF
25b70 5f 44 69 73 74 69 6e 63 74 29 3d 3d 30 29 20 3f  _Distinct)==0) ?
25b80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
25b90 20 20 20 20 20 22 44 49 53 54 49 4e 43 54 22 20       "DISTINCT" 
25ba0 3a 20 22 47 52 4f 55 50 20 42 59 22 29 3b 0a 0a  : "GROUP BY");..
25bb0 20 20 20 20 20 20 20 20 67 72 6f 75 70 42 79 53          groupByS
25bc0 6f 72 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ort = 1;.       
25bd0 20 6e 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f   nGroupBy = pGro
25be0 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  upBy->nExpr;.   
25bf0 20 20 20 20 20 6e 43 6f 6c 20 3d 20 6e 47 72 6f       nCol = nGro
25c00 75 70 42 79 20 2b 20 31 3b 0a 20 20 20 20 20 20  upBy + 1;.      
25c10 20 20 6a 20 3d 20 6e 47 72 6f 75 70 42 79 2b 31    j = nGroupBy+1
25c20 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
25c30 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 43  0; i<sAggInfo.nC
25c40 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  olumn; i++){.   
25c50 20 20 20 20 20 20 20 69 66 28 20 73 41 67 67 49         if( sAggI
25c60 6e 66 6f 2e 61 43 6f 6c 5b 69 5d 2e 69 53 6f 72  nfo.aCol[i].iSor
25c70 74 65 72 43 6f 6c 75 6d 6e 3e 3d 6a 20 29 7b 0a  terColumn>=j ){.
25c80 20 20 20 20 20 20 20 20 20 20 20 20 6e 43 6f 6c              nCol
25c90 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ++;.            
25ca0 6a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  j++;.          }
25cb0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
25cc0 20 20 20 72 65 67 42 61 73 65 20 3d 20 73 71 6c     regBase = sql
25cd0 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65  ite3GetTempRange
25ce0 28 70 50 61 72 73 65 2c 20 6e 43 6f 6c 29 3b 0a  (pParse, nCol);.
25cf0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
25d00 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50  xprCacheClear(pP
25d10 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73  arse);.        s
25d20 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78  qlite3ExprCodeEx
25d30 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
25d40 47 72 6f 75 70 42 79 2c 20 72 65 67 42 61 73 65  GroupBy, regBase
25d50 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 0);.        sq
25d60 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
25d70 76 2c 20 4f 50 5f 53 65 71 75 65 6e 63 65 2c 20  v, OP_Sequence, 
25d80 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67  sAggInfo.sorting
25d90 49 64 78 2c 72 65 67 42 61 73 65 2b 6e 47 72 6f  Idx,regBase+nGro
25da0 75 70 42 79 29 3b 0a 20 20 20 20 20 20 20 20 6a  upBy);.        j
25db0 20 3d 20 6e 47 72 6f 75 70 42 79 2b 31 3b 0a 20   = nGroupBy+1;. 
25dc0 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
25dd0 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75  i<sAggInfo.nColu
25de0 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  mn; i++){.      
25df0 20 20 20 20 73 74 72 75 63 74 20 41 67 67 49 6e      struct AggIn
25e00 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20 3d 20 26  fo_col *pCol = &
25e10 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69 5d  sAggInfo.aCol[i]
25e20 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
25e30 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c  pCol->iSorterCol
25e40 75 6d 6e 3e 3d 6a 20 29 7b 0a 20 20 20 20 20 20  umn>=j ){.      
25e50 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20 6a        int r1 = j
25e60 20 2b 20 72 65 67 42 61 73 65 3b 0a 20 20 20 20   + regBase;.    
25e70 20 20 20 20 20 20 20 20 69 6e 74 20 72 32 3b 0a          int r2;.
25e80 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 32 20  .            r2 
25e90 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
25ea0 65 47 65 74 43 6f 6c 75 6d 6e 28 70 50 61 72 73  eGetColumn(pPars
25eb0 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  e, .            
25ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25ed0 20 20 20 70 43 6f 6c 2d 3e 70 54 61 62 2c 20 70     pCol->pTab, p
25ee0 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 70 43  Col->iColumn, pC
25ef0 6f 6c 2d 3e 69 54 61 62 6c 65 2c 20 72 31 2c 20  ol->iTable, r1, 
25f00 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
25f10 69 66 28 20 72 31 21 3d 72 32 20 29 7b 0a 20 20  if( r1!=r2 ){.  
25f20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
25f30 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
25f40 20 4f 50 5f 53 43 6f 70 79 2c 20 72 32 2c 20 72   OP_SCopy, r2, r
25f50 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  1);.            
25f60 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a 2b  }.            j+
25f70 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  +;.          }. 
25f80 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
25f90 20 72 65 67 52 65 63 6f 72 64 20 3d 20 73 71 6c   regRecord = sql
25fa0 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
25fb0 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
25fc0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
25fd0 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  3(v, OP_MakeReco
25fe0 72 64 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f  rd, regBase, nCo
25ff0 6c 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20  l, regRecord);. 
26000 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
26010 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
26020 6f 72 74 65 72 49 6e 73 65 72 74 2c 20 73 41 67  orterInsert, sAg
26030 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78  gInfo.sortingIdx
26040 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20  , regRecord);.  
26050 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
26060 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
26070 73 65 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a  se, regRecord);.
26080 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
26090 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28  eleaseTempRange(
260a0 70 50 61 72 73 65 2c 20 72 65 67 42 61 73 65 2c  pParse, regBase,
260b0 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20   nCol);.        
260c0 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
260d0 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20  pWInfo);.       
260e0 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e   sAggInfo.sortin
260f0 67 49 64 78 50 54 61 62 20 3d 20 73 6f 72 74 50  gIdxPTab = sortP
26100 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  Tab = pParse->nT
26110 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 73 6f  ab++;.        so
26120 72 74 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 47  rtOut = sqlite3G
26130 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
26140 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
26150 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
26160 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f 2c 20 73  OP_OpenPseudo, s
26170 6f 72 74 50 54 61 62 2c 20 73 6f 72 74 4f 75 74  ortPTab, sortOut
26180 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20  , nCol);.       
26190 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
261a0 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 53  p2(v, OP_SorterS
261b0 6f 72 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f  ort, sAggInfo.so
261c0 72 74 69 6e 67 49 64 78 2c 20 61 64 64 72 45 6e  rtingIdx, addrEn
261d0 64 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  d);.        Vdbe
261e0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 47 52 4f  Comment((v, "GRO
261f0 55 50 20 42 59 20 73 6f 72 74 22 29 29 3b 0a 20  UP BY sort"));. 
26200 20 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e         sAggInfo.
26210 75 73 65 53 6f 72 74 69 6e 67 49 64 78 20 3d 20  useSortingIdx = 
26220 31 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  1;.        sqlit
26230 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72  e3ExprCacheClear
26240 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
26250 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 45 76 61 6c  }..      /* Eval
26260 75 61 74 65 20 74 68 65 20 63 75 72 72 65 6e 74  uate the current
26270 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d 73 20   GROUP BY terms 
26280 61 6e 64 20 73 74 6f 72 65 20 69 6e 20 62 30 2c  and store in b0,
26290 20 62 31 2c 20 62 32 2e 2e 2e 0a 20 20 20 20 20   b1, b2....     
262a0 20 2a 2a 20 28 62 30 20 69 73 20 6d 65 6d 6f 72   ** (b0 is memor
262b0 79 20 6c 6f 63 61 74 69 6f 6e 20 69 42 4d 65 6d  y location iBMem
262c0 2b 30 2c 20 62 31 20 69 73 20 69 42 4d 65 6d 2b  +0, b1 is iBMem+
262d0 31 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 29  1, and so forth)
262e0 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 6e 20 63  .      ** Then c
262f0 6f 6d 70 61 72 65 20 74 68 65 20 63 75 72 72 65  ompare the curre
26300 6e 74 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d  nt GROUP BY term
26310 73 20 61 67 61 69 6e 73 74 20 74 68 65 20 47 52  s against the GR
26320 4f 55 50 20 42 59 20 74 65 72 6d 73 0a 20 20 20  OUP BY terms.   
26330 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 70     ** from the p
26340 72 65 76 69 6f 75 73 20 72 6f 77 20 63 75 72 72  revious row curr
26350 65 6e 74 6c 79 20 73 74 6f 72 65 64 20 69 6e 20  ently stored in 
26360 61 30 2c 20 61 31 2c 20 61 32 2e 2e 2e 0a 20 20  a0, a1, a2....  
26370 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 64 64      */.      add
26380 72 54 6f 70 4f 66 4c 6f 6f 70 20 3d 20 73 71 6c  rTopOfLoop = sql
26390 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
263a0 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71  ddr(v);.      sq
263b0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c  lite3ExprCacheCl
263c0 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 20  ear(pParse);.   
263d0 20 20 20 69 66 28 20 67 72 6f 75 70 42 79 53 6f     if( groupBySo
263e0 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  rt ){.        sq
263f0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
26400 76 2c 20 4f 50 5f 53 6f 72 74 65 72 44 61 74 61  v, OP_SorterData
26410 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69  , sAggInfo.sorti
26420 6e 67 49 64 78 2c 20 73 6f 72 74 4f 75 74 29 3b  ngIdx, sortOut);
26430 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
26440 6f 72 28 6a 3d 30 3b 20 6a 3c 70 47 72 6f 75 70  or(j=0; j<pGroup
26450 42 79 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b  By->nExpr; j++){
26460 0a 20 20 20 20 20 20 20 20 69 66 28 20 67 72 6f  .        if( gro
26470 75 70 42 79 53 6f 72 74 20 29 7b 0a 20 20 20 20  upBySort ){.    
26480 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
26490 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
264a0 6c 75 6d 6e 2c 20 73 6f 72 74 50 54 61 62 2c 20  lumn, sortPTab, 
264b0 6a 2c 20 69 42 4d 65 6d 2b 6a 29 3b 0a 20 20 20  j, iBMem+j);.   
264c0 20 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 30 20         if( j==0 
264d0 29 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61  ) sqlite3VdbeCha
264e0 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f  ngeP5(v, OPFLAG_
264f0 43 4c 45 41 52 43 41 43 48 45 29 3b 0a 20 20 20  CLEARCACHE);.   
26500 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
26510 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 64        sAggInfo.d
26520 69 72 65 63 74 4d 6f 64 65 20 3d 20 31 3b 0a 20  irectMode = 1;. 
26530 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
26540 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
26550 20 70 47 72 6f 75 70 42 79 2d 3e 61 5b 6a 5d 2e   pGroupBy->a[j].
26560 70 45 78 70 72 2c 20 69 42 4d 65 6d 2b 6a 29 3b  pExpr, iBMem+j);
26570 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
26580 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
26590 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
265a0 5f 43 6f 6d 70 61 72 65 2c 20 69 41 4d 65 6d 2c  _Compare, iAMem,
265b0 20 69 42 4d 65 6d 2c 20 70 47 72 6f 75 70 42 79   iBMem, pGroupBy
265c0 2d 3e 6e 45 78 70 72 2c 0a 20 20 20 20 20 20 20  ->nExpr,.       
265d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
265e0 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e     (char*)pKeyIn
265f0 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b  fo, P4_KEYINFO);
26600 0a 20 20 20 20 20 20 6a 31 20 3d 20 73 71 6c 69  .      j1 = sqli
26610 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
26620 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c  dr(v);.      sql
26630 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
26640 2c 20 4f 50 5f 4a 75 6d 70 2c 20 6a 31 2b 31 2c  , OP_Jump, j1+1,
26650 20 30 2c 20 6a 31 2b 31 29 3b 0a 0a 20 20 20 20   0, j1+1);..    
26660 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
26670 64 65 20 74 68 61 74 20 72 75 6e 73 20 77 68 65  de that runs whe
26680 6e 65 76 65 72 20 74 68 65 20 47 52 4f 55 50 20  never the GROUP 
26690 42 59 20 63 68 61 6e 67 65 73 2e 0a 20 20 20 20  BY changes..    
266a0 20 20 2a 2a 20 43 68 61 6e 67 65 73 20 69 6e 20    ** Changes in 
266b0 74 68 65 20 47 52 4f 55 50 20 42 59 20 61 72 65  the GROUP BY are
266c0 20 64 65 74 65 63 74 65 64 20 62 79 20 74 68 65   detected by the
266d0 20 70 72 65 76 69 6f 75 73 20 63 6f 64 65 0a 20   previous code. 
266e0 20 20 20 20 20 2a 2a 20 62 6c 6f 63 6b 2e 20 20       ** block.  
266f0 49 66 20 74 68 65 72 65 20 77 65 72 65 20 6e 6f  If there were no
26700 20 63 68 61 6e 67 65 73 2c 20 74 68 69 73 20 62   changes, this b
26710 6c 6f 63 6b 20 69 73 20 73 6b 69 70 70 65 64 2e  lock is skipped.
26720 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
26730 2a 2a 20 54 68 69 73 20 63 6f 64 65 20 63 6f 70  ** This code cop
26740 69 65 73 20 63 75 72 72 65 6e 74 20 67 72 6f 75  ies current grou
26750 70 20 62 79 20 74 65 72 6d 73 20 69 6e 20 62 30  p by terms in b0
26760 2c 62 31 2c 62 32 2c 2e 2e 2e 0a 20 20 20 20 20  ,b1,b2,....     
26770 20 2a 2a 20 6f 76 65 72 20 74 6f 20 61 30 2c 61   ** over to a0,a
26780 31 2c 61 32 2e 20 20 49 74 20 74 68 65 6e 20 63  1,a2.  It then c
26790 61 6c 6c 73 20 74 68 65 20 6f 75 74 70 75 74 20  alls the output 
267a0 73 75 62 72 6f 75 74 69 6e 65 0a 20 20 20 20 20  subroutine.     
267b0 20 2a 2a 20 61 6e 64 20 72 65 73 65 74 73 20 74   ** and resets t
267c0 68 65 20 61 67 67 72 65 67 61 74 65 20 61 63 63  he aggregate acc
267d0 75 6d 75 6c 61 74 6f 72 20 72 65 67 69 73 74 65  umulator registe
267e0 72 73 20 69 6e 20 70 72 65 70 61 72 61 74 69 6f  rs in preparatio
267f0 6e 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74  n.      ** for t
26800 68 65 20 6e 65 78 74 20 47 52 4f 55 50 20 42 59  he next GROUP BY
26810 20 62 61 74 63 68 2e 0a 20 20 20 20 20 20 2a 2f   batch..      */
26820 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
26830 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73  prCodeMove(pPars
26840 65 2c 20 69 42 4d 65 6d 2c 20 69 41 4d 65 6d 2c  e, iBMem, iAMem,
26850 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72   pGroupBy->nExpr
26860 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
26870 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
26880 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 70 75  _Gosub, regOutpu
26890 74 52 6f 77 2c 20 61 64 64 72 4f 75 74 70 75 74  tRow, addrOutput
268a0 52 6f 77 29 3b 0a 20 20 20 20 20 20 56 64 62 65  Row);.      Vdbe
268b0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6f 75 74  Comment((v, "out
268c0 70 75 74 20 6f 6e 65 20 72 6f 77 22 29 29 3b 0a  put one row"));.
268d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
268e0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66  eAddOp2(v, OP_If
268f0 50 6f 73 2c 20 69 41 62 6f 72 74 46 6c 61 67 2c  Pos, iAbortFlag,
26900 20 61 64 64 72 45 6e 64 29 3b 0a 20 20 20 20 20   addrEnd);.     
26910 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
26920 20 22 63 68 65 63 6b 20 61 62 6f 72 74 20 66 6c   "check abort fl
26930 61 67 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  ag"));.      sql
26940 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
26950 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 52  , OP_Gosub, regR
26960 65 73 65 74 2c 20 61 64 64 72 52 65 73 65 74 29  eset, addrReset)
26970 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
26980 65 6e 74 28 28 76 2c 20 22 72 65 73 65 74 20 61  ent((v, "reset a
26990 63 63 75 6d 75 6c 61 74 6f 72 22 29 29 3b 0a 0a  ccumulator"));..
269a0 20 20 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20        /* Update 
269b0 74 68 65 20 61 67 67 72 65 67 61 74 65 20 61 63  the aggregate ac
269c0 63 75 6d 75 6c 61 74 6f 72 73 20 62 61 73 65 64  cumulators based
269d0 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20   on the content 
269e0 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  of.      ** the 
269f0 63 75 72 72 65 6e 74 20 72 6f 77 0a 20 20 20 20  current row.    
26a00 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74    */.      sqlit
26a10 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
26a20 2c 20 6a 31 29 3b 0a 20 20 20 20 20 20 75 70 64  , j1);.      upd
26a30 61 74 65 41 63 63 75 6d 75 6c 61 74 6f 72 28 70  ateAccumulator(p
26a40 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f  Parse, &sAggInfo
26a50 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
26a60 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
26a70 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 69 55 73  _Integer, 1, iUs
26a80 65 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64  eFlag);.      Vd
26a90 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 69  beComment((v, "i
26aa0 6e 64 69 63 61 74 65 20 64 61 74 61 20 69 6e 20  ndicate data in 
26ab0 61 63 63 75 6d 75 6c 61 74 6f 72 22 29 29 3b 0a  accumulator"));.
26ac0 0a 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66  .      /* End of
26ad0 20 74 68 65 20 6c 6f 6f 70 0a 20 20 20 20 20 20   the loop.      
26ae0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 67 72 6f  */.      if( gro
26af0 75 70 42 79 53 6f 72 74 20 29 7b 0a 20 20 20 20  upBySort ){.    
26b00 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
26b10 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74  ddOp2(v, OP_Sort
26b20 65 72 4e 65 78 74 2c 20 73 41 67 67 49 6e 66 6f  erNext, sAggInfo
26b30 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 61 64 64  .sortingIdx, add
26b40 72 54 6f 70 4f 66 4c 6f 6f 70 29 3b 0a 20 20 20  rTopOfLoop);.   
26b50 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
26b60 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e    sqlite3WhereEn
26b70 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20  d(pWInfo);.     
26b80 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
26b90 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 61 64  angeToNoop(v, ad
26ba0 64 72 53 6f 72 74 69 6e 67 49 64 78 29 3b 0a 20  drSortingIdx);. 
26bb0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
26bc0 20 4f 75 74 70 75 74 20 74 68 65 20 66 69 6e 61   Output the fina
26bd0 6c 20 72 6f 77 20 6f 66 20 72 65 73 75 6c 74 0a  l row of result.
26be0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
26bf0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
26c00 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65  (v, OP_Gosub, re
26c10 67 4f 75 74 70 75 74 52 6f 77 2c 20 61 64 64 72  gOutputRow, addr
26c20 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20  OutputRow);.    
26c30 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
26c40 2c 20 22 6f 75 74 70 75 74 20 66 69 6e 61 6c 20  , "output final 
26c50 72 6f 77 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f  row"));..      /
26c60 2a 20 4a 75 6d 70 20 6f 76 65 72 20 74 68 65 20  * Jump over the 
26c70 73 75 62 72 6f 75 74 69 6e 65 73 0a 20 20 20 20  subroutines.    
26c80 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74    */.      sqlit
26c90 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
26ca0 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72  OP_Goto, 0, addr
26cb0 45 6e 64 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  End);..      /* 
26cc0 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f  Generate a subro
26cd0 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75  utine that outpu
26ce0 74 73 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20  ts a single row 
26cf0 6f 66 20 74 68 65 20 72 65 73 75 6c 74 0a 20 20  of the result.  
26d00 20 20 20 20 2a 2a 20 73 65 74 2e 20 20 54 68 69      ** set.  Thi
26d10 73 20 73 75 62 72 6f 75 74 69 6e 65 20 66 69 72  s subroutine fir
26d20 73 74 20 6c 6f 6f 6b 73 20 61 74 20 74 68 65 20  st looks at the 
26d30 69 55 73 65 46 6c 61 67 2e 20 20 49 66 20 69 55  iUseFlag.  If iU
26d40 73 65 46 6c 61 67 0a 20 20 20 20 20 20 2a 2a 20  seFlag.      ** 
26d50 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20  is less than or 
26d60 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f 2c 20 74  equal to zero, t
26d70 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20 69 73  he subroutine is
26d80 20 61 20 6e 6f 2d 6f 70 2e 20 20 49 66 0a 20 20   a no-op.  If.  
26d90 20 20 20 20 2a 2a 20 74 68 65 20 70 72 6f 63 65      ** the proce
26da0 73 73 69 6e 67 20 63 61 6c 6c 73 20 66 6f 72 20  ssing calls for 
26db0 74 68 65 20 71 75 65 72 79 20 74 6f 20 61 62 6f  the query to abo
26dc0 72 74 2c 20 74 68 69 73 20 73 75 62 72 6f 75 74  rt, this subrout
26dd0 69 6e 65 0a 20 20 20 20 20 20 2a 2a 20 69 6e 63  ine.      ** inc
26de0 72 65 6d 65 6e 74 73 20 74 68 65 20 69 41 62 6f  rements the iAbo
26df0 72 74 46 6c 61 67 20 6d 65 6d 6f 72 79 20 6c 6f  rtFlag memory lo
26e00 63 61 74 69 6f 6e 20 62 65 66 6f 72 65 20 72 65  cation before re
26e10 74 75 72 6e 69 6e 67 20 69 6e 0a 20 20 20 20 20  turning in.     
26e20 20 2a 2a 20 6f 72 64 65 72 20 74 6f 20 73 69 67   ** order to sig
26e30 6e 61 6c 20 74 68 65 20 63 61 6c 6c 65 72 20 74  nal the caller t
26e40 6f 20 61 62 6f 72 74 2e 0a 20 20 20 20 20 20 2a  o abort..      *
26e50 2f 0a 20 20 20 20 20 20 61 64 64 72 53 65 74 41  /.      addrSetA
26e60 62 6f 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64  bort = sqlite3Vd
26e70 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
26e80 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
26e90 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
26ea0 49 6e 74 65 67 65 72 2c 20 31 2c 20 69 41 62 6f  Integer, 1, iAbo
26eb0 72 74 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56  rtFlag);.      V
26ec0 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
26ed0 73 65 74 20 61 62 6f 72 74 20 66 6c 61 67 22 29  set abort flag")
26ee0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
26ef0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
26f00 5f 52 65 74 75 72 6e 2c 20 72 65 67 4f 75 74 70  _Return, regOutp
26f10 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 73 71  utRow);.      sq
26f20 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
26f30 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 4f 75 74  Label(v, addrOut
26f40 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 61  putRow);.      a
26f50 64 64 72 4f 75 74 70 75 74 52 6f 77 20 3d 20 73  ddrOutputRow = s
26f60 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
26f70 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20  tAddr(v);.      
26f80 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
26f90 32 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69  2(v, OP_IfPos, i
26fa0 55 73 65 46 6c 61 67 2c 20 61 64 64 72 4f 75 74  UseFlag, addrOut
26fb0 70 75 74 52 6f 77 2b 32 29 3b 0a 20 20 20 20 20  putRow+2);.     
26fc0 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
26fd0 20 22 47 72 6f 75 70 62 79 20 72 65 73 75 6c 74   "Groupby result
26fe0 20 67 65 6e 65 72 61 74 6f 72 20 65 6e 74 72 79   generator entry
26ff0 20 70 6f 69 6e 74 22 29 29 3b 0a 20 20 20 20 20   point"));.     
27000 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
27010 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c  p1(v, OP_Return,
27020 20 72 65 67 4f 75 74 70 75 74 52 6f 77 29 3b 0a   regOutputRow);.
27030 20 20 20 20 20 20 66 69 6e 61 6c 69 7a 65 41 67        finalizeAg
27040 67 46 75 6e 63 74 69 6f 6e 73 28 70 50 61 72 73  gFunctions(pPars
27050 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20  e, &sAggInfo);. 
27060 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
27070 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
27080 70 48 61 76 69 6e 67 2c 20 61 64 64 72 4f 75 74  pHaving, addrOut
27090 70 75 74 52 6f 77 2b 31 2c 20 53 51 4c 49 54 45  putRow+1, SQLITE
270a0 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20  _JUMPIFNULL);.  
270b0 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c      selectInnerL
270c0 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70  oop(pParse, p, p
270d0 2d 3e 70 45 4c 69 73 74 2c 20 30 2c 20 30 2c 20  ->pEList, 0, 0, 
270e0 70 4f 72 64 65 72 42 79 2c 0a 20 20 20 20 20 20  pOrderBy,.      
270f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27100 26 73 44 69 73 74 69 6e 63 74 2c 20 70 44 65 73  &sDistinct, pDes
27110 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
27120 20 20 20 20 20 20 20 20 20 61 64 64 72 4f 75 74           addrOut
27130 70 75 74 52 6f 77 2b 31 2c 20 61 64 64 72 53 65  putRow+1, addrSe
27140 74 41 62 6f 72 74 29 3b 0a 20 20 20 20 20 20 73  tAbort);.      s
27150 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
27160 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72  (v, OP_Return, r
27170 65 67 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20  egOutputRow);.  
27180 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
27190 28 76 2c 20 22 65 6e 64 20 67 72 6f 75 70 62 79  (v, "end groupby
271a0 20 72 65 73 75 6c 74 20 67 65 6e 65 72 61 74 6f   result generato
271b0 72 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  r"));..      /* 
271c0 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f  Generate a subro
271d0 75 74 69 6e 65 20 74 68 61 74 20 77 69 6c 6c 20  utine that will 
271e0 72 65 73 65 74 20 74 68 65 20 67 72 6f 75 70 2d  reset the group-
271f0 62 79 20 61 63 63 75 6d 75 6c 61 74 6f 72 0a 20  by accumulator. 
27200 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
27210 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
27220 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 52 65 73  Label(v, addrRes
27230 65 74 29 3b 0a 20 20 20 20 20 20 72 65 73 65 74  et);.      reset
27240 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72  Accumulator(pPar
27250 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a  se, &sAggInfo);.
27260 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
27270 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65  eAddOp1(v, OP_Re
27280 74 75 72 6e 2c 20 72 65 67 52 65 73 65 74 29 3b  turn, regReset);
27290 0a 20 20 20 20 20 0a 20 20 20 20 7d 20 2f 2a 20  .     .    } /* 
272a0 65 6e 64 69 66 20 70 47 72 6f 75 70 42 79 2e 20  endif pGroupBy. 
272b0 20 42 65 67 69 6e 20 61 67 67 72 65 67 61 74 65   Begin aggregate
272c0 20 71 75 65 72 69 65 73 20 77 69 74 68 6f 75 74   queries without
272d0 20 47 52 4f 55 50 20 42 59 3a 20 2a 2f 0a 20 20   GROUP BY: */.  
272e0 20 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 45    else {.      E
272f0 78 70 72 4c 69 73 74 20 2a 70 44 65 6c 20 3d 20  xprList *pDel = 
27300 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  0;.#ifndef SQLIT
27310 45 5f 4f 4d 49 54 5f 42 54 52 45 45 43 4f 55 4e  E_OMIT_BTREECOUN
27320 54 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70  T.      Table *p
27330 54 61 62 3b 0a 20 20 20 20 20 20 69 66 28 20 28  Tab;.      if( (
27340 70 54 61 62 20 3d 20 69 73 53 69 6d 70 6c 65 43  pTab = isSimpleC
27350 6f 75 6e 74 28 70 2c 20 26 73 41 67 67 49 6e 66  ount(p, &sAggInf
27360 6f 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  o))!=0 ){.      
27370 20 20 2f 2a 20 49 66 20 69 73 53 69 6d 70 6c 65    /* If isSimple
27380 43 6f 75 6e 74 28 29 20 72 65 74 75 72 6e 73 20  Count() returns 
27390 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 54  a pointer to a T
273a0 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 2c 20  able structure, 
273b0 74 68 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  then.        ** 
273c0 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  the SQL statemen
273d0 74 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  t is of the form
273e0 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  :.        **.   
273f0 20 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54       **   SELECT
27400 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 3c   count(*) FROM <
27410 74 62 6c 3e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  tbl>.        **.
27420 20 20 20 20 20 20 20 20 2a 2a 20 77 68 65 72 65          ** where
27430 20 74 68 65 20 54 61 62 6c 65 20 73 74 72 75 63   the Table struc
27440 74 75 72 65 20 72 65 74 75 72 6e 65 64 20 72 65  ture returned re
27450 70 72 65 73 65 6e 74 73 20 74 61 62 6c 65 20 3c  presents table <
27460 74 62 6c 3e 2e 0a 20 20 20 20 20 20 20 20 2a 2a  tbl>..        **
27470 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73  .        ** This
27480 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 73 6f   statement is so
27490 20 63 6f 6d 6d 6f 6e 20 74 68 61 74 20 69 74 20   common that it 
274a0 69 73 20 6f 70 74 69 6d 69 7a 65 64 20 73 70 65  is optimized spe
274b0 63 69 61 6c 6c 79 2e 20 54 68 65 0a 20 20 20 20  cially. The.    
274c0 20 20 20 20 2a 2a 20 4f 50 5f 43 6f 75 6e 74 20      ** OP_Count 
274d0 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20 65  instruction is e
274e0 78 65 63 75 74 65 64 20 65 69 74 68 65 72 20 6f  xecuted either o
274f0 6e 20 74 68 65 20 69 6e 74 6b 65 79 20 74 61 62  n the intkey tab
27500 6c 65 20 74 68 61 74 0a 20 20 20 20 20 20 20 20  le that.        
27510 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  ** contains the 
27520 64 61 74 61 20 66 6f 72 20 74 61 62 6c 65 20 3c  data for table <
27530 74 62 6c 3e 20 6f 72 20 6f 6e 20 6f 6e 65 20 6f  tbl> or on one o
27540 66 20 69 74 73 20 69 6e 64 65 78 65 73 2e 20 49  f its indexes. I
27550 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20  t.        ** is 
27560 62 65 74 74 65 72 20 74 6f 20 65 78 65 63 75 74  better to execut
27570 65 20 74 68 65 20 6f 70 20 6f 6e 20 61 6e 20 69  e the op on an i
27580 6e 64 65 78 2c 20 61 73 20 69 6e 64 65 78 65 73  ndex, as indexes
27590 20 61 72 65 20 61 6c 6d 6f 73 74 0a 20 20 20 20   are almost.    
275a0 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 73 70      ** always sp
275b0 72 65 61 64 20 61 63 72 6f 73 73 20 6c 65 73 73  read across less
275c0 20 70 61 67 65 73 20 74 68 61 6e 20 74 68 65 69   pages than thei
275d0 72 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  r corresponding 
275e0 74 61 62 6c 65 73 2e 0a 20 20 20 20 20 20 20 20  tables..        
275f0 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  */.        const
27600 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74   int iDb = sqlit
27610 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
27620 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62  pParse->db, pTab
27630 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
27640 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 43      const int iC
27650 73 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  sr = pParse->nTa
27660 62 2b 2b 3b 20 20 20 20 20 2f 2a 20 43 75 72 73  b++;     /* Curs
27670 6f 72 20 74 6f 20 73 63 61 6e 20 62 2d 74 72 65  or to scan b-tre
27680 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 49 6e 64  e */.        Ind
27690 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20  ex *pIdx;       
276a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
276b0 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61    /* Iterator va
276c0 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20  riable */.      
276d0 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
276e0 6e 66 6f 20 3d 20 30 3b 20 20 20 20 20 20 20 20  nfo = 0;        
276f0 20 20 20 20 20 20 20 2f 2a 20 4b 65 79 69 6e 66         /* Keyinf
27700 6f 20 66 6f 72 20 73 63 61 6e 6e 65 64 20 69 6e  o for scanned in
27710 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 20 20 49  dex */.        I
27720 6e 64 65 78 20 2a 70 42 65 73 74 20 3d 20 30 3b  ndex *pBest = 0;
27730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27740 20 20 20 20 2f 2a 20 42 65 73 74 20 69 6e 64 65      /* Best inde
27750 78 20 66 6f 75 6e 64 20 73 6f 20 66 61 72 20 2a  x found so far *
27760 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 52  /.        int iR
27770 6f 6f 74 20 3d 20 70 54 61 62 2d 3e 74 6e 75 6d  oot = pTab->tnum
27780 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
27790 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 73  * Root page of s
277a0 63 61 6e 6e 65 64 20 62 2d 74 72 65 65 20 2a 2f  canned b-tree */
277b0 0a 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ..        sqlite
277c0 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d  3CodeVerifySchem
277d0 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a  a(pParse, iDb);.
277e0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 54          sqlite3T
277f0 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c  ableLock(pParse,
27800 20 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d   iDb, pTab->tnum
27810 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  , 0, pTab->zName
27820 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 53  );..        /* S
27830 65 61 72 63 68 20 66 6f 72 20 74 68 65 20 69 6e  earch for the in
27840 64 65 78 20 74 68 61 74 20 68 61 73 20 74 68 65  dex that has the
27850 20 6c 65 61 73 74 20 61 6d 6f 75 6e 74 20 6f 66   least amount of
27860 20 63 6f 6c 75 6d 6e 73 2e 20 49 66 0a 20 20 20   columns. If.   
27870 20 20 20 20 20 2a 2a 20 74 68 65 72 65 20 69 73       ** there is
27880 20 73 75 63 68 20 61 6e 20 69 6e 64 65 78 2c 20   such an index, 
27890 61 6e 64 20 69 74 20 68 61 73 20 6c 65 73 73 20  and it has less 
278a0 63 6f 6c 75 6d 6e 73 20 74 68 61 6e 20 74 68 65  columns than the
278b0 20 74 61 62 6c 65 0a 20 20 20 20 20 20 20 20 2a   table.        *
278c0 2a 20 64 6f 65 73 2c 20 74 68 65 6e 20 77 65 20  * does, then we 
278d0 63 61 6e 20 61 73 73 75 6d 65 20 74 68 61 74 20  can assume that 
278e0 69 74 20 63 6f 6e 73 75 6d 65 73 20 6c 65 73 73  it consumes less
278f0 20 73 70 61 63 65 20 6f 6e 20 64 69 73 6b 20 61   space on disk a
27900 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 69  nd.        ** wi
27910 6c 6c 20 74 68 65 72 65 66 6f 72 65 20 62 65 20  ll therefore be 
27920 63 68 65 61 70 65 72 20 74 6f 20 73 63 61 6e 20  cheaper to scan 
27930 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  to determine the
27940 20 71 75 65 72 79 20 72 65 73 75 6c 74 2e 0a 20   query result.. 
27950 20 20 20 20 20 20 20 2a 2a 20 49 6e 20 74 68 69         ** In thi
27960 73 20 63 61 73 65 20 73 65 74 20 69 52 6f 6f 74  s case set iRoot
27970 20 74 6f 20 74 68 65 20 72 6f 6f 74 20 70 61 67   to the root pag
27980 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
27990 69 6e 64 65 78 20 62 2d 74 72 65 65 0a 20 20 20  index b-tree.   
279a0 20 20 20 20 20 2a 2a 20 61 6e 64 20 70 4b 65 79       ** and pKey
279b0 49 6e 66 6f 20 74 6f 20 74 68 65 20 4b 65 79 49  Info to the KeyI
279c0 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 72 65  nfo structure re
279d0 71 75 69 72 65 64 20 74 6f 20 6e 61 76 69 67 61  quired to naviga
279e0 74 65 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  te the.        *
279f0 2a 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20  * index..       
27a00 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 28   **.        ** (
27a10 32 30 31 31 2d 30 34 2d 31 35 29 20 44 6f 20 6e  2011-04-15) Do n
27a20 6f 74 20 64 6f 20 61 20 66 75 6c 6c 20 73 63 61  ot do a full sca
27a30 6e 20 6f 66 20 61 6e 20 75 6e 6f 72 64 65 72 65  n of an unordere
27a40 64 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20  d index..       
27a50 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 49   **.        ** I
27a60 6e 20 70 72 61 63 74 69 63 65 20 74 68 65 20 4b  n practice the K
27a70 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
27a80 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75 73 65   will not be use
27a90 64 2e 20 49 74 20 69 73 20 6f 6e 6c 79 20 0a 20  d. It is only . 
27aa0 20 20 20 20 20 20 20 2a 2a 20 70 61 73 73 65 64         ** passed
27ab0 20 74 6f 20 6b 65 65 70 20 4f 50 5f 4f 70 65 6e   to keep OP_Open
27ac0 52 65 61 64 20 68 61 70 70 79 2e 0a 20 20 20 20  Read happy..    
27ad0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 66      */.        f
27ae0 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49  or(pIdx=pTab->pI
27af0 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78  ndex; pIdx; pIdx
27b00 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20  =pIdx->pNext){. 
27b10 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64           if( pId
27b20 78 2d 3e 62 55 6e 6f 72 64 65 72 65 64 3d 3d 30  x->bUnordered==0
27b30 20 26 26 20 28 21 70 42 65 73 74 20 7c 7c 20 70   && (!pBest || p
27b40 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3c 70 42 65  Idx->nColumn<pBe
27b50 73 74 2d 3e 6e 43 6f 6c 75 6d 6e 29 20 29 7b 0a  st->nColumn) ){.
27b60 20 20 20 20 20 20 20 20 20 20 20 20 70 42 65 73              pBes
27b70 74 20 3d 20 70 49 64 78 3b 0a 20 20 20 20 20 20  t = pIdx;.      
27b80 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
27b90 20 20 20 20 20 20 20 20 69 66 28 20 70 42 65 73          if( pBes
27ba0 74 20 26 26 20 70 42 65 73 74 2d 3e 6e 43 6f 6c  t && pBest->nCol
27bb0 75 6d 6e 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29  umn<pTab->nCol )
27bc0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 52 6f 6f  {.          iRoo
27bd0 74 20 3d 20 70 42 65 73 74 2d 3e 74 6e 75 6d 3b  t = pBest->tnum;
27be0 0a 20 20 20 20 20 20 20 20 20 20 70 4b 65 79 49  .          pKeyI
27bf0 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 49 6e 64  nfo = sqlite3Ind
27c00 65 78 4b 65 79 69 6e 66 6f 28 70 50 61 72 73 65  exKeyinfo(pParse
27c10 2c 20 70 42 65 73 74 29 3b 0a 20 20 20 20 20 20  , pBest);.      
27c20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20    }..        /* 
27c30 4f 70 65 6e 20 61 20 72 65 61 64 2d 6f 6e 6c 79  Open a read-only
27c40 20 63 75 72 73 6f 72 2c 20 65 78 65 63 75 74 65   cursor, execute
27c50 20 74 68 65 20 4f 50 5f 43 6f 75 6e 74 2c 20 63   the OP_Count, c
27c60 6c 6f 73 65 20 74 68 65 20 63 75 72 73 6f 72 2e  lose the cursor.
27c70 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69   */.        sqli
27c80 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
27c90 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69 43   OP_OpenRead, iC
27ca0 73 72 2c 20 69 52 6f 6f 74 2c 20 69 44 62 29 3b  sr, iRoot, iDb);
27cb0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4b 65  .        if( pKe
27cc0 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 20  yInfo ){.       
27cd0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
27ce0 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 28 63  angeP4(v, -1, (c
27cf0 68 61 72 20 2a 29 70 4b 65 79 49 6e 66 6f 2c 20  har *)pKeyInfo, 
27d00 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f  P4_KEYINFO_HANDO
27d10 46 46 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  FF);.        }. 
27d20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
27d30 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43  beAddOp2(v, OP_C
27d40 6f 75 6e 74 2c 20 69 43 73 72 2c 20 73 41 67 67  ount, iCsr, sAgg
27d50 49 6e 66 6f 2e 61 46 75 6e 63 5b 30 5d 2e 69 4d  Info.aFunc[0].iM
27d60 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  em);.        sql
27d70 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
27d80 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 43 73 72  , OP_Close, iCsr
27d90 29 3b 0a 20 20 20 20 20 20 20 20 65 78 70 6c 61  );.        expla
27da0 69 6e 53 69 6d 70 6c 65 43 6f 75 6e 74 28 70 50  inSimpleCount(pP
27db0 61 72 73 65 2c 20 70 54 61 62 2c 20 70 42 65 73  arse, pTab, pBes
27dc0 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a  t);.      }else.
27dd0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
27de0 5f 4f 4d 49 54 5f 42 54 52 45 45 43 4f 55 4e 54  _OMIT_BTREECOUNT
27df0 20 2a 2f 0a 20 20 20 20 20 20 7b 0a 20 20 20 20   */.      {.    
27e00 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20      /* Check if 
27e10 74 68 65 20 71 75 65 72 79 20 69 73 20 6f 66 20  the query is of 
27e20 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  one of the follo
27e30 77 69 6e 67 20 66 6f 72 6d 73 3a 0a 20 20 20 20  wing forms:.    
27e40 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
27e50 2a 20 20 20 53 45 4c 45 43 54 20 6d 69 6e 28 78  *   SELECT min(x
27e60 29 20 46 52 4f 4d 20 2e 2e 2e 0a 20 20 20 20 20  ) FROM ....     
27e70 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 6d     **   SELECT m
27e80 61 78 28 78 29 20 46 52 4f 4d 20 2e 2e 2e 0a 20  ax(x) FROM .... 
27e90 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
27ea0 20 20 2a 2a 20 49 66 20 69 74 20 69 73 2c 20 74    ** If it is, t
27eb0 68 65 6e 20 61 73 6b 20 74 68 65 20 63 6f 64 65  hen ask the code
27ec0 20 69 6e 20 77 68 65 72 65 2e 63 20 74 6f 20 61   in where.c to a
27ed0 74 74 65 6d 70 74 20 74 6f 20 73 6f 72 74 20 72  ttempt to sort r
27ee0 65 73 75 6c 74 73 0a 20 20 20 20 20 20 20 20 2a  esults.        *
27ef0 2a 20 61 73 20 69 66 20 74 68 65 72 65 20 77 61  * as if there wa
27f00 73 20 61 6e 20 22 4f 52 44 45 52 20 4f 4e 20 78  s an "ORDER ON x
27f10 22 20 6f 72 20 22 4f 52 44 45 52 20 4f 4e 20 78  " or "ORDER ON x
27f20 20 44 45 53 43 22 20 63 6c 61 75 73 65 2e 20 0a   DESC" clause. .
27f30 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20 77 68          ** If wh
27f40 65 72 65 2e 63 20 69 73 20 61 62 6c 65 20 74 6f  ere.c is able to
27f50 20 70 72 6f 64 75 63 65 20 72 65 73 75 6c 74 73   produce results
27f60 20 73 6f 72 74 65 64 20 69 6e 20 74 68 69 73 20   sorted in this 
27f70 6f 72 64 65 72 2c 20 74 68 65 6e 0a 20 20 20 20  order, then.    
27f80 20 20 20 20 2a 2a 20 61 64 64 20 76 64 62 65 20      ** add vdbe 
27f90 63 6f 64 65 20 74 6f 20 62 72 65 61 6b 20 6f 75  code to break ou
27fa0 74 20 6f 66 20 74 68 65 20 70 72 6f 63 65 73 73  t of the process
27fb0 69 6e 67 20 6c 6f 6f 70 20 61 66 74 65 72 20 74  ing loop after t
27fc0 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 66  he .        ** f
27fd0 69 72 73 74 20 69 74 65 72 61 74 69 6f 6e 20 28  irst iteration (
27fe0 73 69 6e 63 65 20 74 68 65 20 66 69 72 73 74 20  since the first 
27ff0 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65  iteration of the
28000 20 6c 6f 6f 70 20 69 73 20 0a 20 20 20 20 20 20   loop is .      
28010 20 20 2a 2a 20 67 75 61 72 61 6e 74 65 65 64 20    ** guaranteed 
28020 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68  to operate on th
28030 65 20 72 6f 77 20 77 69 74 68 20 74 68 65 20 6d  e row with the m
28040 69 6e 69 6d 75 6d 20 6f 72 20 6d 61 78 69 6d 75  inimum or maximu
28050 6d 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 76 61  m .        ** va
28060 6c 75 65 20 6f 66 20 78 2c 20 74 68 65 20 6f 6e  lue of x, the on
28070 6c 79 20 72 6f 77 20 72 65 71 75 69 72 65 64 29  ly row required)
28080 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
28090 20 20 20 20 20 2a 2a 20 41 20 73 70 65 63 69 61       ** A specia
280a0 6c 20 66 6c 61 67 20 6d 75 73 74 20 62 65 20 70  l flag must be p
280b0 61 73 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33  assed to sqlite3
280c0 57 68 65 72 65 42 65 67 69 6e 28 29 20 74 6f 20  WhereBegin() to 
280d0 73 6c 69 67 68 74 6c 79 0a 20 20 20 20 20 20 20  slightly.       
280e0 20 2a 2a 20 6d 6f 64 69 66 79 20 62 65 68 61 76   ** modify behav
280f0 69 6f 75 72 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  iour as follows:
28100 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
28110 20 20 20 20 2a 2a 20 20 20 2b 20 49 66 20 74 68      **   + If th
28120 65 20 71 75 65 72 79 20 69 73 20 61 20 22 53 45  e query is a "SE
28130 4c 45 43 54 20 6d 69 6e 28 78 29 22 2c 20 74 68  LECT min(x)", th
28140 65 6e 20 74 68 65 20 6c 6f 6f 70 20 63 6f 64 65  en the loop code
28150 64 20 62 79 0a 20 20 20 20 20 20 20 20 2a 2a 20  d by.        ** 
28160 20 20 20 20 77 68 65 72 65 2e 63 20 73 68 6f 75      where.c shou
28170 6c 64 20 6e 6f 74 20 69 74 65 72 61 74 65 20 6f  ld not iterate o
28180 76 65 72 20 61 6e 79 20 76 61 6c 75 65 73 20 77  ver any values w
28190 69 74 68 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65  ith a NULL value
281a0 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20  .        **     
281b0 66 6f 72 20 78 2e 0a 20 20 20 20 20 20 20 20 2a  for x..        *
281c0 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 2b  *.        **   +
281d0 20 54 68 65 20 6f 70 74 69 6d 69 7a 65 72 20 63   The optimizer c
281e0 6f 64 65 20 69 6e 20 77 68 65 72 65 2e 63 20 28  ode in where.c (
281f0 74 68 65 20 74 68 69 6e 67 20 74 68 61 74 20 64  the thing that d
28200 65 63 69 64 65 73 20 77 68 69 63 68 0a 20 20 20  ecides which.   
28210 20 20 20 20 20 2a 2a 20 20 20 20 20 69 6e 64 65       **     inde
28220 78 20 6f 72 20 69 6e 64 69 63 65 73 20 74 6f 20  x or indices to 
28230 75 73 65 29 20 73 68 6f 75 6c 64 20 70 6c 61 63  use) should plac
28240 65 20 61 20 64 69 66 66 65 72 65 6e 74 20 70 72  e a different pr
28250 69 6f 72 69 74 79 20 6f 6e 20 0a 20 20 20 20 20  iority on .     
28260 20 20 20 2a 2a 20 20 20 20 20 73 61 74 69 73 66     **     satisf
28270 79 69 6e 67 20 74 68 65 20 27 4f 52 44 45 52 20  ying the 'ORDER 
28280 42 59 27 20 63 6c 61 75 73 65 20 74 68 61 6e 20  BY' clause than 
28290 69 74 20 64 6f 65 73 20 69 6e 20 6f 74 68 65 72  it does in other
282a0 20 63 61 73 65 73 2e 0a 20 20 20 20 20 20 20 20   cases..        
282b0 2a 2a 20 20 20 20 20 52 65 66 65 72 20 74 6f 20  **     Refer to 
282c0 63 6f 64 65 20 61 6e 64 20 63 6f 6d 6d 65 6e 74  code and comment
282d0 73 20 69 6e 20 77 68 65 72 65 2e 63 20 66 6f 72  s in where.c for
282e0 20 64 65 74 61 69 6c 73 2e 0a 20 20 20 20 20 20   details..      
282f0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 45 78 70    */.        Exp
28300 72 4c 69 73 74 20 2a 70 4d 69 6e 4d 61 78 20 3d  rList *pMinMax =
28310 20 30 3b 0a 20 20 20 20 20 20 20 20 75 38 20 66   0;.        u8 f
28320 6c 61 67 20 3d 20 6d 69 6e 4d 61 78 51 75 65 72  lag = minMaxQuer
28330 79 28 70 29 3b 0a 20 20 20 20 20 20 20 20 69 66  y(p);.        if
28340 28 20 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20  ( flag ){.      
28350 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
28360 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2d 3e  rHasProperty(p->
28370 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  pEList->a[0].pEx
28380 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
28390 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61  ) );.          a
283a0 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
283b0 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 78 2e  ->a[0].pExpr->x.
283c0 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 31 20  pList->nExpr==1 
283d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4d 69  );.          pMi
283e0 6e 4d 61 78 20 3d 20 73 71 6c 69 74 65 33 45 78  nMax = sqlite3Ex
283f0 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d  prListDup(db, p-
28400 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  >pEList->a[0].pE
28410 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2c 30 29 3b  xpr->x.pList,0);
28420 0a 20 20 20 20 20 20 20 20 20 20 70 44 65 6c 20  .          pDel 
28430 3d 20 70 4d 69 6e 4d 61 78 3b 0a 20 20 20 20 20  = pMinMax;.     
28440 20 20 20 20 20 69 66 28 20 70 4d 69 6e 4d 61 78       if( pMinMax
28450 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46   && !db->mallocF
28460 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20  ailed ){.       
28470 20 20 20 20 20 70 4d 69 6e 4d 61 78 2d 3e 61 5b       pMinMax->a[
28480 30 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20 66  0].sortOrder = f
28490 6c 61 67 21 3d 57 48 45 52 45 5f 4f 52 44 45 52  lag!=WHERE_ORDER
284a0 42 59 5f 4d 49 4e 20 3f 31 3a 30 3b 0a 20 20 20  BY_MIN ?1:0;.   
284b0 20 20 20 20 20 20 20 20 20 70 4d 69 6e 4d 61 78           pMinMax
284c0 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70  ->a[0].pExpr->op
284d0 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20 20   = TK_COLUMN;.  
284e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
284f0 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 20 20 2f    }.  .        /
28500 2a 20 54 68 69 73 20 63 61 73 65 20 72 75 6e 73  * This case runs
28510 20 69 66 20 74 68 65 20 61 67 67 72 65 67 61 74   if the aggregat
28520 65 20 68 61 73 20 6e 6f 20 47 52 4f 55 50 20 42  e has no GROUP B
28530 59 20 63 6c 61 75 73 65 2e 20 20 54 68 65 0a 20  Y clause.  The. 
28540 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73         ** proces
28550 73 69 6e 67 20 69 73 20 6d 75 63 68 20 73 69 6d  sing is much sim
28560 70 6c 65 72 20 73 69 6e 63 65 20 74 68 65 72 65  pler since there
28570 20 69 73 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c   is only a singl
28580 65 20 72 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a  e row.        **
28590 20 6f 66 20 6f 75 74 70 75 74 2e 0a 20 20 20 20   of output..    
285a0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72      */.        r
285b0 65 73 65 74 41 63 63 75 6d 75 6c 61 74 6f 72 28  esetAccumulator(
285c0 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66  pParse, &sAggInf
285d0 6f 29 3b 0a 20 20 20 20 20 20 20 20 70 57 49 6e  o);.        pWIn
285e0 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72  fo = sqlite3Wher
285f0 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70  eBegin(pParse, p
28600 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65 2c  TabList, pWhere,
28610 20 70 4d 69 6e 4d 61 78 2c 30 2c 66 6c 61 67 2c   pMinMax,0,flag,
28620 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
28630 70 57 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20  pWInfo==0 ){.   
28640 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
28650 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
28660 20 70 44 65 6c 29 3b 0a 20 20 20 20 20 20 20 20   pDel);.        
28670 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e    goto select_en
28680 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  d;.        }.   
28690 20 20 20 20 20 75 70 64 61 74 65 41 63 63 75 6d       updateAccum
286a0 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26  ulator(pParse, &
286b0 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20  sAggInfo);.     
286c0 20 20 20 61 73 73 65 72 74 28 20 70 4d 69 6e 4d     assert( pMinM
286d0 61 78 3d 3d 30 20 7c 7c 20 70 4d 69 6e 4d 61 78  ax==0 || pMinMax
286e0 2d 3e 6e 45 78 70 72 3d 3d 31 20 29 3b 0a 20 20  ->nExpr==1 );.  
286f0 20 20 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f        if( pWInfo
28700 2d 3e 6e 4f 42 53 61 74 3e 30 20 29 7b 0a 20 20  ->nOBSat>0 ){.  
28710 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
28720 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
28730 47 6f 74 6f 2c 20 30 2c 20 70 57 49 6e 66 6f 2d  Goto, 0, pWInfo-
28740 3e 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20  >iBreak);.      
28750 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
28760 28 76 2c 20 22 25 73 28 29 20 62 79 20 69 6e 64  (v, "%s() by ind
28770 65 78 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ex",.           
28780 20 20 20 20 20 28 66 6c 61 67 3d 3d 57 48 45 52       (flag==WHER
28790 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 3f 22 6d  E_ORDERBY_MIN?"m
287a0 69 6e 22 3a 22 6d 61 78 22 29 29 29 3b 0a 20 20  in":"max")));.  
287b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
287c0 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
287d0 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20  pWInfo);.       
287e0 20 66 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63   finalizeAggFunc
287f0 74 69 6f 6e 73 28 70 50 61 72 73 65 2c 20 26 73  tions(pParse, &s
28800 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  AggInfo);.      
28810 7d 0a 0a 20 20 20 20 20 20 70 4f 72 64 65 72 42  }..      pOrderB
28820 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c  y = 0;.      sql
28830 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
28840 70 50 61 72 73 65 2c 20 70 48 61 76 69 6e 67 2c  pParse, pHaving,
28850 20 61 64 64 72 45 6e 64 2c 20 53 51 4c 49 54 45   addrEnd, SQLITE
28860 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20  _JUMPIFNULL);.  
28870 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c      selectInnerL
28880 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70  oop(pParse, p, p
28890 2d 3e 70 45 4c 69 73 74 2c 20 30 2c 20 30 2c 20  ->pEList, 0, 0, 
288a0 30 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20  0, 0, .         
288b0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 44 65               pDe
288c0 73 74 2c 20 61 64 64 72 45 6e 64 2c 20 61 64 64  st, addrEnd, add
288d0 72 45 6e 64 29 3b 0a 20 20 20 20 20 20 73 71 6c  rEnd);.      sql
288e0 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
288f0 74 65 28 64 62 2c 20 70 44 65 6c 29 3b 0a 20 20  te(db, pDel);.  
28900 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
28910 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
28920 76 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20 20 20  v, addrEnd);.   
28930 20 0a 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20 61   .  } /* endif a
28940 67 67 72 65 67 61 74 65 20 71 75 65 72 79 20 2a  ggregate query *
28950 2f 0a 0a 20 20 69 66 28 20 73 44 69 73 74 69 6e  /..  if( sDistin
28960 63 74 2e 65 54 6e 63 74 54 79 70 65 3d 3d 57 48  ct.eTnctType==WH
28970 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 4f  ERE_DISTINCT_UNO
28980 52 44 45 52 45 44 20 29 7b 0a 20 20 20 20 65 78  RDERED ){.    ex
28990 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65 28 70  plainTempTable(p
289a0 50 61 72 73 65 2c 20 22 44 49 53 54 49 4e 43 54  Parse, "DISTINCT
289b0 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  ");.  }..  /* If
289c0 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44   there is an ORD
289d0 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68  ER BY clause, th
289e0 65 6e 20 77 65 20 6e 65 65 64 20 74 6f 20 73 6f  en we need to so
289f0 72 74 20 74 68 65 20 72 65 73 75 6c 74 73 0a 20  rt the results. 
28a00 20 2a 2a 20 61 6e 64 20 73 65 6e 64 20 74 68 65   ** and send the
28a10 6d 20 74 6f 20 74 68 65 20 63 61 6c 6c 62 61 63  m to the callbac
28a20 6b 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20  k one by one..  
28a30 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42  */.  if( pOrderB
28a40 79 20 29 7b 0a 20 20 20 20 65 78 70 6c 61 69 6e  y ){.    explain
28a50 54 65 6d 70 54 61 62 6c 65 28 70 50 61 72 73 65  TempTable(pParse
28a60 2c 20 22 4f 52 44 45 52 20 42 59 22 29 3b 0a 20  , "ORDER BY");. 
28a70 20 20 20 67 65 6e 65 72 61 74 65 53 6f 72 74 54     generateSortT
28a80 61 69 6c 28 70 50 61 72 73 65 2c 20 70 2c 20 76  ail(pParse, p, v
28a90 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c  , pEList->nExpr,
28aa0 20 70 44 65 73 74 29 3b 0a 20 20 7d 0a 0a 20 20   pDest);.  }..  
28ab0 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20  /* Jump here to 
28ac0 73 6b 69 70 20 74 68 69 73 20 71 75 65 72 79 0a  skip this query.
28ad0 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64    */.  sqlite3Vd
28ae0 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
28af0 2c 20 69 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20 54  , iEnd);..  /* T
28b00 68 65 20 53 45 4c 45 43 54 20 77 61 73 20 73 75  he SELECT was su
28b10 63 63 65 73 73 66 75 6c 6c 79 20 63 6f 64 65 64  ccessfully coded
28b20 2e 20 20 20 53 65 74 20 74 68 65 20 72 65 74 75  .   Set the retu
28b30 72 6e 20 63 6f 64 65 20 74 6f 20 30 0a 20 20 2a  rn code to 0.  *
28b40 2a 20 74 6f 20 69 6e 64 69 63 61 74 65 20 6e 6f  * to indicate no
28b50 20 65 72 72 6f 72 73 2e 0a 20 20 2a 2f 0a 20 20   errors..  */.  
28b60 72 63 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43 6f  rc = 0;..  /* Co
28b70 6e 74 72 6f 6c 20 6a 75 6d 70 73 20 74 6f 20 68  ntrol jumps to h
28b80 65 72 65 20 69 66 20 61 6e 20 65 72 72 6f 72 20  ere if an error 
28b90 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 61  is encountered a
28ba0 62 6f 76 65 2c 20 6f 72 20 75 70 6f 6e 0a 20 20  bove, or upon.  
28bb0 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 63 6f  ** successful co
28bc0 64 69 6e 67 20 6f 66 20 74 68 65 20 53 45 4c 45  ding of the SELE
28bd0 43 54 2e 0a 20 20 2a 2f 0a 73 65 6c 65 63 74 5f  CT..  */.select_
28be0 65 6e 64 3a 0a 20 20 65 78 70 6c 61 69 6e 53 65  end:.  explainSe
28bf0 74 49 6e 74 65 67 65 72 28 70 50 61 72 73 65 2d  tInteger(pParse-
28c00 3e 69 53 65 6c 65 63 74 49 64 2c 20 69 52 65 73  >iSelectId, iRes
28c10 74 6f 72 65 53 65 6c 65 63 74 49 64 29 3b 0a 0a  toreSelectId);..
28c20 20 20 2f 2a 20 49 64 65 6e 74 69 66 79 20 63 6f    /* Identify co
28c30 6c 75 6d 6e 20 6e 61 6d 65 73 20 69 66 20 72 65  lumn names if re
28c40 73 75 6c 74 73 20 6f 66 20 74 68 65 20 53 45 4c  sults of the SEL
28c50 45 43 54 20 61 72 65 20 74 6f 20 62 65 20 6f 75  ECT are to be ou
28c60 74 70 75 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  tput..  */.  if(
28c70 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
28c80 26 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d  & pDest->eDest==
28c90 53 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20  SRT_Output ){.  
28ca0 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e    generateColumn
28cb0 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 54  Names(pParse, pT
28cc0 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 29 3b  abList, pEList);
28cd0 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 44  .  }..  sqlite3D
28ce0 62 46 72 65 65 28 64 62 2c 20 73 41 67 67 49 6e  bFree(db, sAggIn
28cf0 66 6f 2e 61 43 6f 6c 29 3b 0a 20 20 73 71 6c 69  fo.aCol);.  sqli
28d00 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 73 41  te3DbFree(db, sA
28d10 67 67 49 6e 66 6f 2e 61 46 75 6e 63 29 3b 0a 20  ggInfo.aFunc);. 
28d20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
28d30 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
28d40 45 5f 45 4e 41 42 4c 45 5f 54 52 45 45 5f 45 58  E_ENABLE_TREE_EX
28d50 50 4c 41 49 4e 29 0a 2f 2a 0a 2a 2a 20 47 65 6e  PLAIN)./*.** Gen
28d60 65 72 61 74 65 20 61 20 68 75 6d 61 6e 2d 72 65  erate a human-re
28d70 61 64 61 62 6c 65 20 64 65 73 63 72 69 70 74 69  adable descripti
28d80 6f 6e 20 6f 66 20 61 20 74 68 65 20 53 65 6c 65  on of a the Sele
28d90 63 74 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74  ct object..*/.st
28da0 61 74 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69  atic void explai
28db0 6e 4f 6e 65 53 65 6c 65 63 74 28 56 64 62 65 20  nOneSelect(Vdbe 
28dc0 2a 70 56 64 62 65 2c 20 53 65 6c 65 63 74 20 2a  *pVdbe, Select *
28dd0 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  p){.  sqlite3Exp
28de0 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65  lainPrintf(pVdbe
28df0 2c 20 22 53 45 4c 45 43 54 20 22 29 3b 0a 20 20  , "SELECT ");.  
28e00 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  if( p->selFlags 
28e10 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53  & (SF_Distinct|S
28e20 46 5f 41 67 67 72 65 67 61 74 65 29 20 29 7b 0a  F_Aggregate) ){.
28e30 20 20 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c      if( p->selFl
28e40 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63  ags & SF_Distinc
28e50 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  t ){.      sqlit
28e60 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28  e3ExplainPrintf(
28e70 70 56 64 62 65 2c 20 22 44 49 53 54 49 4e 43 54  pVdbe, "DISTINCT
28e80 20 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   ");.    }.    i
28e90 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  f( p->selFlags &
28ea0 20 53 46 5f 41 67 67 72 65 67 61 74 65 20 29 7b   SF_Aggregate ){
28eb0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
28ec0 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62  plainPrintf(pVdb
28ed0 65 2c 20 22 61 67 67 5f 66 6c 61 67 20 22 29 3b  e, "agg_flag ");
28ee0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
28ef0 65 33 45 78 70 6c 61 69 6e 4e 4c 28 70 56 64 62  e3ExplainNL(pVdb
28f00 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  e);.    sqlite3E
28f10 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64  xplainPrintf(pVd
28f20 62 65 2c 20 22 20 20 20 22 29 3b 0a 20 20 7d 0a  be, "   ");.  }.
28f30 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
28f40 45 78 70 72 4c 69 73 74 28 70 56 64 62 65 2c 20  ExprList(pVdbe, 
28f50 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 73 71  p->pEList);.  sq
28f60 6c 69 74 65 33 45 78 70 6c 61 69 6e 4e 4c 28 70  lite3ExplainNL(p
28f70 56 64 62 65 29 3b 0a 20 20 69 66 28 20 70 2d 3e  Vdbe);.  if( p->
28f80 70 53 72 63 20 26 26 20 70 2d 3e 70 53 72 63 2d  pSrc && p->pSrc-
28f90 3e 6e 53 72 63 20 29 7b 0a 20 20 20 20 69 6e 74  >nSrc ){.    int
28fa0 20 69 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   i;.    sqlite3E
28fb0 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64  xplainPrintf(pVd
28fc0 62 65 2c 20 22 46 52 4f 4d 20 22 29 3b 0a 20 20  be, "FROM ");.  
28fd0 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
28fe0 50 75 73 68 28 70 56 64 62 65 29 3b 0a 20 20 20  Push(pVdbe);.   
28ff0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 70   for(i=0; i<p->p
29000 53 72 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b  Src->nSrc; i++){
29010 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 53 72  .      struct Sr
29020 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
29030 6d 20 3d 20 26 70 2d 3e 70 53 72 63 2d 3e 61 5b  m = &p->pSrc->a[
29040 69 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  i];.      sqlite
29050 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70  3ExplainPrintf(p
29060 56 64 62 65 2c 20 22 7b 25 64 2c 2a 7d 20 3d 20  Vdbe, "{%d,*} = 
29070 22 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f  ", pItem->iCurso
29080 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49  r);.      if( pI
29090 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a  tem->pSelect ){.
290a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
290b0 78 70 6c 61 69 6e 53 65 6c 65 63 74 28 70 56 64  xplainSelect(pVd
290c0 62 65 2c 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65  be, pItem->pSele
290d0 63 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ct);.        if(
290e0 20 70 49 74 65 6d 2d 3e 70 54 61 62 20 29 7b 0a   pItem->pTab ){.
290f0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
29100 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70  3ExplainPrintf(p
29110 56 64 62 65 2c 20 22 20 28 74 61 62 6e 61 6d 65  Vdbe, " (tabname
29120 3d 25 73 29 22 2c 20 70 49 74 65 6d 2d 3e 70 54  =%s)", pItem->pT
29130 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
29140 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
29150 65 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 4e 61  e if( pItem->zNa
29160 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  me ){.        sq
29170 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e  lite3ExplainPrin
29180 74 66 28 70 56 64 62 65 2c 20 22 25 73 22 2c 20  tf(pVdbe, "%s", 
29190 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  pItem->zName);. 
291a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
291b0 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 29   pItem->zAlias )
291c0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
291d0 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70  3ExplainPrintf(p
291e0 56 64 62 65 2c 20 22 20 28 41 53 20 25 73 29 22  Vdbe, " (AS %s)"
291f0 2c 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29  , pItem->zAlias)
29200 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
29210 69 66 28 20 70 49 74 65 6d 2d 3e 6a 6f 69 6e 74  if( pItem->joint
29220 79 70 65 20 26 20 4a 54 5f 4c 45 46 54 20 29 7b  ype & JT_LEFT ){
29230 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
29240 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56  ExplainPrintf(pV
29250 64 62 65 2c 20 22 20 4c 45 46 54 2d 4a 4f 49 4e  dbe, " LEFT-JOIN
29260 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ");.      }.    
29270 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
29280 4e 4c 28 70 56 64 62 65 29 3b 0a 20 20 20 20 7d  NL(pVdbe);.    }
29290 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c  .    sqlite3Expl
292a0 61 69 6e 50 6f 70 28 70 56 64 62 65 29 3b 0a 20  ainPop(pVdbe);. 
292b0 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 57 68 65   }.  if( p->pWhe
292c0 72 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  re ){.    sqlite
292d0 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70  3ExplainPrintf(p
292e0 56 64 62 65 2c 20 22 57 48 45 52 45 20 22 29 3b  Vdbe, "WHERE ");
292f0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c  .    sqlite3Expl
29300 61 69 6e 45 78 70 72 28 70 56 64 62 65 2c 20 70  ainExpr(pVdbe, p
29310 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20 73  ->pWhere);.    s
29320 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 4e 4c 28  qlite3ExplainNL(
29330 70 56 64 62 65 29 3b 0a 20 20 7d 0a 20 20 69 66  pVdbe);.  }.  if
29340 28 20 70 2d 3e 70 47 72 6f 75 70 42 79 20 29 7b  ( p->pGroupBy ){
29350 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c  .    sqlite3Expl
29360 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c  ainPrintf(pVdbe,
29370 20 22 47 52 4f 55 50 42 59 20 22 29 3b 0a 20 20   "GROUPBY ");.  
29380 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
29390 45 78 70 72 4c 69 73 74 28 70 56 64 62 65 2c 20  ExprList(pVdbe, 
293a0 70 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20  p->pGroupBy);.  
293b0 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
293c0 4e 4c 28 70 56 64 62 65 29 3b 0a 20 20 7d 0a 20  NL(pVdbe);.  }. 
293d0 20 69 66 28 20 70 2d 3e 70 48 61 76 69 6e 67 20   if( p->pHaving 
293e0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  ){.    sqlite3Ex
293f0 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62  plainPrintf(pVdb
29400 65 2c 20 22 48 41 56 49 4e 47 20 22 29 3b 0a 20  e, "HAVING ");. 
29410 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
29420 6e 45 78 70 72 28 70 56 64 62 65 2c 20 70 2d 3e  nExpr(pVdbe, p->
29430 70 48 61 76 69 6e 67 29 3b 0a 20 20 20 20 73 71  pHaving);.    sq
29440 6c 69 74 65 33 45 78 70 6c 61 69 6e 4e 4c 28 70  lite3ExplainNL(p
29450 56 64 62 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28  Vdbe);.  }.  if(
29460 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a   p->pOrderBy ){.
29470 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
29480 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20  inPrintf(pVdbe, 
29490 22 4f 52 44 45 52 42 59 20 22 29 3b 0a 20 20 20  "ORDERBY ");.   
294a0 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45   sqlite3ExplainE
294b0 78 70 72 4c 69 73 74 28 70 56 64 62 65 2c 20 70  xprList(pVdbe, p
294c0 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20  ->pOrderBy);.   
294d0 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 4e   sqlite3ExplainN
294e0 4c 28 70 56 64 62 65 29 3b 0a 20 20 7d 0a 20 20  L(pVdbe);.  }.  
294f0 69 66 28 20 70 2d 3e 70 4c 69 6d 69 74 20 29 7b  if( p->pLimit ){
29500 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c  .    sqlite3Expl
29510 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c  ainPrintf(pVdbe,
29520 20 22 4c 49 4d 49 54 20 22 29 3b 0a 20 20 20 20   "LIMIT ");.    
29530 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78  sqlite3ExplainEx
29540 70 72 28 70 56 64 62 65 2c 20 70 2d 3e 70 4c 69  pr(pVdbe, p->pLi
29550 6d 69 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  mit);.    sqlite
29560 33 45 78 70 6c 61 69 6e 4e 4c 28 70 56 64 62 65  3ExplainNL(pVdbe
29570 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  );.  }.  if( p->
29580 70 4f 66 66 73 65 74 20 29 7b 0a 20 20 20 20 73  pOffset ){.    s
29590 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69  qlite3ExplainPri
295a0 6e 74 66 28 70 56 64 62 65 2c 20 22 4f 46 46 53  ntf(pVdbe, "OFFS
295b0 45 54 20 22 29 3b 0a 20 20 20 20 73 71 6c 69 74  ET ");.    sqlit
295c0 65 33 45 78 70 6c 61 69 6e 45 78 70 72 28 70 56  e3ExplainExpr(pV
295d0 64 62 65 2c 20 70 2d 3e 70 4f 66 66 73 65 74 29  dbe, p->pOffset)
295e0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
295f0 6c 61 69 6e 4e 4c 28 70 56 64 62 65 29 3b 0a 20  lainNL(pVdbe);. 
29600 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65   }.}.void sqlite
29610 33 45 78 70 6c 61 69 6e 53 65 6c 65 63 74 28 56  3ExplainSelect(V
29620 64 62 65 20 2a 70 56 64 62 65 2c 20 53 65 6c 65  dbe *pVdbe, Sele
29630 63 74 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 3d  ct *p){.  if( p=
29640 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
29650 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70  3ExplainPrintf(p
29660 56 64 62 65 2c 20 22 28 6e 75 6c 6c 2d 73 65 6c  Vdbe, "(null-sel
29670 65 63 74 29 22 29 3b 0a 20 20 20 20 72 65 74 75  ect)");.    retu
29680 72 6e 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28  rn;.  }.  while(
29690 20 70 2d 3e 70 50 72 69 6f 72 20 29 20 70 20 3d   p->pPrior ) p =
296a0 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 73 71   p->pPrior;.  sq
296b0 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 75 73 68  lite3ExplainPush
296c0 28 70 56 64 62 65 29 3b 0a 20 20 77 68 69 6c 65  (pVdbe);.  while
296d0 28 20 70 20 29 7b 0a 20 20 20 20 65 78 70 6c 61  ( p ){.    expla
296e0 69 6e 4f 6e 65 53 65 6c 65 63 74 28 70 56 64 62  inOneSelect(pVdb
296f0 65 2c 20 70 29 3b 0a 20 20 20 20 70 20 3d 20 70  e, p);.    p = p
29700 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 69 66 28  ->pNext;.    if(
29710 20 70 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20   p==0 ) break;. 
29720 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
29730 6e 4e 4c 28 70 56 64 62 65 29 3b 0a 20 20 20 20  nNL(pVdbe);.    
29740 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
29750 69 6e 74 66 28 70 56 64 62 65 2c 20 22 25 73 5c  intf(pVdbe, "%s\
29760 6e 22 2c 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65  n", selectOpName
29770 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 7d 0a 20 20  (p->op));.  }.  
29780 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
29790 69 6e 74 66 28 70 56 64 62 65 2c 20 22 45 4e 44  intf(pVdbe, "END
297a0 22 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  ");.  sqlite3Exp
297b0 6c 61 69 6e 50 6f 70 28 70 56 64 62 65 29 3b 0a  lainPop(pVdbe);.
297c0 7d 0a 0a 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65  }../* End of the
297d0 20 73 74 72 75 63 74 75 72 65 20 64 65 62 75 67   structure debug
297e0 20 70 72 69 6e 74 69 6e 67 20 63 6f 64 65 0a 2a   printing code.*
297f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29800 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29810 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29820 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29830 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 23 65  ************/.#e
29840 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28  ndif /* defined(
29850 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 54 52  SQLITE_ENABLE_TR
29860 45 45 5f 45 58 50 4c 41 49 4e 29 20 2a 2f 0a     EE_EXPLAIN) */.